From 474f0082bb3a43c321e81fa3a751d0e85a3d2ba2 Mon Sep 17 00:00:00 2001 From: Fabio Scotto di Santolo Date: Thu, 20 Aug 2026 15:35:38 +0200 Subject: [PATCH] Refactor Emacs for authoring workflows --- AGENTS.md | 2 +- README.md | 970 +++++++++--------- ansible/inventory/group_vars/all.yml | 23 + ansible/inventory/group_vars/desktop.yml | 10 - .../inventory/group_vars/desktop_gnome.yml | 2 - ansible/inventory/group_vars/fedora.yml | 6 +- ansible/inventory/group_vars/ubuntu.yml | 9 + ansible/inventory/group_vars/void.yml | 1 - .../inventory/group_vars/workstation_dev.yml | 3 +- .../group_vars/workstation_host_linux.yml | 2 + ansible/roles/dotfiles_common/tasks/main.yml | 37 + ansible/roles/packages_fedora/tasks/main.yml | 3 +- ansible/roles/packages_ubuntu/tasks/main.yml | 5 + .../profile_desktop_common/tasks/main.yml | 13 - .../profile_desktop_gnome/tasks/main.yml | 13 - dotfiles/common/.config/ai/knowledge/emacs.md | 6 +- .../.bashrc.d/25-emacs-client-desktop.sh | 4 +- dotfiles/desktop/.config/mimeapps.list | 36 - dotfiles/desktop/.emacs.d/.gitignore | 78 +- dotfiles/desktop/.emacs.d/early-init.el | 3 - dotfiles/desktop/.emacs.d/init.el | 66 +- dotfiles/desktop/.emacs.d/lisp/authoring.el | 76 ++ dotfiles/desktop/.emacs.d/lisp/core/buffer.el | 15 +- dotfiles/desktop/.emacs.d/lisp/core/editor.el | 22 +- .../desktop/.emacs.d/lisp/core/keybindings.el | 190 +--- dotfiles/desktop/.emacs.d/lisp/core/modal.el | 16 - .../desktop/.emacs.d/lisp/core/performance.el | 21 +- dotfiles/desktop/.emacs.d/lisp/core/ui.el | 73 +- dotfiles/desktop/.emacs.d/lisp/lang/c.el | 39 - dotfiles/desktop/.emacs.d/lisp/lang/docker.el | 8 - dotfiles/desktop/.emacs.d/lisp/lang/golang.el | 89 -- dotfiles/desktop/.emacs.d/lisp/lang/json.el | 24 - .../desktop/.emacs.d/lisp/lang/markdown.el | 15 - dotfiles/desktop/.emacs.d/lisp/lang/org.el | 220 ++-- dotfiles/desktop/.emacs.d/lisp/lang/python.el | 111 -- dotfiles/desktop/.emacs.d/lisp/lang/shell.el | 11 - dotfiles/desktop/.emacs.d/lisp/lang/yaml.el | 8 - .../.emacs.d/lisp/misc/custom-functions.el | 318 ------ .../desktop/.emacs.d/lisp/misc/documents.el | 39 - .../.emacs.d/lisp/misc/doom-modeline.el | 9 - dotfiles/desktop/.emacs.d/lisp/misc/gptel.el | 24 - .../desktop/.emacs.d/lisp/misc/i3-config.el | 2 - dotfiles/desktop/.emacs.d/lisp/misc/rss.el | 56 +- .../desktop/.emacs.d/lisp/misc/terminal.el | 45 - dotfiles/desktop/.emacs.d/lisp/misc/vcs.el | 43 +- .../desktop/.emacs.d/lisp/misc/which-key.el | 168 +-- dotfiles/desktop/.emacs.d/lisp/misc/xclip.el | 11 - .../desktop/.emacs.d/lisp/quality-of-life.el | 11 + .../desktop/.emacs.d/lisp/tools/completion.el | 51 +- dotfiles/desktop/.emacs.d/lisp/tools/dap.el | 31 - dotfiles/desktop/.emacs.d/lisp/tools/dired.el | 36 - dotfiles/desktop/.emacs.d/lisp/tools/lsp.el | 47 - .../desktop/.emacs.d/lisp/tools/project.el | 25 - dotfiles/desktop/.emacs.d/lisp/tools/tramp.el | 13 - .../desktop/.emacs.d/lisp/tools/treesitter.el | 20 - .../desktop/.emacs.d/snippets/go-mode/main | 3 - dotfiles/desktop/.emacs.d/snippets/go-mode/pr | 1 - dotfiles/desktop/.emacs.d/snippets/go-mode/tt | 23 - .../.emacs.d/snippets/java-mode/author | 3 - .../desktop/.emacs.d/snippets/java-mode/debug | 6 - .../.emacs.d/snippets/java-mode/dwmain | 31 - .../desktop/.emacs.d/snippets/java-mode/fn | 5 - .../desktop/.emacs.d/snippets/java-mode/for | 5 - .../desktop/.emacs.d/snippets/java-mode/fori | 5 - .../desktop/.emacs.d/snippets/java-mode/gse | 13 - .../desktop/.emacs.d/snippets/java-mode/if | 6 - .../.emacs.d/snippets/java-mode/iisblank | 4 - .../snippets/java-mode/junitwrapperfns | 21 - .../desktop/.emacs.d/snippets/java-mode/main | 5 - .../desktop/.emacs.d/snippets/java-mode/np | 3 - .../desktop/.emacs.d/snippets/java-mode/ol | 3 - .../desktop/.emacs.d/snippets/java-mode/req | 6 - .../desktop/.emacs.d/snippets/java-mode/res | 3 - .../desktop/.emacs.d/snippets/java-mode/sf | 3 - .../desktop/.emacs.d/snippets/java-mode/sop | 3 - .../desktop/.emacs.d/snippets/java-mode/test | 4 - .../desktop/.emacs.d/snippets/java-mode/tryf | 12 - .../desktop/.emacs.d/snippets/java-mode/tyc | 8 - dotfiles/desktop/.emacs.d/snippets/js2-mode/a | 4 - .../desktop/.emacs.d/snippets/js2-mode/fn | 6 - .../desktop/.emacs.d/snippets/js2-mode/for | 5 - .../desktop/.emacs.d/snippets/js2-mode/if | 6 - .../desktop/.emacs.d/snippets/js2-mode/log | 3 - .../desktop/.emacs.d/snippets/markdown-mode/a | 3 - .../.emacs.d/snippets/markdown-mode/img | 9 - .../.emacs.d/snippets/markdown-mode/me | 3 - .../.emacs.d/snippets/markdown-mode/pa | 17 - .../.emacs.d/snippets/markdown-mode/src | 6 - .../.emacs.d/snippets/markdown-mode/st | 4 - .../desktop/.emacs.d/snippets/nxml-mode/cdata | 3 - .../desktop/.emacs.d/snippets/nxml-mode/cha | 8 - .../desktop/.emacs.d/snippets/nxml-mode/dep | 7 - .../desktop/.emacs.d/snippets/nxml-mode/diary | 10 - .../.emacs.d/snippets/nxml-mode/exclusion | 6 - .../.emacs.d/snippets/nxml-mode/exclusions | 8 - .../.emacs.d/snippets/nxml-mode/incvar | 3 - .../desktop/.emacs.d/snippets/nxml-mode/list | 10 - .../desktop/.emacs.d/snippets/nxml-mode/listi | 4 - .../desktop/.emacs.d/snippets/nxml-mode/lit | 3 - .../desktop/.emacs.d/snippets/nxml-mode/oli | 5 - .../desktop/.emacs.d/snippets/nxml-mode/para | 5 - .../desktop/.emacs.d/snippets/nxml-mode/prog | 4 - .../desktop/.emacs.d/snippets/nxml-mode/scr | 5 - .../desktop/.emacs.d/snippets/nxml-mode/scri | 4 - .../desktop/.emacs.d/snippets/nxml-mode/sec | 8 - .../desktop/.emacs.d/snippets/nxml-mode/uli | 5 - .../.emacs.d/snippets/nxml-mode/varece | 3 - .../desktop/.emacs.d/snippets/nxml-mode/xlink | 4 - .../desktop/.emacs.d/snippets/org-mode/code | 5 - .../desktop/.emacs.d/snippets/org-mode/daily | 21 - .../desktop/.emacs.d/snippets/org-mode/gr | 1 - dotfiles/desktop/.emacs.d/snippets/org-mode/q | 5 - .../desktop/.emacs.d/snippets/org-mode/src | 5 - .../desktop/.emacs.d/snippets/org-mode/title | 1 - .../desktop/.emacs.d/snippets/python-mode/app | 4 - .../desktop/.emacs.d/snippets/python-mode/def | 4 - .../desktop/.emacs.d/snippets/python-mode/im | 4 - .../.emacs.d/snippets/python-mode/imflask | 6 - .../.emacs.d/snippets/python-mode/main | 4 - .../desktop/.emacs.d/snippets/python-mode/p | 6 - .../desktop/.emacs.d/snippets/python-mode/pr | 4 - .../desktop/.emacs.d/snippets/python-mode/prx | 4 - .../.emacs.d/snippets/python-mode/render | 3 - .../.emacs.d/snippets/python-mode/route | 5 - .../.emacs.d/snippets/python-mode/route2 | 5 - .../.emacs.d/snippets/rego-mode/package | 1 - .../desktop/.emacs.d/snippets/rego-mode/pr | 1 - .../desktop/.emacs.d/snippets/sh-mode/args | 44 - dotfiles/desktop/.emacs.d/snippets/sh-mode/aw | 3 - .../desktop/.emacs.d/snippets/sh-mode/cmd | 18 - .../desktop/.emacs.d/snippets/sh-mode/cwd | 5 - .../desktop/.emacs.d/snippets/sh-mode/eof | 5 - dotfiles/desktop/.emacs.d/snippets/sh-mode/fn | 5 - .../desktop/.emacs.d/snippets/sh-mode/fnae | 7 - dotfiles/desktop/.emacs.d/snippets/sh-mode/fo | 6 - .../desktop/.emacs.d/snippets/sh-mode/help | 19 - dotfiles/desktop/.emacs.d/snippets/sh-mode/if | 5 - .../desktop/.emacs.d/snippets/sh-mode/iif | 5 - .../desktop/.emacs.d/snippets/sh-mode/main | 7 - dotfiles/desktop/.emacs.d/snippets/sh-mode/pr | 3 - .../desktop/.emacs.d/snippets/sh-mode/shunit | 27 - .../desktop/.emacs.d/snippets/sh-mode/test | 21 - .../desktop/.emacs.d/snippets/sh-mode/tmpdir | 8 - dotfiles/desktop/.emacs.d/snippets/sh-mode/v | 3 - dotfiles/desktop/.emacs.d/snippets/sh-mode/va | 4 - dotfiles/desktop/.emacs.d/snippets/sh-mode/vd | 3 - dotfiles/desktop/.emacs.d/snippets/sh-mode/wh | 6 - dotfiles/desktop/.emacs.d/snippets/web-mode/a | 5 - .../desktop/.emacs.d/snippets/web-mode/div | 5 - .../desktop/.emacs.d/snippets/web-mode/divv | 5 - .../desktop/.emacs.d/snippets/web-mode/for | 5 - .../desktop/.emacs.d/snippets/web-mode/h1 | 4 - .../desktop/.emacs.d/snippets/web-mode/h2 | 4 - .../desktop/.emacs.d/snippets/web-mode/h3 | 4 - .../desktop/.emacs.d/snippets/web-mode/h4 | 4 - .../desktop/.emacs.d/snippets/web-mode/if | 5 - .../desktop/.emacs.d/snippets/web-mode/img | 3 - .../desktop/.emacs.d/snippets/web-mode/incl | 3 - .../.emacs.d/snippets/web-mode/itemthumb | 13 - .../.emacs.d/snippets/web-mode/linkcss | 4 - dotfiles/desktop/.emacs.d/snippets/web-mode/p | 5 - .../desktop/.emacs.d/snippets/web-mode/style | 5 - .../desktop/.emacs.d/snippets/web-mode/with | 5 - .../desktop/.emacs.d/snippets/web-mode/{{ | 3 - .../.emacs.d/snippets/yaml-mode/k8-kustom | 5 - .../.emacs.d/snippets/yaml-mode/k8deployment | 44 - .../.emacs.d/snippets/yaml-mode/k8ingress | 18 - .../.emacs.d/snippets/yaml-mode/k8service | 14 - .../desktop/.emacs.d/templates/org/cv.org | 11 + .../.emacs.d/templates/org/documentation.org | 10 + .../templates/org/generic-document.org | 10 + .../desktop/.emacs.d/templates/org/org.css | 2 + 172 files changed, 881 insertions(+), 3134 deletions(-) create mode 100644 dotfiles/desktop/.emacs.d/lisp/authoring.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/core/modal.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/lang/c.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/lang/docker.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/lang/golang.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/lang/json.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/lang/markdown.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/lang/python.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/lang/shell.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/lang/yaml.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/misc/custom-functions.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/misc/documents.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/misc/doom-modeline.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/misc/gptel.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/misc/i3-config.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/misc/terminal.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/misc/xclip.el create mode 100644 dotfiles/desktop/.emacs.d/lisp/quality-of-life.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/tools/dap.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/tools/dired.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/tools/lsp.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/tools/project.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/tools/tramp.el delete mode 100644 dotfiles/desktop/.emacs.d/lisp/tools/treesitter.el delete mode 100644 dotfiles/desktop/.emacs.d/snippets/go-mode/main delete mode 100644 dotfiles/desktop/.emacs.d/snippets/go-mode/pr delete mode 100644 dotfiles/desktop/.emacs.d/snippets/go-mode/tt delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/author delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/debug delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/dwmain delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/fn delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/for delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/fori delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/gse delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/if delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/iisblank delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/junitwrapperfns delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/main delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/np delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/ol delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/req delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/res delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/sf delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/sop delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/test delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/tryf delete mode 100644 dotfiles/desktop/.emacs.d/snippets/java-mode/tyc delete mode 100644 dotfiles/desktop/.emacs.d/snippets/js2-mode/a delete mode 100644 dotfiles/desktop/.emacs.d/snippets/js2-mode/fn delete mode 100644 dotfiles/desktop/.emacs.d/snippets/js2-mode/for delete mode 100644 dotfiles/desktop/.emacs.d/snippets/js2-mode/if delete mode 100644 dotfiles/desktop/.emacs.d/snippets/js2-mode/log delete mode 100644 dotfiles/desktop/.emacs.d/snippets/markdown-mode/a delete mode 100644 dotfiles/desktop/.emacs.d/snippets/markdown-mode/img delete mode 100644 dotfiles/desktop/.emacs.d/snippets/markdown-mode/me delete mode 100644 dotfiles/desktop/.emacs.d/snippets/markdown-mode/pa delete mode 100644 dotfiles/desktop/.emacs.d/snippets/markdown-mode/src delete mode 100644 dotfiles/desktop/.emacs.d/snippets/markdown-mode/st delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/cdata delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/cha delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/dep delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/diary delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/exclusion delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/exclusions delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/incvar delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/list delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/listi delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/lit delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/oli delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/para delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/prog delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/scr delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/scri delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/sec delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/uli delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/varece delete mode 100644 dotfiles/desktop/.emacs.d/snippets/nxml-mode/xlink delete mode 100644 dotfiles/desktop/.emacs.d/snippets/org-mode/code delete mode 100644 dotfiles/desktop/.emacs.d/snippets/org-mode/daily delete mode 100644 dotfiles/desktop/.emacs.d/snippets/org-mode/gr delete mode 100644 dotfiles/desktop/.emacs.d/snippets/org-mode/q delete mode 100644 dotfiles/desktop/.emacs.d/snippets/org-mode/src delete mode 100644 dotfiles/desktop/.emacs.d/snippets/org-mode/title delete mode 100644 dotfiles/desktop/.emacs.d/snippets/python-mode/app delete mode 100644 dotfiles/desktop/.emacs.d/snippets/python-mode/def delete mode 100644 dotfiles/desktop/.emacs.d/snippets/python-mode/im delete mode 100644 dotfiles/desktop/.emacs.d/snippets/python-mode/imflask delete mode 100644 dotfiles/desktop/.emacs.d/snippets/python-mode/main delete mode 100644 dotfiles/desktop/.emacs.d/snippets/python-mode/p delete mode 100644 dotfiles/desktop/.emacs.d/snippets/python-mode/pr delete mode 100644 dotfiles/desktop/.emacs.d/snippets/python-mode/prx delete mode 100644 dotfiles/desktop/.emacs.d/snippets/python-mode/render delete mode 100644 dotfiles/desktop/.emacs.d/snippets/python-mode/route delete mode 100644 dotfiles/desktop/.emacs.d/snippets/python-mode/route2 delete mode 100644 dotfiles/desktop/.emacs.d/snippets/rego-mode/package delete mode 100644 dotfiles/desktop/.emacs.d/snippets/rego-mode/pr delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/args delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/aw delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/cmd delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/cwd delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/eof delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/fn delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/fnae delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/fo delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/help delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/if delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/iif delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/main delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/pr delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/shunit delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/test delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/tmpdir delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/v delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/va delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/vd delete mode 100644 dotfiles/desktop/.emacs.d/snippets/sh-mode/wh delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/a delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/div delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/divv delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/for delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/h1 delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/h2 delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/h3 delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/h4 delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/if delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/img delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/incl delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/itemthumb delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/linkcss delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/p delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/style delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/with delete mode 100644 dotfiles/desktop/.emacs.d/snippets/web-mode/{{ delete mode 100644 dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8-kustom delete mode 100644 dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8deployment delete mode 100644 dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8ingress delete mode 100644 dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8service create mode 100644 dotfiles/desktop/.emacs.d/templates/org/cv.org create mode 100644 dotfiles/desktop/.emacs.d/templates/org/documentation.org create mode 100644 dotfiles/desktop/.emacs.d/templates/org/generic-document.org create mode 100644 dotfiles/desktop/.emacs.d/templates/org/org.css diff --git a/AGENTS.md b/AGENTS.md index 9dba229..1677221 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -56,7 +56,7 @@ Ansible-driven personal infrastructure repo for Fedora and Void desktops, FreeBS ## Desktop Notes - `desktop_profile` names independently selectable desktop groups such as `desktop_gnome`, `desktop_sway`, and `desktop_niri`. Keep platform-specific session bootstrap in platform-specific roles. - `desktop_environment` is fixed to `minimal` for Void desktops. `profile_desktop_common` owns shared Void bootstrap; `profile_desktop_sway` and `profile_desktop_niri` manage the enabled sessions, while `profile_desktop_gnome` copies shared desktop dotfiles for Fedora/GNOME without managing GNOME settings. `desktop_sessions_enabled` and `desktop_default_session` apply to the minimal mode. -- Emacs packages and `.emacs.d` deploy are disabled by default via `emacs_enabled: false`; keep the dotfiles in the repo for reversible opt-in only. +- Emacs has one authoring-oriented `.emacs.d`, deployed by `dotfiles_common` when `emacs_enabled` is true. Fedora/GNOME desktops and workstation profiles enable it; keep platform dependencies in package group vars rather than branching in Emacs Lisp. - NTFS filesystem support is provided by `ntfs-3g` in `ansible/inventory/group_vars/void.yml`. - Void user services are managed by `turnstile` and live under `dotfiles/desktop/.config/service/`. - `ssh-agent` keeps the stable socket `~/.local/state/ssh-agent/socket`. diff --git a/README.md b/README.md index 0a983fe..71de483 100644 --- a/README.md +++ b/README.md @@ -1,432 +1,432 @@ -# Infra — Personal Infrastructure as Code - -Questo repository contiene la configurazione **Infrastructure as Code (IaC)** utilizzata per gestire e mantenere allineate diverse macchine personali tramite **Ansible**. - -L'obiettivo è avere **una singola fonte di verità** per: - -- configurazione delle macchine -- pacchetti installati -- servizi di sistema -- configurazioni utente (dotfiles) - -Il repository consente di gestire più sistemi operativi e profili macchina mantenendo una struttura modulare, riproducibile e idempotente. - ---- - -# Architettura del progetto - -```text -infra/ -├── ansible/ -│ ├── ansible.cfg -│ ├── site.yml -│ ├── inventory/ -│ │ ├── hosts.yml -│ │ ├── group_vars/ -│ │ └── host_vars/ -│ ├── templates/ -│ └── roles/ -│ -├── dotfiles/ -│ ├── common/ -│ ├── desktop/ -│ ├── fedora/ -│ ├── ubuntu/ -│ ├── server/ -│ ├── workstation/ -│ ├── workstation_host_linux/ -│ ├── workstation_dev_wsl/ -│ └── nymph/ -│ -├── scripts/ -├── secrets/ -└── README.md -``` - -Il repository è diviso in due componenti principali: - -| Componente | Scopo | -| ---------- | -------------------------------------- | -| ansible | provisioning e configurazione macchine | -| dotfiles | configurazioni utente versionate | - ---- - -# Macchine gestite - -Il repository modella attualmente host Fedora/GNOME, un ambiente WSL di sviluppo e un server Ubuntu. -La composizione resta separata in assi indipendenti: - -```text -common user environment -+ host-specific platform -+ role-specific software -+ independently selectable desktop -+ host hardware overrides -``` - -Matrice target: - +# Infra — Personal Infrastructure as Code + +Questo repository contiene la configurazione **Infrastructure as Code (IaC)** utilizzata per gestire e mantenere allineate diverse macchine personali tramite **Ansible**. + +L'obiettivo è avere **una singola fonte di verità** per: + +- configurazione delle macchine +- pacchetti installati +- servizi di sistema +- configurazioni utente (dotfiles) + +Il repository consente di gestire più sistemi operativi e profili macchina mantenendo una struttura modulare, riproducibile e idempotente. + +--- + +# Architettura del progetto + +```text +infra/ +├── ansible/ +│ ├── ansible.cfg +│ ├── site.yml +│ ├── inventory/ +│ │ ├── hosts.yml +│ │ ├── group_vars/ +│ │ └── host_vars/ +│ ├── templates/ +│ └── roles/ +│ +├── dotfiles/ +│ ├── common/ +│ ├── desktop/ +│ ├── fedora/ +│ ├── ubuntu/ +│ ├── server/ +│ ├── workstation/ +│ ├── workstation_host_linux/ +│ ├── workstation_dev_wsl/ +│ └── nymph/ +│ +├── scripts/ +├── secrets/ +└── README.md +``` + +Il repository è diviso in due componenti principali: + +| Componente | Scopo | +| ---------- | -------------------------------------- | +| ansible | provisioning e configurazione macchine | +| dotfiles | configurazioni utente versionate | + +--- + +# Macchine gestite + +Il repository modella attualmente host Fedora/GNOME, un ambiente WSL di sviluppo e un server Ubuntu. +La composizione resta separata in assi indipendenti: + +```text +common user environment ++ host-specific platform ++ role-specific software ++ independently selectable desktop ++ host hardware overrides +``` + +Matrice target: + | Host | Platform | Role | Desktop | | ------------ | -------- | -------------------- | ------- | | ikaros | Fedora | Personal workstation | GNOME | | nymph | Fedora | Desktop laptop | GNOME | | deadalus-wsl | Ubuntu | Workstation dev | — | | prometheus | Ubuntu | Server | — | - -Regola operativa: - -```text -ikaros must be boring -nymph is allowed to break -``` - -`ikaros` usa Fedora Workstation/GNOME come desktop personale stabile; `nymph` usa lo stesso -target Fedora Workstation/GNOME come laptop. I gruppi legacy `void` e `desktop` restano alias di -compatibilita per eventuali host Void futuri mentre i nuovi assi sono -`platform_*`, `role_*` e `desktop_*`. - -Nota sullo stato attuale del playbook principale: - -- `ansible/site.yml` applica oggi in automatico Fedora/GNOME su `ikaros` e `nymph` -- `ansible/site.yml` applica anche il ramo `workstation_dev_wsl` per il modello dev in WSL -- `ansible/site.yml` applica anche il profilo `ubuntu_server` con baseline apt, systemd, dotfiles server e firewall UFW - -## Desktop - -Target operativi: - -- `ikaros`: Fedora Workstation + GNOME, desktop personale stabile/floating. -- `nymph`: Fedora Workstation + GNOME, laptop desktop con dotfiles desktop condivisi e GNOME lasciato al default Fedora. - + +Regola operativa: + +```text +ikaros must be boring +nymph is allowed to break +``` + +`ikaros` usa Fedora Workstation/GNOME come desktop personale stabile; `nymph` usa lo stesso +target Fedora Workstation/GNOME come laptop. I gruppi legacy `void` e `desktop` restano alias di +compatibilita per eventuali host Void futuri mentre i nuovi assi sono +`platform_*`, `role_*` e `desktop_*`. + +Nota sullo stato attuale del playbook principale: + +- `ansible/site.yml` applica oggi in automatico Fedora/GNOME su `ikaros` e `nymph` +- `ansible/site.yml` applica anche il ramo `workstation_dev_wsl` per il modello dev in WSL +- `ansible/site.yml` applica anche il profilo `ubuntu_server` con baseline apt, systemd, dotfiles server e firewall UFW + +## Desktop + +Target operativi: + +- `ikaros`: Fedora Workstation + GNOME, desktop personale stabile/floating. +- `nymph`: Fedora Workstation + GNOME, laptop desktop con dotfiles desktop condivisi e GNOME lasciato al default Fedora. + Il profilo Void desktop resta disponibile come modello riutilizzabile per host futuri e usa esclusivamente `desktop_environment: minimal`: Sway e il default, mentre Niri si seleziona con il gruppo `desktop_niri`. GNOME e disponibile solo sui target Fedora tramite `desktop_gnome`. - -Lo stato attuale del profilo desktop include, tra le altre cose: - -- dotfiles comuni e desktop + +Lo stato attuale del profilo desktop include, tra le altre cose: + +- dotfiles comuni e desktop - sessioni Sway e Niri per eventuali host Void in modalita `minimal` - `emptty` con default host-specific in modalita `minimal` e session file Wayland per `sway` -- pacchetti Void Linux e servizi runit; le liste pacchetti Void desktop sono separate per criterio: - - `void_packages_base` per il runtime sistema (init, kernel, audio core, networking, firewall, hw daemons) +- pacchetti Void Linux e servizi runit; le liste pacchetti Void desktop sono separate per criterio: + - `void_packages_base` per il runtime sistema (init, kernel, audio core, networking, firewall, hw daemons) - `desktop_common_packages` per l'infrastruttura condivisa - `desktop_minimal_packages` per applicazioni GTK e `emptty` - `desktop_sway_packages` per i binari specifici della sessione Sway -- `turnstile` per i servizi utente Void, incluso `ssh-agent` -- `ssh-agent` con socket stabile condiviso tra shell e SSH in `~/.local/state/ssh-agent/socket` -- Emacs e i relativi dotfile restano nel repo ma sono disabilitati di default tramite `emacs_enabled: false` -- `tmux` con plugin gestiti da TPM al bootstrap del profilo desktop -- Flatpak con remoto Flathub +- `turnstile` per i servizi utente Void, incluso `ssh-agent` +- `ssh-agent` con socket stabile condiviso tra shell e SSH in `~/.local/state/ssh-agent/socket` +- Emacs usa una sola configurazione orientata a Org e authoring, condivisa da desktop Fedora/GNOME e workstation; Vim resta l'editor di sviluppo +- `tmux` con plugin gestiti da TPM al bootstrap del profilo desktop +- Flatpak con remoto Flathub - GNOME Keyring e `udiskie` nella modalita minimale - multi-monitor Void: sotto Sway è gestito da `kanshi` - ---- - -## Workstation - -Sistemi operativi supportati: - -- Ubuntu WSL, attualmente usato da `deadalus-wsl` -- Fedora Workstation nativa, disponibile per host futuri tramite gruppi dedicati - -Desktop environment host Linux, per eventuali workstation native: - -- GNOME - -Macchine attuali: - -- `deadalus-wsl` come ambiente dev Ubuntu in WSL sulla workstation Windows `deadalus` - -Questo profilo è pensato per sviluppo e lavoro, con separazione tra layer host e layer dev. - -Nel modello Ansible usato qui, un singolo inventory host puo appartenere intenzionalmente a piu gruppi e quindi ricevere piu play nello stesso run: l'associazione non e `1 host = 1 play`, ma `host + gruppi = layering finale`. - -Il profilo workstation e agganciato al playbook principale e ora distingue: - + +--- + +## Workstation + +Sistemi operativi supportati: + +- Ubuntu WSL, attualmente usato da `deadalus-wsl` +- Fedora Workstation nativa, disponibile per host futuri tramite gruppi dedicati + +Desktop environment host Linux, per eventuali workstation native: + +- GNOME + +Macchine attuali: + +- `deadalus-wsl` come ambiente dev Ubuntu in WSL sulla workstation Windows `deadalus` + +Questo profilo è pensato per sviluppo e lavoro, con separazione tra layer host e layer dev. + +Nel modello Ansible usato qui, un singolo inventory host puo appartenere intenzionalmente a piu gruppi e quindi ricevere piu play nello stesso run: l'associazione non e `1 host = 1 play`, ma `host + gruppi = layering finale`. + +Il profilo workstation e agganciato al playbook principale e ora distingue: + - layer dev condiviso tra WSL e workstation Fedora future -- layer dev Fedora nativo disponibile per host futuri -- layer host Linux GNOME disponibile per host futuri -- layer WSL dedicato per sviluppo con `systemd` - -Per esempio, lo stesso host Linux puo stare in `workstation_host_linux` e in `workstation_dev_fedora`, a seconda del layering che vuoi comporre. - -Lo stato attuale del profilo workstation include: - -- installazione pacchetti base Ubuntu via apt -- installazione pacchetti base Fedora via dnf per eventuali workstation native -- installazione e configurazione di Docker dal repository ufficiale -- gestione dei dotfiles workstation e rendering dei template dev condivisi -- installazione opzionale di Google Chrome, VS Code, IntelliJ IDEA Ultimate e applicazioni Flatpak per eventuali workstation Fedora native -- estensioni GNOME per eventuali host Linux nativi -- preparazione del ramo WSL Ubuntu con `systemd` per il toolchain di sviluppo -- attivazione del firewall `firewalld` sui target Fedora che dichiarano regole host-specifiche - -Workflow WSL previsto: - -1. avviare Ubuntu WSL almeno una volta e completare la creazione dell'utente Linux -2. installare Ansible dentro WSL Ubuntu -3. lanciare il playbook da WSL su `deadalus-wsl` per configurare l'ambiente dev locale -4. usare VS Code con le estensioni Remote (`WSL`, `SSH`, `Dev Containers`) dal lato Windows - ---- - -## Server - -Sistema operativo: - -- Ubuntu LTS - -Configurazione: - -- nessun ambiente grafico - -Macchina: - -- `prometheus` - -Profilo orientato a servizi server e gestione di dotfiles dedicati. - -Lo stato attuale del profilo server include: - -- installazione pacchetti base Ubuntu via apt -- installazione e configurazione di Docker dal repository ufficiale -- abilitazione dei servizi systemd dichiarati in inventory/group vars -- copia dei dotfiles server e rendering dei template server, incluso il `docker-compose.yml` dello stack servizi -- attivazione del firewall UFW con regola SSH esplicita -- apertura delle porte Syncthing `22000/tcp`, `22000/udp` e `21027/udp`, lasciando la GUI non esposta direttamente su UFW - -Utente del profilo server: - -- il profilo usa `server_username`, `server_user_group` e `server_user_home` definiti in `ansible/inventory/group_vars/server.yml` -- per default `server_username` eredita `username`, ma puo essere sovrascritto per tutti gli host server via inventory oppure a runtime con extra vars -- esempio override da CLI: - -```bash -ansible-playbook ansible/site.yml --limit prometheus -e server_username=myuser -``` - -- se necessario puoi passare anche: - -```bash -ansible-playbook ansible/site.yml --limit prometheus -e server_username=myuser -e server_user_group=mygroup -e server_user_home=/srv/myuser -``` - ---- - -# Composizione della configurazione - -Emacs è disabilitato di default. Per riattivare temporaneamente il deploy Emacs: - -```bash -ansible-playbook ansible/site.yml --limit --tags emacs -e emacs_enabled=true -``` - -La configurazione finale di una macchina è ottenuta combinando più livelli. - -```text -common configuration -+ platform configuration -+ role configuration -+ desktop configuration -+ host overrides -``` - -Esempi correnti: - -```text -ikaros -> common + platform_fedora + role_personal_workstation + graphical_desktop + desktop_gnome + ikaros -nymph -> common + platform_fedora + graphical_desktop + desktop_gnome + nymph -``` - -Questo approccio consente di: - -- mantenere configurazioni condivise -- applicare override specifici per host -- evitare duplicazioni +- layer dev Fedora nativo disponibile per host futuri +- layer host Linux GNOME disponibile per host futuri +- layer WSL dedicato per sviluppo con `systemd` + +Per esempio, lo stesso host Linux puo stare in `workstation_host_linux` e in `workstation_dev_fedora`, a seconda del layering che vuoi comporre. + +Lo stato attuale del profilo workstation include: + +- installazione pacchetti base Ubuntu via apt +- installazione pacchetti base Fedora via dnf per eventuali workstation native +- installazione e configurazione di Docker dal repository ufficiale +- gestione dei dotfiles workstation e rendering dei template dev condivisi +- installazione opzionale di Google Chrome, VS Code, IntelliJ IDEA Ultimate e applicazioni Flatpak per eventuali workstation Fedora native +- estensioni GNOME per eventuali host Linux nativi +- preparazione del ramo WSL Ubuntu con `systemd` per il toolchain di sviluppo +- attivazione del firewall `firewalld` sui target Fedora che dichiarano regole host-specifiche + +Workflow WSL previsto: + +1. avviare Ubuntu WSL almeno una volta e completare la creazione dell'utente Linux +2. installare Ansible dentro WSL Ubuntu +3. lanciare il playbook da WSL su `deadalus-wsl` per configurare l'ambiente dev locale +4. usare VS Code con le estensioni Remote (`WSL`, `SSH`, `Dev Containers`) dal lato Windows + +--- + +## Server + +Sistema operativo: + +- Ubuntu LTS + +Configurazione: + +- nessun ambiente grafico + +Macchina: + +- `prometheus` + +Profilo orientato a servizi server e gestione di dotfiles dedicati. + +Lo stato attuale del profilo server include: + +- installazione pacchetti base Ubuntu via apt +- installazione e configurazione di Docker dal repository ufficiale +- abilitazione dei servizi systemd dichiarati in inventory/group vars +- copia dei dotfiles server e rendering dei template server, incluso il `docker-compose.yml` dello stack servizi +- attivazione del firewall UFW con regola SSH esplicita +- apertura delle porte Syncthing `22000/tcp`, `22000/udp` e `21027/udp`, lasciando la GUI non esposta direttamente su UFW + +Utente del profilo server: + +- il profilo usa `server_username`, `server_user_group` e `server_user_home` definiti in `ansible/inventory/group_vars/server.yml` +- per default `server_username` eredita `username`, ma puo essere sovrascritto per tutti gli host server via inventory oppure a runtime con extra vars +- esempio override da CLI: + +```bash +ansible-playbook ansible/site.yml --limit prometheus -e server_username=myuser +``` + +- se necessario puoi passare anche: + +```bash +ansible-playbook ansible/site.yml --limit prometheus -e server_username=myuser -e server_user_group=mygroup -e server_user_home=/srv/myuser +``` + +--- + +# Composizione della configurazione + +Emacs è abilitato sui profili Fedora/GNOME e workstation; la configurazione canonica è distribuita da `dotfiles_common`, con Org in `~/Org/`, template versionati e export PDF/HTML/Markdown/DOCX/ODT. Per abilitarlo temporaneamente su un altro profilo: + +```bash +ansible-playbook ansible/site.yml --limit --tags emacs -e emacs_enabled=true +``` + +La configurazione finale di una macchina è ottenuta combinando più livelli. + +```text +common configuration ++ platform configuration ++ role configuration ++ desktop configuration ++ host overrides +``` + +Esempi correnti: + +```text +ikaros -> common + platform_fedora + role_personal_workstation + graphical_desktop + desktop_gnome + ikaros +nymph -> common + platform_fedora + graphical_desktop + desktop_gnome + nymph +``` + +Questo approccio consente di: + +- mantenere configurazioni condivise +- applicare override specifici per host +- evitare duplicazioni - riutilizzare il profilo Void corrente su un host futuro assegnandolo a `platform_void + graphical_desktop + desktop_sway` - ---- - -# Ruoli Ansible - -I principali ruoli attualmente presenti sono: - -| Role | Descrizione | -| ------------------------- | ----------------------------------- | -| base | configurazione base comune | -| packages_void | installazione pacchetti su Void | -| packages_freebsd | installazione pacchetti su FreeBSD via pkg | -| packages_ubuntu | installazione pacchetti su Ubuntu | -| packages_fedora | installazione pacchetti su Fedora | -| services_runit | gestione servizi runit | -| services_systemd | gestione servizi systemd | + +--- + +# Ruoli Ansible + +I principali ruoli attualmente presenti sono: + +| Role | Descrizione | +| ------------------------- | ----------------------------------- | +| base | configurazione base comune | +| packages_void | installazione pacchetti su Void | +| packages_freebsd | installazione pacchetti su FreeBSD via pkg | +| packages_ubuntu | installazione pacchetti su Ubuntu | +| packages_fedora | installazione pacchetti su Fedora | +| services_runit | gestione servizi runit | +| services_systemd | gestione servizi systemd | | services_freebsd | gestione servizi FreeBSD dichiarati per host | -| profile_desktop_common | bootstrap desktop Void condiviso | -| profile_desktop_gnome | dotfiles desktop condivisi per Fedora/GNOME | -| profile_desktop_sway | sessione desktop sway / SwayFX (Wayland) | -| profile_desktop_niri | sessione desktop Niri su Void (Wayland) | -| profile_desktop_host | override desktop specifici per host | -| profile_personal_workstation | layer stabile per workstation personale | -| profile_workstation_dev_common | configurazione dev workstation condivisa | -| profile_workstation_gnome | configurazione host workstation GNOME | -| profile_workstation_dev_wsl | configurazione WSL Ubuntu per sviluppo | -| profile_server | configurazione server | -| dotfiles_common | distribuzione dotfiles comuni | -| dotfiles | distribuzione configurazioni utente | - ---- - -# Stato attuale del playbook principale - -Il playbook `ansible/site.yml` e attualmente composto da blocchi per asse: - -```text -all -> dotfiles_common -platform_void -> packages_void + services_runit +| profile_desktop_common | bootstrap desktop Void condiviso | +| profile_desktop_gnome | dotfiles desktop condivisi per Fedora/GNOME | +| profile_desktop_sway | sessione desktop sway / SwayFX (Wayland) | +| profile_desktop_niri | sessione desktop Niri su Void (Wayland) | +| profile_desktop_host | override desktop specifici per host | +| profile_personal_workstation | layer stabile per workstation personale | +| profile_workstation_dev_common | configurazione dev workstation condivisa | +| profile_workstation_gnome | configurazione host workstation GNOME | +| profile_workstation_dev_wsl | configurazione WSL Ubuntu per sviluppo | +| profile_server | configurazione server | +| dotfiles_common | distribuzione dotfiles comuni | +| dotfiles | distribuzione configurazioni utente | + +--- + +# Stato attuale del playbook principale + +Il playbook `ansible/site.yml` e attualmente composto da blocchi per asse: + +```text +all -> dotfiles_common +platform_void -> packages_void + services_runit platform_void & graphical_desktop -> profile_desktop_common + profile_desktop_sway + profile_desktop_niri + profile_desktop_host platform_freebsd -> packages_freebsd + services_freebsd -platform_fedora -> packages_fedora + services_systemd -platform_fedora & role_personal_workstation -> profile_personal_workstation -platform_fedora & desktop_gnome -> profile_desktop_gnome -workstation_dev_fedora -> profile_workstation_dev_common -workstation_host_linux -> profile_workstation_gnome -workstation_dev_wsl -> packages_ubuntu + services_systemd + profile_workstation_dev_common + profile_workstation_dev_wsl -ubuntu_server -> packages_ubuntu + services_systemd + profile_server -``` - -Questo significa che, allo stato attuale: - -- `ikaros` riceve Fedora Workstation/GNOME come target desktop personale stabile -- `nymph` riceve Fedora Workstation/GNOME come target laptop -- il profilo Void resta selezionabile tramite `platform_void + graphical_desktop` per host futuri -- il ramo WSL (`deadalus-wsl`) e predisposto con play dev dedicato -- il server Ubuntu (`prometheus`) e gestito con pacchetti, servizi, dotfiles server e firewall -- lo stack container server include `navidrome`, `postgres`, `gitea`, `nginx-proxy-manager` e `syncthing`, con GUI Syncthing raggiungibile tramite la rete Docker `web` - -# Dotfiles - -La directory `dotfiles/` contiene le configurazioni utente versionate. - -```text -dotfiles/ -├── common -├── desktop -├── server -├── fedora -├── ubuntu -├── workstation -├── workstation_host_linux -├── workstation_dev_wsl -└── nymph -``` - -Le configurazioni sono applicate tramite Ansible e organizzate per livelli: - -| Livello | Scopo | -| ------- | -------------------------------- | -| common | configurazioni condivise | -| profile | configurazioni per tipo macchina | -| host | override specifici | - ---- - -# Requisiti - -Per utilizzare il repository sono necessari: - -- Python 3 -- Ansible -- `ansible-lint` -- `yamllint` -- `shellcheck` -- collection definite in `ansible/collections/requirements.yml` -- accesso locale o SSH alle macchine target, in base a come e definito l'inventory - -Installazione base: - -```bash -python3 -m pip install ansible ansible-lint yamllint shellcheck-py -ansible-galaxy collection install -r ansible/collections/requirements.yml -``` - -Gestione segreti: - -- il repository supporta il caricamento opzionale di `secrets/vault.yml` -- il repository supporta anche `secrets/vault.local.yml` per override locali non versionati -- `secrets/vault.yml.example` funge da template/esempio -- se `secrets/vault.yml` non e presente, il playbook continua comunque senza caricare variabili locali opzionali -- se `secrets/.vault_pass.gpg` esiste viene usato automaticamente per sbloccare i vault tramite `gpg`; in alternativa resta supportato `secrets/.vault_pass` come fallback legacy locale; se nessuno dei due file esiste Ansible richiede la password in modo interattivo - ---- - -# Utilizzo - -Eseguire il playbook principale: - -```bash -ansible-playbook ansible/site.yml -``` - -Allo stato attuale questo comando: - -- distribuisce i dotfiles comuni a tutti gli host -- per `platform_void` applica pacchetti Void e servizi runit +platform_fedora -> packages_fedora + services_systemd +platform_fedora & role_personal_workstation -> profile_personal_workstation +platform_fedora & desktop_gnome -> profile_desktop_gnome +workstation_dev_fedora -> profile_workstation_dev_common +workstation_host_linux -> profile_workstation_gnome +workstation_dev_wsl -> packages_ubuntu + services_systemd + profile_workstation_dev_common + profile_workstation_dev_wsl +ubuntu_server -> packages_ubuntu + services_systemd + profile_server +``` + +Questo significa che, allo stato attuale: + +- `ikaros` riceve Fedora Workstation/GNOME come target desktop personale stabile +- `nymph` riceve Fedora Workstation/GNOME come target laptop +- il profilo Void resta selezionabile tramite `platform_void + graphical_desktop` per host futuri +- il ramo WSL (`deadalus-wsl`) e predisposto con play dev dedicato +- il server Ubuntu (`prometheus`) e gestito con pacchetti, servizi, dotfiles server e firewall +- lo stack container server include `navidrome`, `postgres`, `gitea`, `nginx-proxy-manager` e `syncthing`, con GUI Syncthing raggiungibile tramite la rete Docker `web` + +# Dotfiles + +La directory `dotfiles/` contiene le configurazioni utente versionate. + +```text +dotfiles/ +├── common +├── desktop +├── server +├── fedora +├── ubuntu +├── workstation +├── workstation_host_linux +├── workstation_dev_wsl +└── nymph +``` + +Le configurazioni sono applicate tramite Ansible e organizzate per livelli: + +| Livello | Scopo | +| ------- | -------------------------------- | +| common | configurazioni condivise | +| profile | configurazioni per tipo macchina | +| host | override specifici | + +--- + +# Requisiti + +Per utilizzare il repository sono necessari: + +- Python 3 +- Ansible +- `ansible-lint` +- `yamllint` +- `shellcheck` +- collection definite in `ansible/collections/requirements.yml` +- accesso locale o SSH alle macchine target, in base a come e definito l'inventory + +Installazione base: + +```bash +python3 -m pip install ansible ansible-lint yamllint shellcheck-py +ansible-galaxy collection install -r ansible/collections/requirements.yml +``` + +Gestione segreti: + +- il repository supporta il caricamento opzionale di `secrets/vault.yml` +- il repository supporta anche `secrets/vault.local.yml` per override locali non versionati +- `secrets/vault.yml.example` funge da template/esempio +- se `secrets/vault.yml` non e presente, il playbook continua comunque senza caricare variabili locali opzionali +- se `secrets/.vault_pass.gpg` esiste viene usato automaticamente per sbloccare i vault tramite `gpg`; in alternativa resta supportato `secrets/.vault_pass` come fallback legacy locale; se nessuno dei due file esiste Ansible richiede la password in modo interattivo + +--- + +# Utilizzo + +Eseguire il playbook principale: + +```bash +ansible-playbook ansible/site.yml +``` + +Allo stato attuale questo comando: + +- distribuisce i dotfiles comuni a tutti gli host +- per `platform_void` applica pacchetti Void e servizi runit - per `platform_void + graphical_desktop` applica bootstrap desktop condiviso, sessioni Sway/Niri e override specifici per host - per `platform_freebsd`, `workstation_dev_fedora` e `workstation_host_linux` non applica nulla finche quei gruppi restano senza host -- per `platform_fedora` applica pacchetti Fedora e servizi systemd a `ikaros` e `nymph` -- per `platform_fedora & role_personal_workstation` applica il layer personale a `ikaros` -- per `platform_fedora & desktop_gnome` applica il profilo GNOME a `ikaros` e `nymph` -- per `workstation_dev_wsl` applica pacchetti Ubuntu, servizi systemd, profilo dev comune e tweak WSL dedicati a `deadalus-wsl` -- per gli host `ubuntu_server` applica pacchetti Ubuntu, servizi systemd, profilo server, UFW, dotfiles e template dedicati +- per `platform_fedora` applica pacchetti Fedora e servizi systemd a `ikaros` e `nymph` +- per `platform_fedora & role_personal_workstation` applica il layer personale a `ikaros` +- per `platform_fedora & desktop_gnome` applica il profilo GNOME a `ikaros` e `nymph` +- per `workstation_dev_wsl` applica pacchetti Ubuntu, servizi systemd, profilo dev comune e tweak WSL dedicati a `deadalus-wsl` +- per gli host `ubuntu_server` applica pacchetti Ubuntu, servizi systemd, profilo server, UFW, dotfiles e template dedicati - non riavvia automaticamente il display manager -- carica `secrets/vault.yml` solo se presente -- carica `secrets/vault.local.yml` solo se presente, dopo `vault.yml`, cosi gli override locali hanno precedenza - -Per validare prima di applicare: - -```bash -ansible-playbook ansible/site.yml --syntax-check -ansible-playbook ansible/site.yml --limit ikaros,nymph --check --diff -ansible-playbook ansible/site.yml --limit ikaros --check --diff -ansible-playbook ansible/site.yml --limit nymph --check --diff -ansible-playbook ansible/site.yml --limit deadalus-wsl --check --diff -ansible-playbook ansible/site.yml --limit prometheus --check --diff -ansible-lint ansible/site.yml -ansible-lint ansible/roles -yamllint ansible/ -``` - -Per testare un override dell'utente server senza modificare l'inventory: - -```bash -ansible-playbook ansible/site.yml --limit prometheus --check --diff -e server_username=myuser -``` - -Per validazioni piu mirate: - -```bash -ansible-playbook ansible/site.yml --limit --tags , --check --diff -ansible-playbook ansible/site.yml --limit --start-at-task "" --check --diff -ansible-lint ansible/roles/ -yamllint ansible/path/to/file.yml -docker compose -f /opt/docker/server/docker-compose.yml config -``` - -## Tag supportati dal playbook - -Per vedere l'elenco reale aggiornato dei tag disponibili: - -```bash -ansible-playbook ansible/site.yml --list-tags -``` - -Allo stato attuale `ansible/site.yml` espone questi tag: - -| Tag | Scopo | Ambito principale | -| --- | --- | --- | +- carica `secrets/vault.yml` solo se presente +- carica `secrets/vault.local.yml` solo se presente, dopo `vault.yml`, cosi gli override locali hanno precedenza + +Per validare prima di applicare: + +```bash +ansible-playbook ansible/site.yml --syntax-check +ansible-playbook ansible/site.yml --limit ikaros,nymph --check --diff +ansible-playbook ansible/site.yml --limit ikaros --check --diff +ansible-playbook ansible/site.yml --limit nymph --check --diff +ansible-playbook ansible/site.yml --limit deadalus-wsl --check --diff +ansible-playbook ansible/site.yml --limit prometheus --check --diff +ansible-lint ansible/site.yml +ansible-lint ansible/roles +yamllint ansible/ +``` + +Per testare un override dell'utente server senza modificare l'inventory: + +```bash +ansible-playbook ansible/site.yml --limit prometheus --check --diff -e server_username=myuser +``` + +Per validazioni piu mirate: + +```bash +ansible-playbook ansible/site.yml --limit --tags , --check --diff +ansible-playbook ansible/site.yml --limit --start-at-task "" --check --diff +ansible-lint ansible/roles/ +yamllint ansible/path/to/file.yml +docker compose -f /opt/docker/server/docker-compose.yml config +``` + +## Tag supportati dal playbook + +Per vedere l'elenco reale aggiornato dei tag disponibili: + +```bash +ansible-playbook ansible/site.yml --list-tags +``` + +Allo stato attuale `ansible/site.yml` espone questi tag: + +| Tag | Scopo | Ambito principale | +| --- | --- | --- | | `always` | pre-task sempre eseguiti, inclusi caricamento vault e validazioni preliminari | common | | `ai_agents` | installazione agenti AI condivisi | Fedora, WSL | | `dotfiles` | distribuzione/configurazione dotfiles | tutti i profili | @@ -437,7 +437,7 @@ Allo stato attuale `ansible/site.yml` espone questi tag: | `dotfiles:workstation` | dotfiles dedicati alle workstation | personal workstation, WSL, workstation Linux future | | `emptty` | gestione display manager `emptty` | desktop Void | | `display-manager` | gestione del display manager `emptty` | desktop Void | -| `emacs` | deploy opzionale di Emacs | desktop Fedora/Void | +| `emacs` | configurazione Emacs condivisa e dipendenze di authoring | desktop Fedora/GNOME e workstation | | `fonts` | installazione font | Fedora | | `fzf` | configurazione FZF | dotfiles comuni | | `git` | configurazione Git e GPG desktop | Fedora/GNOME, desktop Void | @@ -454,88 +454,88 @@ Allo stato attuale `ansible/site.yml` espone questi tag: | `vim` | configurazione Vim | dotfiles comuni | | `vscode` | installazione/configurazione VS Code | workstation Fedora future, host Linux | | `wsl` | bootstrap e configurazione WSL | WSL | - -Esempi pratici: - -```bash -ansible-playbook ansible/site.yml --limit nymph --tags dotfiles:desktop,gnome --check --diff -ansible-playbook ansible/site.yml --limit ikaros --tags gnome --check --diff -ansible-playbook ansible/site.yml --limit prometheus --tags services,dotfiles:server --check --diff -``` - ---- - -# Bootstrap di una nuova macchina - -Una nuova macchina può essere inizializzata con i seguenti passaggi: - -```bash -git clone -cd -ansible-galaxy collection install -r ansible/collections/requirements.yml -ansible-playbook ansible/site.yml -``` - -Dopo l'esecuzione del playbook la macchina verra configurata secondo il profilo definito e i ruoli attualmente orchestrati. - -Per aggiungere un nuovo host Void che riusa il profilo desktop preservato: - + +Esempi pratici: + +```bash +ansible-playbook ansible/site.yml --limit nymph --tags dotfiles:desktop,gnome --check --diff +ansible-playbook ansible/site.yml --limit ikaros --tags gnome --check --diff +ansible-playbook ansible/site.yml --limit prometheus --tags services,dotfiles:server --check --diff +``` + +--- + +# Bootstrap di una nuova macchina + +Una nuova macchina può essere inizializzata con i seguenti passaggi: + +```bash +git clone +cd +ansible-galaxy collection install -r ansible/collections/requirements.yml +ansible-playbook ansible/site.yml +``` + +Dopo l'esecuzione del playbook la macchina verra configurata secondo il profilo definito e i ruoli attualmente orchestrati. + +Per aggiungere un nuovo host Void che riusa il profilo desktop preservato: + 1. aggiungere l'host a `platform_void`; 2. aggiungerlo a `graphical_desktop`; 3. usare Sway, oppure aggiungerlo a `desktop_niri` per selezionare Niri; 4. lasciare eventuali dettagli hardware in `host_vars/.yml`. - -I gruppi legacy `void` e `desktop` sono parent di compatibilita, quindi un host -in `platform_void` e `graphical_desktop` continua a ricevere anche le variabili -Void e desktop esistenti. - -Per prove in VM sono disponibili gruppi di esempio in -`ansible/inventory/examples/platform-test-hosts.yml`, da passare esplicitamente -con `-i` insieme all'inventory principale. - -Per il flusso mail desktop esiste inoltre uno script dedicato: - -```bash -scripts/bootstrap_mail.sh -``` - -Lo script si occupa del bootstrap dei secret nel keyring, del primo sync con `mbsync` e dell'inizializzazione di `mu` usando la configurazione mail generata dai template. - -Se modifichi questo script, valida almeno con: - -```bash -sh -n scripts/bootstrap_mail.sh -shellcheck scripts/bootstrap_mail.sh -``` - ---- - -# Filosofia del progetto - -Il repository segue alcuni principi chiave: - -- Infrastructure as Code -- configurazione dichiarativa -- idempotenza -- ambienti riproducibili -- separazione tra configurazione sistema e configurazione utente - -Questo consente di ricreare qualsiasi macchina partendo esclusivamente dal repository. - ---- - -# Roadmap - -Possibili evoluzioni future: - -- hardening sicurezza server -- configurazione backup -- testing automatico playbook -- integrazione CI -- supporto ad altre distribuzioni Linux - ---- - -# Licenza - -Questo progetto è distribuito sotto licenza **LGPL-3.0**. + +I gruppi legacy `void` e `desktop` sono parent di compatibilita, quindi un host +in `platform_void` e `graphical_desktop` continua a ricevere anche le variabili +Void e desktop esistenti. + +Per prove in VM sono disponibili gruppi di esempio in +`ansible/inventory/examples/platform-test-hosts.yml`, da passare esplicitamente +con `-i` insieme all'inventory principale. + +Per il flusso mail desktop esiste inoltre uno script dedicato: + +```bash +scripts/bootstrap_mail.sh +``` + +Lo script si occupa del bootstrap dei secret nel keyring, del primo sync con `mbsync` e dell'inizializzazione di `mu` usando la configurazione mail generata dai template. + +Se modifichi questo script, valida almeno con: + +```bash +sh -n scripts/bootstrap_mail.sh +shellcheck scripts/bootstrap_mail.sh +``` + +--- + +# Filosofia del progetto + +Il repository segue alcuni principi chiave: + +- Infrastructure as Code +- configurazione dichiarativa +- idempotenza +- ambienti riproducibili +- separazione tra configurazione sistema e configurazione utente + +Questo consente di ricreare qualsiasi macchina partendo esclusivamente dal repository. + +--- + +# Roadmap + +Possibili evoluzioni future: + +- hardening sicurezza server +- configurazione backup +- testing automatico playbook +- integrazione CI +- supporto ad altre distribuzioni Linux + +--- + +# Licenza + +Questo progetto è distribuito sotto licenza **LGPL-3.0**. diff --git a/ansible/inventory/group_vars/all.yml b/ansible/inventory/group_vars/all.yml index 39f4716..b2b6ff3 100644 --- a/ansible/inventory/group_vars/all.yml +++ b/ansible/inventory/group_vars/all.yml @@ -9,6 +9,29 @@ effective_user_group: "{{ user_group }}" effective_user_home: "{{ user_home }}" emacs_enabled: false +emacs_dotfiles: + - name: Bash Emacs client fragment + src: .bashrc.d/25-emacs-client-desktop.sh + dest: .bashrc.d/25-emacs-client-desktop.sh + mode: "0644" + - name: Emacs authoring configuration + src: .emacs.d/ + dest: .emacs.d/ + mode: preserve + +emacs_authoring_directories: + - .bashrc.d + - Org + - Org/documentation + - Org/meetings + - Org/projects + +emacs_authoring_files: + - name: Org HTML stylesheet + src: .emacs.d/templates/org/org.css + dest: Org/org.css + mode: "0644" + xdg_user_directories: - Desktop - Documents diff --git a/ansible/inventory/group_vars/desktop.yml b/ansible/inventory/group_vars/desktop.yml index 0cad24d..1dad1c3 100644 --- a/ansible/inventory/group_vars/desktop.yml +++ b/ansible/inventory/group_vars/desktop.yml @@ -157,16 +157,6 @@ desktop_minimal_managed_paths: - .config/wlogout - .local/bin/udiskie-password -desktop_emacs_dotfiles: - - name: Bash Emacs client fragment - src: .bashrc.d/25-emacs-client-desktop.sh - dest: .bashrc.d/25-emacs-client-desktop.sh - mode: "0644" - - name: Emacs config - src: .emacs.d/ - dest: .emacs.d/ - mode: preserve - desktop_sway_dotfiles: - name: alacritty config src: .config/alacritty/ diff --git a/ansible/inventory/group_vars/desktop_gnome.yml b/ansible/inventory/group_vars/desktop_gnome.yml index c310cb2..78a7bda 100644 --- a/ansible/inventory/group_vars/desktop_gnome.yml +++ b/ansible/inventory/group_vars/desktop_gnome.yml @@ -36,7 +36,6 @@ fedora_desktop_packages: - liberation-fonts - libasan - libubsan - - libvterm-devel - libX11-devel - libXft-devel - meld @@ -58,7 +57,6 @@ fedora_desktop_packages: - syncthing - tealdeer - terminus-fonts - - texlive - tmux - wl-clipboard - ty diff --git a/ansible/inventory/group_vars/fedora.yml b/ansible/inventory/group_vars/fedora.yml index c39808a..525190c 100644 --- a/ansible/inventory/group_vars/fedora.yml +++ b/ansible/inventory/group_vars/fedora.yml @@ -21,6 +21,11 @@ fedora_intellij_package_name: intellij-idea-ultimate fedora_emacs_packages: - emacs-pgtk + - pandoc + - latexmk + - texlive-latex + - texlive-luatex + - texlive-collection-latexrecommended fedora_docker_packages: - docker-ce @@ -55,7 +60,6 @@ fedora_workstation_dev_packages: - gnupg2-gpg-agent - libfido2 - openssh-clients - - pandoc - shellcheck workstation_host_linux_packages_fedora: diff --git a/ansible/inventory/group_vars/ubuntu.yml b/ansible/inventory/group_vars/ubuntu.yml index c423053..56877ca 100644 --- a/ansible/inventory/group_vars/ubuntu.yml +++ b/ansible/inventory/group_vars/ubuntu.yml @@ -11,6 +11,15 @@ ubuntu_packages_base: ubuntu_manage_docker_repo: true +ubuntu_emacs_packages: + - emacs + - pandoc + - latexmk + - texlive-luatex + - texlive-latex-base + - texlive-latex-recommended + - texlive-fonts-recommended + ubuntu_docker_packages: - docker-ce - docker-ce-cli diff --git a/ansible/inventory/group_vars/void.yml b/ansible/inventory/group_vars/void.yml index fa8e098..dcebf27 100644 --- a/ansible/inventory/group_vars/void.yml +++ b/ansible/inventory/group_vars/void.yml @@ -195,7 +195,6 @@ profile_packages: - libspa-bluetooth - libreoffice - liberation-fonts-ttf - - libvterm-devel - libX11-devel - libXft-devel - meld diff --git a/ansible/inventory/group_vars/workstation_dev.yml b/ansible/inventory/group_vars/workstation_dev.yml index a73c858..aef8b8b 100644 --- a/ansible/inventory/group_vars/workstation_dev.yml +++ b/ansible/inventory/group_vars/workstation_dev.yml @@ -1,11 +1,12 @@ --- +emacs_enabled: true + workstation_dev_packages: - distrobox - gnupg - gpg-agent - libfido2-1 - openssh-client - - pandoc - shellcheck workstation_user_directories: diff --git a/ansible/inventory/group_vars/workstation_host_linux.yml b/ansible/inventory/group_vars/workstation_host_linux.yml index c05ada5..e7a8e77 100644 --- a/ansible/inventory/group_vars/workstation_host_linux.yml +++ b/ansible/inventory/group_vars/workstation_host_linux.yml @@ -1,4 +1,6 @@ --- +emacs_enabled: true + workstation_host_linux_packages: - croc - gnome-shell-extension-manager diff --git a/ansible/roles/dotfiles_common/tasks/main.yml b/ansible/roles/dotfiles_common/tasks/main.yml index c985d4d..ae16366 100644 --- a/ansible/roles/dotfiles_common/tasks/main.yml +++ b/ansible/roles/dotfiles_common/tasks/main.yml @@ -25,6 +25,43 @@ group: "{{ effective_user_group }}" when: "'desktop' in group_names" +- name: Ensure Emacs authoring directories exist + tags: [dotfiles, dotfiles:common, emacs] + ansible.builtin.file: + path: "{{ effective_user_home }}/{{ item }}" + state: directory + owner: "{{ effective_username }}" + group: "{{ effective_user_group }}" + mode: "0755" + loop: "{{ emacs_authoring_directories | default([]) }}" + when: emacs_enabled | default(false) | bool + +- name: Deploy the shared Emacs authoring configuration + tags: [dotfiles, dotfiles:common, emacs] + ansible.builtin.copy: + src: "{{ playbook_dir }}/../dotfiles/desktop/{{ item.src }}" + dest: "{{ effective_user_home }}/{{ item.dest }}" + owner: "{{ effective_username }}" + group: "{{ effective_user_group }}" + mode: "{{ item.mode }}" + loop: "{{ emacs_dotfiles | default([]) }}" + loop_control: + label: "{{ item.dest }}" + when: emacs_enabled | default(false) | bool + +- name: Deploy Emacs authoring assets + tags: [dotfiles, dotfiles:common, emacs] + ansible.builtin.copy: + src: "{{ playbook_dir }}/../dotfiles/desktop/{{ item.src }}" + dest: "{{ effective_user_home }}/{{ item.dest }}" + owner: "{{ effective_username }}" + group: "{{ effective_user_group }}" + mode: "{{ item.mode }}" + loop: "{{ emacs_authoring_files | default([]) }}" + loop_control: + label: "{{ item.dest }}" + when: emacs_enabled | default(false) | bool + - name: Ensure SSH socket directory exists tags: [dotfiles, dotfiles:common] ansible.builtin.file: diff --git a/ansible/roles/packages_fedora/tasks/main.yml b/ansible/roles/packages_fedora/tasks/main.yml index a8f5725..dd59633 100644 --- a/ansible/roles/packages_fedora/tasks/main.yml +++ b/ansible/roles/packages_fedora/tasks/main.yml @@ -103,8 +103,7 @@ + ( (fedora_emacs_packages | default([])) if ( - 'graphical_desktop' in group_names - and (emacs_enabled | default(false) | bool) + emacs_enabled | default(false) | bool ) else [] ) diff --git a/ansible/roles/packages_ubuntu/tasks/main.yml b/ansible/roles/packages_ubuntu/tasks/main.yml index 945a3c8..783bf1f 100644 --- a/ansible/roles/packages_ubuntu/tasks/main.yml +++ b/ansible/roles/packages_ubuntu/tasks/main.yml @@ -136,6 +136,11 @@ + (ubuntu_packages_base | default([])) + (ubuntu_docker_packages | default([])) + (profile_packages | default([])) + + ( + (ubuntu_emacs_packages | default([])) + if (emacs_enabled | default(false) | bool) + else [] + ) + (workstation_dev_packages | default([])) + ( (workstation_host_linux_packages | default([])) diff --git a/ansible/roles/profile_desktop_common/tasks/main.yml b/ansible/roles/profile_desktop_common/tasks/main.yml index 1bdf34a..150d99e 100644 --- a/ansible/roles/profile_desktop_common/tasks/main.yml +++ b/ansible/roles/profile_desktop_common/tasks/main.yml @@ -315,19 +315,6 @@ loop_control: label: "{{ item.dest }}" -- name: Copy Emacs desktop dotfiles - tags: [dotfiles, dotfiles:desktop, emacs] - ansible.builtin.copy: - src: "{{ playbook_dir }}/../dotfiles/desktop/{{ item.src }}" - dest: "{{ user_home }}/{{ item.dest }}" - owner: "{{ username }}" - group: "{{ user_group }}" - mode: "{{ item.mode }}" - loop: "{{ desktop_emacs_dotfiles | default([]) }}" - when: emacs_enabled | default(false) | bool - loop_control: - label: "{{ item.dest }}" - - name: Render git configuration with private values tags: [dotfiles, dotfiles:desktop, git] ansible.builtin.template: diff --git a/ansible/roles/profile_desktop_gnome/tasks/main.yml b/ansible/roles/profile_desktop_gnome/tasks/main.yml index 1be9add..345390e 100644 --- a/ansible/roles/profile_desktop_gnome/tasks/main.yml +++ b/ansible/roles/profile_desktop_gnome/tasks/main.yml @@ -45,19 +45,6 @@ loop_control: label: "{{ item.dest }}" -- name: Copy GNOME Emacs desktop dotfiles - tags: [dotfiles, dotfiles:desktop, emacs, gnome] - ansible.builtin.copy: - src: "{{ playbook_dir }}/../dotfiles/desktop/{{ item.src }}" - dest: "{{ user_home }}/{{ item.dest }}" - owner: "{{ username }}" - group: "{{ user_group }}" - mode: "{{ item.mode }}" - loop: "{{ desktop_emacs_dotfiles | default([]) }}" - when: emacs_enabled | default(false) | bool - loop_control: - label: "{{ item.dest }}" - - name: Configure GNOME gpg-agent for Fedora tags: [dotfiles, dotfiles:desktop, git, gnome] ansible.builtin.copy: diff --git a/dotfiles/common/.config/ai/knowledge/emacs.md b/dotfiles/common/.config/ai/knowledge/emacs.md index e6deb25..432a8e6 100644 --- a/dotfiles/common/.config/ai/knowledge/emacs.md +++ b/dotfiles/common/.config/ai/knowledge/emacs.md @@ -1,5 +1,5 @@ # Emacs -- Primary editor -- LSP for C, Go, Python -- Modular configuration +- Authoring environment for Org Mode, notes, documentation, CVs and exports +- One shared configuration for desktop and workstation +- Native Emacs keybindings; Vim remains the primary development editor diff --git a/dotfiles/desktop/.bashrc.d/25-emacs-client-desktop.sh b/dotfiles/desktop/.bashrc.d/25-emacs-client-desktop.sh index 1581fda..0d642be 100644 --- a/dotfiles/desktop/.bashrc.d/25-emacs-client-desktop.sh +++ b/dotfiles/desktop/.bashrc.d/25-emacs-client-desktop.sh @@ -1,14 +1,14 @@ if command -v emacsclient >/dev/null 2>&1; then ec() { emacsclient -c -n "$@" || { - printf '%s\n' "Emacs server is not available. Log into a graphical session and ensure the user 'emacs' service is running." >&2 + printf '%s\n' "Emacs server is not available. Start Emacs or run M-x server-start." >&2 return 1 } } et() { emacsclient -t "$@" || { - printf '%s\n' "Emacs server is not available. Ensure the user 'emacs' service is running in your graphical session." >&2 + printf '%s\n' "Emacs server is not available. Start Emacs or run M-x server-start." >&2 return 1 } } diff --git a/dotfiles/desktop/.config/mimeapps.list b/dotfiles/desktop/.config/mimeapps.list index 7048a8b..79c21ce 100644 --- a/dotfiles/desktop/.config/mimeapps.list +++ b/dotfiles/desktop/.config/mimeapps.list @@ -5,12 +5,6 @@ x-scheme-handler/https=userapp-Firefox-91DVN3.desktop x-scheme-handler/about=firefox.desktop x-scheme-handler/unknown=firefox.desktop application/pdf=com.github.xournalpp.xournalpp.desktop -application/json=emacs.desktop -application/json5=emacs.desktop -application/xml=emacs.desktop -application/xml-external-parsed-entity=emacs.desktop -application/x-shellscript=emacs.desktop -application/yaml=emacs.desktop inode/directory=thunar.desktop image/bmp=org.xfce.ristretto.desktop image/gif=org.xfce.ristretto.desktop @@ -148,18 +142,6 @@ application/zstd=xarchiver.desktop text/markdown=emacs.desktop text/org=emacs.desktop text/plain=emacs.desktop -text/rust=emacs.desktop -text/x-c++hdr=emacs.desktop -text/x-c++src=emacs.desktop -text/x-chdr=emacs.desktop -text/x-csrc=emacs.desktop -text/x-emacs-lisp=emacs.desktop -text/x-go=emacs.desktop -text/x-java=emacs.desktop -text/x-makefile=emacs.desktop -text/x-patch=emacs.desktop -text/x-python=emacs.desktop -text/x-python3=emacs.desktop text/x-readme=emacs.desktop text/x-rst=emacs.desktop text/x-tex=emacs.desktop @@ -173,13 +155,7 @@ application/x-extension-xhtml=userapp-Firefox-91DVN3.desktop application/x-extension-xht=userapp-Firefox-91DVN3.desktop [Added Associations] -application/json=emacs.desktop; -application/json5=emacs.desktop; application/pdf=com.github.xournalpp.xournalpp.desktop; -application/xml=emacs.desktop; -application/xml-external-parsed-entity=emacs.desktop; -application/x-shellscript=emacs.desktop; -application/yaml=emacs.desktop; text/plain=emacs.desktop; inode/directory=thunar.desktop; image/bmp=org.xfce.ristretto.desktop; @@ -317,18 +293,6 @@ application/zip=xarchiver.desktop; application/zstd=xarchiver.desktop; text/markdown=emacs.desktop; text/org=emacs.desktop; -text/rust=emacs.desktop; -text/x-c++hdr=emacs.desktop; -text/x-c++src=emacs.desktop; -text/x-chdr=emacs.desktop; -text/x-csrc=emacs.desktop; -text/x-emacs-lisp=emacs.desktop; -text/x-go=emacs.desktop; -text/x-java=emacs.desktop; -text/x-makefile=emacs.desktop; -text/x-patch=emacs.desktop; -text/x-python=emacs.desktop; -text/x-python3=emacs.desktop; text/x-readme=emacs.desktop; text/x-rst=emacs.desktop; text/x-tex=emacs.desktop; diff --git a/dotfiles/desktop/.emacs.d/.gitignore b/dotfiles/desktop/.emacs.d/.gitignore index 5d480c3..b0ccae5 100644 --- a/dotfiles/desktop/.emacs.d/.gitignore +++ b/dotfiles/desktop/.emacs.d/.gitignore @@ -1,65 +1,13 @@ -# Created by https://www.toptal.com/developers/gitignore/api/emacs -# Edit at https://www.toptal.com/developers/gitignore?templates=emacs - -### Emacs ### -# -*- mode: gitignore; -*- -*~ -\#*\# -/.emacs.desktop -/.emacs.desktop.lock -*.elc -auto-save-list -tramp -.\#* -eln-cache -projects -transient/ -.dap-breakpoints -.lsp-session-v1 -/.extension/** -url/** -**/*.bak -**/recentf - -# Org-mode -.org-id-locations -*_archive - -# flymake-mode -*_flymake.* - -# eshell files -/eshell/history -/eshell/lastdir - -# elpa packages -/elpa/ - -# reftex files -*.rel - -# AUCTeX auto folder -/auto/ - -# cask packages -.cask/ -dist/ - -# Flycheck -flycheck_*.el - -# server auth directory -/server/ - -# projectiles files -.projectile -/projectile-bookmarks.eld - -# directory configuration -.dir-locals.el - -# network security -/network-security.data - - -# End of https://www.toptal.com/developers/gitignore/api/emacs +*~ +\#*\# +*.elc +auto-save-list/ +.\#* +eln-cache/ +.org-id-locations +*_archive +/eshell/ +/elpa/ +/auto/ +/server/ +/network-security.data diff --git a/dotfiles/desktop/.emacs.d/early-init.el b/dotfiles/desktop/.emacs.d/early-init.el index d887ee9..a03358b 100644 --- a/dotfiles/desktop/.emacs.d/early-init.el +++ b/dotfiles/desktop/.emacs.d/early-init.el @@ -18,6 +18,3 @@ (defun fscotto/load-modules (&rest modules) "Load MODULES." (mapc #'fscotto/load-module modules)) - -(defvar fscotto/emacs-profile - (or (getenv "EMACS_PROFILE") "full")) diff --git a/dotfiles/desktop/.emacs.d/init.el b/dotfiles/desktop/.emacs.d/init.el index 07e93df..c10473c 100644 --- a/dotfiles/desktop/.emacs.d/init.el +++ b/dotfiles/desktop/.emacs.d/init.el @@ -1,52 +1,20 @@ -(message "Welcome to Emacs") -(message "Loading user configuration...") -(message "Emacs profile: %s" fscotto/emacs-profile) +(message "Loading authoring configuration...") -;;===================================================================================== -;; Load modules -;;===================================================================================== (fscotto/load-modules - ;; Core - 'core/packages - 'core/ui - 'core/performance - 'core/editor - 'core/keybindings - 'core/modal - 'core/buffer + 'core/packages + 'core/ui + 'core/performance + 'core/editor + 'core/keybindings + 'core/buffer + 'tools/spell + 'tools/completion + 'lang/org + 'authoring + 'quality-of-life + 'misc/dashboard + 'misc/which-key + 'misc/vcs + 'misc/rss) - ;; Tools - 'tools/completion - 'tools/dired - 'tools/project - 'tools/spell - 'tools/tramp - 'tools/lsp - 'tools/dap - 'tools/treesitter - - ;; Languages - 'lang/c - 'lang/docker - 'lang/golang - 'lang/json - 'lang/markdown - 'lang/org - 'lang/python - 'lang/shell - 'lang/yaml - - ;; Misc - 'misc/dashboard - 'misc/custom-functions - 'misc/doom-modeline - 'misc/which-key - 'misc/gptel - 'misc/rss - 'misc/terminal - 'misc/vcs - 'misc/documents - 'misc/i3-config - 'misc/xclip) - -(message "...user configuration loaded") +(message "Authoring configuration loaded") diff --git a/dotfiles/desktop/.emacs.d/lisp/authoring.el b/dotfiles/desktop/.emacs.d/lisp/authoring.el new file mode 100644 index 0000000..9c3a5f0 --- /dev/null +++ b/dotfiles/desktop/.emacs.d/lisp/authoring.el @@ -0,0 +1,76 @@ +;;; authoring.el --- Export and document templates -*- lexical-binding: t; -*- + +(require 'org) +(require 'ox) +(require 'ox-html) +(require 'ox-latex) +(require 'ox-md) +(require 'ox-odt) + +(defconst fscotto/org-templates-directory + (expand-file-name "templates/org" user-emacs-directory) + "Directory containing the versioned Org templates.") + +(defun fscotto/org--require-current-buffer () + "Signal an actionable error unless the current buffer is an Org document." + (unless (derived-mode-p 'org-mode) + (user-error "Open an Org file before exporting"))) + +(defun fscotto/org-export-pdf () + "Export the current Org document to PDF with LuaLaTeX and latexmk." + (interactive) + (fscotto/org--require-current-buffer) + (dolist (program '("latexmk" "lualatex")) + (unless (executable-find program) + (user-error "%s is not available; install the authoring dependencies" program))) + (org-latex-export-to-pdf)) + +(defun fscotto/org-export-html () + "Export the current Org document to HTML5." + (interactive) + (fscotto/org--require-current-buffer) + (org-html-export-to-html)) + +(defun fscotto/org-export-markdown () + "Export the current Org document to Markdown." + (interactive) + (fscotto/org--require-current-buffer) + (org-md-export-to-markdown)) + +(defun fscotto/org-export-docx () + "Export the current Org document to DOCX through Pandoc." + (interactive) + (fscotto/org--require-current-buffer) + (unless (buffer-file-name) + (user-error "Save the Org file before exporting it to DOCX")) + (let ((pandoc (executable-find "pandoc")) + (output (concat (file-name-sans-extension (buffer-file-name)) ".docx"))) + (unless pandoc + (user-error "pandoc is not available; install the authoring dependencies")) + (save-buffer) + (unless (zerop (call-process pandoc nil "*Org Pandoc*" nil + (buffer-file-name) "-f" "org" "-t" "docx" "-o" output)) + (pop-to-buffer "*Org Pandoc*") + (user-error "Pandoc could not export this document")) + (message "DOCX exported to %s" output))) + +(defun fscotto/org-export-odt () + "Export the current Org document to OpenDocument Text." + (interactive) + (fscotto/org--require-current-buffer) + (org-odt-export-to-odt)) + +(defun fscotto/org-copy-template (template) + "Copy a versioned TEMPLATE into `org-directory'." + (interactive + (list (completing-read "Template: " + '("documentation.org" "cv.org" "generic-document.org") nil t))) + (let ((source (expand-file-name template fscotto/org-templates-directory)) + (destination (expand-file-name template org-directory))) + (unless (file-exists-p source) + (user-error "Template not found: %s" source)) + (make-directory org-directory t) + (copy-file source destination nil) + (find-file destination))) + +(provide 'authoring) diff --git a/dotfiles/desktop/.emacs.d/lisp/core/buffer.el b/dotfiles/desktop/.emacs.d/lisp/core/buffer.el index deffdf2..8d80862 100644 --- a/dotfiles/desktop/.emacs.d/lisp/core/buffer.el +++ b/dotfiles/desktop/.emacs.d/lisp/core/buffer.el @@ -1,4 +1,6 @@ -;;; buffer.el -*- lexical-binding: t; -*- +;;; buffer.el --- Buffer management -*- lexical-binding: t; -*- + +(require 'use-package) (use-package ibuffer :ensure t) @@ -9,13 +11,6 @@ (use-package ibuffer-vc :ensure t) -(use-package ibuffer-projectile - :ensure t) +(global-set-key (kbd "C-x C-b") #'ibuffer) -(add-hook 'ibuffer-mode-hook - (lambda () - (ibuffer-projectile-set-filter-groups))) - -(provide 'buffer) - -;;; buffer.el ends here +(provide 'core/buffer) diff --git a/dotfiles/desktop/.emacs.d/lisp/core/editor.el b/dotfiles/desktop/.emacs.d/lisp/core/editor.el index adaf277..53ad9f8 100644 --- a/dotfiles/desktop/.emacs.d/lisp/core/editor.el +++ b/dotfiles/desktop/.emacs.d/lisp/core/editor.el @@ -1,19 +1,9 @@ -;;; core-editor +;;; editor.el --- General editing defaults -*- lexical-binding: t; -*- -(require 'ansi-color) - -(setq standard-indent 4) -(setq tab-stop-list nil) -(setq indent-tabs-mode nil) - -;; Setting variables -(setq vc-follow-symlinks 't) -(setq vc-handled-backends nil) +(setq standard-indent 4 + indent-tabs-mode nil + vc-follow-symlinks t + custom-file (null-device)) (prefer-coding-system 'utf-8-unix) -(setq custom-file (null-device)) -(add-hook 'compilation-filter-hook #'ansi-color-compilation-filter) - -(provide 'editor) - -;;; editor.el ends here +(provide 'core/editor) diff --git a/dotfiles/desktop/.emacs.d/lisp/core/keybindings.el b/dotfiles/desktop/.emacs.d/lisp/core/keybindings.el index 1992bdd..de20643 100644 --- a/dotfiles/desktop/.emacs.d/lisp/core/keybindings.el +++ b/dotfiles/desktop/.emacs.d/lisp/core/keybindings.el @@ -1,183 +1,15 @@ -;;; keybindings.el -*- lexical-binding: t; -*- +;;; keybindings.el --- Native Emacs bindings -*- lexical-binding: t; -*- -;;;; Global / Core +(global-set-key (kbd "C-c a") #'org-agenda) +(global-set-key (kbd "C-c c") #'org-capture) -(global-set-key (kbd "C-x C-b") #'ibuffer) -(global-set-key (kbd "C-") 'company-complete) -(global-set-key (kbd "M-n f") #'flyspell-buffer) - -(defvar fscotto/leader-map (make-sparse-keymap) - "Keymap per comandi sotto C-c.") - -(define-key global-map (kbd "C-c") fscotto/leader-map) - -;;;; Org - -(autoload 'org-agenda "org" nil t) -(autoload 'org-capture "org-capture" nil t) - -(define-key fscotto/leader-map (kbd "a") #'org-agenda) -(define-key fscotto/leader-map (kbd "c") #'org-capture) - -;;;; Git / Magit -(defun fscotto/enable-magit-keymap () - "Enable Git keybindings if current buffer is inside a Git repository." - (when (and (require 'magit nil 'noerror) - (magit-toplevel)) - (local-set-key (kbd "C-c g") fscotto/git-map))) - -(defvar fscotto/git-map (make-sparse-keymap) - "Keymap for Git commands under C-c g.") - -(add-hook 'find-file-hook #'fscotto/enable-magit-keymap) -(add-hook 'prog-mode-hook #'fscotto/enable-magit-keymap) -(add-hook 'conf-mode-hook #'fscotto/enable-magit-keymap) - -;; autoload: il tasto carica magit -(autoload 'magit-status "magit" nil t) -(autoload 'magit-branch "magit" nil t) -(autoload 'magit-commit "magit" nil t) -(autoload 'magit-push "magit" nil t) -(autoload 'magit-fetch "magit" nil t) -(global-set-key (kbd "C-x g") #'magit-status) - -;; keybinding (sempre definite nella mappa) -(define-key fscotto/git-map (kbd "s") #'magit-status) -(define-key fscotto/git-map (kbd "b") #'magit-branch) -(define-key fscotto/git-map (kbd "c") #'magit-commit) -(define-key fscotto/git-map (kbd "p") #'magit-push) -(define-key fscotto/git-map (kbd "f") #'magit-fetch) - -;;;; Open / Tools -(defvar fscotto/open (make-sparse-keymap)) -(define-key fscotto/leader-map (kbd "o") fscotto/open) - -;; -------- vterm -------- -(autoload 'multi-vterm "multi-vterm" nil t) -(define-key fscotto/open (kbd "T") #'fscotto/home-multi-vterm) - -(with-eval-after-load 'vterm - (define-key vterm-mode-map (kbd "C-c C-t") #'vterm-copy-mode)) - -;; -------- elfeed -------- -(autoload 'elfeed "elfeed" nil t) -(define-key fscotto/open (kbd "f") #'fscotto/elfeed-load-db-and-open) - -;; -------- gptel -------- -(autoload 'gptel "gptel" nil t) -(define-key fscotto/open (kbd "l") #'gptel) - -;; -------- dirvish -------- -(autoload 'dirvish-dwim "dirvish" nil t) -(define-key fscotto/open (kbd "d") #'dirvish-dwim) - -;; -------- ztree -------- -(autoload 'ztree-diff "ztree" nil t) -(define-key fscotto/open (kbd "z") #'ztree-diff) - -;;;; Elfeed mode maps -(with-eval-after-load 'elfeed - (define-key elfeed-search-mode-map (kbd "w") #'elfeed-search-yank) - (define-key elfeed-search-mode-map (kbd "R") #'elfeed-update) - (define-key elfeed-search-mode-map (kbd "q") #'elfeed-kill-buffer) - - (define-key elfeed-show-mode-map (kbd "S") #'elfeed-show-new-live-search) - (define-key elfeed-show-mode-map (kbd "f") #'elfeed-show-fetch-full-text) - (define-key elfeed-show-mode-map (kbd "w") #'elfeed-show-yank)) - -;;;; hl-todo -(with-eval-after-load 'hl-todo - (define-key hl-todo-mode-map (kbd "C-t p") #'hl-todo-previous) - (define-key hl-todo-mode-map (kbd "C-t n") #'hl-todo-next) - (define-key hl-todo-mode-map (kbd "C-t o") #'hl-todo-occur) - (define-key hl-todo-mode-map (kbd "C-t i") #'hl-todo-insert)) - -;; Projectile keybindings -(define-key fscotto/leader-map (kbd "p") 'projectile-command-map) - -(with-eval-after-load 'projectile - (define-key projectile-command-map (kbd "v") #'fscotto/project-multi-vterm) - (define-key projectile-command-map (kbd "V") nil) - (define-key projectile-command-map (kbd "x") #'fscotto/project-external-terminal) - (define-key projectile-command-map (kbd "a") #'fscotto/project-agent-dwim) - (define-key projectile-command-map (kbd "A") #'fscotto/project-agent-session) - (define-key projectile-command-map (kbd "g") #'fscotto/project-magit-status)) - -;;;; LSP -(defvar fscotto/lsp-map (make-sparse-keymap)) - -(autoload 'lsp-find-definition "lsp-mode" nil t) -(autoload 'lsp-find-type-definition "lsp-mode" nil t) -(autoload 'lsp-find-implementation "lsp-mode" nil t) -(autoload 'lsp-execute-code-action "lsp-mode" nil t) -(autoload 'lsp-rename "lsp-mode" nil t) -(autoload 'lsp-format-buffer "lsp-mode" nil t) -(autoload 'lsp-restart-workspace "lsp-mode" nil t) - -(autoload 'consult-lsp-symbols "consult-lsp" nil t) -(autoload 'consult-lsp-diagnostics "consult-lsp" nil t) - -(define-key fscotto/lsp-map (kbd "s") #'consult-lsp-symbols) -(define-key fscotto/lsp-map (kbd "e") #'consult-lsp-diagnostics) -(define-key fscotto/lsp-map (kbd "d") #'lsp-find-definition) -(define-key fscotto/lsp-map (kbd "D") #'lsp-find-type-definition) -(define-key fscotto/lsp-map (kbd "i") #'lsp-find-implementation) -(define-key fscotto/lsp-map (kbd "a") #'lsp-execute-code-action) -(define-key fscotto/lsp-map (kbd "r") #'lsp-rename) -(define-key fscotto/lsp-map (kbd "f") #'lsp-format-buffer) -(define-key fscotto/lsp-map (kbd "R") #'lsp-restart-workspace) - -(defun fscotto/enable-lsp-keymap () - "Enable LSP keybindings if LSP is active in the current buffer." - (when (and (bound-and-true-p lsp-mode) - (lsp-workspaces)) - (local-set-key (kbd "C-c l") fscotto/lsp-map))) - -(add-hook 'lsp-mode-hook #'fscotto/enable-lsp-keymap) -(add-hook 'lsp-after-initialize-hook #'fscotto/enable-lsp-keymap) -(add-hook 'lsp-after-open-hook #'fscotto/enable-lsp-keymap) - -;;;; DAP -(defvar fscotto/dap-map (make-sparse-keymap) - "Keymap for DAP commands under C-c d.") - -(autoload 'dap-debug "dap-mode" nil t) -(autoload 'dap-breakpoint-toggle "dap-mode" nil t) -(autoload 'dap-continue "dap-mode" nil t) -(autoload 'dap-next "dap-mode" nil t) -(autoload 'dap-step-in "dap-mode" nil t) -(autoload 'dap-step-out "dap-mode" nil t) -(autoload 'dap-restart-frame "dap-mode" nil t) -(autoload 'dap-disconnect "dap-mode" nil t) - -(define-key fscotto/dap-map (kbd "d") #'dap-debug) -(define-key fscotto/dap-map (kbd "b") #'dap-breakpoint-toggle) -(define-key fscotto/dap-map (kbd "c") #'dap-continue) -(define-key fscotto/dap-map (kbd "n") #'dap-next) -(define-key fscotto/dap-map (kbd "i") #'dap-step-in) -(define-key fscotto/dap-map (kbd "o") #'dap-step-out) -(define-key fscotto/dap-map (kbd "r") #'dap-restart-frame) -(define-key fscotto/dap-map (kbd "q") #'dap-disconnect) - -(defun fscotto/enable-dap-keymap () - "Enable DAP keybindings if dap-mode is active in the current buffer." - (when (bound-and-true-p dap-mode) - (local-set-key (kbd "C-c d") fscotto/dap-map))) - -(add-hook 'dap-mode-hook #'fscotto/enable-dap-keymap) -(add-hook 'dap-session-created-hook #'fscotto/enable-dap-keymap) -(add-hook 'dap-terminated-hook #'fscotto/enable-dap-keymap) - -;;;; Go - -(with-eval-after-load 'go-ts-mode - (define-key go-ts-mode-map (kbd "C-c m t") #'fscotto/go-mod-tidy) - (define-key go-ts-mode-map (kbd "C-c m d") #'fscotto/go-mod-download) - (define-key go-ts-mode-map (kbd "C-c t p") #'fscotto/go-test-package) - (define-key go-ts-mode-map (kbd "C-c t a") #'fscotto/go-test-module) - (define-key go-ts-mode-map (kbd "C-c t t") #'fscotto/go-test-current-test) - (define-key go-ts-mode-map (kbd "C-c d t") #'dap-debug)) +(defvar fscotto/export-map (make-sparse-keymap) + "Native Emacs prefix map for document exports.") +(global-set-key (kbd "C-c e") fscotto/export-map) +(define-key fscotto/export-map (kbd "p") #'fscotto/org-export-pdf) +(define-key fscotto/export-map (kbd "h") #'fscotto/org-export-html) +(define-key fscotto/export-map (kbd "m") #'fscotto/org-export-markdown) +(define-key fscotto/export-map (kbd "d") #'fscotto/org-export-docx) +(define-key fscotto/export-map (kbd "o") #'fscotto/org-export-odt) (provide 'core/keybindings) - -;;; keybindings.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/core/modal.el b/dotfiles/desktop/.emacs.d/lisp/core/modal.el deleted file mode 100644 index 7115916..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/core/modal.el +++ /dev/null @@ -1,16 +0,0 @@ -;;; modal.el --- Vim motions for the desktop Emacs profile -*- lexical-binding: t; -*- - -(use-package evil - :ensure t - :init - (setq evil-want-C-u-scroll t - evil-want-C-i-jump nil - evil-undo-system 'undo-redo) - :config - (evil-mode 1) - (evil-define-key '(normal visual motion) 'global - (kbd "SPC") fscotto/leader-map)) - -(provide 'modal) - -;;; modal.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/core/performance.el b/dotfiles/desktop/.emacs.d/lisp/core/performance.el index eb2b796..d4736b1 100644 --- a/dotfiles/desktop/.emacs.d/lisp/core/performance.el +++ b/dotfiles/desktop/.emacs.d/lisp/core/performance.el @@ -1,22 +1,15 @@ -;;; core-performance.el -*- +;;; performance.el --- Conservative startup settings -*- lexical-binding: t; -*- -;; --- Startup speed tweaks ---------------------------------------------------- -;; Temporarily increase GC threshold during init (defvar fscotto/gc-cons-threshold-orig gc-cons-threshold) -(setq gc-cons-threshold (* 50 1000 1000)) ;; 50MB for init - -;; Speedup file-name-handler during init (defvar fscotto/file-name-handler-alist-orig file-name-handler-alist) -(setq file-name-handler-alist nil) +(setq gc-cons-threshold (* 50 1000 1000) + file-name-handler-alist nil + inhibit-compacting-font-caches t) -;; Restore after init (add-hook 'emacs-startup-hook (lambda () - (setq gc-cons-threshold fscotto/gc-cons-threshold-orig) - (setq file-name-handler-alist fscotto/file-name-handler-alist-orig) + (setq gc-cons-threshold fscotto/gc-cons-threshold-orig + file-name-handler-alist fscotto/file-name-handler-alist-orig) (garbage-collect))) -;; LSP responsiveness -(setq read-process-output-max (* 1024 1024)) ;; 1MB, utile per lsp-mode -(setq lsp-idle-delay 0.5) ;; meno ritardo prima che LSP aggiorni info -(setq inhibit-compacting-font-caches t) +(provide 'core/performance) diff --git a/dotfiles/desktop/.emacs.d/lisp/core/ui.el b/dotfiles/desktop/.emacs.d/lisp/core/ui.el index cb65d7e..8b67411 100644 --- a/dotfiles/desktop/.emacs.d/lisp/core/ui.el +++ b/dotfiles/desktop/.emacs.d/lisp/core/ui.el @@ -1,73 +1,28 @@ -;;; core-ui.el -*- lexical-binding: t; -*- +;;; ui.el --- Authoring UI -*- lexical-binding: t; -*- -;; Load default theme +;; Keep the established desktop appearance while leaving IDE-specific UI out. +(require 'use-package) (use-package nordic-night-theme :ensure t :config (load-theme 'nordic-night t)) -;; Setting default font (set-frame-font "UbuntuSansMono Nerd Font 14" nil t) - -(add-to-list 'default-frame-alist - '(font . "UbuntuSansMono Nerd Font-14")) - -;; Remove toolbar -(tool-bar-mode -1) - -;; Remove menu -(menu-bar-mode -1) - -;; Disable startup screen -(setq inhibit-startup-screen t) - -;; Disable splash screen -(setq inhibit-splash-screen t) - -;; Start all frames maximized +(add-to-list 'default-frame-alist '(font . "UbuntuSansMono Nerd Font-14")) (add-to-list 'default-frame-alist '(fullscreen . maximized)) -;; Remove scrollbar +(tool-bar-mode -1) +(menu-bar-mode -1) (scroll-bar-mode -1) - -;; Simple 'y' for 'yes' and 'n' for 'no' +(setq inhibit-startup-screen t + inhibit-splash-screen t + fill-column 120 + undo-limit 8000000 + undo-strong-limit 12000000 + scroll-step 3 + ring-bell-function 'ignore) (defalias 'yes-or-no-p 'y-or-n-p) - -;; Set global value for paragraph witdh -(setq-default fill-column 120) - -;; Stop Emacs from losing informations -(setq undo-limit 8000000) -(setq undo-strong-limit 12000000) - -;; Smooth scroll -(setq scroll-step 3) -(setq ring-bell-function 'ignore) - -;; Add column number in the status line (column-number-mode) - -;; View clock in the status line (display-time) -;; Enable line numbers in the programming mode only -(add-hook 'prog-mode-hook 'display-line-numbers-mode) - -;; Enable line numbers in the configuration mode only -(add-hook 'conf-mode-hook 'display-line-numbers-mode) - -;; Highlight keywords to remember the activity when coding. -(use-package hl-todo - :ensure t - :commands (global-hl-todo-mode) - :init (global-hl-todo-mode)) - -(setq hl-todo-keyword-faces - '(("TODO" . "#94e2d5") - ("FIXME" . "#f38ba8") - ("DEBUG" . "#cba6f7") - ("GOTCHA" . "#eba0ac") - ("STUB" . "#89b4fa"))) - -(provide 'ui) -;;; ui.el ends here +(provide 'core/ui) diff --git a/dotfiles/desktop/.emacs.d/lisp/lang/c.el b/dotfiles/desktop/.emacs.d/lisp/lang/c.el deleted file mode 100644 index efd138a..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/lang/c.el +++ /dev/null @@ -1,39 +0,0 @@ -;; c.el -*- lexical-binding: t; -*- - -;; C / C++ fallback style (Linux-like) -(setq c-default-style "linux" - c-basic-offset 4 - tab-width 8) - -(add-hook 'c-mode-common-hook - (lambda () - (setq indent-tabs-mode t))) - -;; Tree-sitter C/C++ -(setq c-ts-mode-indent-offset 4) -(setq c++-ts-mode-indent-offset 4) - -(with-eval-after-load 'lsp - ;; Clangd configurations - (setq lsp-clients-clangd-args - '("--background-index" - "--clang-tidy" - "--completion-style=detailed" - "--header-insertion=never" - "--header-insertion-decorators" - "--pch-storage=memory" - "--log=error" - "--ranking-model=heuristics" - "--malloc-trim" - "--limit-results=500" - "--limit-references=2000"))) - -(with-eval-after-load 'dap-mode - (require 'dap-cpptools)) - -(add-hook 'c-ts-mode-hook #'fscotto/disable-c-formatting) -(add-hook 'c-mode-hook #'fscotto/disable-c-formatting) - -(provide 'c) - -;;; c.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/lang/docker.el b/dotfiles/desktop/.emacs.d/lisp/lang/docker.el deleted file mode 100644 index 42b7c98..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/lang/docker.el +++ /dev/null @@ -1,8 +0,0 @@ -;;; docker.el -*- lexical-binding: t; -*- - -(use-package dockerfile-mode - :ensure t) - -(provide 'docker) - -;;; docker.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/lang/golang.el b/dotfiles/desktop/.emacs.d/lisp/lang/golang.el deleted file mode 100644 index 9fddffd..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/lang/golang.el +++ /dev/null @@ -1,89 +0,0 @@ -;;================================================================= -;; Go Language Support -;;================================================================= - -(use-package go-ts-mode - :ensure nil - :mode "\\.go\\'" - :hook - ((go-ts-mode . lsp-deferred) - (go-ts-mode . fscotto/go-format-on-save))) - -(use-package go-mod-ts-mode - :ensure nil - :mode - (("/go\\.mod\\'" . go-mod-ts-mode) - ("/go\\.sum\\'" . go-mod-ts-mode)) - :hook - ((go-mod-ts-mode . lsp-deferred) - ;; restart gopls only when go.mod/go.sum are saved (buffer-local) - (go-mod-ts-mode . (lambda () - (add-hook 'after-save-hook - (lambda () - (when (lsp-workspaces) - (lsp-restart-workspace))) - nil t))))) - -(with-eval-after-load 'project - (add-to-list 'project-vc-extra-root-markers "go.mod")) - -(with-eval-after-load 'lsp-mode - ;; gopls settings (single source of truth) - (lsp-register-custom-settings - '(("gopls.staticcheck" t) - ("gopls.gofumpt" t) - ;; ("gopls.experimentalWorkspaceModule" t) - ("gopls.expandWorkspaceToModule" t) - ("gopls.directoryFilters" ["-vendor"]) - ("gopls.analyses.unusedparams" t) - ("gopls.analyses.shadow" t) - ("gopls.analyses.nilness" t) - ("gopls.analyses.useany" t) - ("gopls.env" ((GO111MODULE . "on")))))) - -(with-eval-after-load 'flycheck - ;; Usa golangci-lint in Go - (add-hook 'go-ts-mode-hook - (lambda () - (setq-local flycheck-checker 'golangci-lint) - (setq-local flycheck-check-syntax-automatically '(save mode-enabled)) - (flycheck-mode 1)))) - -(use-package dap-dlv-go - :after (dap-mode go-ts-mode)) - -(with-eval-after-load 'dap-dlv-go - ;; Debug all tests in module - (dap-register-debug-template - "Go :: Debug all tests" - (list :type "go" - :request "launch" - :name "Go :: Debug all tests" - :mode "test" - :program "${workspaceFolder}" - :cwd "${workspaceFolder}")) - - ;; Debug tests in current package - (dap-register-debug-template - "Go :: Debug package tests" - (list :type "go" - :request "launch" - :name "Go :: Debug package tests" - :mode "test" - :program "${fileDirname}" - :cwd "${fileDirname}")) - - ;; Debug test at point - (dap-register-debug-template - "Go :: Debug test at point" - (list :type "go" - :request "launch" - :name "Go :: Debug test at point" - :mode "test" - :program "${fileDirname}" - :cwd "${fileDirname}" - :args (list "-test.run" "${input:testName}")))) - -(add-hook 'dap-terminated-hook - (lambda (_) - (delete-other-windows))) diff --git a/dotfiles/desktop/.emacs.d/lisp/lang/json.el b/dotfiles/desktop/.emacs.d/lisp/lang/json.el deleted file mode 100644 index ab25683..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/lang/json.el +++ /dev/null @@ -1,24 +0,0 @@ -;;; json.el -*- lexical-binding: t -*- - -(defun fscotto/json-maybe-start-lsp () - "Start LSP for JSON buffers when lsp-mode is available." - (when (fboundp 'lsp-deferred) - (lsp-deferred))) - -(use-package json-mode - :ensure t - :mode - (("\\.json\\'" . json-mode) - ("\\.jsonc\\'" . json-mode)) - :hook - (json-mode . fscotto/json-maybe-start-lsp)) - -(with-eval-after-load 'json-ts-mode - (add-hook 'json-ts-mode-hook #'fscotto/json-maybe-start-lsp)) - -(with-eval-after-load 'jsonc-mode - (add-hook 'jsonc-mode-hook #'fscotto/json-maybe-start-lsp)) - -(provide 'json) - -;;; json.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/lang/markdown.el b/dotfiles/desktop/.emacs.d/lisp/lang/markdown.el deleted file mode 100644 index 46fd4d5..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/lang/markdown.el +++ /dev/null @@ -1,15 +0,0 @@ -;;; markdown.el -*- lexical-binding: t; -*- - -(use-package markdown-mode - :ensure t - :mode ("\\.md\\'" . gfm-mode) - :config - (setq markdown-fontify-code-blocks-natively t) - (setq markdown-live-preview-mode t)) - -(use-package markdown-toc - :ensure t) - -(provide 'lang/markdown) - -;;; markdown.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/lang/org.el b/dotfiles/desktop/.emacs.d/lisp/lang/org.el index 227af64..167a23c 100644 --- a/dotfiles/desktop/.emacs.d/lisp/lang/org.el +++ b/dotfiles/desktop/.emacs.d/lisp/lang/org.el @@ -1,167 +1,69 @@ -;;; org.el -*- lexical-binding: t; -*- +;;; org.el --- Org authoring workflow -*- lexical-binding: t; -*- -(use-package htmlize - :ensure t) +(require 'org) +(require 'org-capture) +(require 'org-agenda) +(require 'org-id) +(require 'org-tempo) +(require 'ox) +(require 'ox-html) +(require 'ox-latex) +(require 'ox-md) +(require 'ox-odt) -;; Setting default directory for Org files. -(setq org-directory "~/Org") +(setq org-directory (expand-file-name "Org" (getenv "HOME")) + org-default-notes-file (expand-file-name "inbox.org" org-directory) + org-agenda-files (list org-default-notes-file + (expand-file-name "agenda.org" org-directory) + (expand-file-name "notes.org" org-directory) + (expand-file-name "meetings" org-directory) + (expand-file-name "projects" org-directory)) + org-todo-keywords '((sequence "TODO(t)" "NEXT(n)" "WAIT(w)" "|" "DONE(d)" "CANCELLED(c)")) + org-tag-alist '((:startgroup) ("work" . ?w) ("personal" . ?p) ("meeting" . ?m) + ("documentation" . ?d) (:endgroup)) + org-startup-indented t + org-startup-folded 'content + org-hide-leading-stars t + org-hide-emphasis-markers t + org-return-follows-link t + org-src-fontify-natively t + org-src-tab-acts-natively t + org-fontify-quote-and-verse-blocks t + org-export-with-smart-quotes t + org-html-doctype "html5" + org-html-html5-fancy t + org-html-head-include-default-style nil + org-html-head "" + org-latex-compiler "lualatex" + org-latex-pdf-process '("latexmk -lualatex -interaction=nonstopmode -output-directory=%o %f")) -(defvar org-notes-file (expand-file-name "notes.org" org-directory) - "Default Org notes file.") +;; Keep the LuaLaTeX dependency set small while retaining text, tables, links, +;; and images in exported documents. +(setq org-latex-default-packages-alist + '(("" "amsmath" t ("lualatex" "xetex")) + ("" "fontspec" t ("lualatex" "xetex")) + ("" "graphicx" t) + ("" "longtable" nil) + ("" "hyperref" nil))) -(defvar org-calendar-file (expand-file-name "calendar.org" org-directory) - "Default Org calendar file.") +(setq org-capture-templates + `(("t" "TODO" entry (file ,org-default-notes-file) + "* TODO %?\n:PROPERTIES:\n:CREATED: %U\n:END:\n") + ("n" "Note" entry (file ,(expand-file-name "notes.org" org-directory)) + "* %U %?\n") + ("m" "Meeting" entry (file+olp+datetree ,(expand-file-name "meetings/meetings.org" org-directory)) + "* %^{Title} :meeting:\n%U\n%?\n") + ("d" "Document idea" entry (file ,(expand-file-name "documentation/ideas.org" org-directory)) + "* IDEA %? :documentation:\n%U\n"))) -(defface +org-todo-active - '((t (:foreground "#51afef" :weight bold))) - "Face for active Org TODO states.") +(add-hook 'org-mode-hook #'org-indent-mode) +(add-hook 'org-mode-hook #'visual-line-mode) +(add-hook 'org-mode-hook #'flyspell-mode) -(defface +org-todo-project - '((t (:foreground "#c678dd" :weight bold))) - "Face for project Org TODO states.") - -(defface +org-todo-onhold - '((t (:foreground "#ECBE7B" :weight bold))) - "Face for waiting Org TODO states.") - -(defface +org-todo-cancel - '((t (:foreground "#ff6c6b" :weight bold))) - "Face for cancelled Org TODO states.") - -(use-package org - :init - (setq org-clock-mode-line-total 'today - org-fontify-done-headline t - org-fontify-quote-and-verse-blocks t - org-indent-mode t - org-agenda-skip-unavailable-files t - org-return-follows-link t - org-src-fontify-natively t - org-src-tab-acts-natively t - org-startup-folded 'content - org-hide-leading-stars t - org-hide-emphasis-markers t - org-id-link-to-org-use-this t - org-id-track-globally t - org-todo-keywords - '((sequence - "TODO(t)" - "PROJ(p)" - "LOOP(r)" - "STRT(s)" - "WAIT(w)" - "HOLD(h)" - "IDEA(i)" - "|" - "DONE(d)" - "KILL(k)") - (sequence - "[ ](T)" - "[-](S)" - "[?](W)" - "|" - "[X](D)") - (sequence - "|" - "OKAY(o)" - "YES(y)" - "NO(n)")) - org-todo-keyword-faces - '(("[-]" . +org-todo-active) - ("STRT" . +org-todo-active) - ("[?]" . +org-todo-onhold) - ("WAIT" . +org-todo-onhold) - ("HOLD" . +org-todo-onhold) - ("PROJ" . +org-todo-project) - ("NO" . +org-todo-cancel) - ("KILL" . +org-todo-cancel)) - org-export-backends '(html latex odt md ascii icalendar) - org-latex-pdf-process '("pdflatex -interaction nonstopmode %f" - "pdflatex -interaction nonstopmode %f") - org-latex-default-class "article" - org-html-doctype "html5" - org-html-html5-fancy t - org-default-notes-file (expand-file-name "inbox.org" org-directory) - org-agenda-files (mapcar (lambda (file) - (expand-file-name file org-directory)) - '("inbox.org" "tasks.org" "calendar.org" "notes.org")) - org-capture-templates - '(("t" "Task" entry - (file org-default-notes-file) - "* TODO %?\n:PROPERTIES:\n:CREATED: %U\n:END:\n") - ("n" "Note" entry - (file org-notes-file) - "* %U %?\n") - ("e" "Event" entry - (file org-calendar-file) - "* %?\nSCHEDULED: %^T\n"))) - :config - (require 'org-tempo) - (require 'org-id) - (require 'org-protocol) - (add-to-list 'org-src-lang-modes '("go" . go-ts)) - (add-to-list 'org-src-lang-modes '("rust" . rust-ts)) - (add-hook 'org-mode-hook 'org-indent-mode)) - -(use-package org-appear - :ensure t - :hook (org-mode . org-appear-mode)) - -(use-package org-bullets - :ensure t - :init - (setq org-bullets-bullet-list '("❯" "❯❯" "❯❯❯" "❯❯❯❯" "❯❯❯❯❯")) - :config - (add-hook 'org-mode-hook 'org-bullets-mode)) - -(use-package org-re-reveal - :ensure t - :init - (setq org-re-reveal-transition 'none - org-re-reveal-theme "dracula")) - -(use-package org-alert - :ensure t - :after org - :config - (setq alert-default-style 'libnotify - org-alert-interval 300 - org-alert-notify-cutoff 5 - org-alert-notify-after-event-cutoff 10 - org-alert-notification-title "Org Agenda") - (add-hook 'org-agenda-mode-hook #'org-alert-enable)) - -(use-package ob-mermaid - :ensure t - :init - (setq ob-mermaid-cli-path (or (executable-find "mmdc") "mmdc"))) - -(use-package ob-go - :ensure t - :after org) - -(use-package ob-rust - :ensure t - :after org) +(org-babel-do-load-languages + 'org-babel-load-languages + '((shell . t) + (python . t) + (C . t))) (provide 'lang/org) - -(with-eval-after-load 'org - (require 'ob-C) - (require 'ob-emacs-lisp) - (require 'ob-go) - (require 'ob-perl) - (require 'ob-python) - (require 'ob-rust) - (require 'ob-shell) - (org-babel-do-load-languages - 'org-babel-load-languages - '((C . t) - (emacs-lisp . t) - (go . t) - (perl . t) - (python . t) - (rust . t) - (shell . t)))) - -;;; org.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/lang/python.el b/dotfiles/desktop/.emacs.d/lisp/lang/python.el deleted file mode 100644 index b357d77..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/lang/python.el +++ /dev/null @@ -1,111 +0,0 @@ -;;; python.el -*- lexical-binding: t; -*- - -(use-package reformatter - :ensure t - :demand t) - -(with-eval-after-load 'project - (add-to-list 'project-vc-extra-root-markers "pyproject.toml") - (add-to-list 'project-vc-extra-root-markers "uv.lock") - (add-to-list 'project-vc-extra-root-markers ".venv")) - -(defun fscotto/python-project-root () - "Return project root for Python projects, nil otherwise." - (when (and (featurep 'project) - (project-current)) - (let ((root (project-root (project-current)))) - (when (or (file-exists-p (expand-file-name "pyproject.toml" root)) - (file-exists-p (expand-file-name "uv.lock" root))) - root)))) - -(defun fscotto/python-project-has-uv-p () - "Return t if current project uses uv (pyproject.toml or uv.lock)." - (when-let ((root (fscotto/python-project-root))) - (or (file-exists-p (expand-file-name "uv.lock" root)) - (file-exists-p (expand-file-name "pyproject.toml" root))))) - -(defun fscotto/python-project-bin (tool) - "Return path to TOOL in .venv/bin if it exists, else nil." - (when-let ((root (fscotto/python-project-root))) - (let ((venv-bin (expand-file-name (concat ".venv/bin/" tool) root))) - (when (and (file-exists-p venv-bin) - (file-executable-p venv-bin)) - venv-bin)))) - -(defun fscotto/python-activate-project-tools () - "Prefer tools from the project virtualenv when available." - (when-let* ((root (fscotto/python-project-root)) - (venv-bin (expand-file-name ".venv/bin" root)) - ((file-directory-p venv-bin))) - (make-local-variable 'exec-path) - (add-to-list 'exec-path venv-bin) - (setq-local process-environment (copy-sequence process-environment)) - (setenv "PATH" (concat venv-bin path-separator (getenv "PATH"))))) - -(defun fscotto/resolve-pylsp () - "Return the pylsp binary path if found, else nil. -Checks: project .venv, uv tool install path, and PATH." - (or (fscotto/python-project-bin "pylsp") - (let ((uv-pylsp (expand-file-name "pylsp" - (concat (getenv "HOME") - "/.local/share/uv/tools/python-lsp-server/bin")))) - (when (and (file-exists-p uv-pylsp) - (file-executable-p uv-pylsp)) - uv-pylsp)) - (executable-find "pylsp"))) - -(defun fscotto/python-lsp-server-available-p () - "Return non-nil when a supported Python LSP server is available." - (fscotto/resolve-pylsp)) - -(defun fscotto/python-ensure-lsp-server () - "Start Python LSP when its Ansible-managed pylsp executable is available." - (cond - ((not (fboundp 'lsp-deferred)) - (message "python: lsp-mode not available")) - ((fscotto/python-lsp-server-available-p) - (setq lsp-pylsp-server-command (fscotto/resolve-pylsp)) - (lsp-deferred)) - (t - (message "python: pylsp not found; run the desktop Ansible profile")))) - -(defun fscotto/python-maybe-start-lsp () - "Start Python LSP when pylsp is available." - (fscotto/python-ensure-lsp-server)) - -(defun fscotto/python-setup-check-command () - "Use Ruff for the built-in Python check command." - (setq-local python-check-command "ruff check")) - -(reformatter-define fscotto/ruff-format - :program (or (fscotto/python-project-bin "ruff") (executable-find "ruff")) - :args '("format" "-") - :lighter " ruff") - -(with-eval-after-load 'python - (add-hook 'python-mode-hook #'fscotto/python-activate-project-tools) - (add-hook 'python-mode-hook #'fscotto/python-setup-check-command) - (add-hook 'python-mode-hook #'fscotto/ruff-format-on-save-mode) - (add-hook 'python-mode-hook #'fscotto/python-maybe-start-lsp)) - -(with-eval-after-load 'python-ts-mode - (add-hook 'python-ts-mode-hook #'fscotto/python-activate-project-tools) - (add-hook 'python-ts-mode-hook #'fscotto/python-setup-check-command) - (add-hook 'python-ts-mode-hook #'fscotto/ruff-format-on-save-mode) - (add-hook 'python-ts-mode-hook #'fscotto/python-maybe-start-lsp)) - -(with-eval-after-load 'lsp-mode - (add-to-list 'lsp-language-id-configuration '(python-mode . "python")) - (add-to-list 'lsp-language-id-configuration '(python-ts-mode . "python")) - (setq lsp-pylsp-server-command (fscotto/resolve-pylsp)) - (setq lsp-pylsp-plugins - '((pycodestyle nil) - (pyflakes nil) - (mccabe nil) - (autopep8 nil) - (yapf nil))) - (add-to-list 'lsp-disabled-clients 'pyls)) - -(provide 'lang/python) - -;;; python.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/lang/shell.el b/dotfiles/desktop/.emacs.d/lisp/lang/shell.el deleted file mode 100644 index 11ccff9..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/lang/shell.el +++ /dev/null @@ -1,11 +0,0 @@ -(with-eval-after-load 'flycheck - (add-hook 'bash-ts-mode-hook 'flycheck-mode)) - -(use-package reformatter - :ensure t - :config - (reformatter-define shfmt-format - :program "shfmt" - :args '("-i" "2" "-ci"))) - -(add-hook 'bash-ts-mode-hook #'shfmt-format-on-save-mode) diff --git a/dotfiles/desktop/.emacs.d/lisp/lang/yaml.el b/dotfiles/desktop/.emacs.d/lisp/lang/yaml.el deleted file mode 100644 index 35f3f5a..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/lang/yaml.el +++ /dev/null @@ -1,8 +0,0 @@ -;;; yaml.el -*- lexical-binding: t; -*- - -(use-package yaml-mode - :ensure t) - -(provide 'yaml) - -;;; yaml.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/misc/custom-functions.el b/dotfiles/desktop/.emacs.d/lisp/misc/custom-functions.el deleted file mode 100644 index 55add1c..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/misc/custom-functions.el +++ /dev/null @@ -1,318 +0,0 @@ -(require 'seq) -(require 'subr-x) -;;makes sure elfeed reads index from disk before launching -(defvar fscotto/elfeed-initial-update-done nil - "Non-nil once Elfeed has triggered its first automatic update this session.") - -(defvar fscotto/elfeed-update-timer nil - "Timer used for periodic Elfeed updates.") - -(defun fscotto/elfeed-auto-update () - "Refresh Elfeed feeds in the background." - (when (require 'elfeed nil 'noerror) - (require 'elfeed-db) - (elfeed-db-load) - (elfeed-update))) - -(defun fscotto/elfeed-start-auto-update () - "Start the periodic Elfeed update timer if needed." - (unless (timerp fscotto/elfeed-update-timer) - (setq fscotto/elfeed-update-timer - (run-at-time "15 min" (* 15 60) #'fscotto/elfeed-auto-update)))) - -(defun fscotto/elfeed-load-db-and-open () - "Open Elfeed, updating once per session and then every 15 minutes. - -Based on https://pragmaticemacs.wordpress.com/2016/08/17/read-your-rss-feeds-in-emacs-with-elfeed/ - Created: 2016-08-17 - Updated: 2025-06-13" - (interactive) - (require 'elfeed) - (require 'elfeed-db) - (elfeed-db-load) - (elfeed) - (fscotto/elfeed-start-auto-update) - (unless fscotto/elfeed-initial-update-done - (setq fscotto/elfeed-initial-update-done t) - (message "Updating Elfeed feeds...") - (elfeed-update))) - -(defun fscotto/project-root () - "Return projectile project root or fallback to default-directory." - (if (featurep 'projectile) - (or (projectile-project-root) default-directory) - default-directory)) - -(defun fscotto/project-vterm () - "Open vterm in project root." - (interactive) - (let ((default-directory (fscotto/project-root))) - (vterm))) - -(defun fscotto/open-multi-vterm-in (directory) - "Open a new multi-vterm buffer in DIRECTORY." - (let ((default-directory (file-name-as-directory directory))) - (multi-vterm))) - -(defun fscotto/home-multi-vterm () - "Open a new multi-vterm buffer in HOME." - (interactive) - (fscotto/open-multi-vterm-in (expand-file-name "~/"))) - -(defun fscotto/project-multi-vterm () - "Open a new multi-vterm buffer in project root." - (interactive) - (fscotto/open-multi-vterm-in (fscotto/project-root))) - -(defconst fscotto/opencode-db-path - (expand-file-name "~/.local/share/opencode/opencode.db") - "Path to the OpenCode SQLite database.") - -(defun fscotto/launch-external-terminal (&optional command directory) - "Launch external terminal in DIRECTORY, optionally running COMMAND." - (let* ((default-directory (file-name-as-directory (or directory (fscotto/project-root)))) - (terminal-program (or (executable-find fscotto/external-terminal-program) - fscotto/external-terminal-program)) - (args (append - (list fscotto/external-terminal-working-directory-option - default-directory) - (when command - (append - (list fscotto/external-terminal-execute-option) - command))))) - (unless (file-executable-p terminal-program) - (user-error "External terminal not found: %s" fscotto/external-terminal-program)) - (apply #'start-process - "fscotto-external-terminal" - nil - terminal-program - args))) - -(defun fscotto/opencode-session-candidates (directory) - "Return OpenCode session candidates for DIRECTORY. - -Each entry is a cons cell of display string and session id." - (let ((sqlite3-program (executable-find "sqlite3")) - (session-directory (directory-file-name (expand-file-name directory)))) - (unless sqlite3-program - (user-error "sqlite3 not found")) - (unless (file-exists-p fscotto/opencode-db-path) - (user-error "OpenCode database not found: %s" fscotto/opencode-db-path)) - (mapcar - (lambda (line) - (pcase-let* ((fields (split-string line "\t")) - (`(,session-id ,title ,updated-at) fields) - (title (if (and title (not (string= title ""))) - title - "Untitled session")) - (updated-seconds (/ (string-to-number updated-at) 1000)) - (updated-label (format-time-string "%Y-%m-%d %H:%M" - (seconds-to-time updated-seconds))) - (short-id (if (> (length session-id) 12) - (substring session-id 0 12) - session-id))) - (cons (format "%s | %s | %s" title updated-label short-id) - session-id))) - (process-lines - sqlite3-program - "-tabs" - "-noheader" - fscotto/opencode-db-path - (format (concat - "select id, title, time_updated " - "from session " - "where directory = '%s' and time_archived is null " - "order by time_updated desc;") - (replace-regexp-in-string "'" "''" session-directory)))))) - -(defun fscotto/project-opencode-latest-session-id () - "Return the latest saved OpenCode session id for the current project." - (cdr (car (fscotto/opencode-session-candidates (fscotto/project-root))))) - -(defun fscotto/project-agent-dwim () - "Choose an agent for the current project and launch it externally." - (interactive) - (let ((agent (completing-read "Agent: " '("Claude" "Codex" "Gemini" "OpenCode") nil t))) - (pcase agent - ("Claude" - (fscotto/launch-external-terminal '("claude" "--continue"))) - ("OpenCode" - (let ((session-id (fscotto/project-opencode-latest-session-id))) - (if session-id - (fscotto/launch-external-terminal (list "opencode" "--session" session-id) - (fscotto/project-root)) - (fscotto/project-opencode)))) - ("Codex" - (fscotto/launch-external-terminal '("codex" "resume" "--last"))) - ("Gemini" - (fscotto/launch-external-terminal '("gemini" "--resume" "latest") - (fscotto/project-root)))))) - -(defun fscotto/project-opencode-session () - "Resume a saved OpenCode session for the current project." - (interactive) - (let* ((project-directory (fscotto/project-root)) - (candidates (fscotto/opencode-session-candidates project-directory))) - (unless candidates - (user-error "No OpenCode sessions found for %s" project-directory)) - (let* ((selection (completing-read "OpenCode session: " candidates nil t)) - (session-id (cdr (assoc selection candidates)))) - (fscotto/launch-external-terminal (list "opencode" "--session" session-id) - project-directory)))) - -(defun fscotto/gemini-session-candidates (directory) - "Return Gemini session candidates for DIRECTORY. - -Each entry is a cons cell of display string and session index. -Tries JSON output first, falls back to text parsing if unavailable." - (let* ((default-directory (file-name-as-directory directory)) - (json-output (shell-command-to-string - "gemini --list-sessions --output-format json 2>/dev/null"))) - (cond - ((string-match "^{" json-output) - (ignore-errors - (require 'json) - (let* ((parsed (json-parse-string json-output)) - (sessions (gethash "sessions" parsed))) - (when (vectorp sessions) - (seq-map-indexed - (lambda (s idx) - (let* ((idx-str (number-to-string (1+ idx))) - (msg (if (hash-table-p s) - (or (gethash "firstUserMessage" s) "Session") - "Session")) - (ts (and (hash-table-p s) - (ignore-errors (gethash "lastUpdated" s)) - (when (stringp it) (string-trim it)))) - (label (if ts (format "%s [%s]" msg ts) msg))) - (cons label idx-str))) - sessions))))) - (t - (let* ((output (shell-command-to-string "gemini --list-sessions")) - (lines (seq-filter (lambda (s) (string-match "\\S-" s)) - (split-string output "\n" t))) - (data-lines (seq-drop lines 1)) - (candidates nil)) - (dolist (line data-lines) - (let ((trimmed (string-trim line))) - (when (string-match - (rx (group (one-or-more digit)) - (one-or-more whitespace) - (group (one-or-more nonl))) - trimmed) - (push (cons (match-string 2 trimmed) - (match-string 1 trimmed)) - candidates)))) - (nreverse candidates)))))) - -(defun fscotto/project-gemini-session () - "Choose and resume a Gemini session for the current project." - (interactive) - (let* ((project-directory (fscotto/project-root)) - (candidates (fscotto/gemini-session-candidates project-directory))) - (unless candidates - (user-error "No Gemini sessions found for %s" project-directory)) - (let* ((selection (completing-read "Gemini session: " candidates nil t)) - (session-idx (cdr (assoc selection candidates)))) - (fscotto/launch-external-terminal - (list "gemini" "--resume" session-idx) - project-directory)))) - -(defun fscotto/project-agent-session () - "Choose an agent and resume a saved session for the current project." - (interactive) - (let ((agent (completing-read "Agent session: " '("Claude" "Codex" "Gemini" "OpenCode") nil t))) - (pcase agent - ("Claude" - (fscotto/launch-external-terminal '("claude" "--resume"))) - ("OpenCode" - (fscotto/project-opencode-session)) - ("Codex" - (fscotto/launch-external-terminal '("codex" "resume"))) - ("Gemini" - (fscotto/project-gemini-session))))) - -(defun fscotto/project-external-terminal () - "Open the external terminal in project root." - (interactive) - (fscotto/launch-external-terminal)) - -(defun fscotto/project-opencode () - "Open the external terminal in project root and run opencode." - (interactive) - (fscotto/launch-external-terminal '("opencode"))) - -(defun fscotto/project-magit-status () - "Open magit-status in project root." - (interactive) - (let ((default-directory (fscotto/project-root))) - (magit-status))) - -(defun fscotto/magit-dispatch () - "Load Magit if necessary and open magit-dispatch." - (interactive) - (require 'magit) - (call-interactively #'magit-dispatch)) - -(defun fscotto/disable-c-formatting () - (setq-local lsp-enable-on-type-formatting nil)) - -;; Golang development support functions -(defun fscotto/go-format-on-save () - "Format Go buffers on save using gofmt." - (add-hook 'before-save-hook #'lsp-format-buffer nil t)) - -(defun fscotto/go-mod-tidy () - "Esegue go mod tidy nella root del progetto." - (interactive) - (let ((default-directory (project-root (project-current t)))) - (compile "go mod tidy"))) - -(defun fscotto/go-mod-download () - "Scarica i moduli Go." - (interactive) - (let ((default-directory (project-root (project-current t)))) - (compile "go mod download"))) - -(defun fscotto/go-mod-after-save () - (when (and (eq major-mode 'go-mod-ts-mode) - (lsp-workspaces)) - (lsp-restart-workspace))) - -(defun fscotto/go-test-package () - "Run `go test` in the current package." - (interactive) - (let ((default-directory (project-root (project-current t)))) - (compile "go test"))) - -(defun fscotto/go-test-module () - "Run `go test ./...` in the current Go module." - (interactive) - (let ((default-directory (project-root (project-current t)))) - (compile "go test ./..."))) - -(defun fscotto/go-test-current-test () - "Run `go test -run` for the test at point." - (interactive) - (let* ((test-name (thing-at-point 'symbol t)) - (default-directory (project-root (project-current t)))) - (unless test-name - (user-error "No test name at point")) - (compile (format "go test -run '^%s$'" test-name)))) - -(defun fscotto/go-test-at-point () - "Return Go test name at point." - (let ((sym (thing-at-point 'symbol t))) - (unless (and sym (string-prefix-p "Test" sym)) - (user-error "No Go test at point")) - sym)) - -(defun fscotto/sudo-edit (&optional arg) - "Reopen current file as root via TRAMP. -If ARG is provided (C-u), prompts for file path." - (interactive "P") - (if arg - (find-file (concat "/sudo:root@localhost:" (read-file-name "File: "))) - (if buffer-file-name - (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name)) - (user-error "This buffer is not associated with a file")))) diff --git a/dotfiles/desktop/.emacs.d/lisp/misc/documents.el b/dotfiles/desktop/.emacs.d/lisp/misc/documents.el deleted file mode 100644 index 5a2e378..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/misc/documents.el +++ /dev/null @@ -1,39 +0,0 @@ -;;; documents.el -*- lexical-binding: t; -*- - -(use-package pdf-tools - :ensure t - :config - (pdf-tools-install)) - -(use-package pdf-view - :config - (setq-default pdf-view-display-size 'fit-width) - (setq pdf-cache-org-imgparams t - pdf-view-use-smooth-scrolling t) - (setq pdf-annot-default-visible-properties t)) - -(with-eval-after-load 'pdf-view - (define-key pdf-view-mode-map (kbd "n") 'pdf-view-next-page) - (define-key pdf-view-mode-map (kbd "p") 'pdf-view-previous-page) - (define-key pdf-view-mode-map (kbd "q") 'pdf-view-close)) - -(use-package nov - :ensure t - :mode ("\\.epub\\'" . nov-mode)) - -(use-package calibre - :ensure t - :commands calibre-library - :config - (setq calibre-calibredb-executable - (or (executable-find "calibredb") - (let ((flatpak-wrapper (expand-file-name "~/.local/bin/calibredb"))) - (when (file-executable-p flatpak-wrapper) - flatpak-wrapper)) - "calibredb") - calibre-libraries - `(("Library" . ,(expand-file-name "~/Documents/Library"))))) - -(provide 'misc/documents) - -;;; documents.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/misc/doom-modeline.el b/dotfiles/desktop/.emacs.d/lisp/misc/doom-modeline.el deleted file mode 100644 index 6c3ef62..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/misc/doom-modeline.el +++ /dev/null @@ -1,9 +0,0 @@ -;;; doom-modeline.el -*- - -(use-package doom-modeline - :ensure t - :config - (setq doom-modeline-height 25 - doom-modeline-bar-width 3 - doom-modeline-project-detection 'projectile) - :init (doom-modeline-mode 1)) diff --git a/dotfiles/desktop/.emacs.d/lisp/misc/gptel.el b/dotfiles/desktop/.emacs.d/lisp/misc/gptel.el deleted file mode 100644 index 32627f4..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/misc/gptel.el +++ /dev/null @@ -1,24 +0,0 @@ -;;; gptel.el -*- lexical-binding: t; -*- - -(use-package gptel - :ensure t - :commands (gptel gptel-send gptel-rewrite) - :config - (setq gptel-model 'qwen3.5:397b) - (setq gptel-backend - (gptel-make-ollama - "Ollama Cloud" - :protocol "https" - :host "ollama.com" - :endpoint "/api/chat" - :models '(qwen3.5:397b) - :stream t - :key (lambda () (gptel-api-key-from-auth-source "ollama.com")) - :header - (lambda (&optional _info) - (when-let ((key (gptel-api-key-from-auth-source "ollama.com"))) - `(("Authorization" . ,(concat "Bearer " key)))))))) - -(provide 'fscotto-gptel) - -;;; gptel.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/misc/i3-config.el b/dotfiles/desktop/.emacs.d/lisp/misc/i3-config.el deleted file mode 100644 index fc3b569..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/misc/i3-config.el +++ /dev/null @@ -1,2 +0,0 @@ -(use-package i3wm-config-mode - :ensure t) diff --git a/dotfiles/desktop/.emacs.d/lisp/misc/rss.el b/dotfiles/desktop/.emacs.d/lisp/misc/rss.el index 11363e8..78cf8fa 100644 --- a/dotfiles/desktop/.emacs.d/lisp/misc/rss.el +++ b/dotfiles/desktop/.emacs.d/lisp/misc/rss.el @@ -1,10 +1,14 @@ -;;; rss.el -*- +;;; rss.el --- Elfeed configuration -*- lexical-binding: t; -*- + +(require 'use-package) (use-package elfeed :ensure t + :commands elfeed + :bind ("C-c r" . elfeed) :config (defun elfeed-play-with-mpv () - "Open the current elfeed entry link with mpv." + "Open the current Elfeed entry link with mpv." (interactive) (let* ((entry (if (eq major-mode 'elfeed-show-mode) elfeed-show-entry @@ -14,44 +18,26 @@ (progn (message "Opening with mpv: %s" url) (start-process "mpv" nil "mpv" url)) - (message "No URL found")))) - (define-key elfeed-search-mode-map (kbd "v") #'elfeed-play-with-mpv) - (define-key elfeed-show-mode-map (kbd "v") #'elfeed-play-with-mpv) - :custom - (elfeed-enclosure-default-dir "~/Downloads/") - (elfeed-search-remain-on-entry t) - (elfeed-search-title-max-width 100) - (elfeed-search-title-min-width 30) - (elfeed-search-trailing-width 25) - (elfeed-show-truncate-long-urls t) - (elfeed-sort-order 'descending) - (elfeed-search-filter "+unread") - :hook - (elfeed-show-mode . visual-line-mode)) + (message "No URL found")))) -(use-package evil-collection - :ensure t - :after (evil elfeed) - :config - ;; Enable Vim-style keybindings only for elfeed (search + entry views), - ;; leaving the rest of the configuration on evil's defaults. - (evil-collection-init (list 'elfeed)) - ;; Restore the custom "v" -> mpv binding, which evil's normal-state visual - ;; selection would otherwise shadow inside elfeed buffers. - (evil-collection-define-key 'normal 'elfeed-search-mode-map - "v" #'elfeed-play-with-mpv) - (evil-collection-define-key 'normal 'elfeed-show-mode-map - "v" #'elfeed-play-with-mpv)) + (setq elfeed-enclosure-default-dir "~/Downloads/" + elfeed-search-remain-on-entry t + elfeed-search-title-max-width 100 + elfeed-search-title-min-width 30 + elfeed-search-trailing-width 25 + elfeed-show-truncate-long-urls t + elfeed-sort-order 'descending + elfeed-search-filter "+unread") + (define-key elfeed-search-mode-map (kbd "v") #'elfeed-play-with-mpv) + (define-key elfeed-show-mode-map (kbd "v") #'elfeed-play-with-mpv) + (add-hook 'elfeed-show-mode-hook #'visual-line-mode)) (use-package elfeed-org :ensure t :after elfeed :custom - ;; Optionally specify a number of files containing elfeed - ;; configuration. If not set then the location below is used. - ;; Note: The customize interface is also supported. - (rmh-elfeed-org-files (list "~/.emacs.d/elfeed.org"))) - -(with-eval-after-load 'elfeed + (rmh-elfeed-org-files (list (expand-file-name "elfeed.org" user-emacs-directory))) + :config (elfeed-org)) +(provide 'misc/rss) diff --git a/dotfiles/desktop/.emacs.d/lisp/misc/terminal.el b/dotfiles/desktop/.emacs.d/lisp/misc/terminal.el deleted file mode 100644 index 153c2d8..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/misc/terminal.el +++ /dev/null @@ -1,45 +0,0 @@ -;;; terminal.el -*- lexical-binding: t; -*- - -(defgroup fscotto nil - "Personal customization group." - :group 'applications) - -(defcustom fscotto/external-terminal-program "alacritty" - "Program used to launch external terminal windows." - :type 'string - :group 'fscotto) - -(defcustom fscotto/external-terminal-working-directory-option "--working-directory" - "Argument used to set the working directory for the external terminal." - :type 'string - :group 'fscotto) - -(defcustom fscotto/external-terminal-execute-option "-e" - "Argument used to execute a command in the external terminal." - :type 'string - :group 'fscotto) - -(defvar-local fscotto/vterm-font-cookie nil - "Face remap cookie used to set a custom font in vterm buffers.") - -(defun fscotto/apply-vterm-font () - "Use Hack Nerd Font only inside vterm buffers." - (when fscotto/vterm-font-cookie - (face-remap-remove-relative fscotto/vterm-font-cookie)) - (setq fscotto/vterm-font-cookie - (face-remap-add-relative - 'default - '(:family "Hack Nerd Font" :height 120 :weight regular)))) - -(use-package vterm - :ensure t - :hook (vterm-mode . fscotto/apply-vterm-font)) - -(use-package multi-vterm - :ensure t - :after vterm - :commands (multi-vterm multi-vterm-next multi-vterm-prev)) - -(provide 'terminal) - -;;; terminal.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/misc/vcs.el b/dotfiles/desktop/.emacs.d/lisp/misc/vcs.el index 25ec734..c89e00f 100644 --- a/dotfiles/desktop/.emacs.d/lisp/misc/vcs.el +++ b/dotfiles/desktop/.emacs.d/lisp/misc/vcs.el @@ -1,41 +1,6 @@ -(use-package magit - :ensure t - :commands (magit-status magit-log) - :init - ;; Entry point principale - (setq magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1) - :config - ;; Performance & UX - (setq magit-refresh-status-buffer nil) - (setq magit-repository-directories - '(("~/Projects" . 2) - ("~/Work" . 2)))) +;;; vcs.el --- Optional Git interface -*- lexical-binding: t; -*- -(use-package vdiff - :ensure t - :commands (vdiff-current-file vdiff-files vdiff-merge-conflict) - :custom - (vdiff-lock-scrolling t) - (vdiff-auto-refine t)) +(autoload 'magit-status "magit" nil t) +(global-set-key (kbd "C-x g") #'magit-status) -(use-package vdiff-magit - :ensure t - :after (magit vdiff) - :commands (vdiff-magit vdiff-magit-dwim) - :custom - (vdiff-magit-use-ediff-for-merges nil) - :config - (define-key magit-mode-map "e" #'vdiff-magit-dwim) - (define-key magit-mode-map "E" #'vdiff-magit) - (transient-suffix-put 'magit-dispatch "e" :description "vdiff (dwim)") - (transient-suffix-put 'magit-dispatch "e" :command #'vdiff-magit-dwim) - (transient-suffix-put 'magit-dispatch "E" :description "vdiff") - (transient-suffix-put 'magit-dispatch "E" :command #'vdiff-magit)) - -(use-package ztree - :ensure t - :commands (ztree-diff ztree-dir)) - -(provide 'vcs) - -;;; vcs.el ends here +(provide 'misc/vcs) diff --git a/dotfiles/desktop/.emacs.d/lisp/misc/which-key.el b/dotfiles/desktop/.emacs.d/lisp/misc/which-key.el index ec25651..0629bc5 100644 --- a/dotfiles/desktop/.emacs.d/lisp/misc/which-key.el +++ b/dotfiles/desktop/.emacs.d/lisp/misc/which-key.el @@ -1,4 +1,6 @@ -;;; which-key.el -*- +;;; which-key.el --- Discoverable native bindings -*- lexical-binding: t; -*- + +(require 'use-package) (use-package which-key :ensure t @@ -8,157 +10,17 @@ (setq which-key-idle-delay 0.45 which-key-idle-secondary-delay 0.05 which-key-max-display-columns 3 - which-key-max-description-length 45)) - -(with-eval-after-load 'which-key - ;; -------------------------------------------------------------------------- - ;; Top-level prefixes - ;; -------------------------------------------------------------------------- + which-key-max-description-length 45) (which-key-add-key-based-replacements - "C-c !" "Analyze" - "C-c o" "Open" - "C-c v" "Version control" - "C-c l" "LSP" - "C-c t" "TODO / Annotations" - "C-c b" "Buffers" - "C-c p" "Project" - "C-c d" "Debug" - "C-c g" "Git" - "C-c e" "Elfeed") + "C-c a" "Org agenda" + "C-c c" "Org capture" + "C-c e" "Document export" + "C-c e p" "Export PDF" + "C-c e h" "Export HTML" + "C-c e m" "Export Markdown" + "C-c e d" "Export DOCX" + "C-c e o" "Export ODT" + "C-c r" "RSS (Elfeed)" + "C-x C-b" "Ibuffer")) - ;; -------------------------------------------------------------------------- - ;; Open (C-c o …) - ;; -------------------------------------------------------------------------- - (which-key-add-key-based-replacements - "C-c o d" "Dirvish" - "C-c o f" "RSS (Elfeed)" - "C-c o l" "LLM chat (gptel)" - "C-c o T" "Terminal (multi-vterm)" - "C-c o z" "Ztree diff") - - ;; -------------------------------------------------------------------------- - ;; Version control - ;; -------------------------------------------------------------------------- - (which-key-add-key-based-replacements - "C-c v g" "Magit status (legacy)") - - (which-key-add-key-based-replacements - ;; Core - "C-c g g" "Status" - "C-c g s" "Status" - ;; "C-c g b" "Branch" - ;; "C-c g c" "Commit" - "C-c g p" "Push / Pull" - "C-c g f" "Fetch" - "C-c g l" "Log" - "C-c g S" "Stash" - - ;; Files - "C-c g d" "Diff" - "C-c g D" "Diff (cached)" - "C-c g B" "Blame" - - ;; Rebase / Reset - "C-c g r" "Rebase" - "C-c g R" "Reset" - - ;; Remote - "C-c g y" "Show refs" - "C-c g o" "Browse remote") - - ;; -------------------------------------------------------------------------- - ;; Buffers - ;; -------------------------------------------------------------------------- - (which-key-add-key-based-replacements - "C-x C-b" "ibuffer") - - ;; -------------------------------------------------------------------------- - ;; TODO / hl-todo - ;; -------------------------------------------------------------------------- - (which-key-add-key-based-replacements - "C-t" "hl-todo" - "C-t p" "Previous TODO" - "C-t n" "Next TODO" - "C-t o" "Occur (list)" - "C-t i" "Insert TODO") - - ;; -------------------------------------------------------------------------- - ;; LSP (C-c l …) - ;; -------------------------------------------------------------------------- - (which-key-add-key-based-replacements - ;; Navigation - "C-c l d" "Go to definition" - "C-c l D" "Go to type definition" - "C-c l i" "Go to implementation" - - ;; Symbols / diagnostics - "C-c l s" "Workspace symbols" - "C-c l e" "Diagnostics" - - ;; Actions - "C-c l a" "Code actions" - "C-c l r" "Rename symbol" - "C-c l f" "Format buffer" - - ;; Control - "C-c l R" "Restart workspace") - - ;; -------------------------------------------------------------------------- - ;; Elfeed modes - ;; -------------------------------------------------------------------------- - (which-key-add-key-based-replacements - "w" "Yank" - "R" "Update feeds" - "q" "Quit") - - ;; -------------------------------------------------------------------------- - ;; Debug / DAP - ;; -------------------------------------------------------------------------- - (which-key-add-key-based-replacements - "C-c d d" "Start debug session" - "C-c d b" "Toggle breakpoint") - ;; "C-c d c" "Continue" - ;; "C-c d n" "Next" - ;; "C-c d i" "Step in" - ;; "C-c d o" "Step out") - - ;; -------------------------------------------------------------------------- - ;; Project (future) - ;; -------------------------------------------------------------------------- - (which-key-add-key-based-replacements - ;; Core - "C-c p p" "Switch project" - "C-c p f" "Find file" - "C-c p d" "Find directory" - "C-c p b" "Switch buffer" - "C-c p k" "Kill project buffers" - "C-c p r" "Recent files" - - ;; Search - "C-c p s" "Search" - "C-c p s g" "Grep (ripgrep)" - "C-c p s r" "Replace in project" - - ;; Actions - "C-c p c" "Compile" - "C-c p t" "Test" - "C-c p v" "Open multi-vterm in project" - "C-c p x" "Open external term" - "C-c p a" "Choose agent" - "C-c p A" "Choose agent session" - "C-c p e" "Edit project config" - "C-c p g" "Project Git status" - "C-c p 4" "Other Window" - "C-c p 5" "Other Frame" - - ;; Cache - "C-c p i" "Invalidate cache") - - ;; -------------------------------------------------------------------------- - ;; Cleanup annoying +prefix - ;; -------------------------------------------------------------------------- - (which-key-add-key-based-replacements - "+prefix" "Prefix" - "+lsp" "LSP" - "+debug" "Debug" - "+project" "Project")) +(provide 'misc/which-key) diff --git a/dotfiles/desktop/.emacs.d/lisp/misc/xclip.el b/dotfiles/desktop/.emacs.d/lisp/misc/xclip.el deleted file mode 100644 index 47d19bf..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/misc/xclip.el +++ /dev/null @@ -1,11 +0,0 @@ -;;; misc-xclip.el -*- lexical-binding: t; -*- - -(use-package xclip - :ensure t - :config - (xclip-mode t) - (setq xclip-method 'xclip)) - -(provide 'xclip) - -;;; xclip.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/quality-of-life.el b/dotfiles/desktop/.emacs.d/lisp/quality-of-life.el new file mode 100644 index 0000000..49c1d3d --- /dev/null +++ b/dotfiles/desktop/.emacs.d/lisp/quality-of-life.el @@ -0,0 +1,11 @@ +;;; quality-of-life.el --- Writing-focused conveniences -*- lexical-binding: t; -*- + +(recentf-mode 1) +(savehist-mode 1) +(fido-mode 1) +(global-visual-line-mode 1) +(setq history-length 200 + recentf-max-saved-items 200 + sentence-end-double-space nil) + +(provide 'quality-of-life) diff --git a/dotfiles/desktop/.emacs.d/lisp/tools/completion.el b/dotfiles/desktop/.emacs.d/lisp/tools/completion.el index 413b0ed..802c452 100644 --- a/dotfiles/desktop/.emacs.d/lisp/tools/completion.el +++ b/dotfiles/desktop/.emacs.d/lisp/tools/completion.el @@ -1,4 +1,6 @@ -;;; completion.el -*- lexical-binding: t; -*- +;;; completion.el --- Completion for writing -*- lexical-binding: t; -*- + +(require 'use-package) (use-package ivy :ensure t @@ -9,32 +11,6 @@ :ensure t :defer t) -(use-package company - :ensure t - :custom - (company-tooltip-align-annotations 't) - (company-minimum-prefix-length 1) - (company-idle-delay 0.1) - :hook (prog-mode . company-mode)) - -(with-eval-after-load 'company - (add-hook 'bash-ts-mode-hook 'company-mode)) - -;; Static analysis for code base -(use-package flycheck - :ensure t - :hook (prog-mode . flycheck-mode) - :config - (setq flycheck-check-syntax-automatically '(save mode-enabled))) - -;; Snippets -(use-package yasnippet - :ensure t - :config - (setq yas/root-directory - (list "~/.emacs.d/snippets") yas-indent-line 'fixed) - (yas-global-mode)) - (use-package orderless :ensure t :custom @@ -43,21 +19,18 @@ (completion-pcm-leading-wildcard t) :config (setq ivy-re-builders-alist '((t . orderless-ivy-re-builder))) - (add-to-list 'ivy-highlight-functions-alist '(orderless-ivy-re-builder . orderless-ivy-highlight))) + (add-to-list 'ivy-highlight-functions-alist + '(orderless-ivy-re-builder . orderless-ivy-re-builder-highlight))) -(defun just-one-face (fn &rest args) - (let ((orderless-match-faces [completions-common-part])) - (apply fn args))) - -(advice-add 'company-capf--candidates :around #'just-one-face) +(use-package yasnippet + :ensure t + :config + (yas-global-mode)) (use-package smartparens - :ensure smartparens ;; install the package - :hook (prog-mode text-mode markdown-mode) ;; add `smartparens-mode` to these hooks + :ensure t + :hook (text-mode . smartparens-mode) :config - ;; load default config (require 'smartparens-config)) -(provide 'completion) - -;;; completion.el ends here +(provide 'tools/completion) diff --git a/dotfiles/desktop/.emacs.d/lisp/tools/dap.el b/dotfiles/desktop/.emacs.d/lisp/tools/dap.el deleted file mode 100644 index 3bcdaf5..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/tools/dap.el +++ /dev/null @@ -1,31 +0,0 @@ -(use-package dap-mode - :ensure t - :after lsp-mode - :hook (lsp-mode . dap-mode) - :init - ;; Enabling only some features - (setq dap-auto-configure-features '(sessions locals expressions repl)) - :config - (dap-mode 1) - (dap-ui-mode 1) - (dap-ui-controls-mode 1) - ;; Auto show breakpoints + REPL - (setq dap-ui-buffer-configurations - '(;; RIGHT SIDE — Debug data (like IntelliJ) - (dap-ui-locals . ((side . right) (slot . 1) (window-width . 0.30))) - (dap-ui-sessions . ((side . right) (slot . 2) (window-width . 0.30))) - (dap-ui-expressions . ((side . right) (slot . 3) (window-width . 0.30))) - ;; BOTTOM — Console / REPL - (dap-ui-repl . ((side . bottom) (slot . 1) (window-height . 0.25))) - (dap-ui-console . ((side . bottom) (slot . 2) (window-height . 0.25))))) - ;; Loading DAP adapters - ;; For Python - (require 'dap-python) - (setq dap-python-debugger 'debugpy - dap-python-executable - (let ((uv-debugpy-python - (expand-file-name - "~/.local/share/uv/tools/debugpy/bin/python"))) - (if (file-executable-p uv-debugpy-python) - uv-debugpy-python - "python3")))) diff --git a/dotfiles/desktop/.emacs.d/lisp/tools/dired.el b/dotfiles/desktop/.emacs.d/lisp/tools/dired.el deleted file mode 100644 index b909b21..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/tools/dired.el +++ /dev/null @@ -1,36 +0,0 @@ -;;; dired.el -*- lexical-binding: t; -*- - -(use-package dired - :ensure nil - :commands (dired dired-jump) - :config - (setq delete-by-moving-to-trash t - dired-dwim-target t - dired-kill-when-opening-new-dired-buffer t - dired-listing-switches - "-l --almost-all --human-readable --group-directories-first --no-group") - (put 'dired-find-alternate-file 'disabled nil)) - -(use-package dirvish - :ensure t - :init - (dirvish-override-dired-mode) - :custom - (dirvish-use-header-line nil) - (dirvish-use-mode-line nil) - (dirvish-hide-details nil) - (dirvish-attributes nil) - (dirvish-large-directory-threshold 20000) - :config - (with-eval-after-load 'projectile - (setq projectile-switch-project-action #'projectile-dired)) - :bind - (:map dirvish-mode-map - ("?" . dirvish-dispatch) - ("TAB" . dirvish-subtree-toggle) - ("s" . dirvish-quicksort) - ("h" . dired-up-directory))) - -(provide 'tools/dired) - -;;; dired.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/tools/lsp.el b/dotfiles/desktop/.emacs.d/lisp/tools/lsp.el deleted file mode 100644 index 30d62d0..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/tools/lsp.el +++ /dev/null @@ -1,47 +0,0 @@ -;;; lsp.el -*- lexical-binding: t; -*- - -(use-package lsp-mode - :ensure t - :commands (lsp lsp-deferred) - :hook - ((c-mode - c-ts-mode - c++-mode - c++-ts-mode - sh-mode - bash-ts-mode) . lsp-deferred) - :config - ;; Performance - (setq lsp-enable-symbol-highlighting t - lsp-enable-snippet t - lsp-log-io nil - lsp-modeline-code-actions-enable nil - lsp-modeline-diagnostics-enable nil - lsp-signature-auto-activate nil - lsp-enable-on-type-formatting nil - lsp-completion-provider :capf - lsp-diagnostics-provider :flycheck - lsp-headerline-breadcrumb-enable nil - lsp-enable-indentation nil - ;; Disable for huge projects - lsp-enable-file-watchers nil - lsp-idle-delay 0.5)) - -(use-package lsp-ui - :ensure t - :config - (setq lsp-ui-doc-enable t - lsp-ui-doc-delay 0.3 - lsp-ui-sideline-enable t - lsp-ui-sideline-show-code-actions t)) - -(use-package consult-lsp - :ensure t - :after (consult lsp-mode) - :commands - (consult-lsp-symbols - consult-lsp-diagnostics)) - -(provide 'lsp) - -;;; lsp.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/tools/project.el b/dotfiles/desktop/.emacs.d/lisp/tools/project.el deleted file mode 100644 index dc727a7..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/tools/project.el +++ /dev/null @@ -1,25 +0,0 @@ -;;; project.el - lexical-binding *-* - -(use-package projectile - :ensure t - :defer 1 - :init - ;; Root detection - (setq projectile-project-search-path '("~/Projects" "~/Work" "~/Progetti" "~/.local/src")) - (setq projectile-completion-system 'ivy) - :config - ;; Performance - (setq projectile-enable-caching t) - (setq projectile-indexing-method 'hybrid) - (setq projectile-sort-order 'recently-active) - ;; Projectile as single source of truth - (setq projectile-switch-project-action #'projectile-dired) - ;; Use ripgrep if available - (when (executable-find "rg") - (setq projectile-generic-command "rg --files --hidden --glob '!.git'")) - ;; Enable globally - (projectile-mode 1)) - -(provide 'project) - -;;; project.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/tools/tramp.el b/dotfiles/desktop/.emacs.d/lisp/tools/tramp.el deleted file mode 100644 index e001dfd..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/tools/tramp.el +++ /dev/null @@ -1,13 +0,0 @@ -;;; tramp.el -*- lexical-binding: t; -*- - -(use-package tramp - :config - (setq tramp-use-ssh-controlmaster-options t) - (setq tramp-chunksize 500) - (setq tramp-verbose 0) - (setq tramp-gvfs-wget "wget --quiet") - (setq tramp-cache-read-persistent-cache t)) - -(provide 'tools/tramp) - -;;; tramp.el ends here diff --git a/dotfiles/desktop/.emacs.d/lisp/tools/treesitter.el b/dotfiles/desktop/.emacs.d/lisp/tools/treesitter.el deleted file mode 100644 index a9704f5..0000000 --- a/dotfiles/desktop/.emacs.d/lisp/tools/treesitter.el +++ /dev/null @@ -1,20 +0,0 @@ -;;; treesitter.el -*- lexical-binding: t; -*- - -(use-package treesit - :ensure nil - :config - (setq treesit-font-lock-level 4)) - -(use-package treesit-auto - :ensure t - :after treesit - :custom - (treesit-auto-install 'prompt) - (treesit-auto-langs '(bash c cpp dockerfile go gomod json markdown python rust yaml)) - :config - (treesit-auto-add-to-auto-mode-alist 'all) - (global-treesit-auto-mode)) - -(provide 'treesitter) - -;;; treesitter.el ends here diff --git a/dotfiles/desktop/.emacs.d/snippets/go-mode/main b/dotfiles/desktop/.emacs.d/snippets/go-mode/main deleted file mode 100644 index 9a3ebe5..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/go-mode/main +++ /dev/null @@ -1,3 +0,0 @@ -func main() { - $0 -} diff --git a/dotfiles/desktop/.emacs.d/snippets/go-mode/pr b/dotfiles/desktop/.emacs.d/snippets/go-mode/pr deleted file mode 100644 index ea23f54..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/go-mode/pr +++ /dev/null @@ -1 +0,0 @@ -fmt.Printf("%v\n", $0) diff --git a/dotfiles/desktop/.emacs.d/snippets/go-mode/tt b/dotfiles/desktop/.emacs.d/snippets/go-mode/tt deleted file mode 100644 index a0ec037..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/go-mode/tt +++ /dev/null @@ -1,23 +0,0 @@ -func Test$0 { - tests := []struct { - name string - req string - expected string - }{ - { - name: "happy path", - req: "answer to life, the universe and everything" - expected: "42" - } - } - - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - actual := foo(t, tt.req) - assertEquals(t, tt.want, expected) - }) - - } -} diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/author b/dotfiles/desktop/.emacs.d/snippets/java-mode/author deleted file mode 100644 index 5070312..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/author +++ /dev/null @@ -1,3 +0,0 @@ -#name : author -# -- -@author Torstein Krause Johansen$0 \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/debug b/dotfiles/desktop/.emacs.d/snippets/java-mode/debug deleted file mode 100644 index 7d0152e..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/debug +++ /dev/null @@ -1,6 +0,0 @@ -#name : debug -# -- -if (mLogger.isDebugEnabled()) { - mLogger.debug(String.format("${1:result}=%s", ${2:result})); -} -$0 \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/dwmain b/dotfiles/desktop/.emacs.d/snippets/java-mode/dwmain deleted file mode 100644 index a229496..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/dwmain +++ /dev/null @@ -1,31 +0,0 @@ -#name : dwmain -# -- -package ${1:net.skybert.dw}; - -import io.dropwizard.Application; -import io.dropwizard.assets.AssetsBundle; -import io.dropwizard.configuration.SubstitutingSourceProvider; -import io.dropwizard.jetty.ConnectorFactory; -import io.dropwizard.jetty.HttpConnectorFactory; -import io.dropwizard.lifecycle.Managed; -import io.dropwizard.server.DefaultServerFactory; -import io.dropwizard.setup.Bootstrap; -import io.dropwizard.setup.Environment; - -/** - * Main - */ -public class Main extends Application<${2:SkybertConf}> { - - public static void main(final String[] args) throws Exception { - new Main().run(args); - } - - @Override - public void run( - final $2 pConfiguration, - final Environment pEnvironment) - throws Exception { - $0 - } -} diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/fn b/dotfiles/desktop/.emacs.d/snippets/java-mode/fn deleted file mode 100644 index 8fe5cc4..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/fn +++ /dev/null @@ -1,5 +0,0 @@ -#name : new method/function -# -- -${1:public} ${2:void} ${3:update}(final ${4:String} ${5:pName}) { - $0 -} diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/for b/dotfiles/desktop/.emacs.d/snippets/java-mode/for deleted file mode 100644 index c093ba7..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/for +++ /dev/null @@ -1,5 +0,0 @@ -#name : for (...; ...; ...) { ... } -# -- -for (${1:Object} ${downcase-word 1} ; ${2:list}) { - $0 -} diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/fori b/dotfiles/desktop/.emacs.d/snippets/java-mode/fori deleted file mode 100644 index a9e4ccc..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/fori +++ /dev/null @@ -1,5 +0,0 @@ -#name : for loop with index -# -- -for (int ${1:i} = 0; $1 < ${2:args.length}; $1${3:++}) { - $0 -} diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/gse b/dotfiles/desktop/.emacs.d/snippets/java-mode/gse deleted file mode 100644 index cd4763f..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/gse +++ /dev/null @@ -1,13 +0,0 @@ -#name : get/set/member variable -# -- -private ${1:String} ${2:name}; - -public void set${2:$(capitalize text)}(final $1 p${2:$(capitalize text)}) { - $2 = p${2:$(capitalize text)}; -} - -public $1 get${2:$(capitalize text)}() { - return $2; -} -$0 - diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/if b/dotfiles/desktop/.emacs.d/snippets/java-mode/if deleted file mode 100644 index 59f1d0b..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/if +++ /dev/null @@ -1,6 +0,0 @@ -#name : if -# -- -if (${1:result} ${2:!=} ${3:null}) { - $0 -} - diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/iisblank b/dotfiles/desktop/.emacs.d/snippets/java-mode/iisblank deleted file mode 100644 index 87ee357..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/iisblank +++ /dev/null @@ -1,4 +0,0 @@ -#name : static import of isBlank -# -- -import static org.apache.commons.lang.StringUtils.isBlank; -$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/junitwrapperfns b/dotfiles/desktop/.emacs.d/snippets/java-mode/junitwrapperfns deleted file mode 100644 index 6492450..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/junitwrapperfns +++ /dev/null @@ -1,21 +0,0 @@ -#name : junitwrapperfns -# -- - private void assertTrue(final String pMessage, final boolean pConditition) { - Assertions.assertTrue(pConditition, pMessage); - } - - private void assertFalse(final String pMessage, final boolean pConditition) { - Assertions.assertFalse(pConditition, pMessage); - } - - private void assertNotNull(final String pMessage, final Object pActual) { - Assertions.assertNotNull(pActual, pMessage); - } - - private void assertNull(final String pMessage, final Object pActual) { - Assertions.assertNull(pActual, pMessage); - } - - private void assertEquals(final String pMessage, final Object pExpected, final Object pActual) { - Assertions.assertEquals(pExpected, pActual, pMessage); - } diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/main b/dotfiles/desktop/.emacs.d/snippets/java-mode/main deleted file mode 100644 index c9ab3da..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/main +++ /dev/null @@ -1,5 +0,0 @@ -#name : main -# -- -public static void main(String[] args) { - $0 -} diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/np b/dotfiles/desktop/.emacs.d/snippets/java-mode/np deleted file mode 100644 index c7ea65f..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/np +++ /dev/null @@ -1,3 +0,0 @@ -#name : np -# -- - // NOPMD \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/ol b/dotfiles/desktop/.emacs.d/snippets/java-mode/ol deleted file mode 100644 index 18e8e9a..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/ol +++ /dev/null @@ -1,3 +0,0 @@ -#name : get ObjectLoader -# -- -$0ObjectLoader objectLoader = IOAPI.getAPI().getObjectLoader(); diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/req b/dotfiles/desktop/.emacs.d/snippets/java-mode/req deleted file mode 100644 index fba51a7..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/req +++ /dev/null @@ -1,6 +0,0 @@ -#name : req -# -- -HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create($0)) - .timeout(Duration.ofMillis(getResponseTimeout())) - .build(); diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/res b/dotfiles/desktop/.emacs.d/snippets/java-mode/res deleted file mode 100644 index d41f495..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/res +++ /dev/null @@ -1,3 +0,0 @@ -#name : res -# -- -HttpResponse response = mHttpClient.send(request, ofString());$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/sf b/dotfiles/desktop/.emacs.d/snippets/java-mode/sf deleted file mode 100644 index 08a8196..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/sf +++ /dev/null @@ -1,3 +0,0 @@ -#name : sf -# -- -String.format("%s", $0) \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/sop b/dotfiles/desktop/.emacs.d/snippets/java-mode/sop deleted file mode 100644 index 309282b..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/sop +++ /dev/null @@ -1,3 +0,0 @@ -#name : System.out.println -# -- -System.out.println($0); \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/test b/dotfiles/desktop/.emacs.d/snippets/java-mode/test deleted file mode 100644 index 1f87026..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/test +++ /dev/null @@ -1,4 +0,0 @@ -@Test -void ${1:can}() throws Exception { - $0 -} \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/tryf b/dotfiles/desktop/.emacs.d/snippets/java-mode/tryf deleted file mode 100644 index da1cf19..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/tryf +++ /dev/null @@ -1,12 +0,0 @@ -#name : try, catch & finally -# -- -try { - $0 -} -catch (${1:Exception} ${2:e}) { - mLogger.error($2); -} -finally { - -} - diff --git a/dotfiles/desktop/.emacs.d/snippets/java-mode/tyc b/dotfiles/desktop/.emacs.d/snippets/java-mode/tyc deleted file mode 100644 index 2faecee..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/java-mode/tyc +++ /dev/null @@ -1,8 +0,0 @@ -#name : try & catch -# -- -try { - $0 -} -catch (${1:Exception} ${2:e}) { - mLogger.error($2); -} diff --git a/dotfiles/desktop/.emacs.d/snippets/js2-mode/a b/dotfiles/desktop/.emacs.d/snippets/js2-mode/a deleted file mode 100644 index 7955bfe..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/js2-mode/a +++ /dev/null @@ -1,4 +0,0 @@ -#name : new array -# -- -var ${1:myArray} = new Array(); -$0 \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/js2-mode/fn b/dotfiles/desktop/.emacs.d/snippets/js2-mode/fn deleted file mode 100644 index 7ca699e..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/js2-mode/fn +++ /dev/null @@ -1,6 +0,0 @@ -#name : function -# -- -function ${1:test}(${2:pValue}) { - $0 -} - diff --git a/dotfiles/desktop/.emacs.d/snippets/js2-mode/for b/dotfiles/desktop/.emacs.d/snippets/js2-mode/for deleted file mode 100644 index 407bc93..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/js2-mode/for +++ /dev/null @@ -1,5 +0,0 @@ -#name : for (...; ...; ...) { ... } -# -- -for (var ${1:i} = 0; $1 < ${2:args.length}; $1${3:++}) { - $0 -} diff --git a/dotfiles/desktop/.emacs.d/snippets/js2-mode/if b/dotfiles/desktop/.emacs.d/snippets/js2-mode/if deleted file mode 100644 index 71803a5..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/js2-mode/if +++ /dev/null @@ -1,6 +0,0 @@ -#name : if -# -- -if (${1:s} == ${2:undefined}) { - $0 -} - diff --git a/dotfiles/desktop/.emacs.d/snippets/js2-mode/log b/dotfiles/desktop/.emacs.d/snippets/js2-mode/log deleted file mode 100644 index 0cb9cfb..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/js2-mode/log +++ /dev/null @@ -1,3 +0,0 @@ -#name : log -# -- -console.log("$0"); diff --git a/dotfiles/desktop/.emacs.d/snippets/markdown-mode/a b/dotfiles/desktop/.emacs.d/snippets/markdown-mode/a deleted file mode 100644 index 381f971..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/markdown-mode/a +++ /dev/null @@ -1,3 +0,0 @@ -#name : a -# -- -[${1}](${2})${0} diff --git a/dotfiles/desktop/.emacs.d/snippets/markdown-mode/img b/dotfiles/desktop/.emacs.d/snippets/markdown-mode/img deleted file mode 100644 index 2ec7f6d..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/markdown-mode/img +++ /dev/null @@ -1,9 +0,0 @@ -#name : img snippet -# -- - -${2:alt img text} -$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/markdown-mode/me b/dotfiles/desktop/.emacs.d/snippets/markdown-mode/me deleted file mode 100644 index 584a308..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/markdown-mode/me +++ /dev/null @@ -1,3 +0,0 @@ -# name : me -# -- -[@skybert](https://skybert.net) ${1:says:}$0 \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/markdown-mode/pa b/dotfiles/desktop/.emacs.d/snippets/markdown-mode/pa deleted file mode 100644 index 466db7c..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/markdown-mode/pa +++ /dev/null @@ -1,17 +0,0 @@ -#name : pelican article -# -- -title: ${1:`(s-replace "-" " " (file-name-base (buffer-file-name)))`} -date: ${2:`(format-time-string "%Y-%m-%d" (current-time))`} -category: ${3:`(file-name-nondirectory - (substring - (file-name-directory (buffer-file-name)) - 0 - (- (length (file-name-directory (buffer-file-name))) 1) - ))`} -tags: ${4:`(file-name-nondirectory - (substring - (file-name-directory (buffer-file-name)) - 0 - (- (length (file-name-directory (buffer-file-name))) 1) - ))`} -$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/markdown-mode/src b/dotfiles/desktop/.emacs.d/snippets/markdown-mode/src deleted file mode 100644 index 4743ab2..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/markdown-mode/src +++ /dev/null @@ -1,6 +0,0 @@ -#name : src code snippet -# -- - -\`\`\`${1:text} -$0 -\`\`\` diff --git a/dotfiles/desktop/.emacs.d/snippets/markdown-mode/st b/dotfiles/desktop/.emacs.d/snippets/markdown-mode/st deleted file mode 100644 index 7144005..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/markdown-mode/st +++ /dev/null @@ -1,4 +0,0 @@ -#name : strong element -# -- - -${1:text}$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/cdata b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/cdata deleted file mode 100644 index 457f6a1..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/cdata +++ /dev/null @@ -1,3 +0,0 @@ -#name: cdata -# -- - \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/cha b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/cha deleted file mode 100644 index 3190557..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/cha +++ /dev/null @@ -1,8 +0,0 @@ -#name : cha -# -- - - ${1:My Title} - - $0 - - diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/dep b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/dep deleted file mode 100644 index 15c448c..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/dep +++ /dev/null @@ -1,7 +0,0 @@ -#name : dep -# -- - - $1 - $2 - $0 - diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/diary b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/diary deleted file mode 100644 index 83d13b7..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/diary +++ /dev/null @@ -1,10 +0,0 @@ -#name : diary -# -- - -

$1

-
-

- $0 -

-
- diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/exclusion b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/exclusion deleted file mode 100644 index 2d6c700..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/exclusion +++ /dev/null @@ -1,6 +0,0 @@ -#name : exclusion -# -- - - $1 - $2 -$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/exclusions b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/exclusions deleted file mode 100644 index cb51a7f..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/exclusions +++ /dev/null @@ -1,8 +0,0 @@ -#name : exclusions -# -- - - - $1 - $2 - $0 - diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/incvar b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/incvar deleted file mode 100644 index c287b58..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/incvar +++ /dev/null @@ -1,3 +0,0 @@ -#name : incvar -# -- -$0 \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/list b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/list deleted file mode 100644 index 20e0290..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/list +++ /dev/null @@ -1,10 +0,0 @@ -#name : list -# -- - - - - $0 - - - - diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/listi b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/listi deleted file mode 100644 index 98a8747..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/listi +++ /dev/null @@ -1,4 +0,0 @@ -#name : listi -# -- -$0 - diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/lit b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/lit deleted file mode 100644 index 3633b6d..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/lit +++ /dev/null @@ -1,3 +0,0 @@ -#name : lit -# -- -$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/oli b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/oli deleted file mode 100644 index 7e6ae50..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/oli +++ /dev/null @@ -1,5 +0,0 @@ -#name : ol with a li -# -- -
    -
  1. $0
  2. -
diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/para b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/para deleted file mode 100644 index e6ad40c..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/para +++ /dev/null @@ -1,5 +0,0 @@ -#name : para -# -- - - $0 - diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/prog b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/prog deleted file mode 100644 index 0a7fc97..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/prog +++ /dev/null @@ -1,4 +0,0 @@ -#name : prog -# -- - diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/scr b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/scr deleted file mode 100644 index e94e94e..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/scr +++ /dev/null @@ -1,5 +0,0 @@ -#name : insert a JS tag without src -# -- - diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/scri b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/scri deleted file mode 100644 index 2740be7..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/scri +++ /dev/null @@ -1,4 +0,0 @@ -#name : insert a JS tag with src -# -- - -$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/sec b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/sec deleted file mode 100644 index e11eafd..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/sec +++ /dev/null @@ -1,8 +0,0 @@ -#name : sec -# -- -
- ${1:My Title} - - $0 - -
diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/uli b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/uli deleted file mode 100644 index 7633341..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/uli +++ /dev/null @@ -1,5 +0,0 @@ -#name : ul with a li -# -- -
    -
  • $0
  • -
diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/varece b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/varece deleted file mode 100644 index 9de4812..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/varece +++ /dev/null @@ -1,3 +0,0 @@ -#name : varece -# -- - diff --git a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/xlink b/dotfiles/desktop/.emacs.d/snippets/nxml-mode/xlink deleted file mode 100644 index 17d9f3e..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/nxml-mode/xlink +++ /dev/null @@ -1,4 +0,0 @@ -#name : xlink -# -- -$2 -$0 \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/org-mode/code b/dotfiles/desktop/.emacs.d/snippets/org-mode/code deleted file mode 100644 index 2bc8342..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/org-mode/code +++ /dev/null @@ -1,5 +0,0 @@ -#name : insert a Confluence code block -# -- -{code} -$0 -{code} diff --git a/dotfiles/desktop/.emacs.d/snippets/org-mode/daily b/dotfiles/desktop/.emacs.d/snippets/org-mode/daily deleted file mode 100644 index 8c0b19e..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/org-mode/daily +++ /dev/null @@ -1,21 +0,0 @@ -#name: daily -# -- -* ❯ Admin, training & maintenance -** DEVTR-1 Meetings, email, Slack++ -** DEVTR-5 System Maintenance -** DEVTR-6 Software Delivery -** DEVTR-8 Training - -* ❯ Coding - -* ❯ Review - -* ❯ Specification - -* ❯ Support -** DEVTR-3 PSERV Assistance -** DEVTR-5 Helping out colleagues in R&D - -* ❯ Report - #+BEGIN: clocktable :maxlevel 2 - #+END: diff --git a/dotfiles/desktop/.emacs.d/snippets/org-mode/gr b/dotfiles/desktop/.emacs.d/snippets/org-mode/gr deleted file mode 100644 index d824db0..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/org-mode/gr +++ /dev/null @@ -1 +0,0 @@ -** TODO DEVTR-44 Review - $0 \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/org-mode/q b/dotfiles/desktop/.emacs.d/snippets/org-mode/q deleted file mode 100644 index cb2985e..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/org-mode/q +++ /dev/null @@ -1,5 +0,0 @@ -#name : insert a quote -# -- -#+begin_quote -$0 -#+end_quote diff --git a/dotfiles/desktop/.emacs.d/snippets/org-mode/src b/dotfiles/desktop/.emacs.d/snippets/org-mode/src deleted file mode 100644 index 7657706..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/org-mode/src +++ /dev/null @@ -1,5 +0,0 @@ -#name : insert a source block -# -- -#+begin_src ${1:emacs-lisp} -$0 -#+end_src diff --git a/dotfiles/desktop/.emacs.d/snippets/org-mode/title b/dotfiles/desktop/.emacs.d/snippets/org-mode/title deleted file mode 100644 index b485156..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/org-mode/title +++ /dev/null @@ -1 +0,0 @@ -#+title: $0 diff --git a/dotfiles/desktop/.emacs.d/snippets/python-mode/app b/dotfiles/desktop/.emacs.d/snippets/python-mode/app deleted file mode 100644 index bb26c08..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/python-mode/app +++ /dev/null @@ -1,4 +0,0 @@ -#name : app -# -- -app = $1(__name__) -$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/python-mode/def b/dotfiles/desktop/.emacs.d/snippets/python-mode/def deleted file mode 100644 index a9dea7d..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/python-mode/def +++ /dev/null @@ -1,4 +0,0 @@ -#name : def -# -- -def $1($2): - $0 diff --git a/dotfiles/desktop/.emacs.d/snippets/python-mode/im b/dotfiles/desktop/.emacs.d/snippets/python-mode/im deleted file mode 100644 index 54bb82f..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/python-mode/im +++ /dev/null @@ -1,4 +0,0 @@ -#name : im -# -- -from $1 import $2 -$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/python-mode/imflask b/dotfiles/desktop/.emacs.d/snippets/python-mode/imflask deleted file mode 100644 index a78d6f0..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/python-mode/imflask +++ /dev/null @@ -1,6 +0,0 @@ -#name : imflask -# -- -from flask import Flask -from flask import render_template -from requests import get -$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/python-mode/main b/dotfiles/desktop/.emacs.d/snippets/python-mode/main deleted file mode 100644 index 998ffa4..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/python-mode/main +++ /dev/null @@ -1,4 +0,0 @@ -#name : main -# -- -if __name__ == "__main__": - $0 diff --git a/dotfiles/desktop/.emacs.d/snippets/python-mode/p b/dotfiles/desktop/.emacs.d/snippets/python-mode/p deleted file mode 100644 index 1e85585..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/python-mode/p +++ /dev/null @@ -1,6 +0,0 @@ -#name : Create @property function -# -- -@property -def $1(self): - return self._$1 -$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/python-mode/pr b/dotfiles/desktop/.emacs.d/snippets/python-mode/pr deleted file mode 100644 index 7b56f04..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/python-mode/pr +++ /dev/null @@ -1,4 +0,0 @@ -#name : pr -# -- -print($1) -$0 \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/python-mode/prx b/dotfiles/desktop/.emacs.d/snippets/python-mode/prx deleted file mode 100644 index cea39cc..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/python-mode/prx +++ /dev/null @@ -1,4 +0,0 @@ -#name : prx -# -- -print(etree.tostring($1, encoding='unicode')) -$0 \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/python-mode/render b/dotfiles/desktop/.emacs.d/snippets/python-mode/render deleted file mode 100644 index 2f96572..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/python-mode/render +++ /dev/null @@ -1,3 +0,0 @@ -#name : render -# -- -return render_template("$1", data=$2) diff --git a/dotfiles/desktop/.emacs.d/snippets/python-mode/route b/dotfiles/desktop/.emacs.d/snippets/python-mode/route deleted file mode 100644 index 6cae423..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/python-mode/route +++ /dev/null @@ -1,5 +0,0 @@ -#name : route -# -- -@app.route("/<$1>$2") -def $3($1): - $0 diff --git a/dotfiles/desktop/.emacs.d/snippets/python-mode/route2 b/dotfiles/desktop/.emacs.d/snippets/python-mode/route2 deleted file mode 100644 index 23f7002..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/python-mode/route2 +++ /dev/null @@ -1,5 +0,0 @@ -#name : route -# -- -@app.route("/<$1>/<$2>$3") -def $4($1, $2): - $0 diff --git a/dotfiles/desktop/.emacs.d/snippets/rego-mode/package b/dotfiles/desktop/.emacs.d/snippets/rego-mode/package deleted file mode 100644 index 62feaf5..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/rego-mode/package +++ /dev/null @@ -1 +0,0 @@ -package ${1:`(replace-regexp-in-string "/" "." (file-name-directory (buffer-file-name)))`}$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/rego-mode/pr b/dotfiles/desktop/.emacs.d/snippets/rego-mode/pr deleted file mode 100644 index e90a4ea..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/rego-mode/pr +++ /dev/null @@ -1 +0,0 @@ -print("$1", $2)$0 \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/sh-mode/args b/dotfiles/desktop/.emacs.d/snippets/sh-mode/args deleted file mode 100644 index 3a5418b..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/sh-mode/args +++ /dev/null @@ -1,44 +0,0 @@ -#key: args -# -- - -read_user_input() { - local opts= - opts=$(getopt \ - -o hr:nv \ - --long help \ - --long version: \ - --long dry-run \ - --long verbose \ - -n 'parse-options' \ - -- "$@") - if [ $? != 0 ] ; then - echo "Failed parsing options." >&2 - exit 1 - fi - eval set -- "$opts" - - while true; do - case "\$1" in - -h | --help) - print_help; - exit 0 - break;; - -r | --version) - export version=\$2 - shift 2;; - -n | --dry-run) - export dry_run=1 - shift;; - -v | --verbose) - export verbose=1 - shift;; - -- ) - shift; - break ;; - * ) - break ;; - esac - done - - export rest_of_args=$* -} \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/sh-mode/aw b/dotfiles/desktop/.emacs.d/snippets/sh-mode/aw deleted file mode 100644 index a937976..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/sh-mode/aw +++ /dev/null @@ -1,3 +0,0 @@ -#name: aw -# -- -awk '{print \$${1:1}\}'$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/sh-mode/cmd b/dotfiles/desktop/.emacs.d/snippets/sh-mode/cmd deleted file mode 100644 index d11b9ce..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/sh-mode/cmd +++ /dev/null @@ -1,18 +0,0 @@ -#name : cmd -# -- -#! /usr/bin/env bash - -## author: torstein, torstein@skybert.net - -set -o errexit -set -o nounset -set -o pipefail - -main() { - : -} - -main "$@" - - - diff --git a/dotfiles/desktop/.emacs.d/snippets/sh-mode/cwd b/dotfiles/desktop/.emacs.d/snippets/sh-mode/cwd deleted file mode 100644 index 4716dd8..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/sh-mode/cwd +++ /dev/null @@ -1,5 +0,0 @@ -#name: cwd -# -- -local _cwd= -_cwd="$(cd "\$(dirname "\${BASH_SOURCE[0]}")" &> /dev/null && pwd)" -$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/sh-mode/eof b/dotfiles/desktop/.emacs.d/snippets/sh-mode/eof deleted file mode 100644 index 3f459ec..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/sh-mode/eof +++ /dev/null @@ -1,5 +0,0 @@ -#name : eof -# -- -cat < /dev/null && pwd)" - -## @override shunit2 -setUp() { - source "\${cwd}/../lib/$(basename "\$0" -test.sh)-lib.sh" -} - -## @override shunit2 -tearDown() { - : -} - -main() { - test -d "\${cwd}"/shunit2 || { - git -C "\${cwd}" clone --quiet --depth 1 https://github.com/kward/shunit2.git - } - - source "\${cwd}"/shunit2/shunit2 -} - -main "\$@" diff --git a/dotfiles/desktop/.emacs.d/snippets/sh-mode/test b/dotfiles/desktop/.emacs.d/snippets/sh-mode/test deleted file mode 100644 index 2dcc552..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/sh-mode/test +++ /dev/null @@ -1,21 +0,0 @@ -#name : test -# -- -#! /usr/bin/env bash - -## author: torstein, torstein@skybert.net - -## @override shunit2 -setUp() { - source "$(dirname "\$0")/../lib/$(basename "\$0" -test.sh).sh" -} - -## @override shunit2 -tearDown() { - : -} - -main() { - . "$(dirname "\$0")"/shunit2/shunit2 -} - -main "$@" diff --git a/dotfiles/desktop/.emacs.d/snippets/sh-mode/tmpdir b/dotfiles/desktop/.emacs.d/snippets/sh-mode/tmpdir deleted file mode 100644 index 1bd3508..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/sh-mode/tmpdir +++ /dev/null @@ -1,8 +0,0 @@ -#name : tmpdir -# -- -local ${1:tmp_dir}= -$1=\$(mktemp -d) - -$0 - -rm -rf "\${$1\}" diff --git a/dotfiles/desktop/.emacs.d/snippets/sh-mode/v b/dotfiles/desktop/.emacs.d/snippets/sh-mode/v deleted file mode 100644 index daf8b33..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/sh-mode/v +++ /dev/null @@ -1,3 +0,0 @@ -#name : v -# -- -"\${$1}"$0 \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/sh-mode/va b/dotfiles/desktop/.emacs.d/snippets/sh-mode/va deleted file mode 100644 index 6fe9d6e..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/sh-mode/va +++ /dev/null @@ -1,4 +0,0 @@ -#name : va -# -- -local ${1:dir}= -$1=$($0) diff --git a/dotfiles/desktop/.emacs.d/snippets/sh-mode/vd b/dotfiles/desktop/.emacs.d/snippets/sh-mode/vd deleted file mode 100644 index 4e04405..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/sh-mode/vd +++ /dev/null @@ -1,3 +0,0 @@ -#name : vad -# -- -local ${1:dir}=$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/sh-mode/wh b/dotfiles/desktop/.emacs.d/snippets/sh-mode/wh deleted file mode 100644 index 8316bed..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/sh-mode/wh +++ /dev/null @@ -1,6 +0,0 @@ -#name : wh -# -- -while read -r ${1:f}; do - echo "\${$1}" - $0 -done diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/a b/dotfiles/desktop/.emacs.d/snippets/web-mode/a deleted file mode 100644 index 8a435da..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/a +++ /dev/null @@ -1,5 +0,0 @@ -#name : a -# -- - - $0 - diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/div b/dotfiles/desktop/.emacs.d/snippets/web-mode/div deleted file mode 100644 index b130d10..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/div +++ /dev/null @@ -1,5 +0,0 @@ -#name : div -# -- -
- $0 -
diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/divv b/dotfiles/desktop/.emacs.d/snippets/web-mode/divv deleted file mode 100644 index 879bac1..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/divv +++ /dev/null @@ -1,5 +0,0 @@ -#name : divv -# -- -
- $0 -
diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/for b/dotfiles/desktop/.emacs.d/snippets/web-mode/for deleted file mode 100644 index fbd7992..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/for +++ /dev/null @@ -1,5 +0,0 @@ -#name : for -# -- -{% for $1 in $2 %} - $0 -{% endfor %} diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/h1 b/dotfiles/desktop/.emacs.d/snippets/web-mode/h1 deleted file mode 100644 index 0dfa679..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/h1 +++ /dev/null @@ -1,4 +0,0 @@ -#name : h1 -# -- -

$1

-$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/h2 b/dotfiles/desktop/.emacs.d/snippets/web-mode/h2 deleted file mode 100644 index 67fa966..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/h2 +++ /dev/null @@ -1,4 +0,0 @@ -#name : h2 -# -- -

$1

-$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/h3 b/dotfiles/desktop/.emacs.d/snippets/web-mode/h3 deleted file mode 100644 index 33451c6..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/h3 +++ /dev/null @@ -1,4 +0,0 @@ -#name : h3 -# -- -

$1

-$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/h4 b/dotfiles/desktop/.emacs.d/snippets/web-mode/h4 deleted file mode 100644 index 6ca3684..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/h4 +++ /dev/null @@ -1,4 +0,0 @@ -#name : h4 -# -- -

$1

-$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/if b/dotfiles/desktop/.emacs.d/snippets/web-mode/if deleted file mode 100644 index faa0c5f..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/if +++ /dev/null @@ -1,5 +0,0 @@ -#name : if -# -- -{% if $1 %} - $0 -{% endif %} diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/img b/dotfiles/desktop/.emacs.d/snippets/web-mode/img deleted file mode 100644 index ed0df3f..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/img +++ /dev/null @@ -1,3 +0,0 @@ -#name : img -# -- -$2 diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/incl b/dotfiles/desktop/.emacs.d/snippets/web-mode/incl deleted file mode 100644 index 62a9814..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/incl +++ /dev/null @@ -1,3 +0,0 @@ -#name : incl -# -- -{% include "$1" %} diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/itemthumb b/dotfiles/desktop/.emacs.d/snippets/web-mode/itemthumb deleted file mode 100644 index 3eebdf3..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/itemthumb +++ /dev/null @@ -1,13 +0,0 @@ -#name : itemthumb -# -- - - {% if data.byhref[item.href].links.thumbnail[0] %} - thumbnail for {{ item.title }} -
- {% endif %} - {{ item.title }} -
-$0 \ No newline at end of file diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/linkcss b/dotfiles/desktop/.emacs.d/snippets/web-mode/linkcss deleted file mode 100644 index 7c2dda9..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/linkcss +++ /dev/null @@ -1,4 +0,0 @@ -#name : linkcss -# -- - -$0 diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/p b/dotfiles/desktop/.emacs.d/snippets/web-mode/p deleted file mode 100644 index bacadc5..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/p +++ /dev/null @@ -1,5 +0,0 @@ -#name : p -# -- -

- $0 -

diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/style b/dotfiles/desktop/.emacs.d/snippets/web-mode/style deleted file mode 100644 index 1068b67..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/style +++ /dev/null @@ -1,5 +0,0 @@ -#name : style -# -- - diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/with b/dotfiles/desktop/.emacs.d/snippets/web-mode/with deleted file mode 100644 index 0823e18..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/with +++ /dev/null @@ -1,5 +0,0 @@ -#name : with -# -- -{% with $1 = $2 %} - $0 -{% endwith %} diff --git a/dotfiles/desktop/.emacs.d/snippets/web-mode/{{ b/dotfiles/desktop/.emacs.d/snippets/web-mode/{{ deleted file mode 100644 index 48f4261..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/web-mode/{{ +++ /dev/null @@ -1,3 +0,0 @@ -#name : = -# -- -{{ $0 }} diff --git a/dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8-kustom b/dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8-kustom deleted file mode 100644 index ff3d7b5..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8-kustom +++ /dev/null @@ -1,5 +0,0 @@ -#key : k8s/kustomization -# -- -resources: - - ${1:deployment}.yaml - - ${2:service}.yaml diff --git a/dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8deployment b/dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8deployment deleted file mode 100644 index 8c9378e..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8deployment +++ /dev/null @@ -1,44 +0,0 @@ -#key : k8s/deployment -# -- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: ${1:foo}-deploy -spec: - replicas: ${2:1} - selector: - matchLabels: - app: $1 - template: - metadata: - labels: - app: $1 - ${3:webkind}: ${4:colour} - spec: - containers: - - name: $1 - image: docker.io/nginx:latest - volumeMounts: - - name: nginx-template-volume - mountPath: /etc/nginx/templates - - name: nginx-confd-volume - mountPath: /etc/nginx/conf.d - - ports: - - containerPort: 80 - env: - - name: NGINX_ENVSUBST_OUTPUT_DIR - value: /usr/share/nginx/html - - - name: COLOUR - valueFrom: - configMapKeyRef: - name: nginx-colour-config - key: $1.colour - volumes: - - name: nginx-template-volume - configMap: - name: nginx-template-config - - name: nginx-confd-volume - configMap: - name: nginx-conf.d-config diff --git a/dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8ingress b/dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8ingress deleted file mode 100644 index 0cb6bc7..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8ingress +++ /dev/null @@ -1,18 +0,0 @@ -#key : k8s/ingress -# -- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: ${1:foo}-ingress -spec: - rules: - - host: $1.`system-name` - http: - paths: - - pathType: Prefix - path: / - backend: - service: - port: - number: 80 - name: colour-service diff --git a/dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8service b/dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8service deleted file mode 100644 index f5b7db3..0000000 --- a/dotfiles/desktop/.emacs.d/snippets/yaml-mode/k8service +++ /dev/null @@ -1,14 +0,0 @@ -#key : k8s/service -# -- -apiVersion: v1 -kind: Service -metadata: - name: ${1:foo}-service -spec: - type: ${2:NodePort} - ports: - - port: ${3:80} - targetPort: ${4:80} - - selector: - ${5:webkind}: ${6:colour} diff --git a/dotfiles/desktop/.emacs.d/templates/org/cv.org b/dotfiles/desktop/.emacs.d/templates/org/cv.org new file mode 100644 index 0000000..92a266f --- /dev/null +++ b/dotfiles/desktop/.emacs.d/templates/org/cv.org @@ -0,0 +1,11 @@ +#+title: Curriculum Vitae +#+author: Your Name +#+options: toc:nil num:nil + +* Profile + +* Experience + +* Education + +* Skills diff --git a/dotfiles/desktop/.emacs.d/templates/org/documentation.org b/dotfiles/desktop/.emacs.d/templates/org/documentation.org new file mode 100644 index 0000000..19823be --- /dev/null +++ b/dotfiles/desktop/.emacs.d/templates/org/documentation.org @@ -0,0 +1,10 @@ +#+title: Technical documentation +#+author: Your Name +#+date: \today +#+options: toc:t num:t + +* Overview + +* Usage + +* References diff --git a/dotfiles/desktop/.emacs.d/templates/org/generic-document.org b/dotfiles/desktop/.emacs.d/templates/org/generic-document.org new file mode 100644 index 0000000..799accd --- /dev/null +++ b/dotfiles/desktop/.emacs.d/templates/org/generic-document.org @@ -0,0 +1,10 @@ +#+title: Document title +#+author: Your Name +#+date: \today +#+options: toc:t num:t + +* Introduction + +* Main content + +* Conclusion diff --git a/dotfiles/desktop/.emacs.d/templates/org/org.css b/dotfiles/desktop/.emacs.d/templates/org/org.css new file mode 100644 index 0000000..17365a9 --- /dev/null +++ b/dotfiles/desktop/.emacs.d/templates/org/org.css @@ -0,0 +1,2 @@ +body { max-width: 72ch; margin: 2rem auto; padding: 0 1rem; font-family: sans-serif; line-height: 1.6; } +pre, code { font-family: monospace; }