branch: elpa/cider
commit 1fa3f7c736ee0236b154c9897f37c226fae0e3ae
Author: Baptiste Strazzulla <[email protected]>
Commit: Bozhidar Batsov <[email protected]>
New value `per-project` for `cider-repl-history-file`
To save the history on a per-project basis.
---
CHANGELOG.md | 4 ++
cider-repl-history.el | 1 -
cider-repl.el | 55 +++++++++++++++++---------
doc/modules/ROOT/pages/repl/configuration.adoc | 15 +++++--
4 files changed, 53 insertions(+), 22 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6417918f10..4faa571e0d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,10 @@
## master (unreleased)
+### Changes
+
+- [#3574](https://github.com/clojure-emacs/cider/issues/3574): New value
`per-project` for `cider-repl-history-file` to save the history on a
per-project basis.
+
### Bugs fixed
- [#3763](https://github.com/clojure-emacs/cider/issues/3763): Fix
`cider-docview-render` completion popup error when symbol being completed does
not have a docstring.
diff --git a/cider-repl-history.el b/cider-repl-history.el
index ec19298ad2..e64c773af8 100644
--- a/cider-repl-history.el
+++ b/cider-repl-history.el
@@ -220,7 +220,6 @@ call `cider-repl-history' again.")
(defvar cider-repl-history-previous-overlay nil
"Previous overlay within *cider-repl-history* buffer.")
-
(defun cider-repl-history-get-history ()
"Function to retrieve history from the REPL buffer."
(if cider-repl-history-repl-buffer
diff --git a/cider-repl.el b/cider-repl.el
index 9fd17c4f6d..7d967da294 100644
--- a/cider-repl.el
+++ b/cider-repl.el
@@ -194,9 +194,6 @@ CIDER 1.7."
This property value must be unique to avoid having adjacent inputs be
joined together.")
-(defvar-local cider-repl-input-history '()
- "History list of strings read from the REPL buffer.")
-
(defvar-local cider-repl-input-history-items-added 0
"Variable counting the items added in the current session.")
@@ -1468,6 +1465,9 @@ WIN, BUFFER and POS are the window, buffer and point
under mouse position."
(defvar cider-repl-history-pattern nil
"The regexp most recently used for finding input history.")
+(defvar cider-repl-input-history '()
+ "History list of strings read from the REPL buffer.")
+
(defun cider-repl--add-to-input-history (string)
"Add STRING to the input history.
Empty strings and duplicates are ignored."
@@ -1593,9 +1593,11 @@ If USE-CURRENT-INPUT is non-nil, use the current input."
:safe #'integerp)
(defcustom cider-repl-history-file nil
- "File to save the persistent REPL history to."
- :type 'string
- :safe #'stringp)
+ "File to save the persistent REPL history to.
+If this is set to a path the history will be global to all projects. If this
is
+set to `per-project', the history will be stored in a file (.cider-history) at
+the root of each project."
+ :type '(choice string symbol))
(defun cider-repl--history-read-filename ()
"Ask the user which file to use, defaulting `cider-repl-history-file'."
@@ -1619,11 +1621,27 @@ defined filenames can be used to read special history
files.
The value of `cider-repl-input-history' is set by this function."
(interactive (list (cider-repl--history-read-filename)))
- (let ((f (or filename cider-repl-history-file)))
- ;; TODO: probably need to set cider-repl-input-history-position as well.
- ;; in a fresh connection the newest item in the list is currently
- ;; not available. After sending one input, everything seems to work.
- (setq cider-repl-input-history (cider-repl--history-read f))))
+ (cond
+ (filename (setq cider-repl-history-file filename))
+ ((equal 'per-project cider-repl-history-file)
+ (make-local-variable 'cider-repl-input-history)
+ (when-let ((dir (clojure-project-dir)))
+ (setq-local
+ cider-repl-history-file (expand-file-name ".cider-history" dir)))))
+ (when cider-repl-history-file
+ (condition-case nil
+ ;; TODO: probably need to set cider-repl-input-history-position as
+ ;; well. In a fresh connection the newest item in the list is
+ ;; currently not available. After sending one input, everything
+ ;; seems to work.
+ (setq
+ cider-repl-input-history
+ (cider-repl--history-read cider-repl-history-file))
+ (error
+ (message
+ "Malformed cider-repl-history-file: %s" cider-repl-history-file)))
+ (add-hook 'kill-buffer-hook #'cider-repl-history-just-save t t)
+ (add-hook 'kill-emacs-hook #'cider-repl-history-save-all)))
(defun cider-repl--history-write (filename)
"Write history to FILENAME.
@@ -1658,6 +1676,13 @@ This function is meant to be used in hooks to avoid
lambda
constructs."
(cider-repl-history-save cider-repl-history-file))
+(defun cider-repl-history-save-all ()
+ "Save all histories."
+ (dolist (buffer (buffer-list))
+ (with-current-buffer buffer
+ (when (equal major-mode 'cider-repl-mode)
+ (cider-repl-history-just-save)))))
+
;; SLIME has different semantics and will not save any duplicates.
;; we keep track of how many items were added to the history in the
;; current session in `cider-repl--add-to-input-history' and merge only the
@@ -2051,13 +2076,7 @@ in an unexpected place."
(setq-local prettify-symbols-alist clojure--prettify-symbols-alist)
;; apply dir-local variables to REPL buffers
(hack-dir-local-variables-non-file-buffer)
- (when cider-repl-history-file
- (condition-case nil
- (cider-repl-history-load cider-repl-history-file)
- (error
- (message "Malformed cider-repl-history-file: %s"
cider-repl-history-file)))
- (add-hook 'kill-buffer-hook #'cider-repl-history-just-save t t)
- (add-hook 'kill-emacs-hook #'cider-repl-history-just-save))
+ (cider-repl-history-load)
(add-hook 'completion-at-point-functions #'cider-complete-at-point nil t)
(add-hook 'paredit-mode-hook (lambda () (clojure-paredit-setup
cider-repl-mode-map)))
(cider-repl-setup-paredit))
diff --git a/doc/modules/ROOT/pages/repl/configuration.adoc
b/doc/modules/ROOT/pages/repl/configuration.adoc
index 774abc8891..39458d4749 100644
--- a/doc/modules/ROOT/pages/repl/configuration.adoc
+++ b/doc/modules/ROOT/pages/repl/configuration.adoc
@@ -340,12 +340,21 @@ reset automatically by the `track-state` middleware.
(setq cider-repl-history-size 1000) ; the default is 500
----
-* To store the REPL history in a file:
+* To store the REPL history of all projects in a single file:
[source,lisp]
----
(setq cider-repl-history-file "path/to/file")
----
-Note that CIDER writes the history to the file when you kill the REPL
-buffer, which includes invoking `cider-quit`, or when you quit Emacs.
+* To store the REPL history per project (by creating a
+ `.cider-history` file at the root of each):
+
+[source,lisp]
+----
+(setq cider-repl-history-file 'per-project)
+----
+
+Note that CIDER writes the history to the file(s) when you kill the
+REPL buffer, which includes invoking `cider-quit`, or when you quit
+Emacs.