From 32685565b044ad1cdc02a4dbf22cab47b3b899ef Mon Sep 17 00:00:00 2001 From: dan sutton Date: Sun, 12 Apr 2020 12:15:47 -0500 Subject: [PATCH 1/4] Insert top level defun into repl Nice interaction to see the form and then the output. --- inf-clojure.el | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/inf-clojure.el b/inf-clojure.el index dd26d25..740deb2 100644 --- a/inf-clojure.el +++ b/inf-clojure.el @@ -135,6 +135,7 @@ mode. Default is whitespace followed by 0 or 1 single-letter colon-keyword (define-key map "\C-c\C-r" #'inf-clojure-eval-region) (define-key map "\C-c\M-r" #'inf-clojure-reload) (define-key map "\C-c\C-n" #'inf-clojure-eval-form-and-next) + (define-key map (kbd "C-c C-j") #'inf-clojure-insert-defun) (define-key map "\C-c\C-z" #'inf-clojure-switch-to-repl) (define-key map "\C-c\C-i" #'inf-clojure-show-ns-vars) (define-key map (kbd "C-c C-S-a") #'inf-clojure-apropos) @@ -682,15 +683,25 @@ Prefix argument AND-GO means switch to the Clojure buffer afterwards." "Send the string CODE to the inferior Clojure process to be executed." (inf-clojure--send-string (inf-clojure-proc) code)) +(defun inf-clojure--defun-at-point (&optional bounds) + "Return text or range of defun at point. +If BOUNDS is truthy return a dotted pair of beginning and end of +current defun else return the string.." + (save-excursion + (end-of-defun) + (let ((end (point)) + (case-fold-search t) + (func (if bounds #'cons #'buffer-substring-no-properties))) + (beginning-of-defun) + (funcall func (point) end)))) + (defun inf-clojure-eval-defun (&optional and-go) "Send the current defun to the inferior Clojure process. Prefix argument AND-GO means switch to the Clojure buffer afterwards." (interactive "P") (save-excursion - (end-of-defun) - (let ((end (point)) (case-fold-search t)) - (beginning-of-defun) - (inf-clojure-eval-region (point) end and-go)))) + (let ((bounds (inf-clojure--defun-at-point t))) + (inf-clojure-eval-region (car bounds) (cdr bounds) and-go)))) (defun inf-clojure-eval-buffer (&optional and-go) "Send the current buffer to the inferior Clojure process. @@ -731,6 +742,24 @@ With prefix argument EOB-P, positions cursor at end of buffer." (push-mark) (goto-char (point-max)))) +(defun inf-clojure-insert-and-eval (form) + "Insert FORM into process and evaluate. +Indent FORM. FORM is expected to have been trimmed." + (let ((clojure-process (inf-clojure-proc))) + (with-current-buffer (process-buffer clojure-process) + (comint-goto-process-mark) + (let ((beginning (point))) + (insert (format "%s" form)) + (let ((end (point))) + (goto-char beginning) + (indent-sexp end))) + (comint-send-input t)))) + +(defun inf-clojure-insert-defun () + "Send current defun to process." + (interactive) + (inf-clojure-insert-and-eval (string-trim (inf-clojure--defun-at-point)))) + ;;; Now that inf-clojure-eval-/defun/region takes an optional prefix arg, ;;; these commands are redundant. But they are kept around for the user From 61e29eb95823480047224163d2e72c1f392fa310 Mon Sep 17 00:00:00 2001 From: dan sutton Date: Sun, 12 Apr 2020 12:55:19 -0500 Subject: [PATCH 2/4] Add insert last sexp and keymap to hold them all --- inf-clojure.el | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/inf-clojure.el b/inf-clojure.el index 740deb2..8aafb3a 100644 --- a/inf-clojure.el +++ b/inf-clojure.el @@ -125,6 +125,14 @@ mode. Default is whitespace followed by 0 or 1 single-letter colon-keyword ["Version" inf-clojure-display-version])) map)) +(defvar inf-clojure-insert-commands-map + (let ((map (define-prefix-command 'inf-clojure-insert-commands-map))) + (define-key map (kbd "d") #'inf-clojure-insert-defun) + (define-key map (kbd "C-d") #'inf-clojure-insert-defun) + (define-key map (kbd "e") #'inf-clojure-insert-last-sexp) + (define-key map (kbd "C-e") #'inf-clojure-insert-last-sexp) + map)) + (defvar inf-clojure-minor-mode-map (let ((map (make-sparse-keymap))) (define-key map "\M-\C-x" #'inf-clojure-eval-defun) ; Gnu convention @@ -135,7 +143,7 @@ mode. Default is whitespace followed by 0 or 1 single-letter colon-keyword (define-key map "\C-c\C-r" #'inf-clojure-eval-region) (define-key map "\C-c\M-r" #'inf-clojure-reload) (define-key map "\C-c\C-n" #'inf-clojure-eval-form-and-next) - (define-key map (kbd "C-c C-j") #'inf-clojure-insert-defun) + (define-key map (kbd "C-c C-j") 'inf-clojure-insert-commands-map) (define-key map "\C-c\C-z" #'inf-clojure-switch-to-repl) (define-key map "\C-c\C-i" #'inf-clojure-show-ns-vars) (define-key map (kbd "C-c C-S-a") #'inf-clojure-apropos) @@ -760,6 +768,13 @@ Indent FORM. FORM is expected to have been trimmed." (interactive) (inf-clojure-insert-and-eval (string-trim (inf-clojure--defun-at-point)))) +(defun inf-clojure-insert-last-sexp () + "Send last sexp to process." + (interactive) + (inf-clojure-insert-and-eval + (buffer-substring-no-properties (save-excursion (backward-sexp) (point)) + (point)))) + ;;; Now that inf-clojure-eval-/defun/region takes an optional prefix arg, ;;; these commands are redundant. But they are kept around for the user From 21035ab8e53f706034cab6b891735642d11b077f Mon Sep 17 00:00:00 2001 From: dan sutton Date: Sun, 12 Apr 2020 12:56:33 -0500 Subject: [PATCH 3/4] Remove whitespace --- inf-clojure.el | 1 - 1 file changed, 1 deletion(-) diff --git a/inf-clojure.el b/inf-clojure.el index 8aafb3a..35df4ae 100644 --- a/inf-clojure.el +++ b/inf-clojure.el @@ -775,7 +775,6 @@ Indent FORM. FORM is expected to have been trimmed." (buffer-substring-no-properties (save-excursion (backward-sexp) (point)) (point)))) - ;;; Now that inf-clojure-eval-/defun/region takes an optional prefix arg, ;;; these commands are redundant. But they are kept around for the user ;;; to bind if he wishes, for backwards functionality, and because it's From b63999575df47359992935fe66378d3fd0f83d89 Mon Sep 17 00:00:00 2001 From: dan sutton Date: Sun, 12 Apr 2020 13:01:50 -0500 Subject: [PATCH 4/4] Add insert commands to the changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ced329..d02ddc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### New features +* [#170](https://github.com/clojure-emacs/inf-clojure/pull/170): Add insert defun and last sexp commands * [#160](https://github.com/clojure-emacs/inf-clojure/pull/160): Support [Joker](https://joker-lang.org/). ### Bugs fixed