関西アンカンファレンスで zsh について発表してきた
12/19(土) 関西アンカンファレンスが開かれた(告知ページ)。
発表テーマは何でも良さそうなので、僕は大好きな zsh について発表した。なんか勢いで2回発表してきた。これも愛。
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 のオプションを補完。
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 記事一覧。
あと、僕以外の発表者一覧はこんな感じ。みなさん、ありがとうございました。