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

时间:2015-07-11 11:20:40

标签: vim vim-plugin

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

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

(详细: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 _

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

let splitted = split(out, '\n')
%delete _
call append(0, splitted)
$delete _

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

  

如果在另一个视图中打开缓冲区(比如下一个旁边),和   我们称之为上述两种解决方案之一,它打破了光标   另一个视图并跳到底部

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

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

感谢。

3 个答案:

答案 0 :(得分:0)

您是否尝试过winsaveview()winrestview()

:let old_view=winsaveview()
:% delete _
:put! =out
:$ delete _
:call winrestview(old_view)

但是我对以更快的方式粘贴文本一无所知

答案 1 :(得分:0)

尝试使用redraw命令。

我曾多次面临类似的奇怪延迟问题,其中剖析并未显示出任何可疑之处。但是redraw命令在大多数情况下解决了它并且它没有破坏窗口布局(我上次发现此问题出现在vim-addon-qf-layout plugin中)。

如果问题仍然存在,您可以尝试使用以下方法,这与您的第一个示例略有不同;我一直using it for quite some time without any delays

function! s:setCurrentLine(content)
   silent put =a:content 
   " delete original line
   silent '[-1delete _
endfunction

答案 2 :(得分:0)

这个怎么样?它保存每个窗口的视图,当前缓冲区打开,然后在修改后恢复所有视图。它似乎对我有用。

<a href="http://reach.smacademy.com"><i class="fa fa-rocket"></i><?php _e('My campaigns', 'reach'); ?></a>