我正在使用突出显示的复杂语法元素,并希望获得它的内容。你能想出办法吗?
也许有一些方法可以搜索正则表达式,使其包含光标?
修改
好的,例子。光标在一个字符串里面,我想得到文本,这个句法元素的内容。请考虑以下行:
String myString = "Foobar, [CURSOR]cool \"string\""; // And some other "rubbish"
我想编写一个返回
的函数"Foobar, cool \"string\""
答案 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