我希望vim自动删除所有尾随空格,将光标保持在当前位置,所以我在vimrc中使用了以下autocmd
autocmd BufWritePre *
\ exec "%s/\\s\\+$//e" | exec 'normal ``'
它运作正常。但是如果自上次写入以来没有任何改变,则在执行最后一次写入时,“w”命令将导致光标移动到最后位置。如果我希望光标无条件地保持其位置,我该怎么办。
BR,若尘
答案 0 :(得分:1)
您可以使用命令silent!
来避免匹配失败导致的错误影响您的其他命令:
exec "silent! %s/\\s\\+$//e" | exec 'normal ``'
请参阅:help silent
。
答案 1 :(得分:1)
您可以先通过:normal! m'
手动设置标记,但最好保存整个视图,因为跳回标记只会恢复光标位置,但不一定是窗口内的整个视图(如果发生滚动)。
autocmd BufWritePre *
\ let g:saveview = winsaveview() |
\ %s/\s\+$/e" |
\ call winrestview(g:saveview)
这仍然会破坏您的搜索模式(:function
中的包装可以修复)。
我建议使用经过测试且更易配置的插件。巧合的是,我开发了DeleteTrailingWhitespace plugin,可通过以下配置自动无条件删除:
let g:DeleteTrailingWhitespace = 1
let g:DeleteTrailingWhitespace_Action = 'delete'
答案 2 :(得分:0)
如果文件没有改变,可以通过使用:update
命令进行写入,或者通过检查autocmd中的“modified”选项来避免编写文件,例如{{1} }。