Lambdaカクテル

京都在住Webエンジニアの日記です

Zshテクニック: 入力中のコマンド列の最後に出現する引数のdirname部だけ再入力する

こういうことがやりたいことがある:

# ↓全く同じディレクトリまでサクッと入力してほしい
$ コマンド /foo/bar/hoge/piyo.txt /foo/bar/hoge/qux.txt 

どこか別のディレクトリにあるファイルを,同じディレクトリのどこかに移動したりコピーしたり,といったことはけっこう頻繁に発生する。

しかしながら毎回これをやるにはパスを毎回入力しなければならず困っていた。

!#$:h

これを解消するのが!#$:hである。例えば以下のようにプロンプトで入力しているとき(|はカーソル):

$ cp /foo/bar/hoge/piyo.txt |

!#$:hと入力してタブを入力すると,直前に入力していた引数のディレクトリまでを入力してくれる。

$ cp /foo/bar/hoge/piyo.txt /foo/bar/hoge/|

これはヒストリ展開機能を使って実現されている。

!#

これは入力中のコマンド列に対して操作するということを指示している。

この時点でtabを入力すると入力中のコマンド列がそのままもう一度入力される。

ちなみに!!は直前のヒストリが対象になる。

この機能はhistory expansionという機能。ヒストリ中の特定のコマンド列を指定するので,event designatorと呼ばれる機能である。

$

コマンド列の最後の引数に対して操作するということを指示している。

この時点でtabを入力すると入力中のコマンド列の最後の引数が入力される。

コマンド列中のwordを指定することができるためword designatorと呼ばれる。

:h

展開した対象のディレクトリ部分だけを入力することを指示する。dirnameを適用するのと同じ。

expansionの結果を操作するのでmodifiersと呼ばれる機能で,word designatorに後置することで使える。コロン+英字で1つのmodifierになる。

zshのexpansionという機能です

zsh.sourceforge.net

これはzshのexpansionという機能を使って実現している。

まとめ

zshのexpansion機能を使って,便利に入力中の引数をいい感じに入力することができるようになりました。