最初因为市场上许多笔记软件无法提供足够的定制化选项,我感到不满。在朋友的推荐下,我开始接触 Org mode,从而进入了 doomemacs 的领域。然而,对于缺乏 elisp 相关知识的新手来说,doomemacs 仿佛一个黑盒,难以定位问题以及个性化调整,且这与我“满足自身需求且尽可能减少配置”的理念相悖。因此,从 2022 年起,我开始构建自己的配置。
这套配置完全出于个人需求的考量而设计。如果能有幸得到他人的关注与使用,我将倍感欣慰。同时,若其中存在不足之处,欢迎随时指正。
使用脚本 emacs_setup.sh 进行安装时,若 patches 目录中的补丁与 emacs-plus 维护的补丁同名,则会覆盖原有补丁并修改其 sha 值。否则,这些补丁将作为 user_patch 被纳入 [email protected] 中进行管理。
只需执行 ./emacs_setup.sh 即可完成安装。如需安装 feature/igc 分支,只需添加参数 mps 。
与 emacs-plus 重复的 patches 在这里是因为我经常编译,就自己维护了。fix-window-role.patch 在 emacs@31 已经合并到上游了。
- cursor-animation.patch 相较于 neovide 等其他的光标动画,我更喜欢这个。最初由 @ksqsf 在 Emacs_CN Lite 轻聊版 中放出,@TakaObsid 完善后不再遮挡内容。
- ns-alpha-background.patch
- ns-mac-input-source.patch 经由 @georgealbert 整理提取,用于切换输入法。
使用 build-emacs-pgtk.sh 进行编译,这实际上是我自行维护的 PKGBUILD ,旨在简化编译与安装过程。
包管理使用的是 straight.el + setup.el,前者功能比较全面,可以 pin 到具体的 commits;后者相对简单,可以在此基础上自定义关键字,比如 :set-font(按 mode 定义不同的字体)。
:bind-into已经被淘汰,最好用(:with-map xxx-map (:bind "C-c x t" xxxx))的写法。:option已经被淘汰,用 Emacs 内置的setq和setopt。:file-match修改后,需要从(:match-file "\\.lua\\'")改为(:match-file "*.lua")。
- 默认字体:PragmataPro Mono
- 中文字体:LXGW WenKai Screen,fallback 字体:Jigmo fonts(CJK 全覆盖)。
- org-mode 字体:PragmataPro Liga
配置参考:
- Emacs Init: Setup Font
- Emacs, fonts and fontsets | idiocy.org
- 经验分享:emacs单独设置中文与英语的字体 - #34,来自 p1uxtar - Emacs-general - Emacs China
- Glyph Sets and Code Points · ryanoasis/nerd-fonts Wiki · GitHub
主题目前选用 rose-pine,Dashboard 选用 fork 修改后的 panel,mode-line 选用 doom-modeline。
所有条目都存入 pass 中,并通过启用 auth-source-pass-enable 自动读取。然而,对于自建的 GitLab, machine 的值必须采用 192.168.1.220:9081/api/v4 格式,这一信息无法直接存入 pass。因此,我更改了存储名称,并编写了 check-and-update-authinfo,将其自动读取并写入 .authinfo 中,从而实现配置过程的自动化。
ns-mac-input-source.patch 应用后可以原生支持切换输入法,主要是添加了 mac-input-source 方法。
- emacs-smart-input-source 如果检测到
mac-input-source就会才用该函数来切换输入法,代替 macism。 - 通过 Karabiner-Elements 映射
left_shift到f13,绑定后就可以通过left_shift切换输入法。
- 自 Sequoia 系统开始,系统增加了
CursorUIViewservice进程来显示输入法状态,经常会卡死导致内存占用。可以通过下面的命令彻底关闭。参考自 Reddit - Dive into anything。
sudo mkdir -p /Library/Preferences/FeatureFlags/Domain && sudo /usr/libexec/PlistBuddy -c "Add 'redesigned_text_cursor:Enabled' bool false" /Library/Preferences/FeatureFlags/Domain/UIKit.plist && sudo shutdown -r nowLaTeX 预览的场景不局限于 Emacs 当中,导出到 Web 时,一部分简单的用 MathJax,另一部分复杂的代码块(尤其是自定义关键字)则需要利用 org-babel 生成图片后嵌入文中(如下,GitHub 中 Raw 格式查看全部)。
Emacs 内的预览最初选择的是 xenops,后切换到 org-latex-preview,但由于下面的问题导致 org-babel 无法执行后放弃。
2024-03-08: tec/org-mode 版本中 org-latex-compile 改为异步生成 PDF,Inkscape 转换 PDF 为 SVG 时,PDF 还未生成,导致报错。相关参考如下。
- #28 Convention for Org mode functions to support org-async
- {Pre-PATCH} Overhaul of the LaTeX preview system
依旧有兴趣的可以安装 tec/org-mode 版本的 org,配置 org-latex-preview 进行尝试。
- 用 Homebrew 安装的 texlive,dvisvgm 包含在 texlive 当中,需要从
/Library/TeX/texbin/复制到/opt/homebrew/bin/。
gt.el 非常易于扩展,除了各种场景的翻译,我还用于 mastodon.el 的 toots 和 profiles 翻译,避免重复安装作者提供的 lingva.el(该包没提供 profiles 的翻译)。
我 fork 了项目做了些修改:
- 支持请求 header 自定义
- OpenRouter 等平台不支持
stream参数为 null,因此当stream为null则不纳入到入参当中。
- forge 的
forge-copy-url-at-point-as-kill可以复制当前文件的链接,当选择某行时,链接也会具体到某行,可以替代我用到 git-link 的功能。 - IDEA 中修改代码,也可以切换到 Emacs 用 magit 进行 git 操作, magit.sh 可以自动化这个过程。在 IDEA 中
Settings>Tools>External Tools中设置Program为magit.sh地址,并在Working directory中填入宏$ProjectFileDir$即可。(宏参考 Built-in IDE macros | IntelliJ IDEA Documentation)(原文地址:Launching Magit from IntelliJ IDEA - Dmitry Dolzhenko)