在我的 .vimrc 中,我有一个 autocmd 可以清理我的文件,但是我如何从命令中进行映射?
autocmd BufWritePre *.test1 silent! :%s/\s\+$//e | silent! :%s/\(\n\n\)\n\+/\1/ | silent! :%s#\($\n\s*\)\+\%$## | :%s/;$
nnoremap ;; silent! :%s/\s\+$//e | silent! :%s/\(\n\n\)\n\+/\1/ | silent! :%s#\($\n\s*\)\+\%$## | :%s/;$<CR>
映射失败说
Error detected while processing ~/.vimrc:
line 966:
E486: Pattern not found: ;$<CR>
答案1
因此,您的命令的主要问题是,通过使用,|
您实际上将其分解为多个命令,其中第一个是nnoremap
,但从第二个开始,是一系列带有替换的命令,这些命令在您运行silent!
时正在运行.vimrc
来源,而不是成为命令的一部分。
使用\|
or<bar>
应该可以解决这个问题。
第二个问题是,nnoremap
需要在正常模式下执行命令,因此它需要您silent!
并运行s
(替换)命令,然后该命令将光标下的字符替换为ilent! ...
,这不是您想要的...:
在此之前您需要额外的silent!
所以它知道进入命令模式。
第三,你的最后一个命令的%s/;$<CR>
格式并不好,你需要两个额外的/
s 来完成它。我假设你的意图是删除;
行尾的所有 s,所以%s/;$//
我假设你在这里想要的。 (我还注意到你跳过了silent!
那里,也许是遗漏了?我在这里添加它,以防万一。)
把它们放在一起:
nnoremap ;; :silent! :%s/\s\+$//e \| silent! :%s/\(\n\n\)\n\+/\1/ \| silent! :%s#\($\n\s*\)\+\%$## \| silent! :%s/;$//<CR>