簡體   English   中英

Vim語法高亮顯示幾行匹配

[英]Vim syntax highlighting for a match on several lines

我正在vim上實現一個語法文件來突出顯示這樣的層次結構

| text at level 1
| | text at level 2
| | text at level 2
| | | text at level 3
| text at level 1

比如我用

syn match myMatch +^\(| \)\++

突出水平指標。 但是,我還要強調這些錯誤的模式

| text at level 1
| | | text at level 3

這會使水平增加一個以上。 我寫了以下語法匹配

syn match myWrongMatch +^\(\(| \)*\)\(\n\|[^|].*\n\)\1\(| \)\{2,}+

它可能不是最佳的,但它可以完成這項工作。 問題是匹配是由正在編輯的行上的vim檢查的,這樣如果我通過刪除第二行上的級別來修復錯誤,它將停止突出顯示第二行,但仍然突出顯示第一行,直到我也編輯它(比如刪除並重寫一個字符)。

這個問題是我只能使用下一行信息匹配一行,而不是相反。 由於這與正則表達式匹配似乎不可能,我想知道是否有可能要求v​​im檢查當前編輯的行和前一行 (或更廣泛的上下文)中的匹配 另一個解決方案可能是通過檢查上下文的區域來實現它,但到目前為止我還沒有成功。

編輯 :答案實際上在vim幫助:syn-sync-linebreaks(感謝Herbert Sitz指出我正確的部分)。

使用匹配多行的模式時,一行中的更改可能導致模式在前一行中不再匹配。 這意味着必須從更改的位置開始。 可以使用“linebreaks”參數指定多少行。 例如,當一個模式可能包含一個換行符時,請使用:

:syntax sync linebreaks=1

結果是,在進行更改之前,重繪始終至少從一行開始。 “linebreaks”的默認值為零。 通常,“minlines”的值大於“linebreaks”。

這非常有效。

您可以嘗試自動執行語法同步操作。 例如,嘗試將其放入InsertEnter autocmd中,這將在退出插入模式時同步語法:

au InsertLeave * syntax synch minlines=50

不完美的解決方案。 也許添加更多autocmds會有所幫助。 這部分取決於您的文檔將會是什么樣子,它們將會有多大,您是如何編輯的。

如需幫助,請閱讀有關語法同步的更多信息:h syn-sync這不是同步的典型用法,因為據我所知,主要目的是在語法區域中自動搜索已編輯的行。 您沒有使用區域,因此您需要使用autocmd啟動同步。 也許你可以定義一個區域只是為了確保語法同步重新評估一組行的語法 - 不需要autocmd - 即使該區域不會用於突出顯示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM