diff options
author | jao <jao@gnu.org> | 2025-09-20 04:15:19 +0100 |
---|---|---|
committer | jao <jao@gnu.org> | 2025-09-20 04:15:19 +0100 |
commit | 889b21138993a67a286f380bbc6d4ca56e475b42 (patch) | |
tree | c70a2ebcbe54a6e75251b26ede160e1572106338 | |
parent | 9d3c619aa9e9d3bfd39cbfe46edb98a07e191416 (diff) | |
download | elibs-889b21138993a67a286f380bbc6d4ca56e475b42.tar.gz elibs-889b21138993a67a286f380bbc6d4ca56e475b42.tar.bz2 |
new lib: jao-clojure
-rw-r--r-- | custom/jao-custom-programming.el | 13 | ||||
-rw-r--r-- | lib/prog/jao-clojure.el | 101 |
2 files changed, 109 insertions, 5 deletions
diff --git a/custom/jao-custom-programming.el b/custom/jao-custom-programming.el index 6f31711..b88c43c 100644 --- a/custom/jao-custom-programming.el +++ b/custom/jao-custom-programming.el @@ -261,12 +261,15 @@ (defconst jao-kaocha-compilation-error '(kaocha-error "^FAIL in \\(.+\\.\\)[^ ]+ (\\([^:]+\\.clj[cs]?\\):\\([0-9]+\\))" - jao-kaocha-file-name 3))) + jao-kaocha-file-name 3)) -(use-package compile - :config - (add-to-list 'compilation-error-regexp-alist-alist - jao-kaocha-compilation-error)) + (use-package compile + :config + (add-to-list 'compilation-error-regexp-alist-alist + jao-kaocha-compilation-error))) + +(use-package jao-clojure + :bind (:map clojure-mode-map (("C-c o" . jao-clojure-other-file)))) (use-package cider :ensure t diff --git a/lib/prog/jao-clojure.el b/lib/prog/jao-clojure.el new file mode 100644 index 0000000..e044f9e --- /dev/null +++ b/lib/prog/jao-clojure.el @@ -0,0 +1,101 @@ +;;; jao-clojure.el --- Clojure utilities -*- lexical-binding: t; -*- + +;; Copyright (C) 2025 Jose Antonio Ortega Ruiz + +;; Author: Jose Antonio Ortega Ruiz <mail@jao.io> +;; Keywords: languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Helpers for clojure coding + +;;; Code: + +(require 'clojure-mode) +(require 'project) + +;;;; Jumping between implementation and test files +(defun jao-clojure--ext-dir (prefix) + (let* ((ext (file-name-extension buffer-file-name)) + (ext-rx (format "/%s/" ext))) + (if (string-match-p ext-rx buffer-file-name) + (format "%s/%s" prefix ext) + prefix))) + +(defun jao-clojure-find-current-test () + (save-excursion + (and (re-search-backward + "(deftest\\(?:\\W+^:\\w+\\)*\\W+\\b\\(.+\\)\\b" nil t) + (match-string-no-properties 1)))) + +(defvar jao-clojure--src-candidates '("lib" "src" "srv" "app")) + +(defun jao-clojure--test-namespace-p (ns) + (or (string-suffix-p "-test" ns) + (string-match "\\(.+\\)\\.\\(test\\)\\(\\..+\\)" ns))) + +(defun jao-clojure-test-buffer-p () + (jao-clojure--test-namespace-p (clojure-find-ns))) + +(defun jao-clojure--test-for (namespace sep) + (funcall cider-test-infer-test-ns namespace)) + +(defun jao-clojure--infer-test-ns (ns) + (if (jao-clojure--test-namespace-p ns) + ns + (jao-clojure--test-for ns "."))) + +(defun jao-clojure--root () (project-root (project-current))) + +(defun jao-clojure-jump-to-test () + "Jump from implementation to test file." + (interactive) + (let* ((f (format "%s/%s/%s.%s" + (jao-clojure--root) + (jao-clojure--ext-dir "test") + (jao-clojure--test-for (clojure-find-ns) "/") + (file-name-extension buffer-file-name))) + (f (replace-regexp-in-string "-" "_" f))) + (find-file f))) + +(defun jao-clojure--implementation-for (namespace) + (let ((n (replace-regexp-in-string "-test$" "" namespace))) + (replace-regexp-in-string "\\.test\\." "." n))) + +(defun jao-clojure--find-implementation (src) + (let ((f (format "%s/%s/%s.%s" + (jao-clojure--root) + (jao-clojure--ext-dir src) + (jao-clojure--implementation-for (clojure-find-ns)) + (file-name-extension buffer-file-name)))) + (and (file-exists-p f) f))) + +(defun jao-clojure-jump-to-implementation () + "Jump from test file to implementation." + (interactive) + (let ((impl (car (seq-keep #'jao-clojure--find-implementation + jao-clojure--src-candidates)))) + (if impl (find-file impl) (message "No implementation file found")))) + +(defun jao-clojure-other-file () + "Toggle between implementation and test file" + (interactive) + (if (jao-clojure-test-buffer-p) + (jao-clojure-jump-to-implementation) + (jao-clojure-jump-to-test))) + +(provide 'jao-clojure) +;;; jao-clojure.el ends here |