Como excluir parte de um caminho em um shell interativo?

19

Existe um atalho no bash e no zsh para excluir um componente de um caminho? Por exemplo, se eu digitar ls ~/local/color/, e o cursor estiver no final da linha, existe um atalho para excluir o color/no final? Idealmente, quero soluções nos modos vi e emacs

Vayn
fonte

Respostas:

25

Os comandos mais comumente usados ​​no modo bash emacs padrão , para teclados mais comuns:

Movimento

  • Ctrl- p, ou Up: comando anterior
  • Ctrl- n, ou Down: próximo comando
  • Ctrl- b, ou Left: caractere anterior
  • Ctrl- f, ou Right: próximo caractere
  • Alt- b: palavra anterior
  • Alt- f: próxima palavra
  • Ctrl- a, ou Home: início do comando
  • Ctrl- e, ou End: fim do comando

Edição

  • BkSpc: excluir caractere anterior
  • Ctrl- d, ou Del: excluir o caractere atual
  • Alt- BkSpc: apaga a palavra para a esquerda
  • Alt- d: apaga a palavra para a direita
  • Ctrl- u: delete para iniciar o comando
  • Ctrl- k: excluir para o final do comando
  • Ctrl- y: colar último corte

Miscelânea

  • Cltr- /: desfazer
  • Cltr- r: pesquisa incremental do histórico anterior
enzotib
fonte
2
Complemento: defina um atalho para esse fim no zshbindkey [key] vi-backward-kill-word
Vayn
Obrigado. Adicionei isso ao meu arquivo ~ / .zshrc e ele funciona bem quando pressiono Alt + Backspace: bindkey "^ [^?" vi-back-kill-word. Não é o ideal.
Tim Stewart
Alt-Bckspc e Alt-d funcionam bem com os caminhos de arquivos em que os experimentei. (bash)
demure
10

Há também unix-filename-ruboutpara Readline!

# in ~/.inputrc
# press ctrl-b to delete unix filename parts
# see: man bash | less -p 'unix-filename-rubout' and
#      http://www.calmar.ws/vim/vi-bash.html
set editing-mode vi
set keymap vi
"\C-b": unix-filename-rubout
mikeo
fonte
2
IMHO unix-filename-rubouté a resposta correta para a pergunta feita, uma vez que exclui a reduzir ou espaços em branco, enquanto Alt-BkSpcvai parar em personagens como hífen, sublinhado, ponto, etc.
Steve
6

Por padrão, o bash (e acho que o zsh) estará no modo emacs. Você pode tentar algo como isto:

Esc + bcolocará o cursor de volta uma palavra. Ctrl + kserá excluído até o final da linha.

A maioria dos shells modernos (como o bash) implementará recursos avançados de edição de linha de comando. Esses comandos estão próximos da edição do emacs (Ctrl + A para o início da linha, Ctrl + E para o final da linha, ...).

Se você é familiar com editores do tipo vi, pode tentar permitir o modo vi.

set -o vi

Ele fornece os modos do tipo shell vi (modo de comando / modo de inserção) e você obtém acesso aos comandos padrão (d para excluir, r para substituir, ...)

No modo Vi, veja como você faria o que descreveu:

Esc (command mode); d; b.
rahmu
fonte
1
Eu não diria "A edição da linha de comando é ainda mais poderosa e completa no modo vi", o modo emacs possui comandos para fazer tudo o que você pode fazer no modo vi .
enzotib 30/09/11
Eu admito que fiquei um pouco empolgado. Vou reformular isso.
rahmu
Obrigado por me lembrar que existe o modo vi no bash, para que eu possa usar dbnesse cenário no bash. Eu também encontrei vi-backward-kill-wordno zsh o que eu quero, e é mais conveniente do que definir o modo vi no bash. Mas ainda quero encontrar um atalho do modo emacs para esse fim no bash.
Vayn 30/09/11
Ou "alt-bC". Dessa forma, não deixa um caractere final, o que dbocorre em alguns casos.
Curinga