読者です 読者をやめる 読者になる 読者になる

作業ノート

様々なまとめ、雑感など

zshの本を読む(2) - ヒストリー

zshのヒストリー機能について。

ヒストリー展開

文字列に一致する直近のヒストリー。

$ ls /usr      
bin/  games/  include/	lib/  local/  sbin/  share/  src/
$ ls /usr/local
bin/  etc/  games/  include/  lib/  man@  sbin/  share/  src/
$ !ls
ls /usr/local
bin/  etc/  games/  include/  lib/  man@  sbin/  share/  src/
$ 

ヒストリーの一覧を見たい場合は、fc -lで。

$ pwd
/home/zsh_test
$ ls /usr
bin/  games/  include/     lib/  local/  sbin/  share/  src/
$ fc -l
  165  pwd
  166  ls /usr
$ !165
pwd
/home/zsh_test
$ !-3

対象を相対的に指定する。

$ pwd
/home/zsh_test
$ ls /usr
bin/  games/  include/     lib/  local/  sbin/  share/  src/
$ !-2
pwd
/home/zsh_test
$ 

現在のコマンドラインで、直前まで入力した項目を繰り返す。

$ echo foo !#
echo foo echo foo
foo echo foo
$ 
展開ヒストリーの引数

コマンドの実行では、必要に応じてそのコマンドに引数を与える。
ヒストリーとしてはそれらを全て保持するが、ヒストリー展開をするときに特定の引数を指定することができる。

最初の引数を表示する。

$ echo foo "bar baz" hoge
foo bar baz hoge
$ echo !echo:^
echo foo
foo
$ 

2つめの引数を表示する。

$ echo foo "bar baz" hoge
foo bar baz hoge
$ echo !echo:2
echo "bar baz"
bar baz
$ 

最後の引数を表示する。

$ echo foo "bar baz" hoge
foo bar baz hoge
$ echo !echo:$
echo hoge
hoge
$ 

全ての引数を表示する。

$ echo foo "bar baz" hoge
foo bar baz hoge
$ echo !echo:*
echo foo "bar baz" hoge
foo bar baz hoge
$ 

2つめ以降の引数を表示する。

$ echo foo "bar baz" hoge
foo bar baz hoge
$ echo !echo:2*
echo "bar baz" hoge
bar baz hoge
$ 

1つ目からN-1までの引数を表示する。(Nは引数の数。この場合、N=3)

$ echo foo "bar baz" hoge
foo bar baz hoge
$ echo !echo:1-
echo foo "bar baz"
foo bar baz
$ 
ヒストリー編集子

ヒストリーを一部編集して展開することもできる。

直前の最後の引数から親ディレクトリのパスを取得する。(dirname /usr/local/bin/の結果と同じ)

$ ls /usr/local/bin     
$ echo !!:$:h     
echo /usr/local
/usr/local
$ 

直前の最後の引数から末尾のパス名を取得する。(basename /usr/local/bin/の結果と同じ)

$ ls /usr/local/bin
$ echo !!:$:t
echo bin
bin
$ 

直前の最後の引数から拡張子を取り除いて表示する。

$ ls /etc/apache2/httpd.conf
/etc/apache2/httpd.conf
$ echo !$:r
echo /etc/apache2/httpd
/etc/apache2/httpd
$ 

直前の最後の引数から拡張子のみを表示する。

$ ls /etc/apache2/httpd.conf
/etc/apache2/httpd.conf
$ echo !$:e
echo conf
conf
$ 
その他

上述の展開処理は、bashでも利用できる。ただし、拡張子のみを表示するeの挙動が異なる。
bashの場合は拡張子の前のドットが含まれる。

$ ls /etc/apache2/httpd.conf 
/etc/apache2/httpd.conf
$ echo !$:e
echo .conf
.conf
$ 

zshでは、ヒストリーの展開子や編集子を入力したあとにTabを押すと、その時点で展開される。
以下の場合、!$を入力した後にTabボタンを押すと、/usr/local/binに展開される。

$ ls /usr/local/bin
$ ls !$                              # Tabを押すと、 $ ls /usr/local/bin と変換される

参考

zshの本 (エッセンシャルソフトウェアガイドブック)

zshの本 (エッセンシャルソフトウェアガイドブック)