Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在vim中洗牌列表?_List_Sorting_Vim_Random - Fatal编程技术网

List 如何在vim中洗牌列表?

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循环将它们放回新序列中的相同选择中。 为了实现这一点,我想洗牌名单多次,但不知道如何洗牌名单 另一个解决方案

在Vim中洗牌列表的最佳方式是什么

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

p、 e.如果我从第10行到第20行中选择,我的列表将是:

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