Copie la región de emacs sin nuevas líneas


7

Me gustaría poder seleccionar fácilmente una región de texto de Emacs y luego pegarla en otra aplicación o navegador, con todas las nuevas líneas adicionales de párrafo de relleno eliminadas para que la visualización del párrafo en la otra aplicación pueda funcionar correctamente.

La unfill-regionfunción en el unfillpaquete parece estar bien para esto, pero se necesita más trabajo para automatizar esto correctamente. Antes de hacer eso, ¿esto ya existe?

Respuestas:


6

Yo uso lo siguiente para esto:

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

Esto depende de la siguiente función, que he estado usando durante un tiempo como reemplazo del valor predeterminado M-q fill-paragraph. No me di cuenta de dónde vino, creo que era de Xah Lee?

(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
Creo que las partes se pueden mejorar. ver gist.github.com/xahlee/d364cbbff9b3abd12d29 realmente no necesita un bloque compacto-compacto ya que sí se alterna.
Xah Lee

Gracias por esto, Tyler y @XahLee. Se parece a lo que necesito.
jmay

1
@xahless no necesita un bloque compacto-compacto, pero si ya lo tiene, podría usarlo. Casi nunca recuerdo usar my-copy-simple, ¡pero cub es indispensable ahora!
Tyler

3

Si solo desea eliminar nuevas líneas, utilice replace-regexp-in-stringel resultado de buffer-substringpara eliminarlas.

Si desea eliminar todos los espacios en blanco adicionales (generalmente "insignificantes"), intente la función ni-buffer-substring-collapsed-visiblede la biblioteca narrow-indirect.el.

Devuelve el contenido del búfer entre dos posiciones, pero con el espacio en blanco colapsado (espacio en blanco extra eliminado, incluidas las nuevas líneas).

Y si también usa la biblioteca `subr + .el ' , también se elimina el texto invisible.


0

Hay un paquete llamado "unfill.el" para este propósito: https://github.com/purcell/unfill

Viene con un unfill-toggley unfill-regioncomando.

Alguien también publicó un código para "desplegar" un párrafo en 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)))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.