-
-
Save leonbreedt/365fae61b96167fe6402 to your computer and use it in GitHub Desktop.
| #!/usr/bin/xcrun swift | |
| // | |
| // Copyright © 2016 Leon Breedt | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| import Cocoa | |
| /// Enumerates the colors in an iTerm color scheme. | |
| enum iTermColors: String { | |
| case ansi0 = "Ansi 0 Color" | |
| case ansi1 = "Ansi 1 Color" | |
| case ansi2 = "Ansi 2 Color" | |
| case ansi3 = "Ansi 3 Color" | |
| case ansi4 = "Ansi 4 Color" | |
| case ansi5 = "Ansi 5 Color" | |
| case ansi6 = "Ansi 6 Color" | |
| case ansi7 = "Ansi 7 Color" | |
| case ansi8 = "Ansi 8 Color" | |
| case ansi9 = "Ansi 9 Color" | |
| case ansi10 = "Ansi 10 Color" | |
| case ansi11 = "Ansi 11 Color" | |
| case ansi12 = "Ansi 12 Color" | |
| case ansi13 = "Ansi 13 Color" | |
| case ansi14 = "Ansi 14 Color" | |
| case ansi15 = "Ansi 15 Color" | |
| case cursorText = "Cursor Text Color" | |
| case selectedText = "Selected Text Color" | |
| case foreground = "Foreground Color" | |
| case background = "Background Color" | |
| case bold = "Bold Color" | |
| case selection = "Selection Color" | |
| case cursor = "Cursor Color" | |
| } | |
| /// Enumerates the colors in a Terminal.app color scheme. | |
| enum TerminalColors: String { | |
| case ansiBlack = "ANSIBlackColor" | |
| case ansiRed = "ANSIRedColor" | |
| case ansiGreen = "ANSIGreenColor" | |
| case ansiYellow = "ANSIYellowColor" | |
| case ansiBlue = "ANSIBlueColor" | |
| case ansiMagenta = "ANSIMagentaColor" | |
| case ansiCyan = "ANSICyanColor" | |
| case ansiWhite = "ANSIWhiteColor" | |
| case ansiBrightBlack = "ANSIBrightBlackColor" | |
| case ansiBrightRed = "ANSIBrightRedColor" | |
| case ansiBrightGreen = "ANSIBrightGreenColor" | |
| case ansiBrightYellow = "ANSIBrightYellowColor" | |
| case ansiBrightBlue = "ANSIBrightBlueColor" | |
| case ansiBrightMagenta = "ANSIBrightMagentaColor" | |
| case ansiBrightCyan = "ANSIBrightCyanColor" | |
| case ansiBrightWhite = "ANSIBrightWhiteColor" | |
| case background = "BackgroundColor" | |
| case text = "TextColor" | |
| case boldText = "BoldTextColor" | |
| case selection = "SelectionColor" | |
| case cursor = "CursorColor" | |
| } | |
| // Mapping of iTerm colors onto corresponding Terminal.app colors. | |
| let iTermColor2TerminalColor = [ | |
| iTermColors.ansi0: TerminalColors.ansiBlack, | |
| iTermColors.ansi1: TerminalColors.ansiRed, | |
| iTermColors.ansi2: TerminalColors.ansiGreen, | |
| iTermColors.ansi3: TerminalColors.ansiYellow, | |
| iTermColors.ansi4: TerminalColors.ansiBlue, | |
| iTermColors.ansi5: TerminalColors.ansiMagenta, | |
| iTermColors.ansi6: TerminalColors.ansiCyan, | |
| iTermColors.ansi7: TerminalColors.ansiWhite, | |
| iTermColors.ansi8: TerminalColors.ansiBrightBlack, | |
| iTermColors.ansi9: TerminalColors.ansiBrightRed, | |
| iTermColors.ansi10: TerminalColors.ansiBrightGreen, | |
| iTermColors.ansi11: TerminalColors.ansiBrightYellow, | |
| iTermColors.ansi12: TerminalColors.ansiBrightBlue, | |
| iTermColors.ansi13: TerminalColors.ansiBrightMagenta, | |
| iTermColors.ansi14: TerminalColors.ansiBrightCyan, | |
| iTermColors.ansi15: TerminalColors.ansiBrightWhite, | |
| iTermColors.background: TerminalColors.background, | |
| iTermColors.foreground: TerminalColors.text, | |
| iTermColors.selection: TerminalColors.selection, | |
| iTermColors.bold: TerminalColors.boldText, | |
| iTermColors.cursor: TerminalColors.cursor, | |
| ] | |
| /// Enumerates the names of iTerm color components in the scheme dictionary. | |
| struct iTermColorComponent { | |
| static let red = "Red Component" | |
| static let green = "Green Component" | |
| static let blue = "Blue Component" | |
| } | |
| /// Converts an iTerm color scheme file (.itermcolors), into a Terminal.app color scheme | |
| /// file (.terminal). | |
| func convertToTerminalColors(itermFile: String, terminalFile: String) { | |
| if let itermScheme = NSDictionary(contentsOfFile: itermFile) { | |
| print("converting \(itermFile) -> \(terminalFile)") | |
| let name = terminalFile.ns.lastPathComponent.ns.deletingPathExtension | |
| let terminalScheme = convert(iTermColorScheme: itermScheme, toTerminalSchemeWithName: name) | |
| terminalScheme.write(toFile: terminalFile, atomically: true) | |
| } else { | |
| print("unable to load \(itermFile)") | |
| } | |
| } | |
| /// Converts an iTerm color scheme dictionary into a Terminal.app color scheme dictionary. | |
| func convert(iTermColorScheme: NSDictionary, toTerminalSchemeWithName name: String) -> NSDictionary { | |
| var terminalColorScheme: [String: AnyObject] = [ | |
| "name" : name, | |
| "type" : "Window Settings", | |
| "ProfileCurrentVersion" : 2.04, | |
| "columnCount": 90, | |
| "rowCount": 50 | |
| ] | |
| // SF Mono is pretty sweet. | |
| if let font = archivedFontWithName(name: "SF Mono Regular", size: 13) { | |
| terminalColorScheme["Font"] = font | |
| } | |
| for (rawKey, rawValue) in iTermColorScheme { | |
| guard let name = rawKey as? String else { continue } | |
| guard let itermDict = rawValue as? NSDictionary else { continue } | |
| guard let itermKey = iTermColors(rawValue: name) else { continue } | |
| guard let terminalKey = iTermColor2TerminalColor[itermKey] else { continue } | |
| let (r, g, b) = ( | |
| (itermDict[iTermColorComponent.red] as? CGFloat) ?? CGFloat(0), | |
| (itermDict[iTermColorComponent.green] as? CGFloat) ?? CGFloat(0), | |
| (itermDict[iTermColorComponent.blue] as? CGFloat) ?? CGFloat(0) | |
| ) | |
| let color = NSColor(deviceRed: r, green: g, blue: b, alpha: 1) | |
| let data = NSKeyedArchiver.archivedData(withRootObject: color) | |
| terminalColorScheme[terminalKey.rawValue] = data | |
| } | |
| return terminalColorScheme | |
| } | |
| /// Creates an `NSData` representation of an `NSFont`. | |
| func archivedFontWithName(name: String, size: CGFloat) -> NSData? { | |
| if let font = NSFont(name: name, size: size) { | |
| return NSKeyedArchiver.archivedData(withRootObject: font) | |
| } | |
| return nil | |
| } | |
| extension String { | |
| /// Gets the canonical version of a path. | |
| var fullPath: String { | |
| get { | |
| let path = ns.standardizingPath | |
| var directory = ns.deletingLastPathComponent | |
| if directory.utf8.count == 0 { | |
| directory = FileManager.default().currentDirectoryPath | |
| } | |
| return directory.ns.appendingPathComponent(path) | |
| } | |
| } | |
| /// Convenience property for accessing this string as an `NSString`. | |
| var ns: NSString { | |
| return self as NSString | |
| } | |
| } | |
| // Entry point. | |
| let args = Process.arguments.dropFirst() | |
| if args.count > 0 { | |
| for itermFile in args { | |
| let path = itermFile.fullPath | |
| let folder = path.ns.deletingLastPathComponent | |
| let schemeName = path.ns.lastPathComponent.ns.deletingPathExtension | |
| let terminalPath = "\(folder)/\(schemeName).terminal" | |
| convertToTerminalColors(itermFile: path, terminalFile: terminalPath) | |
| } | |
| } else { | |
| print("usage: iTermColorsToTerminalColors FILE.itermcolors [...]") | |
| } |
@Jones-S: seems I don't get email notifications of comments....
Script was not compatible with Swift 2.x.
I have now updated it to Swift 3.0, you'll need the latest Xcode 8.0 beta installed, and active:
$ sudo xcode-select -s /Applications/Xcode-beta.app/Contents/Developer
Then you can run the script, here's an example:
$ chmod +x iTermColorsToTerminalColors.swift
$ ./iTermColorsToTerminalColors.swift Spacegray.itermcolors
converting /Users/ljb/Documents/SpaceGray.itermcolors -> /Users/ljb/Documents/SpaceGray.terminalin Downloads/
› ./iTermColorsToTerminalColors.swift anderson.itermcolors
./iTermColorsToTerminalColors.swift:189:12: error: instance member 'arguments' cannot be used on type 'Process'
let args = Process.arguments.dropFirst()
^~~~~~~ ~~~~~~~~~
./iTermColorsToTerminalColors.swift:126:18: error: value of type 'String' does not conform to expected dictionary value type 'AnyObject'
"name" : name,
^~~~
as AnyObject
./iTermColorsToTerminalColors.swift:153:53: error: cannot assign value of type 'Data' to type 'AnyObject?'
terminalColorScheme[terminalKey.rawValue] = data
^~~~
as AnyObject?
./iTermColorsToTerminalColors.swift:156:12: error: cannot convert return expression of type '[String : AnyObject]' to return type 'NSDictionary'
return terminalColorScheme
^~~~~~~~~~~~~~~~~~~
as NSDictionary
./iTermColorsToTerminalColors.swift:162:32: error: cannot convert return expression of type 'Data' to return type 'NSData?'
return NSKeyedArchiver.archivedData(withRootObject: font)
~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
as NSData?
./iTermColorsToTerminalColors.swift:175:48: error: cannot call value of non-function type 'FileManager'
directory = FileManager.default().currentDirectoryPath
~~~~~~~~~~~~~~~~~~~^~
in Downloads/
› swift --version
Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9
I ran these commands:
$ sudo xcode-select -s /Applications/Xcode-beta.app/Contents/Developer
xcode-select: error: invalid developer directory '/Applications/Xcode-beta.app/Contents/Developer'
$ chmod +x iTermColorsToTerminalColors.swift
$ ./iTermColorsToTerminalColors.swift Untitled.itermcolors
(I'm not sure what the Xcode error is about)
And at the end I get this error:
./iTermColorsToTerminalColors.swift:188:12: error: instance member 'arguments' cannot be used on type 'Process'
let args = Process.arguments.dropFirst()
^~~~~~~ ~~~~~~~~~
./iTermColorsToTerminalColors.swift:174:48: error: cannot call value of non-function type 'FileManager'
directory = FileManager.default().currentDirectoryPath
~~~~~~~~~~~~~~~~~~~^~
./iTermColorsToTerminalColors.swift:125:18: error: value of type 'String' does not conform to expected dictionary value type 'AnyObject'
"name" : name,
^~~~
as AnyObject
./iTermColorsToTerminalColors.swift:152:53: error: cannot assign value of type 'Data' to type 'AnyObject?'
terminalColorScheme[terminalKey.rawValue] = data
^~~~
as AnyObject
./iTermColorsToTerminalColors.swift:155:12: error: cannot convert return expression of type '[String : AnyObject]' to return type 'NSDictionary'
return terminalColorScheme
^~~~~~~~~~~~~~~~~~~
as NSDictionary
./iTermColorsToTerminalColors.swift:161:32: error: cannot convert return expression of type 'Data' to return type 'NSData?'
return NSKeyedArchiver.archivedData(withRootObject: font)
~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
as NSData
My
$ swift --version
Apple Swift version 4.0.2 (swiftlang-900.0.69.2 clang-900.0.38)
Target: x86_64-apple-macosx10.9
does not work anymore, I think.
I am getting the following output
Any hints on how I could still convert a .itermcolors file to a .terminal file?