2012-03-26 3 views
2

Я пытаюсь выбрать целую секцию XML CDATA с VIM. Для тех, кто не знаком с XML, раздел CDATA выглядит следующим образом:VIM: Сценарий выбора всего раздела 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 

Спасибо.

ответ

3

Эта неподвижная версия работает для меня

:inoremap <F9> <Esc>:call searchpair('<!\[CDATA\[', '', ']]>', 'b')<CR> 
     v:<C-u>call searchpair('<!\[CDATA\[', '', ']]>')<CR>v`<o 

(нет разрыв строки в реальной жизни)

хитрости:

  • <CR> необходимого Введите ключи
  • <C-u> очистить диапазон на командной строке
  • v` для повторного выбора для начала визуального выделения
  • o, чтобы переместить курсор в конец визуального выделения

Я удивлен, что это было бы сопоставление режима вставки, я предполагаю, что у вас есть отображение нормального режима тоже.

Кстати, возможно, вам будет интересно в operator pending отображения режима для 'правильный' текст-семантики объекта тоже:

Edit Update в ответ на комментарий:

Следующие действия предназначены для работы (ju dicious использование \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) внутри ваших шаблонов поиска, а также

+0

Большое спасибо, это 99% от того, что мне нужно! Я не осознавал необходимость в символах ''. Однако это сопоставление также выбирает ведущий ' dotancohen

+1

@dotancohen обновленный ответ – sehe

+0

Спасибо. Он по-прежнему ловит '' '' '' '' '(даже по-разному для многострочных и однострочных разделов CDATA), это можно увидеть' x' в выбранном тексте. Сейчас я читаю о сопоставлении типов операторов, о которых я никогда не слышал. Благодарю. – dotancohen

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 
+0

Хороший вопрос об флагом упаковки – sehe

+0

Спасибо. Как и код sese, это сопоставление захватывает '[' и ']' символы из ''. Я пытаюсь сыграть с ним, чтобы проверить, могу ли я надежно удалить эти символы. Многострочные секции CDATA - проблема, потому что 'h' и' l' не могут использоваться для простого перемещения курсора. – dotancohen

Смежные вопросы