回答:
これには以下を使用します。
(defun my-copy-simple (beg end)
"Save the current region to the kill ring after stripping extra whitespace and new lines"
(interactive "r")
(copy-region-as-kill beg end)
(with-temp-buffer
(yank)
(goto-char 0)
(while (looking-at "[ \t\n]")
(delete-char 1))
(compact-uncompact-block)
(mark-whole-buffer)
(kill-region (point-min) (point-max))))
これは、デフォルトの代わりにしばらく使用していた次の関数に依存しますM-q fill-paragraph
。それがどこから来たのか私は気づかなかった、私はそれがシャーリーのものだったと思いますか?
(defun compact-uncompact-block ()
"Remove or add line ending chars on current paragraph.
This command is similar to a toggle of `fill-paragraph'.
When there is a text selection, act on the region."
(interactive)
;; This command symbol has a property “'stateIsCompact-p”.
(let (currentStateIsCompact (bigFillColumnVal 4333999) (deactivate-mark nil))
(save-excursion
;; Determine whether the text is currently compact.
(setq currentStateIsCompact
(if (eq last-command this-command)
(get this-command 'stateIsCompact-p)
(if (> (- (line-end-position) (line-beginning-position)) fill-column) t nil) ) )
(if (region-active-p)
(if currentStateIsCompact
(fill-region (region-beginning) (region-end))
(let ((fill-column bigFillColumnVal))
(fill-region (region-beginning) (region-end))) )
(if currentStateIsCompact
(fill-paragraph nil)
(let ((fill-column bigFillColumnVal))
(fill-paragraph nil)) ) )
(put this-command 'stateIsCompact-p (if currentStateIsCompact nil t)) ) ) )
改行のみを削除したい場合replace-regexp-in-string
は、結果でbuffer-substring
を使用してそれらを削除します。
余分な(通常は「無意味な」)空白をすべて削除する場合はni-buffer-substring-collapsed-visible
、ライブラリから関数を試してくださいnarrow-indirect.el
。
2つの位置の間のバッファーコンテンツを返しますが、空白は折りたたまれています(改行を含め、余分な空白は削除されています)。
また、ライブラリ「subr + .el」も使用すると、非表示のテキストも削除されます。
この目的のために「unfill.el」と呼ばれるパッケージがあります:https : //github.com/purcell/unfill
unfill-toggle
and unfill-region
コマンドが付属しています。
誰かがEmacsWikiの段落を「埋めない」ためのコードを投稿しました:https ://www.emacswiki.org/emacs/UnfillParagraph
;;; Stefan Monnier <foo at acm.org>. It is the opposite of fill-paragraph
(defun unfill-paragraph (&optional region)
"Takes a multi-line paragraph and makes it into a single line of text."
(interactive (progn (barf-if-buffer-read-only) '(t)))
(let ((fill-column (point-max))
;; This would override `fill-column' if it's an integer.
(emacs-lisp-docstring-fill-column t))
(fill-paragraph nil region)))