ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Emacs 中用换行符替换字符?

我正在尝试用 Emacs 中的 replace-string 和/或 replace-regexp 替换一个字符 - 比如 ; - 一个新行。

我尝试了以下命令:

Mx 替换字符串 RET ; RET \n 这将替换 ;有两个字符:\n。

Mx 替换正则表达式 RET ; RET \n 这会导致以下错误(显示在小缓冲区中):在替换文本中无效使用 `'。

使用 replace-string 执行此任务有什么问题?还有另一种方法吗?


P
Peter Mortensen

Mx replace-string RET ; RET Cq Cj

Cq 用于引用插入,

Cj 是换行符。


Cq 实际上是 quote-insert ,它引用了下一个字符。
我相信它实际上是“引用”而不是“引用”,如“引用插入”。至少 22.1 版是这样的。
C-j 是文字 0x0a 控制代码,而 Ret 是报价旁边的键并发送 0x0den.wikipedia.org/wiki/C0_and_C1_control_codes
vim 用户注意,在 emacs 中使用 C-j,而在 vim 中使用 C-m
@JonathanArkell这是对它如何工作的描述,但不是为什么。在编辑器中,Ret 产生 0x0a,那么为什么要在quoted-insert 中产生 0x0d?这没有任何意义。 (只是因为历史原因,内部键盘代码是 0x0d?我们到处都使用键映射,为什么不在这里完全有意义呢?)
i
itsjeyd

我发现有四种方法可以将换行符放入迷你缓冲区。

Co Cq Cj Cq 12(12 是换行符的八进制值) Cx o 到主窗口,用 Ck 终止一个换行符,然后 Cx o 回到 minibuffer,用 Cy 拉取它


+1 提及C-o!与 C-q C-j 相比,减少了一次击键。之前没想过用那个。
感谢第 4 版!如果您有 Co 和 Cq 反弹,这很有帮助。
非常感谢。你能解释一下为什么 Co 有效而 Cq Cj 无效吗?
C-o 在 minibuffer 中插入换行符后不会移动该点,因此如果您想在替换字符串中的换行符之后插入一些内容,您仍然需要按右箭头键。
在我的 Emacs 25.2.2 版本中,C-o 将在使用搜索时在主窗口中输入换行符,而 C-q C-j 将在 minibuffer 中输入换行符。 C-o 确实适用于查询 - 替换。
佚名

不要忘记您可以随时剪切并粘贴到 minibuffer 中。

因此,您可以从缓冲区中复制一个换行符(或任何字符串),然后在提示输入替换文本时将其拉出。


对于我不知道键绑定的角色来说,这确实是一个好主意。
啊啊 !很简单 !
对于初学者来说,这可能需要一些扩展。例如,如何才能实际实现这些行动(实际的具体步骤)?由于 OP 已经离开大楼,它可能是超越复制编辑的一个典型例子。
P
Peter Mortensen

更明确地说:

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

将光标定位在缓冲区左上角要更改的包含文本类型 mx replace-string 并按 Return 迷你缓冲区将显示如下内容: 替换字符串(默认 ^ -> ):输入要更改的字符代替。在这种情况下, ;并点击 Return 迷你缓冲区将显示如下内容: string ; with: 现在执行 Cq Cj 分号的所有实例将被替换一个换行符(从光标位置到缓冲区末尾现在会出现)

它比原来的解释说的还要多。


P
Peter Mortensen

切换到文本模式:

M-x text-mode

突出显示要缩进的块。

缩进:Ctrl + M

切换回任何模式...


P
Peter Mortensen

仅内联:

C-M-S-%(如果绑定键仍然是默认值),然后是 replace-string ^J


“内联”是什么意思?请通过 editing (changing) your answer 回复,而不是在评论中(没有“编辑:”、“更新:”或类似内容 - 答案应该看起来好像是今天写的)。