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

Wan*_*ang 32 vim

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

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

Dav*_*ter 3

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
Run Code Online (Sandbox Code Playgroud)

和 gVim:

t_vb=^[|f
Run Code Online (Sandbox Code Playgroud)

所以我认为 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)
Run Code Online (Sandbox Code Playgroud)

睡眠可能会很烦人。但这只是最简单的方法(没有计时器等)。问题是找到这样的反函数。我会尝试查找执行 vim-script 的命令,然后尝试查找匹配的 vim 命令。我打赌这是可能的。