Inilah fungsi yang akan mengonversi DOuble CApital ke Single Capitals. Saya awalnya menyarankan untuk menambahkannya post-self-insert-hook
, tetapi di bawah ini adalah opsi untuk mode minor yang dimuliakan sehingga Anda hanya menambah kait itu ketika Anda benar-benar menginginkannya:
(defun dcaps-to-scaps ()
"Convert word in DOuble CApitals to Single Capitals."
(interactive)
(and (= ?w (char-syntax (char-before)))
(save-excursion
(and (if (called-interactively-p)
(skip-syntax-backward "w")
(= -3 (skip-syntax-backward "w")))
(let (case-fold-search)
(looking-at "\\b[[:upper:]]\\{2\\}[[:lower:]]"))
(capitalize-word 1)))))
(add-hook 'post-self-insert-hook #'dcaps-to-scaps nil 'local)
Dan definisi mode minor:
(define-minor-mode dubcaps-mode
"Toggle `dubcaps-mode'. Converts words in DOuble CApitals to
Single Capitals as you type."
:init-value nil
:lighter (" DC")
(if dubcaps-mode
(add-hook 'post-self-insert-hook #'dcaps-to-scaps nil 'local)
(remove-hook 'post-self-insert-hook #'dcaps-to-scaps 'local)))
Untuk apa nilainya, menggunakan versi ini:
- sederhana: cukup hidupkan / matikan secara manual atau dalam mode hook;
- tidak memerlukan perubahan pada binding utama, sehingga Anda tidak kehilangan fungsionalitas lainnya.
Bahkan ketika Anda menambahkannya post-self-insert-hook
, overhead hampir tidak ada, setidaknya menurut beberapa pembandingan sederhana. Di komputer saya, inilah yang saya dapatkan dengan 10.000 pengulangan masing-masing dari bentuk dan dcaps-to-scaps
fungsi yang sangat sederhana :
(benchmark-run-compiled 10000 (+ 1 1)) ; => .001 to .003 -ish
(benchmark-run-compiled 10000 (dcaps-to-scaps)) ; => .003 to .006 -ish
Jadi, ya, ini lebih lambat daripada menambahkan 1 +1, tetapi secara absolut Anda tidak akan pernah melihat.
looking-at-p
, yang tidak mengatur data pertandingan sama sekali (tidak apa-apa karena Anda tidak perlu atau menggunakannya di sini).