1

作为学习 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 的任何其他建议。

4

2 回答 2

2

你可以这样做:

(kill-whole-line)
(yank)
(yank)

达到同样的效果。但是,也许,如果我要编写这样一个函数,我宁愿这样做,这样该行就不会被复制到 kill-ring 中。通常,如果我需要复制行,我不希望它在那里。

于 2012-10-30T13:57:41.213 回答
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))))
于 2012-10-30T14:30:00.493 回答