Są to standardowe skróty klawiaturowe do edycji tekstu, których używam stale podczas edycji tekstu, dosłownie, w dowolnej aplikacji linuksowej innej niż emulatory terminali:
- strzałki w lewo + prawo, aby przejść w lewo + prawo
- ctrl + strzałka, aby przenieść całe słowo
- home / end, aby przejść na początek / koniec linii
- ctrl + c / ctrl + v, aby skopiować / wkleić [niektóre terminale mogą używać shift-ctrl-C / shift-ctrl-V; to dobry zamiennik]
- Shift + strzałka, aby podświetlić tekst
- Shift + Ctrl + Strzałka, aby podświetlić całe słowo
Nigdy nie znalazłem kombinacji emulatora powłoki plus terminalu, która pozwala na ostatnie dwa elementy na tej liście i doprowadza mnie to do szału. Oczywiście emulatory terminali obsługują podświetlanie (mysz może to robić) i obsługują użycie klawiszy Ctrl i Shift jako modyfikatorów (można ich używać do przesuwania kursora o całe słowo i do pisania liter odpowiednio; [edit:] można ich nawet używać razem do kopiowania / wklejania za pomocą shift-ctrl-C i shift-ctrl-V), więc na czym polega problem uniemożliwiający tę funkcjonalność? Mam kilka pytań:
- Czy to problem z moim emulatorem terminala, czy z moją powłoką (bash, choć jestem gotów to zmienić)?
- Dlaczego emulatory / powłoki terminali nie są zgodne z tym uniwersalnym standardem?
- Jeśli istnieje rzeczywista przyczyna, to jest stara i przestarzała, czy jest to nadal istotne dla znacznej liczby pulpit użytkowników Linuksa?
- Czy istnieje jakieś obejście?
- Czy istnieje jakiś niejasny program, który może to obsługiwać?
- Czy jest możliwe zmodyfikowanie źródła, powiedzmy, gnome-terminal, aby to obsługiwać?
Wiem, że tekst można skopiować / wkleić za pomocą myszy, nie o to pytam. Pytam, dlaczego nie mogę robić tych rzeczy za pomocą klawiatury w emulatorze terminali.
źródło
Odpowiedzi:
Myślę, że byłoby to najbardziej przydatne, gdybym wziął ten kawałek na raz. Ogólny problem brzmi: dla kogo przeznaczone jest naciśnięcie klawisza? Terminal czy program działający w terminalu?
Na przykład „screen”, który jest swego rodzaju terminalem, używa Ctrl+ Ajako prefiksu dla swoich poleceń, aby odróżnić je od rzeczy, które trafiają do samego uruchomionego programu. (I zapewnia sposób na wysłanie Ctrl+ A.)
gnome-terminal
ma kilka kluczy, które przechwytuje, aby wykonywać różne czynności, w tym te, o które pytasz.Należy również pamiętać, że „podświetlanie” terminala jest niezależne od pozycji kursora terminala . Niektóre terminale nie mają żadnej możliwości wyróżnienia.
Teraz, biorąc te kluczowe kombinacje na raz:
Przesunąć w lewo i w prawo? W tym celu można skonfigurować Bash i zwykle jest on domyślnie. Zazwyczaj zmieniają one pozycję kursora.
Po pierwsze: czy kopiowanie / wklejanie ma w ogóle sens? Jeśli jesteś na VT, tak naprawdę nie masz schowka, szczególnie jeśli X nie działa.
Niektóre terminale mogą kopiować tekst na wyjściu, a niektóre „wklejają”, symulując pisanie zawartości schowka. Na przykład Ctrl+ Shift+ Vjest wklejany
gnome-terminal
, co może pomóc. (A Ctrl+ Shift+ Cto kopiowanie.) Jak wspomniano wcześniej, dużym problemem z Ctrl+ Ci Ctrl+ Vjest to, że nakładają się one na popularne polecenia terminala / programu. ( Ctrl+ Cto send interrupt (SIGINT), a Ctrl+ Vto dosłownie.)Niektóre terminale obsługują również dwa tryby kopiowania danych: bardziej normalne „po prostu kopiuj” i tak zwane „wybieranie bloku” lub „kopiowanie bloku”. (Przytrzymaj Ctrl, a następnie przeciągnij,
gnome-terminal
na przykład podczas.)Dodatkowo
xsel -b
może służyć do przesuwania zawartości schowka. Zależy od dokładnej oceny, czyxsel
wersja pasty terminala jest bardziej przydatna. Zobaczyćman xsel
.Najważniejsze informacje o twoim terminalu (jeśli ma taką możliwość) są niezależne od pozycji kursora. Ponownie, brak dostępnych kombinacji klawiszy jest prawdopodobnie czynnikiem. Pamiętaj, że wyróżnienie ma dwie pozycje: albo początek i koniec, lub lewy górny i prawy dolny róg. Jak zarządzasz obydwoma?
Na koniec zauważ, że wiele terminali GUI, dwukrotne kliknięcie słowa podświetli go. (A w X skopiuj do wyboru podstawowego.)
screen
, na przykład, ma klawisze do przełączania w tryb do poruszania się po buforze (poprzednie wyjście) i kopiowania / wklejania.Myślę, że jeśli odpowiednio wykorzystasz
xsel
i podstawowy wybór, zauważysz, że operacje w schowku są zarówno wystarczająco rzadkie, jak i wystarczająco złożone, aby zasługiwać na użycie myszy.źródło
gnome-terminal
miałyby podobne problemy: prawdopodobnie nie wdrożyły go, ponieważ nie robisz tego dokładnie. Pamiętaj, że powłoka nie jest jedynym uruchomionym programem: każdy program może być uruchomiony i może chcieć użyć dowolnej sekwencji klawiszy, której możesz użyć do kopiowania / wklejania do własnych celów. screen ma sposoby na przesłanie klawiszy, które zastępuje, a gnome-terminal próbuje nie nadepnąć na palce.Nie jestem ekspertem od emulatorów terminali, ale ...
aplikacje takie jak bash (readline) działające na emulatorze terminali nic nie wiedzą o działającym systemie X Window i oknie X, w którym się znajdują, znają stdin i stdout na urządzeniu końcowym (ttyS / ttyUSB / tty / pts na Linuksie).
Problem nie jest pokazanie wyróżnionego tekstu, ale jak powiadomić aplikację X Window (emulator terminala), że ten tekst został zaznaczony za pomocą tych urządzeń końcowych.
I odgadnąć X aplikacji Terminal otwarte jedno z tych urządzeń w wejścia i wyjścia, a następnie przełożyć X kluczowych wydarzeń właściwie wyjścia (z boku) X wejście (od strony bash). Viceversa wyjście bash strumień do wejścia X na wejściu , tutaj terminal X przetwarza to wejście, aby przesunąć kursor, wypełnić tło pewnym kolorem, zgodnie z wyjściem aplikacji bash.
Na moje kody ucieczki wiedzy może być wykorzystane do kontroli szczególnych zachowań, jak jasny, wypełnienie tła, przesunąć kursor, a może jakiś niestandardowy kod ucieczka mogła być dodana do niech wiedzą, terminal X, że tekst z rzędu kol do rzędu kol został wybrany, tylko przykład, może zamiast tego wybrany tekst może zostać po prostu zwrócony (szczegóły implementacji).
Tak myślę nie będąc standardową definicją, będziesz musiał załatać każdą aplikację, którą chcesz wesprzeć, aby wiedzieć, że kombinacja klawiszy została naciśnięta i wypisać odpowiedni kod ucieczki, readline, jeśli chcesz go w bash, emulator terminala X na z drugiej strony, aby poprawnie przetworzyć kod ucieczki (i na koniec wysłać informacje do schowka). Prawdopodobnie zaimplementowanie tego jako funkcji terminalu uratuje cię od łatania każdej aplikacji. Mam nadzieję (i przypuszczam), że sterowniki urządzeń końcowych w jądrze chcą wiedzieć mniej, jak to możliwe, o kodach specjalnych, więc jeśli będziesz miał szczęście, łatka nie będzie wymagana.
Terminal X rysuje dane wyjściowe, aby łatwo wiedzieć, kiedy używasz myszy, jaki tekst / znaki wybierasz.
Graficzny widget tekstowy wie wszystko o swoim oknie X, dlatego tak łatwo jest zaimplementować funkcję wyboru i kopiowania.
EDYTOWAĆ
Tutaj ta łatka do wyświetlania obrazu urxvt-9.16 może być dobrym punktem wyjścia do zrozumienia, co jest potrzebne do obsługi nowych kodów ucieczki. http://lists.schmorp.de/pipermail/rxvt-unicode/2013q1/001736.html
źródło
Podane odpowiedzi są dobrym wyjaśnieniem, dlaczego jest to trudne. Oto coś, co możesz zrobić w gnome-terminal, aby skonfigurować ctrl-ci ctrl-vskopiować i wkleić, jednocześnie wiążąc inne klucze w dyscyplinie terminalu,
stty
aby wysłaćSIGINT
i wstawić dosłownie znak. To nie jest kompletne rozwiązanie, ponieważ niektóre programy wyłączają dyscyplinę terminali i nie będzie można wysłać im „^ C” i „^ V”. Więcej informacji tutaj .W skrypcie uruchamiania powłoki (np
~/.bashrc
,~/.zshrc
,~/.rcrc
), wykonajNastępnie w gnome-terminal Edycja> Preferencje> Skróty możesz powiązać Kopiuj i Wklej do ctrl-c i ctrl-v. Zauważ, że terminal otrzyma kluczowe zdarzenia, zanim cokolwiek zostanie wysłane do urządzenia końcowego, więc odtąd nie będziesz mógł wysyłać „^ C” i „^ V” do dowolnego procesu uruchomionego na terminalu.
Właśnie to zrobiłem i zobaczę, jak to idzie i jakie problemy to powoduje. Zrobiłem warunkowo, aby zastosować je tylko wtedy, gdy używam X.
źródło
Jak wspomniano Thanatos, należy rozróżnić emulator terminala (działający na X Windows lub Wayland) i programy działające w terminalu (nazwijmy to „powłoką”, chociaż może nie być); te dwie rzeczy są od siebie odizolowane (patrz szczegóły techniczne ).
Pierwsze pozycje na liście (klawisze strzałek, Home / End itp.) Są obsługiwane bezpośrednio przez program wewnątrz terminala, więc pozycja kursora jest kontrolowana przez program wewnątrz terminala.
Z drugiej strony skróty do kopiowania i wklejania (Ctrl + Shift + C i Ctrl + Shift + V) są obsługiwane przez emulator terminala, który rozumie mysz (dzięki czemu można zaznaczać tekst za pomocą myszy), wie, co to jest na ekranie (aby mógł kopiować) i może wysyłać naciśnięcia klawiszy do programu wewnątrz (aby mógł wkleić).
Aby obsługiwać Shift + Strzałka w lewo i Shift + Strzałka w prawo, emulator terminala lub powłoka musiałyby obsłużyć naciśnięcie klawisza. Tak czy inaczej mamy problem:
xclip
). I o ile wiem, jeśli powłoka obsługuje zaznaczanie tekstu, Linux nie definiuje żadnego mechanizmu powiadamiającego emulator terminala o tym, co jest zaznaczone.~ $ ls -l
a emulator terminalu nie wie, że tylkols -l
część należy do użytkownika.Nie jest trudno wyobrazić sobie emulator terminala, który obsługuje wybór za pomocą Shift + Strzałki, ale myślę, że musiałby ukryć kursor powłoki i wprowadzić własny „fałszywy kursor”, który istnieje tymczasowo, aby pomóc ci wybrać coś, a następnie możesz nacisnąć Ctrl + C / Ctrl + Shift + C / Ctrl + Ins, aby skopiować (lub Esc, aby anulować) i ponownie wyświetlić prawdziwy kursor. Nie miałoby to oczywiście wszystkich możliwości normalnego wyboru - w szczególności nie byłoby możliwości wycinania i usuwania.
źródło
Są to opisane przez Ciebie powiązania klawiaturowe CUA, standard firmy IBM z połowy lat 80-tych:
https://en.wikipedia.org/wiki/IBM_Common_User_Access
Zazwyczaj są one wdrażane we wszystkich tworzonych środowiskach komputerowych. Narzędzia DOS, Windows, Motif, a nawet Netware są zbieżne w tym standardzie. Jednym wyjątkiem jest Mac, który używa dość podobnego, ale innego zestawu (Cmd zamiast Ctrl) z tego samego okresu.
Jednak terminale uniksowe znacznie wyprzedzają ten standard i w większości go ignorują. Ponadto, jeśli zaimplementują te powiązania klawiszy, może to zakłócać programy TUI, które już je wykorzystują do innych funkcji. Chociaż jest to technicznie wykonalne, problematyczne.
Aplikacje:
micro
Edytor tekstu jest najlepszy, jaki widziałem w emulacji edytora tekstu GUI, podobny do DOSedit
, ale z bardziej nowoczesnych funkcji a la Sublime Text.ne
jest starszy w repozytoriach Debiana, a nawetnano
może być skonfigurowany z rozsądnymi skrótami klawiszowymi. Ale goły terminal / powłoka, nie.Dzięki
libvte
temu może być łatwo zbudować podstawowy wirtualny terminal, który sam obsługuje te skróty klawiszowe. Dużo pracy za drobny zysk.źródło
Pomogłem tylko znajomemu przez podobny problem i dowiedziałem się, że winowajcą jest clipit menedżera schowka.
sudo apt-get remove clipit
był w stanie przywrócić mu wszystko do porządku. Mam nadzieję, że może to pomóc komuś innemu.
źródło