如何让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
相关产品推荐
相关产品推荐

