如何在 Emacs 中用换行符替换字符?
Posted
技术标签:
【中文标题】如何在 Emacs 中用换行符替换字符?【英文标题】:How can I replace a character with a newline in Emacs? 【发布时间】:2010-10-11 09:53:40 【问题描述】:我正在尝试用 Emacs 中的 replace-string
和/或 replace-regexp
替换一个字符 - 比如 ;
。
我尝试了以下命令:
M-x replace-string
RET ;
RET \n
这会将;
替换为两个字符:\n
。
M-x replace-regex
RET ;
RET \n
这会导致以下错误(显示在 minibuffer 中):
在替换文本中使用了无效的 `'。
在这个任务中使用replace-string
有什么问题?还有其他方法吗?
【问题讨论】:
【参考方案1】:M-x replace-string
RET ;
RET C-q C-j.
C-q 代表quoted-insert
,
C-j 是换行符。
【讨论】:
C-q 实际上是quote-insert
引用下一个字符。
我相信它实际上是“引用”而不是“引用”,如“引用插入”。至少 22.1 版本是这样的。
C-j
是文字 0x0a
控制代码,而 Ret
是报价旁边的键并发送 0x0d
。 en.wikipedia.org/wiki/C0_and_C1_control_codes
vim 用户注意事项,在 emacs 中使用 C-j
,而在 vim 中使用 C-m
。
@JonathanArkell 这是描述如何它的工作原理,而不是为什么。在编辑器中,Ret 产生 0x0a,那么为什么要在quoted-insert 中产生 0x0d?这没有任何意义。 (只是因为历史原因,内部键盘代码是 0x0d?我们到处都使用键映射,为什么不在这里完全有意义呢?)【参考方案2】:
我发现有四种方法可以将换行符放入迷你缓冲区。
C-o
C-q C-j
C-q 12
(12是换行符的八进制值)
Cx o 到主窗口,用 Ck 杀死一个换行符,然后 Cx o 回到迷你缓冲区,拉它与 Cy
【讨论】:
+1 提及C-o
!与C-q C-j
相比,减少了一次击键。以前没想过用那个。
感谢版本 4!如果您有 C-o 和 C-q 反弹,这很有帮助。
非常感谢。你能解释一下为什么 C-o 有效而 C-q C-j 无效吗?
C-o
在 minibuffer 中插入换行符后不会移动该点,因此如果您想在替换字符串中的换行符之后插入一些内容,您仍然需要按右箭头键.
在我的 Emacs 25.2.2 版本中,C-o
将在使用搜索时在主窗口中输入换行符,而C-q C-j
将在 minibuffer 中输入换行符。 C-o
确实适用于查询 - 替换。【参考方案3】:
不要忘记,您始终可以剪切并粘贴到 minibuffer 中。
因此,您可以从缓冲区中复制一个换行符(或任何字符串),然后在提示输入替换文本时将其拉出。
【讨论】:
对于我不知道键绑定的字符来说真是个好主意。 啊哈!这么简单! 这对于初学者来说可能需要一些扩展。例如。怎样才能真正实现这些行动(实际的具体步骤)?由于 OP 已经离开大楼,它可能是超越复制编辑的一个典型例子。【参考方案4】:更明确:
要将分号字符 (;) 替换为换行符,请按照以下确切步骤操作。
将光标定位在缓冲区左上角要更改的包含文本
输入m-x
replace-string 并点击Return
迷你缓冲区将显示如下内容: 替换字符串(默认 ^ -> ):
输入要替换的字符。在这种情况下,;
然后点击 Return
迷你缓冲区将显示如下内容:
字符串;与:
现在执行C-q C-j
分号的所有实例都将被换行符(现在会出现从光标位置到缓冲区末尾)
这比原来的解释说的要多。
【讨论】:
【参考方案5】:切换到文本模式:
M-x text-mode
突出显示要缩进的块。
缩进:Ctrl + M
切换回任何模式...
【讨论】:
【参考方案6】:仅内联:
C-M-S-%
(如果绑定键仍然是默认值)然后
replace-string
^J.
【讨论】:
“内联”是什么意思?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。以上是关于如何在 Emacs 中用换行符替换字符?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C# 在给定文本中用忽略空格、回车或换行符替换字符串