vim 中是否有办法在使用 ':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' 解决方案有效。我将提供更多上下文,以供将来参考。
我的目标是编写一个函数和热键来快速打开和关闭语法高亮。为了让前景色在禁用语法高亮后恢复到原来的颜色,我不得不从颜色方案文件中删除“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