自定义 Vim 中 QuickFix 列表的格式
自定义 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 后面加入 ! 用于忽略错误。