Bash: posso definir Ctrl-Backspace para excluir a palavra para trás?

16

When in shell (bash) - eu quero que o Ctrl-Backspace esteja vinculado para "excluir a palavra para trás". É possível?

Editar :

Estou usando o konsoleterminal no KDE.

Adobe
fonte
2
A questão é simples, não se queixa disso. Eu só quero comentar que geralmente vale muito facilitar as ligações de teclas "padrão" que já existem em muitos aplicativos, em vez de personalizá-las para obter um ganho real e a certeza de nunca ver o comportamento em sistemas externos. Ctrl+wé o que você deve se acostumar, imho.
Daniel Andersson
@ Daniel Andersson: ou alternativamente - Você pode desenvolver uma maneira de transferir suas configurações para uma máquina estrangeira.
Adobe
Compartilhar arquivos de ponto é um problema resolvido, mas não ajuda muito em outros computadores que não sejam mais ou menos locais, onde você tem privilégios bastante abertos. Se você estiver em um sistema estrangeiro, provavelmente não terá a liberdade de reconfigurar coisas assim (pelo menos não sem se deixar levar por colegas que também usam a mesma máquina :-)). Além disso, toda nova aplicação precisará de tratamento especial.
Daniel Andersson
6
Eu tenho o problema inverso, estou acostumado a Ctrl-w"excluir a palavra anterior" no console e fazê-lo por instinto, mesmo no Eclipse ou no Chrome, onde significa fechar a aba / fechar o arquivo atual. Um tanto irritante.
Ezequiel Muns
1
Eu tenho o mesmo problema com o Chrome SShInATab. Como faço para pressionar ctrl-W sem ctrl-W? :)
Riccardo SCE

Respostas:

12

Por que não usar Alt+ Backspaceou Ctrl+ Wque já estão mapeados na maioria dos terminais. Não tenho certeza sobre o console. O Xmodmap (man xmodmap) também pode ser usado para remapear outras chaves personalizadas. (Paradoxalmente, o xmodmap não pode remapear o Backspace muito bem porque o terminal substitui os mapeamentos, mas funciona bem com a maioria das chaves ...).

inferno
fonte
9
Porque eu costumava fazer Ctrl-Backspace no meu Emacs. Eu sabia sobre Ctrl-w. Alt-Backspace é novo para mim (+1).
Adobe
1
Bom ponto, @hellork. Você pode interceptar o controle + backspace no servidor X (via xmodmap) e mapeá-lo para algum caractere não utilizado (como alt-backspace).
3
O mais irritante disso é que ctrl + backspace é um mapeamento muito comum para "excluir a palavra para trás" na maioria dos aplicativos de GUI da maioria dos principais sistemas operacionais. Da mesma forma, Ctrl + W é difundido para "fechar janela". Alt + w raramente é usado para qualquer coisa em GUIs, que eu possa pensar. Padronização seria ótimo. Gostaria de saber qual seria a maior interrupção, mudança de terminais ou alteração de GUIs?
naught101
1
@naught, Control-W já é a chave padrão para apagar palavras nos terminais unix. Sim, está em conflito com a convenção do Windows / GUI, mas na verdade veio primeiro - por muitos anos. Culpe a Microsoft!
Alexis7
10

Encontrei este tópico via google, mas a resposta não era o que eu queria ouvir. Então eu brinquei:

No meu terminal, o backspace normal envia ^H, enquanto ctrl + backspace envia ^?. Portanto, deve-se simplificar o processo de ^?exclusão de uma palavra, que por padrão está disponível via Ctrl + W.

Primeiro (tentativa malsucedida):

$ bind -P | grep 'C-w'
unix-word-rubout can be found on "\C-w".

Portanto, isso deve funcionar:

$ bind '"\C-?":unix-word-rubout'

No entanto, não ... alguém capaz de explicar?

Segunda tentativa (bem-sucedida):

$ bind '"\C-?":"^W"'

Onde ^Wé literal / bruto ^W(pressione ctrl + V e, em seguida, ctrl + W para fazer com que apareça).

daurnimator
fonte
Sua primeira solução funcionou para mim, na verdade! Segundo não.
Drew Hoskins #
6

Existem algumas respostas boas aqui, mas eu o resolvi no Konsole com Configurações-> Editar perfil atual-> Teclado-> Editar e adicionando um mapeamento de Backspace+Controlpara \x17. (Encontrei o código ASCII para Ctrl-w usando showkey --ascii.)

Braden Anderson
fonte
Obrigado por apontar a coisa com showkey. Assim, descobri que ALT+Dpara excluir a palavra na frente do cursor corresponderia \x1b\x64.
Loki
Obrigado, resolveu o meu problema. No meu caso, preciso remapear o Alt + Backspace e sua sequência é \x1b\x7f.
DDMC 27/06
5

Apenas edite ~/.inputrc(você pode precisar criar um ou copiar o que está /etc/inputrclá) para que ele contenha:

# Ctrl-Delete: delete next word
"\e[3;5~": shell-kill-word

# Ctrl-Backspace
"\C-H": shell-backward-kill-word

Isso também Ctrlmapeará + Deletepara excluir a palavra ao lado do cursor.

Treviño
fonte
Não funciona para mim.
Jonathan
3

Isso depende do que o bash vê. Na interação regular do terminal, o bash não vê quais modificadores de tecla você pressionou, apenas o caractere resultante. Backspace já é o mesmo que control-H, por exemplo. Manter pressionado o turno ou o controle não faz diferença.

NO ENTANTO, seu aplicativo de terminal (xterm? Cmd? Terminal? Putty? Depende do sistema operacional) pode ver as teclas pressionadas e pode ter uma maneira de mapear a combinação de teclas de controle e backspace para algo que o bash pode diferenciar do backspace.

alexis
fonte
Eu descobri que meu bash não vê backspace. Mas pode ser que seja possível fazê-lo ver isso.
Adobe
@ adobe, o que você quer dizer? Digite 'stty' no seu terminal e leia o manual sobre ele. Se ^ H estiver definido como seu caractere de apagamento, você poderá configurá-lo para outra coisa ... se tiver um bom motivo.
1
Há um bom exemplo de como fazer isso em github.com/calj/gtconf/blob/master/zsh/zshrc . O Konsole permite fazer isso. Copie um dos arquivos * .keytab de / usr / share / kde4 / apps / konsole / para ~ / .kde / share / apps / konsole e modifique-o com as sugestões no link acima, excluindo a linha "key Backspace" e adicionando: key Backspace-Shift-Control : "\x7f"e key Backspace-Shift+Control : "\E[9;3~"Altere também a linha do título enquanto estiver nela:, keyboard "Xfree4 Modlist"por exemplo. Em seguida, você pode adicionar "\e[9;3~": backward-kill-word"a ~ / .inputrc
Adam
2

Tente o seguinte:

bind '"\C-_":backward-kill-word'

Opcionalmente, adicione o seguinte a ~ / .inputrc para torná-lo permanente:

"\C-_": backward-kill-word

Funciona no bash 4.3.11 no Kubuntu 14.04

Fitzy
fonte
2
É improvável que o controle de backspace seja o mesmo que o sublinhado de controle.
Thomas Dickey
1
De todas as coisas que tentei neste segmento, isso funcionou! Usando "GNU bash, versão 4.3.48 (1) -release (x86_64-pc-linux-gnu)" no bash no windows / WSL
Markus Jevring 17/17
Isso funciona muito bem para mim no cygwin, usando GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin).
Zagyi
1

No Konsole:

  • clique Settings -> Edit current profile
  • clique na guia 'Teclado' -> [Edit...]
  • clique no [Add]botão e abaixo do Key Combinationtipo de coluna Backspace+Ctrl. No Outputtipo de coluna 0x08(que é convencionalmente o caractere backspace)

Agora você deve poder mapear essa chave para backward-kill-wordvia

# ~/.bashrc

bind '"\x08":backward-kill-word'
aaaaaa
fonte
Obrigado. Funciona para mim, pelo menos no xfce4-terminal.
limon
0

Na maioria dos terminais, CTRL + W já deve excluir uma palavra para trás. Isso funciona com o xterm e acho que funciona com o konsole. CTRL + W é uma ligação de tecla padrão em um programa baseado em texto que funcionará com o vim no modo de inserção, emacs e todos os shells.


fonte
4
Eu tenho o Ctrl-w ligado a "fechar a aba" no Emacs, FireFox, Krusader - então eu a configurei para ser uma combinação de aba de fechamento no Konsole também.
Adobe