无人小站

自定义 Vim 中 QuickFix 列表的格式

JP-Liu VimTabularQuickfix

自定义 Vim 中 QuickFix 列表的格式

Vim 中默认的 QuickFix 默认的格式是 文件名|行列位置|行内容,最近一直希望调整一下显示的格式,目标的格式是 |行数|行内容,在一番搜索之后,找到了一个 Gist 里面提到了可以参考的代码:

function! QuickFixFormat()
  let qflist = map(getqflist(),
    \ 'extend(v:val, {"filename" : bufname(v:val.bufnr)})')
  let prefix_len = 2 + max(map(copy(qflist),
    \ 'strchars(v:val.filename . v:val.lnum)'))
  let fmt = '%-' . prefix_len . 's' . '%s'
  setlocal modifiable
  call setline('1', map(qflist,
    \ 'printf(fmt, v:val.filename . ":" . v:val.lnum, "| " . v:val.text)'))
  setlocal nomodifiable nomodified
endfunction
augroup QuickFixFormat
  autocmd!
  autocmd BufReadPost quickfix call QuickFixFormat()
augroup END

上面的代码和我的目标有差异,但是提供了思路,QuickFix 列表本身是不支持编辑的,但是可以通过 setlocal modifiable 改成可编辑,有了思路就好办了,简单尝试了实现。

function! QuickFixFormat()
    setlocal modifiable
    setlocal nowrap
    silent! %s/^.\{-}|\(\d\d*\) col \(\d\d*\)\D\{-}|/|L\1|/g
    silent nohlsearch
    setlocal nomodifiable nomodified
endfunction
augroup QuickFixFormat
    autocmd!
    autocmd BufReadPost quickfix call QuickFixFormat()
augroup end

但是上面这个写法有一个问题,在显示第二个 | 的时候,并没有对齐,这个时候我考虑借用 Tabular,实现如下,基本满足了我的要求:

function! QuickFixFormat()
    setlocal modifiable
    setlocal nowrap
    silent! %s/^.\{-}|\(\d\d*\) col \(\d\d*\)\D\{-}|/|L\1|/g
    silent! Tab /^|
    silent! Tab /^| L\d\d*
    silent nohlsearch
    setlocal nomodifiable nomodified
endfunction
augroup QuickFixFormat
    autocmd!
    autocmd BufReadPost quickfix call QuickFixFormat()
augroup end

效果

补充说明

  • 部分的 silent 后面加入 ! 用于忽略错误。
JP-Liu
懒人一个