建立可擴展命令

建立可擴展命令

我透過 Oh-my-zsh 使用 ZSH,我看到的一個巧妙的功能是,當命令使用反引號時,shell 會擴展它們。

例如,`pwd`+tab替換`pwd`為我目前的路徑:

https://infinit.io/_/DjmxTCK.gif

我想知道是否有一種相對簡單的方法可以對某些命令執行相同的操作而無需使用反引號。我想將其應用於某些別名(或函數)。

需要明確的是,我不是說擴展命令的參數,而是命令本身。


這是一個真正令人驚奇的功能,但並不完全是我想要的。除非我做錯了什麼,否則這會將我的別名擴展為別名定義的內容,但不會擴展為結果的內容。例如這裡:

在此輸入影像描述

我想查看該命令的結果而不是完整的命令。

答案1

您可以為此使用自訂 zle 小部件並透過鍵綁定呼叫它,例如Alt+ Tab(與Esc,相同Tab

expand-to-output () {
    BUFFER='$('$BUFFER')'
    CURSOR=0
    zle redisplay
    zle expand-word
}
zle -N expand-to-output
bindkey "^[^I" expand-to-output

現在,如果您鍵入任何命令後跟Alt+ Tab,整個命令將被其輸出替換,如果該指令可以成功運行。如果命令無法成功運行,則鍵入的命令列將被包圍$(...)但不會展開。如果有錯誤訊息,它們應該會列印在編輯緩衝區上方。這對於多行提示可能無法可靠地工作。

解釋:

  • expand-to-output () {...}定義(新)expand-to-output函數。
  • BUFFER包含目前命令列
  • BUFFER='$('$BUFFER')'位於命令列$(之前和之後。相當於但可以嵌套。)$(...)`...`
  • CURSOR是遊標在命令列上的位置
  • CURSOR=0將遊標放在(已編輯的)命令列的開頭,即$。如果不將遊標移到那裡,可能會zsh嘗試擴展 內部的單字$(...)而不是整個過程替換。
  • zle redisplay重新顯示編輯緩衝區。這可以防止擴展命令列印某些內容時出現顯示錯誤標準錯誤。 (註:多行提示可能存在一些問題)
  • zle expand-word呼叫expand-word小部件,該小部件通常作為製表符補全的一部分被呼叫。
  • zle -N expand-to-output將函數註冊為同名的小部件。
  • bindkey "^[^I" expand-to-output將小部件綁定expand-to-outputAlt+ Tab

相關內容