2010-10-08 102 views
9

我想在vimscript中編寫一個函數來查找最後一個打開的括號或括號。這不一定是一個簡單的問題,因爲它需要能夠處理所有的以下內容:Vimscript:找到最後一個開放的圓括號或括號

function(abc 
function(abc, [def 
function(abc, [def], "string(" 
function(abc, [def], "string(", ghi(

正如你所看到的,嵌套的括號,不同的符號和字符串標記都需要智能處理。這甚至有可能嗎?有沒有工具與vimscript正則表達式做上下文感知的搜索,知道字符串中的未閉括號和括號之間的區別?

鑑於您可以語法突出顯示不平衡括號,應該可以找到最後一個未關閉的括號/括號。如何才能做到這一點?

+1

一對括號中的一半稱爲括號。 – 2012-12-11 02:52:09

+0

如果意圖是幫助突出顯示,請在此處記下問題和答案:http://superuser.com/questions/545278/how-to-have-vim-show-unclosed-parenthesis。插件'vim-matchopen'突出顯示與遊標相關的最後括號,括號和大括號(無論是關閉還是未關閉)。 – 2013-09-18 05:16:11

回答

4

所以,基本上,你必須找到最後一個不在註釋中而不是在字符串中的括號。

我不知道這是什麼語法是這樣,我把這些線路在緩衝區中,做了

:set ft=javascript 

得到串突出

function(abc 
function(abc, [def 
function(abc, [def], "string(" 
function(abc, [def], "string(", ghi(

現在把你的光標移動到3號線開parenthese併發出以下命令:

:echo synIDattr(synID(line('.'), col('.'), 0), 'name') =~? '\(Comment\|String\)' 

它會回顯你'1',這意味着c光標下的字符在註釋中或字符串中。

如果您將光標放在最後一行的最後一列並執行相同的命令,您將得到'0'。

現在您可以向括號括起來進行迭代,並根據「註釋」和「字符串」進行測試並獲取最後一個打開的圓括號。

您可以檢查this archive of "LISP: Balance unmatched parentheses in Vim"以查看如何使用vimscript關閉不匹配的括號。

+0

謝謝!它仍然比這更復雜(考慮以「function(abc,def(),ghi)」結尾的行,最後一個括號不是最後一個不匹配的括號),但synIDattr正是我需要做的其餘的工作。 – So8res 2010-10-09 20:27:28

1

我沒有任何直接的答案,但你可能想看看matchparen.vim插件中的代碼,它是Vim安裝包含的一個標準插件(在插件目錄中)。如果您啓用了該功能,那麼該插件是用於突出顯示匹配的parens的插件。該代碼比您需要的更普遍,因爲它跨行匹配,但您可能能夠使用它並測試它是否在同一行上找到匹配項,或者至少從代碼中獲得一些想法。

4

使用[(])

[(   go to [count] previous unmatched '('. 
])   go to [count] next unmatched ')'. 

對大括號:[{[}

+1

有趣。這是如何實施的?有沒有找到無與倫比的方括號的等價物?有沒有什麼簡單的方法可以在vimscript函數中使用它,而不需要實際移動光標? – So8res 2010-10-09 17:11:43

+3

在幫助/文檔中查找'searchpair()'。 – Jeet 2010-10-09 17:47:24