Insertion automatique d'un espace lors de l'insertion d'un caractère en fonction du caractère précédent

8

Habituellement, après avoir inséré des signes de ponctuation comme . , :je fais un espace avant d'insérer le caractère suivant. Est-il possible qu'Emacs fasse automatiquement ce comportement? Par exemple, l'insertion de quelque chose comme cela revient .xà taper . xxest un caractère arbitraire (sauf pour certains cas particuliers exclus par l'utilisateur, par exemple le cas où xest un spacelui-même).

Parfois, cela peut aider à accélérer la frappe.

Nom
la source
2
Peut-être regardez ceci: smart-operator
nanny

Réponses:

8

Un opérateur intelligent semble prometteur, mais je ne l'ai pas essayé, je ne peux donc pas en parler. Une solution préconfigurée serait idéale, mais si aucune n'est suffisante, il serait très facile d'encapsuler cette fonctionnalité et de l'encapsuler dans un mode mineur.

Voici mon tour:

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

Vous pouvez simplement l'ajouter à votre init et l'activer automatiquement quand vous le souhaitez

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

Chaque fois que vous insérez un caractère, la fonction auto-punc-maybe-dos'exécute, lisez la docstring pour vous assurer que c'est le comportement que vous souhaitez. Fondamentalement, si vous tapez la ponctuation, puis tout ce qui n'est pas de la ponctuation ou des espaces, un espace sera inséré automatiquement.

Jordon Biondo
la source
2
Je confirme que votre solution fonctionne parfaitement en mode texte.
Nom
1
Super, content de l'entendre. Je viens de mettre à jour le code pour rendre le tampon `post-self-insert-hook local, si vous avez saisi le code plus tôt, vous pouvez trouver le mode fonctionnant dans des tampons auxquels vous ne vous attendez pas car il peut avoir été ajouté globalement, évitant le nouveau le code devrait le réparer.
Jordon Biondo
2

Vous pourriez être intéressé par l'opérateur électrique , c'est un mode mineur assez général pour ajouter un espacement autour des opérateurs (principalement pour les modes de programmation, mais il fonctionne également dans les modes texte).

Cependant, il ne regarde pas ce que vous avez tapé après l'opérateur, il ne peut donc pas gérer la partie "ajouter un espace uniquement si je n'en ai pas déjà tapé une".

dshepherd
la source