我正在尝试使用VIM选择整个XML CDATA部分。对于那些不熟悉XML的人,CDATA部分如下所示:
<someTag><![CDATA[
This text is escaped in a Character Data section!
Look, I can use < and > characters freely!
]]></someTag>
<anotherTag><![CDATA[More escaped text!]]></anotherTag>
我尝试使用此映射来直观地选择并拉出CDATA部分内的文本,但看起来调用函数禁用了视觉选择:
inoremap <F9> <Esc>:call searchpair('<!\[CDATA\[', '', ']]>', 'b')v:call searchpair('<!\[CDATA\[', '', ']]>')y
有没有办法选择整个CDATA部分?这是我用来选择基于C语言的方法,供参考:
inoremap <F7> <Esc><C-V>aBy
谢谢。
答案 0 :(得分:3)
这个固定版本适合我
:inoremap <F9> <Esc>:call searchpair('<!\[CDATA\[', '', ']]>', 'b')<CR>
v:<C-u>call searchpair('<!\[CDATA\[', '', ']]>')<CR>v`<o
(现实生活中没有换线)
技巧:
<CR>
表示必要的 Enter 键<C-u>
清除命令行上的范围v`
重新选择视觉选择的开头o
将光标移动到视觉选择的结尾我很惊讶这是一个插入模式映射,我假设你也有正常的模式映射。
顺便说一下,也许你对'{1}}模式映射感兴趣'正确'的文本对象语义:
修改更新以回应评论:
以下似乎有效(在搜索模式中明智地使用operator pending
和\zs
)。您可能希望回溯一个位置(将\ze
添加到映射的末尾)。此外,到目前为止,<BS>
类型映射似乎更具吸引力。
operator-pending
PS。:您可能希望在搜索模式中应用显式魔术级别(例如:inoremap <F9> <Esc>:call searchpair('<!\[CDATA\[\zs', '', '\ze]]>', 'b')<CR>
v:<C-u>call searchpair('<!\[CDATA\[\zs', '', '\ze]]>')<CR>v`<o
)
答案 1 :(得分:1)
当你制作文本对象时,重要的是不要包裹文件。
:call searchpair('<!\[CDATA\[', '', ']]>', 'bW')|call searchpair('<!\[CDATA\[', '', ']]>', 'sW')|norm v''o
使用's'标志设置'标记,这很好。
使用'W'标志确保我们不进行EOF包装,这很重要。
此外,插入模式映射通常受益于<C-O>
,尽管在这种情况下并非如此。不过,这是一个很好的习惯。所以:
:inoremap <F9> <C-O>:<C-U>call searchpair('<!\[CDATA\[', '', ']]>', 'bW')|call searchpair('<!\[CDATA\[', '', ']]>', 'sW')|norm v''o