コンプリーション

DOSプロンプトで→を押すと前の文字が出てくるのを再現したかったので書いてみた。

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

全く同じ仕様だと使いにくいので、インデントとか$>の文字を見て、同じっぽい行から取得するように。また、1文字ずつだとまだるっこしいので適当な区切りまで持ってくるようにしてみた。