Estou mudando do bash para o zsh. No bash, esc-del excluiu um componente de um nome de caminho; no zsh, ele exclui todo o nome do caminho.
Isto é, se eu digitei:
cat /usr/local/bin/foobar
e apertei ESC-DEL, no bash acabei com:
cat /usr/local/bin
e com zsh acabo com:
cat
que não é o que eu quero!
Como posso mudar esse comportamento?
Responder1
Eu uso essa função
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
Agora, você pode vincular esta função, por exemplo, ESC+Del
por
bindkey "^[^[[3~" kill-path-word
Coloque os dois trechos no seu ~/.zshrc
arquivo e reiniciezshe então foo/bar/baz////
deve ser abreviado para foo/bar/
upon ESC+Del
.
Se você quiser que a barra de treinamento também seja removida (como no seu exemplo), adicione o mesmo while ...
loop antes zle exchange-point-and-mark
.
Responder2
Para estender a resposta do mpy, esta é uma versão que não consome o último 'cat /usr' todos juntos, mas exclui '/usr' e depois 'cat'. Ele divide a variável $LBUFFER por uma regex, que é mais flexível do que uma única barra.
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