@DogLooksGood emacs-rime 有 pyim 中的 convert-string-at-point 的功能吗?就是敲了几个拼音,把他们转成中文
还没有,目前只有强制输入的功能,还不能把之前输入的字母作为编码转成中文。
有一个可以实现你的需要的类似的功能。我还没有补上文档,我补一下。
细想了一下,应该没有办法实现对等的功能。除非自己写,但是中文转化有两个问题:
1,对于除了整句连打的输入法这个功能都不是太好用,因为会存在中途上屏的情况; 2,取的编码范围难有一个客观的规则能保证总是对的
所以 emacs-rime 里面不会实现这个功能。但是如果自己实现的话,通过 rime-lib-process-key 就很容能写出来。
恩,emacs-rime 实现的是类似 pyim-probe-auto-english 的中英文切换机制,所以可能对这个命令的需求不是很高,
(defun pyim-probe-auto-english ()
"激活这个 pyim 探针函数后,使用下面的规则自动切换中英文输入:
1. 当前字符为英文字符(不包括空格)时,输入下一个字符为英文字符
2. 当前字符为中文字符或输入字符为行首字符时,输入的字符为中文字符
3. 以单个空格为界,自动切换中文和英文字符
即,形如 `我使用 emacs 编辑此函数' 的句子全程自动切换中英输入法
这个函数用于:`pyim-english-input-switch-functions' 。"
(let ((str-before-1 (pyim-char-before-to-string 0))
(str-before-2 (pyim-char-before-to-string 1)))
(unless (string= (buffer-name) " *temp*")
(if (> (point) (save-excursion (back-to-indentation)
(point)))
(or (if (pyim-string-match-p " " str-before-1)
(pyim-string-match-p "\\cc" str-before-2)
(and (not (pyim-string-match-p "\\cc" str-before-1))
(= (length (pyim-entered-get 'point-before)) 0))))))))
pyim 还支持另外一种中英文切换模式 pyim-probe-dynamic-english,在这种模式中,这个命令是必须的
(defun pyim-probe-dynamic-english ()
"激活这个 pyim 探针函数后,使用下面的规则动态切换中英文输入:
1. 从光标往前找第一个非数字的字符,为中文字符时,输入下一个字符时默认开启中文输入
2. 从光标往前找第一个非数字的字符,为其他字符时,输入下一个字符时默认开启英文输入
3. 使用 `pyim-convert-code-at-point' 可以将光标前的 code 字符串转换为中文,
所以用户需要给 `pyim-convert-code-at-point' 绑定一个快捷键,比如:
(global-set-key (kbd \"M-i\") 'pyim-convert-code-at-point)
这个函数用于:`pyim-english-input-switch-functions' 。"
(let* ((offset 0)
(non-digit-str-before-1 (pyim-char-before-to-string offset)))
(while (and non-digit-str-before-1
(cl-search non-digit-str-before-1 "0123456789"))
(cl-incf offset)
(setq non-digit-str-before-1 (pyim-char-before-to-string offset)))
(unless (string= (buffer-name) " *temp*") ; Make sure this probe can work with exim of exwm.
(if (<= (point) (save-excursion (back-to-indentation)
(point)))
(not (or (pyim-string-match-p
"\\cc"
(save-excursion
;; 查找前一个非空格字符。
(if (re-search-backward "[^[:space:]\n]" nil t)
(char-to-string (char-after (point))))))
(> (length (pyim-entered-get 'point-before)) 0)))
(not (or (pyim-string-match-p "\\cc" non-digit-str-before-1)
(> (length (pyim-entered-get 'point-before)) 0)))))))
我个人是喜欢 pyim-probe-dynamic-english,因为大多数情况下,都是输入英文。
确实是属性的问题。
(setq rime-posframe-properties
(list :background-color "#333333"
:foreground-color "#dcdccc"
:font "SF Mono-14"
:internal-border-width 10))
设置了 :font 就会出问题。
没有头绪这是怎么一个关系。
我也搞不明白,posframe 设置 :font 属性就会跟 doom-modeline 有冲突。 @seagle0128 或 @tumashu 看有没有头绪。 另外, @stardiviner 也可以看看你的配置,是不是也有 :font 的设置,去掉看是不是也好了。话说这个 :font 是看了老王的那个文章写进去的。。。 https://manateelazycat.github.io/emacs/2020/03/22/emacs-rime.html
和awesome-tray完美兼容,哈哈哈哈哈
https://github.com/DogLooksGood/emacs-rime/blob/master/README_CN.org#候选样式
关于posframe样式的文档,加了一个face专门用来设置背景色和默认前景色。
我的也有:
(:background-color "#333333" :foreground-color "#dcdccc"
:font "WenQuanYi Micro Hei Mono-14" :internal-border-width 10)
去除这个font之后确实没有posframe消失的情况了。不过输入太快还是会导致posframe消失。popup就比较稳定,一样快的输入速度,popup不会消失。这个要怎么测试找原因啊?
还是需要定位和哪个插件有关或和其它插件无关。在 emacs -Q 下存在这个问题吗?
不知道是不是我手速慢,去掉 font 后没发现有 posframe 消失的情况。
doom-modeline中会计算缓存字体高度。我不确定和这个有没有关联。最好profiling一下
实现了个与 pyim-convert-string-at-point
类似的功能:
https://github.com/cnsunyour/.doom.d/blob/develop/modules/cnsunyour/chinese/config.el#L151-L197
配合 rime-inline-ascii
,可以实现一切切换中英文状态,只需像这样在use-package
中绑定相同快捷键:
:bind
("M-j" . #'+rime-convert-string-at-point)
(:map rime-active-mode-map
("M-j" . #'rime-inline-ascii))
我这里没问题呀,你把两个设置不同的按键看看可以不
也不行,我 emacs -Q 试一下。
要不你试试用这个:
:bind
("C-S-s-j" . #'+rime-convert-string-at-point)
(:map rime-active-mode-map
("C-S-s-j" . #'rime-inline-ascii))
(:map rime-mode-map
("C-S-s-j" . #'rime-force-enable))
就是在 rime-mode-map
再绑个快捷键