-
Notifications
You must be signed in to change notification settings - Fork 5
/
help.txt
8965 lines (7379 loc) · 278 KB
/
help.txt
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
Grant Rettke
Table of Contents
_________________
1. README
.. 1. HELP Enables Literate Programming
.. 2. Style Guide
.. 3. History
..... 1. Version 1: Sufficient And Slipshod
..... 2. Version 2: How to design a file conservator (HTDFC) or The Care and Conservation of Computer Files (TC3F)
..... 3. Version 3: ALEC'S A LANGUAGE FOR EXPRESSING CREATIVITY (ALEC)
..... 4. Version 4: HELP Enables Literate Programming
2. Special Operating Procedure
.. 1. Benchmark
.. 2. Customize
.. 3. Display
.. 4. Hydra
.. 5. Keyboard
.. 6. Libraries
.. 7. Modeline
.. 8. macOS
.. 9. Windows
.. 10. Linux
3. Standard Operating Procedure
.. 1. Helper Functions
.. 2. Typography
.. 3. Buffer
.. 4. Code Folding
.. 5. Emacs Lisp Macros
.. 6. Evaluation
.. 7. Encryption
.. 8. Eshell
.. 9. File Based System
.. 10. IMenu
.. 11. Interactive User Interface Completion
.. 12. Font
.. 13. Going to Objects
.. 14. Grammar
.. 15. Keyboard Macros
.. 16. Word Completion
.. 17. Mark, Kill and Region
.. 18. Minibuffer
.. 19. Mouse
.. 20. Occur
.. 21. Popups
.. 22. Projects
.. 23. Printing
.. 24. Register
.. 25. Replacing
.. 26. Save and Restore Operating State
..... 1. Mark
..... 2. Minibuffer
.. 27. Searching
..... 1. Internal
..... 2. External
.. 28. Spell Checking
..... 1. Org-Mode
.. 29. Syntax Checking
.. 30. TAB
.. 31. TODOs
.. 32. Version Control
.. 33. Video
.. 34. Whitespace Management
.. 35. whoami
.. 36. Word Wrap
4. Hacking
.. 1. Common Configurations
..... 1. Special Mode
..... 2. Text-Mode
..... 3. Prog-Mode Modes
..... 4. Prog-Mode Hook Function
.. 2. Literate Programming
..... 1. Emacs Lisp
..... 2. Org-Mode
..... 3. Intermittent Literate Programming
..... 4. Transliteration
..... 5. Words
..... 6. Dash
.. 3. Unicode
..... 1. System
..... 2. Font
..... 3. Utility
..... 4. Hydra
.. 4. Applied Mathematics
..... 1. APL
..... 2. Scheme
..... 3. C
..... 4. Go
..... 5. Python
..... 6. YASnippet & Abbrev
..... 7. Structured Query Language (SQL)
..... 8. Web Development
..... 9. JavaScript
..... 10. AppleScript
..... 11. Emacs Speaks Statistics (ESS)
.. 5. Data
..... 1. JSON
..... 2. YAML
..... 3. Comma-Separated Values (CSV)
..... 4. Sparkline
.. 6. Publishing
..... 1. AUCTeX
..... 2. KOMA-Script
..... 3. BibTeX
..... 4. Texinfo
..... 5. Pandoc
..... 6. Markdown
..... 7. HTML
..... 8. ASCII
..... 9. Beamer
..... 10. Screenwriting
.. 7. DevOps
..... 1. Shell Scripty
..... 2. Make
..... 3. Vagrant
..... 4. Apache
..... 5. SSH
..... 6. CRON
..... 7. Ansible
.. 8. Multimedia
..... 1. Artist
..... 2. DITAA
..... 3. Graphviz
..... 4. PlantUML
..... 5. X PixMap (XPM)
.. 9. Computer-aided design
.. 10. Special
5. Quiet and Pleasant Appearance
.. 1. Buffer
.. 2. Color Theme
.. 3. Comint
.. 4. Font
.. 5. Frame
..... 1. Inviting and familiar GUI features
.. 6. Pointer
.. 7. Version Control
.. 8. Window
6. Piano Lessons
.. 1. A Fine Cup of EMACS
.. 2. A Keyboard on Every Desk
.. 3. A Display with Every Keyboard
.. 4. A Full Pot of EMACS on Every Desk
..... 1. Keyboard Layout & Operation
..... 2. Understanding Your Cognitive Landscape.
..... 3. Key-Bindings Take You to Places to Perform Activities
..... 4. How to Get There Pleasantly and Quickly
..... 5. Building Your Own Keyboard
.. 5. Take a Sip
..... 1. Left Side
..... 2. Left & Right Side
..... 3. Right Side
..... 4. Exceptions
1 README
========
ID: org_gcr_2017-05-12_mara:3DBC61FF-D790-471A-904F-DABFB0DABA1F
Configure EMACS to for everything defined within this monolithic system.
Sysop is likely to use this constantly.
Start EMACS with this command:
,----
| emacs --debug-init --no-init-file --no-splash --background-color white --foreground-color black --vertical-scroll-bars --eval '(switch-to-buffer "*Messages*")' --name HLP-TEST --title HLP-TEST --load ~/src/help/.emacs.el &
`----
EMACS values dynamic-scoping for now and in the future.
EMACS values lexical-scoping in the future.
There are pecuilar interactions between [lexically and dynamically scope
closures] and [special variables].
With the future in mind, make the switch now.
It is enabled with a non-nil buffer-local variable `lexical-binding'. The
variable is inserted only here because it loads each of the child
configurations. Web.
Never compile this.
,----
| ;; -*- lexical-binding: t; no-byte-compile: t; -*-
`----
,----
| ;; Added by Package.el. This must come before configurations of
| ;; installed packages. Don't delete this line. If you don't want it,
| ;; just comment it out by adding a semicolon to the start of the line.
| ;; You may delete these explanatory comments.
| ;;(package-initialize)
|
| (load-file "~/src/help/.org-mode-contribute.emacs.el")
`----
[lexically and dynamically scope closures]
<https://yoo2080.wordpress.com/2011/12/31/lexical-scoping-and-dynamic-scoping-in-emacs-lisp/>
[special variables]
<https://yoo2080.wordpress.com/2013/08/14/invasion-of-special-variables-in-emacs-lisp/>
1.1 HELP Enables Literate Programming
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ID: org_gcr_2017-05-12_mara:73599C3B-39B0-4979-86C2-E4AC068AAC79
*Setup*
1) [Clone Org-Mode] to `~/src/'
2) Go there.
,----
| cd ~/src/org-mode
`----
3) Build it
1) Without `Make': [Generating autoloads and Compiling Org without make]
1) As of <2016-01-19 Tue> this means doing this:
,----
| emacs -batch -Q -L lisp -l ../mk/org-fixup -f org-make-autoloads
`----
2) With `Make' use `make'.
4) [Clone Org2Blog] to `~/src/'.
5) [Clone Use-Package] to `~/src/'.
6) Install supporting software adding their exectuable location to the `PATH'.
1) Install [Oracle Java].
2) Install [LanguageTool] renaming it's folder to `LanguageTool'.
3) Install PlantUML.
4) Install Ditaa.
5) Install [MacTeX].
7) Link:
- The Eshell directory to HELP's.
- `ln -s ~/src/help/eshell/ ~/.emacs.d/eshell'
- The Initialization file to HELP's.
- `ln -s ~/src/help/.emacs.el ~/.emacs.el'
[Clone Org-Mode] <http://orgmode.org/>
[Generating autoloads and Compiling Org without make]
<http://orgmode.org/worg/org-hacks.html>
[Clone Org2Blog] <https://github.com/punchagan/org2blog>
[Clone Use-Package] <https://github.com/jwiegley/use-package>
[Oracle Java] <https://www.oracle.com/java/index.html>
[LanguageTool] <https://www.languagetool.org/>
[MacTeX] <https://tug.org/mactex/>
1.2 Style Guide
~~~~~~~~~~~~~~~
ID: org_gcr_2017-05-12_mara:280391BE-63FC-4E2E-B734-AF18A449FA96
- Appearance.
- Never override theme colors.
- When the theme doesn't configure a face then submit a patch.
- Content
- When importing update to conform with Style-Guide.
- Keep tangled and weaved documents synchronized with their web.
- Ask yourself:
- Does it belong in this web?
- Does it belong in this headline?
- Dictionary
Exemple Complet Minimal (ECM)
The minimal complete example of expected versus actual behavior.
[Source].
Key-Bind
A verb. The act of creating a Key Binding.
Literate Programming (LP)
As Knuth intended.
Out of the Box (OOTB)
The default configuration.
Sysop
A proper noun. The System-Operator. The human operating this EMACS
based Org-Mode enabled literate programming system. The reader.
Tangle
A verb. Assemble a document for consumption by another program or
machine.
Weave
A verb. Prepare a document for consumption by a human.
Web
A document contained Source-Block definitions that define a system.
- Encoding
- Prefer Unicode characters over ASCII equivalents.
- Note eventual switch form PDFLaTeX to LuaTeX.
- Consider Org-Mode automatic handling of ASCII to UTF-8 symbols.
- File/Package Loading
- Load every one with `use-package' whether it came with EMACS OOTB or ELPA.
- `ensure t' tells the reader which one it came from.
- Binding definitions often live in Piano Lessons.
- Configurations aren't meant to be fully transplant-able because this
system monolithic. In the interest of collaboration as much of the package
configuration lives in the `use-package' block as possible.
- Formatting
- Code Snippet.
- Key bindings
- Programming language expressions
- Variable names
- Emacs mode function name, package name or Github name. This is the most
technical name that you can and do use in scripts It is meant for
computers.
- `org-mode'
- Class and Object names
- Shell commands that are executable
- Executable for programming language compilers and interpreters. To
clarify these are either the executable names or the human names for
example `gcc versus ~C'.
- `gcc' and `python'
- `bash' and `perl'
- `scheme' and `java'
- `GCC' and `Python'
- `Bash' and `Perl'
- `Scheme' and `Java'
- Anything that you would read program or text
- Use `code style' of tildaes
- Non-Code Snippet.
- ALL PROPER NOUNS
- File types
- File names
- Emacs mode name: THE HUMAN VERSION
- Other stuff like function-name and package-name and Github name are
not how humans write about them. Humans write about them like any
other proper noun for example "Coca Cola" not "coca cola".
- Org-Mode is the best example
- Concepts like `Object Oriented Programming' or a `Immediately-invoked
function expression'
- Use `verbatim' style of equal sign
- Package.
- Same as Headline.
- Dashes separate definition.
- Acronyms are all upper case to distinguish from words for example "GNU"
vs "Gnu".
- Headline.
- Be sure that every one has an `ID' property with a `UUID' value.
- `org-id-get-create' does this. So does code in Hacking/Org Mode/Utility.
- Capitalize: nouns, verbs, and adjectives.
- Don't capitalize conjunctions unless they are starting the definition.
- Sell this "chapter" to the reader.
- Some headlines will be empty and significant; keep them.
- Some modes don't require any configuration. The headline still needs to
be present to remind the reader to keep it in her cognitive landscape.
Configure other properties and modes taking it into account.
- For every language under Hacking you should:
- Only include it if it is valuable and you will invest adequate time to
configure this well and use it well. When reading Org-Mode examples
you will want to add Org-Mode language support because it is easy and
fun and then you are left with an insufficiently configured
environment. That is unacceptable.
- Enable it in `org-babel-load-languages'.
- Read the user manual for it.
- The `Prog-Mode' system configuration can result in Headlines that don't
need any configuration. The Headline still communicates the mode's value
to the reader even if it doesn't configure EMACS.
- It is important to include headlines that are empty and that you may not
even end up keeping. You need them to help you explore the cognitive
landscape with them present. In this one case, premature optimization is
/not/ the root of all evil.
- Sometimes headlines might better be:
- List items.
- Stand-alone bold text without punctuation.
- Hyperlink.
- External.
- Exclude those easily found with a search-engine unless you are willing
to verify their existence frequently.
- Include when they make the task at hand immensely easier.
- Internal.
- Minimize usage.
- Literate Programming.
- Comments.
- Exclude from tangle-blocks and rely on source-block for traceability.
- Noweb-Ref.
- Same as Headline.
- Replace spaces with dashes.
- Probably the Heading name.
- Keep depth shallow
- Weaver and mode configurations are tightly bound.
- Maintenance.
- Frequently check spelling, grammar, and weasel-words.
- Only keep working features in the system.
- Macros
- Rendered as written-text.
- Don't contain source code.
- Create for ideas expressed more than 2 times.
- Expanded during weaving, not during tangling.
- Plain List.
- End single sentences with a period.
- Programming Language.
- Emacs-Lisp.
- Almost always use `defun' instead of `advice-add'.
- Functions are more normal and predictable.
- Advice can subtly break without you noticing.
- Parameter.
- `nil' for `FALSE'.
- `t' for `TRUE'.
- `n' for numerical values.
- Never `custom-set-variables'.
- Always use relative file paths.
- Byte-compile frequently to minimize System warnings.
- Prefer to byte-compile all references by using `function'.
- Fail-fast: it is better to know immediately if there are resolution
issues.
- Prefer to declare anonymous functions with `function'.
- [Quoted via].
- If a non-special variable appears outside of a let form, the
byte-compiler will warn about reference or assignment to a "free
variable". An unused non-special variable binding within a let form
provokes the byte-compiler will warn about an "unused lexical variable".
The byte-compiler will also issue a warning if you use a special
variable as a function argument.
- Source Block
- Be sure that every one has a `NAME' property with a `UUID' value.
- YASnippet `sc' does this. So does code in Hacking/Org Mode/Utility.
- Tell the story in speech, and then in code.
- Communicate the intent in written language as one paragraph and realize
that intent in the next paragraph as a source block. Separate the two
paragraphs like you would any other paragraph.
- The exporter will probably separate the two as you would expect whether
you separate the two entities with a space or not
- When contained within a list:
- Indent begin/end blocks with list content; this makes it clear to
Org-Mode to export it as a code block.
- Tangle `:file' should have the same `NAME'.
- Virtually never edit the contents within buffer-of-origin.
- Out of buffer edits:
- Fast when spoken language.
- Risky when LISP.
- While similar to Org-Macro, the `RESULT' formatting indicates to the
reader that the value is the result of an evaluation.
- Spelling
- Place `LocalWords' at the beginning of the document. That way it won't get
stomped on during development.
- Synonyms.
- Document and System and Web.
- A Web defines a system.
- This document is a Web.
- Weave and Export.
- Sysop and Reader.
- Tangling.
- When ordering matters, rely on block-reuse to enforce correct order.
- Voice.
- Provide answers; do not pose questions or observations.
- Simple and detailed.
- Pleasant conversation style.
- Audience is Sysop; the author included.
- Capture decisions that allow this system to move forward.
- Weaving.
- Strive to keep the weaving in synchronization with the tangling.
- Word Choice.
- Use Arabic numerals.
- Instead of writing "tells EMACS", communicate the result.
- "EMACS" refers to the EMACS software
- "HELP" refers to the system configured by tangling this we.
- Never describe something as "perfect" or "delightful". If it is part of
this system then it is perfect and delightful.
[Source] <http://orgmode.org/worg/org-faq.html>
[Quoted via]
<https://www.gnu.org/software/emacs/manual/html_node/elisp/Using-Lexical-Binding.html#Using-Lexical-Binding>
1.3 History
~~~~~~~~~~~
ID: org_gcr_2017-06-25_mara:F917FFA6-077B-4A9A-B325-7E9A0CFF9720
1.3.1 Version 1: Sufficient And Slipshod
----------------------------------------
ID: org_gcr_2017-06-25_mara:2AE32991-F8DA-4205-822C-51A267EC81D6
Emacs never grew on me the first few times I tried using it. The first was out
of curiosity because a friend used `jdee'. Five or ten years later I tried
using it for `clojure' and lost interest first in `clojure' and then in Emacs.
The third time was for `ocaml' and `sml'. That worked pretty well but I didn't
stick with `sml' so I didn't stick with Emacs either. At least five
configuration files came out of this time all hand-coded Elisp and they are
all either lost or hanging around in a SVN repository on a backup. I never had
a sense of how Emacs worked, found any of it interesting or a problem solved
by it. That is a reflection of what I did and what I brought to it. And I
understand that.
1.3.2 Version 2: How to design a file conservator (HTDFC) or The Care and Conservation of Computer Files (TC3F)
---------------------------------------------------------------------------------------------------------------
ID: org_gcr_2017-06-25_mara:8BD93843-0D61-45FA-98F4-C3BBA0FFBB47
The second time around, VIM got me hooked on Emacs. /Growing up/ with VIM I
had returned to `gvim' and I was happy with plain old text files. For keeping
todo lists, meeting minutes and working in LaTeX both worked great. That
process of re-falling in love with plain old text files is what struck me.
Once I heard the Org-Mode tag line "your life in plain text" I knew I had to
take a look. And I did and it was delightful.
And I was hooked. The line pulled me into pure exploration. Reading the
manuals, blogs and other folks' configuration files was an boundless
adventure. This was entirely about learning different libraries and
configuration options. And it was pretty fun. It was still hand coded Elisp
and probably went through ten iterations until I was happy with it.
It meant so much to me that I started naming the configuration finally ending
up with [TC3F].
[TC3F] <https://raw.githubusercontent.com/grettke/home/master/TC3F.txt>
1.3.3 Version 3: ALEC'S A LANGUAGE FOR EXPRESSING CREATIVITY (ALEC)
-------------------------------------------------------------------
ID: org_gcr_2017-06-25_mara:1D2B647B-DAEC-42FE-97C8-777CF8869C52
ALEC is the Cambrian Explosion of my cognitive model of Emacs. Creativity
abounded like never before. The technology reflected it, enabled and grew into
the finest external tool that I had ever known. The passages elaborate on the
technology, the thought processes and justification and go on much further
into the nature of creativity, cognition and their grand intersection.
That intersection was in the great plains, steaming jungles and snow capped
mountain peaks. It was everywhere and I was everywhere. This was the point
where I stopped pretending that it was written for anyone else other than me.
Part of that admission was finally understanding what it means to learn about
how we think and how we use that to craft, shape and hone our tools. Emacs is
referred to in the singular but it is really a collection of hundreds of
creative parts. The work here helped me start to narrow down what I was trying
to do and to think. And I thought that I wanted to learn Literate Programming.
So I did and I tried and it was a slow and confusing document because that is
how it lived in my mind. There were hundreds and hundreds of commits until I
was both happy enough with it and comfortable enough to share it. This was the
first time that I started to feel like I had some clue about what I was doing.
1.3.4 Version 4: HELP Enables Literate Programming
--------------------------------------------------
ID: org_gcr_2017-06-25_mara:64CA819C-71AD-4E6E-9091-4FFCA95AAF08
HELP was more than an attempt to create a recursive acronym. It /really was
helpful/. Every good idea from ALEC got simplified and moved in here.
Exploration of the tool and of creative processes were still part of it. But
the bigger part was learning, studying and practicing Literate Programming
(LP).
Donald Knuth wrote a lot /about/ LP and /wrote/ a lot /in/ LP. That is
revealing. To get the most about of LP you need to love programming. And you
need to love writing. Really you need to love writing in whatever form that
takes for you. And finally you need to love doing both together. Literate
programmers are few and far between simply because the combination the three
desires are uncommon. Despite that it is still fun to practice LP. And
Org-Mode does LP so well.
Org-Mode's LP tools are stunning and flawless. They shine so brightly that it
can be difficult to take a look and see what is possible. HELP is my attempt
to take the options that configure them building the perfect LP environment
for me. Though HELP is still somewhat wild and unrefined the LP components are
both precisely configured /and/ understood. Probably only to me and I am fine
with that. Teaching LP with Org-Mode would be an entirely different task!
Mark my words for they are sure to change here and probably be struck down by
the idiom-zapper plugin that I've yet to write: this will be a stable version
of my Emacs configuration for a long time. All of my original desires are
satisfied. This fine tool, the infinite abacus, has sat in this hearth long
enough. Now it is time to carry it out into the wilderness and far above and
beyond the mountaintops to reveal the other side and the mysteries that they
reveal.
2 Special Operating Procedure
=============================
ID: org_gcr_2017-05-12_mara:A5B71AC0-1725-4416-AB50-86496180526A
The following code and packages are special to this configuration. They
provide critical functionality for configuring the rest of the system. They
provide ideas that make the entire system usable, productive, expressive, and
fast.
2.1 Benchmark
~~~~~~~~~~~~~
ID: org_gcr_2018-09-21T18-57-01-05-00_cosmicality:32215650-08D5-448E-8EFE-885CA41A824A
Report startup benchmarks from here forward.
,----
| (use-package benchmark-init
| :ensure t
| :config
| (defun help/benchmark-deactivate ()
| (benchmark-init/deactivate)
| (benchmark-init/show-durations-tabulated)
| (benchmark-init/show-durations-tree))
| (add-hook 'after-init-hook #'help/benchmark-deactivate))
`----
2.2 Customize
~~~~~~~~~~~~~
ID: org_gcr_2017-05-12_mara:C8E7E545-E716-4ACE-9536-B7278F843632
Easy Customization is great. Though most of the time I move the settings into
hand-coded Elisp, I still love it.
Store Customizations in another file. Avoids the [package-selected-packages]
portability issue.
,----
| (setq custom-file "~/src/help/custom.el")
| (load custom-file :noerror)
`----
[package-selected-packages]
<https://www.reddit.com/r/emacs/comments/53zpv9/how_do_i_get_emacs_to_stop_adding_custom_fields/>
2.3 Display
~~~~~~~~~~~
ID: org_gcr_2017-05-12_mara:AC7B6F6A-EB1C-49AA-89F3-0B5DAC8BD759
Make it easy to conditionally evaluate code when running with a graphical
display.
,----
| (defmacro help/on-gui (statement &rest statements)
| "Evaluate the enclosed body only when run on GUI."
| `(when (display-graphic-p)
| ,statement
| ,@statements))
|
| (defmacro help/not-on-gui (statement &rest statements)
| "Evaluate the enclosed body only when run on GUI."
| `(when (not (display-graphic-p))
| ,statement
| ,@statements))
`----
2.4 Hydra
~~~~~~~~~
ID: org_gcr_2017-05-12_mara:96FBC635-B614-479C-BFA4-E9AE3D70EB8B
,----
| (use-package hydra
| :ensure t)
`----
2.5 Keyboard
~~~~~~~~~~~~
ID: org_gcr_2017-05-12_mara:63790E33-FB60-4C0E-A13E-907D5A175CEC
Key-Chord mode is amazing. Piano-Lessons shows you how.
,----
| (use-package key-chord
| :ensure t
| :config
| (key-chord-mode t))
`----
Echo keystrokes immediately.
,----
| (setq echo-keystrokes 0.02)
`----
2.6 Libraries
~~~~~~~~~~~~~
ID: org_gcr_2017-05-12_mara:E1A8398D-E2F6-485B-83FB-CE52AE9A5D1B
Lists.
,----
| (use-package dash
| :ensure t
| :config
| (dash-enable-font-lock))
| (use-package dash-functional
| :ensure t)
`----
Files and directories.
,----
| (use-package f
| :ensure t)
`----
Strings.
,----
| (use-package s
| :ensure t)
`----
Hash-tables.
,----
| (use-package ht
| :ensure t)
`----
Caching.
,----
| (use-package persistent-soft
| :ensure t)
`----
`CL-LIB'.
,----
| (require 'cl-lib)
`----
2.7 Modeline
~~~~~~~~~~~~
ID: org_gcr_2017-05-12_mara:953129BC-045D-43B5-A194-904818E44FC7
Reduce information about modes in the Modeline.
,----
| (use-package diminish)
`----
Show the file size.
,----
| (size-indication-mode)
`----
Show the column number.
,----
| (column-number-mode t)
`----
Configuration uses active theme.
,----
| (use-package smart-mode-line
| :ensure t)
`----
Emacs mode for hiding the mode-line from [Bastien].
,----
| (defvar-local hidden-mode-line-mode nil)
|
| (define-minor-mode hidden-mode-line-mode
| "Minor mode to hide the mode-line in the current buffer."
| :init-value nil
| :global t
| :variable hidden-mode-line-mode
| :group 'editing-basics
| (if hidden-mode-line-mode
| (setq hide-mode-line mode-line-format
| mode-line-format nil)
| (setq mode-line-format hide-mode-line
| hide-mode-line nil))
| (force-mode-line-update)
| ;; Apparently force-mode-line-update is not always enough to
| ;; redisplay the mode-line
| (redraw-display)
| (when (and (called-interactively-p 'interactive)
| hidden-mode-line-mode)
| (run-with-idle-timer
| 0 nil 'message
| (concat "Hidden Mode Line Mode enabled. "
| "Use M-x hidden-mode-line-mode to make the mode-line appear."))))
`----
Fancy progress indicator.
,----
| (use-package unicode-progress-reporter
| :ensure t
| :config
| (unicode-progress-reporter-setup))
`----
[Bastien] <https://emacs-doctor.com/emacs-hide-mode-line.html>
2.8 macOS
~~~~~~~~~
ID: org_gcr_2017-05-12_mara:BC848D6F-7915-4151-8368-D473CA39E7C3
Make it easy to evaluate code only when running on macOS
,----
| (defmacro help/on-mac-os (statement &rest statements)
| "Evaluate the enclosed body only when run on macOS."
| `(when (eq system-type 'darwin)
| ,statement
| ,@statements))
`----
Pull in the `ENVIRONMENT' variables because the GUI version of EMACS does not.
,----
| (help/on-mac-os
| (use-package exec-path-from-shell
| :ensure t
| :config
| (setq exec-path-from-shell-check-startup-files nil)
| (setq exec-path-from-shell-debug 1)
| (exec-path-from-shell-initialize)))
`----
Configure the meta keys.
Use the macOS modifiers as Emacs meta keys. Don't pass them through to macOS.
Easily allow option pass through for alternate input methods.
,----
| (help/on-mac-os (load-file "~/src/help/.mac-os-keys.el"))
|
`----
Run a bare Emacs instance on macOS like this:
,----
| emacs --debug-init -no-init-file --load ~/src/help/.mac-os-keys.el&
`----
EMACS dialogues don't work macOS. They lock up EMACS.
This is a known issue. [Here] is the solution.
,----
| (help/on-mac-os
| (defun help/yes-or-no-p (orig-fun &rest args)
| "Prevent yes-or-no-p from activating a dialog."
| (let ((use-dialog-box nil))
| (apply orig-fun args)))
| (advice-add #'yes-or-no-p :around #'help/yes-or-no-p)
| (advice-add #'y-or-n-p :around #'help/yes-or-no-p))
`----
[Here]
<https://superuser.com/questions/125569/how-to-fix-emacs-popup-dialogs-on-mac-os-x>
2.9 Windows
~~~~~~~~~~~
ID: org_gcr_2017-05-12_mara:F59CD0F9-9B04-493E-AA9A-2471F2ED0A05
Make it easy to evaluate code only when running on Windows.
,----
| (defmacro help/on-windows (statement &rest statements)
| "Evaluate the enclosed body only when run on Microsoft Windows."
| `(when (eq system-type 'windows-nt)
| ,statement
| ,@statements))
`----
Provide the proper shell.
,----
| (help/on-windows
| (setq shell-file-name "cmdproxy.exe"))
`----
Enable the `super' key-space.
,----
| (help/on-windows
| (setq w32-pass-lwindow-to-system nil)
| (defvar w32-lwindow-modifier 'super)
| (setq w32-pass-rwindow-to-system nil)
| (defvar w32-rwindow-modifier 'super))
`----
2.10 Linux
~~~~~~~~~~
ID: org_gcr_2017-07-23_mara:7D02C86B-CDBE-466B-9647-3EDA6DB016C6
Make it easy to evaluate code only when running on .
,----
| (defmacro help/on-gnu/linux (statement &rest statements)
| "Evaluate the enclosed body only when run on GNU/Linux"
| `(when (eq system-type 'gnu/linux)
| ,statement
| ,@statements))
`----
3 Standard Operating Procedure
==============================
ID: org_gcr_2017-05-12_mara:205571BA-2DC4-4DCB-912C-65B9EC843574
Configure EMACS to maximum utility.
3.1 Helper Functions
~~~~~~~~~~~~~~~~~~~~
ID: org_gcr_2017-05-12_mara:1E88DD48-B992-46E1-B49F-EB8071E8EC37
,----
| (defun help/save-all-file-buffers ()
| "Saves every buffer associated with a file."
| (interactive)
| (dolist (buf (buffer-list))
| (with-current-buffer buf
| (when (and (buffer-file-name) (buffer-modified-p))
| (save-buffer)))))
|
| (defun help/kill-other-buffers ()
| "Kill all other buffers."
| (interactive)
| (mapc #'kill-buffer (delq (current-buffer) (buffer-list))))
|
| (defvar help/delete-trailing-whitespace-p t
| "Should trailing whitespace be removed?")
|
| (defun help/delete-trailing-whitespace ()
| "Delete trailing whitespace for everything but the current line.
|
| If `help/delete-trailing-whitespace-p' is non-nil, then delete the whitespace.
| This is useful for fringe cases where trailing whitespace is important."
| (interactive)
| (when help/delete-trailing-whitespace-p
| (let ((first-part-start (point-min))
| (first-part-end (point-at-bol))
| (second-part-start (point-at-eol))
| (second-part-end (point-max)))
| (delete-trailing-whitespace first-part-start first-part-end)
| (delete-trailing-whitespace second-part-start second-part-end))))
|
| (defun help/indent-curly-block (&rest _ignored)
| "Open a new brace or bracket expression, with relevant newlines and indent. URL: `https://github.com/Fuco1/smartparens/issues/80'"
| (interactive)
| (newline)
| (indent-according-to-mode)
| (forward-line -1)
| (indent-according-to-mode))
|
| (defun beginning-of-line-dwim ()
| "Toggles between moving point to the first non-whitespace character, and
| the start of the line. Src: http://www.wilfred.me.uk/"
| (interactive)
| (let ((start-position (point)))
| ;; see if going to the beginning of the line changes our position
| (move-beginning-of-line nil)
|
| (when (= (point) start-position)
| ;; we're already at the beginning of the line, so go to the
| ;; first non-whitespace character
| (back-to-indentation))))
|
| (defun help/lazy-new-open-line ()
| "Insert a new line without breaking the current line."
| (interactive)
| (beginning-of-line)
| (forward-line 1)
| (newline)
| (forward-line -1))
|
| (defun help/smart-open-line ()
| "Insert a new line, indent it, and move the cursor there.
|
| This behavior is different then the typical function bound to return
| which may be `open-line' or `newline-and-indent'. When you call with
| the cursor between ^ and $, the contents of the line to the right of
| it will be moved to the newly inserted line. This function will not
| do that. The current line is left alone, a new line is inserted, indented,
| and the cursor is moved there.
|
| Attribution: URL `http://emacsredux.com/blog/2013/03/26/smarter-open-line/'"