zsh ESC-Del이 전체 ​​경로가 아닌 경로의 구성 요소를 삭제하도록 합니다.

zsh ESC-Del이 전체 ​​경로가 아닌 경로의 구성 요소를 삭제하도록 합니다.

bash에서 zsh로 이동 중입니다. Bash에서 esc-del은 경로 이름의 구성 요소를 삭제했습니다. zsh에서는 전체 경로 이름을 삭제합니다.

즉, 다음을 입력한 경우입니다.

cat /usr/local/bin/foobar

그리고 ESC-DEL을 쳤는데 bash에서는 다음과 같은 결과가 나왔습니다.

cat /usr/local/bin

그리고 zsh를 사용하면 다음과 같이 끝납니다.

cat

그건 내가 원하는 게 아니야!

이 동작을 어떻게 바꾸나요?

답변1

나는 이 기능을 사용한다

function kill-path-word()
{
  local words word spaces
   zle set-mark-command                 # save current cursor position ("mark")
   while [[ $LBUFFER[-1] == "/" ]] {
     (( CURSOR -= 1 ))                  # consume all trailing slashes
  }
  words=("${(s:/:)LBUFFER/\~/_}")       # split command line at "/" after "~" is replaced by "_" to prevent FILENAME EXPANSION messing things up
  word=$words[-1]                       # this is the portion from cursor back to previous "/"
  (( CURSOR -= $#word ))                # then, jump to the previous "/"
  zle exchange-point-and-mark           # swap "mark" and "cursor"
  zle kill-region                       # delete marked region
}
zle -N kill-path-word

이제 이 함수를 다음과 같이 바인딩할 수 있습니다 ESC+Del.

bindkey "^[^[[3~" kill-path-word

두 스니펫을 모두 파일에 넣고 ~/.zshrc다시 시작하세요.zsh그리고 나서 upon foo/bar/baz////으로 줄여야 합니다 .foo/bar/ESC+Del

예에서와 같이 훈련 슬래시도 제거하려면 while ...앞에 동일한 루프를 추가하십시오 zle exchange-point-and-mark.

답변2

mpy의 답변을 확장하기 위해 이것은 마지막 'cat /usr'을 모두 사용하지 않고 '/usr'을 삭제한 다음 'cat'을 삭제하는 버전입니다. 단일 슬래시 문자보다 더 유연한 정규식으로 $LBUFFER 변수를 분할합니다.

function kill-path-word()
{
  local words word spaces
  zle set-mark-command                 # save current cursor position ("mark")
  words=($(grep -Eo '(/?[a-zA-Z1-9]+[\\ /]*)|([^a-zA-Z0-9])' <<< "$LBUFFER"))
  word=$words[-1]                       # this is the portion from cursor back to previous "/"
  while [[ $LBUFFER[-1] == " " ]] {
    (( CURSOR -= 1 ))                   # consume all trailing spaces - they don't get into the $word variable
  }
  (( CURSOR -= $#word ))                # then, jump to the previous "/"
  zle exchange-point-and-mark           # swap "mark" and "cursor"
  zle kill-region                       # delete marked region
}
zle -N kill-path-word
bindkey "^[^?" kill-path-word

관련 정보