命令行Zsh中的注释


115

我最近在Ubuntu上从Bash切换到Zsh,对此我感到非常高兴。但是,有些事情我真的很想念,但我没有找到如何实现同一目标的方法。

在Bash中,每当我键入一个长命令并发现必须先运行其他命令时,我都必须将其注释掉,如下所示:

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!

但是,zsh鉴于这种情况#mysuperlongcommand会经常运行,因此这种反复出现的情况并不像使用那样容易解决(并导致:zsh: command not found: #mysuperlongcommand

Answers:


172

刚开始尝试zsh时,我也遇到了这个问题。您可以setopt interactivecomments激活bash样式的注释。


3
您也可以将set -k其关闭。但是我会setopt在zshrc中使用此答案中的代码-Hamish
Downer,

12
是否有这不是默认行为的原因?
naught101

1
@ naught101 zsh的许多最佳位都默认关闭。不知道为什么
zzapper

@ naught101,因为它是新的和创新的。很进步,改善多少
ЯрославРахматуллин

40

我用

bindkey "^Q" push-input

从zsh手册中:

将整个当前的多行构造推入缓冲区堆栈,并返回到顶层(PS1)提示。如果当前的解析器构造仅是一行,则这完全类似于推线。下次启动编辑器或使用get-line弹出编辑器时,该构造将从弹出器堆栈的顶部弹出并加载到编辑缓冲区中。

所以看起来像这样:

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

另外,如果您设置INTERACTIVE_COMMENTS选项(setopt INTERACTIVE_COMMENTS),您将能够像以前一样在交互式shell中使用注释。


我喜欢您的选择,但我无法使其起作用:((有什么方法可以在文件中写入绑定,还是仅用两个字符^和Q删除了我的命令,但我不知道如何使它再次出现在输入中
Mihnea Simian 2014年

2
@Mihnea如果命令消失,则似乎推入输入正在工作。当您运行下一个命令或仅按Enter键时,它应该显示回来。不是吗?
米哈尔Politowski

1
@barbaz可以使用read -z和来操作堆栈print -z,因此可以使用一些脚本和临时文件。但是,用于将命令行保存到临时文件的自定义zle小部件可能会更简单,共享历史记录也会更简单。
米哈尔Politowski

1
当前接受的答案解决了提问者的问题,而此答案解决了提问者的意图。即zsh具有一种实现预期结果的更好方法,就是这样。
wjv 2016年

1
这应该是公认的答案。如果您使用oh-my-zsh,则可以直接使用Ctrl-Q。
壁虎

18

我发现自己也经常这样做。我要做的是剪切长命令,执行需要先执行的命令,然后将长命令粘贴回去。这很简单:CTRL + U将当前命令剪切到缓冲区中,CTRL + Y粘贴它。适用于zsh和bash。


好吧,实际上,当您的解决方案最合适时,我的方法是一种解决方法;)
罗尔夫(Rolf

4
这不应该是公认的答案。下面说使用“ setopt交互式注释”的解决方案应该是。这样做的原因是,如果仅剪切当前命令,则该命令不在zsh历史记录中,并且在键入新命令时,如果不覆盖要尝试执行的命令,则无法轻松使用剪切和粘贴功能。保存。
道格拉斯

1
使用注释和此答案中的解决方案都是解决方法。MichałPolitowski发布的推入输入法更为正确。
FredrikMöllerstrand'13

0

除了setopt interactivecomments@Lajnold建议的外,您可能还希望添加类似以下内容的内容,以防止某些注释被写入历史记录(来自/superuser/352788/how-to-prevent-a-在zshell中将命令保存到历史记录中):

这将覆盖ZSH内置函数zshaddhistory():

  • 将记录从第1列开始的注释,后面没有一个或多个空格(例如,我想返回的#somecommand)
  • 不会记录以第1列开头且后面有一个或多个空格的注释
  • 不会记录缩进的注释,并用第1列中的空格填充
  • 不会在第1列中记录带有空格的命令(用于运行您不想记录的命令的便捷快捷方式
setopt interactivecomments

function zshaddhistory() {
  emulate -L zsh
  if ! [[ "$1" =~ "(^#\s+|^\s+#|^ )" ]] ; then
      print -sr -- "${1%%$'\n'}"
      fc -p
  else
      return 1
  fi
}

作为参考,这是默认的zshaddhistory()http://zsh.sourceforge.net/Doc/Release/Functions.html

zshaddhistory() {
  print -sr -- ${1%%$'\n'}
  fc -p .zsh_local_history
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.