hype.org (23949B)
1 Emacs's NEWS files are useful as a searchable reference, but they can 2 be overwhelming as an entry point to a new release. In this file, I'm 3 keeping track of the changes /I/ am excited about. 4 * (Cooking) 5 Not merged yet; still excited about it. 6 ** UI 7 *** Cursor 8 **** ~cursor-indicators-mode~ (bug#77224) 9 Change cursor style depending on arbitrary predicates. Might finally 10 stop me from activating repeat maps by accident. 11 * 32 12 ** Applications 13 *** Man 14 **** OSC 8 hyperlinks 15 ** Editing 16 *** Search & replace 17 **** =query-replace-show-preview= (bug#81583) 18 ** Programming 19 *** =refactor.el= 20 UI bits of Eglot (Emacs's built-in LSP client), extracted for 21 general-purposation. 22 *** Xref 23 **** ~xref-find-by-kind~, =M-g . 𝒦= (or =M-g M-. 𝒦=) 24 Implemented for Elisp and Eglot. Valid =𝒦= (kinds) depend on the 25 backend; for Eglot, they map to LSP /providers/: 26 27 - =d= :: declaration 28 - =i= :: implementation 29 - =t= :: type definition 30 ** UI 31 *** Outline 32 **** ~outline-find-headings~ (bug#81512, bug#81579, bug#81592) 33 * 31 34 ** Applications 35 *** Dired 36 **** kill project-relative filename 37 With =C-u 1 w=. 38 *** grep 39 **** Editable =*grep*= buffers (bug#70820) 40 - =e= to start editing 41 - =C-c C-c= to apply 42 *** Package manager 43 **** Review policy for installations & upgrades 44 ~package-review-policy~ lets users opt in to reviewing diffs when 45 installing (new versions of) packages. 46 *** VC 47 Steadily inching closer to Magit. 48 **** =C-x v w= prefix for working tree commands 49 With ~project.el~ integration. 50 51 Particularly fond of =C-x v w w= to explore alternate versions of a 52 file; ~magit-find-file~ is still convenient for quickly blaming 53 arbitrary revisions, but visiting an actual checkout allows deploying 54 the full language server & linter gamut. 55 **** =C-x v [IOT]= prefixes for DWIM comparisons with upstreams 56 NB: =I= & =O= prefixes are opt-in with 57 =vc-use-incoming-outgoing-prefixes=. 58 59 - =I= stands for "incoming" = "what we would pull", 60 - =O= stands for "outgoing" = "what we would push", 61 - =T= stands for "topic" = "what we would ask /them/ to merge"; 62 commands in this prefix purport to compare "outstanding" changes 63 between the current branch and its upstream, assuming we are sitting 64 on a transient feature branch that will eventually be merged back 65 into a longer-lived development trunk. 66 67 Each prefix offers === (fileset diff), =D= (root diff) and =L= (root 68 log). 69 70 For more information about Emacs's understanding of "outstanding 71 changes", see bug#80006 and [[info:emacs#Outstanding Changes][emacs#Outstanding Changes]]. 72 **** =M-RET=, =M-n= & =M-p= for low-friction Log View movement 73 Partly self-imposed by the decision to split the commit message in the 74 log buffer, and the patch in a separate diff buffer; still, nice to 75 have a set of keys to do both actions at once. 76 ** Editing 77 *** DWIM =C-w= (bug#69097) 78 =kill-region-dwim= tells =C-w= what to do when the region is inactive: 79 80 - By default, kill the region anyway as long it exists, i.e. the mark 81 is set; in other words, kill the region revealed by =C-x C-x=. 82 83 - Otherwise kill "a word" backward. 84 85 The option can be set to kill either [[info:emacs#Words][an Emacs word]] (major-mode 86 dependant) or a [[info:readline#Commands For Killing][readline word]] (whitespace-separated). 87 *** Search & replace 88 **** Transpose FROM & TO with =M-s t= 89 ** Elisp 90 *** So long /pure storage/ 🫡 91 This release does away with pure space, removing one of these subtle 92 bits of [[info:elisp#GNU Emacs Internals][{{{eldritch(the Internals)}}}]] that I usually ignore while 93 noodling in the Lisp Happy Lands of Immediate Feedback, and get 94 reminded of either when ~make bootstrap~ tuts at my patch, or when a 95 reviewer does 🫤 96 97 Nice that we no longer need to figure out which strings to ~purecopy~, 98 that we can always use ~define-key~ and forget about 99 ~bindings--define-key~, that ~defconst~ no longer causes pure-copying 100 hazards… 101 102 See [[https://lists.gnu.org/archive/html/help-gnu-emacs/2026-09/msg00116.html][Stefan Monnier's explanations]] for the historical motivations for 103 pure storage, and why modern circumstances have made these motivations 104 obsolete. 105 *** User Lisp directory 106 I have always envied folks who conscientiously break their init file 107 down into modular package-like files: at the time of writing, my own 108 =init.el= is a bit over 1k lines, with a couple of ~require~ clauses 109 awkwardly tucked in function bodies to avoid bloating startup. 110 111 In this release, Emacs now processes =user-lisp-directory= like a 112 package (or a collection of packages), complete with autoloads. 113 Perhaps this feature will help me journey toward the promised land of 114 modular init files. 115 ** Programming 116 *** eglot 117 **** ~eglot-describe-connection~ and ~eglot-list-connections~ 118 **** ~jsonrpc-events-mode~ 119 New major mode for Eglot's event log buffers, accessed with ~M-x 120 eglot-events-buffer~ or =e= in the connection list buffer. =RET= 121 pretty-prints the event at point with =jq=. 122 *** lua-mode 123 Imported from [[https://immerrr.github.io/lua-mode/][the historical thirdparty mode]]; an alternative to the 124 built-in lua-ts-mode. 125 126 (Unfortunately [[https://cgit.git.savannah.gnu.org/cgit/emacs.git/commit/?id=0d3504227a67b56a8d1edc4758c66a05718dbd5a][the VCS history was squashed]], despite [[https://debbugs.gnu.org/cgi/bugreport.cgi?bug=76650#90][efforts]] to 127 preserve it) 128 *** tree-sitter 129 **** Finer sexp movement (bug#73404, bug#76676) 130 Sexp commands no longer "overshoot" in tree-sitter modes. For 131 example, in previous releases, invoking =C-M-f= in c-ts-mode with 132 point… 133 134 - at the start of a function definition: point would jump to the end 135 of the function (redundant with =C-M-e=), 136 - at the start of a statement: point would jump to the end of the 137 statement (redundant with =M-e=). 138 139 Now: 140 141 - tree-sitter modes can opt into the more familiar "atom"-based 142 movement - in c-ts-mode, stopping over each identifier or keyword, 143 still leaping over delimiter pairs (=([{}])=), by defining a =list= 144 element in =treesit-thing-settings=. 145 - users can invoke ~treesit-cycle-sexp-type~ to make =C-M= commands 146 act on "treesit nodes" vs "syntax symbols". 147 ** UI 148 *** Completion 149 **** ~completion-eager-display~ 150 **** ~completion-eager-update~ 151 **** ~completion-pcm-leading-wildcard~ 152 **** ~completion-styles~ bindings 153 - to set completion-ignore-case 154 *** Desktop integration 155 **** ~system-taskbar-mode~ 156 Curious what this thing can achieve. E.g. I'm already a happy user of 157 ~compilation-finish-functions~ to send a desktop notification using 158 ~notifications-notify~; wondering what other information this taskbar 159 integration can expose. Also anxious to know whether & how badges 160 from multiple Emacs instances will share the taskbar space. 161 *** Help 162 **** =C-h u= bound to ~apropos-user-option~ 163 *** Hideshow 164 Lots of quality-of-life improvements mirroring similar enhancements in 165 =outline.el= from past releases; personally happy about 166 =hs-cycle-filter=: 167 168 - ≈ =outline-minor-mode-cycle=, in that it allows =TAB= to be the 169 one-stop binding for toggling visibility; 170 - more flexible though: either a boolean, or a predicate to control 171 /where/ the =TAB= key should "hideshow" (vs other actions like 172 indent). 173 *** Input 174 **** =repeat-continue= 175 Users can tell ~repeat-mode~ that some commands should not interrupt 176 repeat maps: 177 178 #+begin_src elisp 179 ;; Allow C-l in the middle of a repeating sequence. Useful when 180 ;; e.g. `next-error' shows point at the bottom of the window, and 181 ;; recentering to the top will show more context that will let me 182 ;; decide whether to keep searching or not. 183 (put 'recenter-top-bottom 'repeat-continue t) 184 #+end_src 185 186 Other ways to set the property: 187 188 - ~use-package~'s =:continue-only= keyword; 189 - ~defvar-keymap~'s =:continue= keyword. 190 *** Windows 191 **** New window layout commands (=window-x.el=) 192 With bindings under =C-x w=, complete with repeat maps. Looking 193 forward to ~flip~ and ~rotate~ and ~transpose~ 🫨 194 **** =split-window-preferred-direction= 195 By default, when splits are possible in either direction according to 196 =split-{height,width}-threshold=, Emacs was biased toward splitting 197 vertically. This new option defaults to ='longest=, reducing that 198 bias by making Emacs consider the window layout: "landscape" windows 199 (such as a single window in a maximized frame) will be split 200 horizontally. 201 ** Honorable mentions 202 *** ~whitespace-page-delimiters-mode~ for better =^L= display 203 Emacs's =FORM FEED= display is [[file:../../itches/emacs/form-feed.md][one of my oldest peeve]], so I was 204 excited to see it addressed. I do not think I will be using this mode 205 however; I would have preferred something independent of 206 ~whitespace-mode~. 207 * 30 208 ** =:core= promotions 209 *** visual-wrap (was adaptive-wrap): soft & mode-sensitive wrap prefixes 210 This package enhances the way Emacs displays continuation lines. 211 Unpacking that word salad of a heading: 212 213 - wrap prefixes :: strings that Emacs prepends to continuation lines; 214 - soft :: these strings are intangible decoration, not actual buffer 215 content; 216 - mode-sensitive :: leverages the mode's [[info:emacs#Adaptive Fill][adaptive-fill settings]] to 217 determine the "proper" prefix, i.e. the same prefix you would get by 218 hard-wrapping with =M-q=. 219 *** which-key: key binding discovery (bug#68929) 220 ** Applications 221 *** ERC 222 **** ~visual-line-mode~ integration 223 In previous versions, I would take =fill= off ~erc-modules~ and enable 224 ~visual-line-mode~ in order to get reflowable windows; this would [[file:~/memory-leaks/itches/emacs/tracker.org::*+Make timestamps robust vs window width changes+][mess 225 with right-aligned timestamps]], however. 226 227 As of ERC 5.6, setting ~erc-fill-function~ to ~'erc-fill-wrap~ enables 228 ~visual-line-mode~ and sets up all sorts of =line-prefix=, 229 =wrap-prefix= & margin trickery to (a) align nicks and messages (b) 230 make messages reflowable (c) keep timestamps firmly stuck to the right 231 margin. 232 *** shr 233 **** bug#66676 ~shr-fill-text~ 234 Set to nil to completely disable shr's line-wrapping. This lets users 235 leverage ~visual-line-mode~ to get all the benefits of 236 display-engine-backed wrapping: text is reflowed on the fly as windows 237 are resized or text is rescaled. 238 239 Tables still use rigid wrapping though; this can be circumvented by 240 remapping =<table>= tags: 241 242 #+begin_src elisp 243 (pcase-dolist (`(,tag . ,shr-function) 244 '((table . shr-tag-div) 245 (thead . shr-tag-div) 246 (tbody . shr-tag-div) 247 (tr . shr-tag-ul) 248 (th . shr-tag-li) 249 (td . shr-tag-li))) 250 (setf (alist-get tag shr-external-rendering-functions) shr-function)) 251 #+end_src 252 253 Eww automatically enables ~visual-line-mode~ when it detects that 254 ~shr-fill-text~ is =nil=; Gnus does not yet, and so requires some 255 hand-holding to take full-advantage of ~visual-line-mode~: 256 257 #+begin_src elisp 258 ;; Enable visual-line-mode after rendering an article: 259 (add-hook 'gnus-article-prepare-hook 'visual-line-mode) 260 261 ;; This is to go e v e n f u r t h e r b e y o n d. 262 (setopt 263 ;; Never hard-wrap any lines. 264 gnus-treat-fill-article nil 265 gnus-treat-fill-long-lines nil 266 ;; Re-assemble headers into a single line. 267 gnus-article-unfold-long-headers t 268 gnus-treat-fold-headers nil 269 ;; Unfurl format=flowed emails by "filling" them to an absurd width. 270 fill-flowed-display-column most-positive-fixnum 271 mm-fill-flowed t) 272 #+end_src 273 274 ** Programming 275 *** imenu 276 **** bug#70846 imenu-flatten 277 See also emacs-devel:<m1bk5adq1z.fsf@eshelyaron.com> for follow-up 278 work to make completions preserve text properties, allowing 279 ~completing-read~ callers to distinguish multiple candidates with the 280 same string value. 281 *** tags 282 **** ~etags-regen-mode~ 283 Not sure how straightforward it is to set up for complex projects, 284 e.g. binutils-gdb where ~make TAGS~ generates TAGS files in multiple 285 subdirectories, and one source file uses symbols from multiple TAGS 286 files. 287 288 Sounds useful though. 289 ** UI 290 *** Completion 291 **** ~completion-preview-mode~ 292 *** Customization 293 **** ~customize-toggle-option~ 294 *** Minibuffer 295 **** ~read-passwd-toggle-visibility~ 296 *** Outline 297 **** bug#49731 outline-{show,hide}-by-heading-regexp 298 **** bug#66676 SHR & EWW integration 299 **** bug#68824 tree-sitter integration 300 **** bug#69305 buffer-menu & tabulated-list-mode integration 301 *** Windows 302 **** ~toggle-window-dedicated~ (=C-x w d=) 303 Matches my "opportunistic" window "management" perfectly; I generally 304 do not mind Emacs popping buffers left and right, but on occasion I'll 305 be… 306 307 - working on window (a), 308 - about to run a command 𝒳 that shows results in another window, 309 - having a window (b) displaying notes I want to keep visible, 310 - having a window (c) I consider disposable, 311 312 But 𝒳 would clobber (b) to display its results. Being able to 313 "freeze" (b) and ensure commands in (a) dump their results in (c) is 314 neat. =M-: (set-window-dedicated-p nil t)= is a thing I've actually 315 run on occasion. 316 317 Also, the mode-line indicator has the nice side-effect of making the 318 behavior of rigid interfaces à la ~gdb-many-windows~ less suprising. 319 * 29 320 ** =:core= promotions 321 A couple of ELPA packages have moved to emacs.git, making them 322 available out of the box. 323 *** eglot ("Emacs Polyglot"): LSP client 324 Lets Emacs leverage language servers to boost completion-at-point, 325 eldoc, flymake, imenu, project, xref. 326 *** use-package: init-file management 327 A utility macro for configuring packages that makes init-file 328 management more pleasant (and efficient to boot): 329 330 - OT1H, brings some amount of structure and order when compared to a 331 fully free-form DYI =.emacs=, 332 - OTOH, allows more leeway on how to organize things, when compared to 333 Custom's rigid auto-generated forms (e.g. using regular code 334 comments, computing option values, sorting options arbitrarily), 335 - takes care of setting up the ~eval-after-load~ wizardry to keep 336 startup snappy. 337 338 A tedious aspect of porting a ~custom-file~ to ~use-package~ 339 declarations is tracking down what package defines which variables, 340 since not every variable is named after the package it belongs to. 341 I wrote [[file:~/memory-leaks/guides/emacs/use-package.org::*Porting from ~custom-file~][some code to make the process faster]]. 342 ** Elisp 343 *** ~setopt~ sets variables and runs their Custom setters 344 ** Programming 345 *** eglot 346 **** better composition of doc & lint messages 347 Eglot now sets ~eldoc-documentation-strategy~ to 348 ~eldoc-documentation-compose~, so linter warnings are no longer hidden 349 by symbol documentation. 350 351 It used to be that a flymake warning would flash briefly in the echo 352 area before e.g. a function signature would clobber it and I would 353 have to resort to ~M-x flymake-show-buffer-diagnostics~, but no 354 longer: Eglot now sets things up so that both are visible in the echo 355 area. 356 *** imenu 357 **** now bound to =M-g i= 358 Turns out that lots of modes define an imenu. 359 *** Languages 360 *** Python 361 **** ~python-indent-def-block-scale~ 362 Bumping that new option down to =1= ensures =python.el= and I remain 363 on good terms whenever I open lines inside parentheses. 364 ** UI 365 *** Buffers 366 **** ~rename-visited-file~ 367 Instead of =C-x C-w NEWNAME RET M-! rm OLDNAME RET=. 368 *** Fonts 369 **** ~global-text-scale-adjust~ 370 ~text-scale-adjust~ (bound to =C-x C-X= ∀ =X= ∈ =[=+-0]=) only scales 371 the font size in the current buffer; more often than not, one may want 372 to increase the default font size everywhere (e.g. when projecting 373 their screen). 374 375 To that end, users had to =M-x customize-face RET default= or =M-:= 376 ~(set-face-attribute 'default nil :height …)~; now they can use the 377 new =C-x C-M-X= bindings to invoke ~global-text-scale-adjust~. 378 *** Outline 379 **** "fold hints" for outlines 380 ~outline-minor-mode-use-buttons~ can be set to either 381 382 - =in-margins=: magit-section-like indicators, 383 - =t=: in-buffer buttons. 384 385 Initially the latter used arguably "garish" color emoji; with the 386 addition of the =icons.el= library, the way these buttons are 387 displayed can now be controlled with ~icon-preference~, which defaults 388 to more sober SVG images. 389 *** Windows 390 **** ~split-root-window-{below,right}~ 391 E.g. when you already have a vertical split, and you'd like to spawn a 392 full-height window to the side (instead of splitting either the top or 393 bottom window horizontally and keeping the other full-width). 394 395 Been missing this in both Emacs and Terminator; glad Emacs now has a 396 solution. 397 398 Part of the new window keymap on =C-x w=. 399 ** Honorable mentions 400 These have me excited too, but I have nits to pick with the current 401 incarnation. 402 *** "Pure GTK" Emacs 403 Some brave souls took it upon themselves to drag Emacs kicking and 404 screaming into The Wayland Future™: "pure GTK" means that Emacs will 405 only rely on GTK APIs, instead of a mix of GTK and X. 406 407 Try it out by giving =--with-pgtk= to =./configure=. One caveat is 408 that GTK input methods… [[https://debbugs.gnu.org/56653][eat modifiers]] or something? E.g. =S-SPC= 409 degrades to =SPC=. Apparently Emacs users are the only ones to care 410 about that? 🤷 411 412 Note 1: this problem can be reproduced on the X+GTK build by setting 413 ~x-gtk-use-native-input~. 414 415 Note 2: debugging notes in [[file:~/memory-leaks/itches/emacs/tracker.org::*bug:56653][this itches tracker entry]]. 416 417 Note 3: The Wayland Future™ seems more tolerant of X+GTK builds than I 418 anticipated, thanks to Xwayland. 419 *** ~pixel-scroll-precision-mode~ 420 Setting that minor mode with ~pixel-scroll-precision-interpolate-page~ 421 makes =PageUp= and =PageDown= much smoother. Would love for =M-v= and 422 =C-v= to use that as well… Heck, would love for all scrolling, 423 jumping and recentering commands to use that. 424 *** Picking completions from the minibuffer 425 =M-<up>= and =M-<down>= in the minibuffer cycle through completion 426 candidates. Would love for these to have non-arrow bindings 427 (e.g. =C-c C-[pn]= with a repeat map?). 428 429 Unsetting ~minibuffer-completion-auto-choose~ also lets the user 430 choose when to insert candidates in the minibuffer: =C-u M-RET= to 431 just insert, or =M-RET= to insert and immediately exit the minibuffer. 432 *** =C-x 8 e= keymap to search & insert emoji 433 Less hassle than =C-x 8 RET err what was the name again=, especially 434 for composed emoji 😵💫 435 436 Uses transient 👍 but relies on auto-generated, non-mnemonic =a-z= 437 suffixes to pick gender/color variations 👎 rather than taking 438 advantage of transient prefixes (e.g. =-g= for gender and =-s= for 439 skin tone), which 440 441 1. don't add an unecessary step for the common "ungendered Lego" case, 442 2. can remember a user's preferred values with ~transient-save~. 443 444 Upstream considers this idea "[[https://yhetil.org/emacs-devel/87ilxfx1ku.fsf@gnus.org/][fraught politically]]" 🤷 445 446 Others agree it would be [[https://yhetil.org/emacs-devel/87r1bx9pwo.fsf@bernoul.li/][nice-to-have, though not must-have]]; maybe 447 I'll take a stab at implementing it (making it opt-in, keeping the 448 alphabetical suffixes by default). 449 * 28 450 ** Applications 451 *** Dired 452 **** ~dired-kill-when-opening-new-dired-buffer~ 453 With this option, =RET= and =^= no longer make Dired buffers pile up 🎉 454 455 Previously, =a= (~dired-find-alternate-file~) could be used instead of 456 =RET=, but one had to write a custom command for =^=. 457 *** Gnus 458 **** =#= now toggles the process mark by default 459 No need for =M-#= anymore. 460 ** Editing 461 *** Transient input methods 462 **** Background 463 Input methods make it easier to type in certain classes of characters. 464 Emacs includes different kinds of methods: 465 466 - alternative keyboard layouts :: if you are familiar with specific 467 layouts, e.g. Dvorak, French AZERTY, Russian, you can ask Emacs to 468 switch to this layout; 469 470 - composition :: some methods let you specify characters by typing in 471 short sequences of other symbols: 472 - =french-prefix= provides easy access to diacritics with e.g. ='e= 473 for =é=, =,c= for =ç=; 474 - =TeX= turns TeX macros such as =\alpha=, =\pi=, =\le=, =\ne=, 475 =\wedge= into their corresponding characters, i.e. α, π, ≤, ≠, ∧. 476 477 Input methods can be toggled with =C-\=; prefix that with =C-u= to 478 select a new method. =C-h I <METHOD>= shows what characters 479 =<METHOD>= supports. =C-u C-x == on a character tells you how to 480 input that character with the current input method ("to input: …"). 481 **** What's new 482 The new =C-x \= command enables an input method temporarily, just for 483 the next character, and disables it afterward. 484 485 As an occasional user of the =TeX= method, I find this useful because 486 I no longer need to choose between 487 1. enabling =TeX=, typing a sequence, disabling =TeX=, or 488 2. enabling =TeX=, typing a sequence, keeping =TeX= enabled, getting 489 bitten by it whenever I type in =oh_no= and that turns into =ohₙo=. 490 491 =C-x \= seems to follow the same rules as =C-\=: 492 - the first time you call it, it prompts for a method, 493 - subsequent calls do not prompt, 494 - add =C-u= to get a prompt back. 495 *** ~yank-from-kill-ring~ 496 I've always been somewhat ambivalent about Emacs's ~kill-ring~: 497 498 1. Everything I ever copied is saved forever! This is a revolutionary 499 feature on par with the undo system 🙌 500 501 2. … Surely we can find a more ergonomic UI than =C-y M-y M-y M-y= 502 /dammit/ =C-_ C-_= /ah screw it/ =C-h v kill-ring RET C-s= 🤔 503 504 And lo! =M-y= now prompts for the ~kill-ring~ item to yank, with 505 completion. This makes the ~kill-ring~ much more accessible IMO. 506 ** Elisp 507 *** New commands for ~describe-{function,variable}~: 508 - =c= :: for variables, bring up the *Customize* UI, 509 - =i= :: bring up the relevant *Info* page, 510 - =s= :: jump to the *source* definition. 511 *** ~shortdoc-display-group~ 512 Concise reference docs for specific topics. 513 ** UI 514 *** Input 515 **** ~repeat-mode~ 516 =C-x o o o=! 517 *** Minibuffer 518 **** ~completions-group~, ~read-char-by-name-sort~ 519 Some very welcome quality-of-life tweaks to =C-x 8 RET=. 520 **** Vertical icomplete 521 ***** Settings 522 - ~completions-detailed~ 523 - ~icomplete-scroll~ 524 - ~icomplete-vertical-mode~ 525 ***** Advantages over plain icomplete 526 - annotations 527 - completion candidates are easier to tell apart 528 - =C-n= and =C-p= (=C-.= is awkward on AZERTY) 529 ***** Advantages over Ivy and Vertico 530 - regular minibuffer bindings work: 531 - =SPC= completes 532 - =RET= yields current input, disregarding completion candidates 533 - =C-j= yields selected completion candidate 534 - regular icomplete bindings work: 535 - =C-M-i= inserts selected completion candidate 536 *** Outline 537 **** ~describe-bindings~ integration 538 ~describe-bindings-outline~ makes =C-h b='s output less overwhelming. 539 **** Visibility-cycling with =TAB= in outline.el 540 =TAB= and =S-TAB= now work in Outline mode like they do in Org. Look 541 at e.g. NEWS (=C-h N=) to see them in action. Customize 542 ~outline-minor-mode-cycle~ to enable this in ~outline-minor-mode~. 543 544 One small, /tiny/ step toward chipping good features out of Org in 545 order to generalize them. 546 *** Tabs 547 For a long time I did not bother to check out the new tab bar, since I 548 did not expect to find a way to make tabs work in my rather byzantine 549 buffer management. 550 551 Then one day I started playing with the =C-x t= prefix on a whim, and 552 I was surprised by how much mileage I got out of forking off to a new 553 tab in order to "tuck away" the current window layout. 554 *** Windows 555 **** ~same-window-prefix~, ~other-window-prefix~, ~other-frame-prefix~ 556 The rules which govern how Emacs manages windows are beyond my 557 reckoning. I know [[https://protesilaos.com/codelog/2020-01-07-emacs-display-buffer/][it is possible to tame them]] with patience and 558 discipline; still, these new commands appeal to my humble caveman 559 brain. 560 561 Assuming the command run by key sequence =KEYSEQ= will display its own 562 buffer =BUF=, 563 564 - =C-x 4 1 KEYSEQ= says "please display =BUF= right here, in this 565 window"; 566 - =C-x 4 4 KEYSEQ= says "please display =BUF= in another window"; 567 - =C-x 5 5 KEYSEQ= says "please display =BUF= in another frame". 568 569 These new ~other-…-prefix~ commands can be seen as generalizations of 570 specialized shorthands such as =C-x 4 f= or =C-x 5 b=. 571 * 27 572 ** UI 573 *** Inspection 574 **** ~what-cursor-show-names~ 575 I sometimes use =C-u C-x == to (re)discover how the Unicode consortium 576 decided some character should be called; having plain =C-x == give me 577 that information without popping an extra buffer is neat.