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
|
#+title: Yuchen Pei's GNU Emacs Configuration
#+author: Yuchen Pei
#+language: en
#+email: id@ypei.org
* Intro
:PROPERTIES:
:UPDATED: [2023-06-26 Mon 16:02]
:END:
I started using Emacs and ditched Vim in 2020, and the content of this
repo is the result of the config over the years. This config has
several characteristics.
It tries to stay close to the Emacs core. If a feature is needed, the
quest to realise it always favours the Emacs core, followed by the GNU
ELPA, then the NonGNU ELPA. In the same spirit, the keybindings follow
the convention of Emacs core.
* Organisation
:PROPERTIES:
:UPDATED: [2023-06-26 Mon 15:49]
:END:
Here's how the files are organised:
- The =early-init.el= file :: The first file loaded by emacs, it
does the following
- Set the ~my-profile~ variable from the ~EMACS_PROFILE~ environment
variable. This variable controls which packages to allow or
ignore. Examples include ~emms~ and ~erc~ which causes a dedicated
emacs instance to run ~emms~ or ~erc~, in which case most packages
are disabled. The default profile, by contrast, disables these two
packages.
- Add a hook to report the time taken at the end of initialisation
- Some optimizations
- The =init.el= file :: The init file, it adds the ~load-path~, and
~requires~'s ~'my-package~, ~'ycp-package~ and the remaining
configurations. Apart from ~my-package~ and ~ycp-package~, the
remaining ~require~'s may be needed to be in a loose order.
- The =lisp/my/my-package.el= file :: This file defines macros needed
by the rest of the initialisation. After comparing [[https://protesilaos.com/emacs/dotemacs][Protesilaos
Stavrou's]] and [[https://github.com/jwiegley/dot-emacs][John Wiegley's]] approaches, I decided to adopt the
former, with the simple ~my-package~ macro, given that the delay and
installation directives are sufficient for the use of this config,
and it is closer to the emacs core. Another design decision is to
not use org literate configuration.
This file also defines functions and macros related to local
config. The local config is a mechanism for separating out variables
concerning machine-specific and/or personal information from the
emacs config files in this repository. Values of these variables are
set with the macro ~my-setq-from-local~ after running
~my-read-from-local-config~ to read the local config in
~my-local-config~. To generate a local config file from all the
variables used in ~my-setq-from-local~ with their current values,
invoke the function ~my-collect-my-setqd-vars~ which will print out
an alist that you can put in a local config file.
Finally, this file defines some other convenience macros for
overriding functions and setting timers.
- The =init/ycp-package.el= file :: This file determines what packages
to allow or omit depending on the profile, calls
~my-read-from-local-config~ as mentioned above, starts the server,
and sets the package archives to use. It also configure package
related options, like the rest of the files in the =init= directory.
- The =init= directory :: Files under this directory are
customisations to various parts and they use the =ycp-= prefix. Each
file is mainly organised into blocks of =my-package= and
=my-configure= defined in =lisp/my/my-package.el=. They follow some
principles:
- The delay depends on the importance and the size of the package.
- Packages are either installed from GNU or NonGNU ELPA or loaded
from packages under the =lisp= directory.
- The files are organised by functionalities, rather than specific
packages, even if some of them are named after specific
packages. For example =ycp-editing= is customisations about
editing, and =ycp-grep= is concerned with grep, occur, isearch and
so on. Some packages may belong to multiple files, in which case a
certain precedence is used to resolve this. For example, =magit=
provides vc features (=ycp-vc.el=) and is itself mostly a git
client (=ycp-client.el=). Because =ycp-client= is for things that
do not belong to other files, we place =magit= customisation in
=ycp-vc=.
- Avoid lambdas in hooks and keybinding, and name all functions
instead.
- The =lisp/my= directory :: Files under this directory are my
extensions to other packages, as well as features that I have worked
on but have not grown into a standalone package yet. Most features
here have =my-= prefix. They are organised in a more refined manner
than files under the =init= directory:
- There are certainly files named after functionalities like under
=init=, examples including =my-buffer.el= and =my-complete.el=,
but they are strictly extensions to features that come with the
Emacs core. For packages outside of the Emacs core, individual
=my-foo.el= files are used, however small they may be. Examples
include =my-consult.el= and =my-corfu.el=. Despite the
customisation of both are inside =init/ycp-complete.el=
- There are also files that are like libraries, like =my-utils.el=
(defining common utility functions) and =my-algos.el= (algorithms
and data structure implementation)
- There are a few features without the =my-= prefix. They are more
like standalone features, but have not graduated to their own
packages or been merged into obvious packages they belong to, like
=generic-search.el= and =emms-info-ytdl.el=.
- The =lisp= directory :: Files under this directory are packages that
cannot be installed from [Non]GNU ELPA. All but =lisp/my= and
=lisp/mis= are git submodules. Apart from =lisp/my=, packages here
belong to one of the follow cases.
- My own packages that have not been submitted to GNU ELPA yet, for
instance =hmm.el= and =buildbot.el=.
- Third party packages not in either ELPA, like =directionary-el=
and =nov.el=.
- Individual packages that are a small part of a bigger non elisp
project. They are placed under =lisp/misc=. Examples include
=cmake-mode.el=.
- The =tempel-templates= file :: tempel templates. There's also a
gitignored =local-tempel-templates= for machine-specific and/or
personal templates.
|