-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
1384 lines (1193 loc) · 70.2 KB
/
index.html
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
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2025-01-06 Mon 21:08 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Quake Emacs</title>
<meta name="author" content="Alexis Purslane" />
<meta name="description" content="A beautiful, modern, single-file, vanilla-first Emacs anti-distribution" />
<meta name="generator" content="Org Mode" />
<style>
#content { max-width: 60em; margin: auto; }
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #e6e6e6;
border-radius: 3px;
background-color: #f2f2f2;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: auto;
}
pre.src:before {
display: none;
position: absolute;
top: -8px;
right: 12px;
padding: 3px;
color: #555;
background-color: #f2f2f299;
}
pre.src:hover:before { display: inline; margin-top: 14px;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-authinfo::before { content: 'Authinfo'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }
</style>
<meta property="og:image" content="https://raw.githubusercontent.com/alexispurslane/quake-emacs/main/banner-quake.png" />
</head>
<body>
<div id="content" class="content">
<style>
body {
max-width: 65ch;
padding: 15px;
font-family: sans-serif;
margin: 0 auto;
background-color: #282828;
color: white;
}
blockquote {
border-left: 10px solid #665C54;
margin: 1.5em 10px;
padding: 0.5em 10px;
quotes: "\201C""\201D""\2018""\2019";
}
blockquote p {
display: inline;
}
li {
padding-top: 1ch;
}
pre {
background-color: #32302F;
color: white;
border: 1px solid #665C54;
}
a {
color: #FABD2F;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
a:visited {
color: #EEBD35;
}
p {
text-align: justify;
}
img {
display: block;
margin-left: auto;
margin-right: auto;
max-height: 300px;
}
</style>
<div align="center">
<img src="https://raw.githubusercontent.com/alexispurslane/quake-emacs/main/banner-quake.png" height="128" style="display: block; margin: 0 auto"/>
<h1>Quake Emacs</h1>
<p style="text-align: center;">A beautiful, modern, single-file, vanilla-first Emacs anti-distribution</p>
<img src="https://raw.githubusercontent.com/alexispurslane/quake-emacs/image-data/badge.svg"/>
<br/>
<a href="https://github.com/alexispurslane/quake-emacs">
<img src="https://img.shields.io/badge/GitHub-100000?style=for-the-badge&logo=github&logoColor=white"/>
</a>
</div>
<hr />
<p align="center">
<img src="https://raw.githubusercontent.com/alexispurslane/quake-emacs/image-data/dashboard.png" width="25%"/>
</p>
<p>
Quake Emacs is a single-file <a href="https://www.gnu.org/software/emacs/">Emacs</a> distribution aiming to provide the "just works out of the box" experience, sane defaults, and expected modern feature-set of an editor like <a href="https://helix-editor.com/">Helix</a> or <a href="https://github.com/doomemacs/doomemacs">DOOM Emacs</a>, while remaining as minimal a layer of abstraction as possible on top of vanilla Emacs and making the best possible use out of every built in Emacs feature before adding external packages.
</p>
<p>
If you want to use Emacs, but you:
</p>
<ol class="org-ol">
<li>just want to sit down and have your new text editor work well and look good <i>right away</i>, and</li>
<li>don't want the complexity, abstraction, and lack of documentation of a larger Emacs distribution or configuration framework,</li>
</ol>
<p>
then Quake Emacs is for you.
</p>
<div id="outline-container-org26b7656" class="outline-2">
<h2 id="org26b7656"><span class="section-number-2">1.</span> Table of Contents   <span class="tag"><span class="TOC_3_org">TOC_3_org</span></span></h2>
<div class="outline-text-2" id="text-1">
<ul class="org-ul">
<li><a href="#orge6827ab">Key Features</a></li>
<li><a href="#orga7bca8e">How To Install</a></li>
<li><a href="#orgbb12da5">Showcase</a>
<ul class="org-ul">
<li><a href="#org2a2f6a3">Simple Config</a></li>
<li><a href="#org287ae7a">Code Editing</a></li>
<li><a href="#org9c72556">Writing</a></li>
<li><a href="#orgd48363b">Note-taking</a></li>
</ul></li>
<li><a href="#org2789287">Justification</a></li>
<li><a href="#orgd85e8e2">Supported Languages</a>
<ul class="org-ul">
<li><a href="#orgaf21b95">Language Server</a></li>
<li><a href="#org338e9b4">Tree Sitter Grammar</a></li>
<li><a href="#orgcab2789">Tree Sitter Mode</a></li>
<li><a href="#org2c5b229">Built-In Language Support Matrix</a></li>
</ul></li>
<li><a href="#orgee0355a">Personal Configuration and Extra Layers</a></li>
<li><a href="#org4c09a7e">Keybindings</a></li>
<li><a href="#org030cc3e">Inspiration and Prior Art</a>
<ul class="org-ul">
<li><a href="#org0db298a">Doom Emacs</a></li>
<li><a href="#orgf691ad3">MinEmacs</a></li>
<li><a href="#org28b7012">Emacs Prelude</a></li>
<li><a href="#org37ceb5b">Emacs Bedrock</a></li>
</ul></li>
</ul>
<ul class="org-ul">
<li><a href="#orge994c39">Footnotes</a></li>
</ul>
</div>
</div>
<div id="outline-container-orge6827ab" class="outline-2">
<h2 id="orge6827ab"><span class="section-number-2">2.</span> Key Features</h2>
<div class="outline-text-2" id="text-2">
<ul class="org-ul">
<li>🎯 <b>Lean and focused</b>: Quake Emacs includes only the packages and configuration needed for a beautiful and modern coding experience, a distraction-free writing experience, and a powerful note-taking experience. It even mostly does away with the need for large language-specific collections of packages through the use of tree-sitter and LSP support! Consider Quake Emacs part of your editor, just there to give you a good out of the box experience to jump off from and make your own.</li>
<li>🚀 <b>Fast</b>: On my machine, with everything enabled, Quake Emacs loads in under 0.5 seconds. Every single package is carefully chosen with performance in mind, and the default load order is tuned obsessively to ensure Emacs starts as fast as possible. Enjoy fast startup times, or use it as extra headroom to add your own packages.</li>
<li>🥇 <b>Just one single file</b>: The Quake code itself is only one simple, extensively documented, self-contained 1000-line file. That's it. Just put the file in your Emacs directory and go. No external commands, no multiple thousands of lines of Lisp scattered throughout hundreds of files across interminable layers of abstraction. If you want to know where something is, or how it works, it's easy to find.</li>
<li>🌐 <b>Modern yet vanilla-first</b>: Despite having the modern UI/UX people have come to expect from an editor, Quake Emacs prioritizes <a href="https://b.tuxes.uk/avoiding-emacs-bankruptcy.html">using Emacs's built-in capabilities plus packages that integrate well with them</a> as much as feasibly possible. If a feature can be achieved through something in vanilla Emacs, that is always prioritized; if it can't, packages that build as much as possible on built in features are prioritized. Nevertheless, Quake holds a modern UI/UX experience as a very high priority – extra packages <i>will</i> be added when necessary to achieve that.</li>
<li>😇 <b>Uses god-mode</b>: Although Quake Emacs provides an extensive and well-integrated <a href="#orgee0355a">optional layer</a> for <code>evil-mode</code> users, core Quake Emacs instead focuses on <a href="https://github.com/emacsorphanage/god-mode"><code>god-mode</code></a> for those who want the power of blessedly key-modifier free modal editing within the holy domain of Emacs since <code>god-mode</code> is more in line with our philosophy of strategically using small packages to build on and enhance built in functionality, instead of replacing it entirely. For more information, please see <a href="#org4c09a7e">8</a>.</li>
<li>💻 <b>Self-updating</b>: Although Quake Emacs tries to avoid custom code and tooling, it also wants to avoid you having to deal with separate CLI programs outside of Emacs even more. In the interest of that, Quake Emacs is able to detect if there are new updates available for your editor asynchronously on startup and update itself if you ask it to (and only then) using git under the hood.</li>
</ul>
</div>
</div>
<div id="outline-container-orga7bca8e" class="outline-2">
<h2 id="orga7bca8e"><span class="section-number-2">3.</span> How To Install</h2>
<div class="outline-text-2" id="text-3">
<p>
Convinced?
</p>
<ol class="org-ol">
<li><p>
First, install the Quake Emacs project directly to your Emacs configuration directory, so Quake can take over your Emacs installation:
</p>
<div class="org-src-container">
<pre class="src src-sh">git clone --depth=1 -b main https://github.com/alexispurslane/quake-emacs.git ~/.emacs.d
</pre>
</div></li>
<li><p>
Then copy the example <code>user.el</code> provided with Quake to your Quake Emacs configuration directory at <code>~/.quake.d/user.el</code>:
</p>
<div class="org-src-container">
<pre class="src src-sh">mkdir -p ~/.quake.d/ && cp ~/.emacs.d/user.el ~/.quake.d/
</pre>
</div>
<p>
To update, just <code>git pull</code> to the latest tag. I recommend you check the release notes for the tag for any tips, known issues to avoid, etc.
</p></li>
<li>Once the directories are set up, simply launch Emacs and it should begin downloading and installing the packages that make up Quake Emacs, as well as configuring them. Installation is idempotent, and the install process can take some time, so feel free to close Emacs anytime you need to — it will pick up where it left off next time!</li>
<li>Once Quake Emacs has installed and configured all its packages, the next step will be making sure it supports the languages you want to work in, which leads us to the next section…</li>
</ol>
</div>
</div>
<div id="outline-container-orgbb12da5" class="outline-2">
<h2 id="orgbb12da5"><span class="section-number-2">4.</span> Showcase</h2>
<div class="outline-text-2" id="text-4">
</div>
<div id="outline-container-org2a2f6a3" class="outline-3">
<h3 id="org2a2f6a3"><span class="section-number-3">4.1.</span> Simple Config</h3>
<div class="outline-text-3" id="text-4-1">
<p>
Before I get to showing you any of the fancy things Quake Emacs can do, the most important thing is proving that it will be manageable for you to understand and fork if necessary, and won't lead either you or me to Emacs bankruptcy. One of the key things I've done in this regard is optimizing the layout of <code>init.el</code> to work with Emacs's built-in <code>outline-minor-mode</code> to help you get an overview of it and jump to specific things in it without needing finicky text search or getting overwhelmed:
</p>
<div id="org00a756e" class="figure">
<p><img src="https://raw.githubusercontent.com/alexispurslane/quake-emacs/image-data/outline-mode-compat.gif" alt="outline-mode-compat.gif" />
</p>
</div>
<p>
It's much more difficult to demonstrate code clarity and simplicity in a GIF, though, so if you're still skeptical, I highly encourage you to skim the <a href="https://github.com/alexispurslane/quake-emacs/blob/develop/init.el">source code</a> yourself.
</p>
<blockquote>
<p>
⚠️ Why isn't this a literate config? I've seriously considered it for code clarity reasons, but decided against it for a number of reasons:
</p>
<ol class="org-ol">
<li>First, as a literate config, I'd want to move all the per-layer documentation out of docstrings and into the org mode markup to avoid tedious duplication, but then eldoc wouldn't document layers for you.</li>
<li>Second, it would mean Quake Emacs would really be two files, instead of one and a user file, which is annoying. I do want it to be as self-sufficient as possible. In fact, I'm planning on making the user file optional.</li>
<li>Third, it adds a layer of indirection and complexity that goes against the core goal of Quake Emacs: with a literate config, I'd have to use org-tangle to 'compile' it before it could be loaded into Emacs, and it would be possible for the literate config and the tangled config to get out of sync locally, not to mention needing to use {C-c '} to edit the blocks.</li>
<li>And fourth, it would probably significantly slow start times, since =load=ing is slow, and I want to avoid that. However, I've tried to get as close to what a literate configuration file would offer by other means</li>
</ol>
<p>
Feel free to open an issue if you think this was a bad choice, though!
</p>
</blockquote>
</div>
</div>
<div id="outline-container-org287ae7a" class="outline-3">
<h3 id="org287ae7a"><span class="section-number-3">4.2.</span> Code Editing</h3>
<div class="outline-text-3" id="text-4-2">
<p>
Quake Emacs has fuzzy autocompletion with <a href="https://elpa.gnu.org/packages/doc/corfu.html">Corfu</a> and Orderless enabled everywhere.
</p>
<div id="orgdc1d8d0" class="figure">
<p><img src="https://raw.githubusercontent.com/alexispurslane/quake-emacs/image-data/fuzzy-autocompletion-everywhere1.gif" alt="fuzzy-autocompletion-everywhere1.gif" />
</p>
</div>
<p>
Full autocompletion even works in the Lisp Eval line (<code>M-:</code>). It's a real REPL, so why not have a real coding experience in it?
</p>
<div id="org47c9f54" class="figure">
<p><img src="https://raw.githubusercontent.com/alexispurslane/quake-emacs/image-data/fuzzy-autocompletion-everywhere2.gif" alt="fuzzy-autocompletion-everywhere2.gif" />
</p>
</div>
<p>
We also have a vertical fuzzy searching UI for popups, with live narrowing, like you're used to in other modern editors, available <b>using Emacs's built-in completion UI</b>, <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Icomplete.html">Icomplete</a>! No need for Vertico now that we have <code>icomplete-vertical-mode</code> and the ability to tweak icomplete's existing settings to remove all the limits and delays, and especially since <a href="https://github.com/oantolin/orderless">Orderless</a>, <a href="https://github.com/minad/marginalia">Marginalia</a>, and <a href="https://github.com/minad/consult">Consult</a> integrate with vanilla Emacs's existing functions and capabilities, so anything that makes use of them is automatically enhanced!
</p>
<div id="orgffc19c7" class="figure">
<p><img src="https://raw.githubusercontent.com/alexispurslane/quake-emacs/image-data/fuzzy-searching-everywhere.gif" alt="fuzzy-searching-everywhere.gif" />
</p>
</div>
<p>
Quake Emacs also features <a href="https://github.com/abo-abo/hydra?tab=readme-ov-file">which-key</a> for more discoverable keybindings, and <a href="https://github.com/emacsorphanage/god-mode">god-mode</a> for ergonomic modal editing while remaining fully compatible with vanilla Emacs – all the same mnemonics, commands, and concepts are available, you can just access them without twisting your fingers into pretzels!
</p>
<div id="org22764e3" class="figure">
<p><img src="https://raw.githubusercontent.com/alexispurslane/quake-emacs/image-data/which-key-leader-key.gif" alt="which-key-leader-key.gif" />
</p>
</div>
<p>
Quake Emacs also provides IDE class-features thanks to LSP support via <a href="https://github.com/joaotavora/eglot">Eglot</a> and <a href="https://github.com/casouri/eldoc-box">eldoc-box</a>, highly automatic <a href="https://www.emacswiki.org/emacs/Tree-sitter">tree-sitter</a> support with <a href="https://github.com/renzmann/treesit-auto">treesit-auto</a>, tree sitter structural editing support with puni, inline errors and linting and even quick-fixes with Eglot's integration with Flymake, and advanced language-agnostic debugging with <a href="https://github.com/svaante/dape">DAPE</a>. Here's just LSP and eldoc-box (and tree-sitter's syntax highlighting and structural navigation) on display:
</p>
<div id="orga0de000" class="figure">
<p><img src="https://raw.githubusercontent.com/alexispurslane/quake-emacs/image-data/ide-class-features.gif" alt="ide-class-features.gif" />
</p>
</div>
<p>
Quake Emacs also comes with <a href="https://github.com/AmaiKinono/puni">puni</a>, a vanilla-Emacs-first structural editing package similar to the more popular <a href="https://github.com/Fuco1/smartparens">Smartparens</a> but using Emacs's built in syntax tables and structural editing commands instead of requiring complex language-specific logic. For more on what that looks like in practice, click the link to puni in <a href="#org2789287">5</a> above.
</p>
<p>
And, Quake Emacs wouldn't be able to live up to its name unless it had a classic Quake-style popup terminal! So here it is, implemented entirely without any external packages, and bound to <code>SPC ~</code>:
</p>
<div id="orgffa4ae8" class="figure">
<p><img src="https://raw.githubusercontent.com/alexispurslane/quake-emacs/image-data/quake-term.gif" alt="quake-term.gif" />
</p>
</div>
</div>
</div>
<div id="outline-container-org9c72556" class="outline-3">
<h3 id="org9c72556"><span class="section-number-3">4.3.</span> Writing</h3>
<div class="outline-text-3" id="text-4-3">
<p>
For those of you who prefer to write your prose in the <a href="http://project.cyberpunk.ru/lib/in_the_beginning_was_the_command_line/#:~:text=thermonuclear">thermonuclear word processor</a>, I've created a beautiful but minimal (and fast) writing mode for <code>org-mode</code> buffers, which:
</p>
<ul class="org-ul">
<li>Uses mixed fonts to give you a WYSIWYG experience, including a variable pitch font of your choice for body text, typographically correct heading font sizes, bold, underlined, strikethrough, and monospace fonts for the appropriate markup, monospace fonts and syntax highlighting for code blocks, and more.</li>
<li>Uses <a href="https://github.com/joostkremers/visual-fill-column"><code>visual-fill-column-mode</code></a> to center your text and responsively soft wrap and fill it to <a href="https://www.researchgate.net/publication/234578707_Optimal_Line_Length_in_Reading--A_Literature_Review">65 columns</a> like a proper word processor.</li>
<li>Offers integration with <a href="https://vale.sh">Vale</a>, which provides extremely fast and customizable <a href="https://github.com/errata-ai/proselint">prose linting</a> – so that you have the advise of some of the English language's greatest writers and editors automatically applied to your prose, turning you into a Reverend Mother with a genetic memory for prose writing – and spellcheck (replacing <code>flyspell-mode</code> because it was causing half-seconf pauses every so often in sufficiently large files).</li>
<li>A custom <code>ispell</code> auto-correct function to go along with Vale's spellchecking facilities, allowing you to just hit a single key command and have the most likely correction be made to the current word.</li>
<li>Custom functions to use Embark to automatically add or remove words from your personal Vale spelling dictionary.</li>
<li>Hide extra headline stars.</li>
</ul>
<p>
Also, I've included the incredible <a href="https://github.com/oantolin/embark">Embark</a> package, which uses intelligent recognition of plain text patterns and the structured metadata many Emacs packages add to that plain text in various contexts, can show you menus of contextually-relevant actions for whatever's under your cursor, effectively turning any Emacs buffer – whether <code>org-mode</code> or not – or any Emacs interface into an intelligent, context-aware hypertext system. You can now insert and follow org links in any buffer, as well as many other things! Take a look at the huge number of concepts and contextual actions Embark supports out of the box <a href="https://github.com/oantolin/embark/wiki/Default-Actions">here</a>, and Quake even adds a few, such as the ones I mentioned above for spellchecking, and ones for running keyboard macros.
</p>
</div>
</div>
<div id="outline-container-orgd48363b" class="outline-3">
<h3 id="orgd48363b"><span class="section-number-3">4.4.</span> Note-taking</h3>
<div class="outline-text-3" id="text-4-4">
<p>
Many people use comprehensive external package for <code>org-mode</code> such as <a href="https://www.orgroam.com/"><code>org-roam</code></a> or <a href="https://protesilaos.com/emacs/denote">Denote</a> for Zettelkasten note taking. However, <code>org-mode</code> itself <a href="https://egh.github.io/org-mode-zettelkasten/START%20HERE.html">actually contains all the functionality necessary</a> for a Zettelkasten note taking system <i>in addition</i> to the more typical structured hierarchical note taking format Org lends itself to! This built in functionality includes:
</p>
<ol class="org-ol">
<li>Easily and instantly making new atomic notes, whether as headings in existing files, or totally new files in your notes directory with <code>org-capture</code>,</li>
<li>Quickly (with autocompletion) linking to any heading in any file in your notes directory from any other, or even external files, with <code>org-insert-link</code> and <code>org-insert-link-global</code>,</li>
<li>Easily browsing and searching through all of the headings in all of your note files, either looking for keywords, tags, or arbitrary metadata, using <code>consult-org-agenda</code> or <code>org-agenda</code> Search (for more features),</li>
<li>Searching the full text of your second brain with <code>org-agenda</code> Multi-Occur,</li>
<li>Referring to notes and headings universally through unique IDs instead of names or titles, so that you can freely change the titles of things without worrying about breaking links with <code>org-id-link-to-org-use-id</code>,</li>
<li>Finding backlinks to a note using <code>quake-org-backlinks</code>,</li>
<li>Easily capturing a link to a note with <code>org-store-link</code>,</li>
<li>Easily refile any note to any file or heading in your note directory using a customized <code>org-refile-targets</code>,</li>
<li>Follow any org link from any other file with <code>embark</code> and <code>org-open-at-point-global</code>.</li>
</ol>
<p>
This seems like a reasonably complete selection of features for a ZK system to me, and while using only built-in vanilla <code>org-mode</code> functionality for Zettelkesten note taking may be a little less featureful than the aforementioned packages, it has several advantages:
</p>
<ol class="org-ol">
<li>It allows you to learn less: you'll be using the same tools to manage, link, reference, search, create, and edit both hierarchical notes in the traditional org way, and ZK notes – the only difference will be just how you use those tools. There will be no extra commands to learn, no extra package manuals to consult, and nothing to install, so you won't miss anything if you switch away from Quake or temporarily have to use vanilla Emacs.</li>
<li>Since the tools will all be the same, and you can fluidly link to separate files or headings within files from any file, as well as fluidly using <code>org-capture</code> to create new note files as well as create new headings in the same file, doing things this way will allow you to fluidly move back and forth between hierarchical structured notes and ZK notes in whatever way makes sense to you, without having to use an inconsistent set of tools.</li>
<li>You can decide how you want to organize your notes: maybe you want each atomic note in its own file. Maybe you want to treat files as "vaults" of ZK notes, where each atomic note is a top level heading in that file. Maybe you want to create trees of atomic notes in each file. Do whatever you want! With the way Quake has <code>org-mode</code> configured, the tools should be convenient and intuitive no matter what you do.</li>
</ol>
</div>
</div>
</div>
<div id="outline-container-org2789287" class="outline-2">
<h2 id="org2789287"><span class="section-number-2">5.</span> Justification</h2>
<div class="outline-text-2" id="text-5">
<p>
With the introduction of various modern Emacs features <a href="https://lambdaland.org/posts/2024-12-14_emacs_catchup/">in the last few years,</a> and the emergence of a new generation of Emacs packages focused on integrating with vanilla Emacs, Emacs distributions as we have known them are less and less relevant:
</p>
<ul class="org-ul">
<li><code>use-package</code> means the large suites of macros layered on top of <code>package.el</code> (and sometimes external CLI commands) provided by configuration frameworks are no longer necessary: vanilla Emacs, by itself, is now capable of readable, clearly organized, declarative, self-installing package management, that is in fact far simpler than the alternatives provided by e.g. DOOM Emacs and far better documented and widely used (a community standard).</li>
<li><code>eglot</code> and <code>treesit.el</code> mean you no longer need to install external packages for excellent Language Server and Tree Sitter support (that in fact integrates better with built in Emacs concepts like <code>xref</code> and <code>forward-sexp</code> than the external alternatives) which in turn means that the language "layers" provided by large Emacs distributions are on their way out – no longer do you need to install and deeply configure five or six packages to support a language inside Emacs, it's either no packages (if the -ts mode is available in core Emacs) or one package for IDE-lite level support!</li>
<li>With the inclusion of <code>icomplete-vertical</code> and Prot's discovery of how to turn off all the delay timers in <code>icomplete</code>, live vertical fuzzy completion is available by default in core Emacs, no need for Ido, Ivy, Helm, or even Vertico.</li>
<li>With the integration of Tree Sitter queries into the syntax table in Emacs <code>-ts</code> modes (thanks to <code>treesit</code> being added in core), Emacs's <a href="https://dawranliou.com/blog/structural-editing-in-vanilla-emacs/">built in structural editing commands</a> can now operate on Tree Sitter concrete syntax trees, thus obviating the need for TS-specific packages like <a href="https://github.com/mickeynp/combobulate">Combobulate</a> and <a href="https://github.com/ethan-leba/tree-edit">tree-edit</a> which have to write and maintain queries for every language they want to support and stop working as soon as you use a language that doesn't have tree sitter yet. Instead, Quake Emacs relies on the built in Emacs structural editing commands and <a href="https://github.com/AmaiKinono/puni">puni</a>, which builds more advanced structural editing on top of them, allowing Quake Emacs to achieve language agnostic support for structural editing operations. These operations can gracefully degrade their functionality from Lisp, to Tree Sitter, to syntax tables and regular expressions, to just brackets/parens/etc, allowing the confident integration of structural editing into everyday text editing.</li>
<li>With new features in <code>org-mode</code>, large and complex packages like <a href="https://www.orgroam.com/"><code>org-roam</code></a> or <a href="https://protesilaos.com/emacs/denote">Denote</a> for ZK note taking aren't strictly necessary anymore. Likewise, through the combination of Embark and <code>org-mode</code>, Emacs can achieve a significant fraction of the implicit hypertext and information organization power of <a href="https://www.gnu.org/software/hyperbole/">GNU Hyperbole</a> with greater integration with the standard Emacs behavior and interface, and with other packages, and improved documentation.</li>
<li>Thanks to <code>orderless</code>, <code>marginalia</code>, and <code>corfu</code>, a rich interface infused with useful metadata, fuzzy searching, and auto-completion (even in the minibuffer) is achievable without any specific integration code.</li>
</ul>
</div>
</div>
<div id="outline-container-orgd85e8e2" class="outline-2">
<h2 id="orgd85e8e2"><span class="section-number-2">6.</span> Supported Languages</h2>
<div class="outline-text-2" id="text-6">
<p>
Three things are required for Quake Emacs to support a language using the modern language support facilities built in to it:
</p>
</div>
<div id="outline-container-orgaf21b95" class="outline-3">
<h3 id="orgaf21b95"><span class="section-number-3">6.1.</span> Language Server</h3>
<div class="outline-text-3" id="text-6-1">
<p>
Your language server, of course, does not need to be installed within Quake Emacs. It is an independent program you will need to install on your host system to a <a href="https://www.emacswiki.org/emacs/ExecPath">path</a> Emacs knows to look in for executables, at which point Quake Emacs's LSP package, Eglot, will probably be able to detect your language server automatically.
</p>
<p>
If Eglot cannot automatically detect your LSP, <a href="https://www.gnu.org/software/emacs/manual/html_mono/eglot.html#Setting-Up-LSP-Servers">it is easy to specify a custom language server for a given mode</a>.
</p>
<p>
Some languages, such as Common Lisp (SLIME/SLY) and Clojure (CIDER) have their own alternatives to a language server that you should use instead.
</p>
</div>
</div>
<div id="outline-container-org338e9b4" class="outline-3">
<h3 id="org338e9b4"><span class="section-number-3">6.2.</span> Tree Sitter Grammar</h3>
<div class="outline-text-3" id="text-6-2">
<p>
Tree sitter grammars are also technically external to Quake Emacs, since they are dynamic libraries that are loaded in at runtime; however, Quake Emacs's tree sitter support package expects them to be installed in a specific location by default (<code>~/.emacs.d/tree-sitter/</code>), and through the use of <code>treesit-auto</code>, Quake Emacs has a fairly large set of tree sitter grammers it knows how to automatically install from within the editor (please consult the language support matrix at the bottom of the parent section).
</p>
<p>
If <code>treesit-auto</code> does not have an auto-install recipe for the language you wish to use, simply use the built-in command <code>treesit-install-language-grammar</code> and follow the easy-to-understand prompts to install the grammar you want. After that, you should be all set!
</p>
</div>
</div>
<div id="outline-container-orgcab2789" class="outline-3">
<h3 id="orgcab2789"><span class="section-number-3">6.3.</span> Tree Sitter Mode</h3>
<div class="outline-text-3" id="text-6-3">
<p>
In order for Emacs to be able to interpret the meaning of the concrete syntax tree generated by the tree sitter grammar, it needs a tree-sitter mode for that language, to translate the syntax tree into font locking and syntax tables and so on. These are generally fairly simple to write, so a fair number of them are already built into Emacs, and more are being added over time (six in Emacs 30.1 alone!).
</p>
<p>
Nevertheless, some packages may need to be <a href="https://www.gnu.org/software/emacs/manual/html_mono/use-package.html#Installing-packages">added to your user.el</a> instead (remember to use <code>use-package :ensure t</code>, as the documentation link explains, instead of <code>package-install</code>, so that your configuration is reproducable on other machines).
</p>
<p>
For information on which are built into Emacs and which are not, please consult the language support matrix below.
</p>
</div>
</div>
<div id="outline-container-org2c5b229" class="outline-3">
<h3 id="org2c5b229"><span class="section-number-3">6.4.</span> Built-In Language Support Matrix</h3>
<div class="outline-text-3" id="text-6-4">
<p>
This matrix shows the list of languages that Quake Emacs has <b>built-in</b> support for in some capacity, and to what capacity that's true. There are many more languages that have tree-sitter modes available for them, and still more languages that Emacs supports in the traditional way, which can also be installed with <code>use-package</code> as mentioned above.
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Language</th>
<th scope="col" class="org-left">Tree-Sitter Mode Built In?</th>
<th scope="col" class="org-left">Tree-Sitter Grammar Auto Install?</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Bash</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">PHP</td>
<td class="org-left">✅</td>
<td class="org-left">❌</td>
</tr>
<tr>
<td class="org-left">Elixir</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">HEEx</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">HTML</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">LUA</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">C++</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">C</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">CMake</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">C#</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">CSS</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">Dockerfile</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">Go</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">Java</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">JS</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">JSON</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">Python</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">Ruby</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">Rust</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">TOML</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">TSX</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">TypeScript</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">Yaml</td>
<td class="org-left">✅</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">awk</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">bibtex</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">blueprint</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">clojure</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">commonlisp</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">dart</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">glsl</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">janet</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">julia</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">kotlin</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">latex</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">magik</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">make</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">markdown</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">nix</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">nu</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">org</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">perl</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">proto</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">r</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">scala</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">sql</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">surface</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">typst</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">verilog</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">vhdl</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">vue</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">wast</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">wat</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
<tr>
<td class="org-left">wgsl</td>
<td class="org-left">❌</td>
<td class="org-left">✅</td>
</tr>
</tbody>
</table>
<p>
If you want support for another language, one place to start is <a href="https://github.com/search?q=-ts-mode+emacs&type=repositories">the list of =-ts-mode=s available for Emacs on GitHub</a>.
</p>
</div>
</div>
</div>
<div id="outline-container-orgee0355a" class="outline-2">
<h2 id="orgee0355a"><span class="section-number-2">7.</span> Personal Configuration and Extra Layers</h2>
<div class="outline-text-2" id="text-7">
<p>
When writing custom configuration in your <code>user.el</code>, it is recommended that you separate your configuration out into logical groups according to general purpose, with each group contained within a function (and preferably with everything within those functions/groups bundled neatly into <code>use-package</code> declarations). This is precisely what Quake Emacs does — we call these logical units "layers", after the fashion of Doom Emacs and Spacemacs, although they're just regular functions, no boilerplate necessary — and it has a few benefits:
</p>
<ol class="org-ol">
<li>It means that your code is easier to fold and navigate with imenu without even needing to insert outline headlines, and easier to document in an accessible way, since you gain the ability to attach docstrings not just to individual utility functions or <code>use-packages</code>, but to logical groups of things, so you can document what you're doing and why at a higher level, essentially reproducing much of the benefit of a literate config.</li>
<li>It just means your code is more logically and neatly organized, the better to avoid Emacs bankruptcy.</li>
<li>Finally, it means that you can take advantage of Quake Emacs's existing logic for running layers, and slot your own code neatly anywhere you want in the Quake Emacs load order, in case you need to run before some things but after others, without having to modify the core <code>init.el</code> or do any other hacks.</li>
</ol>
<p>
Out of the box, Quake Emacs contains only the layers that you will absolutely need for a good general-purpose writing, note taking, and code editing experience, as explained above. However, if you find yourself needing more functionality, in addition to writing your own layers, I have a few Gists containing some layers I've constructed for personal use, here, which you can either use yourself, or treat as examples of how to write Quake Emacs layers:
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
</colgroup>