Czy istnieje instrukcja, aby uzyskać listę skrótów klawiszowych?

21

Istnieje wiele skrótów, których używam podczas interakcji z wierszem poleceń bash, aby praca była łatwiejsza i szybsza.

Lubić:

  • ctrl+ L: aby wyczyścić ekran
  • ctrl+ a/ ctrl+ e: aby przesunąć początek / koniec linii
  • ctrl+ r: aby przeszukać historię polecenia, pisząc tylko kilka znaków
  • ctrl+ u/ ctrl+ y: aby wyciąć / wkleić linię.

i wiele, wiele innych, które chcę wiedzieć i które na pewno przydadzą się do nauki.

Chcę wiedzieć, skąd mogę uzyskać listę tych skrótów w Ubuntu? Czy istnieje instrukcja zawierająca te skróty?

UWAGA:

Chcę uzyskać listę skrótów i ich działań w jednym miejscu. Naprawdę pomoże nauczyć się wielu z nich w krótkim czasie. Czy istnieje sposób, aby uzyskać taką listę? Mimo, że dziękuję za odpowiedź tutaj ..

Saurav Kumar
źródło

Odpowiedzi:

22

Domyślne są man bash, wraz ze szczegółami, co robi każde polecenie. Zobacz odpowiedź BroSlow, jeśli zmieniłeś przypisania klawiszy.

   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.

EDYTOWAĆ

Wszystkie te polecenia znajdują się w ciągłej części instrukcji, dzięki czemu można je przeglądać Commands for Moving. Alternatywnie możesz zapisać całą sekcję do pliku tekstowego za pomocą

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

(Uwaga: powoduje to wydrukowanie całej sekcji, w tym poleceń bez domyślnego skrótu klawiaturowego).

Objaśnienie kodu awk

  • W przypadku (tylko) wystąpienia Commands for Movingustaw zmienną print_thisna 1.
  • W (tylko) wystąpieniu Programmable Completion, które jest następną sekcją, ustaw zmienną na 0.
  • Jeśli zmienna ma wartość 1, usuń wiodące białe znaki (trzy spacje) i wydrukuj linię.
Krogulec
źródło
1
Są to domyślne skróty, niekoniecznie skróty w rzeczywistym systemie OP. bind -Pbyłoby bardziej precyzyjne.
@BroSlow Dobry komentarz. Nadal jednak uważam, że moja odpowiedź ma sens, ponieważ jest bardziej gadatliwa na temat tego, co robią polecenia. Jeśli napiszesz to jako odpowiedź, dam +1.
Sparhawk
@Sparhawk: +1 za twoją odpowiedź. Szukam listy skrótów w jednym miejscu. Więc jeśli instrukcja bash może mi powiedzieć o wszystkich skrótach, jak mogę to połączyć, tak jak tutaj odpowiedziałeś !! Jak zdobyłeś taką listę? Czy jest jakiś sposób, aby przeanalizować skróty z akcją i zapisać je w innym pliku? Będę czekał na twoją odpowiedź.
Saurav Kumar
Jeśli przeszukujesz instrukcję bash Readline Command Names, zobaczysz wszystkie polecenia w tej sekcji. Napiszę krótki skrypt, aby wyodrębnić go do pliku tekstowego, ale nie mogę tego teraz zrobić (będę miał czas za kilka godzin).
Sparhawk
@Sparhawk: Twoja odpowiedź pomogła mi napisać proste polecenie filtra grep. Sprawdź tutaj, mam nadzieję, że Ci się spodoba. Dzięki za pomoc. Chociaż czekam na twój scenariusz .. :)
Saurav Kumar
20

Możesz wyświetlić listę wszystkich skrótów w bieżącej powłoce bash, wywołując wbudowane bash bindz -Popcją.

na przykład

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

Aby je zmienić, możesz zrobić coś takiego

 bind '\C-p:clear-screen'

I umieść go w pliku inicjującym, aby stał się trwały (pamiętaj, że kombinacja klawiszy może być powiązana tylko z jedną rzeczą na raz, aby straciła wszelkie wcześniejsze powiązania).

Lenistwo
źródło
Uzyskiwanie klawiszy skrótu poprzez wyszukiwanie według nazwy nie jest dla mnie niczym niezwykłym, a także długim procesem. Czy istnieje prosty sposób na uzyskanie listy skrótów w jednym miejscu? Nadzieję, że rozumiesz. +1 za to podejście ..
Saurav Kumar
2
@SauravKumar bind -Ppowinien dać ci wszystkie skróty. Jeśli masz na myśli ignorowanie tych, które nie mają mapowań dla funkcji bind / readline, możesz zrobić coś takiegobind -P | grep -v "not bound"
7

Poniższe polecenie daje ładne wyjście kolumnowe pokazujące użycie i skróty.

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

Daje to wynik, który wygląda

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

Pobierz to wyjście do pliku tekstowego za pomocą następującego polecenia

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

Plik jest tworzony w katalogu $ HOME.

Wyjaśnienie

  • dostaje wszystkie skróty.

    bind -P
  • usuwa wszystkie nieprzypisane skróty

    grep "can be found"
  • sortuje dane wyjściowe

    sort
  • wypisuje pierwszą kolumnę (tj. funkcję) i justuje tekst

    awk '{printf "%-40s", $1}
  • Jest to część poprzedniego polecenia. Drukuje kolumny 6+ (tj. Skróty).

    {for(i=6;i<=NF;i++){printf "%s ", $i}{printf"\n"}}'
  • Umieszcza dane wyjściowe w ładnym pliku tekstowym w katalogu domowym o nazwie skróty

    > shortcuts

Możesz dowiedzieć się, jak działa to polecenie, uruchamiając następujące polecenia.

bind -P
bind -P | grep "can be found"
bind -P | grep "can be found" | sort
zarejestrowany użytkownik
źródło
@SauravKumar Chcesz, żebym dodał coś do odpowiedzi?
Zarejestrowany użytkownik
2
+1 za odpowiedź i uczynić go bardziej sensowne .. :) brakowało mi się i zmienił cały sens zdania;) Nie, nie trzeba niczego dodawać. Dałeś z siebie wszystko ..
Saurav Kumar
+1 Ładne polecenie! Rozszerzyłem go, aby zawierał nie ustawione skróty: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, mam sposób na uzyskanie listy skrótów przez filtrowanie instrukcji bash . Poda także opis tego, co dokładnie robi każdy skrót. Dzięki Sparhawk, który oświecił mnie do znalezienia rozwiązania. Potrzebowałem nauczyć się używania wyrażeń regularnych, chociaż nadal nie jestem w tym dobry :)

Oto polecenie jednowierszowe:

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

Oto mała ekstrakcja wyniku:

   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.

Teraz, aby zapisać skróty do pliku:

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

To wszystko, czego potrzebowałem. Chciałem tylko poznać klawisze skrótów przypisane do bash i nie zmieniłem konfiguracji żadnych klawiszy, o co poprosił mnie BroSlow .

Jeszcze raz dziękuję wszystkim za ich wkład.

Uwaga :

Jeśli ktoś chce to poprawić, jest bardzo mile widziany. Wspomniałem tylko o sposobie wyświetlania skrótów przypisanych przez niektóre klawisze. Więc jeśli ktoś wie, jak wymienić te działania, które nie zostały przypisane do opisu w ten sposób , jest bardzo mile widziane :)

Saurav Kumar
źródło
Bardzo dobrze. Jednak jedynym problemem jest to, że spowoduje to wydrukowanie tylko pierwszego wiersza opisów wieloliniowych. Ponadto pomija nagłówki i polecenia bez domyślnych naciśnięć klawiszy (np. dump-macros), Chociaż może to być to, czego chcesz.
Sparhawk
1

Dopóki instrukcja bash nie zostanie zmodyfikowana w sposób powodujący, że to polecenie będzie niewłaściwe (co jest mało prawdopodobne), poniższe polecenie pokaże wszystkie domyślne skróty dla bash .

man bash | grep -A294 'Commands for Moving'

Daje to wynik, który wygląda następująco:

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

Jeśli instrukcja bash zostanie zmodyfikowana, to polecenie można łatwo zmienić w celu dopasowania do potrzeb.

zarejestrowany użytkownik
źródło
Dobra robota Patil !! Dlaczego nie pomyślałem o tym w ten sposób .. :)
Saurav Kumar
@Patil Myślałem też o zakodowaniu na stałe liczby linii, ale pomyślałem, że bardziej prawdopodobne jest, że w podręczniku bash zmieniono liczbę linii w sekcji poleceń, a nie zmieniono kolejność poszczególnych sekcji. Zgadzam się, że jedno z nich jest prawdopodobnie mało prawdopodobne.
Sparhawk