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
================================================
Gw
================================================
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
================================================
## How to use 🚀
| Core Features | OpenInTerminal |
| --- | --- |
| Open items (e.g., folders or files) in Terminal or Editor. |  |
| Open the selected item in your preferred apps (e.g., Github Desktop, Fork). |  |
### 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
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
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
## 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
================================================
## 如何使用 🚀
### 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
================================================
## 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
version 1.2.4
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
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
version 0.4.2
version 0.4.1
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
## 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 |  |
| Öffne die Auswahl in X (z.B. Github Desktop) |  |
### 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ç |  |
| Seçileni X'de aç (örn, Github Desktop) |  |
### 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
================================================
## 如何使用 🚀
| 核心功能 | OpenInTerminal |
| --- | --- |
| 在终端(或编辑器)中打开目录或文件 |  |
| 在自定义应用中打开(以 GitHub Desktop 为例) |  |
### 更多功能
| 功能 | 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/)