先日、
てなことを思ったのですが、ついでなので補完関数書いてみよう、ということで書いてみました:
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 }
ファイル名にワイルドカードを含めたとき(sudo:/etc/*conf とか)は上手く動きません。うーん
- 2012-04-27:色々とミスっていたので修正。そもそも sudo: で始まるときだけやればいいのでした
- 2012-04-30:ご指摘のとおり esac が抜けていました。
- 2012-08-29:実は find いらないんですよね
ありがたく使わせてもらっています。
返信削除上の例だとesacが足りなくないでしょうか?
あと滅多に使わない場合ですが、~が入るとうまく補完できないようなので、findには${~D}を渡して、もう一個sedを追加して、$HOMEを~に置換するとなんとか動いているようです。もっと良いやり方があるのかもしれませんが、sudo:をつけて~を使うことが滅多にないでしょうから対応する意味もないかもしれません。