読者です 読者をやめる 読者になる 読者になる

本当にキモい Vim script - 行継続編

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\
<       従って一般的ではないが行頭のバックスラッシュを採用している。

理由はわかった。わかったんだが…キモい。