この記事は Vim 8.0 Advent Calendar の 23 日目の記事です。
今回は、今までの変更に収まらなかった細かい変更点について見ていきます。
GTK+ 3
GUI として、GTK+ 3 に対応しました。GTK+ 2 と同じように使えます。
+num64
Vim script の整数の型が 64 bit になりました。
利用可能な環境であれば 64 bit になることになっていますが、基本的には一般的なほぼ全ての環境では利用可能かと思います。
has('num64')
を使うことで、64 bit が有効かどうかを判定できます。
if has('num64')
echo 1000000000000000000
" => 1000000000000000000
endif
これにより、32 bit による桁溢れなどを利用している一部のプラグインがうまく動作しなくなる可能性があります。
ユーザー定義コマンドでの新しい置き換えテキスト <mods>
Vim の Ex コマンドの中には、他の Ex コマンドに前置することで他のコマンドを修飾するものがあります。:aboveleft
や :hide
などがそうで、これらはコマンド修飾子と呼ばれます。
これまでは、ユーザー定義コマンドに対してコマンド修飾子が指定されても、その存在を知ることはできませんでした。そこで追加されたのが <mods>
です。
以下のように <mods>
を使うことで、指定された修飾コマンドの存在を知ることができます。
command! ShowMods echo split(<q-mods>)
ShowMods
" => []
aboveleft ShowMods
" => ['aboveleft']
hide leftabove ShowMods
" => ['aboveleft', 'hide']
指定された順序に関係なく、決められた順序で <mods>
に入ります。対応しているコマンド修飾子は以下です。
-
:aboveleft
:leftabove
- どちらも同じ意味のコマンドで、どちらが指定されても
aboveleft
が得られます。
- どちらも同じ意味のコマンドで、どちらが指定されても
-
:belowright
:rightbelow
- どちらも同じ意味のコマンドで、どちらが指定されても
belowright
が得られます。
- どちらも同じ意味のコマンドで、どちらが指定されても
:botright
:browse
:confirm
:hide
:keepalt
:keepjumps
:keepmarks
:keeppatterns
:lockmarks
:noswapfile
:silent
:tab
:topleft
:verbose
:vertical
また、以下のコマンド修飾子には対応していません。
型チェックの廃止
以前のバージョンの Vim では、変数に対して、元から入っている値の型に暗黙に変換不可能な型の値を代入しようとすると、エラーになっていました。
" Vim 7.4.1546 より前
let var = 10
let var = []
" => E706: 変数の型が一致しません: var
これは元々意図的にチェックが行われエラーになっていたのですが、静的型付き言語ならともかく、動的型付き言語である Vim script でこれを行ってもわずらわしいだけであったため、このチェックはなくなりました。
" Vim 7.4.1546 以降
let var = 10
let var = []
" => エラーなし
printf('%s')
が全ての型を受け入れる
printf()
関数のフォーマット文字列である %s
は、文字列を表示します。以前のバージョンの Vim では、文字列に暗黙に変換できない値を渡すとエラーになっていました。
" Vim 7.4.2220 より前
echo printf('%s', [1, 2, 3])
" => E730: リスト型を文字列として扱っています
しかしこれはあまり便利ではないため、文字列型でない場合は string()
関数を適用した結果が使用されるように変更されました。
" Vim 7.4.2220 以降
echo printf('%s', [1, 2, 3])
" => [1, 2, 3]
辞書のキーに空文字列を使える
以前のバージョンの Vim では、辞書のキーに空文字列が使えませんでした。
" Vim 7.4.1707 より前
echo {'': 10}
" => E713: 辞書型に空のキーを使うことはできません
しかし、空文字列を許可しない積極的な理由はなく、空文字列が使えた方が便利であるため、キーに空文字列が使えるようになりました。
" Vim 7.4.1707 以降
echo {'': 10}
" => {'': 10}
正規表現 \%C
新しく追加された正規表現のアトム \%C
を使うと、合成文字をスキップすることができます。
let s = 'e' . nr2char(0x301)
echo s
" => é
echo s =~# 'e'
" => 0
echo s =~# 'e\%C'
" => 1
ハイライトグループ EndOfBuffer
新しく追加されたハイライトグループ EndOfBuffer
は、ファイルの末尾以降に表示される ~
の文字がある行の部分のハイライトになります。標準では NonText
と同じようにハイライトされます。
例えば以下のように背景色と前景色を同じにすることで、ファイル末尾以降を塗り潰す、といったことができます。
highlight EndOfBuffer ctermfg=DarkGray ctermbg=DarkGray guifg=DarkGray guibg=DarkGray
サポートが終了した環境
以下の環境や機能は、使っている人がほぼいない、大きくなった Vim が動作するのにそぐわないなどの理由により、Vim のコードを綺麗に保つためにサポートが終了しました。
- MS-DOS
- Windows 95 とそれ以前の Windows (16bit の Windows を含む)
- OS/2
- SNiFF+
これらの環境や機能で Vim が使いたい場合は、古い Vim を使う必要があります。