我写了一个函数来删除文件中多余白色:
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
的调用没有任何效果。有什么想法吗?
3条答案
按热度按时间uttx8gqw1#
:execute
是用来计算 *Ex命令 * 的,但是cursor()
是一个内置的 * 函数 *。你需要用:call cursor(a:cursor_pos[1], a:cursor_pos[2])
来调用它。另外,你不需要在你的函数中使用:normal
来执行:substitute
命令;只写%s/\s\+$//e
。1.有一个对应的
setpos()
函数,调用起来更简单::call setpos('.', a:cursor_pos)
1.缓冲区中的跳转仍然可能改变 view,即缓冲区的哪一部分是可见的。为了避免这种情况,您需要使用
winsaveview()
/winrestview()
(其中包括光标位置)。1.你的函数仍然会破坏搜索历史记录,并且还有其他的缺点,比如在不可修改的缓冲区上失败。特别是对于这个特殊的,非常常见的功能,有几个解决方案,比如我的DeleteTrailingWhitespace plugin。(插件页面有到替代插件的链接。)不要(糟糕地)在你不需要的时候重新发明轮子!
f1tvaqid2#
尝试放置标记:
toe950273#
将替代品与定位线结合