在vim中使用带有synmaxcol的折叠

时间:2012-08-08 21:53:38

标签: vim vim-syntax-highlighting

有时当我正在开展一个项目时,我想要玩一些数据。通常,数据在一行上并且是巨大的(> 25k字符)。我知道我可以set nowrap让这条线刚刚离开屏幕,但我倾向于因为其他原因而喜欢set wrap。因此,作为一种解决方法,我想在标记折叠中隐藏这些长行(例如{{{ long line }}})。这工作正常,但由于某种原因我遇到synmaxcol的问题。如果折叠线超过synmaxcol,那么当我打开文件时,语法高亮显示会结束。例如:

enter image description here

但是,只要我打开折叠,语法就会自行纠正:

enter image description here

每次打开折叠都很烦人。正如您在本示例中所看到的那样,该行实际上并不长 - 它只是超过synmaxcol。由于在“string”元素处超出了synmaxcol,因此文件的其余部分将突出显示为字符串(因此只有单数双引号才会停止它)。

为什么会发生这种情况,我该如何解决?我已尝试使用不同的语法文件和文件类型,它仍然会发生。我也尝试过没有插件,最小的vimrc(仅包含syn on)和设置fdm=marker:synmaxcol=60的模式行,但它仍然会发生。

1 个答案:

答案 0 :(得分:1)

您可以手动输入:syntax sync fromstart以强制Vim从打开文件的开头重新扫描语法。
为方便起见,我建议定义一个热键:

noremap  <F5> <Esc>:syntax sync fromstart<CR>
inoremap <F5> <C-o>:syntax sync fromstart<CR>

现在您可以按F5清除大多数语法突出显示问题。

另外,看看Vim的fixing syntax highlighting - wiki page
此外,阅读:help :syn-sync-first可能会对此问题有所了解。

UPDATE:

我能够在我的机器上重现这种行为(我正在运行Vim 7.3.429) 但是,当我在块注释中包装折叠标记{{{}}}时,vim正确地呈现了语法。您可以使用zf命令创建适当包装的折叠标记。见Vim tips: Folding fun

通常,Vim会根据当前活动的语法选择正确的blockcomment字符串。但是,我的Vim非常香草,并且不识别Ruby语法。我可以在.vimrc文件中指定autocmd FileType ruby set commentstring==begin%s=end来设置正确的块注释。有关详细信息,请参阅:fold-create-marker

另一个解决方案是set synmaxcol=0,它将有效地将其设置为无穷大。这会导致Vim检查整行的语法,无论它有多长。但是,我不确定你需要为此付出什么样的性能损失。