English | 简体中文
EAF is a GUI application framework that revolutionizes Emacs graphical capabilities to ultimately Live in Emacs.
EAF is an extensible framework, one can develop any Qt5 application and integrate it into Emacs.
|Image Viewer||Video Player|
|File Sender||File Receiver|
|Air Share||Org Previewer|
|Terminal Emulator||RSS Reader (Integrated with Elfeed)|
|Aria2 Download Manager||Mind Map|
git clone --depth=1 -b master https://github.com/manateelazycat/emacs-application-framework.git ~/.emacs.d/site-lisp/emacs-application-framework/
master-full if you cannot properly use
Alternatively, you can use a Quelpa recipe
(quelpa '(eaf (:fetcher github :repo "manateelazycat/emacs-application-framework" :files ("*"))))
cd emacs-application-framework chmod +x ./install-eaf.sh ./install-eaf.sh
load-path, then add the following to
(add-to-list 'load-path "~/.emacs.d/site-lisp/emacs-application-framework/") (require 'eaf)
or, if you use use-package, you can use the following sample configuration for your convenience.
(use-package eaf :load-path "~/.emacs.d/site-lisp/emacs-application-framework" ; Set to "/usr/share/emacs/site-lisp/eaf" if installed from AUR :custom (eaf-browser-continue-where-left-off t) :config (eaf-setq eaf-browser-enable-adblocker "true") (eaf-bind-key scroll_up "C-n" eaf-pdf-viewer-keybinding) (eaf-bind-key scroll_down "C-p" eaf-pdf-viewer-keybinding) (eaf-bind-key take_photo "p" eaf-camera-keybinding) (eaf-bind-key nil "M-q" eaf-browser-keybinding)) ;; unbind, see more in the Wiki
Packages listed as Core are mandatory for EAF to work, whereas other packages are optional - install if you want to use corresponding EAF Application.
|python-pyqt5, python-pyqt5-sip||Core||Essential GUI library|
|python-pyqtwebengine||Core||Chromium based web rendering engine|
|wmctrl||Core||Activate Emacs window input focus|
|python-pymupdf||PDF Viewer||PDF rendering engine|
|python-grip||Markdown Previewer||Markdown rendering server|
|python-qrcode||File Sender, File Receiver, Airshare||Render QR code pointing to local files|
|python-pyinotify||Mermaid||Monitor *.mmd file change status|
|python-markdown||Mermaid||Covert markdown format to mermaid html format|
|nodejs||Terminal||Communicate between browser and local TTY|
|aria2||Browser||Download files from the web|
|libreoffice||Doc Viewer||Convert doc file to pdf|
|filebrowser-bin||File Browser||Share files between computer and smartphone|
|HTML Email Renderer||
|MS Office Viewer||
M-x bookmark-set(defaulted to
C-x r m) and
M-x bookmark-bmenu-list(defaulted to
C-x r l).
It is highly suggested to read the Wiki first before using EAF.
Wiki consists of documentations on:
There also are some helpful tips to make EAF work with Docker, Helm, etc.
EAF implements three major functionalities:
Learn more from the Wiki!
Both projects are similar in terms of interface, but they are two completely different projects with different goals in mind. Sometimes one may find EAF is more suitable than EXWM, sometimes it's the other way around. Please do not meaninglessly compare them.
If you've figure them out, PRs are always welcome!
EAF confirms that the desktop environment or window manager you can work includes: KDE, GNOME2, GNOME3, Mate, Xfce, LXDE, I3, QTILE, Xpra.
We suspect there are some issues with how all the Window Managers implement their x11 protocols.
One workaround is to name of command
wmctrl -m to the elisp list
eaf-wm-focus-fix-wms. Fill an issue if it still doesn't work.
Please check the
*epc:server* buffer (it is invisible, find it using
C-b SPC), something is wrong on the Python side. Usually due to Python dependencies are not installed correctly.
If you're sure Python dependences are installed correctly, please create an issue with the
*epc:server* buffer content, it contains many clues that can help us locate the problem faster.
If you use EAF Markdown Previewer, to get consistent previewing, you need to access Github Personal access token site, fill something in "Token description" and click button "Generate token" to get your personal token. Then set the token:
(setq eaf-grip-token "yourtokencode")
Although Markdown Previewer works for the first few times by entering empty string when prompted, eventually it stops working and gives "GitHub Rate Limit Reached" error.
If you need to use proxy to access internet, one can configure the proxy settings.
(setq eaf-proxy-type "http") (setq eaf-proxy-host "127.0.0.1") (setq eaf-proxy-port "1080")
If you use Socks5 as local proxy, one can set proxy type with:
(setq eaf-proxy-type "socks5")
A list of other community packages that use EAF to enhance their graphical experiences!
If we missed your package, please make a PR to add it to the list.
If you encounter a problem with EAF, and it occured after pulling the latest commit, please check the Discussions page first.
For any other problems, please use
emacs -q and load a minimal setup with only EAF to verify that the bug is reproducible. If
emacs -q works fine, probably something is wrong with your Emacs config.
If the problem persists, please report it here.
Do you want to make Emacs a real "operating system"?
Do you want to live in Emacs more comfortably?
Do you want to revolutionize the capabilities of Emacs?
如果我的作品让你的生活充满快乐, 欢迎请我喝瓶啤酒, 哈哈哈哈
：Code submit frequency
：React/respond to issue & PR etc.
：Well-balanced team members and collaboration
：Recent popularity of project
：Star counts, download counts etc.