如何使用Emacs将字符附加到下N行?

时间:2013-02-22 01:04:56

标签: emacs emacs24

使用emacs24我想在接下来的五行开头添加例如#。 所以有这个:

Line1
line2
line3

得到这个:

#Line1
#line2
#line3

表示我指定的行数。我怎样才能做到这一点?谢谢!

6 个答案:

答案 0 :(得分:4)

虽然Emacs中可能有内置功能,但你可以编写一些Lisp来完成它,我通常会使用“矩形编辑”功能来完成这项工作。想象一下,缓冲区包含以下内容,.表示点(光标所在的位置)

.Line1
line2
line3

设置标记

C-n两次。这是缓冲区的状态:

Line1
line2
.line3

C-x r t

输入#

按enter键。

我会发现这比输入重复命令的次数值更自然,因为您可以直观地选择要编辑的行。 YMMV

修改

以下是使用Emacs Lisp进行此操作的方法。请注意,虽然我已经使用Emacs几年了,但我最近才开始学习如何实际使用Emacs Lisp,所以这段代码可能不是那么棒!它确实完成了工作。

(defun insert-n-times (s n)
  (interactive "Mstring:\nNtimes:")
  (while (> n 0)
    (insert s)
    (goto-char (- (point) 1))
    (next-line)
    (setq n (- n 1))))

通过执行以下操作来使用它:M-x insert-n-times RET <type a string> RET <type a number>

答案 1 :(得分:2)

另一种方法是使用宏来完成这样的重复工作。 Here是一个描述如何在Emacs中使用宏的页面。如果您不熟悉它,可以查看它。

在您的情况下,以下键可以使用:

  1. 将光标移动到Line1的开头
  2. C-x(
  3. 输入&#39;#&#39;
  4. C-n,然后是C-a
  5. C-x)
  6. 将光标移动到要添加的开头的行&#39;#&#39;
  7. C-u 10 C-x e
  8. 基本上,步骤2-5将记录一个宏,它将在开头添加一个#,然后移动到下一行的开头。步骤6-7将执行宏10次(当然,您可以将其更改为任意数字)。我想这将是很多按键,新手可能不喜欢它。也许其他人有更好的解决方案。

答案 2 :(得分:1)

Line1
line2
line3

我写了以下代码:

  • 您首先给出一个数字参数(您想要执行此操作的次数),例如M-3(按住alt,按3),执行以下3次

  • 使用密钥,如下面的建议(f8),或使用M-x prompt-for-insert

  • 它会要求您输入一个字符串。例如“foo”并点击返回按钮。

然后你会问。

(defun prompt-for-insert (val)
  (interactive "P")
  (let ((astring (read-string "What do you want to insert?"))
        (value val))
    (while (> value 0)
      (insert astring)
      (move-beginning-of-line 2)
      (decf value)))
  )

(global-set-key [f8] 'prompt-for-insert)

然后整个序列将是:

M-3 [f8] foo RET

导致:

fooLine1
fooline2
fooline3

答案 3 :(得分:1)

为什么不只是query-replace-regexpreplace-regexp?例如。选择区域并执行 CM - % ^ RET RET

答案 4 :(得分:0)

试试M-x string-insert-rectangle。此命令在矩形的每一行上插入一个字符串。

答案 5 :(得分:0)

虽然comment-region在这个具体示例中表现良好,但请查看multiple-cursors包,这是一种非常强大的方式来执行此类操作。

您可以反复点击C->,直到每行开头有一个光标,然后点击#并完成(C-g以删除额外的游标。)

这是C-x r t的一种更具互动性的形式,也适用于非矩形区域(例如C-s之后。)