コマンドライン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

回答:


172

zshを試し始めたばかりで、この問題にも遭遇しました。setopt interactivecommentsbashスタイルのコメントをアクティブにすることができます。


3
set -kそれが1回限りの場合も実行できます。しかしsetopt、私は自分のzshrcでこの回答からの行を使用します
Hamish Downer

12
これがデフォルトの動作ではない理由はありますか?
naught101

1
@ naught101 zshの最高のビットの多くはデフォルトでオフになっています。理由がわからない
zzapper 2018年

@ naught101はそれが新しく革新的だからです。非常に多くの改善、進行
ЯрославРахматуллин

40

私が使う

bindkey "^Q" push-input

zshマニュアルから:

現在の複数行構成全体をバッファースタックにプッシュし、トップレベル(PS1)プロンプトに戻ります。現在のパーサー構造が1行のみの場合、これはプッシュラインとまったく同じです。次にエディターが起動するか、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)を設定すると、使い慣れた対話型シェルでコメントを使用できるようになります。


私はあなたのオプションが好きですが、それを機能させることができません:(ファイルにバインディングを書き込む方法はありますか、それとも^とQの2文字だけですか?コマンドは消去されましたが、わかりません入力に再び表示する方法
Mihnea Simian '29

2
@Mihneaコマンドが消えた場合、プッシュ入力が機能しているようです。次のコマンドを実行するか、単にEnterキーを押すと表示されます。それはそうではありませんか?
のMichałPolitowski

1
@barbazスタックはread -zand print -zで操作できるため、スクリプトや一時ファイルを使用して操作できます。ただし、コマンドラインを一時ファイルに保存するためのカスタムzleウィジェットの方が単純な場合があり、共有履歴はさらに単純になります。
のMichałPolitowski

1
現在受け入れられている回答は質問者の質問に対応していますが、この回答は質問者の意図に対応しています。すなわち、zshは意図した結果を達成するためのより良い方法を持っています、そしてこれはそれです。
wjv

1
これは受け入れられる答えになるはずです。oh-my-zshを使用する場合は、そのままCtrl-Qを使用できます。
Gecko

18

私自身もこれを頻繁に行っています。私が行うことは、長いコマンドを切り取り、最初に実行する必要があるコマンドを実行してから、長いコマンドを貼り付けます。これは簡単です。CTRL+ Uは現在のコマンドをバッファーに切り取り、CTRL + Yはそれを貼り付けます。zshとbashで動作します。


まあ、実際には、私の方法はあなたのソリューションが最適である間の回避策です;)
Rolf

4
これは受け入れられる答えではありません。「setopt interactivecomments」を使用するように言う以下の解決策があるべきです。この理由は、現在のコマンドをカットしただけではzsh履歴に含まれず、新しいコマンドを入力しているときにカットアンドペーストを使用して、目的のコマンドを上書きしないと簡単にできないためです。保存する。
ダグラス

1
この回答でコメントとソリューションを使用することは両方とも回避策です。MichałPolitowskiによって投稿されたプッシュ入力メソッドはより正確です。
FredrikMöllerstrand2013

0

加えてsetopt interactivecomments@Lajnoldによって提案され、あなたもから(歴史に書き込まれてから特定のコメントを防ぐために、次のようなものを追加したい場合があります/superuser/352788/how-to-prevent-a- command-in-the-zshell-from-being-saved-into-history):

これは、ZSH組み込み関数zshaddhistory()をオーバーライドします。

  • 1列目で始まり、1つ以上のスペースが続かないコメントをログに記録します(つまり、戻りたい#somecommand)
  • 列1で始まり、その後に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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.