在Vim中对列表进行洗牌的最佳方法是什么?
我正在尝试在vim中随机排序(使用vimscript)。 我为此创建了一个包含所有行号的列表(在我的选择中)。
体育专业。如果我从第10行到第20行选择,我的列表将是:
mylist = ['10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']
我想随机对这些行进行排序,并使用for循环将它们放回新序列中的相同选择中。 为了实现这一目标,我想多次洗牌,但不知道如何洗牌。
另一个解决方案是从我的上一个随机选择一个索引。
无法找出最佳方式。
我知道我可以使用python,ruby或其他语言对行进行排序,但我不想安装它们。 我想在上面使用vimscript实现。
答案 0 :(得分:22)
你可以使用“UNIX样式”并使用shuf
包中的coreutils
命令:
:10,20!shuf<CR>
答案 1 :(得分:8)
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