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

Как сделать vim visualbell только вспышкой верхней/нижней строки?

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

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

4b9b3361

Ответ 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. Бьюсь об заклад, это было бы возможно.