12

我编写了一个函数来删除文件中多余的空白:

let g:trim_whitespace = 1

function! TrimWhitespace()
    if g:trim_whitespace
        normal :%s/\s\+$//e
    endif
endfunction

问题是光标位置设置[1, 1]在替换命令之后。我根本不希望光标移动,所以我尝试保存光标位置并在替换命令后将其重置:

let a:cursor_pos = getpos(".")
normal :%s/\s\+$//e
exec cursor(a:cursor_pos[1], a:cursor_pos[2])

但仍然发生完全相同的事情,好像调用cursor没有效果一样。有任何想法吗?

4

2 回答 2

13
  1. :execute用于评估Ex 命令,但cursor()它是一个内置函数。您需要使用:call cursor(a:cursor_pos[1], a:cursor_pos[2]). 此外,您不需要:normal在函数中执行:substitute命令;就写吧%s/\s\+$//e
  2. 有一个对应的setpos()函数更容易调用::call setpos('.', a:cursor_pos)
  3. 缓冲区中的跳转可能仍会改变视图,即缓冲区的哪一部分是可见的。为避免这种情况,您需要使用winsaveview()/ winrestview()(包括光标位置)。
  4. 您的函数仍然会破坏搜索历史记录,并且还有其他缺点,例如在不可修改的缓冲区上失败。特别是对于这个特殊的、非常常见的功能,有几种解决方案,例如我的DeleteTrailingWhitespace 插件。(插件页面有其他插件的链接。)当你不需要的时候不要(糟糕地)重新发明轮子!
于 2013-11-04T08:07:39.697 回答
7

尝试放置标记:

mark `
%s/\s\+$//e
normal ``
于 2013-11-04T07:02:01.803 回答