From e2193dbd535a12816259ebc1ace13ccbcc7c21eb Mon Sep 17 00:00:00 2001 From: Madeleine Sydney Date: Thu, 20 Feb 2025 15:45:20 -0700 Subject: [PATCH] feat(emacs): Fill some search-related stubs --- README.org | 23 ++++++++ lib/syd-search.el | 49 +++++++++++++++-- .../.cpcache/2654189551.basis | 1 + .../ldap-nginx-plumber/.cpcache/2654189551.cp | 1 + .../.cpcache/2654189551.main | 4 ++ scripts/ldap-nginx-plumber/.gitignore | 10 ++++ scripts/ldap-nginx-plumber/result | 1 + users/crumb/programs/emacs/lib/syd-file.el | 31 +++++++---- users/crumb/programs/emacs/lib/syd-project.el | 25 ++++++++- users/crumb/programs/emacs/lib/syd-search.el | 55 +++++++++++++++++++ users/crumb/programs/emacs/lib/syd-text.el | 12 ++++ .../programs/emacs/modules/syd-keybinds.el | 16 ++++-- .../programs/emacs/modules/syd-projects.el | 25 ++++++++- 13 files changed, 227 insertions(+), 26 deletions(-) create mode 100644 scripts/ldap-nginx-plumber/.cpcache/2654189551.basis create mode 100644 scripts/ldap-nginx-plumber/.cpcache/2654189551.cp create mode 100644 scripts/ldap-nginx-plumber/.cpcache/2654189551.main create mode 100644 scripts/ldap-nginx-plumber/.gitignore create mode 120000 scripts/ldap-nginx-plumber/result create mode 100644 users/crumb/programs/emacs/lib/syd-search.el diff --git a/README.org b/README.org index 22cc895..518797f 100755 --- a/README.org +++ b/README.org @@ -643,6 +643,29 @@ Run various checks on the system. List persistent files per user, and show their mount strategy. +- Show info about ~sydnix.impermanence.cache~ values. Extend that option to have "description" and "consequences" fields, which are shown to users before clearing them. e.g. + + #+begin_src nix + { + sydnix.impermanence.cache.directories.".local/share/emacs/cache" = { + description = "Root of all caches for Emacs and Emacs packages."; + consequences = [ + "All known projects will be forgotten" + "All trusted .dir-locals.el files and values will be forgotten" + ]; + }; + } + #+end_src + + #+begin_example + $ sydnix cache clear + Recursively remove `~/.local/share/emacs/cache'? + - All known projects will be forgotten + - All trusted .dir-locals.el files and values will be forgotten +[y/n] +«more caches…» + #+end_example + * References Following is a subset of the many places I've learnt from. Most important of all are Doom Emacs and Faye's Wishsys. diff --git a/lib/syd-search.el b/lib/syd-search.el index 21d5917..851c173 100755 --- a/lib/syd-search.el +++ b/lib/syd-search.el @@ -19,17 +19,56 @@ ;; ;;; Code: -(syd-define-stub - syd/search-buffer - "Conduct a text search on the current buffer. +(cl-defun syd-search-region (beg end &key initial) + (save-restriction + (narrow-to-region beg end) + (consult-line initial))) + +(defun syd-search--escape-regexp (str) + (require 'syd-text) + (replace-regexp-in-string " " "\\\\ " + (syd-pcre-quote str))) + +(defun syd-search-buffer (buffer) + "Conduct a text search on BUFFER. If a selection is active and multi-line, perform a search restricted to that region. If a selection is active and not multi-line, use the selection as the initial -input and search the whole buffer for it. +input and search the whole buffer for it." + (interactive (list (current-buffer))) + (save-restriction + (let* ((beg (region-beginning)) + (end (region-end)) + (multiline-p (/= (line-number-at-pos beg) + (line-number-at-pos end)))) + (if (and beg end (region-active-p)) + (progn (deactivate-mark) + (if multiline-p + (syd-search-region beg end) + ;; Treat as a single pattern, not several + ;; space-separated patterns. + (consult-line (syd-search--escape-regexp + (buffer-substring-no-properties beg end))))) + (consult-line))))) + +;;;###autoload +(defun syd-search-directory (dir) + (interactive (list (read-directory-name + "Search directory: " + default-directory nil t))) + (cond ((executable-find "rg") + (consult-ripgrep dir)) + ((executable-find "grep") + (message "Couldn't find ripgrep; using grep") + (consult-grep dir)))) + +;;;###autoload +(defun syd-search-current-directory () + (interactive) + (syd-search-directory default-directory)) -See `+default/search-buffer'.") (provide 'syd-search) ;;; syd-search.el ends here diff --git a/scripts/ldap-nginx-plumber/.cpcache/2654189551.basis b/scripts/ldap-nginx-plumber/.cpcache/2654189551.basis new file mode 100644 index 0000000..b4af03f --- /dev/null +++ b/scripts/ldap-nginx-plumber/.cpcache/2654189551.basis @@ -0,0 +1 @@ +{:classpath {"/home/crumb/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar" {:lib-name org.clojure/core.specs.alpha}, "src" {:path-key :paths}, "/home/crumb/.m2/repository/http-kit/http-kit/2.8.0/http-kit-2.8.0.jar" {:lib-name http-kit/http-kit}, "/home/crumb/.m2/repository/org/babashka/cli/0.8.62/cli-0.8.62.jar" {:lib-name org.babashka/cli}, "/home/crumb/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar" {:lib-name org.clojure/spec.alpha}, "/home/crumb/.m2/repository/org/clojars/pntblnk/clj-ldap/0.0.17/clj-ldap-0.0.17.jar" {:lib-name org.clojars.pntblnk/clj-ldap}, "/home/crumb/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar" {:lib-name org.clojure/clojure}, "/home/crumb/.m2/repository/cider/cider-nrepl/0.52.0/cider-nrepl-0.52.0.jar" {:lib-name cider/cider-nrepl}, "/home/crumb/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar" {:lib-name nrepl/nrepl}, "/home/crumb/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar" {:lib-name mx.cider/logjam}, "/home/crumb/.m2/repository/cider/orchard/0.30.0/orchard-0.30.0.jar" {:lib-name cider/orchard}, "/home/crumb/.m2/repository/com/unboundid/unboundid-ldapsdk/5.1.1/unboundid-ldapsdk-5.1.1.jar" {:lib-name com.unboundid/unboundid-ldapsdk}}, :basis-config {:project "deps.edn", :user "/home/crumb/.config/clojure/deps.edn", :extra {:deps {nrepl/nrepl {:mvn/version "1.3.1"}, cider/cider-nrepl {:mvn/version "0.52.0"}}, :aliases {:cider/nrepl {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[cider.nrepl/cider-middleware]"]}}}, :args nil, :aliases [:cider/nrepl]}, :mvn/repos {"central" {:url "https://repo1.maven.org/maven2/"}, "clojars" {:url "https://repo.clojars.org/"}}, :argmap {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[cider.nrepl/cider-middleware]"]}, :paths ["src"], :classpath-roots ["src" "/home/crumb/.m2/repository/cider/cider-nrepl/0.52.0/cider-nrepl-0.52.0.jar" "/home/crumb/.m2/repository/http-kit/http-kit/2.8.0/http-kit-2.8.0.jar" "/home/crumb/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar" "/home/crumb/.m2/repository/org/babashka/cli/0.8.62/cli-0.8.62.jar" "/home/crumb/.m2/repository/org/clojars/pntblnk/clj-ldap/0.0.17/clj-ldap-0.0.17.jar" "/home/crumb/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar" "/home/crumb/.m2/repository/cider/orchard/0.30.0/orchard-0.30.0.jar" "/home/crumb/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar" "/home/crumb/.m2/repository/com/unboundid/unboundid-ldapsdk/5.1.1/unboundid-ldapsdk-5.1.1.jar" "/home/crumb/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar" "/home/crumb/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar"], :libs {org.clojure/clojure {:mvn/version "1.12.0", :deps/manifest :mvn, :parents #{[]}, :paths ["/home/crumb/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar"]}, org.clojure/core.specs.alpha {:mvn/version "0.4.74", :deps/manifest :mvn, :dependents [org.clojure/clojure], :parents #{[org.clojure/clojure]}, :paths ["/home/crumb/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar"]}, org.clojars.pntblnk/clj-ldap {:mvn/version "0.0.17", :deps/manifest :mvn, :parents #{[]}, :paths ["/home/crumb/.m2/repository/org/clojars/pntblnk/clj-ldap/0.0.17/clj-ldap-0.0.17.jar"]}, org.clojure/spec.alpha {:mvn/version "0.5.238", :deps/manifest :mvn, :dependents [org.clojure/clojure], :parents #{[org.clojure/clojure]}, :paths ["/home/crumb/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar"]}, mx.cider/logjam {:mvn/version "0.3.0", :exclusions #{org.clojure/clojure}, :deps/manifest :mvn, :dependents [cider/cider-nrepl], :parents #{[cider/cider-nrepl]}, :paths ["/home/crumb/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar"]}, cider/orchard {:mvn/version "0.30.0", :exclusions #{org.clojure/clojure}, :deps/manifest :mvn, :dependents [cider/cider-nrepl], :parents #{[cider/cider-nrepl]}, :paths ["/home/crumb/.m2/repository/cider/orchard/0.30.0/orchard-0.30.0.jar"]}, org.babashka/cli {:mvn/version "0.8.62", :deps/manifest :mvn, :parents #{[]}, :paths ["/home/crumb/.m2/repository/org/babashka/cli/0.8.62/cli-0.8.62.jar"]}, cider/cider-nrepl {:mvn/version "0.52.0", :deps/manifest :mvn, :parents #{[]}, :paths ["/home/crumb/.m2/repository/cider/cider-nrepl/0.52.0/cider-nrepl-0.52.0.jar"]}, nrepl/nrepl {:mvn/version "1.3.1", :deps/manifest :mvn, :parents #{[]}, :paths ["/home/crumb/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar"]}, com.unboundid/unboundid-ldapsdk {:mvn/version "5.1.1", :deps/manifest :mvn, :dependents [org.clojars.pntblnk/clj-ldap], :parents #{[org.clojars.pntblnk/clj-ldap]}, :paths ["/home/crumb/.m2/repository/com/unboundid/unboundid-ldapsdk/5.1.1/unboundid-ldapsdk-5.1.1.jar"]}, http-kit/http-kit {:mvn/version "2.8.0", :deps/manifest :mvn, :parents #{[]}, :paths ["/home/crumb/.m2/repository/http-kit/http-kit/2.8.0/http-kit-2.8.0.jar"]}}, :aliases {:deps {:replace-paths [], :replace-deps {org.clojure/tools.deps.cli {:mvn/version "0.11.78"}}, :ns-default clojure.tools.deps.cli.api, :ns-aliases {help clojure.tools.deps.cli.help}}, :test {:extra-paths ["test"]}, :cider {:extra-deps {cider/cider-nrepl {:mvn/version "0.50.2"}}, :main-opts ["-m" "nrepl.cmdline" "--middleware" "[cider.nrepl/cider-middleware]"]}, :run {:main-opts ["-m" "ldap-nginx-plumber.main"]}, :cider/nrepl {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[cider.nrepl/cider-middleware]"]}}, :deps {org.clojure/clojure {:mvn/version "1.12.0"}, org.babashka/cli {:mvn/version "0.8.62"}, http-kit/http-kit {:mvn/version "2.8.0"}, org.clojars.pntblnk/clj-ldap {:mvn/version "0.0.17"}, nrepl/nrepl {:mvn/version "1.3.1"}, cider/cider-nrepl {:mvn/version "0.52.0"}}} \ No newline at end of file diff --git a/scripts/ldap-nginx-plumber/.cpcache/2654189551.cp b/scripts/ldap-nginx-plumber/.cpcache/2654189551.cp new file mode 100644 index 0000000..190bed2 --- /dev/null +++ b/scripts/ldap-nginx-plumber/.cpcache/2654189551.cp @@ -0,0 +1 @@ +src:/home/crumb/.m2/repository/cider/cider-nrepl/0.52.0/cider-nrepl-0.52.0.jar:/home/crumb/.m2/repository/http-kit/http-kit/2.8.0/http-kit-2.8.0.jar:/home/crumb/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar:/home/crumb/.m2/repository/org/babashka/cli/0.8.62/cli-0.8.62.jar:/home/crumb/.m2/repository/org/clojars/pntblnk/clj-ldap/0.0.17/clj-ldap-0.0.17.jar:/home/crumb/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar:/home/crumb/.m2/repository/cider/orchard/0.30.0/orchard-0.30.0.jar:/home/crumb/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar:/home/crumb/.m2/repository/com/unboundid/unboundid-ldapsdk/5.1.1/unboundid-ldapsdk-5.1.1.jar:/home/crumb/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar:/home/crumb/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar \ No newline at end of file diff --git a/scripts/ldap-nginx-plumber/.cpcache/2654189551.main b/scripts/ldap-nginx-plumber/.cpcache/2654189551.main new file mode 100644 index 0000000..7af4242 --- /dev/null +++ b/scripts/ldap-nginx-plumber/.cpcache/2654189551.main @@ -0,0 +1,4 @@ +-m +nrepl.cmdline +--middleware +[cider.nrepl/cider-middleware] diff --git a/scripts/ldap-nginx-plumber/.gitignore b/scripts/ldap-nginx-plumber/.gitignore new file mode 100644 index 0000000..1fcb19e --- /dev/null +++ b/scripts/ldap-nginx-plumber/.gitignore @@ -0,0 +1,10 @@ +result +.nrepl +.nrepl-port +.cpcache/ +.cache/ +.lsp/ +.clj-kondo +.cpcache +.lsp +.nrepl diff --git a/scripts/ldap-nginx-plumber/result b/scripts/ldap-nginx-plumber/result new file mode 120000 index 0000000..fe95f38 --- /dev/null +++ b/scripts/ldap-nginx-plumber/result @@ -0,0 +1 @@ +/nix/store/4ir60qbhfgrf1r9xa1dnig13x4clhir0-ldap-nginx-plumber-1.0.0 \ No newline at end of file diff --git a/users/crumb/programs/emacs/lib/syd-file.el b/users/crumb/programs/emacs/lib/syd-file.el index 775c84f..1de683d 100644 --- a/users/crumb/programs/emacs/lib/syd-file.el +++ b/users/crumb/programs/emacs/lib/syd-file.el @@ -63,15 +63,13 @@ If FORCE-P, delete without confirmation." :desc "Move current file. See `doom/move-this-file'." :interactive t) -(syd-define-stub - syd/find-file-under-emacs-user-directory - :desc "Find under `emacs-user-directory'. See `doom/find-file-in-private-config'." - :interactive t) - -(syd-define-stub - syd/find-file-under-here - :desc "Find under CWD. See `+default/find-file-under-here'." - :interactive t) +(defun syd-find-file-in (root) + (interactive (list (read-directory-name + "Find file in: " default-directory nil t))) + ;; HACK: To avoid reimplementation, we pretend `root' is a project and + ;; delegate the work to project.el. + (syd-with-project-root root + (project-find-file))) (syd-define-stub syd/yank-buffer-path @@ -81,11 +79,21 @@ If FORCE-P, delete without confirmation." (defun syd/find-file-in-emacs-user-directory () (interactive) (unless (file-directory-p user-emacs-directory) - (user-error "`emacs-user-directory' doesn't exist! (%s)" - (abbreviate-file-name emacs-user-directory))) + (user-error "`user-emacs-directory' doesn't exist! (%s)" + (abbreviate-file-name user-emacs-directory))) (let ((default-directory user-emacs-directory)) (call-interactively #'find-file))) +(defun syd-switch-to-emacs-user-directory () + "Switch project to `user-emacs-directory' via `project-switch-project'." + (interactive) + (require 'syd-project) + (if (file-directory-p user-emacs-directory) + (syd-with-project-root user-emacs-directory + (project-switch-project user-emacs-directory)) + (user-error "`user-emacs-directory' (%s) does not exist or is not a directory!" + (abbreviate-file-name user-emacs-directory)))) + (syd-define-stub syd/open-this-file-as-root :desc "Open current file as root. See `doom/sudo-this-file'." @@ -137,6 +145,7 @@ If FORCE-P, delete without confirmation." base-file conflict-file))) +;;;###autoload (defun syd-split-tramp-file-name (file-name) "Split FILE-NAME into (TRAMP-PREFIX . LOCAL-NAME). Returns (nil . FILE-NAME) if FILE-NAME has no TRAMP prefix." diff --git a/users/crumb/programs/emacs/lib/syd-project.el b/users/crumb/programs/emacs/lib/syd-project.el index 8712e05..f3db052 100644 --- a/users/crumb/programs/emacs/lib/syd-project.el +++ b/users/crumb/programs/emacs/lib/syd-project.el @@ -8,9 +8,32 @@ (when-let* ((project (project-current nil dir))) (project-root project))) -(defun syd-cd-project () +(defun syd-project-cd () "Change the working directory to the root of the current project." (cd (syd-project-root))) +(define-obsolete-function-alias 'syd-cd-project 'syd-project-cd + "2025-02-20") + +(defmacro syd-with-project-root (root &rest body) + "Execute BODY with ROOT recognised as what project.el calls a \"transient +project\"." + (declare (indent defun)) + (let ((root* (gensym "root")) + (forget-after-p (gensym "forget-after-p"))) + `(let* ((,root* ,root) + (,forget-after-p + (not (member ,root* (project-known-project-roots))))) + (let ((project-find-functions (lambda (_) (cons 'transient ,root*)))) + ,@body) + (when ,forget-after-p + (project-forget-project ,root*))))) + +(defun syd-project-search () + (interactive) + (require 'syd-file) + ;; TODO: Prompt for path project root is not found. + (syd-search-directory (syd-project-root))) + (provide 'syd-project) ;;; syd-project.el ends here diff --git a/users/crumb/programs/emacs/lib/syd-search.el b/users/crumb/programs/emacs/lib/syd-search.el new file mode 100644 index 0000000..4fec9ab --- /dev/null +++ b/users/crumb/programs/emacs/lib/syd-search.el @@ -0,0 +1,55 @@ +;;; syd-search.el -*- lexical-binding: t; -*- + +(cl-defun syd-search-region (beg end &key initial) + (save-restriction + (narrow-to-region beg end) + (consult-line initial))) + +(defun syd-search--escape-regexp (str) + (require 'syd-text) + (replace-regexp-in-string " " "\\\\ " + (syd-pcre-quote str))) + +(defun syd-search-buffer (buffer) + "Conduct a text search on BUFFER. + +If a selection is active and multi-line, perform a search restricted to that +region. + +If a selection is active and not multi-line, use the selection as the initial +input and search the whole buffer for it." + (interactive (list (current-buffer))) + (save-restriction + (let* ((beg (region-beginning)) + (end (region-end)) + (multiline-p (/= (line-number-at-pos beg) + (line-number-at-pos end)))) + (if (and beg end (region-active-p)) + (progn (deactivate-mark) + (if multiline-p + (syd-search-region beg end) + ;; Treat as a single pattern, not several + ;; space-separated patterns. + (consult-line (syd-search--escape-regexp + (buffer-substring-no-properties beg end))))) + (consult-line))))) + +;;;###autoload +(defun syd-search-directory (dir) + (interactive (list (read-directory-name + "Search directory: " + default-directory nil t))) + (cond ((executable-find "rg") + (consult-ripgrep dir)) + ((executable-find "grep") + (message "Couldn't find ripgrep; using grep") + (consult-grep dir)))) + +;;;###autoload +(defun syd-search-current-directory () + (interactive) + (syd-search-directory default-directory)) + + +(provide 'syd-search) +;;; syd-search.el ends here diff --git a/users/crumb/programs/emacs/lib/syd-text.el b/users/crumb/programs/emacs/lib/syd-text.el index d28df2e..8514966 100644 --- a/users/crumb/programs/emacs/lib/syd-text.el +++ b/users/crumb/programs/emacs/lib/syd-text.el @@ -120,4 +120,16 @@ in some cases." (interactive "P") (syd-evil-paste t arg register yank-handler)) +;;;###autoload +(defun syd-pcre-quote (str) + "Like `reqexp-quote', but for PCREs." + (let ((special '(?. ?^ ?$ ?* ?+ ?? ?{ ?\\ ?\[ ?\| ?\()) + (quoted nil)) + (mapc (lambda (c) + (when (memq c special) + (push ?\\ quoted)) + (push c quoted)) + str) + (concat (nreverse quoted)))) + (provide 'syd-text) diff --git a/users/crumb/programs/emacs/modules/syd-keybinds.el b/users/crumb/programs/emacs/modules/syd-keybinds.el index b64a0f1..6dea72b 100755 --- a/users/crumb/programs/emacs/modules/syd-keybinds.el +++ b/users/crumb/programs/emacs/modules/syd-keybinds.el @@ -23,10 +23,12 @@ "r" `("Revert buffer" . ,#'revert-buffer)) ;; Search + (require 'syd-search) (general-def :prefix-map 'syd-leader-search-map "i" `("IMenu" . ,#'consult-imenu) - "b" `("Search buffer" . ,#'syd/search-buffer)) + "b" `("Search buffer" . ,#'syd-search-buffer) + "d" `("Search directory" . ,#'syd-search-directory)) ;; File (require 'syd-file) @@ -35,9 +37,8 @@ "D" `("Delete file" . ,#'syd/delete-this-file) "R" `("Move file" . ,#'syd/move-this-file) "C" `("Copy file" . ,#'syd/copy-this-file) - ;; "F" `("Find file under here" . ,#'syd/find-file-under-here) - ;; "p" `("Find under Emacs config" . ,#'syd/find-file-under-emacs-user-directory) - "P" `("Browse Emacs config" . ,#'syd/find-file-in-emacs-user-directory) + "F" `("Find file in" . ,#'syd-find-file-in) + "P" `("Browse Emacs config" . ,#'syd-switch-to-emacs-user-directory) "u" `("Find file as root" . ,#'syd/find-file-as-root) "U" `("Open this file as root" . ,#'syd/open-this-file-as-root) "y" `("Yank buffer path" . ,#'syd/yank-buffer-path) @@ -78,7 +79,8 @@ ;; Project (general-def :prefix-map 'syd-leader-project-map - "C" `("Compile project" . ,#'project-compile)) + "C" `("Compile project" . ,#'project-compile) + "." `("Browse project from root" . ,#'project-root-find-file)) (general-def :prefix-map 'syd-leader-help-package-map @@ -140,7 +142,9 @@ "s" `("Search" . ,syd-leader-search-map) "h" `("Help" . ,help-map) "n" `("Notes" . ,syd-leader-notes-map) - "i" `("Insert" . ,syd-leader-insert-map))) + "i" `("Insert" . ,syd-leader-insert-map) + "," `("Switch buffer in project" . ,#'consult-project-buffer) + "<" `("Switch buffer" . ,#'consult-buffer))) (syd-keybinds-initialise) diff --git a/users/crumb/programs/emacs/modules/syd-projects.el b/users/crumb/programs/emacs/modules/syd-projects.el index 10775b7..59821b0 100755 --- a/users/crumb/programs/emacs/modules/syd-projects.el +++ b/users/crumb/programs/emacs/modules/syd-projects.el @@ -2,9 +2,28 @@ (require 'syd-constants) -(use-package project - :custom ((project-list-file (file-name-concat syd-cache-dir - "known-projects")))) +(with-eval-after-load 'project ; Built-in + ;; Stay out of my config directory! + (setq project-list-file (file-name-concat syd-cache-dir "known-projects")) + ;; For each command in `project-switch-commands' will assign it the key found + ;; in `project-prefix-map'. We emulate that behaviour but for our own + ;; `syd-leader-project-map'. + (let* ((project-key + (lambda (f) + (key-description + (where-is-internal + f + ;; If the keymap is not wrapped in a list, + ;; `where-is-internal' will also search the + ;; global ;; keymaps + (list syd-leader-project-map) + ;; First result only. + t)))) + (switch-cmd (lambda (command name &optional key) + (append (list command name) + (list (or key (funcall project-key command))))))) + (add-to-list 'project-switch-commands + (funcall switch-cmd #'project-root-find-file "Browse")))) ;; Projection provides a Projectile-like project management library atop ;; Emacs built-in project.el. It's more lightweight, while still featureful.