memory-leaks

Still reachable: lots of words in many pages.
git clone https://git.kevinlegouguec.net/memory-leaks
Log | Files | Refs | README | LICENSE

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.