VIM:恢复普通高亮组的原始前景色

时间:2010-07-22 23:52:49

标签: vim syntax colors highlight foreground

使用':highlight Normal'命令更改终端的原始前景色后,是否有办法恢复终端的原始前景色?

例如,我在Windows命令提示符下使用vim.exe 7.2。我的命令提示符有绿色文本。当我启动vim.exe时,我可以运行以下命令将文本更改为红色:

:highlight Normal ctermfg=red
但是,我不能弄清楚如何将前景色变回原来的颜色。

当然,在这个简单的例子中,我知道原始颜色是绿色,所以我可以将它明确地设置为绿色。但在现实生活中,我正在编写一个vim脚本,需要一个通用的解决方案来恢复到原来的颜色。

过去几个小时我一直在浏览vim文档,并尝试过':syntax off',':highlight normal clear'和'syntax reset'等功能,但无济于事。 termcap部分中有一些关于't_op'变量的有趣信息,但我无法弄清楚如何使用它。到目前为止,我唯一的成功就是退出vim并允许命令提示符恢复其原始颜色;我真的希望能够在同一个vim会话中做到这一点。

提前感谢您提出的任何建议。

----- [20100723 13:30] -----

很抱歉我回复了rq。我会尝试将相关的后续信息发布到原始问题中。

在我的机器上(vim 7.2,Windows 7,命令提示符),synIDattr()函数为每个Normal前景色返回相同的值。请考虑以下事项:我在命令提示符中启动了一个新的vim会话,禁用了语法突出显示,并运行以下脚本来报告第一行第一个字符的前景色:

let numID = synID(1, 1, 1)
let numIDtrans = synIDtrans(numID)
let numFG = synIDattr(numIDtrans, "fg")
echo "synID: *" . numID . "*"
echo "synIDtrans: *" . numIDtrans . "*"
echo "synIDattr(fg): *" . numFG . "*"

作为回应,我得到了:

synID: *0*
synIDtrans: *0*
synIDattr(fg): **

观察到synIDattr()没有返回任何值,只是我添加的文字星号分隔符。

接下来,我更改Normal组前景色:

highlight Normal ctermfg=red

当我运行相同的脚本时,我得到相同的响应 - 没有来自synIDattr()的值。请注意,当我启用语法高亮显示时,脚本会返回有用的信息(但此时为时已晚)。

----- [20100728 16:11] -----

'highlight Normal ctermfg = NONE'解决方案有效。我将提供更多背景信息,供将来参考。

我的目标是编写一个函数和热键,以便快速切换语法高亮显示。为了在禁用语法高亮显示后允许前景色返回原始颜色,我不得不从colorscheme文件中删除'highlight Normal ...'命令,并向该函数添加两个相应的命令:

function! fSwitchSyntax()

        if exists("g:syntax_on")

                syntax off    
                highlight normal ctermfg=NONE  <--- New command

        else

                syntax on    
                highlight normal ctermfg=white <--- New command

        endif

endfunction

1 个答案:

答案 0 :(得分:2)

在Vim脚本中,您可以使用以下代码段获取光标下文本的前景色:

let oldcolor = synIDattr(synIDtrans(synID(line("."), col("."), 1)), "fg")

您必须跟踪已更改的语法项,以便将其恢复为原始颜色。以下代码段将打印出如何在光标下设置ctermfg颜色:

let synhere = synID(line("."), col("."), 1)
let oldcolor = synIDattr(synIDtrans(synhere), "fg")
let what = synIDattr(synhere, "name")
echo ":highlight " . what . " ctermfg=" . oldcolor

您可能还必须跟踪粗体,下划线和bg颜色。 :help synIDattr()有详细信息。

编辑:我没有看到您的更新,也许您应该添加评论。

如果您关闭语法,我猜syn *函数不会执行任何操作。重新阅读问题之后,我认为回到原始状态的最简单方法是使用:highlight Normal ctermfg=NONE