Esiste un manuale per ottenere l'elenco dei tasti di scelta rapida bash?


21

Ci sono molte scorciatoie che uso durante l'interazione con la riga di comando bash per rendere il lavoro più semplice e veloce.

Piace:

  • ctrl+ L: per cancellare lo schermo
  • ctrl+ a/ ctrl+ e: per spostare l'inizio / la fine della riga
  • ctrl+ r: per cercare nella cronologia dei comandi scrivendo solo pochi caratteri
  • ctrl+ u/ ctrl+ y: per tagliare / incollare la linea.

e molti altri ancora, che voglio conoscere e che saranno sicuramente utili da imparare.

Voglio sapere da dove posso ottenere l'elenco di queste scorciatoie in Ubuntu? Esiste un manuale che elenca queste scorciatoie?

NOTA:

Voglio ottenere l'elenco delle scorciatoie e le loro azioni in un unico posto. Aiuterà davvero ad imparare molti di loro in un breve periodo di tempo. Quindi c'è un modo per ottenere l'elenco come questo? Sebbene grazie per la risposta data qui ..

Risposte:


22

Le impostazioni predefinite sono presenti man bash, insieme ai dettagli su ciò che ciascun comando fa. Vedi la risposta di BroSlow se hai modificato i collegamenti chiave.

   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.

MODIFICARE

Questi comandi sono tutti in una sezione contigua del manuale, quindi è possibile sfogliarlo da Commands for Moving. In alternativa, puoi salvare l'intera sezione in un file di testo con

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

(NB questo stampa l'intera sezione, inclusi i comandi senza scorciatoia da tastiera predefinita.)

Spiegazione del codice awk

  • Alla (unica) occorrenza di Commands for Moving, imposta la variabile print_thissu 1.
  • Alla (unica) occorrenza di Programmable Completion, che è la sezione seguente, impostare la variabile su 0.
  • Se la variabile è 1, elimina lo spazio bianco iniziale (tre spazi) e stampa la linea.

1
Queste sono scorciatoie predefinite, non necessariamente le scorciatoie sul sistema reale dell'OP. bind -Psarebbe più preciso.

@BroSlow Buon commento. Penso ancora che ci sia del merito nella mia risposta, poiché è più prolisso su ciò che fanno i comandi. Se lo scrivi come risposta, farò +1.
Sparhawk,

@Sparhawk: +1 per la tua risposta. Sto cercando l'elenco delle scorciatoie in un unico posto. Quindi, se il manuale di Bash può parlarmi di tutte le scorciatoie, come potrò metterlo insieme, come hai risposto qui !! Come hai ottenuto la lista in questo modo? Esiste un modo per analizzare le scorciatoie con l'azione e salvarlo in un altro file?
Aspetterò la

Se cerchi il manuale di bash Readline Command Names, vedrai tutti i comandi in questa sezione. Scriverò un breve script per estrarlo in un file di testo, ma non posso farlo ora (avrò tempo tra qualche ora).
Sparhawk,

@Sparhawk: la tua risposta mi ha aiutato a scrivere un semplice comando di filtro grep. Dai un'occhiata qui spero che ti piaccia. Grazie per l'aiuto. Anche se sto aspettando la tua sceneggiatura .. :)
Saurav Kumar

20

Puoi elencare tutte le scorciatoie nella tua shell bash corrente chiamando l'integrato bash bindcon l' -Popzione.

per esempio

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

Per cambiarli, puoi fare qualcosa del genere

 bind '\C-p:clear-screen'

E inseriscilo in un file init per renderlo permanente (nota che puoi avere solo una combinazione di tasti associata a una cosa alla volta, quindi perderà qualsiasi associazione che aveva in precedenza).


Ottenere i tasti di scelta rapida cercandolo per nome è un po 'insolito per me e anche un lungo processo. C'è un modo semplice per ottenere l'elenco delle scorciatoie in un unico posto? Spero tu capisca. +1 però per questo approccio ..
Saurav Kumar

2
@SauravKumar bind -Pdovrebbe darti tutte le scorciatoie. Se intendi ignorare quelli che non hanno mappature per le funzioni bind / readline potresti fare qualcosa del generebind -P | grep -v "not bound"

7

Il seguente comando fornisce un piacevole output a colonne che mostra l'uso e le scorciatoie.

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

Questo dà un output, che sembra

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

Ottieni questo output in un file di testo usando il seguente comando

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

Il file viene creato nella directory $ HOME.

Spiegazione

  • ottiene tutte le scorciatoie.

    bind -P
  • rimuove tutte le scorciatoie non assegnate

    grep "can be found"
  • ordina l'output

    sort
  • stampa la prima colonna (cioè la funzione) e giustifica il testo

    awk '{printf "%-40s", $1}
  • Questo fa parte del comando precedente. Stampa le colonne 6+ (ovvero le scorciatoie).

    {for(i=6;i<=NF;i++){printf "%s ", $i}{printf"\n"}}'
  • Mette l'output in un bel file di testo nella home directory denominata scorciatoie

    > shortcuts

Puoi avere un'idea di come funziona il comando eseguendo i seguenti comandi.

bind -P
bind -P | grep "can be found"
bind -P | grep "can be found" | sort

@SauravKumar Vuoi che aggiunga qualcosa alla risposta?
Utente registrato

2
+1 per la risposta e per renderlo più significativo .. :) ho perso a ed è cambiato l'intero significato della frase;) No, non c'è bisogno di aggiungere qualsiasi cosa. Hai fatto del tuo meglio ..
Saurav Kumar

+1 Bel comando! L'ho espanso per includere scorciatoie non impostate: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, ho un modo per ottenere l'elenco delle scorciatoie filtrando il manuale di bash . Fornirà anche la descrizione di cosa fa esattamente ogni scorciatoia. Grazie a Sparhawk che mi ha illuminato per trovare la soluzione. Ciò di cui avevo bisogno era imparare l'uso delle espressioni regolari anche se non sono ancora bravo :)

Quindi ecco il comando a una riga:

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

Ecco una piccola estrazione dell'output:

   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.

Ora per salvare le scorciatoie in un file:

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

Questo è tutto ciò di cui avevo bisogno. Volevo solo conoscere i tasti di scelta rapida assegnati a bash e non ho riconfigurato alcun tasto come mi ha chiesto BroSlow .

Ancora una volta grazie a tutti per il loro contributo.

Nota :

Se qualcuno vuole migliorarlo, è il benvenuto. Ho menzionato solo il modo di elencare quelle scorciatoie che sono state assegnate da alcuni tasti. Quindi, se qualcuno sa come elencare quelle azioni che non sono state assegnate con la descrizione in questo modo , è il benvenuto :)


Molto bella. Tuttavia, l'unico problema è che questo stamperà solo la prima riga delle descrizioni multilinea. Inoltre, salta le intestazioni e i comandi senza i tasti predefiniti (ad es. dump-macros), Anche se potrebbe essere quello che vuoi.
Sparhawk,

1

Finché il manuale di bash non viene modificato in modo da rendere questo comando improprio (il che non è molto probabile), il comando seguente mostrerà tutte le scorciatoie predefinite per bash.

man bash | grep -A294 'Commands for Moving'

Questo dà un output che assomiglia 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)
...

Se il manuale di bash viene modificato, questo comando può essere facilmente modificato in base alle esigenze.


Ben fatto Patil !! Perché non ci ho pensato in questo modo .. :)
Saurav Kumar il

@Patil Ho pensato di codificare anche il numero di righe, ma ho pensato che fosse più probabile che il manuale di bash avesse cambiato il numero di righe nella sezione di comando, piuttosto che cambiare l'ordine delle sue sezioni. Concordo sul fatto che probabilmente è improbabile.
Sparhawk
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.