2016-10-01 80 views
0

在bash,我想實現以下工作流程(提示以括號顯示,_是光標):擊:SPACE觸發完成

  1. 類型 「富」($ foo_
  2. 按空格鍵。在這一點上:
    • 如果foo是一個函數,說function foo() { printf "hello from foo" }
      1. 空間被印刷($ foo _
      2. 函數被調用,並hello from foo是一個空間後打印 - 不換行($ foo hello from foo_
    • 如果foo是不是一個函數,空間被印刷,這就是它($ foo _

我曾嘗試:

  • 使空間發送0x0a(回)到終端仿真器(iTerm2在Mac)。此作品除了明顯打印換行符外
  • 使用內置的完整功能:complete -F foo -o nospace foo。這工作,但我必須鍵入foo然後SPACE然後TABhello from foo要打印的內聯
  • 我聽說你可以以某種方式嵌入一個\n -eating腳本到PS1。真的不知道該如何開始。

我也可以捕獲一個快捷方式,例如Ctrl+T來執行富 - 但我真的只想按SPACE

理想情況下,只有輸入到終端的第一個單詞纔會有這樣的行爲。任何幫助將不勝感激,請保存我的理智。我有一個emacs-like的ido腳本,當我輸入cd後跟SPACE時,我想調用它。

+0

您可以濫用'edit-and-execute-command'並重載'$ VISUAL'。然後按''或重新綁定''來運行它。不會推薦。 – andlrc

回答

0

執行此操作的方法是使用-n 1和read。例如:

foo(){ 
    echo hello from foo 
} 

string='' 
while read -n 1 a ; do 
    if [ "$a" = "" ] ; then 
     tpe=`type -t $string` 
     if [ "$tpe" = "function" ] ; then 
       $string 
     fi 
     string='' 
    else 
     string="$string$a" 
    fi 
done 
+0

太好了,謝謝。在循環內部有其他特殊鍵可以使用嗎?例如,刪除一個字符。 – hyperio

+0

而不是if [「$ a」=「」],你可以做一個case語句。你必須嘗試用特殊字符解決問題。 –