Insertar automáticamente un espacio al insertar un carácter dependiendo del carácter anterior


8

Por lo general, después de insertar signos de puntuación como . , :hago un espacio antes de insertar el siguiente carácter. ¿Es posible que Emacs realice automáticamente este comportamiento? Por ejemplo, la inserción de algo así .xda como resultado escribir . xdonde xes un carácter arbitrario (excepto en algunos casos particulares excluidos por el usuario, por ejemplo, el caso donde xes un spacesí mismo).

A veces esto puede ayudar a acelerar la escritura.


2
Tal vez mira esto: operador inteligente
niñera

Respuestas:


8

El operador inteligente parece prometedor, pero no lo he probado, así que no puedo hablar por él. Una solución preconstruida sería ideal, pero si ninguna es suficiente, sería muy fácil ajustar esta funcionalidad y ajustarla en un modo menor.

Aquí está mi ir:

(defvar auto-punc-punctuation-members
  (string-to-list ".,:;?!")
  "List of charactesr to insert spaces after")

(defvar auto-punc-ignore-members
  (string-to-list " \t")
  "List of characters to not auto insert spaces before")

(defun auto-punc-maybe-do ()
  "If the last entered character is not in `auto-punc-punctuation-members' or `auto-punc-ignore-members',
and the prior character is in `auto-punc-punctuation-members',
insert a space between the two characters. "
  (when (and auto-space-punctuation-mode
             (not (member (char-before) (append auto-punc-punctuation-members auto-punc-ignore-members)))
             (member (char-before (1- (point))) auto-punc-punctuation-members))
    (backward-char 1)
    (insert " ")
    (forward-char 1)))

(define-minor-mode auto-space-punctuation-mode
  "Automatically inserts spaces between some punctuation and other characters."
  :init-value nil
  :lighter "._a"
  :keymap nil
  (make-variable-buffer-local 'post-self-insert-hook)
  (if auto-space-punctuation-mode
      (add-hook 'post-self-insert-hook 'auto-punc-maybe-do)
    (remove-hook 'post-self-insert-hook 'auto-punc-maybe-do)))

Simplemente puede agregarlo a su init y habilitarlo automáticamente cuando lo desee

(add-hook 'text-mode-hook 'auto-space-punctuation-mode)

Cada vez que inserte un carácter, la función se auto-punc-maybe-doejecuta, lea la cadena de documentación para asegurarse de que este sea el comportamiento que desea. Básicamente, si escribe puntuación, entonces cualquier cosa que no sea puntuación o espacio en blanco, se insertará un espacio automáticamente.


2
Confirmo que su solución funciona perfectamente en modo texto.
Nombre

1
Genial, me alegra escucharlo. Acabo de actualizar el código para hacer que el búfer `post-self-insert-hook local sea local, si capturó el código anteriormente, puede encontrar que el modo funciona en buffers que no espera, ya que puede haberse agregado globalmente, evadiendo el nuevo El código debería arreglarlo.
Jordon Biondo

2

Puede que le interese el operador eléctrico , es un modo menor bastante general para agregar espacio alrededor de los operadores (principalmente para los modos de programación, pero también funciona en los modos de texto).

Sin embargo, no mira lo que escribió después del operador, por lo que actualmente no puede manejar la parte "agregar un espacio solo si no escribí uno" de su pregunta.

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.