読者です 読者をやめる 読者になる 読者になる

Ubuntu 11.04で一部コマンド(mv,cp,ls,lessなど)のディレクトリ補完

Ubuntu 11.04 で bash を使うと,一部のコマンドでディレクトリ補完が気持ち悪くなります.
foo/hoge ディレクトリがあるときは,

mv fo[tab]

によって

mv foo/

と補完して欲しいのに,

mv foo/(半角スペース)

と,末尾に一個余分な半角スペースが入るせいで,

mv fo[tab]
-> mv foo/
-> mv foo/ho[tab]
-> mv foo/hoge

というような流れるような補完ができません.

原因は bash-completion の設定にありました.
/etc/bash_completion をエディタで開いて, "mv" とかで検索すると,

for i in a2ps awk bash bc bison cat colordiff cp csplit \
    curl cut date df diff dir du enscript env expand fmt fold gperf gprof \
    grep grub head indent irb ld ldd less ln ls m4 md5sum mkdir mkfifo mknod \
    mv netstat nl nm objcopy objdump od paste patch pr ptx readelf rm rmdir \
    sed seq sha{,1,224,256,384,512}sum shar sort split strip tac tail tee \
    texindex touch tr uname unexpand uniq units vdir wc wget who; do
    have $i && complete -F _longopt -o default $i
done

みたいな for 文が見つかると思います.
ざっと見た感じ,ここに列挙されているコマンドは,他のコマンドとは別の補完機能を使うようにしているようです.
この「別の補完機能」が(個人的には)気持ち悪いんですね.

というわけで,ディレクトリ補完を気持よくしたいコマンドを for 文から取り除きます.
自分は,ディレクトリ引数を取りそうなよく使うコマンド, awk,cat,cp,df,diff,du,env,gperf,gprof,grep,head,less,ln,ls,mkdir,mv,objdump,patch,rm,rmdir,sort,tail,touch,uniq,wc,wget
を除外しました.

for i in a2ps bash bc bison colordiff csplit \
    curl cut date dir du enscript expand fmt fold \
    grub indent irb ld ldd m4 md5sum mkfifo mknod \
    netstat nl nm objcopy od paste pr ptx \
    seq sha{,1,224,256,384,512}sum shar split strip tac tee \
    texindex tr uname unexpand units vdir who; do
    have $i && complete -F _longopt -o default $i
done

これで気持ちのよい補完生活が戻りました.

2011/09/29 追記

上記の記事では消極的に使用しそうなコマンドだけ取り除いていましたが,
該当部分を全てコメントアウトでも問題ないようです.
現在は,

# makeinfo and texi2dvi are defined elsewhere.
#for i in a2ps awk bash bc bison cat colordiff cp csplit \
#    curl cut date df diff dir du enscript env expand fmt fold gperf gprof \
#    grep grub head indent irb ld ldd less ln ls m4 md5sum mkdir mkfifo mknod \
#    mv netstat nl nm objcopy objdump od paste patch pr ptx readelf rm rmdir \
#    sed seq sha{,1,224,256,384,512}sum shar sort split strip tac tail tee \
#    texindex touch tr uname unexpand uniq units vdir wc wget who; do
#    have $i && complete -F _longopt -o default $i
#done
#unset i

という風にコメントアウトして使っています.

また,http://d.hatena.ne.jp/TrinityT/20110702/1309509133 のようなよりお手軽な方法もあるようです.