有没有一种简单、安全、可靠的方法可以在 shell 提示符下注释掉 zsh 中的一行?

有没有一种简单、安全、可靠的方法可以在 shell 提示符下注释掉 zsh 中的一行?

我经常输入一个命令,然后意识到我需要先做其他事情,并且我不想记住所有内容并弄清楚所有参数或稍后再次输入它,所以我通常#在开头将其保存在历史记录中以便在一分钟左右使用。

通常我已经setopt interactivecomments在我的 .zshrc 中启用,但有时我必须sudo在某些服务器上使用共享帐户来执行某些操作,而这不一定是设置的,因此#在行之前添加可能会给我带来恼人的响应

zsh: command not found: #

没关系,人们可能会想,只要使用 即可:,但事实并非如此简单。

$ : do_thing "1" && do_thing "2" && do_thing "3"

那将执行do_thing "2" && do_thing "3".在某些情况下也许没什么大不了的,但是像这样的事情呢?

$ : cd /some/deeply/nested/directory && rm -rf *

大多数命令不是所以有害,但请记住,在这种情况下,我意识到在执行我键入的命令之前我必须做其他事情,因此总是我不想执行它或它们然而

什么是可靠、快速、无害且简单的方法来保存已输入的命令?

echo有同样的问题:,并且看起来不太优雅。

在我看来,将所有内容分组在{and }or (and中)似乎可能有效,但他们都没有这样做。他们给了我

zsh: parse error near `}'

zsh: parse error near `)'

答案1

只需使用push-line部件,默认在模式下绑定到Alt+QCtrl+ ,这正是用于此目的的。Qemacs

这会将您迄今为止输入的内容置于保留状态(在队列中,称为缓冲堆栈在 zsh 文档中),清除编辑缓冲区,以便您可以键入其他命令。另一个命令终止后,您执行的命令较早的内容将被自动调用到编辑缓冲区中。

zsh一个可能更好的小部件(但在您无法控制的上下文中使用的情况下这不会有帮助~/.zshrc)是push-input推动整个输入而不仅仅是当前行。输入多行命令时更好,命令在$PS2发出提示后继续。

bindkey '^Q' push-input
bindkey '^[q' push-input

请注意,也可以使用Alt+ Gget-line小部件)检索推送的行或输入。


另一种在其他 shell 中也适用的方法是用Ctrl+ Uin emacsmode 或Escddin vimode 删除该行,然后将其存储在killring中。

您可以稍后在模式下使用Ctrl+或在命令模式下使用/来调用它。在mode 下,还可以使用+循环遍历YemacspPviemacsAltY杀环(回忆过去剪切/复制的字符串)。

vi模式下,您还可以将命令存储在命名寄存器中,例如vi"xdd在 vi 命令模式下会删除该行并将其存储在寄存器中x,稍后您可以使用 重新调用它"xP


interactive_comments作为对您的问题的更直接的回答,要在关闭时注释掉一些代码(与或列表) ,您可以插入for _()(循环的缩写形式for,此处在空列表上循环)或if (())(循环的缩写形式if,此处为其前面的空算术表达式解析为 0)。

这会注释掉foo && bar || bazand-or 列表,但不会注释掉barinfoo; barfoo & bar例如。

这还假设到目前为止输入的文本在语法上是有效的,因此不适用于未完成的代码(例如未完成的引用文本、for 循环...)。

另一种具有相同警告的方法是:||(在开头和)结尾插入。这会注释掉任何有效的代码。


1 从技术上讲,当前编辑缓冲区Alt如果您使用+输入换行符Enter或从历史记录或缓冲区堆栈中调用了多行命令,则它仍然可以包含多行。

答案2

尽管 Stéphane 的第一个建议(推线小部件)更简单、更快,并且在许多情况下更可取,但我发现我还可以在命令中添加以下内容之一:

return &&

或者

return;

如果我知道在返回执行我刚刚键入的命令之前需要执行多个命令,并且我不想多次点击optionQ( ),那么这可能会更好。altQ它也比for _()(后来的建议)更令人难忘。

相关内容