强烈推荐的项目
emacs-application-framework
EAF使用了X11 XReparent技术和PyQt5实现了嵌入任意图形程序到Emacs的窗口中,并与Emacs现有生态形成协作,实现我多年Live in Emacs的小梦想。
Emacs的框架和历史包袱使其无法很好的支持多线程和多媒体应用,EAF这种无侵入的技术,在给Emacs带来多媒体能力的情况下,保留了Emacs Elisp现有的插件生态和黑客文化。
lsp-bridge
lsp-bridge 的目标是实现 Emacs 生态中性能最快的 LSP 客户端。
lsp-bridge 使用 Python 多线程技术在 Emacs 和 LSP 服务器之间构建高速缓存,在提供行云流水的代码补全体验的前提下,保证永远不会卡住 Emacs。
cloel
Cloel 是一个结合 Clojure 和 Elisp 的协同编程框架, 利用 Clojure 的生态和多线程能力来扩展 Emacs。
Cloel 利用 Clojure 的多线程和JVM生态来开发Emacs插件, 在解决性能问题的同时, 保证外部插件的体感也是 Lisp 风格。
deno-bridge
一款基于 Deno 运行时的编程框架, 使得 Emacs 可以使用 TypeScript/JavaScript 编写 Emacs 插件。
基于 deno-bridge, 我们可以在 Emacs 中执行 JavaScript 或 TypeScript 代码并且不需要修改 Emacs 的源代码。 它给 Emacs 带来了 强大的 TypeScript 生态工具和编程能力。
aweshell
基于eshell开发的终端管理器插件,包括Shell命令补全、ZSH风格提示符、底部固定终端、Fish风格最佳匹配建议、语法高亮Cat命令、命令状态提示等高级功能。现在是我最常用的终端插件。
blink-search
blink-search是一个多源搜索框架, 有helm的能力和ivy般的性能, 利用Python多线程技术,所有的搜索过滤都在Python端执行, Emacs只渲染搜索结果的可视区域和执行最终的命令, 所以 blink-search 应该是 Emacs 社区中搜索性能最快的搜索框架。
color-rg
原来一直使用color-moccur.el做项目智能重构工具,但是一直有很多小问题,在随州大银杏树旁写了color-rg.el,这个插件主要基于ripgrep实现了项目、目录和单文件的快速搜索,并集成了批量替换和快速过滤等方便的功能。每天我都极度依赖这个插件进行源码分析和重构工作。
fingertip
基于 treesit 生成的AST来实现语法结构编辑,比awesome-pair原理基础更坚固,适应的语言范围更广。
sort-tab
sort-tab相对于awesome-tab有两个优势:基于使用频率排序标签和更好的纵向空间利用率,我现在已经用sort-tab替换awesome-tab了。
holo-layer
holo-layer是一个利用PyQt和多线层技术构建的全息多媒体图层Emacs插件,通过holo-layer的Qt技术, 我们可以实现类似Neovide那样的果冻光标动效, 更加符合直觉的窗口边框, 实时翻译等惊人惊叹的效果, 将来甚至会实现现代化的标签栏和Org-Mode多媒体文档实时预览等效果。
mind-wave
mind-wave是基于ChatGPT开发的AI插件, 支持连续对话、快速翻译、文档润色、修复错别字、代码重构、增加代码注释、解释代码、网站或视频摘要等功能。
markmacro
markmacro灵活结合 Emacs 其他插件的编辑能力, 我们可以快速清洗数据成期望的格式, 提升我们日常的编程效率。 同时, 这个插件是基于键盘宏来实现的, 整个数据清洗的过程不管数据格式发生了怎样的变化, 都是用几个基础的函数来组合实现, 大大降低了心智负担。
awesome-tray
Emacs的Mode-Line太多冗余信息,其实日常用只需要光标位置、当前位置和模式、电源和时间状态。awesome-tray隐藏了Mode-Line,只把必备信息显示在Minibuffer右侧,既节省纵向代码阅读空间又不会影响Minibuffer正常消息显示。
one-key
one-key提供按键组的功能,一组自定义命令只占用一个全局按键,主要解决插件太多时全局按键不够用的问题。同时内置的菜单帮助系统可以在你不记得快捷键的时候, 通过 ? 按键给予必要的提示。
lazy-load
lazy-load主要通过define-key和autoload技术事先把快捷键和命令建立关联,在运行时通过按键动态加插件。因为每个插件的加载速度都在1秒之内完成,通过lazy-load技术可以实现1秒启动Emacs、减少不用插件的内存占用、动态加载插件的效果。我几百个插件启动速度最终可以控制在1秒内加载完毕。
python-bridge
EAF、lsp-bridge、mind-wave、blink-search等项目背后的支持技术, 我们可以通过python-bridge项目, 快速实现用Python来扩展Emacs的能力, 包括图形、浏览器和多线程等。
英语学习插件
popweb
基于浏览器技术开发的弹窗翻译插件,要比SDCV美观的得多,联网的时候是一个更好的方案。
insert-translated-name
作为一个中国程序员,世界上最难的事情不是写好一个算法,而是在纷繁的现实逻辑中取一个恰当的名称。这个插件会让你直接输入中文,按下空格自动翻译,因为它能够识别你是写文档还是某个编程语言的语境,基本上按了空格,变量、函数名和注释区域都可以直接生成对应的英文。
实用小插件
auto-save
我记得很多年前在成都写程序,因为停电导致写了几天的源代码全部丢失,而且Emacs默认的备份文件太不好用。随即写了这个自动保存插件,当手指头一松,Emacs会趁你思考的空隙自动保存文件,至此十多年期间再也没有丢过源代码。
thing-edit
我们经常要复制很多东西,比如符号、单词、文件名、链接、括号内内容、当前行、段落等内容,如果每个内容,我们都需要手动移动光标来选中开始和结束区域,效率会非常低。thing-edit.el提供了大量内置的复制和剪切命令,不用移动光标,只用调用响应的命令即可快速复制和剪切当前光标下的对象。每天使用上百次的必备插件。
move-text
简单直接,移动当前行或选中内容,快速进行上下移动,不用傻傻的粘贴复制,提高代码编写效率。
key-echo
Emacs本身的架构设计无法实现对修饰键(比如Shift、Ctrl、Alt、Win、Fn等)按键单独按下事件的绑定, Emacs的快捷键必须使用修饰键加其他按键组合起来才能调用。 key-echo这个插件通过对系统全局事件的监听, 实现了对修饰键单独按下事件进行绑定, 从而实现一些人性化的功能, 比如在任何Buffer按下Shift切换输入法, 单独按下Left Alt弹出搜索插件, 单独按下Right Alt实现Ctrl + g按键的映射。
duplicate-line
快速复制当前行和选中内容,特别在你要快速修改当前行,实验其他参数的时候,特别方便,新代码不行,还可以快速恢复旧代码。
open-newline
有时候,我们需要从当前行快速跳出,并在当前行上面和下面自动缩进后继续写代码,open-newline这个插件可以节省你大量跳到行尾按回车的时间,非常方便。
vi-navigate
在阅读代码时,VI类似的单按键要比Ctrl + n/Ctrl + p更加方便快捷,vi-navigate提供了临时进入只读状态模式,并用单按键进行光标操作,非常适合只想简单切换到只读模式阅读代码,又不想花巨大成本学习evil插件的同学。
grep-dired
我们经常有在项目文件中递归查找特定文件的需求,Emacs默认的grep插件是同步模式设计的,当项目非常大的时候,Emacs会卡住直到搜索完所有文件。这个插件通过异步模式设计,可以边搜索边显示,再大的文件都不会卡住Emacs。
instant-rename-tag
在Html编码时,经常有换Tag的需求,这个插件通过overlay的技术,进入重命名模式后,Tag的开始和结束标签可以同步更改,因为使用overlay技术,不会因为修改过程中语法结果的变化而导致重命名失败的问题,是同类功能中最稳定的一款插件。
delete-block
语法删除光标前后的单词,和Emacs内置的删除功能不同的是,支持骆驼风格的单词删除,比如C++/Java的函数和变量名字,有时候我们只想替换名字中的一部分单词,而不是把整个骆驼风格的名字给删除了。
watch-other-window
当我们分屏时,希望光标留在当前Buffer,同时通过快捷键来滚动另外一个窗口的内容进行阅读,这个插件的目标就是帮助我们提升这种场景下的效率的。
find-orphan
基于tree-sitter的AST,自动搜索所有函数名, 并用ripgrep自动在工程中搜索,最后告诉你所有孤立函数的列表,方便你快速删除无用代码。
css-sort
当我们自由风格的完成Web项目时,想对CSS代码进行重构时,这个插件就派上用场了,它不但可以一键排序CSS属性,还可以支持嵌套SCSS样式,10倍以上提升重构CSS/SCSS文件的效率。
smart-align
不用动光标,就可以快速把光标出上下行的代码按照赋值符号自动对齐的插件,写网页代码的时候非常方便。
wraplish
Wraplish是一个在 Unicode 与英文之间加上空格的 Emacs 插件, 使用 Python 多线程技术来分析 Emacs 的文本, 避免 Elisp 代码分析大文本时产生过多的 GC 对象卡住 Emacs。
cache-path-from-shell
Mac用户会经常使用 ```exec-path-from-shell``` 这个插件来加载二进制的路径,但是这个插件的效率比较差,如果多个地方使用就会大大增加Emacs的启动时间。cache-path-from-shell 这个插件通过缓存机制保证即使exec-path-from-shell被调用多次,也只执行一次,提升Mac用户的启动时间。
大量使用了lazy-load.el的技术来实现延迟加载和按键触发插件动态加载,几百个插件在1秒内启动完毕。
桌面应用
deepin-terminal
Vala和VTE编写的终端应用,作为第一款提供类似Chrome标签体验的终端模拟器,还提供包括任意分屏、远程登录管理、文件上传下载自动穿透、搜索引擎集成和主题套件等功能。得益于Vala的手感和C一样的运行效率,在添加很多功能的前提下,启动时间保持在200ms左右,运行速度非常快。
deepin-system-monitor
Qt5/C++编写的系统监视器,主要是把CPU、网络、磁盘放在一个标签中统一展示,不用来回切换,并且能够自动识别Chrome分组进程、Wine进程和FlatPak等特殊进程的信息收集和管理功能。
deepin-pyin-assistant
小朋友上小学一年级的时候,每天对我的灵魂拷问就是:“爸爸,这个词怎么写啊?”,花了一下午时间,利用讯飞的API和桌面显示技术,小朋友只用对着屏幕说话,就会在屏幕上显示正确的汉字和对应的拼音。
实验性插件
manatee
最早的目标是用Haskell配合Gtk2hs来实现的一个多媒体Emacs,来替换Emacs,当年止步于符合MVC的浏览器同步显示技术。
mrkeyboard
用Vala实现的,类似Manatee的项目,攻克了MVC浏览器同步显示技术。最后还是放弃了,因为像EAF那样嵌入Emacs是更好的思路和实现方法。
flex
利用动态overlay技术实现的flex文件语法高亮。
bison
利用动态overlay技术实现的bison文件语法高亮。
个人项目
lazycat-emacs
我个人的Emacs配置,主要使用 git submodule 进行插件管理,最朴实的Elisp配置方式,没有使用复杂的use-package语法。
大量使用了lazy-load.el的技术来实现延迟加载和按键触发插件动态加载,几百个插件在1秒内启动完毕。这个项目还包涵了我写的数百个小插件,我会定期把里面我积累的插件分离出来发布到github上,方便Emacs的同学单独使用。
lazycat-theme
我的极客风格的Emacs,主要特色是满屏幕的绿色,整体风格偏old-school风,喜欢doom-emacs主题的同学可能不适应,我换了很多主题还是换回来了,时间久了还是喜欢这种怀旧的感觉。
其他项目
hammerspoon-config
通过HammerSpoon把Mac变成一个平铺窗口管理器,具有快速分屏、快速启动和切换程序、自动切换不同应用输入法状态、自动管理代理等功能。用了很长一段时间,直到把MacBook的键盘敲坏两个,直接换回最皮实的ThinkPad和我钟爱的Linux。
html-to-word
基于ROR的后台转换工具,通过CHM格式,直接把带图片、表格和高级布局的网页直接转换成Word文档,我去朋友公司Tower.im打酱油的那段时间开发了Tower在线文档导出Office的功能。
不再开发的项目
lazy-search
很早开发的快速识别光标下单词并一键搜索跳转的插件,现在自己换成了 symbol-overlay 这个插件,这个插件不再继续维护。
snails
作为资深的Helm开发者,觉得Helm越来越臃肿,而且经常卡顿,加之异常讨厌ivy在minibuffer跳上跳下晃眼睛的设计。自己重新设计了类似VSCode的弹出式补全框架:集成了VSCode的交互行为、Helm多后端集成搜索、Ivy的速度,而且默认行为只有一个,输入关键字按回车,没有复杂的其他操作。blink-search的性能要比snails还要好很多。
nox
LSP (Language Server Protocol) 是目前非常流行的代码补全协议,nox利用LSP协议为多种编程语言提供代码语法补全、定义跳转和引用等功能,代码fork于eglot, 因为移除了大量无用和消耗性能的模块,nox是比eglot的性能好很多。自从开发了lsp-bridge,这个项目就没有必要继续维护了。
find-define
集成了 elisp-def、jedi、godef-jump、dumb-jump等插件对不同的编程语言提供源码跳转和快速返回的功能。目前功能已经被lsp-bridge这种更先进的技术替代,这个插件不再开发。
multi-term
Emacs最早也是最著名的终端插件,主要解决了多终端管理、底部固定终端和关闭后自动退出等问题,现在用的最多的是我的 aweshell.el 插件,遇到图形要求高的,就搭配EAF终端插件来使用。这个插件已经不再继续维护和开发了。现在我主要使用eaf-pyqterminal, 用PyQt绘制的,性能和兼容性更好。
awesome-pair
集成于 paredit.el,针对非Lisp环境,特别是Web环境和前端Vue.js增加了大量贴心的结构化编辑功能:比如标签属性结构化编辑、Vue.js多模式区域智能识别编辑。由fingertip替代,fingertip支持Emacs内置的treesit技术。
awesome-tab
tabbar.el默认的界面太丑而且难用,awesome-tab基于原版的tabbar.el进行了大量功能增强:包括按照项目和自定义规则分组、增加文件图标显示、标签外形美化等工作。现在由sort-tab替代,sort-tab根据标签使用频率排序,更实用。
sdcv
基于星际译王命令行工具开发的光标翻译软件,可以自动提取当前光标的单词或选中文字,并通过弹出菜单的形式显示翻译,英语学习翻译利器。现在由popweb替代,词典后端更多,界面更丰富。
grammatical-edit
基于 tree-sitter 生成的AST来实现语法结构编辑,比awesome-pair原理基础更坚固,适应的语言范围更广。由fingertip替代。
年代久远的项目
deb2po
一个自动从Deb提取po文件的小工具,专门用于2011年中文化项目,当时组织全国爱好者翻译了3000多款社区软件。