如何从Bash执行Vim异步命令并在任务完成后自动退出Vim
Bash脚本调用Neovim执行异步LSP安装后自动退出方案
问题复现
原有安装脚本逻辑如下,执行时会出现两类异常:
if [ ! -d $HOME/.local/share/nvim/lsp_servers/jdtls/ ]; then printf "\nInstalling the Java LSP server" mkdir -p ~/.local/share/nvim/lsp-servers/ nvim -c "LspInstall jdtls" fi
- 直接执行上述脚本时,Neovim进程会一直保持打开状态,无法正常返回Shell
- 尝试在启动参数中拼接退出指令时,由于
LspInstall jdtls是异步操作,Neovim会在LSP服务端安装完成前提前退出,导致安装失败,错误尝试命令如下:
nvim -c "LspInstall jdtls | q | q"
解决方法
核心逻辑是利用Neovim的自动命令机制,监听LSP安装完成的用户事件,待异步任务执行完毕后再触发退出,同时使用无头模式启动Neovim避免弹出交互窗口。
针对使用nvim-lsp-installer(提供LspInstall命令)的场景
直接将原有启动Neovim的命令替换为以下内容:
nvim --headless -c "LspInstall jdtls" -c "autocmd User LspInstallDone qaall"
参数说明:
--headless:以无UI的无头模式启动Neovim,适配脚本后台运行场景,不会弹出编辑器交互窗口-c "LspInstall jdtls":Neovim启动后触发jdtls服务端安装任务-c "autocmd User LspInstallDone qaall":注册自动监听规则,当捕获到LSP安装流程结束(无论成功/失败)的LspInstallDone事件时,执行强制退出指令,正常返回Shell进程
修正后的完整安装脚本:
if [ ! -d "$HOME/.local/share/nvim/lsp_servers/jdtls/" ]; then printf "\nInstalling the Java LSP server\n" mkdir -p ~/.local/share/nvim/lsp-servers/ nvim --headless -c "LspInstall jdtls" -c "autocmd User LspInstallDone qaall" fi
针对使用Mason(新版LSP管理插件,替代nvim-lsp-installer)的场景
Mason安装完成触发的事件为MasonInstallFinished,对应命令如下:
nvim --headless -c "MasonInstall jdtls" -c "autocmd User MasonInstallFinished qaall"
注意事项
- 不要用管道符
|拼接多个q指令,Vim脚本中管道是命令间传参的语法,并非顺序执行逻辑,该写法本身不符合语法规则,是导致提前退出的原因之一 - 路径变量建议添加双引号包裹,避免用户目录包含空格等特殊字符时触发路径解析错误
内容的提问来源于stack exchange,提问作者Stephane
相关产品推荐
相关产品推荐

