Toán tử thông minh có vẻ đầy hứa hẹn, nhưng tôi chưa thử nó vì vậy tôi không thể nói cho nó. Một giải pháp dựng sẵn sẽ là lý tưởng, nhưng nếu không có gì là đủ, thì sẽ rất dễ dàng để viết chức năng này và bọc nó trong một chế độ nhỏ.
Đây là tôi đi:
(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)))
Bạn có thể chỉ cần thêm nó vào init và tự động kích hoạt nó khi bạn muốn
(add-hook 'text-mode-hook 'auto-space-punctuation-mode)
Mỗi khi bạn chèn một ký tự mà hàm auto-punc-maybe-do
chạy, hãy đọc chuỗi doc để đảm bảo đây là hành vi bạn muốn. Về cơ bản nếu bạn gõ dấu câu, thì bất cứ thứ gì không có dấu chấm câu hoặc khoảng trắng, một khoảng trắng sẽ được chèn tự động.