Как вставить текст в vimscript без использования встроенных функций - PullRequest
0 голосов
/ 01 апреля 2019

Предположим, у меня есть файл со следующим текстом:

aaa
bbb
ccc
bbb
ccc
eee

Мне нужно добавить пропущенную строку ddd после секунды вхождения ccc.

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

У меня есть начало функции vimscript:

function! addLine()
  normal /bbb
  normal /bbb
  " MISSING LINE
  wq!
endfunction

Возможно ли это сделать, просто используя обычный режим и т. Д.? Если да, то как?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

При :normal любые нажатия Enter (возврат каретки, <CR>) или Escape , необходимые для команды нормального режима, должны быть переданы ей. Итак, команда /... будет выглядеть так:

exec "normal /bbb\<cr>"

Вам нужен Enter , без него команда / отменяется.

Итак, ваша функция будет выглядеть так:

exec "normal /ccc\<cr>noddd\<esc>"

(Нажмите n, чтобы повторить поиск, затем o, чтобы начать ввод в следующей строке, затем Escape , чтобы выйти из режима вставки.)

Или разделить на несколько :normal с:

exec "normal /ccc\<cr>"
exec "normal /ccc\<cr>"
exec "normal oddd\<esc>"

Вы должны быть осторожны, чтобы во вставляемом здесь тексте не было строк, которые могли бы быть специальными .

0 голосов
/ 01 апреля 2019

Помимо превосходного и полезного ответа Муру, я хотел бы предоставить действительный код:

function! AddLine()
  normal /bbb\<cr>n/ccc\<cr>oddd\<esc>
  wq!
endfunction

Обратите внимание, что:

  • \<cr> отображается как ^M вфайл и вводится как CTRL - v , затем CTRL - m .
  • \<esc> отображается как ^[ в файле и вводится как CTRL - v затем ESC .

Для понимания сценария normal /bbb\<cr>n/ccc\<cr>oddd\<esc>:

  • /bbb\<cr> - найти первую строку bbb
  • n - найти следующее совпадение
  • /ccc\<cr> - найти следующую строку ccc
  • o - войти в режим вставки и ввести текст:
  • ddd
  • \<esc\> - выйти из режима вставки.

Это можно переписать с использованием функций Vim следующим образом:

function! AddLine()
  call search("bbb")
  call search("bbb")
  let l:foundline = search("ccc")
  call append(l:foundline, "ddd")
  wq!
endfunction

Обе эти функции корректно редактируют файл по мере необходимости, хотя, конечно, я согласен с тем, что использование функций Vim более понятное.Если вы помните все функции!

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...