通过Emacs,如何将两行合并成一行?

55

我是Emacs的新手。我已经在Google上搜索过了,但没有好的答案。其中一个方法是 Ctrl-n Ctrl-a Backspace 这个方法可以用,但很愚蠢。有没有一种快速简单的方式将一块行合并成一行?

实际上,我现在可以使用Esc-q来自动填充段落,但我怎样才能在不使用UNDO的情况下撤消它呢?


1
谢谢您的想法,我会将其绑定到<M-1>。 - Ralph
命令“撤销”通常绑定到C-_(控制下划线)... - dmckee --- ex-moderator kitten
3
通常我会使用 C-e C-d。 - sharjeel
15个回答

200

在需要连接的一组行的最后一行上随意放置一个点,然后调用

M-^

一直重复此过程,直到所有行都合并为止。

注意:它在所有现在连接的行之间留有一个空格。


2
M-^ 通常绑定到什么? - stsquad
stsquad:你需要按下 Meta + Shift + 6(Shift + 6 会给你 ^) - Rafal Spacjer
1
啊,每天改善我的Emacsfu的乐趣。只有它才会让我想到不同的连结行函数:一个带有额外的空格,一个没有。 - Charles Roberto Canato
4
如果你想从第一行加入,直觉上应该使用C-u M-^(在我看来这更有用)。 - gypsydave5
1
@DirkHerrmann 在德国键盘上输入 M-^ 最好使用 ESC ^ SPC - JohnDoe
显示剩余2条评论

40

M-x join-line 可以将两行合并。只需将其绑定到方便的按键即可。


是的,它有效。然而,对于一个包含多行代码(3行或更多)的代码块来说,它没有任何用处。有没有其他有用的命令可以实现这个目的? - jcadam
8
但如果你到块的最后一行按下M-^(即join-line的键绑定)几次,你就能达到同样的效果。这个过程非常快速,所以除非你需要合并数百行,否则我更喜欢它而不是fill-column hack。否则就像Tal建议的那样,选择该块并用没有任何字符替换换行符(C-Q C-J)。 - danielpoe
我已经尝试将join-line绑定到M-1。它也很好用。正如你所建议的,这里有很多解决方案可以使用,所以我会灵活地尝试使用它们。非常感谢! - jcadam
2
这与按下 M-^ 的效果完全相同,因为 join-line 被别名为 delete-indentation,而后者绑定到了 M-^ - Vicky Chijwani
使用我的emacs版本(29.0.50),这个方法可以用于超过2行的文本。我将所有行都高亮选中,然后运行M-x join-line。 - krm

12

多光标结合使用M-^,可以将选定的所有行合并到一起,并删除所有多余的空白字符。

例如,要选择整个缓冲区,请调用多光标模式,合并为一行,然后禁用多光标模式:

C-x h
M-x mc/edit-lines
M-^
C-g

我的多光标爱越来越浓。 - Bae
谢谢你的好建议!简直像魔法一样好用。 - ychaouche

11

Emacs中“join”的常规名称是“fill”。是的,你可以使用M-^连接两个行 — 这很方便 — 但更普遍的情况是你想连接n行。为此,请参见fill*命令,例如 fill-regionfill-paragraph等。

有关选择可以填充的内容的更多信息,请参见此处

此外,你也可以通过先选择这些行来使用M-^连接多个行(请注意通用参数在这种情况下不起作用)。


2
会投票支持这个回答是用语正确的答案。 - JohnDoe
fill-region 运行良好,但是 M-^(事实上也包括 C-j)在先选择区域后仍无法正常工作。 - ychaouche
另外,不确定fill=join。fill是根据fill-width定义的特定限制进行连接的。 - ychaouche

9

只需将换行符替换为空即可。


5

我喜欢Sublime Text中使用 Command J 连接行的方式,所以我也这样做:

(defun join-lines (arg)
  (interactive "p")
  (end-of-line)
  (delete-char 1)
  (delete-horizontal-space)
  (insert " "))

不错,但是当下一行只包含空格或为空时,如何不插入空格? - rofrol

4
您可以为此定义一个新命令,在使用Esc-q命令之前暂时调整填充宽度:
;; -- define a new command to join multiple lines together --
(defun join-lines () (interactive)
 (setq fill-column 100000)
 (fill-paragraph nil)
 (setq fill-column 78)
)

显然,这只适用于段落长度不超过100000个字符的情况。

10
不更改fill-column的值,可以这么写: (defun join-lines () (interactive) (let ((fill-column 999999)) (fill-paragraph nil))) - huaiyuan
是的,这应该更优雅。 - jcadam
这是什么?(defun unfill-paragraph () "与 fill-paragraph 相反的操作" (interactive) (let ((fill-column (point-max))) (fill-paragraph nil))) - Gyom
1
雷·维加(Ray Vega)的答案(下面)应该是被接受的,老实说。 - gypsydave5

3
我使用以下函数并将其绑定到“M-J”键。
(defun concat-lines ()
  (interactive)
  (next-line)
  (join-line)
  (delete-horizontal-space))

如果您希望保留光标位置,则可以使用save-excursion


2

由于join-line会在两行之间留下一个空格,而且它只支持连接两行。如果你想连接很多行而不留下一个空格,你可以使用“搜索替换”模式来解决,具体如下:

  1. C-%
  2. 查询: 输入 C-q C-j Enter
  3. 替换: Enter
  4. 运行替换操作. Enter

完成。


2

最简单的方法:

  1. M-hC-SPC 选择段落/行。
  2. 按下 M-q
  3. 看到Emagics(Emacs魔法)!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接