rootユーザーでvimを実行する方法

書き込み権限のないファイルを vim で編集するときどうしていますか?

sudo を使う

前までは、chmod するときなんかによく使う sudo コマンドを使っていました。

$ sudo vim hoge.txt

ただ、sudo コマンドの仕様が変更されたみたいで、これだと問題が出てきました。

$ which vim
/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: と書いて指定する使い方もできます。

$ vim sudo:hoge.txt

最近はよくこの方法で、書き込み権限のないファイルを開いて編集していました。

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 を実行したのと同じ効果が得られるようです。

ただ、僕の環境だとなぜかカラースキーマが読み込まれないんですよね。
あと、コマンド名が長い。

なので、たまにしか使ってません。

rootユーザーでvimを実行する方法」への1件のフィードバック

  1. ピンバック: sudoにパスを通す | yuuAn's Note

コメントを残す