Giter VIP home page Giter VIP logo

emacs-rime's Introduction

Emacs Rime

https://melpa.org/packages/rime-badge.svg https://stable.melpa.org/packages/rime-badge.svg

Document in English

https://i.imgur.com/jHpk7BT.gif

一、基本安装与使用方法

基本安装与使用方法

二、Rime:方案配置与词库

切换折叠

设置输入中发送到 Rime 的组合键

通过变量 rime-translate-keybindings 可以设置哪些组合键将发送至 Rime 。可以用来配合方案中的设置完成光标移动和选字等功能。 支持 Control (C-), Meta (M-), Shift (S-)的组合键。

;; 默认值
(setq rime-translate-keybindings
  '("C-f" "C-b" "C-n" "C-p" "C-g" "<left>" "<right>" "<up>" "<down>" "<prior>" "<next>" "<delete>"))

指定 Rime 共享目录和用户目录

共享目录即 rime-share-data-dir 是 Rime 安装后放置配置(包括输入方案)的目录, 例如 Linux 上默认为 /usr/share/rime-data ,通常使用默认值即可。 如果使用其它的位置,可以配置该值。 例如对于 fcitx5-rime 可能要使用 ~/.local/share/fcitx5/rime

用户目录即 rime-user-data-dir 为 emacs-rime 布署的位置(包括词频等)。 默认为 ~/.emacs.d/rime ,如果需要其它位置,可以配置该值。

不建议 ~emacs-rime~ 与 ~fcitx-rime~ 共用用户数据目录 。 以地球拼音方案在 fcitx-rime 与 emacs-rime 中使用为例,若设置

(setq rime-user-data-dir "~/.config/fcitx/rime/")

,则在 emacs-rime 初次部署后,将会生成新的 terra_pinyin.userdb/ 文件夹,原有 fcitx-rime 使用记录将会被移动到 terra_pinyin.userdb.old/ ,此时新的 terra_pinyin.userdb.txt 中词频为空。

打开 Rime 的配置文件

使用 rime-open-configuration 打开自定义配置文件。

使用 rime-open-schema 打开一个方案的自定义配置文件。

重新部署

切换折叠

emacs-rime 的配置文件更新之后,与 RIME 一样,都需要重新部署才可生效。

以添加 地球拼音(terra_pinyin) 为例。

找到 emacs-rime 配置所在路径,或使用 M-x rime-open-configuration 打开文件 default.custom.yaml ,在 patch:schema_list 中添加 - schema: terra_pinyin ,需要 M-x rime-deploy 重新部署才可启用地球拼音方案,重新部署成功后按 C-` 选择输入方案。

示例如下:

patch:
  schema_list:
    - schema: luna_pinyin
    - schema: pinyin_simp
    - schema: terra_pinyin
  menu/page_size: 7 # 每页显示7个候选字词。
  switcher:
    hotkeys:
      - Control+grave # 激活RIME选单的快捷键,某些版本的RIME支持<F4>为快捷键,容易与其他软件冲突。

重新部署后原有个人词库丢失?

这很可能是 emacs-rimefcitx-rime 共用用户数据文件夹导致的。

如何找回:(依然以地球拼音为例)设置 emacs-rime 用户数据目录到其他文件夹,删除 terra_pinyin.userdb/ 并将 terra_pinyin.userdb.old/ 重命名为前者,再次同步或部署, terra_pinyin.userdb.txt 亦将恢复。

同步词库

切换折叠

M-x rime-sync 可对 RIME 输入方案和词库进行同步与备份,每次同步双向进行,词库生成的备份文件为 sync/ins_id/schema.userdb.txt ,其本身是文件夹 schema.userdb/ 中词库与词频使用记录的纯文本形式,方便用户跨平台、多设备使用。

所谓双向同步,即当前设备中的词频或用户自造词( schema.userdb/ 中)与备份文件( sync/ins_id/schema.userdb.txt 中)所记录的词库会被 RIME 合并,其 并集 将会继续记录在 schema.userdb/ 中,同时生成一份新的备份文件,仍名为 sync/ins_id/schema.userdb.txt ,并(在不询问用户的情况下)将旧的覆盖。

上述路径中 sync 文件夹与配置文件 default.custom.yaml 在同一目录, ins_id 对应的是 installation.yaml 文件中 installation_id 的值,默认值为随机生成,可自定义为其他字符串。

以添加 地球拼音(terra_pinyin) 后同步为例。启用该方案后,在 RIME 数据目录下会产生名为 terra_pinyin.userdb 的文件夹,其中为使用频率与自造词的记录,不可随意修改。同步前先修改 installation.yaml 中内容为自定义的 installation_id: "hesperus"~ ,之后 ~M-x rime-sync ,将会在 sync/hesperus/ 生成文件 terra_pinyin.userdb.txt (词库)与 terra_pinyin.schema.yaml (输入方案)。

若在其他设备或系统中有个人积累的词库,想继续使用。则先在旧系统中进行同步,将生成的 terra_pinyin.userdb.txt 复制到当前系统的 sync/hesperus/ 下,再进行同步或部署,此时旧系统中备份的词库将会被合并到当前系统的 terra_pinyin.userdb/ ,新的并集也将会被同时导出,并覆盖 terra_pinyin.userdb.txt

词库同步失败?

切换折叠

(以地球拼音方案使用为例。)

建议将不同设备或系统中的 ~installation_id~ 设为同一值 。若其不同,则可能同步失败,即从旧系统同步并复制的 terra_pinyin.userdb.txt 中的词频记录不会被纳入到当前的 terra_pinyin.userdb/ 。 此时该文件中词频不为空,但其中 user_id 等不同,修改此值后再次同步仍可能不生效。

三、样式设置

切换折叠

候选框展示风格

设置 rime-show-candidate

可选值说明
nil不展示
minibuffer在 minibuffer 中展示, 推荐使用的方式
message直接使用 message 输出,兼容控制 minibuffer 内容的插件
popup使用 popup.el 展示跟随的候选
posframe使用 posframe 展示跟随的候选,在不可用的时候会用 popup
sidewindow使用 sidewindow 展示跟随的候选

候选样式

Face说明
rime-default-face默认的前景色和背景色(仅 posframe)
rime-code-face编码的颜色
rime-candidate-num-face候选序号颜色
rime-comment-face编码提示颜色

posframe/popup/sidewindow 候选版式

设置 rime-posframe-stylerime-popup-style 或者 rime-sidewindow-style 可选值有

可选值说明
simple单行
horizontal水平,默认
vertical垂直

posframe 的其它属性

设置 rime-posframe-properties, 其中颜色的设置使用 rime-default-face.

(setq rime-posframe-properties
 (list :font "sarasa ui sc"
       :internal-border-width 10))

支持的内容参照 posframe

sidewindow 的其它屬性

设置 rime-sidewindow-style ,可选值有 top, bottom, left, right ,分别指 sidewindow 出现的位置位于上下左右。

设置 rime-sidewindow-keep-window ,为 t 时可保持 sidewindow 为开启状态。

彩色指示标志

可用 (rime-lighter) 得到彩色指示标志 . 可将其放在 modeline 等任意地方。

可用 rime-titlerime-indicator-facerime-indicator-dim-face 来自定义。

设置软光标的样式

默认使用 | 字符做为软光标,可以通过如下方式修改。

(setq rime-cursor "˰")

颜色可通过 rime-cursor-face 设置。

设置嵌入文本的样式

可通过 rime-preedit-face 设置。

编码的展示形式

设置 rime-show-preedit, 可选值有

可选值说明
t展示在菜单中
inline替换上屏预览
nil不展示

注意:使用 inlinenil 将不再展示软光标。

四、自动化设置

切换折叠

临时英文模式

切换折叠

如果使用模式编辑,或是在一些特定的场景下需要自动使用英文,可以设 置~rime-disable-predicates~ , rime-disable-predicates 的值是一个断言列表, 当其中有任何一个断言的值 **不是** nil 时,会自动使用英文。

一个在 evil-normal-state 中、在英文字母后面以及代码中自动使用英文的例子。

(setq rime-disable-predicates
      '(rime-predicate-evil-mode-p
        rime-predicate-after-alphabet-char-p
        rime-predicate-prog-in-code-p))

目前可用的断言函数

切换折叠
  • rime-predicate-after-alphabet-char-p

    在英文字符串之后(必须为以字母开头的英文字符串)

  • rime-predicate-after-ascii-char-p

    任意英文字符后

  • rime-predicate-prog-in-code-p

    prog-modeconf-mode 中除了注释和引号内字符串之外的区域

  • rime-predicate-in-code-string-p

    在代码的字符串中,不含注释的字符串。

  • rime-predicate-evil-mode-p

    evil-mode 的非编辑状态下

  • rime-predicate-ace-window-p

    激活 ace-window-mode

  • rime-predicate-hydra-p

    如果激活了一个 hydra keymap

  • rime-predicate-current-input-punctuation-p

    当要输入的是符号时

  • rime-predicate-punctuation-after-space-cc-p

    当要在中文字符且有空格之后输入符号时

  • rime-predicate-punctuation-after-ascii-p

    当要在任意英文字符之后输入符号时

  • rime-predicate-punctuation-line-begin-p

    在行首要输入符号时

  • rime-predicate-space-after-ascii-p

    在任意英文字符且有空格之后

  • rime-predicate-space-after-cc-p

    在中文字符且有空格之后

  • rime-predicate-current-uppercase-letter-p

    将要输入的为大写字母时

  • rime-predicate-tex-math-or-command-p

    在 (La)TeX 数学环境中或者输入 (La)TeX 命令时

可提示临时英文状态的提示符

使用函数 (rime-lighter) 返回一个用于展示的 符号。 可以通过 rime-indicator-facerime-indicator-dim-face 设置样式。

如下设置可替换输入法的符号,使其用颜色提示当前的临时英文状态。

;;; 具体参考 mode-line-mule-info 默认值,其中可能有其它有用信息
(setq mode-line-mule-info '((:eval (rime-lighter))))

基于 Rime inline ascii 模式的临时英文

设置 rime-inline-predicates ,结构与 rime-disable-predicates 相同,具有较低优先级。

这个功能主要用来实现输入带空格的临时英文的场景。

由于当前实现限制,如果 Rime 配置中没有使用默认的 Shift_L 切换 inline ascii 模式,需要在 emacs-rime 中指定。 两边配置相同才能正常激活。

;;; support shift-l, shift-r, control-l, control-r
(setq rime-inline-ascii-trigger 'shift-l)

在有编码的状态下使用 rime-inline-ascii 命令可以切换状态。

(define-key rime-active-mode-map (kbd "M-j") 'rime-inline-ascii)

临时英文中阻止标点直接上屏

(setq rime-inline-ascii-holder ?x)      ; Any single character that not trigger auto commit

断言成立时的强制中文模式

使用 rime-force-enable 来临时强制使用强制中文模式(即无视 rime-disable-predicates 中的规则), 在 一次输入行为取消输入 之后会自动关闭强制中文模式。

你可能需要给这个命令绑定一个按键来使用。

(define-key rime-mode-map (kbd "M-j") 'rime-force-enable)

Commit1 自动上屏

emacs-rime 内置了 rime-commit1 函数,其作用是在输入状态下将候选框中的首项自动上屏。

这对于不注重(或几乎不需要)选重、且码长可不固定(即简码)的输入方案,如纯形码、音形码等(尤其是顶功类方案)而言,非常有用。

此函数不是针对单独使用的,而主要是为了配合自定义其它函数,以适应个人的各种使用场景。

实例:在切换输入法时首项自动上屏

在切换输入法时首项自动上屏,这是 fcitx5-rime 等所支持的功能。 这里就以在 emacs-rime 中实现相同功能为例,说明如何使用 rime-commit1 函数。

基本思路是,先自定义一个函数,功能是先使得首项自动上屏,再切换输入法; 再将这个函数绑定到某个按键组合上,来替代原本 toggle-input-method 的功能。

示例配置如下:

(defun rime-commit1-and-toggle-input-method ()
  "Commit the 1st item if exists, then toggle input method."
  (interactive)
  (ignore-errors (rime-commit1))
  (toggle-input-method))

(global-set-key (kbd "C-;") #'rime-commit1-and-toggle-input-method)

这里使用了 ignore-errors 来防止在初次切换输入法时 rime-commit1 未被加载而报错。 在此配置生效后,按 C-; 即可使首项自动上屏并切换输入法。

对任意无关函数首项自动上屏

若你有很多函数需要在其执行前首项自动上屏,而又不想对它们一个个进行自定义函数与绑定的配置,你可以设置对任意与 emacs-rime 无关函数的首项自动上屏。

机制:

  • 在 emacs-rime 的输入状态下,若执行与 emacs-rime 无关的函数,默认会触发 rime--clear-state 清空候选框。
  • 若设置变量 rime-commit1-forall 为一非 nil 值,则会将触发的函数改为 rime-commit1 即首项自动上屏。

示例配置如下:

(setq rime-commit1-forall t)

按 ESC 时首项自动上屏

上述全局设置,不能使得在输入时按 ESC 时首项也自动上屏,这里给出针对性的配置方法。

机制:在 emacs-rime 的输入状态下,ESC 被绑定到了 rime--escape 函数上,此函数显然不是“与 emacs-rime 无关的函数”。

实例:以 evil 插件为例,若要使得 ESC 能自动上屏并切换到 evil 的 normal state,可以先自定义函数,并将此函数绑定到 ESC 上。 (注:至少对于 evil 插件而言, C-[ESC 被 emacs 当作同一按键,所以不需要对 C-[ 另行绑键。)

示例配置如下:

(defun rime-commit1-and-evil-normal ()
  "Commit the 1st item if exists, then go to evil normal state."
  (interactive)
  (rime-commit1)
  (evil-normal-state))
(define-key rime-active-mode-map (kbd "<escape>") 'rime-commit1-and-evil-normal)

在 minibuffer 使用后自动关闭输入法

默认行为为自动关闭,设置 rime-deactivate-when-exit-minibuffer 为 nil 取消该行为。

结合 evil-escape 一起使用

切换折叠

以下代码可能有性能问题

在你的配置中添加如下内容,即可在当前没有输入内容(没有 preedit overlay)的情况 下,用evil-escape的按键回到 normal 模式。

(defun rime-evil-escape-advice (orig-fun key)
  "advice for `rime-input-method' to make it work together with `evil-escape'.
        Mainly modified from `evil-escape-pre-command-hook'"
  (if rime--preedit-overlay
      ;; if `rime--preedit-overlay' is non-nil, then we are editing something, do not abort
      (apply orig-fun (list key))
    (when (featurep 'evil-escape)
      (let (
            (fkey (elt evil-escape-key-sequence 0))
            (skey (elt evil-escape-key-sequence 1))
            )
        (if (or (char-equal key fkey)
                (and evil-escape-unordered-key-sequence
                     (char-equal key skey)))
            (let ((evt (read-event nil nil evil-escape-delay)))
              (cond
               ((and (characterp evt)
                     (or (and (char-equal key fkey) (char-equal evt skey))
                         (and evil-escape-unordered-key-sequence
                              (char-equal key skey) (char-equal evt fkey))))
                (evil-repeat-stop)
                (evil-normal-state))
               ((null evt) (apply orig-fun (list key)))
               (t
                (apply orig-fun (list key))
                (if (numberp evt)
                    (apply orig-fun (list evt))
                  (setq unread-command-events (append unread-command-events (list evt))))))
              )
          (apply orig-fun (list key)))))))

(advice-add 'rime-input-method :around #'rime-evil-escape-advice)

五、杂项

切换折叠

打开 Rime 菜单

假设你为菜单使用 C-~

switcher:
  caption: 〔方案選單〕
  hotkeys:
    - Control+grave

你可用函数 rime-send-keybinding 将此按键绑定到 rime-mode-map

(use-package
  ...

  :bind
  (:map rime-mode-map
        ("C-`" . 'rime-send-keybinding))
  ...
  )

六、FAQ

切换折叠

在 isearch 中的使用

目前在 isearch 中不能正常工作,但是可以使用 phi-search.

候选框最后一项不显示?

切换折叠

极少数用户下会偶尔出现最后一个候选词不显示的情况,可以确定跟 `posframe` 有关,但 目前尚未找到原因,有一个暂时的解决办法,就是给候选词列表最后附加一个全角空格,这 样即使出现“吃字”的情况也只是把末尾的全角空格“吃”掉,不会影响候选词的显示。 代码如下:

  (defun +rime--posframe-display-content-a (args)
    "`rime--posframe-display-content' 传入的字符串加一个全角空
格,以解决 `posframe' 偶尔吃字的问题。"
    (cl-destructuring-bind (content) args
      (let ((newresult (if (string-blank-p content)
                           content
                         (concat content " "))))
        (list newresult))))

  (if (fboundp 'rime--posframe-display-content)
      (advice-add 'rime--posframe-display-content
                  :filter-args
                  #'+rime--posframe-display-content-a)
    (error "Function `rime--posframe-display-content' is not available."))

无需 librime 纯 Emacs 实现的输入法?

你可能需要 pyim.

终、感谢所有的 Contributor

emacs-rime's People

Contributors

atnewhope avatar casouri avatar chuxubank avatar cireu avatar claude-ray avatar cnsunyour avatar con5tella avatar doglooksgood avatar dwuggh avatar eason0210 avatar elilif avatar gemone avatar ilupin avatar jian-lin avatar jixiuf avatar kisaragi-hiu avatar longminwang avatar mrunhap avatar nasyxx avatar rqy2002 avatar shuxiao9058 avatar syohex avatar tubo avatar wsw0108 avatar xofyarg avatar z572 avatar zhmars avatar zilongshanren avatar zw963 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

emacs-rime's Issues

Symbol’s function definition is void: liberime-string-length

message 显示 rime--show-candidate: Symbol’s function definition is void: liberime-string-length
因为我用的是 merrickluo/liberime 的 repo,跟这个有关吗?还是可能是哪里有问题?(除了没候选之外,打字没有问题)

Ubuntu 19.10配置

(use-package rime
:bind
(:map rime-mode-map
("C-`" . 'rime-send-keybinding))

:custom
(
(default-input-method "rime")
(rime-librime-root "~/.emacs.d/librime/dist")
(rime-show-candidate 'posframe)))

能帮我看下这个配置错在什么地方吗?

[BUG] 使用posframe显示候选词时,第九个候选不显示

问题描述

如题

Emacs中的配置

(setq default-input-method "rime")
(setq rime-user-data-dir "~/sdk/config/input_method/rime")
(setq rime-show-candidate 'posframe)
(setq rime-disable-predicates
      '(rime-predicate-evil-mode-p
        rime-predicate-after-alphabet-char-p
        rime-predicate-prog-in-code-p
        ))
;; (setq rime-posframe-properties
;;  (list :font "sarasa ui sc"
;;        :internal-border-width 10))
(setq rime--popup 1)
(setq rime-show-preedit 1)
;;(setq rime-posframe-fixed-position t)

复现方式(安装遇到问题时省略)

我使用doom-emacs,在doom-emacs的package.el中指定安装github仓库的emacs-rime,使用上面的配置,就会出现这个问题

是否可在 emacs -Q 中复现

我不知道如何在emacs -Q 中使用emacs-rime 😅

截图
image

环境信息

  • 操作系统:ArchLinux
  • Emacs版本:28.0.50
  • Librime版本:1.5.3
  • Librime安装方式:包管理器
  • 安装方式:Git

[Feature] 使用方向键选择候选

问题描述

狗哥好,hhkb和其他一些自带方向键快捷键的键盘,用户会比较习惯使用方向键,希望能够使用方向键来选择候选。

Incorrect user data path.

rime-user-data-dir should be expand with expand-file-name.

This bug will cause a directory ~ generated in $HOME .

You probably have to delete this directory manually.

Sorry for the inconvenience.

使用posframe做候选框,有时候显示候选词不全

如图:

image

第二个候选词是“夜猫子”,好像是 posframe 窗口长度不够所以显示不出来。这种情况在最后一个候选词比前面的长的时候会出现,如果最后一个候选词比前面的短,则显示正常,如图:

image

假如把“蠢蠢欲动”排在最后一个,则又会显示不出来

如何关闭librime的输出

好吧,这不是一个bug ,是我选错了labels

问题描述

在切换rime输入的时候 librime弹出一堆输出,但是emacs-rime是正常工作的
如何关闭这些输出?

      02:49:38.127979 22883 engine.cc:206] Oops, got a futile translation.
I0502 02:49:37.830484 22883 engine.cc:206] Oops, got a futile translation.I0502 02:49:38.030687 22883 engine.cc:206] Oops, got a futile translation.
                                                                          I0502 02:49:37.888438 22883 engine.cc:206] Oops, got a futile translation.

Emacs中的配置

(use-package rime
  :custom
  (default-input-method "rime"))

复现方式(安装遇到问题时省略)

终端版本

是否可在 emacs -Q 中复现

不能

截图

2020-05-02-105024_1440x900_scrot

环境信息

  • 操作系统: 在Alpine 上安装的 Guix。
  • Emacs版本: 26.3
  • Librime版本:1.5.3
  • Librime安装方式:包管理器
  • 安装方式:Melpa

intergration with evil-escape

我在spacemacs中经常用 evil-escape 来切换 normal state 和 insert state,也就是(默认)fd连击为esc。
目前在emacs-rime中用不了,请问有没有什么办法能结合一下这个功能?
some code of evil-escape maybe helpful:

(defun evil-escape-pre-command-hook ()
  "evil-escape pre-command hook."
  (with-demoted-errors "evil-escape: Error %S"
      (when (evil-escape-p)
        (let* ((modified (buffer-modified-p))
               (inserted (evil-escape--insert))
               (fkey (elt evil-escape-key-sequence 0))
               (skey (elt evil-escape-key-sequence 1))
               (evt (read-event nil nil evil-escape-delay)))
          (when inserted (evil-escape--delete))
          (set-buffer-modified-p modified)
          (cond
           ((and (characterp evt)
                 (or (and (equal (this-command-keys) (evil-escape--first-key))
                          (char-equal evt skey))
                     (and evil-escape-unordered-key-sequence
                          (equal (this-command-keys) (evil-escape--second-key))
                          (char-equal evt fkey))))
            (evil-repeat-stop)
            (let ((esc-fun (evil-escape-func)))
              (when esc-fun
                (setq this-command esc-fun)
                (setq this-original-command esc-fun))))
           ((null evt))
           (t (setq unread-command-events
                    (append unread-command-events (list evt)))))))))

如何关闭librime的输出

好吧,这不是一个bug ,是我选错了labels

问题描述

在切换rime输入的时候 librime弹出一堆输出,但是emacs-rime是正常工作的
如何关闭这些输出?

      02:49:38.127979 22883 engine.cc:206] Oops, got a futile translation.
I0502 02:49:37.830484 22883 engine.cc:206] Oops, got a futile translation.I0502 02:49:38.030687 22883 engine.cc:206] Oops, got a futile translation.
                                                                          I0502 02:49:37.888438 22883 engine.cc:206] Oops, got a futile translation.

Emacs中的配置

(use-package rime
  :custom
  (default-input-method "rime"))

复现方式(安装遇到问题时省略)

终端版本

是否可在 emacs -Q 中复现

不能

截图

2020-05-02-105024_1440x900_scrot

环境信息

  • 操作系统: 在Alpine 上安装的 Guix。
  • Emacs版本: 26.3
  • Librime版本:1.5.3
  • Librime安装方式:包管理器
  • 安装方式:Melpa

rime-predicate-prog-in-code-p 光标是字符串内的判断似乎有问题。

问题描述
感觉 rime-predicate-prog-in-code-p 应该改成下面这样
原函数,当光标在字符串内时,无法启用中文输入
比如

(setq str "this is a光标在这里 string")

(defun rime-predicate-prog-in-code-p ()
  "If cursor is in code.

Can be used in `rime-disable-predicates' and `rime-inline-predicates'."
  (and (derived-mode-p 'prog-mode 'conf-mode )
       (not (nth 3 (syntax-ppss)))      ;not in string
       (not (nth 4 (syntax-ppss)))))    ;not in comment

简明的问题描述

Emacs中的配置

(setq default-input-method "rime")
(setq rime-show-candidate 'posframe)
(setq rime-disable-predicates
      '(rime-predicate-evil-mode-p
        rime-predicate-prog-in-code-p
        ;; rime-predicate-after-alphabet-char-p
        ;; rime-predicate-auto-english-p
        ))
(require 'rime)

是否可在 emacs -Q 中复现

截图

展示错误的截图或动图

环境信息

  • 操作系统:如macos

  • Emacs版本:如 GNU Emacs 28.0.50 (build 1, x86_64-apple-darwin18.7.0, NS appkit-1671.60 Version 10.14.6

  • Librime版本:如 1.5.3

  • Librime安装方式: 手工编译

  • 安装方式:Git

打包时如何更方便地指定rime-data的路径

问题描述

由于Guix自身的特点,给 emacs-rime 打包时需要指定 rime-data 的路径。我现在的做法是替换 rime-share-data-dir 变量定义中的 (xdg-data-dirs) 字符串。最终的代码是这样的:

(defcustom rime-share-data-dir
  (cl-case system-type
    ('gnu/linux
     (cl-some (lambda (parent)
                (let ((dir (expand-file-name "rime-data" parent)))
                  (when (file-directory-p dir)
                    dir)))
              (if (fboundp 'xdg-data-dirs)
                  '("/gnu/store/3kzq9gr6px2rbc26y73r7i9hcdc18xsa-rime-data-0.38.20200623/share")
                '("/usr/share/local" "/usr/share"))))
    ('darwin
     "/Library/Input Methods/Squirrel.app/Contents/SharedSupport")
    ('windows-nt
     (concat (getenv "MSYSTEM_PREFIX") "/share/rime-data")))
  "Rime share data directory."
  :type 'string
  :group 'rime)

有没有更优雅的方式只通过简单的字符串替换就可以设置 rime-share-data-dir 变量的默认值?新的方案最好能同时兼顾Guix和NixOS打包。

我想到的一种方案是修改 rime-share-data-dir 的定义,但是不够优雅:

(defcustom rime-share-data-dir
  (cl-case system-type
    ('gnu/linux
     (cl-some (lambda (parent)
                (let ((dir (expand-file-name "rime-data" parent)))
                  (when (file-directory-p dir)
                    dir)))
              (cond ((require 'guix-emacs nil t)
                     ;; This placeholder will be replaced by the real path to
                     ;; rime-data package when building emacs-rime in Guix.
                     '("RIME_DATA_PACKAGE_PATH/share"))
                    ((fboundp 'xdg-data-dirs)
                     (xdg-data-dirs))
                    (t '("/usr/local/share" "/usr/share")))))
    ('darwin
     "/Library/Input Methods/Squirrel.app/Contents/SharedSupport")
    ('windows-nt
     (concat (getenv "MSYSTEM_PREFIX") "/share/rime-data")))
  "Rime share data directory."
  :type 'string
  :group 'rime)

另一种方案是增加一个新的变量 (defvar rime--distribution-default-rime-data-path nil) ,如果 rime--distribution-default-rime-data-path 不为nil,就把它设为 rime-share-data-dir 的默认值。Guix和NixOS打包时把

(defvar rime--distribution-default-rime-data-path nil)

通过正则表达式匹配替换为

(defvar rime--distribution-default-rime-data-path "/gnu/store/xxxabc123...xxx-rime-data-0.38/share/rime-data")

完善文档内容

目前有以下还未列入文档的内容:

  • 如何在isearch中使用 #21
  • 自动英文的断言函数的说明 #36
  • 如何设置 posframe 的样式 #35 #29
  • 如何重新布署
  • 如何同步词库
  • 如何重新编译
  • 如何在mode-line中显示一个标志
  • 如何自定义 user-data-dir 和 share-data-dir
  • 如何呼出 Rime 菜单
  • 如何定制嵌入文本的样式
  • 如何定制候选的样式

[macOS] emacs-mac 的 cask 版本无法使用 librime-emacs.so

  • macOS 10.15.4
  • emacs-mac: emacs-26.3-z-mac-7.9 (cask)

无论是使用

ln -s /Applications/Emacs.app/Contents/Resources/include/emacs-module.h /usr/local/include

还是使用

(setq rime-emacs-module-header-root "/Applications/Emacs.app/Contents/Resources/include")

build 出来的 librime-emacs.so 文件都无法直接加载

错误信息

load-file: Module could not be opened: "/Users/misaka/.doom/.local/straight/build/rime/librime-emacs.so", "dlopen(/Users/misaka/.doom/.local/straight/build/rime/librime-emacs.so, 1): no suitable image found.  Did find:
	/Users/misaka/.doom/.local/straight/build/rime/librime-emacs.so: code signature in (/Users/misaka/.doom/.local/straight/build/rime/librime-emacs.so) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
	/Users/misaka/.doom/.local/straight/build/rime/librime-emacs.so: stat() failed with errno=4"
➜  rime git:(develop) codesign --display --verbose librime-emacs.so
librime-emacs.so: code object is not signed at all

使用非 cask 版本, 则正常...
考虑到可能有一部分人可能使用的是 cask 版本, 如果能解决这个问题应该会方便很多.

compilation on windows x64

I have managed to compile the code successfully under windows 10 x64 platform by using tdm64-gcc :

cd /path/to/librime/dist/lib/

ren rime.lib rime.a

gcc lib.c -m32 -shared -o librime-emacs.dll -I/path/to/librime/dist/include -I/path/to/emacs_src/src -L/path/to/librime/dist/lib -Wl,-rpath /path/to/librime/dist/lib/ -lrime

After that, copy the generated dll to emacs-rime package, start emacs, press C-| ......
There is an error message says "load-file: Module could not be opened: librime-emacs.dll is not a valid win32 program.
Emacs version is 27.0.50 x86_64.
May anybody take a test to verify the compilation and if it is related to architecture(x86, x86_64)?

Crash

今天最新版打字时候弹不出posframe,下面是backtrace

Debugger entered--Lisp error: (wrong-type-argument listp "和")
car("和")
(propertize (car c) (quote face) (quote rime-highlight-candidate-face))
(if (equal (1- idx) highlighted-candidate-index) (propertize (car c) (quote face) (quote rime-highlight-candidate-face)) (car c))
(concat (propertize (format "%d. " idx) (quote face) (quote rime-candidate-num-face)) (if (equal (1- idx) highlighted-candidate-index) (propertize (car c) (quote face) (quote rime-highlight-candidate-face)) (car c)) (let* ((comment (and t (cdr c)))) (if comment (propertize (format " %s" comment) (quote face) (quote rime-comment-face)) "")))
(let ((candidates-text (concat (propertize (format "%d. " idx) (quote face) (quote rime-candidate-num-face)) (if (equal (1- idx) highlighted-candidate-index) (propertize (car c) (quote face) (quote rime-highlight-candidate-face)) (car c)) (let* ((comment (and t ...))) (if comment (propertize (format " %s" comment) (quote face) (quote rime-comment-face)) ""))))) (setq result (concat result candidates-text (rime--candidate-separator-char))))
(while --dolist-tail-- (setq c (car --dolist-tail--)) (let ((candidates-text (concat (propertize (format "%d. " idx) (quote face) (quote rime-candidate-num-face)) (if (equal (1- idx) highlighted-candidate-index) (propertize (car c) (quote face) (quote rime-highlight-candidate-face)) (car c)) (let* ((comment ...)) (if comment (propertize ... ... ...) ""))))) (setq result (concat result candidates-text (rime--candidate-separator-char)))) (setq idx (1+ idx)) (setq --dolist-tail-- (cdr --dolist-tail--)))
(let ((--dolist-tail-- candidates) c) (while --dolist-tail-- (setq c (car --dolist-tail--)) (let ((candidates-text (concat (propertize (format "%d. " idx) (quote face) (quote rime-candidate-num-face)) (if (equal ... highlighted-candidate-index) (propertize ... ... ...) (car c)) (let* (...) (if comment ... ""))))) (setq result (concat result candidates-text (rime--candidate-separator-char)))) (setq idx (1+ idx)) (setq --dolist-tail-- (cdr --dolist-tail--))))
(progn (if preedit (progn (setq result (concat (propertize (concat before-cursor) (quote face) (quote rime-code-face)) (propertize (concat rime-cursor) (quote face) (quote rime-cursor-face)) (propertize (concat after-cursor) (quote face) (quote rime-code-face)) (rime--candidate-prefix-char))))) (let ((--dolist-tail-- candidates) c) (while --dolist-tail-- (setq c (car --dolist-tail--)) (let ((candidates-text (concat (propertize ... ... ...) (if ... ... ...) (let* ... ...)))) (setq result (concat result candidates-text (rime--candidate-separator-char)))) (setq idx (1+ idx)) (setq --dolist-tail-- (cdr --dolist-tail--)))))
(if (and (rime--has-composition context) candidates) (progn (if preedit (progn (setq result (concat (propertize (concat before-cursor) (quote face) (quote rime-code-face)) (propertize (concat rime-cursor) (quote face) (quote rime-cursor-face)) (propertize (concat after-cursor) (quote face) (quote rime-code-face)) (rime--candidate-prefix-char))))) (let ((--dolist-tail-- candidates) c) (while --dolist-tail-- (setq c (car --dolist-tail--)) (let ((candidates-text (concat ... ... ...))) (setq result (concat result candidates-text (rime--candidate-separator-char)))) (setq idx (1+ idx)) (setq --dolist-tail-- (cdr --dolist-tail--))))))
(let* ((context (rime-lib-get-context)) (candidates (alist-get (quote candidates) (alist-get (quote menu) context))) (composition (alist-get (quote composition) context)) (length (alist-get (quote length) composition)) (preedit (alist-get (quote preedit) composition)) (commit-text-preview (alist-get (quote commit-text-preview) context)) (cursor-pos (alist-get (quote cursor-pos) composition)) (before-cursor (alist-get (quote before-cursor) composition)) (after-cursor (alist-get (quote after-cursor) composition)) (sel-start (alist-get (quote sel-start) composition)) (sel-end (alist-get (quote sel-end) composition)) (menu (alist-get (quote menu) context)) (highlighted-candidate-index (alist-get (quote highlighted-candidate-index) menu)) (input (rime-lib-get-input)) (page-no (alist-get (quote page-no) menu)) (idx 1) (result "")) (if (and (rime--has-composition context) candidates) (progn (if preedit (progn (setq result (concat (propertize ... ... ...) (propertize ... ... ...) (propertize ... ... ...) (rime--candidate-prefix-char))))) (let ((--dolist-tail-- candidates) c) (while --dolist-tail-- (setq c (car --dolist-tail--)) (let ((candidates-text ...)) (setq result (concat result candidates-text ...))) (setq idx (1+ idx)) (setq --dolist-tail-- (cdr --dolist-tail--)))))) (if (and page-no (not (= 0 page-no))) (progn (setq result (concat result (format " [%d]" (1+ page-no)))))) result)
rime--build-candidate-content()
(rime--show-content (rime--build-candidate-content))
rime--show-candidate()
rime--redisplay()
(cond ((not handled) (list key)) (commit (rime--clear-overlay) (mapcar (quote identity) commit)) (t (if (and (rime--should-inline-ascii-p) commit-text-preview (not (rime--ascii-mode-p))) (progn (rime--inline-ascii))) (rime--redisplay)))
(unwind-protect (cond ((not handled) (list key)) (commit (rime--clear-overlay) (mapcar (quote identity) commit)) (t (if (and (rime--should-inline-ascii-p) commit-text-preview (not (rime--ascii-mode-p))) (progn (rime--inline-ascii))) (rime--redisplay))) (rime--refresh-mode-state))
(let* ((context (rime-lib-get-context)) (commit-text-preview (alist-get (quote commit-text-preview) context)) (preedit (alist-get (quote preedit) (alist-get (quote composition) context))) (commit (rime-lib-get-commit))) (unwind-protect (cond ((not handled) (list key)) (commit (rime--clear-overlay) (mapcar (quote identity) commit)) (t (if (and (rime--should-inline-ascii-p) commit-text-preview (not (rime--ascii-mode-p))) (progn (rime--inline-ascii))) (rime--redisplay))) (rime--refresh-mode-state)))
(progn (let* ((context (rime-lib-get-context)) (commit-text-preview (alist-get (quote commit-text-preview) context)) (preedit (alist-get (quote preedit) (alist-get (quote composition) context))) (commit (rime-lib-get-commit))) (unwind-protect (cond ((not handled) (list key)) (commit (rime--clear-overlay) (mapcar (quote identity) commit)) (t (if (and (rime--should-inline-ascii-p) commit-text-preview (not ...)) (progn (rime--inline-ascii))) (rime--redisplay))) (rime--refresh-mode-state))))
(unwind-protect (progn (let* ((context (rime-lib-get-context)) (commit-text-preview (alist-get (quote commit-text-preview) context)) (preedit (alist-get (quote preedit) (alist-get (quote composition) context))) (commit (rime-lib-get-commit))) (unwind-protect (cond ((not handled) (list key)) (commit (rime--clear-overlay) (mapcar (quote identity) commit)) (t (if (and ... commit-text-preview ...) (progn ...)) (rime--redisplay))) (rime--refresh-mode-state)))) (if modified nil (restore-buffer-modified-p nil)))
(let* ((modified (buffer-modified-p)) (buffer-undo-list t) (inhibit-read-only t) (inhibit-modification-hooks t)) (unwind-protect (progn (let* ((context (rime-lib-get-context)) (commit-text-preview (alist-get (quote commit-text-preview) context)) (preedit (alist-get (quote preedit) (alist-get ... context))) (commit (rime-lib-get-commit))) (unwind-protect (cond ((not handled) (list key)) (commit (rime--clear-overlay) (mapcar ... commit)) (t (if ... ...) (rime--redisplay))) (rime--refresh-mode-state)))) (if modified nil (restore-buffer-modified-p nil))))
(let ((handled (rime-lib-process-key key 0))) (let* ((modified (buffer-modified-p)) (buffer-undo-list t) (inhibit-read-only t) (inhibit-modification-hooks t)) (unwind-protect (progn (let* ((context (rime-lib-get-context)) (commit-text-preview (alist-get ... context)) (preedit (alist-get ... ...)) (commit (rime-lib-get-commit))) (unwind-protect (cond (... ...) (commit ... ...) (t ... ...)) (rime--refresh-mode-state)))) (if modified nil (restore-buffer-modified-p nil)))))
(if (and (not (rime--should-enable-p)) (not (rime--has-composition (rime-lib-get-context)))) (list key) (let ((handled (rime-lib-process-key key 0))) (let* ((modified (buffer-modified-p)) (buffer-undo-list t) (inhibit-read-only t) (inhibit-modification-hooks t)) (unwind-protect (progn (let* ((context ...) (commit-text-preview ...) (preedit ...) (commit ...)) (unwind-protect (cond ... ... ...) (rime--refresh-mode-state)))) (if modified nil (restore-buffer-modified-p nil))))))
(progn (if (and (not (rime--should-enable-p)) (not (rime--has-composition (rime-lib-get-context)))) (list key) (let ((handled (rime-lib-process-key key 0))) (let* ((modified (buffer-modified-p)) (buffer-undo-list t) (inhibit-read-only t) (inhibit-modification-hooks t)) (unwind-protect (progn (let* (... ... ... ...) (unwind-protect ... ...))) (if modified nil (restore-buffer-modified-p nil)))))))
(if (rime--rime-lib-module-ready-p) (progn (if (and (not (rime--should-enable-p)) (not (rime--has-composition (rime-lib-get-context)))) (list key) (let ((handled (rime-lib-process-key key 0))) (let* ((modified (buffer-modified-p)) (buffer-undo-list t) (inhibit-read-only t) (inhibit-modification-hooks t)) (unwind-protect (progn (let* ... ...)) (if modified nil (restore-buffer-modified-p nil))))))))
rime-input-method(104)

[BUG] 输入过的短语不会被记住

问题描述

输入过的短语不会被记住

Emacs中的配置

(require 'rime)
(setq rime-user-data-dir "~/.config/fcitx/rime")
(setq default-input-method "rime"
      rime-show-candiate 'posframe)

复现方式

在 emacs 中按 C-\ 启动 rime,然后随意输入一个不常见(需要选择)的短语,之后再重新输入一次

是否可在 emacs -Q 中复现

截图
Screenshot_2020-07-06_18-04-50

环境信息

  • 操作系统:Debian 10
  • Emacs版本:27.0.91
  • Librime版本:1.4.0+dfsg1-2+b1
  • Librime安装方式:包管理器
  • 安装方式:Melpa

请问支援 lua 吗?

鼠须管已经支援 lua 了,请问 emacs-rim 是不是还不行?还是需要做什么配置?谢谢

试写关于重新部署、同步词库的文档

重新部署

emacs-rime的配置文件更新之后,与RIME一样,都需要重新部署才可生效。

以添加地球拼音(terra_pinyin)为例。
找到emacs-rime配置所在路径,或使用M-x rime-open-configuration打开文件default.custome.yaml,在patch:schema_list中添加- schema: terra_pinyin,需要M-x rime-deploy重新部署才可启用地球拼音方案,重新部署成功后按C-` 选择输入方案。

示例如下:

patch:
  schema_list:
    - schema: luna_pinyin
    - schema: pinyin_simp
    - schema: terra_pinyin
  menu/page_size: 7 # 每页显示7个候选字词。
  switcher:
    hotkeys:
      - Control+grave # 激活RIME选单的快捷键,某些版本的RIME支持<F4>为快捷键,容易与其他软件冲突。

同步词库

M-x rime-sync可对RIME输入方案和词库进行同步与备份,每次同步双向进行,词库生成的备份文件为sync/ins_id/schema.userdb.txt,其本身是文件夹schema.userdb/中词库与词频使用记录的纯文本形式,方便用户跨平台、多设备使用。

所谓双向同步,即当前设备中的词频或用户自造词(schema.userdb/中)与备份文件(sync/ins_id/schema.userdb.txt中)所记录的词库会被RIME合并,其并集将会继续记录在schema.userdb/中,同时生成一份新的备份文件,仍名为sync/ins_id/schema.userdb.txt,并(在不询问用户的情况下)将旧的覆盖。

上述路径中sync文件夹与配置文件default.custom.yaml在同一目录,ins_id对应的是installation.yaml文件中installation_id的值,默认值为随机生成,可自定义为其他字符串。

以添加地球拼音(terra_pinyin)后同步为例。启用该方案后,在RIME数据目录下会产生名为terra_pinyin.userdb的文件夹,其中为使用频率与自造词的记录,不可随意修改。同步前先修改installation.yaml中内容为自定义的installation_id: "hesperus",之后M-x rime-sync,将会在sync/hesperus/生成文件terra_pinyin.userdb.txt(词库)与terra_pinyin.schema.yaml(输入方案)。

若在其他设备或系统中有个人积累的词库,想继续使用。则先在旧系统中进行同步,将生成的terra_pinyin.userdb.txt复制到当前系统的sync/hesperus/下,再进行同步或部署,此时旧系统中备份的词库将会被合并到当前系统的terra_pinyin.userdb/,新的并集也将会被同时导出,并覆盖terra_pinyin.userdb.txt

可能遇到的问题

在Linux下使用过程中可能会遇到以下问题。

原有个人词库丢失

(以地球拼音方案在fcitx-rimeemacs-rime中使用为例。)

不建议emacs-rimefcitx-rime共用数据文件夹。若设置(setq rime-user-data-dir "~/.config/fcitx/rime/"),则在emacs-rime初次部署后,将会生成新的terra_pinyin.userdb/文件夹,原有fcitx-rime使用记录将会被移动到terra_pinyin.userdb.old/,此时新的terra_pinyin.userdb.txt中词频为空。

找回

设置emacs-rime用户数据目录到其他文件夹,删除terra_pinyin.userdb/并将terra_pinyin.userdb.old/重命名为前者,再次同步或部署,terra_pinyin.userdb.txt亦将恢复。

词库同步失败

(以地球拼音方案使用为例。)

建议将不同设备或系统中的installation_id设为同一值。若其不同,则可能同步失败,即从旧系统同步并复制的terra_pinyin.userdb.txt中的词频记录不会被纳入到当前的terra_pinyin.userdb/。此时该文件中词频不为空,但其中user_id等不同,修改此值后再次同步仍可能不生效。

minibuffer中使用存在一些问题

  • minibuffer中的候选还是应该遵循用户的设置
  • minibuffer中按 ESC 取消后不能正确的清理嵌入文本
  • 不能在isearch中使用

[BUG] MacOS上安装后,依旧无法输入中文

问题描述

MacOS上安装后,依旧无法输入中文,除了modeline的图标外,和没安装没有区别,也没有任何报错。
Emacs 版本为 @railwaycat 的brew版本,也编译了dynamic module。

Emacs中的配置

(use-package rime
  :straight (rime :type git
                  :host github
                  :repo "DogLooksGood/emacs-rime"
                  :files ("*.el" "Makefile" "lib.c"))
  :custom
  (rime-librime-root "~/.emacs.d/rime-1.5.3-osx/dist")
  (rime-user-data-dir "~/.emacs.d/config/rime")
  (default-input-method "rime")
  (rime-show-candidate 'minibuffer)
  :general
  (:keymaps 'rime-mode-map
            "C-`" 'rime-send-keybinding))

复现方式(安装遇到问题时省略)

正常输入任何字。

是否可在 emacs -Q 中复现

可以。

截图

image

环境信息

  • 操作系统:MacOS Catalina
  • Emacs版本:如 26.3
  • Librime版本:如 1.5.3
  • Librime安装方式:来自github的osx的binary
  • 安装方式:Straight

小建议:把必须为英文模式的断言固定至默认规则下

具体说,即把一些必须要切换到英文模式的断言固定到类似 rime-disable-predicates 的规则中,而无需配置,用户的配置是在此规则上自行搭配断言函数。这样可以减少用户配置的复杂度,降低入门用户的配置门槛。
个人推荐以下断言适合固定:

rime-predicate-evil-mode-p
rime-predictte-ace-window-p
rime-predicate-hydra-p
(button-at (point))

不知意下如何?

Compilation errors on Ubuntu

1 首次安装编译时,会出现以下的编译错误。

gcc -fPIC -O2 -Wall -shared -lrime lib.c -o librime-emacs.so
lib.c:24:10: fatal error: rime_api.h: No such file or directory
   24 | #include <rime_api.h>
      |          ^~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:25: lib] Error 1

2 首先怀疑应该是系统中没有librime包。通过搜索包管理,安装librime-dev包后重新编译,显示编译成功。但是切换输入法到rime时,emacs直接被杀掉,后台信息:

emacs: symbol lookup error: /home/leizhe/Emacs/.emacs.d/elpa/rime-20200321.2331/librime-emacs.so: undefined symbol: rime_get_api

是不是包安装有什么问题?

“rime--build-compile-env: Variable ‘module-file-suffix’ is nil”

问题描述

debian, emacs/26.3 安装好librime 1.5.3。
C-\ 显示:“rime--build-compile-env: Variable ‘module-file-suffix’ is nil”

简明的问题描述

Emacs中的配置

(use-package rime
  :custom
  (default-input-method "rime"))

复现方式(安装遇到问题时省略)

复现问题所需的操作

是否可在 emacs -Q 中复现

是/否

截图

展示错误的截图或动图

环境信息

  • 操作系统:如 ArchLinux
  • Emacs版本:如 27.0.90
  • Librime版本:如 1.5.3
  • Librime安装方式:包管理器/手工编译
  • 安装方式:Git/Melpa/Straight/Quelpa

[BUG] rime-posframe-properties 配置不成功

问题描述

rime-posframe-properties 配置不成功。

Emacs中的配置

(use-package! rime
  :bind
  (:map rime-mode-map
   ("C-`" . 'rime-send-keybinding))
  :custom
  (default-input-method "rime")
  (rime-librime-root (concat doom-emacs-dir "librime/dist"))
  (rime-user-data-dir "~/Library/Rime")
  (rime-show-candidate 'posframe)
  (rime-posframe-properties
   (list :background-color "#444444"
         :foreground-color "#eeeeee"
         ;; :font "WenQuanYi Micro Hei Mono-14"
         :internal-border-width 15))
  ;; (rime-disable-predicates
  ;;  '(rime-predicate-evil-mode-p
  ;;    rime-predicate-after-alphabet-char-p
  ;;    rime-predicate-prog-in-code-p))
  (rime-translate-keybindings
   '("C-f" "C-b" "C-j" "C-k" "C-g" "<left>" "<right>" "<up>" "<down>" "<prior>" "<next>" "<delete>"))
  (rime-posframe-style 'vertical)
  (mode-line-mule-info '((:eval (rime-lighter))))
  (rime-inline-ascii-trigger 'shift-l)
  :config
  (set-face-attribute 'rime-default-face nil :foreground "#eeeeee" :background "#444444"))

复现方式(安装遇到问题时省略)

测试发现,rime-posframe-properties 第一次加载的时候是直接读取包默认的 rime-default-face的 background 和 foreground,即使加载后再配置,通过以下方法配置或者 use-package 也不生效。

 (setq rime-posframe-properties
   (list :background-color "#444444"
         :foreground-color "#eeeeee"
         ;; :font "WenQuanYi Micro Hei Mono-14"
         :internal-border-width 15)
 (set-face-attribute 'rime-default-face nil :foreground "#eeeeee" :background "#444444")

是否可在 emacs -Q 中复现

是/否

截图

Screen Shot 2020-06-25 at 11 38 58 AM

环境信息

  • 操作系统:macOS 10.13.6
  • Emacs版本:26.3 doom emacs
  • Librime版本:1.5.3
  • Librime安装方式:
  • 安装方式:

直接下载编译好的 Release 。

wget https://github.com/rime/librime/releases/download/1.5.3/rime-1.5.3-osx.zip
unzip rime-1.5.3-osx.zip -d ~/.emacs.d/librime
rm -rf rime-1.5.3-osx.zip

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.