如何让vim的visualbell只闪现顶部/底部线条?

时间:2011-12-16 08:34:22

标签: vim

多年来一直在使用Vim,这一直是我接受bright and distracting the visual bell的方式。最近有人给我看了Emacs visual bell,它只闪现屏幕的顶部和底部线条。有谁知道如何在Vim中重现这种行为?

如果它目前不可配置,有人知道修补它有多难吗?我有一些C经验,但不熟悉codebase.

1 个答案:

答案 0 :(得分:3)

Vim和版本

你的问题是,这个问题取决于vim版本。通过vim版本我的意思不是版本(7.3 ...),但更多的是如果你使用的是MacVim,gVim,终端版等。 这个版本很有意义,因为t_vb param(类型:set t_vb?得到它)对于不同的vim版本是不同的,但我稍后会写这个。

我正在使用Ubuntu。在我的终端中,我甚至无法产生那些视觉闪现(可能Ubuntu只是忽略它们,至少那是正常铃声发生的事情:This program sounds the bell!)。 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显示(删除行,添加行等)。但如果显示重绘,一切都将消失。 此任务的主要问题是转义序列没有睡眠序列。您可以尝试插入一条白色的线并将其移除,但这只是快速的方法(我试过了)。

所描述的行为就是gVim的情况。但我认为其余的可能会表现得非常相似。但是,如果您的终端/伪终端支持仅突出显示某些已定义行数的转义序列,您将能够执行所需的操作。

我可能会让你失望,但我认为有一种方法可以获得你想要的行为,而无需修改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命令。我打赌那是可能的。