如何在Vimscript中插入文本而不使用内置函数

ntjbwcob  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(116)

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

aaa
bbb
ccc
bbb
ccc
eee

我需要在ccc的 * 第二次 * 出现之后添加一个缺失行ddd
由于这个原因,使用内置的search()函数,如建议的here,将不起作用,因为它将查找第一个出现的位置。
我有一个vimscript函数的开始:

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

是否可以只使用正常模式等?如果是,如何进行?

bqjvbblv

bqjvbblv1#

对于:normal,任何按下回车(回车,<CR>)或正常模式命令所需的转义都需要传递给它。所以/...命令看起来像这样:

exec "normal /bbb\<cr>"

你需要回车,没有它/命令会被取消。
所以你的函数看起来像这样:

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

(按n重复搜索,然后按o开始下一行的输入,然后按Escape退出插入模式。)
或拆分为多个:normal

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

您必须小心,此处插入的文本没有可能是特殊的字符串。

anhgbhbe

anhgbhbe2#

除了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
e4eetjau

e4eetjau3#

我也想这么做。却没有找到答案。但当我尝试了一些事情,我找到了一个解决方案。
我知道并希望你已经找到了答案,但这里的其他人是要做的事情:
当你在vimscript菜单中时,只需按 esc,然后按 +
此时,您可以添加新内容。为了确保它工作正常,你可以在屏幕底部的vimscript菜单中看到一个“插入模式”。希望能帮上忙。

相关问题