【问题标题】:How to insert text in a vimscript without using the builtin functions如何在不使用内置函数的情况下在 vimscript 中插入文本
【发布时间】:2019-04-01 03:33:23
【问题描述】:

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

aaa
bbb
ccc
bbb
ccc
eee

我需要在ccc第二 次出现之后添加一个缺失的行ddd

因此,使用内置的search() 函数(如建议的here)将不起作用,因为它会找到第一个匹配项。

我有一个 vimscript 函数的开始:

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

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

【问题讨论】:

  • search() 的连续调用应该会找到下一个匹配项。 call search("bbb") | call search("bbb")for i in range(10) | call search("bbb") | endfor
  • 如果我这样做search("ccc") | search("bbb"),我似乎会在第一个bbb 而不是第二个?
  • 你是从哪一行开始的?从第一行开始,:call search("ccc") | call search("bbb") 将我带到第 4 行(第二行 bbb)。
  • 啊,我明白了。改用search("ccc", "e") - 它应该将光标移动到匹配的末尾,但似乎行为会根据调用的不同而有所不同,因此使用e 标志明确指定该行为应该可以解决这个问题。

标签: vim


【解决方案1】:

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

exec "normal /bbb\<cr>"

您需要 Enter,没有它,/ 命令将被取消。

所以你的函数看起来像:

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

【讨论】:

    【解决方案2】:

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

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

    注意:

    • \&lt;cr&gt; 在文件中显示为 ^M 并输入为 CTRL-v 然后 CTRL-m .
    • \&lt;esc&gt; 在文件中显示为 ^[,输入为 CTRL-v 然后 ESC

    了解脚本normal /bbb\&lt;cr&gt;n/ccc\&lt;cr&gt;oddd\&lt;esc&gt;

    • /bbb\&lt;cr&gt; - 找到第一行 bbb
    • n - 寻找下一场比赛
    • /ccc\&lt;cr&gt; - 找到下一行 ccc
    • o - 进入插入模式并输入文本:
    • ddd
    • \&lt;esc\&gt; - 退出插入模式。

    这可以使用 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

    【讨论】:

    • 记住是 :help 的作用
    猜你喜欢
    • 2019-08-22
    • 2019-09-08
    • 1970-01-01
    • 2020-07-20
    • 2012-11-26
    • 2015-04-15
    • 2017-01-22
    • 1970-01-01
    • 2017-03-13
    相关资源
    最近更新 更多