¿Cómo ajustar automáticamente los espacios en blanco después de los tirones?

7

Al editar texto en lenguaje humano y mover fragmentos de texto, a menudo me encuentro con el problema de que el espacio en blanco movido al principio o al final de un fragmento no encaja en la nueva posición. Por ejemplo, considere este párrafo:

This is the first sentence.  This is the second sentence.  These
three sentences are the whole paragraph.

Si muevo la última oración antes de la primera con kill + yank, tengo espacios en blanco iniciales o finales. Un problema similar ocurre en las enumeraciones.

Otro caso de uso es si quiero insertar una sola palabra o expresión que está en el anillo de matar sin ningún espacio en blanco al final o al final. Por ejemplo, considere la palabra "muy" en el anillo de matar, y la siguiente oración:

Such a minor mode would be useful.

Después de tirar, esto puede convertirse erróneamente en:

Such a minor mode would bevery useful.

¿Hay alguna forma de ajustar automáticamente los espacios en blanco en los textos humanos?

Torsten Bronger
fuente

Respuestas:

3

Aquí hay una función, delete-leading-whitespace-on-linepara hacer como su nombre indica:

(defun delete-leading-whitespace-on-line ()
  "Delete whitespace at the beginning of the current line."
  (interactive)
  (let ((start (line-beginning-position))
        (end (line-end-position)))
    (save-excursion
      (delete-whitespace-rectangle start end nil))))

Para el espacio en blanco final , yo uso M-x delete-trailing-whitespace.

Para desencadenar estos después de los tirones, puede hacer algo como:

(defun yank-and-trim-whitespace ()
  "Yank and then trim whitespace on the line."
  (interactive)
  (yank)
  (delete-leading-whitespace-on-line)
  (delete-trailing-whitespace))

y atarlo como:

(global-set-key "\C-y" 'yank-and-trim-whitespace)

También puede probar el modo de limpieza de espacios en blanco de Steve Purcell , un modo menor que:

llamará de forma inteligente a la limpieza de espacios en blanco antes de guardar los buffers

PD: Su cuenta de GitHub es un tesoro de las golosinas de Emacs.

yurrriq
fuente
Todavía no tengo reputación, pero aquí hay un enlace a la documentación pertinente: gnu.org/software/emacs/manual/html_node/emacs/…
yurrriq
¿Son call-interactivelynecesarios los aquí? ¿No puedes simplemente llamar a las funciones?
erikstokes
@erikstokes, buena captura. El call-interactivelyson redundantes.
yurrriq
Creo que usar call-interactivelyaquí lo haría funcionar yank-pop.
politza
1

Esto parece hacer lo que has pedido. Por el contrario, si ya hay espacios en blanco adicionales, los mantiene como antes.

  (defun yank-and-adjust-whitespace ()
  (interactive)
  (if (equal (char-after) ?\s)
      (progn
        (insert " ")
        (yank))
    (if (eolp) (if (bolp) (yank)
        (if (equal (char-before) ?\s)
            (yank)
          (insert " ")
          (yank)))
      (yank)
      (insert " "))))

Al igual que la respuesta de Eric Bailey, puede asociar el siguiente acceso directo.

(global-set-key "\C-y" 'yank-and-adjust-whitespace)

El uso eolp/bolpse tomó prestado de https://emacs.stackexchange.com/a/13741/ .

Nombre
fuente
@wasamasa gracias por editar, vi que has cambiado ? a ?\s. Parece que ambos funcionan. Estoy interesado en saber sobre sus diferencias.
Nombre
1
Correcto, ambos son equivalentes. Sin ?\sembargo, el manual lo recomienda porque parece mucho menos confuso ? y asegura que usted pretendía hacer coincidir un espacio en lugar de escribir mal.
wasamasa