zsh でワンライナーを手早く呼び出し実行する

  • 30
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

たまにパイプを繋いでいくうちに長いコマンドになってしまうことがある。

$ cat ~/.bash_history | sort | uniq -c | sort -nr

安直な例だが上記のような感じ。

たいていこのような場合、こんなワンライナーはエイリアスに登録することもなくその場は終わるが、数日後・数週間後・数カ月後かにもう一度実行したいと思うことがある。そんなときは「前にワンライナー作ったぞ…」と記憶をたどり、C-rをおもむろにタイプする。よくあるコマンドライン風景である。

たまに困ったことに遭遇する。履歴から消えていることだ。ヒストリサイズの上限に来たからなのか、tmux などのターミナルマルチプレクサを使っていて別プロセスから履歴にアクセスしてうまいことできずに消えてしまったとか、要因はいろいろある。必ずしも消えていることはないにしろ、控えめに言っても履歴をたどる際の UI はいいものではない。だから以下のようなハックが生まれたんだと思う。

このヒストリと peco の話はたくさんヒットする。

今回この記事ではこれとは別アプローチでライフチェンジングな方法を紹介する。

Easy-Oneliner

easy-oneliner を使うと簡単にワンライナーの登録/削除ができ、fzf(peco みたいなやつ)で選択して実行できる。デフォルトでは C-xC-x で fzf による UI が立ち上がるので、そこで選択してエンターすれば、コマンドライン上に乗る。

fzf 上で C-v を押すと、エディタが立ち上がり、ワンライナーの追加や削除、編集が簡単にできるようになっている。また、ワンライナーを登録しているファイル内で特殊な意味を持つシンボルがあり、@ マークはカーソル位置を指定でき、 # でコメントを書くことができる。

特殊なシンボルなどが使えるため、easy-oneliner はちょっとした文法を受け付ける。詳細や書き方のサンプルはテンプレートのワンライナーファイルを見てほしい。

https://github.com/b4b4r07/easy-oneliner/blob/master/easy-oneliner.txt

# ワンライナーお手軽実行するためのファイル
#
# {書き方}
#     (例)
#          [これはワンライナーです] oneliner | some-command | other-command
#
#     []のなかにそのワンライナーの説明を書きます(省いても構いません)
#     []の後ろに1つ以上のスペースをあけてワンライナーを書きます
#
# {@マークについて}
#     ワンライナー中に@マークを1つだけ記述することができます
#     実行時にその@マークの位置にカーソルが置かれます
#
# {!マークについて}
#     ワンライナーの行末に!マークを置くと、ワンライナーが即座に実行されます
#
# {#マークについて}
#     2種類の使用方法があります
#     行頭に置かれた場合、その行はfzfに表示されません
#     行中に置いた場合、それ以降をコメントとみなし黒色表示します
#     ただし、後者の場合#マークの前後にスペースを必要とします
#
# {:マークについて}
#     セクションごとのタイトルに最適です
#     シェルが無視してくれる記号には#と:があります
#     #は行頭にあるとfzfが無視しますが、:は問題無いです

インストールは zplug を使うと簡単にできる。

zplug "b4b4r07/easy-oneliner", if:"which fzf"

easy-oneliner は fzf に依存しているため、fzf がない人は以下のようにすれば fzf のインストールも済ませることができる。

zplug "junegunn/fzf-bin", \
    as:command, \
    file:fzf, \
    from:gh-r \
    | zplug "b4b4r07/easy-oneliner"

zplug install && zplug load を済ませ、C-xC-x とするとすぐさま使えるようになる。

むすび

ちょっとしたライフチェンジングでした。

この投稿は zsh Advent Calendar 201514日目の記事です。