Duplicating the current line is frequent editing for me when I am coding. Initially, I copied a snippet as a commend in Emacs from the Internet:
(defun w/duplicate-line() "Duplicate the current line." (interactive) (move-beginning-of-line 1) (kill-line) (yank) (open-line 1) (next-line 1) (yank))
Most of the time, I was happy with it, but it has two drawbacks:
It cannot keep the column position when moving to the next line
It messes up with the yank ring as it yanks the text along the way
So today, I took some time to fix these two problems, and I also want it to be capable of commenting the current line out if I prefix the command.
Here is the improved version (it still doesn't handle the column position perfectly when the user commenting on the line first):
(defun w/duplicate-line(comment-first) "Duplicate the current line." (interactive "P") (let ((line-text (buffer-substring-no-properties (line-beginning-position) (line-end-position)))) (save-excursion (if comment-first (progn (comment-line 1) (move-beginning-of-line 1) (open-line 1)) (move-end-of-line 1) (open-line 1) (forward-char)) (insert line-text)) (next-line)))