2011-04-28 79 views
6

我在高亮顯示的複雜語法元素上並希望獲取它的內容。你可以想辦法做到這一點?Vim:獲取光標下語法元素的內容

也許有一些方法可以搜索正則表達式,以便它包含光標

EDIT

好的,例如。遊標位於一個字符串中,我想獲取文本,這個語法元素的內容。請看下面一行:

String myString = "Foobar, [CURSOR]cool \"string\""; // And some other "rubbish" 

我想寫一個返回

"Foobar, cool \"string\"" 
+0

要簡單地在一個位置找到語法組,請參閱:http://stackoverflow.com/questions/1467438/find-out-to-which-highlight-group-a-particular-keyword-symbol-belongs-in- vim – 2014-06-04 19:01:44

回答

0

編輯功能:鑑於由nelstrom提到的插件的工作原理類似於我原來的做法,我在此結算價小幅更優雅的解決方案:

fu s:OnLink() 
    let stack = synstack(line("."), col(".")) 
    return !empty(stack) 
endf 

normal mc 

normal $ 
let lineLength = col(".") 
normal `c 

while col(".") > 1 
    normal h 
    if !s:OnLink() 
     normal l 
     break 
    endif 
endwhile 
normal ma`c 

while col(".") < lineLength 
    normal l 
    if !s:OnLink() 
     normal h 
     break 
    endif 
endwhile 
normal mb`av`by 
6

如果我理解了這個問題。我發現這個寶石前段時間不記得在哪裏,但我曾經瞭解高亮顯示瞭如何語法VIM工作:

" Show syntax highlighting groups for word under cursor 
nmap <leader>z :call <SID>SynStack()<CR> 
function! <SID>SynStack() 
    if !exists("*synstack") 
    return 
    endif 
    echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")') 
endfunc 
+1

這是一個好的開始,但它只給出了語法組的名稱。我需要這些內容。 – blinry 2011-04-29 17:13:04

+0

你能解釋一下如何使用? 我對vim'syntax'突出顯示知之甚少,但它看起來像一顆寶石,但我沒有意義。 :( – 2013-12-15 17:19:41

3

textobj-syntax插件可能有幫助。它創建一個自定義文本對象,以便您可以運行viy以直觀地選擇當前語法突出顯示的元素。該插件取決於textobj-user插件,該插件是用於創建自定義文本對象的框架。

1

這對文本對象很有用(:help text-objects)。爲了得到你正在尋找(Foobar, cool \"string\")的內容,你可以做:

yi" 

y = yank 
i" = the text object "inner quoted string" 

默認情況下,抽出命令使用無名寄存器("",見:help registers),這樣你就可以以編程方式使用訪問猛拉內容該getreg()功能或簡寫@{register-name}

:echo 'String last yanked was:' getreg('"') 
:echo 'String last yanked was:' @" 

或者你可以抽出內容製作成不同的寄存器:

"qyi" 

將內部引用的字符串插入到"q寄存器中,因此它不會與標準寄存器使用衝突(並且可以作爲@q變量訪問)。

+1

謝謝,但這還不夠普遍,我不知道我「忽略了逃脫的引號,很好! – blinry 2012-02-08 12:30:04

+0

由於Vim語法作者可以靈活地指定語言元素,所以您可能很難找到可行的東西作爲一般的「內在句法元素」。 – benizi 2012-02-08 18:04:48