如何保存当前光标位置并稍后在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
是我的临时寄存器。