如何保存当前光标位置并稍后在Vimscript中加载?

时间:2013-11-04 06:46:06

标签: vim

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

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的调用没有效果一样。有什么想法吗?

2 个答案:

答案 0 :(得分:8)

  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 plugin。 (该插件页面包含指向其他插件的链接。)当你不需要时,不要(糟糕地)重新发明轮子!

答案 1 :(得分:5)

尝试放置标记:

mark `
%s/\s\+$//e
normal ``