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