├── OSSMETADATA ├── quick-symlink ├── Assets.xcassets │ ├── Contents.json │ └── AppIcon.appiconset │ │ ├── quick-symlink-app-icon-128.png │ │ ├── quick-symlink-app-icon-16.png │ │ ├── quick-symlink-app-icon-256.png │ │ ├── quick-symlink-app-icon-257.png │ │ ├── quick-symlink-app-icon-32.png │ │ ├── quick-symlink-app-icon-33.png │ │ ├── quick-symlink-app-icon-512.png │ │ ├── quick-symlink-app-icon-513.png │ │ ├── quick-symlink-app-icon-64.png │ │ ├── quick-symlink-app-icon-1024.png │ │ └── Contents.json ├── quick_symlink.entitlements ├── AppDelegate.swift ├── Info.plist ├── ViewController.swift ├── en.lproj │ └── Main.strings ├── ru.lproj │ └── Main.strings └── en-GB.lproj │ └── Main.strings ├── hard-link-actions-extension ├── Assets.xcassets │ ├── Contents.json │ └── quick-symlink-toolbar-item-image.imageset │ │ ├── quick-symlink-app-icon-28.png │ │ ├── quick-symlink-app-icon-29.png │ │ ├── quick-symlink-app-icon-56.png │ │ ├── quick-symlink-app-icon-57.png │ │ ├── quick-symlink-app-icon-84.png │ │ └── Contents.json ├── hard-link-actions-extension.entitlements ├── Info.plist └── FinderSync.swift ├── soft-link-actions-extension ├── Assets.xcassets │ ├── Contents.json │ └── quick-symlink-toolbar-item-image.imageset │ │ ├── quick-symlink-app-icon-28.png │ │ ├── quick-symlink-app-icon-29.png │ │ ├── quick-symlink-app-icon-56.png │ │ ├── quick-symlink-app-icon-57.png │ │ ├── quick-symlink-app-icon-84.png │ │ └── Contents.json ├── soft-link-actions-extension.entitlements ├── Info.plist └── FinderSync.swift ├── quick-symlink.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── project.pbxproj ├── commons ├── link │ ├── action │ │ ├── Action.swift │ │ ├── CreateLinkAction.swift │ │ ├── CopyPathAction.swift │ │ ├── PasteLinkAction.swift │ │ └── ReplaceWithLinkAction.swift │ └── FileLinkManager.swift ├── path │ ├── Path.swift │ └── ResourcePath.swift ├── SingleContextualMenuFactory.swift └── config │ ├── Config.swift │ └── QuickSymlinkDefaults.swift ├── quick-symlink-tests ├── Info.plist └── ResourcePathTest.swift ├── Base.lproj └── Localizable.strings ├── en.lproj └── Localizable.strings ├── en-GB.lproj └── Localizable.strings ├── LICENSE ├── ru.lproj └── Localizable.strings ├── .gitignore ├── TODO.md ├── BADGES_GUIDE.md ├── CHANGELOG.md ├── CONTRIBUTING.md ├── CODE_OF_CONDUCT.md └── README.md /OSSMETADATA: -------------------------------------------------------------------------------- 1 | osslifecycle=active -------------------------------------------------------------------------------- /quick-symlink/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /hard-link-actions-extension/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /soft-link-actions-extension/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-128.png -------------------------------------------------------------------------------- /quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-16.png -------------------------------------------------------------------------------- /quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-256.png -------------------------------------------------------------------------------- /quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-257.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-257.png -------------------------------------------------------------------------------- /quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-32.png -------------------------------------------------------------------------------- /quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-33.png -------------------------------------------------------------------------------- /quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-512.png -------------------------------------------------------------------------------- /quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-513.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-513.png -------------------------------------------------------------------------------- /quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-64.png -------------------------------------------------------------------------------- /quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-1024.png -------------------------------------------------------------------------------- /quick-symlink.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-28.png -------------------------------------------------------------------------------- /hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-29.png -------------------------------------------------------------------------------- /hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-56.png -------------------------------------------------------------------------------- /hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-57.png -------------------------------------------------------------------------------- /hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-84.png -------------------------------------------------------------------------------- /soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-28.png -------------------------------------------------------------------------------- /soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-29.png -------------------------------------------------------------------------------- /soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-56.png -------------------------------------------------------------------------------- /soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-57.png -------------------------------------------------------------------------------- /soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-84.png -------------------------------------------------------------------------------- /commons/link/action/Action.swift: -------------------------------------------------------------------------------- 1 | // 2 | // QuickSymlinkAction.swift 3 | // quick-symlink 4 | // 5 | // Created by Alexander A. Kropotin on 15/07/2021. 6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public protocol Action { 12 | 13 | func execute(); 14 | } 15 | -------------------------------------------------------------------------------- /quick-symlink.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /quick-symlink/quick_symlink.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.application-groups 8 | 9 | io.github.ololx.QuickSymlink 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /commons/path/Path.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Path.swift 3 | // quick-symlink 4 | // 5 | // Created by Alexander A. Kropotin on 22/08/2021. 6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public protocol Path { 12 | 13 | func relativize(to other: Path!) -> Path!; 14 | 15 | func getPathFragments() -> [String]!; 16 | 17 | func toUrl() -> URL?; 18 | 19 | func toUriString() -> String?; 20 | } 21 | -------------------------------------------------------------------------------- /quick-symlink/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // quick-symlink 4 | // 5 | // Created by Alexander A. Kropotin on 25.05.21. 6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | @NSApplicationMain 12 | class AppDelegate: NSObject, NSApplicationDelegate { 13 | 14 | func applicationDidFinishLaunching(_ aNotification: Notification) { 15 | // Insert code here to initialize your application 16 | } 17 | 18 | func applicationWillTerminate(_ aNotification: Notification) { 19 | // Insert code here to tear down your application 20 | } 21 | } 22 | 23 | -------------------------------------------------------------------------------- /commons/SingleContextualMenuFactory.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SingleContextualMenu.swift 3 | // quick-symlink 4 | // 5 | // Created by Alexander A. Kropotin on 10.02.2022. 6 | // Copyright © 2022 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import AppKit 11 | import FinderSync 12 | 13 | public class SingleContextualMenuFactory: FIFinderSync { 14 | 15 | private static var instance: NSMenu = { 16 | let instance = NSMenu(title: "") 17 | 18 | return instance 19 | }(); 20 | 21 | public func newInstance() -> NSMenu { 22 | return SingleContextualMenuFactory.instance; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /commons/config/Config.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Defaults.swift 3 | // quick-symlink 4 | // 5 | // Created by Alexander A. Kropotin on 10.02.2022. 6 | // Copyright © 2022 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public enum Config { 12 | 13 | static var relativePath: Bool { 14 | get { 15 | return pathTypeStrategyDefaults.get(); 16 | 17 | } 18 | set { 19 | pathTypeStrategyDefaults.set(newValue); 20 | 21 | } 22 | } 23 | 24 | private static var pathTypeStrategyDefaults = QuickSymlinkDefaults(key: "relative-path-strategy", defaultValue: false); 25 | } 26 | -------------------------------------------------------------------------------- /quick-symlink-tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 0.10.5 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /soft-link-actions-extension/soft-link-actions-extension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.application-groups 8 | 9 | io.github.ololx.QuickSymlink 10 | 11 | com.apple.security.folders.user-selected.read-write 12 | 13 | com.apple.security.temporary-exception.files.absolute-path.read-write 14 | 15 | / 16 | 17 | com.apple.security.temporary-exception.files.home-relative-path.read-write 18 | 19 | / 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /hard-link-actions-extension/hard-link-actions-extension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.application-groups 8 | 9 | com.apple.security.files.user-selected.read-write 10 | 11 | com.apple.security.folders.user-selected.read-write 12 | 13 | com.apple.security.temporary-exception.files.absolute-path.read-write 14 | 15 | / 16 | 17 | com.apple.security.temporary-exception.files.home-relative-path.read-write 18 | 19 | / 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "quick-symlink-app-icon-28.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "quick-symlink-app-icon-56.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "quick-symlink-app-icon-84.png", 16 | "scale" : "3x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "filename" : "quick-symlink-app-icon-29.png", 21 | "scale" : "1x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "filename" : "quick-symlink-app-icon-57.png", 26 | "scale" : "2x" 27 | } 28 | ], 29 | "info" : { 30 | "version" : 1, 31 | "author" : "xcode" 32 | } 33 | } -------------------------------------------------------------------------------- /soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "quick-symlink-app-icon-28.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "quick-symlink-app-icon-56.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "quick-symlink-app-icon-84.png", 16 | "scale" : "3x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "filename" : "quick-symlink-app-icon-29.png", 21 | "scale" : "1x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "filename" : "quick-symlink-app-icon-57.png", 26 | "scale" : "2x" 27 | } 28 | ], 29 | "info" : { 30 | "version" : 1, 31 | "author" : "xcode" 32 | } 33 | } -------------------------------------------------------------------------------- /commons/config/QuickSymlinkDefaults.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PathTypeDefaults.swift 3 | // quick-symlink 4 | // 5 | // Created by Alexander A. Kropotin on 17/09/2021. 6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct QuickSymlinkDefaults { 12 | 13 | var key: String 14 | 15 | var defaultValue: T 16 | } 17 | 18 | public extension QuickSymlinkDefaults { 19 | 20 | func get() -> T { 21 | guard let valueUntyped = UserDefaults.init(suiteName: "io.github.ololx.QuickSymlink")?.object(forKey: self.key) else { 22 | return self.defaultValue; 23 | } 24 | 25 | guard let value = valueUntyped as? T else { 26 | return self.defaultValue; 27 | } 28 | 29 | return value; 30 | } 31 | 32 | func set(_ value: T) { 33 | UserDefaults.init(suiteName: "io.github.ololx.QuickSymlink")?.set(value, forKey: self.key); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Base.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | quick-symlink 4 | 5 | Created by Alexander A. Kropotin on 15/07/2021. 6 | Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | */ 8 | 9 | /* Class = "NSMenuItem"; */ 10 | "SOFT_LINK_ACTIONS_EXTENTION_NAME" = "Actions with symlinks"; 11 | 12 | /* Class = "NSMenuItem"; */ 13 | "SOFT_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Create symlinks for selected files and folders"; 14 | 15 | /* Class = "NSMenuItem"; */ 16 | "HARD_LINK_ACTIONS_EXTENTION_NAME" = "Actions with hard links"; 17 | 18 | /* Class = "NSMenuItem"; */ 19 | "HARD_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Create hard links for selected files and folders"; 20 | 21 | /* Class = "NSMenuItem"; */ 22 | "COPY_PATH_ACTION_NAME" = "Copy path from here"; 23 | 24 | /* Class = "NSMenuItem"; */ 25 | "PASTE_LINK_ACTION_NAME" = "Paste link to here"; 26 | 27 | /* Class = "NSMenuItem"; */ 28 | "REPLACE_WITH_LINK_ACTION_NAME" = "Move here and replace with link"; 29 | 30 | /* Class = "NSMenuItem"; */ 31 | "CREATE_LINK_ACTION_NAME" = "Create link"; 32 | 33 | /* Class = "NSMenuItem"; */ 34 | "PATH_STRATEGY_OPTION" = "Use relative path"; 35 | -------------------------------------------------------------------------------- /en.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | quick-symlink 4 | 5 | Created by Alexander A. Kropotin on 15/07/2021. 6 | Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | */ 8 | 9 | /* Class = "NSMenuItem"; */ 10 | "SOFT_LINK_ACTIONS_EXTENTION_NAME" = "Actions with symlinks"; 11 | 12 | /* Class = "NSMenuItem"; */ 13 | "SOFT_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Create symlinks for selected files and folders"; 14 | 15 | /* Class = "NSMenuItem"; */ 16 | "HARD_LINK_ACTIONS_EXTENTION_NAME" = "Actions with hard links"; 17 | 18 | /* Class = "NSMenuItem"; */ 19 | "HARD_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Create hard links for selected files and folders"; 20 | 21 | /* Class = "NSMenuItem"; */ 22 | "COPY_PATH_ACTION_NAME" = "Copy path from here"; 23 | 24 | /* Class = "NSMenuItem"; */ 25 | "PASTE_LINK_ACTION_NAME" = "Paste link to here"; 26 | 27 | /* Class = "NSMenuItem"; */ 28 | "REPLACE_WITH_LINK_ACTION_NAME" = "Move here and replace with link"; 29 | 30 | /* Class = "NSMenuItem"; */ 31 | "CREATE_LINK_ACTION_NAME" = "Create link"; 32 | 33 | /* Class = "NSMenuItem"; */ 34 | "PATH_STRATEGY_OPTION" = "Use relative path"; 35 | -------------------------------------------------------------------------------- /en-GB.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | quick-symlink 4 | 5 | Created by Alexander A. Kropotin on 15/07/2021. 6 | Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | */ 8 | 9 | /* Class = "NSMenuItem"; */ 10 | "SOFT_LINK_ACTIONS_EXTENTION_NAME" = "Actions with symlinks"; 11 | 12 | /* Class = "NSMenuItem"; */ 13 | "SOFT_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Create symlinks for selected files and folders"; 14 | 15 | /* Class = "NSMenuItem"; */ 16 | "HARD_LINK_ACTIONS_EXTENTION_NAME" = "Actions with hard links"; 17 | 18 | /* Class = "NSMenuItem"; */ 19 | "HARD_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Create hard links for selected files and folders"; 20 | 21 | /* Class = "NSMenuItem"; */ 22 | "COPY_PATH_ACTION_NAME" = "Copy path from here"; 23 | 24 | /* Class = "NSMenuItem"; */ 25 | "PASTE_LINK_ACTION_NAME" = "Paste link to here"; 26 | 27 | /* Class = "NSMenuItem"; */ 28 | "REPLACE_WITH_LINK_ACTION_NAME" = "Move here and replace with link"; 29 | 30 | /* Class = "NSMenuItem"; */ 31 | "CREATE_LINK_ACTION_NAME" = "Create link"; 32 | 33 | /* Class = "NSMenuItem"; */ 34 | "PATH_STRATEGY_OPTION" = "Use relative path"; 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Alexander A. Kropotin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /ru.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | quick-symlink 4 | 5 | Created by Alexander A. Kropotin on 15/07/2021. 6 | Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | */ 8 | 9 | /* Class = "NSMenuItem"; */ 10 | "SOFT_LINK_ACTIONS_EXTENTION_NAME" = "Действия с симлинками"; 11 | 12 | /* Class = "NSMenuItem"; */ 13 | "SOFT_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Создать символьные ссылки для выбранных файлов и папок"; 14 | 15 | /* Class = "NSMenuItem"; */ 16 | "HARD_LINK_ACTIONS_EXTENTION_NAME" = "Действия с жесткими ссылками"; 17 | 18 | /* Class = "NSMenuItem"; */ 19 | "HARD_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Создать жесткие ссылки для выбранных файлов и папок"; 20 | 21 | /* Class = "NSMenuItem"; */ 22 | "COPY_PATH_ACTION_NAME" = "Скопировать путь отсюда"; 23 | 24 | /* Class = "NSMenuItem"; */ 25 | "PASTE_LINK_ACTION_NAME" = "Вставить ссылку сюда"; 26 | 27 | /* Class = "NSMenuItem"; */ 28 | "REPLACE_WITH_LINK_ACTION_NAME" = "Переместить сюда и заменить ссылкой"; 29 | 30 | /* Class = "NSMenuItem"; */ 31 | "CREATE_LINK_ACTION_NAME" = "Создать ссылку"; 32 | 33 | /* Class = "NSMenuItem"; */ 34 | "PATH_STRATEGY_OPTION" = "Использовать относительный путь"; 35 | -------------------------------------------------------------------------------- /quick-symlink/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en_GB 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Quick Symlink 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 0.10.5 21 | CFBundleVersion 22 | 1 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSHumanReadableCopyright 26 | Copyright © 2021 Alexander A. Kropotin. All rights reserved. 27 | NSMainStoryboardFile 28 | Main 29 | NSPrincipalClass 30 | NSApplication 31 | 32 | 33 | -------------------------------------------------------------------------------- /quick-symlink/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // quick-symlink 4 | // 5 | // Created by Alexander A. Kropotin on 25.05.21. 6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class ViewController: NSViewController { 12 | 13 | @IBOutlet weak var useRelativePath: NSButton! 14 | 15 | var quickSymlinkDefaults: QuickSymlinkDefaults! = QuickSymlinkDefaults(key: "relative-path-strategy", defaultValue: true); 16 | 17 | override func viewDidLoad() { 18 | super.viewDidLoad() 19 | 20 | self.useRelativePath.state = NSControl.StateValue(rawValue: quickSymlinkDefaults.get() ? 1 : 0); 21 | } 22 | 23 | override var representedObject: Any? { 24 | didSet { 25 | // Update the view, if already loaded. 26 | } 27 | } 28 | 29 | 30 | @IBAction func onChange(_ sender: NSButton) { 31 | switch sender.state { 32 | case .on: 33 | quickSymlinkDefaults.set(true); 34 | break; 35 | case .off: 36 | quickSymlinkDefaults.set(false); 37 | break; 38 | default: 39 | break; 40 | } 41 | } 42 | } 43 | 44 | -------------------------------------------------------------------------------- /commons/link/action/CreateLinkAction.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CreateLinkAction.swift 3 | // quick-symlink 4 | // 5 | // Created by Alexander A. Kropotin on 02/08/2021. 6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import FinderSync 11 | 12 | public class CreateLinkAction: Action { 13 | 14 | private var finderController: FIFinderSyncController; 15 | 16 | private var fileLinkManager: FileLinkManager; 17 | 18 | public init(fileLinkManager: FileLinkManager!) { 19 | self.finderController = FIFinderSyncController.default(); 20 | self.fileLinkManager = fileLinkManager; 21 | } 22 | 23 | public func execute() { 24 | //Get all selected path 25 | guard var target = self.finderController.selectedItemURLs() else { 26 | NSLog("FinderSync() failed to obtain targeted URLs: %@"); 27 | 28 | return; 29 | } 30 | 31 | if (target.isEmpty) { 32 | target.append(self.finderController.targetedURL()!); 33 | } 34 | 35 | for path in target { 36 | let targetPath = self.fileLinkManager.getTargetPath(path, to: path == self.finderController.targetedURL()! ? path : path.deletingLastPathComponent()); 37 | self.fileLinkManager.linkWith(of: path, with: targetPath); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /soft-link-actions-extension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | symlink actions 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 0.10.5 21 | CFBundleVersion 22 | 1 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | LSUIElement 26 | 27 | NSExtension 28 | 29 | NSExtensionAttributes 30 | 31 | NSExtensionPointIdentifier 32 | com.apple.FinderSync 33 | NSExtensionPrincipalClass 34 | $(PRODUCT_MODULE_NAME).FinderSync 35 | 36 | NSHumanReadableCopyright 37 | Copyright © 2021 Alexander A. Kropotin. All rights reserved. 38 | NSPrincipalClass 39 | NSApplication 40 | 41 | 42 | -------------------------------------------------------------------------------- /hard-link-actions-extension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | hard link actions 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 0.10.5 21 | CFBundleVersion 22 | 1 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | LSUIElement 26 | 27 | NSExtension 28 | 29 | NSExtensionAttributes 30 | 31 | NSExtensionPointIdentifier 32 | com.apple.FinderSync 33 | NSExtensionPrincipalClass 34 | $(PRODUCT_MODULE_NAME).FinderSync 35 | 36 | NSHumanReadableCopyright 37 | Copyright © 2021 Alexander A. Kropotin. All rights reserved. 38 | NSPrincipalClass 39 | NSApplication 40 | 41 | 42 | -------------------------------------------------------------------------------- /commons/link/action/CopyPathAction.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CopyPathAction.swift 3 | // quick-symlink 4 | // 5 | // Created by Alexander A. Kropotin on 15/07/2021. 6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import FinderSync 11 | 12 | public class CopyPathAction: Action { 13 | 14 | private var finderController: FIFinderSyncController; 15 | 16 | public init() { 17 | self.finderController = FIFinderSyncController.default(); 18 | } 19 | 20 | public func execute() { 21 | //Get all selected path 22 | guard var target = self.finderController.selectedItemURLs() else { 23 | NSLog("FinderSync() failed to obtain targeted URLs: %@"); 24 | 25 | return; 26 | } 27 | 28 | if (target.isEmpty) { 29 | target.append(self.finderController.targetedURL()!); 30 | } 31 | 32 | // Append all selected paths to string 33 | var paths = "" 34 | for path in target { 35 | paths.append(contentsOf: path.relativePath); 36 | paths.append(";"); 37 | } 38 | 39 | if (!paths.isEmpty) { 40 | paths.removeLast(); 41 | } 42 | 43 | //Copy path list to clipboard 44 | let pasteboard = NSPasteboard.init(name: NSPasteboard.Name.init(rawValue: "qs")); 45 | pasteboard.declareTypes([NSPasteboard.PasteboardType.string], owner: nil); 46 | pasteboard.setString(paths, forType: NSPasteboard.PasteboardType.string); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /commons/link/action/PasteLinkAction.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PasteSymlinkAction.swift 3 | // quick-symlink 4 | // 5 | // Created by Alexander A. Kropotin on 15/07/2021. 6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import FinderSync 11 | 12 | public class PasteLinkAction: Action { 13 | 14 | private var finderController: FIFinderSyncController; 15 | 16 | private var fileLinkManager: FileLinkManager; 17 | 18 | public init(fileLinkManager: FileLinkManager!) { 19 | self.finderController = FIFinderSyncController.default(); 20 | self.fileLinkManager = fileLinkManager; 21 | } 22 | 23 | public func execute() { 24 | //Get selected folder path 25 | guard let target = self.finderController.targetedURL() else { 26 | NSLog("FinderSync() failed to obtain targeted URL: %@"); 27 | 28 | return; 29 | } 30 | 31 | let pasteboard = NSPasteboard.init(name: NSPasteboard.Name.init(rawValue: "qs")); 32 | let pathsFromClipboard = pasteboard.string(forType: NSPasteboard.PasteboardType.string) ?? ""; 33 | if pathsFromClipboard.isEmpty { 34 | return; 35 | } 36 | pasteboard.clearContents(); 37 | 38 | let paths = pathsFromClipboard.components(separatedBy: ";"); 39 | for path in paths { 40 | let pathUrl = URL(fileURLWithPath: path); 41 | let targetPath = self.fileLinkManager.getTargetPath(pathUrl, to: target); 42 | self.fileLinkManager.linkWith(of: pathUrl, with: targetPath); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /commons/link/action/ReplaceWithLinkAction.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ReplaceWithLinkAction.swift 3 | // quick-symlink 4 | // 5 | // Created by Alexander A. Kropotin on 15/07/2021. 6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import FinderSync 11 | 12 | public class ReplaceWithLinkAction: Action { 13 | 14 | private var finderController: FIFinderSyncController; 15 | 16 | private var fileLinkManager: FileLinkManager; 17 | 18 | public init(fileLinkManager: FileLinkManager!) { 19 | self.finderController = FIFinderSyncController.default(); 20 | self.fileLinkManager = fileLinkManager; 21 | } 22 | 23 | public func execute() { 24 | //Get selected folder path 25 | guard let target = self.finderController.targetedURL() else { 26 | NSLog("FinderSync() failed to obtain targeted URL: %@"); 27 | 28 | return; 29 | } 30 | 31 | let pasteboard = NSPasteboard.init(name: NSPasteboard.Name.init(rawValue: "qs")); 32 | let pathsFromClipboard = pasteboard.string(forType: NSPasteboard.PasteboardType.string) ?? ""; 33 | if pathsFromClipboard.isEmpty { 34 | return; 35 | } 36 | pasteboard.clearContents(); 37 | 38 | let paths = pathsFromClipboard.components(separatedBy: ";"); 39 | for path in paths { 40 | let pathUrl = URL(fileURLWithPath: path); 41 | let targetPath = self.fileLinkManager.getTargetPath(pathUrl, to: target); 42 | self.fileLinkManager.replaceWith(of: pathUrl, with: targetPath); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /quick-symlink/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "quick-symlink-app-icon-16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "quick-symlink-app-icon-33.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "quick-symlink-app-icon-32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "quick-symlink-app-icon-64.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "quick-symlink-app-icon-128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "quick-symlink-app-icon-257.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "quick-symlink-app-icon-256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "quick-symlink-app-icon-513.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "quick-symlink-app-icon-512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "quick-symlink-app-icon-1024.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ########### Xcode ########### 2 | # Xcode temporary files that should never be committed 3 | 4 | ## Build generated 5 | build/ 6 | DerivedData 7 | 8 | # NB: NIB/XIB files still exist even on Storyboard projects, so we want this 9 | *~.nib 10 | *.swp 11 | 12 | ## Various settings 13 | *.pbxuser 14 | !default.pbxuser 15 | *.mode1v3 16 | !default.mode1v3 17 | *.mode2v3 18 | !default.mode2v3 19 | *.perspectivev3 20 | !default.perspectivev3 21 | xcuserdata 22 | 23 | ## Other 24 | *.xccheckout 25 | *.moved-aside 26 | *.xcuserstate 27 | *.xcscmblueprint 28 | *.xcscheme 29 | 30 | ########### Mac OS X ########### 31 | # Mac OS X temporary files that should never be committed 32 | 33 | .DS_Store 34 | .AppleDouble 35 | .LSOverride 36 | 37 | # Icon must end with two \r 38 | Icon 39 | 40 | 41 | # Thumbnails 42 | ._* 43 | 44 | # Files that might appear in the root of a volume 45 | .DocumentRevisions-V100 46 | .fseventsd 47 | .Spotlight-V100 48 | .TemporaryItems 49 | .Trashes 50 | .VolumeIcon.icns 51 | 52 | # Directories potentially created on remote AFP share 53 | .AppleDB 54 | .AppleDesktop 55 | Network Trash Folder 56 | Temporary Items 57 | .apdisk 58 | 59 | ########## Objective-C/Swift specific ########## 60 | *.hmap 61 | *.ipa 62 | 63 | # CocoaPods 64 | # 65 | # We recommend against adding the Pods directory to your .gitignore. However 66 | # you should judge for yourself, the pros and cons are mentioned at: 67 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 68 | # 69 | # Pods/ 70 | 71 | # Carthage 72 | # 73 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 74 | # Carthage/Checkouts 75 | 76 | Carthage/Build 77 | 78 | # fastlane 79 | # 80 | # It is recommended to not store the screenshots in the Git repository. Instead, use fastlane to re-generate the 81 | 82 | fastlane/report.xml 83 | fastlane/screenshots -------------------------------------------------------------------------------- /quick-symlink-tests/ResourcePathTest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ResourcePathTest.swift 3 | // quick-symlink-tests 4 | // 5 | // Created by Alexander A. Kropotin on 22/08/2021. 6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class ResourcePathTest: XCTestCase { 12 | 13 | func test_toURL_methodExecution_returnedURLIsEqualToInitialURL() { 14 | let uri: URL = URL.init(string: "/a/b/c/d")!; 15 | let path: Path = ResourcePath.of(url: uri); 16 | 17 | XCTAssert(path.toUrl() == uri, "The Path URL is not equal to URL"); 18 | } 19 | 20 | func test_relativize_whenCurrentDirectoryIsNestedToOtherDirectory_thenReturnPathStartingFromOtherDirectory() { 21 | let currentUri: URL = URL.init(string: "/a/b/c/d")!; 22 | let otherUri: URL = URL.init(string: "/a/b")!; 23 | 24 | let relativePath: Path = ResourcePath.of(url: currentUri) 25 | .relativize(to: ResourcePath.of(url: otherUri)); 26 | 27 | XCTAssert(relativePath.toUriString() == "./c/d", "The relative path is wrong"); 28 | } 29 | 30 | func test_relativize_whenOtherDirectoryIsNestedToCurrentDirectory_thenReturnPathWithOnlyJumpsAboveOtherDirectory() { 31 | let currentUri: URL = URL.init(string: "/a/b")!; 32 | let otherUri: URL = URL.init(string: "/a/b/c/d")!; 33 | 34 | let relativePath: Path = ResourcePath.of(url: currentUri) 35 | .relativize(to: ResourcePath.of(url: otherUri)); 36 | 37 | XCTAssert(relativePath.toUriString() == "./../..", "The relative path is wrong"); 38 | } 39 | 40 | func test_relativize_whenCurrentDirectoryAndOtherDirectoryAreNestedToGeneralDirectory_thenReturnPathWithJumpsAboveOtherDirectoryAndPartOfCurrentDirectory() { 41 | let currentUri: URL = URL.init(string: "/a/b/c1/d1")!; 42 | let otherUri: URL = URL.init(string: "/a/b/c2/d2")!; 43 | 44 | let relativePath: Path = ResourcePath.of(url: currentUri) 45 | .relativize(to: ResourcePath.of(url: otherUri)); 46 | 47 | XCTAssert(relativePath.toUriString() == "./../../c1/d1", "The relative path is wrong"); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /commons/path/ResourcePath.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ResourcePath.swift 3 | // quick-symlink 4 | // 5 | // Created by Alexander A. Kropotin on 22/08/2021. 6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public class ResourcePath: Path { 12 | 13 | public static func of(url: URL!) -> Path! { 14 | return ResourcePath.of(fragments: url.pathComponents) 15 | } 16 | 17 | public static func of(fragments: [String]!) -> Path! { 18 | return ResourcePath.init(of: fragments); 19 | } 20 | 21 | private var uriFragments: [String]!; 22 | 23 | public init(of fragments: [String]) { 24 | self.uriFragments = fragments; 25 | } 26 | 27 | public func getPathFragments() -> [String]! { 28 | return self.uriFragments; 29 | } 30 | 31 | public func relativize(to other: Path!) -> Path! { 32 | var pathFragments = self.uriFragments; 33 | var targetPathFragments = other.getPathFragments(); 34 | 35 | var destinationPath = URL.init(string: "./")!; 36 | for targetPathFragment in targetPathFragments! { 37 | if (!(pathFragments?.contains(targetPathFragment))!) { 38 | break; 39 | } 40 | 41 | pathFragments?.remove(at: 0); 42 | targetPathFragments?.remove(at: 0); 43 | } 44 | 45 | for _ in targetPathFragments! { 46 | destinationPath.appendPathComponent("../"); 47 | } 48 | 49 | for pathFragment in pathFragments! { 50 | destinationPath.appendPathComponent(pathFragment); 51 | } 52 | 53 | return ResourcePath.of(url: destinationPath); 54 | } 55 | 56 | public func toUrl() -> URL? { 57 | if self.uriFragments.count == 0 { 58 | return nil; 59 | } 60 | 61 | var uri = URL.init(string: self.uriFragments.first!)!; 62 | for fragment in self.uriFragments.dropFirst().dropLast() { 63 | uri.appendPathComponent(fragment); 64 | uri.appendPathComponent("/"); 65 | } 66 | uri.appendPathComponent(self.uriFragments.last!); 67 | 68 | return uri; 69 | } 70 | 71 | public func toUriString() -> String? { 72 | if self.uriFragments.count == 0 { 73 | return nil; 74 | } 75 | 76 | return self.toUrl()!.absoluteString; 77 | } 78 | 79 | 80 | } 81 | -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | # TODO 2 | 3 | --- 4 | 5 | - [x] Develop the `Finder extension` which allows to create a symlinks for selected folders and files via contextual menu. 6 | - [x] Add the new menu item for replacing selected folders and files with symlinks. 7 | - [x] Add the new menu item for creating symlink in a parent directory (parent for target objects). 8 | - [x] Use relative path instead absolute path in symlink target URL. 9 | - [x] Add setting - select the default path for links: relative or absolute 10 | - [x] Develop additional `Finder extension` which allows to create a `hard links` for selected folders and files via contextual menu. 11 | - [ ] Add icons for context menu items 12 | - [ ] Add icons for `Finder Toolbar` items 13 | - [ ] Make a new application icon 14 | - [ ] Make icons (`Finder Toolbar`) more suitable for Big Sur and above 15 | - [ ] Implement the ability to disable only the context menu extension (may need to be implemented as a separate extension) 16 | - [ ] Implement the ability to disable only `Finder Toolbar` extension (may need to be implemented as a separate extension) 17 | - [ ] Combine context menu for links (symlinks and hard links) 18 | - [ ] Add the ability to customize the display of menu items 19 | - [ ] Add the `Quick Symlink` implementation as an application that will complement the existing extensions (`Finder Toolbar` and `Contextual menu`). That should allows: 20 | - [ ] a1) create new symlink for selected folders and files 21 | - [ ] a2) create new hard link for selected folders and files 22 | - [ ] a3) create new hard link alias for selected folders and files 23 | - [ ] b1) Move selected folders and files and replace them with symlinks 24 | - [ ] b2) Move selected folders and files and replace them with hard links 25 | - [ ] b3) Move selected folders and files and replace them with aliases 26 | - [ ] c1) Replace selected symlinks with a copy of the same content, hard links or aliases 27 | - [ ] c2) Replace selected hard links with a copy of the same content, symlinks or aliases 28 | - [ ] c3) Replace selected aliases with a copy of the same content, hard links or symlinks 29 | - [ ] d1) Сheck the symlink for the existence of the source and fix the source path 30 | - [ ] d2) Сheck the hard link for the existence of the source and fix the source path 31 | - [ ] d3) Сheck the aliasfor the existence of the source and fix the source path 32 | - [ ] Add the ability to perform actions with administrator privileges 33 | - [ ] Add localization for other languages 34 | - [ ] Refactor app 35 | 36 | --- 37 | 38 | -------------------------------------------------------------------------------- /BADGES_GUIDE.md: -------------------------------------------------------------------------------- 1 | # Badges Guide 2 | 3 | This section presents a some badges reference guide from the [readme](README.md) file, which are project activity info and are not widely distributed or are attached special for this project. 4 | 5 | ## Status 6 | 7 | Status is an informational badge which shows the project development activity. This information can be represented by the following statuses: 8 | 9 | - `active` - this means that the project is under active development. 10 | - `frozen` - this means that the project is still under development, but all work on it was temporarily suspended to clarify and formalize new ideas. 11 | - `completed` - this means that the project implements the intended functionality and the development is completed. Development can be resumed if new ideas for an improvements or features appear. 12 | 13 | If you want to help in development, you have any feature suggestions for the project or if you faced a problem or bug, please visit the [contributing](CONTRIBUTING.md) section. 14 | 15 | ## Version 16 | 17 | This information represents the actual version of the project. For the versioning is used [SemVer](http://semver.org/). 18 | 19 | ## Stable 20 | 21 | Stable is an informational badge which shows the api interface stability. This information can be represented by the following: 22 | 23 | - `yes` - this means that the project in a stable state. 24 | - `no` - this means that the project is not in a stable state and some interfaces could be changed. 25 | 26 | ## OSS Lifecycle 27 | 28 | OSS Lifecycle is an initiative started by Netflix to classify open-source projects into lifecycles and clearly identify which projects are active and which ones are retired. To enable this badge, simply create an `OSSMETADATA` tagging file at the root of your GitHub repository containing a single line similar to the following: `osslifecycle=active`. Other suggested values are `osslifecycle=maintenance` and `osslifecycle=archived`. A working example can be viewed on the [OSS Tracker repository](https://github.com/Netflix/osstracker). 29 | 30 | ## Maintenance 31 | 32 | This is an informational badge which shows the maintenance process state of the project. The following statuses are applied: 33 | 34 | - `yes` - this means that the project is under maintenance. 35 | - `no (of {expiration date})` - this means that the project is no longer maintained. 36 | 37 | In both cases, the project can still be used. 38 | 39 | Please visit the [contributing](CONTRIBUTING.md) page if you faced with some issues with the project. 40 | 41 | ## Release Date 42 | 43 | This is an information about the project release date which would be stable and could be used. In this case, it is possible to indicate the date of the first release, last release, release of a specific version. 44 | 45 | ## Commit Date 46 | 47 | This is an information about the project commit date, which would show the last commit date in the project repository. -------------------------------------------------------------------------------- /commons/link/FileLinkManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FileManagerAdapter.swift 3 | // quick-symlink 4 | // 5 | // Created by Alexander A. Kropotin on 01/09/2021. 6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import FinderSync 11 | 12 | public protocol FileLinkManager { 13 | 14 | func linkWith(of: URL!, with: URL!); 15 | 16 | func replaceWith(of: URL!, with: URL!); 17 | } 18 | 19 | public extension FileLinkManager { 20 | 21 | func getDestinationPath(of: URL!, with: URL!) -> URL! { 22 | var destinationPath: Path = ResourcePath.of(url: of); 23 | if (QuickSymlinkDefaults(key: "relative-path-strategy", defaultValue: true).get()) { 24 | destinationPath = destinationPath.relativize(to: ResourcePath.of(url: with?.deletingLastPathComponent())); 25 | } 26 | 27 | return destinationPath.toUrl(); 28 | } 29 | 30 | func getTargetPath(_ from: URL!, to: URL!) -> URL! { 31 | let originSourceName = from.absoluteURL.deletingPathExtension().lastPathComponent; 32 | let fileType = from.absoluteURL.pathExtension; 33 | 34 | var fileExtention = fileType; 35 | if !fileType.isEmpty { 36 | fileExtention = ".\(fileType)" 37 | } 38 | 39 | var fileName = "\(originSourceName)\(fileExtention)"; 40 | var counter = 1 41 | var targetPath = to; 42 | targetPath = targetPath?.appendingPathComponent(fileName); 43 | 44 | while FileManager.default.fileExists(atPath: (targetPath?.path)!) { 45 | fileName = "\(originSourceName)-\(counter)\(fileExtention)"; 46 | counter += 1; 47 | targetPath = to.appendingPathComponent(fileName); 48 | } 49 | 50 | return targetPath!; 51 | } 52 | } 53 | 54 | public class SoftLinkManager: FileLinkManager { 55 | 56 | public func linkWith(of: URL!, with: URL!) { 57 | do { 58 | try FileManager.default.createSymbolicLink(at: with!, withDestinationURL: self.getDestinationPath(of: of, with: with)); 59 | } catch let error as NSError { 60 | NSLog("FileManager.createSymbolicLink() failed to create file: %@", error.description as NSString); 61 | } 62 | } 63 | 64 | public func replaceWith(of: URL!, with: URL!) { 65 | do { 66 | //FIXME: Add checking for existance of file & resolving this case with symply pastle link 67 | try FileManager.default.moveItem(at: of, to: with); 68 | try FileManager.default.createSymbolicLink(at: of, withDestinationURL: self.getDestinationPath(of: with, with: of)); 69 | } catch let error as NSError { 70 | NSLog("FileManager.createSymbolicLink() failed to create file: %@", error.description as NSString); 71 | } 72 | } 73 | } 74 | 75 | public class HardLinkManager: FileLinkManager { 76 | 77 | public func linkWith(of: URL!, with: URL!) { 78 | do { 79 | try FileManager.default.linkItem(at: of, to: with); 80 | } catch let error as NSError { 81 | NSLog("FileManager.createSymbolicLink() failed to create file: %@", error.description as NSString); 82 | } 83 | } 84 | 85 | public func replaceWith(of: URL!, with: URL!) { 86 | do { 87 | try FileManager.default.moveItem(at: of, to: with); 88 | try FileManager.default.linkItem(at: with, to: of); 89 | } catch let error as NSError { 90 | NSLog("FileManager.createSymbolicLink() failed to create file: %@", error.description as NSString); 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). 6 | 7 | ## [Unreleased] - yyyy-mm-dd 8 | 9 | ### Changed 10 | 11 | - Refactor application. 12 | 13 | ## [0.10.6] - 2022-02-16 14 | 15 | ### Fixed 16 | 17 | - Fix the menu items duplicate problem - the menu items appends (+ 1) for every menu showing. 18 | 19 | ## [0.10.5] - 2022-02-10 20 | 21 | ### Changed 22 | 23 | - Delete public modifiers for methods in public extensions. 24 | - Delete @obj method for authorizing. 25 | - Refactor defaults. 26 | 27 | ## [0.10.4] - 2021-10-10 28 | 29 | ### Fixed 30 | 31 | - Fix incorrect link location after creation. 32 | 33 | ## [0.10.3] - 2021-10-07 34 | 35 | ### Added 36 | 37 | - Add the checkbox item on the contextual menu of the `soft link extention` to switch on/off the relative path use to create a symbolic link. 38 | 39 | ## [0.10.2] - 2021-10-05 40 | 41 | ### Changed 42 | 43 | - Change the menu item names for hard link actions - replace `alias` to `hard link`. 44 | 45 | ## [0.10.1] - 2021-10-05 46 | 47 | ### Fixed 48 | 49 | - Fix the localization bug - only `Russian` localization in for all `system languages`. 50 | 51 | ## [0.10.0] - 2021-09-18 52 | 53 | ### Added 54 | 55 | - Add the checkbox button on the application view to switch on/off the relative path use to create a symbolic link. 56 | - Implement the strategy for create new symlink with relative or absolute path. 57 | 58 | ## [0.9.0] - 2021-09-17 59 | 60 | ### Changed 61 | 62 | - Change the extention boubdle name from `quick-symlink-extention to `symlink actions`. 63 | - Change the module name `quick-symlink-extention to `soft-link-actions-name`. 64 | 65 | ## [0.8.1] - 2021-09-13 66 | 67 | ### Fixed 68 | 69 | - Fix a bug that led to fatal error: `Can't remove last element from an empty collection`. 70 | 71 | ### Added 72 | 73 | - Added the ability to create links from the `Finder` menu without selected objects. 74 | 75 | ## [0.8.0] - 2021-09-02 76 | 77 | ### Added 78 | 79 | - Develop additional `Finder extension` which allows to create a `hard links` for selected folders and files via contextual menu. 80 | 81 | ### Changed 82 | 83 | - Change build os version to 10.10. 84 | 85 | ### Fixed 86 | 87 | - Fix soft link replace with function. 88 | 89 | ## [0.7.0] - 2021-08-22 90 | 91 | ### Added 92 | 93 | - Add new classes `Path` for working with path's and creating relative path from specified directory. 94 | - Add unit-tests cases for the `Path` class. 95 | 96 | ### Changed 97 | 98 | - Change soft link creation using relative instead absolute path. 99 | 100 | ## [0.6.0] - 2021-08-02 101 | 102 | ### Changed 103 | 104 | - Change the activity property of some menu items according to the rule: 105 | - if no object was copied, then the menu items "Paste link to here" an "Move it here and replace with a link" are not active. 106 | - if at least one object was not copied, then the menu items "Paste link to here" an "Move it here and replace with a link" are inactive. 107 | 108 | ### Added 109 | 110 | - Add cleaning clipboard after inserting links. 111 | 112 | ## [0.5.0] - 2021-08-02 113 | 114 | ### Added 115 | 116 | - Add the new menu item for creating symlink in a parent directory (parent for target objects). 117 | 118 | ## [0.4.1] - 2021-07-15 119 | 120 | ### Changed 121 | 122 | - Implement the `Command` pattern for the `Quick Symlink` actions. 123 | 124 | ### Added 125 | 126 | - Add the new menu item for replacing selected folders and files with symlinks. 127 | 128 | ## [0.4.0] - 2021-07-15 129 | 130 | ### Added 131 | 132 | - Add the extension localization for English and Russian languages. 133 | 134 | ## [0.0.4] - 2021-05-28 135 | 136 | ### Added 137 | 138 | - The application icons. 139 | 140 | ### Changed 141 | 142 | - The toolbar icons. 143 | 144 | ## [0.0.3] - 2021-05-25 145 | 146 | ### Added 147 | 148 | - The toolbar icon. 149 | 150 | ### Changed 151 | 152 | - The language version from Swift 5.0 to Swift 4.0. 153 | - The project version from xcode 12.x to xCode 9.2. 154 | 155 | ## [0.0.2] - 2021-05-10 156 | 157 | ### Added 158 | 159 | - Add the `Finder toolbar menu` which allows to: 160 | - automate the symbolic links creation. 161 | - create symbolic links for the selected files or folders. 162 | - save symbolic links to the selected directory. 163 | 164 | ## [0.0.1] - 2021-05-08 165 | 166 | ### Added 167 | 168 | - The `Finder extension` which allows to: 169 | - automate the symbolic links creation. 170 | - create symbolic links for the selected files or folders. 171 | - save symbolic links to the selected directory. -------------------------------------------------------------------------------- /hard-link-actions-extension/FinderSync.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FinderSync.swift 3 | // hard-link-action-extension 4 | // 5 | // Created by Alexander A. Kropotin on 02/09/2021. 6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | import FinderSync 11 | 12 | class FinderSync: FIFinderSync { 13 | 14 | let quickSymlinkToolbarItemImage = NSImage(named:NSImage.Name(rawValue: "quick-symlink-toolbar-item-image")); 15 | 16 | let copyPathAction = CopyPathAction.init(); 17 | let pasteLinkAction = PasteLinkAction.init(fileLinkManager: HardLinkManager.init()); 18 | let createSymlink = CreateLinkAction.init(fileLinkManager: HardLinkManager.init()); 19 | 20 | override init() { 21 | super.init() 22 | 23 | NSLog("FinderSync() launched from %@", Bundle.main.bundlePath as NSString) 24 | 25 | // Set up the directory we are syncing. 26 | let finderSync = FIFinderSyncController.default(); 27 | 28 | // Shared group preferences required 29 | //_ = UserDefaults.init(suiteName: "org.ololx.QuickSymlink") 30 | 31 | if let mountedVolumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil, 32 | options: .skipHiddenVolumes) { 33 | finderSync.directoryURLs = Set(mountedVolumes); 34 | } 35 | 36 | let notificationCenter = NSWorkspace.shared.notificationCenter 37 | notificationCenter.addObserver(forName: NSWorkspace.didMountNotification, object: nil, queue: .main) { 38 | (notification) in 39 | if let volumeURL = notification.userInfo?[NSWorkspace.volumeURLUserInfoKey] as? URL { 40 | finderSync.directoryURLs.insert(volumeURL); 41 | } 42 | } 43 | } 44 | 45 | // MARK: - Primary Finder Sync protocol methods 46 | 47 | override func beginObservingDirectory(at url: URL) { 48 | // The user is now seeing the container's contents. 49 | // If they see it in more than one view at a time, we're only told once. 50 | NSLog("beginObservingDirectoryAtURL: %@", url.path as NSString) 51 | } 52 | 53 | 54 | override func endObservingDirectory(at url: URL) { 55 | // The user is no longer seeing the container's contents. 56 | NSLog("endObservingDirectoryAtURL: %@", url.path as NSString) 57 | } 58 | 59 | // MARK: - Menu and toolbar item support 60 | 61 | override var toolbarItemName: String { 62 | return NSLocalizedString("HARD_LINK_ACTIONS_EXTENTION_NAME", comment: ""); 63 | } 64 | 65 | override var toolbarItemToolTip: String { 66 | return NSLocalizedString("HARD_LINK_ACTIONS_EXTENTION_TOOL_TIP", comment: ""); 67 | } 68 | 69 | override var toolbarItemImage: NSImage { 70 | return quickSymlinkToolbarItemImage!; 71 | } 72 | 73 | override func menu(for menuKind: FIMenuKind) -> NSMenu { 74 | // Produce a menu for the extension (to be shown when right clicking a folder in Finder) 75 | let quickSymlinkMenu = NSMenu(title: ""); 76 | quickSymlinkMenu.addItem( 77 | withTitle: NSLocalizedString("CREATE_LINK_ACTION_NAME", comment: ""), 78 | action: #selector(createSymlink(_:)), 79 | keyEquivalent: "" 80 | ); 81 | 82 | quickSymlinkMenu.addItem( 83 | withTitle: NSLocalizedString("COPY_PATH_ACTION_NAME", comment: ""), 84 | action: #selector(copyPathToClipboard(_:)), 85 | keyEquivalent: "" 86 | ); 87 | 88 | let pastleSymlinkFromClipboardMenuItem = NSMenuItem.init( 89 | title: NSLocalizedString("PASTE_LINK_ACTION_NAME", comment: ""), 90 | action: #selector(pastleSymlinkFromClipboard(_:)), 91 | keyEquivalent: "" 92 | ); 93 | quickSymlinkMenu.addItem(pastleSymlinkFromClipboardMenuItem); 94 | 95 | if (NSPasteboard.init(name: NSPasteboard.Name.init(rawValue: "qs")).string(forType: NSPasteboard.PasteboardType.string) ?? "").isEmpty { 96 | pastleSymlinkFromClipboardMenuItem.isEnabled = false; 97 | } 98 | 99 | if menuKind.rawValue == 3 { 100 | return quickSymlinkMenu; 101 | } else { 102 | let quickSymLinkMainMenu = NSMenu(title: ""); 103 | let quickSymlinkMenuItem = NSMenuItem( 104 | title: NSLocalizedString("" + "HARD_LINK_ACTIONS_EXTENTION_NAME", comment: ""), 105 | action: nil, 106 | keyEquivalent: "" 107 | ); 108 | quickSymLinkMainMenu.setSubmenu(quickSymlinkMenu, for: quickSymlinkMenuItem); 109 | quickSymLinkMainMenu.addItem(quickSymlinkMenuItem); 110 | return quickSymLinkMainMenu; 111 | } 112 | } 113 | 114 | @IBAction func copyPathToClipboard(_ sender: AnyObject?) { 115 | self.copyPathAction.execute(); 116 | } 117 | 118 | @IBAction func pastleSymlinkFromClipboard(_ sender: AnyObject?) { 119 | self.pasteLinkAction.execute(); 120 | } 121 | 122 | @IBAction func createSymlink(_ sender: AnyObject?) { 123 | self.createSymlink.execute(); 124 | } 125 | } 126 | 127 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | 🎉 If you want to contribute this project thanks for taking the time on it and wish you to have fun. 4 | Please do not forget to add a short yourself info in the section [Authors](README.md#authors) after contributing this project. 5 | 6 | When contributing to this repository, please first discuss the change you wish to make via issue, 7 | email, or any other method with the owners of this repository before making a change. 8 | 9 | Please note this repository have a [code of conduct](CODE_OF_CONDUCT.md), please follow it in all your interactions with the project. 10 | 11 | ## Contributing Factors 12 | 13 | ### 🐞 Did you find a bug? 14 | 15 | - Ensure the bug was not already reported by searching on GitHub under **Issues**. 16 | - If you're unable to find an open issue addressing the problem, open a **new one**. Be sure to include a title and clear description, as much relevant information as possible, and a code sample or an executable test case demonstrating the expected behavior that is not occurring. 17 | - Provide test images, which can be used for reproducing. 18 | 19 | #### Bug Report Template 20 | 21 | For the creating **Issues**, please see this template. 22 | 23 | ---- 24 | 25 | | name | about | title | labels | assignees | 26 | | :--------: | :--------------------------------: | :---: | :----: | --------: | 27 | | Bug report | Create a report to help us improve | | | | 28 | 29 | **Describe the bug** A clear and concise description of what the bug is. 30 | 31 | **To Reproduce** Steps to reproduce the behavior: 32 | 33 | 1. Go to '...' 34 | 2. Click on '....' 35 | 3. Scroll down to '....' 36 | 4. See error 37 | 38 | **Expected behavior** A clear and concise description of what you expected to happen. 39 | 40 | **Screenshots** If applicable, add screenshots to help explain your problem. 41 | 42 | **Desktop (please complete the following information):** 43 | 44 | - OS: [e.g. iOS] 45 | - Browser [e.g. chrome, safari] 46 | - Version [e.g. 22] 47 | 48 | **Smartphone (please complete the following information):** 49 | 50 | - Device: [e.g. iPhone6] 51 | - OS: [e.g. iOS8.1] 52 | - Browser [e.g. stock browser, safari] 53 | - Version [e.g. 22] 54 | 55 | **Additional context** Add any other context about the problem here. 56 | 57 | ---- 58 | 59 | ### 🩹 Did you write a patch that fixes a bug? 60 | 61 | - Open a new GitHub **pull request** with the patch. 62 | 63 | - Ensure the **pull request** description clearly describes the problem and solution. Include the relevant issue number if applicable. 64 | 65 | ### 🎈 Did you fix whitespace, format code, or make a purely cosmetic patch? 66 | 67 | - Changes that are cosmetic in nature and do not add anything substantial to the stability, 68 | functionality, or testability of this project - you are welcome. 69 | 70 | ### ⚙️ Do you intend to add a new feature or change an existing one? 71 | 72 | - Suggest your change in the **feature request** and wait for approval to avoid writing code, which won't be added. 73 | - Do not open a **pull request** on GitHub until you have collected positive feedback about the change. 74 | 75 | #### Feature Request Template 76 | 77 | For the creating **feature request**, please see this template. 78 | 79 | ---- 80 | 81 | | name | about | title | labels | assignees | 82 | | :-------------: | :------------------------------: | :---: | :----: | --------: | 83 | | Feature request | Suggest an idea for this project | | | | 84 | 85 | **Is your feature request related to a problem? Please describe.** 86 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 87 | 88 | **Describe the solution you'd like** 89 | A clear and concise description of what you want to happen. 90 | 91 | **Describe alternatives you've considered** 92 | A clear and concise description of any alternative solutions or features you've considered. 93 | 94 | **Additional context** 95 | Add any other context or screenshots about the feature request here. 96 | 97 | ---- 98 | 99 | ## Pull Request Process 100 | 101 | 1. Update the [readme](README.md) file and [changelog](#CHANGELOG.md) file with details of changes to the interface, this includes new environment variables, exposed ports, useful file locations and container parameters. 102 | 2. Increase the version numbers in any examples files, the [readme](README.md) file, the [changelog](#CHANGELOG.md) file, and also badges (if it is needed) to the new version that this **pull request** would represent. For the versioning is used [Semantic Versioning](http://semver.org/). 103 | 3. You may merge the **pull request** in once you have the sign-off of one or more other developers, or if you do not have permission to do that, you may request the second reviewer to merge it for you. 104 | 105 | ### Pull Request Checklist 106 | 107 | For any pull request, please refer to this checklist. 108 | 109 | ---- 110 | 111 | - [ ] Ensure any install or build dependencies are removed before the end of the layer when doing a build. 112 | - [ ] Make sure you are requesting to **pull a topic/feature/bugfix branch** (right side). Don't request your master! 113 | - [ ] Make sure you are making a pull request against the **main branch** (left side). 114 | - [ ] Check the commit's or even all commits' message styles matches the requested structure. 115 | 116 | ---- -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, caste, color, religion, or sexual 10 | identity and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the overall 26 | community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or advances of 31 | any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email address, 35 | without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | ololx@icloud.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series of 86 | actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or permanent 93 | ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within the 113 | community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.1, available at 119 | [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. 120 | 121 | Community Impact Guidelines were inspired by 122 | [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. 123 | 124 | For answers to common questions about this code of conduct, see the FAQ at 125 | [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at 126 | [https://www.contributor-covenant.org/translations][translations]. 127 | 128 | [homepage]: https://www.contributor-covenant.org 129 | [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html 130 | [Mozilla CoC]: https://github.com/mozilla/diversity 131 | [FAQ]: https://www.contributor-covenant.org/faq 132 | [translations]: https://www.contributor-covenant.org/translations 133 | -------------------------------------------------------------------------------- /soft-link-actions-extension/FinderSync.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FinderSync.swift 3 | // quick-symlink-contextual-menu 4 | // 5 | // Created by Alexander A. Kropotin on 07.05.2021. 6 | // 7 | 8 | import Cocoa 9 | import FinderSync 10 | 11 | class FinderSync: FIFinderSync { 12 | 13 | let quickSymlinkToolbarItemImage = NSImage(named:NSImage.Name(rawValue: "quick-symlink-toolbar-item-image")); 14 | var quickSymlinkDefaults: QuickSymlinkDefaults! = QuickSymlinkDefaults(key: "relative-path-strategy", defaultValue: true); 15 | 16 | let copyPathAction = CopyPathAction.init(); 17 | let pasteLinkAction = PasteLinkAction.init(fileLinkManager: SoftLinkManager.init()); 18 | let replaceWithLinkAction = ReplaceWithLinkAction.init(fileLinkManager: SoftLinkManager.init()); 19 | let createSymlink = CreateLinkAction.init(fileLinkManager: SoftLinkManager.init()); 20 | 21 | override init() { 22 | super.init() 23 | 24 | NSLog("FinderSync() launched from %@", Bundle.main.bundlePath as NSString); 25 | 26 | // Set up the directory we are syncing. 27 | let finderSync = FIFinderSyncController.default(); 28 | 29 | // Shared group preferences required 30 | //_ = UserDefaults.init(suiteName: "org.ololx.QuickSymlink") 31 | 32 | if let mountedVolumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil, 33 | options: .skipHiddenVolumes) { 34 | finderSync.directoryURLs = Set(mountedVolumes); 35 | } 36 | 37 | let notificationCenter = NSWorkspace.shared.notificationCenter 38 | notificationCenter.addObserver(forName: NSWorkspace.didMountNotification, object: nil, queue: .main) { 39 | (notification) in 40 | if let volumeURL = notification.userInfo?[NSWorkspace.volumeURLUserInfoKey] as? URL { 41 | finderSync.directoryURLs.insert(volumeURL); 42 | } 43 | } 44 | } 45 | 46 | // MARK: - Primary Finder Sync protocol methods 47 | override func beginObservingDirectory(at url: URL) { 48 | // The user is now seeing the container's contents. 49 | // If they see it in more than one view at a time, we're only told once. 50 | NSLog("beginObservingDirectoryAtURL: %@", url.path as NSString); 51 | } 52 | 53 | 54 | override func endObservingDirectory(at url: URL) { 55 | // The user is no longer seeing the container's contents. 56 | NSLog("endObservingDirectoryAtURL: %@", url.path as NSString); 57 | } 58 | 59 | // MARK: - Menu and toolbar item support 60 | 61 | override var toolbarItemName: String { 62 | return NSLocalizedString("SOFT_LINK_ACTIONS_EXTENTION_NAME", comment: ""); 63 | } 64 | 65 | override var toolbarItemToolTip: String { 66 | return NSLocalizedString("SOFT_LINK_ACTIONS_EXTENTION_TOOL_TIP", comment: ""); 67 | } 68 | 69 | override var toolbarItemImage: NSImage { 70 | return quickSymlinkToolbarItemImage!; 71 | } 72 | 73 | override func menu(for menuKind: FIMenuKind) -> NSMenu { 74 | // Produce a menu for the extension (to be shown when right clicking a folder in Finder) 75 | let quickSymlinkMenu = NSMenu(title: ""); 76 | 77 | quickSymlinkMenu.insertItem( 78 | withTitle: NSLocalizedString("CREATE_LINK_ACTION_NAME", comment: ""), 79 | action: #selector(createSymlink(_:)), 80 | keyEquivalent: "", 81 | at: 0 82 | ); 83 | 84 | quickSymlinkMenu.insertItem( 85 | withTitle: NSLocalizedString("COPY_PATH_ACTION_NAME", comment: ""), 86 | action: #selector(copyPathToClipboard(_:)), 87 | keyEquivalent: "", 88 | at: 1 89 | ); 90 | 91 | let pastleSymlinkFromClipboardMenuItem = NSMenuItem.init( 92 | title: NSLocalizedString("PASTE_LINK_ACTION_NAME", comment: ""), 93 | action: #selector(pastleSymlinkFromClipboard(_:)), 94 | keyEquivalent: "" 95 | ); 96 | quickSymlinkMenu.insertItem(pastleSymlinkFromClipboardMenuItem, at: 2); 97 | 98 | let replaceFileWithSymlinkFromClipboardMenuItem = NSMenuItem.init( 99 | title: NSLocalizedString("REPLACE_WITH_LINK_ACTION_NAME", comment: ""), 100 | action: #selector(replaceFileWithSymlinkFromClipboard(_:)), 101 | keyEquivalent: "" 102 | ); 103 | quickSymlinkMenu.insertItem(replaceFileWithSymlinkFromClipboardMenuItem, at: 3); 104 | 105 | if (NSPasteboard.init(name: NSPasteboard.Name.init(rawValue: "qs")).string(forType: NSPasteboard.PasteboardType.string) ?? "").isEmpty { 106 | pastleSymlinkFromClipboardMenuItem.isEnabled = false; 107 | replaceFileWithSymlinkFromClipboardMenuItem.isEnabled = false; 108 | } 109 | 110 | quickSymlinkMenu.addItem(NSMenuItem.separator()); 111 | let pathStrategyItem = NSMenuItem.init( 112 | title: NSLocalizedString("PATH_STRATEGY_OPTION", comment: ""), 113 | action: #selector(onPathStrategyChange(_:)), 114 | keyEquivalent: "" 115 | ); 116 | pathStrategyItem.target = self; 117 | pathStrategyItem.state = quickSymlinkDefaults.get() ? .on : .off; 118 | 119 | quickSymlinkMenu.addItem(pathStrategyItem); 120 | 121 | if menuKind.rawValue == 3 { 122 | return quickSymlinkMenu; 123 | } else { 124 | let quickSymLinkMainMenu = NSMenu(title: ""); 125 | let quickSymlinkMenuItem = NSMenuItem( 126 | title: NSLocalizedString("SOFT_LINK_ACTIONS_EXTENTION_NAME", comment: ""), 127 | action: nil, 128 | keyEquivalent: "" 129 | ); 130 | quickSymLinkMainMenu.setSubmenu(quickSymlinkMenu, for: quickSymlinkMenuItem); 131 | quickSymLinkMainMenu.addItem(quickSymlinkMenuItem); 132 | 133 | return quickSymLinkMainMenu; 134 | } 135 | } 136 | 137 | @IBAction func copyPathToClipboard(_ sender: AnyObject?) { 138 | 139 | self.copyPathAction.execute(); 140 | } 141 | 142 | @IBAction func replaceFileWithSymlinkFromClipboard(_ sender: AnyObject?) { 143 | self.replaceWithLinkAction.execute(); 144 | } 145 | 146 | @IBAction func pastleSymlinkFromClipboard(_ sender: AnyObject?) { 147 | self.pasteLinkAction.execute(); 148 | } 149 | 150 | @IBAction func createSymlink(_ sender: AnyObject?) { 151 | self.createSymlink.execute(); 152 | } 153 | 154 | @IBAction func onPathStrategyChange(_ sender: NSMenuItem!) { 155 | sender.state = sender.state == .on ? .off : .on; 156 | 157 | switch sender.state { 158 | case .on: 159 | self.quickSymlinkDefaults.set(true); 160 | break; 161 | case .off: 162 | self.quickSymlinkDefaults.set(false); 163 | break; 164 | default: 165 | break; 166 | } 167 | } 168 | } 169 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | Stars earned 4 | 5 | downloads 6 | 7 | discutions 8 | 9 |
10 | 11 | # Quick Symlink 12 | 13 | The Quick Symlink is a `Finder extension` which provides a `contextual menu item` for the symbolic links (and other links) creation on macOS. 14 | 15 | [![tag](https://img.shields.io/github/v/tag/ololx/quick-symlink?style=flat&include_prereleases&logo=github)](https://github.com/ololx/quick-symlink/tags) [![release](https://img.shields.io/github/v/release/ololx/quick-symlink?style=flat&include_prereleases&logo=github)](https://github.com/ololx/quick-symlink/releases) 16 | 17 | [![osslifecycle](https://img.shields.io/osslifecycle/ololx/quick-symlink?style=flat)](OSSMETADATA) [![last_commit](https://img.shields.io/github/last-commit/ololx/quick-symlink?style=flat&logo=github)](https://github.com/ololx/quick-symlink/commits) [![release_date](https://img.shields.io/github/release-date/ololx/quick-symlink?style=flat&logo=github)](https://github.com/ololx/quick-symlink/releases) 18 | 19 | [![licence](https://img.shields.io/github/license/ololx/quick-symlink?style=flat)](LICENCE) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg?style=flat)](CODE_OF_CONDUCT.md) [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fololx%2Fquick-symlink.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fololx%2Fquick-symlink?ref=badge_shield) 20 | 21 | ![repo_size](https://img.shields.io/github/repo-size/ololx/quick-symlink?style=flat&logo=github) ![languages_code_size](https://img.shields.io/github/languages/code-size/ololx/quick-symlink?style=flat&logo=github) ![languages_count](https://img.shields.io/github/languages/count/ololx/quick-symlink?style=flat&logo=github) ![languages_top](https://img.shields.io/github/languages/top/ololx/quick-symlink?style=flat&logo=github) 22 | 23 | ![platform](https://img.shields.io/badge/platform-OS_X_10.10+-important?style=flat) 24 | 25 | ## 📇 Table of Contents 26 | 27 | - [About](#-about-) 28 | - [Demo](#-demo-) 29 | - [Features](#-feature-) 30 | - [Getting Started](#-getting-started-) 31 | - [Built With](#-built-with-) 32 | - [Contributing](#-contributing-) 33 | - [Code of Conduct](#-code-of-conduct-) 34 | - [Versioning](#-versioning-) 35 | - [Authors](#-authors-) 36 | - [Licensing](#-licensing-) 37 | 38 | ## 📖 About 39 | 40 | The Quick Symlink is a Finder Extension which allows to create symbolic links of selected folders or files. It could be called by right-clicking on selected folders or files and selecting `Quick Symlink` from the contextual menu. **It is a remaster of the other project - `create-symlink`; for more details see https://github.com/ololx/create-symlink.** 41 | 42 | ### Motivation 43 | 44 | For me the symbolic links is a useful feature of macOS. They can be especially useful when it's needed to store the `Documents` folder on a hard drive or SD card, but on the ssd to create a just link to this folder. 45 | Of course, creating symbolic links via the terminal is very easy and convenient. But this does not negate the fact that it could be even easier and more comfortable through interaction with the GUI. 46 | 47 | ## 📸 Demo 48 | 49 | This GIF demonstrates how the `Quick Symlink` allows quite simple to select files or folders and paste symlink in the current directory. 50 | 51 | 52 | 53 | This GIF demonstrates how the `Quick Symlink` allows quite simple to copy files or folders and paste symlink somewhere. 54 | 55 | 56 | 57 | This GIF demonstrates how the `Quick Symlink` allows quite simple to copy files or folders, paste them somewhere, and replace them with symlinks. 58 | 59 | 60 | 61 |
62 | These GIFs demonstrate the `Quick Symlink` localization. 63 | 64 | 65 |
66 | 67 | ## 🎚 Features 68 | 69 | - Create a symbolic links in a several clicks via the context menu instead of the terminal promt: 70 | - Select files or folders and create symlinks for them. 71 | - Copy files or folders and paste symlinks somewhere. 72 | - Copy files or folders, paste them somewhere, and replace them with symlinks. 73 | 74 | - Create a hard links in a several clicks via the context menu instead of the terminal promt: 75 | - Select files or folders and create hard links for them. 76 | - Copy files or folders and paste hard links somewhere. 77 | 78 | ### To Do 79 | 80 | - For more information on an upcoming development, please read the [todo](TODO.md) list. 81 | 82 | ### Changelog 83 | 84 | - For more information on releases, features and changes, please read the [changelog](CHANGELOG.md) notes. 85 | 86 | ## 🚦 Getting Started 87 | 88 | These instructions allow to get a copy of this project and run it on a local machine. 89 | 90 | ### Prerequisites 91 | 92 | Before using it, make sure that follows software are installed on the local machine: 93 | 94 | - **[OS X 10.10+](https://www.apple.com/ru/macos/what-is/)** - the operating system under which the extention is executing. 95 | 96 | If any of the listed programs is not installed, then it can be installed by instruction as described below. 97 | 98 | 1. #### OS X 10.10+ 99 | - Install macOS 10.10+ by [this](https://support.apple.com/ht201372) instruction. 100 | 101 | ### Installing 102 | 103 | In order to install it is quite simple to: 104 | 105 | 1. Download executable file from releases (or compile it from the sources). 106 | 2. Go to the directory where you download this tool (optionally): 107 | 108 | - via Finder. 109 | - via Terminal prompt. 110 | 111 | ```bash 112 | cd /{path to parent dir with this tool}/ 113 | ``` 114 | 115 | 3. Launch the tool in macOS (optionally): 116 | 117 | - via double-click on `quick-symlink.app`. 118 | - via Terminal prompt. 119 | 120 | ```bash 121 | open quick-symlink.app 122 | ``` 123 | 124 | 4. Open up `System Preferences > Extensions` and enable the follows extensions: 125 | 4.1. `quick-symlink-extension` - for the symlink actions. 126 | 4.2. `hard-link-actions-extension` - for the hard link actions. 127 | 128 | **Otherwise, it's possible to install and remove the extention using the actual extension bundled into the app.** 129 | 130 | 1. To install and approve the extension, run this: 131 | 132 | ```bash 133 | pluginkit -a quick-symlink.app/Contents/PlugIns/quick-symlink-extension.appex/ 134 | pluginkit -a quick-symlink.app/Contents/PlugIns/hard-link-action-extension.appex/ 135 | ``` 136 | 137 | 2. To remove it, run this: 138 | 139 | ```bash 140 | pluginkit -r quick-symlink.app/Contents/PlugIns/quick-symlink-extension.appex/ 141 | pluginkit -r quick-symlink.app/Contents/PlugIns/hard-link-action-extension.appex/ 142 | ``` 143 | 144 | 5. [OPTIONAL] Check/Uncheck the checkbox on the Application window "Use relative path for symlink" to use the relative path instead absolute path for the creating symlinks. **By default it's enabled** 145 | 146 | 147 | 148 | ### Downloading 149 | 150 | For the downloading executable file or sources to a local machine, just use the follows link and choose a required release: 151 | 152 | ```http 153 | https://github.com/ololx/quick-symlink/releases/ 154 | ``` 155 | 156 | ### Cloning 157 | 158 | For the cloning this repository to a local machine, just use the follows link: 159 | 160 | ```http 161 | https://github.com/ololx/quick-symlink.git 162 | ``` 163 | 164 | ### Using 165 | 166 | This tool allows to: 167 |
168 | Create symlinks in the current directory 169 | 1. Select folders or files for which a symbolic link is needed.
170 | 2. Call the contextual menu by the right-clicking on selected.
171 | 3. Select menu item `Symlink actions --> Create symlink for`.
172 |
173 | 174 |
175 | Create symlinks in another directory 176 | 1. Select folders or files for which a symbolic link is needed.
177 | 2. Call the contextual menu by the right-clicking on selected.
178 | 3. Select menu item `Symlink actions --> Copy path from here`.
179 | 4. Go to a destination folder.
180 | 5. Call the contextual menu by right-clicking on the filder.
181 | 6. Select menu item `Symlink actions --> Paste to here`.
182 |
183 | 184 |
185 | Replace objects with symbolic links 186 | 1. Select folders or files for which a symbolic link is needed.
187 | 2. Call the contextual menu by the right-clicking on selected.
188 | 3. Select menu item `Symlink actions --> Copy to clipboard`.
189 | 4. Go to a destination folder.
190 | 5. Call the contextual menu by right-clicking on the filder.
191 | 6. Select menu item `Symlink actions --> Move it here and replace with a link`.
192 |
193 | 194 |
195 | Create hard links in the current directory 196 | 1. Select folders or files for which a symbolic link is needed.
197 | 2. Call the contextual menu by the right-clicking on selected.
198 | 3. Select menu item `Hard link actions --> Create symlink for`.
199 |
200 | 201 |
202 | Create symlinks in another directory 203 | 1. Select folders or files for which a symbolic link is needed.
204 | 2. Call the contextual menu by the right-clicking on selected.
205 | 3. Select menu item `Hard link actions --> Copy path from here`.
206 | 4. Go to a destination folder.
207 | 5. Call the contextual menu by right-clicking on the filder.
208 | 6. Select menu item `Hard link actions --> Paste to here`.
209 |
210 | 211 | ## 🛠 Built With 212 | 213 | - **[Xcode](https://developer.apple.com/xcode/)** - the IDE for the `Finder Sync Extension` development. 214 | 215 | ## 🎉 Contributing 216 | 217 | If you want to contribute this project - you are welcome and have fun. 218 | Please visit the [contributing](CONTRIBUTING.md) section for details on this code of conduct, and the process for submitting pull requests. 219 | 220 | ## 📝 Code of Conduct 221 | 222 | In order to ensure that all is welcoming, please review and abide by the [code of conduct](CODE_OF_CONDUCT.md). 223 | 224 | ## 🗒 Versioning 225 | 226 | For the versioning is used [Semantic Versioning](http://semver.org/). For the versions available, see the [changelog](CHANGELOG.md) or the tags on this repository. 227 | 228 | ## ©️ Authors 229 | 230 | * **Alexander A. Kropotin** - *Initial work* - [ololx](https://github.com/ololx). 231 | 232 | ## 🔏 Licensing 233 | 234 | This project is licensed under the MIT license - see the [lisence](LICENSE) document for details. 235 | 236 | 237 | [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fololx%2Fquick-symlink.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fololx%2Fquick-symlink?ref=badge_large) 238 | -------------------------------------------------------------------------------- /quick-symlink/en.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; */ 3 | "1UK-8n-QPP.title" = "Customize Toolbar…"; 4 | 5 | /* Class = "NSMenuItem"; title = "quick-symlink"; ObjectID = "1Xt-HY-uBw"; */ 6 | "1Xt-HY-uBw.title" = "quick-symlink"; 7 | 8 | /* Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; */ 9 | "1b7-l0-nxx.title" = "Find"; 10 | 11 | /* Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; */ 12 | "1tx-W0-xDw.title" = "Lower"; 13 | 14 | /* Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; */ 15 | "2h7-ER-AoG.title" = "Raise"; 16 | 17 | /* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; */ 18 | "2oI-Rn-ZJC.title" = "Transformations"; 19 | 20 | /* Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; */ 21 | "3IN-sU-3Bg.title" = "Spelling"; 22 | 23 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; */ 24 | "3Om-Ey-2VK.title" = "Use Default"; 25 | 26 | /* Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; */ 27 | "3rS-ZA-NoH.title" = "Speech"; 28 | 29 | /* Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; */ 30 | "46P-cB-AYj.title" = "Tighten"; 31 | 32 | /* Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; */ 33 | "4EN-yA-p0u.title" = "Find"; 34 | 35 | /* Class = "NSMenuItem"; title = "Enter Full Screen"; ObjectID = "4J7-dP-txa"; */ 36 | "4J7-dP-txa.title" = "Enter Full Screen"; 37 | 38 | /* Class = "NSMenuItem"; title = "Quit quick-symlink"; ObjectID = "4sb-4s-VLi"; */ 39 | "4sb-4s-VLi.title" = "Quit quick-symlink"; 40 | 41 | /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; */ 42 | "5QF-Oa-p0T.title" = "Edit"; 43 | 44 | /* Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; */ 45 | "5Vv-lz-BsD.title" = "Copy Style"; 46 | 47 | /* Class = "NSMenuItem"; title = "About quick-symlink"; ObjectID = "5kV-Vb-QxS"; */ 48 | "5kV-Vb-QxS.title" = "About quick-symlink"; 49 | 50 | /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; */ 51 | "6dh-zS-Vam.title" = "Redo"; 52 | 53 | /* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; */ 54 | "78Y-hA-62v.title" = "Correct Spelling Automatically"; 55 | 56 | /* Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; */ 57 | "8mr-sm-Yjd.title" = "Writing Direction"; 58 | 59 | /* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; */ 60 | "9ic-FL-obx.title" = "Substitutions"; 61 | 62 | /* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; */ 63 | "9yt-4B-nSM.title" = "Smart Copy/Paste"; 64 | 65 | /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */ 66 | "AYu-sK-qS6.title" = "Main Menu"; 67 | 68 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */ 69 | "BOF-NM-1cW.title" = "Preferences…"; 70 | 71 | /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; */ 72 | "BgM-ve-c93.title" = "\tLeft to Right"; 73 | 74 | /* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; */ 75 | "Bw7-FT-i3A.title" = "Save As…"; 76 | 77 | /* Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; */ 78 | "DVo-aG-piG.title" = "Close"; 79 | 80 | /* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; */ 81 | "Dv1-io-Yv7.title" = "Spelling and Grammar"; 82 | 83 | /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */ 84 | "F2S-fz-NVQ.title" = "Help"; 85 | 86 | /* Class = "NSMenuItem"; title = "quick-symlink Help"; ObjectID = "FKE-Sm-Kum"; */ 87 | "FKE-Sm-Kum.title" = "quick-symlink Help"; 88 | 89 | /* Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; */ 90 | "Fal-I4-PZk.title" = "Text"; 91 | 92 | /* Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; */ 93 | "FeM-D8-WVr.title" = "Substitutions"; 94 | 95 | /* Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; */ 96 | "GB9-OM-e27.title" = "Bold"; 97 | 98 | /* Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; */ 99 | "GEO-Iw-cKr.title" = "Format"; 100 | 101 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; */ 102 | "GUa-eO-cwY.title" = "Use Default"; 103 | 104 | /* Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; */ 105 | "Gi5-1S-RQB.title" = "Font"; 106 | 107 | /* Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; */ 108 | "H1b-Si-o9J.title" = "Writing Direction"; 109 | 110 | /* Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; */ 111 | "H8h-7b-M4v.title" = "View"; 112 | 113 | /* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; */ 114 | "HFQ-gK-NFA.title" = "Text Replacement"; 115 | 116 | /* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; */ 117 | "HFo-cy-zxI.title" = "Show Spelling and Grammar"; 118 | 119 | /* Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; */ 120 | "HyV-fh-RgO.title" = "View"; 121 | 122 | /* Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; */ 123 | "I0S-gh-46l.title" = "Subscript"; 124 | 125 | /* Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; */ 126 | "IAo-SY-fd9.title" = "Open…"; 127 | 128 | /* Class = "NSWindow"; title = "Window"; ObjectID = "IQv-IB-iLA"; */ 129 | "IQv-IB-iLA.title" = "Window"; 130 | 131 | /* Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; */ 132 | "J5U-5w-g23.title" = "Justify"; 133 | 134 | /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; */ 135 | "J7y-lM-qPV.title" = "Use None"; 136 | 137 | /* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; */ 138 | "KaW-ft-85H.title" = "Revert to Saved"; 139 | 140 | /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ 141 | "Kd2-mp-pUS.title" = "Show All"; 142 | 143 | /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */ 144 | "LE2-aR-0XJ.title" = "Bring All to Front"; 145 | 146 | /* Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; */ 147 | "LVM-kO-fVI.title" = "Paste Ruler"; 148 | 149 | /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; */ 150 | "Lbh-J2-qVU.title" = "\tLeft to Right"; 151 | 152 | /* Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; */ 153 | "MkV-Pr-PK5.title" = "Copy Ruler"; 154 | 155 | /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */ 156 | "NMo-om-nkz.title" = "Services"; 157 | 158 | /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; */ 159 | "Nop-cj-93Q.title" = "\tDefault"; 160 | 161 | /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */ 162 | "OY7-WF-poV.title" = "Minimize"; 163 | 164 | /* Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; */ 165 | "OaQ-X3-Vso.title" = "Baseline"; 166 | 167 | /* Class = "NSMenuItem"; title = "Hide quick-symlink"; ObjectID = "Olw-nP-bQN"; */ 168 | "Olw-nP-bQN.title" = "Hide quick-symlink"; 169 | 170 | /* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; */ 171 | "OwM-mh-QMV.title" = "Find Previous"; 172 | 173 | /* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; */ 174 | "Oyz-dy-DGm.title" = "Stop Speaking"; 175 | 176 | /* Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; */ 177 | "Ptp-SP-VEL.title" = "Bigger"; 178 | 179 | /* Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; */ 180 | "Q5e-8K-NDq.title" = "Show Fonts"; 181 | 182 | /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */ 183 | "R4o-n2-Eq4.title" = "Zoom"; 184 | 185 | /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; */ 186 | "RB4-Sm-HuC.title" = "\tRight to Left"; 187 | 188 | /* Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; */ 189 | "Rqc-34-cIF.title" = "Superscript"; 190 | 191 | /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; */ 192 | "Ruw-6m-B2m.title" = "Select All"; 193 | 194 | /* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; */ 195 | "S0p-oC-mLd.title" = "Jump to Selection"; 196 | 197 | /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */ 198 | "Td7-aD-5lo.title" = "Window"; 199 | 200 | /* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; */ 201 | "UEZ-Bs-lqG.title" = "Capitalize"; 202 | 203 | /* Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; */ 204 | "VIY-Ag-zcb.title" = "Center"; 205 | 206 | /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */ 207 | "Vdr-fp-XzO.title" = "Hide Others"; 208 | 209 | /* Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; */ 210 | "Vjx-xi-njq.title" = "Italic"; 211 | 212 | /* Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; */ 213 | "W48-6f-4Dl.title" = "Edit"; 214 | 215 | /* Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; */ 216 | "WRG-CD-K1S.title" = "Underline"; 217 | 218 | /* Class = "NSMenuItem"; title = "New"; ObjectID = "Was-JA-tGl"; */ 219 | "Was-JA-tGl.title" = "New"; 220 | 221 | /* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; */ 222 | "WeT-3V-zwk.title" = "Paste and Match Style"; 223 | 224 | /* Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; */ 225 | "Xz5-n4-O0W.title" = "Find…"; 226 | 227 | /* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; */ 228 | "YEy-JH-Tfz.title" = "Find and Replace…"; 229 | 230 | /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; */ 231 | "YGs-j5-SAR.title" = "\tDefault"; 232 | 233 | /* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; */ 234 | "Ynk-f8-cLZ.title" = "Start Speaking"; 235 | 236 | /* Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; */ 237 | "ZM1-6Q-yy1.title" = "Align Left"; 238 | 239 | /* Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; */ 240 | "ZvO-Gk-QUH.title" = "Paragraph"; 241 | 242 | /* Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; */ 243 | "aTl-1u-JFS.title" = "Print…"; 244 | 245 | /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */ 246 | "aUF-d1-5bR.title" = "Window"; 247 | 248 | /* Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; */ 249 | "aXa-aM-Jaq.title" = "Font"; 250 | 251 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; */ 252 | "agt-UL-0e3.title" = "Use Default"; 253 | 254 | /* Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; */ 255 | "bgn-CT-cEk.title" = "Show Colors"; 256 | 257 | /* Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; */ 258 | "bib-Uj-vzu.title" = "File"; 259 | 260 | /* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; */ 261 | "buJ-ug-pKt.title" = "Use Selection for Find"; 262 | 263 | /* Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; */ 264 | "c8a-y6-VQd.title" = "Transformations"; 265 | 266 | /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; */ 267 | "cDB-IK-hbR.title" = "Use None"; 268 | 269 | /* Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; */ 270 | "cqv-fj-IhA.title" = "Selection"; 271 | 272 | /* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; */ 273 | "cwL-P1-jid.title" = "Smart Links"; 274 | 275 | /* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; */ 276 | "d9M-CD-aMd.title" = "Make Lower Case"; 277 | 278 | /* Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; */ 279 | "d9c-me-L2H.title" = "Text"; 280 | 281 | /* Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; */ 282 | "dMs-cI-mzQ.title" = "File"; 283 | 284 | /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; */ 285 | "dRJ-4n-Yzg.title" = "Undo"; 286 | 287 | /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; */ 288 | "gVA-U4-sdL.title" = "Paste"; 289 | 290 | /* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; */ 291 | "hQb-2v-fYv.title" = "Smart Quotes"; 292 | 293 | /* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; */ 294 | "hz2-CU-CR7.title" = "Check Document Now"; 295 | 296 | /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */ 297 | "hz9-B4-Xy5.title" = "Services"; 298 | 299 | /* Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; */ 300 | "i1d-Er-qST.title" = "Smaller"; 301 | 302 | /* Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; */ 303 | "ijk-EB-dga.title" = "Baseline"; 304 | 305 | /* Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; */ 306 | "jBQ-r6-VK2.title" = "Kern"; 307 | 308 | /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; */ 309 | "jFq-tB-4Kx.title" = "\tRight to Left"; 310 | 311 | /* Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; */ 312 | "jxT-CU-nIS.title" = "Format"; 313 | 314 | /* Class = "NSMenuItem"; title = "Show Sidebar"; ObjectID = "kIP-vf-haE"; */ 315 | "kIP-vf-haE.title" = "Show Sidebar"; 316 | 317 | /* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; */ 318 | "mK6-2p-4JG.title" = "Check Grammar With Spelling"; 319 | 320 | /* Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; */ 321 | "o6e-r0-MWq.title" = "Ligatures"; 322 | 323 | /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; */ 324 | "oas-Oc-fiZ.title" = "Open Recent"; 325 | 326 | /* Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; */ 327 | "ogc-rX-tC1.title" = "Loosen"; 328 | 329 | /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; */ 330 | "pa3-QI-u2k.title" = "Delete"; 331 | 332 | /* Class = "NSMenuItem"; title = "Save…"; ObjectID = "pxx-59-PXV"; */ 333 | "pxx-59-PXV.title" = "Save…"; 334 | 335 | /* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; */ 336 | "q09-fT-Sye.title" = "Find Next"; 337 | 338 | /* Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; */ 339 | "qIS-W8-SiK.title" = "Page Setup…"; 340 | 341 | /* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; */ 342 | "rbD-Rh-wIN.title" = "Check Spelling While Typing"; 343 | 344 | /* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; */ 345 | "rgM-f4-ycn.title" = "Smart Dashes"; 346 | 347 | /* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; */ 348 | "snW-S8-Cw5.title" = "Show Toolbar"; 349 | 350 | /* Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; */ 351 | "tRr-pd-1PS.title" = "Data Detectors"; 352 | 353 | /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; */ 354 | "tXI-mr-wws.title" = "Open Recent"; 355 | 356 | /* Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; */ 357 | "tlD-Oa-oAM.title" = "Kern"; 358 | 359 | /* Class = "NSMenu"; title = "quick-symlink"; ObjectID = "uQy-DD-JDr"; */ 360 | "uQy-DD-JDr.title" = "quick-symlink"; 361 | 362 | /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; */ 363 | "uRl-iY-unG.title" = "Cut"; 364 | 365 | /* Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; */ 366 | "vKC-jM-MkH.title" = "Paste Style"; 367 | 368 | /* Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; */ 369 | "vLm-3I-IUL.title" = "Show Ruler"; 370 | 371 | /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; */ 372 | "vNY-rz-j42.title" = "Clear Menu"; 373 | 374 | /* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; */ 375 | "vmV-6d-7jI.title" = "Make Upper Case"; 376 | 377 | /* Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; */ 378 | "w0m-vy-SC9.title" = "Ligatures"; 379 | 380 | /* Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; */ 381 | "wb2-vD-lq4.title" = "Align Right"; 382 | 383 | /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */ 384 | "wpr-3q-Mcd.title" = "Help"; 385 | 386 | /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; */ 387 | "x3v-GG-iWU.title" = "Copy"; 388 | 389 | /* Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; */ 390 | "xQD-1f-W4t.title" = "Use All"; 391 | 392 | /* Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; */ 393 | "xrE-MZ-jX0.title" = "Speech"; 394 | 395 | /* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; */ 396 | "z6F-FW-3nz.title" = "Show Substitutions"; 397 | -------------------------------------------------------------------------------- /quick-symlink/ru.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; */ 3 | "1UK-8n-QPP.title" = "Customize Toolbar…"; 4 | 5 | /* Class = "NSMenuItem"; title = "quick-symlink"; ObjectID = "1Xt-HY-uBw"; */ 6 | "1Xt-HY-uBw.title" = "quick-symlink"; 7 | 8 | /* Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; */ 9 | "1b7-l0-nxx.title" = "Find"; 10 | 11 | /* Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; */ 12 | "1tx-W0-xDw.title" = "Lower"; 13 | 14 | /* Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; */ 15 | "2h7-ER-AoG.title" = "Raise"; 16 | 17 | /* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; */ 18 | "2oI-Rn-ZJC.title" = "Transformations"; 19 | 20 | /* Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; */ 21 | "3IN-sU-3Bg.title" = "Spelling"; 22 | 23 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; */ 24 | "3Om-Ey-2VK.title" = "Use Default"; 25 | 26 | /* Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; */ 27 | "3rS-ZA-NoH.title" = "Speech"; 28 | 29 | /* Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; */ 30 | "46P-cB-AYj.title" = "Tighten"; 31 | 32 | /* Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; */ 33 | "4EN-yA-p0u.title" = "Find"; 34 | 35 | /* Class = "NSMenuItem"; title = "Enter Full Screen"; ObjectID = "4J7-dP-txa"; */ 36 | "4J7-dP-txa.title" = "Enter Full Screen"; 37 | 38 | /* Class = "NSMenuItem"; title = "Quit quick-symlink"; ObjectID = "4sb-4s-VLi"; */ 39 | "4sb-4s-VLi.title" = "Quit quick-symlink"; 40 | 41 | /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; */ 42 | "5QF-Oa-p0T.title" = "Edit"; 43 | 44 | /* Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; */ 45 | "5Vv-lz-BsD.title" = "Copy Style"; 46 | 47 | /* Class = "NSMenuItem"; title = "About quick-symlink"; ObjectID = "5kV-Vb-QxS"; */ 48 | "5kV-Vb-QxS.title" = "About quick-symlink"; 49 | 50 | /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; */ 51 | "6dh-zS-Vam.title" = "Redo"; 52 | 53 | /* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; */ 54 | "78Y-hA-62v.title" = "Correct Spelling Automatically"; 55 | 56 | /* Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; */ 57 | "8mr-sm-Yjd.title" = "Writing Direction"; 58 | 59 | /* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; */ 60 | "9ic-FL-obx.title" = "Substitutions"; 61 | 62 | /* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; */ 63 | "9yt-4B-nSM.title" = "Smart Copy/Paste"; 64 | 65 | /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */ 66 | "AYu-sK-qS6.title" = "Main Menu"; 67 | 68 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */ 69 | "BOF-NM-1cW.title" = "Preferences…"; 70 | 71 | /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; */ 72 | "BgM-ve-c93.title" = "\tLeft to Right"; 73 | 74 | /* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; */ 75 | "Bw7-FT-i3A.title" = "Save As…"; 76 | 77 | /* Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; */ 78 | "DVo-aG-piG.title" = "Close"; 79 | 80 | /* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; */ 81 | "Dv1-io-Yv7.title" = "Spelling and Grammar"; 82 | 83 | /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */ 84 | "F2S-fz-NVQ.title" = "Help"; 85 | 86 | /* Class = "NSMenuItem"; title = "quick-symlink Help"; ObjectID = "FKE-Sm-Kum"; */ 87 | "FKE-Sm-Kum.title" = "quick-symlink Help"; 88 | 89 | /* Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; */ 90 | "Fal-I4-PZk.title" = "Text"; 91 | 92 | /* Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; */ 93 | "FeM-D8-WVr.title" = "Substitutions"; 94 | 95 | /* Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; */ 96 | "GB9-OM-e27.title" = "Bold"; 97 | 98 | /* Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; */ 99 | "GEO-Iw-cKr.title" = "Format"; 100 | 101 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; */ 102 | "GUa-eO-cwY.title" = "Use Default"; 103 | 104 | /* Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; */ 105 | "Gi5-1S-RQB.title" = "Font"; 106 | 107 | /* Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; */ 108 | "H1b-Si-o9J.title" = "Writing Direction"; 109 | 110 | /* Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; */ 111 | "H8h-7b-M4v.title" = "View"; 112 | 113 | /* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; */ 114 | "HFQ-gK-NFA.title" = "Text Replacement"; 115 | 116 | /* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; */ 117 | "HFo-cy-zxI.title" = "Show Spelling and Grammar"; 118 | 119 | /* Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; */ 120 | "HyV-fh-RgO.title" = "View"; 121 | 122 | /* Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; */ 123 | "I0S-gh-46l.title" = "Subscript"; 124 | 125 | /* Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; */ 126 | "IAo-SY-fd9.title" = "Open…"; 127 | 128 | /* Class = "NSWindow"; title = "Window"; ObjectID = "IQv-IB-iLA"; */ 129 | "IQv-IB-iLA.title" = "Window"; 130 | 131 | /* Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; */ 132 | "J5U-5w-g23.title" = "Justify"; 133 | 134 | /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; */ 135 | "J7y-lM-qPV.title" = "Use None"; 136 | 137 | /* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; */ 138 | "KaW-ft-85H.title" = "Revert to Saved"; 139 | 140 | /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ 141 | "Kd2-mp-pUS.title" = "Show All"; 142 | 143 | /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */ 144 | "LE2-aR-0XJ.title" = "Bring All to Front"; 145 | 146 | /* Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; */ 147 | "LVM-kO-fVI.title" = "Paste Ruler"; 148 | 149 | /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; */ 150 | "Lbh-J2-qVU.title" = "\tLeft to Right"; 151 | 152 | /* Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; */ 153 | "MkV-Pr-PK5.title" = "Copy Ruler"; 154 | 155 | /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */ 156 | "NMo-om-nkz.title" = "Services"; 157 | 158 | /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; */ 159 | "Nop-cj-93Q.title" = "\tDefault"; 160 | 161 | /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */ 162 | "OY7-WF-poV.title" = "Minimize"; 163 | 164 | /* Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; */ 165 | "OaQ-X3-Vso.title" = "Baseline"; 166 | 167 | /* Class = "NSMenuItem"; title = "Hide quick-symlink"; ObjectID = "Olw-nP-bQN"; */ 168 | "Olw-nP-bQN.title" = "Hide quick-symlink"; 169 | 170 | /* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; */ 171 | "OwM-mh-QMV.title" = "Find Previous"; 172 | 173 | /* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; */ 174 | "Oyz-dy-DGm.title" = "Stop Speaking"; 175 | 176 | /* Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; */ 177 | "Ptp-SP-VEL.title" = "Bigger"; 178 | 179 | /* Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; */ 180 | "Q5e-8K-NDq.title" = "Show Fonts"; 181 | 182 | /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */ 183 | "R4o-n2-Eq4.title" = "Zoom"; 184 | 185 | /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; */ 186 | "RB4-Sm-HuC.title" = "\tRight to Left"; 187 | 188 | /* Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; */ 189 | "Rqc-34-cIF.title" = "Superscript"; 190 | 191 | /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; */ 192 | "Ruw-6m-B2m.title" = "Select All"; 193 | 194 | /* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; */ 195 | "S0p-oC-mLd.title" = "Jump to Selection"; 196 | 197 | /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */ 198 | "Td7-aD-5lo.title" = "Window"; 199 | 200 | /* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; */ 201 | "UEZ-Bs-lqG.title" = "Capitalize"; 202 | 203 | /* Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; */ 204 | "VIY-Ag-zcb.title" = "Center"; 205 | 206 | /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */ 207 | "Vdr-fp-XzO.title" = "Hide Others"; 208 | 209 | /* Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; */ 210 | "Vjx-xi-njq.title" = "Italic"; 211 | 212 | /* Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; */ 213 | "W48-6f-4Dl.title" = "Edit"; 214 | 215 | /* Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; */ 216 | "WRG-CD-K1S.title" = "Underline"; 217 | 218 | /* Class = "NSMenuItem"; title = "New"; ObjectID = "Was-JA-tGl"; */ 219 | "Was-JA-tGl.title" = "New"; 220 | 221 | /* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; */ 222 | "WeT-3V-zwk.title" = "Paste and Match Style"; 223 | 224 | /* Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; */ 225 | "Xz5-n4-O0W.title" = "Find…"; 226 | 227 | /* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; */ 228 | "YEy-JH-Tfz.title" = "Find and Replace…"; 229 | 230 | /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; */ 231 | "YGs-j5-SAR.title" = "\tDefault"; 232 | 233 | /* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; */ 234 | "Ynk-f8-cLZ.title" = "Start Speaking"; 235 | 236 | /* Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; */ 237 | "ZM1-6Q-yy1.title" = "Align Left"; 238 | 239 | /* Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; */ 240 | "ZvO-Gk-QUH.title" = "Paragraph"; 241 | 242 | /* Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; */ 243 | "aTl-1u-JFS.title" = "Print…"; 244 | 245 | /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */ 246 | "aUF-d1-5bR.title" = "Window"; 247 | 248 | /* Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; */ 249 | "aXa-aM-Jaq.title" = "Font"; 250 | 251 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; */ 252 | "agt-UL-0e3.title" = "Use Default"; 253 | 254 | /* Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; */ 255 | "bgn-CT-cEk.title" = "Show Colors"; 256 | 257 | /* Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; */ 258 | "bib-Uj-vzu.title" = "File"; 259 | 260 | /* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; */ 261 | "buJ-ug-pKt.title" = "Use Selection for Find"; 262 | 263 | /* Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; */ 264 | "c8a-y6-VQd.title" = "Transformations"; 265 | 266 | /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; */ 267 | "cDB-IK-hbR.title" = "Use None"; 268 | 269 | /* Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; */ 270 | "cqv-fj-IhA.title" = "Selection"; 271 | 272 | /* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; */ 273 | "cwL-P1-jid.title" = "Smart Links"; 274 | 275 | /* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; */ 276 | "d9M-CD-aMd.title" = "Make Lower Case"; 277 | 278 | /* Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; */ 279 | "d9c-me-L2H.title" = "Text"; 280 | 281 | /* Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; */ 282 | "dMs-cI-mzQ.title" = "File"; 283 | 284 | /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; */ 285 | "dRJ-4n-Yzg.title" = "Undo"; 286 | 287 | /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; */ 288 | "gVA-U4-sdL.title" = "Paste"; 289 | 290 | /* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; */ 291 | "hQb-2v-fYv.title" = "Smart Quotes"; 292 | 293 | /* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; */ 294 | "hz2-CU-CR7.title" = "Check Document Now"; 295 | 296 | /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */ 297 | "hz9-B4-Xy5.title" = "Services"; 298 | 299 | /* Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; */ 300 | "i1d-Er-qST.title" = "Smaller"; 301 | 302 | /* Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; */ 303 | "ijk-EB-dga.title" = "Baseline"; 304 | 305 | /* Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; */ 306 | "jBQ-r6-VK2.title" = "Kern"; 307 | 308 | /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; */ 309 | "jFq-tB-4Kx.title" = "\tRight to Left"; 310 | 311 | /* Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; */ 312 | "jxT-CU-nIS.title" = "Format"; 313 | 314 | /* Class = "NSMenuItem"; title = "Show Sidebar"; ObjectID = "kIP-vf-haE"; */ 315 | "kIP-vf-haE.title" = "Show Sidebar"; 316 | 317 | /* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; */ 318 | "mK6-2p-4JG.title" = "Check Grammar With Spelling"; 319 | 320 | /* Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; */ 321 | "o6e-r0-MWq.title" = "Ligatures"; 322 | 323 | /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; */ 324 | "oas-Oc-fiZ.title" = "Open Recent"; 325 | 326 | /* Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; */ 327 | "ogc-rX-tC1.title" = "Loosen"; 328 | 329 | /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; */ 330 | "pa3-QI-u2k.title" = "Delete"; 331 | 332 | /* Class = "NSMenuItem"; title = "Save…"; ObjectID = "pxx-59-PXV"; */ 333 | "pxx-59-PXV.title" = "Save…"; 334 | 335 | /* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; */ 336 | "q09-fT-Sye.title" = "Find Next"; 337 | 338 | /* Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; */ 339 | "qIS-W8-SiK.title" = "Page Setup…"; 340 | 341 | /* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; */ 342 | "rbD-Rh-wIN.title" = "Check Spelling While Typing"; 343 | 344 | /* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; */ 345 | "rgM-f4-ycn.title" = "Smart Dashes"; 346 | 347 | /* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; */ 348 | "snW-S8-Cw5.title" = "Show Toolbar"; 349 | 350 | /* Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; */ 351 | "tRr-pd-1PS.title" = "Data Detectors"; 352 | 353 | /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; */ 354 | "tXI-mr-wws.title" = "Open Recent"; 355 | 356 | /* Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; */ 357 | "tlD-Oa-oAM.title" = "Kern"; 358 | 359 | /* Class = "NSMenu"; title = "quick-symlink"; ObjectID = "uQy-DD-JDr"; */ 360 | "uQy-DD-JDr.title" = "quick-symlink"; 361 | 362 | /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; */ 363 | "uRl-iY-unG.title" = "Cut"; 364 | 365 | /* Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; */ 366 | "vKC-jM-MkH.title" = "Paste Style"; 367 | 368 | /* Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; */ 369 | "vLm-3I-IUL.title" = "Show Ruler"; 370 | 371 | /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; */ 372 | "vNY-rz-j42.title" = "Clear Menu"; 373 | 374 | /* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; */ 375 | "vmV-6d-7jI.title" = "Make Upper Case"; 376 | 377 | /* Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; */ 378 | "w0m-vy-SC9.title" = "Ligatures"; 379 | 380 | /* Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; */ 381 | "wb2-vD-lq4.title" = "Align Right"; 382 | 383 | /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */ 384 | "wpr-3q-Mcd.title" = "Help"; 385 | 386 | /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; */ 387 | "x3v-GG-iWU.title" = "Copy"; 388 | 389 | /* Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; */ 390 | "xQD-1f-W4t.title" = "Use All"; 391 | 392 | /* Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; */ 393 | "xrE-MZ-jX0.title" = "Speech"; 394 | 395 | /* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; */ 396 | "z6F-FW-3nz.title" = "Show Substitutions"; 397 | -------------------------------------------------------------------------------- /quick-symlink/en-GB.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; */ 3 | "1UK-8n-QPP.title" = "Customize Toolbar…"; 4 | 5 | /* Class = "NSMenuItem"; title = "quick-symlink"; ObjectID = "1Xt-HY-uBw"; */ 6 | "1Xt-HY-uBw.title" = "quick-symlink"; 7 | 8 | /* Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; */ 9 | "1b7-l0-nxx.title" = "Find"; 10 | 11 | /* Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; */ 12 | "1tx-W0-xDw.title" = "Lower"; 13 | 14 | /* Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; */ 15 | "2h7-ER-AoG.title" = "Raise"; 16 | 17 | /* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; */ 18 | "2oI-Rn-ZJC.title" = "Transformations"; 19 | 20 | /* Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; */ 21 | "3IN-sU-3Bg.title" = "Spelling"; 22 | 23 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; */ 24 | "3Om-Ey-2VK.title" = "Use Default"; 25 | 26 | /* Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; */ 27 | "3rS-ZA-NoH.title" = "Speech"; 28 | 29 | /* Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; */ 30 | "46P-cB-AYj.title" = "Tighten"; 31 | 32 | /* Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; */ 33 | "4EN-yA-p0u.title" = "Find"; 34 | 35 | /* Class = "NSMenuItem"; title = "Enter Full Screen"; ObjectID = "4J7-dP-txa"; */ 36 | "4J7-dP-txa.title" = "Enter Full Screen"; 37 | 38 | /* Class = "NSMenuItem"; title = "Quit quick-symlink"; ObjectID = "4sb-4s-VLi"; */ 39 | "4sb-4s-VLi.title" = "Quit quick-symlink"; 40 | 41 | /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; */ 42 | "5QF-Oa-p0T.title" = "Edit"; 43 | 44 | /* Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; */ 45 | "5Vv-lz-BsD.title" = "Copy Style"; 46 | 47 | /* Class = "NSMenuItem"; title = "About quick-symlink"; ObjectID = "5kV-Vb-QxS"; */ 48 | "5kV-Vb-QxS.title" = "About quick-symlink"; 49 | 50 | /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; */ 51 | "6dh-zS-Vam.title" = "Redo"; 52 | 53 | /* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; */ 54 | "78Y-hA-62v.title" = "Correct Spelling Automatically"; 55 | 56 | /* Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; */ 57 | "8mr-sm-Yjd.title" = "Writing Direction"; 58 | 59 | /* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; */ 60 | "9ic-FL-obx.title" = "Substitutions"; 61 | 62 | /* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; */ 63 | "9yt-4B-nSM.title" = "Smart Copy/Paste"; 64 | 65 | /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */ 66 | "AYu-sK-qS6.title" = "Main Menu"; 67 | 68 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */ 69 | "BOF-NM-1cW.title" = "Preferences…"; 70 | 71 | /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; */ 72 | "BgM-ve-c93.title" = "\tLeft to Right"; 73 | 74 | /* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; */ 75 | "Bw7-FT-i3A.title" = "Save As…"; 76 | 77 | /* Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; */ 78 | "DVo-aG-piG.title" = "Close"; 79 | 80 | /* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; */ 81 | "Dv1-io-Yv7.title" = "Spelling and Grammar"; 82 | 83 | /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */ 84 | "F2S-fz-NVQ.title" = "Help"; 85 | 86 | /* Class = "NSMenuItem"; title = "quick-symlink Help"; ObjectID = "FKE-Sm-Kum"; */ 87 | "FKE-Sm-Kum.title" = "quick-symlink Help"; 88 | 89 | /* Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; */ 90 | "Fal-I4-PZk.title" = "Text"; 91 | 92 | /* Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; */ 93 | "FeM-D8-WVr.title" = "Substitutions"; 94 | 95 | /* Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; */ 96 | "GB9-OM-e27.title" = "Bold"; 97 | 98 | /* Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; */ 99 | "GEO-Iw-cKr.title" = "Format"; 100 | 101 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; */ 102 | "GUa-eO-cwY.title" = "Use Default"; 103 | 104 | /* Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; */ 105 | "Gi5-1S-RQB.title" = "Font"; 106 | 107 | /* Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; */ 108 | "H1b-Si-o9J.title" = "Writing Direction"; 109 | 110 | /* Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; */ 111 | "H8h-7b-M4v.title" = "View"; 112 | 113 | /* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; */ 114 | "HFQ-gK-NFA.title" = "Text Replacement"; 115 | 116 | /* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; */ 117 | "HFo-cy-zxI.title" = "Show Spelling and Grammar"; 118 | 119 | /* Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; */ 120 | "HyV-fh-RgO.title" = "View"; 121 | 122 | /* Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; */ 123 | "I0S-gh-46l.title" = "Subscript"; 124 | 125 | /* Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; */ 126 | "IAo-SY-fd9.title" = "Open…"; 127 | 128 | /* Class = "NSWindow"; title = "Window"; ObjectID = "IQv-IB-iLA"; */ 129 | "IQv-IB-iLA.title" = "Window"; 130 | 131 | /* Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; */ 132 | "J5U-5w-g23.title" = "Justify"; 133 | 134 | /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; */ 135 | "J7y-lM-qPV.title" = "Use None"; 136 | 137 | /* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; */ 138 | "KaW-ft-85H.title" = "Revert to Saved"; 139 | 140 | /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ 141 | "Kd2-mp-pUS.title" = "Show All"; 142 | 143 | /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */ 144 | "LE2-aR-0XJ.title" = "Bring All to Front"; 145 | 146 | /* Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; */ 147 | "LVM-kO-fVI.title" = "Paste Ruler"; 148 | 149 | /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; */ 150 | "Lbh-J2-qVU.title" = "\tLeft to Right"; 151 | 152 | /* Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; */ 153 | "MkV-Pr-PK5.title" = "Copy Ruler"; 154 | 155 | /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */ 156 | "NMo-om-nkz.title" = "Services"; 157 | 158 | /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; */ 159 | "Nop-cj-93Q.title" = "\tDefault"; 160 | 161 | /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */ 162 | "OY7-WF-poV.title" = "Minimize"; 163 | 164 | /* Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; */ 165 | "OaQ-X3-Vso.title" = "Baseline"; 166 | 167 | /* Class = "NSMenuItem"; title = "Hide quick-symlink"; ObjectID = "Olw-nP-bQN"; */ 168 | "Olw-nP-bQN.title" = "Hide quick-symlink"; 169 | 170 | /* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; */ 171 | "OwM-mh-QMV.title" = "Find Previous"; 172 | 173 | /* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; */ 174 | "Oyz-dy-DGm.title" = "Stop Speaking"; 175 | 176 | /* Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; */ 177 | "Ptp-SP-VEL.title" = "Bigger"; 178 | 179 | /* Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; */ 180 | "Q5e-8K-NDq.title" = "Show Fonts"; 181 | 182 | /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */ 183 | "R4o-n2-Eq4.title" = "Zoom"; 184 | 185 | /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; */ 186 | "RB4-Sm-HuC.title" = "\tRight to Left"; 187 | 188 | /* Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; */ 189 | "Rqc-34-cIF.title" = "Superscript"; 190 | 191 | /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; */ 192 | "Ruw-6m-B2m.title" = "Select All"; 193 | 194 | /* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; */ 195 | "S0p-oC-mLd.title" = "Jump to Selection"; 196 | 197 | /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */ 198 | "Td7-aD-5lo.title" = "Window"; 199 | 200 | /* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; */ 201 | "UEZ-Bs-lqG.title" = "Capitalize"; 202 | 203 | /* Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; */ 204 | "VIY-Ag-zcb.title" = "Center"; 205 | 206 | /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */ 207 | "Vdr-fp-XzO.title" = "Hide Others"; 208 | 209 | /* Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; */ 210 | "Vjx-xi-njq.title" = "Italic"; 211 | 212 | /* Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; */ 213 | "W48-6f-4Dl.title" = "Edit"; 214 | 215 | /* Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; */ 216 | "WRG-CD-K1S.title" = "Underline"; 217 | 218 | /* Class = "NSMenuItem"; title = "New"; ObjectID = "Was-JA-tGl"; */ 219 | "Was-JA-tGl.title" = "New"; 220 | 221 | /* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; */ 222 | "WeT-3V-zwk.title" = "Paste and Match Style"; 223 | 224 | /* Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; */ 225 | "Xz5-n4-O0W.title" = "Find…"; 226 | 227 | /* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; */ 228 | "YEy-JH-Tfz.title" = "Find and Replace…"; 229 | 230 | /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; */ 231 | "YGs-j5-SAR.title" = "\tDefault"; 232 | 233 | /* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; */ 234 | "Ynk-f8-cLZ.title" = "Start Speaking"; 235 | 236 | /* Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; */ 237 | "ZM1-6Q-yy1.title" = "Align Left"; 238 | 239 | /* Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; */ 240 | "ZvO-Gk-QUH.title" = "Paragraph"; 241 | 242 | /* Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; */ 243 | "aTl-1u-JFS.title" = "Print…"; 244 | 245 | /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */ 246 | "aUF-d1-5bR.title" = "Window"; 247 | 248 | /* Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; */ 249 | "aXa-aM-Jaq.title" = "Font"; 250 | 251 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; */ 252 | "agt-UL-0e3.title" = "Use Default"; 253 | 254 | /* Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; */ 255 | "bgn-CT-cEk.title" = "Show Colors"; 256 | 257 | /* Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; */ 258 | "bib-Uj-vzu.title" = "File"; 259 | 260 | /* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; */ 261 | "buJ-ug-pKt.title" = "Use Selection for Find"; 262 | 263 | /* Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; */ 264 | "c8a-y6-VQd.title" = "Transformations"; 265 | 266 | /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; */ 267 | "cDB-IK-hbR.title" = "Use None"; 268 | 269 | /* Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; */ 270 | "cqv-fj-IhA.title" = "Selection"; 271 | 272 | /* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; */ 273 | "cwL-P1-jid.title" = "Smart Links"; 274 | 275 | /* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; */ 276 | "d9M-CD-aMd.title" = "Make Lower Case"; 277 | 278 | /* Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; */ 279 | "d9c-me-L2H.title" = "Text"; 280 | 281 | /* Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; */ 282 | "dMs-cI-mzQ.title" = "File"; 283 | 284 | /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; */ 285 | "dRJ-4n-Yzg.title" = "Undo"; 286 | 287 | /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; */ 288 | "gVA-U4-sdL.title" = "Paste"; 289 | 290 | /* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; */ 291 | "hQb-2v-fYv.title" = "Smart Quotes"; 292 | 293 | /* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; */ 294 | "hz2-CU-CR7.title" = "Check Document Now"; 295 | 296 | /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */ 297 | "hz9-B4-Xy5.title" = "Services"; 298 | 299 | /* Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; */ 300 | "i1d-Er-qST.title" = "Smaller"; 301 | 302 | /* Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; */ 303 | "ijk-EB-dga.title" = "Baseline"; 304 | 305 | /* Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; */ 306 | "jBQ-r6-VK2.title" = "Kern"; 307 | 308 | /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; */ 309 | "jFq-tB-4Kx.title" = "\tRight to Left"; 310 | 311 | /* Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; */ 312 | "jxT-CU-nIS.title" = "Format"; 313 | 314 | /* Class = "NSMenuItem"; title = "Show Sidebar"; ObjectID = "kIP-vf-haE"; */ 315 | "kIP-vf-haE.title" = "Show Sidebar"; 316 | 317 | /* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; */ 318 | "mK6-2p-4JG.title" = "Check Grammar With Spelling"; 319 | 320 | /* Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; */ 321 | "o6e-r0-MWq.title" = "Ligatures"; 322 | 323 | /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; */ 324 | "oas-Oc-fiZ.title" = "Open Recent"; 325 | 326 | /* Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; */ 327 | "ogc-rX-tC1.title" = "Loosen"; 328 | 329 | /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; */ 330 | "pa3-QI-u2k.title" = "Delete"; 331 | 332 | /* Class = "NSMenuItem"; title = "Save…"; ObjectID = "pxx-59-PXV"; */ 333 | "pxx-59-PXV.title" = "Save…"; 334 | 335 | /* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; */ 336 | "q09-fT-Sye.title" = "Find Next"; 337 | 338 | /* Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; */ 339 | "qIS-W8-SiK.title" = "Page Setup…"; 340 | 341 | /* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; */ 342 | "rbD-Rh-wIN.title" = "Check Spelling While Typing"; 343 | 344 | /* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; */ 345 | "rgM-f4-ycn.title" = "Smart Dashes"; 346 | 347 | /* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; */ 348 | "snW-S8-Cw5.title" = "Show Toolbar"; 349 | 350 | /* Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; */ 351 | "tRr-pd-1PS.title" = "Data Detectors"; 352 | 353 | /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; */ 354 | "tXI-mr-wws.title" = "Open Recent"; 355 | 356 | /* Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; */ 357 | "tlD-Oa-oAM.title" = "Kern"; 358 | 359 | /* Class = "NSMenu"; title = "quick-symlink"; ObjectID = "uQy-DD-JDr"; */ 360 | "uQy-DD-JDr.title" = "quick-symlink"; 361 | 362 | /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; */ 363 | "uRl-iY-unG.title" = "Cut"; 364 | 365 | /* Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; */ 366 | "vKC-jM-MkH.title" = "Paste Style"; 367 | 368 | /* Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; */ 369 | "vLm-3I-IUL.title" = "Show Ruler"; 370 | 371 | /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; */ 372 | "vNY-rz-j42.title" = "Clear Menu"; 373 | 374 | /* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; */ 375 | "vmV-6d-7jI.title" = "Make Upper Case"; 376 | 377 | /* Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; */ 378 | "w0m-vy-SC9.title" = "Ligatures"; 379 | 380 | /* Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; */ 381 | "wb2-vD-lq4.title" = "Align Right"; 382 | 383 | /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */ 384 | "wpr-3q-Mcd.title" = "Help"; 385 | 386 | /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; */ 387 | "x3v-GG-iWU.title" = "Copy"; 388 | 389 | /* Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; */ 390 | "xQD-1f-W4t.title" = "Use All"; 391 | 392 | /* Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; */ 393 | "xrE-MZ-jX0.title" = "Speech"; 394 | 395 | /* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; */ 396 | "z6F-FW-3nz.title" = "Show Substitutions"; 397 | -------------------------------------------------------------------------------- /quick-symlink.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | A307B41726D21E39002EEF58 /* Path.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41626D21E39002EEF58 /* Path.swift */; }; 11 | A307B41826D21E39002EEF58 /* Path.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41626D21E39002EEF58 /* Path.swift */; }; 12 | A307B41A26D22116002EEF58 /* ResourcePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41926D22116002EEF58 /* ResourcePath.swift */; }; 13 | A307B41B26D22116002EEF58 /* ResourcePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41926D22116002EEF58 /* ResourcePath.swift */; }; 14 | A307B42F26D2563B002EEF58 /* ResourcePathTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B42E26D2563B002EEF58 /* ResourcePathTest.swift */; }; 15 | A307B43026D257C5002EEF58 /* ResourcePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41926D22116002EEF58 /* ResourcePath.swift */; }; 16 | A307B43126D257CA002EEF58 /* Path.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41626D21E39002EEF58 /* Path.swift */; }; 17 | A30B9AAB265CA63300ACAA63 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30B9AAA265CA63300ACAA63 /* AppDelegate.swift */; }; 18 | A30B9AAD265CA63300ACAA63 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30B9AAC265CA63300ACAA63 /* ViewController.swift */; }; 19 | A30B9AAF265CA63300ACAA63 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A30B9AAE265CA63300ACAA63 /* Assets.xcassets */; }; 20 | A30B9AB2265CA63300ACAA63 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A30B9AB0265CA63300ACAA63 /* Main.storyboard */; }; 21 | A30B9AC1265CA68900ACAA63 /* FinderSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30B9AC0265CA68900ACAA63 /* FinderSync.swift */; }; 22 | A30B9AC6265CA68900ACAA63 /* soft-link-actions-extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = A30B9ABE265CA68900ACAA63 /* soft-link-actions-extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 23 | A30D4A4A26A0C14400BA775B /* CopyPathAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C126A0B30F004FBF0F /* CopyPathAction.swift */; }; 24 | A30D4A4B26A0C14400BA775B /* PasteLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C426A0B49C004FBF0F /* PasteLinkAction.swift */; }; 25 | A30D4A4C26A0C14400BA775B /* ReplaceWithLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C726A0B552004FBF0F /* ReplaceWithLinkAction.swift */; }; 26 | A30D4A4D26A0C18B00BA775B /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9BE26A0B200004FBF0F /* Action.swift */; }; 27 | A316477726B7B403001DD969 /* CreateLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A316477626B7B403001DD969 /* CreateLinkAction.swift */; }; 28 | A316477826B7B403001DD969 /* CreateLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A316477626B7B403001DD969 /* CreateLinkAction.swift */; }; 29 | A31904A426E104FA00D7F69D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A31904A326E104FA00D7F69D /* Assets.xcassets */; }; 30 | A32EE8E0265D4D05008648AA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A32EE8DF265D4D05008648AA /* Assets.xcassets */; }; 31 | A345C9BF26A0B200004FBF0F /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9BE26A0B200004FBF0F /* Action.swift */; }; 32 | A345C9C226A0B30F004FBF0F /* CopyPathAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C126A0B30F004FBF0F /* CopyPathAction.swift */; }; 33 | A345C9C526A0B49C004FBF0F /* PasteLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C426A0B49C004FBF0F /* PasteLinkAction.swift */; }; 34 | A345C9C826A0B552004FBF0F /* ReplaceWithLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C726A0B552004FBF0F /* ReplaceWithLinkAction.swift */; }; 35 | A34F677227B561D90092BA64 /* FileLinkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A36F9B0526DFAC27009E95CE /* FileLinkManager.swift */; }; 36 | A34F677327B561FC0092BA64 /* QuickSymlinkDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DC975B26F4A3B800B506D4 /* QuickSymlinkDefaults.swift */; }; 37 | A34F677527B563570092BA64 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A34F677427B563570092BA64 /* Config.swift */; }; 38 | A34F677627B563570092BA64 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A34F677427B563570092BA64 /* Config.swift */; }; 39 | A34F677727B563570092BA64 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A34F677427B563570092BA64 /* Config.swift */; }; 40 | A34F677827B563570092BA64 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A34F677427B563570092BA64 /* Config.swift */; }; 41 | A35AF46726F51A0B009546C3 /* QuickSymlinkDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DC975B26F4A3B800B506D4 /* QuickSymlinkDefaults.swift */; }; 42 | A36F9B0626DFAC27009E95CE /* FileLinkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A36F9B0526DFAC27009E95CE /* FileLinkManager.swift */; }; 43 | A36F9B0726DFB127009E95CE /* FileLinkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A36F9B0526DFAC27009E95CE /* FileLinkManager.swift */; }; 44 | A3DC975226F4662F00B506D4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A3DC975626F4662F00B506D4 /* Localizable.strings */; }; 45 | A3DC975326F4662F00B506D4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A3DC975626F4662F00B506D4 /* Localizable.strings */; }; 46 | A3DC975426F4662F00B506D4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A3DC975626F4662F00B506D4 /* Localizable.strings */; }; 47 | A3DC975D26F4A3B800B506D4 /* QuickSymlinkDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DC975B26F4A3B800B506D4 /* QuickSymlinkDefaults.swift */; }; 48 | A3DC975E26F4A3B800B506D4 /* QuickSymlinkDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DC975B26F4A3B800B506D4 /* QuickSymlinkDefaults.swift */; }; 49 | A3E4D35526E0FD2900C9F175 /* FinderSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3E4D35426E0FD2900C9F175 /* FinderSync.swift */; }; 50 | A3E4D35A26E0FD2900C9F175 /* hard-link-actions-extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = A3E4D35226E0FD2900C9F175 /* hard-link-actions-extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 51 | A3E4D35E26E0FEE700C9F175 /* FileLinkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A36F9B0526DFAC27009E95CE /* FileLinkManager.swift */; }; 52 | A3E4D35F26E0FEEA00C9F175 /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9BE26A0B200004FBF0F /* Action.swift */; }; 53 | A3E4D36026E0FEED00C9F175 /* CopyPathAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C126A0B30F004FBF0F /* CopyPathAction.swift */; }; 54 | A3E4D36126E0FEEF00C9F175 /* PasteLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C426A0B49C004FBF0F /* PasteLinkAction.swift */; }; 55 | A3E4D36226E0FEF200C9F175 /* ReplaceWithLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C726A0B552004FBF0F /* ReplaceWithLinkAction.swift */; }; 56 | A3E4D36326E0FEF400C9F175 /* CreateLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A316477626B7B403001DD969 /* CreateLinkAction.swift */; }; 57 | A3E4D36426E0FF8100C9F175 /* ResourcePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41926D22116002EEF58 /* ResourcePath.swift */; }; 58 | A3E4D36526E0FF8600C9F175 /* Path.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41626D21E39002EEF58 /* Path.swift */; }; 59 | /* End PBXBuildFile section */ 60 | 61 | /* Begin PBXContainerItemProxy section */ 62 | A307B42926D255FB002EEF58 /* PBXContainerItemProxy */ = { 63 | isa = PBXContainerItemProxy; 64 | containerPortal = A30B9A9F265CA63300ACAA63 /* Project object */; 65 | proxyType = 1; 66 | remoteGlobalIDString = A30B9AA6265CA63300ACAA63; 67 | remoteInfo = "quick-symlink"; 68 | }; 69 | A30B9AC4265CA68900ACAA63 /* PBXContainerItemProxy */ = { 70 | isa = PBXContainerItemProxy; 71 | containerPortal = A30B9A9F265CA63300ACAA63 /* Project object */; 72 | proxyType = 1; 73 | remoteGlobalIDString = A30B9ABD265CA68900ACAA63; 74 | remoteInfo = "quick-symlink-extension"; 75 | }; 76 | A3E4D35826E0FD2900C9F175 /* PBXContainerItemProxy */ = { 77 | isa = PBXContainerItemProxy; 78 | containerPortal = A30B9A9F265CA63300ACAA63 /* Project object */; 79 | proxyType = 1; 80 | remoteGlobalIDString = A3E4D35126E0FD2900C9F175; 81 | remoteInfo = "hard-link-action-extension"; 82 | }; 83 | /* End PBXContainerItemProxy section */ 84 | 85 | /* Begin PBXCopyFilesBuildPhase section */ 86 | A30B9ACA265CA68900ACAA63 /* Embed App Extensions */ = { 87 | isa = PBXCopyFilesBuildPhase; 88 | buildActionMask = 2147483647; 89 | dstPath = ""; 90 | dstSubfolderSpec = 13; 91 | files = ( 92 | A3E4D35A26E0FD2900C9F175 /* hard-link-actions-extension.appex in Embed App Extensions */, 93 | A30B9AC6265CA68900ACAA63 /* soft-link-actions-extension.appex in Embed App Extensions */, 94 | ); 95 | name = "Embed App Extensions"; 96 | runOnlyForDeploymentPostprocessing = 0; 97 | }; 98 | /* End PBXCopyFilesBuildPhase section */ 99 | 100 | /* Begin PBXFileReference section */ 101 | A307B41626D21E39002EEF58 /* Path.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Path.swift; sourceTree = ""; }; 102 | A307B41926D22116002EEF58 /* ResourcePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourcePath.swift; sourceTree = ""; }; 103 | A307B42426D255FB002EEF58 /* quick-symlink-tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "quick-symlink-tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 104 | A307B42826D255FB002EEF58 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 105 | A307B42E26D2563B002EEF58 /* ResourcePathTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourcePathTest.swift; sourceTree = ""; }; 106 | A30B9AA7265CA63300ACAA63 /* quick-symlink.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "quick-symlink.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 107 | A30B9AAA265CA63300ACAA63 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 108 | A30B9AAC265CA63300ACAA63 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 109 | A30B9AAE265CA63300ACAA63 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 110 | A30B9AB1265CA63300ACAA63 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 111 | A30B9AB3265CA63300ACAA63 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 112 | A30B9AB4265CA63300ACAA63 /* quick_symlink.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = quick_symlink.entitlements; sourceTree = ""; }; 113 | A30B9ABE265CA68900ACAA63 /* soft-link-actions-extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "soft-link-actions-extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 114 | A30B9AC0265CA68900ACAA63 /* FinderSync.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = FinderSync.swift; sourceTree = ""; tabWidth = 4; wrapsLines = 0; }; 115 | A30B9AC2265CA68900ACAA63 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 116 | A30B9ACB265CA78600ACAA63 /* soft-link-actions-extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "soft-link-actions-extension.entitlements"; sourceTree = ""; }; 117 | A316477626B7B403001DD969 /* CreateLinkAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateLinkAction.swift; sourceTree = ""; }; 118 | A31904A326E104FA00D7F69D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 119 | A32EE8DF265D4D05008648AA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 120 | A345C9BE26A0B200004FBF0F /* Action.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Action.swift; sourceTree = ""; }; 121 | A345C9C126A0B30F004FBF0F /* CopyPathAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyPathAction.swift; sourceTree = ""; }; 122 | A345C9C426A0B49C004FBF0F /* PasteLinkAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasteLinkAction.swift; sourceTree = ""; }; 123 | A345C9C726A0B552004FBF0F /* ReplaceWithLinkAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplaceWithLinkAction.swift; sourceTree = ""; }; 124 | A34F677427B563570092BA64 /* Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = ""; }; 125 | A36F9B0526DFAC27009E95CE /* FileLinkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileLinkManager.swift; sourceTree = ""; }; 126 | A3DC974B26F4659200B506D4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Main.strings; sourceTree = ""; }; 127 | A3DC974C26F465C400B506D4 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Main.strings"; sourceTree = ""; }; 128 | A3DC974D26F465CA00B506D4 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Main.strings; sourceTree = ""; }; 129 | A3DC975526F4662F00B506D4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 130 | A3DC975726F4663100B506D4 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Localizable.strings"; sourceTree = ""; }; 131 | A3DC975826F4663200B506D4 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; 132 | A3DC975926F4663F00B506D4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; 133 | A3DC975B26F4A3B800B506D4 /* QuickSymlinkDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSymlinkDefaults.swift; sourceTree = ""; }; 134 | A3E4D35226E0FD2900C9F175 /* hard-link-actions-extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "hard-link-actions-extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 135 | A3E4D35426E0FD2900C9F175 /* FinderSync.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinderSync.swift; sourceTree = ""; }; 136 | A3E4D35626E0FD2900C9F175 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 137 | A3E4D35726E0FD2900C9F175 /* hard-link-actions-extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "hard-link-actions-extension.entitlements"; sourceTree = ""; }; 138 | /* End PBXFileReference section */ 139 | 140 | /* Begin PBXFrameworksBuildPhase section */ 141 | A307B42126D255FB002EEF58 /* Frameworks */ = { 142 | isa = PBXFrameworksBuildPhase; 143 | buildActionMask = 2147483647; 144 | files = ( 145 | ); 146 | runOnlyForDeploymentPostprocessing = 0; 147 | }; 148 | A30B9AA4265CA63300ACAA63 /* Frameworks */ = { 149 | isa = PBXFrameworksBuildPhase; 150 | buildActionMask = 2147483647; 151 | files = ( 152 | ); 153 | runOnlyForDeploymentPostprocessing = 0; 154 | }; 155 | A30B9ABB265CA68900ACAA63 /* Frameworks */ = { 156 | isa = PBXFrameworksBuildPhase; 157 | buildActionMask = 2147483647; 158 | files = ( 159 | ); 160 | runOnlyForDeploymentPostprocessing = 0; 161 | }; 162 | A3E4D34F26E0FD2900C9F175 /* Frameworks */ = { 163 | isa = PBXFrameworksBuildPhase; 164 | buildActionMask = 2147483647; 165 | files = ( 166 | ); 167 | runOnlyForDeploymentPostprocessing = 0; 168 | }; 169 | /* End PBXFrameworksBuildPhase section */ 170 | 171 | /* Begin PBXGroup section */ 172 | A307B41426D21DBE002EEF58 /* action */ = { 173 | isa = PBXGroup; 174 | children = ( 175 | A316477626B7B403001DD969 /* CreateLinkAction.swift */, 176 | A345C9C726A0B552004FBF0F /* ReplaceWithLinkAction.swift */, 177 | A345C9C426A0B49C004FBF0F /* PasteLinkAction.swift */, 178 | A345C9C126A0B30F004FBF0F /* CopyPathAction.swift */, 179 | A345C9BE26A0B200004FBF0F /* Action.swift */, 180 | ); 181 | path = action; 182 | sourceTree = ""; 183 | }; 184 | A307B41526D21E23002EEF58 /* path */ = { 185 | isa = PBXGroup; 186 | children = ( 187 | A307B41626D21E39002EEF58 /* Path.swift */, 188 | A307B41926D22116002EEF58 /* ResourcePath.swift */, 189 | ); 190 | path = path; 191 | sourceTree = ""; 192 | }; 193 | A307B42526D255FB002EEF58 /* quick-symlink-tests */ = { 194 | isa = PBXGroup; 195 | children = ( 196 | A307B42826D255FB002EEF58 /* Info.plist */, 197 | A307B42E26D2563B002EEF58 /* ResourcePathTest.swift */, 198 | ); 199 | path = "quick-symlink-tests"; 200 | sourceTree = ""; 201 | }; 202 | A30B9A9E265CA63300ACAA63 = { 203 | isa = PBXGroup; 204 | children = ( 205 | A3DC975626F4662F00B506D4 /* Localizable.strings */, 206 | A345C9BD26A0B12C004FBF0F /* commons */, 207 | A30B9AA9265CA63300ACAA63 /* quick-symlink */, 208 | A30B9ABF265CA68900ACAA63 /* soft-link-actions-extension */, 209 | A307B42526D255FB002EEF58 /* quick-symlink-tests */, 210 | A3E4D35326E0FD2900C9F175 /* hard-link-actions-extension */, 211 | A30B9AA8265CA63300ACAA63 /* Products */, 212 | ); 213 | sourceTree = ""; 214 | }; 215 | A30B9AA8265CA63300ACAA63 /* Products */ = { 216 | isa = PBXGroup; 217 | children = ( 218 | A30B9AA7265CA63300ACAA63 /* quick-symlink.app */, 219 | A30B9ABE265CA68900ACAA63 /* soft-link-actions-extension.appex */, 220 | A307B42426D255FB002EEF58 /* quick-symlink-tests.xctest */, 221 | A3E4D35226E0FD2900C9F175 /* hard-link-actions-extension.appex */, 222 | ); 223 | name = Products; 224 | sourceTree = ""; 225 | }; 226 | A30B9AA9265CA63300ACAA63 /* quick-symlink */ = { 227 | isa = PBXGroup; 228 | children = ( 229 | A30B9AAA265CA63300ACAA63 /* AppDelegate.swift */, 230 | A30B9AAC265CA63300ACAA63 /* ViewController.swift */, 231 | A30B9AAE265CA63300ACAA63 /* Assets.xcassets */, 232 | A30B9AB0265CA63300ACAA63 /* Main.storyboard */, 233 | A30B9AB3265CA63300ACAA63 /* Info.plist */, 234 | A30B9AB4265CA63300ACAA63 /* quick_symlink.entitlements */, 235 | ); 236 | path = "quick-symlink"; 237 | sourceTree = ""; 238 | }; 239 | A30B9ABF265CA68900ACAA63 /* soft-link-actions-extension */ = { 240 | isa = PBXGroup; 241 | children = ( 242 | A30B9ACB265CA78600ACAA63 /* soft-link-actions-extension.entitlements */, 243 | A30B9AC0265CA68900ACAA63 /* FinderSync.swift */, 244 | A32EE8DF265D4D05008648AA /* Assets.xcassets */, 245 | A30B9AC2265CA68900ACAA63 /* Info.plist */, 246 | ); 247 | path = "soft-link-actions-extension"; 248 | sourceTree = ""; 249 | }; 250 | A345C9BD26A0B12C004FBF0F /* commons */ = { 251 | isa = PBXGroup; 252 | children = ( 253 | A3DC975A26F4A36200B506D4 /* config */, 254 | A36F9B0426DFAA4B009E95CE /* link */, 255 | A307B41526D21E23002EEF58 /* path */, 256 | ); 257 | path = commons; 258 | sourceTree = ""; 259 | }; 260 | A36F9B0426DFAA4B009E95CE /* link */ = { 261 | isa = PBXGroup; 262 | children = ( 263 | A307B41426D21DBE002EEF58 /* action */, 264 | A36F9B0526DFAC27009E95CE /* FileLinkManager.swift */, 265 | ); 266 | path = link; 267 | sourceTree = ""; 268 | }; 269 | A3DC975A26F4A36200B506D4 /* config */ = { 270 | isa = PBXGroup; 271 | children = ( 272 | A3DC975B26F4A3B800B506D4 /* QuickSymlinkDefaults.swift */, 273 | A34F677427B563570092BA64 /* Config.swift */, 274 | ); 275 | path = config; 276 | sourceTree = ""; 277 | }; 278 | A3E4D35326E0FD2900C9F175 /* hard-link-actions-extension */ = { 279 | isa = PBXGroup; 280 | children = ( 281 | A3E4D35426E0FD2900C9F175 /* FinderSync.swift */, 282 | A3E4D35626E0FD2900C9F175 /* Info.plist */, 283 | A3E4D35726E0FD2900C9F175 /* hard-link-actions-extension.entitlements */, 284 | A31904A326E104FA00D7F69D /* Assets.xcassets */, 285 | ); 286 | path = "hard-link-actions-extension"; 287 | sourceTree = ""; 288 | }; 289 | /* End PBXGroup section */ 290 | 291 | /* Begin PBXNativeTarget section */ 292 | A307B42326D255FB002EEF58 /* quick-symlink-tests */ = { 293 | isa = PBXNativeTarget; 294 | buildConfigurationList = A307B42B26D255FB002EEF58 /* Build configuration list for PBXNativeTarget "quick-symlink-tests" */; 295 | buildPhases = ( 296 | A307B42026D255FB002EEF58 /* Sources */, 297 | A307B42126D255FB002EEF58 /* Frameworks */, 298 | A307B42226D255FB002EEF58 /* Resources */, 299 | ); 300 | buildRules = ( 301 | ); 302 | dependencies = ( 303 | A307B42A26D255FB002EEF58 /* PBXTargetDependency */, 304 | ); 305 | name = "quick-symlink-tests"; 306 | productName = "quick-symlink-tests"; 307 | productReference = A307B42426D255FB002EEF58 /* quick-symlink-tests.xctest */; 308 | productType = "com.apple.product-type.bundle.unit-test"; 309 | }; 310 | A30B9AA6265CA63300ACAA63 /* quick-symlink */ = { 311 | isa = PBXNativeTarget; 312 | buildConfigurationList = A30B9AB7265CA63300ACAA63 /* Build configuration list for PBXNativeTarget "quick-symlink" */; 313 | buildPhases = ( 314 | A30B9AA3265CA63300ACAA63 /* Sources */, 315 | A30B9AA4265CA63300ACAA63 /* Frameworks */, 316 | A30B9AA5265CA63300ACAA63 /* Resources */, 317 | A30B9ACA265CA68900ACAA63 /* Embed App Extensions */, 318 | ); 319 | buildRules = ( 320 | ); 321 | dependencies = ( 322 | A30B9AC5265CA68900ACAA63 /* PBXTargetDependency */, 323 | A3E4D35926E0FD2900C9F175 /* PBXTargetDependency */, 324 | ); 325 | name = "quick-symlink"; 326 | productName = "quick-symlink"; 327 | productReference = A30B9AA7265CA63300ACAA63 /* quick-symlink.app */; 328 | productType = "com.apple.product-type.application"; 329 | }; 330 | A30B9ABD265CA68900ACAA63 /* soft-link-actions-extension */ = { 331 | isa = PBXNativeTarget; 332 | buildConfigurationList = A30B9AC7265CA68900ACAA63 /* Build configuration list for PBXNativeTarget "soft-link-actions-extension" */; 333 | buildPhases = ( 334 | A30B9ABA265CA68900ACAA63 /* Sources */, 335 | A30B9ABB265CA68900ACAA63 /* Frameworks */, 336 | A30B9ABC265CA68900ACAA63 /* Resources */, 337 | ); 338 | buildRules = ( 339 | ); 340 | dependencies = ( 341 | ); 342 | name = "soft-link-actions-extension"; 343 | productName = "quick-symlink-extension"; 344 | productReference = A30B9ABE265CA68900ACAA63 /* soft-link-actions-extension.appex */; 345 | productType = "com.apple.product-type.app-extension"; 346 | }; 347 | A3E4D35126E0FD2900C9F175 /* hard-link-actions-extension */ = { 348 | isa = PBXNativeTarget; 349 | buildConfigurationList = A3E4D35B26E0FD2900C9F175 /* Build configuration list for PBXNativeTarget "hard-link-actions-extension" */; 350 | buildPhases = ( 351 | A3E4D34E26E0FD2900C9F175 /* Sources */, 352 | A3E4D34F26E0FD2900C9F175 /* Frameworks */, 353 | A3E4D35026E0FD2900C9F175 /* Resources */, 354 | ); 355 | buildRules = ( 356 | ); 357 | dependencies = ( 358 | ); 359 | name = "hard-link-actions-extension"; 360 | productName = "hard-link-action-extension"; 361 | productReference = A3E4D35226E0FD2900C9F175 /* hard-link-actions-extension.appex */; 362 | productType = "com.apple.product-type.app-extension"; 363 | }; 364 | /* End PBXNativeTarget section */ 365 | 366 | /* Begin PBXProject section */ 367 | A30B9A9F265CA63300ACAA63 /* Project object */ = { 368 | isa = PBXProject; 369 | attributes = { 370 | LastSwiftUpdateCheck = 0920; 371 | LastUpgradeCheck = 0920; 372 | ORGANIZATIONNAME = "Alexander A. Kropotin"; 373 | TargetAttributes = { 374 | A307B42326D255FB002EEF58 = { 375 | CreatedOnToolsVersion = 9.2; 376 | ProvisioningStyle = Automatic; 377 | TestTargetID = A30B9AA6265CA63300ACAA63; 378 | }; 379 | A30B9AA6265CA63300ACAA63 = { 380 | CreatedOnToolsVersion = 9.2; 381 | ProvisioningStyle = Automatic; 382 | SystemCapabilities = { 383 | com.apple.ApplicationGroups.Mac = { 384 | enabled = 1; 385 | }; 386 | com.apple.Sandbox = { 387 | enabled = 1; 388 | }; 389 | }; 390 | }; 391 | A30B9ABD265CA68900ACAA63 = { 392 | CreatedOnToolsVersion = 9.2; 393 | ProvisioningStyle = Automatic; 394 | SystemCapabilities = { 395 | com.apple.ApplicationGroups.Mac = { 396 | enabled = 1; 397 | }; 398 | com.apple.Sandbox = { 399 | enabled = 1; 400 | }; 401 | }; 402 | }; 403 | A3E4D35126E0FD2900C9F175 = { 404 | CreatedOnToolsVersion = 9.2; 405 | ProvisioningStyle = Automatic; 406 | }; 407 | }; 408 | }; 409 | buildConfigurationList = A30B9AA2265CA63300ACAA63 /* Build configuration list for PBXProject "quick-symlink" */; 410 | compatibilityVersion = "Xcode 3.2"; 411 | developmentRegion = en; 412 | hasScannedForEncodings = 0; 413 | knownRegions = ( 414 | en, 415 | Base, 416 | "en-GB", 417 | ru, 418 | ); 419 | mainGroup = A30B9A9E265CA63300ACAA63; 420 | productRefGroup = A30B9AA8265CA63300ACAA63 /* Products */; 421 | projectDirPath = ""; 422 | projectRoot = ""; 423 | targets = ( 424 | A30B9AA6265CA63300ACAA63 /* quick-symlink */, 425 | A30B9ABD265CA68900ACAA63 /* soft-link-actions-extension */, 426 | A307B42326D255FB002EEF58 /* quick-symlink-tests */, 427 | A3E4D35126E0FD2900C9F175 /* hard-link-actions-extension */, 428 | ); 429 | }; 430 | /* End PBXProject section */ 431 | 432 | /* Begin PBXResourcesBuildPhase section */ 433 | A307B42226D255FB002EEF58 /* Resources */ = { 434 | isa = PBXResourcesBuildPhase; 435 | buildActionMask = 2147483647; 436 | files = ( 437 | ); 438 | runOnlyForDeploymentPostprocessing = 0; 439 | }; 440 | A30B9AA5265CA63300ACAA63 /* Resources */ = { 441 | isa = PBXResourcesBuildPhase; 442 | buildActionMask = 2147483647; 443 | files = ( 444 | A30B9AAF265CA63300ACAA63 /* Assets.xcassets in Resources */, 445 | A3DC975226F4662F00B506D4 /* Localizable.strings in Resources */, 446 | A30B9AB2265CA63300ACAA63 /* Main.storyboard in Resources */, 447 | ); 448 | runOnlyForDeploymentPostprocessing = 0; 449 | }; 450 | A30B9ABC265CA68900ACAA63 /* Resources */ = { 451 | isa = PBXResourcesBuildPhase; 452 | buildActionMask = 2147483647; 453 | files = ( 454 | A32EE8E0265D4D05008648AA /* Assets.xcassets in Resources */, 455 | A3DC975326F4662F00B506D4 /* Localizable.strings in Resources */, 456 | ); 457 | runOnlyForDeploymentPostprocessing = 0; 458 | }; 459 | A3E4D35026E0FD2900C9F175 /* Resources */ = { 460 | isa = PBXResourcesBuildPhase; 461 | buildActionMask = 2147483647; 462 | files = ( 463 | A31904A426E104FA00D7F69D /* Assets.xcassets in Resources */, 464 | A3DC975426F4662F00B506D4 /* Localizable.strings in Resources */, 465 | ); 466 | runOnlyForDeploymentPostprocessing = 0; 467 | }; 468 | /* End PBXResourcesBuildPhase section */ 469 | 470 | /* Begin PBXSourcesBuildPhase section */ 471 | A307B42026D255FB002EEF58 /* Sources */ = { 472 | isa = PBXSourcesBuildPhase; 473 | buildActionMask = 2147483647; 474 | files = ( 475 | A34F677327B561FC0092BA64 /* QuickSymlinkDefaults.swift in Sources */, 476 | A307B43026D257C5002EEF58 /* ResourcePath.swift in Sources */, 477 | A34F677227B561D90092BA64 /* FileLinkManager.swift in Sources */, 478 | A34F677727B563570092BA64 /* Config.swift in Sources */, 479 | A307B42F26D2563B002EEF58 /* ResourcePathTest.swift in Sources */, 480 | A307B43126D257CA002EEF58 /* Path.swift in Sources */, 481 | ); 482 | runOnlyForDeploymentPostprocessing = 0; 483 | }; 484 | A30B9AA3265CA63300ACAA63 /* Sources */ = { 485 | isa = PBXSourcesBuildPhase; 486 | buildActionMask = 2147483647; 487 | files = ( 488 | A307B41A26D22116002EEF58 /* ResourcePath.swift in Sources */, 489 | A345C9C826A0B552004FBF0F /* ReplaceWithLinkAction.swift in Sources */, 490 | A316477726B7B403001DD969 /* CreateLinkAction.swift in Sources */, 491 | A307B41726D21E39002EEF58 /* Path.swift in Sources */, 492 | A30B9AAD265CA63300ACAA63 /* ViewController.swift in Sources */, 493 | A345C9C226A0B30F004FBF0F /* CopyPathAction.swift in Sources */, 494 | A345C9BF26A0B200004FBF0F /* Action.swift in Sources */, 495 | A35AF46726F51A0B009546C3 /* QuickSymlinkDefaults.swift in Sources */, 496 | A30B9AAB265CA63300ACAA63 /* AppDelegate.swift in Sources */, 497 | A34F677527B563570092BA64 /* Config.swift in Sources */, 498 | A345C9C526A0B49C004FBF0F /* PasteLinkAction.swift in Sources */, 499 | A36F9B0626DFAC27009E95CE /* FileLinkManager.swift in Sources */, 500 | ); 501 | runOnlyForDeploymentPostprocessing = 0; 502 | }; 503 | A30B9ABA265CA68900ACAA63 /* Sources */ = { 504 | isa = PBXSourcesBuildPhase; 505 | buildActionMask = 2147483647; 506 | files = ( 507 | A3DC975D26F4A3B800B506D4 /* QuickSymlinkDefaults.swift in Sources */, 508 | A30B9AC1265CA68900ACAA63 /* FinderSync.swift in Sources */, 509 | A307B41826D21E39002EEF58 /* Path.swift in Sources */, 510 | A307B41B26D22116002EEF58 /* ResourcePath.swift in Sources */, 511 | A30D4A4B26A0C14400BA775B /* PasteLinkAction.swift in Sources */, 512 | A30D4A4C26A0C14400BA775B /* ReplaceWithLinkAction.swift in Sources */, 513 | A316477826B7B403001DD969 /* CreateLinkAction.swift in Sources */, 514 | A30D4A4D26A0C18B00BA775B /* Action.swift in Sources */, 515 | A30D4A4A26A0C14400BA775B /* CopyPathAction.swift in Sources */, 516 | A36F9B0726DFB127009E95CE /* FileLinkManager.swift in Sources */, 517 | A34F677627B563570092BA64 /* Config.swift in Sources */, 518 | ); 519 | runOnlyForDeploymentPostprocessing = 0; 520 | }; 521 | A3E4D34E26E0FD2900C9F175 /* Sources */ = { 522 | isa = PBXSourcesBuildPhase; 523 | buildActionMask = 2147483647; 524 | files = ( 525 | A3DC975E26F4A3B800B506D4 /* QuickSymlinkDefaults.swift in Sources */, 526 | A3E4D36226E0FEF200C9F175 /* ReplaceWithLinkAction.swift in Sources */, 527 | A3E4D36326E0FEF400C9F175 /* CreateLinkAction.swift in Sources */, 528 | A3E4D36426E0FF8100C9F175 /* ResourcePath.swift in Sources */, 529 | A3E4D35526E0FD2900C9F175 /* FinderSync.swift in Sources */, 530 | A3E4D36026E0FEED00C9F175 /* CopyPathAction.swift in Sources */, 531 | A3E4D35F26E0FEEA00C9F175 /* Action.swift in Sources */, 532 | A3E4D36126E0FEEF00C9F175 /* PasteLinkAction.swift in Sources */, 533 | A3E4D36526E0FF8600C9F175 /* Path.swift in Sources */, 534 | A3E4D35E26E0FEE700C9F175 /* FileLinkManager.swift in Sources */, 535 | A34F677827B563570092BA64 /* Config.swift in Sources */, 536 | ); 537 | runOnlyForDeploymentPostprocessing = 0; 538 | }; 539 | /* End PBXSourcesBuildPhase section */ 540 | 541 | /* Begin PBXTargetDependency section */ 542 | A307B42A26D255FB002EEF58 /* PBXTargetDependency */ = { 543 | isa = PBXTargetDependency; 544 | target = A30B9AA6265CA63300ACAA63 /* quick-symlink */; 545 | targetProxy = A307B42926D255FB002EEF58 /* PBXContainerItemProxy */; 546 | }; 547 | A30B9AC5265CA68900ACAA63 /* PBXTargetDependency */ = { 548 | isa = PBXTargetDependency; 549 | target = A30B9ABD265CA68900ACAA63 /* soft-link-actions-extension */; 550 | targetProxy = A30B9AC4265CA68900ACAA63 /* PBXContainerItemProxy */; 551 | }; 552 | A3E4D35926E0FD2900C9F175 /* PBXTargetDependency */ = { 553 | isa = PBXTargetDependency; 554 | target = A3E4D35126E0FD2900C9F175 /* hard-link-actions-extension */; 555 | targetProxy = A3E4D35826E0FD2900C9F175 /* PBXContainerItemProxy */; 556 | }; 557 | /* End PBXTargetDependency section */ 558 | 559 | /* Begin PBXVariantGroup section */ 560 | A30B9AB0265CA63300ACAA63 /* Main.storyboard */ = { 561 | isa = PBXVariantGroup; 562 | children = ( 563 | A30B9AB1265CA63300ACAA63 /* Base */, 564 | A3DC974B26F4659200B506D4 /* en */, 565 | A3DC974C26F465C400B506D4 /* en-GB */, 566 | A3DC974D26F465CA00B506D4 /* ru */, 567 | ); 568 | name = Main.storyboard; 569 | sourceTree = ""; 570 | }; 571 | A3DC975626F4662F00B506D4 /* Localizable.strings */ = { 572 | isa = PBXVariantGroup; 573 | children = ( 574 | A3DC975526F4662F00B506D4 /* en */, 575 | A3DC975726F4663100B506D4 /* en-GB */, 576 | A3DC975826F4663200B506D4 /* ru */, 577 | A3DC975926F4663F00B506D4 /* Base */, 578 | ); 579 | name = Localizable.strings; 580 | sourceTree = ""; 581 | }; 582 | /* End PBXVariantGroup section */ 583 | 584 | /* Begin XCBuildConfiguration section */ 585 | A307B42C26D255FB002EEF58 /* Debug */ = { 586 | isa = XCBuildConfiguration; 587 | buildSettings = { 588 | BUNDLE_LOADER = "$(TEST_HOST)"; 589 | CODE_SIGN_STYLE = Automatic; 590 | COMBINE_HIDPI_IMAGES = YES; 591 | INFOPLIST_FILE = "quick-symlink-tests/Info.plist"; 592 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 593 | MACOSX_DEPLOYMENT_TARGET = 10.10; 594 | PRODUCT_BUNDLE_IDENTIFIER = "org.ololx.quick-symlink-tests"; 595 | PRODUCT_NAME = "$(TARGET_NAME)"; 596 | SWIFT_VERSION = 4.0; 597 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/quick-symlink.app/Contents/MacOS/quick-symlink"; 598 | }; 599 | name = Debug; 600 | }; 601 | A307B42D26D255FB002EEF58 /* Release */ = { 602 | isa = XCBuildConfiguration; 603 | buildSettings = { 604 | BUNDLE_LOADER = "$(TEST_HOST)"; 605 | CODE_SIGN_STYLE = Automatic; 606 | COMBINE_HIDPI_IMAGES = YES; 607 | INFOPLIST_FILE = "quick-symlink-tests/Info.plist"; 608 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 609 | MACOSX_DEPLOYMENT_TARGET = 10.10; 610 | PRODUCT_BUNDLE_IDENTIFIER = "org.ololx.quick-symlink-tests"; 611 | PRODUCT_NAME = "$(TARGET_NAME)"; 612 | SWIFT_VERSION = 4.0; 613 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/quick-symlink.app/Contents/MacOS/quick-symlink"; 614 | }; 615 | name = Release; 616 | }; 617 | A30B9AB5265CA63300ACAA63 /* Debug */ = { 618 | isa = XCBuildConfiguration; 619 | buildSettings = { 620 | ALWAYS_SEARCH_USER_PATHS = NO; 621 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 622 | CLANG_ANALYZER_NONNULL = YES; 623 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 624 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 625 | CLANG_CXX_LIBRARY = "libc++"; 626 | CLANG_ENABLE_MODULES = YES; 627 | CLANG_ENABLE_OBJC_ARC = YES; 628 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 629 | CLANG_WARN_BOOL_CONVERSION = YES; 630 | CLANG_WARN_COMMA = YES; 631 | CLANG_WARN_CONSTANT_CONVERSION = YES; 632 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 633 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 634 | CLANG_WARN_EMPTY_BODY = YES; 635 | CLANG_WARN_ENUM_CONVERSION = YES; 636 | CLANG_WARN_INFINITE_RECURSION = YES; 637 | CLANG_WARN_INT_CONVERSION = YES; 638 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 639 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 640 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 641 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 642 | CLANG_WARN_STRICT_PROTOTYPES = YES; 643 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 644 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 645 | CLANG_WARN_UNREACHABLE_CODE = YES; 646 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 647 | CODE_SIGN_IDENTITY = "-"; 648 | COPY_PHASE_STRIP = NO; 649 | DEBUG_INFORMATION_FORMAT = dwarf; 650 | ENABLE_STRICT_OBJC_MSGSEND = YES; 651 | ENABLE_TESTABILITY = YES; 652 | GCC_C_LANGUAGE_STANDARD = gnu11; 653 | GCC_DYNAMIC_NO_PIC = NO; 654 | GCC_NO_COMMON_BLOCKS = YES; 655 | GCC_OPTIMIZATION_LEVEL = 0; 656 | GCC_PREPROCESSOR_DEFINITIONS = ( 657 | "DEBUG=1", 658 | "$(inherited)", 659 | ); 660 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 661 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 662 | GCC_WARN_UNDECLARED_SELECTOR = YES; 663 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 664 | GCC_WARN_UNUSED_FUNCTION = YES; 665 | GCC_WARN_UNUSED_VARIABLE = YES; 666 | MACOSX_DEPLOYMENT_TARGET = 10.10; 667 | MTL_ENABLE_DEBUG_INFO = YES; 668 | ONLY_ACTIVE_ARCH = YES; 669 | SDKROOT = macosx; 670 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 671 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 672 | }; 673 | name = Debug; 674 | }; 675 | A30B9AB6265CA63300ACAA63 /* Release */ = { 676 | isa = XCBuildConfiguration; 677 | buildSettings = { 678 | ALWAYS_SEARCH_USER_PATHS = NO; 679 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 680 | CLANG_ANALYZER_NONNULL = YES; 681 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 682 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 683 | CLANG_CXX_LIBRARY = "libc++"; 684 | CLANG_ENABLE_MODULES = YES; 685 | CLANG_ENABLE_OBJC_ARC = YES; 686 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 687 | CLANG_WARN_BOOL_CONVERSION = YES; 688 | CLANG_WARN_COMMA = YES; 689 | CLANG_WARN_CONSTANT_CONVERSION = YES; 690 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 691 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 692 | CLANG_WARN_EMPTY_BODY = YES; 693 | CLANG_WARN_ENUM_CONVERSION = YES; 694 | CLANG_WARN_INFINITE_RECURSION = YES; 695 | CLANG_WARN_INT_CONVERSION = YES; 696 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 697 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 698 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 699 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 700 | CLANG_WARN_STRICT_PROTOTYPES = YES; 701 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 702 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 703 | CLANG_WARN_UNREACHABLE_CODE = YES; 704 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 705 | CODE_SIGN_IDENTITY = "-"; 706 | COPY_PHASE_STRIP = NO; 707 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 708 | ENABLE_NS_ASSERTIONS = NO; 709 | ENABLE_STRICT_OBJC_MSGSEND = YES; 710 | GCC_C_LANGUAGE_STANDARD = gnu11; 711 | GCC_NO_COMMON_BLOCKS = YES; 712 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 713 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 714 | GCC_WARN_UNDECLARED_SELECTOR = YES; 715 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 716 | GCC_WARN_UNUSED_FUNCTION = YES; 717 | GCC_WARN_UNUSED_VARIABLE = YES; 718 | MACOSX_DEPLOYMENT_TARGET = 10.10; 719 | MTL_ENABLE_DEBUG_INFO = NO; 720 | SDKROOT = macosx; 721 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 722 | }; 723 | name = Release; 724 | }; 725 | A30B9AB8265CA63300ACAA63 /* Debug */ = { 726 | isa = XCBuildConfiguration; 727 | buildSettings = { 728 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 729 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 730 | CODE_SIGN_ENTITLEMENTS = "quick-symlink/quick_symlink.entitlements"; 731 | CODE_SIGN_STYLE = Automatic; 732 | COMBINE_HIDPI_IMAGES = YES; 733 | INFOPLIST_FILE = "quick-symlink/Info.plist"; 734 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 735 | MACOSX_DEPLOYMENT_TARGET = 10.10; 736 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.ololx.quick-symlink"; 737 | PRODUCT_NAME = "$(TARGET_NAME)"; 738 | SWIFT_VERSION = 4.0; 739 | }; 740 | name = Debug; 741 | }; 742 | A30B9AB9265CA63300ACAA63 /* Release */ = { 743 | isa = XCBuildConfiguration; 744 | buildSettings = { 745 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 746 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 747 | CODE_SIGN_ENTITLEMENTS = "quick-symlink/quick_symlink.entitlements"; 748 | CODE_SIGN_STYLE = Automatic; 749 | COMBINE_HIDPI_IMAGES = YES; 750 | INFOPLIST_FILE = "quick-symlink/Info.plist"; 751 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 752 | MACOSX_DEPLOYMENT_TARGET = 10.10; 753 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.ololx.quick-symlink"; 754 | PRODUCT_NAME = "$(TARGET_NAME)"; 755 | SWIFT_VERSION = 4.0; 756 | }; 757 | name = Release; 758 | }; 759 | A30B9AC8265CA68900ACAA63 /* Debug */ = { 760 | isa = XCBuildConfiguration; 761 | buildSettings = { 762 | CODE_SIGN_ENTITLEMENTS = "soft-link-actions-extension/soft-link-actions-extension.entitlements"; 763 | CODE_SIGN_STYLE = Automatic; 764 | COMBINE_HIDPI_IMAGES = YES; 765 | INFOPLIST_FILE = "soft-link-actions-extension/Info.plist"; 766 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks"; 767 | MACOSX_DEPLOYMENT_TARGET = 10.10; 768 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.ololx.quick-symlink.soft-link-actions-extension"; 769 | PRODUCT_NAME = "$(TARGET_NAME)"; 770 | SKIP_INSTALL = YES; 771 | SWIFT_VERSION = 4.0; 772 | }; 773 | name = Debug; 774 | }; 775 | A30B9AC9265CA68900ACAA63 /* Release */ = { 776 | isa = XCBuildConfiguration; 777 | buildSettings = { 778 | CODE_SIGN_ENTITLEMENTS = "soft-link-actions-extension/soft-link-actions-extension.entitlements"; 779 | CODE_SIGN_STYLE = Automatic; 780 | COMBINE_HIDPI_IMAGES = YES; 781 | INFOPLIST_FILE = "soft-link-actions-extension/Info.plist"; 782 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks"; 783 | MACOSX_DEPLOYMENT_TARGET = 10.10; 784 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.ololx.quick-symlink.soft-link-actions-extension"; 785 | PRODUCT_NAME = "$(TARGET_NAME)"; 786 | SKIP_INSTALL = YES; 787 | SWIFT_VERSION = 4.0; 788 | }; 789 | name = Release; 790 | }; 791 | A3E4D35C26E0FD2900C9F175 /* Debug */ = { 792 | isa = XCBuildConfiguration; 793 | buildSettings = { 794 | CODE_SIGN_ENTITLEMENTS = "hard-link-actions-extension/hard-link-actions-extension.entitlements"; 795 | CODE_SIGN_STYLE = Automatic; 796 | COMBINE_HIDPI_IMAGES = YES; 797 | INFOPLIST_FILE = "hard-link-actions-extension/Info.plist"; 798 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks"; 799 | MACOSX_DEPLOYMENT_TARGET = 10.10; 800 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.ololx.quick-symlink.hard-link-actions-extension"; 801 | PRODUCT_NAME = "$(TARGET_NAME)"; 802 | SKIP_INSTALL = YES; 803 | SWIFT_VERSION = 4.0; 804 | }; 805 | name = Debug; 806 | }; 807 | A3E4D35D26E0FD2900C9F175 /* Release */ = { 808 | isa = XCBuildConfiguration; 809 | buildSettings = { 810 | CODE_SIGN_ENTITLEMENTS = "hard-link-actions-extension/hard-link-actions-extension.entitlements"; 811 | CODE_SIGN_STYLE = Automatic; 812 | COMBINE_HIDPI_IMAGES = YES; 813 | INFOPLIST_FILE = "hard-link-actions-extension/Info.plist"; 814 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks"; 815 | MACOSX_DEPLOYMENT_TARGET = 10.10; 816 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.ololx.quick-symlink.hard-link-actions-extension"; 817 | PRODUCT_NAME = "$(TARGET_NAME)"; 818 | SKIP_INSTALL = YES; 819 | SWIFT_VERSION = 4.0; 820 | }; 821 | name = Release; 822 | }; 823 | /* End XCBuildConfiguration section */ 824 | 825 | /* Begin XCConfigurationList section */ 826 | A307B42B26D255FB002EEF58 /* Build configuration list for PBXNativeTarget "quick-symlink-tests" */ = { 827 | isa = XCConfigurationList; 828 | buildConfigurations = ( 829 | A307B42C26D255FB002EEF58 /* Debug */, 830 | A307B42D26D255FB002EEF58 /* Release */, 831 | ); 832 | defaultConfigurationIsVisible = 0; 833 | defaultConfigurationName = Release; 834 | }; 835 | A30B9AA2265CA63300ACAA63 /* Build configuration list for PBXProject "quick-symlink" */ = { 836 | isa = XCConfigurationList; 837 | buildConfigurations = ( 838 | A30B9AB5265CA63300ACAA63 /* Debug */, 839 | A30B9AB6265CA63300ACAA63 /* Release */, 840 | ); 841 | defaultConfigurationIsVisible = 0; 842 | defaultConfigurationName = Release; 843 | }; 844 | A30B9AB7265CA63300ACAA63 /* Build configuration list for PBXNativeTarget "quick-symlink" */ = { 845 | isa = XCConfigurationList; 846 | buildConfigurations = ( 847 | A30B9AB8265CA63300ACAA63 /* Debug */, 848 | A30B9AB9265CA63300ACAA63 /* Release */, 849 | ); 850 | defaultConfigurationIsVisible = 0; 851 | defaultConfigurationName = Release; 852 | }; 853 | A30B9AC7265CA68900ACAA63 /* Build configuration list for PBXNativeTarget "soft-link-actions-extension" */ = { 854 | isa = XCConfigurationList; 855 | buildConfigurations = ( 856 | A30B9AC8265CA68900ACAA63 /* Debug */, 857 | A30B9AC9265CA68900ACAA63 /* Release */, 858 | ); 859 | defaultConfigurationIsVisible = 0; 860 | defaultConfigurationName = Release; 861 | }; 862 | A3E4D35B26E0FD2900C9F175 /* Build configuration list for PBXNativeTarget "hard-link-actions-extension" */ = { 863 | isa = XCConfigurationList; 864 | buildConfigurations = ( 865 | A3E4D35C26E0FD2900C9F175 /* Debug */, 866 | A3E4D35D26E0FD2900C9F175 /* Release */, 867 | ); 868 | defaultConfigurationIsVisible = 0; 869 | defaultConfigurationName = Release; 870 | }; 871 | /* End XCConfigurationList section */ 872 | }; 873 | rootObject = A30B9A9F265CA63300ACAA63 /* Project object */; 874 | } 875 | --------------------------------------------------------------------------------