更换缓冲区时,防止光标跳到底部

Fat*_*lan 7 vim vim-plugin

我有内容存储在out我想用当前缓冲区替换的variable()中.我现在正在这样做(简化版):

let splitted = split(out, '\n')
if line('$') > len(splitted)
    execute len(splitted) .',$delete'
endif
call setline(1, splitted)
Run Code Online (Sandbox Code Playgroud)

(详细:https://github.com/fatih/vim-go/blob/master/autoload/go/fmt.vim#L130)

但是setline()这会导致某些机器的速度变慢,并且https://github.com/fatih/vim-go/issues/459.我自己也对它进行了描述,但对我来说,setline不是问题.无论如何,我需要一个更快的解决方案.所以我想出了其他几个解决方案.

第一个是将输出放到寄存器中,删除所有行然后将其放回:

let @a = out
% delete _
put! a
$ delete _
Run Code Online (Sandbox Code Playgroud)

第二个解决方案是使用append()(之前在vim-go https://github.com/fatih/vim-go/commit/99a1732e40e3f064300d544eebd4153dbc3c60c7中使用过):

let splitted = split(out, '\n')
%delete _
call append(0, splitted)
$delete _
Run Code Online (Sandbox Code Playgroud)

他们工作!然而,它们都会引起副作用,我仍然无法解决,也写在标题中.问题描述如下:

如果在另一个视图中打开缓冲区(比如旁边的那个),我们调用上面两个解决方案中的一个,它会打破另一个视图的光标并跳转到底部

这是一个更好的GIF(每当我调用:w上面的一个程序时):http://d.pr/i/1buDZ

有没有办法,替换缓冲区的内容,这是快速的,不会打破布局?或者我如何使用上述程序之一阻止它?

谢谢.

yol*_*yer 0

你尝试winsaveview()过吗winrestview()

:let old_view=winsaveview()
:% delete _
:put! =out
:$ delete _
:call winrestview(old_view)
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何以更快的方式粘贴文本