あなたの例でブロックを区切るものは何ですか? 2 つの改行。Emacs Lisp では、テキストが文字列の場合、 と をインストールするdash
と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