動機
- 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
使い方
ワンライナーを登録する
- 登録したいコマンドを入力。実行はしない
- 可変パラメータ部分がある場合は
%%NAME
形式で記述する(%% がprefix)
- 可変パラメータ部分がある場合は
-
ESC-I
を叩いてコメント入力プロンプトを起動 => コメントを入力 - 入力したら
~/.oneliner/oneliner.txt
にCOMMAND<TAB>#COMMENT
形式で追記される - ※ 直接
~/.oneliner/oneliner.txt
を編集してもOK。その場合もCOMMAND<TAB>#COMMENT
形式は踏襲する
pecoからワンライナーを呼び出す
-
Ctrl-P O
でpecoを起動してワンライナー一覧を表示 - 選択したワンライナーのコマンド部分だけがコマンドラインに表示される(実行はしない)
ワンライナーの可変パラメータ部分を置換して実行する
- コマンドラインにワンライナーを表示した状態で
ESC-J
を叩くと、直近の可変パラメータにジャンプするので、実際の内容に置換する - 以降、
ESC-J
を叩く => 置換する を可変パラメータ部がなくなるまで繰り返す。最後にESC-J
を叩いた際は行末にジャンプする- 可変パラメータが最初から無い場合に
ESC-J
を叩いた場合は行末にジャンプするのみ
- 可変パラメータが最初から無い場合に