-
Notifications
You must be signed in to change notification settings - Fork 0
/
auto-spacing.el
113 lines (92 loc) · 3.55 KB
/
auto-spacing.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
;;; auto-spacing.el --- Insert spaces between non English terms and English terms automatically
;;
;; Copyright (C) 2018 kurubushi
;;
;; Author: kurubushi <[email protected]>
;; Version: 0.1
;; Created: 2018-11-14
;; Licence: MIT
(defcustom auto-spacing-english-regexp (rx (in "a-zA-Z0-9"))
"Regex pattern of English"
:group 'auto-spacing
:type 'regexp)
(defcustom auto-spacing-non-english-regexp (rx (category japanese))
"Regex pattern of non English"
:group 'auto-spacing
:type 'regexp)
(defcustom auto-spacing-non-english-exception-regexp (rx (in "。,.!?;:「」()、"))
"Regex pattern of non English 2"
:group 'auto-spacing
:type 'regexp)
(defcustom auto-spacing-separator " "
"Separator"
:group 'auto-spacing
:type 'string)
(defcustom auto-spacing-self-insert-command-list '(skk-insert)
"List of advices add self-insert-command"
:group 'auto-spacing
:type '(list symbol))
(defun auto-spacing-insert ()
(save-excursion
(if (not (bolp))
(progn
(backward-char)
(let ((c1 (char-to-string (preceding-char)))
(c2 (char-to-string (following-char))))
;; (message (concat "c1: " c1))
;; (message (concat "c2: " c2))
(if (or (and (string-match auto-spacing-english-regexp c1)
(string-match auto-spacing-non-english-regexp c2)
(not (string-match auto-spacing-non-english-exception-regexp c2)))
(and (string-match auto-spacing-non-english-regexp c1)
(not (string-match auto-spacing-non-english-exception-regexp c1))
(string-match auto-spacing-english-regexp c2)))
(insert auto-spacing-separator)))))))
(defun auto-spacing-update-advice-one (command)
(let* ((ad-name (concat (symbol-name command) "--self-insert-command"))
(ad (intern ad-name)))
(progn
(eval
(macroexpand
`(defadvice ,command (after ,ad)
(self-insert-command 0)))))))
(defun auto-spacing-update-advice ()
(mapcar 'auto-spacing-update-advice-one
auto-spacing-self-insert-command-list))
;; I don't know why the following code is wrong.
;;(defun auto-spacing-ad-activate-one (command)
;; (let* ((ad-name (concat (symbol-name command) "--self-insert-command"))
;; (ad (intern ad-name)))
;; (progn
;; (eval
;; (macroexpand
;; `(defadvice ,command (after ,ad)
;; (self-insert-command 0)))
;; (ad-activate-regexp ad-name)))))
(defun auto-spacing-ad-activate-one (command)
(let* ((ad-name (concat (symbol-name command) "--self-insert-command")))
(ad-activate-regexp ad-name)))
(defun auto-spacing-ad-activate ()
(mapcar 'auto-spacing-ad-activate-one
auto-spacing-self-insert-command-list))
(defun auto-spacing-ad-deactivate-one (command)
(let* ((ad-name (concat (symbol-name command) "--self-insert-command")))
(ad-deactivate-regexp ad-name)))
(defun auto-spacing-ad-deactivate ()
(mapcar 'auto-spacing-ad-deactivate-one
auto-spacing-self-insert-command-list))
(define-minor-mode auto-spacing-mode
"Toggle auto-spacing-mode"
:group 'auto-spacing
:global nil
:init-value nil
:lighter " AS"
(auto-spacing-update-advice)
(if auto-spacing-mode
(progn
(add-hook 'post-self-insert-hook 'auto-spacing-insert nil t)
(auto-spacing-ad-activate))
(progn
(remove-hook 'post-self-insert-hook 'auto-spacing-insert t)
(auto-spacing-ad-deactivate))))
(provide 'auto-spacing)