家人们,我最近糊了个 eee.el ( Extend Emacs with External tui applications)
将 Emacs 和 优秀的 tui 应用结合起来,这样我就可以做到这种动作流:
- Emacs 异步地启动一个终端应用(比如是 wezterm)
- 在 wezterm 中启动 eee.el 定义好的 tui 应用,比如 yazi, ripgrep, fzf, lazygit
- 在 yazi 中 搜索/预览文件,按 Enter 后,yazi 告诉 Emacs 要打开哪个文件, 跳转到哪
- Emacs 执行 callback, 打开我刚刚在 yazi 里指定的目标文件
可以在上面的 github 仓库中看到我的录屏示例。
大家想要 将什么 tui 应用加进来?想要有什么动作流?欢迎提 issue/pr, 我看到之后会加进来的。
18 个赞
GUI,TUI 应该都能用。
视频示例中我用的是 GUI 的 Emacs
我都是在beepy下用nmtui,bluetui,cmus之类的
大佬这个插件确实厉害啊, 相当于NeoVim能用的终端工具, 都可以通过这个无边框的终端来曲线救国呀, 思路了得, 我手动点个赞。
1 个赞
大佬,这咋玩啊?Mac下装了之后,ee-rg:
[10:44:08] ee-rg get:
[10:44:16] ee-rg get:
我想做一个vterm版本的shell-command
,让所有命令(无论交互或非交互)都可以在vterm中运行。但是只靠emacs无法做到阻塞vterm-process
同步获取输出,也无法预知输出的格式(例如,是否支持管道信号,是否需要过滤特殊字符)。大佬能否指点一二?
我当时就是觉得 Emacs 内置的 vterm 速度太慢了,才想以“启动 外部支持 GPU加速的 终端来运行 tui 命令” 的方式来 启动 yazi, ripgrep, fzf 等等 tui apps 的。
不太清楚 在 vterm 下应该怎么搞,试试 管道通信 吧。[思考]
membrane看上去跟eaf很像,对我来说太重了,我不想把它作为一个UI组件,而是希望有一个最小方案作为原来的shell-command
的替代。
vterm的速度应该还好,但是使用外部终端的确非常炫酷!
我比较关注的是fzf
这类本身在终端里已经实现了复杂交互的应用如何无缝移植到emacs中。终端中的交互依赖于pty程序对各种控制序列的支持,vterm使用vterm-filter
函数对收到的字节做转译,这个过程本身是异步的。如果希望同步交互就需要对emacs进行阻塞,但是我没有找到合适的阻塞点,因为在vterm中运行的命令与emacs并无直接关联。一种方案是借助第三方的锁,例如,用一个文件锁阻塞emacs,然后在命令完成的时候,用脚本或者钩子释放锁。或者考虑做一个server,但这就走得太远了。
Shell-Command cloel 就够了, 你在 Clojure 外部进程中调用 Shell 子进程, 由 Clojure 处理 Shell 字进程的过程, 这样完全就不用卡 Emacs
但是如果是 Terminal 就需要一个图形的终端模拟器来跑终端程序的界面。
如果有第三方的协助自然是可以做的。但我想试图回避这种情况,目前我的结论是很难,至少vterm做的太少了,shell的支持也太少了。
在我看来,membrane试图解决的是一个更一般的问题:如果我们想把一种交互方式从一个shell移植到另一个shell,要做哪些必要的工作?这样的工作对什么样的shell可以普遍适用?这个问题很大,思考这样的问题让我甚至想一棍子打死emacs 。