【发布时间】:2014-04-24 03:27:06
【问题描述】:
出于某种原因,在 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") 放入我上面的 global-set-key 中?
我的第二个问题:使用上面链接中的标准复制行:
(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")))
从该消息看来,您可以复制多行。但是,在选择多行和复制时,只复制一个。为什么消息以这种方式构造?怎么选择多行?
【问题讨论】:
-
kill-ring-save的两个参数是缓冲区中的位置(想想坐标)。相反,您使用了移动点但不返回坐标的调用函数(它们返回 nil)。
标签: emacs