LoginSignup
3
3

More than 5 years have passed since last update.

swiftをubuntuでコード補完・シンタックスカラーリングしてみる

Last updated at Posted at 2016-03-23

概要

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などのエディタのプラグインを作ることができれば、と思っております。

3
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3