関西アンカンファレンスで zsh について発表してきた

12/19(土) 関西アンカンファレンスが開かれた(告知ページ)。

発表テーマは何でも良さそうなので、僕は大好きな zsh について発表した。なんか勢いで2回発表してきた。これも愛。

発表資料

発表資料はこんな感じ。

まあその資料は飾りで、後は実際に使いながら zsh のスーパーさを広めてきた。発表内容は以下。

zsh の補完機能

なんと言っても zsh は補完機能が強力。以下の2行を ~/.zshrc に書いておこう。

autoload -U compinit
compinit

source ~/.zshrc かログインし直すかで補完機能が有効になる。

特に補完が便利な例として以下を紹介。

cd

ディレクトリのみを補完

grep

--with-filename --recursive とか長いオプションを補完。

man

man のページ名を補完。

kill

kill less<TAB>kill 5389 みたいな感じで、プロセス名をプロセスIDに展開。

find

find -name の name とか -type の d とか、とにかく補完。

tar

tar xzf の場合は tar.gz なファイルのみ、xjf の場合は tar.bz2 のファイルのみ補完。

chmod

chmod 644 の場合はすでに644なファイルは補完しない。

git

git commit とか git diff とかコマンド名を補完。git checkout の後はブランチ名を補完。git diff のあとは --ignore-space-change とか diff のオプションを補完。

svn

svn add の add とかコマンド名を補完。add の後はすでに add されているファイルは補完しない。

補完に関しては以上。とにかくタブを押しまくれ。

zsh コマンドライン編集

たいていのシェルは emacs 風のコマンドライン編集できる。^K で行末まで削除とか。zsh はそのコマンドライン編集も強力。

まずはキーバインドの種類を選択しておこう。

# キーバインドの選択
bindkey -e   # emacs風
# bindkey -v # vi風

僕は emacs 風を使用してる。vi 風を選んだ場合はここに書いてあることがそのまま動かないかもしれない。

undo, redo

たいていのエディタでは undo, redo 機能あるよね。もちろん zsh にもあります。こんな感じで ~/.zshrc に書いておこう。

bindkey "^[u" undo
bindkey "^[r" redo

^[u ってのは Meta U のこと。Escape を押した後 u または Alt を押しながら u で入力する。

実は undo はデフォルトで ^Xu (Control-X の後 u)にわりあてられてるんだけど、押しにくいので変更した。この辺は適当に調整しよう。

ヒストリ検索

^R でインクリメンタルに履歴から検索、ってのは bash にもある機能。当然 zsh はその上を行かなければならない。

bindkey '^R' history-incremental-pattern-search-backward

こうやっておけば、^R で検索するときに *ワイルドカードが使えるようになる。

でもこれは最近のバージョンでないと使えないかもしれない。僕はバージョン 4.3.9 で確認した。

一つ前のコマンドの最後の単語を挿入

mkdir した後そのディレクトリに cd したくなることありませんか。そういうのも zsh でスマートに解決。これを .zshrc に書いておこう。

autoload smart-insert-last-word
zle -N insert-last-word smart-insert-last-word
zstyle :insert-last-word match '*([^[:space:]][[:alpha:]/\\]|[[:alpha:]/\\][^[:space:]])*'
bindkey '^]' insert-last-word  # ここはお好みの割り当てにする

使い方はこんな感じ。

% mkdir dir1
# さっき作ったディレクトリに移動したい
% cd        # ここで ^] を押す
% cd dir1   # 一つ前のコマンドの最後の単語が挿入される

さらに、1文字だけの単語は除いて、2文字以上の単語だけを挿入する設定になっている。使い方の例。

% ls /usr/bin L
# さっき見たディレクトリに移動したい
% cd           # ここで ^] を押す
% cd /usr/bin  # 最後の単語が挿入される。L は出てこない。

便利。

一発で単語を " で囲む

*.txt とかを " で囲みたいことあるよね。そんなときはこれを .zshrc に書いておこう。

autoload -U modify-current-argument
# シングルクォート用
_quote-previous-word-in-single() {
    modify-current-argument '${(qq)${(Q)ARG}}'
    zle vi-forward-blank-word
}
zle -N _quote-previous-word-in-single
bindkey '^[s' _quote-previous-word-in-single

# ダブルクォート用
_quote-previous-word-in-double() {
    modify-current-argument '${(qqq)${(Q)ARG}}'
    zle vi-forward-blank-word
}
zle -N _quote-previous-word-in-double
bindkey '^[d' _quote-previous-word-in-double

使い方。

find . -name *.txt     # ここで Escape のあと s
find . -name '*.txt'   # ' で囲まれる
                       #  さらに Escape のあと d
find . -name "*.txt"   # ' が " に変わる

^[s, ^[d の部分は押しやすいキーに変更しよう。

こんな感じで、コマンドライン編集も超かしこい。これはもはやひとつのエディタだ。

リンク

最後に、参考になるページのリンク。

以前僕が書いたブログ記事。今日みたいな感じで zsh の基本について一通り押さえてある。入門用の記事。

で、こっちが簡単な設定ファイルの例。初めての人はこの辺から押さえていけばいいと思うよ。

マイコミジャーナルの連載記事。ちょっと古いけど(連載開始は2007年)、これを読めばたいていの機能は使えるようになる。

僕の zsh 設定ファイル。Github で公開してる。こっちがメインの設定ファイル。

僕の zsh 設定ファイル。zshenv の方。こっちが補助的な設定ファイルで、主に PATH の設定をする。

僕のブログの zsh 記事一覧。

あと、僕以外の発表者一覧はこんな感じ。みなさん、ありがとうございました。