¿Hay algún manual para obtener la lista de teclas de acceso directo de bash?

21

Hay muchos accesos directos que uso al interactuar con la línea de comando bash para que el trabajo sea más fácil y rápido.

Me gusta:

  • ctrl+ L: para borrar la pantalla
  • ctrl+ a/ ctrl+ e: para mover el inicio / final de la línea
  • ctrl+ r: para buscar en el historial de comandos simplemente escribiendo algunos caracteres
  • ctrl+ u/ ctrl+ y: para cortar / pegar la línea.

y muchos más que quiero saber y que definitivamente serán útiles para aprender.

Quiero saber de dónde puedo obtener la lista de estos atajos en Ubuntu. ¿Hay algún manual que enumere estos atajos?

NOTA:

Quiero obtener la lista de accesos directos y sus acciones en un solo lugar. Realmente ayudará aprender muchos de ellos en un corto período de tiempo. Entonces, ¿hay alguna manera de que podamos obtener la lista de esta manera? Aunque gracias por la respuesta dada aquí ...

Saurav Kumar
fuente

Respuestas:

22

Los valores predeterminados están incluidos man bash, junto con detalles sobre lo que hace cada comando. Vea la respuesta de BroSlow si ha cambiado sus combinaciones 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

Todos estos comandos están en una sección contigua del manual, por lo que puede buscarlo Commands for Moving. Alternativamente, puede guardar esta sección completa en un archivo de texto con

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

(Nota: esto imprime toda la sección, incluidos los comandos sin atajo de teclado predeterminado).

Explicación del código awk

  • En la (única) aparición de Commands for Moving, establezca la variable print_thisen 1.
  • En la (única) aparición de Programmable Completion, que es la siguiente sección, establezca la variable en 0.
  • Si la variable es 1, elimine el espacio en blanco inicial (tres espacios) e imprima la línea.
Gavilán
fuente
1
Estos son accesos directos predeterminados, no necesariamente los accesos directos en el sistema real de OP. bind -PSería más preciso.
@BroSlow Buen comentario. Sin embargo, todavía creo que hay mérito en mi respuesta, ya que es más detallado sobre lo que hacen los comandos. Si lo escribes como respuesta, haré +1.
Sparhawk
@Sparhawk: +1 por tu respuesta. Estoy buscando la lista de accesos directos en un solo lugar. Entonces, si bash manual me puede decir acerca de todos los atajos, ¿cómo lo haré, como respondiste aquí! ¿Cómo conseguiste la lista así? ¿Hay alguna forma de analizar los accesos directos con la acción y guardarlos en otro archivo? Estaré esperando tu respuesta ..
Saurav Kumar
Si busca en el manual de bash Readline Command Names, verá todos los comandos en esta sección. Escribiré un script corto para extraerlo a un archivo de texto, pero no puedo hacerlo ahora (tendré tiempo en unas pocas horas).
Sparhawk
@Sparhawk: Tu respuesta me ayudó a escribir un simple comando de filtro grep. Compruébalo aquí, espero que te guste. Gracias por tu ayuda. Aunque estoy esperando tu guión .. :)
Saurav Kumar
20

Puede enumerar todos los accesos directos en su shell bash actual llamando al bash incorporado bindcon la -Popción.

p.ej

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

Para cambiarlos, puedes hacer algo como

 bind '\C-p:clear-screen'

Y póngalo en un archivo de inicio para que sea permanente (tenga en cuenta que solo puede tener una combinación de teclas vinculada a una cosa a la vez, por lo que perderá cualquier enlace que tenía anteriormente).

Slothworks
fuente
Obtener las teclas de acceso directo buscándolo por nombre es poco inusual para mí y también es un proceso largo. ¿Hay alguna forma simple de obtener la lista de accesos directos en un solo lugar? Espero que entiendas. +1 para este enfoque ..
Saurav Kumar
2
@SauravKumar bind -Pdebería darte todos los accesos directos. Si quiere hacer caso omiso de aquellos que no tienen asignaciones para las funciones de enlace / lectura, puede hacer algo comobind -P | grep -v "not bound"
7

El siguiente comando proporciona una salida columnar agradable que muestra el uso y los accesos directos.

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

Esto da una salida, que se ve como

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". 
...

Obtenga esta salida en un archivo de texto usando el siguiente comando

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

El archivo se crea en su directorio $ HOME.

Explicación

  • Obtiene todos los atajos.

    bind -P
  • elimina todos los atajos no asignados

    grep "can be found"
  • ordena la salida

    sort
  • imprime la primera columna (es decir, función) y justifica el texto

    awk '{printf "%-40s", $1}
  • Esto es parte del comando anterior. Imprime columnas 6+ (es decir, accesos directos).

    {for(i=6;i<=NF;i++){printf "%s ", $i}{printf"\n"}}'
  • Pone la salida en un buen archivo de texto en el directorio de inicio llamado accesos directos

    > shortcuts

Puede hacerse una idea de cómo funciona el comando ejecutando los siguientes comandos.

bind -P
bind -P | grep "can be found"
bind -P | grep "can be found" | sort
usuario registrado
fuente
@SauravKumar ¿Quieres que agregue algo a la respuesta?
Usuario registrado
2
1 por su respuesta y para hacerlo más significativo .. :) echaba de menos a y cambió todo el sentido de la frase;) No, no tiene que añadir cualquier cosa. Has hecho tu mejor
esfuerzo
+1 ¡Buen comando! Lo he expandido para incluir accesos directos sin configurar: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

De acuerdo, tengo una manera de obtener la lista de accesos directos filtrando el manual de bash . También le dará la descripción de lo que hace exactamente cada acceso directo. Gracias a Sparhawk que me iluminó para encontrar la solución. Lo que necesitaba era aprender el uso de expresiones regulares, aunque todavía no soy bueno :)

Así que aquí está el comando de una línea:

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

Aquí hay una pequeña extracción de la salida:

   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.

Ahora para guardar los accesos directos a un archivo:

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

Eso es todo lo que necesitaba. Solo quería saber las teclas de acceso directo asignadas a bash y no he reconfigurado ninguna tecla como me preguntó BroSlow .

Una vez más, gracias a todos por sus contribuciones.

Nota :

Si alguien quiere mejorar esto, él / ella es bienvenido. Solo he mencionado la forma de enumerar esos atajos que han sido asignados por algunas teclas. Entonces, si alguien sabe cómo enumerar esas acciones que no se han asignado con la descripción de esta manera , es bienvenido :)

Saurav Kumar
fuente
Muy agradable. Sin embargo, el único problema es que esto solo imprimirá la primera línea de descripciones de varias líneas. Además, omite encabezados y comandos sin presionar las teclas predeterminadas (por ejemplo dump-macros), aunque eso podría ser lo que desea.
Sparhawk
1

Siempre que el manual de bash no se modifique de manera que este comando sea incorrecto (lo cual no es muy probable), el siguiente comando mostrará todos los accesos directos predeterminados para bash.

man bash | grep -A294 'Commands for Moving'

Esto da una salida que se parece a:

 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)
...

Si se modifica el manual de bash, este comando se puede cambiar fácilmente para adaptarse a las necesidades.

usuario registrado
fuente
¡Bien hecho Patil! ¿Por qué no pensé de esta manera .. :)
Saurav Kumar
@Patil Pensé en codificar también el número de líneas, pero pensé que era más probable que el manual de bash cambiara el número de líneas en la sección de comandos, en lugar de alterar el orden de sus secciones. Sin embargo, estoy de acuerdo en que probablemente sea poco probable.
Sparhawk