ChatGPT解决这个技术问题 Extra ChatGPT

How can I replace a character with a newline in Emacs?

I am trying to replace a character - say ; - with a new line using replace-string and/or replace-regexp in Emacs.

I have tried the following commands:

M-x replace-string RET ; RET \n This will replace ; with two characters: \n.

M-x replace-regex RET ; RET \n This results in the following error (shown in the minibuffer): Invalid use of `' in replacement text.

What's wrong with using replace-string for this task? Is there another way to do it?


P
Peter Mortensen

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

C-q for quoted-insert,

C-j is a newline.


C-q is really quote-insert which quotes the next character.
I believe it's actually "quoted" rather than "quote", as in "quoted-insert". At least that's the way it is on version 22.1.
C-j is a literal 0x0a control code, versus Ret which is the key next to your quote and sends 0x0d. en.wikipedia.org/wiki/C0_and_C1_control_codes
Note for vim users, using C-j in emacs, while C-m in vim.
@JonathanArkell That's a description how it works, but not why. Within the editor, Ret produces 0x0a, so why should it produce 0x0d in quoted-insert? That doesn't make any sense. (Just because the internal keyboard code is 0x0d for historical reasons? We use key maps all over the place, why not here where it makes perfect sense?)
i
itsjeyd

There are four ways I've found to put a newline into the minibuffer.

C-o C-q C-j C-q 12 (12 is the octal value of newline) C-x o to the main window, kill a newline with C-k, then C-x o back to the minibuffer, yank it with C-y


+1 for mentioning C-o! One less key stroke compared to C-q C-j. Hadn't thought of using that one before.
Thanks for version 4! Helpful if you have C-o and C-q rebound.
Thanks a lot. Can you explain why C-o works and C-q C-j doesn't?
C-o doesn't move the point after inserting the newline in the minibuffer, so you still need to press the right arrow key as well if you want to insert something after the newline in the replacement string.
On my version of Emacs 25.2.2, C-o will enter a newline in the main window when using search, while C-q C-j will enter the newline in the minibuffer. C-o does work with query - replace though.
佚名

Don't forget that you can always cut and paste into the minibuffer.

So you can just copy a newline character (or any string) from your buffer, then yank it when prompted for the replacement text.


It's really a good idea for the characters which I don't know the key bind.
Ahah ! so simple !
This could need some expansion for the uninitiated. E.g. how can those actions actually be achieved (actual concrete steps)? As the OP has left the building, it could be a prime example of editing beyond copy editing.
P
Peter Mortensen

More explicitly:

To replace the semicolon character (;) with a newline, follow these exact steps.

locate the cursor at the upper left of buffer the containing text you want to change Type m-x replace-string and hit Return The mini-buffer will display something like this: Replace string (default ^ -> ): Type in the character you want to replace. In this case, ; and hit Return The mini-buffer will display something like this: string ; with: Now execute C-q C-j All instances of semicolon will be replaced a newline (from the cursor location to the end of the buffer will now appear)

There is a bit more to it than the original explanation says.


P
Peter Mortensen

Switch to text mode:

M-x text-mode

Highlight the block to indent.

Indent: Ctrl + M

Switch back to whatever mode...


P
Peter Mortensen

Inline just:

C-M-S-% (if the binding keys are still the default) and then replace-string ^J.


What is meant by "inline"? Please respond by editing (changing) your answer, not here in comments (without "Edit:", "Update:", or similar - the answer should appear as if it was written today).