English | 简体中文
Emacs Application Framework (EAF) is a GUI application framework for Emacs that revolutionizes its multimedia and graphical capabilities to ultimately Live in Emacs.
EAF supports Linux, Windows, and MacOS.
Emacs, the extensible text editor, is more than 45 years old, older than most operating systems people use today, as old as the first UNIX system. During the 45 years of development, the brightest hackers from all over the world have been contributing their intelligence and imagination, together constructed the most comprehensive and rich ecosystem that you can find in any software to date.
If you are a hacker who works with numerous programming languages, who desires maximum freedom, extensibility and introspectivity into your tools, and into keyboard/text centrism, Emacs will be your best bet.
However, one of the greatest disadvantages of Emacs is how old it is. Emacs lacks performance as it doesn't have proper multithreading and modern graphical support that you can expect on many GUI applications today (such as IDEA or VSCode), resulting in the extensibility of Emacs to be limited when it shouldn't have to be.
The vision of the EAF project is that, while retaining the culture and the ecosystem of Emacs, use Python, Qt5, and JavaScript to extend Emacs' graphical capabilities, with the hope to ultimately Live in Emacs.
EAF is an extensible framework. It comes with a number of useful applications, and you can develop any Qt5 application and integrate it into Emacs.
Browser | Markdown Previewer (support Mermaid and PlantUML) |
---|---|
Image Viewer | Video Player |
---|---|
PDF Viewer | Camera |
---|---|
File Sender | File Receiver |
---|---|
Air Share | Org Previewer |
---|---|
Terminal Emulator | RSS Reader (Integrated with Elfeed) |
---|---|
Aria2 Download Manager | Mind Map |
---|---|
Jupyter | EAF Interleave |
---|---|
Music Player | System Monitor |
---|---|
- EAF talk & demo at EmacsConf2020, presented to you by MatthewZMD
- Homepage (Q&A included): https://emacsconf.org/2020/talks/34/
- Youtube link:
-
Download EAF
git clone --depth=1 -b master https://github.com/manateelazycat/emacs-application-framework.git ~/.emacs.d/site-lisp/emacs-application-framework/
Alternatively, you can use a Quelpa recipe
```Emacs-lisp
(quelpa '(eaf :fetcher github
:repo "manateelazycat/emacs-application-framework"
:files ("*")))
```
- Install EAF dependencies using
M-x eaf-install-dependencies
.
If you prefer to manually call the installation script in the terminal,
-
If you use GNU/Linux,
cd emacs-application-framework chmod +x ./install-eaf.sh ./install-eaf.sh
-
If you use Windows,
cd emacs-application-framework node ./install-eaf-win32.js
-
If you use macOS,
cd emacs-application-framework chmod +x ./install-eaf-mac.sh ./install-eaf-mac.sh
Feel free to inspect the install script yourself. An explanation of each dependency can be found at Dependency List.
- Install Elisp packages:
-
From here on, you can either add the full path to the EAF installation directory to your Emacs
load-path
, then add the following toinit.el
:(add-to-list 'load-path "~/.emacs.d/site-lisp/emacs-application-framework/") (require 'eaf)
Alternatively, if you use use-package, you can use the following sample configuration for your convenience.
```Elisp
(use-package eaf
:load-path "~/.emacs.d/site-lisp/emacs-application-framework" ; Set to "/usr/share/emacs/site-lisp/eaf" if installed from AUR
:init
(use-package epc :defer t :ensure t)
(use-package ctable :defer t :ensure t)
(use-package deferred :defer t :ensure t)
(use-package s :defer t :ensure t)
: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.
Package | Dependent | Description |
---|---|---|
python-epc | Core | EPC for Python |
python-pyqt5, python-pyqt5-sip | Core | Essential GUI library |
python-pyqtwebengine | Core | Chromium based web rendering engine |
wmctrl | Core | Activate Emacs window input focus |
pygetwindow | Core | Activate Emacs window input focus on WSL from Windows |
nodejs | Core | Installs dependencies, and for app communications |
mac-app-frontmost | Core | Monitor frontmost app on macOS |
python-pymupdf | PDF Viewer | PDF rendering engine |
python-qrcode | File Sender, File Receiver, Airshare | Render QR code pointing to local files |
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 |
python-qtconsole | Jupyter | Provide RichJupyterWidget |
python-retrying | Markdown Previewer | Provide @retry |
python-pytaglib | Music Player | Parse ID3 tag |
python-psutil | System Monitor | Retrieving information on running processes and system utilization |
Application Name | Launch |
---|---|
Browser | M-x eaf-open-browser Search or Goto URL |
M-x eaf-open-browser-with-history Search or Goto URL or Goto History |
|
HTML Email Renderer | M-x eaf-open-mail-as-html in gnus , mu4e , notmuch HTMl Mail |
PDF Viewer | M-x eaf-open PDF File |
Video Player | M-x eaf-open Video File |
Image Viewer | M-x eaf-open Image File |
Markdown Previewer | M-x eaf-open Markdown File |
Org Previewer | M-x eaf-open Org File |
Camera | M-x eaf-open-camera |
Terminal | M-x eaf-open-terminal |
File Sender | M-x eaf-file-sender-qrcode or eaf-file-sender-qrcode-in-dired |
File Browser | M-x eaf-file-browser-qrcode |
Airshare | M-x eaf-open-airshare |
Mindmap | M-x eaf-create-mindmap or M-x eaf-open-mindmap |
MS Office Viewer | M-x eaf-open-office |
Jupyter | M-x eaf-open-jupyter |
Music | M-x eaf-open-music-player |
System Monitor | M-x eaf-open-system-monitor |
Demo | M-x eaf-open-demo to verify basic functionality |
Vue Demo | M-x eaf-open-vue-demo to verify vue.js functionality |
- EAF Browser and PDF Viewer support Emacs built-in bookmark operation, with
M-x bookmark-set
(defaulted toC-x r m
) andM-x bookmark-bmenu-list
(defaulted toC-x r l
).
It is highly suggested to read the Wiki first before using EAF.
Wiki consists of documentations on:
- Keybindings
- Customization
- Design
- TODOLIST
There also are some helpful tips to make EAF work with Docker, Helm, etc.
EAF implements three major functionalities:
- Integrate PyQt program window into Emacs frame using QWindow Reparent technology.
- Listen to EAF buffer's keyboard event flow and control the keyboard input of PyQt program via Python EPC.
- Create a window compositer to make a PyQt program window adapt Emacs' Window/Buffer design.
Learn more from the Wiki!
- EAF and EXWM share a common goal: enhance collaboration between the standard GNU Emacs with other GUI tools.
- EXWM is an X11 Window Manager, it manages and controls other software using a keyboard, but it cannot modify, customize and extend the behavior of other software.
- EAF is not a Window Manager, it utilizes the windows managing capabilities of Emacs to display its applications.
- The intention of EAF is to provide a framework to write PyQt5 applications that extends the multimedia experience of Emacs. From the perspective of Emacs' buffer/mode design, EAF is not different from any other package, with the former uses Qt for drawing contents while the latter uses Emacs' built-in text libraries instead.
- Through EAF's design, one can use Elisp to control Python and vice versa, and even able to use Elisp to control JavaScript in EAF Browser. EAF enables Emacs to the world of multi-language scripting.
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.
Currently, macOS is only partially supported and needs a lot of testing, not all functions can work normally, please check the Wiki for details.
Please DO NOT install PyQt5 through pip, pip version has bug, please install PyQt5 from the OS software repository.
js-video-player
requires that qtwebengine built against ffmpeg to support proprietary codecs like h264/aac
.
EAF confirms that the desktop environment or window manager you can work includes: KDE, Gnome2, Gnome3, Mate, Xfce, LXDE, Sway, i3, QTile, Xpra, EXWM.
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.
If you need to use proxy to access internet, one can configure the proxy settings.
```Elisp
(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:
```Elisp
(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.
For any installation and configuration assistance, please read the Wiki first!
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 with *eaf*
buffer content, it contains many clues that can help us locate the problem faster.
If you got segfault error, please use the following way to collect crash information:
- Install gdb and turn on option
eaf-enable-debug
- Use command
eaf-stop-process
stop current process - Restart eaf, send issue with
*eaf*
buffer content when next crash
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?
如果我的作品让你的生活充满快乐, 欢迎请我喝瓶啤酒, 哈哈哈哈