如何在Emacs中将多行从缓冲区复制到另一行?

时间:2014-01-15 01:21:58

标签: emacs

我有两个缓冲区。我想将第一个缓冲区中的第2,5,9和10行复制到第二个缓冲区(只是附加到第二个缓冲区)。除了一次复制和过去一行,有没有优雅的方法呢?

4 个答案:

答案 0 :(得分:4)

对于现成的功能,我建议您查看multiple-cursors.el。当你有一个符号/正则表达式需要在多个地方选择和修改时,它会特别有效。

https://github.com/magnars/multiple-cursors.el

但是,它也可以通过其通用添加光标功能处理特定的行/点:

mc/add-cursor-on-click

但这意味着您必须将其绑定到鼠标事件(如“提示”部分中所建议的那样):

(global-set-key (kbd "C-S-<mouse-1>") 'mc/add-cursor-on-click)

这意味着您必须触及鼠标,但创建新函数mc/add-cursor-at-line看起来非常简单:

(defun mc/add-cursor-at-line (&optional linenum)
  (interactive "nLine number: ")
  (save-excursion 
    (goto-char (point-min))
    (forward-line (1- linenum))
    (mc/create-fake-cursor-at-point))
  (mc/maybe-multiple-cursors-mode))

然后,一旦你在所有线路上设置了多个光标:

复制所有游标: C-SPC C-e M-w RET

切换缓冲区和......

Yank Rectangle: C-x r y

答案 1 :(得分:4)

您可以使用绑定到append-next-kill的命令C-M-w将更多文本添加到kill ring上的最新条目。在M-w命令之前使用它,如下所示:

  • 标记并复制第2行:C-SPCC-nM-w
  • 转到第5行
  • 标记并附加副本:C-SPCC-nC-M-wM-w
  • 转到第9行...

......等等。

当您使用C-y抽取文本时,您将获得所选的行并将所有行一起附加到杀戮戒指条目。

答案 2 :(得分:3)

一个简单的解决方案是记录一个宏,将一条线从一个缓冲区复制到另一个缓冲区( f3 C-SCP Cn Mw Cx o Cy Cx o f4 ),然后执行宏( f4 )在你要复制的每一行上。

如果这是您的定期方案,您可以保存宏并将其绑定到密钥。

答案 3 :(得分:0)

根据确切的用例,我可能会将整个区域从第一行复制到最后一行,然后在新缓冲区中删除那些我不需要的行。

  • 1。移至第一行的开头进行复制
  • 2。 C-space 设置标记以开始标记区域
  • 第3。移动最后一行的末尾以复制
  • 4. M-w 复制区域
  • 5. Cx b 缓冲区名称 RET 转到第二个缓冲区
  • 6。移动到第二个缓冲区中的插入位置
  • 7. C-y insert(yank)region
  • 8。 C-x C-x 进入被拉扯区域的开头
  • 9。 C-n 重复,直至找到第一个不需要的行
  • 10. C-k C-k 删除不需要的行
  • 11。 转到9完成

如果在新缓冲区中有较长的不需要的行要删除,则步骤9到11应替换为:

  • 9。移动到更长的不需要的线条的开头
  • 10. C-space 设置标记以开始标记区域
  • 11。移动到更长的不需要的线条结束
  • 12。 C-w 杀死地区
  • 13。 转到9完成