Shell do Windows Tecla Escape (excluir linha inteira) equivalente no Bash

13

Na linha de comando do Windows (powershell e cmd), quando você pressiona a Esctecla enquanto estiver em uma linha, o que você digitou no prompt é removido.

Descobri que pressionar a Esctecla no prompt do bash não faz nada. Pressionar Esce backspaceexcluir uma palavra, mas isso deve ser feito para cada palavra.

Estou aprendendo o Bash de forma incremental e às vezes digitando algo estúpido no meio da linha e sinto que é melhor digitar do zero novamente. Para fazer isso, pressionar backspaceé a única maneira que encontrei até agora.

O que você faz?

Estou ciente do clearcomando e do Ctrl-Latalho, mas não estou falando de limpar todo o terminal. Apenas a linha.

Animesh
fonte
1
Há algum tempo, publiquei uma lista de atalhos úteis do teclado readline no superusuário. Você pode encontrá-los úteis também. (Readline é a biblioteca que usos Bash para a linha de edição.)
jw013
ei jw013, obrigado por uma edição agradável. :-)
Animesh

Respostas:

15

Você deseja kill-whole-line, mas isso não é vinculado por padrão no bash. backward-kill-line( CtrlX Backspace) e unix-line-discard( CtrlU) ambos apagam do ponto atual até o início da linha, basta ir até o final da linha e usar qualquer um.

Ignacio Vazquez-Abrams
fonte
Você está correto, não está vinculado a nada. Acabei de descobrir isso usando bind -P. Eu acho Ctrl-Ue então Ctrl-Yé a única opção então.
Animesh
Você descobrirá que várias ligações padrão são derivadas das seqüências de teclas no editor Emacs e que essas ligações também aparecem em outros lugares.
Blrfl
@Blrfl para estender seu comentário, a maioria dessas combinações de teclas foi resumida na biblioteca readline , que muitos programas de linha de comando usam e é por isso que todos eles têm teclas de edição de linha semelhantes.
Jw013
6

Ctrl+avai para o início da linha e Ctrl+kexclui até o final da linha

lemen
fonte
Tente ^Uprimeiro, na maioria das implementações do modo de edição de linha de comando do Emacs, ele já exclui a linha completa. Naqueles em que ele apaga apenas a esquerda do cursor (linha de leitura GNU, por exemplo), pressione ^Kdepois.
mirabilos
3

Para expandir um pouco a resposta de Ignacio Vazquez-Abrams, você pode obter (quase) o comportamento semelhante ao Windows a partir da Escchave no bash, vinculando a kill-whole-linea Esccom o seguinte comando

bind '"\e":kill-whole-line'

Se você adicionar a linha ao seu ~/.inputrcarquivo, a ligação persistirá entre as sessões.

Observe, no entanto, que isso é muito fora do padrão, pois o bash realmente usa a Escchave como outra chave de modificação (como uma Alt ou Ctrl não persistente). Se você olhar a lista de bind -Pcombinações de teclas existentes (com ), provavelmente verá vários comandos ligados a combinações de teclas que começam com "\ e" (por exemplo,

"\eb": backward-word

que configura a combinação Esc+ Bpara mover o cursor de volta ao início de palavra mais recente - mais ou menos como Ctrl+ , exceto que você precisa continuar soltando Esc(assim como B, é claro) se quiser fazê-lo mais de uma vez seguidas )

E isso explica por que eu disse que o comportamento que você tem é quase como o Windows: quando você pressiona Esc, o bash verifica se você o está usando em combinação com outra tecla; portanto, se você o vincular kill-whole-line, há um pouco de atraso entre pressionar (ou melhor, liberar) Esce o bash limpar a linha para você.

No entanto, se você não se importa com nada disso e prefere conviver com o atraso do que se treinar com um pressionamento de tecla diferente, isso pode ser feito.

(Nota: muitas das informações aqui foram obtidas com a leitura - e a seguir os links - desta resposta .)

Wilson F
fonte
1
Isso foi muito útil, obrigado e funciona mais ou menos como anunciado. Mas achei que produziu algum comportamento irritante quando outros comandos são executados "de forma inválida", como pressionar DEL quando no final de uma linha: isso limparia a linha e a substituiria por [19;um código de escape com aparência semelhante. No final, achei o mapeamento "\e\e"para kill-whole-line(ou seja, toque em Esc duas vezes para limpar a linha) um bom compromisso.
Jrandom_hacker 17/05/19
@j_random_hacker: Hum, eu gosto disso. Eu sempre bati Escalgumas vezes de qualquer maneira, então posso tentar isso. Atualmente, vinculo-o a Ctrl+, Delmas nunca me lembro disso.
Wilson F