zsh tips
zsh 組み込みコマンドについて調べる
man zshbuiltins
を読む。
拡張 glob を使う
zsh の拡張 glob を使うには、~/.zshrcに
setopt extended_glob
と書いておく。
ls *(^/)
ls *(*)
ls *(x)
ls *~*.txt
とすると、それぞれ
- ディレクトリを除くファイル
- ディレクトリを除く実行形式のファイル
- 実行形式のファイル
- *.txt に当てはまるファイルを除いたファイル
を表す。
ディレクトリ内のファイルに対してコマンドを繰り返す
for file in *.zip
do
unzip $file
done
とすると、カレントディレクトリの zip ファイルを 順に解凍していく。
実行前のコマンドを一時的に保存する(コマンドラインスタック)
端末でコマンドを入力しているときに、 そのコマンドを実行する前に別のコマンドを実行したくなることがある。 zshではそういうときに「Alt + q」を押すと 入力途中のコマンドを一時的に保存してくれる。 別のコマンドを実行すると保存してあった入力が 挿入される。
自動ヘルプでコマンドを調べる
コマンドを途中まで打った状態、たとえば
ls dir
で「Alt + h」を押すと man が起動してヘルプを見ることができる。 ヘルプを見終えるとコマンド入力途中の
ls dir
に戻る。
ファイル名を操作する
拡張子の部分を取り出すには
f=filenam.txt
echo $f:e
とする。また、拡張子の部分を取り除くには
echo $f:r
とする。ディレクトリの部分を取り除くには
f=dir/filenam.txt
echo $f:t
とする。
変数を置換する
http://d.hatena.ne.jp/meitetujikokuhyou/20090410/1239366777 の bash の場合と 同じようにできる。
for f in *01.txt
echo ${f/01.txt/10.txt}
zsh 実行時に detached な screen があれば attach する
ssh で接続したときに detach した screen があれば作業を続けるのに attach する。 この処理を自動化するのに、私は次を .zshrc に書いて利用している。
# Attache screen
if [ -z "$STY" ] && ( ! expr $TERM : "^screen" > /dev/null ) && which screen > /dev/null; then
screen -q -ls
num=$?
if [ $num -eq 9 ]; then
screen
elif [ $num -gt 10 ]; then
detached=`screen -ls | grep -e '(Detached)' | head -n 1`
if [ -n "$detached" ]; then
screen -r `echo $detached | sed -e "s/\..*$//g"`
else
screen -ls
fi
fi
fi
screen が存在しなければ自動で実行する、 screen が存在していて attach されていなければ attach する。 また、すでに screen が attach されていれば、 別の screen を実行することも detach して attach することもしない。
mlterm の OPEN_PTY で zsh を起動する
環境変数 SHELL を zsh にして起動する。 たとえば次のようなファイルを mlterm_zsh という名前で保存し、実行権限を与えておく。
#!/bin/sh
SHELL=zsh exec mlterm --meta=esc --metakey=alt
gnome のランチャでおなじようにするには、次のコマンドを使う。
env SHELL=zsh mlterm --meta=esc --metakey=alt
ウィンドウのタイトルを変更する
端末が xterm、rxvt もしくは tmux を使っているときに ウィンドウのタイトルをコマンドで変更するには 次のような関数を使う。
function window-title-change {
if [ -n "$TMUX" ]; then
echo "hello"
tmux set-option set-titles on
tmux set-option set-titles-string $*
elif [ "$TERM" = "xterm" -o "$TERM":"rxvt*" ] ; then
printf '\033]2;'$*'\07'
else
echo "Can not change window title."
fi
}
http://fixunix.com/xwindows/91525-want-change-title-rxvt-terminal-cygwin.html を参考にした。