diff options
author | David Morgan <djm_uk@protonmail.com> | 2022-08-10 15:56:12 +0100 |
---|---|---|
committer | David Morgan <djm_uk@protonmail.com> | 2022-08-10 15:56:12 +0100 |
commit | a8811cd27450964bf507602a6ce76294e12415cf (patch) | |
tree | 9c0a8a795635b5774f22853c1048fc32a65f29ac | |
parent | 04475cb0b5dabe226a54b05f584a2ba49e92cf5a (diff) | |
download | dotfiles-a8811cd27450964bf507602a6ce76294e12415cf.tar.gz |
Add clojure-current-defun-name
-rw-r--r-- | .emacs.d/lisp/init-clojure.el | 34 |
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 |