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

我没有用过 pgtk 版本的 Emacs, 上面的补丁是我根据EAF原理盲写的一个补丁。

这个补丁的意思是,当EAF发现 Emacs处于 Wayland native (也就是大家说的 pgtk 版本)的环境下,会使用和 macOS 同样的策略:“Emacs聚焦的时候显示EAF窗口,Emacs失去焦点时隐藏EAF窗口”, 虽然不如 X11 和 XWayland 环境下多进程粘贴那么完美,但是日常用应该是没啥问题的。

用 pgtk 版本的同学欢迎试用,也欢迎反馈问题。

1 个赞

@manateelazycat 大佬,能不能看看这是个什么问题?

Traceback (most recent call last):
  File "/home/dn/.emacs.d/site-lisp/emacs-application-framework/core/utils.py", line 61, in on_signal_received
    self._func(obj, *args, **kwargs)
TypeError: EAF.new_buffer() takes 5 positional arguments but 6 were given
Traceback (most recent call last):
  File "/home/dn/.emacs.d/site-lisp/emacs-application-framework/core/utils.py", line 61, in on_signal_received
    self._func(obj, *args, **kwargs)
  File "/home/dn/.emacs.d/site-lisp/emacs-application-framework/eaf.py", line 238, in update_views
    view = View(self.buffer_dict[buffer_id], view_info)
KeyError: 'd8c4-0227-39ab-a304-707b-ef7a-49a0'

emacs-version GNU Emacs 27.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.27, cairo version 1.17.4)

如果通过M-x运行eaf-open打开pdf,是能打开pdf的。如果是ebib界面,通过f调用,就报上面的错误。多次重启emacs,又能正常工作了。

很魔幻。


知道是什么问题了。pdf的路径如果是绝对路径就报上面的错误。改成相对位置,就能正常使用了。(不过原来是都能打开的。很奇怪。)

我也会遇到这个问题,你有稳定重现的方式吗?如果能稳定重现的话,我就可以修,谢谢。

;;; init.el --- Description -*- lexical-binding: t; -*-

;;; Commentary:
;;
;;; Code:
;;
(add-to-list 'load-path "~/.emacs.d/site-lisp/emacs-application-framework")
(require 'eaf)
(require 'eaf-pdf-viewer)

(add-to-list 'load-path "~/.emacs.d/packages/ebib")
(add-to-list 'load-path "~/.emacs.d/packages/parsebib")

(require 'ebib)
(setq ebib-preload-bib-files '("~/ref.bib") ;;这给出bibtex文件
      ebib-file-search-dirs '("~/pdf") ;;这给出bibtex文件中pdf所在的文件夹。
      ebib-index-columns '(("Entry Key" 20 t) ("Year" 6 t) ("Author/Editor" 40 nil) ("Title" 50 t))
      ebib-file-associations '(("ps" . "gv")))

ref.bib的内容如下,要求bibtex中的key要和pdf的文件名一样。把相应的pdf文件放到/home/xxx/pdf下。

@article{12345,
	title = {Concrete {{Confinement Using Carbon Fiber Reinforced Polymer Grid}}},
	author = {{A.P. Michael H.R. Hamilton III} and Ansley, M H and A. P. Michael H.R. Hamilton, I I I and Ansley, M H},
	year = {2007},
	journal = {Frprcs-7},
	pages = {991--1010},
	file = {/home/xxx/pdf/12345.pdf}
}

如果file = {/home/xxx/pdf/12345.pdf},打开emac后M-x运行ebib,会报下面的错误

Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway.
Traceback (most recent call last):
  File "/home/dn/.emacs.d/site-lisp/emacs-application-framework/core/utils.py", line 61, in on_signal_received
    self._func(obj, *args, **kwargs)
TypeError: EAF.new_buffer() takes 5 positional arguments but 6 were given
Traceback (most recent call last):
  File "/home/dn/.emacs.d/site-lisp/emacs-application-framework/core/utils.py", line 61, in on_signal_received
    self._func(obj, *args, **kwargs)
  File "/home/dn/.emacs.d/site-lisp/emacs-application-framework/eaf.py", line 238, in update_views
    view = View(self.buffer_dict[buffer_id], view_info)
KeyError: 'c1eb-61d6-64f9-cd4c-5742-3405-0be1'
Traceback (most recent call last):
  File "/home/dn/.emacs.d/site-lisp/emacs-application-framework/core/utils.py", line 61, in on_signal_received
    self._func(obj, *args, **kwargs)
  File "/home/dn/.emacs.d/site-lisp/emacs-application-framework/eaf.py", line 238, in update_views
    view = View(self.buffer_dict[buffer_id], view_info)
KeyError: 'c1eb-61d6-64f9-cd4c-5742-3405-0be1'

如果如果file = {12345.pdf},打开emac后M-x运行ebib,就能正常使用。

我调试了一下,ebib 你在调用 ebib-view-file 命令的时候,有时候传递给 find-file 的不是一个 string, 而是一个 list.

正常的 EAF find-file 应该是 eaf-buffer-id /home/andy/pdf/12345.pdf module-path 的形式来打开文件,你上面报错的时候,我看到 ebib 传递给 EAF 的是 eaf-buffer-id Symbol('#') ['/home/andy/pdf/12345.pdf', 0, 24, [Symbol("ebib--xref"), []]], module-path 这种奇奇怪怪的路径。

我平常不用 ebib, 你以前没有问题,现在有问题,也许是你更新 ebib 导致的问题?

@Jousimies 我经常会遇到 View KeyError 这个错误,但是和你说的这个问题不一样,感觉是 ebib 那边的问题。

因为EAF这边主要是对 find-file 做了 advanced, 只要 ebib find-file 不要传递奇奇怪怪的字符串, EAF 都应该可以正常打开文件。

EAF的界面是被单独分割出来了吗?


在这种情况下,EAF会挡住所有除Emacs以外的程序

你啥桌面环境?emacs什么版本?

他用的是Windows

Archlinux KDE Emacs29

windows不应该啊,EAF可以实现windows跨进程粘贴

你是更新到最新版才发生的吗?之前没有?

更新后才有的(我最近在重构我的配置代码,但有关EAF的代码我是照搬过来的),之前没有

我重装了EAF,不解决问题

你emacs29下 window-system 这个变量是啥值?

是pgtk。

那你的 KDE 是跑在 Wayland native 下的?

我运行了env | grep -i wayland 但输出为空。

应该不是吧

我最近更新了对 Wayland native 支持,让 pgtk 分支可以把窗口置顶来用。 但是感觉只判断 (eq window-system 'pgtk) 会把 xwayland 的情况误杀

1 个赞

你试一下 echo $XDG_SESSION_TYPE 输出啥?