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.
quelle
Antworten:
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:
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.
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 in
gnome-terminal
Kamera befinden.)Darüber hinaus
xsel -b
kann zum Weiterleiten von Inhalten der Zwischenablage verwendet werden. Hängt von der genauen Situation ab, obxsel
die Paste-Version des Terminals nützlicher ist oder nicht. Sehenman xsel
.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.)
screen
Hat beispielsweise Tasten zum Umschalten in einen Modus zum Bewegen des Puffers (vorherige Ausgabe) und zum Kopieren / Einfügen.Ich denke, wenn Sie
xsel
die 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.quelle
gnome-terminal
hä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.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
quelle
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
,SIGINT
um 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
), tunDann 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.
quelle
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:
xclip
). Und soweit ich weiß, definiert Linux, wenn die Shell die Textauswahl unterstützt, keinen Mechanismus, um den Terminalemulator über die Auswahl zu benachrichtigen.~ $ ls -l
und der Terminalemulator weiß nicht, dass nur derls -l
Teil 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.
quelle
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
micro
Texteditor ist der beste, den ich bei der Emulation eines GUI-Texteditors gesehen habe, ähnlich wie DOS,edit
aber mit moderneren Funktionen a la Sublime Text.ne
ist eine ältere in Debian-Repos und sogarnano
kann sogar mit vernünftigen Tastenkombinationen konfiguriert werden. Aber das blanke Terminal / Shell, nein.Damit
libvte
könnte es einfach sein, ein rudimentäres virtuelles Terminal zu erstellen, das diese Tastenkombinationen selbst handhabt. Eine Menge Arbeit für einen winzigen Gewinn.quelle
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.
quelle