ヒストリとか

^P連打してる感がひどいので少し本(zshの本 (エッセンシャルソフトウェアガイドブック) )を読んだ.もう連打しない.
本だと3章周辺.色々出来るみたいだけど覚えられないので大分端折ってメモった.
あとcshとかでも大体同じ感じで使えるらしい.

ヒストリとイベント

  • イベント: 記憶されているコマンドライン
  • ヒストリ(または履歴): イベントの集合

入力されたコマンドラインはヒストリにイベントとして記憶される.

% date
% ls -F /usr/bin/
% echo This is a pen

fc -lでヒストリをリストとして表示

% fc -l
 1 date
 2 ls -F /usr/bin/
 3 echo This is a pen.

ヒストリ展開

!を使うとヒストリからイベントを呼び出してコマンドラインに展開できる.

数値による指定
  • !N …Nは整数.N番のイベントを呼び出す.番号はfc -lでリスト表示したとき左についてるやつ.
    • !2 → ls -F /usr/bin/
  • !-N …N行前のコマンドライン呼び出し.ヒストリリストの並びとは違うので注意.^Pや↑をN回叩いたのと同じ.
    • !-1 → echo This is a pen. (先に!2を入力していればls -F /usr/bin/)

ヒストリ展開を含むコマンドを入力し,リターンキーを叩くとイベントが展開された上で実行される.設定によってはスペースキーやTabキーを叩くとその場で展開される.以下のヒストリ展開でも同様.単体で使う必要はなく,コマンドライン中に混ぜたり複数回使ったりできる.

文字列による指定
  • !string …文字列stringに前方一致するイベントを呼び出す
  • !?string? …文字列stringに部分一致するイベントを呼び出す

!{string}foo というように{}で文字列を括るとstringのみが展開に使われ,残りの文字fooは展開結果にそのままくっつく.

その他
  • !! …直前のコマンドライン
    • 一つ前にecho fooと入力していた時,!! !!→echo foo echo foo
  • !# …そのコマンドラインでそれまでに入力したもの
    • echo !# !# → echo echo echo echo (最初の!#はechoに,次の!#はecho echoに展開されている)

とりあえずここまで覚えておけば^Pとか連打しなくて済む感じ.以下呼び出す部分限定したりいじったりしたいとき.

引数の選択

$ echo hoge piyo fuga "hoge piyo"

このとき,

  • echo: 第0引数
  • hoge: 第1引数
  • piyo: 第2引数
  • fuga: 第3引数
  • "hoge piyo": 第4引数

といった具合に番号が振られる.そして,

[イベント選択]:[引数選択]

のようにイベント選択に続いてコロンを入力し,その後に引数を選択する指定子を入力できる.

数値による指定
  • N …第N引数
    • !echo:2 → piyo
  • M-N …第Mから第N引数まで全て
    • !echo:1-3 → hoge piyo fuga
ほか
  • * …第0引数を除く全て
  • N* …第N引数から最後まで全て

ヒストリ編集子

イベント選択(+引数選択)で取り出したイベントにさらに

[イベント選択](:[引数選択]):[ヒストリ編集子]

といった具合で編集子を加えると取り出されたイベントをいくらか編集できる.

  • h …取り出された部分がパスのとき,ファイル名を除いたディレクトリ名部分だけ取り出す
    • /usr/local/foo.bar → /usr/local
  • t …パスからファイル名
    • /usr/local/foo.bar → foo.bar
  • r …拡張子を除いた部分
    • foo.bar → foo
  • e …拡張子だけ
    • foo.bar → bar

s/hoge/fuga/みたいな置換もできる.この辺の編集子は引数を展開するときにも同じ感じで使えるので覚えておいた方がよさげ.