LoginSignup
34
34

More than 5 years have passed since last update.

zshとpecoでワンライナー呼び出し

Last updated at Posted at 2014-06-29

動機

  • zsh + pecoによるヒストリ呼び出しが便利
  • 呼び出したヒストリを編集して使い回す という作業を何度かやってる内に、ワンライナーをテンプレート管理して呼び出しても便利な気がしてきた
  • 棲み分けとしては下記のようなケースを想定
    • ヒストリ呼び出し
      • 過去と全く同じコマンドを叩く
      • 過去と全く同じではないが編集箇所が少ないコマンドを叩く
      • 叩く頻度もそこそこ高い
    • ワンライナー呼び出し
      • ヒストリ呼び出して使い回そうとすると編集箇所が結構多い
      • 何をやるコマンドだったかよく覚えてない
      • たまにしか叩かないけど便利なコマンド
  • 「たまに叩く」「よく覚えてない」の気休め的対策として、コメントも残して管理出来ればベター

作るもの

  • ワンライナーを可変パラメータを含めて登録
  • 登録したワンライナーをpeco経由で呼び出し
  • 呼び出したワンライナーの可変パラメータ部分を実際の内容に置き換えて実行

動作確認環境

  • CentOS 6.5
  • zsh 4.3.10

準備

  • .zshrcに下記設定を追加
.zshrc
ONELINER_DIR=~/.oneliner
ONELINER_TXT=${ONELINER_DIR}/oneliner.txt
ONELINER_PARAM_MARKER_PREFIX="%%"

# ワンライナー登録
function _insert-oneliner() {
  autoload -Uz read-from-minibuffer
  read-from-minibuffer "Insert oneliner comment:"
  if [ -n ${REPLY} ]
  then
    if [ ! -d ${ONELINER_DIR} ]
    then
      mkdir ${ONELINER_DIR}
    fi
    echo ${BUFFER}"\t#"${REPLY} >> ${ONELINER_TXT}
    zle -M "Inserted \"${BUFFER}\" >> ${ONELINER_TXT}"
  fi
}
zle -N _insert-oneliner
bindkey "^[i" _insert-oneliner

# pecoで選択したonelinerコマンドを表示
function peco-search-oneliner() {
  BUFFER=$(cat ${ONELINER_TXT} | sort | peco | awk -F"\t" '{print $1}')
  zle clear-screen
  zle beginning-of-line
}
zle -N peco-search-oneliner
bindkey "^po" peco-search-oneliner

# コマンドライン上の可変パラメータ(%%HOGE)を置換
function _kill-oneliner-param-forward() {
  local AT
  AT=$(echo ${RBUFFER} | awk -v marker="${ONELINER_PARAM_MARKER_PREFIX}" '{print index($0, marker)}')
  if [ $AT -ne 0 ]
  then
    CURSOR=$((CURSOR+AT-1))
    for i in {1..${#ONELINER_PARAM_MARKER_PREFIX}}
    do
      zle delete-char-or-list
    done
    zle kill-word
  else
    zle end-of-line
  fi
}
zle -N _kill-oneliner-param-forward
bindkey "^[j" _kill-oneliner-param-forward

使い方

ワンライナーを登録する

insert-oneliner.gif

  • 登録したいコマンドを入力。実行はしない
    • 可変パラメータ部分がある場合は %%NAME 形式で記述する(%% がprefix)
  • ESC-Iを叩いてコメント入力プロンプトを起動 => コメントを入力
  • 入力したら~/.oneliner/oneliner.txtCOMMAND<TAB>#COMMENT形式で追記される
  • ※ 直接~/.oneliner/oneliner.txtを編集してもOK。その場合もCOMMAND<TAB>#COMMENT形式は踏襲する

pecoからワンライナーを呼び出す

peco.gif

  • Ctrl-P Oでpecoを起動してワンライナー一覧を表示
  • 選択したワンライナーのコマンド部分だけがコマンドラインに表示される(実行はしない)

ワンライナーの可変パラメータ部分を置換して実行する

replace.gif

  • コマンドラインにワンライナーを表示した状態でESC-Jを叩くと、直近の可変パラメータにジャンプするので、実際の内容に置換する
  • 以降、ESC-Jを叩く => 置換する を可変パラメータ部がなくなるまで繰り返す。最後にESC-Jを叩いた際は行末にジャンプする
    • 可変パラメータが最初から無い場合にESC-Jを叩いた場合は行末にジャンプするのみ
34
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
34