18 — CLI を IDE として使う

前: 並行処理

English version: 18_cli.vibe.md (canonical)

エディタが言語サーバから得ているものは、すべてシェルからも訊けます。答えは パイプに流せる形をしています — 1件1行、フィールド順は固定、そして 空の出力は「問題なし」です。

最後のものは覚えておく価値があります。vibe check が何も表示しないのが 成功した状態です。

訊けること

vibe check file.vibe                # empty = this file compiles (imports resolved)
vibe check --single-file file.vibe  # buffer-only; imports are not followed
vibe symbols file.vibe              # outline: NAME KIND START END [DOC]
vibe type-at file.vibe 12 4         # hover at 1-based line,col
vibe binding-at file.vibe 12 4      # rename / refs
vibe escapes file.vibe              # which let mut is boxed
vibe deps file.vibe                 # resolved import closure
vibe deps --direct file.vibe        # one hop; cache-friendly
vibe grep --pattern 'f($(x:exp))' --where '$x : Array[_]' lib

vibe lsp は stdin/stdout で LSP を話すので、サーバを求めるエディタは これを向ければよい。

--single-filecheck の劣化版ではない。未保存バッファ用の道具で ある。プロジェクト全体としては正しくても、import 由来のコンストラクタに unknown name を報告する。ファイルがコンパイルを通るか知りたいなら フラグを外すこと。

vibe grep はテキストではなく AST パターンにマッチする。フィルタは checker に問い合わせられる (--where '$x : Array[_]'--where-row '$f with Async'--only-ill-typed)。これらのフィルタは vibe check と同じ import 解決レーンに乗る。

クエリから見えるプログラム

fn add(x: Int, y: Int) -> Int {
  x + y
}

fn main with Console {
  println("\{add(2, 40)}")
}
42

この add を含むファイルに対して:

vibe symbols hello.vibe          # add 12 3 6 / main 12 46 50
vibe type-at hello.vibe 1 4      # (Int, Int) -> Int  (`add` の名前の上)
vibe type-at hello.vibe 5 4      # () -> () with Console  (`main` の上)
vibe check hello.vibe            # empty

symbols 行の 12 は関数の LSP SymbolKind で、その後の2つの数値は名前の byte offset です — kind の表は vibe symbols --legend が出します。 type-at は 1-based の行と byte 列を受け取り、その位置の識別子について 答えます。識別子の無い位置では何も出力せず exit 0 — ほかと同じ 「空出力 = clean」の規約です。

vibe test file.vibetest { } / test "name" { } ブロックを全部 コンパイルする。inspect(value, "expected") がスナップショット形式で、 vibe test --update がリテラルを書き換える。inspect に import は要らない — コンパイラが型検査の前に脱糖する。

言語レベルの説明は テスト を参照。

次: wasm をターゲットにする