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?
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ą.
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
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
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.
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"'
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