Ответ 1
Вы можете перейти в "стиль UNIX" и использовать команду shuf
из пакета coreutils
:
:10,20!shuf<CR>
Каков наилучший способ перетасовать список в Vim?
Я пытаюсь случайным образом сортировать строки в vim (используя vimscript). Я создал для этого список со всеми номерами строк (в моем выборе).
p.e. если я выберу из строки 10-20, мой список будет:
mylist = ['10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']
Я хотел бы сортировать строки случайным образом и с циклом for положить их обратно в один и тот же выбор в новой последовательности. Чтобы реализовать это, я хотел бы перетасовать список много раз, но не знаю, как перетасовать список.
Другим решением было бы выбрать индекс из моего последнего случайного числа.
Невозможно узнать, что является лучшим способом.
Я знаю, что я могу сортировать строки, используя python, ruby или с другими языками, но я не хочу их устанавливать. Я хотел бы реализовать выше, используя vimscript.
Вы можете перейти в "стиль UNIX" и использовать команду shuf
из пакета coreutils
:
:10,20!shuf<CR>
osx теперь включает в -R
флаг -R
, так что вы можете просто использовать
:'<,'>!sort -R
У сортировки нет флага -R в osx, поэтому:
brew install coreutils
выберите строки в vim и запустите:
:'<,'>!gsort -R
если вам нужен генератор случайных чисел в форме, я не знаю, может ли 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
надеюсь, что это поможет
вы можете написать 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