1

Using emacs24 I'd like to attach for example # at the beginning of the next five lines. So having this:

Line1
line2
line3

get this:

#Line1
#line2
#line3

for the number of lines that I specify. How can I do that? Thanks!

4

6 回答 6

4

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

.Line1
line2
line3

设置标记

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

Line1
line2
.line3

C-x r t

键入#

按回车。

我会发现这比输入重复命令的次数值要自然得多,因为您可以直观地选择要编辑的行。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>

于 2013-02-22T03:46:38.327 回答
2

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

在您的情况下,以下键将起作用:

  1. 将光标移动到 Line1 的开头
  2. CX (
  3. 键入“#”
  4. Cn,然后是 Ca
  5. CX)
  6. 将光标移动到要添加“#”的行首
  7. 铜 10 Cx e

基本上,步骤 2-5 将录制一个宏,该宏将在开头添加一个 #,然后移至下一行的开头。步骤 6-7 将执行宏 10 次(当然,您可以将其更改为任意数量)。我想这将是相当多的击键和新手可能不喜欢它。也许其他人有更好的解决方案。

于 2013-02-22T06:56:27.950 回答
1

为什么不只是query-replace-regexpor replace-regexp?例如选择区域并执行C-M-%^RET#RET!

于 2013-02-22T17:22:53.430 回答
1
Line1
line2
line3

我写了以下代码:

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

  • 要么使用一个键,就像下面的建议 (f8),要么使用 Mxprompt-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
于 2013-02-22T09:49:47.920 回答
0

虽然comment-region在这个特定示例中很好,但请查看该multiple-cursors包以了解通常执行此类操作的非常强大的方法。

您可以C->反复点击,直到每行开头都有一个光标,然后点击#完成(C-g以摆脱多余的光标。)

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

于 2013-03-18T01:50:03.813 回答
0

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

于 2013-02-24T12:58:58.257 回答