基本上我想要以下功能:
使用 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>")
。