出于某种原因,在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")))
从消息中可以看出,您可以复制多行。但是,选择多行并复制时,只复制一行。为什么消息以这种方式构成?如何选择多行?
答案 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。