我经常输入一个命令,然后意识到我需要先做其他事情,并且我不想记住所有内容并弄清楚所有参数或稍后再次输入它,所以我通常#
在开头将其保存在历史记录中以便在一分钟左右使用。
通常我已经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+Q和Ctrl+ ,这正是用于此目的的。Qemacs
这会将您迄今为止输入的内容置于保留状态(在队列中,称为缓冲堆栈在 zsh 文档中),清除编辑缓冲区,以便您可以键入其他命令。另一个命令终止后,您执行的命令推较早的内容将被自动调用到编辑缓冲区中。
zsh
一个可能更好的小部件(但在您无法控制的上下文中使用的情况下这不会有帮助~/.zshrc
)是push-input
推动整个输入而不仅仅是当前行。输入多行命令时更好,命令在$PS2
发出提示后继续。
bindkey '^Q' push-input
bindkey '^[q' push-input
请注意,也可以使用Alt+ G(get-line
小部件)检索推送的行或输入。
另一种在其他 shell 中也适用的方法是用Ctrl+ Uin emacs
mode 或Escddin vi
mode 删除该行,然后将其存储在killring中。
您可以稍后在模式下使用Ctrl+或在命令模式下使用/来调用它。在mode 下,还可以使用+循环遍历Yemacs
pPvi
emacs
AltY杀环(回忆过去剪切/复制的字符串)。
在vi
模式下,您还可以将命令存储在命名寄存器中,例如vi
:"xdd
在 vi 命令模式下会删除该行并将其存储在寄存器中x
,稍后您可以使用 重新调用它"xP
。
interactive_comments
作为对您的问题的更直接的回答,要在关闭时注释掉一些代码(与或列表) ,您可以插入for _()
(循环的缩写形式for
,此处在空列表上循环)或if (())
(循环的缩写形式if
,此处为其前面的空算术表达式解析为 0)。
这会注释掉foo && bar || baz
and-or 列表,但不会注释掉bar
infoo; bar
或foo & bar
例如。
这还假设到目前为止输入的文本在语法上是有效的,因此不适用于未完成的代码(例如未完成的引用文本、for 循环...)。
另一种具有相同警告的方法是:||(
在开头和)
结尾插入。这会注释掉任何有效的代码。
1 从技术上讲,当前编辑缓冲区Alt如果您使用+输入换行符Enter或从历史记录或缓冲区堆栈中调用了多行命令,则它仍然可以包含多行。
答案2
尽管 Stéphane 的第一个建议(推线小部件)更简单、更快,并且在许多情况下更可取,但我发现我还可以在命令中添加以下内容之一:
return &&
或者
return;
如果我知道在返回执行我刚刚键入的命令之前需要执行多个命令,并且我不想多次点击optionQ( ),那么这可能会更好。altQ它也比for _()
(后来的建议)更令人难忘。