Festlegen von STRG- * in vim unter dem GNU-Bildschirm


10

Wenn ich vim unter dem GNU-Bildschirm ausführe, stelle ich fest, dass Kombinationen CTRLmit den Pfeiltasten und den Pg * -Tasten nicht wie erwartet funktionieren.

Ich verwende das Ubuntu 10.10- vim-gnomePaket.

Auf einem anderen Computer, auf dem auch Ubuntu ausgeführt wird, funktionierte dies ohne Probleme. Leider steht mir diese Konfiguration derzeit nicht zur Verfügung.

Hier gibt es eine verwandte Frage: Wie kann man Strg + Pfeile in Vim korrigieren?

Die dort vorgeschlagene Lösung besteht jedoch darin, die Tastenkombinationen von vim neu zuzuordnen, um mit dem Terminalemulator, in diesem Fall PuTTY, zu arbeiten. Ich kann mich nicht erinnern, etwas Ähnliches getan zu haben, und vermute, dass es eine Bildschirmkonfigurationsoption gibt, mit der dieses Problem behoben werden kann.

Es gibt auch einen Thread auf der Gnu-Screen-Mailingliste, der darauf hinweist, dass das Ausführen von vim via $ TERM=xterm vimeine geeignete Lösung oder Problemumgehung ist. Das funktioniert, aber ich bin etwas besorgt, dass es Nebenwirkungen geben könnte. Es kommt mir auch nicht bekannt genug vor, um die Lösung zu sein, die ich auf dem anderen Computer eingerichtet habe (wenn eine Lösung erforderlich war).


+1 - Ich hatte das gleiche Problem und - wie Sie vorgeschlagen haben - das Hinzufügen term xtermzu meiner ~/.screenrcDatei hat es für mich behoben. Danke noch einmal!
Justin Ethier

Antworten:


4

Wie in seinem Update angegeben, scheint das Hinzufügen term xtermzur ~/.screenrcDatei dieses Problem zu beheben.


Nun ja, aber ich halte Ausschau nach einer Erklärung, warum screendie $TERMUmgebungsvariable nicht einfach weitergegeben wird, anstatt sie zu überschreiben "screen". Vermutlich gibt es einige Umstände, unter denen dies wichtig ist $TERM == screen.
Intuitiert

3
@intuited: Der Grund für die Bildschirmsätze TERM=screenist, dass Anwendungen, die in einem Bildschirmterminal ausgeführt werden, innerhalb eines Bildschirmterminals kommunizieren: Die Steuersequenzen, die sie senden und empfangen, sind die des Bildschirms und nicht die des Terminals, auf dem der Bildschirm selbst angezeigt wird. Da Sie eine Bildschirmsitzung trennen und erneut an einen anderen Terminaltyp anschließen können, ist diese Indirektionsebene erforderlich.
Gilles 'SO - hör auf böse zu sein'

@ Gilles: Danke, ich habe so etwas vermutet. Welche Probleme können beim Zurücksetzen auftreten xterm?
Intuitiert

1
Nicht viel, weil xterm und screen größtenteils kompatibel sind. Aber jeder hat ein paar Funktionen, die der andere nicht hat, und wenn Sie Anwendungen anlügen, verwenden sie möglicherweise eine Funktion, die tatsächlich nicht funktioniert. Vergleichen Sie die Ausgabe von infocmp screenund infocmp xtermund die Bildschirm-Escape-Sequenzen mit den xterm-Escape-Sequenzen . Ich habe keine Aufschlüsselung zu bieten; Die meisten Anwendungen haben nichts dagegen, aber einige verhalten sich möglicherweise ärgerlich.
Gilles 'SO - hör auf böse zu sein'

2

Es gibt verschiedene andere Möglichkeiten, das Terminal festzulegen, die in laufenden Prozessen funktionieren:

  • Wenn Sie in einer laufenden Bildschirminstanz ^A- :und den Befehl drücken, term xtermwerden neu geöffnete Bildschirme unter dieser Instanz mit der $TERMUmgebungsvariablen auf gestartet xterm. Dies wird sich wiederum auf aufgerufene vimInstanzen ausbreiten . Diese vim-Instanzen zeigen ein korrektes Verhalten in Bezug auf STRG-Combos. Ich habe noch keine Nebenwirkungen dieser Strategie entdeckt. Dieser Befehl wirkt sich nicht auf vorhandene Bildschirme aus. Dieser Befehl kann natürlich in einer ~/.screenrcDatei verwendet werden, daher ist es möglich, dass diese Methode auf dem anderen Computer verwendet wurde.

  • In einer laufenden vim-Instanz bewirkt der Befehl set term=xterm, dass STRG-Combos in dieser vim-Instanz funktionieren. Dies hat den Nebeneffekt, dass die X-Zwischenablage (dh @*und @+) aus Gründen, die ich noch nicht verstehe, getrennt wird. Interessanterweise tritt der Nebeneffekt der Zwischenablage auch auf, wenn der Befehl :set term=screenin einer vim-Instanz ausgeführt wird, mit der begonnen wurde $TERM=xterm.


Diese Antwort wurde den Aktualisierungen des OP entnommen. Ich habe nur ein wenig neu formatiert und umformuliert.
Phunehehe

2

Das zugrunde liegende Problem besteht darin, dass die Zuordnung screenzwischen dem tatsächlichen Terminal (identifiziert durch die TERMUmgebungsvariable außerhalb screen) und der Emulation innerhalb screenunvollständig ist.

Wenn Sie es zufällig testen (mit vttest oder Tack ), stellen Sie möglicherweise Mängel für fest

  • Farben
  • Spezialschlüssel

Der Versuch , diese Probleme zu beheben , indem Sie termin .screenrchat den Nachteil , dass es nur für eine bestimmte Ist-Terminal, und ist nicht tragbar zu anderen Terminal - Implementierungen funktioniert. Die Dokumentation Notizen

Von der Verwendung des Begriffs Befehl wird für nicht standardmäßige Zwecke abgeraten.

Es gibt eine andere Lösung (mit einem anderen Nachteil), die diese Funktion aus der screen Dokumentation verwendet :

Wenn screen versucht, einen Terminalnamen für sich selbst herauszufinden, sucht es zuerst nach einem Eintrag mit dem Namen screen. Begriff , wobei Begriff der Inhalt Ihrer $TERMVariablen ist. Wenn kein solcher Eintrag vorhanden ist, versucht der Bildschirm screen(oder screen-wwenn das Terminal breit ist (132 Spalten oder mehr)). Wenn auch dieser Eintrag nicht gefunden werden kann, vt100wird er als Ersatz verwendet.

ncurses bietet für diesen Fall mehrere nützliche alternative Terminalbeschreibungen, z. B. screen.xterm-new , um Probleme bei der Bildschirmzuordnung zu beheben. In der Praxis verwende ich TERM=xterm-newund bekomme beim Ausführen des Bildschirms eine verwendbare Zuordnung von Funktionstasten.

Wenn Sie auf die Bildschirmeinstellungen zurückgreifen term, werden Sie beim Testen möglicherweise feststellen, dass es immer noch Probleme mit der Zuordnung gibt, die in diesen Alternativen behandelt werden. Wenn es möglich wäre, eine genaue Terminalbeschreibung mit zu erhalten term, wären diese Alternativen einfache Aliase screen. Sie sind nicht.

ncurses ist nicht bieten screen.xterm(sic ! ) , weil:

  • TERM=xtermwird häufig für Terminalemulatoren missbraucht, die sich von xterm unterscheiden; Das Hinzufügen dieser Zuordnung würde diese Situation nur verschlimmern (siehe zum Beispiel Warum nicht einfach TERM verwenden, das auf "xterm" gesetzt ist? In den häufig gestellten Fragen zu ncurses).
  • Es screen.xtermist weniger wahrscheinlich, dass der alternative Name auf Remote-Systemen installiert wird (siehe Änderungskommentar vom Juni 2015 in der Terminaldatenbank).

Im Großen und Ganzen ist die Verwendung der alternativen Namen jedoch eine Verbesserung gegenüber der Verwendung termin Ihrem .screenrc: Sie löst mehr Probleme als sie verursacht. Das Gegenteil gilt für die termEinstellung.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.