Repository: Ji4n1ng/OpenInTerminal Branch: master Commit: bee2c57aeb8e Files: 168 Total size: 756.1 KB Directory structure: gitextract_lq_yxf02/ ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report_issue_template.md │ │ └── feature_request_issue_template.md │ └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .travis.yml ├── LICENSE ├── OpenInEditor-Lite/ │ ├── OpenInEditor-Lite/ │ │ ├── Assets.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── Error.swift │ │ ├── Info.plist │ │ ├── OpenInEditor-Lite.entitlements │ │ ├── OpenInEditor_Lite.entitlements │ │ ├── de.lproj/ │ │ │ └── Localizable.strings │ │ ├── en.lproj/ │ │ │ └── Localizable.strings │ │ ├── es.lproj/ │ │ │ └── Localizable.strings │ │ ├── fr.lproj/ │ │ │ └── Localizable.strings │ │ ├── it.lproj/ │ │ │ └── Localizable.strings │ │ ├── ko.lproj/ │ │ │ └── Localizable.strings │ │ ├── main.swift │ │ ├── ru.lproj/ │ │ │ └── Localizable.strings │ │ ├── tr.lproj/ │ │ │ └── Localizable.strings │ │ └── zh-Hans.lproj/ │ │ └── Localizable.strings │ └── OpenInEditor-Lite.xcodeproj/ │ ├── project.pbxproj │ └── xcshareddata/ │ └── xcschemes/ │ └── OpenInEditor-Lite.xcscheme ├── OpenInTerminal/ │ ├── AppDelegate.swift │ ├── Assets.xcassets/ │ │ ├── AppIcon.appiconset/ │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── StatusBarIcon.imageset/ │ │ │ └── Contents.json │ │ ├── ToolbarCustomize.imageset/ │ │ │ └── Contents.json │ │ └── logo.imageset/ │ │ └── Contents.json │ ├── Constants.swift │ ├── Error.swift │ ├── Icons.xcassets/ │ │ ├── Alacritty.imageset/ │ │ │ └── Contents.json │ │ ├── Android Studio.imageset/ │ │ │ └── Contents.json │ │ ├── AppCode.imageset/ │ │ │ └── Contents.json │ │ ├── Atom.imageset/ │ │ │ └── Contents.json │ │ ├── BBEdit.imageset/ │ │ │ └── Contents.json │ │ ├── CLion.imageset/ │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── CotEditor.imageset/ │ │ │ └── Contents.json │ │ ├── Cursor.imageset/ │ │ │ └── Contents.json │ │ ├── Fleet.imageset/ │ │ │ └── Contents.json │ │ ├── Fork.imageset/ │ │ │ └── Contents.json │ │ ├── Ghostty.imageset/ │ │ │ └── Contents.json │ │ ├── GitHub Desktop.imageset/ │ │ │ └── Contents.json │ │ ├── GoLand.imageset/ │ │ │ └── Contents.json │ │ ├── IntelliJ IDEA.imageset/ │ │ │ └── Contents.json │ │ ├── MacVim.imageset/ │ │ │ └── Contents.json │ │ ├── Nova.imageset/ │ │ │ └── Contents.json │ │ ├── PhpStorm.imageset/ │ │ │ └── Contents.json │ │ ├── PyCharm.imageset/ │ │ │ └── Contents.json │ │ ├── RubyMine.imageset/ │ │ │ └── Contents.json │ │ ├── Sublime Text.imageset/ │ │ │ └── Contents.json │ │ ├── Tabby.imageset/ │ │ │ └── Contents.json │ │ ├── Terminal.imageset/ │ │ │ └── Contents.json │ │ ├── TextEdit.imageset/ │ │ │ └── Contents.json │ │ ├── TextMate.imageset/ │ │ │ └── Contents.json │ │ ├── Typora.imageset/ │ │ │ └── Contents.json │ │ ├── VSCodium.imageset/ │ │ │ └── Contents.json │ │ ├── Visual Studio Code - Insiders.imageset/ │ │ │ └── Contents.json │ │ ├── Visual Studio Code.imageset/ │ │ │ └── Contents.json │ │ ├── Warp.imageset/ │ │ │ └── Contents.json │ │ ├── WebStorm.imageset/ │ │ │ └── Contents.json │ │ ├── WezTerm.imageset/ │ │ │ └── Contents.json │ │ ├── Xcode.imageset/ │ │ │ └── Contents.json │ │ ├── Zed.imageset/ │ │ │ └── Contents.json │ │ ├── context_menu_icon_color_editor.imageset/ │ │ │ └── Contents.json │ │ ├── context_menu_icon_color_path.imageset/ │ │ │ └── Contents.json │ │ ├── context_menu_icon_color_terminal.imageset/ │ │ │ └── Contents.json │ │ ├── context_menu_icon_editor.imageset/ │ │ │ └── Contents.json │ │ ├── context_menu_icon_path.imageset/ │ │ │ └── Contents.json │ │ ├── context_menu_icon_terminal.imageset/ │ │ │ └── Contents.json │ │ ├── hyper.imageset/ │ │ │ └── Contents.json │ │ ├── iTerm.imageset/ │ │ │ └── Contents.json │ │ ├── kitty.imageset/ │ │ │ └── Contents.json │ │ └── neovim.imageset/ │ │ └── Contents.json │ ├── Info.plist │ ├── MainMenu.xib │ ├── Notifier/ │ │ ├── LaunchNotifier.swift │ │ ├── Notifier.swift │ │ └── OpenNotifier.swift │ ├── OpenInTerminal.entitlements │ ├── PreferencesWindow/ │ │ ├── AboutPreferencesViewController.swift │ │ ├── AdvancedPreferencesViewController.swift │ │ ├── Base.lproj/ │ │ │ └── Preferences.storyboard │ │ ├── CustomInputViewController.swift │ │ ├── CustomPreferencesViewController.swift │ │ ├── GeneralPreferencesViewController.swift │ │ ├── PreferencesViewController.swift │ │ ├── PreferencesWindowController.swift │ │ ├── de.lproj/ │ │ │ └── Preferences.strings │ │ ├── en.lproj/ │ │ │ └── Preferences.strings │ │ ├── es.lproj/ │ │ │ └── Preferences.strings │ │ ├── fr.lproj/ │ │ │ └── Preferences.strings │ │ ├── it.lproj/ │ │ │ └── Preferences.strings │ │ ├── ko.lproj/ │ │ │ └── Preferences.strings │ │ ├── mul.lproj/ │ │ │ └── Preferences.xcstrings │ │ ├── ru.lproj/ │ │ │ └── Preferences.strings │ │ ├── tr.lproj/ │ │ │ └── Preferences.strings │ │ └── zh-Hans.lproj/ │ │ └── Preferences.strings │ ├── ScriptGenerator.swift │ ├── StatusMenuController.swift │ ├── de.lproj/ │ │ └── Localizable.strings │ ├── en.lproj/ │ │ └── Localizable.strings │ ├── es.lproj/ │ │ └── Localizable.strings │ ├── fr.lproj/ │ │ └── Localizable.strings │ ├── it.lproj/ │ │ └── Localizable.strings │ ├── ko.lproj/ │ │ └── Localizable.strings │ ├── ru.lproj/ │ │ └── Localizable.strings │ ├── tr.lproj/ │ │ └── Localizable.strings │ └── zh-Hans.lproj/ │ └── Localizable.strings ├── OpenInTerminal-Lite/ │ ├── OpenInTerminal-Lite/ │ │ ├── Assets.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── Error.swift │ │ ├── Info.plist │ │ ├── OpenInTerminal-Lite.entitlements │ │ ├── OpenInTerminal_Lite.entitlements │ │ ├── de.lproj/ │ │ │ └── Localizable.strings │ │ ├── en.lproj/ │ │ │ └── Localizable.strings │ │ ├── es.lproj/ │ │ │ └── Localizable.strings │ │ ├── fr.lproj/ │ │ │ └── Localizable.strings │ │ ├── it.lproj/ │ │ │ └── Localizable.strings │ │ ├── ko.lproj/ │ │ │ └── Localizable.strings │ │ ├── main.swift │ │ ├── ru.lproj/ │ │ │ └── Localizable.strings │ │ ├── tr.lproj/ │ │ │ └── Localizable.strings │ │ └── zh-Hans.lproj/ │ │ └── Localizable.strings │ └── OpenInTerminal-Lite.xcodeproj/ │ ├── project.pbxproj │ └── xcshareddata/ │ └── xcschemes/ │ └── OpenInTerminal-Lite.xcscheme ├── OpenInTerminal.xcodeproj/ │ └── project.pbxproj ├── OpenInTerminalCore/ │ ├── App.swift │ ├── AppManager.swift │ ├── Constants.swift │ ├── Defaults.swift │ ├── DefaultsManager.swift │ ├── Error.swift │ ├── Extensions/ │ │ ├── ArrayExtensions.swift │ │ └── PathExtensions.swift │ ├── FinderManager.swift │ ├── Info.plist │ ├── Log.swift │ ├── OpenInTerminalCore.h │ ├── ScriptManager.swift │ ├── ScriptingBridge/ │ │ ├── Finder.swift │ │ └── Terminal.swift │ └── SupportedApps.swift ├── OpenInTerminalFinderExtension/ │ ├── FinderAssets.xcassets/ │ │ ├── Contents.json │ │ └── Icon.imageset/ │ │ └── Contents.json │ ├── FinderSync.swift │ ├── Info.plist │ └── OpenInTerminalFinderExtension.entitlements ├── OpenInTerminalHelper/ │ ├── AppDelegate.swift │ ├── Assets.xcassets/ │ │ ├── AppIcon.appiconset/ │ │ │ └── Contents.json │ │ └── Contents.json │ ├── Base.lproj/ │ │ └── Main.storyboard │ ├── Info.plist │ └── OpenInTerminalHelper.entitlements ├── README.md └── Resources/ ├── README-Config-zh.md ├── README-Config.md ├── README-Lite-de.md ├── README-Lite-zh.md ├── README-Lite.md ├── README-de.md ├── README-tr.md └── README-zh.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ *.h linguist-language=Swift ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: Ji4n1ng #patreon: # Replace with a single Patreon username #open_collective: # Replace with a single Open Collective username #ko_fi: # Replace with a single Ko-fi username #tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel #community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry #liberapay: # Replace with a single Liberapay username #issuehunt: # Replace with a single IssueHunt username #otechie: # Replace with a single Otechie username #lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry #custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report_issue_template.md ================================================ --- name: 'Bug report' labels: bug about: 'Report a bug' --- ## What is the issue? ## How does one reproduce the issue? ## Screenshots ## Debug information (Logs, OS, Hardware, Version, etc.) ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request_issue_template.md ================================================ --- name: 'Feature request' labels: enhancement about: 'Request a new feature' --- ## Summarize this feature ## Why should this feature be included? ## Additional information ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ ## Summary of this pull request ## Does this solve an existing issue? If so, add a link to it ## Steps to test this feature ## Screenshots ## Additional info ================================================ FILE: .gitignore ================================================ # Created by https://www.gitignore.io/api/macos,xcode,swift # Edit at https://www.gitignore.io/?templates=macos,xcode,swift ### macOS ### # General .DS_Store .AppleDouble .LSOverride # Icon must end with two \r Icon # Thumbnails ._* # Files that might appear in the root of a volume .DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent # Directories potentially created on remote AFP share .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk ### Swift ### # Xcode # # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore ## Build generated build/ DerivedData/ ## Various settings *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *.perspectivev3 !default.perspectivev3 xcuserdata/ ## Other *.moved-aside *.xccheckout *.xcscmblueprint ## Obj-C/Swift specific *.hmap *.ipa *.dSYM.zip *.dSYM ## Playgrounds timeline.xctimeline playground.xcworkspace # Swift Package Manager # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. # Packages/ # Package.pins # Package.resolved .build/ # CocoaPods # We recommend against adding the Pods directory to your .gitignore. However # you should judge for yourself, the pros and cons are mentioned at: # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control Pods/ # Add this line if you want to avoid checking in source code from the Xcode workspace *.xcworkspace # Carthage # Add this line if you want to avoid checking in source code from Carthage dependencies. # Carthage/Checkouts Carthage/Build # fastlane # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the # screenshots whenever they are needed. # For more information about the recommended setup visit: # https://docs.fastlane.tools/best-practices/source-control/#source-control fastlane/report.xml fastlane/Preview.html fastlane/screenshots/**/*.png fastlane/test_output # Code Injection # After new code Injection tools there's a generated folder /iOSInjectionProject # https://github.com/johnno1962/injectionforxcode iOSInjectionProject/ ### Xcode ### # Xcode # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore ## User settings ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) ### Xcode Patch ### *.xcodeproj/* !*.xcodeproj/project.pbxproj !*.xcodeproj/xcshareddata/ !*.xcworkspace/contents.xcworkspacedata /*.gcno **/xcshareddata/WorkspaceSettings.xcsettings # End of https://www.gitignore.io/api/macos,xcode,swift n ================================================ FILE: .travis.yml ================================================ language: objective-c matrix: include: - osx_image: xcode11 branches: only: - master #- develop env: global: - LC_CTYPE=en_US.UTF-8 before_install: - gem install cocoapods # Since Travis is not always on latest version - gem install xcpretty -N - pod install script: - set -o pipefail - xcodebuild clean build -workspace OpenInTerminal.xcworkspace -scheme OpenInTerminal -sdk macosx -configuration Release CODE_SIGN_IDENTITY="" CODE_SIGN_REQUIRED=NO | xcpretty -c ================================================ FILE: LICENSE ================================================ The MIT License Copyright (c) 2019 Jianing Wang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "filename" : "icon_editor_light_16.png", "idiom" : "mac", "scale" : "1x", "size" : "16x16" }, { "filename" : "icon_editor_light_16@2x.png", "idiom" : "mac", "scale" : "2x", "size" : "16x16" }, { "filename" : "icon_editor_light_32.png", "idiom" : "mac", "scale" : "1x", "size" : "32x32" }, { "filename" : "icon_editor_light_32@2x.png", "idiom" : "mac", "scale" : "2x", "size" : "32x32" }, { "filename" : "icon_editor_light_128.png", "idiom" : "mac", "scale" : "1x", "size" : "128x128" }, { "filename" : "icon_editor_light_128@2x.png", "idiom" : "mac", "scale" : "2x", "size" : "128x128" }, { "filename" : "icon_editor_light_256.png", "idiom" : "mac", "scale" : "1x", "size" : "256x256" }, { "filename" : "icon_editor_light _256@2x.png", "idiom" : "mac", "scale" : "2x", "size" : "256x256" }, { "filename" : "icon_editor_light_512.png", "idiom" : "mac", "scale" : "1x", "size" : "512x512" }, { "filename" : "icon_editor_light_512@2x.png", "idiom" : "mac", "scale" : "2x", "size" : "512x512" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/Assets.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/Error.swift ================================================ // // Error.swift // OpenInEditor-Lite // // Created by Jianing Wang on 2019/6/25. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation enum OITLError: Error { case cannotGetEditor } extension OITLError : CustomStringConvertible { var description: String { switch self { case .cannotGetEditor: return "There is no default editor. And user did not pick a editor." } } } ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIconFile CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion 1 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) LSUIElement NSAppleEventsUsageDescription Please give permissions to access your Finder & Terminal NSHumanReadableCopyright Copyright © 2019 Jianing Wang. All rights reserved. NSPrincipalClass NSApplication ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/OpenInEditor-Lite.entitlements ================================================ com.apple.security.automation.apple-events ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/OpenInEditor_Lite.entitlements ================================================ com.apple.security.temporary-exception.apple-events com.apple.systemevents com.apple.Terminal com.apple.Finder com.googlecode.iterm2 co.zeit.hyper io.alacritty com.github.wez.wezterm org.tabby com.microsoft.VSCode com.github.atom com.sublimetext.3 com.barebones.bbedit com.microsoft.VSCodeInsiders com.macromates.TextMate ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/de.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInEditor-Lite Created by Jianing Wang on 2019/6/25. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "Okay"; "general.cancel" = "Abbrechen"; "general.yes" = "Ja"; "alert.pick_editor_title" = "Öffnen mit?"; "alert.pick_editor_description" = "Bitte wählen Sie eines der folgenden Editoren als Standard zum Öffnen."; ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/en.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInEditor-Lite Created by Jianing Wang on 2019/6/25. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Cancel"; "general.yes" = "Yes"; "alert.pick_editor_title" = "Open In?"; "alert.pick_editor_description" = "Please select one of the following editors as the default editor to open."; ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/es.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInEditor-Lite Created by Jianing Wang on 2019/6/25. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Cancelar"; "general.yes" = "Sí"; "alert.pick_editor_title" = "Abrir en?"; "alert.pick_editor_description" = "Seleccione uno de los siguientes editores como editor predeterminado."; ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/fr.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInEditor-Lite Created by Jianing Wang on 2019/6/25. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Annuler"; "general.yes" = "Oui"; "alert.pick_editor_title" = "Ouvrir avec?"; "alert.pick_editor_description" = "Veuillez sélectionner l’un de ses éditeurs ci-dessous pour être utilisé comme éditeur par défaut."; ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/it.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInEditor-Lite Created by arendruni on 2020/4/9. Copyright © 2020 arendruni. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Annulla"; "general.yes" = "Sì"; "alert.pick_editor_title" = "Apri con?"; "alert.pick_editor_description" = "Seleziona uno dei seguenti editor per impostarlo come editor di default."; ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/ko.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInEditor-Lite Created by Fernando on 2019/11/23. Copyright © 2019 Fernando. All rights reserved. */ "general.ok" = "확인"; "general.cancel" = "닫기"; "general.yes" = "네"; "alert.pick_editor_title" = "여시겠습니까?"; "alert.pick_editor_description" = "다음 리스트에서 기본이 될 에디터 프로그램을 선택해주세요."; ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/main.swift ================================================ // // main.swift // OpenInEditor-Lite // // Created by Jianing Wang on 2019/6/25. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation import OpenInTerminalCore do { if let editorName = DefaultsManager.shared.liteDefaultEditor { let editor = App(name: editorName, type: .editor) try editor.openOutsideSandbox() } else { guard let selectedEditor = AppManager.shared.pickEditorAlert() else { throw OITLError.cannotGetEditor } DefaultsManager.shared.liteDefaultEditor = selectedEditor.name try selectedEditor.openOutsideSandbox() } } catch { logw(error.localizedDescription) } ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/ru.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInEditor-Lite Created by Jianing Wang on 2019/6/25. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Отменить"; "general.yes" = "Да"; "alert.pick_terminal_title" = "Открыть в?"; "alert.pick_terminal_description" = "Пожалуйста, выберите один из доступных редакторе для установки по-умолчанию."; ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/tr.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInEditor-Lite Created by Jianing Wang on 2019/6/25. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "Tamam"; "general.cancel" = "İptal"; "general.yes" = "Evet"; "alert.pick_editor_title" = "Şununla Aç?"; "alert.pick_editor_description" = "Lütfen gösterilen düzenleyicilerden birini varsayılan düzenleyici olarak seçin."; ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite/zh-Hans.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInEditor-Lite Created by Jianing Wang on 2019/6/25. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "好"; "general.cancel" = "取消"; "general.yes" = "是的"; "alert.pick_editor_title" = "打开?"; "alert.pick_editor_description" = "请在下面的编辑器中选择一个作为默认编辑器。"; ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 50; objects = { /* Begin PBXBuildFile section */ 95A0744D22C2083E00A42BC8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95A0744C22C2083E00A42BC8 /* Assets.xcassets */; }; 95A0745922C2140700A42BC8 /* OpenInTerminalCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95A0745822C2140700A42BC8 /* OpenInTerminalCore.framework */; }; 95A0745A22C2140700A42BC8 /* OpenInTerminalCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 95A0745822C2140700A42BC8 /* OpenInTerminalCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 95A0745D22C2141700A42BC8 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A0745C22C2141700A42BC8 /* main.swift */; }; 95A0745F22C2155800A42BC8 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A0745E22C2155800A42BC8 /* Error.swift */; }; 95A0746222C217E800A42BC8 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 95A0746422C217E800A42BC8 /* Localizable.strings */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 95A0745B22C2140800A42BC8 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 95A0745A22C2140700A42BC8 /* OpenInTerminalCore.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 2594E99827EF396F00AF84D5 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; 82AE667823896C4E00F4DB4D /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; 9561BB4324C1F3ED001DE0A9 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; 9595D2A223BAD7EE006CBB36 /* OpenInEditor-Lite.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "OpenInEditor-Lite.entitlements"; sourceTree = ""; }; 95A0744722C2083E00A42BC8 /* OpenInEditor-Lite.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "OpenInEditor-Lite.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 95A0744C22C2083E00A42BC8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 95A0745122C2083E00A42BC8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 95A0745222C2083E00A42BC8 /* OpenInEditor_Lite.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = OpenInEditor_Lite.entitlements; sourceTree = ""; }; 95A0745822C2140700A42BC8 /* OpenInTerminalCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = OpenInTerminalCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 95A0745C22C2141700A42BC8 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 95A0745E22C2155800A42BC8 /* Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = ""; }; 95A0746322C217E800A42BC8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 95A0746522C217EC00A42BC8 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; 95A0746622C217EF00A42BC8 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; 95B0614027AFAD1E009C2B4E /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; 95DD629D243B4694003550B3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; C3135D9E243F4CFA003323CF /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 95A0744422C2083E00A42BC8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 95A0745922C2140700A42BC8 /* OpenInTerminalCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 95A0743E22C2083E00A42BC8 = { isa = PBXGroup; children = ( 95A0745822C2140700A42BC8 /* OpenInTerminalCore.framework */, 95A0744922C2083E00A42BC8 /* OpenInEditor-Lite */, 95A0744822C2083E00A42BC8 /* Products */, ); sourceTree = ""; }; 95A0744822C2083E00A42BC8 /* Products */ = { isa = PBXGroup; children = ( 95A0744722C2083E00A42BC8 /* OpenInEditor-Lite.app */, ); name = Products; sourceTree = ""; }; 95A0744922C2083E00A42BC8 /* OpenInEditor-Lite */ = { isa = PBXGroup; children = ( 9595D2A223BAD7EE006CBB36 /* OpenInEditor-Lite.entitlements */, 95A0745C22C2141700A42BC8 /* main.swift */, 95A0745E22C2155800A42BC8 /* Error.swift */, 95A0744C22C2083E00A42BC8 /* Assets.xcassets */, 95A0745122C2083E00A42BC8 /* Info.plist */, 95A0745222C2083E00A42BC8 /* OpenInEditor_Lite.entitlements */, 95A0746422C217E800A42BC8 /* Localizable.strings */, ); path = "OpenInEditor-Lite"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 95A0744622C2083E00A42BC8 /* OpenInEditor-Lite */ = { isa = PBXNativeTarget; buildConfigurationList = 95A0745522C2083E00A42BC8 /* Build configuration list for PBXNativeTarget "OpenInEditor-Lite" */; buildPhases = ( 95A0744322C2083E00A42BC8 /* Sources */, 95A0744422C2083E00A42BC8 /* Frameworks */, 95A0744522C2083E00A42BC8 /* Resources */, 95A0745B22C2140800A42BC8 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "OpenInEditor-Lite"; productName = "OpenInEditor-Lite"; productReference = 95A0744722C2083E00A42BC8 /* OpenInEditor-Lite.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 95A0743F22C2083E00A42BC8 /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1020; LastUpgradeCheck = 1330; ORGANIZATIONNAME = "Jianing Wang"; TargetAttributes = { 95A0744622C2083E00A42BC8 = { CreatedOnToolsVersion = 10.2.1; SystemCapabilities = { com.apple.Sandbox = { enabled = 0; }; }; }; }; }; buildConfigurationList = 95A0744222C2083E00A42BC8 /* Build configuration list for PBXProject "OpenInEditor-Lite" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, "zh-Hans", fr, ko, ru, it, es, tr, de, ); mainGroup = 95A0743E22C2083E00A42BC8; productRefGroup = 95A0744822C2083E00A42BC8 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 95A0744622C2083E00A42BC8 /* OpenInEditor-Lite */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 95A0744522C2083E00A42BC8 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 95A0744D22C2083E00A42BC8 /* Assets.xcassets in Resources */, 95A0746222C217E800A42BC8 /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 95A0744322C2083E00A42BC8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 95A0745F22C2155800A42BC8 /* Error.swift in Sources */, 95A0745D22C2141700A42BC8 /* main.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 95A0746422C217E800A42BC8 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( 95A0746322C217E800A42BC8 /* en */, 95A0746522C217EC00A42BC8 /* zh-Hans */, 95A0746622C217EF00A42BC8 /* fr */, 82AE667823896C4E00F4DB4D /* ko */, 95DD629D243B4694003550B3 /* ru */, C3135D9E243F4CFA003323CF /* it */, 9561BB4324C1F3ED001DE0A9 /* es */, 95B0614027AFAD1E009C2B4E /* tr */, 2594E99827EF396F00AF84D5 /* de */, ); name = Localizable.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 95A0745322C2083E00A42BC8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; 95A0745422C2083E00A42BC8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; }; name = Release; }; 95A0745622C2083E00A42BC8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "OpenInEditor-Lite/OpenInEditor-Lite.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = Q33U8R4U57; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = "OpenInEditor-Lite/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; MARKETING_VERSION = 1.2.7; PRODUCT_BUNDLE_IDENTIFIER = "wang.jianing.app.OpenInEditor-Lite"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; }; name = Debug; }; 95A0745722C2083E00A42BC8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "OpenInEditor-Lite/OpenInEditor-Lite.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = Q33U8R4U57; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = "OpenInEditor-Lite/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; MARKETING_VERSION = 1.2.7; PRODUCT_BUNDLE_IDENTIFIER = "wang.jianing.app.OpenInEditor-Lite"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 95A0744222C2083E00A42BC8 /* Build configuration list for PBXProject "OpenInEditor-Lite" */ = { isa = XCConfigurationList; buildConfigurations = ( 95A0745322C2083E00A42BC8 /* Debug */, 95A0745422C2083E00A42BC8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 95A0745522C2083E00A42BC8 /* Build configuration list for PBXNativeTarget "OpenInEditor-Lite" */ = { isa = XCConfigurationList; buildConfigurations = ( 95A0745622C2083E00A42BC8 /* Debug */, 95A0745722C2083E00A42BC8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 95A0743F22C2083E00A42BC8 /* Project object */; } ================================================ FILE: OpenInEditor-Lite/OpenInEditor-Lite.xcodeproj/xcshareddata/xcschemes/OpenInEditor-Lite.xcscheme ================================================ ================================================ FILE: OpenInTerminal/AppDelegate.swift ================================================ // // AppDelegate.swift // OpenInTerminal // // Created by Cameron Ingham on 4/17/19. // Copyright © 2019 Jianing Wang. All rights reserved. // import Cocoa import OpenInTerminalCore import ShortcutRecorder @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { // MARK: - Properties let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) @IBOutlet weak var statusBarMenu: NSMenu! // MARK: - Lifecycle func applicationDidFinishLaunching(_ notification: Notification) { DefaultsManager.shared.firstSetup() addObserver() terminateOpenInTerminalHelper() setStatusItemIcon() setStatusItemVisible() setStatusToggle() logw("") logw("App launched") logw("macOS \(ProcessInfo().operatingSystemVersionString)") logw("OpenInTerminal Version \(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "")") // bind global shortcuts bindShortcuts() do { // check scripts and install them if needed try checkScripts() } catch { logw(error.localizedDescription) } } func applicationWillTerminate(_ notification: Notification) { NSStatusBar.system.removeStatusItem(statusItem) removeObserver() logw("App terminated") } func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { if !flag { showPreferencesWindow() } return true } } extension AppDelegate { // MARK: - Status Bar Item func setStatusItemIcon() { let icon = NSImage(assetIdentifier: .StatusBarIcon) icon.isTemplate = true // Support Dark Mode DispatchQueue.main.async { self.statusItem.button?.image = icon } } func setStatusItemVisible() { let isHideStatusItem = DefaultsManager.shared.isHideStatusItem statusItem.isVisible = !isHideStatusItem } func setStatusToggle() { let isQuickToogle = DefaultsManager.shared.isQuickToggle if isQuickToogle { statusItem.menu = nil if let button = statusItem.button { button.action = #selector(statusBarButtonClicked) button.sendAction(on: [.leftMouseUp, .leftMouseDown, .rightMouseUp, .rightMouseDown]) } } else { statusItem.menu = statusBarMenu } } @objc func statusBarButtonClicked(sender: NSStatusBarButton) { let event = NSApp.currentEvent! if event.type == .rightMouseDown || event.type == .rightMouseUp || event.modifierFlags.contains(.control) { statusItem.menu = statusBarMenu statusItem.button?.performClick(self) statusItem.menu = nil } else if event.type == .leftMouseUp { if let quickToggleType = DefaultsManager.shared.quickToggleType { switch quickToggleType { case .openWithDefaultTerminal: openDefaultTerminal() case .openWithDefaultEditor: openDefaultEditor() case .copyPathToClipboard: copyPathToClipboard() } } } } func terminateOpenInTerminalHelper() { let isRunning = NSWorkspace.shared.runningApplications.contains { $0.bundleIdentifier == Constants.Id.LauncherApp } if isRunning { LaunchNotifier.postNotification(.terminateApp, object: Bundle.main.bundleIdentifier!) } } func showPreferencesWindow() { NSApp.setActivationPolicy(.regular) // show icon in Dock let preferencesWindowController: PreferencesWindowController = { let storyboard = NSStoryboard(storyboardIdentifier: .Preferences) let windowController = storyboard.instantiateInitialController() as? PreferencesWindowController ?? PreferencesWindowController() return windowController }() preferencesWindowController.window?.delegate = self NSApp.activate(ignoringOtherApps: true) preferencesWindowController.showWindow(self) preferencesWindowController.window?.makeKeyAndOrderFront(self) } // MARK: - Notification func addObserver() { OpenNotifier.addObserver(observer: self, selector: #selector(openDefaultTerminal), notification: .openDefaultTerminal) OpenNotifier.addObserver(observer: self, selector: #selector(openDefaultEditor), notification: .openDefaultEditor) OpenNotifier.addObserver(observer: self, selector: #selector(copyPathToClipboard), notification: .copyPathToClipboard) } func removeObserver() { OpenNotifier.removeObserver(observer: self, notification: .openDefaultTerminal) OpenNotifier.removeObserver(observer: self, notification: .openDefaultEditor) OpenNotifier.removeObserver(observer: self, notification: .copyPathToClipboard) } // MARK: Notification Actions @objc func openDefaultTerminal() { var defaultTerminal: App if let terminal = DefaultsManager.shared.defaultTerminal { defaultTerminal = terminal } else { // if there is no defualt terminal, then pick one guard let selectedTerminal = AppManager.shared.pickTerminalAlert() else { return } DefaultsManager.shared.defaultTerminal = selectedTerminal defaultTerminal = selectedTerminal } do { try defaultTerminal.openOutsideSandbox() } catch { logw("\(error)") } } @objc func openDefaultEditor() { var defaultEditor: App if let editor = DefaultsManager.shared.defaultEditor { defaultEditor = editor } else { // if there is no defualt editor, then pick one guard let selectedEditor = AppManager.shared.pickEditorAlert() else { return } DefaultsManager.shared.defaultEditor = selectedEditor defaultEditor = selectedEditor } do { try defaultEditor.openOutsideSandbox() } catch { logw("\(error)") } } @objc func copyPathToClipboard() { do { var urls = try FinderManager.shared.getFullUrlsToFrontFinderWindowOrSelectedFile() if urls.count == 0 { // No Finder window and no file selected. let homePath = NSHomeDirectory() guard let homeUrl = URL(string: homePath) else { return } urls.append(homeUrl.appendingPathComponent("Desktop")) } let paths = urls.map { $0.path } let pathString = paths.joined(separator: "\n") // Set string NSPasteboard.general.clearContents() NSPasteboard.general.setString(pathString, forType: .string) } catch { logw(error.localizedDescription) } } // func writeimage() { // SupportedApps.allCases.forEach { // let path = "/Applications/\($0.name).app" // guard FileManager.default.fileExists(atPath: path) else { return } // // let desktopURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first! // let destinationURL = desktopURL.appendingPathComponent("\($0.name).png") // let icon = AppManager.getApplicationIcon(from: path) // // guard let tiffRepresentation = icon.tiffRepresentation, // let bitmapImage = NSBitmapImageRep(data: tiffRepresentation) else { return } // let pngData = bitmapImage.representation(using: .png, properties: [:]) // do { // try pngData?.write(to: destinationURL, options: .atomic) // } catch { // print("\($0.name)") // print(error) // } // } // } } extension AppDelegate { // MARK: - Global Shortcuts func bindShortcuts() { let oitAction = ShortcutAction(keyPath: Constants.Key.defaultTerminalShortcut, of: Defaults) { _ in let appDelegate = NSApplication.shared.delegate as! AppDelegate appDelegate.openDefaultTerminal() return true } GlobalShortcutMonitor.shared.addAction(oitAction, forKeyEvent: .down) let oieAction = ShortcutAction(keyPath: Constants.Key.defaultEditorShortcut, of: Defaults) { _ in let appDelegate = NSApplication.shared.delegate as! AppDelegate appDelegate.openDefaultEditor() return true } GlobalShortcutMonitor.shared.addAction(oieAction, forKeyEvent: .down) let copyPathAction = ShortcutAction(keyPath: Constants.Key.copyPathShortcut, of: Defaults) { _ in let appDelegate = NSApplication.shared.delegate as! AppDelegate appDelegate.copyPathToClipboard() return true } GlobalShortcutMonitor.shared.addAction(copyPathAction, forKeyEvent: .down) } } extension AppDelegate: NSWindowDelegate { func windowWillClose(_ notification: Notification) { NSApp.setActivationPolicy(.accessory) // hide icon in Dock } } ================================================ FILE: OpenInTerminal/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "filename" : "AppIcon-16.png", "idiom" : "mac", "scale" : "1x", "size" : "16x16" }, { "filename" : "AppIcon-16@2x.png", "idiom" : "mac", "scale" : "2x", "size" : "16x16" }, { "filename" : "AppIcon-32.png", "idiom" : "mac", "scale" : "1x", "size" : "32x32" }, { "filename" : "AppIcon-32@2x.png", "idiom" : "mac", "scale" : "2x", "size" : "32x32" }, { "filename" : "AppIcon-128.png", "idiom" : "mac", "scale" : "1x", "size" : "128x128" }, { "filename" : "AppIcon-128@2x.png", "idiom" : "mac", "scale" : "2x", "size" : "128x128" }, { "filename" : "AppIcon-256.png", "idiom" : "mac", "scale" : "1x", "size" : "256x256" }, { "filename" : "AppIcon-256@2x.png", "idiom" : "mac", "scale" : "2x", "size" : "256x256" }, { "filename" : "AppIcon-512.png", "idiom" : "mac", "scale" : "1x", "size" : "512x512" }, { "filename" : "AppIcon-512@2x.png", "idiom" : "mac", "scale" : "2x", "size" : "512x512" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Assets.xcassets/Contents.json ================================================ { "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Assets.xcassets/StatusBarIcon.imageset/Contents.json ================================================ { "images" : [ { "filename" : "status_bar_icon.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "status_bar_icon@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "status_bar_icon@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Assets.xcassets/ToolbarCustomize.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "ToolbarCustomize.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: OpenInTerminal/Assets.xcassets/logo.imageset/Contents.json ================================================ { "images" : [ { "filename" : "AppIcon-256.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Constants.swift ================================================ // // Config.swift // OpenInTerminal // // Created by Jianing Wang on 2019/4/20. // Copyright © 2019 Jianing Wang. All rights reserved. // import Cocoa import Foundation import OpenInTerminalCore struct Constants { struct Id { static let LauncherApp = "wang.jianing.app.OpenInTerminalHelper" static let FinderExtension = "wang.jianing.app.OpenInTerminal.OpenInTerminalFinderExtension" static let CustomAppCell = NSUserInterfaceItemIdentifier(rawValue: "customAppCell") static let CustomMenuCell = NSUserInterfaceItemIdentifier(rawValue: "customMenuCell") static let CustomInputViewController = "CustomInputViewController" } static let none = "None" struct Key { static let defaultTerminalShortcut = "OIT_DefaultTerminalShortcut" static let defaultEditorShortcut = "OIT_DefaultEditorShortcut" static let copyPathShortcut = "OIT_CopyPathShortcut" } static let PreferencesStoryboard = NSStoryboard(name: "Preferences", bundle: nil) } extension NSImage { enum AssetIdentifier: String { case StatusBarIcon } convenience init(assetIdentifier: AssetIdentifier) { self.init(named: assetIdentifier.rawValue)! } } extension NSStoryboard { enum StoryboardIdentifier: String { case Preferences } convenience init(storyboardIdentifier: StoryboardIdentifier) { self.init(name: storyboardIdentifier.rawValue, bundle: nil) } } ================================================ FILE: OpenInTerminal/Error.swift ================================================ // // Error.swift // OpenInTerminal // // Created by Jianing Wang on 2019/10/15. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation enum OITMError: Error { case cannotAccessPath(_ path: String) } extension OITMError : CustomStringConvertible { var description: String { switch self { case .cannotAccessPath(let path): return "Cannot access path: \(path)" } } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Alacritty.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Alacritty.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Android Studio.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Android Studio.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/AppCode.imageset/Contents.json ================================================ { "images" : [ { "filename" : "AppCode.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Atom.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Atom.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/BBEdit.imageset/Contents.json ================================================ { "images" : [ { "filename" : "BBEdit.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/CLion.imageset/Contents.json ================================================ { "images" : [ { "filename" : "CLion.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Contents.json ================================================ { "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/CotEditor.imageset/Contents.json ================================================ { "images" : [ { "filename" : "CotEditor.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Cursor.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Cursor.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Fleet.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Fleet.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Fork.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Fork.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Ghostty.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Ghostty.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/GitHub Desktop.imageset/Contents.json ================================================ { "images" : [ { "filename" : "GitHub Desktop.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/GoLand.imageset/Contents.json ================================================ { "images" : [ { "filename" : "GoLand.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/IntelliJ IDEA.imageset/Contents.json ================================================ { "images" : [ { "filename" : "IntelliJ IDEA.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/MacVim.imageset/Contents.json ================================================ { "images" : [ { "filename" : "MacVim.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Nova.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Nova.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/PhpStorm.imageset/Contents.json ================================================ { "images" : [ { "filename" : "PhpStorm.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/PyCharm.imageset/Contents.json ================================================ { "images" : [ { "filename" : "PyCharm.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/RubyMine.imageset/Contents.json ================================================ { "images" : [ { "filename" : "RubyMine.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Sublime Text.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Sublime Text.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Tabby.imageset/Contents.json ================================================ { "images" : [ { "filename" : "tabby.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Terminal.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Terminal.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/TextEdit.imageset/Contents.json ================================================ { "images" : [ { "filename" : "TextEdit.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/TextMate.imageset/Contents.json ================================================ { "images" : [ { "filename" : "TextMate.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Typora.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Typora.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/VSCodium.imageset/Contents.json ================================================ { "images" : [ { "filename" : "VSCodium.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Visual Studio Code - Insiders.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Visual Studio Code - Insiders.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Visual Studio Code.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Visual Studio Code.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Warp.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Warp.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/WebStorm.imageset/Contents.json ================================================ { "images" : [ { "filename" : "WebStorm.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/WezTerm.imageset/Contents.json ================================================ { "images" : [ { "filename" : "wezterm.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Xcode.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Xcode.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/Zed.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Zed.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/context_menu_icon_color_editor.imageset/Contents.json ================================================ { "images" : [ { "filename" : "context_menu_icon_color_editor.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "context_menu_icon_color_editor@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "context_menu_icon_color_editor@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/context_menu_icon_color_path.imageset/Contents.json ================================================ { "images" : [ { "filename" : "context_menu_icon_color_path.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "context_menu_icon_color_path@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "context_menu_icon_color_path@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/context_menu_icon_color_terminal.imageset/Contents.json ================================================ { "images" : [ { "filename" : "context_menu_icon_color_terminal.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "context_menu_icon_color_terminal@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "context_menu_icon_color_terminal@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/context_menu_icon_editor.imageset/Contents.json ================================================ { "images" : [ { "filename" : "context_menu_icon_editor-1.png", "idiom" : "universal", "scale" : "1x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "light" } ], "filename" : "context_menu_icon_editor.png", "idiom" : "universal", "scale" : "1x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "dark" } ], "filename" : "context_menu_icon_editor_light.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "context_menu_icon_editor@2x-1.png", "idiom" : "universal", "scale" : "2x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "light" } ], "filename" : "context_menu_icon_editor@2x.png", "idiom" : "universal", "scale" : "2x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "dark" } ], "filename" : "context_menu_icon_editor_light@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "context_menu_icon_editor@3x.png", "idiom" : "universal", "scale" : "3x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "light" } ], "idiom" : "universal", "scale" : "3x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "dark" } ], "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/context_menu_icon_path.imageset/Contents.json ================================================ { "images" : [ { "filename" : "context_menu_icon_path-1.png", "idiom" : "universal", "scale" : "1x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "light" } ], "filename" : "context_menu_icon_path.png", "idiom" : "universal", "scale" : "1x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "dark" } ], "filename" : "context_menu_icon_path_light.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "context_menu_icon_path@2x-1.png", "idiom" : "universal", "scale" : "2x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "light" } ], "filename" : "context_menu_icon_path@2x.png", "idiom" : "universal", "scale" : "2x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "dark" } ], "filename" : "context_menu_icon_path_light@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "context_menu_icon_path@3x.png", "idiom" : "universal", "scale" : "3x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "light" } ], "idiom" : "universal", "scale" : "3x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "dark" } ], "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/context_menu_icon_terminal.imageset/Contents.json ================================================ { "images" : [ { "filename" : "context_menu_icon_terminal-1.png", "idiom" : "universal", "scale" : "1x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "light" } ], "filename" : "context_menu_icon_terminal.png", "idiom" : "universal", "scale" : "1x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "dark" } ], "filename" : "context_menu_icon_terminal_light.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "context_menu_icon_terminal@2x-1.png", "idiom" : "universal", "scale" : "2x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "light" } ], "filename" : "context_menu_icon_terminal@2x.png", "idiom" : "universal", "scale" : "2x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "dark" } ], "filename" : "context_menu_icon_terminal_light@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "context_menu_icon_terminal@3x.png", "idiom" : "universal", "scale" : "3x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "light" } ], "idiom" : "universal", "scale" : "3x" }, { "appearances" : [ { "appearance" : "luminosity", "value" : "dark" } ], "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/hyper.imageset/Contents.json ================================================ { "images" : [ { "filename" : "hyper.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/iTerm.imageset/Contents.json ================================================ { "images" : [ { "filename" : "iTerm.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/kitty.imageset/Contents.json ================================================ { "images" : [ { "filename" : "kitty.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Icons.xcassets/neovim.imageset/Contents.json ================================================ { "images" : [ { "filename" : "neovim.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion 1 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) LSUIElement YES NSAppleEventsUsageDescription Please give permissions to access your Finder & Terminal NSExtension NSExtensionAttributes NSExtensionPointIdentifier com.apple.FinderSync NSExtensionPrincipalClass $(PRODUCT_MODULE_NAME).FinderSync NSHumanReadableCopyright Copyright © 2019 Jianing Wang. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass NSApplication ================================================ FILE: OpenInTerminal/MainMenu.xib ================================================ ================================================ FILE: OpenInTerminal/Notifier/LaunchNotifier.swift ================================================ // // LaunchNotifier.swift // OpenInTerminal // // Created by Jianing Wang on 2019/4/27. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation public class LaunchNotifier: Notifier { public enum Notification: String { case terminateApp } } ================================================ FILE: OpenInTerminal/Notifier/Notifier.swift ================================================ // // Notifier.swift // OpenInTerminal // // Created by Jianing Wang on 2019/4/19. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation public protocol Notifier { associatedtype Notification: RawRepresentable } public extension Notifier where Notification.RawValue == String { // MARK: - Static Computed Variables private static func nameFor(notification: Notification) -> String { return "\(self).\(notification.rawValue)" } // MARK: - Instance Methods // Post func postNotification(notification: Notification, object: String? = nil) { Self.postNotification(notification, object: object) } func postNotification(notification: Notification, object: String? = nil, userInfo: [String : AnyObject]? = nil) { Self.postNotification(notification, object: object, userInfo: userInfo) } // MARK: - Static Function // Post static func postNotification(_ notification: Notification, object: String? = nil, userInfo: [AnyHashable : Any]? = nil) { let name = nameFor(notification: notification) DistributedNotificationCenter.default() .postNotificationName(NSNotification.Name(rawValue: name), object: object, userInfo: userInfo, deliverImmediately: true) } // Add static func addObserver(observer: AnyObject, selector: Selector, notification: Notification, object: String? = nil) { let name = nameFor(notification: notification) DistributedNotificationCenter.default() .addObserver(observer, selector: selector, name: NSNotification.Name(rawValue: name), object: object) } // Remove static func removeObserver(observer: AnyObject, notification: Notification, object: String? = nil) { let name = nameFor(notification: notification) DistributedNotificationCenter.default() .removeObserver(observer, name: NSNotification.Name(rawValue: name), object: object) } } ================================================ FILE: OpenInTerminal/Notifier/OpenNotifier.swift ================================================ // // OpenManager.swift // OpenInTerminal // // Created by Jianing Wang on 2019/4/19. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation public class OpenNotifier: Notifier { public enum Notification: String { case openDefaultTerminal case openDefaultEditor case copyPathToClipboard } } ================================================ FILE: OpenInTerminal/OpenInTerminal.entitlements ================================================ com.apple.security.application-groups group.wang.jianing.app.OpenInTerminal com.apple.security.automation.apple-events com.apple.security.temporary-exception.apple-events com.apple.systemevents com.apple.Terminal com.apple.Finder com.googlecode.iterm2 co.zeit.hyper io.alacritty com.github.wez.wezterm org.tabby com.microsoft.VSCode com.github.atom com.sublimetext.3 com.barebones.bbedit com.microsoft.VSCodeInsiders com.macromates.TextMate net.kovidgoyal.kitty ================================================ FILE: OpenInTerminal/PreferencesWindow/AboutPreferencesViewController.swift ================================================ // // AboutPreferencesViewController.swift // OpenInTerminal // // Created by Jianing Wang on 2019/5/1. // Copyright © 2019 Jianing Wang. All rights reserved. // import Cocoa class AboutPreferencesViewController: PreferencesViewController { @IBOutlet weak var versionLabel: NSTextField! override func viewDidLoad() { super.viewDidLoad() let versionObject = Bundle.main.infoDictionary?["CFBundleShortVersionString"] versionLabel.stringValue = versionObject as? String ?? "" } @IBAction func githubButtonClicked(_ sender: NSButton) { guard let url = URL(string: "https://github.com/Ji4n1ng/OpenInTerminal") else { return } NSWorkspace.shared.open(url) } @IBAction func contactButtonClicked(_ sender: NSButton) { guard let url = URL(string: "mailto:contact@jianing.wang?subject=OpenInTerminal%20Feedback") else { return } NSWorkspace.shared.open(url) } @IBAction func twitterButtonClicked(_ sender: NSButton) { guard let url = URL(string: "https://twitter.com/Ji4n1ng") else { return } NSWorkspace.shared.open(url) } @IBAction func githubSponsorsButtonClicked(_ sender: NSButton) { guard let url = URL(string: "https://github.com/sponsors/Ji4n1ng") else { return } NSWorkspace.shared.open(url) } @IBAction func paypalButtonClicked(_ sender: NSButton) { guard let url = URL(string: "https://paypal.me/ji4ning") else { return } NSWorkspace.shared.open(url) } @IBAction func alipayButtonClicked(_ sender: NSButton) { guard let url = URL(string: "https://github.com/Ji4n1ng/OpenInTerminal/blob/master/Resources/Support-Alipay.jpg") else { return } NSWorkspace.shared.open(url) } @IBAction func weChatPayButtonClicked(_ sender: NSButton) { guard let url = URL(string: "https://github.com/Ji4n1ng/OpenInTerminal/blob/master/Resources/Support-WeChatPay.jpg") else { return } NSWorkspace.shared.open(url) } @IBAction func camji55ButtonClicked(_ sender: NSButton) { guard let url = URL(string: "https://github.com/Camji55") else { return } NSWorkspace.shared.open(url) } } class LinkButton: NSButton { required init?(coder: NSCoder) { super.init(coder: coder) } override func resetCursorRects() { addCursorRect(self.bounds, cursor: .pointingHand) } } ================================================ FILE: OpenInTerminal/PreferencesWindow/AdvancedPreferencesViewController.swift ================================================ // // AdvancedPreferencesViewController.swift // OpenInTerminal // // Created by Jianing Wang on 2019/5/5. // Copyright © 2019 Jianing Wang. All rights reserved. // import Cocoa import OpenInTerminalCore import ServiceManagement import ShortcutRecorder class AdvancedPreferencesViewController: PreferencesViewController { @IBOutlet weak var defaultTerminalShortcut: RecorderControl! @IBOutlet weak var defaultEditorShortcut: RecorderControl! @IBOutlet weak var copyPathShortcut: RecorderControl! @IBOutlet weak var resetPreferencesButton: NSButton! // MARK: Lifecycle override func viewDidLoad() { super.viewDidLoad() defaultTerminalShortcut.bind(.value, to: Defaults, withKeyPath: Constants.Key.defaultTerminalShortcut) defaultEditorShortcut.bind(.value, to: Defaults, withKeyPath: Constants.Key.defaultEditorShortcut) copyPathShortcut.bind(.value, to: Defaults, withKeyPath: Constants.Key.copyPathShortcut) } // MARK: Button Actions @IBAction func resetPreferencesButtonClicked(_ sender: NSButton) { let alert = NSAlert() alert.messageText = NSLocalizedString("alert.reset_preferences_title", comment: "Reset User Preferences?") alert.informativeText = NSLocalizedString("alert.reset_preferences_description", comment: "⚠️ Note that this will reset all user preferences") // Add button and avoid the focus ring let cancelString = NSLocalizedString("general.cancel", comment: "Cancel") alert.addButton(withTitle: cancelString).refusesFirstResponder = true let yesString = NSLocalizedString("general.yes", comment: "Yes") alert.addButton(withTitle: yesString).refusesFirstResponder = true let modalResult = alert.runModal() switch modalResult { case .alertFirstButtonReturn: print("Cancel Resetting User Preferences") case .alertSecondButtonReturn: logw("Reset User Preferences") SMLoginItemSetEnabled(Constants.Id.LauncherApp as CFString, false) DefaultsManager.shared.removeAllUserDefaults() DefaultsManager.shared.firstSetup() let appDelegate = NSApplication.shared.delegate as! AppDelegate appDelegate.setStatusToggle() default: print("Cancel Resetting User Preferences") } } @IBAction func quitButtonClicked(_ sender: NSButton) { LaunchNotifier.postNotification(.terminateApp, object: Bundle.main.bundleIdentifier!) NSApp.terminate(self) } } ================================================ FILE: OpenInTerminal/PreferencesWindow/Base.lproj/Preferences.storyboard ================================================ ================================================ FILE: OpenInTerminal/PreferencesWindow/CustomInputViewController.swift ================================================ // // CustomInputViewController.swift // OpenInTerminal // // Created by Jianing Wang on 2021/1/14. // Copyright © 2021 Jianing Wang. All rights reserved. // import Cocoa import OpenInTerminalCore class CustomInputViewController: NSViewController { @IBOutlet weak var appNameTextField: NSTextField! @IBOutlet weak var terminalTypeButton: NSButton! @IBOutlet weak var editorTypeButton: NSButton! @IBOutlet weak var cancelButton: NSButton! @IBOutlet weak var confirmButton: NSButton! var appName: String? override func viewDidLoad() { super.viewDidLoad() appNameTextField.delegate = self } override func viewWillAppear() { super.viewWillAppear() terminalTypeButton.state = .off editorTypeButton.state = .off if let name = appName { appNameTextField.stringValue = name } refreshConfirmState() } @IBAction func terminalTypeButtonClicked(_ sender: NSButton) { editorTypeButton.state = .off refreshConfirmState() } @IBAction func editorTypeButtonClicked(_ sender: NSButton) { terminalTypeButton.state = .off refreshConfirmState() } @IBAction func cancelButtonClicked(_ sender: NSButton) { dismiss(nil) } @IBAction func confirmButtonClicked(_ sender: NSButton) { confirmButton.isEnabled = false if let presenting = presentingViewController as? CustomPreferencesViewController { let name = appNameTextField.stringValue let type: AppType = terminalTypeButton.state == .on ? .terminal : .editor let app = App(name: name, type: type) presenting.addCustomApp(app) dismiss(nil) } } func refreshConfirmState() { if appNameTextField.stringValue.count > 0 && (terminalTypeButton.state == .on || editorTypeButton.state == .on) { confirmButton.isEnabled = true } else { confirmButton.isEnabled = false } } } extension CustomInputViewController: NSTextFieldDelegate { func controlTextDidChange(_ obj: Notification) { refreshConfirmState() } } ================================================ FILE: OpenInTerminal/PreferencesWindow/CustomPreferencesViewController.swift ================================================ // // CustomPreferencesViewController.swift // OpenInTerminal // // Created by Jianing Wang on 2019/4/21. // Copyright © 2019 Jianing Wang. All rights reserved. // import Cocoa import OpenInTerminalCore class CustomPreferencesViewController: PreferencesViewController { // MARK: Properties @IBOutlet weak var installedApplicationsTextField: NSTextField! @IBOutlet weak var notInstalledApplicationsTextField: NSTextField! @IBOutlet weak var iTermTextField: NSTextField! @IBOutlet weak var iTermWindowButton: NSButton! @IBOutlet weak var iTermTabButton: NSButton! @IBOutlet weak var customMenuTableView: NSTableView! @IBOutlet weak var addMenuOptionButton: NSButton! var addOptionMenu: NSMenu = NSMenu() @IBOutlet weak var applyToToolbarButton: NSButton! @IBOutlet weak var applyToContextButton: NSButton! @IBOutlet weak var noIconButton: NSButton! @IBOutlet weak var simpleIconButton: NSButton! @IBOutlet weak var originalIconButton: NSButton! @IBOutlet weak var pathNoButton: NSButton! @IBOutlet weak var pathYesButton: NSButton! private var dragDropType = NSPasteboard.PasteboardType(rawValue: "private.table-row") var allInstalledAppNames: Set = Set() { didSet { DispatchQueue.main.async { self.refreshSupportedApps() } } } var installedSupportedAppNames: [String] = [] var customMenuOptions = [App]() { didSet { customMenuTableView.reloadData() if customMenuOptions != DefaultsManager.shared.customMenuOptions { DefaultsManager.shared.customMenuOptions = customMenuOptions } } } var runningApps = [App]() // MARK: Lifecycle override func viewDidLoad() { super.viewDidLoad() customMenuTableView.dataSource = self customMenuTableView.delegate = self customMenuTableView.registerForDraggedTypes([dragDropType]) } override func viewWillAppear() { super.viewWillAppear() // fetch installed apps DispatchQueue.global(qos: .background).async { self.allInstalledAppNames = FinderManager.shared.getAllInstalledApps() } // get saved custom menu apps if let customMenuOptions = DefaultsManager.shared.customMenuOptions { self.customMenuOptions = customMenuOptions } refreshSupportedApps() refreshCustomButtons() refreshIconTypeOptionState() } override func viewDidAppear() { super.viewDidAppear() } // MARK: Refresh UI func refreshSupportedApps() { // get all installed supported apps installedSupportedAppNames = SupportedApps.allCases.map(\.name) .filter(allInstalledAppNames.contains) .sortedIgnoreCase() installedApplicationsTextField.stringValue = installedSupportedAppNames.joined(separator: ", ") // get all not installed supported apps let notInstalledSupportedApps = SupportedApps.allCases.map(\.name) .filter { !installedSupportedAppNames.contains($0) } .sortedIgnoreCase() notInstalledApplicationsTextField.stringValue = notInstalledSupportedApps.joined(separator: ", ") // refresh text field enabled state let terminals: [(SupportedApps, NSTextField)] = [ (.iTerm, iTermTextField) ] terminals.forEach { terminal, textField in let isInstalled = installedSupportedAppNames.contains(terminal.name) textField.isEnabled = isInstalled if isInstalled { textField.textColor = .labelColor textField.stringValue = "\(terminal.name)" } else { textField.textColor = .secondaryLabelColor let notInstalledString = NSLocalizedString("pref.toolbar.not_installed", comment: "Not Installed") textField.stringValue = "\(terminal.name) (\(notInstalledString))" } } // refresh button state iTermWindowButton.isEnabled = iTermTextField.isEnabled iTermTabButton.isEnabled = iTermTextField.isEnabled let terminalStates: [(SupportedApps, NSButton, NSButton)] = [ (.iTerm, iTermWindowButton, iTermTabButton) ] terminalStates.forEach { terminal, windowButton, tabButton in let _newOption = DefaultsManager.shared.getNewOption(terminal) if let newOption = _newOption { if newOption == .window { windowButton.state = .on tabButton.state = .off } else { windowButton.state = .off tabButton.state = .on } } } } func refreshCustomButtons() { let isApplyToToolbar = DefaultsManager.shared.isCustomMenuApplyToToolbar applyToToolbarButton.state = isApplyToToolbar ? .on : .off let isApplyToContext = DefaultsManager.shared.isCustomMenuApplyToContext applyToContextButton.state = isApplyToContext ? .on : .off let isPathEscaped = DefaultsManager.shared.isPathEscaped if isPathEscaped { pathYesButton.state = .on pathNoButton.state = .off } else { pathYesButton.state = .off pathNoButton.state = .on } } func offIconTypeButtons() { noIconButton.state = .off simpleIconButton.state = .off originalIconButton.state = .off } func refreshIconTypeOptionState() { offIconTypeButtons() let option = DefaultsManager.shared.customMenuIconOption switch option { case .no: noIconButton.state = .on case .simple: simpleIconButton.state = .on case .original: originalIconButton.state = .on } } func refreshAddOptionMenu() { addOptionMenu.removeAllItems() // 1. Installed Supported Apps let installedSupportedMenu = NSMenu() installedSupportedAppNames.forEach { let menuItem = NSMenuItem(title: $0, action: #selector(selectSupportedApp), keyEquivalent: "") menuItem.target = self menuItem.image = NSImage(named: $0) menuItem.image?.size = NSSize(width: 14, height: 14) installedSupportedMenu.addItem(menuItem) } let installedSupportedMenuItem = NSMenuItem() installedSupportedMenuItem.title = NSLocalizedString("pref.custom.menu.installed_supported", comment: "Installed Supported Apps") addOptionMenu.addItem(installedSupportedMenuItem) addOptionMenu.setSubmenu(installedSupportedMenu, for: installedSupportedMenuItem) // 2. All Supported Apps let supportedMenu = NSMenu() SupportedApps.allCases.forEach { let menuItem = NSMenuItem(title: $0.name, action: #selector(selectSupportedApp), keyEquivalent: "") menuItem.target = self menuItem.image = NSImage(named: $0.name) menuItem.image?.size = NSSize(width: 14, height: 14) supportedMenu.addItem(menuItem) } let supportedMenuItem = NSMenuItem() supportedMenuItem.title = NSLocalizedString("pref.custom.menu.all_supported", comment: "All Supported Apps") addOptionMenu.addItem(supportedMenuItem) addOptionMenu.setSubmenu(supportedMenu, for: supportedMenuItem) // 3. Running Applications let runningMenu = NSMenu() let runningApplications = NSWorkspace.shared.runningApplications runningApps.removeAll() for runningApp in runningApplications { guard runningApp.activationPolicy == .regular else { continue } guard let bundleURL = runningApp.bundleURL else { continue } let icon = AppManager.getApplicationIcon(from: bundleURL) let name = AppManager.getApplicationFileName(from: bundleURL.path) let menuItem = NSMenuItem(title: name, action: #selector(selectRunningApp), keyEquivalent: "") menuItem.target = self menuItem.image = icon menuItem.image?.size = NSSize(width: 14, height: 14) runningMenu.addItem(menuItem) let app = App(name: name, type: .terminal) runningApps.append(app) } let runningMenuItem = NSMenuItem() runningMenuItem.title = NSLocalizedString("pref.custom.menu.running_apps", comment: "Running Apps") addOptionMenu.addItem(runningMenuItem) addOptionMenu.setSubmenu(runningMenu, for: runningMenuItem) // 4. Manually Select From Finder let manuallySelectTitle = NSLocalizedString("pref.custom.menu.manually_select", comment: "Manually Select From Finder") let manuallySelectMenuItem = NSMenuItem(title: manuallySelectTitle, action: #selector(selectManuallySelect), keyEquivalent: "") manuallySelectMenuItem.target = self addOptionMenu.addItem(manuallySelectMenuItem) // 5. Manually Input let manuallyInputTitle = NSLocalizedString("pref.custom.menu.manually_input", comment: "Manually Input") let manuallyInputMenuItem = NSMenuItem(title: manuallyInputTitle, action: #selector(selectManuallyInput), keyEquivalent: "") manuallyInputMenuItem.target = self addOptionMenu.addItem(manuallyInputMenuItem) } // MARK: Button Actions @IBAction func iTermWindowButtonClicked(_ sender: NSButton) { iTermTabButton.state = .off DefaultsManager.shared.setNewOption(.iTerm, .window) } @IBAction func iTermTabButtonClicked(_ sender: NSButton) { iTermWindowButton.state = .off DefaultsManager.shared.setNewOption(.iTerm, .tab) } @IBAction func pathNoButtonClicked(_ sender: NSButton) { pathYesButton.state = .off DefaultsManager.shared.isPathEscaped = false } @IBAction func pathYesButtonClicked(_ sender: NSButton) { pathNoButton.state = .off DefaultsManager.shared.isPathEscaped = true } @IBAction func addMenuOptionButtonClicked(_ sender: NSButton) { refreshAddOptionMenu() let point = NSPoint(x: sender.frame.origin.x, y: sender.frame.origin.y - (sender.frame.height / 2)) addOptionMenu.popUp(positioning: nil, at: point, in: sender.superview) } @objc func selectSupportedApp(_ sender: NSMenuItem) { let selectedAppName = sender.title SupportedApps.allCases.forEach { if $0.name == selectedAppName { customMenuOptions.append($0.app) } } } @objc func selectRunningApp(_ sender: NSMenuItem) { let selectedAppName = sender.title runningApps.forEach { if $0.name == selectedAppName { showCustomInputViewController($0.name) } } } @objc func selectManuallySelect(_ sender: NSMenuItem) { openFileSelectPanel() } @objc func selectManuallyInput(_ sender: NSMenuItem) { showCustomInputViewController() } func addCustomApp(_ app: App) { customMenuOptions.append(app) // TODO: generate script } @IBAction func removeMenuOptionButtonClicked(_ sender: NSButton) { let row = customMenuTableView.selectedRow guard row >= 0 else { return } if let view = customMenuTableView.view(atColumn: 0, row: row, makeIfNecessary: false) as? NSTableCellView { let appName = view.textField?.stringValue ?? "" for customApp in customMenuOptions { if customApp.name == appName { customMenuOptions.remove(element: customApp) } } } } @IBAction func applyToToolbarButtonClicked(_ sender: NSButton) { let isApplyTo = applyToToolbarButton.state == .on DefaultsManager.shared.isCustomMenuApplyToToolbar = isApplyTo } @IBAction func applyToContextButtonClicked(_ sender: NSButton) { let isApplyTo = applyToContextButton.state == .on DefaultsManager.shared.isCustomMenuApplyToContext = isApplyTo } func showCustomInputViewController(_ appName: String = "") { guard let customInputViewController = Constants.PreferencesStoryboard.instantiateController(withIdentifier: Constants.Id.CustomInputViewController) as? CustomInputViewController else { return } if appName != "" { customInputViewController.appName = appName } self.presentAsSheet(customInputViewController) } @IBAction func noIconButtonClicked(_ sender: NSButton) { offIconTypeButtons() noIconButton.state = .on DefaultsManager.shared.customMenuIconOption = .no } @IBAction func simpleIconButtonClicked(_ sender: NSButton) { offIconTypeButtons() simpleIconButton.state = .on DefaultsManager.shared.customMenuIconOption = .simple } @IBAction func originalIconButtonClicked(_ sender: NSButton) { offIconTypeButtons() originalIconButton.state = .on DefaultsManager.shared.customMenuIconOption = .original } } extension CustomPreferencesViewController: NSTableViewDataSource { func numberOfRows(in tableView: NSTableView) -> Int { if tableView == customMenuTableView { return customMenuOptions.count } else { return 0 } } func tableView(_ tableView: NSTableView, pasteboardWriterForRow row: Int) -> NSPasteboardWriting? { let item = NSPasteboardItem() item.setString(String(row), forType: self.dragDropType) return item } func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation { if dropOperation == .above { return .move } return [] } func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableView.DropOperation) -> Bool { var oldIndexes = [Int]() info.enumerateDraggingItems(options: [], for: tableView, classes: [NSPasteboardItem.self], searchOptions: [:]) { dragItem, _, _ in if let str = (dragItem.item as! NSPasteboardItem).string(forType: self.dragDropType), let index = Int(str) { oldIndexes.append(index) } } var oldIndexOffset = 0 var newIndexOffset = 0 customMenuOptions.move(with: IndexSet(oldIndexes), to: row) // For simplicity, the code below uses `tableView.moveRowAtIndex` to move rows around directly. // You may want to move rows in your content array and then call `tableView.reloadData()` instead. tableView.beginUpdates() for oldIndex in oldIndexes { if oldIndex < row { // ⬇️ tableView.moveRow(at: oldIndex + oldIndexOffset, to: row - 1) oldIndexOffset -= 1 } else { // ⬆️ tableView.moveRow(at: oldIndex, to: row + newIndexOffset) newIndexOffset += 1 } } tableView.endUpdates() return true } } extension CustomPreferencesViewController: NSTableViewDelegate { func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { if let cell = tableView.makeView(withIdentifier: Constants.Id.CustomMenuCell, owner: nil) as? NSTableCellView { cell.textField?.stringValue = customMenuOptions[row].name return cell } return nil } } extension CustomPreferencesViewController: NSMenuDelegate { func openFileSelectPanel() { let openPanel = NSOpenPanel() openPanel.directoryURL = FileManager.default.urls(for: .applicationDirectory, in: .localDomainMask).first! openPanel.canChooseDirectories = false openPanel.canChooseFiles = true openPanel.allowsMultipleSelection = false openPanel.allowedFileTypes = ["app", "App", "APP"] openPanel.beginSheetModal(for: view.window!, completionHandler: { result in if result == NSApplication.ModalResponse.OK { if let appPath = openPanel.url?.path, let _ = Bundle(url: openPanel.url!)?.bundleIdentifier { let name = AppManager.getApplicationFileName(from: appPath) self.showCustomInputViewController(name) } else { // 对于没有 bundleId 的应用可能是快捷方式, 给予提示 } } }) } } ================================================ FILE: OpenInTerminal/PreferencesWindow/GeneralPreferencesViewController.swift ================================================ // // GeneralPreferencesViewController.swift // OpenInTerminal // // Created by Jianing Wang on 2019/4/21. // Copyright © 2019 Jianing Wang. All rights reserved. // import Cocoa import OpenInTerminalCore import ServiceManagement class GeneralPreferencesViewController: PreferencesViewController { // MARK: Properties @IBOutlet weak var launchButton: NSButton! @IBOutlet weak var quickToggleButton: NSButton! @IBOutlet weak var chooseToggleActionButton: NSPopUpButton! @IBOutlet weak var hideStatusItemButton: NSButton! @IBOutlet weak var hideContextMemuItemsButton: NSButton! @IBOutlet weak var defaultTerminalButton: NSPopUpButton! @IBOutlet weak var defaultEditorButton: NSPopUpButton! lazy var quickToggleTerminalMenuItem: NSMenuItem = { return NSMenuItem(title: QuickToggleType.openWithDefaultTerminal.name, action: #selector(quickToggleTerminalClicked), keyEquivalent: "") }() lazy var quickToggleEditorMenuItem: NSMenuItem = { return NSMenuItem(title: QuickToggleType.openWithDefaultEditor.name, action: #selector(quickToggleEditorClicked), keyEquivalent: "") }() lazy var quickToggleCopyPathMenuItem: NSMenuItem = { return NSMenuItem(title: QuickToggleType.copyPathToClipboard.name, action: #selector(quickToggleCopyPathClicked), keyEquivalent: "") }() var allInstalledApps: Set = Set() var installedTerminals: [App]? var installedEditors: [App]? // MARK: Lifecycle override func viewDidLoad() { super.viewDidLoad() initQuickToggleAction() } override func viewWillAppear() { super.viewWillAppear() allInstalledApps = FinderManager.shared.getAllInstalledApps() refreshButtonState() refreshDefaultTerminal() refreshDefaultEditor() } override func viewDidAppear() { super.viewDidAppear() } // MARK: Init UI func initQuickToggleAction() { chooseToggleActionButton.removeAllItems() [quickToggleTerminalMenuItem, quickToggleEditorMenuItem, quickToggleCopyPathMenuItem].forEach { $0.target = self chooseToggleActionButton.menu?.addItem($0) } } // MARK: Refresh UI func refreshButtonState() { let isLaunchAtLogin = DefaultsManager.shared.isLaunchAtLogin launchButton.state = isLaunchAtLogin ? .on : .off let isHideStatusItem = DefaultsManager.shared.isHideStatusItem hideStatusItemButton.state = isHideStatusItem ? .on : .off let isHideContextMenuItems = DefaultsManager.shared.isHideContextMenuItems hideContextMemuItemsButton.state = isHideContextMenuItems ? .on : .off let isQuickToggle = DefaultsManager.shared.isQuickToggle quickToggleButton.state = isQuickToggle ? .on : .off chooseToggleActionButton.isEnabled = isQuickToggle if let quickToggleType = DefaultsManager.shared.quickToggleType { switch quickToggleType { case .openWithDefaultTerminal: chooseToggleActionButton.select(quickToggleTerminalMenuItem) case .openWithDefaultEditor: chooseToggleActionButton.select(quickToggleEditorMenuItem) case .copyPathToClipboard: chooseToggleActionButton.select(quickToggleCopyPathMenuItem) } } } func refreshDefaultTerminal() { defaultTerminalButton.removeAllItems() var terminals = SupportedApps.terminals.map { $0.app } // filter terminals = terminals.filter { allInstalledApps.contains($0.name) } // sort terminals.sort { $0.name.localizedCaseInsensitiveCompare($1.name) == ComparisonResult.orderedAscending } terminals.forEach { defaultTerminalButton.addItem(withTitle: $0.name) } installedTerminals = terminals // Constants.allTerminals.forEach { terminal in // var isInstalled = allInstalledApps.contains(terminal.name) // if terminal == .terminal { // isInstalled = true // } // if isInstalled { // defaultTerminalButton.addItem(withTitle: terminal.rawValue) // } // } // if let defaultTerminal = DefaultsManager.shared.defaultTerminal { let index = defaultTerminalButton.indexOfItem(withTitle: defaultTerminal.name) defaultTerminalButton.selectItem(at: index) } } func refreshDefaultEditor() { defaultEditorButton.removeAllItems() var editors = SupportedApps.editors.map { $0.app } // filter editors = editors.filter { allInstalledApps.contains($0.name) } // // add custom terminals // let customEditors = DefaultsManager.shared.customApps?.filter { $0.type == .editor } // if let customEditors = customEditors { // editors += customEditors // } // sort editors.sort { $0.name.localizedCaseInsensitiveCompare($1.name) == ComparisonResult.orderedAscending } editors.forEach { defaultEditorButton.addItem(withTitle: $0.name) } installedEditors = editors // Constants.allEditors.forEach { editor in // var isInstalled = allInstalledApps.contains(editor.fullName) // if editor == .textEdit { // isInstalled = true // } // if isInstalled { // defaultEditorButton.addItem(withTitle: editor.rawValue) // } // } // if let defaultEditor = DefaultsManager.shared.defaultEditor { let index = defaultEditorButton.indexOfItem(withTitle: defaultEditor.name) defaultEditorButton.selectItem(at: index) } } // MARK: Button Actions @IBAction func launchButtonClicked(_ sender: NSButton) { let isLaunch = launchButton.state == .on DefaultsManager.shared.isLaunchAtLogin = isLaunch SMLoginItemSetEnabled(Constants.Id.LauncherApp as CFString, isLaunch) } @IBAction func hideStatusItemButtonTapped(_ sender: NSButton) { let isHide = hideStatusItemButton.state == .on DefaultsManager.shared.isHideStatusItem = isHide let appDelegate = NSApplication.shared.delegate as! AppDelegate appDelegate.setStatusItemVisible() } @IBAction func hideContextMenuItemsButtonTapped(_ sender: NSButton) { let isHide = hideContextMemuItemsButton.state == .on DefaultsManager.shared.isHideContextMenuItems = isHide } @IBAction func quickToggleButtonClicked(_ sender: NSButton) { let isQuickToggle = quickToggleButton.state == .on DefaultsManager.shared.isQuickToggle = isQuickToggle chooseToggleActionButton.isEnabled = isQuickToggle let appDelegate = NSApplication.shared.delegate as! AppDelegate appDelegate.setStatusToggle() logw("Quick Toggle set to \(sender.state.rawValue)") } @IBAction func defaultTerminalButtonClicked(_ sender: NSPopUpButton) { guard let installedTerminals = installedTerminals else { return } let itemTitles = sender.itemTitles let index = sender.indexOfSelectedItem let title = itemTitles[index] installedTerminals.forEach { if $0.name == title { DefaultsManager.shared.defaultTerminal = $0 } } } @IBAction func defaultEditorButtonClicked(_ sender: NSPopUpButton) { guard let installedEditors = installedEditors else { return } let itemTitles = sender.itemTitles let index = sender.indexOfSelectedItem let title = itemTitles[index] installedEditors.forEach { if $0.name == title { DefaultsManager.shared.defaultEditor = $0 } } // let itemTitles = sender.itemTitles // let index = sender.indexOfSelectedItem // let title = itemTitles[index] // // if title == Constants.none { // DefaultsManager.shared.removeDefaultEditor() // } // // if let editor = EditorType(rawValue: title) { // DefaultsManager.shared.defaultEditor = editor // } } @objc func quickToggleTerminalClicked(_ sender: NSMenuItem) { DefaultsManager.shared.quickToggleType = .openWithDefaultTerminal chooseToggleActionButton.select(quickToggleTerminalMenuItem) } @objc func quickToggleEditorClicked(_ sender: NSMenuItem) { DefaultsManager.shared.quickToggleType = .openWithDefaultEditor chooseToggleActionButton.select(quickToggleEditorMenuItem) } @objc func quickToggleCopyPathClicked(_ sender: NSMenuItem) { DefaultsManager.shared.quickToggleType = .copyPathToClipboard chooseToggleActionButton.select(quickToggleCopyPathMenuItem) } } ================================================ FILE: OpenInTerminal/PreferencesWindow/PreferencesViewController.swift ================================================ // // PreferenceViewController.swift // OpenInTerminal // // Created by Jianing Wang on 2019/4/20. // Copyright © 2019 Jianing Wang. All rights reserved. // import Cocoa class PreferencesViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() // Set the size for each views self.preferredContentSize = NSMakeSize(self.view.frame.size.width, self.view.frame.size.height) } override func viewWillAppear() { super.viewWillAppear() } override func viewDidAppear() { super.viewDidAppear() // Update window title with the active TabView title // self.parent?.view.window?.title = self.title! } } ================================================ FILE: OpenInTerminal/PreferencesWindow/PreferencesWindowController.swift ================================================ // // PreferencesWindowController.swift // OpenInTerminal // // Created by Jianing Wang on 2019/4/29. // Copyright © 2019 Jianing Wang. All rights reserved. // import Cocoa class PreferencesWindowController: NSWindowController { override func windowDidLoad() { super.windowDidLoad() } } ================================================ FILE: OpenInTerminal/PreferencesWindow/de.lproj/Preferences.strings ================================================ /* Class = "NSTextFieldCell"; title = "❤️ Special thanks to:"; ObjectID = "0Gy-jf-q6v"; */ "0Gy-jf-q6v.title" = "❤️ Besonderen Dank an:"; /* Class = "NSTextFieldCell"; title = "⚠️ Note that this will reset all user preferences"; ObjectID = "2Rg-te-FPU"; */ "2Rg-te-FPU.title" = "⚠️ Beachten Sie, dass dadurch alle Benutzereinstellungen zurückgesetzt werden."; /* Class = "NSButtonCell"; title = "Apply to Finder Toolbar Menu"; ObjectID = "2we-f7-s2N"; */ "2we-f7-s2N.title" = "Auf das Finder-Symbolleistenmenü anwenden"; /* Class = "NSTextFieldCell"; title = "If enabled, click the Menu Bar icon to toggle the action you choose. Right click to open the menu."; ObjectID = "592-4p-Ybh"; */ "592-4p-Ybh.title" = "Falls aktiviert, klicken Sie auf das Symbol der Menüleiste, um die gewünschte Aktion zu aktivieren. Klicken Sie mit der rechten Maustaste, um das Menü zu öffnen."; /* Class = "NSWindow"; title = "Preferences"; ObjectID = "5f3-UK-Rft"; */ "5f3-UK-Rft.title" = "Einstellungen"; /* Class = "NSButtonCell"; title = "Hide Status Bar Icon"; ObjectID = "BUH-CU-WBW"; */ "BUH-CU-WBW.title" = "Statusleistensymbol ausblenden"; /* Class = "NSTextFieldCell"; title = "Open a new window or a new tab."; ObjectID = "BrI-hE-Mff"; */ "BrI-hE-Mff.title" = "Öffnen Sie ein neues Fenster oder einen neuen Tab."; /* Class = "NSTextFieldCell"; title = "Icon Type:"; ObjectID = "CP0-Xv-uYl"; */ "CP0-Xv-uYl.title" = "Symboltyp:"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "Cp7-6g-ngj"; */ "Cp7-6g-ngj.title" = "Abbrechen"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "Dyx-zg-hYe"; */ "Dyx-zg-hYe.title" = "Keine"; /* Class = "NSTextFieldCell"; title = "Quit"; ObjectID = "FBK-9S-cZf"; */ "FBK-9S-cZf.title" = "Beenden"; /* Class = "NSTextFieldCell"; title = "Shortcuts"; ObjectID = "FpP-Q9-flS"; */ "FpP-Q9-flS.title" = "Kurzbefehle"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "G69-k2-hgn"; */ "G69-k2-hgn.title" = "Keine"; /* Class = "NSViewController"; title = "General"; ObjectID = "Gn1-zC-bzB"; */ "Gn1-zC-bzB.title" = "Allgemein"; /* Class = "NSViewController"; title = "Advanced"; ObjectID = "H3q-JS-Bu4"; */ "H3q-JS-Bu4.title" = "Erweitert"; /* Class = "NSButtonCell"; title = "WeChat"; ObjectID = "HUx-Wz-JJm"; */ "HUx-Wz-JJm.title" = "WeChat"; /* Class = "NSTextFieldCell"; title = "👨‍💻 GitHub:"; ObjectID = "How-dP-tcX"; */ "How-dP-tcX.title" = "👨‍💻 GitHub:"; /* Class = "NSButtonCell"; title = "@Camji55"; ObjectID = "IJL-uk-uO5"; */ "IJL-uk-uO5.title" = "@Camji55"; /* Class = "NSButtonCell"; title = "contact@jianing.wang"; ObjectID = "IPL-yO-Vkp"; */ "IPL-yO-Vkp.title" = "contact@jianing.wang"; /* Class = "NSTextFieldCell"; title = "0.1.0"; ObjectID = "Jnf-AX-bIr"; */ "Jnf-AX-bIr.title" = "0.1.0"; /* Class = "NSTextFieldCell"; title = "💸 Donate:"; ObjectID = "Kua-ZD-31F"; */ "Kua-ZD-31F.title" = "💸 Spenden:"; /* Class = "NSButtonCell"; title = "Terminal"; ObjectID = "M3w-T0-vi7"; */ "M3w-T0-vi7.title" = "Terminal"; /* Class = "NSTextFieldCell"; title = "Open with default Terminal:"; ObjectID = "Mqt-Fp-Ssl"; */ "Mqt-Fp-Ssl.title" = "Mit Standard-Terminal öffnen:"; /* Class = "NSTextFieldCell"; title = "🐦 Twitter:"; ObjectID = "NZE-zU-6ss"; */ "NZE-zU-6ss.title" = "🐦 Twitter:"; /* Class = "NSButtonCell"; title = "Apply to Finder Context Menu"; ObjectID = "RhP-R5-Wwt"; */ "RhP-R5-Wwt.title" = "Auf das Finder-Kontextmenü anwenden"; /* Class = "NSButtonCell"; title = "Alipay"; ObjectID = "Sw7-of-ecf"; */ "Sw7-of-ecf.title" = "Alipay"; /* Class = "NSTextFieldCell"; title = "Application Type:"; ObjectID = "UCM-Ds-LYN"; */ "UCM-Ds-LYN.title" = "Programmtyp:"; /* Class = "NSTextFieldCell"; title = "You need to reopen the app to display Preferences."; ObjectID = "Upf-HU-iaN"; */ "Upf-HU-iaN.title" = "Sie müssen das Programm erneut öffnen, um die Einstellungen anzuzeigen."; /* Class = "NSTextFieldCell"; title = "✉️ Contact:"; ObjectID = "Vu4-Wz-Agk"; */ "Vu4-Wz-Agk.title" = "✉️ Kontakt:"; /* Class = "NSTextFieldCell"; title = "Copy path in Clipboard:"; ObjectID = "Xd9-iA-emU"; */ "Xd9-iA-emU.title" = "Pfad in die Zwischenablage kopieren:"; /* Class = "NSTextFieldCell"; title = "Default Text Editor:"; ObjectID = "Xfc-rf-FkX"; */ "Xfc-rf-FkX.title" = "Standard Text-Editor:"; /* Class = "NSButtonCell"; title = "Launch OpenInTerminal at Login"; ObjectID = "ZbK-xW-anT"; */ "ZbK-xW-anT.title" = "OpenInTerminal bei der Anmeldung starten"; /* Class = "NSTextFieldCell"; title = "Default Terminal:"; ObjectID = "aRo-sy-WpK"; */ "aRo-sy-WpK.title" = "Standard-Terminal:"; /* Class = "NSTextFieldCell"; title = "Not Installed Applications"; ObjectID = "bCi-r8-MrK"; */ "bCi-r8-MrK.title" = "Nicht installierte Programme"; /* Class = "NSTextFieldCell"; title = "Installed Supported Applications"; ObjectID = "bT7-LU-sov"; */ "bT7-LU-sov.title" = "Installierte unterstützte Programme"; /* Class = "NSTextFieldCell"; title = "Open with default Editor:"; ObjectID = "bvy-v3-hhf"; */ "bvy-v3-hhf.title" = "Mit Standard-Editor öffnen:"; /* Class = "NSButtonCell"; title = "PayPal"; ObjectID = "dC4-C7-fEL"; */ "dC4-C7-fEL.title" = "PayPal"; /* Class = "NSButtonCell"; title = "github.com/Ji4n1ng/OpenInTerminal"; ObjectID = "f2V-P5-pQI"; */ "f2V-P5-pQI.title" = "github.com/Ji4n1ng/OpenInTerminal"; /* Class = "NSButtonCell"; title = "Editor"; ObjectID = "fb4-Xq-he0"; */ "fb4-Xq-he0.title" = "Editor"; /* Class = "NSButtonCell"; title = "Quick Toggle"; ObjectID = "gy9-lb-m8d"; */ "gy9-lb-m8d.title" = "Schnellwechsler"; /* Class = "NSTextFieldCell"; title = "Application Name:"; ObjectID = "h5X-oY-gqy"; */ "h5X-oY-gqy.title" = "Programmname:"; /* Class = "NSTextFieldCell"; title = "Reset"; ObjectID = "jcs-Ou-OZ2"; */ "jcs-Ou-OZ2.title" = "Zurücksetzen"; /* Class = "NSButtonCell"; title = "Reset preferences"; ObjectID = "jyI-H7-qN3"; */ "jyI-H7-qN3.title" = "Einstellungen zurücksetzen"; /* Class = "NSViewController"; title = "About"; ObjectID = "k6X-N1-mVu"; */ "k6X-N1-mVu.title" = "Über"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "kAa-36-ubl"; */ "kAa-36-ubl.title" = "Textzelle"; /* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "keg-OV-uLJ"; */ "keg-OV-uLJ.title" = "Table View Zelle"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal"; ObjectID = "mOB-su-ZM1"; */ "mOB-su-ZM1.title" = "OpenInTerminal"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "mTs-8c-pgj"; */ "mTs-8c-pgj.title" = "Fenster"; /* Class = "NSTextFieldCell"; title = "Custom Menu Options"; ObjectID = "nWc-SM-Kes"; */ "nWc-SM-Kes.title" = "Benutzerdefinierte Menüoptionen"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "nYS-rF-JCL"; */ "nYS-rF-JCL.title" = "Tab"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal will automatically launch at login."; ObjectID = "ngT-lX-vFA"; */ "ngT-lX-vFA.title" = "OpenInTerminal wird bei der Anmeldung automatisch gestartet."; /* Class = "NSButtonCell"; title = "Quit OpenInTerminal"; ObjectID = "ofD-rA-gib"; */ "ofD-rA-gib.title" = "OpenInTerminal beenden"; /* Class = "NSViewController"; title = "Custom"; ObjectID = "s5W-qL-1Xs"; */ "s5W-qL-1Xs.title" = "Benutzerdefiniert"; /* Class = "NSButtonCell"; title = "Hide Context Menu Items"; ObjectID = "sG4-nK-ghj"; */ "sG4-nK-ghj.title" = "Kontextmenüeinträge ausblenden"; /* Class = "NSButtonCell"; title = "@Ji4n1ng"; ObjectID = "tR5-me-DTK"; */ "tR5-me-DTK.title" = "@Ji4n1ng"; /* Class = "NSButtonCell"; title = "original"; ObjectID = "uok-iD-wXY"; */ "uok-iD-wXY.title" = "original"; /* Class = "NSButtonCell"; title = "Confirm"; ObjectID = "wpb-Gv-KAp"; */ "wpb-Gv-KAp.title" = "Bestätigen"; /* Class = "NSButtonCell"; title = "no"; ObjectID = "x6U-9Q-ujh"; */ "x6U-9Q-ujh.title" = "nein"; /* Class = "NSTextFieldCell"; title = "iTerm"; ObjectID = "yIW-2a-15A"; */ "yIW-2a-15A.title" = "iTerm"; /* Class = "NSButtonCell"; title = "simple"; ObjectID = "yrq-LZ-XDr"; */ "yrq-LZ-XDr.title" = "einfach"; ================================================ FILE: OpenInTerminal/PreferencesWindow/en.lproj/Preferences.strings ================================================ /* Class = "NSTextFieldCell"; title = "❤️ Special thanks to:"; ObjectID = "0Gy-jf-q6v"; */ "0Gy-jf-q6v.title" = "❤️ Special thanks to:"; /* Class = "NSTextFieldCell"; title = "⚠️ Note that this will reset all user preferences"; ObjectID = "2Rg-te-FPU"; */ "2Rg-te-FPU.title" = "⚠️ Note that this will reset all user preferences"; /* Class = "NSButtonCell"; title = "Apply to Finder Toolbar Menu"; ObjectID = "2we-f7-s2N"; */ "2we-f7-s2N.title" = "Apply to Finder Toolbar Menu"; /* Class = "NSTextFieldCell"; title = "If enabled, click the Menu Bar icon to toggle the action you choose. Right click to open the menu."; ObjectID = "592-4p-Ybh"; */ "592-4p-Ybh.title" = "If enabled, click the Menu Bar icon to toggle the action you choose. Right click to open the menu."; /* Class = "NSWindow"; title = "Preferences"; ObjectID = "5f3-UK-Rft"; */ "5f3-UK-Rft.title" = "Preferences"; /* Class = "NSButtonCell"; title = "Hide Status Bar Icon"; ObjectID = "BUH-CU-WBW"; */ "BUH-CU-WBW.title" = "Hide Status Bar Icon"; /* Class = "NSTextFieldCell"; title = "Open a new window or a new tab."; ObjectID = "BrI-hE-Mff"; */ "BrI-hE-Mff.title" = "Open a new window or a new tab."; /* Class = "NSTextFieldCell"; title = "Icon Type:"; ObjectID = "CP0-Xv-uYl"; */ "CP0-Xv-uYl.title" = "Icon Type:"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "Cp7-6g-ngj"; */ "Cp7-6g-ngj.title" = "Cancel"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "Dyx-zg-hYe"; */ "Dyx-zg-hYe.title" = "None"; /* Class = "NSTextFieldCell"; title = "Quit"; ObjectID = "FBK-9S-cZf"; */ "FBK-9S-cZf.title" = "Quit"; /* Class = "NSTextFieldCell"; title = "Shortcuts"; ObjectID = "FpP-Q9-flS"; */ "FpP-Q9-flS.title" = "Shortcuts"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "G69-k2-hgn"; */ "G69-k2-hgn.title" = "None"; /* Class = "NSViewController"; title = "General"; ObjectID = "Gn1-zC-bzB"; */ "Gn1-zC-bzB.title" = "General"; /* Class = "NSViewController"; title = "Advanced"; ObjectID = "H3q-JS-Bu4"; */ "H3q-JS-Bu4.title" = "Advanced"; /* Class = "NSButtonCell"; title = "WeChat"; ObjectID = "HUx-Wz-JJm"; */ "HUx-Wz-JJm.title" = "WeChat"; /* Class = "NSTextFieldCell"; title = "👨‍💻 GitHub:"; ObjectID = "How-dP-tcX"; */ "How-dP-tcX.title" = "👨‍💻 GitHub:"; /* Class = "NSButtonCell"; title = "@Camji55"; ObjectID = "IJL-uk-uO5"; */ "IJL-uk-uO5.title" = "@Camji55"; /* Class = "NSButtonCell"; title = "contact@jianing.wang"; ObjectID = "IPL-yO-Vkp"; */ "IPL-yO-Vkp.title" = "contact@jianing.wang"; /* Class = "NSTextFieldCell"; title = "0.1.0"; ObjectID = "Jnf-AX-bIr"; */ "Jnf-AX-bIr.title" = "0.1.0"; /* Class = "NSTextFieldCell"; title = "💸 Donate:"; ObjectID = "Kua-ZD-31F"; */ "Kua-ZD-31F.title" = "💸 Donate:"; /* Class = "NSButtonCell"; title = "Terminal"; ObjectID = "M3w-T0-vi7"; */ "M3w-T0-vi7.title" = "Terminal"; /* Class = "NSTextFieldCell"; title = "Open with default Terminal:"; ObjectID = "Mqt-Fp-Ssl"; */ "Mqt-Fp-Ssl.title" = "Open with default Terminal:"; /* Class = "NSTextFieldCell"; title = "🐦 Twitter:"; ObjectID = "NZE-zU-6ss"; */ "NZE-zU-6ss.title" = "🐦 Twitter:"; /* Class = "NSButtonCell"; title = "Apply to Finder Context Menu"; ObjectID = "RhP-R5-Wwt"; */ "RhP-R5-Wwt.title" = "Apply to Finder Context Menu"; /* Class = "NSButtonCell"; title = "Alipay"; ObjectID = "Sw7-of-ecf"; */ "Sw7-of-ecf.title" = "Alipay"; /* Class = "NSTextFieldCell"; title = "Application Type:"; ObjectID = "UCM-Ds-LYN"; */ "UCM-Ds-LYN.title" = "Application Type:"; /* Class = "NSTextFieldCell"; title = "You need to reopen the app to display Preferences."; ObjectID = "Upf-HU-iaN"; */ "Upf-HU-iaN.title" = "You need to reopen the app to display Preferences."; /* Class = "NSTextFieldCell"; title = "✉️ Contact:"; ObjectID = "Vu4-Wz-Agk"; */ "Vu4-Wz-Agk.title" = "✉️ Contact:"; /* Class = "NSTextFieldCell"; title = "Copy path in Clipboard:"; ObjectID = "Xd9-iA-emU"; */ "Xd9-iA-emU.title" = "Copy path in Clipboard:"; /* Class = "NSTextFieldCell"; title = "Default Text Editor:"; ObjectID = "Xfc-rf-FkX"; */ "Xfc-rf-FkX.title" = "Default Text Editor:"; /* Class = "NSButtonCell"; title = "Launch OpenInTerminal at Login"; ObjectID = "ZbK-xW-anT"; */ "ZbK-xW-anT.title" = "Launch OpenInTerminal at Login"; /* Class = "NSTextFieldCell"; title = "Default Terminal:"; ObjectID = "aRo-sy-WpK"; */ "aRo-sy-WpK.title" = "Default Terminal:"; /* Class = "NSTextFieldCell"; title = "Not Installed Applications"; ObjectID = "bCi-r8-MrK"; */ "bCi-r8-MrK.title" = "Not Installed Applications"; /* Class = "NSTextFieldCell"; title = "Installed Supported Applications"; ObjectID = "bT7-LU-sov"; */ "bT7-LU-sov.title" = "Installed Supported Applications"; /* Class = "NSTextFieldCell"; title = "Open with default Editor:"; ObjectID = "bvy-v3-hhf"; */ "bvy-v3-hhf.title" = "Open with default Editor:"; /* Class = "NSButtonCell"; title = "GitHub Sponsors"; ObjectID = "dC4-C7-fEL"; */ "dC4-C7-fEL.title" = "GitHub Sponsors"; /* Class = "NSButtonCell"; title = "github.com/Ji4n1ng/OpenInTerminal"; ObjectID = "f2V-P5-pQI"; */ "f2V-P5-pQI.title" = "github.com/Ji4n1ng/OpenInTerminal"; /* Class = "NSButtonCell"; title = "Editor"; ObjectID = "fb4-Xq-he0"; */ "fb4-Xq-he0.title" = "Editor"; /* Class = "NSButtonCell"; title = "Quick Toggle"; ObjectID = "gy9-lb-m8d"; */ "gy9-lb-m8d.title" = "Quick Toggle"; /* Class = "NSTextFieldCell"; title = "Application Name:"; ObjectID = "h5X-oY-gqy"; */ "h5X-oY-gqy.title" = "Application Name:"; /* Class = "NSTextFieldCell"; title = "Reset"; ObjectID = "jcs-Ou-OZ2"; */ "jcs-Ou-OZ2.title" = "Reset"; /* Class = "NSButtonCell"; title = "Reset preferences"; ObjectID = "jyI-H7-qN3"; */ "jyI-H7-qN3.title" = "Reset preferences"; /* Class = "NSButtonCell"; title = "PayPal"; ObjectID = "k3X-F7-Gpb"; */ "k3X-F7-Gpb.title" = "PayPal"; /* Class = "NSViewController"; title = "About"; ObjectID = "k6X-N1-mVu"; */ "k6X-N1-mVu.title" = "About"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "kAa-36-ubl"; */ "kAa-36-ubl.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "keg-OV-uLJ"; */ "keg-OV-uLJ.title" = "Table View Cell"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal"; ObjectID = "mOB-su-ZM1"; */ "mOB-su-ZM1.title" = "OpenInTerminal"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "mTs-8c-pgj"; */ "mTs-8c-pgj.title" = "Window"; /* Class = "NSTextFieldCell"; title = "Custom Menu Options"; ObjectID = "nWc-SM-Kes"; */ "nWc-SM-Kes.title" = "Custom Menu Options"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "nYS-rF-JCL"; */ "nYS-rF-JCL.title" = "Tab"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal will automatically launch at login."; ObjectID = "ngT-lX-vFA"; */ "ngT-lX-vFA.title" = "OpenInTerminal will automatically launch at login."; /* Class = "NSButtonCell"; title = "Quit OpenInTerminal"; ObjectID = "ofD-rA-gib"; */ "ofD-rA-gib.title" = "Quit OpenInTerminal"; /* Class = "NSViewController"; title = "Custom"; ObjectID = "s5W-qL-1Xs"; */ "s5W-qL-1Xs.title" = "Custom"; /* Class = "NSButtonCell"; title = "Hide Context Menu Items"; ObjectID = "sG4-nK-ghj"; */ "sG4-nK-ghj.title" = "Hide Context Menu Items"; /* Class = "NSButtonCell"; title = "@Ji4n1ng"; ObjectID = "tR5-me-DTK"; */ "tR5-me-DTK.title" = "@Ji4n1ng"; /* Class = "NSButtonCell"; title = "original"; ObjectID = "uok-iD-wXY"; */ "uok-iD-wXY.title" = "original"; /* Class = "NSButtonCell"; title = "Confirm"; ObjectID = "wpb-Gv-KAp"; */ "wpb-Gv-KAp.title" = "Confirm"; /* Class = "NSButtonCell"; title = "no"; ObjectID = "x6U-9Q-ujh"; */ "x6U-9Q-ujh.title" = "no"; /* Class = "NSTextFieldCell"; title = "iTerm"; ObjectID = "yIW-2a-15A"; */ "yIW-2a-15A.title" = "iTerm"; /* Class = "NSButtonCell"; title = "simple"; ObjectID = "yrq-LZ-XDr"; */ "yrq-LZ-XDr.title" = "simple"; ================================================ FILE: OpenInTerminal/PreferencesWindow/es.lproj/Preferences.strings ================================================ /* Class = "NSTextFieldCell"; title = "❤️ Special thanks to:"; ObjectID = "0Gy-jf-q6v"; */ "0Gy-jf-q6v.title" = "❤️ Agradecimiento especial a:"; /* Class = "NSTextFieldCell"; title = "⚠️ Note that this will reset all user preferences"; ObjectID = "2Rg-te-FPU"; */ "2Rg-te-FPU.title" = "⚠️ Tenga en cuenta que se restablecerán todas las preferencias del usuario"; /* Class = "NSButtonCell"; title = "Apply to Finder Toolbar Menu"; ObjectID = "2we-f7-s2N"; */ "2we-f7-s2N.title" = "Aplicar al menú de la barra de herramientas del Finder"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "4ss-CQ-brT"; */ "4ss-CQ-brT.title" = "Tab"; /* Class = "NSTextFieldCell"; title = "If enabled, click the Menu Bar icon to toggle the action you choose. Right click to open the menu."; ObjectID = "592-4p-Ybh"; */ "592-4p-Ybh.title" = "Si está habilitado, haga clic en el icono de la barra de menú para alternar la acción que elija. Haga clic derecho para abrir el menú."; /* Class = "NSWindow"; title = "Preferences"; ObjectID = "5f3-UK-Rft"; */ "5f3-UK-Rft.title" = "Preferencias"; /* Class = "NSButtonCell"; title = "Hide Status Bar Icon"; ObjectID = "BUH-CU-WBW"; */ "BUH-CU-WBW.title" = "Ocultar icono de barra de estado"; /* Class = "NSTextFieldCell"; title = "Open a new window or a new tab."; ObjectID = "BrI-hE-Mff"; */ "BrI-hE-Mff.title" = "Abra una nueva ventana o una nueva pestaña."; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "Dyx-zg-hYe"; */ "Dyx-zg-hYe.title" = "Ninguno"; /* Class = "NSTextFieldCell"; title = "Shortcuts"; ObjectID = "FpP-Q9-flS"; */ "FpP-Q9-flS.title" = "Atajos"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "G69-k2-hgn"; */ "G69-k2-hgn.title" = "Niguno"; /* Class = "NSViewController"; title = "General"; ObjectID = "Gn1-zC-bzB"; */ "Gn1-zC-bzB.title" = "General"; /* Class = "NSViewController"; title = "Advanced"; ObjectID = "H3q-JS-Bu4"; */ "H3q-JS-Bu4.title" = "Avanzado"; /* Class = "NSButtonCell"; title = "WeChat"; ObjectID = "HUx-Wz-JJm"; */ "HUx-Wz-JJm.title" = "WeChat"; /* Class = "NSTextFieldCell"; title = "👨‍💻 GitHub:"; ObjectID = "How-dP-tcX"; */ "How-dP-tcX.title" = "👨‍💻 GitHub:"; /* Class = "NSButtonCell"; title = "@Camji55"; ObjectID = "IJL-uk-uO5"; */ "IJL-uk-uO5.title" = "@Camji55"; /* Class = "NSButtonCell"; title = "contact@jianing.wang"; ObjectID = "IPL-yO-Vkp"; */ "IPL-yO-Vkp.title" = "contact@jianing.wang"; /* Class = "NSTextFieldCell"; title = "0.1.0"; ObjectID = "Jnf-AX-bIr"; */ "Jnf-AX-bIr.title" = "0.1.0"; /* Class = "NSTextFieldCell"; title = "💸 Donate:"; ObjectID = "Kua-ZD-31F"; */ "Kua-ZD-31F.title" = "💸 Donar:"; /* Class = "NSTextFieldCell"; title = "Open with default Terminal:"; ObjectID = "Mqt-Fp-Ssl"; */ "Mqt-Fp-Ssl.title" = "Abierto con terminal predeterminado:"; /* Class = "NSTextFieldCell"; title = "🐦 Twitter:"; ObjectID = "NZE-zU-6ss"; */ "NZE-zU-6ss.title" = "🐦 Twitter:"; /* Class = "NSButtonCell"; title = "Apply to Finder Context Menu"; ObjectID = "RhP-R5-Wwt"; */ "RhP-R5-Wwt.title" = "Aplicar al menú contextual del Finder"; /* Class = "NSButtonCell"; title = "Alipay"; ObjectID = "Sw7-of-ecf"; */ "Sw7-of-ecf.title" = "Alipay"; /* Class = "NSTextFieldCell"; title = "You need to reopen the app to display Preferences."; ObjectID = "Upf-HU-iaN"; */ "Upf-HU-iaN.title" = "Debes volver a abrir la aplicación para mostrar las preferencias."; /* Class = "NSTextFieldCell"; title = "✉️ Contact:"; ObjectID = "Vu4-Wz-Agk"; */ "Vu4-Wz-Agk.title" = "✉️ Contactar:"; /* Class = "NSTextFieldCell"; title = "Copy path in Clipboard:"; ObjectID = "Xd9-iA-emU"; */ "Xd9-iA-emU.title" = "Copiar ruta en el Portapapeles:"; /* Class = "NSTextFieldCell"; title = "Default Text Editor:"; ObjectID = "Xfc-rf-FkX"; */ "Xfc-rf-FkX.title" = "Editor de texto predeterminado:"; /* Class = "NSButtonCell"; title = "Launch OpenInTerminal at Login"; ObjectID = "ZbK-xW-anT"; */ "ZbK-xW-anT.title" = "Abrir OpenInTerminal al iniciar sesión"; /* Class = "NSTextFieldCell"; title = "Default Terminal:"; ObjectID = "aRo-sy-WpK"; */ "aRo-sy-WpK.title" = "Terminal predeterminado:"; /* Class = "NSTextFieldCell"; title = "Not Installed Applications"; ObjectID = "bCi-r8-MrK"; */ "bCi-r8-MrK.title" = "Aplicaciones no instaladas"; /* Class = "NSTextFieldCell"; title = "Installed Supported Applications"; ObjectID = "bT7-LU-sov"; */ "bT7-LU-sov.title" = "Aplicaciones compatibles instaladas"; /* Class = "NSTextFieldCell"; title = "Open with default Editor:"; ObjectID = "bvy-v3-hhf"; */ "bvy-v3-hhf.title" = "Abrir con editor predeterminado:"; /* Class = "NSButtonCell"; title = "PayPal"; ObjectID = "dC4-C7-fEL"; */ "dC4-C7-fEL.title" = "PayPal"; /* Class = "NSButtonCell"; title = "github.com/Ji4n1ng/OpenInTerminal"; ObjectID = "f2V-P5-pQI"; */ "f2V-P5-pQI.title" = "github.com/Ji4n1ng/OpenInTerminal"; /* Class = "NSTextFieldCell"; title = "Terminal"; ObjectID = "fA9-Hd-yjp"; */ "fA9-Hd-yjp.title" = "Terminal"; /* Class = "NSButtonCell"; title = "Quick Toggle"; ObjectID = "gy9-lb-m8d"; */ "gy9-lb-m8d.title" = "Accion rápida"; /* Class = "NSTextFieldCell"; title = "Reset"; ObjectID = "jcs-Ou-OZ2"; */ "jcs-Ou-OZ2.title" = "Reiniciar"; /* Class = "NSButtonCell"; title = "Reset preferences"; ObjectID = "jyI-H7-qN3"; */ "jyI-H7-qN3.title" = "Reiniciar preferencias"; /* Class = "NSViewController"; title = "About"; ObjectID = "k6X-N1-mVu"; */ "k6X-N1-mVu.title" = "Acerca de"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "kAa-36-ubl"; */ "kAa-36-ubl.title" = "Celda de texto"; /* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "keg-OV-uLJ"; */ "keg-OV-uLJ.title" = "Celda de vista de tabla"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal"; ObjectID = "mOB-su-ZM1"; */ "mOB-su-ZM1.title" = "OpenInTerminal"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "mTs-8c-pgj"; */ "mTs-8c-pgj.title" = "Ventana"; /* Class = "NSTextFieldCell"; title = "Custom Menu Options"; ObjectID = "nWc-SM-Kes"; */ "nWc-SM-Kes.title" = "Opciones de menú personalizado"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "nYS-rF-JCL"; */ "nYS-rF-JCL.title" = "Tab"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal will automatically launch at login."; ObjectID = "ngT-lX-vFA"; */ "ngT-lX-vFA.title" = "OpenInTerminal se iniciará automáticamente al iniciar sesión."; /* Class = "NSViewController"; title = "Custom"; ObjectID = "s5W-qL-1Xs"; */ "s5W-qL-1Xs.title" = "Personalizado"; /* Class = "NSButtonCell"; title = "Hide Context Menu Items"; ObjectID = "sG4-nK-ghj"; */ "sG4-nK-ghj.title" = "Ocultar elementos del menú contextual"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "sik-wU-ZF2"; */ "sik-wU-ZF2.title" = "Ventana"; /* Class = "NSButtonCell"; title = "@Ji4n1ng"; ObjectID = "tR5-me-DTK"; */ "tR5-me-DTK.title" = "@Ji4n1ng"; /* Class = "NSTextFieldCell"; title = "iTerm"; ObjectID = "yIW-2a-15A"; */ "yIW-2a-15A.title" = "iTerm"; /* Class = "NSTextFieldCell"; title = "Icon Type:"; ObjectID = "CP0-Xv-uYl"; */ "CP0-Xv-uYl.title" = "Tipo de icono:"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "Cp7-6g-ngj"; */ "Cp7-6g-ngj.title" = "Cancelar"; /* Class = "NSButtonCell"; title = "Terminal"; ObjectID = "M3w-T0-vi7"; */ "M3w-T0-vi7.title" = "Terminal"; /* Class = "NSTextFieldCell"; title = "Application Type:"; ObjectID = "UCM-Ds-LYN"; */ "UCM-Ds-LYN.title" = "tipo de aplicacion:"; /* Class = "NSButtonCell"; title = "Editor"; ObjectID = "fb4-Xq-he0"; */ "fb4-Xq-he0.title" = "Editor"; /* Class = "NSTextFieldCell"; title = "Application Name:"; ObjectID = "h5X-oY-gqy"; */ "h5X-oY-gqy.title" = "Nombre de la aplicación:"; /* Class = "NSButtonCell"; title = "original"; ObjectID = "uok-iD-wXY"; */ "uok-iD-wXY.title" = "original"; /* Class = "NSButtonCell"; title = "Confirm"; ObjectID = "wpb-Gv-KAp"; */ "wpb-Gv-KAp.title" = "Confirmar"; /* Class = "NSButtonCell"; title = "no"; ObjectID = "x6U-9Q-ujh"; */ "x6U-9Q-ujh.title" = "no"; /* Class = "NSButtonCell"; title = "simple"; ObjectID = "yrq-LZ-XDr"; */ "yrq-LZ-XDr.title" = "simple"; ================================================ FILE: OpenInTerminal/PreferencesWindow/fr.lproj/Preferences.strings ================================================ /* Class = "NSTextFieldCell"; title = "❤️ Special thanks to:"; ObjectID = "0Gy-jf-q6v"; */ "0Gy-jf-q6v.title" = "❤️ Spécial remerciement à:"; /* Class = "NSTextFieldCell"; title = "⚠️ Note that this will reset all user preferences"; ObjectID = "2Rg-te-FPU"; */ "2Rg-te-FPU.title" = "⚠️ Notez que cela réinitialisera toutes les préférences de l'utilisateur"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "4ss-CQ-brT"; */ "4ss-CQ-brT.title" = "Onglet"; /* Class = "NSTextFieldCell"; title = "If enabled, click the Menu Bar icon to toggle the action you choose. Right click to open the menu."; ObjectID = "592-4p-Ybh"; */ "592-4p-Ybh.title" = "Si cela est activé, un clique sur l’icône dans la barre des menus exécutera l’action choisie. Un clique droit ouvrira le menu."; /* Class = "NSWindow"; title = "Preferences"; ObjectID = "5f3-UK-Rft"; */ "5f3-UK-Rft.title" = "Préférences"; /* Class = "NSButtonCell"; title = "Hide Status Bar Icon"; ObjectID = "BUH-CU-WBW"; */ "BUH-CU-WBW.title" = "Masquer l'icône de la barre d'état"; /* Class = "NSTextFieldCell"; title = "Open a new window or a new tab when opening a path in terminal."; ObjectID = "BrI-hE-Mff"; */ "BrI-hE-Mff.title" = "Ouvre une nouvelle fenêtre ou un nouvel onglet à l’ouverture du chemin d’accès dans le terminal."; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "Dyx-zg-hYe"; */ "Dyx-zg-hYe.title" = "Aucun"; /* Class = "NSTextFieldCell"; title = "Shortcuts"; ObjectID = "FpP-Q9-flS"; */ "FpP-Q9-flS.title" = "Raccourcis"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "G69-k2-hgn"; */ "G69-k2-hgn.title" = "Aucun"; /* Class = "NSViewController"; title = "General"; ObjectID = "Gn1-zC-bzB"; */ "Gn1-zC-bzB.title" = "Général"; /* Class = "NSViewController"; title = "Advanced"; ObjectID = "H3q-JS-Bu4"; */ "H3q-JS-Bu4.title" = "Avancé"; /* Class = "NSButtonCell"; title = "WeChat"; ObjectID = "HUx-Wz-JJm"; */ "HUx-Wz-JJm.title" = "WeChat"; /* Class = "NSTextFieldCell"; title = "👨‍💻 GitHub:"; ObjectID = "How-dP-tcX"; */ "How-dP-tcX.title" = "👨‍💻 GitHub:"; /* Class = "NSButtonCell"; title = "@Camji55"; ObjectID = "IJL-uk-uO5"; */ "IJL-uk-uO5.title" = "@Camji55"; /* Class = "NSButtonCell"; title = "contact@jianing.wang"; ObjectID = "IPL-yO-Vkp"; */ "IPL-yO-Vkp.title" = "contact@jianing.wang"; /* Class = "NSTextFieldCell"; title = "0.1.0"; ObjectID = "Jnf-AX-bIr"; */ "Jnf-AX-bIr.title" = "0.1.0"; /* Class = "NSTextFieldCell"; title = "💸 Donate:"; ObjectID = "Kua-ZD-31F"; */ "Kua-ZD-31F.title" = "💸 Faire un don:"; /* Class = "NSTextFieldCell"; title = "Open with default Terminal:"; ObjectID = "Mqt-Fp-Ssl"; */ "Mqt-Fp-Ssl.title" = "Ouvrir avec le terminal par défaut:"; /* Class = "NSTextFieldCell"; title = "🐦 Twitter:"; ObjectID = "NZE-zU-6ss"; */ "NZE-zU-6ss.title" = "🐦 Twitter:"; /* Class = "NSButtonCell"; title = "Alipay"; ObjectID = "Sw7-of-ecf"; */ "Sw7-of-ecf.title" = "Alipay"; /* Class = "NSTextFieldCell"; title = "You need to reopen the app to display Preferences."; ObjectID = "Upf-HU-iaN"; */ "Upf-HU-iaN.title" = "Vous devez rouvrir l'application pour afficher les préférences."; /* Class = "NSTextFieldCell"; title = "✉️ Contact:"; ObjectID = "Vu4-Wz-Agk"; */ "Vu4-Wz-Agk.title" = "✉️ Contact:"; /* Class = "NSTextFieldCell"; title = "Copy path in Clipboard:"; ObjectID = "Xd9-iA-emU"; */ "Xd9-iA-emU.title" = "Copier le chemin d’accès:"; /* Class = "NSTextFieldCell"; title = "Default Text Editor:"; ObjectID = "Xfc-rf-FkX"; */ "Xfc-rf-FkX.title" = "Éditeur par défaut:"; /* Class = "NSButtonCell"; title = "Launch OpenInTerminal at Login"; ObjectID = "ZbK-xW-anT"; */ "ZbK-xW-anT.title" = "Lancer OpenInTerminal à l’ouverture de la session"; /* Class = "NSTextFieldCell"; title = "Default Terminal:"; ObjectID = "aRo-sy-WpK"; */ "aRo-sy-WpK.title" = "Terminal par défaut:"; /* Class = "NSTextFieldCell"; title = "Not Installed Applications"; ObjectID = "bCi-r8-MrK"; */ "bCi-r8-MrK.title" = "Applications non installées"; /* Class = "NSTextFieldCell"; title = "Installed Supported Applications"; ObjectID = "bT7-LU-sov"; */ "bT7-LU-sov.title" = "Applications prises en charge installées"; /* Class = "NSTextFieldCell"; title = "Open with default Editor:"; ObjectID = "bvy-v3-hhf"; */ "bvy-v3-hhf.title" = "Ouvrir avec l’éditeur par défaut:"; /* Class = "NSButtonCell"; title = "PayPal"; ObjectID = "dC4-C7-fEL"; */ "dC4-C7-fEL.title" = "PayPal"; /* Class = "NSButtonCell"; title = "github.com/Ji4n1ng/OpenInTerminal"; ObjectID = "f2V-P5-pQI"; */ "f2V-P5-pQI.title" = "github.com/Ji4n1ng/OpenInTerminal"; /* Class = "NSTextFieldCell"; title = "Terminal"; ObjectID = "fA9-Hd-yjp"; */ "fA9-Hd-yjp.title" = "Terminal"; /* Class = "NSButtonCell"; title = "Quick Toggle"; ObjectID = "gy9-lb-m8d"; */ "gy9-lb-m8d.title" = "Exécution rapide"; /* Class = "NSTextFieldCell"; title = "Reset"; ObjectID = "jcs-Ou-OZ2"; */ "jcs-Ou-OZ2.title" = "Réinitialiser"; /* Class = "NSButtonCell"; title = "Reset preferences"; ObjectID = "jyI-H7-qN3"; */ "jyI-H7-qN3.title" = "Réinitialiser les préférences"; /* Class = "NSViewController"; title = "About"; ObjectID = "k6X-N1-mVu"; */ "k6X-N1-mVu.title" = "À propos"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal"; ObjectID = "mOB-su-ZM1"; */ "mOB-su-ZM1.title" = "OpenInTerminal"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "mTs-8c-pgj"; */ "mTs-8c-pgj.title" = "Fenêtre"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "nYS-rF-JCL"; */ "nYS-rF-JCL.title" = "Onglet"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal will automatically launch at login."; ObjectID = "ngT-lX-vFA"; */ "ngT-lX-vFA.title" = "OpenInTerminal sera automatiquement lancé à l’ouverture de la session."; /* Class = "NSViewController"; title = "Toolbar"; ObjectID = "s5W-qL-1Xs"; */ "s5W-qL-1Xs.title" = "Bar d’outils"; /* Class = "NSButtonCell"; title = "Hide Context Menu Items"; ObjectID = "sG4-nK-ghj"; */ "sG4-nK-ghj.title" = "Masquer les éléments du menu contextuel"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "sik-wU-ZF2"; */ "sik-wU-ZF2.title" = "Fenêtre"; /* Class = "NSButtonCell"; title = "@Ji4n1ng"; ObjectID = "tR5-me-DTK"; */ "tR5-me-DTK.title" = "@Ji4n1ng"; /* Class = "NSTextFieldCell"; title = "iTerm"; ObjectID = "yIW-2a-15A"; */ "yIW-2a-15A.title" = "iTerm"; /* Class = "NSButtonCell"; title = "Apply to Finder Toolbar Memu"; ObjectID = "2we-f7-s2N"; */ "2we-f7-s2N.title" = "Appliquer au menu de la barre d'outils du Finder"; /* Class = "NSButtonCell"; title = "Apply to Finder Context Memu"; ObjectID = "RhP-R5-Wwt"; */ "RhP-R5-Wwt.title" = "Appliquer au menu contextuel du Finder"; /* Class = "NSTextFieldCell"; title = "Custom Menu Options"; ObjectID = "nWc-SM-Kes"; */ "nWc-SM-Kes.title" = "Options de menu personnalisées"; ================================================ FILE: OpenInTerminal/PreferencesWindow/it.lproj/Preferences.strings ================================================ /* Class = "NSTextFieldCell"; title = "❤️ Special thanks to:"; ObjectID = "0Gy-jf-q6v"; */ "0Gy-jf-q6v.title" = "❤️ Un ringraziamento speciale a:"; /* Class = "NSTextFieldCell"; title = "⚠️ Note that this will reset all user preferences"; ObjectID = "2Rg-te-FPU"; */ "2Rg-te-FPU.title" = "⚠️ Tutte le Preferenze utente saranno ripristinate"; /* Class = "NSButtonCell"; title = "Apply to Finder Toolbar Menu"; ObjectID = "2we-f7-s2N"; */ "2we-f7-s2N.title" = "Applica al Menu della Barra Strumenti del Finder"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "4ss-CQ-brT"; */ "4ss-CQ-brT.title" = "Pannello"; /* Class = "NSTextFieldCell"; title = "If enabled, click the Menu Bar icon to toggle the action you choose. Right click to open the menu."; ObjectID = "592-4p-Ybh"; */ "592-4p-Ybh.title" = "Se selezionata, clicca sull'icona nella barra dei menu per eseguire l'azione rapida. Clicca con il tasto destro per aprire il menu."; /* Class = "NSWindow"; title = "Preferences"; ObjectID = "5f3-UK-Rft"; */ "5f3-UK-Rft.title" = "Preferenze"; /* Class = "NSButtonCell"; title = "Hide Status Bar Icon"; ObjectID = "BUH-CU-WBW"; */ "BUH-CU-WBW.title" = "Nascondi l'icona nella Barra dei Menu"; /* Class = "NSTextFieldCell"; title = "Open a new window or a new tab when opening a path in terminal."; ObjectID = "BrI-hE-Mff"; */ "BrI-hE-Mff.title" = "Apri una nuova finestra o un nuovo pannello quando apri un percorso nel terminale."; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "Dyx-zg-hYe"; */ "Dyx-zg-hYe.title" = "Nessuno"; /* Class = "NSTextFieldCell"; title = "Shortcuts"; ObjectID = "FpP-Q9-flS"; */ "FpP-Q9-flS.title" = "Scorciatoie"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "G69-k2-hgn"; */ "G69-k2-hgn.title" = "Nessuno"; /* Class = "NSViewController"; title = "General"; ObjectID = "Gn1-zC-bzB"; */ "Gn1-zC-bzB.title" = "Generali"; /* Class = "NSViewController"; title = "Advanced"; ObjectID = "H3q-JS-Bu4"; */ "H3q-JS-Bu4.title" = "Avanzate"; /* Class = "NSButtonCell"; title = "WeChat"; ObjectID = "HUx-Wz-JJm"; */ "HUx-Wz-JJm.title" = "WeChat"; /* Class = "NSTextFieldCell"; title = "👨‍💻 GitHub:"; ObjectID = "How-dP-tcX"; */ "How-dP-tcX.title" = "👨‍💻 GitHub:"; /* Class = "NSButtonCell"; title = "@Camji55"; ObjectID = "IJL-uk-uO5"; */ "IJL-uk-uO5.title" = "@Camji55"; /* Class = "NSButtonCell"; title = "contact@jianing.wang"; ObjectID = "IPL-yO-Vkp"; */ "IPL-yO-Vkp.title" = "contact@jianing.wang"; /* Class = "NSTextFieldCell"; title = "0.1.0"; ObjectID = "Jnf-AX-bIr"; */ "Jnf-AX-bIr.title" = "0.1.0"; /* Class = "NSTextFieldCell"; title = "💸 Donate:"; ObjectID = "Kua-ZD-31F"; */ "Kua-ZD-31F.title" = "💸 Dona:"; /* Class = "NSTextFieldCell"; title = "Open with default Terminal:"; ObjectID = "Mqt-Fp-Ssl"; */ "Mqt-Fp-Ssl.title" = "Apri con il Terminale di default:"; /* Class = "NSTextFieldCell"; title = "🐦 Twitter:"; ObjectID = "NZE-zU-6ss"; */ "NZE-zU-6ss.title" = "🐦 Twitter:"; /* Class = "NSButtonCell"; title = "Apply to Finder Context Menu"; ObjectID = "RhP-R5-Wwt"; */ "RhP-R5-Wwt.title" = "Applica al Menu Contestuale del Finder"; /* Class = "NSButtonCell"; title = "Alipay"; ObjectID = "Sw7-of-ecf"; */ "Sw7-of-ecf.title" = "Alipay"; /* Class = "NSTextFieldCell"; title = "You need to reopen the app to display Preferences."; ObjectID = "Upf-HU-iaN"; */ "Upf-HU-iaN.title" = "Riavvia l'applicazione per salvare le nuove Preferenze."; /* Class = "NSTextFieldCell"; title = "✉️ Contact:"; ObjectID = "Vu4-Wz-Agk"; */ "Vu4-Wz-Agk.title" = "✉️ Contattaci:"; /* Class = "NSTextFieldCell"; title = "Copy path in Clipboard:"; ObjectID = "Xd9-iA-emU"; */ "Xd9-iA-emU.title" = "Copia percorso nella Clipboard:"; /* Class = "NSTextFieldCell"; title = "Default Text Editor:"; ObjectID = "Xfc-rf-FkX"; */ "Xfc-rf-FkX.title" = "Editor di testo di default:"; /* Class = "NSButtonCell"; title = "Launch OpenInTerminal at Login"; ObjectID = "ZbK-xW-anT"; */ "ZbK-xW-anT.title" = "Apri OpenInTerminal al Login"; /* Class = "NSTextFieldCell"; title = "Default Terminal:"; ObjectID = "aRo-sy-WpK"; */ "aRo-sy-WpK.title" = "Terminale di default:"; /* Class = "NSTextFieldCell"; title = "Not Installed Applications"; ObjectID = "bCi-r8-MrK"; */ "bCi-r8-MrK.title" = "Applicazioni Non Installate"; /* Class = "NSTextFieldCell"; title = "Installed Supported Applications"; ObjectID = "bT7-LU-sov"; */ "bT7-LU-sov.title" = "Applicazioni Supportate Installate"; /* Class = "NSTextFieldCell"; title = "Open with default Editor:"; ObjectID = "bvy-v3-hhf"; */ "bvy-v3-hhf.title" = "Apri con l'Editor di default:"; /* Class = "NSButtonCell"; title = "PayPal"; ObjectID = "dC4-C7-fEL"; */ "dC4-C7-fEL.title" = "PayPal"; /* Class = "NSButtonCell"; title = "github.com/Ji4n1ng/OpenInTerminal"; ObjectID = "f2V-P5-pQI"; */ "f2V-P5-pQI.title" = "github.com/Ji4n1ng/OpenInTerminal"; /* Class = "NSTextFieldCell"; title = "Terminal"; ObjectID = "fA9-Hd-yjp"; */ "fA9-Hd-yjp.title" = "Terminale"; /* Class = "NSButtonCell"; title = "Quick Toggle"; ObjectID = "gy9-lb-m8d"; */ "gy9-lb-m8d.title" = "Azione rapida"; /* Class = "NSTextFieldCell"; title = "Reset"; ObjectID = "jcs-Ou-OZ2"; */ "jcs-Ou-OZ2.title" = "Ripristina"; /* Class = "NSButtonCell"; title = "Reset preferences"; ObjectID = "jyI-H7-qN3"; */ "jyI-H7-qN3.title" = "Ripristina le preferenze"; /* Class = "NSViewController"; title = "About"; ObjectID = "k6X-N1-mVu"; */ "k6X-N1-mVu.title" = "About"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "kAa-36-ubl"; */ "kAa-36-ubl.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "keg-OV-uLJ"; */ "keg-OV-uLJ.title" = "Table View Cell"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal"; ObjectID = "mOB-su-ZM1"; */ "mOB-su-ZM1.title" = "OpenInTerminal"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "mTs-8c-pgj"; */ "mTs-8c-pgj.title" = "Finestra"; /* Class = "NSTextFieldCell"; title = "Custom Menu Options"; ObjectID = "nWc-SM-Kes"; */ "nWc-SM-Kes.title" = "Opzioni Personalizzate dei Menu"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "nYS-rF-JCL"; */ "nYS-rF-JCL.title" = "Pannello"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal will automatically launch at login."; ObjectID = "ngT-lX-vFA"; */ "ngT-lX-vFA.title" = "OpenInTerminal si aprirà automaticamente al login."; /* Class = "NSViewController"; title = "Toolbar"; ObjectID = "s5W-qL-1Xs"; */ "s5W-qL-1Xs.title" = "Barra strumenti"; /* Class = "NSButtonCell"; title = "Hide Context Menu Items"; ObjectID = "sG4-nK-ghj"; */ "sG4-nK-ghj.title" = "Nascondi gli Elementi del Menu Contestuale"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "sik-wU-ZF2"; */ "sik-wU-ZF2.title" = "Finestra"; /* Class = "NSButtonCell"; title = "@Ji4n1ng"; ObjectID = "tR5-me-DTK"; */ "tR5-me-DTK.title" = "@Ji4n1ng"; /* Class = "NSTextFieldCell"; title = "iTerm"; ObjectID = "yIW-2a-15A"; */ "yIW-2a-15A.title" = "iTerm"; ================================================ FILE: OpenInTerminal/PreferencesWindow/ko.lproj/Preferences.strings ================================================ /* Class = "NSTextFieldCell"; title = "❤️ Special thanks to:"; ObjectID = "0Gy-jf-q6v"; */ "0Gy-jf-q6v.title" = "❤️ 특별히 감사드립니다:"; /* Class = "NSTextFieldCell"; title = "⚠️ Note that this will reset all user preferences"; ObjectID = "2Rg-te-FPU"; */ "2Rg-te-FPU.title" = "⚠️ 모든 사용자 설정이 초기화됩니다"; /* Class = "NSButtonCell"; title = "Apply to Finder Toolbar Menu"; ObjectID = "2we-f7-s2N"; */ "2we-f7-s2N.title" = "Finder 툴바 메뉴에 적용하기"; /* Class = "NSTextFieldCell"; title = "If enabled, click the Menu Bar icon to toggle the action you choose. Right click to open the menu."; ObjectID = "592-4p-Ybh"; */ "592-4p-Ybh.title" = "만약 활성화되면 메뉴 바 아이콘을 클릭하여 선택한 작업을 실행할 수 있고, 우클릭하여 메뉴를 열 수 있습니다."; /* Class = "NSWindow"; title = "Preferences"; ObjectID = "5f3-UK-Rft"; */ "5f3-UK-Rft.title" = "설정"; /* Class = "NSButtonCell"; title = "Hide Status Bar Icon"; ObjectID = "BUH-CU-WBW"; */ "BUH-CU-WBW.title" = "상태 바 아이콘 가리기"; /* Class = "NSTextFieldCell"; title = "Open a new window or a new tab."; ObjectID = "BrI-hE-Mff"; */ "BrI-hE-Mff.title" = "새 창 또는 탭 열기."; /* Class = "NSTextFieldCell"; title = "Icon Type:"; ObjectID = "CP0-Xv-uYl"; */ "CP0-Xv-uYl.title" = "아이콘 타입:"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "Cp7-6g-ngj"; */ "Cp7-6g-ngj.title" = "취소"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "Dyx-zg-hYe"; */ "Dyx-zg-hYe.title" = "없음"; /* Class = "NSTextFieldCell"; title = "Quit"; ObjectID = "FBK-9S-cZf"; */ "FBK-9S-cZf.title" = "종료"; /* Class = "NSTextFieldCell"; title = "Shortcuts"; ObjectID = "FpP-Q9-flS"; */ "FpP-Q9-flS.title" = "단축키"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "G69-k2-hgn"; */ "G69-k2-hgn.title" = "없음"; /* Class = "NSViewController"; title = "General"; ObjectID = "Gn1-zC-bzB"; */ "Gn1-zC-bzB.title" = "일반"; /* Class = "NSViewController"; title = "Advanced"; ObjectID = "H3q-JS-Bu4"; */ "H3q-JS-Bu4.title" = "고급"; /* Class = "NSButtonCell"; title = "WeChat"; ObjectID = "HUx-Wz-JJm"; */ "HUx-Wz-JJm.title" = "WeChat"; /* Class = "NSTextFieldCell"; title = "👨‍💻 GitHub:"; ObjectID = "How-dP-tcX"; */ "How-dP-tcX.title" = "👨‍💻 GitHub:"; /* Class = "NSButtonCell"; title = "@Camji55"; ObjectID = "IJL-uk-uO5"; */ "IJL-uk-uO5.title" = "@Camji55"; /* Class = "NSButtonCell"; title = "contact@jianing.wang"; ObjectID = "IPL-yO-Vkp"; */ "IPL-yO-Vkp.title" = "contact@jianing.wang"; /* Class = "NSTextFieldCell"; title = "0.1.0"; ObjectID = "Jnf-AX-bIr"; */ "Jnf-AX-bIr.title" = "0.1.0"; /* Class = "NSTextFieldCell"; title = "💸 Donate:"; ObjectID = "Kua-ZD-31F"; */ "Kua-ZD-31F.title" = "💸 후원:"; /* Class = "NSButtonCell"; title = "Terminal"; ObjectID = "M3w-T0-vi7"; */ "M3w-T0-vi7.title" = "터미널"; /* Class = "NSTextFieldCell"; title = "Open with default Terminal:"; ObjectID = "Mqt-Fp-Ssl"; */ "Mqt-Fp-Ssl.title" = "기본 터미널로 열기:"; /* Class = "NSTextFieldCell"; title = "🐦 Twitter:"; ObjectID = "NZE-zU-6ss"; */ "NZE-zU-6ss.title" = "🐦 Twitter:"; /* Class = "NSButtonCell"; title = "Apply to Finder Context Menu"; ObjectID = "RhP-R5-Wwt"; */ "RhP-R5-Wwt.title" = "Finder 우클릭 메뉴에 적용하기"; /* Class = "NSButtonCell"; title = "Alipay"; ObjectID = "Sw7-of-ecf"; */ "Sw7-of-ecf.title" = "Alipay"; /* Class = "NSTextFieldCell"; title = "Application Type:"; ObjectID = "UCM-Ds-LYN"; */ "UCM-Ds-LYN.title" = "애플리케이션 타입:"; /* Class = "NSTextFieldCell"; title = "You need to reopen the app to display Preferences."; ObjectID = "Upf-HU-iaN"; */ "Upf-HU-iaN.title" = "설정을 표시하려면 앱을 다시 열어야 합니다."; /* Class = "NSTextFieldCell"; title = "✉️ Contact:"; ObjectID = "Vu4-Wz-Agk"; */ "Vu4-Wz-Agk.title" = "✉️ 연락처:"; /* Class = "NSTextFieldCell"; title = "Copy path in Clipboard:"; ObjectID = "Xd9-iA-emU"; */ "Xd9-iA-emU.title" = "위치를 클립보드에 복사:"; /* Class = "NSTextFieldCell"; title = "Default Text Editor:"; ObjectID = "Xfc-rf-FkX"; */ "Xfc-rf-FkX.title" = "기본 텍스트 에디터:"; /* Class = "NSButtonCell"; title = "Launch OpenInTerminal at Login"; ObjectID = "ZbK-xW-anT"; */ "ZbK-xW-anT.title" = "OpenInTerminal를 로그인 시에 열기"; /* Class = "NSTextFieldCell"; title = "Default Terminal:"; ObjectID = "aRo-sy-WpK"; */ "aRo-sy-WpK.title" = "기본 터미널:"; /* Class = "NSTextFieldCell"; title = "Not Installed Applications"; ObjectID = "bCi-r8-MrK"; */ "bCi-r8-MrK.title" = "설치되지 않은 앱"; /* Class = "NSTextFieldCell"; title = "Installed Supported Applications"; ObjectID = "bT7-LU-sov"; */ "bT7-LU-sov.title" = "설치된 지원되는 앱"; /* Class = "NSTextFieldCell"; title = "Open with default Editor:"; ObjectID = "bvy-v3-hhf"; */ "bvy-v3-hhf.title" = "기본 에디터로 열기:"; /* Class = "NSButtonCell"; title = "GitHub Sponsors"; ObjectID = "dC4-C7-fEL"; */ "dC4-C7-fEL.title" = "GitHub 스폰서"; /* Class = "NSButtonCell"; title = "github.com/Ji4n1ng/OpenInTerminal"; ObjectID = "f2V-P5-pQI"; */ "f2V-P5-pQI.title" = "github.com/Ji4n1ng/OpenInTerminal"; /* Class = "NSButtonCell"; title = "Editor"; ObjectID = "fb4-Xq-he0"; */ "fb4-Xq-he0.title" = "에디터"; /* Class = "NSButtonCell"; title = "Quick Toggle"; ObjectID = "gy9-lb-m8d"; */ "gy9-lb-m8d.title" = "빠른 전환"; /* Class = "NSTextFieldCell"; title = "Application Name:"; ObjectID = "h5X-oY-gqy"; */ "h5X-oY-gqy.title" = "애플리케이션 이름:"; /* Class = "NSTextFieldCell"; title = "Reset"; ObjectID = "jcs-Ou-OZ2"; */ "jcs-Ou-OZ2.title" = "초기화"; /* Class = "NSButtonCell"; title = "Reset preferences"; ObjectID = "jyI-H7-qN3"; */ "jyI-H7-qN3.title" = "설정 초기화"; /* Class = "NSButtonCell"; title = "PayPal"; ObjectID = "k3X-F7-Gpb"; */ "k3X-F7-Gpb.title" = "PayPal"; /* Class = "NSViewController"; title = "About"; ObjectID = "k6X-N1-mVu"; */ "k6X-N1-mVu.title" = "정보"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "kAa-36-ubl"; */ "kAa-36-ubl.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "keg-OV-uLJ"; */ "keg-OV-uLJ.title" = "Table View Cell"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal"; ObjectID = "mOB-su-ZM1"; */ "mOB-su-ZM1.title" = "OpenInTerminal"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "mTs-8c-pgj"; */ "mTs-8c-pgj.title" = "윈도우"; /* Class = "NSTextFieldCell"; title = "Custom Menu Options"; ObjectID = "nWc-SM-Kes"; */ "nWc-SM-Kes.title" = "사용자 지정 메뉴 구성"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "nYS-rF-JCL"; */ "nYS-rF-JCL.title" = "탭"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal will automatically launch at login."; ObjectID = "ngT-lX-vFA"; */ "ngT-lX-vFA.title" = "OpenInTerminal가 로그인시에 자동으로 실행됩니다."; /* Class = "NSButtonCell"; title = "Quit OpenInTerminal"; ObjectID = "ofD-rA-gib"; */ "ofD-rA-gib.title" = "OpenInTerminal 종료"; /* Class = "NSViewController"; title = "Custom"; ObjectID = "s5W-qL-1Xs"; */ "s5W-qL-1Xs.title" = "사용자 지정"; /* Class = "NSButtonCell"; title = "Hide Context Menu Items"; ObjectID = "sG4-nK-ghj"; */ "sG4-nK-ghj.title" = "우클릭 메뉴에서 숨기기"; /* Class = "NSButtonCell"; title = "@Ji4n1ng"; ObjectID = "tR5-me-DTK"; */ "tR5-me-DTK.title" = "@Ji4n1ng"; /* Class = "NSButtonCell"; title = "original"; ObjectID = "uok-iD-wXY"; */ "uok-iD-wXY.title" = "원래대로"; /* Class = "NSButtonCell"; title = "Confirm"; ObjectID = "wpb-Gv-KAp"; */ "wpb-Gv-KAp.title" = "확인"; /* Class = "NSButtonCell"; title = "no"; ObjectID = "x6U-9Q-ujh"; */ "x6U-9Q-ujh.title" = "없음"; /* Class = "NSTextFieldCell"; title = "iTerm"; ObjectID = "yIW-2a-15A"; */ "yIW-2a-15A.title" = "iTerm"; /* Class = "NSButtonCell"; title = "simple"; ObjectID = "yrq-LZ-XDr"; */ "yrq-LZ-XDr.title" = "간단하게"; ================================================ FILE: OpenInTerminal/PreferencesWindow/mul.lproj/Preferences.xcstrings ================================================ { "sourceLanguage" : "en", "strings" : { "0Gy-jf-q6v.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"❤️ Special thanks to:\"; ObjectID = \"0Gy-jf-q6v\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "❤️ Besonderen Dank an:" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "❤️ Special thanks to:" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "❤️ Agradecimiento especial a:" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "❤️ Spécial remerciement à:" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "❤️ Un ringraziamento speciale a:" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "❤️ 특별히 감사드립니다:" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "❤️ Особое спасибо:" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "❤️ Özel olarak teşekkürler:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "❤️ 特别致谢:" } } } }, "2Rg-te-FPU.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"⚠️ Note that this will reset all user preferences\"; ObjectID = \"2Rg-te-FPU\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "⚠️ Beachten Sie, dass dadurch alle Benutzereinstellungen zurückgesetzt werden." } }, "en" : { "stringUnit" : { "state" : "new", "value" : "⚠️ Note that this will reset all user preferences" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "⚠️ Tenga en cuenta que se restablecerán todas las preferencias del usuario" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "⚠️ Notez que cela réinitialisera toutes les préférences de l'utilisateur" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "⚠️ Tutte le Preferenze utente saranno ripristinate" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "⚠️ 모든 사용자 설정이 초기화됩니다" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "⚠️ Все пользовательские настройки будут сброшены" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "⚠️ Bu bütün kullanıcı tercihlerini sıfırlayacaktır" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "⚠️ 注意这将会重置所有用户偏好设置" } } } }, "2we-f7-s2N.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Apply to Finder Toolbar Menu\"; ObjectID = \"2we-f7-s2N\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Auf das Finder-Symbolleistenmenü anwenden" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Apply to Finder Toolbar Menu" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Aplicar al menú de la barra de herramientas del Finder" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Appliquer au menu de la barre d'outils du Finder" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Applica al Menu della Barra Strumenti del Finder" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "Finder 툴바 메뉴에 적용하기" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Применить к меню панели инструментов Finder" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Finder Araç Menüsüne uygula" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "应用到访达工具栏菜单" } } } }, "5f3-UK-Rft.title" : { "comment" : "Class = \"NSWindow\"; title = \"Preferences\"; ObjectID = \"5f3-UK-Rft\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Einstellungen" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Preferences" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Preferencias" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Préférences" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Preferenze" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "설정" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Настройки" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Tercihler" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "偏好设置" } } } }, "592-4p-Ybh.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"If enabled, click the Menu Bar icon to toggle the action you choose. Right click to open the menu.\"; ObjectID = \"592-4p-Ybh\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Falls aktiviert, klicken Sie auf das Symbol der Menüleiste, um die gewünschte Aktion zu aktivieren. Klicken Sie mit der rechten Maustaste, um das Menü zu öffnen." } }, "en" : { "stringUnit" : { "state" : "new", "value" : "If enabled, click the Menu Bar icon to toggle the action you choose. Right click to open the menu." } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Si está habilitado, haga clic en el icono de la barra de menú para alternar la acción que elija. Haga clic derecho para abrir el menú." } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Si cela est activé, un clique sur l’icône dans la barre des menus exécutera l’action choisie. Un clique droit ouvrira le menu." } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Se selezionata, clicca sull'icona nella barra dei menu per eseguire l'azione rapida. Clicca con il tasto destro per aprire il menu." } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "만약 활성화되면 메뉴 바 아이콘을 클릭하여 선택한 작업을 실행할 수 있고, 우클릭하여 메뉴를 열 수 있습니다." } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Если включено, нажмите по иконке в меню, чтобы переключить действие. Правый клик для открытия меню." } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Eğer etkinleştirilirse Menu Çubuğundaki simge üzerinden yapılması istenen aksiyon seçilir. Menüyü açmak için sağ tıklayın" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "启用后,点击系统状态栏图标以快速启动你所选择的操作。辅助点按(右键)以打开菜单。" } } } }, "aRo-sy-WpK.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Default Terminal:\"; ObjectID = \"aRo-sy-WpK\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Standard-Terminal:" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Default Terminal:" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Terminal predeterminado:" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Terminal par défaut:" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Terminale di default:" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "기본 터미널:" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Терминал по-умолчанию:" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Varsayılan Terminal:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "默认终端:" } } } }, "bCi-r8-MrK.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Not Installed Applications\"; ObjectID = \"bCi-r8-MrK\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Nicht installierte Programme" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Not Installed Applications" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Aplicaciones no instaladas" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Applications non installées" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Applicazioni Non Installate" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "설치되지 않은 앱" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Нет установленных приложений" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Yüklü Olmayan Uygulamalar" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "未安装的应用" } } } }, "BrI-hE-Mff.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Open a new window or a new tab.\"; ObjectID = \"BrI-hE-Mff\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Öffnen Sie ein neues Fenster oder einen neuen Tab." } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Open a new window or a new tab." } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Abra una nueva ventana o una nueva pestaña." } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Ouvre une nouvelle fenêtre ou un nouvel onglet à l’ouverture du chemin d’accès dans le terminal." } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Apri una nuova finestra o un nuovo pannello quando apri un percorso nel terminale." } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "새 창 또는 탭 열기." } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Открыть новое окно или новую вкладку при открытии пути в терминале." } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Yeni bir pencere veya sekme aç." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "打开一个新的窗口或者标签。" } } } }, "bT7-LU-sov.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Installed Supported Applications\"; ObjectID = \"bT7-LU-sov\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Installierte unterstützte Programme" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Installed Supported Applications" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Aplicaciones compatibles instaladas" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Applications prises en charge installées" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Applicazioni Supportate Installate" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "설치된 지원되는 앱" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Установленные поддерживаемые приложения" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Yüklünmiş Desteklenen Uygulamalar" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "已安装的受支持的应用" } } } }, "BUH-CU-WBW.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Hide Status Bar Icon\"; ObjectID = \"BUH-CU-WBW\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Statusleistensymbol ausblenden" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Hide Status Bar Icon" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Ocultar icono de barra de estado" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Masquer l'icône de la barre d'état" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Nascondi l'icona nella Barra dei Menu" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "상태 바 아이콘 가리기" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Скрыть иконку в строке состояния" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Durum Çubuğu Simgesini Gizle" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "隐藏状态栏图标" } } } }, "bvy-v3-hhf.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Open with default Editor:\"; ObjectID = \"bvy-v3-hhf\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Mit Standard-Editor öffnen:" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Open with default Editor:" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Abrir con editor predeterminado:" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Ouvrir avec l’éditeur par défaut:" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Apri con l'Editor di default:" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "기본 에디터로 열기:" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Открыть в редакторе по-умолчанию:" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Varsayılan düzenleyici ile aç:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "打开默认编辑器:" } } } }, "CP0-Xv-uYl.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Icon Type:\"; ObjectID = \"CP0-Xv-uYl\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Symboltyp:" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Icon Type:" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Tipo de icono:" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Type d’icône:" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Tipo di icona:" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "아이콘 타입:" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Тип значка:" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Simge Tipi:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "图标类型:" } } } }, "Cp7-6g-ngj.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Cancel\"; ObjectID = \"Cp7-6g-ngj\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Abbrechen" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Cancel" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Cancelar" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Annuler" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Annulla" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "취소" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Отмена" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "İptal" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "取消" } } } }, "dC4-C7-fEL.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"GitHub Sponsors\"; ObjectID = \"dC4-C7-fEL\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "GitHub Sponsors" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "GitHub Sponsors" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "GitHub Sponsors" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "GitHub Sponsors" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "GitHub Sponsors" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "GitHub 스폰서" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "GitHub Sponsors" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "GitHub Sponsors" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "GitHub 赞助" } } } }, "Dyx-zg-hYe.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"None\"; ObjectID = \"Dyx-zg-hYe\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Keine" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "None" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Ninguno" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Aucun" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Nessuno" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "없음" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Нет" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Hiçbiri" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "无" } } } }, "eYl-05-W7a.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Yes\"; ObjectID = \"eYl-05-W7a\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "ja" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Yes" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Sí" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Oui" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Sì" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "예" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Да" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Evet" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "是" } } } }, "f2V-P5-pQI.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"github.com/Ji4n1ng/OpenInTerminal\"; ObjectID = \"f2V-P5-pQI\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "github.com/Ji4n1ng/OpenInTerminal" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "github.com/Ji4n1ng/OpenInTerminal" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "github.com/Ji4n1ng/OpenInTerminal" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "github.com/Ji4n1ng/OpenInTerminal" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "github.com/Ji4n1ng/OpenInTerminal" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "github.com/Ji4n1ng/OpenInTerminal" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "github.com/Ji4n1ng/OpenInTerminal" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "github.com/Ji4n1ng/OpenInTerminal" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "github.com/Ji4n1ng/OpenInTerminal" } } } }, "fb4-Xq-he0.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Editor\"; ObjectID = \"fb4-Xq-he0\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Editor" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Editor" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Editor" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Éditeur" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Editor" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "에디터" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Редактор" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Düzenleyici" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "编辑器" } } } }, "FBK-9S-cZf.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Quit\"; ObjectID = \"FBK-9S-cZf\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Beenden" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Quit" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Salir" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Quitter" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Esci" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "종료" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Выход" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Çıkış" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "退出" } } } }, "FpP-Q9-flS.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Shortcuts\"; ObjectID = \"FpP-Q9-flS\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Kurzbefehle" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Shortcuts" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Atajos" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Raccourcis" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Scorciatoie" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "단축키" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Ярлыки" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Kısayollar" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "快捷键" } } } }, "G69-k2-hgn.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"None\"; ObjectID = \"G69-k2-hgn\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Keine" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "None" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Niguno" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Aucun" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Nessuno" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "없음" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Нет" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Hiçbiri" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "无" } } } }, "Gn1-zC-bzB.title" : { "comment" : "Class = \"NSViewController\"; title = \"General\"; ObjectID = \"Gn1-zC-bzB\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Allgemein" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "General" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "General" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Général" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Generali" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "일반" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Основные" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Genel" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "通用" } } } }, "gy9-lb-m8d.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Quick Toggle\"; ObjectID = \"gy9-lb-m8d\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Schnellwechsler" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Quick Toggle" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Accion rápida" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Exécution rapide" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Azione rapida" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "빠른 전환" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Быстрое переключение" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Hızlı Seçim" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "快速启动" } } } }, "H3q-JS-Bu4.title" : { "comment" : "Class = \"NSViewController\"; title = \"Advanced\"; ObjectID = \"H3q-JS-Bu4\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Erweitert" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Advanced" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Avanzado" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Avancé" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Avanzate" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "고급" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Расширенные" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Gelişmiş" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "高级" } } } }, "h5X-oY-gqy.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Application Name:\"; ObjectID = \"h5X-oY-gqy\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Programmname:" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Application Name:" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Nombre de la aplicación:" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Nom de l’application:" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Nome dell’applicazione:" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "애플리케이션 이름:" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Название приложения:" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Uygulama Adı:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "应用名称:" } } } }, "How-dP-tcX.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"👨‍💻 GitHub:\"; ObjectID = \"How-dP-tcX\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "👨‍💻 GitHub:" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "👨‍💻 GitHub:" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "👨‍💻 GitHub:" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "👨‍💻 GitHub:" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "👨‍💻 GitHub:" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "👨‍💻 GitHub:" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "👨‍💻 GitHub:" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "👨‍💻 GitHub:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "👨‍💻 GitHub:" } } } }, "HUx-Wz-JJm.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"WeChat\"; ObjectID = \"HUx-Wz-JJm\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "WeChat" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "WeChat" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "WeChat" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "WeChat" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "WeChat" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "WeChat" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "WeChat" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "WeChat" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "微信" } } } }, "IJL-uk-uO5.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"@Camji55\"; ObjectID = \"IJL-uk-uO5\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "@Camji55" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "@Camji55" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "@Camji55" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "@Camji55" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "@Camji55" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "@Camji55" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "@Camji55" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "@Camji55" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "@Camji55" } } } }, "IPL-yO-Vkp.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"contact@jianing.wang\"; ObjectID = \"IPL-yO-Vkp\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "contact@jianing.wang" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "contact@jianing.wang" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "contact@jianing.wang" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "contact@jianing.wang" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "contact@jianing.wang" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "contact@jianing.wang" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "contact@jianing.wang" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "contact@jianing.wang" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "contact@jianing.wang" } } } }, "jcs-Ou-OZ2.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Reset\"; ObjectID = \"jcs-Ou-OZ2\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Zurücksetzen" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Reset" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Reiniciar" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Réinitialiser" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Ripristina" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "초기화" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Сброс" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Sıfırla" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "重置" } } } }, "Jnf-AX-bIr.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"0.1.0\"; ObjectID = \"Jnf-AX-bIr\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "0.1.0" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "0.1.0" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "0.1.0" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "0.1.0" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "0.1.0" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "0.1.0" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "0.1.0" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "0.1.0" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "0.1.0" } } } }, "jyI-H7-qN3.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Reset preferences\"; ObjectID = \"jyI-H7-qN3\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Einstellungen zurücksetzen" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Reset preferences" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Reiniciar preferencias" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Réinitialiser les préférences" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Ripristina le preferenze" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "설정 초기화" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Сбросить настройки" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Tercihleri sıfırla" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "重置设置" } } } }, "k3X-F7-Gpb.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"PayPal\"; ObjectID = \"k3X-F7-Gpb\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "PayPal" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "PayPal" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "PayPal" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Paypal" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Paypal" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "PayPal" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "PayPal" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "PayPal" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "PayPal" } } } }, "k6X-N1-mVu.title" : { "comment" : "Class = \"NSViewController\"; title = \"About\"; ObjectID = \"k6X-N1-mVu\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Über" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "About" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Acerca de" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "À propos" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "About" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "정보" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "О приложении" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Hakkında" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "关于" } } } }, "Kua-ZD-31F.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"💸 Donate:\"; ObjectID = \"Kua-ZD-31F\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "💸 Spenden:" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "💸 Donate:" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "💸 Donar:" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "💸 Faire un don:" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "💸 Dona:" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "💸 후원:" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "💸 Пожертвования:" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "💸 Bağış:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "💸 支持:" } } } }, "lRl-dd-P8P.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Path Escaping Options\"; ObjectID = \"lRl-dd-P8P\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Pfad-Escape-Optionen" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Path Escaping Options" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Opciones de escape de ruta" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Options d’échappement de chemin" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Opzioni di escape del percorso" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "경로 이스케이프 옵션" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Опции экранирования пути" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Yol Kaçış Seçenekleri" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "路径转义选项" } } } }, "M3w-T0-vi7.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Terminal\"; ObjectID = \"M3w-T0-vi7\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Terminal" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Terminal" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Terminal" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Terminal" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Terminale" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "터미널" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Терминал" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Terminal" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "终端" } } } }, "mOB-su-ZM1.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"OpenInTerminal\"; ObjectID = \"mOB-su-ZM1\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "OpenInTerminal" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal" } } } }, "Mqt-Fp-Ssl.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Open with default Terminal:\"; ObjectID = \"Mqt-Fp-Ssl\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Mit Standard-Terminal öffnen:" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Open with default Terminal:" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Abierto con terminal predeterminado:" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Ouvrir avec le terminal par défaut:" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Apri con il Terminale di default:" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "기본 터미널로 열기:" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Открыть через Терминал по-умолчанию:" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Varsayılan Terminal ile Aç:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "打开默认终端:" } } } }, "mTs-8c-pgj.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Window\"; ObjectID = \"mTs-8c-pgj\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Fenster" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Window" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Ventana" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Fenêtre" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Finestra" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "윈도우" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Окно" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Pencere" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "窗口" } } } }, "ngT-lX-vFA.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"OpenInTerminal will automatically launch at login.\"; ObjectID = \"ngT-lX-vFA\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal wird bei der Anmeldung automatisch gestartet." } }, "en" : { "stringUnit" : { "state" : "new", "value" : "OpenInTerminal will automatically launch at login." } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal se iniciará automáticamente al iniciar sesión." } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal sera automatiquement lancé à l’ouverture de la session." } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal si aprirà automaticamente al login." } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal가 로그인시에 자동으로 실행됩니다." } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal будет автоматически запускаться при старте системы" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal oturum açma sırasında otomatik başlatılacaktır." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "启用后,OpenInTerminal 将会在登录时自动启动。" } } } }, "nWc-SM-Kes.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Custom Menu Options\"; ObjectID = \"nWc-SM-Kes\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Benutzerdefinierte Menüoptionen" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Custom Menu Options" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Opciones de menú personalizado" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Options de menu personnalisées" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Opzioni Personalizzate dei Menu" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "사용자 지정 메뉴 구성" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Пользовательские параметры меню" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Özel Menü Ayarları" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "自定义菜单选项" } } } }, "nYS-rF-JCL.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Tab\"; ObjectID = \"nYS-rF-JCL\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Tab" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Tab" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Tab" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Onglet" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Pannello" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "탭" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Вкладка" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Sekme" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "标签页" } } } }, "NZE-zU-6ss.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"🐦 Twitter:\"; ObjectID = \"NZE-zU-6ss\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "🐦 Twitter:" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "🐦 Twitter:" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "🐦 Twitter:" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "🐦 Twitter:" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "🐦 Twitter:" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "🐦 Twitter:" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "🐦 Twitter:" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "🐦 Twitter:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "🐦 推特:" } } } }, "OET-MK-jpV.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"No\"; ObjectID = \"OET-MK-jpV\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "nein" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "No" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "No" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Non" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "No" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "아니요" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Нет" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Hayır" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "否" } } } }, "ofD-rA-gib.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Quit OpenInTerminal\"; ObjectID = \"ofD-rA-gib\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal beenden" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Quit OpenInTerminal" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Salir de OpenInTerminal" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Quit OpenInTerminal" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Esci da OpenInTerminal" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal 종료" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Выйти из OpenInTerminal" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal'den Çık" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "退出 OpenInTerminal" } } } }, "RhP-R5-Wwt.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Apply to Finder Context Menu\"; ObjectID = \"RhP-R5-Wwt\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Auf das Finder-Kontextmenü anwenden" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Apply to Finder Context Menu" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Aplicar al menú contextual del Finder" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Appliquer au menu contextuel du Finder" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Applica al Menu Contestuale del Finder" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "Finder 우클릭 메뉴에 적용하기" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Применить к контекстному меню Finder" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Finder İçerik Menüsüne Uygula" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "应用到访达上下文菜单" } } } }, "s5W-qL-1Xs.title" : { "comment" : "Class = \"NSViewController\"; title = \"Custom\"; ObjectID = \"s5W-qL-1Xs\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Benutzerdefiniert" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Custom" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Personalizado" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Bar d’outils" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Barra strumenti" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "사용자 지정" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Панель инструментов" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Özel" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "自定义" } } } }, "sG4-nK-ghj.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Hide Context Menu Items\"; ObjectID = \"sG4-nK-ghj\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Kontextmenüeinträge ausblenden" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Hide Context Menu Items" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Ocultar elementos del menú contextual" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Masquer les éléments du menu contextuel" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Nascondi gli Elementi del Menu Contestuale" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "우클릭 메뉴에서 숨기기" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Скрыть строки из контекстного меню" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "İçerik Menüsü Ögelerini Sil" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "隐藏上下文菜单项" } } } }, "Sw7-of-ecf.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Alipay\"; ObjectID = \"Sw7-of-ecf\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Alipay" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Alipay" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Alipay" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Alipay" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Alipay" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "Alipay" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Alipay" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Alipay" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "支付宝" } } } }, "tR5-me-DTK.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"@Ji4n1ng\"; ObjectID = \"tR5-me-DTK\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "@Ji4n1ng" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "@Ji4n1ng" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "@Ji4n1ng" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "@Ji4n1ng" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "@Ji4n1ng" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "@Ji4n1ng" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "@Ji4n1ng" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "@Ji4n1ng" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "@Ji4n1ng" } } } }, "UCM-Ds-LYN.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Application Type:\"; ObjectID = \"UCM-Ds-LYN\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Programmtyp:" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Application Type:" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "tipo de aplicacion:" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Type d’application :" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Tipo di applicazione:" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "애플리케이션 타입:" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Тип приложения:" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Uygulama Tipi:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "应用类型:" } } } }, "uok-iD-wXY.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"original\"; ObjectID = \"uok-iD-wXY\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "original" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "original" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "original" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "original" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "originale" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "원래대로" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "оригинал" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "orijinal" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "原始" } } } }, "Upf-HU-iaN.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"You need to reopen the app to display Preferences.\"; ObjectID = \"Upf-HU-iaN\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Sie müssen das Programm erneut öffnen, um die Einstellungen anzuzeigen." } }, "en" : { "stringUnit" : { "state" : "new", "value" : "You need to reopen the app to display Preferences." } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Debes volver a abrir la aplicación para mostrar las preferencias." } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Vous devez rouvrir l'application pour afficher les préférences." } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Riavvia l'applicazione per salvare le nuove Preferenze." } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "설정을 표시하려면 앱을 다시 열어야 합니다." } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Перезапустите приложения, чтобы отобразить Настройки." } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Tercihleri görüntüleyebilmek için uygulama tekrar açılmalı." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "你需要重新打开应用来显示偏好设置。" } } } }, "Vu4-Wz-Agk.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"✉️ Contact:\"; ObjectID = \"Vu4-Wz-Agk\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "✉️ Kontakt:" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "✉️ Contact:" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "✉️ Contactar:" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "✉️ Contact:" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "✉️ Contattaci:" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "✉️ 연락처:" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "✉️ Связаться:" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "✉️ İletişim:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "✉️ 联系:" } } } }, "wpb-Gv-KAp.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Confirm\"; ObjectID = \"wpb-Gv-KAp\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Bestätigen" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Confirm" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Confirmar" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Confirmer" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Conferma" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "확인" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Подтвердить" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Onayla" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "确认" } } } }, "x6U-9Q-ujh.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"no\"; ObjectID = \"x6U-9Q-ujh\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "nein" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "no" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "no" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "non" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "no" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "없음" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Нет" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "hayır" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "无" } } } }, "Xd9-iA-emU.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Copy path in Clipboard:\"; ObjectID = \"Xd9-iA-emU\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Pfad in die Zwischenablage kopieren:" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Copy path in Clipboard:" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Copiar ruta en el Portapapeles:" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Copier le chemin d’accès:" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Copia percorso nella Clipboard:" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "위치를 클립보드에 복사:" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Скопировать путь в буфер обмена:" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Yolu Clipboard'a kopyala:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "拷贝路径到粘贴板:" } } } }, "Xfc-rf-FkX.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"Default Text Editor:\"; ObjectID = \"Xfc-rf-FkX\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "Standard Text-Editor:" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Default Text Editor:" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Editor de texto predeterminado:" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Éditeur par défaut:" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Editor di testo di default:" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "기본 텍스트 에디터:" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Текстовый редактор по-умолчанию:" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "Varsayılan Yazı Düzenleyecisi:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "默认编辑器:" } } } }, "yIW-2a-15A.title" : { "comment" : "Class = \"NSTextFieldCell\"; title = \"iTerm\"; ObjectID = \"yIW-2a-15A\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "iTerm" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "iTerm" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "iTerm" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "iTerm" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "iTerm" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "iTerm" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "iTerm" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "iTerm" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "iTerm" } } } }, "yrq-LZ-XDr.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"simple\"; ObjectID = \"yrq-LZ-XDr\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "einfach" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "simple" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "simple" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "simple" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "semplice" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "간단하게" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "простой" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "basit" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "简单" } } } }, "ZbK-xW-anT.title" : { "comment" : "Class = \"NSButtonCell\"; title = \"Launch OpenInTerminal at Login\"; ObjectID = \"ZbK-xW-anT\";", "extractionState" : "extracted_with_value", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal bei der Anmeldung starten" } }, "en" : { "stringUnit" : { "state" : "new", "value" : "Launch OpenInTerminal at Login" } }, "es" : { "stringUnit" : { "state" : "translated", "value" : "Abrir OpenInTerminal al iniciar sesión" } }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Lancer OpenInTerminal à l’ouverture de la session" } }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Apri OpenInTerminal al Login" } }, "ko" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal를 로그인 시에 열기" } }, "ru" : { "stringUnit" : { "state" : "translated", "value" : "Запускать OpenInTerminal автоматически" } }, "tr" : { "stringUnit" : { "state" : "translated", "value" : "OpenInTerminal girişte çalıştır" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", "value" : "开机自动启动" } } } } }, "version" : "1.0" } ================================================ FILE: OpenInTerminal/PreferencesWindow/ru.lproj/Preferences.strings ================================================ /* Class = "NSTextFieldCell"; title = "❤️ Special thanks to:"; ObjectID = "0Gy-jf-q6v"; */ "0Gy-jf-q6v.title" = "❤️ Особое спасибо:"; /* Class = "NSTextFieldCell"; title = "⚠️ Note that this will reset all user preferences"; ObjectID = "2Rg-te-FPU"; */ "2Rg-te-FPU.title" = "⚠️ Все пользовательские настройки будут сброшены"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "4ss-CQ-brT"; */ "4ss-CQ-brT.title" = "Вкладка"; /* Class = "NSTextFieldCell"; title = "If enabled, click the Menu Bar icon to toggle the action you choose. Right click to open the menu."; ObjectID = "592-4p-Ybh"; */ "592-4p-Ybh.title" = "Если включено, нажмите по иконке в меню, чтобы переключить действие. Правый клик для открытия меню."; /* Class = "NSWindow"; title = "Preferences"; ObjectID = "5f3-UK-Rft"; */ "5f3-UK-Rft.title" = "Настройки"; /* Class = "NSButtonCell"; title = "Hide Status Bar Icon"; ObjectID = "BUH-CU-WBW"; */ "BUH-CU-WBW.title" = "Скрыть иконку в строке состояния"; /* Class = "NSTextFieldCell"; title = "Open a new window or a new tab when opening a path in terminal."; ObjectID = "BrI-hE-Mff"; */ "BrI-hE-Mff.title" = "Открыть новое окно или новую вкладку при открытии пути в терминале."; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "Dyx-zg-hYe"; */ "Dyx-zg-hYe.title" = "Нет"; /* Class = "NSTextFieldCell"; title = "Shortcuts"; ObjectID = "FpP-Q9-flS"; */ "FpP-Q9-flS.title" = "Ярлыки"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "G69-k2-hgn"; */ "G69-k2-hgn.title" = "Нет"; /* Class = "NSViewController"; title = "General"; ObjectID = "Gn1-zC-bzB"; */ "Gn1-zC-bzB.title" = "Основные"; /* Class = "NSViewController"; title = "Advanced"; ObjectID = "H3q-JS-Bu4"; */ "H3q-JS-Bu4.title" = "Расширенные"; /* Class = "NSButtonCell"; title = "WeChat"; ObjectID = "HUx-Wz-JJm"; */ "HUx-Wz-JJm.title" = "WeChat"; /* Class = "NSTextFieldCell"; title = "👨‍💻 GitHub:"; ObjectID = "How-dP-tcX"; */ "How-dP-tcX.title" = "👨‍💻 GitHub:"; /* Class = "NSButtonCell"; title = "@Camji55"; ObjectID = "IJL-uk-uO5"; */ "IJL-uk-uO5.title" = "@Camji55"; /* Class = "NSButtonCell"; title = "contact@jianing.wang"; ObjectID = "IPL-yO-Vkp"; */ "IPL-yO-Vkp.title" = "contact@jianing.wang"; /* Class = "NSTextFieldCell"; title = "0.1.0"; ObjectID = "Jnf-AX-bIr"; */ "Jnf-AX-bIr.title" = "0.1.0"; /* Class = "NSTextFieldCell"; title = "💸 Donate:"; ObjectID = "Kua-ZD-31F"; */ "Kua-ZD-31F.title" = "💸 Пожертвования:"; /* Class = "NSTextFieldCell"; title = "Open with default Terminal:"; ObjectID = "Mqt-Fp-Ssl"; */ "Mqt-Fp-Ssl.title" = "Открыть через Терминал по-умолчанию:"; /* Class = "NSTextFieldCell"; title = "🐦 Twitter:"; ObjectID = "NZE-zU-6ss"; */ "NZE-zU-6ss.title" = "🐦 Twitter:"; /* Class = "NSButtonCell"; title = "Alipay"; ObjectID = "Sw7-of-ecf"; */ "Sw7-of-ecf.title" = "Alipay"; /* Class = "NSTextFieldCell"; title = "You need to reopen the app to display Preferences."; ObjectID = "Upf-HU-iaN"; */ "Upf-HU-iaN.title" = "Перезапустите приложения, чтобы отобразить Настройки."; /* Class = "NSTextFieldCell"; title = "✉️ Contact:"; ObjectID = "Vu4-Wz-Agk"; */ "Vu4-Wz-Agk.title" = "✉️ Связаться:"; /* Class = "NSTextFieldCell"; title = "Copy path in Clipboard:"; ObjectID = "Xd9-iA-emU"; */ "Xd9-iA-emU.title" = "Скопировать путь в буфер обмена:"; /* Class = "NSTextFieldCell"; title = "Default Text Editor:"; ObjectID = "Xfc-rf-FkX"; */ "Xfc-rf-FkX.title" = "Текстовый редактор по-умолчанию:"; /* Class = "NSButtonCell"; title = "Launch OpenInTerminal at Login"; ObjectID = "ZbK-xW-anT"; */ "ZbK-xW-anT.title" = "Запускать OpenInTerminal автоматически"; /* Class = "NSTextFieldCell"; title = "Default Terminal:"; ObjectID = "aRo-sy-WpK"; */ "aRo-sy-WpK.title" = "Терминал по-умолчанию:"; /* Class = "NSTextFieldCell"; title = "Not Installed Applications"; ObjectID = "bCi-r8-MrK"; */ "bCi-r8-MrK.title" = "Нет установленных приложений"; /* Class = "NSTextFieldCell"; title = "Installed Supported Applications"; ObjectID = "bT7-LU-sov"; */ "bT7-LU-sov.title" = "Установленные поддерживаемые приложения"; /* Class = "NSTextFieldCell"; title = "Open with default Editor:"; ObjectID = "bvy-v3-hhf"; */ "bvy-v3-hhf.title" = "Открыть в редакторе по-умолчанию:"; /* Class = "NSButtonCell"; title = "PayPal"; ObjectID = "dC4-C7-fEL"; */ "dC4-C7-fEL.title" = "PayPal"; /* Class = "NSButtonCell"; title = "github.com/Ji4n1ng/OpenInTerminal"; ObjectID = "f2V-P5-pQI"; */ "f2V-P5-pQI.title" = "github.com/Ji4n1ng/OpenInTerminal"; /* Class = "NSTextFieldCell"; title = "Terminal"; ObjectID = "fA9-Hd-yjp"; */ "fA9-Hd-yjp.title" = "Терминал"; /* Class = "NSButtonCell"; title = "Quick Toggle"; ObjectID = "gy9-lb-m8d"; */ "gy9-lb-m8d.title" = "Быстрое переключение"; /* Class = "NSTextFieldCell"; title = "Reset"; ObjectID = "jcs-Ou-OZ2"; */ "jcs-Ou-OZ2.title" = "Сброс"; /* Class = "NSButtonCell"; title = "Reset preferences"; ObjectID = "jyI-H7-qN3"; */ "jyI-H7-qN3.title" = "Сбросить настройки"; /* Class = "NSViewController"; title = "About"; ObjectID = "k6X-N1-mVu"; */ "k6X-N1-mVu.title" = "О приложении"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal"; ObjectID = "mOB-su-ZM1"; */ "mOB-su-ZM1.title" = "OpenInTerminal"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "mTs-8c-pgj"; */ "mTs-8c-pgj.title" = "Окно"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "nYS-rF-JCL"; */ "nYS-rF-JCL.title" = "Вкладка"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal will automatically launch at login."; ObjectID = "ngT-lX-vFA"; */ "ngT-lX-vFA.title" = "OpenInTerminal будет автоматически запускаться при старте системы"; /* Class = "NSViewController"; title = "Toolbar"; ObjectID = "s5W-qL-1Xs"; */ "s5W-qL-1Xs.title" = "Панель инструментов"; /* Class = "NSButtonCell"; title = "Hide Context Menu Items"; ObjectID = "sG4-nK-ghj"; */ "sG4-nK-ghj.title" = "Скрыть строки из контекстного меню"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "sik-wU-ZF2"; */ "sik-wU-ZF2.title" = "Окно"; /* Class = "NSButtonCell"; title = "@Ji4n1ng"; ObjectID = "tR5-me-DTK"; */ "tR5-me-DTK.title" = "@Ji4n1ng"; /* Class = "NSTextFieldCell"; title = "iTerm"; ObjectID = "yIW-2a-15A"; */ "yIW-2a-15A.title" = "iTerm"; /* Class = "NSButtonCell"; title = "Apply to Finder Toolbar Memu"; ObjectID = "2we-f7-s2N"; */ "2we-f7-s2N.title" = "Применить к меню панели инструментов Finder"; /* Class = "NSButtonCell"; title = "Apply to Finder Context Memu"; ObjectID = "RhP-R5-Wwt"; */ "RhP-R5-Wwt.title" = "Применить к контекстному меню Finder"; /* Class = "NSTextFieldCell"; title = "Custom Menu Options"; ObjectID = "nWc-SM-Kes"; */ "nWc-SM-Kes.title" = "Пользовательские параметры меню"; ================================================ FILE: OpenInTerminal/PreferencesWindow/tr.lproj/Preferences.strings ================================================ /* Class = "NSTextFieldCell"; title = "❤️ Special thanks to:"; ObjectID = "0Gy-jf-q6v"; */ "0Gy-jf-q6v.title" = "❤️ Özel olarak teşekkürler:"; /* Class = "NSTextFieldCell"; title = "⚠️ Note that this will reset all user preferences"; ObjectID = "2Rg-te-FPU"; */ "2Rg-te-FPU.title" = "⚠️ Bu bütün kullanıcı tercihlerini sıfırlayacaktır"; /* Class = "NSButtonCell"; title = "Apply to Finder Toolbar Menu"; ObjectID = "2we-f7-s2N"; */ "2we-f7-s2N.title" = "Finder Araç Menüsüne uygula"; /* Class = "NSTextFieldCell"; title = "If enabled, click the Menu Bar icon to toggle the action you choose. Right click to open the menu."; ObjectID = "592-4p-Ybh"; */ "592-4p-Ybh.title" = "Eğer etkinleştirilirse Menu Çubuğundaki simge üzerinden yapılması istenen aksiyon seçilir. Menüyü açmak için sağ tıklayın"; /* Class = "NSWindow"; title = "Preferences"; ObjectID = "5f3-UK-Rft"; */ "5f3-UK-Rft.title" = "Tercihler"; /* Class = "NSButtonCell"; title = "Hide Status Bar Icon"; ObjectID = "BUH-CU-WBW"; */ "BUH-CU-WBW.title" = "Durum Çubuğu Simgesini Gizle"; /* Class = "NSTextFieldCell"; title = "Open a new window or a new tab."; ObjectID = "BrI-hE-Mff"; */ "BrI-hE-Mff.title" = "Yeni bir pencere veya sekme aç."; /* Class = "NSTextFieldCell"; title = "Icon Type:"; ObjectID = "CP0-Xv-uYl"; */ "CP0-Xv-uYl.title" = "Simge Tipi:"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "Cp7-6g-ngj"; */ "Cp7-6g-ngj.title" = "İptal"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "Dyx-zg-hYe"; */ "Dyx-zg-hYe.title" = "Hiçbiri"; /* Class = "NSTextFieldCell"; title = "Quit"; ObjectID = "FBK-9S-cZf"; */ "FBK-9S-cZf.title" = "Çıkış"; /* Class = "NSTextFieldCell"; title = "Shortcuts"; ObjectID = "FpP-Q9-flS"; */ "FpP-Q9-flS.title" = "Kısayollar"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "G69-k2-hgn"; */ "G69-k2-hgn.title" = "Hiçbiri"; /* Class = "NSViewController"; title = "General"; ObjectID = "Gn1-zC-bzB"; */ "Gn1-zC-bzB.title" = "Genel"; /* Class = "NSViewController"; title = "Advanced"; ObjectID = "H3q-JS-Bu4"; */ "H3q-JS-Bu4.title" = "Gelişmiş"; /* Class = "NSButtonCell"; title = "WeChat"; ObjectID = "HUx-Wz-JJm"; */ "HUx-Wz-JJm.title" = "WeChat"; /* Class = "NSTextFieldCell"; title = "👨‍💻 GitHub:"; ObjectID = "How-dP-tcX"; */ "How-dP-tcX.title" = "👨‍💻 GitHub:"; /* Class = "NSButtonCell"; title = "@Camji55"; ObjectID = "IJL-uk-uO5"; */ "IJL-uk-uO5.title" = "@Camji55"; /* Class = "NSButtonCell"; title = "contact@jianing.wang"; ObjectID = "IPL-yO-Vkp"; */ "IPL-yO-Vkp.title" = "contact@jianing.wang"; /* Class = "NSTextFieldCell"; title = "0.1.0"; ObjectID = "Jnf-AX-bIr"; */ "Jnf-AX-bIr.title" = "0.1.0"; /* Class = "NSTextFieldCell"; title = "💸 Donate:"; ObjectID = "Kua-ZD-31F"; */ "Kua-ZD-31F.title" = "💸 Bağış:"; /* Class = "NSButtonCell"; title = "Terminal"; ObjectID = "M3w-T0-vi7"; */ "M3w-T0-vi7.title" = "Terminal"; /* Class = "NSTextFieldCell"; title = "Open with default Terminal:"; ObjectID = "Mqt-Fp-Ssl"; */ "Mqt-Fp-Ssl.title" = "Varsayılan Terminal ile Aç:"; /* Class = "NSTextFieldCell"; title = "🐦 Twitter:"; ObjectID = "NZE-zU-6ss"; */ "NZE-zU-6ss.title" = "🐦 Twitter:"; /* Class = "NSButtonCell"; title = "Apply to Finder Context Menu"; ObjectID = "RhP-R5-Wwt"; */ "RhP-R5-Wwt.title" = "Finder İçerik Menüsüne Uygula"; /* Class = "NSButtonCell"; title = "Alipay"; ObjectID = "Sw7-of-ecf"; */ "Sw7-of-ecf.title" = "Alipay"; /* Class = "NSTextFieldCell"; title = "Application Type:"; ObjectID = "UCM-Ds-LYN"; */ "UCM-Ds-LYN.title" = "Uygulama Tipi:"; /* Class = "NSTextFieldCell"; title = "You need to reopen the app to display Preferences."; ObjectID = "Upf-HU-iaN"; */ "Upf-HU-iaN.title" = "Tercihleri görüntüleyebilmek için uygulama tekrar açılmalı."; /* Class = "NSTextFieldCell"; title = "✉️ Contact:"; ObjectID = "Vu4-Wz-Agk"; */ "Vu4-Wz-Agk.title" = "✉️ İletişim:"; /* Class = "NSTextFieldCell"; title = "Copy path in Clipboard:"; ObjectID = "Xd9-iA-emU"; */ "Xd9-iA-emU.title" = "Yolu Clipboard'a kopyala:"; /* Class = "NSTextFieldCell"; title = "Default Text Editor:"; ObjectID = "Xfc-rf-FkX"; */ "Xfc-rf-FkX.title" = "Varsayılan Yazı Düzenleyecisi:"; /* Class = "NSButtonCell"; title = "Launch OpenInTerminal at Login"; ObjectID = "ZbK-xW-anT"; */ "ZbK-xW-anT.title" = "OpenInTerminal girişte çalıştır"; /* Class = "NSTextFieldCell"; title = "Default Terminal:"; ObjectID = "aRo-sy-WpK"; */ "aRo-sy-WpK.title" = "Varsayılan Terminal:"; /* Class = "NSTextFieldCell"; title = "Not Installed Applications"; ObjectID = "bCi-r8-MrK"; */ "bCi-r8-MrK.title" = "Yüklü Olmayan Uygulamalar"; /* Class = "NSTextFieldCell"; title = "Installed Supported Applications"; ObjectID = "bT7-LU-sov"; */ "bT7-LU-sov.title" = "Yüklünmiş Desteklenen Uygulamalar"; /* Class = "NSTextFieldCell"; title = "Open with default Editor:"; ObjectID = "bvy-v3-hhf"; */ "bvy-v3-hhf.title" = "Varsayılan düzenleyici ile aç:"; /* Class = "NSButtonCell"; title = "PayPal"; ObjectID = "dC4-C7-fEL"; */ "dC4-C7-fEL.title" = "PayPal"; /* Class = "NSButtonCell"; title = "github.com/Ji4n1ng/OpenInTerminal"; ObjectID = "f2V-P5-pQI"; */ "f2V-P5-pQI.title" = "github.com/Ji4n1ng/OpenInTerminal"; /* Class = "NSButtonCell"; title = "Editor"; ObjectID = "fb4-Xq-he0"; */ "fb4-Xq-he0.title" = "Düzenleyici"; /* Class = "NSButtonCell"; title = "Quick Toggle"; ObjectID = "gy9-lb-m8d"; */ "gy9-lb-m8d.title" = "Hızlı Seçim"; /* Class = "NSTextFieldCell"; title = "Application Name:"; ObjectID = "h5X-oY-gqy"; */ "h5X-oY-gqy.title" = "Uygulama Adı:"; /* Class = "NSTextFieldCell"; title = "Reset"; ObjectID = "jcs-Ou-OZ2"; */ "jcs-Ou-OZ2.title" = "Sıfırla"; /* Class = "NSButtonCell"; title = "Reset preferences"; ObjectID = "jyI-H7-qN3"; */ "jyI-H7-qN3.title" = "Tercihleri sıfırla"; /* Class = "NSViewController"; title = "About"; ObjectID = "k6X-N1-mVu"; */ "k6X-N1-mVu.title" = "Hakkında"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "kAa-36-ubl"; */ "kAa-36-ubl.title" = "Yazı Hücresi"; /* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "keg-OV-uLJ"; */ "keg-OV-uLJ.title" = "Tablo Görünüm Hücresi"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal"; ObjectID = "mOB-su-ZM1"; */ "mOB-su-ZM1.title" = "OpenInTerminal"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "mTs-8c-pgj"; */ "mTs-8c-pgj.title" = "Pencere"; /* Class = "NSTextFieldCell"; title = "Custom Menu Options"; ObjectID = "nWc-SM-Kes"; */ "nWc-SM-Kes.title" = "Özel Menü Ayarları"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "nYS-rF-JCL"; */ "nYS-rF-JCL.title" = "Sekme"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal will automatically launch at login."; ObjectID = "ngT-lX-vFA"; */ "ngT-lX-vFA.title" = "OpenInTerminal oturum açma sırasında otomatik başlatılacaktır."; /* Class = "NSButtonCell"; title = "Quit OpenInTerminal"; ObjectID = "ofD-rA-gib"; */ "ofD-rA-gib.title" = "OpenInTerminal'den Çık"; /* Class = "NSViewController"; title = "Custom"; ObjectID = "s5W-qL-1Xs"; */ "s5W-qL-1Xs.title" = "Özel"; /* Class = "NSButtonCell"; title = "Hide Context Menu Items"; ObjectID = "sG4-nK-ghj"; */ "sG4-nK-ghj.title" = "İçerik Menüsü Ögelerini Sil"; /* Class = "NSButtonCell"; title = "@Ji4n1ng"; ObjectID = "tR5-me-DTK"; */ "tR5-me-DTK.title" = "@Ji4n1ng"; /* Class = "NSButtonCell"; title = "original"; ObjectID = "uok-iD-wXY"; */ "uok-iD-wXY.title" = "orijinal"; /* Class = "NSButtonCell"; title = "Confirm"; ObjectID = "wpb-Gv-KAp"; */ "wpb-Gv-KAp.title" = "Onayla"; /* Class = "NSButtonCell"; title = "no"; ObjectID = "x6U-9Q-ujh"; */ "x6U-9Q-ujh.title" = "hayır"; /* Class = "NSTextFieldCell"; title = "iTerm"; ObjectID = "yIW-2a-15A"; */ "yIW-2a-15A.title" = "iTerm"; /* Class = "NSButtonCell"; title = "simple"; ObjectID = "yrq-LZ-XDr"; */ "yrq-LZ-XDr.title" = "basit"; ================================================ FILE: OpenInTerminal/PreferencesWindow/zh-Hans.lproj/Preferences.strings ================================================ /* Class = "NSTextFieldCell"; title = "❤️ Special thanks to:"; ObjectID = "0Gy-jf-q6v"; */ "0Gy-jf-q6v.title" = "❤️ 特别致谢:"; /* Class = "NSTextFieldCell"; title = "⚠️ Note that this will reset all user preferences"; ObjectID = "2Rg-te-FPU"; */ "2Rg-te-FPU.title" = "⚠️ 注意这将会重置所有用户偏好设置"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "4ss-CQ-brT"; */ "4ss-CQ-brT.title" = "标签页"; /* Class = "NSTextFieldCell"; title = "If enabled, click the Menu Bar icon to toggle the action you choose. Right click to open the menu."; ObjectID = "592-4p-Ybh"; */ "592-4p-Ybh.title" = "启用后,点击系统状态栏图标以快速启动你所选择的操作。辅助点按(右键)以打开菜单。"; /* Class = "NSWindow"; title = "Preferences"; ObjectID = "5f3-UK-Rft"; */ "5f3-UK-Rft.title" = "偏好设置"; /* Class = "NSButtonCell"; title = "Hide Status Bar Icon"; ObjectID = "BUH-CU-WBW"; */ "BUH-CU-WBW.title" = "隐藏状态栏图标"; /* Class = "NSTextFieldCell"; title = "Open a new window or a new tab."; ObjectID = "BrI-hE-Mff"; */ "BrI-hE-Mff.title" = "打开一个新的窗口或者标签。"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "Dyx-zg-hYe"; */ "Dyx-zg-hYe.title" = "无"; /* Class = "NSTextFieldCell"; title = "Shortcuts"; ObjectID = "FpP-Q9-flS"; */ "FpP-Q9-flS.title" = "快捷键"; /* Class = "NSTextFieldCell"; title = "None"; ObjectID = "G69-k2-hgn"; */ "G69-k2-hgn.title" = "无"; /* Class = "NSViewController"; title = "General"; ObjectID = "Gn1-zC-bzB"; */ "Gn1-zC-bzB.title" = "通用"; /* Class = "NSViewController"; title = "Advanced"; ObjectID = "H3q-JS-Bu4"; */ "H3q-JS-Bu4.title" = "高级"; /* Class = "NSButtonCell"; title = "WeChat"; ObjectID = "HUx-Wz-JJm"; */ "HUx-Wz-JJm.title" = "微信"; /* Class = "NSTextFieldCell"; title = "👨‍💻 GitHub:"; ObjectID = "How-dP-tcX"; */ "How-dP-tcX.title" = "👨‍💻 GitHub:"; /* Class = "NSButtonCell"; title = "@Camji55"; ObjectID = "IJL-uk-uO5"; */ "IJL-uk-uO5.title" = "@Camji55"; /* Class = "NSButtonCell"; title = "contact@jianing.wang"; ObjectID = "IPL-yO-Vkp"; */ "IPL-yO-Vkp.title" = "contact@jianing.wang"; /* Class = "NSTextFieldCell"; title = "0.1.0"; ObjectID = "Jnf-AX-bIr"; */ "Jnf-AX-bIr.title" = "0.1.0"; /* Class = "NSTextFieldCell"; title = "💸 Donate:"; ObjectID = "Kua-ZD-31F"; */ "Kua-ZD-31F.title" = "💸 支持:"; /* Class = "NSTextFieldCell"; title = "Open with default Terminal:"; ObjectID = "Mqt-Fp-Ssl"; */ "Mqt-Fp-Ssl.title" = "打开默认终端:"; /* Class = "NSTextFieldCell"; title = "🐦 Twitter:"; ObjectID = "NZE-zU-6ss"; */ "NZE-zU-6ss.title" = "🐦 推特:"; /* Class = "NSButtonCell"; title = "Alipay"; ObjectID = "Sw7-of-ecf"; */ "Sw7-of-ecf.title" = "支付宝"; /* Class = "NSTextFieldCell"; title = "You need to reopen the app to display Preferences."; ObjectID = "Upf-HU-iaN"; */ "Upf-HU-iaN.title" = "你需要重新打开应用来显示偏好设置。"; /* Class = "NSTextFieldCell"; title = "✉️ Contact:"; ObjectID = "Vu4-Wz-Agk"; */ "Vu4-Wz-Agk.title" = "✉️ 联系:"; /* Class = "NSTextFieldCell"; title = "Copy path in Clipboard:"; ObjectID = "Xd9-iA-emU"; */ "Xd9-iA-emU.title" = "拷贝路径到粘贴板:"; /* Class = "NSTextFieldCell"; title = "Default Text Editor:"; ObjectID = "Xfc-rf-FkX"; */ "Xfc-rf-FkX.title" = "默认编辑器:"; /* Class = "NSButtonCell"; title = "Launch OpenInTerminal at Login"; ObjectID = "ZbK-xW-anT"; */ "ZbK-xW-anT.title" = "开机自动启动"; /* Class = "NSTextFieldCell"; title = "Default Terminal:"; ObjectID = "aRo-sy-WpK"; */ "aRo-sy-WpK.title" = "默认终端:"; /* Class = "NSTextFieldCell"; title = "Not Installed Applications"; ObjectID = "bCi-r8-MrK"; */ "bCi-r8-MrK.title" = "未安装的应用"; /* Class = "NSTextFieldCell"; title = "Installed Supported Applications"; ObjectID = "bT7-LU-sov"; */ "bT7-LU-sov.title" = "已安装的受支持的应用"; /* Class = "NSTextFieldCell"; title = "Open with default Editor:"; ObjectID = "bvy-v3-hhf"; */ "bvy-v3-hhf.title" = "打开默认编辑器:"; /* Class = "NSButtonCell"; title = "PayPal"; ObjectID = "dC4-C7-fEL"; */ "dC4-C7-fEL.title" = "PayPal"; /* Class = "NSButtonCell"; title = "github.com/Ji4n1ng/OpenInTerminal"; ObjectID = "f2V-P5-pQI"; */ "f2V-P5-pQI.title" = "github.com/Ji4n1ng/OpenInTerminal"; /* Class = "NSTextFieldCell"; title = "Terminal"; ObjectID = "fA9-Hd-yjp"; */ "fA9-Hd-yjp.title" = "Terminal"; /* Class = "NSButtonCell"; title = "Quick Toggle"; ObjectID = "gy9-lb-m8d"; */ "gy9-lb-m8d.title" = "快速启动"; /* Class = "NSTextFieldCell"; title = "Reset"; ObjectID = "jcs-Ou-OZ2"; */ "jcs-Ou-OZ2.title" = "重置"; /* Class = "NSButtonCell"; title = "Reset preferences"; ObjectID = "jyI-H7-qN3"; */ "jyI-H7-qN3.title" = "重置设置"; /* Class = "NSViewController"; title = "About"; ObjectID = "k6X-N1-mVu"; */ "k6X-N1-mVu.title" = "关于"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal"; ObjectID = "mOB-su-ZM1"; */ "mOB-su-ZM1.title" = "OpenInTerminal"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "mTs-8c-pgj"; */ "mTs-8c-pgj.title" = "窗口"; /* Class = "NSButtonCell"; title = "Tab"; ObjectID = "nYS-rF-JCL"; */ "nYS-rF-JCL.title" = "标签页"; /* Class = "NSTextFieldCell"; title = "OpenInTerminal will automatically launch at login."; ObjectID = "ngT-lX-vFA"; */ "ngT-lX-vFA.title" = "启用后,OpenInTerminal 将会在登录时自动启动。"; /* Class = "NSViewController"; title = "Toolbar"; ObjectID = "s5W-qL-1Xs"; */ "s5W-qL-1Xs.title" = "自定义"; /* Class = "NSButtonCell"; title = "Hide Context Menu Items"; ObjectID = "sG4-nK-ghj"; */ "sG4-nK-ghj.title" = "隐藏上下文菜单项"; /* Class = "NSButtonCell"; title = "Window"; ObjectID = "sik-wU-ZF2"; */ "sik-wU-ZF2.title" = "窗口"; /* Class = "NSButtonCell"; title = "@Ji4n1ng"; ObjectID = "tR5-me-DTK"; */ "tR5-me-DTK.title" = "@Ji4n1ng"; /* Class = "NSTextFieldCell"; title = "iTerm"; ObjectID = "yIW-2a-15A"; */ "yIW-2a-15A.title" = "iTerm"; /* Class = "NSButtonCell"; title = "Apply to Finder Toolbar Menu"; ObjectID = "2we-f7-s2N"; */ "2we-f7-s2N.title" = "应用到访达工具栏菜单"; /* Class = "NSButtonCell"; title = "Apply to Finder Context Menu"; ObjectID = "RhP-R5-Wwt"; */ "RhP-R5-Wwt.title" = "应用到访达上下文菜单"; /* Class = "NSTextFieldCell"; title = "Custom Menu Options"; ObjectID = "nWc-SM-Kes"; */ "nWc-SM-Kes.title" = "自定义菜单选项"; /* Class = "NSTextFieldCell"; title = "Icon Type:"; ObjectID = "CP0-Xv-uYl"; */ "CP0-Xv-uYl.title" = "图标类型:"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "Cp7-6g-ngj"; */ "Cp7-6g-ngj.title" = "取消"; /* Class = "NSButtonCell"; title = "Terminal"; ObjectID = "M3w-T0-vi7"; */ "M3w-T0-vi7.title" = "终端"; /* Class = "NSTextFieldCell"; title = "Application Type:"; ObjectID = "UCM-Ds-LYN"; */ "UCM-Ds-LYN.title" = "应用类型:"; /* Class = "NSButtonCell"; title = "Editor"; ObjectID = "fb4-Xq-he0"; */ "fb4-Xq-he0.title" = "编辑器"; /* Class = "NSTextFieldCell"; title = "Application Name:"; ObjectID = "h5X-oY-gqy"; */ "h5X-oY-gqy.title" = "应用名称:"; /* Class = "NSButtonCell"; title = "original"; ObjectID = "uok-iD-wXY"; */ "uok-iD-wXY.title" = "原始"; /* Class = "NSButtonCell"; title = "Confirm"; ObjectID = "wpb-Gv-KAp"; */ "wpb-Gv-KAp.title" = "确认"; /* Class = "NSButtonCell"; title = "no"; ObjectID = "x6U-9Q-ujh"; */ "x6U-9Q-ujh.title" = "无"; /* Class = "NSButtonCell"; title = "simple"; ObjectID = "yrq-LZ-XDr"; */ "yrq-LZ-XDr.title" = "简单"; /* Class = "NSTextFieldCell"; title = "Quit"; ObjectID = "FBK-9S-cZf"; */ "FBK-9S-cZf.title" = "退出"; /* Class = "NSButtonCell"; title = "Quit OpenInTerminal"; ObjectID = "ofD-rA-gib"; */ "ofD-rA-gib.title" = "退出 OpenInTerminal"; ================================================ FILE: OpenInTerminal/ScriptGenerator.swift ================================================ // // ScriptGenerator.swift // OpenInTerminal // // Created by Jianing Wang on 2019/10/15. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation import OpenInTerminalCore /// Install AppleScripts to $HOME/Library/Application Scripts/wang.jianing.app.OpenInTerminalFinderExtension func checkScripts() throws { guard var scriptFolderPath = try? FileManager.default.url(for: .applicationScriptsDirectory, in: .userDomainMask, appropriateFor: nil, create: true) else { throw OITMError.cannotAccessPath("$HOME/Library/Application Scripts/wang.jianing.app.OpenInTerminal") } scriptFolderPath.deleteLastPathComponent() let finderExScriptPath = scriptFolderPath.appendingPathComponent(Constants.Id.FinderExtension) if !FileManager.default.fileExists(atPath: finderExScriptPath.path) { try FileManager.default.createDirectory(atPath: finderExScriptPath.path, withIntermediateDirectories: true, attributes: nil) } func writeScriptIfNeeded(at path: URL, with script: String) throws { if FileManager.default.fileExists(atPath: path.path) { // check if the existing file's content is the same as `script` let existingScript = try String(contentsOf: path, encoding: String.Encoding.utf8) if existingScript == script { // don't need to write again return } } try script.write(to: path, atomically: true, encoding: String.Encoding.utf8) } // write general script let generalScriptName = ScriptManager.shared.getGeneralScriptName() let generalScriptPath = finderExScriptPath .appendingPathComponent(generalScriptName) .appendingPathExtension("scpt") let generalScript = ScriptManager.shared.getGeneralScript() try writeScriptIfNeeded(at: generalScriptPath, with: generalScript) // write terminal new tab script let tabScriptName = ScriptManager.shared.getTerminalNewTabScriptName() let tabScriptPath = finderExScriptPath .appendingPathComponent(tabScriptName) .appendingPathExtension("scpt") let tabScript = ScriptManager.shared.getTerminalNewTabAppleScript() try writeScriptIfNeeded(at: tabScriptPath, with: tabScript) } ================================================ FILE: OpenInTerminal/StatusMenuController.swift ================================================ // // StatusMenuController.swift // OpenInTerminal // // Created by Jianing Wang on 2019/4/30. // Copyright © 2019 Jianing Wang. All rights reserved. // import Cocoa import OpenInTerminalCore import ShortcutRecorder class StatusMenuController: NSObject, NSMenuDelegate { @IBOutlet weak var statusMenu: NSMenu! @IBOutlet weak var defaultTerminalMenuItem: NSMenuItem! @IBOutlet weak var defaultEditorMenuItem: NSMenuItem! @IBOutlet weak var copyPathMenuItem: NSMenuItem! @IBOutlet weak var preferencesMenuItem: NSMenuItem! @IBOutlet weak var quitMenuItem: NSMenuItem! // MARK: Menu life cycle func setMenuItemTitle() { var terminalTitle = "" if let terminal = DefaultsManager.shared.defaultTerminal { terminalTitle = NSLocalizedString("menu.open_in", comment: "Open in ") + terminal.name } else { terminalTitle = NSLocalizedString("menu.open_with_default_terminal", comment: "Open with default Terminal") } defaultTerminalMenuItem.title = terminalTitle var editorTitle = "" if let editor = DefaultsManager.shared.defaultEditor { editorTitle = NSLocalizedString("menu.open_in", comment: "Open in ") + editor.name } else { editorTitle = NSLocalizedString("menu.open_with_default_editor", comment: "Open with default Editor") } defaultEditorMenuItem.title = editorTitle } override func awakeFromNib() { Log.logger.directory = "~/Library/Logs/OpenInTerminal" #if DEBUG Log.logger.name = "OpenInTerminal-debug" #else Log.logger.name = "OpenInTerminal" #endif //Edit printToConsole parameter in Edit Scheme > Run > Arguments > Environment Variables Log.logger.printToConsole = ProcessInfo.processInfo.environment["print_log"] == "true" statusMenu.delegate = self copyPathMenuItem.title = NSLocalizedString("menu.copy_path_to_clipboard", comment: "Copy path to Clipboard") preferencesMenuItem.title = NSLocalizedString("menu.preferences", comment: "Preferences...") quitMenuItem.title = NSLocalizedString("menu.quit", comment: "Quit") } func menuWillOpen(_ menu: NSMenu) { setMenuItemTitle() let menuItems: [(NSMenuItem, String)] = [(defaultTerminalMenuItem, Constants.Key.defaultTerminalShortcut), (defaultEditorMenuItem, Constants.Key.defaultEditorShortcut), (copyPathMenuItem, Constants.Key.copyPathShortcut)] menuItems.forEach { item, key in assignKeyboardShortcutToMenuItem(item, userDefaultsKey: key) } } func assignKeyboardShortcutToMenuItem(_ menuItem: NSMenuItem, userDefaultsKey key: String) { if let shortcutDict = Defaults.value(forKey: key), let shortcut = Shortcut(dictionary: shortcutDict as! [AnyHashable : Any]) { menuItem.keyEquivalentModifierMask = shortcut.modifierFlags menuItem.keyEquivalent = shortcut.characters ?? "" } else { menuItem.keyEquivalentModifierMask = [] menuItem.keyEquivalent = "" } } // MARK: Menu Item Actions @IBAction func openDefaultTerminal(_ sender: NSMenuItem) { (NSApplication.shared.delegate as? AppDelegate)?.openDefaultTerminal() } @IBAction func openDefaultEditor(_ sender: NSMenuItem) { (NSApplication.shared.delegate as? AppDelegate)?.openDefaultEditor() } @IBAction func copyPathToClipboard(_ sender: NSMenuItem) { (NSApplication.shared.delegate as? AppDelegate)?.copyPathToClipboard() } @IBAction func showPreferences(_ sender: NSMenuItem) { (NSApplication.shared.delegate as? AppDelegate)?.showPreferencesWindow() } @IBAction func quit(_ sender: NSMenuItem) { LaunchNotifier.postNotification(.terminateApp, object: Bundle.main.bundleIdentifier!) NSApp.terminate(self) } } ================================================ FILE: OpenInTerminal/de.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal Created by Jianing Wang on 2019/4/22. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "Okay"; "general.cancel" = "Abbrechen"; "general.yes" = "Ja"; "menu.open_in" = "Öffnen mit "; "menu.open_with_default_terminal" = "Im Terminal öffnen"; "menu.open_with_default_editor" = "Im Editor öffnen"; "menu.copy_path_to_clipboard" = "Pfad kopieren"; "menu.new_file" = "Neue Datei"; "menu.preferences" = "Einstellungen..."; "menu.quit" = "Beenden"; "pref.toolbar.not_installed" = "Nicht installiert"; "alert.pick_terminal_title" = "Öffnen mit?"; "alert.pick_terminal_description" = "Bitte wählen Sie eines der folgenden Terminals als Standard zum Öffnen."; "alert.pick_editor_title" = "Öffnen mit?"; "alert.pick_editor_description" = "Bitte wählen Sie eines der folgenden Editoren als Standard zum Öffnen."; "alert.reset_preferences_title" = "Benutzereinstellungen zurücksetzen?"; "alert.reset_preferences_description" = "⚠️ Beachten Sie, dass dadurch alle Benutzereinstellungen zurückgesetzt werden"; "toolbar.item_name" = "Im Terminal öffnen"; "toolbar.item_tooltip" = "Aktuellen Ordner im Terminal öffnen."; "pref.custom.menu.installed_supported" = "Installierte unterstützte Programme"; "pref.custom.menu.all_supported" = "Alle unterstützten Programme"; "pref.custom.menu.running_apps" = "Laufende Programme"; "pref.custom.menu.manually_select" = "Manuell vom Finder auswählen"; "pref.custom.menu.manually_input" = "Manuelle Eingabe"; ================================================ FILE: OpenInTerminal/en.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal Created by Jianing Wang on 2019/4/22. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Cancel"; "general.yes" = "Yes"; "menu.open_in" = "Open in "; "menu.open_with_default_terminal" = "Open in Terminal"; "menu.open_with_default_editor" = "Open in Editor"; "menu.copy_path_to_clipboard" = "Copy path"; "menu.new_file" = "New file"; "menu.preferences" = "Preferences..."; "menu.quit" = "Quit"; "pref.toolbar.not_installed" = "Not Installed"; "alert.pick_terminal_title" = "Open In?"; "alert.pick_terminal_description" = "Please select one of the following terminals as the default terminal to open."; "alert.pick_editor_title" = "Open In?"; "alert.pick_editor_description" = "Please select one of the following editors as the default editor to open."; "alert.reset_preferences_title" = "Reset User Preferences?"; "alert.reset_preferences_description" = "⚠️ Note that this will reset all user preferences"; "toolbar.item_name" = "Open in Terminal"; "toolbar.item_tooltip" = "Open current directory in Terminal."; "pref.custom.menu.installed_supported" = "Installed Supported Apps"; "pref.custom.menu.all_supported" = "All Supported Apps"; "pref.custom.menu.running_apps" = "Running Apps"; "pref.custom.menu.manually_select" = "Manually Select From Finder"; "pref.custom.menu.manually_input" = "Manually Input"; ================================================ FILE: OpenInTerminal/es.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal Created by Jianing Wang on 2019/4/22. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Cancelar"; "general.yes" = "Sí"; "menu.open_in" = "Abrir en "; "menu.open_with_default_terminal" = "Abrir en Terminal"; "menu.open_with_default_editor" = "Abrir en Editor"; "menu.copy_path_to_clipboard" = "Copiar ruta"; "menu.new_file" = "Nuevo archivo"; "menu.preferences" = "Preferencias..."; "menu.quit" = "Salir"; "pref.toolbar.not_installed" = "No instalado"; "alert.pick_terminal_title" = "Abrir en?"; "alert.pick_terminal_description" = "Seleccione una de las siguientes terminales como terminal predeterminado."; "alert.pick_editor_title" = "Abrir en?"; "alert.pick_editor_description" = "Seleccione uno de los siguientes editores como editor predeterminado."; "alert.reset_preferences_title" = "Restablecer preferencias de usuario?"; "alert.reset_preferences_description" = "⚠️ Esto restablecerá todas las preferencias del usuario"; "toolbar.item_name" = "Abrir en Terminal"; "toolbar.item_tooltip" = "Abrir el directorio actual en la Terminal."; ================================================ FILE: OpenInTerminal/fr.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal Created by Jianing Wang on 2019/4/22. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Annuler"; "general.yes" = "Oui"; "menu.open_in" = "Ouvrir dans "; "menu.open_with_default_terminal" = "Ouvrir dans le terminal"; "menu.open_with_default_editor" = "Ouvrir dans l'éditeur"; "menu.copy_path_to_clipboard" = "Copier le chemin d’accès"; "menu.new_file" = "Nouveau fichier"; "menu.preferences" = "Préférences..."; "menu.quit" = "Quitter"; "pref.toolbar.not_installed" = "Pas installé"; "alert.pick_terminal_title" = "Ouvrir avec?"; "alert.pick_terminal_description" = "Veuillez sélectionner l’un de ses terminaux ci-dessous pour être utilisé comme terminal par défaut."; "alert.pick_editor_title" = "Ouvrir avec?"; "alert.pick_editor_description" = "Veuillez sélectionner l’un de ses éditeurs ci-dessous pour être utilisé comme éditeur par défaut."; "alert.reset_preferences_title" = "Réinitialiser les préférences l’utilisateur?"; "alert.reset_preferences_description" = "⚠️ Notez que cela réinitialisera toutes les préférences de l'utilisateur"; "toolbar.item_name" = "Ouvrir dans le terminal"; "toolbar.item_tooltip" = "Ouvrir le dossier actuel dans le terminal"; ================================================ FILE: OpenInTerminal/it.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal Created by arendruni on 2020/4/8. Copyright © 2020 arendruni. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Annulla"; "general.yes" = "Sì"; "menu.open_in" = "Apri in "; "menu.open_with_default_terminal" = "Apri in Terminale"; "menu.open_with_default_editor" = "Apri nell'Editor"; "menu.copy_path_to_clipboard" = "Copia percorso"; "menu.new_file" = "Nuovo file"; "menu.preferences" = "Preferenze..."; "menu.quit" = "Esci"; "pref.toolbar.not_installed" = "Non Installato"; "alert.pick_terminal_title" = "Apri con?"; "alert.pick_terminal_description" = "Seleziona uno dei seguenti terminali per impostarlo come terminale default."; "alert.pick_editor_title" = "Apri con?"; "alert.pick_editor_description" = "Seleziona uno dei seguenti editor per impostarlo come editor di default."; "alert.reset_preferences_title" = "Ripristinare le Preferenze utente?"; "alert.reset_preferences_description" = "⚠️ Tutte le Preferenze utente saranno ripristinate"; "toolbar.item_name" = "Apri in Terminale"; "toolbar.item_tooltip" = "Apri la cartella corrente in Terminale."; ================================================ FILE: OpenInTerminal/ko.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal Created by Jianing Wang on 2019/4/22. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "확인"; "general.cancel" = "취소"; "general.yes" = "승인"; "menu.open_in" = "다음으로 열기: "; "menu.open_with_default_terminal" = "터미널에서 열기"; "menu.open_with_default_editor" = "에디터에서 열기"; "menu.copy_path_to_clipboard" = "위치 복사하기"; "menu.new_file" = "새 파일"; "menu.preferences" = "설정..."; "menu.quit" = "종료"; "pref.toolbar.not_installed" = "설치되지 않음"; "alert.pick_terminal_title" = "어디서 열까요?"; "alert.pick_terminal_description" = "다음 터미널 중 기본 터미널로 사용할 하나를 선택해주세요."; "alert.pick_editor_title" = "어디서 열까요?"; "alert.pick_editor_description" = "다음 에디터들 중 기본 에디터로 사용할 하나를 선택해주세요."; "alert.reset_preferences_title" = "사용자 설정을 초기화할까요?"; "alert.reset_preferences_description" = "⚠️ 모든 사용자 설정이 초기화됩니다."; "toolbar.item_name" = "터미널에서 열기"; "toolbar.item_tooltip" = "현재 디렉토리를 터미널에서 엽니다."; "pref.custom.menu.installed_supported" = "설치된 지원되는 앱"; "pref.custom.menu.all_supported" = "모든 지원되는 앱"; "pref.custom.menu.running_apps" = "실행중인 앱"; "pref.custom.menu.manually_select" = "Finder에서 수동으로 선택"; "pref.custom.menu.manually_input" = "수동으로 입력"; ================================================ FILE: OpenInTerminal/ru.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal Created by Egor Lazarev on 2020/1/30. Copyright © 2019 Egor Lazarev. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Отменить"; "general.yes" = "Да"; "menu.open_in" = "Открыть в "; "menu.open_with_default_terminal" = "Открыть через Терминал"; "menu.open_with_default_editor" = "Открыть в редакторе"; "menu.copy_path_to_clipboard" = "Скопировать путь"; "menu.new_file" = "Новый файл"; "menu.preferences" = "Настройки..."; "menu.quit" = "Выйти"; "pref.toolbar.not_installed" = "Не установлено"; "alert.pick_terminal_title" = "Открыть в?"; "alert.pick_terminal_description" = "Пожалуйста, выберите один из доступных терминалов для установки по-умолчанию."; "alert.pick_editor_title" = "Открыть в?"; "alert.pick_editor_description" = "Пожалуйста, выберите один из доступных редакторов для установки по-умолчанию."; "alert.reset_preferences_title" = "Сбросить пользовательские настройки?"; "alert.reset_preferences_description" = "⚠️ Все пользовательские настройки будут сброшены"; "toolbar.item_name" = "Открыть через Терминал"; "toolbar.item_tooltip" = "Открыть текущую директорию через Терминал."; ================================================ FILE: OpenInTerminal/tr.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal Created by Jianing Wang on 2019/4/22. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "Tamam"; "general.cancel" = "İptal"; "general.yes" = "Evet"; "menu.open_in" = "Şununla Aç: "; "menu.open_with_default_terminal" = "Terminal ile aç"; "menu.open_with_default_editor" = "Düzenleyici ile aç"; "menu.copy_path_to_clipboard" = "Yolu kopyala"; "menu.new_file" = "Yeni dosya"; "menu.preferences" = "Tercihler..."; "menu.quit" = "Çık"; "pref.toolbar.not_installed" = "Yüklü Değil"; "alert.pick_terminal_title" = "Şununla Aç?"; "alert.pick_terminal_description" = "Lütfen belirtilen terminallerden birini varsayılan olarak ayarlamak için seçin."; "alert.pick_editor_title" = "Şununla Aç?"; "alert.pick_editor_description" = "Lütfen belirtilen düzenleyicilerden birini varsayılan olarak ayarlamak için seçin."; "alert.reset_preferences_title" = "Kullanıcı Tercihlerini Sıfırla?"; "alert.reset_preferences_description" = "⚠️ Bu bütün kullanıcı tercihlerini sıfırlayacaktır."; "toolbar.item_name" = "Terminal ile aç"; "toolbar.item_tooltip" = "Konumu terminal ile aç."; "pref.custom.menu.installed_supported" = "Yüklünmiş Desteklenen Uygulamalar"; "pref.custom.menu.all_supported" = "Bütün Desteklenen Uygulamalar"; "pref.custom.menu.running_apps" = "Çalışan Uygulamalar"; "pref.custom.menu.manually_select" = "Elle Finder üzerinden seç"; "pref.custom.menu.manually_input" = "Elle Giriş"; ================================================ FILE: OpenInTerminal/zh-Hans.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal Created by Jianing Wang on 2019/4/22. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "好"; "general.cancel" = "取消"; "general.yes" = "是的"; "menu.open_in" = "打开 "; "menu.open_with_default_terminal" = "打开终端"; "menu.open_with_default_editor" = "打开编辑器"; "menu.copy_path_to_clipboard" = "拷贝路径"; "menu.new_file" = "新建文件"; "menu.preferences" = "偏好设置..."; "menu.quit" = "退出"; "pref.toolbar.not_installed" = "未安装"; "alert.pick_terminal_title" = "打开?"; "alert.pick_terminal_description" = "请在下面的终端中选择一个作为默认终端。"; "alert.pick_editor_title" = "打开?"; "alert.pick_editor_description" = "请在下面的编辑器中选择一个作为默认编辑器。"; "alert.reset_preferences_title" = "重置用户偏好设置?"; "alert.reset_preferences_description" = "⚠️ 注意这将会重置所有用户偏好设置"; "toolbar.item_name" = "Open in Terminal"; "toolbar.item_tooltip" = "打开当前路径到终端"; "pref.custom.menu.installed_supported" = "已安装的受支持的应用"; "pref.custom.menu.all_supported" = "所有受支持的应用"; "pref.custom.menu.running_apps" = "正在运行的应用"; "pref.custom.menu.manually_select" = "从访达中手动选择"; "pref.custom.menu.manually_input" = "手动输入"; ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "filename" : "icon_terminal_light_16.png", "idiom" : "mac", "scale" : "1x", "size" : "16x16" }, { "filename" : "icon_terminal_light_32.png", "idiom" : "mac", "scale" : "2x", "size" : "16x16" }, { "filename" : "icon_terminal_light_32-1.png", "idiom" : "mac", "scale" : "1x", "size" : "32x32" }, { "filename" : "icon_terminal_light_32@2x.png", "idiom" : "mac", "scale" : "2x", "size" : "32x32" }, { "filename" : "icon_terminal_light_128.png", "idiom" : "mac", "scale" : "1x", "size" : "128x128" }, { "filename" : "icon_terminal_light_128@2x.png", "idiom" : "mac", "scale" : "2x", "size" : "128x128" }, { "filename" : "icon_terminal_light_256.png", "idiom" : "mac", "scale" : "1x", "size" : "256x256" }, { "filename" : "icon_terminal_light_512.png", "idiom" : "mac", "scale" : "2x", "size" : "256x256" }, { "filename" : "icon_terminal_light_512-1.png", "idiom" : "mac", "scale" : "1x", "size" : "512x512" }, { "filename" : "icon_terminal_light_512@2x.png", "idiom" : "mac", "scale" : "2x", "size" : "512x512" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/Assets.xcassets/Contents.json ================================================ { "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/Error.swift ================================================ // // Error.swift // OpenInTerminal-Lite // // Created by Jianing Wang on 2019/4/21. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation enum OITLError: Error { case cannotGetTerminal } extension OITLError : CustomStringConvertible { var description: String { switch self { case .cannotGetTerminal: return "There is no default terminal. And user did not pick a terminal" } } } ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIconFile CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion 1 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) LSUIElement NSAppleEventsUsageDescription Please give permissions to access your Finder & Terminal NSHumanReadableCopyright Copyright © 2019 Jianing Wang. All rights reserved. NSPrincipalClass NSApplication ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/OpenInTerminal-Lite.entitlements ================================================ com.apple.security.automation.apple-events ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/OpenInTerminal_Lite.entitlements ================================================ com.apple.security.temporary-exception.apple-events com.apple.systemevents com.apple.Terminal com.apple.Finder com.googlecode.iterm2 co.zeit.hyper io.alacritty com.github.wez.wezterm org.tabby com.microsoft.VSCode com.github.atom com.sublimetext.3 ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/de.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal-Lite Created by Jianing Wang on 2019/5/16. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "Okay"; "general.cancel" = "Abbrechen"; "general.yes" = "Ja"; "alert.pick_terminal_title" = "Öffnen mit?"; "alert.pick_terminal_description" = "Bitte wählen Sie eines der folgenden Terminals als Standard zum Öffnen."; ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/en.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal-Lite Created by Jianing Wang on 2019/5/16. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Cancel"; "general.yes" = "Yes"; "alert.pick_terminal_title" = "Open In?"; "alert.pick_terminal_description" = "Please select one of the following terminals as the default terminal to open."; ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/es.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal-Lite Created by Jianing Wang on 2019/5/16. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Cancelar"; "general.yes" = "Sí"; "alert.pick_terminal_title" = "Abrir en?"; "alert.pick_terminal_description" = "Seleccione uno de los siguientes terminales como terminal predeterminado."; ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/fr.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal-Lite Created by Jianing Wang on 2019/5/16. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Annuler"; "general.yes" = "Oui"; "alert.pick_terminal_title" = "Ouvrir avec?"; "alert.pick_terminal_description" = "Veuillez sélectionner l’un de ses terminaux ci-dessous pour être utilisé comme terminal par défaut."; ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/it.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal-Lite Created by arendruni on 2020/4/9. Copyright © 2020 arendruni. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Annulla"; "general.yes" = "Sì"; "alert.pick_terminal_title" = "Apri con?"; "alert.pick_terminal_description" = "Seleziona uno dei seguenti terminali per impostarlo come terminale default."; ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/ko.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal-Lite Created by Fernando on 2019/11/23. Copyright © 2019 Fernando. All rights reserved. */ "general.ok" = "확인"; "general.cancel" = "닫기"; "general.yes" = "네"; "alert.pick_terminal_title" = "여시겠습니까?"; "alert.pick_terminal_description" = "다음 리스트에서 기본이 될 터미널 프로그램을 선택해주세요."; ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/main.swift ================================================ // // main.swift // OpenInTerminal-Lite // // Created by Jianing Wang on 2019/4/19. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation import OpenInTerminalCore do { if let terminalName = DefaultsManager.shared.liteDefaultTerminal { let terminal = App(name: terminalName, type: .terminal) try terminal.openOutsideSandbox() } else { guard let selectedTerminal = AppManager.shared.pickTerminalAlert() else { throw OITLError.cannotGetTerminal } DefaultsManager.shared.liteDefaultTerminal = selectedTerminal.name try selectedTerminal.openOutsideSandbox() } } catch { logw(error.localizedDescription) } ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/ru.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal-Lite Created by Jianing Wang on 2019/5/16. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "OK"; "general.cancel" = "Отменить"; "general.yes" = "Да"; "alert.pick_terminal_title" = "Открыть в?"; "alert.pick_terminal_description" = "Пожалуйста, выберите один из доступных терминалов для установки по-умолчанию."; ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/tr.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal-Lite Created by Jianing Wang on 2019/5/16. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "Tamam"; "general.cancel" = "İptal"; "general.yes" = "Evet"; "alert.pick_terminal_title" = "Şununla Aç?"; "alert.pick_terminal_description" = "Lütfen gösterilen terimnallerden birini varsayılan terminal olarak seçin."; ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite/zh-Hans.lproj/Localizable.strings ================================================ /* Localizable.strings OpenInTerminal-Lite Created by Jianing Wang on 2019/5/16. Copyright © 2019 Jianing Wang. All rights reserved. */ "general.ok" = "好"; "general.cancel" = "取消"; "general.yes" = "是的"; "alert.pick_terminal_title" = "打开?"; "alert.pick_terminal_description" = "请在下面的终端中选择一个作为默认终端。"; ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 50; objects = { /* Begin PBXBuildFile section */ 95163CE62269F0C3007C006F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95163CE52269F0C3007C006F /* Assets.xcassets */; }; 95163CF22269F104007C006F /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95163CF12269F104007C006F /* main.swift */; }; 95163CF42269F209007C006F /* OpenInTerminalCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95163CF32269F209007C006F /* OpenInTerminalCore.framework */; }; 95163CF52269F209007C006F /* OpenInTerminalCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 95163CF32269F209007C006F /* OpenInTerminalCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9590B69D226C715100362B93 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9590B69C226C715100362B93 /* Error.swift */; }; 95ECC130228CF99F00416AA2 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 95ECC132228CF99F00416AA2 /* Localizable.strings */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 95163CF62269F209007C006F /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 95163CF52269F209007C006F /* OpenInTerminalCore.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 2594E99727EF381A00AF84D5 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; 82AE667723896ADB00F4DB4D /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; 95163CE02269F0C2007C006F /* OpenInTerminal-Lite.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "OpenInTerminal-Lite.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 95163CE52269F0C3007C006F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 95163CEA2269F0C3007C006F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 95163CEB2269F0C3007C006F /* OpenInTerminal_Lite.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = OpenInTerminal_Lite.entitlements; sourceTree = ""; }; 95163CF12269F104007C006F /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 95163CF32269F209007C006F /* OpenInTerminalCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = OpenInTerminalCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9561BB4224C1F2FB001DE0A9 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; 9590B69C226C715100362B93 /* Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = ""; }; 9595D2A123BAD74D006CBB36 /* OpenInTerminal-Lite.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "OpenInTerminal-Lite.entitlements"; sourceTree = ""; }; 95B0613F27AFACA9009C2B4E /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; 95ECC131228CF99F00416AA2 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 95ECC133228CF9A100416AA2 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; 95ECC134228CF9A200416AA2 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; C3135D9D243F4CD3003323CF /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; E197D59B23E299B900C5A893 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 95163CDD2269F0C2007C006F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 95163CF42269F209007C006F /* OpenInTerminalCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 95163CD72269F0C2007C006F = { isa = PBXGroup; children = ( 95163CF32269F209007C006F /* OpenInTerminalCore.framework */, 95163CE22269F0C2007C006F /* OpenInTerminal-Lite */, 95163CE12269F0C2007C006F /* Products */, ); sourceTree = ""; }; 95163CE12269F0C2007C006F /* Products */ = { isa = PBXGroup; children = ( 95163CE02269F0C2007C006F /* OpenInTerminal-Lite.app */, ); name = Products; sourceTree = ""; }; 95163CE22269F0C2007C006F /* OpenInTerminal-Lite */ = { isa = PBXGroup; children = ( 9595D2A123BAD74D006CBB36 /* OpenInTerminal-Lite.entitlements */, 95163CF12269F104007C006F /* main.swift */, 9590B69C226C715100362B93 /* Error.swift */, 95163CE52269F0C3007C006F /* Assets.xcassets */, 95163CEA2269F0C3007C006F /* Info.plist */, 95163CEB2269F0C3007C006F /* OpenInTerminal_Lite.entitlements */, 95ECC132228CF99F00416AA2 /* Localizable.strings */, ); path = "OpenInTerminal-Lite"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 95163CDF2269F0C2007C006F /* OpenInTerminal-Lite */ = { isa = PBXNativeTarget; buildConfigurationList = 95163CEE2269F0C3007C006F /* Build configuration list for PBXNativeTarget "OpenInTerminal-Lite" */; buildPhases = ( 95163CDC2269F0C2007C006F /* Sources */, 95163CDD2269F0C2007C006F /* Frameworks */, 95163CDE2269F0C2007C006F /* Resources */, 95163CF62269F209007C006F /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "OpenInTerminal-Lite"; productName = "OpenInTerminal-Lite"; productReference = 95163CE02269F0C2007C006F /* OpenInTerminal-Lite.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 95163CD82269F0C2007C006F /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1020; LastUpgradeCheck = 1330; ORGANIZATIONNAME = "Jianing Wang"; TargetAttributes = { 95163CDF2269F0C2007C006F = { CreatedOnToolsVersion = 10.2.1; LastSwiftMigration = 1020; SystemCapabilities = { com.apple.Sandbox = { enabled = 0; }; }; }; }; }; buildConfigurationList = 95163CDB2269F0C2007C006F /* Build configuration list for PBXProject "OpenInTerminal-Lite" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, "zh-Hans", fr, ko, ru, it, es, tr, de, ); mainGroup = 95163CD72269F0C2007C006F; productRefGroup = 95163CE12269F0C2007C006F /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 95163CDF2269F0C2007C006F /* OpenInTerminal-Lite */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 95163CDE2269F0C2007C006F /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 95163CE62269F0C3007C006F /* Assets.xcassets in Resources */, 95ECC130228CF99F00416AA2 /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 95163CDC2269F0C2007C006F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 9590B69D226C715100362B93 /* Error.swift in Sources */, 95163CF22269F104007C006F /* main.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 95ECC132228CF99F00416AA2 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( 95ECC131228CF99F00416AA2 /* en */, 95ECC133228CF9A100416AA2 /* zh-Hans */, 95ECC134228CF9A200416AA2 /* fr */, 82AE667723896ADB00F4DB4D /* ko */, E197D59B23E299B900C5A893 /* ru */, C3135D9D243F4CD3003323CF /* it */, 9561BB4224C1F2FB001DE0A9 /* es */, 95B0613F27AFACA9009C2B4E /* tr */, 2594E99727EF381A00AF84D5 /* de */, ); name = Localizable.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 95163CEC2269F0C3007C006F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.9; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; 95163CED2269F0C3007C006F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.9; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; }; name = Release; }; 95163CEF2269F0C3007C006F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "OpenInTerminal-Lite/OpenInTerminal-Lite.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = Q33U8R4U57; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = "OpenInTerminal-Lite/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; MARKETING_VERSION = 1.2.7; PRODUCT_BUNDLE_IDENTIFIER = "wang.jianing.app.OpenInTerminal-Lite"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; }; name = Debug; }; 95163CF02269F0C3007C006F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "OpenInTerminal-Lite/OpenInTerminal-Lite.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = Q33U8R4U57; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = "OpenInTerminal-Lite/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; MARKETING_VERSION = 1.2.7; PRODUCT_BUNDLE_IDENTIFIER = "wang.jianing.app.OpenInTerminal-Lite"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 95163CDB2269F0C2007C006F /* Build configuration list for PBXProject "OpenInTerminal-Lite" */ = { isa = XCConfigurationList; buildConfigurations = ( 95163CEC2269F0C3007C006F /* Debug */, 95163CED2269F0C3007C006F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 95163CEE2269F0C3007C006F /* Build configuration list for PBXNativeTarget "OpenInTerminal-Lite" */ = { isa = XCConfigurationList; buildConfigurations = ( 95163CEF2269F0C3007C006F /* Debug */, 95163CF02269F0C3007C006F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 95163CD82269F0C2007C006F /* Project object */; } ================================================ FILE: OpenInTerminal-Lite/OpenInTerminal-Lite.xcodeproj/xcshareddata/xcschemes/OpenInTerminal-Lite.xcscheme ================================================ ================================================ FILE: OpenInTerminal.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 60; objects = { /* Begin PBXBuildFile section */ 4725251522680E87003C50DF /* OpenInTerminalCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 4725251322680E87003C50DF /* OpenInTerminalCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4725253122680EF3003C50DF /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4725253022680EF3003C50DF /* Constants.swift */; }; 4725253522680EFD003C50DF /* FinderManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4725253422680EFD003C50DF /* FinderManager.swift */; }; 4725254022680F5A003C50DF /* Terminal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4725253E22680F5A003C50DF /* Terminal.swift */; }; 4725254122680F5A003C50DF /* Finder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4725253F22680F5A003C50DF /* Finder.swift */; }; 4725254422680F7C003C50DF /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4725254222680F7C003C50DF /* Log.swift */; }; 472525592268100F003C50DF /* FinderAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 472525572268100F003C50DF /* FinderAssets.xcassets */; }; 4725255A2268100F003C50DF /* FinderSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472525582268100F003C50DF /* FinderSync.swift */; }; 4725256222681098003C50DF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4725256122681098003C50DF /* AppDelegate.swift */; }; 472525812268112F003C50DF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4725257E2268112F003C50DF /* Assets.xcassets */; }; 47252586226812AB003C50DF /* OpenInTerminalCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4725251122680E87003C50DF /* OpenInTerminalCore.framework */; }; 47252587226812AB003C50DF /* OpenInTerminalCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4725251122680E87003C50DF /* OpenInTerminalCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 4725258A226812AB003C50DF /* OpenInTerminalFinderExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 4725254A22680FEB003C50DF /* OpenInTerminalFinderExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 9511D8AC22749582008E52B9 /* LaunchNotifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9511D8AB22749582008E52B9 /* LaunchNotifier.swift */; }; 95163CD22269979E007C006F /* Notifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95163CD12269979E007C006F /* Notifier.swift */; }; 95163CD4226998ED007C006F /* OpenNotifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95163CD3226998ED007C006F /* OpenNotifier.swift */; }; 95163CD52269A09D007C006F /* Notifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95163CD12269979E007C006F /* Notifier.swift */; }; 95187380227DEF89000CCB3A /* OpenNotifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95163CD3226998ED007C006F /* OpenNotifier.swift */; }; 9518738C227DF492000CCB3A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9518738B227DF492000CCB3A /* AppDelegate.swift */; }; 95187390227DF493000CCB3A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9518738F227DF493000CCB3A /* Assets.xcassets */; }; 95187393227DF493000CCB3A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 95187391227DF493000CCB3A /* Main.storyboard */; }; 95187399227DF563000CCB3A /* Notifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95163CD12269979E007C006F /* Notifier.swift */; }; 9518739A227DF565000CCB3A /* LaunchNotifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9511D8AB22749582008E52B9 /* LaunchNotifier.swift */; }; 9518739C227DF655000CCB3A /* OpenInTerminalHelper.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 95187389227DF492000CCB3A /* OpenInTerminalHelper.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 951A3EBD2278A6F700E8DB61 /* StatusMenuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 951A3EBC2278A6F700E8DB61 /* StatusMenuController.swift */; }; 951A3EBF2278A70F00E8DB61 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 951A3EBE2278A70F00E8DB61 /* MainMenu.xib */; }; 9521EDCC226B475E008445D1 /* PreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9521EDCB226B475E008445D1 /* PreferencesViewController.swift */; }; 9521EDD0226B4BE6008445D1 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9521EDCF226B4BE6008445D1 /* Constants.swift */; }; 95294CE625B0270700CC995D /* CustomInputViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95294CE525B0270700CC995D /* CustomInputViewController.swift */; }; 95294CEB25B3252900CC995D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4725257E2268112F003C50DF /* Assets.xcassets */; }; 95294CFD25B3293F00CC995D /* Icons.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95294CFC25B3293F00CC995D /* Icons.xcassets */; }; 95294CFE25B3293F00CC995D /* Icons.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95294CFC25B3293F00CC995D /* Icons.xcassets */; }; 95294D0825B3E17900CC995D /* Icons.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95294CFC25B3293F00CC995D /* Icons.xcassets */; }; 954D67CF235570D5007702D0 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954D67CE235570D5007702D0 /* Error.swift */; }; 954D67D12355AD36007702D0 /* ScriptGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954D67D02355AD36007702D0 /* ScriptGenerator.swift */; }; 954D67D22355F80E007702D0 /* OpenInTerminalCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4725251122680E87003C50DF /* OpenInTerminalCore.framework */; }; 954D67D32355F80E007702D0 /* OpenInTerminalCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4725251122680E87003C50DF /* OpenInTerminalCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 955A93BF2D1C31C7001C7A45 /* Preferences.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 955A93BE2D1C31C7001C7A45 /* Preferences.storyboard */; }; 955A93C02D1C31C7001C7A45 /* Preferences.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 955A93BE2D1C31C7001C7A45 /* Preferences.storyboard */; }; 955C01322D3C3C6E003AF605 /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9557D3D42274A78C00CE34FA /* ServiceManagement.framework */; }; 955C01352D3C3C9A003AF605 /* ShortcutRecorder in Frameworks */ = {isa = PBXBuildFile; productRef = 955C01342D3C3C9A003AF605 /* ShortcutRecorder */; }; 9571DA84227E6FFF0076AA64 /* AdvancedPreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9571DA83227E6FFF0076AA64 /* AdvancedPreferencesViewController.swift */; }; 9584EAB82CF06A500080F94F /* PathExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9584EAB72CF06A500080F94F /* PathExtensions.swift */; }; 9584EDF2226DEF79003C7EE8 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9584EDF4226DEF79003C7EE8 /* Localizable.strings */; }; 9590B68E226C04E000362B93 /* Defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9590B68D226C04E000362B93 /* Defaults.swift */; }; 9590B69F226CBC0000362B93 /* GeneralPreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9590B69E226CBC0000362B93 /* GeneralPreferencesViewController.swift */; }; 9590B6A1226CBC1D00362B93 /* CustomPreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9590B6A0226CBC1D00362B93 /* CustomPreferencesViewController.swift */; }; 9592D637258CB9210031CA30 /* AppManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9592D636258CB9210031CA30 /* AppManager.swift */; }; 95BAA1822279E28D005E1DAC /* AboutPreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95BAA1812279E28D005E1DAC /* AboutPreferencesViewController.swift */; }; 95C6C340227AA1CB00F157C4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9584EDF4226DEF79003C7EE8 /* Localizable.strings */; }; 95C6C341227AA1D000F157C4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9584EDF4226DEF79003C7EE8 /* Localizable.strings */; }; 95C7C2EE257B7D63004C8355 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C7C2ED257B7D63004C8355 /* App.swift */; }; 95C7C2F2257B7E1E004C8355 /* SupportedApps.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C7C2F1257B7E1E004C8355 /* SupportedApps.swift */; }; 95CE277E257E470F0053D76A /* ScriptManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CE277D257E470F0053D76A /* ScriptManager.swift */; }; 95CE2789257F2F3A0053D76A /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CE2788257F2F3A0053D76A /* Error.swift */; }; 95DD6296243B211B003550B3 /* ArrayExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95DD6295243B211B003550B3 /* ArrayExtensions.swift */; }; 95DFC1242354A2C300941D3A /* DefaultsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95DFC1232354A2C300941D3A /* DefaultsManager.swift */; }; 95F5BED5227734E800D505A0 /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F5BED4227734E800D505A0 /* PreferencesWindowController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 47252588226812AB003C50DF /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 956C38A9225F7701001CB769 /* Project object */; proxyType = 1; remoteGlobalIDString = 4725251022680E87003C50DF; remoteInfo = OpenInTerminalCore; }; 4725258B226812AB003C50DF /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 956C38A9225F7701001CB769 /* Project object */; proxyType = 1; remoteGlobalIDString = 4725254922680FEB003C50DF; remoteInfo = OpenInTerminalFinderExtension; }; 954D67D42355F80E007702D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 956C38A9225F7701001CB769 /* Project object */; proxyType = 1; remoteGlobalIDString = 4725251022680E87003C50DF; remoteInfo = OpenInTerminalCore; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ 4725258D226812AB003C50DF /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 47252587226812AB003C50DF /* OpenInTerminalCore.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; 4725258E226812AB003C50DF /* Embed App Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 13; files = ( 4725258A226812AB003C50DF /* OpenInTerminalFinderExtension.appex in Embed App Extensions */, ); name = "Embed App Extensions"; runOnlyForDeploymentPostprocessing = 0; }; 9511D8B32274A25A008E52B9 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstPath = Contents/Library/LoginItems; dstSubfolderSpec = 1; files = ( 9518739C227DF655000CCB3A /* OpenInTerminalHelper.app in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 1; }; 954D67D62355F80E007702D0 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 954D67D32355F80E007702D0 /* OpenInTerminalCore.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 2594E99B27EF523300AF84D5 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; 4725251122680E87003C50DF /* OpenInTerminalCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OpenInTerminalCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4725251322680E87003C50DF /* OpenInTerminalCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenInTerminalCore.h; sourceTree = ""; }; 4725251422680E87003C50DF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4725253022680EF3003C50DF /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; 4725253422680EFD003C50DF /* FinderManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FinderManager.swift; sourceTree = ""; }; 4725253E22680F5A003C50DF /* Terminal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Terminal.swift; sourceTree = ""; }; 4725253F22680F5A003C50DF /* Finder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Finder.swift; sourceTree = ""; }; 4725254222680F7C003C50DF /* Log.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = ""; }; 4725254322680F7C003C50DF /* Error.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = ""; }; 4725254A22680FEB003C50DF /* OpenInTerminalFinderExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = OpenInTerminalFinderExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 4725254E22680FEB003C50DF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4725254F22680FEB003C50DF /* OpenInTerminalFinderExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = OpenInTerminalFinderExtension.entitlements; sourceTree = ""; }; 472525572268100F003C50DF /* FinderAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = FinderAssets.xcassets; sourceTree = ""; }; 472525582268100F003C50DF /* FinderSync.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FinderSync.swift; sourceTree = ""; }; 4725255F22681098003C50DF /* OpenInTerminal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OpenInTerminal.app; sourceTree = BUILT_PRODUCTS_DIR; }; 4725256122681098003C50DF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 4725257D2268112F003C50DF /* OpenInTerminal.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = OpenInTerminal.entitlements; sourceTree = ""; }; 4725257E2268112F003C50DF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 4725257F2268112F003C50DF /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9511D8AB22749582008E52B9 /* LaunchNotifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchNotifier.swift; sourceTree = ""; }; 95163CD12269979E007C006F /* Notifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notifier.swift; sourceTree = ""; }; 95163CD3226998ED007C006F /* OpenNotifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenNotifier.swift; sourceTree = ""; }; 95187389227DF492000CCB3A /* OpenInTerminalHelper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OpenInTerminalHelper.app; sourceTree = BUILT_PRODUCTS_DIR; }; 9518738B227DF492000CCB3A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 9518738F227DF493000CCB3A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 95187392227DF493000CCB3A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 95187394227DF493000CCB3A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 95187395227DF493000CCB3A /* OpenInTerminalHelper.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = OpenInTerminalHelper.entitlements; sourceTree = ""; }; 951A3EBC2278A6F700E8DB61 /* StatusMenuController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMenuController.swift; sourceTree = ""; }; 951A3EBE2278A70F00E8DB61 /* MainMenu.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = ""; }; 9521EDCB226B475E008445D1 /* PreferencesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesViewController.swift; sourceTree = ""; }; 9521EDCF226B4BE6008445D1 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; 95294CE525B0270700CC995D /* CustomInputViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomInputViewController.swift; sourceTree = ""; }; 95294CFC25B3293F00CC995D /* Icons.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Icons.xcassets; sourceTree = ""; }; 954D67CE235570D5007702D0 /* Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = ""; }; 954D67D02355AD36007702D0 /* ScriptGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScriptGenerator.swift; sourceTree = ""; }; 9557D3D42274A78C00CE34FA /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; }; 955A93BD2D1C31C7001C7A45 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Preferences.storyboard; sourceTree = ""; }; 955A93C12D1C31C7001C7A45 /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/Preferences.xcstrings; sourceTree = ""; }; 9571DA83227E6FFF0076AA64 /* AdvancedPreferencesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedPreferencesViewController.swift; sourceTree = ""; }; 9584EAB72CF06A500080F94F /* PathExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PathExtensions.swift; sourceTree = ""; }; 9584EDF3226DEF79003C7EE8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 9584EDF5226DEFC0003C7EE8 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; 9590B68D226C04E000362B93 /* Defaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Defaults.swift; sourceTree = ""; }; 9590B69E226CBC0000362B93 /* GeneralPreferencesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralPreferencesViewController.swift; sourceTree = ""; }; 9590B6A0226CBC1D00362B93 /* CustomPreferencesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomPreferencesViewController.swift; sourceTree = ""; }; 9592D636258CB9210031CA30 /* AppManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppManager.swift; sourceTree = ""; }; 95B0613E27AFABD5009C2B4E /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; 95BAA1812279E28D005E1DAC /* AboutPreferencesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutPreferencesViewController.swift; sourceTree = ""; }; 95C7C2ED257B7D63004C8355 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; 95C7C2F1257B7E1E004C8355 /* SupportedApps.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportedApps.swift; sourceTree = ""; }; 95CE277D257E470F0053D76A /* ScriptManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScriptManager.swift; sourceTree = ""; }; 95CE2788257F2F3A0053D76A /* Error.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = ""; }; 95DD6295243B211B003550B3 /* ArrayExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrayExtensions.swift; sourceTree = ""; }; 95DFC1232354A2C300941D3A /* DefaultsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsManager.swift; sourceTree = ""; }; 95F5BED4227734E800D505A0 /* PreferencesWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = ""; }; 95FC9243228BAAD600F51DF2 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; C1FB06722493518B004AF7B7 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; C3ACD4D0243E0FEF00462517 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; CE8306A1283D111D00C32E36 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; E197D59A23E2973800C5A893 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 4725250E22680E87003C50DF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 4725254722680FEB003C50DF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 954D67D22355F80E007702D0 /* OpenInTerminalCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 4725255C22681098003C50DF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 47252586226812AB003C50DF /* OpenInTerminalCore.framework in Frameworks */, 955C01352D3C3C9A003AF605 /* ShortcutRecorder in Frameworks */, 955C01322D3C3C6E003AF605 /* ServiceManagement.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 95187386227DF492000CCB3A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 4725251222680E87003C50DF /* OpenInTerminalCore */ = { isa = PBXGroup; children = ( 4725253022680EF3003C50DF /* Constants.swift */, 9590B68D226C04E000362B93 /* Defaults.swift */, 95DFC1232354A2C300941D3A /* DefaultsManager.swift */, 95CE2788257F2F3A0053D76A /* Error.swift */, 4725254222680F7C003C50DF /* Log.swift */, 4725253422680EFD003C50DF /* FinderManager.swift */, 95C7C2ED257B7D63004C8355 /* App.swift */, 9592D636258CB9210031CA30 /* AppManager.swift */, 95C7C2F1257B7E1E004C8355 /* SupportedApps.swift */, 95CE277D257E470F0053D76A /* ScriptManager.swift */, 4725253622680F07003C50DF /* ScriptingBridge */, 95DD6294243B2102003550B3 /* Extensions */, 4725251322680E87003C50DF /* OpenInTerminalCore.h */, 4725251422680E87003C50DF /* Info.plist */, ); path = OpenInTerminalCore; sourceTree = ""; }; 4725253622680F07003C50DF /* ScriptingBridge */ = { isa = PBXGroup; children = ( 4725253F22680F5A003C50DF /* Finder.swift */, 4725253E22680F5A003C50DF /* Terminal.swift */, ); path = ScriptingBridge; sourceTree = ""; }; 4725254B22680FEB003C50DF /* OpenInTerminalFinderExtension */ = { isa = PBXGroup; children = ( 472525572268100F003C50DF /* FinderAssets.xcassets */, 472525582268100F003C50DF /* FinderSync.swift */, 4725254E22680FEB003C50DF /* Info.plist */, 4725254F22680FEB003C50DF /* OpenInTerminalFinderExtension.entitlements */, ); path = OpenInTerminalFinderExtension; sourceTree = ""; }; 4725256022681098003C50DF /* OpenInTerminal */ = { isa = PBXGroup; children = ( 4725256122681098003C50DF /* AppDelegate.swift */, 954D67CE235570D5007702D0 /* Error.swift */, 9521EDCF226B4BE6008445D1 /* Constants.swift */, 951A3EBE2278A70F00E8DB61 /* MainMenu.xib */, 951A3EBC2278A6F700E8DB61 /* StatusMenuController.swift */, 954D67D02355AD36007702D0 /* ScriptGenerator.swift */, 9521EDD1226B4BEF008445D1 /* Notifier */, 9521EDC8226B3F41008445D1 /* PreferencesWindow */, 9511D8AA22748FD6008E52B9 /* Assets */, ); path = OpenInTerminal; sourceTree = ""; }; 4725258F22681424003C50DF /* Frameworks */ = { isa = PBXGroup; children = ( 4725254322680F7C003C50DF /* Error.swift */, 9557D3D42274A78C00CE34FA /* ServiceManagement.framework */, ); name = Frameworks; sourceTree = ""; }; 9511D8AA22748FD6008E52B9 /* Assets */ = { isa = PBXGroup; children = ( 4725257E2268112F003C50DF /* Assets.xcassets */, 95294CFC25B3293F00CC995D /* Icons.xcassets */, 4725257F2268112F003C50DF /* Info.plist */, 4725257D2268112F003C50DF /* OpenInTerminal.entitlements */, 9584EDF4226DEF79003C7EE8 /* Localizable.strings */, ); name = Assets; sourceTree = ""; }; 9518738A227DF492000CCB3A /* OpenInTerminalHelper */ = { isa = PBXGroup; children = ( 9518738B227DF492000CCB3A /* AppDelegate.swift */, 9518738F227DF493000CCB3A /* Assets.xcassets */, 95187391227DF493000CCB3A /* Main.storyboard */, 95187394227DF493000CCB3A /* Info.plist */, 95187395227DF493000CCB3A /* OpenInTerminalHelper.entitlements */, ); path = OpenInTerminalHelper; sourceTree = ""; }; 9521EDC8226B3F41008445D1 /* PreferencesWindow */ = { isa = PBXGroup; children = ( 955A93BE2D1C31C7001C7A45 /* Preferences.storyboard */, 95F5BED4227734E800D505A0 /* PreferencesWindowController.swift */, 9521EDCB226B475E008445D1 /* PreferencesViewController.swift */, 9590B69E226CBC0000362B93 /* GeneralPreferencesViewController.swift */, 9590B6A0226CBC1D00362B93 /* CustomPreferencesViewController.swift */, 95294CE525B0270700CC995D /* CustomInputViewController.swift */, 9571DA83227E6FFF0076AA64 /* AdvancedPreferencesViewController.swift */, 95BAA1812279E28D005E1DAC /* AboutPreferencesViewController.swift */, ); path = PreferencesWindow; sourceTree = ""; }; 9521EDD1226B4BEF008445D1 /* Notifier */ = { isa = PBXGroup; children = ( 95163CD12269979E007C006F /* Notifier.swift */, 95163CD3226998ED007C006F /* OpenNotifier.swift */, 9511D8AB22749582008E52B9 /* LaunchNotifier.swift */, ); path = Notifier; sourceTree = ""; }; 956C38A8225F7701001CB769 = { isa = PBXGroup; children = ( 4725256022681098003C50DF /* OpenInTerminal */, 4725251222680E87003C50DF /* OpenInTerminalCore */, 4725254B22680FEB003C50DF /* OpenInTerminalFinderExtension */, 9518738A227DF492000CCB3A /* OpenInTerminalHelper */, 956C38B2225F7701001CB769 /* Products */, 4725258F22681424003C50DF /* Frameworks */, ); sourceTree = ""; }; 956C38B2225F7701001CB769 /* Products */ = { isa = PBXGroup; children = ( 4725251122680E87003C50DF /* OpenInTerminalCore.framework */, 4725254A22680FEB003C50DF /* OpenInTerminalFinderExtension.appex */, 4725255F22681098003C50DF /* OpenInTerminal.app */, 95187389227DF492000CCB3A /* OpenInTerminalHelper.app */, ); name = Products; sourceTree = ""; }; 95DD6294243B2102003550B3 /* Extensions */ = { isa = PBXGroup; children = ( 95DD6295243B211B003550B3 /* ArrayExtensions.swift */, 9584EAB72CF06A500080F94F /* PathExtensions.swift */, ); path = Extensions; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 4725250C22680E87003C50DF /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 4725251522680E87003C50DF /* OpenInTerminalCore.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 4725251022680E87003C50DF /* OpenInTerminalCore */ = { isa = PBXNativeTarget; buildConfigurationList = 4725251A22680E87003C50DF /* Build configuration list for PBXNativeTarget "OpenInTerminalCore" */; buildPhases = ( 4725250C22680E87003C50DF /* Headers */, 4725250D22680E87003C50DF /* Sources */, 4725250E22680E87003C50DF /* Frameworks */, 4725250F22680E87003C50DF /* Resources */, ); buildRules = ( ); dependencies = ( ); name = OpenInTerminalCore; productName = OpenInTerminalCore; productReference = 4725251122680E87003C50DF /* OpenInTerminalCore.framework */; productType = "com.apple.product-type.framework"; }; 4725254922680FEB003C50DF /* OpenInTerminalFinderExtension */ = { isa = PBXNativeTarget; buildConfigurationList = 4725255322680FEB003C50DF /* Build configuration list for PBXNativeTarget "OpenInTerminalFinderExtension" */; buildPhases = ( 4725254622680FEB003C50DF /* Sources */, 4725254722680FEB003C50DF /* Frameworks */, 4725254822680FEB003C50DF /* Resources */, 954D67D62355F80E007702D0 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( 954D67D52355F80E007702D0 /* PBXTargetDependency */, ); name = OpenInTerminalFinderExtension; productName = OpenInTerminalFinderExtension; productReference = 4725254A22680FEB003C50DF /* OpenInTerminalFinderExtension.appex */; productType = "com.apple.product-type.app-extension"; }; 4725255E22681098003C50DF /* OpenInTerminal */ = { isa = PBXNativeTarget; buildConfigurationList = 4725257722681099003C50DF /* Build configuration list for PBXNativeTarget "OpenInTerminal" */; buildPhases = ( 4725255B22681098003C50DF /* Sources */, 4725255C22681098003C50DF /* Frameworks */, 4725255D22681098003C50DF /* Resources */, 4725258D226812AB003C50DF /* Embed Frameworks */, 4725258E226812AB003C50DF /* Embed App Extensions */, 9511D8B32274A25A008E52B9 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 47252589226812AB003C50DF /* PBXTargetDependency */, 4725258C226812AB003C50DF /* PBXTargetDependency */, ); name = OpenInTerminal; productName = OpenInTerminal; productReference = 4725255F22681098003C50DF /* OpenInTerminal.app */; productType = "com.apple.product-type.application"; }; 95187388227DF492000CCB3A /* OpenInTerminalHelper */ = { isa = PBXNativeTarget; buildConfigurationList = 95187398227DF493000CCB3A /* Build configuration list for PBXNativeTarget "OpenInTerminalHelper" */; buildPhases = ( 95187385227DF492000CCB3A /* Sources */, 95187386227DF492000CCB3A /* Frameworks */, 95187387227DF492000CCB3A /* Resources */, ); buildRules = ( ); dependencies = ( ); name = OpenInTerminalHelper; productName = OpenInTerminalHelper; productReference = 95187389227DF492000CCB3A /* OpenInTerminalHelper.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 956C38A9225F7701001CB769 /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1020; LastUpgradeCheck = 1220; ORGANIZATIONNAME = "Jianing Wang"; TargetAttributes = { 4725251022680E87003C50DF = { CreatedOnToolsVersion = 10.2; LastSwiftMigration = 1020; }; 4725254922680FEB003C50DF = { CreatedOnToolsVersion = 10.2; LastSwiftMigration = 1020; SystemCapabilities = { com.apple.ApplicationGroups.Mac = { enabled = 1; }; }; }; 4725255E22681098003C50DF = { CreatedOnToolsVersion = 10.2; SystemCapabilities = { com.apple.ApplicationGroups.Mac = { enabled = 1; }; com.apple.Sandbox = { enabled = 0; }; }; }; 95187388227DF492000CCB3A = { CreatedOnToolsVersion = 10.2.1; SystemCapabilities = { com.apple.ApplicationGroups.Mac = { enabled = 0; }; }; }; }; }; buildConfigurationList = 956C38AC225F7701001CB769 /* Build configuration list for PBXProject "OpenInTerminal" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, "zh-Hans", fr, ru, it, es, tr, de, ko, ); mainGroup = 956C38A8225F7701001CB769; packageReferences = ( 955C01332D3C3C87003AF605 /* XCRemoteSwiftPackageReference "ShortcutRecorder" */, ); productRefGroup = 956C38B2225F7701001CB769 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 4725255E22681098003C50DF /* OpenInTerminal */, 4725251022680E87003C50DF /* OpenInTerminalCore */, 4725254922680FEB003C50DF /* OpenInTerminalFinderExtension */, 95187388227DF492000CCB3A /* OpenInTerminalHelper */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 4725250F22680E87003C50DF /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 95294D0825B3E17900CC995D /* Icons.xcassets in Resources */, 95C6C340227AA1CB00F157C4 /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 4725254822680FEB003C50DF /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 955A93C02D1C31C7001C7A45 /* Preferences.storyboard in Resources */, 472525592268100F003C50DF /* FinderAssets.xcassets in Resources */, 95294CEB25B3252900CC995D /* Assets.xcassets in Resources */, 95C6C341227AA1D000F157C4 /* Localizable.strings in Resources */, 95294CFE25B3293F00CC995D /* Icons.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 4725255D22681098003C50DF /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 955A93BF2D1C31C7001C7A45 /* Preferences.storyboard in Resources */, 951A3EBF2278A70F00E8DB61 /* MainMenu.xib in Resources */, 9584EDF2226DEF79003C7EE8 /* Localizable.strings in Resources */, 472525812268112F003C50DF /* Assets.xcassets in Resources */, 95294CFD25B3293F00CC995D /* Icons.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 95187387227DF492000CCB3A /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 95187390227DF493000CCB3A /* Assets.xcassets in Resources */, 95187393227DF493000CCB3A /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 4725250D22680E87003C50DF /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 95CE277E257E470F0053D76A /* ScriptManager.swift in Sources */, 4725254422680F7C003C50DF /* Log.swift in Sources */, 4725253522680EFD003C50DF /* FinderManager.swift in Sources */, 95C7C2EE257B7D63004C8355 /* App.swift in Sources */, 9584EAB82CF06A500080F94F /* PathExtensions.swift in Sources */, 95CE2789257F2F3A0053D76A /* Error.swift in Sources */, 4725253122680EF3003C50DF /* Constants.swift in Sources */, 9592D637258CB9210031CA30 /* AppManager.swift in Sources */, 4725254022680F5A003C50DF /* Terminal.swift in Sources */, 95DD6296243B211B003550B3 /* ArrayExtensions.swift in Sources */, 9590B68E226C04E000362B93 /* Defaults.swift in Sources */, 95DFC1242354A2C300941D3A /* DefaultsManager.swift in Sources */, 95C7C2F2257B7E1E004C8355 /* SupportedApps.swift in Sources */, 4725254122680F5A003C50DF /* Finder.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 4725254622680FEB003C50DF /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 95187380227DEF89000CCB3A /* OpenNotifier.swift in Sources */, 4725255A2268100F003C50DF /* FinderSync.swift in Sources */, 95163CD52269A09D007C006F /* Notifier.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 4725255B22681098003C50DF /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 9590B69F226CBC0000362B93 /* GeneralPreferencesViewController.swift in Sources */, 4725256222681098003C50DF /* AppDelegate.swift in Sources */, 951A3EBD2278A6F700E8DB61 /* StatusMenuController.swift in Sources */, 95294CE625B0270700CC995D /* CustomInputViewController.swift in Sources */, 954D67CF235570D5007702D0 /* Error.swift in Sources */, 95BAA1822279E28D005E1DAC /* AboutPreferencesViewController.swift in Sources */, 9511D8AC22749582008E52B9 /* LaunchNotifier.swift in Sources */, 954D67D12355AD36007702D0 /* ScriptGenerator.swift in Sources */, 9571DA84227E6FFF0076AA64 /* AdvancedPreferencesViewController.swift in Sources */, 95163CD22269979E007C006F /* Notifier.swift in Sources */, 95163CD4226998ED007C006F /* OpenNotifier.swift in Sources */, 9521EDCC226B475E008445D1 /* PreferencesViewController.swift in Sources */, 95F5BED5227734E800D505A0 /* PreferencesWindowController.swift in Sources */, 9521EDD0226B4BE6008445D1 /* Constants.swift in Sources */, 9590B6A1226CBC1D00362B93 /* CustomPreferencesViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 95187385227DF492000CCB3A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 9518738C227DF492000CCB3A /* AppDelegate.swift in Sources */, 9518739A227DF565000CCB3A /* LaunchNotifier.swift in Sources */, 95187399227DF563000CCB3A /* Notifier.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 47252589226812AB003C50DF /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 4725251022680E87003C50DF /* OpenInTerminalCore */; targetProxy = 47252588226812AB003C50DF /* PBXContainerItemProxy */; }; 4725258C226812AB003C50DF /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 4725254922680FEB003C50DF /* OpenInTerminalFinderExtension */; targetProxy = 4725258B226812AB003C50DF /* PBXContainerItemProxy */; }; 954D67D52355F80E007702D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 4725251022680E87003C50DF /* OpenInTerminalCore */; targetProxy = 954D67D42355F80E007702D0 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ 95187391227DF493000CCB3A /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( 95187392227DF493000CCB3A /* Base */, ); name = Main.storyboard; sourceTree = ""; }; 955A93BE2D1C31C7001C7A45 /* Preferences.storyboard */ = { isa = PBXVariantGroup; children = ( 955A93BD2D1C31C7001C7A45 /* Base */, 955A93C12D1C31C7001C7A45 /* mul */, ); name = Preferences.storyboard; sourceTree = ""; }; 9584EDF4226DEF79003C7EE8 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( 9584EDF3226DEF79003C7EE8 /* en */, 9584EDF5226DEFC0003C7EE8 /* zh-Hans */, 95FC9243228BAAD600F51DF2 /* fr */, E197D59A23E2973800C5A893 /* ru */, C3ACD4D0243E0FEF00462517 /* it */, C1FB06722493518B004AF7B7 /* es */, 95B0613E27AFABD5009C2B4E /* tr */, 2594E99B27EF523300AF84D5 /* de */, CE8306A1283D111D00C32E36 /* ko */, ); name = Localizable.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 4725251B22680E87003C50DF /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = Q33U8R4U57; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_VERSION = A; INFOPLIST_FILE = OpenInTerminalCore/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; MARKETING_VERSION = 2.3.0; PRODUCT_BUNDLE_IDENTIFIER = wang.jianing.app.OpenInTerminalCore; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; 4725251C22680E87003C50DF /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = Q33U8R4U57; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_VERSION = A; INFOPLIST_FILE = OpenInTerminalCore/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; MARKETING_VERSION = 2.3.0; PRODUCT_BUNDLE_IDENTIFIER = wang.jianing.app.OpenInTerminalCore; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; 4725255422680FEB003C50DF /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = OpenInTerminalFinderExtension/OpenInTerminalFinderExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = Q33U8R4U57; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = OpenInTerminalFinderExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; MARKETING_VERSION = 2.3.8; PRODUCT_BUNDLE_IDENTIFIER = wang.jianing.app.OpenInTerminal.OpenInTerminalFinderExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; }; name = Debug; }; 4725255522680FEB003C50DF /* Release */ = { isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = OpenInTerminalFinderExtension/OpenInTerminalFinderExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = Q33U8R4U57; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = OpenInTerminalFinderExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; MARKETING_VERSION = 2.3.8; PRODUCT_BUNDLE_IDENTIFIER = wang.jianing.app.OpenInTerminal.OpenInTerminalFinderExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; }; name = Release; }; 4725257822681099003C50DF /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = OpenInTerminal/OpenInTerminal.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = Q33U8R4U57; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = OpenInTerminal/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; MARKETING_VERSION = 2.3.8; PRODUCT_BUNDLE_IDENTIFIER = wang.jianing.app.OpenInTerminal; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; name = Debug; }; 4725257922681099003C50DF /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = OpenInTerminal/OpenInTerminal.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = Q33U8R4U57; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = OpenInTerminal/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; MARKETING_VERSION = 2.3.8; PRODUCT_BUNDLE_IDENTIFIER = wang.jianing.app.OpenInTerminal; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; name = Release; }; 95187396227DF493000CCB3A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = OpenInTerminalHelper/OpenInTerminalHelper.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = Q33U8R4U57; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = OpenInTerminalHelper/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; MARKETING_VERSION = 2.3.8; PRODUCT_BUNDLE_IDENTIFIER = wang.jianing.app.OpenInTerminalHelper; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; }; name = Debug; }; 95187397227DF493000CCB3A /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = OpenInTerminalHelper/OpenInTerminalHelper.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = Q33U8R4U57; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = OpenInTerminalHelper/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; MARKETING_VERSION = 2.3.8; PRODUCT_BUNDLE_IDENTIFIER = wang.jianing.app.OpenInTerminalHelper; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; }; name = Release; }; 956C38BD225F7701001CB769 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; 956C38BE225F7701001CB769 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 4725251A22680E87003C50DF /* Build configuration list for PBXNativeTarget "OpenInTerminalCore" */ = { isa = XCConfigurationList; buildConfigurations = ( 4725251B22680E87003C50DF /* Debug */, 4725251C22680E87003C50DF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 4725255322680FEB003C50DF /* Build configuration list for PBXNativeTarget "OpenInTerminalFinderExtension" */ = { isa = XCConfigurationList; buildConfigurations = ( 4725255422680FEB003C50DF /* Debug */, 4725255522680FEB003C50DF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 4725257722681099003C50DF /* Build configuration list for PBXNativeTarget "OpenInTerminal" */ = { isa = XCConfigurationList; buildConfigurations = ( 4725257822681099003C50DF /* Debug */, 4725257922681099003C50DF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 95187398227DF493000CCB3A /* Build configuration list for PBXNativeTarget "OpenInTerminalHelper" */ = { isa = XCConfigurationList; buildConfigurations = ( 95187396227DF493000CCB3A /* Debug */, 95187397227DF493000CCB3A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 956C38AC225F7701001CB769 /* Build configuration list for PBXProject "OpenInTerminal" */ = { isa = XCConfigurationList; buildConfigurations = ( 956C38BD225F7701001CB769 /* Debug */, 956C38BE225F7701001CB769 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ 955C01332D3C3C87003AF605 /* XCRemoteSwiftPackageReference "ShortcutRecorder" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/Kentzo/ShortcutRecorder"; requirement = { kind = upToNextMajorVersion; minimumVersion = 3.4.0; }; }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ 955C01342D3C3C9A003AF605 /* ShortcutRecorder */ = { isa = XCSwiftPackageProductDependency; package = 955C01332D3C3C87003AF605 /* XCRemoteSwiftPackageReference "ShortcutRecorder" */; productName = ShortcutRecorder; }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 956C38A9225F7701001CB769 /* Project object */; } ================================================ FILE: OpenInTerminalCore/App.swift ================================================ // // App.swift // OpenInTerminalCore // // Created by Jianing Wang on 2020/12/5. // Copyright © 2020 Jianing Wang. All rights reserved. // import Foundation import ScriptingBridge public enum AppType: String, Codable { case terminal case editor } public struct App: Codable { public var name: String public var path: String? public var bundleId: String? public var type: AppType public init(name: String, type: AppType) { self.name = name self.type = type } } extension App: Equatable { public static func == (lhs: App, rhs: App) -> Bool { return lhs.name == rhs.name && lhs.bundleId == rhs.bundleId } } // MARK: - Openable public protocol Openable { func openOutsideSandbox() throws func openInSandbox(_ urls: [URL]) throws } extension App: Openable { public func openOutsideSandbox() throws { func excute(_ source: String) throws { guard let script = NSAppleScript(source: source) else { throw OITError.cannotCreateAppleScript(source) } var error: NSDictionary? script.executeAndReturnError(&error) if error != nil { throw OITError.cannotAccessApp(self.name) } } switch self.type { case .terminal: // get path var path = try FinderManager.shared.getPathToFrontFinderWindowOrSelectedFile() if path == "" { // No Finder window and no file selected. guard let desktopPath = FinderManager.shared.getDesktopPath() else { return } path = desktopPath } if SupportedApps.is(self, is: .terminal) { // this app is supported: Terminal let url = URL(fileURLWithPath: path) guard let terminal = SBApplication(bundleIdentifier: SupportedApps.terminal.bundleId) as TerminalApplication?, let open = terminal.open else { throw OITError.cannotAccessApp(self.name) } open([url]) terminal.activate() // let newOption = DefaultsManager.shared.getNewOption(.terminal) ?? .window // switch newOption { // case .window: // // open in a new window // guard let terminal = SBApplication(bundleIdentifier: SupportedApps.terminal.bundleId) as TerminalApplication?, // let open = terminal.open else { // throw OITError.cannotAccessApp(self.name) // } // open([url]) // terminal.activate() // case .tab: // // open in a new tab // let source = ScriptManager.shared.getTerminalNewTabAppleScript(url: url) // try excute(source) // } } else { // this app is general var openCommand = DefaultsManager.shared.getOpenCommand(self, escapeCount: 2) openCommand += " " + path.specialCharEscaped(2) let source = """ do shell script "\(openCommand)" """ try excute(source) } case .editor: // get paths var paths = try FinderManager.shared.getFullPathsToFrontFinderWindowOrSelectedFile() if paths.count == 0 { // No Finder window and no file selected. guard let desktopPath = FinderManager.shared.getDesktopPath() else { return } paths.append(desktopPath) } var openCommand = DefaultsManager.shared.getOpenCommand(self, escapeCount: 2) var path = "" paths.forEach { path += " \($0.specialCharEscaped(2))" } // fix for neovim if SupportedApps.is(self, is: .neovim) { openCommand = openCommand.replacingOccurrences(of: "PATH", with: path) } else { openCommand += path } logw(openCommand) let source = """ do shell script "\(openCommand)" """ try excute(source) } } public func openInSandbox(_ urls: [URL]) throws { switch self.type { case .terminal: guard var url = urls.first else { return } url.getDirectory() // get open command, e.g. "open -a Terminal /Users/user/Desktop/test\ folder" var openCommand = DefaultsManager.shared.getOpenCommand(self) openCommand += " " + url.path.specialCharEscaped() // script guard let scriptURL = ScriptManager.shared.getScriptURL(with: Constants.generalScript) else { return } // // handle exceptional case // if SupportedApps.is(self, is: .terminal) { // if let newOption = DefaultsManager.shared.getNewOption(.terminal), // newOption == .tab { // openCommand = ScriptManager.shared.getTerminalNewTabCommand(path: path) // guard let tabScriptURL = ScriptManager.shared.getScriptURL(with: Constants.terminalNewTabScript) else { return } // scriptURL = tabScriptURL // } // } // excute guard FileManager.default.fileExists(atPath: scriptURL.path) else { return } guard let script = try? NSUserAppleScriptTask(url: scriptURL) else { return } let event = ScriptManager.shared.getScriptEvent(functionName: "openApp", openCommand) script.execute(withAppleEvent: event) { (appleEvent, error) in if let error = error { logw("cannot execute applescript: \(error)") } } case .editor: // get open command, e.g. "open -a TextEdit /Users/user/Desktop/test\ folder /Users/user/Documents" var openCommand = DefaultsManager.shared.getOpenCommand(self) var path = "" urls.map { $0.path }.forEach { path += " " + $0.specialCharEscaped() } if SupportedApps.is(self, is: .neovim) { openCommand = openCommand.replacingOccurrences(of: "PATH", with: path) } else { openCommand += path } // script guard let scriptURL = ScriptManager.shared.getScriptURL(with: Constants.generalScript) else { return } // excute guard FileManager.default.fileExists(atPath: scriptURL.path) else { return } guard let script = try? NSUserAppleScriptTask(url: scriptURL) else { return } let event = ScriptManager.shared.getScriptEvent(functionName: "openApp", openCommand) script.execute(withAppleEvent: event) { (appleEvent, error) in if let error = error { logw("cannot execute applescript: \(error)") } } } } } ================================================ FILE: OpenInTerminalCore/AppManager.swift ================================================ // // AppManager.swift // OpenInTerminalCore // // Created by Jianing Wang on 2020/12/18. // Copyright © 2020 Jianing Wang. All rights reserved. // import Foundation public class AppManager { public static var shared = AppManager() public func pickTerminalAlert() -> App? { let alert = NSAlert() alert.messageText = NSLocalizedString("alert.pick_terminal_title", comment: "Open In?") alert.informativeText = NSLocalizedString("alert.pick_terminal_description", comment: "Please select one of the following terminals as the default terminal to open.") // Add button and avoid the focus ring let cancelString = NSLocalizedString("general.cancel", comment: "Cancel") alert.addButton(withTitle: cancelString).refusesFirstResponder = true alert.addButton(withTitle: SupportedApps.terminal.name).refusesFirstResponder = true alert.addButton(withTitle: SupportedApps.iTerm.name).refusesFirstResponder = true alert.addButton(withTitle: SupportedApps.hyper.name).refusesFirstResponder = true let modalResult = alert.runModal() switch modalResult { case .alertFirstButtonReturn: return nil case .alertSecondButtonReturn: return SupportedApps.terminal.app case .alertThirdButtonReturn: return SupportedApps.iTerm.app default: return SupportedApps.hyper.app } } public func pickEditorAlert() -> App? { let alert = NSAlert() alert.messageText = NSLocalizedString("alert.pick_editor_title", comment: "Open In?") alert.informativeText = NSLocalizedString("alert.pick_editor_description", comment: "Please select one of the following editors as the default editor to open.") // Add button and avoid the focus ring let cancelString = NSLocalizedString("general.cancel", comment: "Cancel") alert.addButton(withTitle: cancelString).refusesFirstResponder = true alert.addButton(withTitle: SupportedApps.vscode.name).refusesFirstResponder = true alert.addButton(withTitle: SupportedApps.sublime.name).refusesFirstResponder = true alert.addButton(withTitle: SupportedApps.atom.name).refusesFirstResponder = true let modalResult = alert.runModal() switch modalResult { case .alertFirstButtonReturn: return nil case .alertSecondButtonReturn: return SupportedApps.vscode.app case .alertThirdButtonReturn: return SupportedApps.sublime.app default: return SupportedApps.atom.app } } public static func getApplicationName(from path: String?) -> String { guard let validPath = path else { return "Invalid Name" } guard let validBundle = Bundle.init(url: URL.init(fileURLWithPath: validPath)) else { return getApplicationFileName(from: validPath) } let CFBundleDisplayName = validBundle.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String let CFBundleName = validBundle.object(forInfoDictionaryKey: "CFBundleName") as? String let FileName = getApplicationFileName(from: validPath) return CFBundleDisplayName ?? CFBundleName ?? FileName } public static func getApplicationName(from path: URL) -> String { return getApplicationName(from: path.path) } public static func getApplicationFileName(from path: String) -> String { var rawName = FileManager().displayName(atPath: path).removingPercentEncoding! let lowercased = rawName.lowercased() if lowercased.hasSuffix(".app") { let start = rawName.startIndex let end = rawName.index(rawName.endIndex, offsetBy: -4) rawName = String(rawName[start.. NSImage { guard let validPath = path else { return #imageLiteral(resourceName: "SF.cube") } return NSWorkspace.shared.icon(forFile: validPath) } public static func getApplicationIcon(from path: URL) -> NSImage { return getApplicationIcon(from: path.path) } } ================================================ FILE: OpenInTerminalCore/Constants.swift ================================================ // // Config.swift // OpenInTerminal // // Created by Jianing Wang on 2019/4/17. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation struct Constants { /// Identifier struct Id { static let Group = "group.wang.jianing.app.OpenInTerminal" static let OpenInTerminalLite = "wang.jianing.app.OpenInTerminal-Lite" static let OpenInEditorLite = "wang.jianing.app.OpenInEditor-Lite" static let Finder = "com.apple.Finder" } /// General AppleScript for opening apps static let generalScript = "generalScript" /// AppleScript for opening a new tab in Terminal static let terminalNewTabScript = "terminalNewTabScript" struct Commands { static let alacritty = "open -na Alacritty --args --working-directory" static let kitty = "open -na kitty --args --single-instance --instance-group 1 --directory" static let wezterm = "open -na wezterm --args start --cwd" static let tabby = "open -na tabby --args --directory" /// "Open In NeoVim" only supports Alacritty, wezterm, and kitty. static let neovim = "open -na kitty --args /opt/homebrew/bin/nvim PATH" // static let neovim = "open -na wezterm --args start /opt/homebrew/bin/nvim PATH" // static let neovim = "open -na Alacritty --args -e /opt/homebrew/bin/nvim PATH" } } public enum QuickToggleType: String { case openWithDefaultTerminal case openWithDefaultEditor case copyPathToClipboard public var name: String { switch self { case .openWithDefaultTerminal: return NSLocalizedString("menu.open_with_default_terminal", comment: "Open with default Terminal") case .openWithDefaultEditor: return NSLocalizedString("menu.open_with_default_editor", comment: "Open with default Editor") case .copyPathToClipboard: return NSLocalizedString("menu.copy_path_to_clipboard", comment: "Copy path to Clipboard") } } } public enum NewOptionType: String { case tab case window } let encoder = JSONEncoder() let decoder = JSONDecoder() public enum CustomMenuIconOption: String { case no case simple case original } ================================================ FILE: OpenInTerminalCore/Defaults.swift ================================================ // // Defaults.swift // OpenInTerminalCore // // Created by Jianing Wang on 2019/4/21. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation /// group defaults let GroupDefaults = UserDefaults(suiteName: Constants.Id.Group) /// current defaults public var Defaults: UserDefaults = { if Bundle.main.bundleIdentifier == Constants.Id.OpenInTerminalLite || Bundle.main.bundleIdentifier == Constants.Id.OpenInEditorLite { return UserDefaults.standard } else { return GroupDefaults ?? UserDefaults.standard } }() public class DefaultsKeys { fileprivate init() {} } public class DefaultsKey: DefaultsKeys { let _key: String init(_ key: String) { self._key = key } } public extension DefaultsKeys { // Preferences - General static let firstSetup = DefaultsKey("FirstSetup") static let launchAtLogin = DefaultsKey("LaunchAtLogin") static let quickToggle = DefaultsKey("QuickToggle") static let quickToggleType = DefaultsKey("QuickToggleType") static let hideStatusItem = DefaultsKey("HideStatusItem") static let hideContextMenuItems = DefaultsKey("HideContextMenuItems") static let defaultTerminal = DefaultsKey("DefaultTerminal") static let defaultEditor = DefaultsKey("DefaultEditor") // Preferences - Custom static let terminalNewOption = DefaultsKey("TerminalNewOption") static let iTermNewOption = DefaultsKey("iTermNewOption") static let customMenuOptions = DefaultsKey("CustomMenuOptions") static let customMenuApplyToToolbar = DefaultsKey("CustomMenuApplyToToolbar") static let customMenuApplyToContext = DefaultsKey("CustomMenuApplyToContext") static let customMenuIconOption = DefaultsKey("CustomMenuIconOption") static let pathEscapeOption = DefaultsKey("PathEscapeOption") static let kittyCommand = DefaultsKey("KittyCommand") static let neovimCommand = DefaultsKey("NeovimCommand") // for Lite static let liteDefaultTerminal = DefaultsKey("LiteDefaultTerminal") static let liteDefaultEditor = DefaultsKey("LiteDefaultEditor") } public extension UserDefaults { subscript(key: DefaultsKey) -> String? { get { return string(forKey: key._key) } set { set(newValue, forKey: key._key) } } subscript(key: DefaultsKey) -> Bool { get { return bool(forKey: key._key) } set { set(newValue, forKey: key._key) } } subscript(key: DefaultsKey) -> Int { get { return integer(forKey: key._key) } set { set(newValue, forKey: key._key) } } subscript(key: DefaultsKey) -> Float { get { return float(forKey: key._key) } set { set(newValue, forKey: key._key) } } subscript(key: DefaultsKey) -> Double { get { return double(forKey: key._key) } set { set(newValue, forKey: key._key) } } subscript(key: DefaultsKey) -> URL? { get { return url(forKey: key._key) } set { set(newValue, forKey: key._key) } } subscript(key: DefaultsKey) -> Any? { get { return value(forKey: key._key) } set { set(newValue, forKey: key._key) } } subscript(key: DefaultsKey<[Any]>) -> [Any]? { get { return array(forKey: key._key) } set { set(newValue, forKey: key._key) } } subscript(key: DefaultsKey) -> Data? { get { return data(forKey: key._key) } set { set(newValue, forKey: key._key) } } subscript(key: DefaultsKey<[String : Any]>) -> [String : Any]? { get { return dictionary(forKey: key._key) } set { set(newValue, forKey: key._key) } } subscript(key: DefaultsKey<[String]>) -> [String]? { get { return stringArray(forKey: key._key) } set { set(newValue, forKey: key._key) } } } ================================================ FILE: OpenInTerminalCore/DefaultsManager.swift ================================================ // // DefaultsManager.swift // OpenInTerminalCore // // Created by Jianing Wang on 2019/10/14. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation public class DefaultsManager { public static var shared = DefaultsManager() // MARK: - Preferences - General public var isFirstSetup: Bool { get { return Defaults[.firstSetup] } set { Defaults[.firstSetup] = newValue } } public var isLaunchAtLogin: Bool { get { return Defaults[.launchAtLogin] } set { Defaults[.launchAtLogin] = newValue } } public var isQuickToggle: Bool { get { return Defaults[.quickToggle] } set { Defaults[.quickToggle] = newValue } } public var quickToggleType: QuickToggleType? { get { return Defaults[.quickToggleType].map(QuickToggleType.init(rawValue: )) ?? nil } set { Defaults[.quickToggleType] = newValue?.rawValue } } public var isHideStatusItem: Bool { get { return Defaults[.hideStatusItem] } set { Defaults[.hideStatusItem] = newValue } } public var isHideContextMenuItems: Bool { get { return Defaults[.hideContextMenuItems] } set { Defaults[.hideContextMenuItems] = newValue } } public var defaultTerminal: App? { get { guard let terminalName = Defaults[.defaultTerminal] else { return nil } let app = App(name: terminalName, type: .terminal) return app } set { guard let newValue = newValue else { return } Defaults[.defaultTerminal] = newValue.name } } public var defaultEditor: App? { get { guard let editorName = Defaults[.defaultEditor] else { return nil } let app = App(name: editorName, type: .editor) return app } set { guard let newValue = newValue else { return } Defaults[.defaultEditor] = newValue.name } } public var liteDefaultTerminal: String? { get { return Defaults[.liteDefaultTerminal] } set { Defaults[.liteDefaultTerminal] = newValue } } public var liteDefaultEditor: String? { get { return Defaults[.liteDefaultEditor] } set { Defaults[.liteDefaultEditor] = newValue } } // MARK: - Preferences - Custom public func getNewOption(_ app: SupportedApps) -> NewOptionType? { var option: String? switch app { case .iTerm: option = Defaults[.iTermNewOption] default: return nil } return option.map(NewOptionType.init(rawValue: )) ?? nil } public func setNewOption(_ app: SupportedApps, _ newOption: NewOptionType) { switch app { case .iTerm: Defaults[.iTermNewOption] = newOption.rawValue let option = newOption == .window ? "true" : "false" let source = """ do shell script "defaults write \(SupportedApps.iTerm.bundleId) OpenFileInNewWindows -bool \(option)" """ let script = NSAppleScript(source: source)! var error: NSDictionary? script.executeAndReturnError(&error) if error != nil { logw("Setting iTerm new option failed: \(String(describing: error))") } default: return } } public var customMenuOptions: [App]? { get { guard let appsData = Defaults[.customMenuOptions] else { return nil } do { let apps = try decoder.decode([App].self, from: appsData) return apps } catch { return nil } } set { guard let newValue = newValue else { return } do { let data = try encoder.encode(newValue) Defaults[.customMenuOptions] = data } catch { logw("save custom menu options failed: \(error)") } } } public var isCustomMenuApplyToToolbar: Bool { get { return Defaults[.customMenuApplyToToolbar] } set { Defaults[.customMenuApplyToToolbar] = newValue } } public var isCustomMenuApplyToContext: Bool { get { return Defaults[.customMenuApplyToContext] } set { Defaults[.customMenuApplyToContext] = newValue } } public var customMenuIconOption: CustomMenuIconOption { get { let optionValue = Defaults[.customMenuIconOption] ?? "no" let option = CustomMenuIconOption(rawValue: optionValue) return option ?? .no } set { Defaults[.customMenuIconOption] = newValue.rawValue } } public var isPathEscaped: Bool { get { return Defaults[.pathEscapeOption] } set { Defaults[.pathEscapeOption] = newValue } } public func getAppIcon(_ app: App) -> NSImage? { switch customMenuIconOption { case .no: return nil case .simple: if app.type == .terminal { return NSImage(named: "context_menu_icon_terminal") } else { return NSImage(named: "context_menu_icon_editor") } case .original: if SupportedApps.isSupported(app), let icon = NSImage(named: app.name) { return icon } if app.type == .terminal { return NSImage(named: "context_menu_icon_color_terminal") } else { return NSImage(named: "context_menu_icon_color_editor") } } } // MARK: - Open Commands public var kittyCommand: String { get { return Defaults[.kittyCommand] ?? Constants.Commands.kitty } set { Defaults[.kittyCommand] = newValue } } public var neovimCommand: String { get { return Defaults[.neovimCommand] ?? Constants.Commands.neovim } set { Defaults[.neovimCommand] = newValue } } public func getOpenCommand(_ app: App, escapeCount: Int = 1) -> String { if SupportedApps.is(app, is: .alacritty) { return Constants.Commands.alacritty } else if SupportedApps.is(app, is: .kitty) { return kittyCommand } else if SupportedApps.is(app, is: .wezterm) { return Constants.Commands.wezterm } else if SupportedApps.is(app, is: .tabby) { return Constants.Commands.tabby } else if SupportedApps.is(app, is: .neovim) { return neovimCommand } else { return "open -a \(app.name.nameSpaceEscaped(escapeCount))" } } // MARK: - Advanced Settings public func firstSetup() { guard isFirstSetup == false else { return } logw("First Setup") isFirstSetup = true isLaunchAtLogin = false isQuickToggle = false quickToggleType = .openWithDefaultTerminal isHideStatusItem = false isHideContextMenuItems = false defaultTerminal = SupportedApps.terminal.app defaultEditor = SupportedApps.textEdit.app setNewOption(.terminal, .window) setNewOption(.iTerm, .window) isCustomMenuApplyToToolbar = false isCustomMenuApplyToContext = false customMenuIconOption = .no isPathEscaped = true Defaults.synchronize() } public func removeAllUserDefaults() { logw("Remove all UserDefaults") Defaults.removePersistentDomain(forName: Constants.Id.Group) Defaults.synchronize() } } ================================================ FILE: OpenInTerminalCore/Error.swift ================================================ // // Error.swift // cd2swiftTest // // Created by Jianing Wang on 2019/4/10. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation enum OITError: Error { case cannotAccessFinder case cannotAccessApp(_ appName: String) case wrongUrl case cannotCreateAppleScript(_ source: String) case cannotExcuteAppleScript(_ error: Error) } extension OITError : CustomStringConvertible { var description: String { switch self { case .cannotAccessFinder: return "Cannot access Finder, please check permissions." case .cannotAccessApp(let appName): return "Cannot access \(appName), please check permissions." case .wrongUrl: return "Oops, got a wrong url" case .cannotCreateAppleScript(let source): return "Cannot create AppleScript:\n\(source)" case .cannotExcuteAppleScript(let error): return "Cannot excute AppleScript:\n\(error)" } } } ================================================ FILE: OpenInTerminalCore/Extensions/ArrayExtensions.swift ================================================ // // ArrayExtensions.swift // OpenInTerminalCore // // Created by Jianing Wang on 2020/4/6. // Copyright © 2020 Jianing Wang. All rights reserved. // import Foundation public extension Array { mutating func move(from start: Index, to end: Index) { guard (0.. [String] { return sorted { $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedAscending } } mutating func sortIgnoreCase() { sort { $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedAscending } } } public extension Array where Element == App { func sortedIgnoreCase() -> [App] { return sorted { $0.name.localizedCaseInsensitiveCompare($1.name) == ComparisonResult.orderedAscending } } mutating func sortIgnoreCase() { sort { $0.name.localizedCaseInsensitiveCompare($1.name) == ComparisonResult.orderedAscending } } } public extension Array where Element: Equatable { mutating func remove(element: Element) { if let index = self.firstIndex(of: element) { self.remove(at: index) } } } ================================================ FILE: OpenInTerminalCore/Extensions/PathExtensions.swift ================================================ // // PathExtensions.swift // OpenInTerminalCore // // Created by Jianing Wang on 11/22/24. // Copyright © 2024 Jianing Wang. All rights reserved. // import Foundation // MARK: - Escape public extension String { /// Handle space in name. /// `count`: number of escape characters. func nameSpaceEscaped(_ count: Int = 1) -> String { let escapeChar = String(repeating: "\\", count: count) let escapeSpace = escapeChar + " " let replaced = self.replacingOccurrences(of: " ", with: escapeSpace) return replaced } /// Handle special char in path. /// `count`: number of escape characters. func specialCharEscaped(_ count: Int = 1) -> String { let escapeChar = String(repeating: "\\", count: count) var result = "" let set: [Character] = [" ", "(", ")", "&", "|", ";", "\"", "'", "<", ">", "`"] for char in self { if set.contains(char) { result += escapeChar } result.append(char) } return result } // FIXME: if path contains "\" or """, application will crash. // Special symbols have been tested, excluding backslashes and double quotes. func terminalPathEscaped() -> String { var result = "" let set = CharacterSet.alphanumerics for char in self.unicodeScalars { if set.contains(char) || char == "/" { result.unicodeScalars.append(char) } else { result += "\\\\" result.unicodeScalars.append(char) } } return result } } // MARK: - URL public extension URL { /// Get the directory part of the URL by removing the last part if it's a file. mutating func getDirectory() { var isDirectory: ObjCBool = false if FileManager.default.fileExists(atPath: self.path, isDirectory: &isDirectory) { if !isDirectory.boolValue { self = self.deletingLastPathComponent() } } } } ================================================ FILE: OpenInTerminalCore/FinderManager.swift ================================================ // // FinderManager.swift // OpenInTerminalCore // // Created by Cameron Ingham on 4/17/19. // Copyright © 2019 Cameron Ingham. All rights reserved. // import Cocoa import ScriptingBridge public class FinderManager { public static var shared = FinderManager() /// Get full url to front Finder window or selected file public func getFullUrlToFrontFinderWindowOrSelectedFile() throws -> URL? { let finder = SBApplication(bundleIdentifier: Constants.Id.Finder)! as FinderApplication var target: FinderItem guard let selection = finder.selection, let selectionItems = selection.get() else { throw OITError.cannotAccessFinder } if let firstItem = (selectionItems as! Array).first { // Files or folders selected target = firstItem as! FinderItem } else { // Check if there are finder windows opened guard let windows = finder.FinderWindows?(), let firstWindow = windows.firstObject else { print("No Finder windows are opened or selected") return nil } target = (firstWindow as! FinderFinderWindow).target?.get() as! FinderItem } guard let targetUrl = target.URL, let url = URL(string: targetUrl) else { print("target url nil") return nil } return url } /// Get full path to front Finder window or selected file public func getFullPathToFrontFinderWindowOrSelectedFile() throws -> String { guard let url = try getFullUrlToFrontFinderWindowOrSelectedFile() else { return "" } return url.path } /// Get full urls to front Finder windows or selected files public func getFullUrlsToFrontFinderWindowOrSelectedFile() throws -> [URL] { let finder = SBApplication(bundleIdentifier: Constants.Id.Finder)! as FinderApplication var targets: [FinderItem] guard let selection = finder.selection, let selectionItems = selection.get() else { throw OITError.cannotAccessFinder } if let items = selectionItems as? Array, items.count > 0 { // Files or folders are selected targets = items } else { // Check if there are opened finder windows guard let windows = finder.FinderWindows?(), let firstWindow = windows.firstObject else { print("No Finder windows are opened or selected") return [] } let topFinderWindow = (firstWindow as! FinderFinderWindow).target?.get() as! FinderItem targets = [topFinderWindow] } let paths = targets.compactMap { $0.URL }.compactMap { URL(string: $0) } return paths } /// Get full paths to front Finder windows or selected files public func getFullPathsToFrontFinderWindowOrSelectedFile() throws -> [String] { let urls = try getFullUrlsToFrontFinderWindowOrSelectedFile() let paths = urls.map { $0.path } return paths } /// Get path to front Finder window or selected file. /// If the selected one is file, return it's parent path. public func getPathToFrontFinderWindowOrSelectedFile() throws -> String { guard let fullUrl = try getFullUrlToFrontFinderWindowOrSelectedFile() else { return "" } var isDirectory: ObjCBool = false guard FileManager.default.fileExists(atPath: fullUrl.path, isDirectory: &isDirectory) else { print("file does not exist") return "" } // if the selected is a file, then delete last path component guard isDirectory.boolValue else { return fullUrl.deletingLastPathComponent().path } return fullUrl.path } public func getDesktopPath() -> String? { let homePath = NSHomeDirectory() guard let homeUrl = URL(string: homePath) else { return nil } let desktopPath = homeUrl.appendingPathComponent("Desktop").path return desktopPath } /// Get all installed applications' names public func getAllInstalledApps() -> Set { var applications: Set = Set() // add system application applications.insert("Terminal") applications.insert("TextEdit") applications.insert("neovim") // search do { var searchDirs: Set = Set() let fileManager = FileManager.default // search `/Applications` let applicationDir = "/Applications" if let applicationURL = URL(string: applicationDir) { searchDirs.insert(applicationURL) } // search `$HOME/Applications` let userApplicationDirURL = fileManager.urls(for: .applicationDirectory, in: .userDomainMask) if userApplicationDirURL.count > 0 { searchDirs.insert(userApplicationDirURL[0]) } // search `$HOME/Library/Application Support/JetBrains/Toolbox let libraryDirURL = fileManager.urls(for: .libraryDirectory, in: .userDomainMask) if libraryDirURL.count > 0 { let libDirURL = libraryDirURL[0] let toolboxURL = libDirURL.appendingPathComponent("Application Support") .appendingPathComponent("JetBrains") .appendingPathComponent("Toolbox") if fileManager.fileExists(atPath: toolboxURL.path) { searchDirs.insert(toolboxURL) } } var levelCount = 0 while !searchDirs.isEmpty { // to avoid an infinite loop levelCount += 1 if levelCount > 20 { break } var tmpSearchDirs = searchDirs for currentDir in searchDirs { let fileURLs = try fileManager.contentsOfDirectory(at: currentDir, includingPropertiesForKeys: nil) for fileURL in fileURLs { // skip the hidden let baseName = fileURL.lastPathComponent if baseName.hasPrefix(".") { continue } // add to applications if baseName.hasSuffix(".app") { var appName = fileURL.deletingPathExtension().lastPathComponent // nixpkgs fixes do { // iTerm is installed as iTerm2.app if appName == "iTerm2" { appName = "iTerm" } // IntelliJ IDEA and PyCharm community edition have CE appended else if appName == "IntelliJ IDEA CE" { appName = "IntelliJ IDEA" } else if appName == "PyCharm CE" { appName = "PyCharm" } } applications.insert(appName) continue } // add subdirectory to searchDirs var isDir : ObjCBool = false if fileManager.fileExists(atPath: fileURL.path, isDirectory:&isDir) { if isDir.boolValue { // file exists and is a directory // check if it is a alias var isAlias: AnyObject? = nil do { try (fileURL as NSURL).getResourceValue(&isAlias, forKey: URLResourceKey.isAliasFileKey) } catch _ {} if let isAlias = isAlias as? Bool { // for nix-darwin users, applications installed through nix will be installed into a symlinked (alias) directory called "Nix Apps" if fileURL.lastPathComponent == "Nix Apps" { // symlink needs to be resolved first tmpSearchDirs.insert(URL(string: try fileManager.destinationOfSymbolicLink(atPath: fileURL.absoluteString.removingPercentEncoding!.replacingOccurrences(of: "file://", with: "")))!) } // skip alias directory else if !isAlias { tmpSearchDirs.insert(fileURL) } } } else { // file exists and is not a directory } } else { // file does not exist } } tmpSearchDirs.remove(currentDir) } searchDirs = tmpSearchDirs } } catch { print(error.localizedDescription) logw(error.localizedDescription) } return applications } } ================================================ FILE: OpenInTerminalCore/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType FMWK CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion $(CURRENT_PROJECT_VERSION) NSHumanReadableCopyright Copyright © 2019 Jianing Wang. All rights reserved. ================================================ FILE: OpenInTerminalCore/Log.swift ================================================ // // log.swift // cd2swiftTest // // Created by Jianing Wang on 2019/4/10. // Copyright © 2019 Jianing Wang. All rights reserved. // import Foundation ///The log class containing all the needed methods open class Log { ///The max size a log file can be in Kilobytes. Default is 1024 (1 MB) open var maxFileSize: UInt64 = 1024 ///The max number of log file that will be stored. Once this point is reached, the oldest file is deleted. open var maxFileCount = 4 ///The directory in which the log files will be written open var directory = Log.defaultDirectory() { didSet { directory = NSString(string: directory).expandingTildeInPath let fileManager = FileManager.default if !fileManager.fileExists(atPath: directory) { do { try fileManager.createDirectory(atPath: directory, withIntermediateDirectories: true, attributes: nil) } catch { NSLog("Couldn't create directory at \(directory)") } } } } open var currentPath: String { return "\(directory)/\(logName(0))" } ///The name of the log files open var name = "logfile" ///Whether or not logging also prints to the console open var printToConsole = true ///logging singleton open class var logger: Log { struct Static { static let instance: Log = Log() } return Static.instance } //the date formatter var dateFormatter: DateFormatter { let formatter = DateFormatter() formatter.timeStyle = .medium formatter.dateStyle = .medium return formatter } ///write content to the current log file. open func write(_ text: String) { let path = currentPath let fileManager = FileManager.default if !fileManager.fileExists(atPath: path) { do { try "".write(toFile: path, atomically: true, encoding: String.Encoding.utf8) } catch _ { } } if let fileHandle = FileHandle(forWritingAtPath: path) { let dateStr = dateFormatter.string(from: Date()) let writeText = "[\(dateStr)]: \(text)\n" fileHandle.seekToEndOfFile() fileHandle.write(writeText.data(using: String.Encoding.utf8)!) fileHandle.closeFile() if printToConsole { print(writeText, terminator: "") } cleanup() } } ///do the checks and cleanup func cleanup() { let path = "\(directory)/\(logName(0))" let size = fileSize(path) let maxSize: UInt64 = maxFileSize*1024 if size > 0 && size >= maxSize && maxSize > 0 && maxFileCount > 0 { rename(0) //delete the oldest file let deletePath = "\(directory)/\(logName(maxFileCount))" let fileManager = FileManager.default do { try fileManager.removeItem(atPath: deletePath) } catch _ { } } } ///check the size of a file func fileSize(_ path: String) -> UInt64 { let fileManager = FileManager.default let attrs: NSDictionary? = try? fileManager.attributesOfItem(atPath: path) as NSDictionary if let dict = attrs { return dict.fileSize() } return 0 } ///Recursive method call to rename log files func rename(_ index: Int) { let fileManager = FileManager.default let path = "\(directory)/\(logName(index))" let newPath = "\(directory)/\(logName(index+1))" if fileManager.fileExists(atPath: newPath) { rename(index+1) } do { try fileManager.moveItem(atPath: path, toPath: newPath) } catch _ { } } ///gets the log name func logName(_ num :Int) -> String { return "\(name)-\(num).log" } ///get the default log directory class func defaultDirectory() -> String { var path = "" let fileManager = FileManager.default #if os(iOS) let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) path = "\(paths[0])/Logs" #elseif os(macOS) let urls = fileManager.urls(for: .libraryDirectory, in: .userDomainMask) if let url = urls.last { path = "\(url.path)/Logs" } #endif if !fileManager.fileExists(atPath: path) && path != "" { do { try fileManager.createDirectory(atPath: path, withIntermediateDirectories: false, attributes: nil) } catch _ { } } return path } } ///Writes content to the current log file public func logw(_ text: String) { Log.logger.write(text) } ================================================ FILE: OpenInTerminalCore/OpenInTerminalCore.h ================================================ // // OpenInTerminalCore.h // OpenInTerminalCore // // Created by Cameron Ingham on 4/17/19. // Copyright © 2019 Jianing Wang. All rights reserved. // #import //! Project version number for OpenInTerminalCore. FOUNDATION_EXPORT double OpenInTerminalCoreVersionNumber; //! Project version string for OpenInTerminalCore. FOUNDATION_EXPORT const unsigned char OpenInTerminalCoreVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import ================================================ FILE: OpenInTerminalCore/ScriptManager.swift ================================================ // // ScriptManager.swift // OpenInTerminalCore // // Created by Jianing Wang on 2020/12/7. // Copyright © 2020 Jianing Wang. All rights reserved. // import Foundation import Carbon public class ScriptManager { public static var shared = ScriptManager() // MARK: - Get AppleScript /// This script requires parameters to be passed in. /// `parameter`: open -a public func getGeneralScript() -> String { let script = """ on openApp(command) tell application "Finder" activate do shell script command end tell end openApp """ return script } public func getGeneralScriptName() -> String { return Constants.generalScript } /// Open path in a new tab of Terminal public func getTerminalNewTabAppleScript() -> String { let script = """ on openApp(command) if not application "Terminal" is running then tell application "Terminal" do script command activate end tell else tell application "Terminal" if not (exists window 1) then do script command activate else activate tell application "System Events" to keystroke "t" using command down repeat while contents of selected tab of window 1 starts with linefeed delay 0.01 end repeat do script command in window 1 end if end tell end if end openApp """ return script } public func getTerminalNewTabScriptName() -> String { return Constants.terminalNewTabScript } public func getTerminalNewTabCommand(path: String) -> String { let command = "cd \(path.terminalPathEscaped())" return command } /// Open path in a new tab of Terminal public func getTerminalNewTabAppleScript(url: URL) -> String { let script = """ if not application "Terminal" is running then tell application "Terminal" do script "cd \(url.path.terminalPathEscaped())" activate end tell else tell application "Terminal" if not (exists window 1) then do script "cd \(url.path.terminalPathEscaped())" activate else activate tell application "System Events" to keystroke "t" using command down repeat while contents of selected tab of window 1 starts with linefeed delay 0.01 end repeat do script "cd \(url.path.terminalPathEscaped())" in window 1 end if end tell end if """ return script } // MARK: - Utils public func getScriptURL(with name: String) -> URL? { let scriptFolderURL = try? FileManager.default.url(for: .applicationScriptsDirectory, in: .userDomainMask, appropriateFor: nil, create: true) guard let url = scriptFolderURL else { return nil } let fileURL = url .appendingPathComponent(name) .appendingPathExtension("scpt") return fileURL } func getScriptEvent(functionName: String, _ parameter: String) -> NSAppleEventDescriptor { let parameters = NSAppleEventDescriptor.list() parameters.insert(NSAppleEventDescriptor(string: parameter), at: 0) let event = NSAppleEventDescriptor( eventClass: AEEventClass(kASAppleScriptSuite), eventID: AEEventID(kASSubroutineEvent), targetDescriptor: nil, returnID: AEReturnID(kAutoGenerateReturnID), transactionID: AETransactionID(kAnyTransactionID) ) event.setDescriptor(NSAppleEventDescriptor(string: functionName), forKeyword: AEKeyword(keyASSubroutineName)) event.setDescriptor(parameters, forKeyword: AEKeyword(keyDirectObject)) return event } // MARK: - Deprecated Functions /// **[Deprecated]** This script can run independently without additional parameters. @available(*, deprecated, message: "Use getGeneralScript()") func getAppleScript(app: App) -> String { switch app.type { case .terminal: let openCommand = DefaultsManager.shared.getOpenCommand(app, escapeCount: 2) let script = """ tell application "Finder" set finderSelList to selection as alias list if finderSelList ≠ {} then set theSelected to item 1 of finderSelList set thePath to POSIX path of (contents of theSelected) try do shell script "cd " & quoted form of thePath on error set thePath to POSIX path of ((container of theSelected) as text) end try end if if finderSelList = {} then tell application "Finder" try set thePath to POSIX path of ((target of front Finder window) as text) on error set thePath to POSIX path of (path to desktop) end try end tell end if end tell do shell script "\(openCommand) " & quoted form of thePath """ return script case .editor: let openCommand = DefaultsManager.shared.getOpenCommand(app, escapeCount: 2) let script = """ tell application "Finder" set pathList to {} set finderSelList to selection as alias list if finderSelList = {} then tell application "Finder" try set thePath to POSIX path of ((target of front Finder window) as text) on error set thePath to POSIX path of (path to desktop) end try set end of pathList to thePath end tell end if if finderSelList ≠ {} then repeat with theSelected in finderSelList set thePath to POSIX path of (contents of theSelected) set end of pathList to thePath end repeat end if end tell set scriptStr to "\(openCommand)" repeat with thePath in pathList set scriptStr to scriptStr & " " & quoted form of thePath end repeat do shell script scriptStr """ return script } } /// **[Deprecated]** Open path in a new tab of Terminal func getTerminalNewTabAppleScript2() -> String { let script = """ tell application "Finder" set finderSelList to selection as alias list if finderSelList ≠ {} then set theSelected to item 1 of finderSelList set thePath to POSIX path of (contents of theSelected) try do shell script "cd " & quoted form of thePath on error set thePath to POSIX path of ((container of theSelected) as text) end try end if if finderSelList = {} then tell application "Finder" try set thePath to POSIX path of ((target of front Finder window) as text) on error set thePath to POSIX path of (path to desktop) end try end tell end if end tell if not application "Terminal" is running then tell application "Terminal" do script "cd " & quoted form of thePath activate end tell else tell application "Terminal" if not (exists window 1) then do script "cd " & quoted form of thePath activate else activate tell application "System Events" to keystroke "t" using command down repeat while contents of selected tab of window 1 starts with linefeed delay 0.01 end repeat do script "cd " & quoted form of thePath in window 1 end if end tell end if """ return script } } ================================================ FILE: OpenInTerminalCore/ScriptingBridge/Finder.swift ================================================ import AppKit import ScriptingBridge @objc public protocol SBObjectProtocol: NSObjectProtocol { func get() -> Any! } @objc public protocol SBApplicationProtocol: SBObjectProtocol { func activate() var delegate: SBApplicationDelegate! { get set } var isRunning: Bool { get } } // MARK: FinderPriv @objc public enum FinderPriv : AEKeyword { case readOnly = 0x72656164 /* 'read' */ case readWrite = 0x72647772 /* 'rdwr' */ case writeOnly = 0x77726974 /* 'writ' */ case none = 0x6e6f6e65 /* 'none' */ } // MARK: FinderEdfm @objc public enum FinderEdfm : AEKeyword { case macOSFormat = 0x64666866 /* 'dfhf' */ case macOSExtendedFormat = 0x6466682b /* 'dfh+' */ case ufsFormat = 0x64667566 /* 'dfuf' */ case nfsFormat = 0x64666e66 /* 'dfnf' */ case audioFormat = 0x64666175 /* 'dfau' */ case proDOSFormat = 0x64667072 /* 'dfpr' */ case msdosFormat = 0x64666d73 /* 'dfms' */ case ntfsFormat = 0x64666e74 /* 'dfnt' */ case iso9660Format = 0x64663936 /* 'df96' */ case highSierraFormat = 0x64666873 /* 'dfhs' */ case quickTakeFormat = 0x64667174 /* 'dfqt' */ case applePhotoFormat = 0x64667068 /* 'dfph' */ case appleShareFormat = 0x64666173 /* 'dfas' */ case udfFormat = 0x64667564 /* 'dfud' */ case webDAVFormat = 0x64667764 /* 'dfwd' */ case ftpFormat = 0x64666674 /* 'dfft' */ case packetWrittenUDFFormat = 0x64667075 /* 'dfpu' */ case xsanFormat = 0x64666163 /* 'dfac' */ case unknownFormat = 0x64663f3f /* 'df??' */ } // MARK: FinderIpnl @objc public enum FinderIpnl : AEKeyword { case generalInformationPanel = 0x67706e6c /* 'gpnl' */ case sharingPanel = 0x73706e6c /* 'spnl' */ case memoryPanel = 0x6d706e6c /* 'mpnl' */ case previewPanel = 0x76706e6c /* 'vpnl' */ case applicationPanel = 0x61706e6c /* 'apnl' */ case languagesPanel = 0x706b6c67 /* 'pklg' */ case pluginsPanel = 0x706b7067 /* 'pkpg' */ case nameExtensionPanel = 0x6e706e6c /* 'npnl' */ case commentsPanel = 0x63706e6c /* 'cpnl' */ case contentIndexPanel = 0x63696e6c /* 'cinl' */ case burningPanel = 0x62706e6c /* 'bpnl' */ case moreInfoPanel = 0x6d696e6c /* 'minl' */ case simpleHeaderPanel = 0x73686e6c /* 'shnl' */ } // MARK: FinderPple @objc public enum FinderPple : AEKeyword { case generalPreferencesPanel = 0x70676e70 /* 'pgnp' */ case labelPreferencesPanel = 0x706c6270 /* 'plbp' */ case sidebarPreferencesPanel = 0x70736964 /* 'psid' */ case advancedPreferencesPanel = 0x70616476 /* 'padv' */ } // MARK: FinderEcvw @objc public enum FinderEcvw : AEKeyword { case iconView = 0x69636e76 /* 'icnv' */ case listView = 0x6c737677 /* 'lsvw' */ case columnView = 0x636c7677 /* 'clvw' */ case groupView = 0x67727677 /* 'grvw' */ case flowView = 0x666c7677 /* 'flvw' */ } // MARK: FinderEarr @objc public enum FinderEarr : AEKeyword { case notArranged = 0x6e617272 /* 'narr' */ case snapToGrid = 0x67726461 /* 'grda' */ case arrangedByName = 0x6e616d61 /* 'nama' */ case arrangedByModificationDate = 0x6d647461 /* 'mdta' */ case arrangedByCreationDate = 0x63647461 /* 'cdta' */ case arrangedBySize = 0x73697a61 /* 'siza' */ case arrangedByKind = 0x6b696e61 /* 'kina' */ case arrangedByLabel = 0x6c616261 /* 'laba' */ } // MARK: FinderEpos @objc public enum FinderEpos : AEKeyword { case right = 0x6c726774 /* 'lrgt' */ case bottom = 0x6c626f74 /* 'lbot' */ } // MARK: FinderSodr @objc public enum FinderSodr : AEKeyword { case normal = 0x736e726d /* 'snrm' */ case reversed = 0x73727673 /* 'srvs' */ } // MARK: FinderElsv @objc public enum FinderElsv : AEKeyword { case nameColumn = 0x656c736e /* 'elsn' */ case modificationDateColumn = 0x656c736d /* 'elsm' */ case creationDateColumn = 0x656c7363 /* 'elsc' */ case sizeColumn = 0x656c7373 /* 'elss' */ case kindColumn = 0x656c736b /* 'elsk' */ case labelColumn = 0x656c736c /* 'elsl' */ case versionColumn = 0x656c7376 /* 'elsv' */ case commentColumn = 0x656c7343 /* 'elsC' */ } // MARK: FinderLvic @objc public enum FinderLvic : AEKeyword { case smallIcon = 0x736d6963 /* 'smic' */ case largeIcon = 0x6c676963 /* 'lgic' */ } // MARK: FinderGenericMethods @objc public protocol FinderGenericMethods { @objc optional func openUsing(_ using_: SBObject!, withProperties: [AnyHashable : Any]!) // Open the specified object(s) @objc optional func printWithProperties(_ withProperties: [AnyHashable : Any]!) // Print the specified object(s) @objc optional func activate() // Activate the specified window (or the Finder) @objc optional func close() // Close an object @objc optional func dataSizeAs(_ as: NSNumber!) -> Int // Return the size in bytes of an object @objc optional func delete() -> SBObject // Move an item from its container to the trash @objc optional func duplicateTo(_ to: SBObject!, replacing: Bool, routingSuppressed: Bool, exactCopy: Bool) -> SBObject // Duplicate one or more object(s) @objc optional func exists() -> Bool // Verify if an object exists @objc optional func moveTo(_ to: SBObject!, replacing: Bool, positionedAt: [Any]!, routingSuppressed: Bool) -> SBObject // Move object(s) to a new location @objc optional func select() // Select the specified object(s) @objc optional func sortBy(_ by: Selector) -> SBObject // Return the specified object(s) in a sorted list @objc optional func cleanUpBy(_ by: Selector) // Arrange items in window nicely (only applies to open windows in icon view that are not kept arranged) @objc optional func eject() // Eject the specified disk(s) @objc optional func emptySecurity(_ security: Bool) // Empty the trash @objc optional func erase() // (NOT AVAILABLE) Erase the specified disk(s) @objc optional func reveal() // Bring the specified object(s) into view @objc optional func updateNecessity(_ necessity: Bool, registeringApplications: Bool) // Update the display of the specified object(s) to match their on-disk representation } // MARK: FinderApplication @objc public protocol FinderApplication: SBApplicationProtocol { @objc optional func items() -> SBElementArray @objc optional func containers() -> SBElementArray @objc optional func disks() -> SBElementArray @objc optional func folders() -> SBElementArray @objc optional func files() -> SBElementArray @objc optional func aliasFiles() -> SBElementArray @objc optional func applicationFiles() -> SBElementArray @objc optional func documentFiles() -> SBElementArray @objc optional func internetLocationFiles() -> SBElementArray @objc optional func clippings() -> SBElementArray @objc optional func packages() -> SBElementArray @objc optional func windows() -> SBElementArray @objc optional func FinderWindows() -> SBElementArray @objc optional func clippingWindows() -> SBElementArray @objc optional var clipboard: SBObject { get } // (NOT AVAILABLE YET) the Finder’s clipboard window @objc optional var name: String { get } // the Finder’s name @objc optional var visible: Bool { get } // Is the Finder’s layer visible? @objc optional var frontmost: Bool { get } // Is the Finder the frontmost process? @objc optional var selection: SBObject { get } // the selection in the frontmost Finder window @objc optional var insertionLocation: SBObject { get } // the container in which a new folder would appear if “New Folder” was selected @objc optional var productVersion: String { get } // the version of the System software running on this computer @objc optional var version: String { get } // the version of the Finder @objc optional var startupDisk: FinderDisk { get } // the startup disk @objc optional var desktop: FinderDesktopObject { get } // the desktop @objc optional var trash: FinderTrashObject { get } // the trash @objc optional var home: FinderFolder { get } // the home directory @objc optional var computerContainer: FinderComputerObject { get } // the computer location (as in Go > Computer) @objc optional var FinderPreferences: FinderPreferences { get } // Various preferences that apply to the Finder as a whole @objc optional func quit() // Quit the Finder @objc optional func activate() // Activate the specified window (or the Finder) @objc optional func copy() // (NOT AVAILABLE YET) Copy the selected items to the clipboard (the Finder must be the front application) @objc optional func eject() // Eject the specified disk(s) @objc optional func emptySecurity(_ security: Bool) // Empty the trash @objc optional func restart() // Restart the computer @objc optional func shutDown() // Shut Down the computer @objc optional func sleep() // Put the computer to sleep @objc optional func setVisible(_ visible: Bool) // Is the Finder’s layer visible? @objc optional func setFrontmost(_ frontmost: Bool) // Is the Finder the frontmost process? @objc optional func setSelection(_ selection: SBObject!) // the selection in the frontmost Finder window @objc optional var desktopPicture: FinderFile { get } // the desktop picture of the main monitor @objc optional func setDesktopPicture(_ desktopPicture: FinderFile!) // the desktop picture of the main monitor } extension SBApplication: FinderApplication {} // MARK: FinderItem @objc public protocol FinderItem: SBObjectProtocol, FinderGenericMethods { @objc optional var name: String { get } // the name of the item @objc optional var displayedName: String { get } // the user-visible name of the item @objc optional var nameExtension: String { get } // the name extension of the item (such as “txt”) @objc optional var extensionHidden: Bool { get } // Is the item's extension hidden from the user? @objc optional var index: Int { get } // the index in the front-to-back ordering within its container @objc optional var container: SBObject { get } // the container of the item @objc optional var disk: SBObject { get } // the disk on which the item is stored @objc optional var position: NSPoint { get } // the position of the item within its parent window (can only be set for an item in a window viewed as icons or buttons) @objc optional var desktopPosition: NSPoint { get } // the position of the item on the desktop @objc optional var bounds: NSRect { get } // the bounding rectangle of the item (can only be set for an item in a window viewed as icons or buttons) @objc optional var labelIndex: Int { get } // the label of the item @objc optional var locked: Bool { get } // Is the file locked? @objc optional var kind: String { get } // the kind of the item @objc optional var objectDescription: String { get } // a description of the item @objc optional var comment: String { get } // the comment of the item, displayed in the “Get Info” window @objc optional var size: Int64 { get } // the logical size of the item @objc optional var physicalSize: Int64 { get } // the actual space used by the item on disk @objc optional var creationDate: Date { get } // the date on which the item was created @objc optional var modificationDate: Date { get } // the date on which the item was last modified @objc optional var icon: FinderIconFamily { get } // the icon bitmap of the item @objc optional var URL: String { get } // the URL of the item @objc optional var owner: String { get } // the user that owns the container @objc optional var group: String { get } // the user or group that has special access to the container @objc optional var ownerPrivileges: FinderPriv { get } @objc optional var groupPrivileges: FinderPriv { get } @objc optional var everyonesPrivileges: FinderPriv { get } @objc optional var informationWindow: SBObject { get } // the information window for the item @objc optional var properties: [AnyHashable : Any] { get } // every property of an item @objc optional func setName(_ name: String!) // the name of the item @objc optional func setNameExtension(_ nameExtension: String!) // the name extension of the item (such as “txt”) @objc optional func setExtensionHidden(_ extensionHidden: Bool) // Is the item's extension hidden from the user? @objc optional func setPosition(_ position: NSPoint) // the position of the item within its parent window (can only be set for an item in a window viewed as icons or buttons) @objc optional func setDesktopPosition(_ desktopPosition: NSPoint) // the position of the item on the desktop @objc optional func setBounds(_ bounds: NSRect) // the bounding rectangle of the item (can only be set for an item in a window viewed as icons or buttons) @objc optional func setLabelIndex(_ labelIndex: Int) // the label of the item @objc optional func setLocked(_ locked: Bool) // Is the file locked? @objc optional func setComment(_ comment: String!) // the comment of the item, displayed in the “Get Info” window @objc optional func setModificationDate(_ modificationDate: Date!) // the date on which the item was last modified @objc optional func setIcon(_ icon: FinderIconFamily!) // the icon bitmap of the item @objc optional func setOwner(_ owner: String!) // the user that owns the container @objc optional func setGroup(_ group: String!) // the user or group that has special access to the container @objc optional func setOwnerPrivileges(_ ownerPrivileges: FinderPriv) @objc optional func setGroupPrivileges(_ groupPrivileges: FinderPriv) @objc optional func setEveryonesPrivileges(_ everyonesPrivileges: FinderPriv) @objc optional func setProperties(_ properties: [AnyHashable : Any]!) // every property of an item } extension SBObject: FinderItem {} // MARK: FinderContainer @objc public protocol FinderContainer: FinderItem { @objc optional func items() -> SBElementArray @objc optional func containers() -> SBElementArray @objc optional func folders() -> SBElementArray @objc optional func files() -> SBElementArray @objc optional func aliasFiles() -> SBElementArray @objc optional func applicationFiles() -> SBElementArray @objc optional func documentFiles() -> SBElementArray @objc optional func internetLocationFiles() -> SBElementArray @objc optional func clippings() -> SBElementArray @objc optional func packages() -> SBElementArray @objc optional var entireContents: SBObject { get } // the entire contents of the container, including the contents of its children @objc optional var expandable: Bool { get } // (NOT AVAILABLE YET) Is the container capable of being expanded as an outline? @objc optional var expanded: Bool { get } // (NOT AVAILABLE YET) Is the container opened as an outline? (can only be set for containers viewed as lists) @objc optional var completelyExpanded: Bool { get } // (NOT AVAILABLE YET) Are the container and all of its children opened as outlines? (can only be set for containers viewed as lists) @objc optional var containerWindow: SBObject { get } // the container window for this folder @objc optional func setExpanded(_ expanded: Bool) // (NOT AVAILABLE YET) Is the container opened as an outline? (can only be set for containers viewed as lists) @objc optional func setCompletelyExpanded(_ completelyExpanded: Bool) // (NOT AVAILABLE YET) Are the container and all of its children opened as outlines? (can only be set for containers viewed as lists) } extension SBObject: FinderContainer {} // MARK: FinderComputerObject @objc public protocol FinderComputerObject: FinderItem { } extension SBObject: FinderComputerObject {} // MARK: FinderDisk @objc public protocol FinderDisk: FinderContainer { @objc optional func items() -> SBElementArray @objc optional func containers() -> SBElementArray @objc optional func folders() -> SBElementArray @objc optional func files() -> SBElementArray @objc optional func aliasFiles() -> SBElementArray @objc optional func applicationFiles() -> SBElementArray @objc optional func documentFiles() -> SBElementArray @objc optional func internetLocationFiles() -> SBElementArray @objc optional func clippings() -> SBElementArray @objc optional func packages() -> SBElementArray @objc optional func id() -> Int // the unique id for this disk (unchanged while disk remains connected and Finder remains running) @objc optional var capacity: Int64 { get } // the total number of bytes (free or used) on the disk @objc optional var freeSpace: Int64 { get } // the number of free bytes left on the disk @objc optional var ejectable: Bool { get } // Can the media be ejected (floppies, CDs, and so on)? @objc optional var localVolume: Bool { get } // Is the media a local volume (as opposed to a file server)? @objc optional var startup: Bool { get } // Is this disk the boot disk? @objc optional var format: FinderEdfm { get } // the filesystem format of this disk @objc optional var journalingEnabled: Bool { get } // Does this disk do file system journaling? @objc optional var ignorePrivileges: Bool { get } // Ignore permissions on this disk? @objc optional func setIgnorePrivileges(_ ignorePrivileges: Bool) // Ignore permissions on this disk? } extension SBObject: FinderDisk {} // MARK: FinderFolder @objc public protocol FinderFolder: FinderContainer { @objc optional func items() -> SBElementArray @objc optional func containers() -> SBElementArray @objc optional func folders() -> SBElementArray @objc optional func files() -> SBElementArray @objc optional func aliasFiles() -> SBElementArray @objc optional func applicationFiles() -> SBElementArray @objc optional func documentFiles() -> SBElementArray @objc optional func internetLocationFiles() -> SBElementArray @objc optional func clippings() -> SBElementArray @objc optional func packages() -> SBElementArray } extension SBObject: FinderFolder {} // MARK: FinderDesktopObject @objc public protocol FinderDesktopObject: FinderContainer { @objc optional func items() -> SBElementArray @objc optional func containers() -> SBElementArray @objc optional func disks() -> SBElementArray @objc optional func folders() -> SBElementArray @objc optional func files() -> SBElementArray @objc optional func aliasFiles() -> SBElementArray @objc optional func applicationFiles() -> SBElementArray @objc optional func documentFiles() -> SBElementArray @objc optional func internetLocationFiles() -> SBElementArray @objc optional func clippings() -> SBElementArray @objc optional func packages() -> SBElementArray } extension SBObject: FinderDesktopObject {} // MARK: FinderTrashObject @objc public protocol FinderTrashObject: FinderContainer { @objc optional func items() -> SBElementArray @objc optional func containers() -> SBElementArray @objc optional func folders() -> SBElementArray @objc optional func files() -> SBElementArray @objc optional func aliasFiles() -> SBElementArray @objc optional func applicationFiles() -> SBElementArray @objc optional func documentFiles() -> SBElementArray @objc optional func internetLocationFiles() -> SBElementArray @objc optional func clippings() -> SBElementArray @objc optional func packages() -> SBElementArray @objc optional var warnsBeforeEmptying: Bool { get } // Display a dialog when emptying the trash? @objc optional func setWarnsBeforeEmptying(_ warnsBeforeEmptying: Bool) // Display a dialog when emptying the trash? } extension SBObject: FinderTrashObject {} // MARK: FinderFile @objc public protocol FinderFile: FinderItem { @objc optional var fileType: NSNumber { get } // the OSType identifying the type of data contained in the item @objc optional var creatorType: NSNumber { get } // the OSType identifying the application that created the item @objc optional var stationery: Bool { get } // Is the file a stationery pad? @objc optional var productVersion: String { get } // the version of the product (visible at the top of the “Get Info” window) @objc optional var version: String { get } // the version of the file (visible at the bottom of the “Get Info” window) @objc optional func setFileType(_ fileType: NSNumber!) // the OSType identifying the type of data contained in the item @objc optional func setCreatorType(_ creatorType: NSNumber!) // the OSType identifying the application that created the item @objc optional func setStationery(_ stationery: Bool) // Is the file a stationery pad? } extension SBObject: FinderFile {} // MARK: FinderAliasFile @objc public protocol FinderAliasFile: FinderFile { @objc optional var originalItem: SBObject { get } // the original item pointed to by the alias @objc optional func setOriginalItem(_ originalItem: SBObject!) // the original item pointed to by the alias } extension SBObject: FinderAliasFile {} // MARK: FinderApplicationFile @objc public protocol FinderApplicationFile: FinderFile { @objc optional func id() -> String // the bundle identifier or creator type of the application @objc optional var suggestedSize: Int { get } // (AVAILABLE IN 10.1 TO 10.4) the memory size with which the developer recommends the application be launched @objc optional var minimumSize: Int { get } // (AVAILABLE IN 10.1 TO 10.4) the smallest memory size with which the application can be launched @objc optional var preferredSize: Int { get } // (AVAILABLE IN 10.1 TO 10.4) the memory size with which the application will be launched @objc optional var acceptsHighLevelEvents: Bool { get } // Is the application high-level event aware? (OBSOLETE: always returns true) @objc optional var hasScriptingTerminology: Bool { get } // Does the process have a scripting terminology, i.e., can it be scripted? @objc optional var opensInClassic: Bool { get } // (AVAILABLE IN 10.1 TO 10.4) Should the application launch in the Classic environment? @objc optional func setMinimumSize(_ minimumSize: Int) // (AVAILABLE IN 10.1 TO 10.4) the smallest memory size with which the application can be launched @objc optional func setPreferredSize(_ preferredSize: Int) // (AVAILABLE IN 10.1 TO 10.4) the memory size with which the application will be launched @objc optional func setOpensInClassic(_ opensInClassic: Bool) // (AVAILABLE IN 10.1 TO 10.4) Should the application launch in the Classic environment? } extension SBObject: FinderApplicationFile {} // MARK: FinderDocumentFile @objc public protocol FinderDocumentFile: FinderFile { } extension SBObject: FinderDocumentFile {} // MARK: FinderInternetLocationFile @objc public protocol FinderInternetLocationFile: FinderFile { @objc optional var location: String { get } // the internet location } extension SBObject: FinderInternetLocationFile {} // MARK: FinderClipping @objc public protocol FinderClipping: FinderFile { @objc optional var clippingWindow: SBObject { get } // (NOT AVAILABLE YET) the clipping window for this clipping } extension SBObject: FinderClipping {} // MARK: FinderPackage @objc public protocol FinderPackage: FinderItem { } extension SBObject: FinderPackage {} // MARK: FinderWindow @objc public protocol FinderWindow: SBObjectProtocol, FinderGenericMethods { @objc optional func id() -> Int // the unique id for this window @objc optional var position: NSPoint { get } // the upper left position of the window @objc optional var bounds: NSRect { get } // the boundary rectangle for the window @objc optional var titled: Bool { get } // Does the window have a title bar? @objc optional var name: String { get } // the name of the window @objc optional var index: Int { get } // the number of the window in the front-to-back layer ordering @objc optional var closeable: Bool { get } // Does the window have a close box? @objc optional var floating: Bool { get } // Does the window have a title bar? @objc optional var modal: Bool { get } // Is the window modal? @objc optional var resizable: Bool { get } // Is the window resizable? @objc optional var zoomable: Bool { get } // Is the window zoomable? @objc optional var zoomed: Bool { get } // Is the window zoomed? @objc optional var visible: Bool { get } // Is the window visible (always true for open Finder windows)? @objc optional var collapsed: Bool { get } // Is the window collapsed @objc optional var properties: [AnyHashable : Any] { get } // every property of a window @objc optional func setPosition(_ position: NSPoint) // the upper left position of the window @objc optional func setBounds(_ bounds: NSRect) // the boundary rectangle for the window @objc optional func setIndex(_ index: Int) // the number of the window in the front-to-back layer ordering @objc optional func setZoomed(_ zoomed: Bool) // Is the window zoomed? @objc optional func setCollapsed(_ collapsed: Bool) // Is the window collapsed @objc optional func setProperties(_ properties: [AnyHashable : Any]!) // every property of a window } extension SBObject: FinderWindow {} // MARK: FinderFinderWindow @objc public protocol FinderFinderWindow: FinderWindow { @objc optional var target: SBObject { get } // the container at which this file viewer is targeted @objc optional var currentView: FinderEcvw { get } // the current view for the container window @objc optional var iconViewOptions: FinderIconViewOptions { get } // the icon view options for the container window @objc optional var listViewOptions: FinderListViewOptions { get } // the list view options for the container window @objc optional var columnViewOptions: FinderColumnViewOptions { get } // the column view options for the container window @objc optional var toolbarVisible: Bool { get } // Is the window's toolbar visible? @objc optional var statusbarVisible: Bool { get } // Is the window's status bar visible? @objc optional var sidebarWidth: Int { get } // the width of the sidebar for the container window @objc optional func setTarget(_ target: SBObject!) // the container at which this file viewer is targeted @objc optional func setCurrentView(_ currentView: FinderEcvw) // the current view for the container window @objc optional func setToolbarVisible(_ toolbarVisible: Bool) // Is the window's toolbar visible? @objc optional func setStatusbarVisible(_ statusbarVisible: Bool) // Is the window's status bar visible? @objc optional func setSidebarWidth(_ sidebarWidth: Int) // the width of the sidebar for the container window } extension SBObject: FinderFinderWindow {} // MARK: FinderDesktopWindow @objc public protocol FinderDesktopWindow: FinderFinderWindow { } extension SBObject: FinderDesktopWindow {} // MARK: FinderInformationWindow @objc public protocol FinderInformationWindow: FinderWindow { @objc optional var item: SBObject { get } // the item from which this window was opened @objc optional var currentPanel: FinderIpnl { get } // the current panel in the information window @objc optional func setCurrentPanel(_ currentPanel: FinderIpnl) // the current panel in the information window } extension SBObject: FinderInformationWindow {} // MARK: FinderPreferencesWindow @objc public protocol FinderPreferencesWindow: FinderWindow { @objc optional var currentPanel: FinderPple { get } // The current panel in the Finder preferences window @objc optional func setCurrentPanel(_ currentPanel: FinderPple) // The current panel in the Finder preferences window } extension SBObject: FinderPreferencesWindow {} // MARK: FinderClippingWindow @objc public protocol FinderClippingWindow: FinderWindow { } extension SBObject: FinderClippingWindow {} // MARK: FinderProcess @objc public protocol FinderProcess: SBObjectProtocol, FinderGenericMethods { @objc optional var name: String { get } // the name of the process @objc optional var visible: Bool { get } // Is the process' layer visible? @objc optional var frontmost: Bool { get } // Is the process the frontmost process? @objc optional var file: SBObject { get } // the file from which the process was launched @objc optional var fileType: NSNumber { get } // the OSType of the file type of the process @objc optional var creatorType: NSNumber { get } // the OSType of the creator of the process (the signature) @objc optional var acceptsHighLevelEvents: Bool { get } // Is the process high-level event aware (accepts open application, open document, print document, and quit)? @objc optional var acceptsRemoteEvents: Bool { get } // Does the process accept remote events? @objc optional var hasScriptingTerminology: Bool { get } // Does the process have a scripting terminology, i.e., can it be scripted? @objc optional var totalPartitionSize: Int { get } // the size of the partition with which the process was launched @objc optional var partitionSpaceUsed: Int { get } // the number of bytes currently used in the process' partition @objc optional func setVisible(_ visible: Bool) // Is the process' layer visible? @objc optional func setFrontmost(_ frontmost: Bool) // Is the process the frontmost process? } extension SBObject: FinderProcess {} // MARK: FinderApplicationProcess @objc public protocol FinderApplicationProcess: FinderProcess { @objc optional var applicationFile: FinderApplicationFile { get } // the application file from which this process was launched } extension SBObject: FinderApplicationProcess {} // MARK: FinderDeskAccessoryProcess @objc public protocol FinderDeskAccessoryProcess: FinderProcess { @objc optional var deskAccessoryFile: SBObject { get } // the desk accessory file from which this process was launched } extension SBObject: FinderDeskAccessoryProcess {} // MARK: FinderPreferences @objc public protocol FinderPreferences: SBObjectProtocol, FinderGenericMethods { @objc optional var window: FinderPreferencesWindow { get } // the window that would open if Finder preferences was opened @objc optional var iconViewOptions: FinderIconViewOptions { get } // the default icon view options @objc optional var listViewOptions: FinderListViewOptions { get } // the default list view options @objc optional var columnViewOptions: FinderColumnViewOptions { get } // the column view options for all windows @objc optional var foldersSpringOpen: Bool { get } // Spring open folders after the specified delay? @objc optional var delayBeforeSpringing: Double { get } // the delay before springing open a container in seconds (from 0.167 to 1.169) @objc optional var desktopShowsHardDisks: Bool { get } // Hard disks appear on the desktop? @objc optional var desktopShowsExternalHardDisks: Bool { get } // External hard disks appear on the desktop? @objc optional var desktopShowsRemovableMedia: Bool { get } // CDs, DVDs, and iPods appear on the desktop? @objc optional var desktopShowsConnectedServers: Bool { get } // Connected servers appear on the desktop? @objc optional var newWindowTarget: SBObject { get } // target location for a newly-opened Finder window @objc optional var foldersOpenInNewWindows: Bool { get } // Folders open into new windows? @objc optional var foldersOpenInNewTabs: Bool { get } // Folders open into new tabs? @objc optional var newWindowsOpenInColumnView: Bool { get } // Open new windows in column view? @objc optional var allNameExtensionsShowing: Bool { get } // Show name extensions, even for items whose “extension hidden” is true? @objc optional func setFoldersSpringOpen(_ foldersSpringOpen: Bool) // Spring open folders after the specified delay? @objc optional func setDelayBeforeSpringing(_ delayBeforeSpringing: Double) // the delay before springing open a container in seconds (from 0.167 to 1.169) @objc optional func setDesktopShowsHardDisks(_ desktopShowsHardDisks: Bool) // Hard disks appear on the desktop? @objc optional func setDesktopShowsExternalHardDisks(_ desktopShowsExternalHardDisks: Bool) // External hard disks appear on the desktop? @objc optional func setDesktopShowsRemovableMedia(_ desktopShowsRemovableMedia: Bool) // CDs, DVDs, and iPods appear on the desktop? @objc optional func setDesktopShowsConnectedServers(_ desktopShowsConnectedServers: Bool) // Connected servers appear on the desktop? @objc optional func setNewWindowTarget(_ newWindowTarget: SBObject!) // target location for a newly-opened Finder window @objc optional func setFoldersOpenInNewWindows(_ foldersOpenInNewWindows: Bool) // Folders open into new windows? @objc optional func setFoldersOpenInNewTabs(_ foldersOpenInNewTabs: Bool) // Folders open into new tabs? @objc optional func setNewWindowsOpenInColumnView(_ newWindowsOpenInColumnView: Bool) // Open new windows in column view? @objc optional func setAllNameExtensionsShowing(_ allNameExtensionsShowing: Bool) // Show name extensions, even for items whose “extension hidden” is true? } extension SBObject: FinderPreferences {} // MARK: FinderLabel @objc public protocol FinderLabel: SBObjectProtocol, FinderGenericMethods { @objc optional var name: String { get } // the name associated with the label @objc optional var index: Int { get } // the index in the front-to-back ordering within its container @objc optional var color: NSColor { get } // the color associated with the label @objc optional func setName(_ name: String!) // the name associated with the label @objc optional func setIndex(_ index: Int) // the index in the front-to-back ordering within its container @objc optional func setColor(_ color: NSColor!) // the color associated with the label } extension SBObject: FinderLabel {} // MARK: FinderIconFamily @objc public protocol FinderIconFamily: SBObjectProtocol, FinderGenericMethods { @objc optional var largeMonochromeIconAndMask: Any { get } // the large black-and-white icon and the mask for large icons @objc optional var large8BitMask: Any { get } // the large 8-bit mask for large 32-bit icons @objc optional var large32BitIcon: Any { get } // the large 32-bit color icon @objc optional var large8BitIcon: Any { get } // the large 8-bit color icon @objc optional var large4BitIcon: Any { get } // the large 4-bit color icon @objc optional var smallMonochromeIconAndMask: Any { get } // the small black-and-white icon and the mask for small icons @objc optional var small8BitMask: Any { get } // the small 8-bit mask for small 32-bit icons @objc optional var small32BitIcon: Any { get } // the small 32-bit color icon @objc optional var small8BitIcon: Any { get } // the small 8-bit color icon @objc optional var small4BitIcon: Any { get } // the small 4-bit color icon } extension SBObject: FinderIconFamily {} // MARK: FinderIconViewOptions @objc public protocol FinderIconViewOptions: SBObjectProtocol, FinderGenericMethods { @objc optional var arrangement: FinderEarr { get } // the property by which to keep icons arranged @objc optional var iconSize: Int { get } // the size of icons displayed in the icon view @objc optional var showsItemInfo: Bool { get } // additional info about an item displayed in icon view @objc optional var showsIconPreview: Bool { get } // displays a preview of the item in icon view @objc optional var textSize: Int { get } // the size of the text displayed in the icon view @objc optional var labelPosition: FinderEpos { get } // the location of the label in reference to the icon @objc optional var backgroundPicture: FinderFile { get } // the background picture of the icon view @objc optional var backgroundColor: NSColor { get } // the background color of the icon view @objc optional func setArrangement(_ arrangement: FinderEarr) // the property by which to keep icons arranged @objc optional func setIconSize(_ iconSize: Int) // the size of icons displayed in the icon view @objc optional func setShowsItemInfo(_ showsItemInfo: Bool) // additional info about an item displayed in icon view @objc optional func setShowsIconPreview(_ showsIconPreview: Bool) // displays a preview of the item in icon view @objc optional func setTextSize(_ textSize: Int) // the size of the text displayed in the icon view @objc optional func setLabelPosition(_ labelPosition: FinderEpos) // the location of the label in reference to the icon @objc optional func setBackgroundPicture(_ backgroundPicture: FinderFile!) // the background picture of the icon view @objc optional func setBackgroundColor(_ backgroundColor: NSColor!) // the background color of the icon view } extension SBObject: FinderIconViewOptions {} // MARK: FinderColumnViewOptions @objc public protocol FinderColumnViewOptions: SBObjectProtocol, FinderGenericMethods { @objc optional var textSize: Int { get } // the size of the text displayed in the column view @objc optional var showsIcon: Bool { get } // displays an icon next to the label in column view @objc optional var showsIconPreview: Bool { get } // displays a preview of the item in column view @objc optional var showsPreviewColumn: Bool { get } // displays the preview column in column view @objc optional var disclosesPreviewPane: Bool { get } // discloses the preview pane of the preview column in column view @objc optional func setTextSize(_ textSize: Int) // the size of the text displayed in the column view @objc optional func setShowsIcon(_ showsIcon: Bool) // displays an icon next to the label in column view @objc optional func setShowsIconPreview(_ showsIconPreview: Bool) // displays a preview of the item in column view @objc optional func setShowsPreviewColumn(_ showsPreviewColumn: Bool) // displays the preview column in column view @objc optional func setDisclosesPreviewPane(_ disclosesPreviewPane: Bool) // discloses the preview pane of the preview column in column view } extension SBObject: FinderColumnViewOptions {} // MARK: FinderListViewOptions @objc public protocol FinderListViewOptions: SBObjectProtocol, FinderGenericMethods { @objc optional func columns() -> SBElementArray @objc optional var calculatesFolderSizes: Bool { get } // Are folder sizes calculated and displayed in the window? @objc optional var showsIconPreview: Bool { get } // displays a preview of the item in list view @objc optional var iconSize: FinderLvic { get } // the size of icons displayed in the list view @objc optional var textSize: Int { get } // the size of the text displayed in the list view @objc optional var sortColumn: FinderColumn { get } // the column that the list view is sorted on @objc optional var usesRelativeDates: Bool { get } // Are relative dates (e.g., today, yesterday) shown in the list view? @objc optional func setCalculatesFolderSizes(_ calculatesFolderSizes: Bool) // Are folder sizes calculated and displayed in the window? @objc optional func setShowsIconPreview(_ showsIconPreview: Bool) // displays a preview of the item in list view @objc optional func setIconSize(_ iconSize: FinderLvic) // the size of icons displayed in the list view @objc optional func setTextSize(_ textSize: Int) // the size of the text displayed in the list view @objc optional func setSortColumn(_ sortColumn: FinderColumn!) // the column that the list view is sorted on @objc optional func setUsesRelativeDates(_ usesRelativeDates: Bool) // Are relative dates (e.g., today, yesterday) shown in the list view? } extension SBObject: FinderListViewOptions {} // MARK: FinderColumn @objc public protocol FinderColumn: SBObjectProtocol, FinderGenericMethods { @objc optional var index: Int { get } // the index in the front-to-back ordering within its container @objc optional var name: FinderElsv { get } // the column name @objc optional var sortDirection: FinderSodr { get } // The direction in which the window is sorted @objc optional var width: Int { get } // the width of this column @objc optional var minimumWidth: Int { get } // the minimum allowed width of this column @objc optional var maximumWidth: Int { get } // the maximum allowed width of this column @objc optional var visible: Bool { get } // is this column visible @objc optional func setIndex(_ index: Int) // the index in the front-to-back ordering within its container @objc optional func setSortDirection(_ sortDirection: FinderSodr) // The direction in which the window is sorted @objc optional func setWidth(_ width: Int) // the width of this column @objc optional func setVisible(_ visible: Bool) // is this column visible } extension SBObject: FinderColumn {} // MARK: FinderAliasList @objc public protocol FinderAliasList: SBObjectProtocol, FinderGenericMethods { } extension SBObject: FinderAliasList {} ================================================ FILE: OpenInTerminalCore/ScriptingBridge/Terminal.swift ================================================ import AppKit import ScriptingBridge // MARK: TerminalSaveOptions @objc public enum TerminalSaveOptions : AEKeyword { case yes = 0x79657320 /* 'yes ' */ case no = 0x6e6f2020 /* 'no ' */ case ask = 0x61736b20 /* 'ask ' */ } // MARK: TerminalPrintingErrorHandling @objc public enum TerminalPrintingErrorHandling : AEKeyword { case standard = 0x6c777374 /* 'lwst' */ case detailed = 0x6c776474 /* 'lwdt' */ } // MARK: TerminalGenericMethods @objc public protocol TerminalGenericMethods { @objc optional func closeSaving(_ saving: TerminalSaveOptions, savingIn: URL!) // Close a document. @objc optional func saveIn(_ in_: URL!) // Save a document. @objc optional func printWithProperties(_ withProperties: [AnyHashable : Any]!, printDialog: Bool) // Print a document. @objc optional func delete() // Delete an object. @objc optional func duplicateTo(_ to: SBObject!, withProperties: [AnyHashable : Any]!) // Copy object(s) and put the copies at a new location. @objc optional func exists() -> Bool // Verify if an object exists. @objc optional func moveTo(_ to: SBObject!) // Move object(s) to a new location. } // MARK: TerminalApplication @objc public protocol TerminalApplication: SBApplicationProtocol { @objc optional func windows() -> SBElementArray @objc optional var name: String { get } // The name of the application. @objc optional var frontmost: Bool { get } // Is this the frontmost (active) application? @objc optional var version: String { get } // The version of the application. @objc optional func `open`(_ x: [URL]!) // Open a document. @objc optional func print(_ x: Any!, withProperties: [AnyHashable : Any]!, printDialog: Bool) // Print a document. @objc optional func quitSaving(_ saving: TerminalSaveOptions) // Quit the application. @objc optional func doScript(_ x: String!, in in_: Any!) -> TerminalTab // Runs a UNIX shell script or command. @objc optional func settingsSets() -> SBElementArray @objc optional var defaultSettings: TerminalSettingsSet { get } // The settings set used for new windows. @objc optional var startupSettings: TerminalSettingsSet { get } // The settings set used for the window created on application startup. @objc optional func setDefaultSettings(_ defaultSettings: TerminalSettingsSet!) // The settings set used for new windows. @objc optional func setStartupSettings(_ startupSettings: TerminalSettingsSet!) // The settings set used for the window created on application startup. } extension SBApplication: TerminalApplication {} // MARK: TerminalWindow @objc public protocol TerminalWindow: SBObjectProtocol, TerminalGenericMethods { @objc optional func tabs() -> SBElementArray @objc optional var name: String { get } // The full title of the window. @objc optional func id() -> Int // The unique identifier of the window. @objc optional var index: Int { get } // The index of the window, ordered front to back. @objc optional var bounds: NSRect { get } // The bounding rectangle of the window. @objc optional var closeable: Bool { get } // Whether the window has a close box. @objc optional var miniaturizable: Bool { get } // Whether the window can be minimized. @objc optional var miniaturized: Bool { get } // Whether the window is currently minimized. @objc optional var resizable: Bool { get } // Whether the window can be resized. @objc optional var visible: Bool { get } // Whether the window is currently visible. @objc optional var zoomable: Bool { get } // Whether the window can be zoomed. @objc optional var zoomed: Bool { get } // Whether the window is currently zoomed. @objc optional var frontmost: Bool { get } // Whether the window is currently the frontmost Terminal window. @objc optional var selectedTab: TerminalTab { get } @objc optional var position: NSPoint { get } // The position of the window, relative to the upper left corner of the screen. @objc optional var origin: NSPoint { get } // The position of the window, relative to the lower left corner of the screen. @objc optional var size: NSPoint { get } // The width and height of the window @objc optional var frame: NSRect { get } // The bounding rectangle, relative to the lower left corner of the screen. @objc optional func setIndex(_ index: Int) // The index of the window, ordered front to back. @objc optional func setBounds(_ bounds: NSRect) // The bounding rectangle of the window. @objc optional func setMiniaturized(_ miniaturized: Bool) // Whether the window is currently minimized. @objc optional func setVisible(_ visible: Bool) // Whether the window is currently visible. @objc optional func setZoomed(_ zoomed: Bool) // Whether the window is currently zoomed. @objc optional func setFrontmost(_ frontmost: Bool) // Whether the window is currently the frontmost Terminal window. @objc optional func setSelectedTab(_ selectedTab: TerminalTab!) @objc optional func setPosition(_ position: NSPoint) // The position of the window, relative to the upper left corner of the screen. @objc optional func setOrigin(_ origin: NSPoint) // The position of the window, relative to the lower left corner of the screen. @objc optional func setSize(_ size: NSPoint) // The width and height of the window @objc optional func setFrame(_ frame: NSRect) // The bounding rectangle, relative to the lower left corner of the screen. } extension SBObject: TerminalWindow {} // MARK: TerminalSettingsSet @objc public protocol TerminalSettingsSet: SBObjectProtocol, TerminalGenericMethods { @objc optional func id() -> Int // The unique identifier of the settings set. @objc optional var name: String { get } // The name of the settings set. @objc optional var numberOfRows: Int { get } // The number of rows displayed in the tab. @objc optional var numberOfColumns: Int { get } // The number of columns displayed in the tab. @objc optional var cursorColor: NSColor { get } // The cursor color for the tab. @objc optional var backgroundColor: NSColor { get } // The background color for the tab. @objc optional var normalTextColor: NSColor { get } // The normal text color for the tab. @objc optional var boldTextColor: NSColor { get } // The bold text color for the tab. @objc optional var fontName: String { get } // The name of the font used to display the tab’s contents. @objc optional var fontSize: Int { get } // The size of the font used to display the tab’s contents. @objc optional var fontAntialiasing: Bool { get } // Whether the font used to display the tab’s contents is antialiased. @objc optional var cleanCommands: [String] { get } // The processes which will be ignored when checking whether a tab can be closed without showing a prompt. @objc optional var titleDisplaysDeviceName: Bool { get } // Whether the title contains the device name. @objc optional var titleDisplaysShellPath: Bool { get } // Whether the title contains the shell path. @objc optional var titleDisplaysWindowSize: Bool { get } // Whether the title contains the tab’s size, in rows and columns. @objc optional var titleDisplaysSettingsName: Bool { get } // Whether the title contains the settings name. @objc optional var titleDisplaysCustomTitle: Bool { get } // Whether the title contains a custom title. @objc optional var customTitle: String { get } // The tab’s custom title. @objc optional func setName(_ name: String!) // The name of the settings set. @objc optional func setNumberOfRows(_ numberOfRows: Int) // The number of rows displayed in the tab. @objc optional func setNumberOfColumns(_ numberOfColumns: Int) // The number of columns displayed in the tab. @objc optional func setCursorColor(_ cursorColor: NSColor!) // The cursor color for the tab. @objc optional func setBackgroundColor(_ backgroundColor: NSColor!) // The background color for the tab. @objc optional func setNormalTextColor(_ normalTextColor: NSColor!) // The normal text color for the tab. @objc optional func setBoldTextColor(_ boldTextColor: NSColor!) // The bold text color for the tab. @objc optional func setFontName(_ fontName: String!) // The name of the font used to display the tab’s contents. @objc optional func setFontSize(_ fontSize: Int) // The size of the font used to display the tab’s contents. @objc optional func setFontAntialiasing(_ fontAntialiasing: Bool) // Whether the font used to display the tab’s contents is antialiased. @objc optional func setCleanCommands(_ cleanCommands: [String]!) // The processes which will be ignored when checking whether a tab can be closed without showing a prompt. @objc optional func setTitleDisplaysDeviceName(_ titleDisplaysDeviceName: Bool) // Whether the title contains the device name. @objc optional func setTitleDisplaysShellPath(_ titleDisplaysShellPath: Bool) // Whether the title contains the shell path. @objc optional func setTitleDisplaysWindowSize(_ titleDisplaysWindowSize: Bool) // Whether the title contains the tab’s size, in rows and columns. @objc optional func setTitleDisplaysSettingsName(_ titleDisplaysSettingsName: Bool) // Whether the title contains the settings name. @objc optional func setTitleDisplaysCustomTitle(_ titleDisplaysCustomTitle: Bool) // Whether the title contains a custom title. @objc optional func setCustomTitle(_ customTitle: String!) // The tab’s custom title. } extension SBObject: TerminalSettingsSet {} // MARK: TerminalTab @objc public protocol TerminalTab: SBObjectProtocol, TerminalGenericMethods { @objc optional var numberOfRows: Int { get } // The number of rows displayed in the tab. @objc optional var numberOfColumns: Int { get } // The number of columns displayed in the tab. @objc optional var contents: String { get } // The currently visible contents of the tab. @objc optional var history: String { get } // The contents of the entire scrolling buffer of the tab. @objc optional var busy: Bool { get } // Whether the tab is busy running a process. @objc optional var processes: [String] { get } // The processes currently running in the tab. @objc optional var selected: Bool { get } // Whether the tab is selected. @objc optional var titleDisplaysCustomTitle: Bool { get } // Whether the title contains a custom title. @objc optional var customTitle: String { get } // The tab’s custom title. @objc optional var tty: String { get } // The tab’s TTY device. @objc optional var currentSettings: TerminalSettingsSet { get } // The set of settings which control the tab’s behavior and appearance. @objc optional var cursorColor: NSColor { get } // The cursor color for the tab. @objc optional var backgroundColor: NSColor { get } // The background color for the tab. @objc optional var normalTextColor: NSColor { get } // The normal text color for the tab. @objc optional var boldTextColor: NSColor { get } // The bold text color for the tab. @objc optional var cleanCommands: [String] { get } // The processes which will be ignored when checking whether a tab can be closed without showing a prompt. @objc optional var titleDisplaysDeviceName: Bool { get } // Whether the title contains the device name. @objc optional var titleDisplaysShellPath: Bool { get } // Whether the title contains the shell path. @objc optional var titleDisplaysWindowSize: Bool { get } // Whether the title contains the tab’s size, in rows and columns. @objc optional var titleDisplaysFileName: Bool { get } // Whether the title contains the file name. @objc optional var fontName: String { get } // The name of the font used to display the tab’s contents. @objc optional var fontSize: Int { get } // The size of the font used to display the tab’s contents. @objc optional var fontAntialiasing: Bool { get } // Whether the font used to display the tab’s contents is antialiased. @objc optional func setNumberOfRows(_ numberOfRows: Int) // The number of rows displayed in the tab. @objc optional func setNumberOfColumns(_ numberOfColumns: Int) // The number of columns displayed in the tab. @objc optional func setSelected(_ selected: Bool) // Whether the tab is selected. @objc optional func setTitleDisplaysCustomTitle(_ titleDisplaysCustomTitle: Bool) // Whether the title contains a custom title. @objc optional func setCustomTitle(_ customTitle: String!) // The tab’s custom title. @objc optional func setCurrentSettings(_ currentSettings: TerminalSettingsSet!) // The set of settings which control the tab’s behavior and appearance. @objc optional func setCursorColor(_ cursorColor: NSColor!) // The cursor color for the tab. @objc optional func setBackgroundColor(_ backgroundColor: NSColor!) // The background color for the tab. @objc optional func setNormalTextColor(_ normalTextColor: NSColor!) // The normal text color for the tab. @objc optional func setBoldTextColor(_ boldTextColor: NSColor!) // The bold text color for the tab. @objc optional func setCleanCommands(_ cleanCommands: [String]!) // The processes which will be ignored when checking whether a tab can be closed without showing a prompt. @objc optional func setTitleDisplaysDeviceName(_ titleDisplaysDeviceName: Bool) // Whether the title contains the device name. @objc optional func setTitleDisplaysShellPath(_ titleDisplaysShellPath: Bool) // Whether the title contains the shell path. @objc optional func setTitleDisplaysWindowSize(_ titleDisplaysWindowSize: Bool) // Whether the title contains the tab’s size, in rows and columns. @objc optional func setTitleDisplaysFileName(_ titleDisplaysFileName: Bool) // Whether the title contains the file name. @objc optional func setFontName(_ fontName: String!) // The name of the font used to display the tab’s contents. @objc optional func setFontSize(_ fontSize: Int) // The size of the font used to display the tab’s contents. @objc optional func setFontAntialiasing(_ fontAntialiasing: Bool) // Whether the font used to display the tab’s contents is antialiased. } extension SBObject: TerminalTab {} ================================================ FILE: OpenInTerminalCore/SupportedApps.swift ================================================ // // SupportedApps.swift // OpenInTerminalCore // // Created by Jianing Wang on 2020/12/5. // Copyright © 2020 Jianing Wang. All rights reserved. // import Foundation public enum SupportedApps: String, CaseIterable { // MARK: - Terminals case terminal = "Terminal" case iTerm = "iTerm" case hyper = "Hyper" case alacritty = "Alacritty" case kitty = "kitty" case wezterm = "WezTerm" case tabby = "Tabby" case warp = "Warp" case githubDesktop = "GitHub Desktop" case fork = "Fork" case ghostty = "Ghostty" // MARK: - Editors case textEdit = "TextEdit" case xcode = "Xcode" case vscode = "Visual Studio Code" case atom = "Atom" case sublime = "Sublime Text" case vscodium = "VSCodium" case bbedit = "BBEdit" case vscodeInsiders = "Visual Studio Code - Insiders" case textMate = "TextMate" case cotEditor = "CotEditor" case macVim = "MacVim" case typora = "Typora" case nova = "Nova" case cursor = "Cursor" case neovim = "neovim" case zed = "Zed" // JetBrains case appCode = "AppCode" case cLion = "CLion" case fleet = "Fleet" case goLand = "GoLand" case intelliJIDEA = "IntelliJ IDEA" case phpStorm = "PhpStorm" case pyCharm = "PyCharm" case rubyMine = "RubyMine" case webStorm = "WebStorm" case androidstudio = "Android Studio" public var name: String { return self.rawValue } public var shortName: String { switch self { case .vscode: return "VSCode" case .sublime: return "Sublime" case .vscodeInsiders: return "VSCodeInsiders" case .intelliJIDEA: return "IntelliJ_IDEA" case .androidstudio: return "Android_Studio" default: return self.rawValue } } public var type: AppType { switch self { case .terminal, .iTerm, .hyper, .alacritty, .kitty, .wezterm, .tabby, .warp, .githubDesktop, .fork, .ghostty: return .terminal default: return .editor } } public static func isSupported(_ app: App) -> Bool { for sa in SupportedApps.allCases { if sa.name == app.name { return true } } return false } public static func `is`(_ app: App, is supported: SupportedApps) -> Bool { return app.name == supported.name } public static var terminals: [SupportedApps] { return SupportedApps.allCases.filter { $0.type == .terminal } } public static var editors: [SupportedApps] { return SupportedApps.allCases.filter { $0.type == .editor } } public var bundleId: String { switch self { // Terminals case .terminal: return "com.apple.Terminal" case .iTerm: return "com.googlecode.iterm2" case .hyper: return "co.zeit.hyper" case .alacritty: return "io.alacritty" case .kitty: return "net.kovidgoyal.kitty" case .wezterm: return "com.github.wez.wezterm" case .tabby: return "org.tabby" case .warp: return "dev.warp" case .githubDesktop: return "" case .fork: return "" case .ghostty: return "com.mitchellh.ghostty" // Editors case .textEdit: return "com.apple.TextEdit" case .xcode: return "com.apple.Xcode" case .vscode: return "com.microsoft.VSCode" case .atom: return "com.github.atom" case .sublime: return "com.sublimetext.3" case .vscodium: return "com.visualstudio.code.oss" case .bbedit: return "com.barebones.bbedit" case .vscodeInsiders: return "com.microsoft.VSCodeInsiders" case .textMate: return "com.macromates.TextMate" case .cotEditor: return "" case .macVim: return "org.vim.MacVim" case .typora: return "abnerworks.Typora" case .nova: return "com.panic.Nova" case .cursor: return "com.todesktop.230313mzl4w4u92" case .appCode: return "com.jetbrains.appcode" case .cLion: return "com.jetbrains.clion" case .fleet: return "com.jetbrains.fleet" case .goLand: return "com.jetbrains.goland" case .intelliJIDEA: return "com.jetbrains.intellij" case .phpStorm: return "com.jetbrains.PhpStorm" case .pyCharm: return "com.jetbrains.pycharm" case .rubyMine: return "com.jetbrains.rubymine" case .webStorm: return "com.jetbrains.webstorm" case .androidstudio: return "" case .neovim: return "" case .zed: return "" } } public var app: App { var app = App(name: self.name, type: self.type) app.bundleId = self.bundleId return app } } ================================================ FILE: OpenInTerminalFinderExtension/FinderAssets.xcassets/Contents.json ================================================ { "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: OpenInTerminalFinderExtension/FinderAssets.xcassets/Icon.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Finder_extension_icon.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "Finder_extension_icon@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "Finder_extension_icon@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 }, "properties" : { "template-rendering-intent" : "template" } } ================================================ FILE: OpenInTerminalFinderExtension/FinderSync.swift ================================================ // // FinderSync.swift // OpenInTerminalFinderExtension // // Created by Cameron Ingham on 4/17/19. // Copyright © 2019 Cameron Ingham. All rights reserved. // import Cocoa import FinderSync import OpenInTerminalCore import Carbon class FinderSync: FIFinderSync { override init() { super.init() let finderSync = FIFinderSyncController.default() if let mountedVolumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil, options: [.skipHiddenVolumes]) { finderSync.directoryURLs = Set(mountedVolumes) } // Monitor volumes let notificationCenter = NSWorkspace.shared.notificationCenter notificationCenter.addObserver(forName: NSWorkspace.didMountNotification, object: nil, queue: .main) { notification in if let volumeURL = notification.userInfo?[NSWorkspace.volumeURLUserInfoKey] as? URL { finderSync.directoryURLs.insert(volumeURL) } } } override var toolbarItemName: String { return NSLocalizedString("toolbar.item_name", comment: "Open in Terminal") } override var toolbarItemToolTip: String { return NSLocalizedString("toolbar.item_tooltip", comment: "Open current directory in Terminal.") } override var toolbarItemImage: NSImage { return NSImage(named: "Icon")! } override func menu(for menuKind: FIMenuKind) -> NSMenu { var menu = NSMenu(title: "") switch menuKind { case .contextualMenuForContainer, .contextualMenuForItems: // need to hide or not let isHideContextMenuItems = DefaultsManager.shared.isHideContextMenuItems guard !isHideContextMenuItems else { return NSMenu() } // show custom menu or default let isCustomMenuApplyToContext = DefaultsManager.shared.isCustomMenuApplyToContext if isCustomMenuApplyToContext { menu = createCustomMenu() } else { menu = createDefaultMenu() } case .toolbarItemMenu: // show custom menu or default let isCustomMenuApplyToToolbar = DefaultsManager.shared.isCustomMenuApplyToToolbar if isCustomMenuApplyToToolbar { menu = createCustomMenu() } else { menu = createDefaultMenu() } default: break } return menu } var scriptPath: URL? { return try? FileManager.default.url(for: .applicationScriptsDirectory, in: .userDomainMask, appropriateFor: nil, create: true) } func fileScriptPath(fileName: String) -> URL? { return scriptPath? .appendingPathComponent(fileName) .appendingPathExtension("scpt") } var copyPathItem: NSMenuItem { get { let copyPathItem = NSMenuItem(title: NSLocalizedString("menu.copy_path_to_clipboard", comment: "Copy path to Clipboard"), action: #selector(copyPathToClipboard), keyEquivalent: "") if DefaultsManager.shared.customMenuIconOption == .simple { let copyPathIcon = NSImage(named: "context_menu_icon_path") copyPathItem.image = copyPathIcon } else if DefaultsManager.shared.customMenuIconOption == .original { let copyPathIcon = NSImage(named: "context_menu_icon_color_path") copyPathItem.image = copyPathIcon } return copyPathItem } } func createDefaultMenu() -> NSMenu { let menu = NSMenu(title: "") guard let terminal = DefaultsManager.shared.defaultTerminal else { return menu } let terminalTitle = terminal.name let openInTerminalItem = NSMenuItem(title: terminalTitle, action: #selector(openDefaultTerminal), keyEquivalent: "") let terminalIcon = DefaultsManager.shared.getAppIcon(terminal) openInTerminalItem.image = terminalIcon menu.addItem(openInTerminalItem) guard let editor = DefaultsManager.shared.defaultEditor else { return menu } let editorTitle = editor.name let openInEditorItem = NSMenuItem(title: editorTitle, action: #selector(openDefaultEditor), keyEquivalent: "") let editorIcon = DefaultsManager.shared.getAppIcon(editor) openInEditorItem.image = editorIcon menu.addItem(openInEditorItem) // add "Copy Path" menu.addItem(self.copyPathItem) return menu } func createCustomMenu() -> NSMenu { let menu = NSMenu(title: "") // get saved custom apps guard let customApps = DefaultsManager.shared.customMenuOptions else { return menu } customApps.forEach { app in let itemTitle = app.name let menuItem = NSMenuItem(title: itemTitle, action: #selector(customMenuItemClicked), keyEquivalent: "") let appIcon = DefaultsManager.shared.getAppIcon(app) menuItem.image = appIcon menu.addItem(menuItem) } // add "Copy Path" menu.addItem(self.copyPathItem) return menu } // MARK: - Actions func getSelectedPathsFromFinder() -> [URL] { var urls = [URL]() if let items = FIFinderSyncController.default().selectedItemURLs(), items.count > 0 { items.forEach { urls.append($0) } } else if let url = FIFinderSyncController.default().targetedURL() { urls.append(url) } return urls } func open(_ app: App) { let urls = getSelectedPathsFromFinder() do { try app.openInSandbox(urls) } catch { logw("Failed to open \(app.name) with \(urls)") } } // func openTerminal(_ terminal: TerminalType) { // var scriptPath: URL // if terminal == .terminal, // let newOption = DefaultsManager.shared.getNewOption(.terminal), // newOption == .tab { // guard let fileScriptPath = fileScriptPath(fileName: terminal.rawValue + "-tab") else { return } // scriptPath = fileScriptPath // } else { // guard let fileScriptPath = fileScriptPath(fileName: terminal.rawValue) else { return } // scriptPath = fileScriptPath // } // guard FileManager.default.fileExists(atPath: scriptPath.path) else { return } // guard let script = try? NSUserAppleScriptTask(url: scriptPath) else { return } // script.execute(completionHandler: nil) // } // // func openEditor(_ editor: EditorType) { // if (editor == .vscode) { // var path = "open -a Visual\\ Studio\\ Code" // if let items = FIFinderSyncController.default().selectedItemURLs(), items.count > 0 { // items.forEach { (url) in // path += " \(url.path.specialCharEscaped2)" // } // } else if let url = FIFinderSyncController.default().targetedURL() { // path = url.path.specialCharEscaped2 // } else { // return // } // let appleScript = try! NSUserAppleScriptTask(url: fileScriptPath(fileName: editor.rawValue)!) // appleScript.execute(withAppleEvent: getScriptEvent(functionName: "openVSCode", path)) { (appleEvent, error) in // if let error = error { // print(error) // } // } // } else { // guard let scriptPath = fileScriptPath(fileName: editor.rawValue) else { return } // guard FileManager.default.fileExists(atPath: scriptPath.path) else { return } // guard let script = try? NSUserAppleScriptTask(url: scriptPath) else { return } // script.execute(completionHandler: nil) // } // } // MARK: - Menu Actions @objc func openDefaultTerminal() { guard let terminal = DefaultsManager.shared.defaultTerminal else { return } open(terminal) } @objc func openDefaultEditor() { guard let editor = DefaultsManager.shared.defaultEditor else { return } open(editor) } @objc func customMenuItemClicked(_ sender: NSMenuItem) { guard let customApps = DefaultsManager.shared.customMenuOptions else { return } let appName = sender.title for app in customApps { if app.name == appName { open(app) break } } } @objc func copyPathToClipboard() { let urls = getSelectedPathsFromFinder() var paths = urls.map { $0.path } if DefaultsManager.shared.isPathEscaped { paths = paths.map { $0.specialCharEscaped() } } let pathString = paths.joined(separator: "\n") // Set string NSPasteboard.general.clearContents() NSPasteboard.general.setString(pathString, forType: .string) } } fileprivate extension String { subscript(_ range: CountableRange) -> String { let start = index(startIndex, offsetBy: max(0, range.lowerBound)) let end = index(start, offsetBy: min(self.count - range.lowerBound, range.upperBound - range.lowerBound)) return String(self[start..) -> String { let start = index(startIndex, offsetBy: max(0, range.lowerBound)) return String(self[start...]) } } ================================================ FILE: OpenInTerminalFinderExtension/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName OpenInTerminalFinderExtension CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType XPC! CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion 1 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) LSUIElement NSExtension NSExtensionAttributes NSExtensionPointIdentifier com.apple.FinderSync NSExtensionPrincipalClass $(PRODUCT_MODULE_NAME).FinderSync NSHumanReadableCopyright Copyright © 2019 Jianing Wang. All rights reserved. NSPrincipalClass NSApplication ================================================ FILE: OpenInTerminalFinderExtension/OpenInTerminalFinderExtension.entitlements ================================================ com.apple.security.app-sandbox com.apple.security.application-groups group.wang.jianing.app.OpenInTerminal com.apple.security.automation.apple-events com.apple.security.files.user-selected.read-only ================================================ FILE: OpenInTerminalHelper/AppDelegate.swift ================================================ // // AppDelegate.swift // OpenInTerminalHelper // // Created by Jianing Wang on 2019/5/5. // Copyright © 2019 Jianing Wang. All rights reserved. // import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { public func applicationDidFinishLaunching(_ aNotification: Notification) { let mainAppIdentifier = "wang.jianing.OpenInTerminal" let running = NSWorkspace.shared.runningApplications var alreadyRunning = false for app in running { if app.bundleIdentifier == mainAppIdentifier { alreadyRunning = true break } } if !alreadyRunning { LaunchNotifier.addObserver(observer: NSApp, selector: #selector(NSApplication.terminate(_:)), notification: .terminateApp, object: mainAppIdentifier) let path = Bundle.main.bundlePath as NSString var components = path.pathComponents components.removeLast() components.removeLast() components.removeLast() components.append("MacOS") components.append("OpenInTerminal") let newPath = NSString.path(withComponents: components) NSWorkspace.shared.launchApplication(newPath) } else { NSApp.terminate(self) } } func applicationWillTerminate(_ aNotification: Notification) { print("helper app terminated") } } ================================================ FILE: OpenInTerminalHelper/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "idiom" : "mac", "size" : "16x16", "scale" : "1x" }, { "idiom" : "mac", "size" : "16x16", "scale" : "2x" }, { "idiom" : "mac", "size" : "32x32", "scale" : "1x" }, { "idiom" : "mac", "size" : "32x32", "scale" : "2x" }, { "idiom" : "mac", "size" : "128x128", "scale" : "1x" }, { "idiom" : "mac", "size" : "128x128", "scale" : "2x" }, { "idiom" : "mac", "size" : "256x256", "scale" : "1x" }, { "idiom" : "mac", "size" : "256x256", "scale" : "2x" }, { "idiom" : "mac", "size" : "512x512", "scale" : "1x" }, { "idiom" : "mac", "size" : "512x512", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: OpenInTerminalHelper/Assets.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: OpenInTerminalHelper/Base.lproj/Main.storyboard ================================================ Default Left to Right Right to Left Default Left to Right Right to Left ================================================ FILE: OpenInTerminalHelper/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIconFile CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion 1 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright Copyright © 2019 Jianing Wang. All rights reserved. NSMainStoryboardFile Main NSPrincipalClass NSApplication ================================================ FILE: OpenInTerminalHelper/OpenInTerminalHelper.entitlements ================================================ com.apple.security.app-sandbox com.apple.security.application-groups $(TeamIdentifierPrefix) com.apple.security.automation.apple-events ================================================ FILE: README.md ================================================


English | 中文 | Türkçe | Deutsch
## How to use 🚀 | Core Features | OpenInTerminal | | --- | --- | | Open items (e.g., folders or files) in Terminal or Editor. | ![](https://user-images.githubusercontent.com/11001224/78589385-b797b880-7872-11ea-9062-c11a49461598.gif) | | Open the selected item in your preferred apps (e.g., Github Desktop, Fork). | ![](https://user-images.githubusercontent.com/11001224/104891620-28483580-59ac-11eb-9fb5-3e4dec7863cc.gif) | ### More features | Features | OpenInTerminal | OpenInTerminal-Lite & OpenInEditor-Lite | | --- | --- | --- | | Support Terminal, [iTerm](https://www.iterm2.com/), [Hyper](https://github.com/zeit/hyper), [Alacritty](https://github.com/jwilm/alacritty), [kitty](https://sw.kovidgoyal.net/kitty/), [Warp](https://www.warp.dev), [WezTerm](https://wezfurlong.org/wezterm/index.html), [Tabby](https://tabby.sh), [Ghostty](https://ghostty.org/). | ✅ | ✅ | | Support TextEdit, Xcode, [Visual Studio Code](https://code.visualstudio.com/), [VSCode Insiders](https://code.visualstudio.com/insiders/), [Atom](https://atom.io/), [Sublime Text](https://www.sublimetext.com/), [VSCodium](https://github.com/VSCodium/vscodium), [BBEdit](https://www.barebones.com/products/bbedit/), [TextMate](https://macromates.com), [CotEditor](https://coteditor.com/), [MacVim](https://github.com/macvim-dev/macvim), [JetBrains](https://www.jetbrains.com/)(AppCode, CLion, GoLand, IntelliJ IDEA, PhpStorm, PyCharm, RubyMine, WebStorm, Android Studio, Fleet), [Typora](https://typora.io/), [Nova](https://nova.app/), [Cursor](https://cursor.sh/), [notepad--](https://github.com/cxasm/notepad--), [neovim](https://neovim.io/). | ✅ | ✅ | | Open in custom apps. (⚠️ Not all apps support.) | ✅ | ✅ | | Support English, Chinese, French, Russian, Italian, Spanish, Turkish, German and Korean | ✅ | ✅ | | GUI preferences | ✅ | ❌ | | Support keyboard shortcuts. | ✅ | ❌ | ## OpenInTerminal vs OpenInTerminal-Lite 👀 Wondering which one to choose? If you're all about fancy features and GUI settings, go for `OpenInTerminal`. But if you just want to open your terminal quickly and without fuss, `OpenInTerminal-Lite` is your buddy. I personally prefer `OpenInTerminal-Lite`. Why? It's a one-click wonder (while the other makes you click twice 😂) and it's more lightweight. Check **OpenInTerminal-Lite** Docs: [English](./Resources/README-Lite.md) | [中文](./Resources/README-Lite-zh.md) | [Deutsch](./Resources/README-Lite-de.md) ## Installation 🖥 ``` brew install --cask openinterminal ``` Or manually download it from [release](https://github.com/Ji4n1ng/OpenInTerminal/releases). ## Configuration and FAQ ⚙️ Please check the [Configuration](./Resources/README-Config.md) document. ## Support ❤️ Open-source projects cannot live long without your help. If you like OpenInTerminal, please consider supporting this project by becoming a sponsor. Your user icon or company logo shows up on the README with a link to your home page. Become a sponsor through [GitHub Sponsors](https://github.com/sponsors/Ji4n1ng) 💖. | PayPal | AliPay | WeChat Pay | | --- | --- | --- | | [paypal.me/ji4ning](https://www.paypal.me/ji4ning) | | | ## Changes 🗒
show all

version 2.3.8

  • Support "open in neovim" for Alacritty, WezTerm, and kitty users.
  • Customize open command for kitty users
  • Copy path with escaping
  • Support fork, notepad--, Ghostty
  • Support nix installed applications

version 2.3.7

  • Support Korean
  • Support Warp
  • Support WezTerm
  • Support Tabby
  • Support Fleet
  • Support Nova
  • Support Cursor
  • Support Xcode
  • For kitty users: open in a signle instance instead of a new one

version 2.3.6

  • Support German
  • Search apps installed by JetBrains Toolbox
  • Support Android Studio

version 2.3.5

  • Support dragging to reorder custom menu
  • Support Turkish
  • Support Typora

version 2.3.4

  • Update icons in context menu

version 2.3.3

  • Fix: cannot open path with white space when using shortcut

version 2.3.2

  • Fix: cannot open path with white space

version 2.3.1

  • Fix: cannot open alacritty
  • Feat: add quit button in preferences

version 2.3.0

  • Open custom apps. (Not all apps support)
  • Show icon in context menu. (For stability, old Mac models are not recommended to display icons)

version 2.2.3

  • Support kitty
  • Open multi-selected files in editors

version 2.2.2

  • Support Italian and Spanish
  • Fix: does not show Terminal and TextEdit

version 2.2.1

  • Support JetBrains
  • Fix: check whether an application exists

version 2.2.0

  • Custom Finder menu options
  • Support Russian
  • Support PhpStorm
  • Fix: doesn't work when opening desktop in terminal

version 2.1.1

  • Signed the application with the developer account. Bundle ID has changed
  • Support Finder Extension Standalone Operation Mode
  • Support CotEditor and MacVim
  • User can hide context menu items
  • Finder context menu item's title will change to the current default terminal or editor

version 2.0.5

  • Fix: check application exist bug

version 2.0.4

  • Support TextMate
  • Fix: keyboard shortcut bug

version 2.0.3

  • Fix: Finder context menu icon supports dark mode

version 2.0.2

  • Support Visual Studio Code - Insiders
  • Support for hiding the status bar icon

version 2.0.1

  • Support BBEdit
  • Add icon in Finder context menu
  • Fix: check application folder under home directory

version 0.10.2

  • Fix: Finder context menu does not appear on other disks.

version 0.10.1

  • iTerm will not leave `cd xxx` in history.
  • You need to click the `window` button or the `tab` button of iTerm again in `Preferences`.

version 0.10.0

  • Support keyboard shortcuts.
  • Support VSCodium.

version 0.9.1

  • Support French.

version 0.9.0

  • OpenInTerminal has been released after several weeks of development. If you have suggestions or there are bugs, please feel free to open an issue.

version 0.4.1

  • Support Alacritty

version 0.4.0

  • You can set a default to open a new tab or window when using Terminal and Hyper.

version 0.3.0

  • Change name to OpenInTerminal-Lite (OpenInTerminal will come as a more powerful version in the future.)
  • Fix a bug that some special characters in the path would crash the program when opening Hyper.

version 0.2.0

  • Add terminal selector
  • Cancel running clear command when opening iTerm

version 0.1.1

  • Support Hyper
  • Give priority to creating a new tab when opening iTerm

version 0.1.0

  • First release

## Special Thanks to ❤️ Thanks to all [backers](https://github.com/sponsors/Ji4n1ng) and [contributors](https://github.com/Ji4n1ng/OpenInTerminal/graphs/contributors). Your work makes OpenInTerminal better. ### Reference projects - [jbtule/cdto](https://github.com/jbtule/cdto) - [es-kumagai/OpenTerminal](https://github.com/es-kumagai/OpenTerminal) - [tingraldi/SwiftScripting](https://github.com/tingraldi/SwiftScripting) - [onmyway133/FinderGo](https://github.com/onmyway133/FinderGo) - [Caldis/Mos](https://github.com/Caldis/Mos/) ================================================ FILE: Resources/README-Config-zh.md ================================================ # OpenInTerminal 配置 ## Finder 扩展配置 要启用 Finder 扩展,请右键单击 Finder 工具栏,然后选择 自定义工具栏...,如下图所示:
然后将 OpenInTerminal 图标拖动到工具栏中:
### macOS 15 中 Finder 扩展未显示在系统设置中 #### 1) 手动启用 Finder 扩展 从 macOS 15 开始,Apple 从系统设置中移除了 Finder 同步扩展的配置。要启用 Finder 扩展,可以使用 `pluginkit` 命令行工具,如下所示: ``` $ pluginkit -mAD -p com.apple.FinderSync -vvv ``` 会看到类似以下的输出: ``` wang.jianing.app.OpenInTerminal.OpenInTerminalFinderExtension(2.3.5) Path = /Applications/OpenInTerminal.app/Contents/PlugIns/OpenInTerminalFinderExtension.appex UUID = F2547F13-4E43-4E88-9D8F-56DF05C020D8 Timestamp = 2024-09-17 09:34:07 +0000 SDK = com.apple.FinderSync Parent Bundle = /Applications/OpenInTerminal.app Display Name = OpenInTerminalFinderExtension Short Name = OpenInTerminalFinderExtension Parent Name = OpenInTerminal Platform = macOS ``` 要手动启用 Finder 扩展,请使用输出中的 UUID 运行以下命令: ``` $ pluginkit -e "use" -u "F2547F13-4E43-4E88-9D8F-56DF05C020D8" ``` #### 2) 使用 FinderSyncer 或者,您可以使用一个名为 [FinderSyncer](https://zigz.ag/FinderSyncer/) 的图形界面工具来启用扩展。 ### 在 macOS 14 及更早版本中检查 Finder 扩展权限 对于 macOS 14 及更早版本,请确保通过系统偏好设置启用了 Finder 扩展: 1. 打开 OpenInTerminal 应用。 2. 依次进入 系统偏好设置 -> 扩展 -> Finder 扩展。 3. 勾选 OpenInTerminalFinderExtension 旁的复选框,如下图所示:
## 自定义配置 ### 针对 Neovim 用户 如果您在 OpenInTerminal 中选择 Neovim 作为编辑器,应用将使用 Kitty 作为默认终端。要切换到其他终端(支持的选项包括 Alacritty、WezTerm 和 Kitty),请使用以下命令更新配置。将 `` 替换为您的用户名,并根据您的安装调整 Neovim 路径(此示例为 `/opt/homebrew/bin/nvim`): ``` defaults write /Users//Library/Group\ Containers/group.wang.jianing.app.OpenInTerminal/Library/Preferences/group.wang.jianing.app.OpenInTerminal.plist NeovimCommand "open -na wezterm --args start /opt/homebrew/bin/nvim PATH" ``` 其他终端配置: ``` // kitty: "open -na kitty --args /opt/homebrew/bin/nvim PATH" // WezTerm: "open -na wezterm --args start /opt/homebrew/bin/nvim PATH" // Alacritty: "open -na Alacritty --args -e /opt/homebrew/bin/nvim PATH" ``` ### 针对 Kitty 用户 默认情况下,Kitty 的启动行为是为每个命令打开一个新实例,如下所示: ``` open -na kitty --args --single-instance --instance-group 1 --directory ``` 如果您想自定义此行为,可以在终端中运行以下命令。请确保将 替换为您的用户名,并根据需要调整命令: ``` defaults write /Users//Library/Group\ Containers/group.wang.jianing.app.OpenInTerminal/Library/Preferences/group.wang.jianing.app.OpenInTerminal.plist KittyCommand "open -na kitty --args --single-instance --instance-group 1 --directory" ``` ## 常见问题 ❓
我不小心点了不授权的按钮

你可以运行以下命令。这会重置系统设置里的权限。

tccutil reset AppleEvents wang.jianing.app.OpenInTerminal
路径里的特殊字符

请不要在路径中使用反斜线 \ 和双引号 "

在 Mojave 上打开了两个终端窗口

这个问题只发生在第一次启动终端的时候。所以,你可以通过 ⌘W 来关闭终端的窗口,而不是用 ⌘Q 来退出终端。

OpenInTerminal 并不按照我的预期来工作

OpenInTerminal 将会按照以下顺序来打开终端或编辑器:

  • 1. 打开你所选中的文件或文件夹。
  • 2. 打开最上面的访达窗口。
  • 3. 都不是。那么打开桌面。
我的自定义应用不工作

如果你的自定义应用不能通过运行以下命令正常运行,那么该应用不支持通过 OpenInTerminal 打开。例如,GitHub Desktop:

open -a GitHub\ Desktop ~/Desktop
================================================ FILE: Resources/README-Config.md ================================================ # OpenInTerminal Configurations ## Finder Extension Configuration To enable Finder Extension, right click on Finder toolbar, select `Customize Toolbar...` as shown below:
Then drag the `OpenInTerminal` icon to the toolbar:
### Finder Extension Not Showing Up in System Settings on macOS 15 #### 1) Manually Enable the Finder Extension Starting with macOS 15, Apple removed the Finder Sync Extension configuration from System Settings. To enable the Finder Extension, use the `pluginkit` command-line tool as follows: ``` $ pluginkit -mAD -p com.apple.FinderSync -vvv ``` You should see output similar to the following: ``` wang.jianing.app.OpenInTerminal.OpenInTerminalFinderExtension(2.3.5) Path = /Applications/OpenInTerminal.app/Contents/PlugIns/OpenInTerminalFinderExtension.appex UUID = F2547F13-4E43-4E88-9D8F-56DF05C020D8 Timestamp = 2024-09-17 09:34:07 +0000 SDK = com.apple.FinderSync Parent Bundle = /Applications/OpenInTerminal.app Display Name = OpenInTerminalFinderExtension Short Name = OpenInTerminalFinderExtension Parent Name = OpenInTerminal Platform = macOS ``` To manually enable the Finder Extension, run the following command with the UUID from the output: ``` $ pluginkit -e "use" -u "F2547F13-4E43-4E88-9D8F-56DF05C020D8" ``` #### 2) Use FinderSyncer Alternatively, you could use a GUI tool called [FinderSyncer](https://zigz.ag/FinderSyncer/) to enable the extension. ### Checking Finder Extension Permissions on macOS 14 and Earlier For macOS 14 and earlier, ensure the Finder Extension is enabled via System Preferences: 1. Open the OpenInTerminal app. 2. Navigate to `System Preferences` -> `Extensions` -> `Finder Extensions`. 3. Check the checkbox next to `OpenInTerminalFinderExtension`, as shown below:
## Custom Configuration ### For Neovim Users If you select Neovim as your editor in OpenInTerminal, the app will use Kitty as the default terminal. To switch to a different terminal (supported options: Alacritty, WezTerm, and Kitty), update the configuration with the following command. Replace `` with your username and adjust the Neovim path (`/opt/homebrew/bin/nvim` in this example) to match your installation: ``` defaults write /Users//Library/Group\ Containers/group.wang.jianing.app.OpenInTerminal/Library/Preferences/group.wang.jianing.app.OpenInTerminal.plist NeovimCommand "open -na wezterm --args start /opt/homebrew/bin/nvim PATH" ``` Other terminal configurations: ``` // kitty: "open -na kitty --args /opt/homebrew/bin/nvim PATH" // WezTerm: "open -na wezterm --args start /opt/homebrew/bin/nvim PATH" // Alacritty: "open -na Alacritty --args -e /opt/homebrew/bin/nvim PATH" ``` ### For Kitty Users The default launch behavior for kitty is to open a new instance for each command, like the following: ``` open -na kitty --args --single-instance --instance-group 1 --directory ``` If you want to customize this behavior, you can run the following command in your terminal. Make sure to replace `` with your username and adjust the open command as what you want: ``` defaults write /Users//Library/Group\ Containers/group.wang.jianing.app.OpenInTerminal/Library/Preferences/group.wang.jianing.app.OpenInTerminal.plist KittyCommand "open -na kitty --args --single-instance --instance-group 1 --directory" ``` ## FAQ ❓
Oops, hit Don't Allow button by mistake.

No sweat! Just run the following command in your terminal, and it'll reset the permissions in System Preferences.


tccutil reset AppleEvents wang.jianing.app.OpenInTerminal
Special characters in the path.

Please do not use backslash \ and double quotes " in the path.

Open two Terminal windows on Mojave

This problem usually occurs when you first start Terminal. Try using ⌘W to close Terminal window, instead of using ⌘Q to quit Terminal.

OpenInTerminal doesn't work as I expected

OpenInTerminal works as the following order:

  • 1. Open the file or folder you selected.
  • 2. If nothing's selected, it opens the top Finder window.
  • 3. If there's no Finder window, it opens the desktop.
My custom app doesn't work.

If your custom application doesn't work with the following command, then it's not supported. For example, GitHub Desktop:

open -a GitHub\ Desktop ~/Desktop
================================================ FILE: Resources/README-Lite-de.md ================================================



[English](./README-Lite.md) | [中文说明](./README-Lite-zh.md) | Deutsch ## Verwendung 🚀 ### 1) Aktuelles Verzeichnis im Terminal (oder Editor) öffnen
### 2) Ausgewählten Ordner oder Datei im Terminal (oder Editor) öffnen
### 3) Öffne die Auswahl in X (z.B. Github Desktop)
## Installation 🖥 ### Homebrew 1. Führen Sie den folgenden Befehl aus ``` brew install --cask openinterminal-lite # oder brew install --cask openineditor-lite ``` 2. Im `/Programme` Ordner, halten Sie die `command ⌘` Taste gedrückt und ziehen Sie das Programm in die Finder Symbolleiste. > ⚠️ macOS fragt Sie nach Ihrer Berechtigung für den Zugriff auf den Finder und andere Anwendungen, wenn Sie die App zum ersten Mal ausführen. Bitte geben Sie OpenInTerminal diese Berechtigungen.
### Manuell 1. Herunterladen von [release](https://github.com/Ji4n1ng/OpenInTerminal/releases). 2. Bewegen Sie das Programm in `/Programme`. 3. Halten Sie die `⌘ command` Taste gedrückt und ziehen Sie das Programm in die Finder Symbolleiste. ## Unterstützung ❤️ Danke für Ihre Unterstützung! | PayPal | AliPay | WeChat Pay | | --- | --- | --- | | [paypal.me/ji4ning](https://www.paypal.me/ji4ning) | | | ## Einstellungen 🔨 ### 1) Standard-Terminal (oder Editor) einstellen Sie werden aufgefordert, das Standardterminal (oder den Editor) festzulegen, das/der nach dem ersten Start geöffnet werden soll.
Das Auswahlfeld wird nicht mehr angezeigt, wenn Sie das Standardterminal eingestellt haben. Wenn Sie das Standard-Terminal zurücksetzen möchten, geben Sie bitte den folgenden Befehl in das Terminal ein. Führen Sie die Anwendung dann einfach erneut aus. ``` # Für OpenInTerminal-Lite: defaults remove wang.jianing.app.OpenInTerminal-Lite LiteDefaultTerminal # Für OpenInEditor-Lite: defaults remove wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor ``` Legen Sie die folgende Anwendung als Standardanwendung zum Öffnen fest: | App | Command | | --- | --- | | Alacritty | `defaults write wang.jianing.app.OpenInTerminal-Lite LiteDefaultTerminal Alacritty` | | kitty | `defaults write wang.jianing.app.OpenInTerminal-Lite LiteDefaultTerminal kitty` | | TextEdit | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor TextEdit` | | VSCodium | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor VSCodium` | | BBEdit | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor BBEdit` | | Visual Studio Code - Insiders | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Visual\ Studio\ Code\ -\ Insiders` | | TextMate | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor TextMate` | | CotEditor | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor CotEditor` | | MacVim | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor MacVim` | | Typora | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Typora` | | Neovim | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor neovim` | | Nova | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Nova` | | Cursor | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Cursor` | | AppCode | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor AppCode` | | CLion | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor CLion` | | GoLand | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor GoLand` | | IntelliJ IDEA | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor IntelliJ\ IDEA` | | PhpStorm | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor PhpStorm` | | PyCharm | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor PyCharm` | | RubyMine | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor RubyMine` | | WebStorm | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor WebStorm` | | Android Studio | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Android\ Studio` | Insbesondere wenn Sie eine benutzerdefinierte Anwendung als Standardanwendung verwenden möchten, können Sie diesen Befehl ebenfalls verwenden. Nehmen Sie `GitHub Desktop` als Beispiel. ``` defaults write wang.jianing.app.OpenInTerminal-Lite LiteDefaultTerminal GitHub\ Desktop ``` ### 2) Wenn Sie den Dunkelmodus verwenden Ich habe mehrere Icons zusammen mit der App auf der [release Seite](https://github.com/Ji4n1ng/OpenInTerminal/releases) bereitgestellt.
#### a. Manuelle Änderung des Symbols Klicken Sie mit der rechten Maustaste auf die Anwendung und wählen Sie `Informationen`. Ziehen Sie das neue Symbol über das alte.
#### b. Automatisches Ändern des Symbols mit [Hammerspoon](https://www.hammerspoon.org) Dieses Verfahren ist besonders nützlich für diejenigen, die den automatischen Wechsel zwischen Hell- und Dunkelmodus von macOS nutzen. 1. Installieren Sie Hammerspoon indem Sie entweder [den neuesten Release herunterladen](https://github.com/Hammerspoon/hammerspoon/releases/latest) und es in den `/Programme` Ordner ziehen, oder mithilfe von Homebrew: ``` brew install --cask hammerspoon ``` 2. Installieren Sie das [fileicon](https://github.com/mklement0/fileicon) Hilfsprogramm um das Anwendungssymbol programmatisch zu ändern: ``` brew install fileicon ``` 3. Erstellen Sie den `~/.hammerspoon/Icons` Ordner und verschieben Sie die Symbole dahon 4. Erstellen Sie die `~/.hammerspoon/init.lua` Datei (falls sie nicht schon existiert) und fügen den folgenden Code ein: ```lua local function setOpenInEditorLiteIcon(dark) -- Change the path in case of a different install location local appPath = "/Applications/OpenInEditor-Lite.app" -- Change the type accordingly to the icon you want to use (editor, atom, sublime, vscode) local iconType = "editor" local iconsFolder = hs.fs.currentDir() .. "/Icons" local theme = dark and "dark" or "light" hs.execute('fileicon set "' .. appPath .. '" "' .. iconsFolder .. "/icon_" .. iconType .. "_" .. theme .. '.icns"', true) end local function setOpenInTerminalLiteIcon(dark) -- Change the path in case of a different install location local appPath = "/Applications/OpenInTerminal-Lite.app" -- Change the type accordingly to the icon you want to use (terminal, iterm, hyper) local iconType = "terminal" local iconsFolder = hs.fs.currentDir() .. "/Icons" local theme = dark and "dark" or "light" hs.execute('fileicon set "' .. appPath .. '" "' .. iconsFolder .. "/icon_" .. iconType .. "_" .. theme .. '.icns"', true) end local function updateIcons() darkMode = (hs.settings.get("AppleInterfaceStyle") == "Dark") setOpenInEditorLiteIcon(darkMode) setOpenInTerminalLiteIcon(darkMode) end updateIcons() hs.settings.watchKey("dark_mode", "AppleInterfaceStyle", function() updateIcons() end) ``` Jetzt können Sie die Konfigurationsdatei neu laden (oder hammerspoon neu starten) und fertig! Die Icons sollten sich automatisch aktualisieren, wenn Sie vom hellen in den Dunkelmodus wechseln und andersherum. Vergessen Sie nicht, die Option "Launch Hammerspoon at login" zu aktivieren. ### 3) In einem neuen Tab oder Fenster öffnen, wenn Sie iTerm verwenden Wenn Sie `iTerm`verwenden, können Sie festlegen, dass standardmäßig eine neue Registerkarte oder ein neues Fenster geöffnet wird. Die **Standardeinstellung** ist ein neues Fenster zu öffnen. ``` # Einen neuen Tab öffnen defaults write com.googlecode.iterm2 OpenFileInNewWindows -bool false # Ein neues Fenster öffnen defaults write com.googlecode.iterm2 OpenFileInNewWindows -bool true ``` ## FAQ ❓
1. Ich habe versehentlich auf Nicht erlauben geklickt.

Sie können den folgenden Befehl in einem Terminal ausführen. Dadurch werden die Berechtigungen in den Systemeinstellungen zurückgesetzt.

# Für OpenInTerminal-Lite:
tccutil reset AppleEvents wang.jianing.app.OpenInTerminal-Lite
# Für OpenInEditor-Lite:
tccutil reset AppleEvents wang.jianing.app.OpenInEditor-Lite
2. Sonderzeichen im Pfad.

Bitte verwenden Sie keine Backslashes \ oder doppelte Anführungszeichen " in dem Pfad.

3. Warum können die Symbole beim Wechsel vom/zum dunklen Modus nicht automatisch gewechselt werden?

Was OpenInTerminal-Lite betrifft, so ist das Symbol in der Finder-Symbolleiste das Symbol der Anwendung und nicht das Symbol der Finder-Erweiterung. Und ich habe keine API gefunden um das Programmsymbol zu ändern (Wenn Sie eine gute Idee haben, lassen Sie es mich bitte wissen).

Hinzugefügt: Dank des Beitrags (#126) von @MatteoCarnelos kann OpenInTerminal-Lite nun automatisch Icons mit Hammerspoon wechseln.


Was OpenInTerminal betrifft, so ist das Symbol in der Finder-Symbolleiste das Symbol der Finder-Erweiterung. Es kann sich automatisch ändern, wenn Sie zwischen dunklem und hellem Modus wechseln. Sie können also versuchen, OpenInTerminal zu verwenden.

4. Mein benutzerdefiniertes Programm funktioniert nicht.

Wenn Ihre benutzerdefinierte Anwendung nicht mit dem folgenden Befehl funktioniert, kann die Anwendung nicht unterstützt werden. Zum Beispiel, GitHub Desktop:

open -a GitHub\ Desktop ~/Desktop
## Besonderen Dank an ❤️ ### Mitwirkende - [Camji55](https://github.com/Camji55) - [gucheen](https://github.com/gucheen) - [uclort](https://github.com/uclort) - [MatteoCarnelos](https://github.com/MatteoCarnelos) ### Übersetzer - [Dorian Eydoux](https://github.com/dorianeydx) - [techinpark](https://github.com/techinpark) - [Egor](https://github.com/Rogue85) - [arendruni](https://github.com/arendruni) - [panta97](https://github.com/panta97) - [bkzspam](https://github.com/bkzspam) - [ystolzenburg](https://github.com/ystolzenburg) ### Referenzprojekte - [jbtule/cdto](https://github.com/jbtule/cdto) - [es-kumagai/OpenTerminal](https://github.com/es-kumagai/OpenTerminal) - [tingraldi/SwiftScripting](https://github.com/tingraldi/SwiftScripting) - [onmyway133/FinderGo](https://github.com/onmyway133/FinderGo) - [Caldis/Mos](https://github.com/Caldis/Mos/) ================================================ FILE: Resources/README-Lite-zh.md ================================================


English | 中文 | Deutsch
## 如何使用 🚀 ### 1) 在终端(或编辑器)中打开当前目录
### 2) 在终端(或编辑器)中打开选择的文件夹或文件
### 3) 在自定义应用中打开 (例如, GitHub Desktop)
## 如何安装 🖥 ### Homebrew 1. 运行以下命令 ``` brew install --cask openinterminal-lite # 或者 brew install --cask openineditor-lite ``` 2. 在 `应用程序` 文件夹中,按住 `Cmd` 键,然后将应用拖到访达工具栏中。 > ⚠️ 当您第一次运行应用程序时,macOS 将要求访问 `访达` 和 `终端`(或 `iTerm`)的权限。请给予应用程序权限。
### 手动安装 1. 从 [release](https://github.com/Ji4n1ng/OpenInTerminal/releases) 中下载。 2. 将应用移动到 `应用程序` 文件夹。 3. 按住 `Cmd` 键,然后将应用拖到访达工具栏中。 ## 支持 ❤️ 感谢你的支持! | PayPal | 支付宝 | 微信 | | --- | --- | --- | | [paypal.me/ji4ning](https://www.paypal.me/ji4ning) | | | ## 设置 🔨 ### 1) 设置默认终端(或编辑器) 在第一次运行应用的时候,需要选择默认终端。
当设置了默认终端之后,选择框将不会再出现。如果想要重新设置默认终端,请在终端中输入以下命令。然后重新运行应用。 ``` # 对于 OpenInTerminal-Lite: defaults remove wang.jianing.app.OpenInTerminal-Lite LiteDefaultTerminal # 对于 OpenInEditor-Lite: defaults remove wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor ``` 将下列应用设置为默认: | 应用 | 命令 | | --- | --- | | Alacritty | `defaults write wang.jianing.app.OpenInTerminal-Lite LiteDefaultTerminal Alacritty` | | kitty | `defaults write wang.jianing.app.OpenInTerminal-Lite LiteDefaultTerminal kitty` | | TextEdit | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor TextEdit` | | VSCodium | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor VSCodium` | | BBEdit | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor BBEdit` | | Visual Studio Code - Insiders | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Visual\ Studio\ Code\ -\ Insiders` | | TextMate | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor TextMate` | | CotEditor | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor CotEditor` | | MacVim | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor MacVim` | | Typora | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Typora` | | Neovim | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor neovim` | | Nova | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Nova` | | Cursor | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Cursor` | | AppCode | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor AppCode` | | CLion | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor CLion` | | GoLand | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor GoLand` | | IntelliJ IDEA | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor IntelliJ\ IDEA` | | PhpStorm | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor PhpStorm` | | PyCharm | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor PyCharm` | | RubyMine | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor RubyMine` | | WebStorm | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor WebStorm` | | Android Studio | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Android\ Studio` | 如果你想要使用自定义应用,那么你可以下面的命令。以 GitHub Desktop 为例。 ``` defaults write wang.jianing.app.OpenInTerminal-Lite LiteDefaultTerminal GitHub\ Desktop ``` #### 针对 Neovim 用户 如果您选择 Neovim 作为编辑器,应用将默认使用 Kitty 作为终端。要切换到其他终端(支持的选项包括 Alacritty、WezTerm 和 Kitty),请使用以下命令更新配置。根据您的安装调整 Neovim 路径(此示例为 /opt/homebrew/bin/nvim): ``` defaults write wang.jianing.app.OpenInEditor-Lite NeovimCommand "open -na Alacritty --args -e /opt/homebrew/bin/nvim PATH" ``` 其他终端配置: ``` // Kitty: "open -na kitty --args /opt/homebrew/bin/nvim PATH" // WezTerm: "open -na wezterm --args start /opt/homebrew/bin/nvim PATH" // Alacritty: "open -na Alacritty --args -e /opt/homebrew/bin/nvim PATH" ``` #### 针对 Kitty 用户 Kitty 的默认启动行为是为每个命令打开一个新实例,如下所示: ``` open -na kitty --args --single-instance --instance-group 1 --directory ``` 如果您想自定义此行为,可以在终端中运行以下命令。请根据需要调整 open 命令: ``` defaults write wang.jianing.app.OpenInTerminal-Lite KittyCommand "open -na kitty --args --single-instance --instance-group 1 --directory" ``` ### 2) 如果你正在使用深色模式 (Dark Mode) 我在 [release](https://github.com/Ji4n1ng/OpenInTerminal/releases) 中提供了几个图标。 您可以右键单击该应用程序并选择 `显示简介`。 拖动图标进行更改。

#### a. 手动更换图标
#### b. 利用 [Hammerspoon](https://www.hammerspoon.org) 自动更换图标 对于使用 macOS 的自动 Dark mode 功能的用户来说,下面的步骤特别有用。 1. 通过[下载最新版本](https://github.com/Hammerspoon/hammerspoon/releases/latest) 并将其拖动到 `/Applications` 文件夹中,或使用 Homebrew 安装 Hammerspoon: ``` brew cask install hammerspoon ``` 2. 安装 [fileicon](https://github.com/mklement0/fileicon) 程序,以编程的方式更改图标: ``` brew install fileicon ``` 3. 创建 `~/.hammerspoon/Icons` 文件夹,并将图标放在此处 4. 创建 `~/.hammerspoon/init.lua` 文件(如果该文件不存在),并添加以下代码: ```lua local function setOpenInEditorLiteIcon(dark) -- 如果安装到其他路径,请替换下面的路径 local appPath = "/Applications/OpenInEditor-Lite.app" -- 根据你想使用的图标(editor, atom, sublime, vscode)来更改下面的类型 local iconType = "editor" local iconsFolder = hs.fs.currentDir() .. "/Icons" local theme = dark and "dark" or "light" hs.execute('fileicon set "' .. appPath .. '" "' .. iconsFolder .. "/icon_" .. iconType .. "_" .. theme .. '.icns"', true) end local function setOpenInTerminalLiteIcon(dark) -- 如果安装到其他路径,请替换下面的路径 local appPath = "/Applications/OpenInTerminal-Lite.app" -- 根据你想使用的图标(terminal, iterm, hyper)来更改下面的类型 local iconType = "terminal" local iconsFolder = hs.fs.currentDir() .. "/Icons" local theme = dark and "dark" or "light" hs.execute('fileicon set "' .. appPath .. '" "' .. iconsFolder .. "/icon_" .. iconType .. "_" .. theme .. '.icns"', true) end local function updateIcons() darkMode = (hs.settings.get("AppleInterfaceStyle") == "Dark") setOpenInEditorLiteIcon(darkMode) setOpenInTerminalLiteIcon(darkMode) end updateIcons() hs.settings.watchKey("dark_mode", "AppleInterfaceStyle", function() updateIcons() end) ``` 现在可以重新加载配置文件(或重新启动 Hammerspoon),就完成了!从亮模式切换为暗模式时,图标应自动更新,反之亦然。不要忘记勾选 "登录时启动 Hammerspoon" 选项。 ### 3) 使用 iTerm 时,打开新的标签页或者窗口 当你在使用 `iTerm` 时,你可以设置默认打开一个新的标签或者窗口。**默认**是打开新的窗口。 ``` # 打开新的标签 defaults write com.googlecode.iterm2 OpenFileInNewWindows -bool false # 打开新的窗口 defaults write com.googlecode.iterm2 OpenFileInNewWindows -bool true ``` ## 常见问题 ❓
1. 我不小心点了不授权的按钮

你可以运行以下命令。这会重置系统设置里的权限。

# 对于 OpenInTerminal-Lite:
tccutil reset AppleEvents wang.jianing.app.OpenInTerminal-Lite
# 对于 OpenInEditor-Lite:
tccutil reset AppleEvents wang.jianing.app.OpenInEditor-Lite
2. 路径里的特殊字符

请不要在路径中使用反斜线 \ 和双引号 "

3. 为什么不能根据深色模式自动切换图标

对于 OpenInTerminal-Lite 来说,访达工具栏里的图标是应用图标,而不是访达扩展图标。目前我还没找到 API 可以更换应用图标(如果你有好的建议,请告诉我谢谢)。

补充:感谢 @MatteoCarnelos 的贡献(#126),OpenInTerminal-Lite现在可以通过 Hammerspoon 来自动更换图标。


对于 OpenInTerminal 来说,访达工具栏里的图标是访达扩展图标,所以支持根据深色模式自动切换图标。

4. 我的自定义应用不工作

如果你的自定义应用不能通过运行以下命令正常运行,那么该应用不支持通过 OpenInTerminal 打开。例如,GitHub Desktop:

open -a GitHub\ Desktop ~/Desktop
## 特别感谢 ❤️ 所有贡献者和支持者! ### 参考项目 - [jbtule/cdto](https://github.com/jbtule/cdto) - [es-kumagai/OpenTerminal](https://github.com/es-kumagai/OpenTerminal) - [tingraldi/SwiftScripting](https://github.com/tingraldi/SwiftScripting) - [onmyway133/FinderGo](https://github.com/onmyway133/FinderGo) - [Caldis/Mos](https://github.com/Caldis/Mos/) ================================================ FILE: Resources/README-Lite.md ================================================


English | 中文 | Deutsch
## How to use 🚀 ### 1) Open current directory in Terminal (or Editor)
### 2) Open selected folder or file in Terminal (or Editor)
### 3) Open the selected in X (e.g., GitHub Desktop)
## How to install 🖥 ### Homebrew 1. Run the following command ``` brew install --cask openinterminal-lite brew install --cask openineditor-lite ``` 2. In `/Applications` folder, hold down the `Cmd` key and drag the app into Finder Toolbar. > ⚠️ macOS will ask your permissions to access Finder and Terminal (iTerm or Hyper) when you run the app for the first time. Please give the application permissions.
### Manual 1. Download from [release](https://github.com/Ji4n1ng/OpenInTerminal/releases). 2. Move the app into `/Applications`. 3. Hold down the `Cmd` key and drag the app into Finder Toolbar. ## Support ❤️ Open-source projects cannot live long without your help. If you like OpenInTerminal, please consider supporting this project by becoming a sponsor. Your user icon or company logo shows up on the README with a link to your home page. Become a sponsor through [GitHub Sponsors](https://github.com/sponsors/Ji4n1ng) 💖. | PayPal | AliPay | WeChat Pay | | --- | --- | --- | | [paypal.me/ji4ning](https://www.paypal.me/ji4ning) | | | ## Settings 🔨 ### 1) Set default terminal (or editor) You are asked to set the default terminal (or editor) to open after first launch.
The selection box will not appear after you have set the default terminal. If you want to reset the default terminal, please enter the following command in the terminal. Then just run the application again. ``` # For OpenInTerminal-Lite: defaults remove wang.jianing.app.OpenInTerminal-Lite LiteDefaultTerminal # For OpenInEditor-Lite: defaults remove wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor ``` Set the following app as the default app to open: | App | Command | | --- | --- | | Alacritty | `defaults write wang.jianing.app.OpenInTerminal-Lite LiteDefaultTerminal Alacritty` | | kitty | `defaults write wang.jianing.app.OpenInTerminal-Lite LiteDefaultTerminal kitty` | | TextEdit | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor TextEdit` | | VSCodium | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor VSCodium` | | BBEdit | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor BBEdit` | | Visual Studio Code - Insiders | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Visual\ Studio\ Code\ -\ Insiders` | | TextMate | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor TextMate` | | CotEditor | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor CotEditor` | | MacVim | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor MacVim` | | Typora | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Typora` | | Neovim | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor neovim` | | Nova | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Nova` | | Cursor | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Cursor` | | AppCode | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor AppCode` | | CLion | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor CLion` | | GoLand | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor GoLand` | | IntelliJ IDEA | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor IntelliJ\ IDEA` | | PhpStorm | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor PhpStorm` | | PyCharm | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor PyCharm` | | RubyMine | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor RubyMine` | | WebStorm | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor WebStorm` | | Android Studio | `defaults write wang.jianing.app.OpenInEditor-Lite LiteDefaultEditor Android\ Studio` | In particular, if you want to use a custom application as the default, then you can also use this command. Take `GitHub Desktop` as an example. ``` defaults write wang.jianing.app.OpenInTerminal-Lite LiteDefaultTerminal GitHub\ Desktop ``` #### For Neovim Users If you select Neovim as your editor, the app will use Kitty as the default terminal. To switch to a different terminal (supported options: Alacritty, WezTerm, and Kitty), update the configuration with the following command. Adjust the Neovim path (`/opt/homebrew/bin/nvim` in this example) to match your installation: ``` defaults write wang.jianing.app.OpenInEditor-Lite NeovimCommand "open -na Alacritty --args -e /opt/homebrew/bin/nvim PATH" ``` Other terminal configurations: ``` // kitty: "open -na kitty --args /opt/homebrew/bin/nvim PATH" // WezTerm: "open -na wezterm --args start /opt/homebrew/bin/nvim PATH" // Alacritty: "open -na Alacritty --args -e /opt/homebrew/bin/nvim PATH" ``` #### For Kitty Users The default launch behavior for kitty is to open a new instance for each command, like the following: ``` open -na kitty --args --single-instance --instance-group 1 --directory ``` If you want to customize this behavior, you can run the following command in your terminal. Make sure to replace the open command as what you want: ``` defaults write wang.jianing.app.OpenInTerminal-Lite KittyCommand "open -na kitty --args --single-instance --instance-group 1 --directory" ``` ### 2) If you are using Dark Mode I provided several icons along with the app in the [release page](https://github.com/Ji4n1ng/OpenInTerminal/releases).
#### a. Changing the icon manually You can right click on the app and select `Get Info`. Drag the icon to cover the default icon.
#### b. Changing the icon automatically with [Hammerspoon](https://www.hammerspoon.org) This procedure is particularly useful for those using the automatic dark/light mode switching feature of macOS. 1. Install Hammerspoon either by [downloading the latest release](https://github.com/Hammerspoon/hammerspoon/releases/latest) and dragging it in the `/Applications` folder, or by using Homebrew: ``` brew install --cask hammerspoon ``` 2. Install the [fileicon](https://github.com/mklement0/fileicon) utility to change the app icon programmatically: ``` brew install fileicon ``` 3. Create the `~/.hammerspoon/Icons` folder and put the icons there 4. Create the `~/.hammerspoon/init.lua` file (if it doesn't already exist) and add the following code: ```lua local function setOpenInEditorLiteIcon(dark) -- Change the path in case of a different install location local appPath = "/Applications/OpenInEditor-Lite.app" -- Change the type accordingly to the icon you want to use (editor, atom, sublime, vscode) local iconType = "editor" local iconsFolder = hs.fs.currentDir() .. "/Icons" local theme = dark and "dark" or "light" hs.execute('fileicon set "' .. appPath .. '" "' .. iconsFolder .. "/icon_" .. iconType .. "_" .. theme .. '.icns"', true) end local function setOpenInTerminalLiteIcon(dark) -- Change the path in case of a different install location local appPath = "/Applications/OpenInTerminal-Lite.app" -- Change the type accordingly to the icon you want to use (terminal, iterm, hyper) local iconType = "terminal" local iconsFolder = hs.fs.currentDir() .. "/Icons" local theme = dark and "dark" or "light" hs.execute('fileicon set "' .. appPath .. '" "' .. iconsFolder .. "/icon_" .. iconType .. "_" .. theme .. '.icns"', true) end local function updateIcons() darkMode = (hs.settings.get("AppleInterfaceStyle") == "Dark") setOpenInEditorLiteIcon(darkMode) setOpenInTerminalLiteIcon(darkMode) end updateIcons() hs.settings.watchKey("dark_mode", "AppleInterfaceStyle", function() updateIcons() end) ``` You can now reload the config file (or restart hammerspoon) and you're done! The icons should automatically update when switching from light to dark mode and vice versa. Don't forget to check the "Launch Hammerspoon at login" option. ### 3) Open in a new Tab or Window when using iTerm When you are using `iTerm`, you can set a default to open a new tab or window. The **default** is to open a new window. ``` # Open a new Tab defaults write com.googlecode.iterm2 OpenFileInNewWindows -bool false # Open a new Window defaults write com.googlecode.iterm2 OpenFileInNewWindows -bool true ``` ## FAQ ❓
1. Oops, hit Don't Allow button by mistake.

No sweat! Just run the following command in your terminal, and it'll reset the permissions in System Preferences.

# For OpenInTerminal-Lite:
tccutil reset AppleEvents wang.jianing.app.OpenInTerminal-Lite
# For OpenInEditor-Lite:
tccutil reset AppleEvents wang.jianing.app.OpenInEditor-Lite
2. Special characters in the path.

Please do not use backslash \ and double quotes " in the path

3. Why it cannot automatically switch icons in Dark mode

As for OpenInTerminal-Lite, the icon you see in the Finder Toolbar is actually the app icon, not the Finder extension icon. And I haven't found an API yet that lets you swtich the app icon on the fly (got any cool ideas? Do share!).

But hey, good news! Thanks to @MatteoCarnelos's awesome contribution (#126), OpenInTerminal-Lite can now automatically switch icons using Hammerspoon.

4. My custom app doesn't work.

If your custom application doesn't work with the following command, then it's not supported. For example, GitHub Desktop:

open -a GitHub\ Desktop ~/Desktop
## Changes 🗒
show all

version 1.2.7

  • Support "open in neovim" for Alacritty, WezTerm, and kitty users.
  • Customize open command for kitty users

version 1.2.6

  • Support Korean
  • For kitty users: open in a signle instance instead of a new one

version 1.2.5

  • Support German

version 1.2.4

  • Support Turkish

version 1.2.3

  • Fix: cannot open path with white space when using Terminal

version 1.2.2

  • Fix: cannot open alacritty
  • Fix: cannot set default editor

version 1.2.1

  • Fix: cannot open alacritty
  • Fix: cannot set default editor

version 1.2.0

  • Support setting custom app (Not all apps support)
  • BigSur-style icon

version 1.1.5

  • fix bug in OpenInEditor-Lite

version 1.1.4

  • Support kitty
  • Open multi-selected files in editors

version 1.1.3

  • Support Italian and Spanish

version 1.1.2

  • Support JetBrains

version 1.1.1

  • Support Russian and Korean
  • Support PhpStorm

version 1.1.0

  • Support CotEditor and MacVim

version 1.0.3

  • Signed the application with the developer account. Bundle ID has changed
  • Support Korean

version 1.0.2

  • Support TextMate
  • Change OpenInEditor-Lite default icon

version 1.0.1

  • Support Visual Studio Code - Insiders

version 1.0.0

  • Support BBEdit
  • Fix: check application folder under home directory

version 0.4.4

  • iTerm will not leave 'cd xxx' in history
  • Fix: icon will not flash in dock

version 0.4.3

  • Fix localization bug

version 0.4.2

  • Support French

version 0.4.1

  • Support Alacritty

version 0.4.0

  • You can set a default to open a new tab or window when using Terminal and Hyper.

version 0.3.0

  • Change name to OpenInTerminal-Lite (OpenInTerminal will come as a more powerful version in the future.)
  • Fix a bug that some special characters in the path would crash the program when opening Hyper.

version 0.2.0

  • Add terminal selector
  • Cancel running clear command when opening iTerm

version 0.1.1

  • Support Hyper
  • Give priority to creating a new tab when opening iTerm

version 0.1.0

  • First release

## Special Thanks to ❤️ All the contributors who have helped with the development of OpenInTerminal-Lite. ### Reference projects - [jbtule/cdto](https://github.com/jbtule/cdto) - [es-kumagai/OpenTerminal](https://github.com/es-kumagai/OpenTerminal) - [tingraldi/SwiftScripting](https://github.com/tingraldi/SwiftScripting) - [onmyway133/FinderGo](https://github.com/onmyway133/FinderGo) - [Caldis/Mos](https://github.com/Caldis/Mos/) ================================================ FILE: Resources/README-de.md ================================================



[English](../README.md) | [OpenInTerminal 中文说明](./Resources/README-zh.md) | [OpenInTerminal Türkçe](./Resources/README-tr.md) | OpenInTerminal Deutsch [OpenInTerminal-Lite English](./Resources/README-Lite.md) | [OpenInTerminal-Lite 中文说明](./Resources/README-Lite-zh.md) | [OpenInTerminal-Lite Deutsch](./Resources/README-Lite-de.md) ## Verwendung 🚀 | Hauptmerkmale | OpenInTerminal | | --- | --- | | Öffne X (z.B. Ordner or Dateien) im Terminal oder Editor | ![](https://user-images.githubusercontent.com/11001224/78589385-b797b880-7872-11ea-9062-c11a49461598.gif) | | Öffne die Auswahl in X (z.B. Github Desktop) | ![](https://user-images.githubusercontent.com/11001224/104891620-28483580-59ac-11eb-9fb5-3e4dec7863cc.gif) | ### Mehr Funktionen | Funktionen | OpenInTerminal | OpenInTerminal-Lite & OpenInEditor-Lite | | --- | --- | --- | | Unterstützt Terminal, [iTerm](https://www.iterm2.com/), [Hyper](https://github.com/zeit/hyper), [Alacritty](https://github.com/jwilm/alacritty) und [kitty](https://sw.kovidgoyal.net/kitty/). | ✅ | ✅ | | Unterstützt TextEdit, [Visual Studio Code](https://code.visualstudio.com/), [VSCode Insiders](https://code.visualstudio.com/insiders/), [Atom](https://atom.io/), [Sublime Text](https://www.sublimetext.com/), [VSCodium](https://github.com/VSCodium/vscodium), [BBEdit](https://www.barebones.com/products/bbedit/), [TextMate](https://macromates.com), [CotEditor](https://coteditor.com/), [MacVim](https://github.com/macvim-dev/macvim), [JetBrains](https://www.jetbrains.com/) (AppCode, CLion, GoLand, IntelliJ IDEA, PhpStorm, PyCharm, RubyMine, WebStorm), und [Typora](https://typora.io/). | ✅ | ✅ | | In benutzerdefinierten Programmen öffnen. (⚠️ Es werden nicht alle Apps unterstützt.) | ✅ | ✅ | | Unterstützt Englisch, Chinesisch, Französisch, Russisch, Italienisch, Spanisch and Türkisch | ✅ | ✅ | | GUI-Einstellungen | ✅ | ❌ | | Unterstützung von Tastaturkürzeln | ✅ | ❌ | ## OpenInTerminal und OpenInTerminal-Lite (OpenInEditor-Lite) 👀 Welches sollte man wählen? Beide Apps sind wie meine Kinder. Wenn Sie leistungsfähigere Funktionen und GUI-Einstellungen mögen, können Sie `OpenInTerminal` verwenden. Wenn Sie nur das Terminal schnell und zuverlässig öffnen müssen, können Sie `OpenInTerminal-Lite` verwenden. Ich bevorzuge `OpenInTerminal-Lite`, bei dem man nur einmal klicken muss, um die Funktion auszuführen (bei dem anderen muss man zweimal klicken 😂), und es ist leichtgewichtiger. Für `OpenInTerminal-Lite` Nutzer: Bitte lesen Sie das Dokument: [OpenInTerminal-Lite English](./Resources/README-Lite.md) | [OpenInTerminal-Lite 中文说明](./Resources/README-Lite-zh.md) | [OpenInTerminal-Lite Türkçe](./Resources/README-Lite-tr.md) | [OpenInTerminal-Lite Deutsch](./Resources/README-Lite-de.md) ## Installation 🖥 ### 1. Herunterladen #### a) Homebrew ``` brew install --cask openinterminal ``` #### b) Manuell 1. Herunterladen von [release](https://github.com/Ji4n1ng/OpenInTerminal/releases). 2. Verschieben Sie das Programm in `/Programme`. > ⚠️ macOS fragt Sie nach Ihrer Berechtigung für den Zugriff auf den Finder und andere Anwendungen, wenn Sie die App zum ersten Mal ausführen. Bitte geben Sie OpenInTerminal diese Berechtigungen. ### 2. Berechtigung der Finder-Erweiterung prüfen Öffnen Sie die OpenInTerminal App. Gehen Sie dann zu `Systemeinstellungen` -> `Erweiterungen` -> `Finder-Erweiterungen`, erteilen Sie dann die Berechtigung mit dem Kontrollkästchen wie gezeigt.
## Zu erledigen 👨‍💻 Wenn Sie eine gute Idee haben, können Sie gerne ein neues [Issue](https://github.com/Ji4n1ng/OpenInTerminal/issues/new/choose) eröffnen. ## Unterstützung ❤️ Danke für Ihre Unterstützung! | PayPal | AliPay | WeChat Pay | | --- | --- | --- | | [paypal.me/ji4ning](https://www.paypal.me/ji4ning) | | | ## FAQ ❓
1. Was ist der Unterschied zwischen OpenInTerminal und OpenInTerminal-Lite?

OpenInTerminal hat aktuell eine normale und eine lite Version. Wenn Sie leistungsfähigere Funktionen und GUI-Einstellungen mögen, können Sie `OpenInTerminal` verwenden. Wenn Sie nur das Terminal schnell und zuverlässig öffnen müssen, können Sie `OpenInTerminal-Lite` verwenden.

2. Ich habe versehentlich auf Nicht erlauben geklickt.

Sie können den folgenden Befehl in einem Terminal ausführen. Dadurch werden die Berechtigungen in den Systemeinstellungen zurückgesetzt.


tccutil reset AppleEvents wang.jianing.app.OpenInTerminal
3. Sonderzeichen im Pfad.

Bitte verwenden Sie keine Backslashes \ oder doppelte Anführungszeichen " in dem Pfad.

4. Öffnen von zwei Terminal Fenstern in Mojave

Dieses Problem tritt normalerweise auf, wenn Terminal zum ersten Mal gestartet wird. Sie können ⌘W verwenden um nur das Terminal Fenster zu schließen, anstatt von ⌘Q um das Terminal zu beenden.

5. OpenInTerminal Finder-Erweiterung funktioniert nicht.

Derzeit ist die Finder-Erweiterung vollständig von AppleScript abhängig, um unabhängig zu laufen. Daher ist es schwer, ihre Stabilität zu garantieren. Wenn Sie feststellen, dass die Finder-Erweiterung nicht richtig funktioniert, müssen Sie die option(⌥) Taste drücken, während Sie auf den Finder im Dock rechtsklicken und Neu starten auswählen.

Wenn Ihr Mac-Modell etwas älter ist, so wie meines, schlage ich vor, dass Sie das Symbol im Kontextmenü in den Einstellungen entfernen. Wenn es immer noch häufig abstürzt, empfiehlt es sich, OpenInTerminal-Lite zu verwenden.

6. OpenInTerminal funktioniert nicht wie erwartet

OpenInTerminal öffnet das Terminal oder den Editor in der folgenden Reihenfolge:

  • 1. Öffnen der Datei oder des Ordners, den Sie gewählt haben.
  • 2. Öffnen des obersten Finder Fensters.
  • 3. Keines von beiden. Dann den Schreibtisch öffnen.

Wenn Sie z.B. eine Datei im unteren Finder-Fenster auswählen und das darüber liegende Finder-Fenster im Terminal öffnen wollen, wird dies nicht so funktionieren, wie Sie es in der obigen Reihenfolge erwarten.

F: Ich klicke mit der rechten Maustaste auf den Desktop, aber es erscheint kein Terminal oder Editor. Die Aktionen im Menü der Statusleiste funktionieren jedoch.

A: Versuchen Sie, eine Datei (oder einen Ordner) auszuwählen oder ein Finder-Fenster zu öffnen. Wenn Sie mit der rechten Maustaste auf den Desktop klicken und nichts ausgewählt ist, stellt das System dem Programm den Pfad der ausgewählten Dateien nicht zur Verfügung. In dieser Situation funktioniert das Programm nicht. Derzeit funktionieren sie (Finder-Erweiterung und Aktionen im Statusleistenmenü) nicht auf die gleiche Weise. Die Finder-Erweiterung ist vollständig abhängig von AppleScript, um unabhängig zu laufen, während das Statusleistensymbol wie bisher funktioniert. Sie haben also unterschiedliche Verhaltensweisen. Dieses Problem wird in Zukunft verbessert werden.

7. Mein benutzerdefiniertes Programm funktioniert nicht.

Wenn Ihre benutzerdefinierte Anwendung nicht mit dem folgenden Befehl funktioniert, kann die Anwendung nicht unterstützt werden. Zum Beispiel, GitHub Desktop:

open -a GitHub\ Desktop ~/Desktop
## Besonderen Dank an ❤️ Vielen Dank an alle Mitwirkenden. Ihre Arbeit macht OpenInTerminal besser. ### Referenzprojekte - [jbtule/cdto](https://github.com/jbtule/cdto) - [es-kumagai/OpenTerminal](https://github.com/es-kumagai/OpenTerminal) - [tingraldi/SwiftScripting](https://github.com/tingraldi/SwiftScripting) - [onmyway133/FinderGo](https://github.com/onmyway133/FinderGo) - [Caldis/Mos](https://github.com/Caldis/Mos/) ================================================ FILE: Resources/README-tr.md ================================================



English | [OpenInTerminal 中文说明](./Resources/README-zh.md) | [OpenInTerminal Türkçe](./Resources/README-tr.md) [OpenInTerminal-Lite English](./Resources/README-Lite.md) | [OpenInTerminal-Lite 中文说明](./Resources/README-Lite-zh.md) | [OpenInTerminal-Lite Türkçe](./Resources/README-Lite-tr.md) ## Nasıl kullanılır 🚀 | Temel Özellikler | OpenInTerminal | | --- | --- | | X'i (örn, bir klasör veya dosya) terminalde veya düzenleyicide aç | ![](https://user-images.githubusercontent.com/11001224/78589385-b797b880-7872-11ea-9062-c11a49461598.gif) | | Seçileni X'de aç (örn, Github Desktop) | ![](https://user-images.githubusercontent.com/11001224/104891620-28483580-59ac-11eb-9fb5-3e4dec7863cc.gif) | ### Daha fazla özellik | Özellikler | OpenInTerminal | OpenInTerminal-Lite & OpenInEditor-Lite | | --- | --- | --- | | Terminal Desteği, [iTerm](https://www.iterm2.com/), [Hyper](https://github.com/zeit/hyper), [Alacritty](https://github.com/jwilm/alacritty) ve [kitty](https://sw.kovidgoyal.net/kitty/). | ✅ | ✅ | | TextEdit Desteği, [Visual Studio Code](https://code.visualstudio.com/), [VSCode Insiders](https://code.visualstudio.com/insiders/), [Atom](https://atom.io/), [Sublime Text](https://www.sublimetext.com/), [VSCodium](https://github.com/VSCodium/vscodium), [BBEdit](https://www.barebones.com/products/bbedit/), [TextMate](https://macromates.com), [CotEditor](https://coteditor.com/), [MacVim](https://github.com/macvim-dev/macvim) and [JetBrains](https://www.jetbrains.com/)(AppCode, CLion, GoLand, IntelliJ IDEA, PhpStorm, PyCharm, RubyMine, WebStorm). | ✅ | ✅ | | Özelleştirilmiş uygulamalarda aç. (⚠️Bütün uygulamar desteklenmemektedir.) | ✅ | ✅ | | Türkçe, İngilizce, Çince, Fransızca, Rusça, İtalyanca ve İspanyolca dil desteği. | ✅ | ✅ | | GUI ile özelleştirme | ✅ | ❌ | | Klavye kısayolu desteği. | ✅ | ❌ | ## OpenInTerminal ve OpenInTerminal-Lite (OpenInEditor-Lite) 👀 Hangisini seçmeliyim? İki sürüm de benim için değerli. Eğer daha güçlü özellikler ve GUI tercihlerini seviyorsanız, `OpenInTerminal`'i kullanın. Ancak sadece terminal açmak istiyorsanız `OpenInTerminal-Lite`, daha hızlı ve stabil şekilde çalışacaktır. Şahsen ben`OpenInTerminal-Lite`'ı tercih ediyorum. Terminalı sadece bir tıkla açabiliyorsunuz (diğeri ise iki tıkla bu işi yapıyor 😂) ve daha hafif bir yazılım olma vantajına sahip. `OpenInTerminal-Lite` kullanıcıları için: İlişkin döküman: [OpenInTerminal-Lite English](./Resources/README-Lite.md) | [OpenInTerminal-Lite 中文说明](./Resources/README-Lite-zh.md) | [OpenInTerminal-Lite Türkçe](./Resources/README-Lite-tr.md) ## Nasıl Yüklenir 🖥 ### 1. İndirme #### a) Homebrew kullanarak yapma ``` brew install --cask openinterminal ``` #### b) Elle yapma 1. [release](https://github.com/Ji4n1ng/OpenInTerminal/releases) adresinden indirin. 2. Uygulamayı `/Applications` konumuna taşıyın. > ⚠️ macOS, uygulama ilk kez çalıştırılırken size Finder ve diğer uygulamara erişim izni verip vermeyeceğinizi soracaktır. Lütfen OpenInTerminal'e gerekli izinleri verin. ### 2. Finder uzantı iznini kontrol edin OpenInTerminal uygulamasını açın. `Sistem Tercihleri` -> `Uzantılar` -> `Finder Uzantıları` yolunu takip edip aşağıda gösterildiği gibi izin butonunu kontrol edin.
## Yapılacaklar 👨‍💻 Eğer iyi bir fikriniz varsa lütfen [issue](https://github.com/Ji4n1ng/OpenInTerminal/issues/new/choose) açın. ## Projeyi Destekleme ❤️ Desteğiniz için teşekkürler! | PayPal | AliPay | WeChat Pay | | --- | --- | --- | | [paypal.me/ji4ning](https://www.paypal.me/ji4ning) | | | ## Sık Sorulan Sorular ❓
1. OpenInTerminal ile OpenInTerminal-Lite? arasındaki fark nedir?

OpenInTerminal güncel olarak iki versiyona sahiptir: Normal ve Lite. Eğer daha güçlü özellikler ve GUI tercihlerini seviyorsanız, OpenInTerminal'ı kullanın. Ancak sadece terminal açmak istiyorsanız `OpenInTerminal-Lite`, daha hızlı ve stabil şekilde çalışacaktır.

2. Yanlışlıkla Kabul Etme butonuna tıkladım.

Aşağıda verilen kodu terminalde çalıştırın. Bu sayede Sistem Tercihlerindeki uygulamaya dair izinler sıfırlanacaktır.


tccutil reset AppleEvents wang.jianing.app.OpenInTerminal
3. path'de özel karakterler var.

Lütfen ters eğik çizgi \ ve çift tırnak " sembollerini yolun içinde kullanmayın.

4. Mojave'de iki terminal penceresi açılıyor.

Bu problem genellikle ilk terminal başlatılıdığında oluşmakta. Terminali kapatmak için ⌘W ifadesini, ⌘Q ifadesi yerine kullanabilirsiniz.

5. OpenInTerminal Finder uzantısı çalışmıyor.

Şimdilik Finder uzantıları bağımsız çalışabilmek için AppleScript'e bağlı. Bu sebepten ötürü stabil çalışmasını garanti etmek pek mümkün değil. Finder uzantısının düzgün çalışmadığını fark ettiğinizde, Option(⌥) tuşunu basılı tutup Finder'a sağ tıklama yaptıktan sonra, Relaunch'u seçin.

Eğer Mac'niz benimkisi gibi eskiyse uygulama ikonunu Tercihler menüsünden kapatmanızı tavsiye ediyorum. Eğer hala sıkça çöküyorsa OpenInTerminal-Lite kullanılması daha iyi olacaktır.

6. OpenInTerminal beklediğim gibi çalışmıyor

OpenInTerminal, terminali ya da düzenlryicisi aşağıdaki sırayla kullanılmalıdır:

  • 1. Seçmiş olduğun dosya ya da klasörü aç.
  • 2. En üstteki Finder pencerisini aç.
  • 3. Masaüstüne geç.

Örneğin; eğer alttaki Finder penceresinden bir dosya seçip üstteki Fİnder pencersini terminalde açmak istersen yuaksrıdaki sırada görülebileceği üzere, uygulama beklendiği şekilde çalışmayacaktır.

Q: Masaüstüne sağ tık yapmama rağmen terminal veya düzenleyici gözükmüyor ancak durum çubuğundaki işlevler çalışmakta.

A: Bir dosyayı(klasörü) seçerek ya da Finder penceresi açarak işlem yapabilirsiniz. Çünkü sağ tık yapıldığında bir öge seçili değilse sistem seçilmiş dosyaların yoluna dair bir program paylaşmaz. Bu durumda da program çalışmaz.
Şu anda bazı(Finder uzantıları ve durum çubuğundaki işlevler) aynı şekilde çalışmıyor. Durum çubuğu simgelerinin aksine Finder uzantıları bağımsız çalışabilmek için AppleScript'e bağlı. Bu yüzden farklı davranış bimileri sergiliyorlar. Bu problem gelecekte iyileştirilecektir.

7. Benim özel uygulamam çalışmıyor.

Eğer aşağıdaki komutla kullanmak istediğiniz program açılmıyorsa, o program bu uygulama tarafından desteklenmiyor demektir. Örneğin, GitHub Desktop için:

open -a GitHub\ Desktop ~/Desktop
## Özel Olarak Teşekkürler ❤️ Katkıda bulunan herkese teşekkürler... Uğraşlarınızla OpenInTerminal daha iyi bir hale geliyor. ### Referans Projeler - [jbtule/cdto](https://github.com/jbtule/cdto) - [es-kumagai/OpenTerminal](https://github.com/es-kumagai/OpenTerminal) - [tingraldi/SwiftScripting](https://github.com/tingraldi/SwiftScripting) - [onmyway133/FinderGo](https://github.com/onmyway133/FinderGo) - [Caldis/Mos](https://github.com/Caldis/Mos/) ================================================ FILE: Resources/README-zh.md ================================================


English | 中文
## 如何使用 🚀 | 核心功能 | OpenInTerminal | | --- | --- | | 在终端(或编辑器)中打开目录或文件 | ![](https://user-images.githubusercontent.com/11001224/78589385-b797b880-7872-11ea-9062-c11a49461598.gif) | | 在自定义应用中打开(以 GitHub Desktop 为例) | ![](https://user-images.githubusercontent.com/11001224/104891620-28483580-59ac-11eb-9fb5-3e4dec7863cc.gif) | ### 更多功能 | 功能 | OpenInTerminal | OpenInTerminal-Lite & OpenInEditor-Lite | | --- | --- | --- | | 支持 终端, [iTerm](https://www.iterm2.com/), [Hyper](https://github.com/zeit/hyper), [Alacritty](https://github.com/jwilm/alacritty), [kitty](https://sw.kovidgoyal.net/kitty/), [Warp](https://www.warp.dev), [WezTerm](https://wezfurlong.org/wezterm/index.html), [Tabby](https://tabby.sh), [Ghostty](https://ghostty). | ✅ | ✅ | | 支持 文本编辑, Xcode, [Visual Studio Code](https://code.visualstudio.com/), [VSCode Insiders](https://code.visualstudio.com/insiders/), [Atom](https://atom.io/), [Sublime Text](https://www.sublimetext.com/), [VSCodium](https://github.com/VSCodium/vscodium), [BBEdit](https://www.barebones.com/products/bbedit/), [TextMate](https://macromates.com), [CotEditor](https://coteditor.com/), [MacVim](https://github.com/macvim-dev/macvim), [JetBrains](https://www.jetbrains.com/)(AppCode, CLion, GoLand, IntelliJ IDEA, PhpStorm, PyCharm, RubyMine, WebStorm, Android Studio, Fleet), [Typora](https://typora.io/), [Nova](https://nova.app/), [Cursor](https://cursor.sh/), [notepad--](https://github.com/cxasm/notepad--), [neovim](https://neovim.io/). | ✅ | ✅ | | 打开自定义应用(⚠️ 并不是所有的应用都支持) | ✅ | ✅ | | 支持中文,英语,法语,俄语,意大利语,西班牙语,土耳其语, 德语, 韩语 | ✅ | ✅ | | 图形化设置界面 | ✅ | ❌ | | 支持键盘快捷键 | ✅ | ❌ | ## OpenInTerminal 和 OpenInTerminal-Lite (OpenInEditor-Lite) 👀 选择哪个?如果你喜欢更强大的功能和图形化设置界面,那么你可以选择 `OpenInTerminal`。如果你仅仅需要更快速且更稳定地打开终端或编辑器,那么你可以选择 `OpenInTerminal-Lite`。 对于我而言,我更喜欢 `OpenInTerminal-Lite`,它只需要点击一次来完成功能(另一个需要点击两次😂),而且它更轻量一些。 对于 `OpenInTerminal-Lite` 用户: 请看文档: [English](./README-Lite.md) | [中文说明](./README-Lite-zh.md) ## 安装 🖥 ``` brew install --cask openinterminal ``` 或者从 [release](https://github.com/Ji4n1ng/OpenInTerminal/releases) 中手动下载。 ## 配置和常见问题 ⚙️ 请看文档 [配置](./Resources/README-Config-zh.md) ## 支持 ❤️ 感谢各位的支持! 通过 [GitHub Sponsors](https://github.com/sponsors/Ji4n1ng) 支持 💖。 | PayPal | 支付宝 | 微信 | | --- | --- | --- | | [paypal.me/ji4ning](https://www.paypal.me/ji4ning) | | | ## 特别感谢 ❤️ 感谢所有的贡献者。你们的付出让 OpenInTerminal 更棒了。 ### 参考项目 - [jbtule/cdto](https://github.com/jbtule/cdto) - [es-kumagai/OpenTerminal](https://github.com/es-kumagai/OpenTerminal) - [tingraldi/SwiftScripting](https://github.com/tingraldi/SwiftScripting) - [onmyway133/FinderGo](https://github.com/onmyway133/FinderGo) - [Caldis/Mos](https://github.com/Caldis/Mos/)