使用':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
答案 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
。