You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让vim正确展示jq返回的错误信息而非覆盖编辑内容

你使用的 :!%jq . 命令会将jq的全部输出(包含标准错误流的报错信息)直接替换当前缓冲区的内容,所以JSON语法有误时,错误文本就会覆盖你正在编辑的原内容。

下面给出两种通用解决方案:

方案1:配置自定义快捷键,格式化失败自动弹窗展示错误

将以下Vimscript配置添加到你的 .vimrc 文件中,Neovim用户可添加到对应配置文件:

" 针对JSON文件绑定<leader>jq快捷键执行格式化
autocmd FileType json nnoremap <buffer> <leader>jq :call JqFormat()<CR>

function! JqFormat()
    " 取当前缓冲区所有未保存的内容传给jq,无需提前保存文件
    let l:content = join(getline(1, '$'), "\n")
    let l:formatted = system('jq .', l:content)
    " 判断jq执行是否成功
    if v:shell_error == 0
        " 格式化成功,替换当前缓冲区内容
        silent %d _
        silent put =l:formatted
        silent 1d _
        " 光标回到文件开头
        normal! gg
    else
        " 格式化失败,新建水平窗口展示错误信息
        new
        setlocal buftype=nofile bufhidden=wipe noswapfile
        put =l:formatted
        setlocal nomodifiable
    endif
endfunction

配置后打开JSON文件,按\jq(默认leader键是反斜杠,如果你自定义过leader键就换成你设置的前缀)即可触发格式化:

  • 若JSON语法正确,会直接替换为格式化后的内容
  • 若语法有误,会新开一个独立窗口展示错误信息,原编辑内容不会有任何改动,关闭错误窗口按:q即可。

方案2:无需改配置,临时使用quickfix窗口展示错误

如果你不想修改配置,每次格式化时可以执行以下命令,错误信息会展示在quickfix窗口中,不会覆盖原内容:

:cexpr system('jq . ' . shellescape(expand('%'))) | cwindow

如果格式化成功,手动执行:%!jq .替换内容即可。


内容的提问来源于stack exchange,提问作者aszswaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:06:05