当我在Vim 8中处理Bash脚本时,我经常使用以下命令在一个分离的终端中执行当前缓冲区:
:terminal %
但是第二次运行此命令时,会打开一个新的缓冲区而不是重用之前的缓冲区,这将导致多个终端打开,除非我显式关闭第一个终端。
有没有办法让Vim始终为:terminal
命令重用同一个缓冲区?最好是能够放入我的.vimrc文件中的一行代码。
在我之前的答案基础上,以下命令尝试每次重复使用同一个终端。如果旧终端不存在,则打开新窗口;如果旧窗口中仍在运行命令,则失败。该窗口从一个命令保持其几何形状到另一个命令:
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
:help :terminal
的说明:
打开一个新的终端窗口。
据我所知,没有办法告诉 :terminal
重用一个现有的窗口。
你可以尝试使用 :help term_start()
和 term_opencmd
选项来构建自己的替代 :terminal
。
term_start()
进行实验。我希望能得到一个已经解决了问题(或找到了替代方法)的答案。 - apostl3poltmux
与send-keys
、vim
和文件路径的组合,而不是使用缓冲区本身。tmux new-session -s DEBUGSESSION
然后编辑名为my_script.sh
的文件,该文件必须已经具有可执行标志。
vim my_script.sh
然后从vim内部向tmux会话发送运行文件的按键:
:!%:p
命令通常足以执行您的脚本。 - sidyll