You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用deepcopy复制QuickFix列表后调用sort仍报E21错误的问询

问题原因分析

你碰到的这个问题,核心在于Vim的deepcopy()并没有完全把quickfix列表项转换成可修改的普通字典。从getqflist()获取的每个item其实是Vim内部的特殊字典对象,带有隐藏的只读属性——哪怕你用deepcopy()复制,这些隐藏的只读标记依然会被保留,导致sort()函数在操作这些item时触发"modifiable is off"的错误。

简单来说,deepcopy()只是复制了这些特殊字典的表层结构,但没剥离它们和原quickfix系统的绑定,这种绑定带来了只读限制。

解决方法

要搞定这个问题,你需要手动把每个quickfix item转换成真正独立的普通字典,只保留你需要的字段(比如lnum、col、text、bufnr等),之后再对这些普通字典组成的列表排序。

修改后的代码如下:

function! CompareQuickFixItems(arg1, arg2)
  if a:arg1['lnum'] == a:arg2['lnum']
    return 0
  elseif a:arg1['lnum'] < a:arg2['lnum']
    return -1
  else
    return 1
  endif
endfunction

function! TestQFItem()
  let items = getqflist()
  " 手动转换每个item为普通字典,复制需要的字段
  let itemsCopied = map(copy(items), '{"lnum": v:val["lnum"], "col": v:val["col"], "text": v:val["text"], "bufnr": v:val["bufnr"]}')
  call sort(itemsCopied, function("CompareQuickFixItems"))
  call setqflist(itemsCopied, "r")
endfunction
额外说明

如果你的quickfix项包含其他自定义字段(比如type、nr等),只需要在手动构建字典时把这些字段也加进去就行。这种方式彻底切断了和原quickfix系统的只读绑定,让你可以自由地对列表进行排序、修改等操作。

内容的提问来源于stack exchange,提问作者Anoop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:42:58