zsh
キーの組み合わせAlt+がに.バインドされると、insert-last-word
現在のコマンドラインに前のコマンドの最後の引数が挿入されます。
前のコマンドのすべての引数をコマンドラインに貼り付けることを除いて、Alt+に似たキーバインド/ショートカットを探しています。.
私はこれを入力できることを知っており、!*
zshはこれを「前のコマンドのすべての引数を再利用する」と解釈します。しかし、それは私が望むものではありません。また、パラメータを実際に貼り付けることはできません。zshはパラメータをそのように解釈します!*
。クリックTabして展開できますが、これは別の必須コマンドです。
「!*」と入力してTabを押すよりもAlt+と同じキーの組み合わせを好みます。something
どうすればいいですか?
修正する
数年間ウィジェットを広く使用した後、私は私を悩ませていることを発見しました:(ウィジェットをAlt+にバインドしました/)
- 一度はうまくいきますが、もう一度繰り返すと、ファイルの先頭からzshの履歴を繰り返します
.zsh_history
。
代わりに、ウィジェットが最近の履歴から最初に戻ることを望んでいます。
- 繰り返しますが、zshレコードの先頭から繰り返すと、コマンドと完了するパラメーターの間のスペースが削除されます。
つまり:
パラメータとともにいくつかのコマンドを入力します。
echo 111 222 333
ウィジェットを使用して前のコマンドのパラメータを完成させます。
printf <WIDGET>
printf 111 222 333
上記は期待どおりに機能します。しかし、WIDGETをもう一度押すと、突然次のように動作します。
printf <WIDGET>
printf111 222 333
つまり、コマンドとパラメーターの間のスペースは削除されます。
- Alt最後に、+などの他のキーをバインドして反対の操作を実行し、+を押しすぎた\ときに後退するようにしたいと思います。Alt/
答え1
最初の項目を除くすべてを挿入言葉以前の履歴エントリの場合は、次のカスタムウィジェットを定義できます。
insert-last-words() {
emulate -L zsh
set -o extendedglob # for the # wildcard operator
local direction
case $WIDGET in
(*-reverse) direction=-1;;
(*) direction=1;;
esac
if [[ ${WIDGET%-reverse} = ${LASTWIDGET%-reverse} ]]; then
# subsequent invocations go further back in history like
# insert-last-word
(($+INSERT_LAST_WORDS_SKIP_UNDO)) ||
NUMERIC=1 zle undo # previous invocation
# we honour $NUMERIC for Alt+4 Alt+/ to go back 4 in history
((INSERT_LAST_WORDS_INDEX += ${NUMERIC-1} * direction))
else
# head of history upon first invocation
INSERT_LAST_WORDS_INDEX=0
fi
unset INSERT_LAST_WORDS_SKIP_UNDO
local lastwords
local cmd=${history:$INSERT_LAST_WORDS_INDEX:1}
# cmdline split according to zsh tokenisation rules
lastwords=(${(z)cmd})
if (($#lastwords <= 1)); then
# return failure (causing beep or visual indication) when the
# corresponding cmd had no arguments. We also need to remember
# not to undo next time.
INSERT_LAST_WORDS_SKIP_UNDO=1
return 1
fi
# remove first word (preserving spacing between the remaining
# words).
cmd=${cmd##[[:space:]]#$lastwords[1][[:space:]]#}
LBUFFER+=$cmd
}
zle -N insert-last-words
zle -N insert-last-words-reverse insert-last-words
bindkey '\e/' insert-last-words
bindkey '\e\\' insert-last-words-reverse