고쳐 쓰다

고쳐 쓰다

zsh키 조합 Alt+가 에 .바인딩되면 insert-last-word현재 명령줄에 이전 명령의 마지막 인수가 삽입됩니다.

이전 명령의 모든 인수를 명령줄에 붙여넣는다는 점을 제외하면 Alt+와 유사한 키 바인딩/단축키를 찾고 있습니다 ..

나는 이것을 입력할 수 있다는 것을 알고 !*있으며 zsh는 이를 "이전 명령의 모든 인수 재사용"으로 해석합니다. 그러나 그것은 내가 원하는 것이 아닙니다. 또한 매개변수를 실제로 붙여넣어 볼 수는 없으며 zsh는 !*매개변수를 그렇게만 해석합니다. 클릭 Tab하여 확장할 수 있지만 이는 또 다른 필수 명령입니다.

'!*'를 입력하고 Tab을 누르는 것보다 Alt+ 와 같은 키 조합을 선호합니다.something

어떻게 해야 하나요?

고쳐 쓰다

몇 년 동안 위젯을 광범위하게 사용한 후, 나는 나를 괴롭히는 것을 발견했습니다: (위젯을 Alt+ 에 바인딩했습니다 /)

  1. 한 번은 잘 작동하지만 다시 반복하면 파일 시작 부분부터 zsh 기록을 반복합니다 .zsh_history.

대신 위젯이 최근 기록에서 처음으로 뒤로 이동하기를 원합니다.

  1. 다시 말하지만, zsh 기록의 시작 부분부터 반복하면 명령과 완료할 매개변수 사이의 공백이 제거됩니다.

즉:

매개변수와 함께 일부 명령을 입력합니다.

echo 111 222 333

위젯을 사용하여 이전 명령의 매개변수를 완성합니다.

printf <WIDGET>
printf 111 222 333

위의 내용은 예상대로 작동합니다. 하지만 WIDGET을 다시 누르면 갑자기 다음과 같이 작동합니다.

printf <WIDGET>
printf111 222 333

즉, 명령과 매개변수 사이의 공백이 제거됩니다.

  1. 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

관련 정보