Como posso excluir para uma barra ou uma palavra no zsh?


18

Comportamento do Bash

Acabei de migrar de bashpara zsh. Em bash, eu tinha a seguinte linha ~/.inputrc.

"\e\C-?": unix-filename-rubout

Portanto, o Alt+ Backspaceretornaria à barra anterior, útil para alterar os caminhos inseridos.

Além disso, o bashpadrão é tornar Ctrl+ w delete no espaço anterior, o que é útil para excluir argumentos inteiros (presumindo que eles não tenham espaços).

Comportamento Zsh

Em zsh, Alt+ Backspacee Ctrl+ wfazem a mesma coisa. Ambos excluem a palavra anterior, mas são muito liberais com o que constitui uma quebra de palavra, excluindo até a anterior -ou _. Existe uma maneira de fazer o zshcomportamento semelhante a bash? Se é importante, eu oh-my-zshinstalei.


1
Deseja mudar a definição de zsh do que constitui uma palavra? Em caso afirmativo: unix.stackexchange.com/questions/48577/… Ou você deseja definir um novo comando com uma definição diferente de palavra?
Gilles 'SO- stop be evil'

@ Gilles eu acho que uma combinação de ambos. No bash, eu usaria os dois comandos distintos regularmente: ou seja, excluir até o último /e excluir até o último ``. Eles têm funções diferentes.
Sparhawk

1
@ Gilles Então, sim, esse link funciona para o meu bashcomportamento Alt + Backspace, mas eu ainda gostaria do bashcomportamento Ctrl + w (diferente) , ou seja, excluir para o último espaço.
Sparhawk

Respostas:


14

Edit: O próximo resultado do Google após a sua pergunta foi este com a mesma solução: zsh: faça ALT + BACKSPACE parar com caracteres não alfanuméricos

Esta resposta foi fornecida por /nick FoH#zsh no freenode.

backward-kill-dir () {
    local WORDCHARS=${WORDCHARS/\/}
    zle backward-kill-word
}
zle -N backward-kill-dir
bindkey '^[^?' backward-kill-dir

Dessa forma, você pode usar ctrl+wpara excluir uma Palavra (no vim lingo) e alt+bkspcexcluir uma palavra


Brilhante! Obrigado por dedicar um tempo para investigar e responder.
Sparhawk 30/10

Re Google: exceto que eu fiz minha pergunta há nove meses, e eles fizeram a deles há menos de um mês.
Sparhawk

1
o tempo é apenas um homem de construção social! .. mas sério, ponto justo.
JunkMechanic

19

Uma pergunta semelhante foi feita aqui: zsh: stop backward-kill-word no delimitador de diretório

e uma solução viável fornecida: adicione essas configurações ao seu zshrc:

autoload -U select-word-style
select-word-style bash

Obrigado pela resposta. No entanto, nenhuma dessas respostas funciona para mim. (Especificamente, o que você citou não faz alterações.) Possivelmente, é porque eu oh-my-zshinstalei. De qualquer forma, isso não parece abordar as duas funções diferentes e as combinações de teclas conforme minha pergunta. (E se a minha pergunta era ele enganar deve ser fechado como um joguete que não é..)
Sparhawk

1
Você precisa ajustar a variável WORDCHARS. Em zsh é fácilvared WORDCHARS
Jshura

Seria uma duplicata apenas se a compararmos com uma pergunta respondida neste fórum.
Thomas Dickey

@ThomasDickey Ah, sim, desculpas, eu não percebi que havia trocado sites da SE.
Sparhawk

@ Jshura Não, conforme a pergunta, eu gostaria de duas funções diferentes, que são possíveis no bash.
Sparhawk

5

Expandindo a resposta da JunkMechanic , eu queria que

  • os atalhos zsh existentes ( CtrlW, Ctrle Ctrl) funcionam como nos padrões zsh
  • Altatalhos baseados em ( AltW, Alte Alt) funcionam de maneira semelhante, mas com "granulação mais fina", por exemplo, até o mais próximo/

Aqui está o que eu uso agora:

# Alt+Backspace
backward-kill-dir () {
    local WORDCHARS=${WORDCHARS/\/}
    zle backward-kill-word
}
zle -N backward-kill-dir
bindkey '^[^?' backward-kill-dir


# Alt+Left
backward-word-dir () {
    local WORDCHARS=${WORDCHARS/\/}
    zle backward-word
}
zle -N backward-word-dir
bindkey "^[[1;3D" backward-word-dir

# Alt+Right
forward-word-dir () {
    local WORDCHARS=${WORDCHARS/\/}
    zle forward-word
}
zle -N forward-word-dir
bindkey "^[[1;3C" forward-word-dir
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.