カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

zshの自動補完とその例としてのIPアドレス/hostname補完

引越しも終わり、少しずつ落ち着いてきた@masudaKです。今日は、zshという究極のシェルについて、簡単に至極簡単に述べてみたいと思います。

zshに関して何がすごいのかを知りたい場合は後藤さんの記事をひと通り読むのがよいでしょう。24回までありますので、ひと通り読めばzshとは何かを知ることができるかと思います。

詳しい記事は至るところに書かれていますので、ここで言いたいのは一つだけ。


入力する回数を減らせる

ということだけです。同僚とシェルの話になったりして、zshって何がいいのと言われたりするのですが、自分がその利点を伝えるとすれば、「入力する回数が減る」ということに尽きるかと思います。

実例

簡単に実例を示しましょう。

# まずzshがインストールされてるか調べる。コマンドは以下のをどれか打って、パスとかパッケージ情報出ればOK。
$ which zsh
$ yum info zsh
$ rpm -qa | grep -i zsh

# んで、インストールされたら、$HOME/.zshrcに以下のように記述する
autoload -U compinit && compinit

# んで、読みなおす
$ source ~/.zshrc

これで自動補完が有効になります。あとは以下のように叩いてみましょう。

% ls ~/[tab]

[tab]の箇所で「タブ」キーを入力します。そうすると、以下のように補完候補が表示されます。

% ls ~/[tab]
dotfiles/              local/                 repos/                 tmux-client-30892.log  tmux-server-30894.log  work/

このように候補が表示されて、あとはタブキーを使って補完候補を入力していくことになります。

応用例

それでは応用をしてみましょう。 以下のように$HOME/.zshrcに書きます。

autoload -U compinit && compinit

function print_known_hosts (){
    if [ -f $HOME/.ssh/known_hosts ]; then
        cat $HOME/.ssh/known_hosts | tr ',' ' ' | cut -d' ' -f1
    fi
}
_cache_hosts=($( print_known_hosts ))

そして、再度sourceコマンドで読みなおして、以下のように入力します。

% ssh 1[tab]

そうすると、以下のように候補表示されます。

% ssh 192.168.1.
192.168.1.1  192.168.1.2  192.168.1.3  192.168.1.4

このようにIPアドレスが補完候補として表示されました。

print_known_hosts関数内でcatしてるワンライナーは別にperlでもどんなものでも構いません。それを_cache_hostsという変数にぶちこんでるだけです。
この部分は@bulkneetsさんの
zshでsshのホスト名をknown_hostsから補完する - C0mputerClub - Trashbox
参照すべし)

そして、更に応用する

あとは、上記の説明でタブキーを入力していた部分を自動化してみましょう。
以下の行を$HOME/.zshrcに追記します。

autoload -U predict-on && predict-on

これでsourceコマンドで読み直しをして、再度sshコマンド何度か打ってもらえれば自動補完されるようになり、タブキーを押した時点で、全て入力された状況になります。

必要であれば、$HOME/.ssh/config使って、hostnameに置き換えてもいいでしょう。

終わりに

sshの接続先のアドレスなんて、一日どれだけ入力するかわからないですが、ユーザ名とかIPアドレスを入力する時間はすごくもったいないですし、設定も難しくないので、上述したような設定を入れておくと楽でしょう。

もちろん、bashでも補完はできますし、Ctrl+rを使えば過去の履歴から打ったコマンドを辿ることもできます。なので、bashで不都合すぎるというわけではありません。単に、まだ自動化できる要素があり、zshはそこを突き詰めていき、それが個人的には便利であると感じてるだけです。

色々ずらずらと述べましたが、このように補完、しいては自動補完を使うことで、入力回数を減らすことができ、タイプのスピードもあがるため、より流れるように作業しやすい感覚があります。最もよく作業する環境ではzshと自分にあった独自の設定は欠かせないと思います。

良さそうと思った方は是非導入してみてください。


P.S.
この記事は、zsh Advent Calendar 2012の記事を補うような意味で書きました。zshにあまり触れたことがない人向けの補足記事であります。zshいいですよzsh。