VIM:编写整个CDATA部分的选择

时间:2012-03-26 13:55:49

标签: xml vim cdata

我正在尝试使用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

谢谢。

2 个答案:

答案 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