这两天花了不少精力对 emacs-rime 优化配置和扩展功能,今天参考 pyim 的 pyim-convert-string-at-point 函数,实现了在 emacs-rime 下转换当前光标处字符串为中文的函数,并做了功能增强,针对 evil 和 emacs 两种 state 进行了分别处理。代码如下:
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
| (defun +rime-force-enable ()
"强制 `rime' 使用中文输入状态.
如果当前不是 `rime' 输入法,则先激活 `rime' 输入法。如果当前是
`evil' 的非编辑状态,则转为 `evil-insert-state'。"
(interactive)
(let ((input-method "rime"))
(unless (string= current-input-method input-method)
(activate-input-method input-method))
(when (rime-predicate-evil-mode-p)
(if (= (+ 1 (point)) (line-end-position))
(evil-append 1)
(evil-insert 1)))
(rime-force-enable)))
(defun +rime-convert-string-at-point (&optional return-cregexp)
"将光标前的字符串转换为中文."
(interactive "P")
(+rime-force-enable)
(let ((string (if mark-active
(buffer-substring-no-properties
(region-beginning) (region-end))
(buffer-substring-no-properties
(point) (max (line-beginning-position) (- (point) 80)))))
code
length)
(cond ((string-match "\\([a-z'-]+\\|[[:punct:]]\\) *$" string)
(setq code (replace-regexp-in-string
"^[-']" ""
(match-string 0 string)))
(setq length (length code))
(setq code (replace-regexp-in-string " +" "" code))
(if mark-active
(delete-region (region-beginning) (region-end))
(when (> length 0)
(delete-char (- 0 length))))
(when (> length 0)
(setq unread-command-events
(append (listify-key-sequence code)
unread-command-events))))
(t (message "`+rime-convert-string-at-point' did nothing.")))))
|