vim:如何从 autocmd 进行映射

vim:如何从 autocmd 进行映射

在我的 .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>

相关内容