有沒有辦法將兩個操作合併到一個鍵綁定中(不要以爲可以使用函數)。bash中的複雜鍵綁定
這是我想要做什麼:
我想一鍵綁定(說按Ctrl-X),以 -
- 插入一些文字,然後
- 調用完整或菜單後,使用插入的文本作爲完成基礎
我知道我可以(在~/.inputrc
)指定
- 插入帶(
C-X: "ls"
) - 執行的ReadLine命令(
C-SPACE: menu-complete
)
但我不知道如何把這些結合在一起
有沒有辦法將兩個操作合併到一個鍵綁定中(不要以爲可以使用函數)。bash中的複雜鍵綁定
這是我想要做什麼:
我想一鍵綁定(說按Ctrl-X),以 -
我知道我可以(在~/.inputrc
)指定
C-X: "ls"
)C-SPACE: menu-complete
)但我不知道如何把這些結合在一起
這個技巧是調用重新綁定你的密鑰的函數。在我的示例中,我將使用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
,可以綁定按鍵做的三兩件事之一,但沒有它們的組合:
bind '"key": command'
bind '"key":"keystrokes"'
bind -x '"key": shell-command'
所以,如果你想這三樣東西結合起來,你需要他們每個綁定到按鍵的組合分開(在我的例子的Ct {,, })並綁定一個鍵來執行所有這些鍵擊。
在該實例中:
C-B第一刀片ls
和 '按下' C-噸 ,該單元執行set_Cb_to_complete
,這反過來又重新綁定C-B到menu-complete
。它也將重新綁定釐米,回車,或輸入,因爲它現在需要做兩兩件事:接受就行了,復位的Cb插入ls
,通過調用set_Cb_to_insert_text
功能,這也將重置輸入到這是正常的使用。
我之所以這麼說,的Ct不得不「犧牲」,就是如果你按的Ct,readline的會等着看,如果你打算按1或2,或任何綁定的關鍵序列,在它採取任何行動之前。但是,當您首次將C-t用於此用途時,您可以將其用作大量擊鍵的初始鍵以涵蓋所有的readline欺騙。
建議:當你正在編寫和測試這些時,綁定一個備用密鑰到accept-line
,因爲突然有什麼東西在錯誤的地方打破了鏈條,並且你被困在終端中而沒有執行命令的方式:)
這可能會爲你工作:
"\ex": menu-complete
"\ez": "ls \ex"
將這些行包含在~/.inputrc
文件中。
這些行設置Alt-x爲menu-complete
和Alt-z爲ls
space
menu-complete
。這將爲您提供目錄中的第一個文件,並使用Alt-x一次一個遍歷剩餘的文件。
有關宏的更多示例,請參見here。
通過調用bind -p
或bind -P
和bind -s
來檢出readline命令將顯示您已擁有的宏。有關綁定命令,請參閱here也可以關閉宏,請參閱here。最後檢查.inputrc
文件是否正在讀取,我遇到了麻煩,因爲環境變量設置爲/etc/Inputrc
,我的個人版本從未被調用過。
順便說一下,因爲它已被許多readline命令使用,所以不要使用Control-x。
這幾乎是訣竅,但後續調用需要2個關鍵組合。我已經瞭解如何綁定文本插入以及如何綁定菜單完成......如果我第二次「Alt-z」,我希望顯示器只顯示'ls
這意味着(我可能在這裏錯了),你想要相同的組合鍵來切換它的動作。在閱讀readline庫的文檔時,唯一的條件規則是關於'mode',即bash,emacs,ftp ......或許在這種情況下,您可能需要編寫一個新的readline函數,參見[here](http:// cnswww .cns.cwru.edu/PHP /切特/ readline的/ readline.html#SEC23)。順便說一下,看看這種方式... Alt-x和Alt-z相距不是百萬英里(不在我的鍵盤上),菜單完整的關鍵組合通常會派上用場。 – potong
實際上,在我的Mac上,你提到的關鍵組件只對Esc-x,Esc-z做出響應,而在後面的「\ ex」似乎並沒有做任何事情。 – nhed
非常感謝你的想法,例子和詳細的答案(令人費解,是的,但你在bash + readline框架及其限制內工作)。在我發佈的一年多之後,我只能隱約記得我在大圖中所做的事情......所以我剛剛證實了您的示例的工作原理,但會花更多時間重新創建我以前完成的任務 - 謝謝! – nhed