(defun clion-backspace (arg)
(interactive "*P")
(if (<= (current-column) (current-indentation))
(if (= (current-indentation) (c-get-syntactic-indentation (c-guess-basic-syntax)))
(if (previous-line-blank-p) (moveline-up) (delete-indentation))
(if (= (current-column) 0)
(if (previous-line-blank-p) (moveline-up) (delete-indentation)) (c-indent-line)))
(backward-delete-char-untabify(prefix-numeric-value arg))))
(defun moveline-up ()
(delete-region (line-beginning-position 0) (line-beginning-position))
(c-indent-line))
(defun previous-line-blank-p ()
(save-excursion
(previous-line)
(beginning-of-line)
(looking-at "[[:space:]]*$")))
4 个赞
(c-get-syntactic-indentation (c-guess-basic-syntax))
只适用于 c-mode
及其派生模式。
只删除上一行空行,再上一行空行不删除?
对的,最多只删除一行,只在c中适用,和Clion差不多,挺趁手的,刚学elisp一周,写这么个破玩意,以后再改
上次问缩进状态函数就是为了干这事
改成这样好用了
(defun clion-backspace (arg)
"Simulate clion's backspace key behavior"
(interactive "*P")
(if (and (<= (current-column) (current-indentation)) (not (use-region-p)))
(if (bolp)
(progn (c-indent-line) (plb))
(when (= (c-indent-line) 0) (plb)))
(c-electric-backspace arg)))
(defun plb ()
(if (save-excursion
(previous-line)
(beginning-of-line)
(looking-at "[[:space:]]*$"))
(delete-region (line-beginning-position 0) (line-beginning-position))
(delete-indentation)))
(define-key c-mode-map (kbd "DEL") 'clion-backspace)
(provide 'clion-backspace)