如何保存当前光标位置并在以后将其加载到Vimscript中?

qnyhuwrf  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(114)

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

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

uttx8gqw

uttx8gqw1#

  1. :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。(插件页面有到替代插件的链接。)不要(糟糕地)在你不需要的时候重新发明轮子!
f1tvaqid

f1tvaqid2#

尝试放置标记:

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

toe950273#

将替代品与定位线结合

function! SubstiTute()
    let l = 1
    for line in getline(1, '$')
        call setline(l, substitute(line, "\\v +$", "", "g"))
        let l = l + 1
    endfor
endfun
"call SubstiTute()

相关问题