Vim:获取光标下语法元素的内容

时间:2011-04-28 15:08:43

标签: regex vim syntax-highlighting

我正在使用突出显示的复杂语法元素,并希望获得它的内容。你能想出办法吗?

也许有一些方法可以搜索正则表达式,使其包含光标

修改

好的,例子。光标在一个字符串里面,我想得到文本,这个句法元素的内容。请考虑以下行:

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

我想编写一个返回

的函数
"Foobar, cool \"string\""

4 个答案:

答案 0 :(得分:7)

如果我理解了这个问题。我不久前发现了这个宝石,不记得在哪里,但我曾经理解语法高亮在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 :(得分:3)

textobj-syntax插件可能有所帮助。它会创建一个自定义文本对象,以便您可以运行viy以直观地选择当前语法高亮显示的元素。该插件依赖于textobj-user插件,这是一个用于创建自定义文本对象的框架。

答案 2 :(得分:1)

这对文本对象(:help text-objects)很有用。要获取您正在寻找的内容(Foobar, cool \"string\"),您可以这样做:

yi"

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

默认情况下,yank命令使用未命名的寄存器("",请参阅:help registers),因此您可以使用getreg()函数或速记{{1}以编程方式访问抽出的内容}:

@{register-name}

或者你可以把内容拉到另一个寄存器中:

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

将内部引用的字符串拉入"qyi" 寄存器,因此它不会与标准寄存器使用冲突(并且可以作为"q变量访问)。

答案 3 :(得分: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