1

我正在尝试按行本身的内容按字母顺序自动对 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()
4

2 回答 2

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
于 2013-03-13T19:17:11.920 回答
1

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

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

于 2019-11-30T10:30:44.877 回答