Linux下折腾emacs-rime

@DogLooksGood emacs-rime 有 pyim 中的 convert-string-at-point 的功能吗?就是敲了几个拼音,把他们转成中文

1 个赞

还没有,目前只有强制输入的功能,还不能把之前输入的字母作为编码转成中文。

有一个可以实现你的需要的类似的功能。我还没有补上文档,我补一下。


细想了一下,应该没有办法实现对等的功能。除非自己写,但是中文转化有两个问题:

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,因为大多数情况下,都是输入英文。

1 个赞

确实是属性的问题。

(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))
4 个赞

使用 rime-inline-ascii 之后好像回不去中文状态? @cnsunyour

我这里没问题呀,你把两个设置不同的按键看看可以不

也不行,我 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 再绑个快捷键