Karthik Chikmagalur recently published another of his excellent"Even More Batteries Included with Emacs"posts, digging into lesser-known features that already ship with Emacstoday. I wanted to write its mirror image. His post covers thebatteries already in the box. Mine covers the ones arriving in Emacs31.Emacs 31 isn't out yet, but I've been building it from both emacs-31branch and master and daily driving it for months. Every timesomething new and useful lands, I fold it into EmacsSolo, my no-external-packagesconfig, and mark it with a small ; EMACS-31 comment so I remember torevisit it once the release is official.This post walks those breadcrumbs. Every change below is one I'mtouching in my config right now, with a note on what it does and why Ikeep it. None of it requires a package. It's all either on masteralready or close behind.One disclaimer: Emacs 31 is still in development (actually inpre-release phase), so names and defaults can shift before finalrelease. Everything below is what I'm running as of mid-2026. Ifyou're not building from emacs-31 branch or master, treat this asa preview of what's coming.Tree-sitter that just worksIf I had to pick the single change I'm happiest about, it's this one.For years, getting a *-ts-mode going meant manually populatingtreesit-language-source-alist, callingtreesit-install-language-grammar, and praying your toolchain was setup to compile the grammar. In Emacs 31 a lot of that ceremony goesaway:(treesit-auto-install-grammar t) ; EMACS-31(treesit-enabled-modes t) ; EMACS-31treesit-enabled-modes set to t switches the major modes that havea tree-sitter variant over to it, and treesit-auto-install-grammarmakes Emacs offer to fetch and build the grammar when it's missinginstead of erroring out. This is the treesit-auto package experience,except now the core does the work.The knock-on effect shows up all over my config. I used to keep lineslike these around to teach Emacs where each grammar lives:(add-to-list 'treesit-language-source-alist '(typescript "https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src"))In Emacs 31 the grammar sources for languages like TypeScript, TSX,Rust, TOML, YAML and Dockerfile live inside the modes themselves, soI've got a trail of ;; EMACS-31 this is now defined on mode codecomments marking every block I get to delete once 31 ships. I'll takeless config that does the same job any day.There are many more tree-sitter improvements coming to Emacs. Thedevelopers have been working tirelessly on it, Yuan Fu, along withmany others, have been continuously improving the tree-sitterexperience across multiple areas. From better language support tousability and performance enhancements, tree-sitter in Emacs continuesto evolve at a remarkable pace.A built-in markdown-ts-mode (experimental)Emacs 31 ships a markdown-ts-mode in the box, and this one is closeto my heart. I started it. It grew out of a proposal I sent toemacs-develback in early 2025, where the idea and the first version of the codewere mine.I'd be doing the mode a disservice if I let you think it's a soloeffort. Stéphane Marks came along a bit later, rolled up hissleeves, and has since become a co-author of the mode. He's the energybehind much of what makes it nice to use today. He didn't send a patchor two and move on; he stayed, pushing the mode well past what I'dsketched out and sweating the details that turn "it works" into "it's apleasure." Much of the polish I'm about to brag about is his. The modeis ours now, and it's better for it.Watching an idea make the round trip from a mailing-list message tocore code, and picking up a great collaborator on the way, is one ofthe most rewarding things about hanging around the Emacs community.(use-package markdown-ts-mode :ensure nil :defer t)It gives you more than colors, and these are the parts I want to showoff:✔️ Org users will feel at home. The keybindings and editing feelstay close to Org: navigating headings, folding sections, movingbetween structural elements. If your fingers know Org, you won't haveto relearn Markdown.✔️ Live, colored code blocks, even for non-tree-sitter languages.This is my favorite trick. A fenced code block gets fontified usingthe real major mode for that language, not dumped as flatmonospace. It reaches Emacs' own internal modes too, so an```elisp block lights up with true Emacs Lispfont-locking, and the other built-in modes do the same. You getproper syntax highlighting inside your code samples with no extrasetup.✔️ Inline image viewing. Image links render in the buffer, so aMarkdown doc with screenshots or diagrams reads like a document, nota wall of  noise.And many more features discoverable and being developed.Together these make it feel like a comfortable place to write andread Markdown inside Emacs, not a syntax highlighter bolted onto .mdfiles.One caveat I want to be upfront about: markdown-ts-mode is stillexperimental, and you have to opt into it. As the header ofmarkdown-ts-mode.el notes, it isn't wired up to auto-mode-alistyet, so it won't take over .md files on its own. For now you pull inthe library with M-x load-library RET markdown-ts-mode, then turn iton in a bufferf, or add it to auto-mode-alist yourself if you'refeeling brave.Stéphane and I are working to get it considered ready by the nextEmacs release, and that's where you come in. If you try it and hitrough edges, or it works great, we want to hear about it. Sendfeedback to the buglist withM-x report-emacs-bug, or reach out to me and Stéphane directly.Real-world use is what moves a mode from "experimental" to "done", sodon't be shy.Many more screenshots here.Eglot rendering docs with markdown-ts (also, still experimental)Speaking of Markdown, Eglot in Emacs 31 can render LSP documentationusing that same internal mode instead of falling back to plain text:(eglot-documentation-renderer 'markdown-ts-view-mode) ;; EMACS-31(eglot-code-action-indications nil) ;; EMACS-31markdown-ts-view-mode gives you formatted hover docs without pullingin anything extra. The same experimental caveat applies here, sinceit leans on markdown-ts-mode, so treat it as something to opt intorather than a finished default. I also turn offeglot-code-action-indications. The new inline "you can do a codeaction here" hints are clever, but some language servers make themnoisy, so I keep them off.There's also some churn here: eglot-events-buffer-size is on its wayout in favor of eglot-events-buffer-config, so I've left a;; EMACS-31 -- do we still need it? note on the old variable to cleanup later.eldoc at pointA small one I'm fond of:(eldoc-help-at-pt t) ;; EMACS-31With this on, eldoc shows the help text for whatever sits under thecursor, without me invoking anything. Paired witheldoc-echo-area-prefer-doc-buffer, it makes wandering throughunfamiliar code feel more guided.Smarter, eager completionThe minibuffer and completion machinery picked up a few new toggles:(completion-eager-update t) ;; EMACS-31(completion-eager-display 'auto) ;; EMACS-31(minibuffer-visible-completions 'up-down) ;; EMACS-31completion-eager-update and completion-eager-display refresh thecompletion UI as you type instead of waiting for you to ask. If youdon't run something like icomplete, setting eager display to t givesyou a sharp out-of-the-box experience on its own. Andminibuffer-visible-completions set to 'up-down lets you movethrough the visible candidates with the arrow keys, which feels naturalat last.icomplete got attention too, and this is another one I had a directhand in. Emacs 31 includes the patch frombug#75784,which I proposed and worked on. It brings vertical in-buffer behaviorand prefix indicators to icomplete. The side effect I like: a bigcompatibility block I'd been carrying in my config can finally go away:(when (and (>= emacs-major-version 31) (boundp 'icomplete-vertical-in-buffer-adjust-list)) (setq icomplete-vertical-in-buffer-adjust-list t) (setq icomplete-vertical-render-prefix-indicator t))Window layout gymnasticsThis is a fun set of new commands for rearranging your window layoutwithout manually splitting and killing windows:("C-x w t" . window-layout-transpose) ; EMACS-31("C-x w r" . window-layout-rotate-clockwise) ; EMACS-31("C-x w f h" . window-layout-flip-leftright) ; EMACS-31("C-x w f v" . window-layout-flip-topdown) ; EMACS-31Transpose swaps your horizontal and vertical arrangement, rotate spinsthe whole layout around, and the flip commands mirror it left-to-rightor top-to-bottom. If you've ever built a three-window layout and thenwished the editor pane were on the other side, these do the job andkeep every buffer in place while they're at it.A Speedbar that lives in a side windowSpeedbar has been around forever, but in Emacs 31 it learned to livein a proper side window instead of a separate frame:(speedbar-window-default-width 25) ;; EMACS-31(speedbar-window-max-width 25) ;; EMACS-31;; bound to M-I in my config:(speedbar-window) ;; EMACS-31speedbar-window docks it to the side like a modern file tree. On atiling setup or a single-monitor laptop, that beats the oldfloating-frame behavior by a mile. A width cap keeps it from fightingmy other windows.VC nicetiesA few version-control improvements I've happily turned on:(setopt vc-auto-revert-mode t ; EMACS-31 vc-allow-rewriting-published-history t ; EMACS-31 vc-dir-hide-up-to-date-on-revert t) ; EMACS-31vc-dir-hide-up-to-date-on-revert is the one I'm most pleased about.Refreshing a vc-dir buffer now hides the up-to-date files on its own,so I no longer need my g-key hack that called vc-dir-refreshfollowed by vc-dir-hide-up-to-date. Another block marked fordeletion. vc-allow-rewriting-published-history nods to workflows likeJujutsu and force-pushing feature branches, where rewritingalready-pushed history is a deliberate move.Editable xref buffersThis one isn't a variable, it's a comment in my config reminding me toremove a custom hack:;; EMACS-31 Remove this, since new emacs will come with 'e' for editing xref buffers.;; Reference: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=80616I'm going to indulge myself and tell the longer version of this one,because I was part of it and it shows how features find their way intoEmacs.The itch was this. Both Dired and grep buffers have long had an "edit"workflow. In Dired you toggle into wdired-mode; in a grep buffer youpress e for grep-edit-mode. Bulk renaming and bulksearch-and-replace feel natural there. Xref buffers had no such thing.The only editing operation was r (xref-query-replace-in-results),which is regex-only and won't let you edit individual lines. I leanhard on project.el and xref for navigating and refactoring, and Ikept catching myself re-running the same search with M-x grep to getan editable buffer. An annoying detour, since xref already held all theinformation needed.So in March 2026 I sent a patch to bug-gnu-emacs proposing a smallcommand, xref-export-to-grep, bound to E in *xref* buffers. Itre-fetched the xref items, formatted them as file:line:content, anddropped them into a grep-mode buffer where you could press e and editas usual. Nothing fancy. It bridged two things that already existed,and I'd carried it as a personal snippet for a while.What happened next is the part I love about this community. DmitryGutov, who maintains xref, looked at it and pushed back on the UI ofmy approach. My command created a hop between buffers, and once youlanded in the grep buffer you still had to know which key to press. Heasked a sharper question than the one I'd answered: did I care aboutthe grep export, or would it be better if xref buffers let you editinline?That reframing was right. I told him I had no attachment to the grepdetour. Inline editing in the xref buffer itself, with multi-lineedits across matches, would kill the whole roundtrip. A few days laterhe'd written and pushed xref-edit-mode. It drops the extra step andruns faster on large xref buffers. My original xref-export-to-grepcould still go in as an optional command without a default binding,but the inline mode is the better answer and it's what I use now.The thread didn't stop there. It spun off into a wider design chat withJuri Linkov about the *-edit-mode family (occur/grep/xref, whichwrite each buffer normally) versus wdired'squeue-everything-then-C-x C-s model, and whether a future "live"search UI might present results differently. For the record, here's thesafety net I mentioned in that thread, a trick I picked up fromProtesilaos that lets me hit d to diff a buffer against its filebefore saving during save-some-buffers:(add-to-list 'save-some-buffers-action-alist (list "d" (lambda (buffer) (diff-buffer-with-file (buffer-file-name buffer))) "show diff between the buffer and its file"))Back to the topic, the end result: Emacs 31 ships editable xrefbuffers, my config drops a homegrown workaround, and the feature thatlanded beats the one I proposed, because the maintainer asked theright question. Getting to play a small part in that loop is a bigchunk of why I enjoy living on master. The full back-and-forth ispublic inbug#80616 ifyou're curious.So, if you would like to try it. After C-x p g, grep for somethinglike FontAwesomeIcon. Now e starts the edit mode, make your edits,C-c C-c to confirm.ERC gets tidierA couple of IRC improvements, since I live in ERC:(erc-log-insert-log-on-open 'erc-log-new-target-buffer-p) ;; EMACS-31This makes ERC insert prenvious logs only for newly opened targetbuffers, the behavior I want when rejoining channels. And one of myfavorite small fixes: in Emacs 31 the scrolltobottom module no longerdepends on erc-fill-wrap, so I can drop the conditional that used toadd it by hand for older versions. Thank you to whoever untangled that.The grab bag of quality-of-life knobsAnd then there's the long tail of tiny improvements that don't eachdeserve a section but absolutely earn their place:(delete-pair-push-mark t) ; EMACS-31: pushes a mark after ; delete-pair so C-x C-x selects what was inside(ibuffer-human-readable-size t) ; EMACS-31: KB/MB instead of raw byte counts(ielm-history-file-name ...) ; EMACS-31: IELM input history is finally persisted(kill-region-dwim 'emacs-word) ; EMACS-31: C-w with no region kills a word(native-comp-async-on-battery-power nil) ; EMACS-31: stop native-comp jobs on battery(view-lossage-auto-refresh t) ; EMACS-31: live-updating C-h l, great for teaching/debugging(display-fill-column-indicator-warning nil) ; EMACS-31(dired-hide-details-hide-absolute-location t); EMACS-31: hide the absolute dir path in dired-hide-details-mode(world-clock-sort-order "%FT%T") ; EMACS-31: sort the world clock sanely(zone-all-frames t) ; EMACS-31(zone-all-windows-in-frame t) ; EMACS-31(uniquify-after-kill-buffer-flag t) ; EMACS-31: renamed from the -p variantA few of these are worth a sentence:✔️ kill-region-dwim fixes a decades-old papercut. Set it to'emacs-word and hitting C-w with no active region kills a wordbackwards instead of signalling an error. No more "the mark is notactive" interruptions.✔️ view-lossage-auto-refresh turns C-h l into a live view ofyour last keystrokes. When I'm screen-sharing or teaching, people canwatch the keys I press in real time.✔️ ielm-history-file-name lets my IELM scratch sessions survive arestart, the way comint and the shell already do.✔️ native-comp-async-on-battery-power nil saves the laptop: nosurprise fan spin-ups from background native compilation while I'munplugged on a train.✔️ tty-tip-mode brings tooltips to the terminal, a nice touch forthose of us who run Emacs in -nw.Honorable mention: term stops eating linesThis one gets no config line, because there's nothing to configure. Abug got fixed, and it makes me happier than it has any right to.For a long time, term (and ansi-term) had a nasty habit ofswallowing lines. Full-screen, cursor-addressing programs left thedisplay garbled, with rows eaten or misplaced as the program redrew.That hit the exact programs you most want a real terminal for: htop,nethack, anything curses-based was close to unusable inside Emacs'terminal.Emacs 31 fixes it. term redraws correctly now, and I can run htopto watch processes or fire up nethack for a "quick" break without thebuffer turning into confetti. It sounds small, and it removes one ofthe last reasons I had to reach for an external terminal emulator.Honorable mention 2: Modus 5 themes!Thanks to Protesilaos, Emacs now ships with several modus themes:✔️ modus-operandi-deuteranopia -- Deuteranopia-optimized theme with a white background.✔️ modus-operandi -- Elegant, highly legible theme with a white background.✔️ modus-operandi-tinted -- Elegant, highly legible theme with a light ochre background.✔️ modus-operandi-tritanopia -- Tritanopia-optimized theme with a white background.✔️ modus-vivendi-deuteranopia -- Deuteranopia-optimized theme with a black background.✔️ modus-vivendi -- Elegant, highly legible theme with a black background.✔️ modus-vivendi-tinted -- Elegant, highly legible theme with a night sky background.✔️ modus-vivendi-tritanopia -- Tritanopia-optimized theme with a black background.Why bother running master?People ask why I daily drive an unreleased Emacs. Same reason I run ano-packages config: I want to know what's in the box, and the way tolearn what's coming is to live in it. Most of these changes are small,yet they add up to an editor that needs less of my glue code eachrelease. Watching my config get shorter as the core absorbs things Iused to hand-roll is one of the quiet joys of being an Emacs user.For the other side of this coin, the batteries already there waiting tobe found, go read Karthik'spost.It's a great companion to this one. And to see every snippet above incontext, they're all in theEmacs Solo init.el, eachmarked with that small ; EMACS-31 breadcrumb.See you when 31 ships, at which point I get to go delete a pile ofcode. Happy hacking.