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