it-swarm.com.de

Start/Ende-Tasten funktionieren nicht in tmux

Zur Zeit verwende ich tmux mit der xterm-256color $ TERM-Variablen. Wenn Sie sich in bash unter tmux befinden, können Sie durch Drücken von home/end Tilde-Zeichen (~) einfügen. Außerhalb von tmux funktionieren die Home/End-Tasten einwandfrei. 

Mit cat und tput konnte ich feststellen, dass zwischen den erzeugten und den erwarteten Sequenzen ein Missverhältnis bestand:

$ cat -v # pressing home, then end
^[[1~^[[4~
$ tput khome | cat -v; echo
^[OH
$ tput kend | cat -v; echo
^[OF

Um dies zu beheben, habe ich beschlossen, meinem .bashrc folgendes hinzuzufügen:

if [[ -n "$TMUX" ]]; then
    bind '"\e[1~":"\eOH"'
    bind '"\e[4~":"\eOF"'
fi

Das Problem für bash wurde behoben. In anderen Readline-Programmen, z. B. in einem REPL, wie z. B. ipython, wird jedoch immer noch eine Tilde für home/end eingefügt. 

Warum ist das überhaupt ein Problem? Warum unterscheidet sich die generierte Sequenz, wenn ich mich innerhalb von tmux und außerhalb befinde? Wie kann dies behoben werden, damit es in keinem Programm ein Problem darstellt?

39
Ben Davis

Anscheinend besteht das Hauptproblem in der Verwendung von xterm-256color für $ TERM. Ich habe $ TERM auf screen-256color umgestellt und das Problem ist verschwunden.

35
Ben Davis

In tmux 2.0 können Sie diese beiden Zeilen einfach in Ihren .tmux.conf einfügen:

bind -n End send-key C-e
bind -n Home send-key C-a
26
sumanta

Wenn Sie aus irgendeinem Grund bei xterm-256color in tmux bleiben möchten, verwenden Sie Arch-Lösung mit inputrc. Ich habe es in tmux mit rxvt getestet, Ruby IRB, Python, Lua und Home/Endkeys sind ok. Wahrscheinlich wird jede readline-App in Ordnung sein.

6
Oleg Kr

Nachdem ich versucht hatte, eine dieser und mehrere andere Antworten und Dokumentationen zu lesen, funktionierte dies schließlich für mich in jedem Szenario, das ich anstellte. Ich kann Ihnen nicht das Gleiche versprechen, weil alle Szenarien unterschiedlich sind, aber das ist es, was ich am Ende gemacht habe.

Fügen Sie Ihrem .tmux.conf Folgendes hinzu:

bind-key -n Home send Escape "OH"
bind-key -n End send Escape "OF"

Dies wurde entdeckt, nachdem derselbe Versuch/Irrtum und dieselbe Logik aus dieser etwas verwandte Artikel eingeführt worden waren. Der einzige Unterschied besteht darin, wo die Übersetzung stattfindet (innerhalb von .tmux.conf Anstatt von .bashrc Oder .zshrc; Hauptsächlich, weil mein Home/End außerhalb von tmux einwandfrei funktioniert).


Debuggen

Sie können dieses Problem mit cat -v Wie im obigen Artikel beschrieben beheben.

Führen Sie cat -v Aus und drücken Sie dann die Home und End Schlüssel. Beenden Sie mit Ctrl+C.

$ cat -v

So sah meine Ausgabe in tmux using zsh, zsh und bash aus:

tmux

➜  ~ cat -v
^[[1~^[[4~^C

zsh

➜  ~ cat -v
^[[H^[[F

bash

bash-3.2$ cat -v
^[[H^[[F

Lösung

Vergleichen Sie die obigen Beispiele mit dem, was wir erwarten, indem Sie tput mit cat -v Koppeln:

$ tput khome | cat -v; echo
^[OH
$ tput kend | cat -v; echo
^[OF

Fazit

Da dieses Problem nur bei tmux und nicht bei den Emulatoren selbst auftritt, habe ich mich dafür entschieden, die Bindungsänderungen stattdessen in der tmux-Konfiguration vorzunehmen. Wenn Sie bind-key In Kombination mit send verwenden, können Sie das Schlüsselwort Escape in Kombination mit der Sequenz verwenden, in der die Übersetzung ausgeführt werden soll. Somit:

bind-key -n NAME_OF_KEY send Escape SEQUENCE_GOES_HERE

Dieser Debugging- und Lösungsprozess kann auf alle anderen wichtigen Übersetzungsprobleme angewendet werden. Aber sei nicht zu verrückt. Einige Tasten sind aus einem bestimmten Grund bestimmten Escape-Sequenzen zugeordnet. Beachten Sie, wie bash und zsh die Sequenz ^[[H Für erhalten haben Home anstelle von ^[OH; Es wird wahrscheinlich nicht empfohlen, dies in unserem .zshrc zu überschreiben, es sei denn, wir haben in zsh größere Probleme damit.

3
Swivel

Ich habe also nicht genug Punkte zum Kommentieren, deshalb sage ich es stattdessen hier. Ich glaube, die bevorzugte Lösung verwendet set -g default-terminal "screen-256color" in Ihrem ~/.tmux.conf. Ich hatte dieses Problem vor einiger Zeit und entschied mich für die Lösung von sumanta: 

bind -n End send-key C-e
bind -n Home send-key C-a

Ich hatte jedoch vergessen, dass ich das hier gelassen hatte, und hatte am Ende ein ähnliches Problem mit vim (home und ende waren Kopieren von Registern) anstelle von zsh. Kurz gesagt, bindet DOES vim.

0
ducklin5