0

设置:具有多个选项卡、窗口和缓冲区的 Vim 会话。

目标:制作 Ex 命令,将选定文本从活动缓冲区发送到会话中的另一个缓冲区(最好使用自动完成)。我的意思是文本被附加目标缓冲区的末尾

示例:假设您在一个名为的缓冲区中apple,并且在另一个选项卡中命名了另一个缓冲区banana。您突出显示要发送到的文本banana(例如,包含文本“asdf”的行,然后键入:'<,'>append ban<TAB>,vim 将自动完成文本到:append banana。按回车后,vim 将字符串“asdf”从中剪切并附apple加到末尾banana.

我最接近的是:'<,'>!cat >> banana; 然而,这只适用于香蕉与苹果在同一个工作目录中的情况,并且它无法使用现有的缓冲区名称自动完成。

有没有办法构建一个 vim 脚本/viml 函数来做到这一点?

4

1 回答 1

2

像这样的东西?

function! Append(l1, l2, buffer)
  let currentBuffer = @%
  let currentRegister = @z
  execute a:l1 . "," . a:l2 . 'y z'
  execute "buffer " . a:buffer
  normal G"zp<C-O>
  let @z = currentRegister
  execute "buffer " . currentBuffer
endfunction

command! -nargs=1 -complete=buffer -range Append call Append(<line1>, <line2>, <f-args>)

我们记住当前缓冲区和z寄存器的当前值,因为我们将使用它来拉取;我们拉动,然后切换缓冲区,转到底部并粘贴;然后将一切恢复原状。-nargs=1 -complete=buffer为您提供缓冲区名称的自动完成功能。

于 2015-11-24T05:01:08.287 回答