この記事は Vim Advent Calendar 2013 117日目の記事になります。
最近、Vim の多重起動を避けるプラグイン、vim-singleton を使い始めたのですが、凄く便利ですね。
導入は簡単なので、作者の @thinca さんの「singleton.vim 作った - 永遠に未完成」をぜひご覧ください。
せっかく便利なので、sudoedit
でも Vim の多重起動を避けよう!というのがこの記事の主旨です。
まず、vim-singleton には git commit -v
等で生成された一時ファイルを編集するために、サーバー側の Vim の編集が終わるまでクライアント側の Vim の終了を待機する、リモート編集という機能があります。
sudoedit
でも git commit -v
と同様に編集用の一時ファイルが生成されますので、リモート編集を使えばそれだけで解決しそうなのですが、一つ問題があります。
リモート編集するには対象の一時ファイルを、あらかじめ正規表現で指定しておかなければいけないのですが、sudoedit
で編集する一時ファイルは正規表現では特定できないのです。
しかし、sudoedit
は環境変数 SUDO_EDITOR
で指定したエディタを使用しますので、ここで指定されたエディタが常にリモート編集機能を使うようにすれば何とかなりそうです。
そこで、@thinca さんに vim-singleton のリモート編集機能を強制する方法がないかお尋ねしたところ、
vim --cmd "let g:singleton#entrasuted_pattern='.'"
という方法を教えていただきました。
リモート編集する対象ファイルを全てのファイルにすることで、結果的にどのファイルを編集しても リモート編集になるわけですね。
ですが、これをそのまま、
export SUDO_EDITOR='vim --cmd "let g:singleton#entrust_pattern='\''.'\''"'
のように指定すると、sudoeditが "let
と g:singleton#entrust_pattern='.'"
を2つの引数と解釈するために上手く動作しません。
そこで VimScript の変数名の展開を利用して、
export SUDO_EDITOR='vim --cmd let{"g:singleton#entrust_pattern"}="."'
と指定することで、無事リモート編集することができました。
なお、sudoedit
はエディタの実行前にPATHを書き換えますので、システム標準以外の vim
を利用する場合は、SUDO_EDITOR
内の vim
をフルパスで指定するようにしてください。
#「sudo vim
が許されるのは小学生まで」
と婆っちゃが言ってましたので、ぜひ sudoedit
をご利用ください。
sudoedit
で vim-singleton を使う場合は、下記の環境変数を設定するだけです。
export SUDO_EDITOR='vim --cmd let{"g:singleton#entrust_pattern"}="."'