aboutsummaryrefslogtreecommitdiff
path: root/tw/services/dev-env.scm
blob: 17c73eee3afad67b6994e50b7e025597c5359b59 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
(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))
  #:export (home-emacs-configuration
            home-emacs-service-type
            home-vim-configuration
            home-vim-service-type))



(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
   ;; TODO: emacs-editorconfig emacs-sly emacs-sly-macrostep
   emacs-org                         ; emacs-org-modern theme?

   ;; Emacs Evil
   emacs-evil
   emacs-evil-collection
   emacs-evil-expat ; for :reverse, :remove, :rename, :colo, :g*, ... ex commands
   emacs-evil-surround
   ;; emacs-evil-owl  ; tests failing
   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)))))