GUIのMacVimでsudoを使おうとすると

sudo: no tty present and no askpass program specified

と出てきて、sudoに失敗する。ググってみるとsudo visudoして

Defaults visiblepw

を追記すると良いということがわかるので追記して実行してみると

:!sudo ls

みたいのはできるけど、以下のようなものはパスワード入力する隙を与えられず失敗する。

:w !sudo tee %
Password:Sorry, try again.
Password:Sorry, try again.
Password:Sorry, try again.
sudo: 3 incorrect password attempts

そこでaskpassを使う。

Kaoriya版MacVimなら/Applications/MacVim.app/Contents/MacOS/macvim-askpassというシェルスクリプトが入っている。

.gvimrcに以下のような設定を書く。

if has('gui_macvim')
    let $SUDO_ASKPASS="/Applications/MacVim.app/Contents/MacOS/macvim-askpass"
    let $DISPLAY=":0"
endif

そして、またもや失敗する。これはこのスクリプトが書かれた当時のダイアログの戻り値は

text returned:<入力値>, button returned:OK

みたい感じだったんだろうけど、現在はtext returnedとbutton returenedの順番が逆になっていて、sedして、<入力値>を取得しているところで、失敗しているため。

修正プルリクった(fix bug of macvim-askpass by tmsanrinsha · Pull Request #1 · splhack/macvim)けど、

markcarver/mac-ssh-askpassはちゃんと動くのでこちらを使ってもいいかも。

ちなみにsudoを何度も試すのにあたって、パスワードのキャッシュを消す必要があったが、sudo -kで消すことができる。

gmarik/sudo-gui.vimというのもあるが、こちらはダイアログにフォーカスしないし、パスワードのキャッシュをしないので使いにくい。