vim替换光标保持其位置

时间:2015-03-03 03:01:14

标签: vim cursor substitution

我希望vim自动删除所有尾随空格,将光标保持在当前位置,所以我在vimrc中使用了以下autocmd

autocmd BufWritePre *
\ exec "%s/\\s\\+$//e" | exec 'normal ``'

它运作正常。但是如果自上次写入以来没有任何改变,则在执行最后一次写入时,“w”命令将导致光标移动到最后位置。如果我希望光标无条件地保持其位置,我该怎么办。

BR,若尘

3 个答案:

答案 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} }。