如何在 vim 8.1 中打开终端分割,而无需切换到它或返回到 vimscript 中的上一个分割

如何在 vim 8.1 中打开终端分割,而无需切换到它或返回到 vimscript 中的上一个分割

基本上我想要以下功能:
使用 vims 的新终端功能,我希望能够按下一个按钮,打开一个新的终端窗口,而不会从我正在编辑的文件中窃取焦点,使用
“cmake -Bbuild -H. && cmake --build build/ -- -j4 -w”编译我的代码,它向我显示实时编译,当我不再需要它时,我可以使用另一个按钮再次关闭它

那么,如何使用 :terminal 执行复杂命令,同时将焦点留在原始分割中?

答案1

据我所知,您现在还不能。您可以运行一个命令(:ter 命令)或一个 shell(:ter),但不能将命令放入打开的 shell 中。
:ter cmake -Bbuild -H. && cmake --build build/ -- -j4 -w
将启动构建,但您必须使用 CW w 或 CW k 或 CW j 或 CW h 或 CW l 返回另一个窗口。然后,您可以继续输入内容,同时观察构建过程。

nmap <leader> b :ter cmake -Bbuild -H. && cmake --build build/ -- -j4 -w

将其放入你的 .vimrc 中。如果你按下 leader 然后按 b,它就会启动它。如果你还没有更改它,默认的 leader 是 \。
你可能可以用 Tmux 来做这件事。

你可以这样做:

function! s:Buildit()
  ter cmake -Bbuild -H. && cmake --build build/ -- -j4 -w
  wincmd w 
endfunction
com! Buildit call s:Buildit()
nnoremap <leader> b :Buildit<CR>

答案2

您可以使用该term_sendkeys函数重用打开的终端窗口。它需要终端的缓冲区号,这有点烦人,所以我通常在用一个文件启动 vim 后立即打开终端。如果您找到了一种为 term_sendkeys 函数创建键盘映射的方法,并且不依赖于终端的缓冲区号,请告诉我。

打开一个新的终端窗口而不窃取焦点:

:exec "vert term"|wincmd w

在不窃取焦点的情况下在终端中进行编译:

call term_sendkeys(2, "cmake -Bbuild -H. && cmake --build build/ -- -j4 -w \<Enter>")

相关内容