2011-12-03 39 views
9

有沒有辦法將兩個操作合併到一個鍵綁定中(不要以爲可以使用函數)。bash中的複雜鍵綁定

這是我想要做什麼:

我想一鍵綁定(說按Ctrl-X),以 -

  1. 插入一些文字,然後
  2. 調用完整或菜單後,使用插入的文本作爲完成基礎

我知道我可以(在~/.inputrc)指定

0123文字
  • 插入帶(C-X: "ls"
  • 執行的ReadLine命令(C-SPACE: menu-complete

但我不知道如何把這些結合在一起

回答

13

這個技巧是調用重新綁定你的密鑰的函數。在我的示例中,我將使用C-b插入文本並調用菜單完成,而不是使用C-x。在我的例子中,你必須犧牲一把鑰匙。C-t

In。bashrc中,或一個bash文件進行採購

set_Cb_to_insert_text() { 
    bind '"\C-m": accept-line' 
    bind '"\C-b":"ls \C-t1"' 
    bind -x '"\C-t1":set_Cb_to_complete' 
} 
set_Cb_to_complete() { 
    bind '"\C-m":"\C-t2\C-t3"' 
    bind '"\C-b": menu-complete' 
    bind '"\C-t2": accept-line' 
    bind -x '"\C-t3":set_Cb_to_insert_text' 
} 
set_Cb_to_insert_text 

如何工作的:

隨着bind,可以綁定按鍵做的三兩件事之一,但沒有它們的組合:

  • 執行readline命令:bind '"key": command'
  • 執行一系列按鍵:bind '"key":"keystrokes"'
  • 執行shell命令:bind -x '"key": shell-command'

所以,如果你想這三樣東西結合起來,你需要他們每個綁定到按鍵的組合分開(在我的例子的Ct {,, })並綁定一個鍵來執行所有這些鍵擊。

在該實例中:

C-B第一刀片ls和 '按下' C-噸 ,該單元執行set_Cb_to_complete,這反過來又重新綁定C-Bmenu-complete。它也將重新綁定釐米,回車,或輸入,因爲它現在需要做兩兩件事:接受就行了,復位的Cb插入ls,通過調用set_Cb_to_insert_text功能,這也將重置輸入到這是正常的使用。

我之所以這麼說,的Ct不得不「犧牲」,就是如果你按的Ct,readline的會等着看,如果你打算按1或2,或任何綁定的關鍵序列,在它採取任何行動之前。但是,當您首次將C-t用於此用途時,您可以將其用作大量擊鍵的初始鍵以涵蓋所有的readline欺騙。

建議:當你正在編寫和測試這些時,綁定一個備用密鑰到accept-line,因爲突然有什麼東西在錯誤的地方打破了鏈條,並且你被困在終端中而沒有執行命令的方式:)

+0

非常感謝你的想法,例子和詳細的答案(令人費解,是的,但你在bash + readline框架及其限制內工作)。在我發佈的一年多之後,我只能隱約記得我在大圖中所做的事情......所以我剛剛證實了您的示例的工作原理,但會花更多時間重新創建我以前完成的任務 - 謝謝! – nhed

4

這可能會爲你工作:

"\ex": menu-complete 
"\ez": "ls \ex" 

將這些行包含在~/.inputrc文件中。

這些行設置Alt-x爲menu-complete和Alt-z爲lsspacemenu-complete。這將爲您提供目錄中的第一個文件,並使用Alt-x一次一個遍歷剩餘的文件。

有關宏的更多示例,請參見here

通過調用bind -pbind -Pbind -s來檢出readline命令將顯示您已擁有的宏。有關綁定命令,請參閱here也可以關閉宏,請參閱here。最後檢查.inputrc文件是否正在讀取,我遇到了麻煩,因爲環境變量設置爲/etc/Inputrc,我的個人版本從未被調用過。

順便說一下,因爲它已被許多readline命令使用,所以不要使用Control-x。

+0

這幾乎是訣竅,但後續調用需要2個關鍵組合。我已經瞭解如何綁定文本插入以及如何綁定菜單完成......如果我第二次「Alt-z」,我希望顯示器只顯示'ls ',但是我卻看到了ls ls '... – nhed

+0

這意味着(我可能在這裏錯了),你想要相同的組合鍵來切換它的動作。在閱讀readline庫的文檔時,唯一的條件規則是關於'mode',即bash,emacs,ftp ......或許在這種情況下,您可能需要編寫一個新的readline函數,參見[here](http:// cnswww .cns.cwru.edu/PHP /切特/ readline的/ readline.html#SEC23)。順便說一下,看看這種方式... Alt-x和Alt-z相距不是百萬英里(不在我的鍵盤上),菜單完整的關鍵組合通常會派上用場。 – potong

+0

實際上,在我的Mac上,你提到的關鍵組件只對Esc-x,Esc-z做出響應,而在後面的「\ ex」似乎並沒有做任何事情。 – nhed