M-x apropos Emacs
HOME
M-x apropos Emacs
Table of Contents
May I recommend eww for Emacs’s innovative UI?
Exploring large amounts of data with completion
Vim is composable
Elevator pitch
Ten things to try with Embark
Writing Experience
The case against which-key: a polemic
Emacs keymaps can have helpful and even dynamic prompts
My quest for completion
Welcome to M-x apropos Emacs
RSS feed 🛜
May I recommend eww for Emacs’s innovative UI?
Published: [2026-05-16 Sat]. Comments on Mastodon.
I think it’s safe to say many people regard the Emacs Web Wowser<br>(henceforth eww) as a toy, not really usable as web browser. They’ll<br>say “maybe for documentation” (meaning: to read documentation for some<br>piece of software). Of course, there is plenty of truth to this view:<br>eww cannot run JavaScript, so a lot of the modern web app cannot<br>possibly work. But I think eww is underrated and, for this month’s<br>Emacs Carnival, I’m recommending people try it for two separate<br>reasons.
The first reason is a sad one: eww’s limitations improve many<br>websites! I believe that eww’s biggest weakness, it’s lack of<br>JavaScript, can also be a strength. It’s sad how many websites improve<br>if you don’t run their JavaScript code, which is often just there to<br>load ads or a paywall, or to make the text you are reading disappear<br>and reappear a couple of seconds later in a different (sometimes less<br>readable!) font. Similarly, many websites are simply hard to read: the<br>lines of text are ridiculously long, or the colors are garish, or the<br>text has too little contrast with the background (I blame that last<br>one on young web designers with great eyesight that don’t understand<br>that many middle-aged people struggle to read medium gray text in a<br>thin font on a light gray background). The JavaScript problem is fixed<br>right out of the box with eww simply because it cannot run JavaScript.<br>By default eww does leave you a bit at the whims of websites with<br>respect to colors, but a simple (setopt shr-use-colors nil) will fix<br>that. You can read any website (well, many websites) in eww using your<br>favorite Emacs theme, a sensible line length and the fonts you’ve<br>chosen. (This part isn’t unique to eww, of course, there are browser<br>extension you can use for the same purpose in normal web browsers).
The second reason is perhaps surprising: Emacs has many UI innovations<br>when compared to standard browsers! Interestingly the innovations I<br>have in mind are not made specifically for eww, but are broader Emacs<br>UI features. Here are a few I like that I don’t think normal browsers<br>can match (please let me know if I’m wrong about that):
You can resize an individual image without resizing text or other<br>images! Use image-increase-size, bound by default to i + when the<br>point is on an image (and only then). I often find images are<br>slightly too small or way too big.
You can read text in multiple columns with follow-mode. I like<br>making Emacs full screen and using 3 columns. (Again, this is<br>something you can probably find a browser extension for, but it’s<br>built-in to Emacs.)
You have two types of search: isearch and occur. The browsers I’ve<br>used, only have an isearch-style interface: it searches<br>incrementally while you type and you can navigate to the next of<br>previous match. But sometimes I want to create a list of all the<br>matches of some text in a web page and have that list stick around<br>to treat it as a sort of todo list, in Emacs you do that with<br>occur. You can ask for some number of lines of context around each<br>match by calling occur with a prefix argument. You can navigatev<br>among the matches by pressing RET or clicking on them in the occur<br>buffer, or by using next-error (M-g n) and previous-error (M-g<br>p)—which work even without having the occur buffer visible. I<br>find occur invaluable if I’m doing an in-depth information search<br>online.
You can evaluate code right from a webpage if you are reading it in<br>Emacs! If I’m reading a blog about Emacs, I’ll often run the Emacs<br>Lisp code it mentions with eval-last-sexp (C-x C-e), which is super<br>convenient. But this isn’t limited to Emacs Lisp, of course! If I’m<br>reading a blog post with some Python code, I’ll open a Python REPL<br>with run-python and then send Python code to it for evaluation<br>directly from the eww buffer.
For this I use a small command I wrote to send text to the first<br>visible comint buffer it finds (I’ve replaced several “inferior”<br>major modes with just comint-run and this one command, which I bind<br>to C-:):
(defun send-to-comint ()<br>"Send active region or current line to a process in some window."<br>(interactive)<br>(if-let* ((process (cl-loop for w in (window-list)<br>thereis (get-buffer-process (window-buffer w))))<br>(input (buffer-substring-no-properties<br>(if (use-region-p) (region-beginning) (pos-bol))<br>(if (use-region-p) (region-end)...