如何在Emacs中将一个字符替换为换行符?

339
我正在尝试使用Emacs中的replace-string和/或replace-regexp将一个字符(例如;)替换为一个新行。

我尝试了以下命令:

  • M-x replace-string RET ; RET \n

    这会用两个字符\n替换;

  • M-x replace-regex RET ; RET \n

    这会导致以下错误(在迷你缓冲区中显示):

    Invalid use of `' in replacement text.

使用replace-string有什么问题?还有其他方法吗?

6个回答

518

M-x replace-string RET ; RET C-q C-j.

  • C-q代表quoted-insert

  • C-j表示换行符。


3
C-q 实际上是“引用插入”命令,它会引用下一个字符。 - Joe Casadonte
3
我认为实际上应该是“quoted”而不是“quote”,比如“quoted-insert”。至少在22.1版本中是这样的。 - Bryan Oakley
10
C-j 是一个字面上的 0x0a 控制码,而 Ret 键位于引号旁边,发送 0x0d。https://en.wikipedia.org/wiki/C0_and_C1_control_codes - Jonathan Arkell
2
对于vim用户,请注意在emacs中使用C-j,而在vim中使用C-m - user5671078
3
@JonathanArkell 这是一个描述它如何工作的方式,而不是为什么。在编辑器中,Ret键会产生0x0a,那么为什么在quoted-insert中它应该产生0x0d呢?这毫无意义。(仅仅因为历史原因内部键盘代码是0x0d吗?我们在很多地方都使用键映射,为什么不在这里呢,这完全有道理) - vog
以上在emacs中可以工作,但在spacemacs中无法工作。如何在使用emacs模式的spacemacs中实现它? - Wawrzyniec Pruski

95

我发现有四种方法可以在minibuffer中加入新行。

  1. C-o

  2. C-q C-j

  3. C-q 12 (12是换行符的八进制值)

  4. C-x o 到主窗口,用 C-k 杀掉一个新行,然后回到 minibuffer,用 C-y 粘贴它


13
提到 C-o 要给个赞!比起 C-q C-j 少按一次键。以前没想过用这个快捷键。 - itsjeyd
感谢版本4!如果你有C-o和C-q重新绑定,那会很有帮助。 - Joachim W
非常感谢。您能解释一下为什么C-o有效而C-q C-j无效吗? - Christian Madsen
在迷你缓冲区中插入换行符后,C-o 不会移动光标,因此如果您想在替换字符串中的换行符后插入内容,则仍然需要按右箭头键。 - Robin Green
1
在我的 Emacs 25.2.2 版本中,使用搜索时,按 C-o 会在主窗口插入一个新行,而按 C-q C-j 则会在迷你缓冲区中插入新行。但是在执行查询替换操作时,C-o 是可以正常工作的。 - T.C. Proctor

30

别忘了你随时可以剪切粘贴到迷你缓冲区。

所以你可以从缓冲区中复制一个换行符(或任何字符串),然后在提示输入替换文本时粘贴它。


2
对于那些我不知道键绑定的字符来说,这确实是一个好主意。 - Lei
啊哈!太简单了! - Jérémy Pouyet
这可能需要对未经培训的人进行一些扩展。例如,这些操作实际上如何实现(实际具体步骤)?由于OP已经离开,这可能是超出副本编辑的编辑的最佳示例。 - Peter Mortensen

11

更明确地说:

要将分号字符(;)替换为新行,请按照以下确切步骤操作:

  1. 将光标定位于包含要更改文本的缓冲区的左上角

  2. 输入 m-x replace-string 并按下 Return

  3. The mini-buffer 将显示类似下面的内容: Replace string (default ^ -> ):

  4. 输入要替换的字符。在这种情况下,输入 ; 并按下 Return

  5. The mini-buffer 将显示类似下面的内容:

    string ; with:

  6. 现在执行 C-q C-j

  7. 所有分号的实例都将被替换为新行(从光标位置到缓冲区末尾的内容将会改变)

比原始说明说得更详细一些。


2

切换到文本模式:

M-x text-mode

将块高亮以进行缩进。

缩进:Ctrl + M </kbd>

切换回任何模式...


-2

内联:

C-M-S-%(如果绑定键仍为默认值),然后使用replace-string命令替换^J


"inline" 是什么意思?请通过编辑(更改)您的答案来回答,不要在评论中回答(不要包含“Edit:”,“Update:”或类似的内容 - 答案应该看起来像是今天写的)。 - Peter Mortensen

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