我正在尝试使用 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
谢谢。
最佳答案
这个固定版本适合我
:inoremap <F9> <Esc>:call searchpair('<!\[CDATA\[', '', ']]>', 'b')<CR>
v:<C-u>call searchpair('<!\[CDATA\[', '', ']]>')<CR>v`<o
(现实生活中没有换行)
技巧:
-
<CR>
对于必要的Enter键 -
<C-u>
清除命令行上的范围 -
v`
重新选择到视觉选择的开始 -
o
将光标移动到视觉选择的末尾
我很惊讶这将是插入模式映射,我假设您也有正常模式映射。
顺便说一句,也许您会对 operator pending
感兴趣“正确的”文本对象语义的模式映射:
编辑更新以回复评论:
以下内容似乎有效(在搜索模式中明智地使用\zs
和\ze
)。您可能想要回溯一个位置(将 <BS>
添加到映射末尾)。另外,到目前为止,operator-pending
类型映射似乎变得更有吸引力。
:inoremap <F9> <Esc>:call searchpair('<!\[CDATA\[\zs', '', '\ze]]>', 'b')<CR>
v:<C-u>call searchpair('<!\[CDATA\[\zs', '', '\ze]]>')<CR>v`<o
PS:您可能还想在搜索模式中应用显式的魔法级别(例如 \V
)
关于xml - VIM:编写整个 CDATA 部分的选择脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9873459/