Neovim问题:终端输出至带焦点拆分窗口后异常关闭
解决Neovim终端窗口执行命令后自动关闭的问题
问题描述
我正在尝试创建一个函数,用于在终端中运行命令,并将终端输出显示在新的拆分窗口中。使用的是Neovim(搭配SpaceVim)。当前函数如下:
function Gpt(prompt) " 获取当前缓冲区的完整路径 let file = expand('%:p') " 打开一个垂直拆分的终端窗口 split new wincmd k " 聚焦新打开的窗口 setlocal nobuflisted " setlocal bufhidden=wipe setlocal noswapfile call termopen('echo ' . a:prompt . ' | cat - ' . file . ' | tgpt') startinsert endfunction
遇到的问题:按下任意按键后,显示输出的窗口会立即关闭,除非用鼠标点击该窗口。更新后用stopinsert替代startinsert可暂时解决,但再次切换回该终端缓冲区时,窗口仍会关闭。
解决方案
问题根源在于终端进程结束后,缓冲区的默认清理行为导致窗口关闭。通过调整缓冲区属性和添加进程结束回调,可以彻底解决这个问题:
function Gpt(prompt) " 获取当前缓冲区的完整路径 let file = expand('%:p') " 打开水平拆分窗口(要垂直拆分替换为 vsplit new) split new wincmd k " 聚焦新打开的窗口 setlocal noswapfile setlocal bufhidden=hide " 进程结束后隐藏缓冲区而非直接删除 " 启动终端命令并绑定退出回调 let job_id = termopen('echo ' . a:prompt . ' | cat - ' . file . ' | tgpt', { \ 'on_exit': function('GptOnExit') \ }) startinsert endfunction function GptOnExit(job_id, exit_code, event) " 进程结束后自动退出插入模式,避免按键触发窗口关闭 stopinsert endfunction
修改说明
bufhidden=hide:替换原注释的bufhidden=wipe,终端进程结束后,缓冲区会被隐藏而非立即删除,窗口因此不会自动关闭。- 添加
on_exit回调:命令执行完成后自动切换到普通模式,解决插入模式下按键导致窗口关闭的问题。 - 移除
nobuflisted:该属性会让缓冲区不在缓冲区列表中,切换时容易被自动清理,移除后可通过:ls查看并正常切换回终端缓冲区。
内容的提问来源于stack exchange,提问作者SdSaati
相关产品推荐
相关产品推荐

