如何在.vimrc中同步执行命令并实时显示其输出与提示信息
在Vim缓冲区实时显示命令执行进度与提示信息
嘿,这个需求太实用了——尤其是处理大型项目的lint时,能在当前文件里实时看到进度真的省心很多!我来给你拆解一下问题,再提供两个靠谱的方案:
首先,你原来的写法有两个小问题:
echo 'Running Lint'是Vim的内部消息,只会在底部状态栏短暂显示,不会写入缓冲区;execute '$read !'.cmd是同步执行外部命令,要等命令完全跑完才会把所有输出一次性追加到缓冲区,根本看不到实时进度。
下面的方案能完美解决同步显示提示+实时输出进度的需求:
方案1:用Vim异步作业(推荐,Vim 8+/Neovim)
这个方案直接在当前缓冲区末尾插入提示,然后实时捕获命令的每一行输出并追加,完全符合你的需求。把这段代码加到你的.vimrc里:
function! RunLintWithProgress() " 第一步:在当前缓冲区末尾插入提示信息 call append(line('$'), '=== Running LINT ===') " 替换成你实际的lint命令(比如eslint、flake8等) let l:lint_command = 'eslint %' " % 代表当前打开的文件 " 启动异步作业,实时处理输出 call job_start(l:lint_command, { \ "out_cb": {_, line -> append(line('$'), line)}, " 捕获标准输出,追加到缓冲区 \ "err_cb": {_, line -> append(line('$'), '[ERROR] ' . line)}, " 捕获错误输出,标记后追加 \ "exit_cb": {_, status -> append(line('$'), '=== Lint finished with status ' . status . ' ===')} \ }) endfunction " 映射一个快捷键,比如按<Leader>l触发(<Leader>默认是反斜杠\) nnoremap <Leader>l :call RunLintWithProgress()<CR>
用法说明:
- 打开要lint的文件,按
\l(或者你设置的其他快捷键); - 缓冲区末尾会立刻出现
=== Running LINT ===的提示; - lint命令的每一行输出(包括进度、错误信息)会实时追加到缓冲区;
- 命令结束后,会显示最终的执行状态。
方案2:用终端窗口显示(适合喜欢独立窗口的场景)
如果不想把输出混在当前文件缓冲区里,可以打开一个底部终端窗口,先显示提示再执行命令:
function! RunLintInTerminal() " 在当前窗口下方打开一个新的终端窗口 botright split resize 10 " 设置终端窗口高度为10行 setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap " 执行提示命令+你的lint命令,连在一起 let l:full_command = 'echo "=== Running LINT ===\n" && eslint %' call termopen(l:full_command) " 自动进入终端插入模式,方便查看滚动输出 startinsert endfunction nnoremap <Leader>lt :call RunLintInTerminal()<CR>
这个方案的好处是输出和当前文件分离,不会污染原文件缓冲区,适合输出内容较多的场景。
内容的提问来源于stack exchange,提问作者Ishu Gupta
相关产品推荐
相关产品推荐

