定義 Bash Shell 中有趣的 bind key

常常需要輸入 sudo 這個指令但又常常 typo 的人有救了!

看網址 http://www.commandlinefu.com/commands/view/11297/add-sudo-with-shortcut-alte-in-bash

範例的用意是用 alt+e 方式自動帶入 sudo 並且正確設定游標

bind '"\ee": "\C-asudo \C-e"'

把上面那個放到bashrc就可以摟!

研究一下是怎麼回是吧...

bash 原本就有提供 bind 這個內建指令,用途就是 key-binding 基本語法就是

bind

    bind [-m keymap] [-lpsvPSV]
    bind [-m keymap] [-q function] [-u function] [-r keyseq]
    bind [-m keymap] -f filename
    bind [-m keymap] -x keyseq:shell-command
    bind [-m keymap] keyseq:function-name
    bind readline-command

所以最簡單就是 bind "keyseq":"function"

到底 Keyseq 是哪來的 alt+e 怎麼是 '\ee',預設情況下 alt 就是 bash 的 'meta' key

而 'meta' key 又演變成 'esc'。所以 當你用 read 這個指令輸入 alt+e 時會看到

user@T:~$ read
^[e

這邊的 ^[ 其實是 escape or meta key 的意思,再加上後變得字母 'e',所以變成 ^[e

剛剛講的是輸出的時候,那輸入又是另一回事了,我們要把 alt+e 當作 hot key 的表示法要想成我們要 escape+e 的表示法,而 escape 的表示法就是 \e ,所以 \ee 就是 [Meta]+e = alt+e = esc+e,這整個我也是一知半解阿...,反正,你如果不想用 alt+e ,這時候就用 read 去找出順手的 hotkey,把看到的 ^[ 換成 \e 就是了。

function 的部份就比較好懂,就是對應的行為,這邊就是要輸入sudo,範例的作法就是

\C-asudo \C-e

\C 就是 ctrl 的輸入表示法,整個解釋起來就是 ctrl+a ,將游標移至第一個字元,緊接著輸入 sudo ,再用 ctrl+e 讓游標移到行尾,這樣就變成了 \C-asudo \C-e,如此一來本來輸入dpkg -l馬上按下 alt-e 就變成了 sudo dpkg -l

下面的連結有更多關於 bind, keyseq 等相關資訊...

reference: * http://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html * http://www.delorie.com/gnu/docs/bash/bashref_92.html * http://www.techrepublic.com/article/find-and-bind-key-sequences-in-bash/ * http://www.zdnet.com/article/find-and-bind-key-sequences-in-bash/

Comments