Existe algum manual para obter a lista de teclas de atalho do bash?

21

Existem muitos atalhos que eu uso enquanto interage com a linha de comando do bash para tornar o trabalho mais fácil e rápido.

Gostar:

  • ctrl+ L: para limpar a tela
  • ctrl+ a/ ctrl+ e: para mover o início / fim da linha
  • ctrl+ r: para pesquisar o histórico do comando, basta escrever alguns caracteres
  • ctrl+ u/ ctrl+ y: para cortar / colar a linha.

e muitos mais, que eu quero saber e que serão definitivamente úteis para aprender.

Quero saber de onde posso obter a lista desses atalhos no Ubuntu? Existe algum manual que lista esses atalhos?

NOTA:

Quero obter a lista de atalhos e suas ações em um só lugar. Realmente ajudará a aprender muitos deles em um pequeno período de tempo. Então, existe uma maneira de obter a lista assim? Embora obrigado pela resposta dada aqui ..

Saurav Kumar
fonte

Respostas:

22

Os padrões estão dentro man bash, junto com detalhes sobre o que cada comando faz. Consulte a resposta do BroSlow se você alterou as combinações de teclas.

   Commands for Moving
       beginning-of-line (C-a)
              Move to the start of the current line.
       end-of-line (C-e)
              Move to the end of the line.
       forward-char (C-f)
              Move forward a character.
       backward-char (C-b)
              Move back a character.
       forward-word (M-f)
              Move forward to the end of the next word.  Words are composed of alphanumeric characters (letters and digits).
       backward-word (M-b)
              Move back to the start of the current or previous word.  Words are composed of alphanumeric characters (letters and digits).
       shell-forward-word
              Move forward to the end of the next word.  Words are delimited by non-quoted shell metacharacters.
       shell-backward-word
              Move back to the start of the current or previous word.  Words are delimited by non-quoted shell metacharacters.
       clear-screen (C-l)
              Clear the screen leaving the current line at the top of the screen.  With an argument, refresh the current line without clearing the screen.

...

       reverse-search-history (C-r)
              Search backward starting at the current line and moving `up' through the history as necessary.  This is an incremental search.

...

       unix-line-discard (C-u)
              Kill backward from point to the beginning of the line.  The killed text is saved on the kill-ring.

...

       yank (C-y)
          Yank the top of the kill ring into the buffer at point.

EDITAR

Esses comandos estão todos em uma seção contígua do manual, para que você possa navegar por ele Commands for Moving. Como alternativa, você pode salvar esta seção inteira em um arquivo de texto com

man bash | awk '/^   Commands for Moving$/{print_this=1} /^   Programmable Completion$/{print_this=0} print_this==1{sub(/^   /,""); print}' > bash_commands.txt

(NB: imprime a seção inteira, incluindo comandos sem atalho de teclado padrão.)

Explicação do código awk

  • Na ocorrência (apenas) de Commands for Moving, defina a variável print_thiscomo 1.
  • Na ocorrência (apenas) de Programmable Completion, que é a seção a seguir, defina a variável como 0.
  • Se a variável for 1, livre-se do espaço em branco à esquerda (três espaços) e imprima a linha.
Sparhawk
fonte
1
Esses são atalhos padrão, não necessariamente os atalhos no sistema real do OP. bind -Pseria mais preciso.
@BroSlow Bom comentário. Ainda acho que há mérito na minha resposta, pois é mais detalhado sobre o que os comandos fazem. Se você escrever como uma resposta, eu vou marcar com +1.
Sparhawk #
@ Sparhawk: +1 para sua resposta. Estou procurando a lista de atalhos em um só lugar. Então, se o manual do bash pode me falar sobre todos os atalhos, como vou reuni-lo, como você respondeu aqui !! Como você conseguiu a lista assim? Existe alguma maneira de analisar os atalhos com a ação e salvá-lo em outro arquivo? Eu estarei esperando por sua resposta ..
Saurav Kumar
Se você pesquisar no manual do bash Readline Command Names, verá todos os comandos nesta seção. Escreverei um script curto para extraí-lo em um arquivo de texto, mas não posso fazê-lo agora (terei tempo em algumas horas).
Sparhawk #
@ Sparhawk: Sua resposta me ajudou a escrever um simples comando de filtro grep. Verifique aqui, espero que você goste. Obrigado pela ajuda. Embora eu estou esperando por seu script .. :)
Saurav Kumar
20

Você pode listar todos os atalhos no seu shell bash atual chamando o bash builtin bindcom a -Popção

por exemplo

bind -P | grep clear
clear-screen can be found on "\C-l".

Para alterá-los, você pode fazer algo como

 bind '\C-p:clear-screen'

E coloque-o em um arquivo init para torná-lo permanente (observe que você só pode ter uma combinação de teclas vinculada a uma coisa de cada vez, para que perca a ligação que tinha anteriormente).

Preguiça
fonte
Obter as teclas de atalho pesquisando pelo nome é pouco incomum para mim e também é um processo longo. Existe alguma maneira simples de obter a lista de atalhos em um só lugar? Espero que você entenda. +1 embora para esta abordagem ..
Saurav Kumar
2
O @SauravKumar bind -Pdeve fornecer todos os atalhos. Se você quer dizer ignorando aqueles que não têm mapeamentos para funções bind / readline você poderia fazer algo assimbind -P | grep -v "not bound"
7

O comando a seguir fornece uma boa saída colunar, mostrando o uso e os atalhos.

bind -P | grep "can be found" | sort | awk '{printf "%-40s", $1} {for(i=6;i<=NF;i++){printf "%s ", $i}{printf"\n"}}'

Isso fornece uma saída, que parece

abort                                   "\C-g", "\C-x\C-g", "\e\C-g". 
accept-line                             "\C-j", "\C-m". 
backward-char                           "\C-b", "\eOD", "\e[D". 
backward-delete-char                    "\C-h", "\C-?". 
backward-kill-line                      "\C-x\C-?". 
backward-kill-word                      "\e\C-h", "\e\C-?". 
backward-word                           "\e\e[D", "\e[1;5D", "\e[5D", "\eb". 
beginning-of-history                    "\e<". 
beginning-of-line                       "\C-a", "\eOH", "\e[1~", "\e[H". 
call-last-kbd-macro                     "\C-xe". 
capitalize-word                         "\ec". 
character-search-backward               "\e\C-]". 
character-search                        "\C-]". 
clear-screen                            "\C-l". 
complete                                "\C-i", "\e\e". 
...

Obter esta saída em um arquivo de texto usando o seguinte comando

bind -P|grep "can be found"|sort | awk '{printf "%-40s", $1} {for(i=6;i<=NF;i++){printf "%s ", $i}{printf"\n"}}' > ~/shortcuts

O arquivo é criado no seu diretório $ HOME.

Explicação

  • obtém todos os atalhos.

    bind -P
  • remove todos os atalhos não atribuídos

    grep "can be found"
  • classifica a saída

    sort
  • imprime a primeira coluna (ie função) e justifica o texto

    awk '{printf "%-40s", $1}
  • Isso faz parte do comando anterior. Imprime as colunas 6+ (ou seja, atalhos).

    {for(i=6;i<=NF;i++){printf "%s ", $i}{printf"\n"}}'
  • Coloca a saída em um bom arquivo de texto no diretório home chamado atalhos

    > shortcuts

Você pode ter uma idéia de como o comando funciona executando os seguintes comandos.

bind -P
bind -P | grep "can be found"
bind -P | grep "can be found" | sort
Usuário Registrado
fonte
@SauravKumar Você quer que eu adicione algo à resposta?
Usuário registrado
2
+1 para sua resposta e para torná-lo mais significativo .. :) Eu perdi a e mudou todo o significado da frase;) Não, você não tem que adicionar qualquer coisa. Você já fez o seu melhor ..
Saurav Kumar
+1 Bom comando! Eu o expandi para incluir atalhos não configurados:bind -P | tail -n +2 | sort | awk '{printf "%-40s", $1} {if ($6 == "any") {printf"\n"} else {for(i=6;i<=NF;i++){printf "%s ", $i}{printf"\n"}}}'
wjandrea
1

Ok, eu tenho uma maneira de obter a lista de atalhos filtrando o manual do bash . Também fornecerá a descrição do que exatamente cada atalho faz. Agradeço a Sparhawk, que me iluminou para encontrar a solução. O que eu precisava era aprender o uso de expressões regulares, embora ainda não seja bom nisso :)

Então, aqui está o comando de uma linha:

man bash | grep "(.-.*)$" -A1

Aqui está uma pequena extração da saída:

   beginning-of-line (C-a)
          Move to the start of the current line.
   end-of-line (C-e)
          Move to the end of the line.
   forward-char (C-f)
          Move forward a character.
   backward-char (C-b)
          Move back a character.
   forward-word (M-f)
          Move forward to the end of the next word.  Words are composed of alphanumeric characters (letters and digits).
   backward-word (M-b)
          Move back to the start of the current or previous word.  Words are composed of alphanumeric characters (letters and digits).
   clear-screen (C-l)
          Clear the screen leaving the current line at the top of the screen.  With an argument, refresh the current line without clearing the
   previous-history (C-p)
          Fetch the previous command from the history list, moving back in the list.
   next-history (C-n)
          Fetch the next command from the history list, moving forward in the list.
   beginning-of-history (M-<)
          Move to the first line in the history.
   end-of-history (M->)
          Move to the end of the input history, i.e., the line currently being entered.
   reverse-search-history (C-r)
          Search backward starting at the current line and moving `up' through the history as necessary.  This is an incremental search.
   forward-search-history (C-s)
          Search forward starting at the current line and moving `down' through the history as necessary.  This is an incremental search.

Agora, para salvar os atalhos em um arquivo:

man bash | grep "(.-.*)$" -A1 > bash_shortcuts

Isso é tudo que eu precisava. Eu só queria conhecer as teclas de atalho atribuídas ao bash e não reconfigurei nenhuma tecla, como BroSlow me pediu.

Mais uma vez obrigado a todos por suas contribuições.

Nota :

Se alguém quiser melhorar isso, é muito bem-vindo. Mencionei apenas a maneira de listar os atalhos que foram atribuídos por algumas teclas. Portanto, se alguém souber listar as ações que não foram atribuídas com a descrição dessa maneira , será muito bem-vindo :)

Saurav Kumar
fonte
Muito agradável. No entanto, o único problema é que isso imprimirá apenas a primeira linha de descrições de várias linhas. Além disso, ignora cabeçalhos e comandos sem pressionar as teclas padrão (por exemplo dump-macros), embora isso possa ser o que você deseja.
Sparhawk
1

Desde que o manual do bash não seja modificado de forma a tornar esse comando impróprio (o que não é muito provável), o comando a seguir mostrará todos os atalhos padrão para bash.

man bash | grep -A294 'Commands for Moving'

Isso fornece uma saída parecida com:

 Commands for Moving
   beginning-of-line (C-a)
          Move to the start of the current line.
   end-of-line (C-e)
          Move to the end of the line.
   forward-char (C-f)
          Move forward a character.
   backward-char (C-b)
          Move back a character.
   forward-word (M-f)
          Move forward to the end of the next word.  Words are composed of alphanumeric characters (letters and digits).
   backward-word (M-b)
          Move back to the start of the current or previous word.  Words are composed of alphanumeric characters (letters  and
          digits).
   shell-forward-word
          Move forward to the end of the next word.  Words are delimited by non-quoted shell metacharacters.
   shell-backward-word
          Move back to the start of the current or previous word.  Words are delimited by non-quoted shell metacharacters.
   clear-screen (C-l)
          Clear  the  screen  leaving  the  current line at the top of the screen.  With an argument, refresh the current line
          without clearing the screen.
   redraw-current-line
          Refresh the current line.

Commands for Manipulating the History
   accept-line (Newline, Return)
          Accept the line regardless of where the cursor is.  If this line is non-empty, add it to the history list  according
          to  the state of the HISTCONTROL variable.  If the line is a modified history line, then restore the history line to
          its original state.
   previous-history (C-p)
          Fetch the previous command from the history list, moving back in the list.
   next-history (C-n)
...

Se o manual do bash for modificado, esse comando poderá ser facilmente alterado para atender às necessidades.

Usuário Registrado
fonte
Bem feito Patil !! Por que eu não pensei dessa forma .. :)
Saurav Kumar
@ Patil Também pensei em codificar o número de linhas, mas achei que era mais provável que o manual do bash tivesse o número de linhas na seção de comando alterado, em vez de alterar a ordem de suas seções. Concordo que qualquer um é provavelmente improvável.
Sparhawk 04/04