Zsh

有沒有一種簡單、安全、可靠的方法可以在 shell 提示符下註釋掉 zsh 中的一行?

  • February 24, 2022

我經常輸入一個命令,然後意識到我需要先做一些其他的事情,我不想記住所有的內容並找出所有的參數,或者稍後再輸入一遍,所以我通常#在開頭放將其保存在歷史記錄中以在一分鐘左右使用。

通常我已經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+QCtrl+模式,這就是為此目的。Q``emacs

這將使您到目前為止輸入的內容處於暫停狀態(在隊列中,在 zsh 文件中稱為緩衝區堆棧),清除編輯緩衝區,以便您可以輸入其他命令。在該其他命令終止後,您之前推送的命令將自動呼叫到編輯緩衝區中。

一個可能更好的小元件(但在您zsh在不控制 的上下文中使用的情況下無濟於事~/.zshrc)是push-input推動整個輸入而不是僅目前行¹。輸入多行命令時更好,在$PS2發出提示後繼續命令。

bindkey '^Q' push-input
bindkey '^[q' push-input

請注意,推送的行或輸入也可以使用Alt+ Gget-line小元件)檢索。


在其他 shell 中也可以使用的另一種方法是在模式或模式下用Ctrl+擦除該行,然後將其儲存在 killring 中。U``emacs``Esc``d``d``vi

您可以稍後在模式下使用Ctrl+或/在命令模式下呼叫它。在模式中,您還可以使用+循環遍歷killring的元素(回憶過去剪切/複製的字元串)。Y``emacs``p``P``vi``emacs``Alt``Y

vi模式下,您還可以將命令儲存在命名寄存器中,例如vi"xdd在 vi 命令模式下,將刪除該行並將其儲存在x寄存器中,稍後您可以使用 呼叫它"xP


作為對您的問題的更直接回答,要在關閉時註釋掉某些程式碼(和-或列表)interactive_comments,您可以插入for _()(循環的縮寫形式for,此處循環空列表)或if (())(的縮寫形式if,此處帶有一個空的算術表達式解析為 0) 在它前面。

這將註釋掉一個foo && bar || baz和-或列表,而不是barinfoo; barfoo & bar例如。

這也假設到目前為止輸入的文本在語法上是有效的,因此不適用於未完成的程式碼(如未完成的引用文本、for 循環……)。

另一種具有相同警告的方法是:||(在開頭和)結尾插入。這將註釋掉任何有效的程式碼。


¹ 從技術上講,如果您使用+輸入換行符或從歷史記錄或緩衝區堆棧中呼叫了多行命令,則目前編輯緩衝區仍可能包含多行。Alt``Enter

引用自:https://unix.stackexchange.com/questions/691302