はじめに
Vim プラグインについて引き続き調べています。その中でいくつか Vim プラグインを読んでいたのですが、こんな記述を見ることがよくありました。
lets:save_cpo=&cpo
set cpo&vim" 処理...let&cpo =s:save_cpo
unlet s:save_cpo
こちらの記述がお作法と呼ばれているようだったのですが、なぜこの記述が必要なのか、その意味について調べたいと思います。
行連結の副作用回避
調べてみると、行連結の挙動がおかしくならないようにするための処理のようでした。
Vim の write-plugin のマニュアルを読むと、行連結、副作用の回避
という項目があります。
例えばスクリプト内で以下のように複数行に渡って設定を記述している場合があります。これば複数行に渡る処理の記述がある場合、バックスラッシュを行頭につけることで記述を連結することができます。(行連結、line-continuation
)と呼ばれています)
nnoremap <Leader>t \:echo 111
しかし、Vim の挙動を Vi 互換にするかどうかを設定する compatible
オプションがオンになっていると、バックスラッシュの記述が行連結とならない場合が発生する可能性があり、処理がエラーになる場合があります。
そのため、処理の最初で、compatible
オプションの値を一時的に変数に保持しておき、Vim の初期値に設定しておきます。
lets:save_cpo=&cpo
set cpo&vim
cpo
が compatible
オプションの設定値であり、&
で式展開しています。
ちなみに :echo &cpo
とすると、現在の compatible
オプションの設定値を確認できます。
:echo &cpo
aABceFs_
それぞれの文字における設定値の意味は、マニュアルの cpoptionsの項目を参照ください。
そして処理実行後にもともとの設定値を戻してあげるという形です。
let&cpo =s:save_cpo
unlet s:save_cpo
おわりに
プラグインの作成のお作法と呼ばれているのは何だったのかがを少し知ることができました。ドキュメントを地道に読んでいくことが大事ですね。