改进版,判断行尾字符决定是 insert 还是 remove,支持多行:
(defun insert-or-remove-trailing-char (&optional ch)
(interactive)
(let ((ch (or ch (read-char "Input char: ")))
(fn (lambda (ch)
(end-of-line)
(if (eq (char-before) ch)
(delete-backward-char 1)
(insert-char ch)))))
(save-excursion
(if (region-active-p)
(save-restriction
(narrow-to-region (region-beginning) (region-end))
(deactivate-mark)
(goto-char (point-min))
(funcall fn ch)
(while (< (point) (- (point-max) 1))
(next-line)
(funcall fn ch)))
(funcall fn ch)))))
(defun insert-or-remove-trailing-semi ()
(interactive)
(insert-or-remove-trailing-char ?\;))
(defun insert-or-remove-trailing-comma ()
(interactive)
(insert-or-remove-trailing-char ?,))