【发布时间】:2019-06-13 03:22:53
【问题描述】:
我有一个按排序顺序排列的单词和短语缓冲区,我希望这些行按随机顺序排序。我将如何使用 emacs 内置函数或 elisp 来做到这一点?
例如,给定
酒吧 省略 emacs 富 你好世界 敏捷的棕色狐狸我想要一些完全随机的结果,例如:
富 敏捷的棕色狐狸 你好世界 省略 emacs 酒吧或者...
你好世界 省略 酒吧 敏捷的棕色狐狸 富 emacs【问题讨论】:
我有一个按排序顺序排列的单词和短语缓冲区,我希望这些行按随机顺序排序。我将如何使用 emacs 内置函数或 elisp 来做到这一点?
例如,给定
酒吧 省略 emacs 富 你好世界 敏捷的棕色狐狸我想要一些完全随机的结果,例如:
富 敏捷的棕色狐狸 你好世界 省略 emacs 酒吧或者...
你好世界 省略 酒吧 敏捷的棕色狐狸 富 emacs【问题讨论】:
类似于肖恩的解决方案,选择区域然后:
C-u M-| shuf
M-|将选定区域的内容通过管道传输到 bash 命令 shuf。 shuf 洗牌。前缀 C-u 获取 shuf 的输出并使用它来覆盖所选区域。
【讨论】:
sort -R 代替 shuf。
或者,这里是 sort-lines 适应此要求。
我已经删除了 reverse 参数(显然与这里无关),并简单地提供了一个“比较”函数,将随机结果返回给 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)))))))
对于原文:
M-x find-function RET sort-lines RET
【讨论】:
randomize-region.el 似乎在做你想做的事。
【讨论】:
如果您不介意使用 Perl,您可以选择要随机化的区域,然后键入 C-u M-| perl -MList::Util=shuffle -e 'print shuffle <STDIN>'。
我确信许多其他流行的编程语言也提供类似的功能。
【讨论】: