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
|
(define-module (tw services dev-env)
#:use-module (gnu)
#:use-module (gnu home services)
#:use-module (gnu home services shepherd)
#:use-module ((gnu packages commencement) #:select (gcc-toolchain))
#:use-module ((gnu packages databases) #:select (emacs-rec-mode))
#:use-module ((gnu packages elf) #:select (patchelf elfutils))
#:use-module (gnu packages emacs)
#:use-module (gnu packages emacs-xyz)
#:use-module ((gnu packages finance) #:select (emacs-ledger-mode))
#:use-module ((gnu packages haskell-apps) #:select (shellcheck))
#:use-module ((gnu packages llvm) #:select (clang))
#:use-module ((gnu packages python-xyz) #:select (python-lsp-server python-yamllint))
#:use-module ((gnu packages sqlite) #:select (sqlite))
#:use-module (gnu packages tree-sitter)
#:use-module (gnu packages vim)
#:use-module (gnu services configuration)
#:use-module (guix gexp)
#:use-module (guix packages)
#:use-module ((tw theme) #:select (catppuccin-emacs catppuccin-vim)))
(define (vim-environment config)
'(("EDITOR" . "vim"))) ; we define no ASYNC_EDITOR
(define (vim-xdg-config config)
`((".vim/vimrc" ,(local-file "files/vimrc"))
(".vim/catppuccin.vim" ,catppuccin-vim)))
;; In non-graphical environments, install vim as an editor. Neovim might be
;; better, but doesn't have an equivalent to `vim-surround' packaged.
(define (vim-packages config)
(list vim vim-surround))
(define (emacs-environment config)
'(("EDITOR" . "emacsclient -qc")
;; Tell emacsclient to return immediately after opening the file. I
;; can't put this in $EDITOR as many programs expect $EDITOR to exit
;; only when the user is done editing.
("ASYNC_EDITOR" . "emacsclient -qcn")))
(define (emacs-xdg-config config)
`(("emacs/include" ,(local-file "files/emacs-packages" #:recursive? #t))
("emacs/init.el" ,(local-file "files/emacs-init.el"))
("emacs/catppuccin-theme.el" ,catppuccin-emacs)))
(define (emacs-files config)
`((".local/share/applications/emacsclient.desktop"
,(local-file "files/emacsclient.desktop"))))
(define (emacs-daemon config)
(list (shepherd-service
(documentation "Emacs server; connect using emacsclient.")
(provision '(emacs))
(start #~(make-forkexec-constructor
(list #$(file-append emacs-pgtk "/bin/emacs") "--fg-daemon")))
(stop #~(make-kill-destructor)))))
(define (emacs-packages config)
(list
;; Development & language servers
gnu-make python-lsp-server python-yamllint shellcheck gcc-toolchain binutils patchelf elfutils
clang ; for clangd
glibc ; for ldd
;; Emacs general
emacs-pgtk ; for Wayland and better fractional scaling support
emacs-use-package
emacs-gcmh
emacs-eglot
emacs-counsel
emacs-counsel-dash sqlite ; emacs-counsel-dash requires the sqlite3 binary
emacs-ivy
emacs-company emacs-company-quickhelp emacs-company-posframe
emacs-undo-tree
emacs-aggressive-indent
emacs-which-key
emacs-smart-mode-line
emacs-diminish
emacs-rainbow-mode
emacs-form-feed
emacs-guix
emacs-org emacs-org-modern
;; Emacs Evil
emacs-evil
emacs-evil-collection
emacs-evil-expat ; for :reverse, :remove, :rename, :colo, :g*, ... ex commands
emacs-evil-surround
emacs-evil-args
emacs-evil-numbers
emacs-evil-multiedit
emacs-evil-goggles
emacs-evil-traces
emacs-evil-commentary
emacs-evil-replace-with-register
emacs-evil-cleverparens
emacs-evil-org
emacs-evil-markdown
emacs-evil-tex
emacs-evil-text-object-python
;; Emacs language modes
emacs-flymake-collection
emacs-geiser emacs-geiser-guile
emacs-sly
emacs-gnuplot
emacs-graphviz-dot-mode
emacs-haskell-mode
emacs-hcl-mode
emacs-ledger-mode
emacs-mmm-mode
emacs-puppet-mode
emacs-rec-mode
emacs-web-mode
emacs-yaml-mode
;; Tree sitter libraries, for Emacs' built-in X-ts-modes.
tree-sitter-bash
tree-sitter-c
tree-sitter-cmake
tree-sitter-cpp
tree-sitter-css
tree-sitter-dockerfile
tree-sitter-javascript
tree-sitter-json
tree-sitter-python
tree-sitter-ruby))
(define-public home-basic-dev-env-service-type
(service-type
(name 'basic-dev-env)
(description "Set up a basic development environment using vim.")
(default-value #f)
(extensions
(list (service-extension home-profile-service-type vim-packages)
(service-extension home-xdg-configuration-files-service-type vim-xdg-config)
(service-extension home-environment-variables-service-type vim-environment)))))
(define-public home-full-dev-env-service-type
(service-type
(name 'full-dev-env)
(description "Set up a full-featured, interactive development environment using Emacs.")
(default-value #f)
(extensions
(list (service-extension home-profile-service-type emacs-packages)
(service-extension home-xdg-configuration-files-service-type emacs-xdg-config)
(service-extension home-files-service-type emacs-files)
(service-extension home-environment-variables-service-type emacs-environment)
(service-extension home-shepherd-service-type emacs-daemon)))))
|