如何让vim的视觉警告只闪烁顶部/底部行?

32

我多年来一直使用Vim编辑器,一直觉得其 视觉提示 过于亮丽和分散注意力。最近有人向我展示了Emacs 视觉提示,它只会闪烁屏幕的顶部和底部行。有没有人知道如何在 Vim 中实现这种效果?

如果目前还不能配置,有没有人知道将其修改的难度?我具备一些C编程经验,但并不熟悉 Vim 的源代码库


2
通常情况下,您可以在终端的设置中关闭视觉提示音。 - jman
是的,我知道:set novisualbell,但那会发出同样令人分心的声音提示。还有一个t_??的设置可以完全关闭提示音,但我确实需要某种提示音。 - Wang
@Wang:设置是t_vb,我猜这最终是你必须修改的。它包含了发送到终端使闪烁发生的字符串。 - Conspicuous Compiler
@Wang:说起来,这个与终端有关。你能否执行 set t_vb? 命令并报告在你希望此命令生效的 vim 环境中的结果?这样我们就可以知道你需要哪种终端。 - Conspicuous Compiler
2
出于好奇,你经常做什么会触发视觉铃声?我很少看到它。 - Useless
显示剩余5条评论
1个回答

3

Vim和版本

你的问题的大问题是,这个问题取决于vim的版本。我所指的vim版本不是版本号(7.3...),而是你是否使用MacVim、gVim、终端版等等。

版本很重要,因为不同vim版本的t_vb参数(输入:set t_vb?查看)是不同的,但我稍后会详细介绍。

我正在使用Ubuntu。在我的终端中,我甚至无法产生那些视觉闪烁(可能Ubuntu只是忽略了它们,至少对于普通的铃声是这样的:This program sounds the bell!)。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。这只是显示魔术,闪烁发生是因为转义字符。 没有办法与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脚本的命令,然后尝试找到一个匹配的vim命令。我敢打赌这是可能的。

关于您的“无声”Ubuntu,您可以通过/etc/termcap中的“vb”变量调整默认设置。 - Yves Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接