W bash, jak powiązać klawisz funkcyjny z poleceniem?

Przykład: chcę powiązać klawisz F12 z poleceniem echo "foobar" tak, aby za każdym razem, gdy nacisnę F12 wiadomość "foobar" zostanie wydrukowana na ekranie. Najlepiej byłoby, gdyby to było dowolne polecenie powłoki, a nie tylko builtins. Jak to się robi?

Author: SiegeX, 2010-11-17

4 answers

Możesz określić sekwencję znaków emitowaną przez klawisz naciskając Ctrl-v w linii poleceń, a następnie naciśnięcie interesującego cię klawisza. W moim systemie dla F12 , dostaję ^[[24~. ^[ reprezentuje Esc . Różne typy terminali lub emulatorów terminali mogą emitować różne kody dla tego samego klucza.

W wierszu polecenia Bash możesz wprowadzić takie polecenie, aby włączyć makro klucza, dzięki czemu możesz go wypróbować.

bind '"\e[24~":"foobar"'

Teraz, Kiedy ty naciśnij F12 , otrzymasz "foobar" w wierszu poleceń gotowy do dalszej edycji. Jeśli chcesz nacisnąć klawisz, aby natychmiast wprowadzić polecenie, możesz dodać nową linię:

bind '"\e[24~":"pwd\n"'

Teraz, gdy naciśniesz F12, wyświetli się bieżący katalog bez konieczności naciskania Enter. Co zrobić, jeśli już wpisałeś coś w linii i używasz tego, co automatycznie wykonuje? Może być bałagan. Możesz jednak oczyścić linię jako część swojego makro:

bind '"\e[24~":"\C-k \C-upwd\n"'

Spacja zapewnia, że Ctrl-u ma coś do usunięcia, aby dzwonek nie zadzwonił.

Gdy makro będzie działać tak, jak chcesz, możesz uczynić je trwałym, dodając je do pliku ~/.inputrc. Nie ma potrzeby stosowania komendy bind ani zewnętrznego zbioru pojedynczych cudzysłowów:

"\e[24~":"\C-k \C-upwd\n"

Edit:

Możesz również utworzyć powiązanie z kluczem, które wykona coś bez zakłócania bieżącego polecenia Kolejka

bind -x '"\eW":"who"'

Następnie podczas wpisywania polecenia, które wymaga na przykład nazwy użytkownika i musisz znać nazwy użytkowników, którzy są zalogowani, możesz nacisnąć Alt-Shift-W i wyjście who zostaną wyświetlone, a monit zostanie ponownie wydany z częściowym poleceniem nienaruszonym i kursorem w tej samej pozycji w wierszu.

Niestety, nie działa to poprawnie w przypadku kluczy takich jak F12, które wypisują więcej niż dwa postaci. W niektórych przypadkach można to obejść.

Polecenie (who w tym przypadku) może być dowolnym programem wykonywalnym - programem, skryptem lub funkcją.

 127
Author: Dennis Williamson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-16 19:43:33

Możesz zdefiniować powiązania klawiszy bash w .inputrc (plik konfiguracyjny biblioteki GNU Readline). Składnia to

: makro

Na przykład:

Control-o: "> output"

Utworzy makro, które wstawia "> output " po naciśnięciu

 "\e[11~": "echo foobar"

Utworzy makro, które wstawia "echo foobar" po naciśnięciu F1... Nie wiem jaki jest keysym do F11

 12
Author: Barton Chittenden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-17 03:26:02

To rozwiązanie jest specyficzne dla środowisk X11 i nie ma nic wspólnego z bash, ale dodanie następujących elementów do twojego .Xmodmaps

 % loadkeys
 keycode 88 = F12
 string F12 = "foobar"
 %

Wyśle łańcuch "foobar" do terminala po naciśnięciu F12.

 8
Author: Wesley Rice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-17 01:59:28

Chciałem powiązać Ctrl+B z poleceniem. Zainspirowany powyższą odpowiedzią, próbowałem użyć bind, ale nie mogłem dowiedzieć się, jaka seria tajemniczych zawijasów (\e[24~?) translate to Ctrl+B.

Na komputerze Mac przejdź do ustawień aplikacji Terminal, profile - > klawiatura - > + następnie naciśnij skrót klawiaturowy, którego szukasz i wyjdzie. Dla mnie Ctrl+B zaowocowało \002 które z powodzeniem połączyłem z poleceniem

bind '"\002":"echo command"'

Również, jeśli chcesz, aby polecenie zostało wykonane od razu (nie tylko wstawiony do wiersza polecenia), możesz dodać Enter na końcu polecenia, w ten sposób:

bind '"\002":"echo command\015"'

 1
Author: Peter Perháč,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-20 09:55:47