2011-05-30 17 views
5

Tengo un buffer de palabras y frases ordenadas y me gustaría ordenar las líneas en orden aleatorio. ¿Cómo haría esto con una función incorporada de emacs o con elisp?¿Cómo puedo ordenar líneas al azar en un búfer?

Por ejemplo, dada

 
bar 
elisp 
emacs 
foo 
hello world 
the quick brown fox 

me gustaría algún resultado completamente al azar como:

 
foo 
the quick brown fox 
hello world 
elisp 
emacs 
bar 

o ...

 
hello world 
elisp 
bar 
the quick brown fox 
foo 
emacs 

Respuesta

6

randomize-region.el parece Haz lo que quieras.

+0

¿Cómo cargo eso en Emacs? gracias – Geremia

+1

@Geremia: El enfoque más fácil es, probablemente, solo cortar y pegar el código en su archivo .emacs. – Nemo

4

Si no te importa desembolsar a Perl, puede seleccionar la región que desea asignar al azar, a continuación, escriba C-uM- |perl -MList::Util=shuffle -e 'print shuffle <STDIN>'.

Estoy seguro de que muchos otros lenguajes de programación populares ofrecen instalaciones similares.

6

Alternativamente, aquí está sort-lines adaptado a este requisito.

He eliminado el argumento reverse (obviamente no es relevante aquí), y simplemente proporcioné una función de 'comparación' que devuelve un resultado aleatorio a sort-subr.

(defun my-random-sort-lines (beg end) 
    "Sort lines in region randomly." 
    (interactive "r") 
    (save-excursion 
    (save-restriction 
     (narrow-to-region beg end) 
     (goto-char (point-min)) 
     (let ;; To make `end-of-line' and etc. to ignore fields. 
      ((inhibit-field-text-motion t)) 
     (sort-subr nil 'forward-line 'end-of-line nil nil 
        (lambda (s1 s2) (eq (random 2) 0))))))) 

Para el original:
Mxfind-functionRETsort-linesRET

4

El uso de Bash en GNU/Linux:

similares a la solución de Sean, seleccione la región y, a continuación:

C-u M-| shuf 

Explicación:

M- | canaliza el contenido de la región seleccionada al comando bash shuf. Shuf baraja las líneas. El prefijo C-u toma la salida de shuf y la usa para sobrescribir la región seleccionada.