3

Я использую vim внутри tmux внутри urxvt, и мышь отлично работает для нажатия и выделения текста, за исключением случаев, когда я хочу щелкнуть слишком далеко вправо.

Кажется, это связано с расстоянием в столбцах слева. Когда я перехожу за столбец ~ 200 (не уверен насчет точного числа), щелчок просто ничего не делает.

Обратите внимание, что это не относится к окну vim: если два окна vim занимают ~ 150 столбцов в каждом, щелчок не будет работать после ~ 50-го столбца во втором окне. Это связано со всей сессией vim.

Также обратите внимание, что нажатие далеко на большой панели tmux (> 200 столбцов) работает отлично.

В моем .tmux.conf меня есть эта строка:

set -g default-terminal "screen-256color"

и в моем .vimrc меня есть это:

if &term =~ "^screen"
    autocmd VimEnter * silent !echo -ne "\033Ptmux;\033\033]12;7\007\033\\"
    let &t_SI = "\<Esc>Ptmux;\<Esc>\<Esc>]12;5\x7\<Esc>\\"
    let &t_EI = "\<Esc>Ptmux;\<Esc>\<Esc>]12;7\x7\<Esc>\\"
    autocmd VimLeave * silent !echo -ne "\033Ptmux;\033\033]12;14\007\033\\"
end

Он меняет цвет курсора в зависимости от режима редактирования vim, и это работает, это означает, что tmux действительно устанавливает $TERM на «screen-256color» - но я не знаю, имеет ли это какое-либо отношение к моей проблеме с мышью.

Я использую Ubuntu 12.04, vim 7.3, tmux 1.6 и rxvt-unicode 9.14.

Кто-нибудь имеет представление о том, что вызывает эту проблему? Благодарю.

Обновление: сейчас я использую xterm, и он работает. Я думал, что urxvt требуется для поддержки юникода, но, хотите верьте, хотите нет, в xterm также есть поддержка юникода.

2 ответа2

3

Итак, благодаря Screwtape, у меня есть ответ на это. Воспроизведено ниже:


Исходный протокол мыши xterm поддерживает только до 223 столбцов и строк. В более поздних версиях протокола использовалась кодировка UTF-8, что оказалось ужасной идеей, и более современные терминалы поддерживают совершенно другой протокол, основанный на escape-последовательности SGR, что гораздо более разумно.

tmux автоматически поддерживает исходный протокол и протокол SGR в обоих направлениях (к терминалу, внутри которого он работает, и к приложениям, работающим внутри него), но он запрашивает режим UTF-8 с внешнего терминала, только если включена функция mouse-utf8. в конфигурационном файле.

Вы можете использовать инструмент vttest , чтобы поэкспериментировать с различными протоколами мыши внутри и снаружи tmux чтобы лучше понять, что происходит.

Согласно документации для опции 'ttymouse' Vim, он запросит у терминала поддержку оригинального протокола xterm, если $TERM является вариантом xterm , mlterm или screentmux сообщает о себе как screen , так что все в порядке). Если терминал поддерживает функцию termcap "RV" для определения номера версии xterm , Vim будет использовать ее для автоматического обновления до мышиных протоколов 'xterm2' или 'sgr' ... но обычно только xterm объявляет о поддержке "RV" , поэтому tmux исключен из процесса автоматического обновления.

В моем ~/.vimrc меня есть следующий код для включения достойной поддержки мыши вместо того, чтобы полагаться на автоопределение Vim:

" Screen/tmux can also handle xterm mousiness, but Vim doesn't
" detect it by default.
if &term == "screen"
set ttymouse=xterm2
endif

if v:version >= 704 && &term =~ "^screen"
" Odds are good that this is a modern tmux, so let's pick the
" best mouse-handling mode.
set ttymouse=sgr
endif

(Следует отметить, что здесь установлено собственное исправление set ttymouse=sgr ; я предлагаю добавить его в ваш .vimrc как это сделал Тим.)

1

Это связано с ограничениями в протоколе отчетов мыши в терминалах:« Исходный протокол мыши X10 ограничивает ординаты C x и C y до 223 (= 255 - 32) », см. Эту ссылку

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .