Warum kann ich in einem Linux-Terminal-Emulator mit Umschalt + Pfeiltasten keinen Text markieren?

19

Dies sind die Standard-Tastenkombinationen für die Textbearbeitung, die ich ständig verwende, wenn ich Text in einer anderen Linux-Anwendung als Terminalemulatoren bearbeite:

  • Pfeiltasten links + rechts zum Bewegen nach links + rechts
  • Strg + Pfeil, um ein ganzes Wort zu verschieben
  • home / end zum Anfang / Ende der Zeile bewegen
  • Strg + C / Strg + V zum Kopieren / Einfügen [Einige Terminals können Shift-Ctrl-C / Shift-Ctrl-V verwenden. das ist ein guter Ersatz]
  • Umschalt + Pfeil, um Text zu markieren
  • Umschalt + Strg + Pfeil, um ein ganzes Wort zu markieren

Ich habe noch nie eine Kombination aus Shell und Terminal-Emulator gefunden, die die letzten beiden Elemente dieser Liste zulässt, und das macht mich verrückt. Offensichtlich unterstützen Terminal-Emulatoren das Hervorheben (die Maus kann es tun) und sie unterstützen die Verwendung der Strg- und Umschalttaste als Modifikatoren (sie können verwendet werden, um den Cursor um ein ganzes Wort zu bewegen bzw. um Buchstaben in Großbuchstaben zu schreiben; [Bearbeiten:] Sie können sogar zusammen zum Kopieren / Einfügen mit UMSCHALT-STRG-C und UMSCHALT-STRG-V verwendet werden. Worin besteht also das Problem, das diese Funktionalität verhindert? Ich habe mehrere Fragen:

  • Ist dies ein Problem mit meinem Terminal-Emulator oder mit meiner Shell (Bash, obwohl ich bereit bin zu ändern)?
  • Warum entsprechen Terminal-Emulatoren / Shells nicht diesem ansonsten universellen Standard?
  • Wenn es einen tatsächlichen Grund gibt, ist er alt und veraltet, oder ist er für eine beträchtliche Anzahl von Desktop- Linux-Benutzern immer noch relevant ?
  • Gibt es eine Art von Problemumgehung?
  • Gibt es ein obskures Programm, das dies unterstützt?
  • Ist es möglich, die Quelle von beispielsweise Gnome-Terminal zu ändern, um dies zu unterstützen?

Ich weiß, dass Text mit der Maus kopiert / eingefügt werden kann, danach frage ich nicht. Ich frage, warum ich diese Dinge nicht mit der Tastatur in einem Terminalemulator machen kann.

Monguin
quelle
Beachten Sie, dass das Auswählen von Text mit der Maus die Cursorposition nicht ändert. Wenn Sie in Textauswahl mit der Eingabe reguläre Befehle auf der Tastatur mischen würden, würde es nur sein , wirklich über die Grenzen des Befehls verwirrend Sie gerade eingegeben und noch nicht ausgeführt. Können Sie mit der Tastatur Text über die Grenzen des Textfelds auf einer Webseite hinaus auswählen? Bitte beachten Sie auch, dass es Programme wie screen gibt, mit denen ein anderer Modus aufgerufen werden kann, in dem Text für das gesamte Terminal ausgewählt werden kann, die Eingabe von Befehlen jedoch nicht mehr möglich ist.
Daniel Beck
1
Daniel: Die Matlab-Konsole ist zum Beispiel eine CLI, mit der Text mit der Tastatur hervorgehoben werden kann. Es funktioniert meiner Erfahrung nach perfekt; es erlaubt auf Wunsch eine Auswahl über den aktuell noch nicht ausgeführten Befehl hinaus, ich persönlich habe wenig Verwendung dafür.
Monguin
Siehe auch stackoverflow.com/questions/1536757/…
Nikos Alexandris
und auch hier stackoverflow.com/q/312213/1172302
Nikos Alexandris

Antworten:

5

Ich denke, es wäre am nützlichsten, wenn ich das Stück für Stück machen würde. Das allgemeine Problem ist: Für wen ist der Tastendruck bestimmt? Das Terminal oder das Programm, das im Terminal ausgeführt wird?

Als Beispiel verwendet "screen", eine Art Terminal, Ctrl+ Aals Präfix für seine Befehle, um sie von Dingen zu unterscheiden, die an das laufende Programm selbst gehen. (Und bietet eine Möglichkeit, Ctrl+ zu senden A.)

gnome-terminal hat mehrere Schlüssel, die es erfasst, um verschiedene Dinge zu tun, einschließlich einiger, nach denen Sie fragen.

Beachten Sie auch, dass die "Hervorhebung" eines Terminals von der Cursorposition des Terminals getrennt ist . Einige Terminals können überhaupt nicht hervorgehoben werden.

Nehmen Sie nun die folgenden Tastenkombinationen gleichzeitig:

Links + Rechts-Pfeile, um nach links + rechts zu gehen. Strg + Pfeil, um ein ganzes Wort nach Hause zu bewegen

Bewegen Sie was nach links und rechts? Bash kann dazu konfiguriert werden und ist in der Regel standardmäßig. In der Regel verschieben diese die Cursorposition.

Strg + C / Strg + V zum Kopieren / Einfügen

Erstens: Macht Kopieren / Einfügen überhaupt Sinn? Wenn Sie sich in einem VT befinden, verfügen Sie nicht wirklich über eine Zwischenablage, insbesondere wenn X nicht ausgeführt wird.

Einige Terminals können Text in die Ausgabe kopieren, andere "einfügen", indem Sie den Inhalt der Zwischenablage simulieren. Ctrl+ Shift+ V, Zum Beispiel, ist Paste in gnome-terminal, die helfen können. (Und Ctrl+ Shift+ Cist Kopie.) Wie bereits erwähnt, besteht das große Problem bei Ctrl+ Cund Ctrl+ Vdarin, dass sie sich mit allgemeinen Terminal- / Programmbefehlen überschneiden. ( Ctrl+ Cist Sende-Interrupt (SIGINT) und Ctrl+V ist wörtlich.)

Einige Terminals unterstützen auch zwei Kopiermodi: ein normaleres "Nur-Kopieren" und das sogenannte "Block-Auswählen" oder "Block-Kopieren". (Halten Sie gedrückt Ctrlund ziehen Sie dann ingnome-terminal Kamera befinden.)

Darüber hinaus xsel -bkann zum Weiterleiten von Inhalten der Zwischenablage verwendet werden. Hängt von der genauen Situation ab, ob xseldie Paste-Version des Terminals nützlicher ist oder nicht. Sehen man xsel.

Umschalt + Pfeil, um Text hervorzuheben. Umschalt + Strg + Pfeil, um ein ganzes Wort hervorzuheben

Die Hervorhebung Ihres Terminals (sofern es über diese Funktion verfügt) ist von der Cursorposition getrennt. Auch hier ist der Mangel an verfügbaren Tastenkombinationen wahrscheinlich ein Faktor. Beachten Sie, dass ein Highlight zwei Positionen hat: entweder Anfang und Ende oder die obere linke und untere rechte Ecke. Wie schaffen Sie beides?

Beachten Sie schließlich, dass viele GUI-Terminals durch Doppelklicken auf ein Wort dieses hervorheben. (Und in X in die primäre Auswahl kopieren.)

screenHat beispielsweise Tasten zum Umschalten in einen Modus zum Bewegen des Puffers (vorherige Ausgabe) und zum Kopieren / Einfügen.

Ich denke, wenn Sie xseldie primäre Auswahl angemessen nutzen , werden Sie feststellen, dass die Vorgänge in der Zwischenablage selten genug und komplex genug sind, um sie mit der Maus durchzuführen.

Thanatos
quelle
5
Ich schätze die Zeit, die Sie gebraucht haben, um Ihre Antwort zu schreiben, aber irgendwie habe ich kein besseres Verständnis dafür, warum dies in Terminalemulatoren nicht verfügbar ist. Sie haben mich auf eine neue Idee hingewiesen - dass ein Terminal-Emulator einzigartig ist, da er andere Programme ausführen kann -, aber ich verstehe nicht, warum dem Benutzer nur eine ausgewählte Teilmenge von Tastenkombinationen nicht zur Verfügung gestellt werden kann.
Monguin
2
Terminalemulatoren emulieren physische Terminals . Sie wurden nicht von Grund auf neu erstellt, um eine Befehlszeilenschnittstelle bereitzustellen. Dinge wie Control-C hatten Bedeutungen festgelegt, lange bevor Microsoft beschlossen hatte, sie als Tastaturkürzel zu verwenden, und Terminalemulatoren mussten sich daran halten.
Chepner
2
Ich denke, der Teufel steckt hier im Detail. Es ist nicht unmöglich: Bildschirm hat einen Modus, um zu tun, was Sie wollen, denke ich. Um dies zu erreichen, müssen Sie jedoch in den Modus "Ich möchte Dinge auswählen" wechseln. gnome-terminalhätte ähnliche Probleme: Sie haben es wahrscheinlich nicht implementiert, weil es nicht genau das ist, was Sie tun. Denken Sie daran, dass nicht nur die Shell ausgeführt wird: Jedes Programm kann ausgeführt werden, und Sie können auch eine beliebige Tastenfolge verwenden, die Sie zum Kopieren / Einfügen für eigene Zwecke verwenden können. Der Bildschirm bietet Möglichkeiten, die von ihm überschriebenen Schlüssel zu senden, und das Gnome-Terminal versucht, nicht auf die Zehen zu treten.
Thanatos
1
Blockauswahl ist eine Möglichkeit, ein Rechteck auszuwählen: Halten Sie die Steuerung gedrückt und ziehen Sie mit der Maus in das Gnome-Terminal. Sie sollten sofort sehen, wie es sich unterscheidet. Die meisten GUI-Terminalemulatoren verfügen über diese Funktion und die meisten fortgeschrittenen Texteditoren ebenfalls. (Siehe Visual Block in Vim, zum Beispiel.)
Thanatos
1
Ah, dann bin ich mit Block Select vertraut, kannte den Namen aber nicht. Mir ist auch keine GUI-Tastenkombination für diese Aktion bekannt, sodass es nicht erforderlich ist, eine zu erfinden, um meine Frage zu beantworten. Ich schätze die Kommentare aller hier, aber da ich immer noch unzufrieden bin, kann ich jetzt wohl nur selbst in die Quelle graben ...
monguin
1

Ich bin kein Experte für Terminalemulatoren, aber ...

Anwendungen wie bash (readline), die in einem Terminalemulator ausgeführt werden, wissen nichts über das ausgeführte X-Window-System und das X-Window, in dem sie sich befinden. Sie kennen stdin und stdout auf einem Terminalgerät (ttyS / ttyUSB / tty / pts unter Linux).

Das Problem besteht nicht darin , hervorgehobenen Text anzuzeigen, sondern darin, wie die X-Window-Anwendung (der Terminal-Emulator) über diese Endgeräte darüber informiert wird, welcher Text ausgewählt wurde .

Ich vermute, die X-Terminal-Anwendung öffnet eines dieser Geräte in der Eingabe und Ausgabe und übersetzt dann die X-Tastenereignisse, um die Eingabe (von der X-Seite) (von der Bash-Seite) korrekt auszugeben . Verändert den Bash- Ausgabestream zum X-Terminal als Eingabe , hier verarbeitet das X-Terminal diese Eingabe, um den Cursor zu bewegen, füllt den Hintergrund mit etwas Farbe entsprechend der Ausgabe der Bash-Anwendung.

Meines Wissens nach können Escape-Codes verwendet werden, um bestimmte Verhaltensweisen zu steuern, z. B. Löschen, Füllen des Hintergrunds, Bewegen des Cursors, und möglicherweise kann ein benutzerdefinierter Escape-Code hinzugefügt werden, um das X-Terminal darüber zu informieren, dass ein Text von Zeile, Spalte zu Zeile, Spalte wurde ausgewählt, nur ein Beispiel, stattdessen könnte der ausgewählte Text einfach zurückgegeben werden (ein Implementierungsdetail).

Ich denke schon keine Standarddefinition. Sie müssen jede Anwendung, die Sie unterstützen möchten, patchen, um zu wissen, ob die Tastenkombination gedrückt wurde, und den entsprechenden Escape-Code ausgeben die andere Seite, um den Escape-Code richtig zu verarbeiten (und schließlich die Informationen in die Zwischenablage zu senden). Wahrscheinlich Umsetzung dieses als Terminal - Fähigkeit , die Sie von Patch jede einzelne Anwendung speichern. Ich hoffe (und rate), dass die Endgerätetreiber im Kernel weniger über Escape-Codes wissen wollen, wenn Sie Glück haben, wird kein Patch benötigt.

Das X-Terminal zeichnet die Ausgabe, sodass Sie bei Verwendung der Maus leicht erkennen können, welchen Text / welche Zeichen Sie auswählen.

Ein Grafiktext-Widget weiß alles über sein X-Fenster, weshalb es so einfach ist, select & copy zu implementieren.

BEARBEITEN

Hier könnte dieser urxvt-9.16-Image-Display-Patch ein guter Ausgangspunkt sein, um zu verstehen, was zur Unterstützung neuer Escape-Codes erforderlich ist. http://lists.schmorp.de/pipermail/rxvt-unicode/2013q1/001736.html

Alex
quelle
1

Die Antworten sind gute Erklärungen dafür, warum es schwierig ist, dies zu tun. Hier ist etwas, das Sie in gnome-terminal zum Einrichten ctrl-cund ctrl-vKopieren und Einfügen ausführen können, während Sie andere Schlüssel in der Terminaldisziplin erneut mit binden stty, SIGINTum ein Zeichen wörtlich zu senden und einzufügen. Dies ist keine vollständige Lösung, da einige Programme die Terminaldisziplin deaktivieren und Sie sie nicht mit '^ C' und '^ V' senden können. Mehr Infos hier .

In Ihrem Startskript Shell (zB ~/.bashrc, ~/.zshrc, ~/.rcrc), tun

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

Dann können Sie in gnome-terminal Bearbeiten> Einstellungen> Verknüpfungen Kopieren und Einfügen an Strg-C und Strg-V binden. Beachten Sie, dass das Terminal die Schlüsselereignisse erhält, bevor etwas an das Terminalgerät gesendet wird, sodass Sie von da an kein ^ C 'und ^ V' mehr an Prozesse senden können, die auf dem Terminal ausgeführt werden.

Ich habe das einfach gemacht und ich werde sehen, wie es geht und welche Probleme es verursacht. Ich habe die Bedingungen erfüllt, um sie nur anzuwenden, wenn ich X verwende.

spelufo
quelle
1
Danke für die Antwort. In der Zwischenzeit habe ich mich an OSX- und Emacs-Bindungen gewöhnt und auch gerade den Traum von Strg + Umschalt + Pfeil in einem Terminal
aufgegeben
1

Wie Thanatos erwähnt hat, muss zwischen dem Terminalemulator (unter X Windows oder Wayland) und Programmen, die im Terminal ausgeführt werden, unterschieden werden (nennen wir die "Shell", obwohl dies möglicherweise nicht der Fall ist). Diese beiden Dinge sind voneinander isoliert (siehe technische Details ).

Die ersten Elemente in Ihrer Liste (Pfeiltasten, Pos1 / Ende usw.) werden direkt vom Programm im Terminal und somit von der Cursorposition verarbeitet vom Programm im Terminal gesteuert wird.

Die Tastenkombinationen zum Kopieren und Einfügen (Strg + Umschalt + C und Strg + Umschalt + V) werden hingegen vom Terminalemulator verwaltet, der die Maus versteht (sodass Sie Text mit der Maus auswählen können). Er weiß, was ist auf dem Bildschirm (so kann es kopieren) und kann Tastendrücke an das Programm im Inneren senden (so kann es einfügen).

Um Shift + Left und Shift + Right zu unterstützen, müsste entweder der Terminal-Emulator oder die Shell den Tastenanschlag verarbeiten. So oder so haben wir ein Problem:

  1. Die Shell kann mit diesen Schlüsseln nicht einfach umgehen, da Sie den ausgewählten Text eventuell in die Zwischenablage kopieren möchten und die Zwischenablage ein X Windows-Konzept ist, auf das die Shell nicht unbedingt zugreifen kann (aber es sieht xclip). Und soweit ich weiß, definiert Linux, wenn die Shell die Textauswahl unterstützt, keinen Mechanismus, um den Terminalemulator über die Auswahl zu benachrichtigen.
  2. In der Zwischenzeit ist der Terminal-Emulator nicht für die Position des Cursors zuständig. Selbst wenn der Terminalemulator die Position des Cursors ändern könnte, weiß er wahrscheinlich nicht, wo die aktuelle Textzeile beginnt und endet. Das Terminal kann beispielsweise Text enthalten, ~ $ ls -lund der Terminalemulator weiß nicht, dass nur der ls -lTeil dem Benutzer gehört.

Es ist nicht schwer, sich einen Terminal-Emulator vorzustellen, der die Auswahl mit Shift + Arrows unterstützt, aber ich denke, er müsste den Cursor der Shell verbergen und einen eigenen "falschen Cursor" einführen, der vorübergehend existiert, um Ihnen bei der Auswahl zu helfen, und dann könnten Sie Strg drücken + C / Ctrl + Shift + C / Ctrl + Ins zum Kopieren (oder Esc zum Abbrechen) und erneutes Anzeigen des tatsächlichen Cursors. Dies hätte natürlich nicht alle Funktionen einer normalen Auswahl - insbesondere das Ausschneiden und Löschen würde nicht existieren.

Qwertie
quelle
Danke, ich werde diesen TTY-Artikel lesen, habe ihn aber noch nicht gelesen. Das könnte die Lücke in meinem Verständnis des Unterschieds zwischen "Terminalemulatoren" und "Desktop-Anwendungen, die Textprogramme verarbeiten" erklären. Mein früheres Beispiel, die Matlab-Konsole, verhält sich genau so, wie ich es möchte. Ich verstehe nicht, warum es keine Desktop-Anwendung mit diesem Verhalten geben kann, bei der das darin ausgeführte Textprogramm etwas anderes als Matlab ist. Angenommen, ich wollte nur die grundlegendsten Shell-Befehle verwenden - ls, cd, cp, mv - dann sehe ich keinen Konflikt. Ich verstehe, dass Programme wie screen oder tmux die Dinge schwieriger machen könnten.
Monguin
1

Dies sind die von Ihnen beschriebenen CUA-Tastaturbelegungen, ein Standard von IBM Mitte der 80er Jahre:

https://en.wikipedia.org/wiki/IBM_Common_User_Access

Sie werden normalerweise in allen Desktop-Umgebungen implementiert, die seit erstellt wurden. DOS-, Windows-, Motiv- und sogar NetWare-Tools haben sich diesem Standard angenähert. Eine Ausnahme bildet der Mac, der einen ganz ähnlichen, aber unterschiedlichen Satz (Cmd anstelle von Ctrl) aus demselben Zeitraum verwendet.

Unix-Terminals sind jedoch weit älter als dieser Standard und haben ihn größtenteils ignoriert. Wenn diese Tastenkombinationen implementiert werden, kann dies auch zu Problemen mit TUI-Programmen führen, die sie bereits für andere Funktionen verwenden. Also zwar technisch machbar, aber auch problematisch.

Apps:

Der microTexteditor ist der beste, den ich bei der Emulation eines GUI-Texteditors gesehen habe, ähnlich wie DOS,  editaber mit moderneren Funktionen a la Sublime Text. neist eine ältere in Debian-Repos und sogarnano kann sogar mit vernünftigen Tastenkombinationen konfiguriert werden. Aber das blanke Terminal / Shell, nein.

Damit libvtekönnte es einfach sein, ein rudimentäres virtuelles Terminal zu erstellen, das diese Tastenkombinationen selbst handhabt. Eine Menge Arbeit für einen winzigen Gewinn.

Gringo Suave
quelle
0

Ich habe gerade einem Kumpel bei einem ähnlichen Problem geholfen und herausgefunden, dass der Clipit des Zwischenablage-Managers der Schuldige ist.

sudo apt-get clipit entfernen

war in der Lage, alles wieder zum Laufen zu bringen, ganz gut für ihn. Hoffe das könnte jemand anderem da draußen helfen.

Mandela Betroffen
quelle
Hast du die falsche Frage beantwortet? Dies war eine allgemeine Frage zu den Fähigkeiten aller Terminalemulatoren. Es ist ziemlich klar, dass es keine "Lösung" gibt. Ich habe noch nie Clipit auf einem Computer installiert.
Monguin,