aboutsummaryrefslogtreecommitdiff
path: root/emacs
diff options
context:
space:
mode:
authorYuchen Pei <id@ypei.org>2023-08-19 22:39:27 +1000
committerYuchen Pei <id@ypei.org>2023-08-19 22:39:27 +1000
commit0c844c3e9a8e72bd83e370c12eda5cb315ac5d41 (patch)
tree209e732fc9187f9d627bffb7f683415c282c3639 /emacs
parenteb496dbcd9e1074dbbbca004f9aa2754bb18b2ec (diff)
improve delete-pair related functions
Diffstat (limited to 'emacs')
-rw-r--r--emacs/.emacs.d/init/ycp-editing.el5
-rw-r--r--emacs/.emacs.d/lisp/my/my-editing.el65
2 files changed, 69 insertions, 1 deletions
diff --git a/emacs/.emacs.d/init/ycp-editing.el b/emacs/.emacs.d/init/ycp-editing.el
index c53cf74..5634f86 100644
--- a/emacs/.emacs.d/init/ycp-editing.el
+++ b/emacs/.emacs.d/init/ycp-editing.el
@@ -55,10 +55,13 @@
;; call to `kill-visual-line' etc. when `visual-line-mode' is on.
(advice-add 'kill-visual-line :override 'kill-line)
(advice-add 'beginning-of-visual-line :override 'beginning-of-line)
- (advice-add 'end-of-visual-line :override 'end-of-line))
+ (advice-add 'end-of-visual-line :override 'end-of-line)
+ (setq delete-pair-blink-delay 0)
+ )
(my-package my-editing
(:delay 5)
+ (my-override delete-pair)
(my-keybind global-map
"C-k" #'my-kill-line
"M-k" #'my-kill-line-backward
diff --git a/emacs/.emacs.d/lisp/my/my-editing.el b/emacs/.emacs.d/lisp/my/my-editing.el
index 6bbde62..f8e405e 100644
--- a/emacs/.emacs.d/lisp/my/my-editing.el
+++ b/emacs/.emacs.d/lisp/my/my-editing.el
@@ -302,6 +302,71 @@ controlled by `delete-pair-blink-delay'."
(delete-pair -1)
(delete-pair 1)))
+(defun my-delete-line-if-space-only ()
+ "Delete the current line, if it has only space and nothing else."
+ (interactive)
+ (save-excursion
+ (beginning-of-line)
+ (when (looking-at-p "^\\ *$")
+ (delete-line))))
+
+;;; To override delete-pair
+(defun my-delete-pair (&optional arg)
+ "Delete a pair of characters enclosing ARG sexps that follow point.
+
+A negative ARG deletes a pair around the preceding ARG sexps
+instead. The option `delete-pair-blink-delay' can disable
+blinking.
+
+Delete space-only-lines caused by the deletion, as well as
+re-indent the affected region."
+ (interactive "P")
+ (if arg
+ (setq arg (prefix-numeric-value arg))
+ (setq arg 1))
+ (let ((beg) (end))
+ (if (< arg 0)
+ (save-excursion
+ (skip-chars-backward " \t")
+ (save-excursion
+ (let ((close-char (char-before)))
+ (forward-sexp arg)
+ (unless (member (list (char-after) close-char)
+ (mapcar (lambda (p)
+ (if (= (length p) 3) (cdr p) p))
+ insert-pair-alist))
+ (error "Not after matching pair"))
+ (when (and (numberp delete-pair-blink-delay)
+ (> delete-pair-blink-delay 0))
+ (sit-for delete-pair-blink-delay))
+ (delete-char 1)
+ (my-delete-line-if-space-only)
+ (setq beg (point))))
+ (delete-char -1)
+ (my-delete-line-if-space-only)
+ (setq end (point)))
+ (save-excursion
+ (skip-chars-forward " \t")
+ (save-excursion
+ (let ((open-char (char-after)))
+ (forward-sexp arg)
+ (unless (member (list open-char (char-before))
+ (mapcar (lambda (p)
+ (if (= (length p) 3) (cdr p) p))
+ insert-pair-alist))
+ (error "Not before matching pair"))
+ (when (and (numberp delete-pair-blink-delay)
+ (> delete-pair-blink-delay 0))
+ (sit-for delete-pair-blink-delay))
+ (delete-char -1)
+ (my-delete-line-if-space-only)
+ (setq end (point))))
+ (delete-char 1)
+ (my-delete-line-if-space-only)
+ (setq beg (point))))
+ (when (and beg end)
+ (indent-region beg end))))
+
;;;###autoload
(defun my-zap-back-to-char (char &optional arg)
"Backward `zap-to-char' for CHAR.