Emacs复制当前行

时间:2014-03-18 12:33:36

标签: emacs

出于某种原因,在Emacs中复制行是非常不直观和困难的。如果我在这里做错了,请告诉我。令人惊讶的是Emacs默认情况下没有这个。

我正在尝试编写一个复制一行的函数。我以前经常这样:

(global-set-key (kbd "C-x c") "\C-a\C- \C-n\M-w")

这有点烦人,因为它会在行后复制任何新行。我决定将其更改为:

(global-set-key (kbd "C-x c") "\M-m\C- \C-e\M-w")

现在,我看到:http://www.emacswiki.org/emacs/CopyingWholeLines并且看起来他们的复制线功能会打印一条消息,其中包含复制的行数。我试图将该消息插入上面的global-set-key,但它无法正常工作。基本上,我无法在函数中运行上面的原始序列。所以我将每次按键转换成一个函数并执行此操作:

(defun copy-line ()
   (interactive)
   (kill-ring-save
    (back-to-indentation)
    (move-end-of-line 1))
    (message "1 line copied"))
;; optional key binding                 
(global-set-key "\C-c\C-k" 'copy-line)

然而,这会引发wrong number of arguments错误。

我的第一个问题:如何将(message "1 line copied")放入上面的全局设置键中?

我的第二个问题:使用上面链接中的标准副本行:

(defun copy-line (arg)
      "Copy lines (as many as prefix argument) in the kill ring"
      (interactive "p")
      (kill-ring-save (line-beginning-position)
                      (line-beginning-position (+ 1 arg)))
      (message "%d line%s copied" arg (if (= 1 arg) "" "s")))

从消息中可以看出,您可以复制多行。但是,选择多行并复制时,只复制一行。为什么消息以这种方式构成?如何选择多行?

2 个答案:

答案 0 :(得分:3)

这是你的功能,修复:

(defun copy-line ()
  (interactive)
  (save-excursion
    (back-to-indentation)
    (kill-ring-save
     (point)
     (line-end-position)))
     (message "1 line copied"))

问题在于back-to-indentation没有返回点。

对于其他函数,它会在调用时复制多行 前缀参数,例如 C-u M-5

答案 1 :(得分:1)

以下是简单函数的简短版本:

(defun copy-line ()
  (interactive)
  (kill-ring-save (point-at-bol) (point-at-eol))
  (message "1 line copied"))

对于您引用的多行复制版本,请使用前缀指示要复制的行数(如另一个答案所示)。因此,使用C-c C-k的键绑定,执行以下操作来复制,例如,3行:C-u 3 C-c C-k。