回到我部分編寫的命令
我經常發現自己在編寫長命令(或命令鏈)的過程中發現自己需要執行另一個命令才能完成目前命令的輸入。
例子
有時候我…
- 需要找到網路介面的確切名稱(
wlp2s0b1
– blargh );- 需要檢查命令的文件;
- 需要啟動一個守護程序(使用
systemctl
,service
等)才能與之通信;- 如果我使用 sudo 執行命令並且 tab-completion 不起作用,則需要
sudo ls
一個目錄,因為我在我正在操作的目錄中沒有權限。我想對我來說理想的解決方案是一個鍵盤快捷鍵,它將我目前的命令推送到堆棧並清空該行,以及另一個將頂部命令從該堆棧彈出到輸入行的命令。
我目前使用的 Kinda-sorta-solutions:
- 使用滑鼠在終端中選擇命令(如果我什至有可用的圖形終端)並複制它,準備好時粘貼*(慢)*;
- 按輸入鍵(希望命令只是失敗而不是刪除東西)並使用
↑
它來恢復它*(危險)*;- 再次輸入*(耗時)*
關於如何更好地完成此任務的任何建議?我盡可能使用
zsh
,但也可以使用的解決方案bash
將不勝感激。
對於 zsh,有三個小元件可以綁定到該效果:
push-input
和push-line
(push-line-or-edit
更多man 1 zshzle
資訊請參閱 )。在頂級提示 ( PS1 ) 上,它們的行為相同:目前緩衝區被推入緩衝區堆棧,然後被清除。在下一次提示(或呼叫 widget 時get-line
),緩衝區將從堆棧中彈出並載入到編輯緩衝區中。這也意味著您可以暫停多個命令。預設情況下
push-line
綁定到^Q
(Ctrl
+q
,可能不起作用),^[Q
(Alt
+Shift
+q
或Esc
,Shift
+q
)和^[q
(Alt
+q
或Esc
,q
)。但是你可以很容易地將它綁定到另一個組合bindkey
。例如對於Alt
+h
:bindkey '^[h' push-line
如前所述,這三個小元件在頂級提示中的行為相同。但是,如果它是多行輸入二級提示 ( PS2 ),它們確實會有所不同。
push-input
總是將完整的多行構造推入緩衝區。這是自上次頂級提示以來的所有內容。您將返回到頂級提示。
push-line
僅將目前行推入緩衝區。這是自上次提示以來的所有內容。您保持在相同的提示級別。
push-line-or-edit
將整個目前多行構造推入編輯器緩衝區(而不是堆棧)。它基本上做了什麼
push-input
,但立即再次從堆棧中彈出緩衝區。這些小元件的對應部分是
get-line
,它從緩衝區中彈出頂行並將其插入到游標位置。在 Emacs 模式下,它綁定到^[G
(Alt
+Shift
+g
orEsc
,Shift
+g
) 和^[g
(Alt
+g
orEsc
,g
)為了
push-line-or-edit
有效地使用,您應該知道(或想學習)編輯命令行所需的一些命令(在單詞和行上複製和粘貼,插入新行(不執行命令)等)。否則,我建議使用push-line
and/orpush-input
。