как сделать так, чтобы визуальный звонок vim высвечивал только верхнюю / нижнюю строки? - PullRequest
32 голосов
/ 16 декабря 2011

Я использовал Vim уже много лет, и все это время я просто принимал, как bright and distracting the visual bell.Недавно кто-то показал мне Emacs visual bell, который мигает только в верхней и нижней строках экрана.Кто-нибудь знает, как воспроизвести это поведение в Vim?

И если он в настоящее время не настраивается, кто-нибудь знает, как трудно будет это исправить?У меня есть некоторый C опыт, но я не знаком с codebase.

1 Ответ

3 голосов
/ 26 марта 2012

Vim и версии

Большая проблема с вами заключается в том, что этот вопрос зависит от версии vim.Под версией vim я подразумеваю не версию (7.3 ...), но гораздо больше, если вы используете MacVim, gVim, терминальную версию и т. Д. Версия не важна, потому что параметр t_vb (введите :set t_vb?, чтобы получить ее).) отличается для разных версий vim, но я напишу об этом позже.

Я использую Ubuntu.В моем терминале я даже не могу произвести эти визуальные вспышки (вероятно, Ubuntu просто игнорирует их, по крайней мере, это то, что происходит с обычным звонком: Эта программа звучит как звонок! ).gVim другой, там работает визуальный звонок.То же самое происходит с Emacs.Визуальный колокольчик (верхняя и нижняя линии, как вы описали) прекрасно работает в версии X.Версия терминала просто тихая.

настройки t_vb

Как некоторые подозревали, параметр t_vb отвечает за визуальный звонок в vim.Но в терминале это выглядит по-разному:

t_vb=^[[?5h$<100/>^[[?5l

и gVim:

t_vb=^[|f

Так что я думаю, что для MacVim тоже будет по-другому.

Кстати: Если вы модифицируете звонок, вы должны сгенерировать ^[ с <C-V>, за которым следует <ESC>.Не копируйте строки выше, они не будут работать.

t_vb - это просто строка, которая отправляется на терминал (или gvim).Вы также можете определить t_vb = abcd, который будет временно выводить abcd на вашем курсоре.Это просто отображение магии, вспышки происходят из-за escape-символов.Нет возможности общаться с vim.Однако вы можете изменить весь экран vim (удалить строки, добавить строки и т. Д.).Но если перерисовать дисплей, все пропадет.Основная проблема с этой задачей заключается в том, что escape-последовательности не имеют спящего режима.Вы можете попробовать вставить строку белого цвета и удалить ее, но это просто способ быстро (я пробовал).

Описанное поведение относится только к gVim.Но я думаю, что остальные, вероятно, будут вести себя очень похоже.Однако, если ваш терминал / псевдотерминал поддерживает escape-последовательность, которая выделяет только определенное количество строк, вы сможете делать то, что хотите.

Я могу вас разочаровать, но я не думаю, чтоспособ получить желаемое поведение без изменения источника vim (или модификации программного обеспечения терминала, которое я определенно не рекомендую).

Модификация исходного исходного кода

Если вы хотитечтобы редактировать поведение визуального звонка, как вам нравится, вы всегда можете редактировать C-файлы.Я не рекомендовал бы это, но это определенно не невозможно.Вы можете начать здесь:

http://code.google.com/p/vim/source/browse/src/misc1.c#3433

Удалить "out_str (T_VB);"и вставьте что-то вроде этого (псевдокод):

invert(fist_line)
invert(last_line)
sleep(100 ms)
invert(fist_line)
invert(last_line)

Сон может раздражать.Но это просто самый простой способ (без таймеров и т. Д.).Проблема заключается в том, чтобы найти такую ​​функцию инвертирования.Я бы попытался найти команду, которая выполняет vim-скрипт, а затем попытаться найти подходящую команду vim.Могу поспорить, что это будет возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...