書き込み権限のないファイルを vim で編集するときどうしていますか?
sudo を使う
前までは、chmod するときなんかによく使う sudo コマンドを使っていました。
ただ、sudo コマンドの仕様が変更されたみたいで、これだと問題が出てきました。
/usr/local/bin/vim
$ sudo which vim
/usr/bin/vim
$ su -
# which vim
/usr/local/bin/vim
このように、sudo を使ったときだけ /usr/local/bin/ にある vim を呼んでくれないのです。
/usr/local/bin/ には lua を有効にした vim が置いてあって、これが有効でないと neocomplete.vim が使えないので困りました。
sudo.vim を使う
書き込み権限がないときのファイルの保存方法
ところで、書き込み権限がないことに気付かないままファイルを開いてしまったときに、編集した内容を保存する方法として、以下のふたつがあります。
まずは、tee というコマンドを使う方法。
- vim
- :w !sudo tee %
ただ、tee なんて使い慣れないのですぐ忘れてしまいます。
次に、sudo.vim を使う方法です。
- vim
- :w sudo:%
なんとなくこっちの方が直感的で覚えやすかったのでこっちを使っています。
sudo.vim を使ってファイルを開く
さて、話を戻します。
この sudo.vim ですが、次のようにファイルを開くときに、ファイル名の前に sudo: と書いて指定する使い方もできます。
最近はよくこの方法で、書き込み権限のないファイルを開いて編集していました。
zsh で sudo.vim を使ったときに補完が効くようにする
ところが、sudo: を付けると、zsh の補完が効いてくれません。
何か方法はないものかとググってみたら、ふたつの方法を見付けました。
ひとつめは、sudo コマンドを打ったときに、その後に来るのが vim ならば、sudo.vim を使った書き方に書き換えるという方法です。
ただ、この記事を書かれた方も仰っているのですが、この方法がスマートかどうかというと、ちょっと悩ましいです。
ふたつめは、zsh の補完関数を書いてしまおうというものです。
こっちの方がスマートな感じがしますね。
以下のコードを .zshrc に書きます。
- ~/.zshrc
-
autoload -U compinit compinit function _vimsudo { local LAST="${words[$#words[*]]}" case "${LAST}" in sudo:*) local BASEDIR="${LAST##sudo:}" BASEDIR="${~BASEDIR}" [ -d "${BASEDIR}" ] && BASEDIR="${BASEDIR%%/}/" compadd -P 'sudo:' -f $(print ${BASEDIR}*) \ && return 0 ;; *) _vim && return 0 ;; esac return 1 } compdef _vimsudo vim
これで補完ができるようになりました。
sudoedit を使う
みっつめの方法として、sudoedit というコマンドがあります。
これを使うと、root ユーザーで vim を実行したのと同じ効果が得られるようです。
ただ、僕の環境だとなぜかカラースキーマが読み込まれないんですよね。
あと、コマンド名が長い。
なので、たまにしか使ってません。
ピンバック: sudoにパスを通す | yuuAn's Note