如何在Vim中对逗号分隔的单词进行排序

时间:2017-08-30 08:47:59

标签: sorting vim

在Python代码中,我经常遇到像这样的import语句:

from foo import ppp, zzz, abc

是否有任何Vim技巧,如行的:sort,可以对此进行排序:

from foo import abc, ppp, zzz

4 个答案:

答案 0 :(得分:10)

是的,有:

%s/import\s*\zs.*/\=join(sort(split(submatch(0), '\s*,\s*')),', ')

关键要素是:

要回答评论,如果要在视觉选择上应用替换,它将变为:

'<,'>s/\%V.*\%V\@!/\=join(sort(split(submatch(0), '\s*,\s*')), ', ')

这次是新的关键要素:

  • :h /\%V表示匹配的下一个字符属于视觉选择
  • 我使用的
  • :h /\@!,为了表达(与\%V合并),下一个字符属于视觉选择。下一个字符不会保留在匹配的表达式中。

顺便说一句,我们也可以交互使用si_CTRL-R_=,或者将其放在映射中(此处在µ上触发):

:xnoremap µ s<c-r>=join(sort(split(@", '\s*,\s*')), ', ')<cr><esc>

答案 1 :(得分:2)

或者,您可以执行以下步骤:

  1. 将要排序的单词移动到下一行:

    from foo import 
    ppp, zzz, abc
    
  2. 在单词列表的末尾添加逗号:

    from foo import 
    ppp, zzz, abc,
    
  3. 例如,使用 Shift - v 选择单词列表。现在点击然后输入!xargs -n1 | sort | xargs。它应该是这样的:

    :'<,'>!xargs -n1 | sort | xargs
    

    点击输入

    from foo import 
    abc, ppp, zzz,
    
  4. 现在删除尾随逗号并将单词列表合并回原始行(例如,使用 Shift - j )。

    from foo import abc, ppp, zzz
    
  5. 有些Vim插件可能对您有用:

答案 2 :(得分:2)

我来到这里寻找一种快速的方法来对逗号分隔的列表进行排序,例如。

    relationships = {
        'project', 'freelancer', 'task', 'managers', 'team'
    }

我的习惯是用换行符搜索/替换空格并调用shell排序,但这很痛苦。

我最终找到了Chris Toomey的sort-motion插件,这只是一张票:https://github.com/christoomey/vim-sort-motion。强烈推荐。

答案 3 :(得分:1)

为什么不试试vim-isort? https://github.com/fisadev/vim-isort

我使用它和vim-yapf格式来美化代码:) https://github.com/pignacio/vim-yapf-format