Command line 命令行Zsh中的注释

Command line 命令行Zsh中的注释,command-line,zsh,Command Line,Zsh,我最近在Ubuntu上从Bash切换到Zsh,对此我很高兴。然而,有一件事我真的很怀念,我没有找到如何实现同样的事情 在Bash中,每当我键入一个长命令并注意到之前必须运行其他命令时,我只需按如下方式对其进行注释: me@home> #mysuperlongcommand with some arguments me@home> thecommandIhavetorunfirst #and then: then up up me@home> #mysuperlongcomman

我最近在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未找到:#mysuperlongcommand

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

我用

bindkey "^Q" push-input
从zsh手册:

将当前的整个多行构造推送到缓冲区堆栈上,并返回顶层(PS1)提示。如果当前解析器构造只是一行,这与推行完全相同。下次编辑器启动或使用get行弹出时,该构造将从缓冲区堆栈顶部弹出并加载到编辑缓冲区中

看起来是这样的:

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


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

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

除了@Lajnold建议的
setopt interactivecomments
之外,您可能还需要添加类似以下内容,以防止某些注释写入历史记录(从):

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

  • 将记录从第1列开始但后面没有一个或多个空格的注释(即#somecommand,我想返回)
  • 不会记录以列1开头,后跟一个或多个空格的注释
  • 不会记录缩进注释,由第1列中的空格填充
  • 不会在第1列中使用空格记录命令(用于运行不希望记录的命令的便捷快捷方式
作为参考,这是默认的zshaddhistory()


嗯,实际上,我的方法是一种变通方法,而您的解决方案是最合适的;)这不应该是公认的答案。下面的解决方案说使用“setopt interactivecomments”应该是。原因是,如果您只是剪切当前命令,那么它就不在您的zsh历史记录中,而且在键入新命令时,如果不覆盖您试图保存的命令,您也无法轻松使用剪切和粘贴。使用注释和此答案中的解决方案都是解决方法;推式输入法MichałPolitowski更正确。如果只是一次性的,你也可以做
set-k
。但是我会在我的zshrcIs中使用这个答案中的
setopt
行。这不是默认行为的原因吗?@noot101很多zsh的最佳位都是默认关闭的。不知道why@naught101也许这会鼓励人们去挖掘wn进入人和设置,使zsh成为他们自己的工具,而不是只是works@naught101我也喜欢,虽然有些工具不喜欢;)我喜欢你的选择,但我不能让它工作:(有没有办法在文件中写入绑定,或者仅仅是两个字符,^和Q?我的命令已被删除,但我不知道如何使它再次出现在输入中。@Mihnea如果该命令消失,则似乎push input正在工作。当您运行下一个命令或只需按enter键时,它应该会显示出来。不是这样吗?@barbaz the stack可以通过
read-z
print-z
进行操作,因此可以通过一些脚本和临时文件进行操作。但是,用于将命令行保存到临时文件的自定义zle小部件可能会更简单,共享历史记录也会更简单。虽然当前接受的答案解决了提问者的问题,但此答案添加了表达提问者的意图。例如,zsh有更好的方法来实现预期结果,就是这样。这应该是公认的答案。如果您使用oh my zsh,您可以使用Ctrl-Q进行开箱即用。
setopt interactivecomments

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