概要
Swiftがオープンソースになりましたね(今更)
Macであればswiftを書くときに、
Xcodeや、またはvimでもSourceKittenを使ったりして、オムニ補完を使うことが可能かと思います。
しかし、現状Linuxでは、Jetbrainsの有償IDEであるCLionぐらいしかオムニ補完ができるエディタ・IDEがないようです。
なんとかvimや他のエディタでもできるようにならないか、というのが事の発端で、
とりあえず僕の環境(Ubuntu 15.10)でオムニ補完っぽいことができるようになった、というお話です。
ついでにシンタックスカラーリングも簡単にできそうだったのでそっちもやってみました。
やり方
SourceKittenで使われているらしいSourceKitも一緒にオープンソースになっており、
こっちを使っても良かったのですが、ビルドするためにある程度調査が必要そうだったので、
今回はswiftをビルドすると一緒についてくるswift-ide-test
を使いました。
build/Ninja-ReleaseAssert/swift-linux-{arch}/bin
にswiftコンパイラなんかと一緒に入ってます。
swiftのAPIにはIDE的な機能を提供するものが用意されています。
今回使ったswift-ide-test
はそのフロントエンド的なものみたいですね。
コード補完以外にもカラーリングの機能があったり、興味深かったです。
実際にコード補完してみる
まずは補完したいコードを用意してみましょう。コード補完したい状況を想定して、gree
で止めてあります。
こいつを適当な名前で保存しておきましょう。
func greet(name:String) {
print("Hello, \(name)!!")
}
func greetDmy(dmy:Int) {}
gre
さて、では実際にやってみましょう...!
$ ./swift-ide-test -repl-code-completion -source-filename=./test.swift
出力はこんな感じでした!!
Begin completions
greet(name: String) -> Void
greetDmy(dmy: Int) -> Void
End completions
いい感じですね!!
-repl-code-completion
を指定すると、入力の最後を基準に補完してくれるみたいです。
しかし、「ファイルの途中で使いたい」という場合が大半なのではないでしょうか。
そういう場合に使うのが-code-completion
モードです。
では、実際にやってみます。
テスト用ファイルの内容は以下になります。
class Greeter {
func greet(name:String) {
print("Hello, \(name)!")
}
}
var greeter = Greeter()
greeter.#^GREETER_METHOD^#
code-completion
モードの場合、補完したい場所に#^HOGE^#
のような形式でcompletion tokenを仕込む必要がありました。
これについて最初わからなくて悩んだのですが、swiftにはswift-ide-test
のテストが付属しており、難なく解決しました...
$ ./swift-ide-test -code-completion -source-filename ./test.swift -code-completion-token=GREETER_METHOD
結果は以下のようになりました。
found code completion token GREETER_METHOD at offset 120
found code completion token GREETER_METHOD at offset 120
Begin completions, 1 items
Decl[InstanceMethod]/CurrNominal: greet({#(name): String#})[#Void#]; name=greet(name: String)
End completions
Greeterクラスのインスタンスメソッドがしっかり補完されています!!
おまけ:シンタックスカラーリングをやってみる
code completion
モードで使用したファイルを用いて、シンタックスカラーリングをやってみたいと思います。
今回は補完を使う必要はないので、メソッド呼び出しを最後まで記述しています。
class Greeter {
func greet(name:String) {
print("Hello, \(name)!")
}
}
var greeter = Greeter()
greeter.greet("musou1500")
シンタックスカラーリングは以下で行うことができます
$ ./swift-ide-test -syntax-coloring -source-filename=./test.swift
<kw>class</kw> Greeter {
<kw>func</kw> greet(name:<type>String</type>) {
print(<str>"Hello, </str>\<anchor>(</anchor>name<anchor>)</anchor><str>!"</str>)
}
}
<kw>var</kw> greeter = Greeter()
greeter.greet(<str>"musou1500"</str>)
それぞれのキーワードがマークアップされているのがわかるかと思います!!
今後について
今回、swiftに付属していたテスト用のプログラムを叩きましたが、最終的にはswift側で用意されているIDE機能を提供するAPIや、
SourceKitなどを用いて、AtomやVimなどのエディタのプラグインを作ることができれば、と思っております。