Подтвердить что ты не робот

Как перетасовать список в vim?

Каков наилучший способ перетасовать список в Vim?

Я пытаюсь случайным образом сортировать строки в vim (используя vimscript). Я создал для этого список со всеми номерами строк (в моем выборе).

p.e. если я выберу из строки 10-20, мой список будет:

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

Я хотел бы сортировать строки случайным образом и с циклом for положить их обратно в один и тот же выбор в новой последовательности. Чтобы реализовать это, я хотел бы перетасовать список много раз, но не знаю, как перетасовать список.

Другим решением было бы выбрать индекс из моего последнего случайного числа.

Невозможно узнать, что является лучшим способом.

Я знаю, что я могу сортировать строки, используя python, ruby ​​или с другими языками, но я не хочу их устанавливать. Я хотел бы реализовать выше, используя vimscript.

4b9b3361

Ответ 1

Вы можете перейти в "стиль UNIX" и использовать команду shuf из пакета coreutils:

:10,20!shuf<CR>

Ответ 2

ОБНОВЛЕНИЕ с 2019 года:

osx теперь включает в -R флаг -R, так что вы можете просто использовать

:'<,'>!sort -R

=== Предыдущий ответ: ===

У сортировки нет флага -R в osx, поэтому:

brew install coreutils

выберите строки в vim и запустите:

:'<,'>!gsort -R

Ответ 3

если вам нужен генератор случайных чисел в форме, я не знаю, может ли 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

2-й результат:

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

надеюсь, что это поможет

Ответ 4

вы можете написать python script, чтобы помочь случайным образом в vim. Я создаю файл python с именем pyrandom.py. затем добавьте режим выполнения, chmod +x pyrandom.py, последнее, что вам нужно, это добавить каталог с pyrandom.py в PATH, вы можете запустить export PATH=$PATH:/directory/to/pyrandom.py/ временно, чтобы добавить в PATH.

теперь вы выбираете строки в vim и запускаете: : '& Л;' > 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