O operador inteligente parece promissor, mas eu não tentei, então não posso falar por isso. Uma solução pré-construída seria ideal, mas se nenhuma for suficiente, seria muito fácil empacotar a gravação dessa funcionalidade e encapsulá-la em um modo menor.
Aqui está o meu 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)))
Você pode simplesmente adicioná-lo ao seu init e habilitá-lo automaticamente quando quiser
(add-hook 'text-mode-hook 'auto-space-punctuation-mode)
Sempre que você inserir um caractere, a função será auto-punc-maybe-do
executada, leia a documentação para garantir que esse seja o comportamento que você deseja. Basicamente, se você digitar pontuação, qualquer coisa que não seja pontuação ou espaço em branco, um espaço será inserido automaticamente.