【问题标题】:How to sort a dictionary items in vim如何在vim中对字典项进行排序
【发布时间】:2020-08-08 19:18:47
【问题描述】:

如何在 vim 脚本中使用 sort 函数对字典进行排序?帮助文档似乎没有提供关于如何对字典中的特定元素进行排序的明确信息。

例如:我通过调用 getqflist() 来获取快速修复项目。如何根据行号对这个 quickfix 字典项进行排序?

【问题讨论】:

  • getqflist() 的输出是一个列表,而不是字典。

标签: vim


【解决方案1】:

定义你的比较函数,将getqflist()的结果保存到变量和call sort(v, f)

例子:

function! LineLessThan(leftArg, rightArg)
  if a:leftArg['line'] == a:rightArg['line']
    return 0
  elseif a:leftArg['line'] < a:rightArg['line']
    return -1
  else
    return 1
  endif
endfunction

function! KeyLessThan(leftArg, rightArg)
  if a:leftArg['key'] ==# a:rightArg['key']
    return 0
  elseif a:leftArg['key'] <# a:rightArg['key']
    return -1
  else
    return 1
  endif
endfunction

let g:a = [{'line': 3, 'key': 'd'}, {'line': 1, 'key': 'e'}, {'line': 5, 'key': 'b'}, {'line': 2, 'key': 'a'}, {'line': 4, 'key': 'c'}]
call sort(g:a, function("LineLessThan"))
echo g:a
call sort(g:a, function("KeyLessThan"))
echo g:a

【讨论】:

  • 在尝试调用 sort "sort(itemsCopied, function("LineLessThan")) " 复制快速修复列表后使用语句 let items = GetlistTest('', "qf") i我收到以下错误。 E:21 无法进行更改,可修改已关闭:^Isort(itemscopied,function("LinelessThan"))。在使用 let itemsCopied = deepcopy(items) 调用排序之前,我什至对 quickfixlist 进行了深度复制。但即使这样也无助于调用排序,因为它显示错误可修改已关闭。
  • @Anoop :help E21, :help modifiable, 试试set modifiablefunctional programming technique(对局部函数变量调用排序)
猜你喜欢
  • 2014-11-10
  • 2015-09-28
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
相关资源
最近更新 更多