zshzsh-zle

Inserting a newline in a multiline zsh command pulled from history


Sometimes I use multiline commands in zsh:

❯ echo \
> a \
> multiline \
> command

When editing the command after pulling it from a history search, I can change the content of individual lines. However, I can't figure out how to insert another line:

# I want to insert another line after "multiline"...
❯ echo \
> a \
> multiline \  # but hitting <return> here just runs the command, even though there's a backslash at the end of the line
> command

How can I insert a newline in the middle of a multiline command pulled from history?


Solution

  • You can use self-insert-unmeta to bind Alt+Return to insert a literal newline without accepting the command:

    bindkey '^[^M' self-insert-unmeta
    

    To use your example: Hitting Alt+Return at the cursor position (#)

    % echo \
    a \
    multiline \#
    command
    

    will get you this:

    % echo \
    a \
    multiline \
    #
    command
    

    This works not only when editing history, but also when typing commands. So you can prepare several commands in a script like fashion and accept them with a single Return.

    For example pressing Alt+Return instead of # in this example:

    % echo command 1#
    echo command 2#
    echo command 3
    

    will do the same thing as the command echo command 1; echo command 2; echo command 3 and produce this output:

    command 1
    command 2
    command 3