holo-layer: 一种全新的Emacs增强图层插件

简介

HoloLayer 是一个专为 Emacs 设计的多媒体图层插件, 它基于 PyQt 开发, 旨在显著增强 Emacs 的视觉体验。 插件提供了一系列的视觉效果增强功能, 包括现代化的窗口边框、 窗口跳转提示、 光标动画、 窗口截图、 透明浮动终端, 以及实时词典等等。 这些功能不仅让 Emacs 界面看起来更现代, 同时也确保了 Emacs 的运行性能不会受到影响。

安装

  1. 安装 Emacs 28 及以上版本
  2. 安装 Python 依赖: pip3 install epc sexpdata six PyQt6 PyQt6-Qt6 PyQt6-sip (ArchLinux 请用 pacman 来安装 PyQt6)
  3. git clone 下载此仓库, 并替换下面配置中的 load-path 路径
  4. 把下面代码加入到你的配置文件 ~/.emacs 中:
(add-to-list 'load-path "<path-to-holo-layer>")
(require 'holo-layer)
(holo-layer-enable)

第一个功能: 自然的窗口边框

Emacs本身的布局非常奇怪, 用 mode-line 来进行上下分割, 左右用 fringe 来区分, Emacs Window 本身是没有 border 的概念的, 导致如果要实现一像素的 window border 非常麻烦, 即使靠不同元素拼凑也很丑陋。

今天利用PyQt置顶透明窗口以及python-bridge框架实现了一个多媒体图层, 可以完美的实现窗口边框, 具体效果如下:

这张图从上到下依次是:

  1. sort-tab: 只在顶部显示标签栏, 不会因为分屏浪费纵向空间
  2. 中间: 窗口分屏 + holo-layer 实现的窗口边框
  3. 底部: 完全隐藏 mode-line, 用 holo-layer 来实现完美1像素和 minibuffer 的分割(Emacs的mode-line最小只能实现3像素的分割线, 很丑陋)
  4. 最底部: awesome-tray

其他功能

因为 holo-layer 本身具备多媒体绘制和多线程的能力, 它可以实现很多现代化的图形效果, 而不会影响Emacs性能, 我简单举几个例子:

  1. 顶部标签栏: 用Qt可以绘制出像 VSCode 那样的现代风格标签栏, 完美的图标对齐
  2. 光标动画: 比如前几个月大家讨论NeoVim的流畅的光标动画, holo-layer 的技术实现起来非常轻松
  3. 浮动半透明终端: 这个可以让 holo-layer 动态调用 eaf-pyqterminal 的代码, 中间浮动的同时保持终端半透明, 半透明的时候文字清晰显示
  4. 写代码的时候: 右下角可以悬浮显示一个网页小视频、 摄像头画面、歌词滚动显示、甚至是AI助手动画等
  5. 实时词典: 自动分析Emacs空白区域, 在空白区域显示光标实时词典, 这样就不用按键查词典, 相对于Emacs内置的 overlay 的好处是, 不会因为插件代码有bug而导致 overlay 污染用户代码
  6. 其他脑洞

holo-layer 技术原理已经实现了, 没事慢慢折腾吧, 这个插件弄完, 基本上 VSCode 和 Neovim 可以实现的很多特效, Emacs都可以毫无障碍的实现。

39 个赞

看起来非常不错非常有潜力!

我尝试在 macOS 上安装,但是出现了 “Python” 崩溃的提示,这是因为 holo-layer 目前还不支持 macOS 吗?

macOS现在应该没法直接用 因为用的showFullScreen去创建透明窗口 但是在mac这个窗口就会跑到另一个screen了

这个好啊, 感谢大佬的工作

只是具备的这个能力,还没有实现

https://manateelazycat.github.io/2023/07/07/emacs-overlay/ :grinning: 这么快。

Visual Studio Emacs

1 个赞

我提了个pr 现在应该能在macos上用 不过只能在emacs的窗口模式下

这个果冻光标,@kongds 大佬已经实现了。

请教一下 holo-layer 这样子的东西是怎样借用外部工具实现的?emacs 是在什么地方开了洞从而允许 pyqt 介入来绘制 emacs 的图形界面的?

目前对 emacs 的了解仅限于 elisp 的 API、对于GUI编程不甚了解,感谢赐教!

holo-layer整体架构和eaf原理差不多,只是用透明窗口替代eaf应用窗口。

所有特效都是在透明pyqt窗口中实现,只是这个pyqt窗口不响应鼠标和键盘事件,只接受emacs传过来的数据(比如窗口和光标信息)来绘制图形和动画。

因为透明所以给你用户感觉是画在emacs里面的。

这样的原理可以适用于所有emacs版本,对emacs本身得性能和功能都不会产生影响。

1 个赞

能灰度显示 inactive window 吗?就像iterm2的非活动pane一样

支持windows10吗(29.1),按步骤安装后,jelly光标,border颜色,都没起作用,而且mode-line不见了

(add-to-list 'load-path "d:/work/holo-layer")
(require 'holo-layer)
(setq holo-layer-enable-cursor-animation t)
(holo-layer-enable)

*holo-layer*

requestActivate() called for QWidgetWindow(0x2131a2f1990, name=“HoloWindowClassWindow”) which has Qt::WindowDoesNotAcceptFocus set. requestActivate() called for QWidgetWindow(0x1793d953350, name=“HoloWindowClassWindow”) which has Qt::WindowDoesNotAcceptFocus set.

这个很容易就能实现

4 个赞
(add-to-list 'load-path "d:/work/holo-layer")
(setq holo-layer-enable-cursor-animation t)
(require 'holo-layer)
(holo-layer-enable)

顺序反了


modeline消失是 这行 的效果,去掉就行了

灰度正常elisp插件就可以做到,网上可以搜索一下

应该是windows flag要调整下,但是我个人不用WINDOWS,现在没办法测试

mode-line 隐藏, 我添加了一个选项 Add option holo-layer-hide-mode-line. · manateelazycat/holo-layer@13d272e · GitHub 默认禁用。

右上角加了一个查单词的功能, 这样可以实时显示翻译, 懒的查还要等一下, 不知道的单词往右上角望一下就好了

2 个赞

这个支持Windows吗?刚试了下似乎没有效果,也不知道是不是我使用方法不对。我之前写过一个org mode用的GLSL代码块,感觉用上这个可能能够支持动画。

windows要找社区开发者支持,我手里没windows。

是的,这个可以跑OpenGL和网页代码。