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

如何保存当前光标位置并稍后在Vimscript中加载它?,vim,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

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

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])
但是仍然会发生完全相同的事情,好像对
游标的调用没有任何效果。有什么想法吗?

试着做个标记:

mark `
%s/\s\+$//e
normal ``
  • :execute
    用于评估Ex命令,但
    cursor()
    是一个内置函数。您需要使用
    :调用游标(a:cursor\u pos[1],a:cursor\u pos[2])
    调用它。此外,您不需要在函数中使用
    :normal
    来执行
    :substitute
    命令;只需编写
    %s/\s\+$//e
  • 有一个相对应的
    setpos()
    函数,调用起来更简单:
    :调用setpos('.',a:cursor\u pos)
  • 缓冲区中的跳转仍可能改变视图,即缓冲区的哪一部分是可见的。为了避免这种情况,您需要使用
    winsaveview()
    /
    winrestview()
    (包括光标位置)
  • 您的函数仍然会破坏搜索历史记录,并且还有其他缺点,比如没有可修改的缓冲区。特别是对于这个特殊的、非常常见的功能,有几种解决方案,例如my。(插件页面有指向其他插件的链接。)不要(糟糕地)在不需要的时候重新发明轮子
    重新发明轮子不利于学习吗?:)谢谢你的精彩解释。那很好(但是你可以/应该提到你知道其他的解决方案)。请注意,我不仅发布了一个插件推荐,还明确地介绍了您的代码,以帮助您学习。玩得高兴谢谢,罗曼。我用这个宏重新缩进一个段落-
    let@p='mt{jgq}
    t'`,其中
    t
    是我的临时寄存器。