D.

zsh の自動インクリメンタル補完が素晴らしい件。

これはまさに Life Changing だ。 zsh で自動的にインクリメンタル補完をしてくれる。いままで Tab キーを入力して手動で補完していたのだがそれを自動でやってくれる。


Incremental completion on zsh
http://mimosa-pudica.net/zsh-incremental.html


以下のブログで紹介されている。
http://d.hatena.ne.jp/seiunsky/20110519/1305764493

導入

ダウンロード
curl -O -L http://mimosa-pudica.net/src/incr-0.2.zsh
test -d ~/.zsh/plugin || mkdir -p ~/.zsh/plugin
mv incr-0.2.zsh ~/.zsh/plugin
.zshrc で読み込む
load_plugins() {
    if [ -d ~/.zsh/plugin ]; then
        source ~/.zsh/plugin/*
    fi
}

main() {
    load_plugins
}

課題

試したところ個人的に 2 点気になるところがあった。

エスケープシーケンスがうまく効かない。

環境によってはエスケープシーケンスが効かないようなので、以下のようにパッチを当てた。

85d84
<               echo -n "\e[32m"
91,95d89
< function preexec
< {
<       echo -n "\e[39m"
< }
<
ssh 構文の補完で相手先ホストに大量の接続要求をしてしまう。

たとえば以下のようなコマンドを打つ場合。

rsync -avz hoge user@host:~/Documents/

相手先のホストで一定時間内の ssh の接続回数を制限していた場合などに、コマンドを途中まで打つだけで BAN されてしまう。


これについては回避方法がいまのところ思いつかないので良い案が欲しいところ。

5/22 22:47 追記

以下のように特定のコマンドを自動補完対象外にすることで解決した。

@@ -20,6 +20,7 @@ bindkey -M emacs '^i' expand-or-complete-prefix-incr
 
 unsetopt automenu
 compdef -d scp
+compdef -d rsync
 compdef -d tar
 compdef -d make
 compdef -d java