zmienić klawisze skrótu bash, takie jak Ctrl-C?

21

Używam Kubuntu 10.04. Chciałbym zmienić niektóre standardowe klawisze skrótów do bash (terminal).

Oto skróty, które chciałbym skonfigurować:

  • Ctrl- Caby skopiować zaznaczony tekst z terminala do schowka.

  • Ctrl- Vwkleić ze schowka do terminala.

  • Ctrl- Zaby cofnąć edycję na bieżącej linii w terminalu.

  • Ctrl- Shift- C(lub nawet lepiej Super- C), aby zakończyć polecenie.

  • Ctrl- Shift- Z(lub Super- Z) jako polecenie w tle.

  • Ctrl- Shift- V(lub Super- V), aby być dosłowną komendą wstawiania (lub cokolwiek Ctrl- zwcześniej).

Jak wprowadzić te zmiany?

BTW, podoba mi się sposób, w jaki terminal działa w systemie OS X. Użycie klawisza polecenia sprawia, że ​​wszystkie polecenia kopiuj / wklej są bardzo spójne (w przeciwieństwie do wielu innych rzeczy w OS X).

PS Przeczytałem stronę podręcznika bash i to nie pomogło. Dało mi to pomysły, ale potrzebuję konkretnych przykładów dla powyższych kombinacji. Dzięki.

Paweł
źródło
niektóre z tych „skrótów” nie mogą być „zaimplementowane” w bash, ale muszą zostać umieszczone na samym terminalu (xterm, terminal gnome, konsola itp.) .. np. „zaznaczony tekst”, „schowek”
akira

Odpowiedzi:

10

To nie są cechy bash, to cechy sterownika terminalu. Jako takie są one określone przez stty(1).

$ stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
Ignacio Vazquez-Abrams
źródło
5
DOBRZE. Dzięki za wskazówkę. Teraz nadal chciałbym osiągnąć mój cel. Wiem też, że inputrc może odwzorować Ctrl-C. Ale tak naprawdę nie dbam o to, jak to robię, chcę tylko wiedzieć, jak zmienić mapowanie tych skrótów w terminalu.
Paul
15
Oto „fish”: stty intr \ ^ k (gdzie polecenie zakończenia, dawniej Ctrl-C zmienia się teraz w Ctrl-K, K może być dowolnym klawiszem alfa) Nikt „nie dał mi tej ryby”. Ciężko pracowałem, aby znaleźć to na własną rękę. Więc głoszenie przysłów sprawia, że ​​wyglądasz jak palant, IMO.
Paul
Jak zmienić mapowanie na Ctrl + Shift + C?
crypdick
8

Teraz jest to prawie całkowicie rozwiązane. Część rozwiązania po raz pierwszy zwrócił moją uwagę MTK358 na stronie http://www.linuxquestions.org/questions/linux-software-2/change-bash-shortcut-keys-such-as-ctrl-c-818170/ . Zwrócił uwagę na (raczej oczywisty, ku mojemu zażenowaniu) fakt, że klawisze skrótów kopiowania i wklejania można łatwo zmienić za pomocą ustawień menu konsoli. Gdy to zobaczyłem, skonfigurowanie Ctrl-C i Ctrl-V zajęło około minuty, aby skopiować i wkleić z terminalem.

Druga część rozwiązania powinna być jasna ze strony stty man, ale nie była (dla mnie). Skończyło się na eksperymentowaniu na podstawie różnych wskazówek, takich jak te zamieszczone powyżej.

Zdecydowałem, który klucz nienumeryczny chcę zastąpić Ctrl-C jako polecenie zakończenia. (Użyłem „k”). Nigdy nie znalazłem żadnych informacji o tym, jak przekazać modyfikator zmiany do stty, więc zrezygnowałem z tego. Po podjęciu tej decyzji jedyne, co musiałem zrobić, to wpisać w wierszu polecenia:

stty intr \ ^ k

Sprawdziłem, czy wszystko działa zgodnie z oczekiwaniami.

Teraz po prostu musiałem umieścić jedno polecenie powyżej (stty intr \ ^ k) w skrypcie startowym. Nie jestem pewien, który z nich jest „właściwy”. Chciałbym, aby ta zmiana miała charakter systemowy i trwała.

Wszelkie sugestie dotyczące tego, w którym skrypcie powinienem umieścić polecenie?

Wreszcie, jeśli chodzi o odpowiedzi kaznodziejów, są one niepotrzebne i nieprzydatne.

Paweł
źródło
Czy zdarzyło Ci się kiedyś ustalić, jaki jest „właściwy” skrypt startowy, lub lepszy sposób na zrobienie tego? Walczę z tym samym problemem (twoje pierwotne pytanie). Ale chociaż mogę sprawić, że „stty intr \ ^ k” wiąże ctrl-k, to nie jest to unbinding ctrl-c i ani „stty intr undef”, ani „stty intr = ^ -” to zrobić, ctrl-c nadal wysyła przerwanie . I „stty -a” nigdy nie pokazuje żadnych zmian, które wprowadziłem.
EricS
4

Niektóre z nich można ustawić za pomocą normalnego mechanizmu skrótów klawiaturowych KDE. W menu „Ustawienia” Konsoli kliknij „Konfiguruj skróty”, a otrzymasz okno dialogowe, za pomocą którego możesz zmienić powiązania klawiszy dla funkcji obsługiwanych przez KDE. Umożliwi to ponowne mapowanie klawiszy Ctrl + C, aby skopiować, i Ctrl + V, aby wkleić - ale pamiętaj, że gdy to zrobisz, te sekwencje klawiszy nie będą już przekazywane do terminala, więc nie będziesz mógł użyć Ctrl + C, na przykład, aby przerwać program.

Inne funkcje są kontrolowane przez readlinebibliotekę, którą można skonfigurować poprzez edycję pliku ~/.inputrc. Aby Ctrl + Z cofnął wszelkie zmiany dokonane w bieżącym wierszu, należy dodać

C-z: revert-line

ale ta sekwencja klawiszy jest już prawdopodobnie uwięziona przez terminal, więc być może będziesz musiał użyć, sttyaby ją odłączyć, zanim zadziała. Najpierw wyszukaj ^Zw wynikach stty -a(jak pokazano w odpowiedzi Ignacio), a następnie, na przykład, jeśli pojawi się w susp = ^Z, uruchom

stty susp ^-

aby usunąć powiązanie tego klucza.

Inne zmiany, o które pytasz, musiałyby zostać wykonane, sttyjak mówi Ignacio, ponieważ są to funkcje terminalowe, ale nie jestem pewien, jak dokładnie. Problem polega na tym, że nie wiem, czy terminal rozpoznaje Shift, a jeśli tak, to w jaki sposób przekazać te informacje stty.

David Z
źródło
3

Bash używa emacslub vitrybu w linii poleceń. Nie ma pojęcia „wybór” ani „schowek”. Używa takich rzeczy, jak „bufor zabijania” i „punkt”, „znak”, „słowo”, „linia”, „zabij” i „szarpnięcie” itp.

Próba wprowadzenia do niego funkcjonalności przypominającej interfejs GUI będzie co najwyżej frustrująca i nie zadziała w pełni. Trzeba będzie spróbować połączyć funkcje stty, readlinea terminal (prawdopodobnie Terminal.appdla ciebie). Trzeba będzie przemapować funkcje, takie jak intr, susp, lnext, itd., Więc nadal można korzystać z ich możliwości.

Zdecydowanie odradzam takie radykalne modyfikacje. Po prostu nie został zaprojektowany do robienia tego, co chcesz.

Kiedy w Rzymie...

Wstrzymano do odwołania.
źródło
Dave, w przypadku systemu, który działa podobnie jak OS X, czy mogę zasugerować użycie OS X? Jak zasugerował Dennis, nawet jeśli możesz sprawić, że zadziała, będziesz dość zapadnięty, gdy zalogujesz się jako cokolwiek innego niż na własnym komputerze.
msw
Nie mogę poręczyć za inne polecenia, ale kopiowanie i wklejanie ma idealny sens w oknie poleceń i są bardzo przydatne. Używam ich stale do kopiowania i wklejania między innymi oknami i konsolą, i robię to od wielu lat. Shift-Ctrl-C i Shift-Ctrl-V działają w ten sposób dla Konsoli po wyjęciu z pudełka. I chociaż robię to codziennie od lat, nieuchronnie zapominam i wciskam Ctrl-c w Konsole. Osobiście jestem gotowy przestać stosować powiedzenie „When in Rome” i przekształcić je tak, aby działały jak KAŻDE inne istniejące aplikacje.
EricS
1

Uruchamiam Ubuntu i zmieniłem skrót do Kopiuj z domyślnego Ctrl+ Shift+ Cna bardziej normalny i prosty Ctrl+ C. To jednak sprawiło, że napotkasz problemu nie jest w stanie wysłać polecenie przerwania ^ C .

Dzięki odpowiedzi @Paul znalazłem uruchomienie polecenia

tty intr \^k

Pozwoli mi wysłać polecenie przerwania za pomocą Ctrl+ K. Jednak to polecenie musiało być uruchamiane za każdym razem, gdy otwieram terminal, co jest kłopotliwe (tak jak sam wspomniał).

Przy odrobinie dalszych badań (googling 😂) odkryłem, jak wykonać polecenie za każdym razem, gdy terminal jest otwierany (w każdym razie w Ubuntu) .

Tak więc, ostatecznie uruchomienie następującego polecenia (raz) (w Ubuntu 18.04 i prawdopodobnie więcej) da oczekiwane zachowanie za każdym razem.

echo $'# Make Ctrl+K interrupt command in terminal\nstty intr \^k\n' >> ~/.bashrc

Na koniec warto wspomnieć, że nie wolno używać Kprzycisku. Możesz zamienić literę k we wszystkich powyższych poleceniach na dowolny wybrany klawisz litery.

Wiggy Lindholm
źródło