FiraCode 在 Emacs 配置 composition char table 后报 "Attempt to shape unibyte text" 怎么处理?
【免费下载链接】FiraCodeFree monospaced font with programming ligatures项目地址: https://gitcode.com/GitHub_Trending/fi/FiraCode
如果你在 Emacs 里按 FiraCode 文档的 "Using composition char table" 方法启用连字——即把composition-function-table相关 Lisp 配置放进.emacs——之后 Emacs 报出error in process filter: Attempt to shape unibyte text,项目文档针对这个报错给出了对应的处理办法:注释掉配置中的一行,并且文档特别说明了哪种用户可以用这种方式避开该问题。本文按文档原文整理触发配置、报错处理步骤,以及同一配置方法下文档列出的另外两个已知问题。
先确认触发报错的是哪份配置
distr/README.txt 的 Emacs 章节列出了四种启用连字的方式,从首选到次选排列,并明确要求 "Pick one!"——即只选用其中一种,不要叠加配置。其中第三种就是 composition char table 方法,文档要求把下面这份 Lisp 放进.emacs:
(when (window-system) (set-frame-font "Fira Code")) (let ((alist '((33 . ".\\(?:\\(?:==\\|!!\\)\\|[!=]\\)") (35 . ".\\(?:###\\|##\\|_(\\|[#(?[_{]\\)") (36 . ".\\(?:>\\)") (37 . ".\\(?:\\(?:%%\\)\\|%\\)") (38 . ".\\(?:\\(?:&&\\)\\|&\\)") (42 . ".\\(?:\\(?:\\*\\*/\\)\\|\\(?:\\*[*/]\\)\\|[*/>]\\)") (43 . ".\\(?:\\(?:\\+\\+\\)\\|[+>]\\)") (45 . ".\\(?:\\(?:-[>-]\\|<<\\|>>\\)\\|[<>}~-]\\)") (46 . ".\\(?:\\(?:\\.[.<]\\)\\|[.=-]\\)") (47 . ".\\(?:\\(?:\\*\\*\\|//\\|==\\)\\|[*/=>]\\)") (48 . ".\\(?:x[a-zA-Z]\\)") (58 . ".\\(?:::\\|[:=]\\)") (59 . ".\\(?:;;\\|;\\)") (60 . ".\\(?:\\(?:!--\\)\\|\\(?:~~\\|->\\|\\$>\\|\\*>\\|\\+>\\|--\\|<[<=-]\\|=[<=>]\\||>\\)\\|[*$+~/<=>|-]\\)") (61 . ".\\(?:\\(?:/=\\|:=\\|<<\\|=[=>]\\|>>\\)\\|[<=>~]\\)") (62 . ".\\(?:\\(?:=>\\|>[=>-]\\)\\|[=>-]\\)") (63 . ".\\(?:\\(\\?\\?\\)\\|[:=?]\\)") (91 . ".\\(?:]\\)") (92 . ".\\(?:\\(?:\\\\\\\\\\)\\|\\\\\\)") (94 . ".\\(?:=\\)") (119 . ".\\(?:ww\\)") (123 . ".\\(?:-\\)") (124 . ".\\(?:\\(?:|[=|]\\)\\|[=>|]\\)") (126 . ".\\(?:~>\\|~~\\|[>=@~-]\\)") ) )) (dolist (char-regexp alist) (set-char-table-range composition-function-table (car char-regexp) `([,(cdr char-regexp) 0 font-shape-gstring]))))前置条件:系统中已安装 Fira Code 字体。文档同一文件的 "Installing" 部分给出了各平台的安装命令,例如 macOS 用brew install --cask font-fira-code;配置中的(set-frame-font "Fira Code")依赖字体已就位才能生效。
处理 Attempt to shape unibyte text 报错
文档在该配置后的 Note 中写明:如果出现error in process filter: Attempt to shape unibyte text,该错误在 FiraCode 仓库的 issue #42 中有讨论;Emacs Cider 用户可以通过注释掉配置中的下面这一行来避开该问题:
;; (46 . ".\\(?:\\(?:\\.[.<]\\)\\|[.=-]\\)")对应操作就是在上面alist里找到字符码 46 的那条规则(定义以.开头字符的连字匹配模式),整行注释掉,保存.emacs。文档描述的预期结果是注释该行后可以避免这个报错,即 Cider 用户不再遇到Attempt to shape unibyte text;如果注释后问题依旧,文档给出的指向是 issue #42,那里有针对该错误的进一步讨论。
同一配置下的另外两个已知问题
文档紧跟着这条 Note 还列出两个与同一份配置相关的边界,均属于已知问题:
- 字符
45(即连字符-对应的字符码)在 macOS Mojave 上已知存在问题。文档只指出这一点,没有给出修改配置的办法,遇到时留意报错是否集中在-开头的连字上。 - 如果在使用 helm 时遇到问题,可以按文档给出的配置在 helm 中禁用连字:
(add-hook 'helm-major-mode-hook (lambda () (setq auto-composition-mode nil)))helm 这段配置针对的是 "having problems with helm" 的场景,不是 unibyte 报错的通用解法;只有在确实使用 helm 并遇到问题时才加入。
结果核对
- 处理完成的判断依据:注释掉字符码 46 那一行后,
error in process filter: Attempt to shape unibyte text不再出现。 - 报错原文、完整配置、issue #42 指向、字符 45 的 Mojave 问题和 helm 钩子均出自 distr/README.txt 的 Emacs 章节;四种启用方式互斥,配置时只保留 composition char table 这一份。
【免费下载链接】FiraCodeFree monospaced font with programming ligatures项目地址: https://gitcode.com/GitHub_Trending/fi/FiraCode
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考