如何在不使用内置函数的情况下在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
标志明确指定该行为应该可以解决这一问题。记住是什么:帮助是为了记住是什么:帮助是为了什么