eee.el: 将 Emacs 和优秀的 tui 应用结合起来

家人们,我最近糊了个 eee.el ( Extend Emacs with External tui applications)

将 Emacs 和 优秀的 tui 应用结合起来,这样我就可以做到这种动作流:

  1. Emacs 异步地启动一个终端应用(比如是 wezterm)
  2. 在 wezterm 中启动 eee.el 定义好的 tui 应用,比如 yazi, ripgrep, fzf, lazygit
  3. 在 yazi 中 搜索/预览文件,按 Enter 后,yazi 告诉 Emacs 要打开哪个文件, 跳转到哪
  4. Emacs 执行 callback, 打开我刚刚在 yazi 里指定的目标文件

可以在上面的 github 仓库中看到我的录屏示例。

大家想要 将什么 tui 应用加进来?想要有什么动作流?欢迎提 issue/pr, 我看到之后会加进来的。

18 个赞

多年前就这么想过,点赞

1 个赞

eee.el 是否只能用于 TUI emacs?

GUI,TUI 应该都能用。 视频示例中我用的是 GUI 的 Emacs

我都是在beepy下用nmtui,bluetui,cmus之类的

:call_me_hand: :call_me_hand: :call_me_hand: :call_me_hand: :call_me_hand: :call_me_hand: :call_me_hand: :call_me_hand: :call_me_hand: :call_me_hand: :call_me_hand: :call_me_hand:预览图片,视频啥的感觉很实用,如果是纯代码文本啥的,习惯的工作流,还是直接搜索多个关键字,用consult啥的很方便。

看了一下录屏,非常炫酷啊,厉害👍

想问下视频中的 Emacs 主题配色

大佬这个插件确实厉害啊, 相当于NeoVim能用的终端工具, 都可以通过这个无边框的终端来曲线救国呀, 思路了得, 我手动点个赞。

1 个赞

大佬,这咋玩啊?Mac下装了之后,ee-rg:

[10:44:08] ee-rg get: 
[10:44:16] ee-rg get: 

我想做一个vterm版本的shell-command,让所有命令(无论交互或非交互)都可以在vterm中运行。但是只靠emacs无法做到阻塞vterm-process同步获取输出,也无法预知输出的格式(例如,是否支持管道信号,是否需要过滤特殊字符)。大佬能否指点一二?

我初步怀疑 rg 命令不在你的 PATH 中?

cloel 配合这个 GitHub - phronmophobic/membrane.term: A terminal emulator in pure clojure

应该可以

1 个赞

我当时就是觉得 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 :dog: