List 如何在vim中洗牌列表?
在Vim中洗牌列表的最佳方式是什么 我尝试在vim中随机排序行(使用vimscript)。 我为此创建了一个包含所有行号的列表(在我的选择中) p、 e.如果我从第10行到第20行中选择,我的列表将是:List 如何在vim中洗牌列表?,list,sorting,vim,random,List,Sorting,Vim,Random,在Vim中洗牌列表的最佳方式是什么 我尝试在vim中随机排序行(使用vimscript)。 我为此创建了一个包含所有行号的列表(在我的选择中) p、 e.如果我从第10行到第20行中选择,我的列表将是: mylist = ['10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20'] 我想对行进行随机排序,并使用for循环将它们放回新序列中的相同选择中。 为了实现这一点,我想洗牌名单多次,但不知道如何洗牌名单 另一个解决方案
mylist = ['10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']
我想对行进行随机排序,并使用for循环将它们放回新序列中的相同选择中。
为了实现这一点,我想洗牌名单多次,但不知道如何洗牌名单
另一个解决方案是从我的上一个索引中随机选取一个索引
找不到最好的方法
我知道我可以使用python、ruby或其他语言对行进行排序,但我不想安装它们。
我想使用vimscript实现上述功能。您可以使用“UNIX风格”并使用coreutils
包中的shuf
命令:
:10,20!shuf<CR>
:10,20!随机播放
如果您需要一个统一的随机数生成器,我不知道vim是否可以为您提供一个本机(或者您可以使用一些插件)。但是,如果您只想打破一些行的顺序,可以尝试以下功能:
function! Random()
return reltimestr(reltime())[-2:]
endfunction
上述函数以毫秒为单位返回当前时间戳的最后两位数字
要shuf行,您可以(例如整个缓冲区)
然后
最后删除添加的前缀:
%s/^\S* //
当然,您可以使用
链接上面的命令
%s/^/\=Random() . " "/|sor n|%s/^\S* //
或者在不创建函数的情况下,将随机数部分写入:s
:
%s/^/\=reltimestr(reltime())[-2:] . " "/|sor n|%s/^\S* //
如果我测试值为1-30(由seq 30
生成)的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
希望有帮助从2019年起更新:
osx现在在sort中包含了一个-R
标志,所以您应该可以只使用
:”您可以编写一个python脚本来帮助random在vim中运行。
我创建了一个名为pyrandom.py
的python文件。然后添加执行模式,chmod+xpyrandom.py
,最后需要将pyrandom.py
的目录添加到PATH
,您可以临时运行export PATH=$PATH:/directory/to/pyrandom.py/
以添加到PATH
现在,在vim中选择lines并运行:
:'有用:。我知道你已经知道了那里的算法。对于Vim脚本中更重的随机数生成器,也有。我昨天检查了原生Vim随机脚本,但发现值不是随机创建的(请参阅我在该页上的评论)。我还查看了Chip Campbell的Rndm脚本,但发现排序也不是随机的(除此之外,还有很多代码),我选择的武器::'@sehe,谢谢你的回复<代码>排序-R
在我看来不是很好的随机排序(这是我以前的随机排序命令)rl
在我的电脑上不起作用。什么也没发生。@Remonn你对为什么:有什么实质性的说法吗!sort-R
不是很好的随机排序?因为我刚刚比较了sort.c和它的实现,所以我不得不给sort.c一点优势,因为它更通用(例如尝试sort-uR
,或者使用一个特定的键)。perl-M“List::Util qw(shuffle)”-e“print shuffle”input.txt>output.txt
非常感谢Kent。我注意到它每8、9、10行对行进行分组。请参见我的评论:我最终决定使用shuf
命令(我已经安装了cygwin),即使我更喜欢只使用vimscript。这一个也搜索随机值,非常好exe'normal!'。(系统('sh-c“echo-n$RANDOM“'))%1000)
但这样做每行它都会持续闪烁我的VIM窗口(使用bash shell)我发布了答案,假设您没有外部shuf、sort或shell$RANDOM
变量可用。如果如你所说,你有这些东西,shuf
将是最简单的方法,我也会这样做。我的命令是一种变通方法。而且,我看不到它每8、9、10行分组一行
您可以在我的答案中检查两次运行的结果。我检查了另一个问题和答案,我们得到了相同的想法,但采用了不同的数字。肯特,也许我和你一样使用了另一个时间标准?当我在我的电脑上测试它时,我清楚地看到一组行。从2019年开始,sort在macOS中有一个-R标志,因此不再需要使用gsort。我使用了:%!在linux上排序-R
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
#!/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