はてブロ@ama_ch

https://twitter.com/ama_ch

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~ 
グロビング

参考:UNIX今日の技 - UNIX今日の技/zsh

再帰的にディレクトリを掘るワイルドカード

**で、現在位置より下のディレクトリを再帰的に走査するワイルドカードの指定ができる。
例えばホームディレクトリ以下のどこかにある「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 *<->*        # 数字が省略されたら<最小の数-最大の数>でマッチする。この場合は「任意の数字を含むもの」

でm〜nの数が指定できるのかぁ。

連番生成
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連打じゃ遠いなという時に便利。

おわり

殴り書きみたいになってしまった><