monolithic kernel

sudo.vimをzshから扱いやすくしたい

December 03, 2011

    Shougoさんのpluginを入れた状態でsudo vimすると怒られるようになったので、メッセージに従ってsudo.vimを使い始めたのですが、どうにも使いづらい。というわけで改善を試みます。

    まず、使いづらい理由を挙げてみます。

    zshの補完が効かなくなる : 個人的には致命的なので、早急になんとかする必要があります。

    コマンドの書き方が変わる(sudo vim … → vim sudo:…) : 慣れの問題ですが、できればこれまでどおり使いたいところです。

    syntaxの設定が効かなくなる : 困るには困るのですが、比較的優先度は低いと思います。

    今回は、上2つの問題を解決するためにzshの関数を作ってみました。

    sudo() {
      local args
      case $1 in
        vi|vim)
          args=()
          for arg in $@[2,-1]
          do
            if [ $arg[1] = '-' ]; then
              args[$(( 1+$#args ))]=$arg
            else
              args[$(( 1+$#args ))]="sudo:$arg"
            fi
          done
          command vim $args
          ;;
        *)
          command sudo $@
          ;;
      esac
    }

    これを.zshrcなんかにコピペすれば使えるようになります。

    この関数は、

    $ sudo vim file1 file2 ...

    みたいなのを

    $ vim sudo:file1 sudo:file2 ...

    のように置き換えることで、これまでどおりのsudo vimという記述をsudo.vimを利用する形に変換しています。これによって、sudo vimという書き方が可能になるほか、zshのファイル名補完も効くようになります。

    おわりに

    とりあえず個人的には快適に使えるようになったのですが、このアプローチがいいのか悪いのかよくわかりません(あんまりよくない気はする)。何かエレガントな解があればぜひ教えてください。

    追記

    2011/12/17 : オプションにsudo:を付けないよう修正