我发现⌥.(alt.对于许多其他人)在终端中工作时非常有用,在当前提示符处插入最后一行的最后一个参数。但是,当最后一行被注释时它不起作用(假设set -o interactivecomments
)。
我想不出一个确切的用例,但它已经发生了好几次,我已经注释掉了一个我在执行之前意识到的命令不是我当时需要的,然后想要它的最后一个参数后续命令。
我意识到忽略所有注释掉的东西是有逻辑的,因为它从来没有被解释过,因此没有一个被标记为参数,但是有什么办法可以做我想做的事吗?
如果我必须使用不同的按键,绑定到可以执行我想要的替代命令,这将不是理想的——但会是可用的。
我正在使用 Zsh,但 Bash 解决方案可能有效或接近我在 Zsh 中需要做的事情。
不要将命令注释掉。
相反,将 a
:
放在前面而不是 a#
。这将使您的命令文本参数成为 null 实用程序:
,该实用程序在运行时不执行任何操作。参数被标记和解析,因为它仍然是一个命令,但没有对它们做任何其他事情。在某些情况下这是不合适的:特别是在弄清楚命令本身有副作用时。一个简单的例子是命令替换:
在这种情况下,即使原始命令本身永远不会运行,内部的命令
$(...)
也会运行并替换为 的参数。:
破坏性较小的情况是${foo:=default}
参数扩展,它具有为 赋值的副作用$foo
。最后,重定向或管道仍然会发生:
在这两种情况下都会将空输出发送到目标,这将截断或创建文件或运行后续命令,这可能不喜欢他们得到的空输入。
如果您对命令没有任何这些特殊问题,这是完全安全的,并且可以在zsh、Bash和任何与 POSIX 兼容的 shell 中工作(尽管之后的 alt-. 行为不会在任何地方都有效)。
如果它特别是您想要的最后一个词,zsh 提供可自定义的键绑定和命令,您可以使用它们来操作命令行。如果你
bindkey '^K' kill-region
那么你可以回到单词之前,Ctrl-K擦除到行首,:然后有一个安全的命令,只剩下你关心的一个单词。您也可以通过评论来做到这一点;
:
如果您愿意使用不同的快捷方式,则不必切换到:定义一个输出其最后一个位置参数的函数:
创建一个键绑定,它调用:
并插入输出。
如果最后一个参数被引用,这可能会由于分词而导致错误的结果。
引用的危险版本
如果您确信不会发生任何不好的事情(没有未引用
<
的 ,>
,&
,$()
,\``,
;,
#, and no0 single
"or
'` 那么您可以这样做以便从注释行中获取引用的最后一个“参数”:!$
使用对应于最后一个参数的 shell 内置函数。我也在使用 zsh,这可以在 shell 中为我访问注释命令的最后一个参数。
您可以添加到您的
~/.zshrc
:也就是说,在
zshaddhistory
将当前命令行添加到历史记录之前调用的特殊钩子函数中,自己添加一个空的histchars
,这将禁用对 的注释处理print -S
。fc -p
确保命令行不会再次添加到历史记录中。