Ответ 1
Похоже, основная проблема заключается в использовании xterm-256color для $TERM. Я переключил $TERM на screen-256color, и проблема исчезла.
В настоящее время я использую 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 и вне ее? Как это исправить, чтобы это не проблема в каких-либо программах?
Похоже, основная проблема заключается в использовании xterm-256color для $TERM. Я переключил $TERM на screen-256color, и проблема исчезла.
В tmux 2.0 вы можете просто добавить эти 2 строки в свой .tmux.conf
:
bind -n End send-key C-e
bind -n Home send-key C-a
Если по какой-то причине вы хотите остаться с 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
После попытки каждого из них, и нескольких других, которые я видел, просматривая другие ответы и документацию, это, наконец, работало для меня в каждом сценарии, который я бросил. Я не могу обещать вам то же самое, потому что все сценарии разные, но на этом я и остановился.
Добавьте следующее в ваш .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
Сравните приведенные выше примеры с тем, что мы ожидаем увидеть, 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
.
Так что у меня недостаточно очков, чтобы комментировать, поэтому я скажу это здесь. Я считаю, что предпочтительным решением является использование 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.