├── .gitignore ├── LICENSE ├── NoMoreTypo ├── CheckNamingTypoCommand.swift ├── CheckStringTypoCommand.swift ├── Info.plist ├── NoMoreTypo.entitlements └── SourceEditorExtension.swift ├── NoMoreTypoForXcode.xcodeproj ├── project.pbxproj └── project.xcworkspace │ └── contents.xcworkspacedata ├── NoMoreTypoForXcode ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── 1024.png │ │ ├── 128.png │ │ ├── 16.png │ │ ├── 256-1.png │ │ ├── 256.png │ │ ├── 32-1.png │ │ ├── 32.png │ │ ├── 512-1.png │ │ ├── 512.png │ │ ├── 64.png │ │ └── Contents.json │ ├── Contents.json │ ├── GitHub.imageset │ │ ├── Contents.json │ │ ├── GitHub-Mark-120px-plus.png │ │ ├── GitHub-Mark-32px.png │ │ └── GitHub-Mark-64px.png │ └── Logo.imageset │ │ ├── 1024.png │ │ ├── 256.png │ │ ├── 512.png │ │ └── Contents.json ├── Base.lproj │ └── Main.storyboard ├── Info.plist ├── NoMoreTypoForXcode.entitlements └── ViewController.swift └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode (from gitignore.io) 2 | build/ 3 | *.pbxuser 4 | !default.pbxuser 5 | *.mode1v3 6 | !default.mode1v3 7 | *.mode2v3 8 | !default.mode2v3 9 | *.perspectivev3 10 | !default.perspectivev3 11 | xcuserdata 12 | *.xccheckout 13 | *.moved-aside 14 | DerivedData 15 | *.hmap 16 | *.ipa 17 | *.xcuserstate 18 | 19 | # CocoaPod 20 | Pods/* 21 | Podfile.lock 22 | 23 | # others 24 | *.swp 25 | !.gitkeep 26 | .DS_Store 27 | 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Satsuki Hashiba 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 | -------------------------------------------------------------------------------- /NoMoreTypo/CheckNamingTypoCommand.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SourceEditorCommand.swift 3 | // NoMoreTypo 4 | // 5 | // Created by Satsuki Hashiba on 2017/12/06. 6 | // Copyright © 2017年 Satsuki Hashiba. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import XcodeKit 11 | import AppKit 12 | 13 | class CheckNamingTypoCommand: NSObject, XCSourceEditorCommand { 14 | func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void ) -> Void { 15 | var typoLines: [(index: Int, message: String)] = [] 16 | 17 | for lineIndex in 0 ..< invocation.buffer.lines.count { 18 | let line = invocation.buffer.lines[lineIndex] as! String 19 | let names = getNames(from: line) 20 | if names.count == 0 { continue } 21 | 22 | names.flatMap { getWords(from: $0) } 23 | .forEach { 24 | if let message = checkTypo(word: $0) { 25 | typoLines.append((lineIndex, message)) 26 | } 27 | } 28 | } 29 | 30 | for i in 0.. [String] { 46 | do { 47 | let regex = try NSRegularExpression(pattern: "(?<=(^|\\s)(let|var|func|class|enum|struct)\\s)[a-zA-Z0-9_]+", options: NSRegularExpression.Options()) 48 | let range = NSRange(0.. [String] { 57 | do { 58 | let regrex = try NSRegularExpression(pattern: "[a-zA-Z][a-z]+", options: NSRegularExpression.Options()) 59 | let range = NSRange(0.. String? { 73 | let checker = NSSpellChecker.shared 74 | let typoRange = checker.checkSpelling(of: word, startingAt: 0) 75 | var message: String = "" 76 | if typoRange.location != NSNotFound { 77 | message += "Typo👾: \"\(word)\" " 78 | guard let candidates = checker.guesses(forWordRange: typoRange, in: word, language: "en_US", inSpellDocumentWithTag: 0) else { return nil } 79 | if candidates.count > 0 { 80 | message += "Did you mean🤔: " + candidates.joined(separator: ", ") 81 | } 82 | return message 83 | } else { 84 | return nil 85 | } 86 | } 87 | } 88 | 89 | 90 | -------------------------------------------------------------------------------- /NoMoreTypo/CheckStringTypoCommand.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CheckStringTypoCommand.swift 3 | // NoMoreTypo 4 | // 5 | // Created by Satsuki Hashiba on 2017/12/06. 6 | // Copyright © 2017年 Satsuki Hashiba. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import XcodeKit 11 | import AppKit 12 | 13 | class CheckStringTypoCommand: NSObject, XCSourceEditorCommand { 14 | func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void ) -> Void { 15 | var typoLines: [(index: Int, message: String)] = [] 16 | 17 | for lineIndex in 0 ..< invocation.buffer.lines.count { 18 | let line = invocation.buffer.lines[lineIndex] as! String 19 | 20 | let strings = getStrings(from: line) 21 | strings.flatMap { getWords(from: $0) } 22 | .forEach { 23 | if let message = checkTypo(word: $0) { 24 | typoLines.append((lineIndex, message)) 25 | } 26 | } 27 | } 28 | 29 | for i in 0.. [String] { 45 | do { 46 | let regex = try NSRegularExpression(pattern: "\"[^\"]+\"", options: NSRegularExpression.Options()) 47 | let range = NSRange(0.. [String] { 56 | do { 57 | let regex = try NSRegularExpression(pattern: "(?!\\.)[a-zA-Z][a-z]+", options: NSRegularExpression.Options()) 58 | let range = NSRange(0.. String? { 67 | let checker = NSSpellChecker.shared 68 | let typoRange = checker.checkSpelling(of: word, startingAt: 0) 69 | var message: String = "" 70 | if typoRange.location != NSNotFound { 71 | message += "Typo👾: \"\(word)\" " 72 | guard let candidates = checker.guesses(forWordRange: typoRange, in: word, language: "en_US", inSpellDocumentWithTag: 0) else { return nil } 73 | if candidates.count > 0 { 74 | message += "Did you mean🤔: " + candidates.joined(separator: ", ") 75 | } 76 | return message 77 | } else { 78 | return nil 79 | } 80 | } 81 | } 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /NoMoreTypo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | NoMoreTypo 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 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSExtension 26 | 27 | NSExtensionAttributes 28 | 29 | XCSourceEditorCommandDefinitions 30 | 31 | 32 | XCSourceEditorCommandClassName 33 | $(PRODUCT_MODULE_NAME).CheckNamingTypoCommand 34 | XCSourceEditorCommandIdentifier 35 | $(PRODUCT_BUNDLE_IDENTIFIER).CheckNamingTypoCommand 36 | XCSourceEditorCommandName 37 | Check typos in name 38 | 39 | 40 | XCSourceEditorCommandClassName 41 | $(PRODUCT_MODULE_NAME).CheckStringTypoCommand 42 | XCSourceEditorCommandIdentifier 43 | $(PRODUCT_BUNDLE_IDENTIFIER).CheckStringTypoCommand 44 | XCSourceEditorCommandName 45 | Check typos in String 46 | 47 | 48 | XCSourceEditorExtensionPrincipalClass 49 | $(PRODUCT_MODULE_NAME).SourceEditorExtension 50 | 51 | NSExtensionPointIdentifier 52 | com.apple.dt.Xcode.extension.source-editor 53 | 54 | NSHumanReadableCopyright 55 | Copyright © 2017年 Satsuki Hashiba. All rights reserved. 56 | 57 | 58 | -------------------------------------------------------------------------------- /NoMoreTypo/NoMoreTypo.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /NoMoreTypo/SourceEditorExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SourceEditorExtension.swift 3 | // NoMoreTypo 4 | // 5 | // Created by Satsuki Hashiba on 2017/12/06. 6 | // Copyright © 2017年 Satsuki Hashiba. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import XcodeKit 11 | 12 | class SourceEditorExtension: NSObject, XCSourceEditorExtension {} 13 | -------------------------------------------------------------------------------- /NoMoreTypoForXcode.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | A329B5541FD7A5FB00A22F37 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A329B5531FD7A5FB00A22F37 /* AppDelegate.swift */; }; 11 | A329B5561FD7A5FB00A22F37 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A329B5551FD7A5FB00A22F37 /* ViewController.swift */; }; 12 | A329B5581FD7A5FB00A22F37 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A329B5571FD7A5FB00A22F37 /* Assets.xcassets */; }; 13 | A329B55B1FD7A5FB00A22F37 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A329B5591FD7A5FB00A22F37 /* Main.storyboard */; }; 14 | A329B56A1FD7A8AE00A22F37 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A329B5691FD7A8AE00A22F37 /* Cocoa.framework */; }; 15 | A329B56D1FD7A8AE00A22F37 /* SourceEditorExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A329B56C1FD7A8AE00A22F37 /* SourceEditorExtension.swift */; }; 16 | A329B56F1FD7A8AE00A22F37 /* CheckNamingTypoCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = A329B56E1FD7A8AE00A22F37 /* CheckNamingTypoCommand.swift */; }; 17 | A329B5741FD7A8AE00A22F37 /* NoMoreTypo.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = A329B5671FD7A8AE00A22F37 /* NoMoreTypo.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 18 | A329B57A1FD7A93F00A22F37 /* CheckStringTypoCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = A329B5791FD7A93F00A22F37 /* CheckStringTypoCommand.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | A329B5721FD7A8AE00A22F37 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = A329B5481FD7A5FB00A22F37 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = A329B5661FD7A8AE00A22F37; 27 | remoteInfo = NoMoreTypo; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXCopyFilesBuildPhase section */ 32 | A329B5781FD7A8AE00A22F37 /* Embed App Extensions */ = { 33 | isa = PBXCopyFilesBuildPhase; 34 | buildActionMask = 2147483647; 35 | dstPath = ""; 36 | dstSubfolderSpec = 13; 37 | files = ( 38 | A329B5741FD7A8AE00A22F37 /* NoMoreTypo.appex in Embed App Extensions */, 39 | ); 40 | name = "Embed App Extensions"; 41 | runOnlyForDeploymentPostprocessing = 0; 42 | }; 43 | /* End PBXCopyFilesBuildPhase section */ 44 | 45 | /* Begin PBXFileReference section */ 46 | A329B5501FD7A5FB00A22F37 /* NoMoreTypoForXcode.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NoMoreTypoForXcode.app; sourceTree = BUILT_PRODUCTS_DIR; }; 47 | A329B5531FD7A5FB00A22F37 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 48 | A329B5551FD7A5FB00A22F37 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 49 | A329B5571FD7A5FB00A22F37 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 50 | A329B55A1FD7A5FB00A22F37 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 51 | A329B55C1FD7A5FB00A22F37 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 52 | A329B55D1FD7A5FB00A22F37 /* NoMoreTypoForXcode.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NoMoreTypoForXcode.entitlements; sourceTree = ""; }; 53 | A329B5671FD7A8AE00A22F37 /* NoMoreTypo.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NoMoreTypo.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | A329B5691FD7A8AE00A22F37 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 55 | A329B56C1FD7A8AE00A22F37 /* SourceEditorExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceEditorExtension.swift; sourceTree = ""; }; 56 | A329B56E1FD7A8AE00A22F37 /* CheckNamingTypoCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckNamingTypoCommand.swift; sourceTree = ""; }; 57 | A329B5701FD7A8AE00A22F37 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 58 | A329B5711FD7A8AE00A22F37 /* NoMoreTypo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NoMoreTypo.entitlements; sourceTree = ""; }; 59 | A329B5791FD7A93F00A22F37 /* CheckStringTypoCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckStringTypoCommand.swift; sourceTree = ""; }; 60 | /* End PBXFileReference section */ 61 | 62 | /* Begin PBXFrameworksBuildPhase section */ 63 | A329B54D1FD7A5FB00A22F37 /* Frameworks */ = { 64 | isa = PBXFrameworksBuildPhase; 65 | buildActionMask = 2147483647; 66 | files = ( 67 | ); 68 | runOnlyForDeploymentPostprocessing = 0; 69 | }; 70 | A329B5641FD7A8AE00A22F37 /* Frameworks */ = { 71 | isa = PBXFrameworksBuildPhase; 72 | buildActionMask = 2147483647; 73 | files = ( 74 | A329B56A1FD7A8AE00A22F37 /* Cocoa.framework in Frameworks */, 75 | ); 76 | runOnlyForDeploymentPostprocessing = 0; 77 | }; 78 | /* End PBXFrameworksBuildPhase section */ 79 | 80 | /* Begin PBXGroup section */ 81 | A329B5471FD7A5FB00A22F37 = { 82 | isa = PBXGroup; 83 | children = ( 84 | A329B5521FD7A5FB00A22F37 /* NoMoreTypoForXcode */, 85 | A329B56B1FD7A8AE00A22F37 /* NoMoreTypo */, 86 | A329B5681FD7A8AE00A22F37 /* Frameworks */, 87 | A329B5511FD7A5FB00A22F37 /* Products */, 88 | ); 89 | sourceTree = ""; 90 | }; 91 | A329B5511FD7A5FB00A22F37 /* Products */ = { 92 | isa = PBXGroup; 93 | children = ( 94 | A329B5501FD7A5FB00A22F37 /* NoMoreTypoForXcode.app */, 95 | A329B5671FD7A8AE00A22F37 /* NoMoreTypo.appex */, 96 | ); 97 | name = Products; 98 | sourceTree = ""; 99 | }; 100 | A329B5521FD7A5FB00A22F37 /* NoMoreTypoForXcode */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | A329B5531FD7A5FB00A22F37 /* AppDelegate.swift */, 104 | A329B5551FD7A5FB00A22F37 /* ViewController.swift */, 105 | A329B5571FD7A5FB00A22F37 /* Assets.xcassets */, 106 | A329B5591FD7A5FB00A22F37 /* Main.storyboard */, 107 | A329B55C1FD7A5FB00A22F37 /* Info.plist */, 108 | A329B55D1FD7A5FB00A22F37 /* NoMoreTypoForXcode.entitlements */, 109 | ); 110 | path = NoMoreTypoForXcode; 111 | sourceTree = ""; 112 | }; 113 | A329B5681FD7A8AE00A22F37 /* Frameworks */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | A329B5691FD7A8AE00A22F37 /* Cocoa.framework */, 117 | ); 118 | name = Frameworks; 119 | sourceTree = ""; 120 | }; 121 | A329B56B1FD7A8AE00A22F37 /* NoMoreTypo */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | A329B56C1FD7A8AE00A22F37 /* SourceEditorExtension.swift */, 125 | A329B56E1FD7A8AE00A22F37 /* CheckNamingTypoCommand.swift */, 126 | A329B5791FD7A93F00A22F37 /* CheckStringTypoCommand.swift */, 127 | A329B5701FD7A8AE00A22F37 /* Info.plist */, 128 | A329B5711FD7A8AE00A22F37 /* NoMoreTypo.entitlements */, 129 | ); 130 | path = NoMoreTypo; 131 | sourceTree = ""; 132 | }; 133 | /* End PBXGroup section */ 134 | 135 | /* Begin PBXNativeTarget section */ 136 | A329B54F1FD7A5FB00A22F37 /* NoMoreTypoForXcode */ = { 137 | isa = PBXNativeTarget; 138 | buildConfigurationList = A329B5601FD7A5FB00A22F37 /* Build configuration list for PBXNativeTarget "NoMoreTypoForXcode" */; 139 | buildPhases = ( 140 | A329B54C1FD7A5FB00A22F37 /* Sources */, 141 | A329B54D1FD7A5FB00A22F37 /* Frameworks */, 142 | A329B54E1FD7A5FB00A22F37 /* Resources */, 143 | A329B5781FD7A8AE00A22F37 /* Embed App Extensions */, 144 | ); 145 | buildRules = ( 146 | ); 147 | dependencies = ( 148 | A329B5731FD7A8AE00A22F37 /* PBXTargetDependency */, 149 | ); 150 | name = NoMoreTypoForXcode; 151 | productName = NoMoreTypoForXcode; 152 | productReference = A329B5501FD7A5FB00A22F37 /* NoMoreTypoForXcode.app */; 153 | productType = "com.apple.product-type.application"; 154 | }; 155 | A329B5661FD7A8AE00A22F37 /* NoMoreTypo */ = { 156 | isa = PBXNativeTarget; 157 | buildConfigurationList = A329B5751FD7A8AE00A22F37 /* Build configuration list for PBXNativeTarget "NoMoreTypo" */; 158 | buildPhases = ( 159 | A329B5631FD7A8AE00A22F37 /* Sources */, 160 | A329B5641FD7A8AE00A22F37 /* Frameworks */, 161 | A329B5651FD7A8AE00A22F37 /* Resources */, 162 | ); 163 | buildRules = ( 164 | ); 165 | dependencies = ( 166 | ); 167 | name = NoMoreTypo; 168 | productName = NoMoreTypo; 169 | productReference = A329B5671FD7A8AE00A22F37 /* NoMoreTypo.appex */; 170 | productType = "com.apple.product-type.xcode-extension"; 171 | }; 172 | /* End PBXNativeTarget section */ 173 | 174 | /* Begin PBXProject section */ 175 | A329B5481FD7A5FB00A22F37 /* Project object */ = { 176 | isa = PBXProject; 177 | attributes = { 178 | LastSwiftUpdateCheck = 0900; 179 | LastUpgradeCheck = 0900; 180 | ORGANIZATIONNAME = "Satsuki Hashiba"; 181 | TargetAttributes = { 182 | A329B54F1FD7A5FB00A22F37 = { 183 | CreatedOnToolsVersion = 9.0; 184 | ProvisioningStyle = Automatic; 185 | }; 186 | A329B5661FD7A8AE00A22F37 = { 187 | CreatedOnToolsVersion = 9.0; 188 | ProvisioningStyle = Automatic; 189 | }; 190 | }; 191 | }; 192 | buildConfigurationList = A329B54B1FD7A5FB00A22F37 /* Build configuration list for PBXProject "NoMoreTypoForXcode" */; 193 | compatibilityVersion = "Xcode 8.0"; 194 | developmentRegion = en; 195 | hasScannedForEncodings = 0; 196 | knownRegions = ( 197 | en, 198 | Base, 199 | ); 200 | mainGroup = A329B5471FD7A5FB00A22F37; 201 | productRefGroup = A329B5511FD7A5FB00A22F37 /* Products */; 202 | projectDirPath = ""; 203 | projectRoot = ""; 204 | targets = ( 205 | A329B54F1FD7A5FB00A22F37 /* NoMoreTypoForXcode */, 206 | A329B5661FD7A8AE00A22F37 /* NoMoreTypo */, 207 | ); 208 | }; 209 | /* End PBXProject section */ 210 | 211 | /* Begin PBXResourcesBuildPhase section */ 212 | A329B54E1FD7A5FB00A22F37 /* Resources */ = { 213 | isa = PBXResourcesBuildPhase; 214 | buildActionMask = 2147483647; 215 | files = ( 216 | A329B5581FD7A5FB00A22F37 /* Assets.xcassets in Resources */, 217 | A329B55B1FD7A5FB00A22F37 /* Main.storyboard in Resources */, 218 | ); 219 | runOnlyForDeploymentPostprocessing = 0; 220 | }; 221 | A329B5651FD7A8AE00A22F37 /* Resources */ = { 222 | isa = PBXResourcesBuildPhase; 223 | buildActionMask = 2147483647; 224 | files = ( 225 | ); 226 | runOnlyForDeploymentPostprocessing = 0; 227 | }; 228 | /* End PBXResourcesBuildPhase section */ 229 | 230 | /* Begin PBXSourcesBuildPhase section */ 231 | A329B54C1FD7A5FB00A22F37 /* Sources */ = { 232 | isa = PBXSourcesBuildPhase; 233 | buildActionMask = 2147483647; 234 | files = ( 235 | A329B5561FD7A5FB00A22F37 /* ViewController.swift in Sources */, 236 | A329B5541FD7A5FB00A22F37 /* AppDelegate.swift in Sources */, 237 | ); 238 | runOnlyForDeploymentPostprocessing = 0; 239 | }; 240 | A329B5631FD7A8AE00A22F37 /* Sources */ = { 241 | isa = PBXSourcesBuildPhase; 242 | buildActionMask = 2147483647; 243 | files = ( 244 | A329B56D1FD7A8AE00A22F37 /* SourceEditorExtension.swift in Sources */, 245 | A329B56F1FD7A8AE00A22F37 /* CheckNamingTypoCommand.swift in Sources */, 246 | A329B57A1FD7A93F00A22F37 /* CheckStringTypoCommand.swift in Sources */, 247 | ); 248 | runOnlyForDeploymentPostprocessing = 0; 249 | }; 250 | /* End PBXSourcesBuildPhase section */ 251 | 252 | /* Begin PBXTargetDependency section */ 253 | A329B5731FD7A8AE00A22F37 /* PBXTargetDependency */ = { 254 | isa = PBXTargetDependency; 255 | target = A329B5661FD7A8AE00A22F37 /* NoMoreTypo */; 256 | targetProxy = A329B5721FD7A8AE00A22F37 /* PBXContainerItemProxy */; 257 | }; 258 | /* End PBXTargetDependency section */ 259 | 260 | /* Begin PBXVariantGroup section */ 261 | A329B5591FD7A5FB00A22F37 /* Main.storyboard */ = { 262 | isa = PBXVariantGroup; 263 | children = ( 264 | A329B55A1FD7A5FB00A22F37 /* Base */, 265 | ); 266 | name = Main.storyboard; 267 | sourceTree = ""; 268 | }; 269 | /* End PBXVariantGroup section */ 270 | 271 | /* Begin XCBuildConfiguration section */ 272 | A329B55E1FD7A5FB00A22F37 /* Debug */ = { 273 | isa = XCBuildConfiguration; 274 | buildSettings = { 275 | ALWAYS_SEARCH_USER_PATHS = NO; 276 | CLANG_ANALYZER_NONNULL = YES; 277 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 278 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 279 | CLANG_CXX_LIBRARY = "libc++"; 280 | CLANG_ENABLE_MODULES = YES; 281 | CLANG_ENABLE_OBJC_ARC = YES; 282 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 283 | CLANG_WARN_BOOL_CONVERSION = YES; 284 | CLANG_WARN_COMMA = YES; 285 | CLANG_WARN_CONSTANT_CONVERSION = YES; 286 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 287 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 288 | CLANG_WARN_EMPTY_BODY = YES; 289 | CLANG_WARN_ENUM_CONVERSION = YES; 290 | CLANG_WARN_INFINITE_RECURSION = YES; 291 | CLANG_WARN_INT_CONVERSION = YES; 292 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 293 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 294 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 295 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 296 | CLANG_WARN_STRICT_PROTOTYPES = YES; 297 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 298 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 299 | CLANG_WARN_UNREACHABLE_CODE = YES; 300 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 301 | CODE_SIGN_IDENTITY = "Mac Developer"; 302 | COPY_PHASE_STRIP = NO; 303 | DEBUG_INFORMATION_FORMAT = dwarf; 304 | ENABLE_STRICT_OBJC_MSGSEND = YES; 305 | ENABLE_TESTABILITY = YES; 306 | GCC_C_LANGUAGE_STANDARD = gnu11; 307 | GCC_DYNAMIC_NO_PIC = NO; 308 | GCC_NO_COMMON_BLOCKS = YES; 309 | GCC_OPTIMIZATION_LEVEL = 0; 310 | GCC_PREPROCESSOR_DEFINITIONS = ( 311 | "DEBUG=1", 312 | "$(inherited)", 313 | ); 314 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 315 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 316 | GCC_WARN_UNDECLARED_SELECTOR = YES; 317 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 318 | GCC_WARN_UNUSED_FUNCTION = YES; 319 | GCC_WARN_UNUSED_VARIABLE = YES; 320 | MACOSX_DEPLOYMENT_TARGET = 10.12; 321 | MTL_ENABLE_DEBUG_INFO = YES; 322 | ONLY_ACTIVE_ARCH = YES; 323 | SDKROOT = macosx; 324 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 325 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 326 | }; 327 | name = Debug; 328 | }; 329 | A329B55F1FD7A5FB00A22F37 /* Release */ = { 330 | isa = XCBuildConfiguration; 331 | buildSettings = { 332 | ALWAYS_SEARCH_USER_PATHS = NO; 333 | CLANG_ANALYZER_NONNULL = YES; 334 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 335 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 336 | CLANG_CXX_LIBRARY = "libc++"; 337 | CLANG_ENABLE_MODULES = YES; 338 | CLANG_ENABLE_OBJC_ARC = YES; 339 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 340 | CLANG_WARN_BOOL_CONVERSION = YES; 341 | CLANG_WARN_COMMA = YES; 342 | CLANG_WARN_CONSTANT_CONVERSION = YES; 343 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 344 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 345 | CLANG_WARN_EMPTY_BODY = YES; 346 | CLANG_WARN_ENUM_CONVERSION = YES; 347 | CLANG_WARN_INFINITE_RECURSION = YES; 348 | CLANG_WARN_INT_CONVERSION = YES; 349 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 350 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 351 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 352 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 353 | CLANG_WARN_STRICT_PROTOTYPES = YES; 354 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 355 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 356 | CLANG_WARN_UNREACHABLE_CODE = YES; 357 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 358 | CODE_SIGN_IDENTITY = "Mac Developer"; 359 | COPY_PHASE_STRIP = NO; 360 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 361 | ENABLE_NS_ASSERTIONS = NO; 362 | ENABLE_STRICT_OBJC_MSGSEND = YES; 363 | GCC_C_LANGUAGE_STANDARD = gnu11; 364 | GCC_NO_COMMON_BLOCKS = YES; 365 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 366 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 367 | GCC_WARN_UNDECLARED_SELECTOR = YES; 368 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 369 | GCC_WARN_UNUSED_FUNCTION = YES; 370 | GCC_WARN_UNUSED_VARIABLE = YES; 371 | MACOSX_DEPLOYMENT_TARGET = 10.12; 372 | MTL_ENABLE_DEBUG_INFO = NO; 373 | SDKROOT = macosx; 374 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 375 | }; 376 | name = Release; 377 | }; 378 | A329B5611FD7A5FB00A22F37 /* Debug */ = { 379 | isa = XCBuildConfiguration; 380 | buildSettings = { 381 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 382 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 383 | CODE_SIGN_ENTITLEMENTS = NoMoreTypoForXcode/NoMoreTypoForXcode.entitlements; 384 | CODE_SIGN_STYLE = Automatic; 385 | COMBINE_HIDPI_IMAGES = YES; 386 | DEVELOPMENT_TEAM = U6JP7S27NV; 387 | INFOPLIST_FILE = NoMoreTypoForXcode/Info.plist; 388 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 389 | PRODUCT_BUNDLE_IDENTIFIER = com.shiba.NoMoreTypoForXcode; 390 | PRODUCT_NAME = "$(TARGET_NAME)"; 391 | SWIFT_VERSION = 4.0; 392 | }; 393 | name = Debug; 394 | }; 395 | A329B5621FD7A5FB00A22F37 /* Release */ = { 396 | isa = XCBuildConfiguration; 397 | buildSettings = { 398 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 399 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 400 | CODE_SIGN_ENTITLEMENTS = NoMoreTypoForXcode/NoMoreTypoForXcode.entitlements; 401 | CODE_SIGN_STYLE = Automatic; 402 | COMBINE_HIDPI_IMAGES = YES; 403 | DEVELOPMENT_TEAM = U6JP7S27NV; 404 | INFOPLIST_FILE = NoMoreTypoForXcode/Info.plist; 405 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 406 | PRODUCT_BUNDLE_IDENTIFIER = com.shiba.NoMoreTypoForXcode; 407 | PRODUCT_NAME = "$(TARGET_NAME)"; 408 | SWIFT_VERSION = 4.0; 409 | }; 410 | name = Release; 411 | }; 412 | A329B5761FD7A8AE00A22F37 /* Debug */ = { 413 | isa = XCBuildConfiguration; 414 | buildSettings = { 415 | CODE_SIGN_ENTITLEMENTS = NoMoreTypo/NoMoreTypo.entitlements; 416 | CODE_SIGN_STYLE = Automatic; 417 | COMBINE_HIDPI_IMAGES = YES; 418 | DEVELOPMENT_TEAM = U6JP7S27NV; 419 | INFOPLIST_FILE = NoMoreTypo/Info.plist; 420 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks"; 421 | PRODUCT_BUNDLE_IDENTIFIER = com.shiba.NoMoreTypoForXcode.NoMoreTypo; 422 | PRODUCT_NAME = "$(TARGET_NAME)"; 423 | SKIP_INSTALL = YES; 424 | SWIFT_VERSION = 4.0; 425 | }; 426 | name = Debug; 427 | }; 428 | A329B5771FD7A8AE00A22F37 /* Release */ = { 429 | isa = XCBuildConfiguration; 430 | buildSettings = { 431 | CODE_SIGN_ENTITLEMENTS = NoMoreTypo/NoMoreTypo.entitlements; 432 | CODE_SIGN_STYLE = Automatic; 433 | COMBINE_HIDPI_IMAGES = YES; 434 | DEVELOPMENT_TEAM = U6JP7S27NV; 435 | INFOPLIST_FILE = NoMoreTypo/Info.plist; 436 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks"; 437 | PRODUCT_BUNDLE_IDENTIFIER = com.shiba.NoMoreTypoForXcode.NoMoreTypo; 438 | PRODUCT_NAME = "$(TARGET_NAME)"; 439 | SKIP_INSTALL = YES; 440 | SWIFT_VERSION = 4.0; 441 | }; 442 | name = Release; 443 | }; 444 | /* End XCBuildConfiguration section */ 445 | 446 | /* Begin XCConfigurationList section */ 447 | A329B54B1FD7A5FB00A22F37 /* Build configuration list for PBXProject "NoMoreTypoForXcode" */ = { 448 | isa = XCConfigurationList; 449 | buildConfigurations = ( 450 | A329B55E1FD7A5FB00A22F37 /* Debug */, 451 | A329B55F1FD7A5FB00A22F37 /* Release */, 452 | ); 453 | defaultConfigurationIsVisible = 0; 454 | defaultConfigurationName = Release; 455 | }; 456 | A329B5601FD7A5FB00A22F37 /* Build configuration list for PBXNativeTarget "NoMoreTypoForXcode" */ = { 457 | isa = XCConfigurationList; 458 | buildConfigurations = ( 459 | A329B5611FD7A5FB00A22F37 /* Debug */, 460 | A329B5621FD7A5FB00A22F37 /* Release */, 461 | ); 462 | defaultConfigurationIsVisible = 0; 463 | defaultConfigurationName = Release; 464 | }; 465 | A329B5751FD7A8AE00A22F37 /* Build configuration list for PBXNativeTarget "NoMoreTypo" */ = { 466 | isa = XCConfigurationList; 467 | buildConfigurations = ( 468 | A329B5761FD7A8AE00A22F37 /* Debug */, 469 | A329B5771FD7A8AE00A22F37 /* Release */, 470 | ); 471 | defaultConfigurationIsVisible = 0; 472 | defaultConfigurationName = Release; 473 | }; 474 | /* End XCConfigurationList section */ 475 | }; 476 | rootObject = A329B5481FD7A5FB00A22F37 /* Project object */; 477 | } 478 | -------------------------------------------------------------------------------- /NoMoreTypoForXcode.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /NoMoreTypoForXcode/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // NoMoreTypoForXcode 4 | // 5 | // Created by Satsuki Hashiba on 2017/12/06. 6 | // Copyright © 2017年 Satsuki Hashiba. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | @NSApplicationMain 12 | class AppDelegate: NSObject, NSApplicationDelegate { 13 | 14 | 15 | 16 | func applicationDidFinishLaunching(_ aNotification: Notification) { 17 | // Insert code here to initialize your application 18 | } 19 | 20 | func applicationWillTerminate(_ aNotification: Notification) { 21 | // Insert code here to tear down your application 22 | } 23 | 24 | 25 | } 26 | 27 | -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/128.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/16.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/256-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/256-1.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/256.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/32-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/32-1.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/32.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/512-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/512-1.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/512.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/64.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "32-1.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "64.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "256-1.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "512.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "512-1.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "1024.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/GitHub.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "GitHub-Mark-32px.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "GitHub-Mark-64px.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "GitHub-Mark-120px-plus.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/GitHub.imageset/GitHub-Mark-120px-plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/GitHub.imageset/GitHub-Mark-120px-plus.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/GitHub.imageset/GitHub-Mark-32px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/GitHub.imageset/GitHub-Mark-32px.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/GitHub.imageset/GitHub-Mark-64px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/GitHub.imageset/GitHub-Mark-64px.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/Logo.imageset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/Logo.imageset/1024.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/Logo.imageset/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/Logo.imageset/256.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/Logo.imageset/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiba1014/NoMoreTypo/5074725a50bd60a2a9dc089cb697e80dbf97052c/NoMoreTypoForXcode/Assets.xcassets/Logo.imageset/512.png -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Assets.xcassets/Logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "256.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "512.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "1024.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 132 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | -------------------------------------------------------------------------------- /NoMoreTypoForXcode/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSHumanReadableCopyright 26 | Copyright © 2017年 Satsuki Hashiba. All rights reserved. 27 | NSMainStoryboardFile 28 | Main 29 | NSPrincipalClass 30 | NSApplication 31 | 32 | 33 | -------------------------------------------------------------------------------- /NoMoreTypoForXcode/NoMoreTypoForXcode.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /NoMoreTypoForXcode/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // NoMoreTypoForXcode 4 | // 5 | // Created by Satsuki Hashiba on 2017/12/06. 6 | // Copyright © 2017年 Satsuki Hashiba. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class ViewController: NSViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | // Do any additional setup after loading the view. 17 | } 18 | 19 | override var representedObject: Any? { 20 | didSet { 21 | // Update the view, if already loaded. 22 | } 23 | } 24 | 25 | @IBAction func pushedEnableExtensionButton(_ sender: NSButton) { 26 | NSWorkspace.shared.open(URL(fileURLWithPath: "/System/Library/PreferencePanes/Extensions.prefPane")) 27 | } 28 | 29 | @IBAction func pushedGithubButton(_ sender: NSButton) { 30 | if let url = URL(string: "https://github.com/shiba1014/NoMoreTypo") { 31 | NSWorkspace.shared.open(url) 32 | } 33 | } 34 | } 35 | 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NoMoreTypo 2 | 3 | 4 | NoMoreTypo is a typo checker for Xcode :tada: 5 | You can check typos in name or String. If there are any typos in your code, NoMoreTypo will give you some suggestions. 6 | 7 | 8 | 9 | If there are no typos , this comment will be added to the beginning of your code. 10 | 11 | 12 | 13 | ## Installation 14 | 1. `git clone https://github.com/shiba1014/NoMoreTypo` 15 | 2. Sign both the Application and the Extension using your own developer account 16 | 3. `Product` > `Archive` 17 | 4. `Export` > `Export App` 18 | 5. Drag NoMoreTypo to your Applications folder 19 | 6. Run NoMoreTypo 20 | 7. Clicking "Enable Extensions" will launch System Preferences. Please check if NoMoreTypo is enabled in the Xcode Source Editor section 21 | 8. Restart Xcode 22 | 9. You can use NoMoreTypo in the Xcode menu! 23 | 24 | ## Usage 25 | You can check typos in your current code by selecting `Editor` > `NoMoreTypo` > `Check typos in name` or `Check typos in String` 26 | 27 | 28 | 29 | 30 | 31 | --------------------------------------------------------------------------------