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