Config dump.

This commit is contained in:
2026-07-06 16:53:38 -04:00
parent 8e9204bc21
commit bf462da948
17 changed files with 914 additions and 335 deletions

View File

@@ -1,2 +1,3 @@
archive/ archive/
scripts/ scripts/
secrets/

View File

@@ -1,37 +1,40 @@
# Define list of directories you want to stow # Define list of directories you want to stow
CONFIG_DIRS := btop doom hypr kitty local nvim rclone starship tmux wallpapers waybar wireplumber wofi yazi zsh CONFIG_DIRS := btop doom hypr kitty exokortex nvim rclone starship tmux wallpapers waybar wireplumber wofi yazi zsh
all: stow_all # Default target for a fully-equipped workstation
all: stow_all stow_rclone stow_exokortex
wal -i ~/.config/wallpapers/green_yellow_forest.jpg -o ~/.config/waybar/launch.sh wal -i ~/.config/wallpapers/green_yellow_forest.jpg -o ~/.config/waybar/launch.sh
neofetch fastfetch
# Main target to handle stowing for all directories except rclone # Base configurations common to ALL hosts (excludes host-specific network/system automation)
stow_all: $(filter-out rclone, $(CONFIG_DIRS)) stow_all: $(filter-out rclone exokortex, $(CONFIG_DIRS))
@echo "Cleaning broken symlinks in ~/.config..." @echo "Removing legacy shell symlinks if they exist..."
find ~/.config -xtype l -delete -print
@echo "Removing symlink ~/.zshrc if it exists..."
@if [ -L $$HOME/.zshrc ]; then rm $$HOME/.zshrc; fi @if [ -L $$HOME/.zshrc ]; then rm $$HOME/.zshrc; fi
@echo "Removing symlink ~/.tmux.conf if it exists..."
@if [ -L $$HOME/.tmux.conf ]; then rm $$HOME/.tmux.conf; fi @if [ -L $$HOME/.tmux.conf ]; then rm $$HOME/.tmux.conf; fi
@echo "Stowing all configurations except rclone..." @echo "Stowing baseline configurations..."
@$(foreach dir,$(filter-out rclone, $(CONFIG_DIRS)), $(MAKE) stow_$(dir);) @$(foreach dir,$(filter-out rclone exokortex, $(CONFIG_DIRS)), $(MAKE) stow_$(dir);)
# Generic stow command for user-scoped directories # Generic atomic stow command using Restow (-R) for clean tracking
stow_%: stow_%:
@echo "Stowing $*" @echo "Stowing package: $*"
stow -v -t $(HOME) $* stow -R -v -t $(HOME) $*
# Post-installation script for rclone (executed after stowing) # Dedicated target for rclone (Omit this target on hosts that don't need it)
post_install_rclone: stow_rclone:
@echo "Stowing rclone securely..."
stow -R -v -t $(HOME) rclone
@echo "Running post-installation script for rclone" @echo "Running post-installation script for rclone"
@bash $(CURDIR)/scripts/rclone_post_install.sh @bash $(CURDIR)/scripts/rclone_post_install.sh
# Special target for rclone to run post-install after stowing # Dedicated target for exokortex (Omit this target on sterile servers if needed)
stow_rclone: stow_exokortex:
@echo "Cleaning broken symlinks in ~/.config/rclone/..." @echo "Stowing exokortex automation layers..."
find ~/.config/rclone/ -xtype l -delete -print stow -R -v -t $(HOME) exokortex
@echo "Removing symlink ~/.local/bin/rclone_mount_check.sh if it exists..." @echo "Running post-installation script for exokortex"
@if [ -L $$HOME/.local/bin/rclone_mount_check.sh ]; then rm $$HOME/.local/bin/rclone_mount_check.sh; fi @bash $(CURDIR)/scripts/exokortex_post_install.sh
@echo "Stowing rclone"
stow -v -t $(HOME) rclone # Optional: Global cleanup target you only run manually when you want a deep system purge
@$(MAKE) post_install_rclone prune_dead_links:
@echo "Purging all broken symlinks across core configuration profiles..."
find ~/.config -xtype l -delete -print
find ~/.local/bin -xtype l -delete -print

View File

@@ -146,6 +146,21 @@ My current workflow consist in having the 3-5 files I work on open in vertical s
(super-save-mode +1)) (super-save-mode +1))
#+end_src #+end_src
** Paths
#+begin_src emacs-lisp
(defvar dotfiles-base-path
(file-name-as-directory "~/ExoKortex/2-Areas/Home-Infra/4-Outputs/dotfiles"))
(defvar roam-base-path
(file-name-as-directory "~/ExoKortex/2-Areas/Home-Infra/2-Assets/Roam"))
(defvar dict-base-path
(file-name-as-directory "~/ExoKortex/2-Areas/Home-Infra/2-Assets/Dictionaries"))
(defvar journal-base-path
(file-name-as-directory "~/ExoKortex/2-Areas/Journal"))
#+end_src
** Fix ** Fix
#+begin_src emacs-lisp #+begin_src emacs-lisp
@@ -165,15 +180,19 @@ change ~org-directory~. It must be set before org loads!
#+begin_src emacs-lisp #+begin_src emacs-lisp
(setq (setq
org-directory "~/ExoKortex/" org-directory "~/ExoKortex"
+org-capture-todo-file "~/ExoKortex/3-Telos/5-Kernel/inbox.org" +org-capture-todo-file "~/ExoKortex/inbox.org"
+org-capture-notes-file "~/ExoKortex/3-Telos/5-Kernel/inbox.org" +org-capture-notes-file "~/ExoKortex/inbox.org"
+org-capture-journal-file "~/ExoKortex/3-Telos/5-Kernel/inbox.org" +org-capture-journal-file "~/ExoKortex/inbox.org"
+org-capture-emails-file "~/ExoKortex/3-Telos/5-Kernel/inbox.org" +org-capture-emails-file "~/ExoKortex/inbox.org"
;; +org-capture-central-project-todo-file '"refile.org" ;; +org-capture-central-project-todo-file '"refile.org"
;; +org-capture-project-todo-file '"refile.org" ;; +org-capture-project-todo-file '"refile.org"
org-agenda-files (directory-files-recursively "~/ExoKortex/" "\\.org$") org-agenda-files (directory-files-recursively "~/ExoKortex/" "\\.org$")
) )
(after! org
(setq org-cycle-show-planning-line t)
)
#+end_src #+end_src
** Refiling ** Refiling
@@ -472,12 +491,21 @@ change ~org-directory~. It must be set before org loads!
((agenda "" ((agenda ""
((org-agenda-span 'month) ((org-agenda-span 'month)
(org-agenda-start-day nil) (org-agenda-start-day nil)
(org-agenda-overriding-header "📅 Sheduled Tasks")) (org-agenda-overriding-header "📅 Sheduled Tasks")
(org-agenda-time-grid nil)
(org-agenda-prefix-format " %12t") ;; reserve time space
(org-agenda-todo-keyword-format " ") ;; fixed-width TODO
(org-agenda-tags-column -100) ;; right-align tags
(org-agenda-remove-tags t))
) )
(todo "TODO|NEXT|DELG|WAIT|HOLD|STRT|IDEA" (todo "TODO|NEXT|DELG|WAIT|HOLD|STRT|IDEA"
((org-agenda-overriding-header "📋 Unscheduled TODOs") ((org-agenda-overriding-header "📋 Unscheduled TODOs")
(org-agenda-skip-function '(org-agenda-skip-entry-if 'scheduled)) (org-agenda-skip-function '(org-agenda-skip-entry-if 'scheduled))
(org-agenda-prefix-format " %12t") ;; reserve time space
(org-agenda-todo-keyword-format " ") ;; fixed-width TODO
(org-agenda-tags-column -100) ;; right-align tags
(org-agenda-remove-tags t)
) )
) )
) )
@@ -498,8 +526,8 @@ change ~org-directory~. It must be set before org loads!
) )
("wA" "Projet Airbus Vision" ("wA" "Projet Airbus Vision"
((agenda "" ((agenda ""
((org-agenda-span 150) ((org-agenda-span 120)
(org-agenda-start-day "2026-05-01") (org-agenda-start-day "2026-07-01")
(org-agenda-overriding-header "📅 Projet Airbus Vision") (org-agenda-overriding-header "📅 Projet Airbus Vision")
(org-agenda-prefix-format " %12t") ;; reserve time space (org-agenda-prefix-format " %12t") ;; reserve time space
(org-agenda-todo-keyword-format " %-5s") ;; fixed-width TODO (org-agenda-todo-keyword-format " %-5s") ;; fixed-width TODO
@@ -925,9 +953,9 @@ Broken for now..
#+begin_src emacs-lisp #+begin_src emacs-lisp
(setq org-roam-directory (file-truename "~/ExoKortex/") (setq org-roam-directory (file-truename "~/ExoKortex/")
org-roam-db-location (file-truename "~/ExoKortex/1-Soma/2-Areas/IT/Roam/org-roam.db") org-roam-db-location (expand-file-name "org-roam.db" roam-base-path)
org-attach-id-dir "assets/" org-attach-id-dir "assets/"
org-roam-dailies-directory "~/ExoKortex/2-Areas/Meta-Planning/Org/Journal/Daily") org-roam-dailies-directory (expand-file-name "Daily" journal-base-path))
#+end_src #+end_src
** Custom config ** Custom config
@@ -1256,15 +1284,14 @@ Now I can write x) (spellchecking)
(after! ispell (after! ispell
(setq ispell-program-name "hunspell" (setq ispell-program-name "hunspell"
ispell-dictionary "en_CA,fr_CA" ispell-dictionary "en_CA,fr_CA"
ispell-personal-dictionary "/home/tpouplier/ExoKortex/1-Soma/2-Areas/IT/Dictionaries/perso.dic") ispell-personal-dictionary (expand-file-name "perso.dic" dict-base-path))
;; Set the dictionary path environment variable ;; Set the dictionary path environment variable
(setenv "DICPATH" "/home/tpouplier/ExoKortex/1-Soma/2-Areas/IT/Dictionaries") (setenv "DICPATH" (expand-file-name dict-base-path))
(setq ispell-hunspell-dict-paths-alist (setq ispell-hunspell-dict-paths-alist
'(("fr_CA" "/home/tpouplier/ExoKortex/1-Soma/2-Areas/IT/Dictionaries/fr_CA.aff") `(("fr_CA" ,(expand-file-name "fr_CA.aff" dict-base-path))
("en_CA" "/home/tpouplier/ExoKortex/1-Soma/2-Areas/IT/Dictionaries/en_CA.aff"))) ("en_CA" ,(expand-file-name "en_CA.aff" dict-base-path))))
(setq ispell-hunspell-dictionary-alist (setq ispell-hunspell-dictionary-alist
'(("fr_CA" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil ("-d" "fr_CA") nil utf-8) '(("fr_CA" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil ("-d" "fr_CA") nil utf-8)
("en_CA" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil ("-d" "en_CA") nil utf-8))) ("en_CA" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil ("-d" "en_CA") nil utf-8)))
@@ -1499,11 +1526,11 @@ Allow retrieval of password from age file formatted like passwordstore
;; rebind function value for pass to passage ;; rebind function value for pass to passage
(fset #'pass (lambda () (interactive) (passage))) (fset #'pass (lambda () (interactive) (passage)))
(setq age-program "rage") (setq age-program "rage")
(setq auth-source-passage-filename (expand-file-name "~/ExoKortex/4-Automata/dotfiles/secrets")) (setq auth-source-passage-filename (expand-file-name "secrets" dotfiles-base-path))
(setenv "PASSAGE_IDENTITIES_FILE" (expand-file-name age-default-identity)) (setenv "PASSAGE_IDENTITIES_FILE" (expand-file-name age-default-identity))
(setenv "PASSAGE_RECIPIENTS_FILE" (expand-file-name age-default-recipient)) (setenv "PASSAGE_RECIPIENTS_FILE" (expand-file-name age-default-recipient))
(setenv "PASSAGE_AGE" "rage") (setenv "PASSAGE_AGE" "rage")
(setenv "PASSAGE_DIR" (expand-file-name "~/ExoKortex/4-Automata/dotfiles/secrets")) (setenv "PASSAGE_DIR" (expand-file-name "secrets" dotfiles-base-path))
) )
#+end_src #+end_src
** Diff HL Mode ** Diff HL Mode
@@ -1894,8 +1921,9 @@ Recently added the quick access entries. Game changer.
#+begin_src emacs-lisp #+begin_src emacs-lisp
;; Dirvish config ;; Dirvish config
(after! (dirvish dired) (after! (dirvish dired)
(require 'async) ;; Charger l'extension rsync
(dired-async-mode 1) (require 'dirvish-rsync)
;; Display icons, file size, timestamps, etc. ;; Display icons, file size, timestamps, etc.
(setq dirvish-attributes (setq dirvish-attributes
'(nerd-icons '(nerd-icons
@@ -1908,35 +1936,41 @@ Recently added the quick access entries. Game changer.
;; Use a header line instead of the traditional dired modeline ;; Use a header line instead of the traditional dired modeline
(setq dirvish-use-header-line t) (setq dirvish-use-header-line t)
;; Show dotfile please, ty
;; (setq dired-omit-mode nil)
;; (setq dired-listing-switches "-a")
;; Replace default dired mode globally ;; Replace default dired mode globally
(dirvish-override-dired-mode) (dirvish-override-dired-mode)
(require 'dirvish-yank) ;; Config rsync (les nouvelles variables)
(setq dirvish-rsync-args '("-ah" "--info=progress2"))
(setq dirvish-rsync-use-yank-menu t)
;; Remapper 'y' pour utiliser rsync au lieu du batch Emacs
(setq dirvish-yank-keys
'(("y" "Rsync here" dirvish-rsync)
("m" "Move here" dirvish-move)
("s" "Make symlinks here" dirvish-symlink)
("r" "Make relative symlinks here" dirvish-relative-symlink)
("h" "Make hardlinks here" dirvish-hardlink)))
(setq! dirvish-quick-access-entries (setq! dirvish-quick-access-entries
`( `(("h" "~/" "Home")
("h" "~/" "Home") ("e" "~/ExoKortex" "ExoKortex")
("k" "~/ExoKortex/2-Areas/Meta-Planning/Org/Core" "ExoKortex") ("p" "~/ExoKortex/1-Projects" "Projects")
("p" "~/ExoKortex/1-Projects" "Projects") ("a" "~/ExoKortex/2-Areas" "Areas")
("a" "~/ExoKortex/2-Areas" "Areas") ("r" "~/ExoKortex/3-Resources" "Resources")
("r" "~/ExoKortex/3-Resources" "Resources") ("i" "~/ExoKortex/4-Archives" "Archives")
("i" "~/ExoKortex/4-Archives" "Archives") ("d" "~/Downloads" "Downloads")
("d" "~/Downloads/" "Downloads") ("u" "/run/media/" "Mounted drives")
("u" "/run/media" "Mounted drives") ("g" "~/.local/share/Trash/files" "Trash")))
("t" "~/.local/share/Trash/files/" "Trash") )
))
(setq dirvish-yank-use-rsync t)
(setq dirvish-yank-rsync-args '("-ah" "--info=progress2"))
)
;; Use `p` to open the yank menu ;; Use `p` to open the yank menu
(map! :after dirvish-yank (map! :after dirvish-yank
:map dirvish-mode-map :map dirvish-mode-map
:n "p" #'dirvish-yank-menu) :n "p" #'dirvish-yank-menu)
(map! :after dirvish
:leader
:desc "Keep all" "oi" #'dirvish-dwim)
#+end_src #+end_src
#+RESULTS: #+RESULTS:
@@ -2036,7 +2070,7 @@ Useful for the user, but also when you have someone over your shoulder trying to
(after! org-msg (after! org-msg
(setq mail-user-agent 'mu4e-user-agent) (setq mail-user-agent 'mu4e-user-agent)
(require 'org-msg) (require 'org-msg)
(setq org-msg-options "html-postamble:nil H:5 num:nil ^:{} toc:nil author:nil email:nil \\n:t" (setq org-msg-options "html-postamble:nil H:5 num:nil ^:{} p:t toc:nil author:nil email:nil \\n:t"
org-msg-startup "hidestars indent inlineimages" org-msg-startup "hidestars indent inlineimages"
org-msg-greeting-fmt "\nBonjour%s,\n\n" org-msg-greeting-fmt "\nBonjour%s,\n\n"
org-msg-greeting-name-limit 1 org-msg-greeting-name-limit 1
@@ -2219,70 +2253,14 @@ Really useful to be able to have a buffer with notes, and another with the offic
(pdf-tools-install :no-query) (pdf-tools-install :no-query)
;; Hooks ;; Hooks
(add-hook 'pdf-view-mode-hook #'pdf-view-midnight-minor-mode) ;; (add-hook 'pdf-view-mode-hook #'pdf-view-midnight-minor-mode)
(add-hook 'pdf-view-mode-hook #'pdf-view-roll-minor-mode) (add-hook 'pdf-view-mode-hook #'pdf-view-roll-minor-mode)
) )
#+end_src #+end_src
* Custom Emacs-Everywhere for Hyprland * Custom functions
#+begin_src emacs-lisp ** Custom function refile to datetree
;; Like Emacs everywhere, but work in hyprland
(defun thanos/wtype-text (text)
"Process TEXT for wtype, handling newlines properly."
(let* ((has-final-newline (string-match-p "\n$" text))
(lines (split-string text "\n"))
(last-idx (1- (length lines))))
(string-join
(cl-loop for line in lines
for i from 0
collect (cond
;; Last line without final newline
((and (= i last-idx) (not has-final-newline))
(format "wtype -s 350 \"%s\""
(replace-regexp-in-string "\"" "\\\\\"" line)))
;; Any other line
(t
(format "wtype -s 350 \"%s\" && wtype -k Return"
(replace-regexp-in-string "\"" "\\\\\"" line)))))
" && ")))
(define-minor-mode thanos/type-mode
"Minor mode for inserting text via wtype."
:keymap `((,(kbd "C-c C-c") . ,(lambda () (interactive)
(call-process-shell-command
(thanos/wtype-text (buffer-string))
nil 0)
(delete-frame)))
(,(kbd "C-c C-k") . ,(lambda () (interactive)
(kill-buffer (current-buffer))))))
(defun thanos/type ()
"Launch a temporary frame with a clean buffer for typing."
(interactive)
(let ((frame (make-frame '((name . "emacs-float")
(fullscreen . 0)
(undecorated . t)
(width . 70)
(height . 20))))
(buf (get-buffer-create "emacs-float")))
(select-frame frame)
(switch-to-buffer buf)
(with-current-buffer buf
(erase-buffer)
(org-mode)
(flyspell-mode)
(thanos/type-mode)
(setq-local header-line-format
(format " %s to insert text or %s to cancel."
(propertize "C-c C-c" 'face 'help-key-binding)
(propertize "C-c C-k" 'face 'help-key-binding)))
;; Make the frame more temporary-like
(set-frame-parameter frame 'delete-before-kill-buffer t)
(set-window-dedicated-p (selected-window) t))))
#+end_src
* Custom function refile to datetree
#+begin_src emacs-lisp #+begin_src emacs-lisp
;;Refile in datetree function ;;Refile in datetree function
@@ -2314,7 +2292,7 @@ If FILE is nil, refile in the current file."
(widen))))) (widen)))))
#+end_src #+end_src
* Custom function ediff org fold ** Custom function ediff org fold
#+begin_src emacs-lisp #+begin_src emacs-lisp
;; Open all org fold in ediff ;; Open all org fold in ediff
@@ -2325,7 +2303,7 @@ If FILE is nil, refile in the current file."
(add-hook 'ediff-prepare-buffer-hook 'org-ediff-prepare-buffer) (add-hook 'ediff-prepare-buffer-hook 'org-ediff-prepare-buffer)
#+end_src #+end_src
* Custom function for scheduling ** Custom function for scheduling
#+begin_src emacs-lisp #+begin_src emacs-lisp
;;; ============================================================ ;;; ============================================================
@@ -2774,7 +2752,7 @@ and ensure the standard property drawer exists without overwriting existing data
#+RESULTS: #+RESULTS:
: gortium/add-ids-to-subtree : gortium/add-ids-to-subtree
* Custom function for maintenance ** Custom function for maintenance
#+begin_src emacs-lisp #+begin_src emacs-lisp
(after! org (after! org
;; --------------------------------------------------------- ;; ---------------------------------------------------------
@@ -2873,7 +2851,7 @@ and ensure the standard property drawer exists without overwriting existing data
(add-hook 'org-after-todo-state-change-hook #'my/org-todo-state-handler) (add-hook 'org-after-todo-state-change-hook #'my/org-todo-state-handler)
#+end_src #+end_src
* Custom for rescheduling task later ** Custom function for rescheduling task later
#+begin_src emacs-lisp #+begin_src emacs-lisp
(defun my/org-smart-advance-date () (defun my/org-smart-advance-date ()
"Jump to next repeater occurrence or add 1 day. "Jump to next repeater occurrence or add 1 day.
@@ -2912,7 +2890,7 @@ Suppresses all logging, notes, and custom odometer hooks."
:localleader "L" #'my/org-smart-advance-date)) :localleader "L" #'my/org-smart-advance-date))
#+end_src #+end_src
* Custom function Open link in other frame ** Custom function Open link in other frame
#+begin_src emacs-lisp #+begin_src emacs-lisp
;; Open link in another frame ;; Open link in another frame
@@ -2928,7 +2906,7 @@ Suppresses all logging, notes, and custom odometer hooks."
:n "gF" #'gortium/org-open-link-in-other-frame) :n "gF" #'gortium/org-open-link-in-other-frame)
#+end_src #+end_src
* Custom function to open current buffer to new frame ** Custom function to open current buffer to new frame
#+begin_src emacs-lisp #+begin_src emacs-lisp
(defvar gortium/main-frame nil (defvar gortium/main-frame nil
@@ -2999,60 +2977,125 @@ Suppresses all logging, notes, and custom odometer hooks."
(delete-window old-win))))))) (delete-window old-win)))))))
#+end_src #+end_src
* Custom function for ExoKortex ** Custom function for ExoKortex
#+begin_src emacs-lisp #+begin_src emacs-lisp
;; >=== ExoKortex System ===< ;;; ====================================================================
;;; ExoKortex Core Engine (Shared Logic)
;;; ====================================================================
(defvar gortium/org-repo-projects "~/ExoKortex/2-Areas/Meta-Planning/Org/Projects" (defvar gortium/exokortex-root "~/ExoKortex"
"Path to your main Org repository where real .org files are stored.") "The absolute root directory of your ExoKortex.")
(defvar gortium/projects-root "~/ExoKortex/1-Projects/" (defun gortium/ensure-node-structure (node-dir &optional default-todo)
"Root directory where new projects will be created.") "Ensure NODE-DIR conforms to the ExoKortex node blueprint.
Creates folders, writes text-layer filters, and handles Git injection.
Returns the absolute path to the core Org file."
(let* ((node-dir (expand-file-name node-dir))
(node-name (file-name-nondirectory (directory-file-name node-dir)))
;; Blueprint Paths
(plan-dir (expand-file-name "1-Plan" node-dir))
(assets-dir (expand-file-name "2-Assets" node-dir))
(notes-dir (expand-file-name "3-Notes" node-dir))
(outputs-dir (expand-file-name "4-Outputs" node-dir))
(org-file (expand-file-name (concat node-name ".org") plan-dir))
(gitignore-file (expand-file-name ".gitignore" node-dir))
(git-existed-p (file-exists-p (expand-file-name ".git" node-dir))))
(defun gortium/create-project (project-name) ;; 1. Build directory layers smoothly (mkdir -p)
"Create a new project with PROJECT-NAME in `gortium/projects-root`. (dolist (dir (list plan-dir assets-dir notes-dir outputs-dir))
The .org file is created in `gortium/org-repo-projects` and symlinked into the project folder." (make-directory dir t))
(interactive "sProject name: ")
(let* ((project-dir (expand-file-name project-name gortium/projects-root))
(org-file (concat project-name ".org"))
(org-real (expand-file-name org-file gortium/org-repo-projects))
(org-link (expand-file-name org-file project-dir)))
(make-directory project-dir t)
(unless (file-exists-p org-real)
(with-temp-file org-real
(insert (format "#+TITLE: %s\n#+DATE: %s\n\n" project-name (format-time-string "%Y-%m-%d")))))
(make-symbolic-link org-real org-link t)
(find-file org-link)))
(defun gortium/create-symlinked-org (file-name) ;; 2. Enforce text-only gitignore rules if absent
"Create a symlinked org FILE-NAME in current dir, real file in `gortium/org-repo-projoects`." (unless (file-exists-p gitignore-file)
(interactive "sOrg file name (without .org): ") (with-temp-file gitignore-file
(let* ((org-file (concat file-name ".org")) (insert "# Local Node Rule: Track text layers only\n*\n!.gitignore\n!1-Plan/\n!1-Plan/**\n!3-Notes/\n!3-Notes/**\n")))
(org-real (expand-file-name org-file gortium/org-repo-projects))
(org-link (expand-file-name org-file default-directory)))
(unless (file-exists-p org-real)
(with-temp-file org-real
(insert (format "#+TITLE: %s\n#+DATE: %s\n\n" file-name (format-time-string "%Y-%m-%d")))))
(make-symbolic-link org-real org-link t)
(find-file org-link)))
(defun gortium/convert-marked-org-to-symlink () ;; 3. Build index Org block if absent
"Convert all marked org files in Dirvish/Dired to symlinks in `gortium/org-repo-projects`." (unless (file-exists-p org-file)
(interactive) (with-temp-file org-file
(let ((files (dired-get-marked-files))) (insert (format "#+TITLE: %s\n#+DATE: %s\n#+CATEGORY: %s\n\n* Setup\n- [ ] %s\n"
(dolist (file-path files) node-name
(when (and (file-regular-p file-path) (format-time-string "[%Y-%m-%d %a]")
(string= (file-name-extension file-path) "org")) node-name
(let* ((file-name (file-name-nondirectory file-path)) (or default-todo "Initialize project context")))))
(org-real (expand-file-name file-name gortium/org-repo-projects)))
(unless (file-exists-p org-real) ;; 4. Unified Git Integration Loop
(rename-file file-path org-real)) (let ((default-directory node-dir))
(make-symbolic-link org-real file-path t) (if (not git-existed-p)
(message "Converted %s to symlink -> %s" file-path org-real)))))) (progn
(shell-command "git init")
(shell-command "git add .gitignore 1-Plan/ 3-Notes/")
(shell-command "git commit -m 'System: Initialize node repository'"))
(shell-command "git add .gitignore 1-Plan/ 3-Notes/")))
;; Pass the target file location back up to the caller
org-file))
;;; ====================================================================
;;; Interactive Entry Points
;;; ====================================================================
(defun gortium/create-node (category node-name)
"Create a brand new standardized PARA Node inside your ExoKortex vault."
(interactive
(list (completing-read "Category: " '("1-Projects" "2-Areas" "3-Resources"))
(read-string "Node Name: ")))
(let* ((category-dir (expand-file-name category gortium/exokortex-root))
(node-dir (expand-file-name node-name category-dir))
(org-file (gortium/ensure-node-structure node-dir "Initialize project context")))
(find-file org-file)
(message "ExoKortex Node '%s' created in %s." node-name category)))
(defun gortium/convert-to-node (node-dirs)
"Retrofit existing workspace directories into tracked ExoKortex nodes.
If folders are explicitly marked in Dirvish/Dired, it batch-processes all of them.
Otherwise, prompts for a single directory, defaulting to the item under the cursor."
(interactive
(list
(let* ((dired-elements (when (derived-mode-p 'dired-mode)
(dired-get-marked-files nil nil nil t)))
;; Dired returns (t . ("path")) if exactly ONE file is marked explicitly,
;; or a flat list if multiple are marked.
(has-explicit-marks (or (and (listp dired-elements) (> (length dired-elements) 1))
(and (consp dired-elements) (eq (car dired-elements) t))))
(marked-dirs (when has-explicit-marks
(cl-remove-if-not #'file-directory-p
(if (eq (car-safe dired-elements) t)
(cdr dired-elements)
dired-elements)))))
(if marked-dirs
marked-dirs
;; Fallback: No explicit marks found, prompt for a single target
(let* ((cursor-path (when (derived-mode-p 'dired-mode)
(dired-get-filename nil t)))
(initial-path (cond
((and cursor-path (file-directory-p cursor-path))
cursor-path)
(cursor-path
(file-name-directory cursor-path))
(t default-directory))))
(list (read-directory-name "Directory to convert: " nil initial-path t initial-path)))))))
;; Execution Block
(let ((count 0)
last-org-file)
(dolist (dir node-dirs)
(let* ((node-dir (expand-file-name dir))
(node-name (file-name-nondirectory (directory-file-name node-dir)))
(org-file (gortium/ensure-node-structure node-dir "Audit existing assets and reconcile tracking nodes")))
(setq last-org-file org-file)
(cl-incf count)))
;; Contextual UI Feedback
(if (= count 1)
(progn
(message "Directory successfully converted to ExoKortex node."))
(message "Successfully batch-converted %d directories to ExoKortex nodes!" count))))
#+end_src #+end_src
* Custom function to refile task to dailies ** Custom function to refile task to dailies
#+begin_src emacs-lisp #+begin_src emacs-lisp
(defun gortium/refile-to-today-daily () (defun gortium/refile-to-today-daily ()
@@ -3116,6 +3159,91 @@ fallback to today's daily note. Ensures the daily has an Org-roam ID."
headline headline
(file-name-nondirectory daily-file))))) (file-name-nondirectory daily-file)))))
#+end_src #+end_src
** Custom function to create a datetree
#+begin_src emacs-lisp
(require 'calendar)
(defun gortium/org-create-datetree-range ()
"Génère une structure datetree Org entre deux dates choisies via le calendrier interactif.
Si la date de début est validée vide, utilise la date d'aujourd'hui."
(interactive)
(let* ((start-time (org-read-date nil t nil "Date de début (Entrée pour aujourd'hui) : "))
(end-time (org-read-date nil t nil "Date de fin : "))
(start-decoded (decode-time start-time))
(end-decoded (decode-time end-time))
;; Format attendu par le calendrier Emacs : (mois jour année)
(start-date (list (decoded-time-month start-decoded)
(decoded-time-day start-decoded)
(decoded-time-year start-decoded)))
(end-date (list (decoded-time-month end-decoded)
(decoded-time-day end-decoded)
(decoded-time-year end-decoded)))
(start-abs (calendar-absolute-from-gregorian start-date))
(end-abs (calendar-absolute-from-gregorian end-date)))
(if (< end-abs start-abs)
(user-error "Erreur : La date de fin doit être après la date de début ! ")
(save-excursion
(cl-loop for abs from start-abs to end-abs
do (org-datetree-find-date-create (calendar-gregorian-from-absolute abs))))
(message "Datetree généré avec succès !"))))
#+end_src
** Custom Emacs-Everywhere for Hyprland
#+begin_src emacs-lisp
;; Like Emacs everywhere, but work in hyprland
(defun thanos/wtype-text (text)
"Process TEXT for wtype, handling newlines properly."
(let* ((has-final-newline (string-match-p "\n$" text))
(lines (split-string text "\n"))
(last-idx (1- (length lines))))
(string-join
(cl-loop for line in lines
for i from 0
collect (cond
;; Last line without final newline
((and (= i last-idx) (not has-final-newline))
(format "wtype -s 350 \"%s\""
(replace-regexp-in-string "\"" "\\\\\"" line)))
;; Any other line
(t
(format "wtype -s 350 \"%s\" && wtype -k Return"
(replace-regexp-in-string "\"" "\\\\\"" line)))))
" && ")))
(define-minor-mode thanos/type-mode
"Minor mode for inserting text via wtype."
:keymap `((,(kbd "C-c C-c") . ,(lambda () (interactive)
(call-process-shell-command
(thanos/wtype-text (buffer-string))
nil 0)
(delete-frame)))
(,(kbd "C-c C-k") . ,(lambda () (interactive)
(kill-buffer (current-buffer))))))
(defun thanos/type ()
"Launch a temporary frame with a clean buffer for typing."
(interactive)
(let ((frame (make-frame '((name . "emacs-float")
(fullscreen . 0)
(undecorated . t)
(width . 70)
(height . 20))))
(buf (get-buffer-create "emacs-float")))
(select-frame frame)
(switch-to-buffer buf)
(with-current-buffer buf
(erase-buffer)
(org-mode)
(flyspell-mode)
(thanos/type-mode)
(setq-local header-line-format
(format " %s to insert text or %s to cancel."
(propertize "C-c C-c" 'face 'help-key-binding)
(propertize "C-c C-k" 'face 'help-key-binding)))
;; Make the frame more temporary-like
(set-frame-parameter frame 'delete-before-kill-buffer t)
(set-window-dedicated-p (selected-window) t))))
#+end_src
* LifeOS * LifeOS
WIP, deactivated for now. WIP, deactivated for now.

View File

@@ -44,6 +44,18 @@
evil-prev-buffer evil-next-buffer)) evil-prev-buffer evil-next-buffer))
(super-save-mode +1)) (super-save-mode +1))
(defvar dotfiles-base-path
(file-name-as-directory "~/ExoKortex/2-Areas/Home-Infra/4-Outputs/dotfiles"))
(defvar roam-base-path
(file-name-as-directory "~/ExoKortex/2-Areas/Home-Infra/2-Assets/Roam"))
(defvar dict-base-path
(file-name-as-directory "~/ExoKortex/2-Areas/Home-Infra/2-Assets/Dictionaries"))
(defvar journal-base-path
(file-name-as-directory "~/ExoKortex/2-Areas/Journal"))
;; Fixes.. ;; Fixes..
(require 'cl-lib) (require 'cl-lib)
(unless (fboundp 'find-if) (unless (fboundp 'find-if)
@@ -52,16 +64,20 @@
(defalias 'getf #'cl-getf)) (defalias 'getf #'cl-getf))
(setq (setq
org-directory "~/ExoKortex/" org-directory "~/ExoKortex"
+org-capture-todo-file "~/ExoKortex/3-Telos/5-Kernel/inbox.org" +org-capture-todo-file "~/ExoKortex/inbox.org"
+org-capture-notes-file "~/ExoKortex/3-Telos/5-Kernel/inbox.org" +org-capture-notes-file "~/ExoKortex/inbox.org"
+org-capture-journal-file "~/ExoKortex/3-Telos/5-Kernel/inbox.org" +org-capture-journal-file "~/ExoKortex/inbox.org"
+org-capture-emails-file "~/ExoKortex/3-Telos/5-Kernel/inbox.org" +org-capture-emails-file "~/ExoKortex/inbox.org"
;; +org-capture-central-project-todo-file '"refile.org" ;; +org-capture-central-project-todo-file '"refile.org"
;; +org-capture-project-todo-file '"refile.org" ;; +org-capture-project-todo-file '"refile.org"
org-agenda-files (directory-files-recursively "~/ExoKortex/" "\\.org$") org-agenda-files (directory-files-recursively "~/ExoKortex/" "\\.org$")
) )
(after! org
(setq org-cycle-show-planning-line t)
)
(after! org (after! org
(setq org-refile-targets (setq org-refile-targets
'((nil :maxlevel . 6) ;; Current buffer '((nil :maxlevel . 6) ;; Current buffer
@@ -343,12 +359,21 @@
((agenda "" ((agenda ""
((org-agenda-span 'month) ((org-agenda-span 'month)
(org-agenda-start-day nil) (org-agenda-start-day nil)
(org-agenda-overriding-header "📅 Sheduled Tasks")) (org-agenda-overriding-header "📅 Sheduled Tasks")
(org-agenda-time-grid nil)
(org-agenda-prefix-format " %12t") ;; reserve time space
(org-agenda-todo-keyword-format " ") ;; fixed-width TODO
(org-agenda-tags-column -100) ;; right-align tags
(org-agenda-remove-tags t))
) )
(todo "TODO|NEXT|DELG|WAIT|HOLD|STRT|IDEA" (todo "TODO|NEXT|DELG|WAIT|HOLD|STRT|IDEA"
((org-agenda-overriding-header "📋 Unscheduled TODOs") ((org-agenda-overriding-header "📋 Unscheduled TODOs")
(org-agenda-skip-function '(org-agenda-skip-entry-if 'scheduled)) (org-agenda-skip-function '(org-agenda-skip-entry-if 'scheduled))
(org-agenda-prefix-format " %12t") ;; reserve time space
(org-agenda-todo-keyword-format " ") ;; fixed-width TODO
(org-agenda-tags-column -100) ;; right-align tags
(org-agenda-remove-tags t)
) )
) )
) )
@@ -369,8 +394,8 @@
) )
("wA" "Projet Airbus Vision" ("wA" "Projet Airbus Vision"
((agenda "" ((agenda ""
((org-agenda-span 150) ((org-agenda-span 120)
(org-agenda-start-day "2026-05-01") (org-agenda-start-day "2026-07-01")
(org-agenda-overriding-header "📅 Projet Airbus Vision") (org-agenda-overriding-header "📅 Projet Airbus Vision")
(org-agenda-prefix-format " %12t") ;; reserve time space (org-agenda-prefix-format " %12t") ;; reserve time space
(org-agenda-todo-keyword-format " %-5s") ;; fixed-width TODO (org-agenda-todo-keyword-format " %-5s") ;; fixed-width TODO
@@ -521,9 +546,9 @@
(add-to-list 'auto-mode-alist '("\\.plantuml\\'" . plantuml-mode)) (add-to-list 'auto-mode-alist '("\\.plantuml\\'" . plantuml-mode))
(setq org-roam-directory (file-truename "~/ExoKortex/") (setq org-roam-directory (file-truename "~/ExoKortex/")
org-roam-db-location (file-truename "~/ExoKortex/1-Soma/2-Areas/IT/Roam/org-roam.db") org-roam-db-location (expand-file-name "org-roam.db" roam-base-path)
org-attach-id-dir "assets/" org-attach-id-dir "assets/"
org-roam-dailies-directory "~/ExoKortex/2-Areas/Meta-Planning/Org/Journal/Daily") org-roam-dailies-directory (expand-file-name "Daily" journal-base-path))
(after! org-roam (after! org-roam
org-roam-completion-everywhere t org-roam-completion-everywhere t
@@ -750,15 +775,14 @@ Handles org-clock and context link capture for tasks."
(after! ispell (after! ispell
(setq ispell-program-name "hunspell" (setq ispell-program-name "hunspell"
ispell-dictionary "en_CA,fr_CA" ispell-dictionary "en_CA,fr_CA"
ispell-personal-dictionary "/home/tpouplier/ExoKortex/1-Soma/2-Areas/IT/Dictionaries/perso.dic") ispell-personal-dictionary (expand-file-name "perso.dic" dict-base-path))
;; Set the dictionary path environment variable ;; Set the dictionary path environment variable
(setenv "DICPATH" "/home/tpouplier/ExoKortex/1-Soma/2-Areas/IT/Dictionaries") (setenv "DICPATH" (expand-file-name dict-base-path))
(setq ispell-hunspell-dict-paths-alist (setq ispell-hunspell-dict-paths-alist
'(("fr_CA" "/home/tpouplier/ExoKortex/1-Soma/2-Areas/IT/Dictionaries/fr_CA.aff") `(("fr_CA" ,(expand-file-name "fr_CA.aff" dict-base-path))
("en_CA" "/home/tpouplier/ExoKortex/1-Soma/2-Areas/IT/Dictionaries/en_CA.aff"))) ("en_CA" ,(expand-file-name "en_CA.aff" dict-base-path))))
(setq ispell-hunspell-dictionary-alist (setq ispell-hunspell-dictionary-alist
'(("fr_CA" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil ("-d" "fr_CA") nil utf-8) '(("fr_CA" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil ("-d" "fr_CA") nil utf-8)
("en_CA" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil ("-d" "en_CA") nil utf-8))) ("en_CA" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil ("-d" "en_CA") nil utf-8)))
@@ -943,11 +967,11 @@ Handles org-clock and context link capture for tasks."
;; rebind function value for pass to passage ;; rebind function value for pass to passage
(fset #'pass (lambda () (interactive) (passage))) (fset #'pass (lambda () (interactive) (passage)))
(setq age-program "rage") (setq age-program "rage")
(setq auth-source-passage-filename (expand-file-name "~/ExoKortex/4-Automata/dotfiles/secrets")) (setq auth-source-passage-filename (expand-file-name "secrets" dotfiles-base-path))
(setenv "PASSAGE_IDENTITIES_FILE" (expand-file-name age-default-identity)) (setenv "PASSAGE_IDENTITIES_FILE" (expand-file-name age-default-identity))
(setenv "PASSAGE_RECIPIENTS_FILE" (expand-file-name age-default-recipient)) (setenv "PASSAGE_RECIPIENTS_FILE" (expand-file-name age-default-recipient))
(setenv "PASSAGE_AGE" "rage") (setenv "PASSAGE_AGE" "rage")
(setenv "PASSAGE_DIR" (expand-file-name "~/ExoKortex/4-Automata/dotfiles/secrets")) (setenv "PASSAGE_DIR" (expand-file-name "secrets" dotfiles-base-path))
) )
(diff-hl-mode +1) (diff-hl-mode +1)
@@ -1101,8 +1125,9 @@ DIFF:
;; Dirvish config ;; Dirvish config
(after! (dirvish dired) (after! (dirvish dired)
(require 'async) ;; Charger l'extension rsync
(dired-async-mode 1) (require 'dirvish-rsync)
;; Display icons, file size, timestamps, etc. ;; Display icons, file size, timestamps, etc.
(setq dirvish-attributes (setq dirvish-attributes
'(nerd-icons '(nerd-icons
@@ -1115,36 +1140,42 @@ DIFF:
;; Use a header line instead of the traditional dired modeline ;; Use a header line instead of the traditional dired modeline
(setq dirvish-use-header-line t) (setq dirvish-use-header-line t)
;; Show dotfile please, ty
;; (setq dired-omit-mode nil)
;; (setq dired-listing-switches "-a")
;; Replace default dired mode globally ;; Replace default dired mode globally
(dirvish-override-dired-mode) (dirvish-override-dired-mode)
(require 'dirvish-yank) ;; Config rsync (les nouvelles variables)
(setq dirvish-rsync-args '("-ah" "--info=progress2"))
(setq dirvish-rsync-use-yank-menu t)
;; Remapper 'y' pour utiliser rsync au lieu du batch Emacs
(setq dirvish-yank-keys
'(("y" "Rsync here" dirvish-rsync)
("m" "Move here" dirvish-move)
("s" "Make symlinks here" dirvish-symlink)
("r" "Make relative symlinks here" dirvish-relative-symlink)
("h" "Make hardlinks here" dirvish-hardlink)))
(setq! dirvish-quick-access-entries (setq! dirvish-quick-access-entries
`( `(("h" "~/" "Home")
("h" "~/" "Home") ("e" "~/ExoKortex" "ExoKortex")
("k" "~/ExoKortex/2-Areas/Meta-Planning/Org/Core" "ExoKortex") ("p" "~/ExoKortex/1-Projects" "Projects")
("p" "~/ExoKortex/1-Projects" "Projects") ("a" "~/ExoKortex/2-Areas" "Areas")
("a" "~/ExoKortex/2-Areas" "Areas") ("r" "~/ExoKortex/3-Resources" "Resources")
("r" "~/ExoKortex/3-Resources" "Resources") ("i" "~/ExoKortex/4-Archives" "Archives")
("i" "~/ExoKortex/4-Archives" "Archives") ("d" "~/Downloads" "Downloads")
("d" "~/Downloads/" "Downloads") ("u" "/run/media/" "Mounted drives")
("u" "/run/media" "Mounted drives") ("g" "~/.local/share/Trash/files" "Trash")))
("t" "~/.local/share/Trash/files/" "Trash") )
))
(setq dirvish-yank-use-rsync t)
(setq dirvish-yank-rsync-args '("-ah" "--info=progress2"))
)
;; Use `p` to open the yank menu ;; Use `p` to open the yank menu
(map! :after dirvish-yank (map! :after dirvish-yank
:map dirvish-mode-map :map dirvish-mode-map
:n "p" #'dirvish-yank-menu) :n "p" #'dirvish-yank-menu)
(map! :after dirvish
:leader
:desc "Keep all" "oi" #'dirvish-dwim)
;; Enable previewing of surrounding lines in consult-ripgrep ;; Enable previewing of surrounding lines in consult-ripgrep
(setq consult-ripgrep-preview t) (setq consult-ripgrep-preview t)
@@ -1214,7 +1245,7 @@ DIFF:
(after! org-msg (after! org-msg
(setq mail-user-agent 'mu4e-user-agent) (setq mail-user-agent 'mu4e-user-agent)
(require 'org-msg) (require 'org-msg)
(setq org-msg-options "html-postamble:nil H:5 num:nil ^:{} toc:nil author:nil email:nil \\n:t" (setq org-msg-options "html-postamble:nil H:5 num:nil ^:{} p:t toc:nil author:nil email:nil \\n:t"
org-msg-startup "hidestars indent inlineimages" org-msg-startup "hidestars indent inlineimages"
org-msg-greeting-fmt "\nBonjour%s,\n\n" org-msg-greeting-fmt "\nBonjour%s,\n\n"
org-msg-greeting-name-limit 1 org-msg-greeting-name-limit 1
@@ -1361,64 +1392,10 @@ Cordialement,
(pdf-tools-install :no-query) (pdf-tools-install :no-query)
;; Hooks ;; Hooks
(add-hook 'pdf-view-mode-hook #'pdf-view-midnight-minor-mode) ;; (add-hook 'pdf-view-mode-hook #'pdf-view-midnight-minor-mode)
(add-hook 'pdf-view-mode-hook #'pdf-view-roll-minor-mode) (add-hook 'pdf-view-mode-hook #'pdf-view-roll-minor-mode)
) )
;; Like Emacs everywhere, but work in hyprland
(defun thanos/wtype-text (text)
"Process TEXT for wtype, handling newlines properly."
(let* ((has-final-newline (string-match-p "\n$" text))
(lines (split-string text "\n"))
(last-idx (1- (length lines))))
(string-join
(cl-loop for line in lines
for i from 0
collect (cond
;; Last line without final newline
((and (= i last-idx) (not has-final-newline))
(format "wtype -s 350 \"%s\""
(replace-regexp-in-string "\"" "\\\\\"" line)))
;; Any other line
(t
(format "wtype -s 350 \"%s\" && wtype -k Return"
(replace-regexp-in-string "\"" "\\\\\"" line)))))
" && ")))
(define-minor-mode thanos/type-mode
"Minor mode for inserting text via wtype."
:keymap `((,(kbd "C-c C-c") . ,(lambda () (interactive)
(call-process-shell-command
(thanos/wtype-text (buffer-string))
nil 0)
(delete-frame)))
(,(kbd "C-c C-k") . ,(lambda () (interactive)
(kill-buffer (current-buffer))))))
(defun thanos/type ()
"Launch a temporary frame with a clean buffer for typing."
(interactive)
(let ((frame (make-frame '((name . "emacs-float")
(fullscreen . 0)
(undecorated . t)
(width . 70)
(height . 20))))
(buf (get-buffer-create "emacs-float")))
(select-frame frame)
(switch-to-buffer buf)
(with-current-buffer buf
(erase-buffer)
(org-mode)
(flyspell-mode)
(thanos/type-mode)
(setq-local header-line-format
(format " %s to insert text or %s to cancel."
(propertize "C-c C-c" 'face 'help-key-binding)
(propertize "C-c C-k" 'face 'help-key-binding)))
;; Make the frame more temporary-like
(set-frame-parameter frame 'delete-before-kill-buffer t)
(set-window-dedicated-p (selected-window) t))))
;;Refile in datetree function ;;Refile in datetree function
(defun org-refile-to-datetree (&optional file) (defun org-refile-to-datetree (&optional file)
"Refile a subtree to a datetree corresponding to its timestamp. "Refile a subtree to a datetree corresponding to its timestamp.
@@ -2108,54 +2085,119 @@ Suppresses all logging, notes, and custom odometer hooks."
(when (window-live-p old-win) (when (window-live-p old-win)
(delete-window old-win))))))) (delete-window old-win)))))))
;; >=== ExoKortex System ===< ;;; ====================================================================
;;; ExoKortex Core Engine (Shared Logic)
;;; ====================================================================
(defvar gortium/org-repo-projects "~/ExoKortex/2-Areas/Meta-Planning/Org/Projects" (defvar gortium/exokortex-root "~/ExoKortex"
"Path to your main Org repository where real .org files are stored.") "The absolute root directory of your ExoKortex.")
(defvar gortium/projects-root "~/ExoKortex/1-Projects/" (defun gortium/ensure-node-structure (node-dir &optional default-todo)
"Root directory where new projects will be created.") "Ensure NODE-DIR conforms to the ExoKortex node blueprint.
Creates folders, writes text-layer filters, and handles Git injection.
Returns the absolute path to the core Org file."
(let* ((node-dir (expand-file-name node-dir))
(node-name (file-name-nondirectory (directory-file-name node-dir)))
;; Blueprint Paths
(plan-dir (expand-file-name "1-Plan" node-dir))
(assets-dir (expand-file-name "2-Assets" node-dir))
(notes-dir (expand-file-name "3-Notes" node-dir))
(outputs-dir (expand-file-name "4-Outputs" node-dir))
(org-file (expand-file-name (concat node-name ".org") plan-dir))
(gitignore-file (expand-file-name ".gitignore" node-dir))
(git-existed-p (file-exists-p (expand-file-name ".git" node-dir))))
(defun gortium/create-project (project-name) ;; 1. Build directory layers smoothly (mkdir -p)
"Create a new project with PROJECT-NAME in `gortium/projects-root`. (dolist (dir (list plan-dir assets-dir notes-dir outputs-dir))
The .org file is created in `gortium/org-repo-projects` and symlinked into the project folder." (make-directory dir t))
(interactive "sProject name: ")
(let* ((project-dir (expand-file-name project-name gortium/projects-root))
(org-file (concat project-name ".org"))
(org-real (expand-file-name org-file gortium/org-repo-projects))
(org-link (expand-file-name org-file project-dir)))
(make-directory project-dir t)
(unless (file-exists-p org-real)
(with-temp-file org-real
(insert (format "#+TITLE: %s\n#+DATE: %s\n\n" project-name (format-time-string "%Y-%m-%d")))))
(make-symbolic-link org-real org-link t)
(find-file org-link)))
(defun gortium/create-symlinked-org (file-name) ;; 2. Enforce text-only gitignore rules if absent
"Create a symlinked org FILE-NAME in current dir, real file in `gortium/org-repo-projoects`." (unless (file-exists-p gitignore-file)
(interactive "sOrg file name (without .org): ") (with-temp-file gitignore-file
(let* ((org-file (concat file-name ".org")) (insert "# Local Node Rule: Track text layers only\n*\n!.gitignore\n!1-Plan/\n!1-Plan/**\n!3-Notes/\n!3-Notes/**\n")))
(org-real (expand-file-name org-file gortium/org-repo-projects))
(org-link (expand-file-name org-file default-directory)))
(unless (file-exists-p org-real)
(with-temp-file org-real
(insert (format "#+TITLE: %s\n#+DATE: %s\n\n" file-name (format-time-string "%Y-%m-%d")))))
(make-symbolic-link org-real org-link t)
(find-file org-link)))
(defun gortium/convert-marked-org-to-symlink () ;; 3. Build index Org block if absent
"Convert all marked org files in Dirvish/Dired to symlinks in `gortium/org-repo-projects`." (unless (file-exists-p org-file)
(interactive) (with-temp-file org-file
(let ((files (dired-get-marked-files))) (insert (format "#+TITLE: %s\n#+DATE: %s\n#+CATEGORY: %s\n\n* Setup\n- [ ] %s\n"
(dolist (file-path files) node-name
(when (and (file-regular-p file-path) (format-time-string "[%Y-%m-%d %a]")
(string= (file-name-extension file-path) "org")) node-name
(let* ((file-name (file-name-nondirectory file-path)) (or default-todo "Initialize project context")))))
(org-real (expand-file-name file-name gortium/org-repo-projects)))
(unless (file-exists-p org-real) ;; 4. Unified Git Integration Loop
(rename-file file-path org-real)) (let ((default-directory node-dir))
(make-symbolic-link org-real file-path t) (if (not git-existed-p)
(message "Converted %s to symlink -> %s" file-path org-real)))))) (progn
(shell-command "git init")
(shell-command "git add .gitignore 1-Plan/ 3-Notes/")
(shell-command "git commit -m 'System: Initialize node repository'"))
(shell-command "git add .gitignore 1-Plan/ 3-Notes/")))
;; Pass the target file location back up to the caller
org-file))
;;; ====================================================================
;;; Interactive Entry Points
;;; ====================================================================
(defun gortium/create-node (category node-name)
"Create a brand new standardized PARA Node inside your ExoKortex vault."
(interactive
(list (completing-read "Category: " '("1-Projects" "2-Areas" "3-Resources"))
(read-string "Node Name: ")))
(let* ((category-dir (expand-file-name category gortium/exokortex-root))
(node-dir (expand-file-name node-name category-dir))
(org-file (gortium/ensure-node-structure node-dir "Initialize project context")))
(find-file org-file)
(message "ExoKortex Node '%s' created in %s." node-name category)))
(defun gortium/convert-to-node (node-dirs)
"Retrofit existing workspace directories into tracked ExoKortex nodes.
If folders are explicitly marked in Dirvish/Dired, it batch-processes all of them.
Otherwise, prompts for a single directory, defaulting to the item under the cursor."
(interactive
(list
(let* ((dired-elements (when (derived-mode-p 'dired-mode)
(dired-get-marked-files nil nil nil t)))
;; Dired returns (t . ("path")) if exactly ONE file is marked explicitly,
;; or a flat list if multiple are marked.
(has-explicit-marks (or (and (listp dired-elements) (> (length dired-elements) 1))
(and (consp dired-elements) (eq (car dired-elements) t))))
(marked-dirs (when has-explicit-marks
(cl-remove-if-not #'file-directory-p
(if (eq (car-safe dired-elements) t)
(cdr dired-elements)
dired-elements)))))
(if marked-dirs
marked-dirs
;; Fallback: No explicit marks found, prompt for a single target
(let* ((cursor-path (when (derived-mode-p 'dired-mode)
(dired-get-filename nil t)))
(initial-path (cond
((and cursor-path (file-directory-p cursor-path))
cursor-path)
(cursor-path
(file-name-directory cursor-path))
(t default-directory))))
(list (read-directory-name "Directory to convert: " nil initial-path t initial-path)))))))
;; Execution Block
(let ((count 0)
last-org-file)
(dolist (dir node-dirs)
(let* ((node-dir (expand-file-name dir))
(node-name (file-name-nondirectory (directory-file-name node-dir)))
(org-file (gortium/ensure-node-structure node-dir "Audit existing assets and reconcile tracking nodes")))
(setq last-org-file org-file)
(cl-incf count)))
;; Contextual UI Feedback
(if (= count 1)
(progn
(message "Directory successfully converted to ExoKortex node."))
(message "Successfully batch-converted %d directories to ExoKortex nodes!" count))))
(defun gortium/refile-to-today-daily () (defun gortium/refile-to-today-daily ()
"Refile the current subtree under the 'Journal' headline in today's daily note. "Refile the current subtree under the 'Journal' headline in today's daily note.
@@ -2215,3 +2257,83 @@ fallback to today's daily note. Ensures the daily has an Org-roam ID."
(message "Task refiled under '%s' in %s" (message "Task refiled under '%s' in %s"
headline headline
(file-name-nondirectory daily-file))))) (file-name-nondirectory daily-file)))))
(require 'calendar)
(defun gortium/org-create-datetree-range ()
"Génère une structure datetree Org entre deux dates choisies via le calendrier interactif.
Si la date de début est validée vide, utilise la date d'aujourd'hui."
(interactive)
(let* ((start-time (org-read-date nil t nil "Date de début (Entrée pour aujourd'hui) : "))
(end-time (org-read-date nil t nil "Date de fin : "))
(start-decoded (decode-time start-time))
(end-decoded (decode-time end-time))
;; Format attendu par le calendrier Emacs : (mois jour année)
(start-date (list (decoded-time-month start-decoded)
(decoded-time-day start-decoded)
(decoded-time-year start-decoded)))
(end-date (list (decoded-time-month end-decoded)
(decoded-time-day end-decoded)
(decoded-time-year end-decoded)))
(start-abs (calendar-absolute-from-gregorian start-date))
(end-abs (calendar-absolute-from-gregorian end-date)))
(if (< end-abs start-abs)
(user-error "Erreur : La date de fin doit être après la date de début ! ")
(save-excursion
(cl-loop for abs from start-abs to end-abs
do (org-datetree-find-date-create (calendar-gregorian-from-absolute abs))))
(message "Datetree généré avec succès !"))))
;; Like Emacs everywhere, but work in hyprland
(defun thanos/wtype-text (text)
"Process TEXT for wtype, handling newlines properly."
(let* ((has-final-newline (string-match-p "\n$" text))
(lines (split-string text "\n"))
(last-idx (1- (length lines))))
(string-join
(cl-loop for line in lines
for i from 0
collect (cond
;; Last line without final newline
((and (= i last-idx) (not has-final-newline))
(format "wtype -s 350 \"%s\""
(replace-regexp-in-string "\"" "\\\\\"" line)))
;; Any other line
(t
(format "wtype -s 350 \"%s\" && wtype -k Return"
(replace-regexp-in-string "\"" "\\\\\"" line)))))
" && ")))
(define-minor-mode thanos/type-mode
"Minor mode for inserting text via wtype."
:keymap `((,(kbd "C-c C-c") . ,(lambda () (interactive)
(call-process-shell-command
(thanos/wtype-text (buffer-string))
nil 0)
(delete-frame)))
(,(kbd "C-c C-k") . ,(lambda () (interactive)
(kill-buffer (current-buffer))))))
(defun thanos/type ()
"Launch a temporary frame with a clean buffer for typing."
(interactive)
(let ((frame (make-frame '((name . "emacs-float")
(fullscreen . 0)
(undecorated . t)
(width . 70)
(height . 20))))
(buf (get-buffer-create "emacs-float")))
(select-frame frame)
(switch-to-buffer buf)
(with-current-buffer buf
(erase-buffer)
(org-mode)
(flyspell-mode)
(thanos/type-mode)
(setq-local header-line-format
(format " %s to insert text or %s to cancel."
(propertize "C-c C-c" 'face 'help-key-binding)
(propertize "C-c C-k" 'face 'help-key-binding)))
;; Make the frame more temporary-like
(set-frame-parameter frame 'delete-before-kill-buffer t)
(set-window-dedicated-p (selected-window) t))))

View File

@@ -0,0 +1,211 @@
;;; init.el -*- lexical-binding: t; -*-
;; This file controls what Doom modules are enabled and what order they load
;; in. Remember to run 'doom sync' after modifying it!
;; NOTE Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's
;; documentation. There you'll find a link to Doom's Module Index where all
;; of our modules are listed, including what flags they support.
;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or
;; 'C-c c k' for non-vim users) to view its documentation. This works on
;; flags as well (those symbols that start with a plus).
;;
;; Alternatively, press 'gd' (or 'C-c c d') on a module to browse its
;; directory (for easy access to its source code).
(doom! :input
;;bidi ; (tfel ot) thgir etirw uoy gnipleh
;;chinese
;;japanese
;;layout ; auie,ctsrnm is the superior home row
:completion
;;company ; the ultimate code completion backend
(corfu +orderless) ; complete with cap(f), cape and a flying feather!
;;helm ; the *other* search engine for love and life
;;ido ; the other *other* search engine...
;;ivy ; a search engine for love and life
vertico ; the search engine of the future
:ui
;;deft ; notational velocity for Emacs
doom ; what makes DOOM look the way it does
dashboard ; a nifty splash screen for Emacs
;;doom-quit ; DOOM quit-message prompts when you quit Emacs
(emoji +unicode) ; 🙂
hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW
;;indent-guides ; highlighted indent columns
;;ligatures ; ligatures and symbols to make your code pretty again
;;minimap ; show a map of the code on the side
modeline ; snazzy, Atom-inspired modeline, plus API
;;nav-flash ; blink cursor line after big motions
;;neotree ; a project drawer, like NERDTree for vim
ophints ; highlight the region an operation acts on
(popup +defaults) ; tame sudden yet inevitable temporary windows
;;tabs ; a tab bar for Emacs
;;treemacs ; a project drawer, like neotree but cooler
;;unicode ; extended unicode support for various languages
(vc-gutter +pretty) ; vcs diff in the fringe
vi-tilde-fringe ; fringe tildes to mark beyond EOB
;;window-select ; visually switch windows
workspaces ; tab emulation, persistence & separate workspaces
zen ; distraction-free coding or writing
:editor
(evil +everywhere
+numbers); come to the dark side, we have cookies
file-templates ; auto-snippets for empty files
fold ; (nigh) universal code folding
(format +onsave) ; automated prettiness
;;god ; run Emacs commands without modifier keys
;;lispy ; vim for lisp, for people who don't like vim
multiple-cursors ; editing in many places at once
;;objed ; text object editing for the innocent
;;parinfer ; turn lisp into python, sort of
;;rotate-text ; cycle region at point between text candidates
snippets ; my elves. They type so I don't have to
;;word-wrap ; soft wrapping with language-aware indent
:emacs
(dired +dirvish +icons) ; making dired pretty [functional]
electric ; smarter, keyword-based electric-indent
eww ; the internet is gross
(ibuffer +icons) ; interactive buffer management
undo ; persistent, smarter undo for your inevitable mistakes
vc ; version-control and Emacs, sitting in a tree
:term
;;eshell ; the elisp shell that works everywhere
;;shell ; simple shell REPL for Emacs
;;term ; basic terminal emulator for Emacs
vterm ; the best terminal emulation in Emacs
:checkers
syntax ; tasing you for every semicolon you forget
(spell +flyspell) ; tasing you for misspelling mispelling
grammar ; tasing grammar mistake every you make
:tools
;;ansible
;;biblio ; Writes a PhD for you (citation needed)
;;collab ; buffers with friends
debugger ; FIXME stepping through code, to help you add bugs
;;direnv
docker
;;editorconfig ; let someone else argue about tabs vs spaces
;;ein ; tame Jupyter notebooks with emacs
(eval +overlay) ; run code, run (also, repls)
lookup ; navigate your code and its documentation
(lsp +peek) ; M-x vscode
magit ; a git porcelain for Emacs
make ; run make tasks from Emacs
;;pass ; password manager for nerds
pdf ; pdf enhancements
;;prodigy ; FIXME managing external services & code builders
;;terraform ; infrastructure as code
tmux ; an API for interacting with tmux
tree-sitter ; syntax and parsing, sitting in a tree...
;;upload ; map local to remote projects via ssh/ftp
:os
(:if (featurep :system 'macos) macos) ; improve compatibility with macOS
tty ; improve the terminal Emacs experience
:lang
;;agda ; types of types of types of types...
beancount ; mind the GAAP
(cc +lsp) ; C > C++ == 1
;;clojure ; java with a lisp
;;common-lisp ; if you've seen one lisp, you've seen them all
;;coq ; proofs-as-programs
;;crystal ; ruby at the speed of c
(csharp +lsp +tree-sitter) ; unity, .NET, and mono shenanigans
;;data ; config/data formats
;;(dart +flutter) ; paint ui and not much else
;;dhall
;;elixir ; erlang done right
;;elm ; care for a cup of TEA?
emacs-lisp ; drown in parentheses
;;erlang ; an elegant language for a more civilized age
;;ess ; emacs speaks statistics
;;factor
;;faust ; dsp, but you get to keep your soul
;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER)
;;fsharp ; ML stands for Microsoft's Language
;;fstar ; (dependent) types and (monadic) effects and Z3
;;gdscript ; the language you waited for
;;(go +lsp) ; the hipster dialect
;;(graphql +lsp) ; Give queries a REST
(haskell +lsp) ; a language that's lazier than I am
;;hy ; readability of scheme w/ speed of python
;;idris ; a language you can depend on
json ; At least it ain't XML
(java +lsp) ; the poster child for carpal tunnel syndrome
;;javascript ; all(hope(abandon(ye(who(enter(here))))))
;;julia ; a better, faster MATLAB
;;kotlin ; a better, slicker Java(Script)
latex ; writing papers in Emacs has never been so fun
;;lean ; for folks with too much to prove
ledger ; be audit you can be
lua ; one-based indices? one-based indices
(markdown ; writing docs for people to ignore
+grip
+tree-sitter)
;;nim ; python + lisp at the speed of c
(nix ; I hereby declare "nix geht mehr!"
+lsp
+tree-sitter)
;;ocaml ; an objective camel
(org ; organize your plain life in plain text
+dragndrop
+pretty
+journal
+present
+roam
+pandoc
+noter)
;;php ; perl's insecure younger brother
plantuml ; diagrams for confusing people more
;;graphviz ; diagrams for confusing yourself even more
;;purescript ; javascript, but functional
(python
+lsp
+pyright
+cython) ; beautiful is better than ugly
;;qt ; the 'cutest' gui framework ever
;;racket ; a DSL for DSLs
;;raku ; the artist formerly known as perl6
;;rest ; Emacs as a REST client
;;rst ; ReST in peace
;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"}
(rust +lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap()
;;scala ; java, but good
;;(scheme +guile) ; a fully conniving family of lisps
(sh ; she sells {ba,z,fi}sh shells on the C xor
+lsp
+powershell)
;;sml
;;solidity ; do you need a blockchain? No.
;;swift ; who asked for emoji variables?
;;terra ; Earth and Moon in alignment for performance.
;;web ; the tubes
yaml ; JSON, but readable
;;zig ; C, but simpler
:email
(mu4e +org +gmail +mbsync)
;;notmuch
;;(wanderlust +gmail)
:app
calendar
;;emms ; Multimedia system
everywhere ; *leave* Emacs!? You must be joking
irc ; how neckbeards socialize
;;(rss +org) ; emacs as an RSS reader
:config
;;literate
(default +bindings +smartparens))

View File

@@ -31,7 +31,7 @@
:ui :ui
;;deft ; notational velocity for Emacs ;;deft ; notational velocity for Emacs
doom ; what makes DOOM look the way it does doom ; what makes DOOM look the way it does
doom-dashboard ; a nifty splash screen for Emacs dashboard ; a nifty splash screen for Emacs
;;doom-quit ; DOOM quit-message prompts when you quit Emacs ;;doom-quit ; DOOM quit-message prompts when you quit Emacs
(emoji +unicode) ; 🙂 (emoji +unicode) ; 🙂
hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW
@@ -68,7 +68,7 @@
;;word-wrap ; soft wrapping with language-aware indent ;;word-wrap ; soft wrapping with language-aware indent
:emacs :emacs
(dired +dirvish + icons) ; making dired pretty [functional] (dired +dirvish +icons) ; making dired pretty [functional]
electric ; smarter, keyword-based electric-indent electric ; smarter, keyword-based electric-indent
eww ; the internet is gross eww ; the internet is gross
@@ -163,7 +163,7 @@
+pretty +pretty
+journal +journal
+present +present
+roam2 +roam
+pandoc +pandoc
+noter) +noter)
;;php ; perl's insecure younger brother ;;php ; perl's insecure younger brother

View File

@@ -135,11 +135,13 @@
(package! passage (package! passage
:recipe (:host github :repo "anticomputer/passage.el" :protocol ssh)) :recipe (:host github :repo "anticomputer/passage.el" :protocol ssh))
;; Server is down, deactivated for now
;; (package! krl-mode ;; (package! krl-mode
;; :recipe (:host nil ;; :recipe (:host nil
;; :repo "ssh://code.lazyworkhorse.net:2222/gortium/krl-mode.git" ;; :repo "ssh://code.lazyworkhorse.net:2222/gortium/krl-mode.git"
;; :files ("*.el"))) ;; :files ("*.el")))
(package! krl-mode
:recipe (:local-repo "/home/tpouplier/ExoKortex/3-Resources/krl-mode"
:files ("*.el")))
(package! auto-highlight-symbol) (package! auto-highlight-symbol)

View File

@@ -0,0 +1,10 @@
[Unit]
Description=Automated ExoKortex PARA Node Git Sweep
Documentation=https://github.com/gortium
[Service]
Type=oneshot
ExecStart=%h/.local/bin/exokortex_auto_commit.sh
[Install]
WantedBy=default.target

View File

@@ -0,0 +1,9 @@
[Unit]
Description=Run Automated ExoKortex Sweep Hourly
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target

View File

@@ -0,0 +1,29 @@
#!/usr/bin/env bash
# ==============================================================================
# PARA TARGET CONTROLS
# Comment out (#) any directory to completely deactivate it from the sweep.
# ==============================================================================
TARGETS=(
"$HOME/ExoKortex/1-Projects"
"$HOME/ExoKortex/2-Areas"
# "$HOME/ExoKortex/3-Resources"
# "$HOME/ExoKortex/4-Archives/"
)
# Protect against empty arrays if all targets get disabled
if [ ${#TARGETS[@]} -eq 0 ]; then
echo "Drop execution: No active PARA targets configured."
exit 0
fi
# Execute strict structural scanning on active paths only
find "${TARGETS[@]}" -mindepth 2 -maxdepth 2 -type d -name ".git" | while read -r gitdir; do
repo_dir=$(dirname "$gitdir")
cd "$repo_dir"
if [ -n "$(git status --porcelain)" ]; then
git add .
git commit -m "System: Automated background sweep $(date +'%Y-%m-%d %H:%M')"
fi
done

View File

@@ -24,22 +24,32 @@ $EXTERNAL_R2=DP-7
# See https://wiki.hyprland.org/Configuring/Monitors/ # See https://wiki.hyprland.org/Configuring/Monitors/
# Useful command: # Useful command:
# hyprctl monitors all # hyprctl monitors all
## Valkyrie setup ## Valkyrie setup
# monitor=eDP-1,highres,auto,2 #3200x1800,0x0,2 # monitor=eDP-1,highres,auto,2 #3200x1800,0x0,2
# monitor=HDMI-A-2,2560x1600,auto,1 #1600x0,1 #x-370,1,transform,1 # monitor=HDMI-A-2,2560x1600,auto,1 #1600x0,1 #x-370,1,transform,1
## Ingenuity setup ## Ingenuity setup
monitor=$LAPTOP, 1920x1080, 0x0, 1 monitor=$LAPTOP, 1920x1080, 0x0, 1
monitor=DP-3, 1920x1080, 1920x0, 1 # HDMI screen monitor=DP-3, 1920x1080, 1920x0, 1 # HDMI screen
# Horizontal setup # Horizontal setup
#monitor=DP-4,1920x1080,-960x-1080,1 # Left screen #monitor=DP-4,1920x1080,-960x-1080,1 # Left screen
#monitor=DP-6,1920x1080,-960x-1080,1 # Left screen #monitor=DP-6,1920x1080,-960x-1080,1 # Left screen
#monitor=DP-5,1920x1080,960x-1080,1 # Right screen #monitor=DP-5,1920x1080,960x-1080,1 # Right screen
#monitor=DP-7,1920x1080,960x-1080,1 # Right screen #monitor=DP-7,1920x1080,960x-1080,1 # Right screen
# Vertical setup # Vertical setup
monitor=$EXTERNAL_L1, 1920x1080, 0x-1080, 1, transform, 0 # Left screen # monitor=$EXTERNAL_L1, 1920x1080, 0x-1080, 1, transform, 0 # Left screen
monitor=$EXTERNAL_L2, 1920x1080,0x-1080,1,transform,0 # Left screen # monitor=$EXTERNAL_L2, 1920x1080,0x-1080,1,transform,0 # Left screen
# monitor=$EXTERNAL_R1, 1920x1080, 1920x-1480, 1, transform, 1 # Right screen
# monitor=$EXTERNAL_R2, 1920x1080,1920x-1480,1,transform,1 # Right screen
# Double Vertical setup
monitor=$EXTERNAL_L1, 1920x1080, -1080x-1480, 1, transform, 3 # Left screen
monitor=$EXTERNAL_L2, 1920x1080, -1080x-1480, 1, transform, 3 # Left screen
monitor=$EXTERNAL_R1, 1920x1080, 1920x-1480, 1, transform, 1 # Right screen monitor=$EXTERNAL_R1, 1920x1080, 1920x-1480, 1, transform, 1 # Right screen
monitor=$EXTERNAL_R2, 1920x1080,1920x-1480,1,transform,1 # Right screen monitor=$EXTERNAL_R2, 1920x1080, 1920x-1480, 1, transform, 1 # Right screen
################### ###################
### MY PROGRAMS ### ### MY PROGRAMS ###
@@ -64,20 +74,17 @@ $monitoring = kitty btop
# exec-once = $terminal # exec-once = $terminal
# exec-once = nm-applet & # exec-once = nm-applet &
exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP HYPRLAND_INSTANCE_SIGNATURE
exec = hyprshade auto exec = hyprshade auto
exec-once = udiskie exec-once = udiskie
exec-once = waybar exec-once = waybar
exec-once = swww-daemon
exec-once = swww img ~/.config/wallpapers/green_yellow_forest.jpg --outputs $LAPTOP
exec-once = swww img ~/.config/wallpapers/green_yellow_forest.jpg --outputs $EXTERNAL_L1
exec-once = swww img ~/.config/wallpapers/green_yellow_forest.jpg --outputs $EXTERNAL_L2
exec-once = swww img ~/.config/wallpapers/buck_head.jpg --outputs $EXTERNAL_R1
exec-once = swww img ~/.config/wallpapers/buck_head.jpg --outputs $EXTERNAL_R2
exec-once = swaync exec-once = swaync
exec-once = hypridle exec-once = hypridle
exec-once = hyprlock exec-once = hyprlock
exec-once = /usr/bin/emacs --daemon exec-once = /usr/bin/emacs --daemon
exec-once = dbus-update-activation-environment --systemd HYPRLAND_INSTANCE_SIGNATURE exec-once = swww-daemon
exec-once = sleep 1 && swww img ~/.config/wallpapers/green_yellow_forest.jpg --outputs $LAPTOP,$EXTERNAL_L1,$EXTERNAL_L2
exec-once = sleep 1 && swww img ~/.config/wallpapers/buck_head.jpg --outputs $EXTERNAL_R1,$EXTERNAL_R2
############################# #############################
### ENVIRONMENT VARIABLES ### ### ENVIRONMENT VARIABLES ###
@@ -210,12 +217,13 @@ device {
# See https://wiki.hyprland.org/Configuring/Keywords/ # See https://wiki.hyprland.org/Configuring/Keywords/
$mainMod = SUPER # Sets "Windows" key as main modifier $mainMod = SUPER # Sets "Windows" key as main modifier
$dotfiles = ~/ExoKortex/2-Areas/Home-Infra/4-Outputs/dotfiles
# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more # Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
bind = $mainMod, T, exec, $terminal bind = $mainMod, T, exec, $terminal
bind = $mainMod, D, killactive, bind = $mainMod, D, killactive,
bind = $mainMod SHIFT, Q, exit, bind = $mainMod SHIFT, Q, exit,
bind = $mainMod, U, exec, ~/ExoKortex/4-Automata/dotfiles/scripts/make_all.sh bind = $mainMod, U, exec, $dotfiles/scripts/make_all.sh && swww img ~/.config/wallpapers/green_yellow_forest.jpg --outputs $LAPTOP,$EXTERNAL_L1,$EXTERNAL_L2 && swww img ~/.config/wallpapers/buck_head.jpg --outputs $EXTERNAL_R1,$EXTERNAL_R2
bind = $mainMod, M, exec, $monitoring bind = $mainMod, M, exec, $monitoring
bind = $mainMod, E, exec, $editor bind = $mainMod, E, exec, $editor
bind = $mainMod, V, togglefloating, bind = $mainMod, V, togglefloating,
@@ -226,7 +234,8 @@ bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, N, movecurrentworkspacetomonitor, -1 bind = $mainMod, N, movecurrentworkspacetomonitor, -1
bind = $mainMod SHIFT, N, movecurrentworkspacetomonitor, +1 bind = $mainMod SHIFT, N, movecurrentworkspacetomonitor, +1
bind = $mainMod, X, swapwindow bind = $mainMod, X, swapwindow
bind = $mainMod, B, exec, python /home/tpouplier/ExoKortex/4-Automata/recordntrans/record_transcribe.py bind = $mainMod, B, exec, python $dotfiles/recordntrans/record_transcribe.py
bind = $mainMod, i, exec, $dotfiles/scripts/scrot-ocr.sh
# bind = $mainMod, G, exec, nerd-dictation end # bind = $mainMod, G, exec, nerd-dictation end
bind = $mainMod, A, exec, $music bind = $mainMod, A, exec, $music
bind = $mainMod, C, exec, emacsclient -n -c -e '(gortium/hermes-vterm)' bind = $mainMod, C, exec, emacsclient -n -c -e '(gortium/hermes-vterm)'

View File

@@ -1,7 +1,7 @@
source = $HOME/.cache/wal/colors-hyprland.conf source = $HOME/.cache/wal/colors-hyprland.conf
general { general {
ignore_empty_input = true # ignore_empty_input = true
} }
background { background {

View File

@@ -5,11 +5,21 @@ Wants=network-online.target
[Service] [Service]
Type=simple Type=simple
# Use Environment to explicitly set $HOME
Environment=HOME=%h Environment=HOME=%h
ExecStartPre=%h/.local/bin/rclone_mount_check.sh ExecStartPre=%h/.local/bin/rclone_mount_check.sh
ExecStart=/usr/bin/rclone mount tdnde_ftp: %h/mnt/tdnde_server --vfs-cache-mode full --vfs-cache-max-size 1G --ftp-concurrency 20 --timeout 60s --contimeout 30s --dir-cache-time 1h ExecStartPre=-/bin/fusermount -uz %h/mnt/tdnde_server
ExecStop=/bin/fusermount -u %h/mnt/tdnde_server ExecStart=/usr/bin/rclone mount tdnde_ftp: %h/mnt/tdnde_server \
--vfs-cache-mode full \
--vfs-cache-max-size 4G \
--vfs-read-chunk-size 4M \
--vfs-read-chunk-size-limit 128M \
--buffer-size 32M \
--ftp-concurrency 20 \
--timeout 300s \
--contimeout 60s \
--dir-cache-time 1h
ExecStop=/bin/fusermount -uz %h/mnt/tdnde_server
ExecStopPost=/bin/fusermount -uz %h/mnt/tdnde_server
Restart=on-failure Restart=on-failure
[Install] [Install]

View File

@@ -0,0 +1,39 @@
#!/bin/bash
# Define paths
SWEEP_SCRIPT="$HOME/.local/bin/exokortex_auto_commit.sh"
TIMER_FILE="$HOME/.config/systemd/user/exokortex_auto_commit.timer"
# Ensure the sweeper script is executable
if [ -f "$SWEEP_SCRIPT" ] && [ ! -x "$SWEEP_SCRIPT" ]; then
echo "Making the exokortex sweep script executable: $SWEEP_SCRIPT"
chmod +x "$SWEEP_SCRIPT" || { echo "Failed to make the script executable"; exit 1; }
else
echo "Sweep script already executable or doesn't exist yet."
fi
# Reload user systemd to recognize the new units
systemctl --user daemon-reload
# Enable and start the timer if the configuration file is in place
if [ -f "$TIMER_FILE" ]; then
if ! systemctl --user is-enabled --quiet exokortex_auto_commit.timer; then
echo "Enabling the exokortex_auto_commit timer."
systemctl --user enable exokortex_auto_commit.timer || { echo "Failed to enable the timer"; exit 1; }
else
echo "Exokortex timer already enabled."
fi
else
echo "Timer file does not exist at $TIMER_FILE."
exit 1
fi
# Start the timer if it is not currently ticking
if systemctl --user is-active --quiet exokortex_auto_commit.timer; then
echo "exokortex_auto_commit timer is already running."
else
echo "Starting the exokortex_auto_commit timer."
systemctl --user start exokortex_auto_commit.timer || echo "Warning: ExoKortex timer failed to start, skipping..."
fi
echo "Post-installation steps for exokortex completed."

View File

@@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
cd ~/ExoKortex/4-Automata/dotfiles/ cd ~/ExoKortex/2-Areas/Home-Infra/4-Outputs/dotfiles
make all make all
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
notify-send "Dotfiles" "Configuration reloaded successfully!" notify-send "Dotfiles" "Configuration reloaded successfully!"

View File

@@ -33,7 +33,7 @@ if systemctl --user is-active --quiet rclone_ftp_mount.service; then
echo "Rclone service is already running." echo "Rclone service is already running."
else else
echo "Starting the rclone service." echo "Starting the rclone service."
systemctl --user start rclone_ftp_mount.service || { echo "Failed to start the service"; exit 1; } systemctl --user start rclone_ftp_mount.service || echo "Warning: Rclone service failed to start, skipping..."
fi fi
echo "Post-installation steps for rclone completed successfully." echo "Post-installation steps for rclone completed."

View File

@@ -67,6 +67,9 @@ function yy() {
rm -f -- "$tmp" rm -f -- "$tmp"
} }
# dua
alias dua="dua i"
# Nvim # Nvim
export LANG=en_CA.UTF-8 export LANG=en_CA.UTF-8
export LC_ALL=en_CA.UTF-8 export LC_ALL=en_CA.UTF-8
@@ -76,7 +79,7 @@ export EDITOR="nvim"
source <(fzf --zsh) source <(fzf --zsh)
# Capitalization fixing in tab completion # Capitalization fixing in tab completion
autoload -Uz compinit && compinit autoload -Uz compinit && compinit -u
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'
# Bat # Bat
@@ -165,3 +168,6 @@ export HYPRSHOT_DIR="Images"
# Created by `pipx` on 2026-03-03 16:51:31 # Created by `pipx` on 2026-03-03 16:51:31
export PATH="$PATH:/home/tpouplier/.local/bin" export PATH="$PATH:/home/tpouplier/.local/bin"
# autosuggestions
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh