У меня есть содержимое, хранящееся в переменной (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. Я сам профилировал его, но для меня сеттинга не было проблемой. Во всяком случае, мне нужно решение, которое быстрее. Поэтому я придумал несколько других решений.
Первый из них, который помещает выходные данные в регистр, удаляет все строки, а затем помещает его обратно:
let @a = out
% delete _
put! a
$ delete _
Второе решение будет использовать append()
(который ранее был использован в VIM-идут 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
есть ли способ, чтобы заменить содержимое буфера, который быстро и не нарушает макет? Или как я могу предотвратить это с помощью одной из вышеперечисленных процедур?
Спасибо.
Да, я уже использую их, но они не влияют на два варианта выше. Вот как я его использую: https://github.com/fatih/vim-go/blob/master/autoload/go/fmt.vim#L58 Также нет проблем с текущим буфером/представлением, проблема в том, что это влияя на другую позицию курсора Windows, где у меня нет никакого контроля. –
К сожалению, я пропустил это о вашей проблеме: «в * другом виде *», извините – yolenoyer
Да, пожалуйста, смотрите GIF, я тоже показал его в действии :) –