VIM:恢复正常高光组的原始前景色

VIM:恢复正常高光组的原始前景色,vim,syntax,colors,highlight,foreground,Vim,Syntax,Colors,Highlight,Foreground,在vim中是否有方法在使用“:highlight Normal”命令更改后恢复终端的原始前景色 例如,我在Windows命令提示符中使用vim.exe 7.2。我的命令提示符有绿色文本。启动vim.exe时,我可以运行以下命令将文本更改为红色: :highlight Normal ctermfg=red 但是,我不知道如何将前景色恢复为原始颜色 当然,在这个简单的例子中,我知道原始颜色是绿色的,所以我可以显式地将其设置回绿色。但在现实生活中,我正在编写一个vim脚本,需要一个通用的解决方案来恢

在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()函数为每个正常前景色返回相同的值。考虑以下内容:在命令提示符下启动一个新的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()没有返回任何值,只是我添加的文字星号分隔符

接下来,我更改正常组前景颜色:

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

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

“高亮显示正常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
函数!fSwitchSyntax()
如果存在(“g:syntax_on”)
语法错误

高亮显示正常字符mfg=NONE在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*函数什么都做不了。在重新阅读了这个问题之后,我认为回到原始状态的最简单方法是使用
:突出显示正常的ctermfg=NONE

“ctermfg=NONE”语法有效;谢谢你的回答!我会用更多的信息对原始帖子进行编辑。(我还没有完全弄清楚在stackoverflow上发布回复的工作流程/礼仪。前几天我在你的回复中添加了一些评论,然后意识到1.空间有限,2.我无法格式化代码。在咨询常见问题解答和朋友后,我决定删除评论并修改原始帖子。我想我应该离开e评论;很抱歉造成混乱。)@mannion:没问题!我认为人们通常的做法是编辑问题,然后发表“嘿,我编辑了问题”的评论。