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