假设我有一个包含以下文本的文件:
aaa
bbb
ccc
bbb
ccc
eee
我需要在发生ddd
的秒之后添加一条丢失的行ccc
。
因此,按照建议的here,无法使用内置的search()
函数,因为它将找到第一个匹配项。
我有一个vimscript函数的开头:
function! addLine()
normal /bbb
normal /bbb
" MISSING LINE
wq!
endfunction
是否可以仅使用普通模式执行此操作?如果可以,怎么办?
答案 0 :(得分:2)
对于:normal
,正常模式命令所需的任何 Enter (回车,<CR>
)或 Escape 的按需传递给它。因此/...
命令如下所示:
exec "normal /bbb\<cr>"
您需要 Enter ,如果没有它,/
命令将被取消。
因此您的函数应如下所示:
exec "normal /ccc\<cr>noddd\<esc>"
(按n
重复搜索,然后按o
在下一行开始输入,然后按 Escape 退出插入模式。)
或分成多个:normal
:
exec "normal /ccc\<cr>"
exec "normal /ccc\<cr>"
exec "normal oddd\<esc>"
您必须注意,此处插入的文本没有strings that might be special。
答案 1 :(得分:0)
除了Muru出色而有用的答案外,我还想提供实际的代码:
function! AddLine()
normal /bbb\<cr>n/ccc\<cr>oddd\<esc>
wq!
endfunction
请注意:
\<cr>
在文件中显示为^M
,并输入为 CTRL - v ,然后输入 CTRL -< kbd> m 。\<esc>
在文件中显示为^[
,并依次输入 CTRL - v 和 ESC 。 / li>
要了解脚本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函数更干净。如果您还记得所有功能!
另请参阅:
:help
在Vim中