Operator pintar terlihat menjanjikan, tetapi saya belum mencobanya sehingga saya tidak dapat berbicara untuk itu. Solusi prebuilt akan ideal, tetapi jika tidak ada yang memadai, akan sangat mudah untuk membungkus tulis fungsi ini dan bungkus dalam mode minor sekalipun.
Ini dia:
(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)))
Anda bisa menambahkannya ke init Anda dan mengaktifkannya secara otomatis jika Anda mau
(add-hook 'text-mode-hook 'auto-space-punctuation-mode)
Setiap kali Anda memasukkan karakter fungsi auto-punc-maybe-do
berjalan, baca docstring untuk memastikan ini adalah perilaku yang Anda inginkan. Pada dasarnya jika Anda mengetik tanda baca, maka apa pun yang bukan tanda baca atau spasi, spasi akan dimasukkan secara otomatis.