faça zsh ESC-Del excluir componentes de um caminho e não o caminho inteiro

faça zsh ESC-Del excluir componentes de um caminho e não o caminho inteiro

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+Delpor

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

Coloque os dois trechos no seu ~/.zshrcarquivo 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

informação relacionada