试图在Lisp中创建一个重复行函数

时间:2012-10-30 13:50:23

标签: emacs elisp

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

2 个答案:

答案 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))))