假设我有一个包含以下文本的文件:
aaa
bbb
ccc
bbb
ccc
eee
我需要在第二次出现ddd
后添加一条缺失的线ccc
。
出于这个原因,使用内置的search()
函数,如here建议,将无法工作,因为这将找到第一次出现。
我有一个vimscript函数的开头:
function! addLine()
normal /bbb
normal /bbb
" MISSING LINE
wq!
endfunction
是否可以使用普通模式等来做到这一点?如果是这样,怎么样?
使用:normal
,正常模式命令所需的任何Enter(回车,<CR>
)或Escape按下都需要传递给它。所以/...
命令看起来像:
exec "normal /bbb\<cr>"
你需要输入,没有它,/
命令被取消。
所以你的功能看起来像:
exec "normal /ccc\<cr>noddd\<esc>"
(按n
重复搜索,然后o
在下一行开始输入,然后Escape退出插入模式。)
或拆分成多个:normal
s:
exec "normal /ccc\<cr>"
exec "normal /ccc\<cr>"
exec "normal oddd\<esc>"
你必须要小心,这里插入的文本没有strings that might be special。
除了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函数更清晰。如果你能记住所有的功能!
也可以看看:
:help