从今天开始,Emacs里面可以运行任何你想要的程序 (Linux & Windows & Mac & BSD)

有些PDF文件不标准, 比如《费曼物理学讲义》PDF头3页的扫描图片大小和mupdf获取的文档每页高度一致, 后面的所有页面都要比 mupdf 获取的页面少 31 像素。

这样就会导致 EAF PDF Viewer 计算页面高度会因为动态变化, 最终导致页面之间的分割线计算和连续滚动的坐标产生偏差。

这种动态页面内容的PDF导致的分割线错误已经在上周连续的5个补丁修复了。

动态PDF换页时因坐标偏差导致的抖动问题, 今天终于想明白了, 在补丁 We need adjust scroll offset if the actual height of the page is lowe… · emacs-eaf/eaf-pdf-viewer@358f361 · GitHub 中修复。

至此, 不管是标准的PDF还是扫描版PDF, 连续滚动都是丝滑体验, 不再会有坐标滚动偏差了。

建议大家更新一下。

4 个赞

EAF 文件管理器已经实现了 zip 文件预览功能。

有意思的是核心代码是 ChatGPT 教我的:

今天体验了一下人工智能教我写代码,确实比搜索引擎厉害多了。

相同的技术调研我估计要花几个小时各种对比不同的基础库,ChatGPT把调研的时间压缩到5分钟,我再花10分钟把代码实现了。

效率确实很高。

11 个赞

文件管理器增加了 cr2 批量转换成 jpg 文件的功能 Add new command convert_cr2_files · emacs-eaf/eaf-file-manager@7585229 · GitHub

核心的 imageio 库是 ChatGPT 告诉我的, 哈哈哈。

1 个赞

我旅游的时候经常会用商业地图来规划路径(看怎么走顺路), 但是目前商业地图都有20个地址的限制, 非常不方便。

所以, 我最近会用 EAF 开发一个交互式的地图规划软件出来, 昨天晚上简单设计了一下, 分享给大家。

8 个赞

eaf-map 已经可以根据输入的多个地址, 自动根据城市高速计算动态路径了。

再过段时间的开发, 就可以完全替代Google Map了。

3 个赞

EAF PDF Viewer 最近有大量更新:

  1. 支持反色时透明, 这样暗黑模式下看PDF, 背景色和Emacs主题一样,而不是黑色, 效果更好
  2. 支持 isearch 模式交互式全文搜索 PDF
  3. 大幅度改进反色算法, 解决了有些PDF图片无法保持不反色和水印反色后影响文字颜色等问题
  4. 支持外部浏览器打开PDF中的连接

平常经常用 EAF PDF Viewer 的同学可以更新一下, 显示效果更细腻, 操作更方便了。

4 个赞

商业地图对路径规划的数量有一个非常烦人的限制, 每次规划不能超过 20 个地址, 一旦旅游景点超过 20 个就非常麻烦。

毛主席说过, 自己动手, 丰衣足食。 花了几天调研了一下, 今天下午把主体功能全部实现了:

用法非常简单:

  1. 启动地图: eaf-open-map
  2. 添加地点: 按 a 键
  3. 删除地点: 按 d 键
  4. 排序地点: 按 x 键
  5. 保存地图: 按 s 键
  6. 打开地图: 按 o 键

全程全键盘操作, 非常非常方便。

开源技术方案参考:

  • 地图元素绘制: leaflet.js
  • 当前经纬地址: HTML5 Navigator GeoLocation
  • 地址名称搜索: geopy
  • 高速路径查询: http://router.project-osrm.org
  • 最优路径规划: python-tsp, numpy

全部源代码已经按照 GPL3 协议公开 eaf-map, Enjoy! :wink:

2 个赞

今天给EAF Browser增加了广告拦截的功能。

其实浏览器的广告拦截功能技术很简单:

  1. 找到浏览器引擎中流量拦截的 API: 以 Qt QWebEngine 为例, 其流量拦截 API 是 QWebEngineUrlRequestInterceptor
  2. 下载广告拦截规则: AdBlock-Plus 开源其广告拦截规则 easylist, 只用下载社区维护的广告规则即可
  3. 用正则拦截广告: 每次浏览器截获流量的时候, 都用正则去匹配一下 easylist 看看是不是广告, 是广告就直接 block 掉即可

比如下面是 PyQt6 的参考实现:

# 读取 easylist 规则, 传给 braveblock
with open(os.path.join(os.path.dirname(__file__), "easylist.txt")) as f:
    raw_rules = f.readlines()
    easylist_adblocker = braveblock.Adblocker(rules=raw_rules)

# QWebEngine 中主要通过 QWebEngineUrlRequestInterceptor 来实现浏览截获
class AdBlockInterceptor(QWebEngineUrlRequestInterceptor):
    def __init__(self, profile, buffer):
        QWebEngineUrlRequestInterceptor.__init__(self)
        profile.setUrlRequestInterceptor(self)
        self.buffer = buffer

    def interceptRequest(self, info):
        if self.buffer.enable_adblocker:
            # 获取当前截获的 URL 字符串
            url = info.requestUrl().toString()

            # 如果匹配广告规则, 调用 info.block 屏蔽广告
            if easylist_adblocker.check_network_urls(
                url=url,        # url 是截获的 URL
                source_url="",  # source_url 是广告发送的原始 URL, 一般不要设置, 避免降低广告匹配效果
                request_type="" # request_type 一般有 document, script, image 三种类型, 空就是所有类型都匹配
                ):

                # print("Block Ad: ", url)
                info.block(True)

# 把广告拦截器挂到 QWebEngineProfile 中
self.interceptor = AdBlockInterceptor(self.profile, self)

如果设置好了后, 可以打开 Ad Blocker Test 这个广告测试页面测试效果。

EAF Browser 加了 5.5 万条广告规则后, 广告屏蔽的分数直接上了 90 分。

需要注意的是, 广告过滤的正则库实现效率一定要高, 要不是容易把浏览器卡住, 甚至卡住 Qt 的主线程, EAF 用的是 braveblock 这个哭, braveblock 是 ablock-rust 这个 Rust 库的 Python 绑定。

1 个赞

窗口的属性读写,取决于具体shell的协议制定,这些协议应该都是公开的。 x11应用可以使用Xwayland shell

并没有,zsbd

今天给EAF写了一个新的应用eaf-markmap

这个应用会自动把 Markdown 的内容实时渲染成思维导图, 左边是 Markdown 的文本内容, 右边是思维导图的实时预览, 因为 Emacs 的键盘效率非常高, 这样的双栏模式要比鼠标操作思维导图的效率高很多。

这个思维导图支持:

  1. 层级实时预览: 根据 Markdown 的标题和缩进自动调整节点层级
  2. 支持链接以及 Markdown 语法的链接标题
  3. 支持内联代码渲染
  4. 支持 Markdown 文字语法, 加粗、 斜体和划线效果

Enjoy! :wink:

5 个赞

EAF已经增加了对 Tailwindcss 的内在支持, 直接拷贝 eaf-vue-tailwindcss 文件就可以开发应用, 不需要自己配置 Taildwindcss.

1 个赞

最新的eaf-browser在Mac m1/m2启动报错

Traceback (most recent call last):
  File "/Users/xianbin/.doom.d/site-lisp/eaf/core/utils.py", line 52, in on_signal_received
    self._func(obj, *args, **kwargs)
  File "/Users/xianbin/.doom.d/site-lisp/eaf/eaf.py", line 155, in new_buffer
    self.create_buffer(buffer_id, url, module_path, arguments)
  File "/Users/xianbin/.doom.d/site-lisp/eaf/eaf.py", line 170, in create_buffer
    spec.loader.exec_module(module)
  File "<frozen importlib._bootstrap_external>", line 940, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/Users/xianbin/.doom.d/site-lisp/eaf/app/browser/buffer.py", line 32, in <module>
    import braveblock
ModuleNotFoundError: No module named 'braveblock'

具体原因是braveblock不支持mac m1/m2

现在只能先回滚到未添加广告拦截的版本

最新版已经更新了, 如果 braveblock 没法用也不影响正常浏览器上网, 只是没有广告过滤功能。

目前没有找到比 braveblock 性能更好的正则匹配库, 用性能较低的库, 广告过滤会影响浏览器上网性能。

EAF会根据 load-theme 的深浅模式自动切换颜色了, 所有的EAF应用我都打了补丁, 大家可以更新体验下。

2 个赞

在终端模式下不支持?

emacs终端无法获取准确的窗口像素坐标,所以目前还不行。

EAF在一些情况下, 比如从外部程序切换到EAF窗口的时候(Alt + Tab), 会导致第一次键盘事件会被EAF吃掉。

原因是 Alt + Tab切换回来, 连续触发了两次Qt事件 ShortcutOverride 和 KeyPress, 但是 ShortcutOverride 事件调用 eaf-activate-emacs-window 的过程中, 其实还没有那么快聚焦到 Emacs 窗口, 就会导致接下来的 KeyPress 事件从时间轴上是发生在 eaf-activate-emacs-window 之前的。

像这样 Alt + Tab → ShortcutOverride → KeyPress → eaf-activate-emacs-window 的发生顺序, KeyPress 发送到Qt窗口其实是没效果的, 必须先聚焦到 Emacs 窗口才知道单按键对应的什么命令。

所以, Alt + Tab 后的第一个键盘按键被EAF Qt窗口吃掉了。

解决原因是, 我今天详细看了事件日志: emacs-application-framework/view.py at 43e5a5242e040d2a80184f091d43f7550cb3cd7f · emacs-eaf/emacs-application-framework · GitHub

发现, 如果 Alt + Tab事件发生时, ShortcutOverride事件之前永远都有两个事件序列 [UpdateRequest、 KeyRelease], 也就是说, 我在 Alt + Tab 释放之前就执行一次 eaf-activate-emacs-window 提前聚焦Emacs就可以解决这个问题。

现在更新这个补丁后, 已经成功解决了 Alt + Tab 切换后 EAF 吃一次键盘事件的bug, 建议所有EAF的用户都更新一下。

1 个赞

有点好奇 eaf 接的是 chromium 的话,能 override ctrl-n 吗? 我想在 chrome 上也把 ctrl-n/t/w 改了,但是 vimium 和 surfingkeys 都不行

可以啊.因为所有按键都是emacs识别后当做字符串发给eaf的,在emacs端你按别的按键强制转换成ctrl+n,然后告诉eaf这就是ctrl+n就好了。

1 个赞