VIM: создание сценариев для всего раздела CDATA - PullRequest
2 голосов
/ 26 марта 2012

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

inoremap <F7> <Esc><C-V>aBy

Спасибо.

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

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

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

(без разрывов в реальной жизни)

Трюки:

  • <CR> для необходимых Ввод клавиш
  • <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) в своих шаблонах поиска

1 голос
/ 26 марта 2012

Когда вы создаете текстовые объекты, важно не оборачивать файл.

: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
...