我将内容存储在我想用当前缓冲区替换的变量(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
有没有办法,替换缓冲区的内容,这是快速的,不会破坏布局?或者我如何使用上述程序之一阻止它?
感谢。
答案 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>