wip(lldap): Consultant

This commit is contained in:
Madeleine Sydney
2025-02-19 20:30:39 -07:00
45 changed files with 3054 additions and 55 deletions

View File

@@ -3,6 +3,7 @@
(require 'syd-prelude)
(require 'syd-buffers)
(require 'cl-lib)
(eval-when-compile (require 'cl-lib))
(syd-define-stub
syd/copy-this-file

View File

@@ -0,0 +1,91 @@
;;; syd-lang-clojure.el -*- lexical-binding: t; -*-
(use-package clojure-mode
:mode (rx "." (or "clj" "cljs" "edn" "cljc") eol)
:config
(add-hook 'clojure-mode-hook #'syd-lisp-mode)
(dolist (c '(?- ?_ ?? ?! ?+ ?* ?/ ?: ?> ?< ?= ?&))
(modify-syntax-entry c "w" clojure-mode-syntax-table)))
(use-package cider
:after clojure-mode)
(defun syd-clojure-open-repl (&optional arg type)
"Open a Cider REPL for clojure and return the buffer."
(interactive "P")
;; TODO: Better error handling
;; type is `clj' for clojure and `cljs' for clojurescript
;; ... with no type specified, assume `clj'.
(let ((type (or type 'clj)))
(if-let* ((buffer (cider-current-repl type)))
(pop-to-buffer buffer)
(let ((process (cond ((eq type 'clj) (cider-jack-in-clj arg))
((eq type 'cljs) (cider-jack-in-cljs arg)))))
(message "Starting CIDER server for the first time...")
(while (and (process-live-p process)
(not (cider-current-repl type)))
(sit-for 1))
(message "Starting CIDER server for the first time...done")
(pop-to-buffer (cider-current-repl type))))))
(use-package cider-mode
:straight nil
;; :after clojure-mode
:hook (clojure-mode-local-vars . cider-mode)
:init
(with-eval-after-load 'clojure-mode
(set-repl-handler! '(clojure-mode clojurec-mode)
#'syd-clojure-open-repl :persist t)
(set-repl-handler! 'clojurescript-mode
#'syd-clojure-open-cljs-repl :persist t)
(set-eval-handler! '(clojure-mode clojurec-mode clojurescript-mode)
#'cider-eval-region))
:general
(:keymaps 'cider-repl-mode-map
:states '(normal insert)
"C-k" #'cider-repl-backward-input
"C-j" #'cider-repl-forward-input
"C-s" #'cider-repl-previous-matching-input)
:config
(add-hook 'cider-mode-hook #'eldoc-mode)
(add-hook 'cider-repl-mode-hook #'syd-lisp-mode)
(set-popup-rules!
`(("^\\*cider-error*" :ignore t)
("^\\*cider-repl" :quit nil :ttl nil)
("^\\*cider-repl-history" :vslot 2 :ttl nil)
(,(rx bol "*cider-cheatsheet*")
:width ,(lambda (win)
(with-selected-window win
(enlarge-window (- (min 45 (* 0.2 (frame-width)))
(window-width))
t)))
:side right :vslot -8 :quit t :select t)
(,(rx bol "*cider-doc*")
:slot 2 :vslot -8 :quit t :select t)))
;; DEPRECATED: Remove once syd-strategies is working.
(syd-add-hook 'clojure-mode-hook
(defun syd-clojure-set-handlers-h ()
(setq-local syd-lookup-documentation-handlers
(list #'cider-doc))))
(general-define-key
:keymaps 'cider-mode-map
:states '(normal visual motion emacs insert)
:major-modes t
:prefix syd-localleader-key
:non-normal-prefix syd-alt-localleader-key
"\"" #'cider-jack-in-cljs
"'" #'cider-jack-in-clj
"c" #'cider-connect-clj
"C" #'cider-connect-cljs
"r l" #'cider-load-buffer
"r n" #'cider-repl-set-ns
"r r" #'cider-ns-refresh
"r R" #'cider-restart
"r q" #'cider-quit
"h c" #'cider-cheatsheet))
;; Give different pairs of delimiters different colours.
(use-package rainbow-delimiters
:hook (clojure-mode . rainbow-delimiters-mode))
(provide 'syd-lang-clojure)

View File

@@ -68,12 +68,11 @@ to a pop up buffer."
(add-hook 'emacs-lisp-mode-hook #'syd-lisp-mode)
(defun syd-emacs-set-handlers-h ()
(setq-local syd-lookup-documentation-handlers
(list #'syd-emacs-lisp-lookup-documentation)))
(add-hook 'emacs-lisp-mode-hook #'syd-emacs-set-handlers-h)
(add-hook 'help-mode-hook #'syd-emacs-set-handlers-h)
;; DEPRECATED: Remove once syd-strategies is working.
(syd-add-hook '(emacs-lisp-mode-hook help-mode-hook)
(defun syd-emacs-set-handlers-h ()
(setq-local syd-lookup-documentation-handlers
(list #'syd-emacs-lisp-lookup-documentation))))
;; Semantic highlighting for Elisp.
(use-package highlight-defined

View File

@@ -4,7 +4,7 @@
:hook (on-first-file . age-file-enable)
:custom
((age-program "rage")
(age-default-identity "~/private-keys/age/crumb.age")
(age-default-recipient "~/public-keys/age/crumb.pub")))
(age-default-identity (expand-file-name "~/private-keys/age/crumb.age"))
(age-default-recipient (expand-file-name "~/public-keys/age/crumb.pub"))))
(provide 'syd-age)

View File

@@ -107,35 +107,35 @@ Otherwise, nil."
;; It must be updated whenever evil-collection updates theirs.
(defvar evil-collection-mode-list
`(2048-game ag alchemist anaconda-mode apropos arc-mode atomic-chrome
auto-package-update beginend bluetooth bm bookmark
(buff-menu "buff-menu") bufler calc calendar cider citre cmake-mode
color-rg comint company compile consult corfu crdt (csv "csv-mode")
(custom cus-edit) cus-theme dape dashboard daemons deadgrep debbugs
debug devdocs dictionary diff-hl diff-mode dired dired-sidebar
disk-usage distel doc-view docker eat ebib ebuku edbi edebug ediff eglot
elpaca ement explain-pause-mode eldoc elfeed elisp-mode elisp-refs
elisp-slime-nav embark emms ,@(if (> emacs-major-version 28) '(emoji))
epa ert eshell eval-sexp-fu evil-mc eww fanyi finder flycheck flymake
forge free-keys geiser ggtags git-timemachine gited gnus go-mode gptel
grep guix hackernews helm help helpful hg-histedit hungry-delete hyrolo
ibuffer (image image-mode) image-dired image+ imenu imenu-list
(indent "indent") indium info ivy js2-mode
,@(if (>= emacs-major-version 30) '(kmacro)) leetcode lispy lms log-edit
log-view lsp-ui-imenu lua-mode kotlin-mode macrostep man
(magit magit-repos magit-submodule) magit-repos magit-section
magit-todos markdown-mode monky mpc mpdel mu4e mu4e-conversation neotree
newsticker notmuch nov omnisharp org org-present org-roam osx-dictionary
outline p4 (package-menu package) pass (pdf pdf-tools) popup proced
prodigy profiler p-search python quickrun racer racket-describe realgud
reftex replace restclient rg ripgrep rjsx-mode robe rtags ruby-mode
scheme scroll-lock selectrum sh-script
,@(if (> emacs-major-version 27) '(shortdoc)) simple simple-mpc slime
sly smerge-mode snake so-long speedbar tab-bar tablist tar-mode telega
(term term ansi-term multi-term) tetris thread tide timer-list
transmission trashed tuareg typescript-mode vc-annotate vc-dir vc-git
vdiff vertico view vlf vterm vundo w3m wdired wgrep which-key
with-editor woman xref xwidget yaml-mode youtube-dl zmusic
(ztree ztree-diff)))
auto-package-update beginend bluetooth bm bookmark
(buff-menu "buff-menu") bufler calc calendar cider citre cmake-mode
color-rg comint company compile consult corfu crdt (csv "csv-mode")
(custom cus-edit) cus-theme dape dashboard daemons deadgrep debbugs
debug devdocs dictionary diff-hl diff-mode dired dired-sidebar
disk-usage distel doc-view docker eat ebib ebuku edbi edebug ediff eglot
elpaca ement explain-pause-mode eldoc elfeed elisp-mode elisp-refs
elisp-slime-nav embark emms ,@(if (> emacs-major-version 28) '(emoji))
epa ert eshell eval-sexp-fu evil-mc eww fanyi finder flycheck flymake
forge free-keys geiser ggtags git-timemachine gited gnus go-mode gptel
grep guix hackernews helm help helpful hg-histedit hungry-delete hyrolo
ibuffer (image image-mode) image-dired image+ imenu imenu-list
(indent "indent") indium info ivy js2-mode
,@(if (>= emacs-major-version 30) '(kmacro)) leetcode lispy lms log-edit
log-view lsp-ui-imenu lua-mode kotlin-mode macrostep man
(magit magit-repos magit-submodule) magit-repos magit-section
magit-todos markdown-mode monky mpc mpdel mu4e mu4e-conversation neotree
newsticker notmuch nov omnisharp org org-present org-roam osx-dictionary
outline p4 (package-menu package) pass (pdf pdf-tools) popup proced
prodigy profiler p-search python quickrun racer racket-describe realgud
reftex replace restclient rg ripgrep rjsx-mode robe rtags ruby-mode
scheme scroll-lock selectrum sh-script
,@(if (> emacs-major-version 27) '(shortdoc)) simple simple-mpc slime
sly smerge-mode snake so-long speedbar tab-bar tablist tar-mode telega
(term term ansi-term multi-term) tetris thread tide timer-list
transmission trashed tuareg typescript-mode vc-annotate vc-dir vc-git
vdiff vertico view vlf vterm vundo w3m wdired wgrep which-key
with-editor woman xref xwidget yaml-mode youtube-dl zmusic
(ztree ztree-diff)))
(cl-defun syd-evil-collection-init (module &key disabled-modules)
"Initialise evil-collection-MODULE.
@@ -150,14 +150,12 @@ modules."
(with-demoted-errors "error loading evil-collection: %s"
(evil-collection-init (list module))))))
(defun syd-evil-collection-disable-blacklist-a (fn)
;; Allow binding to ESC.
(syd-defadvice syd-evil-collection-disable-blacklist-a (fn)
:around #'evil-collection-vterm-toggle-send-escape
(let (evil-collection-key-blacklist)
(funcall-interactively fn)))
;; Allow binding to ESC.
(advice-add #'evil-collection-vterm-toggle-send-escape
:around #'syd-evil-collection-disable-blacklist-a)
;; These modes belong to packages that Emacs always loads at startup, causing
;; evil-collection and it's co-packages to all load immediately. We avoid
;; this by loading them after evil-collection has first loaded...

View File

@@ -78,7 +78,9 @@
;; Project
(general-def
:prefix-map 'syd-leader-project-map
"C" `("Compile project" . ,#'project-compile))
"C" `("Compile project" . ,#'project-compile)
"&" `("Async cmd in project root" . ,#'project-async-shell-command)
"p" `("Switch project" . ,#'project-switch-project))
(general-def
:prefix-map 'syd-leader-help-package-map

View File

@@ -2,6 +2,7 @@
(file-name-concat user-emacs-directory "modules" "lang"))
(require 'syd-lang-emacs-lisp)
(require 'syd-lang-clojure)
(require 'syd-lang-nix)
(provide 'syd-lang)

View File

@@ -2,6 +2,38 @@
(require 'syd-prose)
(with-eval-after-load 'org
(syd-add-hook 'org-tab-first-hook
(defun syd-org-cycle-only-current-subtree-h (&optional arg)
"Toggle the local fold at the point, and no deeper.
`org-cycle's standard behavior is to cycle between three levels: collapsed,
subtree and whole document. This is slow, especially in larger org buffer. Most
of the time I just want to peek into the current subtree -- at most, expand
*only* the current subtree.
All my (performant) foldings needs are met between this and `org-show-subtree'
(on zO for evil users), and `org-cycle' on shift-TAB if I need it."
(interactive "P")
(unless (or (eq this-command 'org-shifttab)
(and (bound-and-true-p org-cdlatex-mode)
(or (org-inside-LaTeX-fragment-p)
(org-inside-latex-macro-p))))
(save-excursion
(org-beginning-of-line)
(let (invisible-p)
(when (and (org-at-heading-p)
(or org-cycle-open-archived-trees
(not (member org-archive-tag (org-get-tags))))
(or (not arg)
(setq invisible-p
(memq (get-char-property (line-end-position)
'invisible)
'(outline org-fold-outline)))))
(unless invisible-p
(setq org-cycle-subtree-status 'subtree))
(org-cycle-internal-local)
t)))))))
(defun syd-org--init-hacks-h ()
;; Open file links in current window, rather than new ones
(setf (alist-get 'file org-link-frame-setup) #'find-file)

View File

@@ -28,4 +28,29 @@
;; `compile-multi-embark-command-map'.
:config (projection-multi-embark-setup-command-map))
(use-package skeletor
:commands (skeletor-create-project-at skeletor-create-project)
:custom ((skeletor-project-directory (expand-file-name "~/src"))
(skeletor-completing-read-function #'completing-read))
:general (:keymaps 'syd-leader-project-map
"n" #'skeletor-create-project
"N" #'skeletor-create-project-at)
:config
(skeletor-define-template "clj-nix"
:substitutions
'(("__PROJECT-OWNER__" . (lambda ()
(read-no-blanks-input "Project owner: "))))
:before-git
(lambda (dir)
;; Use underscores instead of hyphens in clj file names.
(let ((default-directory (file-name-concat dir "src")))
(dolist (f (directory-files "." nil "-" t))
(rename-file
f
(string-replace "-" "_" f))))
;; REVIEW: Is it safe to make this be async? We require that the command
;; has finished before Git initialises.
(skeletor-shell-command "nix run github:jlesquembre/clj-nix#deps-lock"
dir))))
(provide 'syd-projects)

View File

@@ -27,4 +27,17 @@
(set-popup-rule! (rx line-start "*lsp-" (or "help" "install"))
:size 0.35 :quit t :select nil))
(use-package envrc
;; REVIEW: Can we load this any later/better?
:hook (on-first-file . envrc-global-mode)
:general
(:prefix-map 'syd-leader-file-env-map
"a" #'envrc-allow
"r" #'envrc-reload)
(:keymaps 'syd-leader-file-map
"e" `("Environment" . ,syd-leader-file-env-map))
:config
(set-popup-rule! (rx "*envrc*")
:quit t :ttl 0))
(provide 'syd-tooling)

View File

@@ -4,6 +4,7 @@
(setq tramp-persistency-file-name
(file-name-concat syd-cache-dir "tramp"))
(setq tramp-auto-save-directory
(file-name-concat syd-cache-dir "tramp-autosave/")))
(file-name-concat syd-cache-dir "tramp-autosave/"))
(add-to-list 'tramp-remote-path 'tramp-own-remote-path))
(provide 'syd-tramp)

View File

@@ -64,6 +64,10 @@
:custom ((display-line-numbers-type 'relative)
;; Always ask "y/n"; never "yes/no".
(use-short-answers t)
;; Scroll compilation buffer to follow output.
(compilation-scroll-output t)
;; Allow `fit-window-to-buffer' to make horizontal adjustments.
(fit-window-to-buffer-horizontally t)
;; I don't like that `grep' asks me to save unsaved files. It makes
;; me think it's about to kill my buffers.
(grep-save-buffers nil)
@@ -161,6 +165,10 @@ for example when calling `shell'.")
:quit t)
;; Required for :quit t to do anything.
(evil-set-initial-state 'messages-buffer-mode 'motion)
(evil-set-initial-state 'debugger-mode 'normal)))
(evil-set-initial-state 'debugger-mode 'normal)
(set-popup-rule! shell-command-buffer-name-async
:slot -2
:modeline nil
:ttl nil)))
(provide 'syd-ui)

View File

@@ -0,0 +1 @@
use flake

View File

@@ -0,0 +1,11 @@
result
.nrepl
.nrepl-port
.cpcache/
.cache/
.lsp/
.clj-kondo
.cpcache
.lsp
.nrepl
.direnv/

View File

@@ -0,0 +1,7 @@
{:tasks
{:requires ([babashka.process :as p])
update-lockfile
{:doc "Update the clj-nix lockfile"
:task (let [r (p/sh {:out :inherit :err :inherit}
"nix run github:jlesquembre/clj-nix#deps-lock")]
(System/exit (:exit r)))}}}

View File

@@ -0,0 +1,9 @@
{:deps {org.clojure/clojure {:mvn/version "1.12.0"}}
:paths ["src"]
:aliases
{: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" "__PROJECT-NAME__.main"]}}}

View File

@@ -0,0 +1,47 @@
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
clj-nix.url = "github:jlesquembre/clj-nix";
};
outputs = { self, ... }@inputs:
inputs.flake-utils.lib.eachDefaultSystem (system:
let pkgs = import inputs.nixpkgs {
inherit system;
overlays = [
inputs.clj-nix.overlays.default
];
};
in {
packages = rec {
__PROJECT-NAME__ = inputs.clj-nix.lib.mkCljApp {
pkgs = inputs.nixpkgs.legacyPackages.${system};
modules = [
{
name = "__PROJECT-OWNER__/__PROJECT-NAME__";
version = "1.0.0";
main-ns = "__PROJECT-NAME__.main";
projectSrc = ./.;
nativeImage = {
# Disable for faster build times.
enable = true;
};
}
];
};
default = __PROJECT-NAME__;
};
devShells.default = pkgs.mkShell {
packages = with pkgs; [
clojure-lsp
cljfmt
clojure
babashka
];
};
});
}

View File

@@ -0,0 +1,5 @@
(ns __PROJECT-NAME__.main
(:gen-class))
(defn -main [& args]
(println "🦭!"))

View File

@@ -0,0 +1 @@
nil