如何设置 company-mode 的 auto completion 候选词的字体为 fixed-pitch?

Hello,最近想把 Org mode 正文、标题的字体设置成 variable-pitch,更多一点『文档』的感觉, 而让 code、table 等部分还是保持 fixed-pitch。

我找到了这个 package:mixed-pitch。其实就能够完全满足我的需求了,但只有一个地方很苦恼:开启 mixed-pitch-mode 之后,company 的 auto completion 的候选词变得乱七八糟。

不知道是不是 company auto-completion 的这个部分也变成了 variable-pitch 所导致的,或者有没有什么办法能够把这个部分也加入到 mixed-pitch 的 mixed-pitch-fixed-pitch-faces 里呢?

company_auto-completion

換成用 child frame 的 corfu。

用company-box或者company-posframe

1 个赞

对,我也发现了,原来 mixed-pitch GitLab 页面下面就有说……谢谢!现在完全 OK 了。

其实并没有完全解决,company-box 感觉不是很好用,auto-completion 的候选词背景框老是适配不完善,要么大要么小,没有适当填充到所有候选词。而且时不时还会遮挡住光标所在的地方。scroll bar 也太粗,并且在往下滚动选词的时候,时不时从贴在右边的状态往左跳一下。还是 company-posframe 比较好用。

如果你的目的只是想要在 org-mode 里有 variable-pitch 的话,我觉得你不应该用 mixed-pitch 这个包。它把事情搞复杂了,用 face-remap 有点违背初衷,也很可能是造成 company 出问题的原因。导致为了用它还要拖家带口的搬其他的包进来,不太值得 (edit: company 要配合 org 的话,company-posframe 还是有必要的)

分享一个我自用的 org 文档化的简单方案:

(defvar my-fixed-font "Victor Mono"
  "Fixed pitch font.")
  
(defvar my-variable-font "Sarasa Mono SC"
  "Variable pitch font.")

(defun my-org-font-setup ()
  "Setup variable-pitch fonts for `org-mode'."
  (interactive)
  (variable-pitch-mode)
  (let ((variable-pitch `(:font ,my-fixed-font))
        (fixed `(:font ,my-variable-font)))
    (custom-theme-set-faces
     'user
     `(org-level-1 ((t (,@variable-pitch :height 1.5))))
     `(org-level-2 ((t (,@variable-pitch :height 1.4))))
     `(org-level-3 ((t (,@variable-pitch :height 1.3))))
     `(org-level-4 ((t (,@variable-pitch :height 1.2))))
     `(org-table ((t (,@fixed))))
     `(org-verbatim ((t (,@fixed))))
     `(org-formula ((t (,@fixed))))
     `(org-code ((t (,@fixed))))
     `(org-block ((t (,@fixed)))))))
     
(add-hook 'org-mode-hook #'my-org-font-setup)

参考: https://github.com/alexluigit/emacs-grandview#org-mode

2 个赞