about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDavid Morgan <djm_uk@protonmail.com>2022-08-10 15:56:12 +0100
committerDavid Morgan <djm_uk@protonmail.com>2022-08-10 15:56:12 +0100
commita8811cd27450964bf507602a6ce76294e12415cf (patch)
tree9c0a8a795635b5774f22853c1048fc32a65f29ac
parent04475cb0b5dabe226a54b05f584a2ba49e92cf5a (diff)
downloaddotfiles-a8811cd27450964bf507602a6ce76294e12415cf.tar.gz
Add clojure-current-defun-name
-rw-r--r--.emacs.d/lisp/init-clojure.el34
1 files changed, 33 insertions, 1 deletions
diff --git a/.emacs.d/lisp/init-clojure.el b/.emacs.d/lisp/init-clojure.el
index 6162709..e957e14 100644
--- a/.emacs.d/lisp/init-clojure.el
+++ b/.emacs.d/lisp/init-clojure.el
@@ -12,7 +12,39 @@
 (use-package clojure-mode
   :config
   (require 'flycheck-clj-kondo)
-  (subword-mode +1))
+  (subword-mode +1)
+  (defun clojure-current-defun-name ()
+    "Return the name of the defun at point, or nil."
+    (save-excursion
+      (let ((location (point)))
+        ;; If we are now precisely at the beginning of a defun, make sure
+        ;; beginning-of-defun finds that one rather than the previous one.
+        (or (eobp) (forward-char 1))
+        (beginning-of-defun)
+        ;; Make sure we are really inside the defun found, not after it.
+        (when (and (looking-at "\\s(")
+		   (progn (end-of-defun)
+			  (< location (point)))
+		   (progn (forward-sexp -1)
+			  (>= location (point))))
+	  (if (looking-at "\\s(")
+	      (forward-char 1))
+	  ;; Skip the defining construct name, e.g. "defn" or "def".
+	  (forward-sexp 1)
+	  ;; The second element is usually a symbol being defined.  If it
+	  ;; is not, use the first symbol in it.
+	  (skip-chars-forward " \t\n'(")
+          ;; Skip metadata
+          (while (looking-at "\\^")
+            (forward-sexp 1)
+            (skip-chars-forward " \t\n'("))
+	  (buffer-substring-no-properties (point)
+					  (progn (forward-sexp 1)
+					         (point)))))))
+  (defun clojure-mode-hook-fn ()
+    (setq-local add-log-current-defun-function #'clojure-current-defun-name))
+  :hook
+  (clojure-mode . clojure-mode-hook-fn))
 
 (use-package hydra)
 (use-package clj-refactor