在光标点生成一个随机的5个字母+数字字符串。 (全部小写)

时间:2016-05-04 21:33:43

标签: emacs elisp

我使用的是Emacs 24.5(Spacemacs内部)。我希望能够产生 一个随机的5个字符的字符串,无论我的光标在emacs内,只需按一个键,比如说F2。

典型的随机字符串为jb2nx,所有字母始终为小写。 emacs启动时随机数生成的种子值应始终不同,以防止emacs在下次打开时生成相同的随机字符串序列。

注意:

我需要此功能,在点处插入一个唯一的单词,以将其用作书签。这样我可以打开包含随机字符串的行 来自组织模式,例如

[[file:some-code-file::jb2nx][This line in the code-file]] 

将是我的Org文件中的一行。而jb2nx将放在里面 对代码文件中引用的行的注释。

我不想在:::之后直接引用行号,在编辑代码文件时行号可能会改变。

3 个答案:

答案 0 :(得分:5)

(defun random-alnum ()
  (let* ((alnum "abcdefghijklmnopqrstuvwxyz0123456789")
         (i (% (abs (random)) (length alnum))))
    (substring alnum i (1+ i))))

(defun random-5-letter-string ()
  (interactive)
  (insert 
   (concat 
    (random-alnum)
    (random-alnum)
    (random-alnum)
    (random-alnum)
    (random-alnum))))

(global-set-key (kbd "<f2>") 'random-5-letter-string)

答案 1 :(得分:2)

虽然Brian的解决方案很好,但我个人更喜欢直接在缓冲区中工作而不是生成中间字符串:

(defun insert-random-five ()
  (interactive)
  (dotimes (_ 5)
    (insert
     (let ((x (random 36)))
       (if (< x 10) (+ x ?0) (+ x (- ?a 10)))))))

答案 2 :(得分:1)

扩展Brian的答案,如果您只需要一个随机字符串而不插入它且长度可配置的话:

(defun random-string (n)
  "Generate a slug of n random alphanumeric characters.

Inefficient implementation; don't use for large n."
  (if (= 0 n)
      ""
    (concat (random-alnum) (random-string (1- n)))))