作为学习ELisp的一部分,我正在尝试创建一个函数,在当前行下面复制当前行(复制该行)。到目前为止我的工作得很好,除了在缓冲区的最后一行。如果在最后一行,那么该行只会粘贴在该行的末尾而不是它的下方。
这是我的代码:
(defun duplicate-line ()
"duplicate the current line"
(interactive)
(save-excursion
(kill-ring-save (line-beginning-position) (line-beginning-position 2))
(goto-char (line-beginning-position 2)) ; goto the start of the next line
(yank)
)
(next-line)
)
有更好的方法吗?我也很感激有关编写elisp的任何其他建议。
答案 0 :(得分:2)
你可以改为:
(kill-whole-line)
(yank)
(yank)
达到同样的效果。但是,也许,如果我要写这样一个函数,我宁愿这样做,所以这条线不会被复制到kill-ring。通常,如果我需要复制行,我不希望它在那里。
答案 1 :(得分:2)
我想这只有在最后一行不以换行符结束时才会发生。
以下函数会在必要时插入换行符,并避免使用kill-ring。
(defun duplicate-line ()
(interactive)
(let* ((pos-end (line-beginning-position 2))
(line (buffer-substring (line-beginning-position) pos-end)))
(goto-char pos-end)
(unless (bolp) (newline))
(save-excursion ;; leave point before the duplicate line
(insert line))))