Подтвердить что ты не робот

Главная/Конец ключей не работает в tmux

В настоящее время я использую tmux с переменной xterm-256color $TERM. Когда в bash в tmux, нажатие home/end будет вставлять символы тильды (~). Вне tmux домашние/конечные клавиши работают нормально.

Используя cat и tput, я мог видеть, что между сгенерированными и ожидаемыми последовательностями было несоответствие:

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

Чтобы исправить это, я решил добавить следующее в мой .bashrc:

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

Это устранило проблему для bash, однако в других программах readline, например, в REPL, таких как ipython, она по-прежнему вставляет тильду для дома/конца.

Почему именно эта проблема в первую очередь? Почему сгенерированная последовательность отличается, когда я внутри tmux и вне ее? Как это исправить, чтобы это не проблема в каких-либо программах?

4b9b3361

Ответ 1

Похоже, основная проблема заключается в использовании xterm-256color для $TERM. Я переключил $TERM на screen-256color, и проблема исчезла.

Ответ 2

В tmux 2.0 вы можете просто добавить эти 2 строки в свой .tmux.conf:

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

Ответ 3

Если по какой-то причине вы хотите остаться с xterm-256color в tmux - используйте решение arch с inputrc. Я протестировал его в tmux с ключами rxvt, ruby irb, python, lua и home/end. Вероятно, каждое приложение readline будет в порядке.

Из арки вики:

Перво-наперво:

не устанавливайте $ TERM вручную - позвольте терминалу сделать это.


Многие приложения командной строки используют библиотеку Readline для чтения ввода. Так что правильная настройка Readline может исправить Home и End во многих случаях.

файл /etc/inputrc по умолчанию не содержит сопоставления для ключей home/end.

Чтобы проверить, какова была выданная escape-последовательность для этих ключей:

1. Ctrl + V
2. Home
3. Spacebar
4. Ctrl + V
5. End

это, вероятно, напечатает: $ ^[[1~ ^[[4~. Поэтому вам нужно добавить сопоставление для этих последовательностей в ваш inputrc (/etc/inputrc, чтобы быть глобальным или только для вашего пользователя ~/.inputrc):

"\e[1~": beginning-of-line
"\e[4~": end-of-line

Ответ 4

После попытки каждого из них, и нескольких других, которые я видел, просматривая другие ответы и документацию, это, наконец, работало для меня в каждом сценарии, который я бросил. Я не могу обещать вам то же самое, потому что все сценарии разные, но на этом я и остановился.

Добавьте следующее в ваш .tmux.conf :

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

Это было обнаружено после введения того же самого метода проб/ошибок и логики из этой несколько связанной статьи. Единственная разница в том, где происходит перевод (в .tmux.conf, а не в .bashrc или .zshrc; в основном, потому что мой home/end отлично работает вне tmux)


отладка

Вы можете устранить эту проблему, используя cat -v как указано в статье выше.

Запустите cat -v, затем нажмите клавиши Home и End. Выйдите, используя Ctrl + C.

$ cat -v

Вот как выглядел мой вывод в tmux using zsh, zsh и bash:

tmux

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

ЗШ

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

удар

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

Solutioning

Сравните приведенные выше примеры с тем, что мы ожидаем увидеть, cat -v tput с cat -v:

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

Заключение

Поскольку эта проблема существует только в tmux, а не в самих эмуляторах, я решил вместо этого внести изменения в конфигурацию tmux. Используя bind-key паре с send, мы можем использовать ключевое слово Escape паре с последовательностью, которую мы хотим добиться нашего перевода. Таким образом:

bind-key -n NAME_OF_KEY send Escape SEQUENCE_GOES_HERE

Этот процесс отладки и решения может быть применен к любым другим ключевым проблемам перевода. Но не сходи с ума. Некоторые ключи сопоставлены с определенными escape-последовательностями по определенной причине. Обратите внимание, что bash и zsh получили ^[[H последовательность для Home вместо ^[OH; вероятно, не рекомендуется переопределять это в нашем .zshrc если у нас нет серьезных проблем с этим в zsh.

Ответ 5

Так что у меня недостаточно очков, чтобы комментировать, поэтому я скажу это здесь. Я считаю, что предпочтительным решением является использование set -g default-terminal "screen-256color" в вашем ~/.tmux.conf. Я на самом деле имел эту проблему некоторое время назад и решил пойти с решением sumanta:

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

Однако я забыл, что оставил это здесь, и у меня возникла похожая проблема с vim (home и end были копированием из регистров) вместо zsh. Короче говоря, bind влияет на vim.