有沒有一種簡單、安全、可靠的方法可以在 shell 提示符下註釋掉 zsh 中的一行?
我經常輸入一個命令,然後意識到我需要先做一些其他的事情,我不想記住所有的內容並找出所有的參數,或者稍後再輸入一遍,所以我通常
#
在開頭放將其保存在歷史記錄中以在一分鐘左右使用。通常我已經
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
+Q
和Ctrl
+模式,這就是為此目的。Q``emacs
這將使您到目前為止輸入的內容處於暫停狀態(在隊列中,在 zsh 文件中稱為緩衝區堆棧),清除編輯緩衝區,以便您可以輸入其他命令。在該其他命令終止後,您之前推送的命令將自動呼叫到編輯緩衝區中。
一個可能更好的小元件(但在您
zsh
在不控制 的上下文中使用的情況下無濟於事~/.zshrc
)是push-input
推動整個輸入而不是僅目前行¹。輸入多行命令時更好,在$PS2
發出提示後繼續命令。bindkey '^Q' push-input bindkey '^[q' push-input
請注意,推送的行或輸入也可以使用
Alt
+G
(get-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
和-或列表,而不是bar
infoo; bar
或foo & bar
例如。這也假設到目前為止輸入的文本在語法上是有效的,因此不適用於未完成的程式碼(如未完成的引用文本、for 循環……)。
另一種具有相同警告的方法是
:||(
在開頭和)
結尾插入。這將註釋掉任何有效的程式碼。¹ 從技術上講,如果您使用+輸入換行符或從歷史記錄或緩衝區堆棧中呼叫了多行命令,則目前編輯緩衝區仍可能包含多行。
Alt``Enter