有些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 个赞
committed 10:48AM - 12 Feb 23 UTC
EAF 文件管理器已经实现了 zip 文件预览功能。
有意思的是核心代码是 ChatGPT 教我的:
今天体验了一下人工智能教我写代码,确实比搜索引擎厉害多了。
相同的技术调研我估计要花几个小时各种对比不同的基础库,ChatGPT把调研的时间压缩到5分钟,我再花10分钟把代码实现了。
效率确实很高。
11 个赞
我旅游的时候经常会用商业地图来规划路径(看怎么走顺路), 但是目前商业地图都有20个地址的限制, 非常不方便。
所以, 我最近会用 EAF 开发一个交互式的地图规划软件出来, 昨天晚上简单设计了一下, 分享给大家。
8 个赞
eaf-map 已经可以根据输入的多个地址, 自动根据城市高速计算动态路径了。
再过段时间的开发, 就可以完全替代Google Map了。
3 个赞
EAF PDF Viewer 最近有大量更新:
支持反色时透明, 这样暗黑模式下看PDF, 背景色和Emacs主题一样,而不是黑色, 效果更好
支持 isearch 模式交互式全文搜索 PDF
大幅度改进反色算法, 解决了有些PDF图片无法保持不反色和水印反色后影响文字颜色等问题
支持外部浏览器打开PDF中的连接
平常经常用 EAF PDF Viewer 的同学可以更新一下, 显示效果更细腻, 操作更方便了。
4 个赞
商业地图对路径规划的数量有一个非常烦人的限制, 每次规划不能超过 20 个地址, 一旦旅游景点超过 20 个就非常麻烦。
毛主席说过, 自己动手, 丰衣足食。 花了几天调研了一下, 今天下午把主体功能全部实现了:
用法非常简单:
启动地图: eaf-open-map
添加地点: 按 a 键
删除地点: 按 d 键
排序地点: 按 x 键
保存地图: 按 s 键
打开地图: 按 o 键
全程全键盘操作, 非常非常方便。
开源技术方案参考:
全部源代码已经按照 GPL3 协议公开 eaf-map , Enjoy!
2 个赞
今天给EAF Browser 增加了广告拦截 的功能。
其实浏览器的广告拦截功能技术很简单:
找到浏览器引擎中流量拦截的 API: 以 Qt QWebEngine 为例, 其流量拦截 API 是 QWebEngineUrlRequestInterceptor
下载广告拦截规则: AdBlock-Plus 开源其广告拦截规则 easylist , 只用下载社区维护的广告规则即可
用正则拦截广告: 每次浏览器截获流量的时候, 都用正则去匹配一下 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 个赞
tas123
2023 年2 月 25 日 02:10
2590
窗口的属性读写,取决于具体shell的协议制定,这些协议应该都是公开的。
x11应用可以使用Xwayland shell
今天给EAF 写了一个新的应用eaf-markmap
这个应用会自动把 Markdown 的内容实时渲染成思维导图, 左边是 Markdown 的文本内容, 右边是思维导图的实时预览, 因为 Emacs 的键盘效率非常高, 这样的双栏模式要比鼠标操作思维导图的效率高很多。
这个思维导图支持:
层级实时预览: 根据 Markdown 的标题和缩进自动调整节点层级
支持链接以及 Markdown 语法的链接标题
支持内联代码渲染
支持 Markdown 文字语法, 加粗、 斜体和划线效果
Enjoy!
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终端无法获取准确的窗口像素坐标,所以目前还不行。
committed 02:59PM - 22 Mar 23 UTC
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 个赞