aboutsummaryrefslogtreecommitdiff
path: root/tw/services/dev-env.scm
diff options
context:
space:
mode:
Diffstat (limited to 'tw/services/dev-env.scm')
-rw-r--r--tw/services/dev-env.scm158
1 files changed, 158 insertions, 0 deletions
diff --git a/tw/services/dev-env.scm b/tw/services/dev-env.scm
new file mode 100644
index 00000000..8e38ea8f
--- /dev/null
+++ b/tw/services/dev-env.scm
@@ -0,0 +1,158 @@
+(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))
+ (requirement '(x11-display))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append emacs "/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 ; for Wayland, switch to emacs-pgtk for 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)))))