From 575f5040b39a7244c4be241c9d566d19bdec7ca5 Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Sat, 26 Oct 2019 16:25:23 -0400 Subject: [PATCH 01/15] add haskell-interactive-mode-backward-kill-word --- haskell-interactive-mode.el | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index fc0212d57..ad8b3cf8b 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -65,6 +65,8 @@ interference with prompts that look like haskell expressions." (define-key map (kbd "C-j") 'haskell-interactive-mode-newline-indent) (define-key map [remap move-beginning-of-line] 'haskell-interactive-mode-bol) (define-key map (kbd "") 'haskell-interactive-mode-beginning) + (define-key map (kbd "M-") 'haskell-interactive-mode-backward-kill-word) + (define-key map (kbd "C-") 'haskell-interactive-mode-backward-kill-word) (define-key map (kbd "C-c C-k") 'haskell-interactive-mode-clear) (define-key map (kbd "C-c C-c") 'haskell-process-interrupt) (define-key map (kbd "C-c C-f") 'next-error-follow-minor-mode) @@ -175,6 +177,20 @@ be nil.") (kill-region haskell-interactive-mode-prompt-start (line-end-position))) +(defun haskell-interactive-mode-backward-kill-word () + (interactive) + (let ((cur-point (point)) + (bol-point) + (backward-word-point)) + (save-excursion + (haskell-interactive-mode-bol) + (setq bol-point (point))) + (save-excursion + (backward-word) + (setq backward-word-point (point))) + (cond ((< backward-word-point bol-point) (haskell-interactive-mode-bol)) + ((>= backward-word-point bol-point) (backward-kill-word 1))))) + (defun haskell-interactive-switch-back () "Switch back to the buffer from which this interactive buffer was reached." (interactive) From 2ff870962fca37c81a8db0e08195e8658a92cdf6 Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Sat, 26 Oct 2019 16:33:25 -0400 Subject: [PATCH 02/15] add brief docstring --- haskell-interactive-mode.el | 1 + 1 file changed, 1 insertion(+) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index ad8b3cf8b..6d004541e 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -178,6 +178,7 @@ be nil.") (line-end-position))) (defun haskell-interactive-mode-backward-kill-word () + "Kill word backward, stopping at the REPL prompt." (interactive) (let ((cur-point (point)) (bol-point) From b262b2c276ffb215b26f06ec29543d9e899c44a4 Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Sat, 26 Oct 2019 16:59:34 -0400 Subject: [PATCH 03/15] remap backward-kill-word instead of providing explicit keys --- haskell-interactive-mode.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index 6d004541e..f1882b735 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -65,8 +65,7 @@ interference with prompts that look like haskell expressions." (define-key map (kbd "C-j") 'haskell-interactive-mode-newline-indent) (define-key map [remap move-beginning-of-line] 'haskell-interactive-mode-bol) (define-key map (kbd "") 'haskell-interactive-mode-beginning) - (define-key map (kbd "M-") 'haskell-interactive-mode-backward-kill-word) - (define-key map (kbd "C-") 'haskell-interactive-mode-backward-kill-word) + (define-key map [remap backward-kill-word] 'haskell-interactive-mode-backward-kill-word) (define-key map (kbd "C-c C-k") 'haskell-interactive-mode-clear) (define-key map (kbd "C-c C-c") 'haskell-process-interrupt) (define-key map (kbd "C-c C-f") 'next-error-follow-minor-mode) From 0c4fa9bd30094359873da2c120ed53de4820b5da Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Sat, 26 Oct 2019 17:12:14 -0400 Subject: [PATCH 04/15] kill line instead of just moving to bol --- haskell-interactive-mode.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index f1882b735..c3b5c1769 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -188,7 +188,7 @@ be nil.") (save-excursion (backward-word) (setq backward-word-point (point))) - (cond ((< backward-word-point bol-point) (haskell-interactive-mode-bol)) + (cond ((< backward-word-point bol-point) (haskell-interactive-mode-kill-whole-line)) ((>= backward-word-point bol-point) (backward-kill-word 1))))) (defun haskell-interactive-switch-back () From 4d7ac23b61d2a6d8a5119287520a904ba2a6e163 Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Sat, 26 Oct 2019 17:14:47 -0400 Subject: [PATCH 05/15] fix unused variable issue --- haskell-interactive-mode.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index c3b5c1769..cb4eb5502 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -179,8 +179,7 @@ be nil.") (defun haskell-interactive-mode-backward-kill-word () "Kill word backward, stopping at the REPL prompt." (interactive) - (let ((cur-point (point)) - (bol-point) + (let ((bol-point) (backward-word-point)) (save-excursion (haskell-interactive-mode-bol) From c47a3c23f2c94e65bfebf2d2138eb4a6bb3097c4 Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Sat, 26 Oct 2019 17:44:10 -0400 Subject: [PATCH 06/15] check if on prompt line, and don't erase content ahead of point --- haskell-interactive-mode.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index cb4eb5502..650ddbbd5 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -187,7 +187,10 @@ be nil.") (save-excursion (backward-word) (setq backward-word-point (point))) - (cond ((< backward-word-point bol-point) (haskell-interactive-mode-kill-whole-line)) + (if (not (haskell-interactive-at-prompt)) + (backward-kill-word 1)) + (cond ((< backward-word-point bol-point) (delete-backward-char + (- (point) haskell-interactive-mode-prompt-start))) ((>= backward-word-point bol-point) (backward-kill-word 1))))) (defun haskell-interactive-switch-back () From e70652968e4ea131178a99750b73d6c9b202e3c4 Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Sat, 26 Oct 2019 17:56:28 -0400 Subject: [PATCH 07/15] add universal argument support --- haskell-interactive-mode.el | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index 650ddbbd5..d2e84f716 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -176,22 +176,24 @@ be nil.") (kill-region haskell-interactive-mode-prompt-start (line-end-position))) -(defun haskell-interactive-mode-backward-kill-word () - "Kill word backward, stopping at the REPL prompt." - (interactive) - (let ((bol-point) +(defun haskell-interactive-mode-backward-kill-word (n) + (interactive "p") + (let ((n (or n 1)) + (bol-point) (backward-word-point)) - (save-excursion - (haskell-interactive-mode-bol) - (setq bol-point (point))) - (save-excursion - (backward-word) - (setq backward-word-point (point))) - (if (not (haskell-interactive-at-prompt)) - (backward-kill-word 1)) - (cond ((< backward-word-point bol-point) (delete-backward-char - (- (point) haskell-interactive-mode-prompt-start))) - ((>= backward-word-point bol-point) (backward-kill-word 1))))) + (cl-loop + repeat n do + (save-excursion + (haskell-interactive-mode-bol) + (setq bol-point (point))) + (save-excursion + (backward-word) + (setq backward-word-point (point))) + (if (not (haskell-interactive-at-prompt)) + (backward-kill-word 1)) + (cond ((< backward-word-point bol-point) (delete-backward-char + (- (point) haskell-interactive-mode-prompt-start))) + ((>= backward-word-point bol-point) (backward-kill-word 1)))))) (defun haskell-interactive-switch-back () "Switch back to the buffer from which this interactive buffer was reached." From 94383794edaa90934b15d80c7ae6500bcdb8f801 Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Sat, 26 Oct 2019 18:00:14 -0400 Subject: [PATCH 08/15] add back docstring --- haskell-interactive-mode.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index d2e84f716..4390fb672 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -177,23 +177,24 @@ be nil.") (line-end-position))) (defun haskell-interactive-mode-backward-kill-word (n) + "Kill word behind point, stopping at the REPL prompt." (interactive "p") (let ((n (or n 1)) (bol-point) (backward-word-point)) (cl-loop repeat n do - (save-excursion - (haskell-interactive-mode-bol) - (setq bol-point (point))) - (save-excursion - (backward-word) - (setq backward-word-point (point))) (if (not (haskell-interactive-at-prompt)) - (backward-kill-word 1)) - (cond ((< backward-word-point bol-point) (delete-backward-char - (- (point) haskell-interactive-mode-prompt-start))) - ((>= backward-word-point bol-point) (backward-kill-word 1)))))) + (backward-kill-word 1) + (save-excursion + (haskell-interactive-mode-bol) + (setq bol-point (point))) + (save-excursion + (backward-word) + (setq backward-word-point (point))) + (cond ((< backward-word-point bol-point) (delete-backward-char + (- (point) haskell-interactive-mode-prompt-start))) + ((>= backward-word-point bol-point) (backward-kill-word 1))))))) (defun haskell-interactive-switch-back () "Switch back to the buffer from which this interactive buffer was reached." From 480da36077c769cd1535fde2196196b57dbd1a89 Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Sat, 26 Oct 2019 18:05:51 -0400 Subject: [PATCH 09/15] fix CI issue --- haskell-interactive-mode.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index 4390fb672..eaaf3d789 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -192,8 +192,8 @@ be nil.") (save-excursion (backward-word) (setq backward-word-point (point))) - (cond ((< backward-word-point bol-point) (delete-backward-char - (- (point) haskell-interactive-mode-prompt-start))) + (cond ((< backward-word-point bol-point) (delete-char + (- haskell-interactive-mode-prompt-start (point)))) ((>= backward-word-point bol-point) (backward-kill-word 1))))))) (defun haskell-interactive-switch-back () From 7008870dfe97d81e2ab143283655852362a3ae41 Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Sun, 27 Oct 2019 11:25:07 -0400 Subject: [PATCH 10/15] refactor and handle non-whitespace between prompt and point --- haskell-interactive-mode.el | 41 ++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index eaaf3d789..06a2283e4 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -179,22 +179,35 @@ be nil.") (defun haskell-interactive-mode-backward-kill-word (n) "Kill word behind point, stopping at the REPL prompt." (interactive "p") - (let ((n (or n 1)) - (bol-point) + (let ((bol-point) (backward-word-point)) (cl-loop - repeat n do - (if (not (haskell-interactive-at-prompt)) - (backward-kill-word 1) - (save-excursion - (haskell-interactive-mode-bol) - (setq bol-point (point))) - (save-excursion - (backward-word) - (setq backward-word-point (point))) - (cond ((< backward-word-point bol-point) (delete-char - (- haskell-interactive-mode-prompt-start (point)))) - ((>= backward-word-point bol-point) (backward-kill-word 1))))))) + repeat (or n 1) do + ;; if point is not after prompt, fall back on backward-kill-word + (cond ((not (haskell-interactive-at-prompt)) + (backward-kill-word 1)) + ;; if there's any non-whitespace between the prompt and point, + ;; fall back on backward-kill-word + ((string-match + "[^[:space:]]" + (buffer-substring-no-properties + haskell-interactive-mode-prompt-start + (point))) + (backward-kill-word 1)) + ;; else + (t + (progn + (save-excursion + (haskell-interactive-mode-bol) + (setq bol-point (point))) + (save-excursion + (backward-word) + (setq backward-word-point (point))) + (cond ((< backward-word-point bol-point) + (delete-char + (- haskell-interactive-mode-prompt-start (point)))) + ((>= backward-word-point bol-point) + (backward-kill-word 1))))))))) (defun haskell-interactive-switch-back () "Switch back to the buffer from which this interactive buffer was reached." From 035e06e1d991f89ab72ad5e322b08130b4e28186 Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Sun, 27 Oct 2019 11:28:00 -0400 Subject: [PATCH 11/15] get rid of unnecessary progn --- haskell-interactive-mode.el | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index 06a2283e4..681384861 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -196,18 +196,17 @@ be nil.") (backward-kill-word 1)) ;; else (t - (progn - (save-excursion - (haskell-interactive-mode-bol) - (setq bol-point (point))) - (save-excursion - (backward-word) - (setq backward-word-point (point))) - (cond ((< backward-word-point bol-point) - (delete-char - (- haskell-interactive-mode-prompt-start (point)))) - ((>= backward-word-point bol-point) - (backward-kill-word 1))))))))) + (save-excursion + (haskell-interactive-mode-bol) + (setq bol-point (point))) + (save-excursion + (backward-word) + (setq backward-word-point (point))) + (cond ((< backward-word-point bol-point) + (delete-char + (- haskell-interactive-mode-prompt-start (point)))) + ((>= backward-word-point bol-point) + (backward-kill-word 1)))))))) (defun haskell-interactive-switch-back () "Switch back to the buffer from which this interactive buffer was reached." From ede42afb5a0543894cc3bab959875ff3957c6d04 Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Sun, 27 Oct 2019 11:34:58 -0400 Subject: [PATCH 12/15] fix unnecessary beginning of line code --- haskell-interactive-mode.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index 681384861..f3995817f 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -194,15 +194,14 @@ be nil.") haskell-interactive-mode-prompt-start (point))) (backward-kill-word 1)) - ;; else + ;; else, compare point at beginning of line with prompt-start (t - (save-excursion - (haskell-interactive-mode-bol) - (setq bol-point (point))) (save-excursion (backward-word) (setq backward-word-point (point))) - (cond ((< backward-word-point bol-point) + ;; if backward-kill-word would take point behind prompt, kill to + ;; prompt-start, else fall back on backward-kill-word + (cond ((< backward-word-point haskell-interactive-mode-prompt-start) (delete-char (- haskell-interactive-mode-prompt-start (point)))) ((>= backward-word-point bol-point) From 76979051a25f61d0b374c6388185a4f34a1cd17c Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Sun, 27 Oct 2019 11:36:23 -0400 Subject: [PATCH 13/15] remove unused local variable --- haskell-interactive-mode.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index f3995817f..877b4622d 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -179,8 +179,7 @@ be nil.") (defun haskell-interactive-mode-backward-kill-word (n) "Kill word behind point, stopping at the REPL prompt." (interactive "p") - (let ((bol-point) - (backward-word-point)) + (let ((backward-word-point)) (cl-loop repeat (or n 1) do ;; if point is not after prompt, fall back on backward-kill-word From 90129f1267b5c7b6c0daa4ec284501f9a7e1e647 Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Tue, 29 Oct 2019 10:19:00 -0400 Subject: [PATCH 14/15] fix unbound variable, add newline to regexp --- haskell-interactive-mode.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index 877b4622d..39882d788 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -188,7 +188,7 @@ be nil.") ;; if there's any non-whitespace between the prompt and point, ;; fall back on backward-kill-word ((string-match - "[^[:space:]]" + "[^[:space:]^[^M]]" (buffer-substring-no-properties haskell-interactive-mode-prompt-start (point))) @@ -203,7 +203,7 @@ be nil.") (cond ((< backward-word-point haskell-interactive-mode-prompt-start) (delete-char (- haskell-interactive-mode-prompt-start (point)))) - ((>= backward-word-point bol-point) + ((>= backward-word-point haskell-interactive-mode-prompt-start) (backward-kill-word 1)))))))) (defun haskell-interactive-switch-back () From fdc174a731865da14b25ce6a77050b293b5a21b9 Mon Sep 17 00:00:00 2001 From: Ryan Pilgrim Date: Tue, 29 Oct 2019 11:12:45 -0400 Subject: [PATCH 15/15] simplify regex --- haskell-interactive-mode.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/haskell-interactive-mode.el b/haskell-interactive-mode.el index 39882d788..103bc749a 100644 --- a/haskell-interactive-mode.el +++ b/haskell-interactive-mode.el @@ -188,7 +188,7 @@ be nil.") ;; if there's any non-whitespace between the prompt and point, ;; fall back on backward-kill-word ((string-match - "[^[:space:]^[^M]]" + "[^[:space:^M]]" (buffer-substring-no-properties haskell-interactive-mode-prompt-start (point)))