改行なしでemacsから領域をコピーする


7

Emacsからテキストの領域を簡単に選択し、それを別のアプリまたはブラウザーに貼り付けられるようにしたいと思います。他のアプリの段落表示が適切に機能するように、余分なfill-paragraph改行をすべて削除します。

パッケージunfill-region関数はこれで問題ないようですが、これを適切に自動化するには、さらに作業が必要です。それをする前に、これはすでに存在していますか?unfill

回答:


6

これには以下を使用します。

(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)) ) ) )

2
パーツは改善できると思います。gist.github.com/xahlee/d364cbbff9b3abd12d29を参照してください。トグルするので、compact- uncompact -blockは実際には必要ありません。
Xah Lee 2014

これをありがとう、タイラーと@XahLee。ちょうど私が必要とするように見えます。
jmay

1
@xahlessは、compact-uncompact-blockを必要としませんが、すでに持っている場合は、それを使用することもできます。my-copy-simpleを使用することを覚えていることはほとんどありませんが、現在はcubが不可欠です。
タイラー

3

改行のみを削除したい場合replace-regexp-in-stringは、結果でbuffer-substringを使用してそれらを削除します。

余分な(通常は「無意味な」)空白をすべて削除する場合はni-buffer-substring-collapsed-visible、ライブラリから関数を試してくださいnarrow-indirect.el

2つの位置の間のバッファーコンテンツを返しますが、空白は折りたたまれています(改行を含め、余分な空白は削除されています)。

また、ライブラリ「subr + .el」も使用すると、非表示のテキストも削除されます。


0

この目的のために「unfill.el」と呼ばれるパッケージがありますhttps : //github.com/purcell/unfill

unfill-toggleand 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)))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.