今使っている Vim のバージョン(e.g., 9.1.0342
) を、 Vim
の実行バイナリから取得する方法のメモ。
1 行で
vim -Es +"let vl=v:versionlong | put =printf('%d.%d.%04d', str2nr(vl[0]), str2nr(vl[1:2]), str2nr(vl[3:])) | print | q!"
目的
「最新リリースと比較して、新しいものがあれば再ダウンロードする」というのをやりたい。
Vim を、Windows で使ったり、 dev container に転送して使ったりしているため、ポータブルな形で配布されている Vim をよく利用しており、 利用している Vim のバージョンを更新しようとしたときに、「今ここにあるこのバイナリのバージョンはいくつだ?」をシェルスクリプトから確認したくなった。
そのためにはコマンドラインから Vim を起動し、バージョン番号を標準出力へ出力してもらわなければいけない。
ポータブルな形で配布されている Vim の例:
前提
動作確認環境は以下。
- OS: Windows 11 Pro 64bit 23H2 ビルド 22631.3296
- Vim: 9.1.0282 (vim/vim-win32-installer: Vim Win32 Installer を使用)
バージョン取得方法の説明
vim -Es +"let vl=v:versionlong | put =printf('%d.%d.%04d', str2nr(vl[0]), str2nr(vl[1:2]), str2nr(vl[3:])) | print | q!"
- Vim の起動オプションの話
-E
: Vim を「拡張 Ex モード」で起動-s
: サイレントモード。「Ex モード」「拡張 Ex モード」での実行時に、一部コマンドの実行結果以外を標準出力へ出力しないようにする- 標準出力されるコマンドは以下
print
list
number
set
- 標準出力されるコマンドは以下
- Vim script の話
v:versionlong
: パッチレベルを含めたバージョン文字列(9.1.0000
の場合9010000
となる)printf
: C 言語と同じフォーマットで整形できる関数。前述のv:versionlong
の桁を切り取ってフォーマットするのに利用str2nr
: 文字列を数値に変換する関数put
: バッファに文字を出力。put =print...(略)
で、print
の戻り値をバッファへ出力しているprint
: バッファの、現在のカーソルがある行を標準出力するq!
: 現在のバッファを破棄して Vim を終了する