Đây là một chức năng sẽ chuyển đổi các CApitals thành các Capitals đơn. Ban đầu tôi đề nghị thêm nó vào post-self-insert-hook
, nhưng bên dưới là một tùy chọn cho chế độ nhỏ được tôn vinh để bạn chỉ thêm vào móc đó khi bạn thực sự muốn nó:
(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)
Và định nghĩa chế độ nhỏ:
(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)))
Để biết giá trị của nó, sử dụng phiên bản này:
- rất đơn giản: chỉ cần bật / tắt thủ công hoặc trong một móc chế độ;
- không yêu cầu thay đổi đối với các ràng buộc chính, vì vậy bạn sẽ không mất bất kỳ chức năng nào khác.
Ngay cả khi bạn thêm nó vào post-self-insert-hook
, chi phí gần như không tồn tại, ít nhất là theo một số điểm chuẩn đơn giản. Trên máy của tôi, đây là những gì tôi nhận được với 10.000 lần lặp lại mỗi dạng đơn giản và lố bịch dcaps-to-scaps
:
(benchmark-run-compiled 10000 (+ 1 1)) ; => .001 to .003 -ish
(benchmark-run-compiled 10000 (dcaps-to-scaps)) ; => .003 to .006 -ish
Vì vậy, vâng, nó chậm hơn so với việc thêm 1 + 1, nhưng về mặt tuyệt đối bạn sẽ không bao giờ nhận thấy.
looking-at-p
, hoàn toàn không thiết lập dữ liệu khớp (điều đó ổn vì bạn không cần hoặc không sử dụng dữ liệu ở đây).