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

Ash*_*ppa 6 sorting vim

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

from foo import ppp, zzz, abc
Run Code Online (Sandbox Code Playgroud)

是否有任何Vim技巧,如:sort行,以排序到这个:

from foo import abc, ppp, zzz
Run Code Online (Sandbox Code Playgroud)

Luc*_*tte 10

是的,有:

%s/import\s*\zs.*/\=join(sort(split(submatch(0), '\s*,\s*')),', ')
Run Code Online (Sandbox Code Playgroud)

关键要素是:

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

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

新的关键要素是这次:

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

顺便说一句,我们也可以使用si_CTRL-R_= 交互,或把它放在一个映射(这里触发µ):

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