web-dev-qa-db-fra.com

Les touches Accueil/Fin ne fonctionnent pas dans tmux

J'utilise actuellement tmux avec la variable xterm-256color $ TERM. Lorsque vous êtes dans bash sous tmux, appuyez sur home/end pour insérer des caractères tilde (~). En dehors de tux, les touches home/end fonctionnent bien. 

En utilisant cat et tput, je pouvais voir qu'il y avait une discordance entre les séquences générées et attendues:

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

Pour résoudre ce problème, j'ai décidé d'ajouter ce qui suit à mon .bashrc:

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

Cela a résolu le problème de bash, mais dans d'autres programmes readline, comme dans un REPL tel que ipython, il insère toujours un tilde pour home/end. 

Pourquoi est-ce exactement un problème en premier lieu? Pourquoi la séquence générée est-elle différente quand je suis à l'intérieur de tmux ou à l'extérieur? Comment peut-on résoudre ce problème afin que ce ne soit pas un problème dans les programmes?

39
Ben Davis

Il semble que le principal problème concerne l'utilisation de xterm-256color pour $ TERM. J'ai changé $ TERM en screen-256color et le problème a disparu.

35
Ben Davis

Dans tmux 2.0, vous pouvez simplement ajouter ces 2 lignes dans votre .tmux.conf:

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

Si vous souhaitez rester avec xterm-256color dans tmux pour une raison quelconque, utilisez Arch solution with inputrc. Je l'ai testé dans tmux avec les clés rxvt, Ruby irb, python, lua et home/end sont ok. Probablement chaque application readline sera ok.

6
Oleg Kr

Donc, je n'ai pas assez de points à commenter, alors je vais le dire ici plutôt. Je crois que la solution préférée consiste à utiliser set -g default-terminal "screen-256color" dans votre ~/.tmux.conf. J'ai eu ce problème il y a un moment et j'ai décidé de choisir la solution sumanta: 

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

Cependant, j'avais oublié que je laissais cela ici et que j'avais un problème similaire avec vim (home et end consistaient à copier des registres) au lieu de zsh. En bref, bind n'affecte pas vim.

0
ducklin5