macの辞書を引くコマンドをswiftで書くと速かった
macの辞書をターミナルで引ければ楽で速いかなと思い調べたが、Dictionary.appが起動するものとPythonのスクリプトしか見当たらなかった。 しかもPythonのスクリプトはちょっともたつく。
中身はObjective-Cバインディングを使っているようなので、Swiftで書いてみたらバイナリも生成できるし速かった。という話。
結果
for i in d.py define.py dict.py dict.swift dict do time ./$i window >/dev/null done ./$i window > /dev/null 0.83s user 0.23s system 83% cpu 1.265 total ./$i window > /dev/null 0.77s user 0.14s system 90% cpu 1.011 total ./$i window > /dev/null 0.74s user 0.14s system 91% cpu 0.965 total ./$i window > /dev/null 0.46s user 1.98s system 74% cpu 3.267 total ./$i window > /dev/null 0.08s user 0.13s system 71% cpu 0.300 total
- d.py: applescript - look up a word in Dictionary.app in Terminal - Ask Different の一回答
- define.py: applescript - look up a word in Dictionary.app in Terminal - Ask Different の一回答 Access osx dictionary in python(gist)
- dict.py: 辞書(Dictionary).appを使い倒そう : 紹介マニア
- dict.swift: 書いた peccu/dictionary-swift: lookup Dictionary.app from command line
- dict: ↑を
swiftc dict.swift
でコンパイルしたバイナリ
Pythonのスクリプトはリッチな出力があるが、そこまでは求めていないので。
中身
#!/usr/bin/swift // you can compile into binary by `swiftc dict.swift` import Foundation if (CommandLine.argc < 2) { print("Usage: dictionary word") }else{ let argument = CommandLine.arguments[1] let result = DCSCopyTextDefinition(nil, argument as CFString, CFRangeMake(0, argument.count))?.takeRetainedValue() as String? print(result ?? "") }
参考
- applescript - look up a word in Dictionary.app in Terminal - Ask Different
- 辞書(Dictionary).appを使い倒そう : 紹介マニア
- DCSCopyTextDefinition(::_:) - Core Services | Apple Developer Documentation
- 関数定義
- Command Line Programs on macOS Tutorial
- Swiftでシステム内蔵辞書を検索する方法 - Qiita
DCSCopyTextDefinition
の戻り値の型の扱いを参考に。- こちらは辞書を指定できるようにしている。
- Swiftのインタプリタモードが楽しい - Qiita
- swiftインタプリタを探した。挙動が変わってたので、パスの通っていた
swiftc
を使った。
- swiftインタプリタを探した。挙動が変わってたので、パスの通っていた