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 を参考にした。

リンク

Tags of current page

,