Vim Advent Calendar 2013 の 49 日目の記事です。
Vim script は行指向、もっと言うとコマンド指向の言語です。そう言った点で、シェルスクリプトに近いです。
Vim script
if hoge ==# "HUGA" " if コマンド " ↓echo コマンド echo 'hi' endif " endif コマンド
if [ "$HOGE" = "HUGA" ] # if コマンド then # then コマンド echo hi # echo コマンド fi # fi コマンド
シェルクリプトの if なんかは if コマンドとは呼ばないかもしれないですが、そういう風にも見れるということで。
さて、行指向と言っても、1行が長くなったら途中で折り返したいものです。
シェルスクリプトでは行末に \ があると、次の行は現在の行の継続行とみなされます。
# 以下は1行に書かれた1つのコマンドとして実行される ./configure \ --with-features=huge \ --enable-multibyte \ --enable-gui=gtk2 \ --enable-rubyinterp \ --enable-pythoninterp \ --enable-python3interp \ --enable-perlinterp \ --enable-tclinterp \ --enable-mzschemeinterp \ --enable-luainterp \ --with-lua-prefix=/usr \ --enable-gpm \ --enable-xim \ --enable-cscope \ --enable-fontset
他には、C 言語などで使われてるマクロなんかも同じように行末の \ で行継続を表します。
さて、では一方 Vim script は、と言うと…
let g:quickrun_config = { \ '_': { \ 'input': '=%{b:input}', 'cmdopt': '%{b:cmdopt}', 'args': '%{b:args}', \ 'runner': 'vimproc', \ 'runner/vimproc/updatetime': 500, \ }, \ }
おわかり頂けるだろうか。
Vim script では、行頭に \ を置くことで、行継続を表します。どうしてこうなった。
これには一応理由があり、:help line-continuation の最後の方に書かれています。
Rationale: Most programs work with a trailing backslash to indicate line continuation. Using this in Vim would cause incompatibility with Vi. For example for this Vi mapping: > :map xx asdf\ < Therefore the unusual leading backslash is used.
解説: 多くのプログラムは行継続を、継続する行の末尾にバックスラッシュを置くこ とで表現する。その方法をVimで採用してしまうと、Viとの互換性に重大な欠 陥ができてしまう。たとえばこのようなViのマッピングを考えるとわかりやす い: > :map xx asdf\ < 従って一般的ではないが行頭のバックスラッシュを採用している。
理由はわかった。わかったんだが…キモい。