重复使用Vim终端缓冲区

3

当我在Vim 8中处理Bash脚本时,我经常使用以下命令在一个分离的终端中执行当前缓冲区:

:terminal %

但是第二次运行此命令时,会打开一个新的缓冲区而不是重用之前的缓冲区,这将导致多个终端打开,除非我显式关闭第一个终端。

有没有办法让Vim始终为:terminal命令重用同一个缓冲区?最好是能够放入我的.vimrc文件中的一行代码。


我认为直接打开默认终端并从那里调用您的命令可能会更容易。要再次调用它,可以使用向上箭头键+回车键,或者如果您的shell具有类似于Bash vi样式输入的功能,则可以使用k +回车键。 - sidyll
另外,简单的 :!%:p 命令通常足以执行您的脚本。 - sidyll
3个回答

1

在我之前的答案基础上,以下命令尝试每次重复使用同一个终端。如果旧终端不存在,则打开新窗口;如果旧窗口中仍在运行命令,则失败。该窗口从一个命令保持其几何形状到另一个命令:

command! -nargs=1 RunInTerminal silent call s:RunInTerminal(<q-args>)
command! -nargs=? MakeInTerminal silent call s:MakeInTerminal(<q-args>)

function s:RunInTerminal(cmd)
  let l:options = {'term_name': '!' .. a:cmd}
  const l:orig_winid = win_getid()
  if win_gotoid(s:term_winid) == 1
    let l:options['curwin'] = 1
  endif
  call term_start([&g:shell, &g:shellcmdflag, a:cmd], l:options)
  let s:term_winid = win_getid()
  call win_gotoid(l:orig_winid)
endfunction

if !exists('s:term_winid')
  let s:term_winid = 0
endif

function s:MakeInTerminal(args)
  const l:cmd = expandcmd(&makeprg) .. (a:args == '' ? '' : ' ' .. a:args)
  call s:RunInTerminal(l:cmd)
endfunction

1

:help :terminal 的说明:

打开一个新的终端窗口。

据我所知,没有办法告诉 :terminal 重用一个现有的窗口。

你可以尝试使用 :help term_start()term_opencmd 选项来构建自己的替代 :terminal


谢谢,如果没有人在这里发布解决方案,我可能会尝试使用term_start()进行实验。我希望能得到一个已经解决了问题(或找到了替代方法)的答案。 - apostl3pol

1
如果你愿意再进一步,你实际上可以使用tmuxsend-keysvim和文件路径的组合,而不是使用缓冲区本身。
首先创建一个tmux会话,最好在脚本将要运行的同一目录中运行: tmux new-session -s DEBUGSESSION 然后编辑名为my_script.sh的文件,该文件必须已经具有可执行标志。 vim my_script.sh 然后从vim内部向tmux会话发送运行文件的按键:
:!tmux send-keys -t DEBUGSESSION "%:pCtrl+VCtrl+M"
是的,你可能也可以发送缓冲区而不是文件,但如果你有一个大文件,我不知道性能如何。
是的,这限制了你只能使用整个文件(而不是缓冲区,在缓冲区中,你可以选择多行)。
但我仍然认为它可能很有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接