使用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
相关产品推荐
相关产品推荐

