3

有时当我在做一个项目时,我想玩弄一些数据。很多时候数据在一行并且很大(>25k 个字符)。我知道我可以set nowrap并且让这条线从屏幕上消失,但我倾向于set wrap出于其他原因喜欢。因此,作为一种解决方法,我想将这些长线隐藏在标记折叠中(例如{{{ long line }}})。synmaxcol这很好用,但由于某种原因我遇到了问题。如果折叠线超过synmaxcol了,那么当我打开文件时,语法突出显示就会结束。例如:

在此处输入图像描述

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

在此处输入图像描述

不过,每次都必须打开折叠很烦人。正如你在这个例子中看到的那样,这条线实际上并没有那么长——它只是超过了synmaxcol. 由于synmaxcol在“字符串”元素处超出,文件的其余部分将突出显示为字符串(因此,只有单引号将停止它)。

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

4

1 回答 1

1

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

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

现在您可以按 F5 来清理大多数语法高亮问题。

另外,请查看 Vim 的修复语法高亮 - wiki 页面
此外阅读:help :syn-sync-first可能会更清楚地说明这个问题。

更新:

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

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

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

于 2012-08-13T15:02:39.050 回答