Comments in command-line Zsh

I switched quite recently from Bash to Zsh on Ubuntu and I'm quite happy about it. However, there is something I really miss and I did not find how to achieve the same thing.

In Bash, whenever I was typing a long command and noticed I had to run something else before, I just had to comment it out like in the following:

me@home> #mysuperlongcommand with some arguments
me@home> thecommandIhavetorunfirst #and then: then up up
me@home> #mysuperlongcommand with some arguments #I just need to uncomment it!

However, this quite recurrent situation is not as easy to address as with zsh, given #mysuperlongcommand will be run as such (and resulting in: zsh: command not found: #mysuperlongcommand.


Solution 1:

Having just started trying out zsh, I ran into this problem too. You can do setopt interactivecomments to activate the bash-style comments.

The Z Shell Manual indicates that while this is default behavior for ksh (Korn shell) and sh (Bourne shell), and I am guessing also for bash (Bourne-again shell), it is not default for zsh (Z shell):

In the following list, options set by default in all emulations are marked <D>; those set by default only in csh, ksh, sh, or zsh emulations are marked <C>, <K>, <S>, <Z> as appropriate.

INTERACTIVE_COMMENTS (-k) <K> <S> Allow comments even in interactive shells.

Solution 2:

I use

bindkey "^Q" push-input

From the zsh manual:

Push the entire current multiline construct onto the buffer stack and return to the top-level (PS1) prompt. If the current parser construct is only a single line, this is exactly like push-line. Next time the editor starts up or is popped with get-line, the construct will be popped off the top of the buffer stack and loaded into the editing buffer.

So it looks like this:

> long command
Ctrl+Q => long command disappears to the stack
> forgotten command
long command reappears from stack
> long command

Also, if you set the INTERACTIVE_COMMENTS option (setopt INTERACTIVE_COMMENTS), you will be able to use comments in interactive shells like you are used to.

Solution 3:

I find myself doing this often as well. What I do is cut the long command, execute the command that needs to go first and then paste the long command back in. This is easy: CTRL+U cuts the current command into a buffer, CTRL+Y pastes it. Works in zsh and bash.

Solution 4:

: sh generate_sample.sh arg1

The addition of ":" doesn't execute the command in zsh.

sh generate_sample.sh : arg1

Now the arg1 is commented.

I am on Mac OS Big Sur and used it multiple times.

Edit: ":" procedure works with giving no spaces. ": command" is correct but ":command" isn't