zsh覚え書き
Tabでファイルグロブを展開
ama-ch% echo *~ # ~で終わるファイルを確認 fudemame.py~ maimiku_search.py~ mymixi_diary.py~ output.txt~ search_diary.py~ test.py~ twitter-notifier.py~ ama-ch% rm *~ # ここでTabを押すと・・・ ama-ch% # ↓こうなるので、実行前に対象ファイルが確認できる! ama-ch% rm fudemame.py~ maimiku_search.py~ mymixi_diary.py~ output.txt~ search_diary.py~ test.py~ twitter-notifier.py~
グロビング
再帰的にディレクトリを掘るワイルドカード
**で、現在位置より下のディレクトリを再帰的に走査するワイルドカードの指定ができる。
例えばホームディレクトリ以下のどこかにある「new.jpg」というファイルを探す場合、普通は
% find . -name new.jpg -print [~]
./python/python-challenge/new.jpg
こんな感じだけど、**を使うと
% ls **/new.jpg [~] python/python-challenge/new.jpg
このように見つけることができる。
さすがにホームディレクトリから再帰的に掘ると時間がかかりますが><
ファイル属性によるグロビング
ワイルドカードに続けて(パターン)を指定することで、マッチする属性を制限できる。
chmod 755 *(/) # 全てのディレクトリのパーミッションを 755 に chmod 644 *(^/) # ディレクトリ以外の全ファイルのパーミッションを 644 に
以下のような指定ができる。
/:ディレクトリ @:シムリンク .:通常ファイル ^:否定 *:ディレクトリでない実行権のあるファイル r:読み込み権のあるファイル w:書き込み権のあるファイル x:実行権のあるファイル R:他人に読み込み権のあるファイル W:他人に書き込み権のあるファイル X:他人に実行権のあるファイル f値:値で指定したアクセス権のファイル U:自分が所有するファイル G:自分が所属するグループのファイル u値:値のユーザが所有するファイル g値:値のグループが所有するファイル s:setuidされたファイル -:次の指定にシンボリックリンクを含む =:ソケット p:名前付きパイプ(FIFO) ^:それ以降の指定の否定
拡張グロブ
setopt extended_glob
これを設定すると、以下の拡張グロブが利用できる。
less *.txt~memo.txt # memo.txt 以外の *.txt にマッチ rm *~POSCAR*~INCAR~KPOINTS~POTCAR # vaspの入力ファイル以外の出力ファイルを全て消す
ls ^*.txt # .txtで終わるファイル以外全て rm ^(POSCAR*|INCAR|KPOINTS|POTCAR) # 「rm *~POSCAR*~INCAR~KPOINTS~POTCAR」と等価
ファイルグロブがどのように展開されるかは、Tab以外に以下の方法で確認できる。
C-x g # ファイルグロブがどう展開されるのか確認
グルーピング
ls *.(sh|txt) # 拡張子部分が「sh または txt」のもの ls <10-15>* # 10〜15の範囲の数字から始まるもの ls *<->* # 数字が省略されたら<最小の数-最大の数>でマッチする。この場合は「任意の数字を含むもの」
連番生成
echo {1..10} # 「1 2 3 4 5 6 7 8 9 10」に展開 echo {01..10} # 「01 02 03 04 05 06 07 08 09 10」に展開
連番のファイルを作ってみます。
ama-ch% for i in {01..10} [~] for% do for% touch number$i for% done ama-ch% ls number* [~] number01 number02 number03 number04 number05 number06 number07 number08 number09 number10
簡単だ!
連続文字列
以下の設定で、アルファベットの展開もできるようになる。
# {a-c} を a b c に展開できるようにする setopt brace_ccl
実験してみる。
ama-ch% echo {a-c} [~] a b c ama-ch% echo {c-a} [~] a c ama-ch% echo {a-Z} [~] Z a ama-ch% echo {1-3} [~] 1 2 3 ama-ch% echo {a-c1-3} [~] 1 2 3 a b c
ふむふむ。
コマンドラインスタック
ESC-q M-q
と打つと、現在入力中のコマンドを一旦スタックに積み、コマンドラインが消える。そこで新たなコマンドを入力・実行すると、さきほどスタックに積んだコマンドラインが復帰する。
ama-ch% ls /opt/local/bin/ # ここでESC-qを押す ama-ch% cd ~ # コマンドラインが消え、新たにコマンドを入力 ama-ch% ls /opt/local/bin/ # さきほどのコマンドが復帰する
manページの呼び出し
ESC-h M-h
入力中のコマンドについてmanページを表示する。man参照後、コマンドラインが復帰する。
man=jmanとエイリアスを作成すると日本語manが参照できるようになるが、Mac OS Xにはデフォルトでjmanが入っていない。
Mac OS X を UNIX 的に使う - hiroto sakai's site
こちらでjmanとmanページ集をダウンロードしインストールすると、jmanの機能が使えるようになる。manページ集もダウンロードしないと、jmanで参照できるコマンドが全然ありません!
インストールしたら、以下のエイリアスで日本語マニュアルが参照できる。
# 日本語マニュアルを参照(via. http://www.fan.gr.jp/~sakai/unix.php) alias man=jman
キーバインド
現在のキーバインドの一覧表示は、
ama-ch% bindkey -L
で確認できる。
特定のキーバインド設定を探すなら、こんな感じで。
ama-ch% bindkey -L | grep undo [~] bindkey "^X^U" undo bindkey "^Xu" undo bindkey "^_" undo
C-/をundoにしたくて色々調べてみたんだけど、結局分からなかった><
# Emacsライクキーバインド設定 bindkey -e
これでEmacs風のキーバインドになる。さらに以下も追加すると良い感じ。
bindkey "^U" universal-argument
これでEmacs使いならよく使うC-uの機能を使える。
グローバルエイリアス
# グローバルエイリアス alias -g G='| grep' alias -g L='| less' alias -g P='| pbcopy'
設定しているのはこんなもん。最後のpbcopyはMac OS X固有のコマンドで、入力をクリップボードにコピーするコマンド。
補完
# 補完候補を矢印キーで選択 zstyle ':completion:*:default' menu select=1
これを設定しておくと、Tabで表示した補完候補を矢印キーで移動・選択できるようになる。
Tab連打じゃ遠いなという時に便利。
おわり
殴り書きみたいになってしまった><