如何在vim中混洗列表?

时间:2013-07-14 19:43:03

标签: list sorting vim random

在Vim中对列表进行洗牌的最佳方法是什么?

我正在尝试在vim中随机排序(使用vimscript)。 我为此创建了一个包含所有行号的列表(在我的选择中)。

体育专业。如果我从第10行到第20行选择,我的列表将是:

mylist = ['10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']

我想随机对这些行进行排序,并使用for循环将它们放回新序列中的相同选择中。 为了实现这一目标,我想多次洗牌,但不知道如何洗牌。

另一个解决方案是从我的上一个随机选择一个索引。

无法找出最佳方式。

我知道我可以使用python,ruby或其他语言对行进行排序,但我不想安装它们。 我想在上面使用vimscript实现。

4 个答案:

答案 0 :(得分:22)

你可以使用“UNIX样式”并使用shuf包中的coreutils命令:

:10,20!shuf<CR>

答案 1 :(得分:8)

自2019年起更新:

osx现在在sort中包含-R标志,因此您应该只能使用

:'<,'>!sort -R

===上一个答案:===

Sort在osx中​​没有-R标志,所以:

brew install coreutils

在vim中选择行,然后运行:

:'<,'>!gsort -R

答案 2 :(得分:4)

如果你需要一个穿制服的随机数生成器,我不知道vim是否可以为你提供一个本机(或者你可以转向一些插件)。但是,如果你只想打破一些行的顺序,你可以尝试这个函数:

function! Random()
    return reltimestr(reltime())[-2:]
endfunction

上面的函数返回当前时间戳的最后两位数字。

到shuf行,你可以(例如整个缓冲区)

%s/^/\=Random() . " "

然后

:sor n

最后删除添加的前缀:

%s/^\S* //

您当然可以使用<bar>将上述命令链接起来。

%s/^/\=Random() . " "/|sor n|%s/^\S* //

或者不创建该功能,请在:s

中写下随机数部分
%s/^/\=reltimestr(reltime())[-2:] . " "/|sor n|%s/^\S* //

如果我测试30行值1-30(由seq 30生成),

第一次结果是:

2
26
12
17
8
22
27
3
13
18
23
9
28
4
14
19
1
24
10
29
5
6
15
20
25
30
11
16
7
21

第二次结果:

4
22
25
28
6
9
18
12
15
1
3
5
21
24
27
30
8
11
17
14
2
20
23
26
29
7
10
16
13
19

希望有所帮助

答案 3 :(得分:1)

你可以写一个python脚本来帮助vim随机。 我创建了一个名为pyrandom.py的python文件。然后添加执行模式chmod +x pyrandom.py,最后需要的是将pyrandom.py的目录添加到PATH,您可以暂时运行export PATH=$PATH:/directory/to/pyrandom.py/以添加到PATH }。

现在,您在vim中选择行,然后运行: :&#39;&LT;,&#39;&GT; pyrandom.py

pyrandom.py中的内容

#!/usr/bin/python
import sys
import random

all_lines = []
for line in sys.stdin:
    all_lines.append(line.rstrip('\n'))

random.shuffle(all_lines)

for line in all_lines:
    print line