skywind3000 / asyncrun.vim

:rocket: Run Async Shell Commands in Vim 8.0 / NeoVim and Output to the Quickfix Window !!
https://www.vim.org/scripts/script.php?script_id=5431
MIT License
1.84k stars 109 forks source link

runner为floaterm时出现错误:不允许在弹出窗口中使用 #280

Open spiedeman opened 9 months ago

spiedeman commented 9 months ago

使用 asynctask.vim 时遇到的问题: 自定义 runner: floatermwintype 类型为 float,因此 popup 窗口弹出后始终会获得焦点,而 get(a:opts, 'focus', 1) == 0 条件仍然为真,导致运行 noa wincmd p 命令时会出现错误:不允许在弹出窗口中使用。 若 wintye=split,则运行良好。

一点不成熟的小建议:若用 popup 窗口显示任务运行结果,可不必调用内置 terminal,直接用 job 运行任务,通过回调函数将运行结果显示到 popup 窗口中,可避免窗口焦点无法切换的问题。

截图_2023-11-24_23-09-38

skywind3000 commented 9 months ago

那你别加 -focus=0 啊

spiedeman commented 9 months ago

那你别加 -focus=0 啊

倒也是,但感觉不如加个判断条件,pos=floaterm时,强制 focus=1。 原本应该在另一个仓库asynctask下提问的,不过发现这边没法删除issue也就算了。主要是 task.ini文件里并未提供 focus选项,每次想切换 pos 的时候,还要额外修改 vimrc里的配置,甚是麻烦。

spiedeman commented 9 months ago

而且,pos=floaterm 时,wintype=float是写死了的,vimrctask.ini配置中均未提供自定义选项。因此,在插件里做条件判断if get(a:opts, 'focus', 1)==0 来提供自动关闭结果窗口的功能,根本不起作用。至少在vim下是这样,neovim不太熟悉,不敢说。

skywind3000 commented 9 months ago

tasks.ini 中可以写 focus 的,看:

https://github.com/skywind3000/asynctasks.vim/wiki/Task-Config#specification

spiedeman commented 9 months ago

看来是我没发现。 但好像发现一个新问题:没有匹配的自动命令:User AsyncRunInit。 因为用terminal输出时,貌似不能配置 CursorMoved 事件发生时自动关闭结果窗口,而用floaterm的话,得进插件里改动floaterm.vim,将wintype=float改为wintype=split。所以想自己写几个函数配合 autocmd 来实现,避免改动插件源码。结果搞了半天,似乎 AsyncRunPreAsyncRunStop 被移除了?

截图_2023-11-25_22-19-23

skywind3000 commented 9 months ago

只有基于 quickfix 的任务才支持这几个 autocmd,其他终端类,不支持,你可以自己添加终端相关 autocmd

spiedeman commented 9 months ago

只有基于 quickfix 的任务才支持这几个 autocmd,其他终端类,不支持,你可以自己添加终端相关 autocmd

原来如此。