From de20fc8d904643ffe6957febfc6a24e57c12b512 Mon Sep 17 00:00:00 2001 From: Timo Wilken Date: Sat, 9 Mar 2024 14:52:56 +0100 Subject: Separate home service into PIM, dev env and graphical parts This means we only instantiate Shepherd and mcron services if we really need them, to avoid annoyance on servers. --- tw/services/dev-env.scm | 158 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 tw/services/dev-env.scm (limited to 'tw/services/dev-env.scm') 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))))) -- cgit v1.2.3