Kopieren Sie die Region von Emacs ohne Zeilenumbrüche

7

Ich möchte in der Lage sein, einen Textbereich aus Emacs einfach auszuwählen und ihn dann in eine andere App oder einen anderen Browser einzufügen - wobei alle zusätzlichen Zeilenumbrüche zum Füllen von Absätzen entfernt werden, damit die Absatzanzeige in der anderen App ordnungsgemäß funktioniert.

Die unfill-regionFunktion im unfillPaket scheint dafür in Ordnung zu sein, aber es sind weitere Arbeiten erforderlich, um dies richtig zu automatisieren. Existiert das schon, bevor ich das mache?

jmay
quelle

Antworten:

6

Ich benutze dazu folgendes:

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

Dies hängt von der folgenden Funktion ab, die ich seit einiger Zeit als Ersatz für die Standardeinstellung verwende M-q fill-paragraph. Ich habe nicht bemerkt, woher es kam, ich denke, es war Xah Lees?

(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)) ) ) )
Tyler
quelle
2
Ich denke, Teile können verbessert werden. siehe gist.github.com/xahlee/d364cbbff9b3abd12d29 benötigt keinen Compact-Uncompact-Block, da er umschaltet.
Xah Lee
Danke dafür, Tyler und @XahLee. Sieht genauso aus wie das, was ich brauche.
Mai
1
@xahless es braucht keinen Compact-Uncompact-Block, aber wenn Sie es bereits haben, können Sie es auch verwenden. Ich erinnere mich kaum daran, my-copy-simple zu verwenden, aber Jungtier ist jetzt unverzichtbar!
Tyler
3

Wenn Sie nur Zeilenumbrüche entfernen möchten, verwenden Sie replace-regexp-in-stringdas Ergebnis von buffer-substring, um sie zu entfernen.

Wenn Sie alle zusätzlichen (normalerweise "unbedeutenden") Leerzeichen entfernen möchten, versuchen Sie es mit der Funktion ni-buffer-substring-collapsed-visibleaus der Bibliothek narrow-indirect.el.

Es gibt den Pufferinhalt zwischen zwei Positionen zurück, wobei jedoch Leerzeichen reduziert sind (zusätzliche Leerzeichen wurden entfernt, einschließlich Zeilenumbrüche).

Und wenn Sie auch die Bibliothek "subr + .el" verwenden, wird auch unsichtbarer Text entfernt.

Drew
quelle
0

Zu diesem Zweck gibt es ein Paket namens "unfill.el": https://github.com/purcell/unfill

Es kommt mit einem unfill-toggleund unfill-regionBefehl.

Jemand hat auch Code gepostet, um einen Absatz im EmacsWiki zu "entfüllen": 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)))
Altes Konto
quelle