1

Я определил следующую функцию, которая прекрасно работает при непосредственном вызове:

function EncloseParagraphs()
   execute "normal `>a</p>\<Esc>`<i<p>\<Esc>"
   %s/\%V\n\{2,}\%V/<\/p>\r\r<p>/ge
   nohl
endfunction

Но когда я использую следующее отображение

map <silent> <C-P> :call EncloseParagraphs()<CR>

Результаты выглядят так

<p><p><p>This is a paragraph.</p></p></p>

<p><p><p>This is a paragraph.</p>
</p></p>

Другими словами, несколько тегов p добавляются, когда в визуальном режиме выбрано несколько абзацев. Почему функция ведет себя по-разному при вызове через сопоставленный ярлык?

1 ответ1

0

Из справочной документации Vim:

help :call

--snip--
When a range is given and the function doesn't handle it
itself, the function is executed for each line in the range,
with the cursor in the first column of that line.  The cursor
is left at the last line (possibly moved by the last function
call).  The arguments are re-evaluated for each line.

Похоже, поскольку вы выбираете (выделяете) блок строк, затем нажимаете CP, ваша функция выполняется для этого блока несколько раз, по одному для каждой выбранной строки.

Я полагаю, вам нужно реализовать обработку диапазона в вашей функции, чтобы предотвратить многократное выполнение (!) с помощью функции:call.

В оставшейся части справочной документации функции:call обсуждается, как обрабатывать диапазоны и избежать этой проблемы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .