summaryrefslogtreecommitdiff
path: root/reviews/emacs/hype.org
blob: 03a54cc2db18659faa16736e06e0eb0628d4d53c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
Emacs's NEWS files are useful as a searchable reference, but they can
be overwhelming as an entry point.  In this file, I'm keeping track of
the changes /I/ am excited about.
* 29
** =:core= promotions
A couple of ELPA packages have moved to emacs.git, making them
available out of the box.

- eglot ("Emacs Polyglot") :: an LSP client that lets Emacs leverage
  language servers to boost completion-at-point, eldoc, flymake,
  imenu, project, xref.

- use-package :: a utility macro for configuring packages that makes
  init-file management more pleasant (and efficient to boot):
  - OT1H, brings some amount of structure and order when compared to a
    fully free-form DYI =.emacs=,
  - OTOH, allows more leeway on how to organize things, when compared
    to Custom's rigid auto-generated forms (e.g. using regular code
    comments, computing option values),
  - takes care of setting up the ~eval-after-load~ wizardry to keep
    startup snappy.
** ~global-text-scale-adjust~
~text-scale-adjust~ (bound to =C-x C-X= ∀ =X= ∈ =[=+-0]=) only scales
the font size in the current buffer; more often than not, one may want
to increase the default font size everywhere (e.g. when projecting
their screen).

To that end, users had to =M-x customize-face RET default= or =M-:=
~(set-face-attribute 'default nil :height …)~; now they can use the
new =C-x C-M-X= bindings to invoke ~global-text-scale-adjust~.
** ~split-root-window-{below,right}~
E.g. when you already have a vertical split, and you'd like to spawn a
full-height window to the side (instead of splitting either the top or
bottom window horizontally and keeping the other full-width).

Been missing this in both Emacs and Terminator; glad Emacs now has a
solution.

Part of the new window keymap on =C-x w=.
** ~rename-visited-file~
Instead of =C-x C-w NEWNAME RET M-! rm OLDNAME RET=.
** "fold hints" for outlines
~outline-minor-mode-use-buttons~ can be set to either

- =in-margins=: magit-section-like indicators,
- =t=: in-buffer buttons.

Initially the latter used arguably "garish" color emoji; with the
addition of the =icons.el= library, the way these buttons are
displayed can now be controlled with ~icon-preference~, which defaults
to more sober SVG images.
** ~imenu~ now bound to =M-g i=
Turns out that lots of modes define an imenu.
** ~setopt~ sets variables and runs their Custom setters
** "Pure GTK" Emacs
Some brave souls took it upon themselves to drag Emacs kicking and
screaming into The Wayland Future™: "pure GTK" means that Emacs will
only rely on GTK APIs, instead of a mix of GTK and X.

Try it out by giving =--with-pgtk= to =./configure=.  One caveat is
that GTK input methods… eat modifiers or something?  E.g. =S-SPC=
degrades to =SPC=.  Apparently Emacs users are the only ones to care
about that? 🤷

(Note for whoever feels like debugging that: this problem can be
reproduced on the X+GTK build by setting ~x-gtk-use-native-input~)
** Honorable mentions
These have me excited too, but I have nits to pick with the current
incarnation.
*** ~pixel-scroll-precision-mode~
Setting that minor mode with ~pixel-scroll-precision-interpolate-page~
makes =PageUp= and =PageDown= much smoother.  Would love for =M-v= and
=C-v= to use that as well…  Heck, would love for all scrolling,
jumping and recentering commands to use that.
*** Picking completions from the minibuffer
=M-<up>= and =M-<down>= in the minibuffer cycle through completion
candidates.  Would love for these to have non-arrow bindings
(e.g. =C-c C-[pn]= with a repeat map?).

Unsetting ~minibuffer-completion-auto-choose~ also lets the user
choose when to insert candidates in the minibuffer: =C-u M-RET= to
just insert, or =M-RET= to insert and immediately exit the minibuffer.
*** =C-x 8 e= keymap to search & insert emoji
Less hassle than =C-x 8 RET err what was the name again=, especially
for composed emoji 😵‍💫

Uses transient 👍 but relies on auto-generated, non-mnemonic =a-z=
suffixes to pick gender/color variations 👎 rather than taking
advantage of transient prefixes (e.g. =-g= for gender and =-s= for
skin tone), which

1. don't add an unecessary step for the common "ungendered Lego" case,
2. can remember a user's preferred values with ~transient-save~.

Upstream considers this idea "[[https://yhetil.org/emacs-devel/87ilxfx1ku.fsf@gnus.org/][fraught politically]]" 🤷

Others agree it would be [[https://yhetil.org/emacs-devel/87r1bx9pwo.fsf@bernoul.li/][nice-to-have, though not must-have]]; maybe
I'll take a stab at implementing it (making it opt-in, keeping the
alphabetical suffixes by default).
* 28
** Transient input methods
*** Background
Input methods make it easier to type in certain classes of characters.
Emacs includes different kinds of methods:

- alternative keyboard layouts :: if you are familiar with specific
  layouts, e.g. Dvorak, French AZERTY, Russian, you can ask Emacs to
  switch to this layout;

- composition :: some methods let you specify characters by typing in
  short sequences of other symbols:
  - =french-prefix= provides easy access to diacritics with e.g. ='e=
    for =é=, =,c= for =ç=;
  - =TeX= turns TeX macros such as =\alpha=, =\pi=, =\le=, =\ne=,
    =\wedge= into their corresponding characters, i.e. α, π, ≤, ≠, ∧.

Input methods can be toggled with =C-\=; prefix that with =C-u= to
select a new method.  =C-h I <METHOD>= shows what characters
=<METHOD>= supports.  =C-u C-x == on a character tells you how to
input that character with the current input method ("to input: …").
*** What's new
The new =C-x \= command enables an input method temporarily, just for
the next character, and disables it afterward.

As an occasional user of the =TeX= method, I find this useful because
I no longer need to choose between
1. enabling =TeX=, typing a sequence, disabling =TeX=, or
2. enabling =TeX=, typing a sequence, keeping =TeX= enabled, getting
   bitten by it whenever I type in =oh_no= and that turns into =ohₙo=.

=C-x \= seems to follow the same rules as =C-\=:
- the first time you call it, it prompts for a method,
- subsequent calls do not prompt,
- add =C-u= to get a prompt back.
** ~same-window-prefix~, ~other-window-prefix~, ~other-frame-prefix~
The rules which govern how Emacs manages windows are beyond my
reckoning.  I know [[https://protesilaos.com/codelog/2020-01-07-emacs-display-buffer/][it is possible to tame them]] with patience and
discipline; still, these new commands appeal to my humble caveman
brain.

Assuming the command run by key sequence =KEYSEQ= will display its own
buffer =BUF=,

- =C-x 4 1 KEYSEQ= says "please display =BUF= right here, in this
  window";
- =C-x 4 4 KEYSEQ= says "please display =BUF= in another window";
- =C-x 5 5 KEYSEQ= says "please display =BUF= in another frame".

These new ~other-…-prefix~ commands can be seen as generalizations of
specialized shorthands such as =C-x 4 f= or =C-x 5 b=.
** Visibility-cycling with =TAB= in outline.el
=TAB= and =S-TAB= now work in Outline mode like they do in Org.  Look
at e.g. NEWS (=C-h N=) to see them in action.  Customize
~outline-minor-mode-cycle~ to enable this in ~outline-minor-mode~.

One small, /tiny/ step toward chipping good features out of Org in
order to generalize them.
** ~yank-from-kill-ring~
I've always been somewhat ambivalent about Emacs's ~kill-ring~:

1. Everything I ever copied is saved forever!  This is a revolutionary
   feature on par with the undo system 🙌

2. … Surely we can find a more ergonomic UI than =C-y M-y M-y M-y=
   /dammit/ =C-_ C-_= /ah screw it/ =C-h v kill-ring RET C-s= 🤔

And lo!  =M-y= now prompts for the ~kill-ring~ item to yank, with
completion.  This makes the ~kill-ring~ much more accessible IMO.
** repeat-mode
=C-x o o o=!
** ~completions-group~, ~read-char-by-name-sort~
Some very welcome quality-of-life tweaks to =C-x 8 RET=.
** Gnus
*** =#= now toggles the process mark by default
No need for =M-#= anymore.
** Vertical icomplete
*** Settings
- ~completions-detailed~
- ~icomplete-scroll~
- ~icomplete-vertical-mode~
*** Advantages over plain icomplete
- annotations
- completion candidates are easier to tell apart
- =C-n= and =C-p= (=C-.= is awkward on AZERTY)
*** Advantages over Ivy and Vertico
- regular minibuffer bindings work:
  - =SPC= completes
  - =RET= yields current input, disregarding completion candidates
  - =C-j= yields selected completion candidate
- regular icomplete bindings work:
  - =C-M-i= inserts selected completion candidate
** Dired
*** ~dired-kill-when-opening-new-dired-buffer~
With this option, =RET= and =^= no longer make Dired buffers pile up 🎉

Previously, =a= (~dired-find-alternate-file~) could be used instead of
=RET=, but one had to write a custom command for =^=.
** Help
*** Outline in ~describe-bindings~
~describe-bindings-outline~ makes =C-h b='s output less overwhelming.
*** New commands for ~describe-{function,variable}~:
- =c= :: for variables, bring up the *Customize* UI,
- =i= :: bring up the relevant *Info* page,
- =s= :: jump to the *source* definition.
*** ~shortdoc-display-group~
Concise reference docs for specific topics.
* 27
** ~what-cursor-show-names~
I sometimes use =C-u C-x == to (re)discover how the Unicode consortium
decided some character should be called; having plain =C-x == give me
that information without popping an extra buffer is neat.