Вот еще одна функция для этого. Моя версия не касается списка уничтожений, и курсор оказывается на новой строке, где он был на оригинале. Он будет дублировать регион, если он активен (режим переходной метки), или по умолчанию дублирует строку в противном случае. Он также сделает несколько копий, если ему присваивается префиксный аргумент, и закомментирует исходную строку, если задан аргумент с отрицательным префиксом (это полезно для тестирования другой версии команды / оператора при сохранении старой).
(defun duplicate-line-or-region (&optional n)
"Duplicate current line, or region if active.
With argument N, make N copies.
With negative N, comment out original line and use the absolute value."
(interactive "*p")
(let ((use-region (use-region-p)))
(save-excursion
(let ((text (if use-region ;Get region if active, otherwise line
(buffer-substring (region-beginning) (region-end))
(prog1 (thing-at-point 'line)
(end-of-line)
(if (< 0 (forward-line 1)) ;Go to beginning of next line, or make a new one
(newline))))))
(dotimes (i (abs (or n 1))) ;Insert N times, or once if not specified
(insert text))))
(if use-region nil ;Only if we're working with a line (not a region)
(let ((pos (- (point) (line-beginning-position)))) ;Save column
(if (> 0 n) ;Comment out original with negative arg
(comment-region (line-beginning-position) (line-end-position)))
(forward-line 1)
(forward-char pos)))))
Я привязан к C-c d
:
(global-set-key [?\C-c ?d] 'duplicate-line-or-region)
Это никогда не должно быть переназначено режимом или чем-то еще, потому что C-c
, за которым следует одна (неизмененная) буква, зарезервирована для пользовательских привязок.