在Vim中按行文本自动对Quickfix条目进行排序

时间:2013-03-13 18:15:05

标签: list sorting vim dictionary

我正在尝试按照行本身的内容按字母顺序自动对Quickfix列表中的行进行排序(默认情况下,它按照它们在文件中出现的顺序排序)。我把下面放在我的.vimrc中,但由于某种原因它根据行号进行排序。据我所知,Quickfix列表是一个字典列表,因此下面的'Sortqfbytext'函数应该只按每个列表项的'text'内容排序,而忽略其余的(包括行号)。

function! s:Sortqfbytext(i1, i2)
  let textlist = []
  let textlist = [a:i1.text,a:i2.text]
  call sort(textlist)
  if textlist[0] == textlist[1]
    return 0
  elseif textlist[0] == a:i1.text
    return 1
  elseif textlist[0] == a:i2.text
    return -1
  endif
endfunction

function! s:Makesortedqflist()
  let xlist = sort(getqflist(), 's:Sortqfbytext')
  call setqflist(xlist)
endfunction

autocmd! QuickfixCmdPost * call s:Makesortedqflist()

2 个答案:

答案 0 :(得分:1)

我会按如下方式实现这个想法。

autocmd! QuickfixCmdPost * call SortQuickfix('QfStrCmp')
function! SortQuickfix(fn)
    call setqflist(sort(getqflist(), a:fn))
endfunction
function! QfStrCmp(e1, e2)
    let [t1, t2] = [a:e1.text, a:e2.text]
    return t1 <# t2 ? -1 : t1 ==# t2 ? 0 : 1
endfunction

答案 1 :(得分:0)

QuickFix列表更新setqflist()需要使用'r'标志。

只需将call setqflist(xlist)更改为call setqflist(xlist, 'r')