Ответ 1
Vim и версии
Большая проблема с вами в том, что этот вопрос зависит от версии vim. По версии vim я имею в виду не версию (7.3...), но гораздо больше, если вы используете MacVim, gVim, версию терминала и т.д.
Версия важна, потому что параметр t_vb (тип :set t_vb?
для его получения) отличается для разных версий vim, но я пишу об этом позже.
Я использую Ubuntu. В моем терминале я даже не могу воспроизвести эти визуальные вспышки (вероятно, Ubuntu просто игнорирует их, по крайней мере, то, что происходит с обычным звонком: Эта программа звучит колоколом!). gVim отличается, визуальный звонок работает там. То же самое происходит с Emacs. Визуальный звонок (верхняя и нижняя линии, как вы описали) отлично работают в версии X. Терминальная версия просто тихая.
Настройки t_vb
Как подозревали некоторые, t_vb param отвечает за визуальный звонок в vim. Но в терминале он выглядит иначе:
t_vb=^[[?5h$<100/>^[[?5l
и gVim:
t_vb=^[|f
Итак, я думаю, что это тоже будет для MacVim.
Кстати: если вы изменяете колокол, вы должны сгенерировать ^[
с помощью <C-V>
, а затем <ESC>
. Не копируйте строки выше, они не будут работать.
t_vb - это просто строка, которая отправляется на терминал (или gvim). Вы также можете определить t_vb = abcd, который временно выводит abcd в ваш курсор. Это просто магия отображения, вспышки происходят из-за символов эвакуации. Невозможно общаться с 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- script, а затем попытается найти соответствующую команду vim. Бьюсь об заклад, это было бы возможно.