Some time ago I found xonsh which is a python-based shell. It had really good multiline support, and I am searching for a shell with sameish multiline support as xonsh. Fish shell also has good multiline support, it is around the same level, but it is not posix compatible. I want a shell that has that kind of level of multiline, but zsh (bash is also fine) compatible.
Does anyone know of one?
edit: based on the replies, I get this is unclear. My problem with zsh is that if i press enter and it starts a new line, I can’t get back to the prevous line, because a new prompt is started. In fish this is possible, all lines are one prompt. But, fish is not posix compatible. So, I guess I want a posix-compatible shell with fish-like lines (multiple line) editing. I wanted zsh support to keep using my custom oh-my-zsh prompt, but remaking it for a new shell is not a big problem. Sorry for being unclear.
edit 2:
solution is here!
Thanks to @[email protected] I started thinking and made the following:
When on the first line, enter accepts and alt-enter inserts a newline. When not on the first line, enter inserts a newline and alt-enter accepts.
Here is the code to put in your .zshrc
:
# enter accepts when only one line found, else creates newline
function _zle_ml_enter {
if [[ "$BUFFERLINES" -le 1 ]]; then
zle accept-line
else
zle self-insert-unmeta
fi
}
zle -N _zle_ml_enter
bindkey '^M' _zle_ml_enter
# alt-enter accepts when more than one line found, else creates newline
function _zle_ml_meta_enter {
if [[ "$BUFFERLINES" -gt 1 ]]; then
zle accept-line
else
zle self-insert-unmeta
fi
}
zle -N _zle_ml_meta_enter
bindkey '^[^M' _zle_ml_meta_enter
I started using this, it makes a lot of sense and I like it, thanks!
I can imagine myself forgetting how to accept multiline input with alt+enter, so I added a help message to
_zle_ml_enter
in the multiline case after the second line. It assumessetopt interactivecomments
is already set:EDIT: note that lemmy mangles the less-than symbol
# -- Run input if single line, otherwise insert newline -- # Key: enter # Assumes: setopt interactivecomments # Credit: https://programming.dev/comment/2479198 .zle_accept-except-multiline () { if (( BUFFERLINES <= 1 )) { zle accept-line } else { zle self-insert-unmeta if (( BUFFERLINES == 2 )) { LBUFFER+="# Use alt+enter to submit this multiline input" zle self-insert-unmeta } } } zle -N .zle_accept-except-multiline bindkey '^M' .zle_accept-except-multiline # Enter