1. msmhrt

    Posted

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