Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不使用内置函数的情况下在vimscript中插入文本_Vim - Fatal编程技术网

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

如何在不使用内置函数的情况下在vimscript中插入文本,vim,Vim,假设我有一个包含以下文本的文件: aaa bbb ccc bbb ccc eee 在第二次出现ccc之后,我需要添加一行缺失的ddd 因此,按照建议使用内置的search()函数将不起作用,因为这样会找到第一个匹配项 我有一个vimscript函数的开始: 函数!addLine() 正常/bbb 正常/bbb “缺行 wq! 端功能 仅使用正常模式等是否可以执行此操作?如果可以,如何执行?使用:normal,需要将正常模式命令所需的任何回车键(回车键,)或转义键传递给它。因此/…命令如下所示

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

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

因此,按照建议使用内置的
search()
函数将不起作用,因为这样会找到第一个匹配项

我有一个vimscript函数的开始:

函数!addLine()
正常/bbb
正常/bbb
“缺行
wq!
端功能

仅使用正常模式等是否可以执行此操作?如果可以,如何执行?

使用
:normal
,需要将正常模式命令所需的任何回车键(回车键,
)或转义键传递给它。因此
/…
命令如下所示:

exec "normal /bbb\<cr>"
exec "normal /ccc\<cr>noddd\<esc>"
(按
n
重复搜索,然后按
o
在下一行开始输入,然后退出插入模式。)

或拆分为多个
:正常
s:

exec "normal /ccc\<cr>"
exec "normal /ccc\<cr>"
exec "normal oddd\<esc>"
exec“正常/ccc\”
执行“正常/ccc\”
执行“正常oddd”

您必须小心,此处插入的文本没有。对于
:normal
,任何正常模式命令所需的回车键(回车键,
)或转义键都需要传递给它。因此
/…
命令如下所示:

exec "normal /bbb\<cr>"
exec "normal /ccc\<cr>noddd\<esc>"
(按
n
重复搜索,然后按
o
在下一行开始输入,然后退出插入模式。)

或拆分为多个
:正常
s:

exec "normal /ccc\<cr>"
exec "normal /ccc\<cr>"
exec "normal oddd\<esc>"
exec“正常/ccc\”
执行“正常/ccc\”
执行“正常oddd”

您必须小心,此处插入的文本没有。

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

function!AddLine()
正常/bbb\n/ccc\oddd\
wq!
端功能
请注意:

  • \
    在文件中显示为
    ^M
    ,然后以CTRL-v和CTRL-M输入
  • \
    在文件中显示为
    ^[
    ,然后以CTRL-v输入
要理解脚本
normal/bbb\n/ccc\oddd\

  • /bbb\
    -查找第一行
    bbb
  • n
    -查找下一个匹配项
  • /ccc\
    -查找下一行
    ccc
  • o
    -进入插入模式并输入文本:
  • ddd
  • \
    -退出插入模式
可使用Vim功能将其改写为:

function!AddLine()
呼叫搜索(“bbb”)
呼叫搜索(“bbb”)
设l:foundline=search(“ccc”)
调用附加(l:foundline,“ddd”)
wq!
端功能
这两个函数都可以根据需要正确地编辑文件,当然我也同意Vim函数的使用更简洁

另见:

  • :Vim中的帮助
  • 我的

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

function!AddLine()
正常/bbb\n/ccc\oddd\
wq!
端功能
请注意:

  • \
    在文件中显示为
    ^M
    ,然后以CTRL-v和CTRL-M输入
  • \
    在文件中显示为
    ^[
    ,然后以CTRL-v输入
要理解脚本
normal/bbb\n/ccc\oddd\

  • /bbb\
    -查找第一行
    bbb
  • n
    -查找下一个匹配项
  • /ccc\
    -查找下一行
    ccc
  • o
    -进入插入模式并输入文本:
  • ddd
  • \
    -退出插入模式
可使用Vim功能将其改写为:

function!AddLine()
呼叫搜索(“bbb”)
呼叫搜索(“bbb”)
设l:foundline=search(“ccc”)
调用附加(l:foundline,“ddd”)
wq!
端功能
这两个函数都可以根据需要正确地编辑文件,当然我也同意Vim函数的使用更简洁

另见:

  • :Vim中的帮助
  • 我的

连续调用
search()
应查找下一个事件。
call search(“bbb”)| call search(“bbb”)
范围内的i(10)| call search(“bbb”)| endfor
等。如果我执行
search(“ccc”)| search(“bbb”)
我似乎在第一行而不是第二行结束?你从哪一行开始?从第一行开始,
:呼叫搜索(“ccc”)|呼叫搜索(“bbb”)
让我到第四行(第二行
bbb
).Hmmm yes如果在文件中以命令模式调用,与在函数中调用不同。啊,我明白了。试试
search(“ccc”,“e”)
相反-它应该将光标移动到匹配的末尾,但行为似乎因调用它而有所不同,因此使用
e
标志明确指定该行为应该可以解决这一问题。对
search()
的连续调用应该会找到下一个匹配项。
调用搜索(“bbb”)|调用搜索(“bbb”)
范围内的i(10)|呼叫搜索(“bbb”)|结束
,等等。如果我做
搜索(“ccc”)|搜索(“bbb”)
我似乎在第一行而不是第二行结束?你从哪行开始?从第一行开始,
:呼叫搜索(“ccc”)|呼叫搜索(“bbb”)
让我到第4行(第二个
bbb
).Hmmm yes如果从文件内部的命令模式调用而不是在函数内部调用,则其行为似乎有所不同。啊,我明白了。请尝试
搜索(“ccc”,“e”)
相反-它应该将光标移动到匹配的末尾,但行为似乎因调用它而有所不同,因此使用
e
标志明确指定该行为应该可以解决这一问题。记住是什么:帮助是为了记住是什么:帮助是为了什么