2

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
4

1 回答 1

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

您可能还需要跟踪粗体、下划线和背景颜色。:help synIDattr()有详细信息。

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

如果您关闭了语法,我猜 syn* 函数不会做任何事情。重新阅读问题后,我认为恢复原始状态的最简单方法是使用:highlight Normal ctermfg=NONE.

于 2010-07-23T07:17:56.073 回答