Vim9 script の始め方

この記事は Vim 駅伝の 9 本目の記事です。

9 本目ということで、Vim9 script について書きます。

Vim では Vim script を使ってエディタの挙動を拡張できますが、Vim 9.0 では新たに Vim9 script が追加されました。本記事ではそのさわりとして、Vim9 script の実行方法について簡単に紹介します。

Vim9 script について

従来の Vim script にはいくらか問題がありました。特に実行するたびにパースを行う関係上、動作が非常に遅く、また互換性の観点からわかりづらい文法があったりします。

Vim9 script は Vim script との互換性を捨て、処理速度の向上とよりわかりやすい文法を提供する目的で導入されました。 と言っても、ベースとなる文法を大きく変えることはせず、いくつかのとっつきづらい文法の見直しが行われています。

その他の特徴として、型の導入による型チェックの機能があります。 開発中の機能ですが、将来的にもあまり複雑なチェックができるようになることはないのではないかと個人的には予想しています。

Vim9 script の実行方法

Vim9 script として実行されるコードを書く方法は大きく 4 種類あります。

ファイル

ファイルの先頭に :vim9script Ex コマンドを置くと、そのファイルは Vim9 script として実行されます。

vim9script

var name = 'Vim9 script'
echo $'Hello, {name}'

関数

Vim script では :function Ex コマンドで関数を作ります。 Vim9 script では、代わりに :def を使います。これは Vim script 中にも混在して書くことができ、関数の中身だけが Vim9 script になります。

" ここは Vim script
let g:hello = 'Hello'

def! Greeting(name: string)
  # ここは Vim9 script
  echo $'{g:hello}, {name}'
enddef

" ここは Vim script
call Greeting('Vim9 script')

Vim9 script で定義した関数も通常の Vim script から呼び出すことができます。

:vim9cmd Ex コマンド

:vim9cmd Ex コマンドを使うと、その場でだけ Vim9 script を実行できます。

vim9cmd var name = 'Vim9 script'
vim9cmd echo $'Hello, {name}'

:command:autocmd

:command Ex コマンドと :autocmd Ex コマンドでは、実行されるコマンドの部分にブロック記法による Vim9 script の記述ができます。

command! -nargs=1 Hello {
  var name = <q-args>
  echo $'Hello, {name}'
}

Hello Vim9 script
" サンプルなので augroup は省略
autocmd! User hello-vim9 {
  echo 'Hello, Vim9 script'
}

doautocmd User hello-vim9

この場合のブロックは } で始まる行を終了行とするため、入れ子にするなどして別の } が行頭に来てしまうと期待通りに動作しないことに注意が必要です。

autocmd は、Vim9 script 内で実行するとその内容も Vim9 script として解釈されます。

def! MyAutocmd()
  autocmd! User hello-vim9 g:str = 'Vim9 script'
enddef

call MyAutocmd()
doautocmd User hello-vim9
echo $'Hello, {g:str}'

まとめ

Vim9 script を実行する方法について紹介しました。

  • ファイル全体を Vim9 script として実行する方法
  • Vim9 script の関数を定義する方法
  • 一時的に Vim9 script を実行する方法
  • その他の特殊な箇所

と言っても、Vim9 script の書き方がわからないと中身が書けないかと思います。

Vim9 script 自体の書き方についてはいずれ(気が向いたら)書こうと思います。