【问题标题】:How to automatically sort Quickfix entries by line text in Vim?如何在 Vim 中按行文本自动对 Quickfix 条目进行排序?
【发布时间】:2013-03-13 18:15:05
【问题描述】:

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

【问题讨论】:

  • “Quickfix 列表”是什么意思?我真的不明白你在做什么。
  • 快速修复列表是一个错误列表,其中包含指向它们所在位置的链接。例如,如果你输入 :vimgrep /readme/ & :copen 它将打开带有指向当前文件中所有“readme”实例的链接的快速修复窗口。但是,quickfix 窗口本身不能编辑,因为它会弄乱链接。因此,要对其进行排序,您必须创建一个新列表,编辑该列表,然后通过调用 setqflist(newlisthere) 设置新的 quickfix 列表。基本上,我试图弄清楚如何仅按字典中的一项(在本例中为“文本”项)按字母顺序对字典列表进行排序。
  • 啊,这和 FIX 协议的 QuickFIX 引擎无关吧?以后请多加注意标签。

标签: list sorting vim dictionary


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      相关资源
      最近更新 更多