]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix behavior of Eshell prompt when yanking output into it
authorJim Porter <jporterbugs@gmail.com>
Wed, 11 Oct 2023 18:38:27 +0000 (11:38 -0700)
committerJim Porter <jporterbugs@gmail.com>
Wed, 11 Oct 2023 19:44:31 +0000 (12:44 -0700)
* lisp/eshell/esh-util.el (eshell--unmark-string-as-output): New
function...

* lisp/eshell/esh-mode.el (eshell-mode): ... use it.

* test/lisp/eshell/eshell-tests.el (eshell-test/yank-output): New test
(bug#66469).

lisp/eshell/esh-mode.el
lisp/eshell/esh-util.el
test/lisp/eshell/eshell-tests.el

index 2b560afb92c0385f86a4832de89539e4475d975d..9d2cd1e67eb4746f01403842fb3dddeb0719137e 100644 (file)
@@ -361,6 +361,9 @@ and the hook `eshell-exit-hook'."
   (setq-local eshell-last-output-end (point-marker))
   (setq-local eshell-last-output-block-begin (point))
 
+  (add-function :filter-return (local 'filter-buffer-substring-function)
+                #'eshell--unmark-string-as-output)
+
   (let ((modules-list (copy-sequence eshell-modules-list)))
     (setq-local eshell-modules-list modules-list))
 
index 4c251a2926959f4a3dbc0e613699598b396bb328..ca2f775318a3b7b5df74972b473c8696aab3628b 100644 (file)
@@ -234,6 +234,14 @@ current buffer."
                 (eshell--mark-as-output start1 end1)))))
     (add-hook 'after-change-functions hook nil t)))
 
+(defun eshell--unmark-string-as-output (string)
+  "Unmark STRING as Eshell output."
+  (remove-list-of-text-properties
+   0 (length string)
+   '(rear-nonsticky front-sticky field insert-in-front-hooks)
+   string)
+  string)
+
 (defun eshell-find-delimiter
   (open close &optional bound reverse-p backslash-p)
   "From point, find the CLOSE delimiter corresponding to OPEN.
index b02e5fca592e49d8e64d550b592a8a360f0c7df5..d2ef44ae5073a0a0dd6dd689391d22a93a0b300d 100644 (file)
@@ -195,6 +195,25 @@ insert the queued one at the next prompt, and finally run it."
    (eshell-send-input)
    (eshell-match-output "(\"hello\" \"there\")")))
 
+(ert-deftest eshell-test/yank-output ()
+  "Test that yanking a line of output into the next prompt works (bug#66469)."
+  (with-temp-eshell
+   (eshell-insert-command "echo hello")
+   ;; Go to the output and kill the line of text.
+   (forward-line -1)
+   (kill-line)
+   ;; Go to the last prompt and yank the previous output.
+   (goto-char (point-max))
+   (yank)
+   ;; Go to the beginning of the prompt and add some text.
+   (move-beginning-of-line 1)
+   (insert-and-inherit "echo ")
+   ;; Make sure when we go to the beginning of the line, we go to the
+   ;; right spot (before the "echo").
+   (move-end-of-line 1)
+   (move-beginning-of-line 1)
+   (should (looking-at "echo hello"))))
+
 (provide 'eshell-tests)
 
 ;;; eshell-tests.el ends here