2013-03-13 81 views
1

我試圖根據行本身的內容按字母順序自動排序Quickfix列表中的行(默認情況下按它們在文件中出現的順序進行排序)。我把下面的內容放在我的.vimrc文件中,但是由於某些原因,它會根據行號進行排序。據我所知,Quickfix列表是一個字典列表,所以下面的'Sortqfbytext'函數應該只是按每個列表項的'text'內容進行排序,而忽略其餘部分(包括行號)。在Vim中按行文本自動排序Quickfix條目

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

你是什麼意思的「快速修復列表」?我真的不明白你想要做什麼。 – 2013-03-13 18:47:09

+2

quickfix列表是一個錯誤列表,包含指向它們的位置的鏈接。例如,如果鍵入 :vimgrep/readme /& :copen 它將打開quickfix窗口,並鏈接到當前文件中所有「readme」實例。但是,quickfix窗口本身無法編輯,因爲它會弄亂鏈接。因此,要對其進行排序,您必須創建一個新列表,編輯列表,然後通過調用setqflist(newlisthere)來設置新的quickfix列表。 基本上我想弄清楚如何按照字典中的一個項目(在這種情況下,'文本'項目)按字母順序對字典列表進行排序。 – user2153281 2013-03-13 18:52:58

+0

啊,這與FIX協議的QuickFIX引擎無關,是嗎?今後請注意您的標籤。 – 2013-03-13 19:19:34

回答

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 
+0

完美的作品!非常感謝你的幫助! – user2153281 2013-03-13 20:38:25