Bash

回到我部分編寫的命令

  • March 23, 2015

我經常發現自己在編寫長命令(或命令鏈)的過程中發現自己需要執行另一個命令才能完成目前命令的輸入。

例子

有時候我…

  • 需要找到網路介面的確切名稱(wlp2s0b1– blargh );
  • 需要檢查命令的文件;
  • 需要啟動一個守護程序(使用systemctl,service等)才能與之通信;
  • 如果我使用 sudo 執行命令並且 tab-completion 不起作用,則需要sudo ls一個目錄,因為我在我正在操作的目錄中沒有權限。

我想對我來說理想的解決方案是一個鍵盤快捷鍵,它將我目前的命令推送到堆棧並清空該行,以及另一個將頂部命令從該堆棧彈出到輸入行的命令。

我目前使用的 Kinda-sorta-solutions:

  • 使用滑鼠在終端中選擇命令(如果我什至有可用的圖形終端)並複制它,準備好時粘貼*(慢)*;
  • 按輸入鍵(希望命令只是失敗而不是刪除東西)並使用它來恢復它*(危險)*;
  • 再次輸入*(耗時)*

關於如何更好地完成此任務的任何建議?我盡可能使用zsh,但也可以使用的解決方案bash將不勝感激。

對於 zsh,有三個小元件可以綁定到該效果:push-inputpush-linepush-line-or-edit更多man 1 zshzle資訊請參閱 )。在頂級提示 ( PS1 ) 上,它們的行為相同:目前緩衝區被推入緩衝區堆棧,然後被清除。在下一次提示(或呼叫 widget 時get-line),緩衝區將從堆棧中彈出並載入到編輯緩衝區中。這也意味著您可以暫停多個命令。

預設情況下push-line綁定到^QCtrl+ q,可能不起作用),^[QAlt+ Shift+qEsc, Shift+ q)和^[qAlt+qEsc, 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+ gor Esc, Shift+ g) 和^[g( Alt+ gor Esc, g)


為了push-line-or-edit有效地使用,您應該知道(或想學習)編輯命令行所需的一些命令(在單詞和行上複製和粘貼,插入新行(不執行命令)等)。否則,我建議使用push-lineand/or push-input

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