在您的示例中,块之间的区别是什么?2个换行符。在 Emacs Lisp 中,如果文本在字符串中,如果安装dash
and s
,则可以使用以下 2 个等效表达式之一:
(s-join "\n\n" (nreverse (s-split "\n\n" s))) ; where s is your string
(->> s (s-split "\n\n") nreverse (s-join "\n\n"))
->>
是破折号的线程宏,它s
通过连续的函数调用。想想*nix 管道:s | s-split "\n\n" | nreverse | s-join "\n\n"
。
如果你想要一个 Emacs Lisp 函数来打开一个文件,反转块然后将它保存回相同的文件,你也可以安装f文件操作库:
(defun reverse-blocks (f)
"F is a filename."
(interactive "fFind file: ") ; letter `f` is filename goes in first arg
(let ((s (f-read f))) ; read file into a string
(--> s
s-chomp ; remove trailing newline
(s-split "\n\n" it)
nreverse
(s-join "\n\n" it)
(f-write it 'utf-8 f)))) ; write to the same file
在这里,我使用了另一个尾随宏-->
,它允许将前一个计算的结果放在表示it
下一个计算的参数中。例如,如果 的结果nreverse
是X
,那么等价的就是(s-join "\n\n" X)
。最后,假设您不仅要反转,而且要根据单词“Section”后面的数字对块进行排序:
(--sort (< (string-to-number (cadr (s-match "/.*?\\([0-9]\\)/" it)))
(string-to-number (cadr (s-match "/.*?\\([0-9]\\)/" other))))
it) ; put it instead of nreverse
其中,使用dash-functional
相当于:
(--sort (-on '<
(-compose 'string-to-number
'cadr
(-partial 's-match "/.*?\\([0-9]+\\)/")))
it) ; put it instead of nreverse
阅读dash
文档以了解 、-on
、-compose
做-partial
什么。