【问题标题】:Emacs Copy Current LineEmacs 复制当前行
【发布时间】: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


【解决方案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。

【讨论】:

  • 这不像 OP 想要的那样工作。它不会回到缩进,而是回到行首。
  • 如果要改成第一个非空格,改成: (kill-ring-save (save-excursion (back-to-indentation) (point)) (point-at -eol))。当然,那基本上给出了原来的功能;简单的一点是活动部件更少,因此更容易理解。
【解决方案2】:

这是你的函数,已修复:

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

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

至于其他函数,调用时会复制多行 前缀参数,例如C-uM-5

【讨论】:

    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 2011-01-18
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多