diff options
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | cider.el | 56 | ||||
-rw-r--r-- | doc/up_and_running.md | 9 | ||||
-rw-r--r-- | test/cider-tests.el | 38 |
4 files changed, 84 insertions, 20 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 4588fd39..1f761a75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * Add new face `cider-reader-conditional-face` which is used to mark unused reader conditional expressions. * [#1544](https://github.com/clojure-emacs/cider/issues/1544): Add a new defcustom `nrepl-use-ssh-fallback-for-remote-hosts` to control the behavior of `nrepl-connect` (and in turn that of `cider-connect`) for remote hosts. * [#1910](https://github.com/clojure-emacs/cider/issues/1910): Add custom company-mode completion style to show fuzzy completions from Compliment. +* Introduce `cider-*-global-options` for customizing options that are not related to tasks. ### Changes @@ -104,6 +104,12 @@ version from the CIDER package or library.") :type 'string :group 'cider) +(defcustom cider-lein-global-options + nil + "Command global options used to execute Leiningen (e.g.: -o for offline)." + :type 'string + :group 'cider) + (defcustom cider-lein-parameters "repl :headless" "Params passed to Leiningen to start an nREPL server via `cider-jack-in'." @@ -117,6 +123,13 @@ version from the CIDER package or library.") :group 'cider :package-version '(cider . "0.9.0")) +(defcustom cider-boot-global-options + nil + "Command global options used to execute Boot (e.g.: -c for checkouts)." + :type 'string + :group 'cider + :package-version '(cider . "0.14.0")) + (defcustom cider-boot-parameters "repl -s wait" "Params passed to boot to start an nREPL server via `cider-jack-in'." @@ -131,8 +144,15 @@ version from the CIDER package or library.") :group 'cider :package-version '(cider . "0.10.0")) +(defcustom cider-gradle-global-options + "--no-daemon" + "Command line options used to execute Gradle (e.g.: -m for dry run)." + :type 'string + :group 'cider + :package-version '(cider . "0.14.0")) + (defcustom cider-gradle-parameters - "--no-daemon clojureRepl" + "clojureRepl" "Params passed to gradle to start an nREPL server via `cider-jack-in'." :type 'string :group 'cider @@ -172,7 +192,7 @@ When set to nil `cider-jack-in' will fail." (const 'warn) (const :tag "never" nil)) :group 'cider - :package-version '(cider . "0.14.0")) + :package-version '(cider . "0.15.0")) (defcustom cider-known-endpoints nil "A list of connection endpoints where each endpoint is a list. @@ -242,6 +262,14 @@ found for the PROJECT-TYPE" ("gradle" (cider--gradle-resolve-command)) (_ (user-error "Unsupported project type `%s'" project-type)))) +(defun cider-jack-in-global-options (project-type) + "Determine the command line options for `cider-jack-in' for the PROJECT-TYPE." + (pcase project-type + ("lein" cider-lein-global-options) + ("boot" cider-boot-global-options) + ("gradle" cider-gradle-global-options) + (_ (user-error "Unsupported project type `%s'" project-type)))) + (defun cider-jack-in-params (project-type) "Determine the commands params for `cider-jack-in' for the PROJECT-TYPE." (pcase project-type @@ -304,7 +332,7 @@ string is quoted for passing as argument to an inferior shell." (defun cider-boot-command-prefix (dependencies) "Return a list of boot artifact strings created from DEPENDENCIES." (concat (mapconcat #'cider--list-as-boot-artifact dependencies " ") - " ")) + (when (not (seq-empty-p dependencies)) " "))) (defun cider-boot-repl-task-params (params middlewares) (if (string-match "\\_<repl\\_>" params) @@ -317,8 +345,10 @@ string is quoted for passing as argument to an inferior shell." (message "Warning: `cider-boot-parameters' doesn't call the \"repl\" task, jacking-in might not work") params)) -(defun cider-boot-jack-in-dependencies (params dependencies plugins middlewares) - (concat (cider-boot-command-prefix (append dependencies plugins)) +(defun cider-boot-jack-in-dependencies (global-opts params dependencies plugins middlewares) + (concat global-opts + (when (not (seq-empty-p global-opts)) " ") + (cider-boot-command-prefix (append dependencies plugins)) (cider-boot-repl-task-params params middlewares))) (defun cider--lein-artifact-exclusions (exclusions) @@ -334,8 +364,10 @@ of EXCLUSIONS can be provided as well. The returned string is quoted for passing as argument to an inferior shell." (shell-quote-argument (format "[%s %S%s]" (car list) (cadr list) (cider--lein-artifact-exclusions exclusions)))) -(defun cider-lein-jack-in-dependencies (params dependencies dependencies-exclusions lein-plugins) +(defun cider-lein-jack-in-dependencies (global-opts params dependencies dependencies-exclusions lein-plugins) (concat + global-opts + (when (not (seq-empty-p global-opts)) " ") (mapconcat #'identity (append (seq-map (lambda (dep) (let ((exclusions (cadr (assoc (car dep) dependencies-exclusions)))) @@ -368,7 +400,7 @@ See also `cider-jack-in-auto-inject-clojure'." dependencies)) dependencies)) -(defun cider-inject-jack-in-dependencies (params project-type) +(defun cider-inject-jack-in-dependencies (global-opts params project-type) "Return PARAMS with injected REPL dependencies. These are set in `cider-jack-in-dependencies', `cider-jack-in-lein-plugins' and `cider-jack-in-nrepl-middlewares' are injected from the CLI according to @@ -377,18 +409,23 @@ boot script for supporting cider with its nREPL middleware and dependencies." (pcase project-type ("lein" (cider-lein-jack-in-dependencies + global-opts params (cider-add-clojure-dependencies-maybe cider-jack-in-dependencies) cider-jack-in-dependencies-exclusions cider-jack-in-lein-plugins)) ("boot" (cider-boot-jack-in-dependencies + global-opts params (cider-add-clojure-dependencies-maybe cider-jack-in-dependencies) cider-jack-in-lein-plugins cider-jack-in-nrepl-middlewares)) - ("gradle" params) + ("gradle" (concat + global-opts + (when (not (seq-empty-p global-opts)) " ") + params)) (_ (error "Unsupported project type `%s'" project-type)))) @@ -509,6 +546,7 @@ own buffer." (let* ((project-type (cider-project-type)) (command (cider-jack-in-command project-type)) (command-resolved (cider-jack-in-resolve-command project-type)) + (command-global-opts (cider-jack-in-global-options project-type)) (command-params (cider-jack-in-params project-type))) (if command-resolved (let* ((project (when prompt-project @@ -521,7 +559,7 @@ own buffer." command-params) command-params)) (params (if cider-inject-dependencies-at-jack-in - (cider-inject-jack-in-dependencies params project-type) + (cider-inject-jack-in-dependencies command-global-opts params project-type) params)) (cmd (format "%s %s" command-resolved params))) diff --git a/doc/up_and_running.md b/doc/up_and_running.md index 8c89faa0..b455331d 100644 --- a/doc/up_and_running.md +++ b/doc/up_and_running.md @@ -38,6 +38,15 @@ in it. In Clojure(Script) buffers the command `cider-jack-in` is bound to <kbd>C-c M-j</kbd>. +For further customizing the command line used for `cider-jack-in`, you can +change the following (all string options): + + * `cider-[TOOL]-global-options`: these are passed to the command directly, in + first position (e.g. `-o` to `lein` enables offline mode). + * `cider-[TOOL]-parameters`: these are usually tasks names and their parameters + (e.g.: `dev` for launching boot's dev task instead of the standard `repl -s + wait`). + ## Connect to a running nREPL server You can go to your project's directory in a terminal and type there diff --git a/test/cider-tests.el b/test/cider-tests.el index 59ad2d47..aa829cd5 100644 --- a/test/cider-tests.el +++ b/test/cider-tests.el @@ -84,25 +84,25 @@ (setq-local cider-jack-in-dependencies-exclusions '())) (it "can inject dependencies in a lein project" - (expect (cider-inject-jack-in-dependencies "repl :headless" "lein") - :to-equal"update-in :dependencies conj \\[org.clojure/tools.nrepl\\ \\\"0.2.12\\\"\\] -- update-in :plugins conj \\[cider/cider-nrepl\\ \\\"0.10.0-SNAPSHOT\\\"\\] -- repl :headless")) + (expect (cider-inject-jack-in-dependencies "" "repl :headless" "lein") + :to-equal "update-in :dependencies conj \\[org.clojure/tools.nrepl\\ \\\"0.2.12\\\"\\] -- update-in :plugins conj \\[cider/cider-nrepl\\ \\\"0.10.0-SNAPSHOT\\\"\\] -- repl :headless")) (it "can inject dependencies in a lein project with an exclusion" (setq-local cider-jack-in-dependencies-exclusions '(("org.clojure/tools.nrepl" ("org.clojure/clojure")))) - (expect (cider-inject-jack-in-dependencies "repl :headless" "lein") - :to-equal"update-in :dependencies conj \\[org.clojure/tools.nrepl\\ \\\"0.2.12\\\"\\ \\:exclusions\\ \\[org.clojure/clojure\\]\\] -- update-in :plugins conj \\[cider/cider-nrepl\\ \\\"0.10.0-SNAPSHOT\\\"\\] -- repl :headless")) + (expect (cider-inject-jack-in-dependencies "" "repl :headless" "lein") + :to-equal "update-in :dependencies conj \\[org.clojure/tools.nrepl\\ \\\"0.2.12\\\"\\ \\:exclusions\\ \\[org.clojure/clojure\\]\\] -- update-in :plugins conj \\[cider/cider-nrepl\\ \\\"0.10.0-SNAPSHOT\\\"\\] -- repl :headless")) (it "can inject dependencies in a lein project with multiple exclusions" (setq-local cider-jack-in-dependencies-exclusions '(("org.clojure/tools.nrepl" ("org.clojure/clojure" "foo.bar/baz")))) - (expect (cider-inject-jack-in-dependencies "repl :headless" "lein") - :to-equal"update-in :dependencies conj \\[org.clojure/tools.nrepl\\ \\\"0.2.12\\\"\\ \\:exclusions\\ \\[org.clojure/clojure\\ foo.bar/baz\\]\\] -- update-in :plugins conj \\[cider/cider-nrepl\\ \\\"0.10.0-SNAPSHOT\\\"\\] -- repl :headless")) + (expect (cider-inject-jack-in-dependencies "" "repl :headless" "lein") + :to-equal "update-in :dependencies conj \\[org.clojure/tools.nrepl\\ \\\"0.2.12\\\"\\ \\:exclusions\\ \\[org.clojure/clojure\\ foo.bar/baz\\]\\] -- update-in :plugins conj \\[cider/cider-nrepl\\ \\\"0.10.0-SNAPSHOT\\\"\\] -- repl :headless")) (it "can inject dependencies in a boot project" - (expect (cider-inject-jack-in-dependencies "repl -s wait" "boot") + (expect (cider-inject-jack-in-dependencies "" "repl -s wait" "boot") :to-equal "-d org.clojure/tools.nrepl\\:0.2.12 -d cider/cider-nrepl\\:0.10.0-SNAPSHOT repl -m cider.nrepl/cider-middleware -s wait")) (it "can inject dependencies in a gradle project" - (expect (cider-inject-jack-in-dependencies "--no-daemon clojureRepl" "gradle") + (expect (cider-inject-jack-in-dependencies "" "--no-daemon clojureRepl" "gradle") :to-equal "--no-daemon clojureRepl"))) (describe "when there are multiple dependencies" @@ -111,12 +111,28 @@ (setq-local cider-jack-in-nrepl-middlewares '("refactor-nrepl.middleware/wrap-refactor" "cider.nrepl/cider-middleware")) (setq-local cider-jack-in-dependencies-exclusions '())) (it "can inject dependencies in a lein project" - (expect (cider-inject-jack-in-dependencies "repl :headless" "lein") + (expect (cider-inject-jack-in-dependencies "" "repl :headless" "lein") :to-equal "update-in :dependencies conj \\[org.clojure/tools.nrepl\\ \\\"0.2.12\\\"\\] -- update-in :plugins conj \\[refactor-nrepl\\ \\\"2.0.0\\\"\\] -- update-in :plugins conj \\[cider/cider-nrepl\\ \\\"0.11.0\\\"\\] -- repl :headless")) (it "can inject dependencies in a boot project" - (expect (cider-inject-jack-in-dependencies "repl -s wait" "boot") - :to-equal "-d org.clojure/tools.nrepl\\:0.2.12 -d refactor-nrepl\\:2.0.0 -d cider/cider-nrepl\\:0.11.0 repl -m refactor-nrepl.middleware/wrap-refactor -m cider.nrepl/cider-middleware -s wait")))) + (expect (cider-inject-jack-in-dependencies "" "repl -s wait" "boot") + :to-equal "-d org.clojure/tools.nrepl\\:0.2.12 -d refactor-nrepl\\:2.0.0 -d cider/cider-nrepl\\:0.11.0 repl -m refactor-nrepl.middleware/wrap-refactor -m cider.nrepl/cider-middleware -s wait"))) + + (describe "when there are global options" + (before-each + (setq-local cider-jack-in-dependencies '(("org.clojure/tools.nrepl" "0.2.12"))) + (setq-local cider-jack-in-nrepl-middlewares '("cider.nrepl/cider-middleware")) + (setq-local cider-jack-in-lein-plugins '(("cider/cider-nrepl" "0.11.0"))) + (setq-local cider-jack-in-dependencies-exclusions '())) + (it "can concat in a lein project" + (expect (cider-inject-jack-in-dependencies "-o -U" "repl :headless" "lein") + :to-equal "-o -U update-in :dependencies conj \\[org.clojure/tools.nrepl\\ \\\"0.2.12\\\"\\] -- update-in :plugins conj \\[cider/cider-nrepl\\ \\\"0.11.0\\\"\\] -- repl :headless")) + (it "can concat in a boot project" + (expect (cider-inject-jack-in-dependencies "-C -o" "repl -s wait" "boot") + :to-equal "-C -o -d org.clojure/tools.nrepl\\:0.2.12 -d cider/cider-nrepl\\:0.11.0 repl -m cider.nrepl/cider-middleware -s wait")) + (it "can concat in a gradle project" + (expect (cider-inject-jack-in-dependencies "-m" "--no-daemon clojureRepl" "gradle") + :to-equal "-m --no-daemon clojureRepl")))) (describe "cider-jack-in-auto-inject-clojure" (it "injects `cider-minimum-clojure-version' when `cider-jack-in-auto-inject-clojure' is set to minimal" |