dup-line(3)

もうちょっと詰めて当初の想定に近いものができた。そこら中変わってるのでもう一回。

(defun dup-line ()
  (interactive)
  (labels ((indent ()
       (buffer-substring (save-excursion (progn (goto-bol) (point))) (point))))
  (let ((cur-indent (indent))
      (cur-column (current-column))
      (column (save-excursion (goto-eol) (current-column))))
    (multiple-value-bind (from to)
      (save-excursion
        (values (while (backward-line)
            (goto-column cur-column)
            (if (equal (indent) cur-indent)
              (return (progn (goto-column column) (point)))))
            (progn (scan-buffer "[ -]\\|$" :regexp t :tail t) (point))))
    (goto-eol)
      (if from
        (dolist (x (coerce (buffer-substring from to) 'list)) (overwrite-char x))
      (message "ないよ")))
  (if (= cur-column column) nil (goto-column cur-column)))))

「想定に近い」というのは、undoしたときのカーソルの位置が気にくわないので。位置が変わって欲しくないんだけど、どうすればいいのかさっぱり。