Das Ausführen von Emacs in GNU Screen überschreibt die .emacs-Einstellungen für die [home] -Schlüsselbindung in FreeBSD 8.2

1

Wenn ich die folgende .emacs-Datei verwende, kann ich erwartungsgemäß mit den Home / End-Tasten zum Anfang / Ende der aktuellen Zeile springen.

(keyboard-translate ?\C-h ?\C-?)

(add-to-list 'load-path "/home/sam/programs/go/go/misc/emacs/" t)
(require 'go-mode-load)

(global-set-key [kp-home]  'beginning-of-line) ; [Home]
(global-set-key [home]     'beginning-of-line) ; [Home]

(global-set-key [kp-end]  'end-of-line) ; [End]
(global-set-key [end]     'end-of-line) ; [End]

Wenn ich jedoch eine Bildschirmsitzung öffne, funktioniert dies nicht (die Taste [home] bringt mich aus irgendeinem Grund immer noch an den Anfang des Puffers).

Hier ist meine .screenrc-Datei, wenn irgendjemand irgendetwas Ungewöhnliches darin entdecken kann:

term xterm
defutf8 on
defflow off
startup_message off

# terminfo and termcap for nice 256 color terminal
# allow bold colors - necessary for some reason
attrcolor b ".I"

# tell screen how to set colors. AB = background, AF=foreground
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'

#use bash as the default login shell
defshell -bash

BEARBEITEN: Anscheinend besagt die Verwendung von Mx describe-key (wie von nschum vorgeschlagen), dass [begin] ausgelöst wird, wenn ich die Home-Taste auf meiner Tastatur drücke, wenn Emacs auf dem Bildschirm ausgeführt wird. Wenn ich Emacs außerhalb des Bildschirms starte, bezieht sich describe-key wie erwartet auf [home]. Es sieht so aus, als ob "defutf8 on" der einzige tastaturbezogene Eintrag in meinem .screenrc ist - gibt es noch etwas, das Probleme verursachen könnte?

javanix
quelle
Was sagt Mx description-key?
Nschum

Antworten:

0

Wenn Sie ein Programm ausführen screen, screenkann (und wird) das Programm dies tun:

  • screenhat eine eigene Terminalbeschreibung. Es wird versucht, die Schlüsselsequenzen des zugrunde liegenden Terminals in diese umzuwandeln.
  • Die Konvertierung ist nicht abgeschlossen. Um dieses Problem zu umgehen, screensuchen Sie nach benutzerdefinierten Terminalbeschreibungen, die mit beginnen screen.$TERM. ncurses bietet einige nützliche an.
  • screen filtert (ignoriert) einige Schlüsselsequenzen, die nicht in die Vorstellung passen, wie Eingaben erfolgen sollen.

Höchstwahrscheinlich liegt Ihr Problem im ersten Fall. Wenn Sie tun

infocmp xterm screen

(vorausgesetzt , dass Sie die am häufigsten häufig vorgeschlagene Wert verwenden für TERM, ob Sie sind mit xterm), können Sie ein paar Zeilen wie folgt fest:

kend: '\E[4~', '\EOF'.
khome: '\E[1~', '\EOH'.

Die letzte Spalte ist die Sequenz ( \Edas Escape- Zeichen), die screenan Ihr Programm gesendet wird, wenn es die mittlere Spalte von xtermusw. empfängt .

Das Problem mit dem .screenrcist , dass es die überschreibt $TERMWert zu xterm, verwirrend screen:

term xterm

Sie würden davon ausgehen, dass die Konvertierung abgeschlossen ist, aber das Testen zeigt, dass dies nicht der Fall ist. Diese Art von Problem ist der Grund, warum ncurses benutzerdefinierte Einträge bereitstellt. Zum Beispiel ist der Eintrag von ncurses Datenbank ist derjenige, dass bestimmte Wirkung auf meiner Maschine nimmt .screenrcEinstellung (weil „xterm“ ist aliased zu „xterm-neu“):

screen.xterm-xfree86|screen.xterm-new|screen customized for modern xterm,
        bce@, bw,
        invis@, kIC@, kNXT@, kPRV@, meml@, memu@,
        sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;m,
        E3@, use=screen+italics, use=screen+fkeys, use=xterm-new,

Sie können das bemerken use=screen+fkeys. Das heißt im Endeffekt: Fahren Sie fort und verwenden Sie die Schlüssel, screendie verwendet werden, da dies die einfachste Lösung ist. Nun gibt es ein subtiles Problem: screen+fkeyssieht so aus:

screen+fkeys|function-keys according to screen,
        kend=\E[4~, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kfnd@,
        khome=\E[1~, kslt@,

weil (auf dem Testbildschirm) diese Schlüssel und nicht die in der $TERMBeschreibung des äußeren Terminals angegebenen gesendet wurden . Der innere Wert $TERMist auf festgelegt xterm, screenverwendet diesen Zwischeneintrag jedoch, wenn spezielle Schlüssel wie "home / end" für Ihre Sitzung übermittelt werden.

Thomas Dickey
quelle