Dlaczego nie mogę wyróżnić tekstu w emulatorze terminala Linux za pomocą Shift + strzałek?

19

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.

Monguin
źródło
Zauważ, że zaznaczenie tekstu myszką nie zmienia pozycji kursora. Jeśli pomieszałeś zaznaczanie tekstu z wprowadzaniem zwykłych poleceń na klawiaturze, byłoby to naprawdę mylące poza granicami polecenia, które właśnie wpisałeś i jeszcze nie zostało wykonane. Czy za pomocą klawiatury możesz zaznaczać tekst poza granicami pola tekstowego na stronie internetowej? Należy również pamiętać, że istnieją programy takie jak screen, które pozwalają wejść w inny tryb, który ma zaznaczanie tekstu dla całego terminala, ale oczywiście nie pozwala już na wprowadzanie poleceń.
Daniel Beck
1
Daniel: konsola Matlab, na przykład, jest interfejsem CLI, który umożliwia podświetlanie tekstu za pomocą klawiatury. Działa to doskonale z mojego doświadczenia; w razie potrzeby pozwala na wybranie poza bieżącym jeszcze niewykonanym poleceniem, osobiście nie mam do tego większego zastosowania.
monguin
patrz także stackoverflow.com/questions/1536757/…
Nikos Alexandris,
i tutaj również stackoverflow.com/q/312213/1172302
Nikos Alexandris,

Odpowiedzi:

5

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:

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

Przesunąć w lewo i w prawo? W tym celu można skonfigurować Bash i zwykle jest on domyślnie. Zazwyczaj zmieniają one pozycję kursora.

ctrl + c / ctrl + v, aby skopiować / wkleić

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-terminalna przykład podczas.)

Dodatkowo xsel -bmoże służyć do przesuwania zawartości schowka. Zależy od dokładnej oceny, czy xselwersja pasty terminala jest bardziej przydatna. Zobaczyć man xsel.

Shift + strzałka, aby podświetlić tekst Shift + Ctrl + strzałka, aby podświetlić całe słowo

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

Tanatos
źródło
5
Doceniam czas poświęcony na napisanie odpowiedzi, ale jakoś nie wydaje mi się, że lepiej rozumiem, dlaczego nie jest to dostępna w emulatorach terminali. Wskazałeś mi nowy pomysł - emulator terminala jest wyjątkowy, ponieważ może uruchamiać inne programy - ale nie rozumiem, dlaczego tylko wybrany podzbiór kombinacji klawiszy jest niemożliwy do udostępnienia użytkownikowi.
monguin
2
Emulatory terminali emulują fizyczne terminale . Nie zostały utworzone od podstaw, aby zapewnić interfejs wiersza polecenia. Rzeczy takie jak Control-C nabrały znaczeń na długo przed tym, zanim Microsoft zdecydował się na dodanie ich jako skrótów klawiaturowych, a emulatory terminali muszą się do nich stosować.
chepner
2
Myślę, że diabeł tkwi w szczegółach tutaj. To nie jest niemożliwe: myślę, że ekran ma tryb robienia tego, co chcesz. Ale aby to osiągnąć, musisz przejść do trybu „Chcę wybrać rzeczy”. gnome-terminalmiał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.
Tanatos
1
Wybór bloku to sposób na wybranie prostokąta: Przytrzymaj kontrolę i przeciągnij w terminal gnome, a powinieneś natychmiast zobaczyć, jak jest inaczej. Większość emulatorów terminali GUI ma tę funkcję, a także najbardziej zaawansowane edytory tekstu. (Zobacz na przykład Blok wizualny w vimie.)
Thanatos
1
Ach, więc znam blokowe wybieranie, ale nie znałem nazwy. Nie znam też skrótu klawiaturowego GUI dla tego działania, więc wymyślenie takiego skrótu nie wydaje się konieczne, aby odpowiedzieć na moje pytanie. Doceniam komentarze wszystkich tutaj, ale ponieważ wciąż jestem niezadowolony, sądzę, że wszystko, co mogę teraz zrobić, to sam
zagrzebać
1

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

Alex
źródło
1

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, sttyaby wysłać SIGINTi 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), wykonaj

stty intr '^Q' 2>/dev/null  # To send SIGINT I will use ctrl-q
stty lnext '^A' 2>/dev/null # To insert a character verbatim I will use ctrl-a

Nastę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.

spelufo
źródło
1
Dzięki za odpowiedzi. W międzyczasie przyzwyczaiłem się do wiązań OSX i Emacsa, a także po prostu zrezygnowałem z marzeń o ctrl + shift + strzałka w terminalu ...
monguin
1

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:

  1. Powłoka nie może łatwo obsłużyć tych kluczy, ponieważ ostatecznie będziesz chciał skopiować zaznaczony tekst do schowka, a schowek jest koncepcją X Windows, do której muszla niekoniecznie ma dostęp (ale zobacz 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.
  2. Tymczasem emulator terminala nie odpowiada za lokalizację kursora. Nawet jeśli emulator terminala mógłby zmienić położenie kursora, prawdopodobnie nie wie, gdzie zaczyna się i kończy bieżąca linia tekstu. Na przykład terminal może zawierać tekst podobny do~ $ ls -l a emulator terminalu nie wie, że tylko ls -lczęść 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.

Qwertie
źródło
Dzięki, przeczytam ten artykuł TTY, ale jeszcze nie. To może wyjaśniać różnicę w moim rozumieniu różnicy między „emulatorami terminali” a „aplikacjami komputerowymi obsługującymi programy tekstowe”. Mój wcześniejszy przykład, konsola Matlab, zachowuje się dokładnie tak, jak chcę. Nie rozumiem, dlaczego nie może być aplikacji komputerowej z takim zachowaniem, w której działający program tekstowy jest czymś innym niż Matlab. Powiedzmy, że chciałem używać tylko najbardziej podstawowych poleceń powłoki - ls, cd, cp, mv - wtedy nie widzę żadnego konfliktu. Rozumiem, że programy takie jak screen lub tmux mogą utrudniać pracę.
monguin,
1

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:

microEdytor tekstu jest najlepszy, jaki widziałem w emulacji edytora tekstu GUI, podobny do DOS  edit, ale z bardziej nowoczesnych funkcji a la Sublime Text. nejest 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 libvtetemu może być łatwo zbudować podstawowy wirtualny terminal, który sam obsługuje te skróty klawiszowe. Dużo pracy za drobny zysk.

Gringo Suave
źródło
0

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.

Dotknięta Mandela
źródło
Czy odpowiedziałeś na złe pytanie? To było ogólne pytanie o możliwości wszystkich emulatorów terminali. Jest całkiem jasne, że nie ma „rozwiązania”. Nie teraz, ani nigdy nie miałem Clipit zainstalowanego na żadnej maszynie.
monguin