如何在不使用内置功能的情况下在Vimscript中插入文本

时间:2019-04-01 03:33:23

标签: vim

假设我有一个包含以下文本的文件:

aaa
bbb
ccc
bbb
ccc
eee

我需要在发生ddd之后添加一条丢失的行ccc

因此,按照建议的here,无法使用内置的search()函数,因为它将找到第一个匹配项。

我有一个vimscript函数的开头:

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

是否可以仅使用普通模式执行此操作?如果可以,怎么办?

2 个答案:

答案 0 :(得分:2)

对于: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>"

您必须注意,此处插入的文本没有strings that might be special

答案 1 :(得分:0)

除了Muru出色而有用的答案外,我还想提供实际的代码:

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

请注意:

  • \<cr>在文件中显示为^M,并输入为 CTRL - v ,然后输入 CTRL -< kbd> m 。
  • \<esc>在文件中显示为^[,并依次输入 CTRL - v ESC 。 / li>

要了解脚本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函数更干净。如果您还记得所有功能!

另请参阅:

  • :help在Vim中
  • 我的tests