diff options
-rw-r--r-- | .emacs.d/.gitignore | 2 | ||||
-rw-r--r-- | .emacs.d/early-init.el | 7 | ||||
-rw-r--r-- | .emacs.d/lisp/init-clojure.el | 15 | ||||
-rw-r--r-- | .emacs.d/lisp/init-completion.el | 21 | ||||
-rw-r--r-- | .emacs.d/lisp/init-crux.el | 1 | ||||
-rw-r--r-- | .emacs.d/lisp/init-editor.el | 10 | ||||
-rw-r--r-- | .emacs.d/lisp/init-minibuffer.el | 22 | ||||
-rw-r--r-- | .emacs.d/lisp/init-packages.el | 12 | ||||
-rw-r--r-- | .emacs.d/lisp/init-smartparens.el | 2 | ||||
-rw-r--r-- | .emacs.d/lisp/init-sql.el | 1 | ||||
-rw-r--r-- | .emacs.d/themes/non-modo-theme.el | 2 | ||||
-rw-r--r-- | nix-conf/home/includes/common.nix | 8 | ||||
-rw-r--r-- | nix-conf/home/includes/darwin.nix | 64 | ||||
-rw-r--r-- | nix-conf/home/includes/linux-server.nix | 2 | ||||
-rw-r--r-- | nix-conf/home/includes/secrets.yaml | 13 | ||||
-rw-r--r-- | nix-conf/home/includes/zsh.nix | 343 | ||||
-rw-r--r-- | nix-conf/home/otm.nix | 37 | ||||
-rw-r--r-- | nix-conf/machines/djmuk1/configuration.nix | 6 | ||||
-rw-r--r-- | nix-conf/machines/djmuk2/configuration.nix | 6 | ||||
-rw-r--r-- | nix-conf/machines/edrahil/configuration.nix | 6 | ||||
-rw-r--r-- | nix-conf/machines/egalmoth/configuration.nix | 6 |
21 files changed, 296 insertions, 290 deletions
diff --git a/.emacs.d/.gitignore b/.emacs.d/.gitignore index 11659a7..2ce66c1 100644 --- a/.emacs.d/.gitignore +++ b/.emacs.d/.gitignore @@ -36,7 +36,7 @@ site-lisp straight !straight/versions elpaca -elpa +elpaca.lock eln-cache forge-database.sqlite sql diff --git a/.emacs.d/early-init.el b/.emacs.d/early-init.el index 1dd7a01..e55becc 100644 --- a/.emacs.d/early-init.el +++ b/.emacs.d/early-init.el @@ -2,6 +2,10 @@ ;;; Commentary: ;;; Code: + +(when (eq system-type 'darwin) + (setq frame-resize-pixelwise t)) + (setq gc-cons-threshold most-positive-fixnum gc-cons-percentage 0.6) @@ -21,7 +25,8 @@ (setq frame-inhibit-implied-resize t) -(unless (eq system-type 'darwin) +(if (eq system-type 'darwin) + (add-to-list 'default-frame-alist '(undecorated-round . t)) (toggle-frame-maximized) (add-to-list 'default-frame-alist '(fullscreen . maximized))) diff --git a/.emacs.d/lisp/init-clojure.el b/.emacs.d/lisp/init-clojure.el index ebdda6c..7673565 100644 --- a/.emacs.d/lisp/init-clojure.el +++ b/.emacs.d/lisp/init-clojure.el @@ -102,12 +102,12 @@ :init ;; Always show more of the path in clj buffer names. ;; Using setq-local in clojure-mode-hook is not enough, as it runs too late - (defun clj-uniquify-get-proposed-name (orig base dirname &optional depth original-dirname) + (defun clj-uniquify-get-proposed-name (orig base dirname &optional depth) (when (and (> (length base) 4) (string= ".clj" (substring base -4)) (not (string= "project.clj" base))) (setq-local uniquify-min-dir-content 3)) - (funcall orig base dirname depth original-dirname)) + (funcall orig base dirname depth)) (advice-add 'uniquify-get-proposed-name :around 'clj-uniquify-get-proposed-name) :hook (clojure-mode . clojure-mode-hook-fn)) @@ -152,10 +152,10 @@ (cider-jack-in params)) (defun load-debug-namespaces () (interactive) - (cider-interactive-eval "(require 'snitch.core)" nil nil (cider--nrepl-pr-request-map)) - (cider-interactive-eval "(require 'miracle.save)" nil nil (cider--nrepl-pr-request-map)) - (cider-interactive-eval "(require 'sc.api)" nil nil (cider--nrepl-pr-request-map)) - (cider-interactive-eval "(require '[debux.cs.core :refer [dbg dbgn dbgt]])" nil nil (cider--nrepl-pr-request-map))) + (cider-interactive-eval "(require 'snitch.core)" nil nil (cider--nrepl-pr-request-plist)) + (cider-interactive-eval "(require 'miracle.save)" nil nil (cider--nrepl-pr-request-plist)) + (cider-interactive-eval "(require 'sc.api)" nil nil (cider--nrepl-pr-request-plist)) + (cider-interactive-eval "(require '[debux.cs.core :refer [dbg dbgn dbgt]])" nil nil (cider--nrepl-pr-request-plist))) (defun cider-toggle-boolean () (interactive) (let ((opposite (pcase (cider-symbol-at-point) @@ -203,6 +203,7 @@ (unbind-key "C-c C-l" cider-mode-map) (unbind-key "C-c C-b" cider-mode-map) (unbind-key "C-c C-b" cider-repl-mode-map) + (unbind-key "M-." cider-repl-mode-map) (defun fix-duplicate-windows () "When all windows are the same, delete all of them except the current one." @@ -214,6 +215,8 @@ (:map cider-mode-map ("C-c M-l" . cider-load-file) ("C-c M-b" . cider-interrupt) + ("C-c C-j C-;" . cider-pprint-eval-last-sexp-to-comment) + ("C-c C-M-p" . cider-pprint-eval-last-sexp-to-repl) ("C-x M-i e" . cider-inspect-last-sexp) ("C-x M-i f" . cider-inspect-defun-at-point) ("C-x M-i l" . cider-inspect-last-result) diff --git a/.emacs.d/lisp/init-completion.el b/.emacs.d/lisp/init-completion.el index 36a5680..16eca6b 100644 --- a/.emacs.d/lisp/init-completion.el +++ b/.emacs.d/lisp/init-completion.el @@ -14,17 +14,10 @@ (list '+elpaca-unload-dabbrev 'elpaca--activate-package))) (use-feature dabbrev - ;; Load newer version until 30.1 is released - ;; https://mail.gnu.org/archive/html/bug-gnu-emacs/2024-05/msg00422.html - ;; Relies on the fact that the emacs repo is checked out to elpaca/repos/project - :ensure `(dabbrev :build ,(+elpaca-dabbrev-build-steps) :repo "~/.emacs.d/elpaca/repos/project/" :files ("lisp/dabbrev.el")) :custom (dabbrev-case-distinction nil) (dabbrev-case-fold-search t) - (dabbrev-case-replace nil) - ;; TODO remove this after 30.1 - :bind - ("C-M-/" . hippie-expand)) + (dabbrev-case-replace nil)) (use-package mono-complete :config @@ -83,10 +76,6 @@ (orderless-component-separator 'orderless-escapable-split-on-space) (completion-styles '(orderless partial-completion basic)) (completion-category-defaults nil) - (completion-category-overrides '((file (styles partial-completion orderless)) - (command (styles +orderless-with-strict-leading-initialism)) - (variable (styles +orderless-with-strict-leading-initialism)) - (symbol (styles +orderless-with-strict-leading-initialism)))) (orderless-matching-styles '(orderless-literal orderless-regexp orderless-strict-initialism)) (orderless-style-dispatchers (list #'+orderless-consult-dispatch #'orderless-affix-dispatch)) @@ -127,6 +116,7 @@ candidate, in that order, at the beginning of words, with no words in between, beginning with the first word." (orderless-strict-initialism component t)) + ;; Replace initialism (,) with strict-leading-initialism, and also add strict initialism (setf (alist-get ?, orderless-affix-dispatch-alist) #'orderless-strict-leading-initialism) (add-to-list 'orderless-affix-dispatch-alist '(?` . orderless-strict-initialism) t) @@ -156,7 +146,12 @@ no words in between, beginning with the first word." ;; Based on https://github.com/minad/consult/wiki#minads-orderless-configuration (orderless-define-completion-style +orderless-with-strict-leading-initialism - (orderless-matching-styles '(orderless-literal orderless-regexp orderless-strict-leading-initialism)))) + (orderless-matching-styles '(orderless-literal orderless-regexp orderless-strict-leading-initialism))) + + (setopt completion-category-overrides '((file (styles partial-completion orderless)) + (command (styles +orderless-with-strict-leading-initialism)) + (variable (styles +orderless-with-strict-leading-initialism)) + (symbol (styles +orderless-with-strict-leading-initialism))))) ;; code completion - corfu (use-package corfu diff --git a/.emacs.d/lisp/init-crux.el b/.emacs.d/lisp/init-crux.el index 9d00417..5f7b836 100644 --- a/.emacs.d/lisp/init-crux.el +++ b/.emacs.d/lisp/init-crux.el @@ -15,6 +15,7 @@ ("C-^" . crux-top-join-line) ("C-<backspace>" . crux-kill-line-backwards) ([remap kill-whole-line] . crux-kill-whole-line) + ([remap keyboard-quit] . crux-keyboard-quit-dwim) ;; TODO don't need all of these ("C-<return>" . crux-smart-open-line) ("S-<return>" . crux-smart-open-line) diff --git a/.emacs.d/lisp/init-editor.el b/.emacs.d/lisp/init-editor.el index a985c99..fc575c4 100644 --- a/.emacs.d/lisp/init-editor.el +++ b/.emacs.d/lisp/init-editor.el @@ -169,8 +169,6 @@ (defun +elpaca-unload-xref (e) (and (featurep 'xref) (unload-feature 'xref t)) - ;; Make sure xref-find-definitions doesn't override this embark binding (unless https://github.com/oantolin/embark/issues/732 can be fixed) - (bind-key "M-." 'embark-dwim) ;; Make sure these aren't overwritten (setq xref-search-program 'ripgrep xref-show-xrefs-function #'consult-xref @@ -221,9 +219,7 @@ With a prefix argument, moves up `current-prefix-arg' sexps first." (add-to-list 'xref-prompt-for-identifier 'xref-find-references-other-frame t) :bind ("C-c q" . xref-find-references-current-defun) - ("C-c C-M-." . xref-find-definitions-current-list-function) - ;; Make sure xref-find-definitions doesn't override this embark binding (unless https://github.com/oantolin/embark/issues/732 can be fixed) - ("M-." . embark-dwim)) + ("C-c C-M-." . xref-find-definitions-current-list-function)) (use-package ws-butler :diminish @@ -313,5 +309,9 @@ With a prefix argument, moves up `current-prefix-arg' sexps first." ("x" . cider-eval-region) ("r" . cider-insert-region-in-repl))) +(use-package repeat-fu + :bind ("M-+" . repeat-fu-execute) + :hook ((prog-mode text-mode) . repeat-fu-mode)) + (provide 'init-editor) ;;; init-editor.el ends here diff --git a/.emacs.d/lisp/init-minibuffer.el b/.emacs.d/lisp/init-minibuffer.el index c4e3245..118f730 100644 --- a/.emacs.d/lisp/init-minibuffer.el +++ b/.emacs.d/lisp/init-minibuffer.el @@ -82,18 +82,11 @@ (eq 'file (vertico--metadata-get 'category))) (add-to-history minibuffer-history-variable (minibuffer-contents)))) - ;; https://github.com/minad/vertico/wiki#customize-sorting-based-on-completion-category - (defun sort-directories-first (files) - ;; Still sort by history position, length and alphabetically - (setq files (vertico-sort-history-length-alpha files)) - ;; But then move directories first - (nconc (seq-filter (lambda (x) (string-suffix-p "/" x)) files) - (seq-remove (lambda (x) (string-suffix-p "/" x)) files))) (defun toggle-sort-directories-first () (interactive) - (if (eq vertico-sort-function 'sort-directories-first) + (if (eq vertico-sort-function 'vertico-sort-directories-first) (set (make-local-variable 'vertico-sort-function) 'vertico-sort-history-length-alpha) - (set (make-local-variable 'vertico-sort-function) 'sort-directories-first)) + (set (make-local-variable 'vertico-sort-function) 'vertico-sort-directories-first)) (setq vertico--input t) (vertico--update)) @@ -143,7 +136,8 @@ '((execute-extended-command (+vertico-transform-functions . +vertico-highlight-enabled-mode)))) (setq vertico-multiform-categories - '((file (+vertico-transform-functions . +vertico-highlight-directory)) + '((file (+vertico-transform-functions . +vertico-highlight-directory) + (:keymap . vertico-directory-map)) (imenu grid))) :bind (:map vertico-multiform-map ("M-H" . vertico-multiform-buffer-grid))) @@ -535,8 +529,9 @@ The symbol at point is added to the future history." (use-package embark :bind (("C-." . embark-act) - ("M-." . embark-dwim) ([remap xref-find-definitions-current-list-function] . embark-dwim-beginning-of-list) + ([remap xref-find-definitions] . embark-dwim) + ([remap xref-find-definitions-other-window] . embark-dwim-other-window) ("C-c C-o" . embark-export) ("C-h b" . embark-bindings) ("C-h B" . describe-bindings) @@ -551,6 +546,11 @@ The symbol at point is added to the future history." :custom (prefix-help-command 'embark-prefix-help-command) :config + (defun embark-dwim-other-window () + "Like `embark-dwim' but switch to the other window." + (interactive) + (other-window-prefix) + (embark-dwim)) (defun embark-dwim-beginning-of-list () "`embark-dwim' at the beginning of the current list. With a prefix argument, moves up `current-prefix-arg' sexps first." diff --git a/.emacs.d/lisp/init-packages.el b/.emacs.d/lisp/init-packages.el index bd813c0..55b3eb5 100644 --- a/.emacs.d/lisp/init-packages.el +++ b/.emacs.d/lisp/init-packages.el @@ -3,7 +3,7 @@ ;;; Code: ;; Elpaca installer block -(defvar elpaca-installer-version 0.10) +(defvar elpaca-installer-version 0.11) (defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory)) (defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory)) (defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory)) @@ -38,7 +38,7 @@ (unless (require 'elpaca-autoloads nil t) (require 'elpaca) (elpaca-generate-autoloads "elpaca" repo) - (load "./elpaca-autoloads"))) + (let ((load-source-file-function nil)) (load "./elpaca-autoloads")))) (add-hook 'after-init-hook #'elpaca-process-queues) (elpaca `(,@elpaca-order)) ;; End of elpaca installer block @@ -164,14 +164,6 @@ using this command." (when package-features (message "Reloaded: %s" (mapconcat #'symbol-name package-features " ")))))) -(define-advice elpaca-merge (:after (id &optional _fetch _interactive) elpaca-merge-reload) - "Automically reload packages after they have been updated." - (cl-letf (((symbol-function 'yes-or-no-p) (cl-constantly t))) - (when (not (or (memq id elpaca-ignored-dependencies) - ;; TODO why aren't xref and project already in the list? - (memq id '(xref project perspective elpaca)))) - (+elpaca-reload-package id)))) - ;; https://github.com/radian-software/radian/blob/e3aad124c8e0cc870ed09da8b3a4905d01e49769/emacs/radian.el#L352 (defmacro use-feature (name &rest args) "Like `use-package', but without elpaca integration. diff --git a/.emacs.d/lisp/init-smartparens.el b/.emacs.d/lisp/init-smartparens.el index bd532d6..69a70ca 100644 --- a/.emacs.d/lisp/init-smartparens.el +++ b/.emacs.d/lisp/init-smartparens.el @@ -10,8 +10,6 @@ paredit-close-curly)) (use-package smartparens - ;; Use this fork until it is merged - :ensure (:host github :repo "thatismatt/smartparens") :diminish :custom (sp-base-key-bindings 'paredit) diff --git a/.emacs.d/lisp/init-sql.el b/.emacs.d/lisp/init-sql.el index d1a3fe3..cf3a89a 100644 --- a/.emacs.d/lisp/init-sql.el +++ b/.emacs.d/lisp/init-sql.el @@ -49,6 +49,7 @@ :bind ("C-c c C-u" . sqlup-capitalize-keywords-in-region)) (use-package sql-indent + :diminish sqlind-minor-mode :commands sqlind-minor-mode) (use-package sqlformat diff --git a/.emacs.d/themes/non-modo-theme.el b/.emacs.d/themes/non-modo-theme.el index c5f4422..4ef4a54 100644 --- a/.emacs.d/themes/non-modo-theme.el +++ b/.emacs.d/themes/non-modo-theme.el @@ -1479,7 +1479,7 @@ `(shortdoc-section (())) ; remove the default's variable-pitch style ;;;;; show-paren-mode `(show-paren-match ((,class :inherit bold :background "#7416b5" :foreground "#ffffff" :underline t))) - `(show-paren-match-expression ((,class :background "#221044"))) + `(show-paren-match-expression ((,class :background "grey12"))) `(show-paren-mismatch ((,class :background "#a4202a" :foreground "#ffffff"))) ;;;;; shr `(shr-abbreviation ((,class :foreground "#9d9def" :underline (:color "#5f6fff" :style wave)))) diff --git a/nix-conf/home/includes/common.nix b/nix-conf/home/includes/common.nix index c60374b..e12558c 100644 --- a/nix-conf/home/includes/common.nix +++ b/nix-conf/home/includes/common.nix @@ -53,6 +53,7 @@ in bandwhich bottom broot + comma curl diff-so-fancy difftastic @@ -85,6 +86,7 @@ in nvd pass procs + pstree rage ripgrep rlwrap @@ -99,12 +101,12 @@ in uni unzip w3m + xan yq zip zstd unstable.nixfmt-rfc-style - unstable.wcurl ]; programs.bat = { @@ -129,8 +131,7 @@ in programs.eza = { enable = true; git = true; - # TODO remove when 24.11 is released - icons = if builtins.substring 0 5 lib.version == "24.05" then true else "auto"; + icons = "auto"; enableBashIntegration = false; enableZshIntegration = false; enableFishIntegration = false; @@ -364,6 +365,7 @@ in programs.lsd = { enable = true; + enableZshIntegration = false; # don't set aliases settings = { indicators = true; #layout = "oneline"; diff --git a/nix-conf/home/includes/darwin.nix b/nix-conf/home/includes/darwin.nix index 69ebb4b..e85f3f9 100644 --- a/nix-conf/home/includes/darwin.nix +++ b/nix-conf/home/includes/darwin.nix @@ -26,6 +26,63 @@ let --prefix PYTHONPATH : $out/${pkgs.mopidyPackages.python.sitePackages} ''; }; + + # https://github.com/NixOS/nixpkgs/issues/395169 + patched-pkgs = pkgs.extend ( + _final: prev: { + ld64 = prev.ld64.overrideAttrs (old: { + patches = old.patches ++ [ ./Dedupe-RPATH-entries.patch ]; + }); + libuv = prev.libuv.overrideAttrs (old: { + doCheck = false; + }); + dbus = prev.dbus.overrideAttrs (old: { + doCheck = false; + }); + python313 = prev.python313.override { + packageOverrides = self: super: { + execnet = super.execnet.overridePythonAttrs (old: { + doCheck = false; + }); + pytest-xdist = super.pytest-xdist.overridePythonAttrs (old: { + doCheck = false; + }); + requests = super.requests.overridePythonAttrs (old: { + doCheck = false; + }); + sphinx = super.sphinx.overridePythonAttrs (old: { + doCheck = false; + }); + }; + }; + } + ); + + # Use the patches from emacs-plus + emacs-plus = (patched-pkgs.emacs30-pgtk.overrideAttrs (old: { + patches = + (old.patches or []) + ++ [ + (pkgs.fetchpatch { + url = "https://raw.githubusercontent.com/d12frosted/homebrew-emacs-plus/master/patches/emacs-30/fix-window-role.patch"; + sha256 = "0c41rgpi19vr9ai740g09lka3nkjk48ppqyqdnncjrkfgvm2710z"; + }) + (pkgs.fetchpatch { + url = "https://raw.githubusercontent.com/d12frosted/homebrew-emacs-plus/master/patches/emacs-30/round-undecorated-frame.patch"; + sha256 = "uYIxNTyfbprx5mCqMNFVrBcLeo+8e21qmBE3lpcnd+4="; + }) + (pkgs.fetchpatch { + url = "https://raw.githubusercontent.com/d12frosted/homebrew-emacs-plus/master/patches/emacs-30/system-appearance.patch"; + sha256 = "3QLq91AQ6E921/W9nfDjdOUWR8YVsqBAT/W9c1woqAw="; + }) + ]; + })).override{ withNativeCompilation = true; }; + + emacs-plus-with-packages = (pkgs.emacsPackagesFor emacs-plus).emacsWithPackages (ps: [ + ps.vterm + ps.multi-vterm + ]); + in { imports = [ ./dev-common.nix ]; @@ -37,10 +94,7 @@ in coreutils curl diffutils - ((emacsPackagesFor emacs29-macport).emacsWithPackages (ps: [ - ps.vterm - ps.multi-vterm - ])) + emacs-plus-with-packages findutils gh gh-dash @@ -85,4 +139,6 @@ in }) ]; + # TODO is this a good idea? + #programs.zsh.shellAliases = { emacs = "${emacs-plus-with-packages}/Applications/Emacs.app/Contents/MacOS/Emacs"; }; } diff --git a/nix-conf/home/includes/linux-server.nix b/nix-conf/home/includes/linux-server.nix index 950878c..62233f0 100644 --- a/nix-conf/home/includes/linux-server.nix +++ b/nix-conf/home/includes/linux-server.nix @@ -15,7 +15,7 @@ services.gpg-agent = { enable = true; - pinentryPackage = pkgs.pinentry-curses; + pinentry.package = pkgs.pinentry-curses; defaultCacheTtl = 34560000; maxCacheTtl = 34560000; }; diff --git a/nix-conf/home/includes/secrets.yaml b/nix-conf/home/includes/secrets.yaml index fc5fc5e..2fc9d8c 100644 --- a/nix-conf/home/includes/secrets.yaml +++ b/nix-conf/home/includes/secrets.yaml @@ -1,14 +1,10 @@ ssh_config: oci: ENC[AES256_GCM,data:l1GZ6mszgDhGztWmMdkNY2wRGfLIOGfHou7m0p8NkvaZZ3oKhblyu9C2Y2uEZArC8aCysxmU0QDfeIxDAzBdszUY,iv:HD8xdaiF9s0XZAuHNjAQfEtMgKaM0R12FCv5rTq19+Y=,tag:bfa48iOXhASXc+JhmYy/EQ==,type:str] - otm: ENC[AES256_GCM,data:vaFDVPzQ+o+frrPsYFegT7jsix9Sq4kVeh/TcAhHkEvCPbgMQdQ8zOsbjn8LWkXocD6Ymkmv4BkPTaH4rgaSutNl/ICaJJnV7DIcnuk5rwqxe0guy89xGMYJzZQXi0KfI87kFA0Ooo2zWB5t3l6j4AHiCGvrVwiLivKG,iv:arVwuMcU3Q1MzOD2YiKlzMMYnNHNWOuPCSdOpt6204o=,tag:sMT3THbiHdf29dGtwHvwkA==,type:str] + otm: "" git_email_config: default: ENC[AES256_GCM,data:ADmbGuV+E5wvGdbdC12BDi2TvHeoIRWjerKxnvDV7dENCxFyy+3P01IyCA==,iv:Nik4YiC8WhWmAnM7g1ER5HU0pg88l9uFiHQNtou5jas=,tag:RtK0XKKcHHR39p3mSl5YRw==,type:str] otm: ENC[AES256_GCM,data:dFrxmxFRU5MThUSdqWuL3ZmBCJfMUVYWQTnWQF25Cnn6lMflau5vHNEFZZDZxyFBk7A=,iv:EOv1xgxXuN3LuiO1eorazgQHBkWY9GKUjFBaYnfkLRI=,tag:Mg6SwdQSGjtlR5iiOU/q7g==,type:str] sops: - kms: [] - gcp_kms: [] - azure_kv: [] - hc_vault: [] age: - recipient: age1w7kjp0qdgfyg9cyj5w4qc4fc9qz3w65xw2veazesfgdenqrd3ucqsc5ejv enc: | @@ -19,8 +15,7 @@ sops: cjlWWTNQR3lLLzBqTHhld05VblFJdHcKihceil9ge+IKG2GZcLpGWUncvRvmyJ7w YiWtb/ApF4T27wsmmFyLSnG8OWkLCKzaeU4QOVIGYQcfzzcQD5nUGg== -----END AGE ENCRYPTED FILE----- - lastmodified: "2025-01-24T07:28:26Z" - mac: ENC[AES256_GCM,data:7hIZK7NQmSorue7Uw8DCzlazMwC3WA4LYSvwk79T0farGWJDm7lw/Omp7BczK+AdaFtfmbaCV5aj5Bou/kfYW84Eku63lEpzKgQ6crpGonwYAP7KAA6FCux11BJxtWdD0Yd101tRmMLM03BemSBH6IjqqQW5pDCKM/DR0EXxn3Y=,iv:F4+mub+ixO89v0jLp6altRlD6w8SxggmPInf/uwN15Y=,tag:+MZXhk5ykIsVZV4+wDINsg==,type:str] - pgp: [] + lastmodified: "2025-04-29T13:45:42Z" + mac: ENC[AES256_GCM,data:Z4jJujUvl8jmJQbquV9NeczVZF17HI01sDpUoSSS7cM89WUOZzAOcT3zxR4hzyCfq4je++YkBPPFl4hcqbuVyBu8zCxY4z9673sFSLYrUA8THVeLYjMOTo0Hu0tIy8vy+uZZcAuRFaXyS+GrQHAdSSm4zVkwLG9R1nod+ys6LvQ=,iv:WfubcgFSY94cyfrlAlND6CQudoISuGL5fBhm9E3O4Q4=,tag:IeKYzou3EDwGyA23FGHtdA==,type:str] unencrypted_suffix: _unencrypted - version: 3.9.3 + version: 3.10.2 diff --git a/nix-conf/home/includes/zsh.nix b/nix-conf/home/includes/zsh.nix index 982675a..650f559 100644 --- a/nix-conf/home/includes/zsh.nix +++ b/nix-conf/home/includes/zsh.nix @@ -54,10 +54,13 @@ in programs.zsh = { enable = true; enableCompletion = true; - # TODO: put strategy here after 24.11 is released autosuggestion = { enable = true; highlight = "fg=#808080"; + strategy = [ + "history" + "completion" + ]; }; defaultKeymap = "emacs"; history = { @@ -85,6 +88,7 @@ in mv = "mv -iv"; mkdir = "mkdir -v"; cat = "bat -p"; + c = "bat -p"; l = "eza"; la = "eza -a"; lg = "eza -G"; @@ -92,6 +96,10 @@ in ll = "\\eza --icons --git --colour --long --group-directories-first --classify"; lla = "ll -a"; t = "eza --tree"; + p = "lsd"; + pa = "lsd -a"; + pll = "lsd -l"; + pla = "lsd -la"; pp = ''pushbullet push "Pixel" link "''${1}" "''${1}"''; @@ -135,198 +143,197 @@ in localVariables = { PER_DIRECTORY_HISTORY_TOGGLE = "^\\\\"; # ^\\ is ^# HISTORY_START_WITH_GLOBAL = true; - - # TODO move to programs.zsh.autosuggestion.strategy when 24.11 is released - ZSH_AUTOSUGGEST_STRATEGY = [ - "history" - "completion" - ]; - LESS = "-iRXF"; }; - initExtraFirst = '' - [[ $TERM == "tramp" ]] && unsetopt zle && PS1='$ ' && return - ''; - initExtra = '' - # Based on prezto tmux plugin - if [[ -z "$TMUX" && -z "$EMACS" && -z "$VIM" && -z "$INSIDE_EMACS" && (-z "$SSH_TTY" || -n "$TMUX_AUTO_ATTACH") ]]; then - tmux start-server + initContent = lib.mkMerge [ + (lib.mkBefore '' + [[ $TERM == "tramp" ]] && unsetopt zle && PS1='$ ' && return + '') + '' + # Based on prezto tmux plugin + if [[ -z "$TMUX" && -z "$EMACS" && -z "$VIM" && -z "$INSIDE_EMACS" && (-z "$SSH_TTY" || -n "$TMUX_AUTO_ATTACH") ]]; then + tmux start-server + + if ! tmux has-session 2> /dev/null; then + tmux new-session -d -s "0" \; set-option -t "0" destroy-unattached off &> /dev/null + fi - if ! tmux has-session 2> /dev/null; then - tmux new-session -d -s "0" \; set-option -t "0" destroy-unattached off &> /dev/null + if [[ -n "$SSH_TTY" ]]; then + exec tmux -u attach-session + else + exec tmux -u attach-session -d + fi fi - if [[ -n "$SSH_TTY" ]]; then - exec tmux -u attach-session - else - exec tmux -u attach-session -d - fi - fi - - autopair-init - enable-fzf-tab - - # make home and end work - [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line - [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line - - # disable sort when completing `git checkout` - zstyle ':completion:*:git-checkout:*' sort false - # set descriptions format to enable group support - zstyle ':completion:*:descriptions' format '[%d]' - # Allow tab to expand aliases - zstyle ':completion:*' completer _expand_alias _complete _ignored - # set list-colors to enable filename colorizing - #zstyle ':completion:*' list-colors ''${(s.:.)LS_COLORS} - # preview directory's content with eza when completing cd - zstyle ':fzf-tab:complete:cd:*' fzf-preview 'eza -1 --color=always $realpath' - # switch group using `,` and `.` - zstyle ':fzf-tab:*' switch-group ',' '.' - - # functions modified from https://www.josean.com/posts/7-amazing-cli-tools - _fzf_compgen_path() { - fd --hidden --exclude .git --exclude node_modules . "$1" - } - _fzf_compgen_dir() { - fd --type=d --hidden --exclude .git --exclude node_modules . "$1" - } - _fzf_comprun() { - local command=$1 - shift - - case "$command" in - cd) fzf --preview 'eza --tree --color=always {} | head -200' "$@" ;; - export|unset) fzf --preview "eval 'echo $'{}" "$@" ;; - ssh) fzf --preview 'dig {}' "$@" ;; - *) fzf --preview "${show_file_or_dir_preview}" "$@" ;; - esac - } - - set -o noclobber - - # disable flow control (so that fzf-git.sh's ^g^s can work) - stty -ixon - - # These functions are called as follows, after using ea (using vip as an example): - # vip # edits the first result from ea (roughly equivalent to vi `ea p 1`) - # vip <n> # edits the nth result from ea (vi `ea p <n>`) - # vip <n> foo # if the nth result from ea is a directory, edit foo in that directory (vi `ea p <n>`/foo) - # Will add +<line-number>, where the line number is available - function _vip () { - local cmd=(''${=1}) # zsh only, not portable; something like CMD=($(echo $1)) is more portable but is ugly - local idx=''${2:-1} - local base_path=$(ea p $idx) - local line=$(ea p $idx "{line}") - local ea_format="'{path}'" - - if [ -z "$base_path" ]; then - echo "No file path found for index $2" - return 1 - fi + autopair-init + enable-fzf-tab + + # make home and end work + [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line + [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line + + # disable sort when completing `git checkout` + zstyle ':completion:*:git-checkout:*' sort false + # set descriptions format to enable group support + zstyle ':completion:*:descriptions' format '[%d]' + # Allow tab to expand aliases + zstyle ':completion:*' completer _expand_alias _complete _ignored + # set list-colors to enable filename colorizing + #zstyle ':completion:*' list-colors ''${(s.:.)LS_COLORS} + # preview directory's content with eza when completing cd + zstyle ':fzf-tab:complete:cd:*' fzf-preview 'eza -1 --color=always $realpath' + # switch group using `,` and `.` + zstyle ':fzf-tab:*' switch-group ',' '.' + + # functions modified from https://www.josean.com/posts/7-amazing-cli-tools + _fzf_compgen_path() { + fd --hidden --exclude .git --exclude node_modules . "$1" + } + _fzf_compgen_dir() { + fd --type=d --hidden --exclude .git --exclude node_modules . "$1" + } + _fzf_comprun() { + local command=$1 + shift + + case "$command" in + cd) fzf --preview 'eza --tree --color=always {} | head -200' "$@" ;; + export|unset) fzf --preview "eval 'echo $'{}" "$@" ;; + ssh) fzf --preview 'dig {}' "$@" ;; + *) fzf --preview "${show_file_or_dir_preview}" "$@" ;; + esac + } - if [ $# -gt 2 -a ! -d "$base_path" ]; then - echo "$base_path is not a directory" - return 2 - fi + set -o noclobber + + # disable flow control (so that fzf-git.sh's ^g^s can work) + stty -ixon + + # These functions are called as follows, after using ea (using vip as an example): + # vip # edits the first result from ea (roughly equivalent to vi `ea p 1`) + # vip <n> # edits the nth result from ea (vi `ea p <n>`) + # vip <n> foo # if the nth result from ea is a directory, edit foo in that directory (vi `ea p <n>`/foo) + # Will add +<line-number>, where the line number is available + function _vip () { + local cmd=(''${=1}) # zsh only, not portable; something like CMD=($(echo $1)) is more portable but is ugly + local idx=''${2:-1} + local base_path=$(ea p $idx) + local line=$(ea p $idx "{line}") + local ea_format="'{path}'" + + if [ -z "$base_path" ]; then + echo "No file path found for index $2" + return 1 + fi - if [ $# -lt 3 -a $line -ne 1 ]; then - ea_format+=" +{line}" - fi + if [ $# -gt 2 -a ! -d "$base_path" ]; then + echo "$base_path is not a directory" + return 2 + fi - eval $(ea p $idx "$cmd ''${ea_format}$3") - } + if [ $# -lt 3 -a $line -ne 1 ]; then + ea_format+=" +{line}" + fi - function vip () { - _vip $EDITOR ''${@} - } - function bp () { - _vip bat ''${@} - } - function bpp () { - # this will be split into an array in _vip - CMD="bat -p" - _vip $CMD ''${@} - } + eval $(ea p $idx "$cmd ''${ea_format}$3") + } - function generate () { gopass generate -s -p $1 $((RANDOM % 14 + 45)) } - function fcd { cd $(fd -L --max-depth=''${1:-4} --type=d 2>/dev/null | fzf-tmux) } + function vip () { + _vip $EDITOR ''${@} + } + function bp () { + _vip bat ''${@} + } + function bpp () { + # this will be split into an array in _vip + CMD="bat -p" + _vip $CMD ''${@} + } - fif() { - if [ ! "$#" -gt 0 ]; then - echo "usage: fif <SEARCH_TERM>" - return 1; - fi - rg --files-with-matches --no-messages "$1" | fzf $FZF_PREVIEW_WINDOW --preview "rg --ignore-case --pretty --context 10 '$1' {}" - } + function ecd () { + cd $(ea p ''${1:-1}) + } - fe() { - IFS=$'\n' files=($(fzf-tmux --query="$1" --multi --select-1 --exit-0)) - [[ -n "$files" ]] && ''${EDITOR:-vim} "''${files[@]}" - } + function generate () { gopass generate -s -p $1 $((RANDOM % 14 + 45)) } + function fcd { cd $(fd -L --max-depth=''${1:-4} --type=d 2>/dev/null | fzf-tmux) } - # TODO is there a way to do this in shellAliases - alias ..="cd .." - alias ...="cd ../.." - alias -- -="cd -" - - .,() { - local declare dirs=() - get_parent_dirs() { - if [[ -d "''${1}" ]]; then dirs+=("$1"); else return; fi - if [[ "''${1}" == '/' ]]; then - for _dir in "''${dirs[@]}"; do echo $_dir; done - else - get_parent_dirs $(dirname "$1") + fif() { + if [ ! "$#" -gt 0 ]; then + echo "usage: fif <SEARCH_TERM>" + return 1; fi + rg --files-with-matches --no-messages "$1" | fzf $FZF_PREVIEW_WINDOW --preview "rg --ignore-case --pretty --context 10 '$1' {}" } - local DIR=$(get_parent_dirs $(realpath "$PWD/..") | fzf-tmux) - cd "$DIR" - } - # From omz - function mkcd () { - mkdir -p $@ && cd ''${@:$#} - } + fe() { + IFS=$'\n' files=($(fzf-tmux --query="$1" --multi --select-1 --exit-0)) + [[ -n "$files" ]] && ''${EDITOR:-vim} "''${files[@]}" + } - tre () { command tre "$@" -e && source "/tmp/tre_aliases_$USER" 2>/dev/null; } + # TODO is there a way to do this in shellAliases + alias ..="cd .." + alias ...="cd ../.." + alias -- -="cd -" + + .,() { + local declare dirs=() + get_parent_dirs() { + if [[ -d "''${1}" ]]; then dirs+=("$1"); else return; fi + if [[ "''${1}" == '/' ]]; then + for _dir in "''${dirs[@]}"; do echo $_dir; done + else + get_parent_dirs $(dirname "$1") + fi + } + local DIR=$(get_parent_dirs $(realpath "$PWD/..") | fzf-tmux) + cd "$DIR" + } - function gcd () { - if [ $# -eq 0 ] ; then - echo "Number of days must be specified" >&2 - return 1 - fi - if ! [[ $1 =~ '^[0-9]+$' ]] ; then - echo "Number of days must be a number" >&2 - return 2 - fi + # From omz + function mkcd () { + mkdir -p $@ && cd ''${@:$#} + } - if [ $1 -eq 0 ] ; then - GC_ARGS=(-d) - else - GC_ARGS=(--delete-older-than ''${1}d) - fi + tre () { command tre "$@" -e && source "/tmp/tre_aliases_$USER" 2>/dev/null; } - DOAS=$(command -v doas) + function gcd () { + if [ $# -eq 0 ] ; then + echo "Number of days must be specified" >&2 + return 1 + fi + if ! [[ $1 =~ '^[0-9]+$' ]] ; then + echo "Number of days must be a number" >&2 + return 2 + fi - # Run as the current user (as well as root) to clean up hm generations - nix-collect-garbage ''${GC_ARGS[@]} - if [ -n $DOAS ] ; then - $DOAS nix-collect-garbage ''${GC_ARGS[@]} - fi + if [ $1 -eq 0 ] ; then + GC_ARGS=(-d) + else + GC_ARGS=(--delete-older-than ''${1}d) + fi - df -h - date - } + DOAS=$(command -v doas) - function checkout-pr () { - git fetch ''${2:-upstream} pull/''${1}/head:pr-''${1} - git switch pr-''${1} - } + # Run as the current user (as well as root) to clean up hm generations + nix-collect-garbage ''${GC_ARGS[@]} + if [ -n $DOAS ] ; then + $DOAS nix-collect-garbage ''${GC_ARGS[@]} + fi - [[ ! -f ~/.zsh.local ]] || source ~/.zsh.local + df -h + date + } - [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh - ''; + function checkout-pr () { + git fetch ''${2:-upstream} pull/''${1}/head:pr-''${1} + git switch pr-''${1} + } + + [[ ! -f ~/.zsh.local ]] || source ~/.zsh.local + + [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh + '' + ]; plugins = with pkgs; [ { diff --git a/nix-conf/home/otm.nix b/nix-conf/home/otm.nix index ea6bd21..2055780 100644 --- a/nix-conf/home/otm.nix +++ b/nix-conf/home/otm.nix @@ -115,32 +115,6 @@ let zscaler-lein = pkgs.leiningen.override { jdk = zscaler-jdk; }; zscaler-clojure = pkgs.clojure.override { jdk = zscaler-jdk; }; - m = pkgs.mosh.overrideAttrs(old: { - postInstall = - old.postInstall + '' - ln -s $out/bin/mosh $out/bin/m - ln -s $out/bin/mosh-client $out/bin/mc - ''; - }); - - p = pkgs.writeShellScriptBin "p" '' - m --client=${m}/bin/mc pi - ''; - - s1 = pkgs.writeShellScriptBin "sync1" '' - scp ~/.emacs.d/lisp/*.el djm:dotfiles/.emacs.d/lisp/ - ''; - s2 = pkgs.writeShellScriptBin "sync2" '' - scp ~/dotfiles/nix-conf/home/otm.nix djm:dotfiles/nix-conf/home/ - ''; - s3 = pkgs.writeShellScriptBin "sync3" '' - scp ~/dotfiles/nix-conf/home/includes/*.{nix,yaml} djm:dotfiles/nix-conf/home/includes/ - ''; - - toggle = pkgs.writeShellScriptBin "remote-toggle" '' - tmux send-keys -t 0:0 C-b p - ''; - in { imports = [ ./includes/darwin.nix ]; @@ -171,17 +145,12 @@ in notify_success = ''( osascript -e 'display notification "The command finished" with title "Success"' && afplay /System/Library/Sounds/Ping.aiff && say done )''; notify_failure = ''( osascript -e 'display notification "The command failed" with title "Failure"' && afplay /System/Library/Sounds/Sosumi.aiff && say failed )''; notify = "notify_success || notify_failure"; + ltn = "lein test && notify"; + yb = "aws codeartifact login --tool npm --repository otm-js --domain otm --domain-owner 103567893073 --region eu-west-1 --profile aws_otm_dev_developers && yarn && yarn build && notify"; auth = "auth2aws login -r aws_otm_dev_developers,aws_otm_prd_developers && osascript -e 'tell app \"iTerm\" to activate'"; - yarn_build = "aws codeartifact login --tool npm --repository otm-js --domain otm --domain-owner 103567893073 --region eu-west-1 --profile aws_otm_dev_developers && yarn && yarn build && notify"; }; home.packages = with pkgs; [ - m - p - s1 - s2 - s3 - toggle zscaler-clojure zscaler-lein ]; @@ -193,8 +162,6 @@ in "certs/internal-ca.pem".text = internal-cert; "certs/staging-internal-ca.pem".text = internal-staging-cert; ".docker/certs.d/zcaler-cert.pem".source = zscaler-cert-file; - - ".skhdrc".text = "play : remote-toggle"; ".wgetrc".text = "ca_certificate=${full-cert-file}"; }; diff --git a/nix-conf/machines/djmuk1/configuration.nix b/nix-conf/machines/djmuk1/configuration.nix index 30343b8..7405e9a 100644 --- a/nix-conf/machines/djmuk1/configuration.nix +++ b/nix-conf/machines/djmuk1/configuration.nix @@ -29,11 +29,7 @@ services.sshguard.enable = true; services.oidentd.enable = true; - services.locate = { - enable = true; - package = pkgs.plocate; - localuser = null; - }; + services.locate.enable = true; users.users.djm = { isNormalUser = true; diff --git a/nix-conf/machines/djmuk2/configuration.nix b/nix-conf/machines/djmuk2/configuration.nix index f65ddcd..0b31a01 100644 --- a/nix-conf/machines/djmuk2/configuration.nix +++ b/nix-conf/machines/djmuk2/configuration.nix @@ -30,11 +30,7 @@ services.sshguard.enable = true; services.oidentd.enable = true; - services.locate = { - enable = true; - package = pkgs.plocate; - localuser = null; - }; + services.locate.enable = true; # Emulate nix-sops. Technically an anti-pattern, but this isn't a real secret, and this has to be embedded here, as we cannot set a file path to read it from. # Populate/update with: diff --git a/nix-conf/machines/edrahil/configuration.nix b/nix-conf/machines/edrahil/configuration.nix index dc5d667..a1bc8e3 100644 --- a/nix-conf/machines/edrahil/configuration.nix +++ b/nix-conf/machines/edrahil/configuration.nix @@ -49,11 +49,7 @@ services.sshguard.enable = true; services.oidentd.enable = true; - services.locate = { - enable = true; - package = pkgs.plocate; - localuser = null; - }; + services.locate.enable = true; services.restic = { backups = { diff --git a/nix-conf/machines/egalmoth/configuration.nix b/nix-conf/machines/egalmoth/configuration.nix index c300cfe..e47cd45 100644 --- a/nix-conf/machines/egalmoth/configuration.nix +++ b/nix-conf/machines/egalmoth/configuration.nix @@ -159,11 +159,7 @@ in ]; }; - services.locate = { - enable = true; - package = pkgs.plocate; - localuser = null; - }; + services.locate.enable = true; environment.systemPackages = with pkgs; [ acpi |