如何在不使用内置函数的情况下在vimscript中插入文本

问题描述 投票:0回答:2

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

aaa
bbb
ccc
bbb
ccc
eee

我需要在第二次出现ddd后添加一条缺失的线ccc

出于这个原因,使用内置的search()函数,如here建议,将无法工作,因为这将找到第一次出现。

我有一个vimscript函数的开头:

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

是否可以使用普通模式等来做到这一点?如果是这样,怎么样?

vim
2个回答
2
投票

使用:normal,正常模式命令所需的任何Enter(回车,<CR>)或Escape按下都需要传递给它。所以/...命令看起来像:

exec "normal /bbb\<cr>"

你需要输入,没有它,/命令被取消。

所以你的功能看起来像:

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

(按n重复搜索,然后o在下一行开始输入,然后Escape退出插入模式。)

或拆分成多个:normals:

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

你必须要小心,这里插入的文本没有strings that might be special


0
投票

除了Muru的优秀和有用的答案,我想提供实际的代码:

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函数更清晰。如果你能记住所有的功能!

也可以看看:

  • 在Vim的:help
  • 我的tests
© www.soinside.com 2019 - 2024. All rights reserved.