2013-07-14 6 views
13

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

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

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

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

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

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

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

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

+0

Полезное: [Native Vim Random номер сценария] (http://stackoverflow.com/q/12737977). Я вижу, вы уже знаете об этом алгоритме. – glts

+1

Для более тяжелого генератора случайных чисел в скрипте Vim существует также [Rndm] (http://www.drchip.org/astronaut/vim/index.html#RNDM). – glts

+0

Вчера я проверил случайный скрипт Native Vim, но выяснил, что значения не создаются случайным образом (см. Мой комментарий на этой странице). Я также проверил скрипт Rndm из Chip Campbell, но выяснил, что сортировка также не случайна (и, кроме того, в ней есть много кода) – Reman

ответ

18

Вы могли бы пойти «UNIX стиль» и использовать команду shuf из coreutils пакета:

:10,20!shuf<CR> 
+8

Мое оружие выбора: ': '<,'>! Sort -R', или используйте 'rl' из' randomize-lines' – sehe

+1

@sehe, Спасибо за ваш ответ. 'Сортировать! -R' на мой взгляд не очень хороший случайный сорт (это была моя предыдущая сортировка случайной команды). 'rl' не работает на моем компьютере. Ничего не произошло. – Reman

+3

@Remonn У вас есть какие-то существенные претензии относительно того, почему ':! Sort -R' не делает хороший случайный сортировки? Поскольку я просто сравнил ** [sort.c] (http://lingrok.org/xref/coreutils/src/sort.c) ** и ** [shuf.c] (http://lingrok.org/xref /coreutils/src/shuf.c)** и должны дать небольшое преимущество sort.c для того, чтобы быть более универсальным (например, попробуйте 'sort -uR' или используя определенный ключ). – sehe

4

если вам нужен униформе генератор случайных чисел, я не знаю, если ВИМ может предоставить вам один родной (или вы можете обратиться к некоторым плагинам). Однако, если вы просто хотите, чтобы сломать некоторый порядок числа строк, вы можете попробовать эту функцию:

function! Random() 
    return reltimestr(reltime())[-2:] 
endfunction 

функция выше возвращает две последние цифры текущего времени в мс.

к Шуфом линий, вы могли бы (например, весь буфер)

%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 

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

+0

Большое спасибо Kent. Я отметил, что он группирует линии каждые 8,9,10 строк. См. Также мой комментарий здесь: http://stackoverflow.com/q/12737977 Наконец-то я решил использовать команду 'shuf' (у меня уже установлен cygwin), даже если я предпочитаю использовать только vimscript. Это одно также поиск случайного значения, и это очень приятно «exe» нормально! ».(system ('sh -c "echo -n $ RANDOM"')% 1000) ', но делая это для каждой строки, он постоянно мерцает мое VIM-окно (используя оболочку bash) – Reman

+1

Я отправил ответ, предположим, что у вас нет внешний shuf, сортировка или переменная '$ RANDOM' оболочки. если, как вы сказали, у вас есть эти вещи, 'shuf' был бы самым простым способом, я тоже пошел бы так. Моя команда - это обходное решение. – Kent

+0

и, я не вижу 'он группирует строки каждые 8,9,10 строк', вы можете проверить результат двух прогонов в моем ответе. Я проверил другой вопрос и ответ, мы получили ту же идею, но взяли разные цифры. – Kent

6

Сортировка не имеет флаг -R в OSX, так:

brew install coreutils

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

:'<,'>!gsort -R

1

вы можете написать скрипт python для него lp random in 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 
Смежные вопросы