Bash
readline 使用技巧
摘要
readline 使我真正體驗到 GNU
Bash 的強大!(2003-05-21 08:43:15) By ideal, 出處:http://learn.tsinghua.edu.cn/homepage/015450/
readline.html
做者: 王垠
Bash
readline 使用技巧
不少人會用
Bash,可是不多有人知道
readline 是怎麼回事。
readline 是 一個強大的庫,只要使用了它的程序,均可以用同一個配置文件配置,並且用同 樣的方法操做命令行,讓你能夠方便的編輯命令行。
使用
readline 的程序如今主要有
Bash, GDB,ftp 等。
readline 付予這些 程序強大的 Emacs 似的命令行編輯方式,你能夠隨意綁定你的鍵盤。
術語解釋
在下文中,咱們常常提到 'C-x r' 這類鍵操做。'C-x r' 其實就是按Ctrl-x, 而後按 r。同理 'C-M-@' 就是按 ctrl-alt-@(M表示meta, 在 PC 上就是 Alt 鍵),可是其實 @ 是shift-2 (看看你的鍵盤)。因此 'C-M-@' 實際上要你按 ctrl-alt-shift-2。
可是在配置文件裏的鍵序列中,咱們把 'C-x r' 表示爲 '\C-xr', 把 'C-M-@' 表示爲 '\C-\M-@',你本身看看就知道怎麼回事了。同理 'Esc a' 別表示 成 '\ea'。
這就是 Emacs 裏的按鍵的一般標記方法。EMACS = Esc Meta Alt Ctrl Shift
技巧篇
在本身配置命令行以前,咱們先來看看利用缺省的鍵綁定可以進行的一些巧妙的用法:
第一招:使用之前的命令行參數
你是否常常出現這種狀況?你想把 ~/text-browser/ 目錄下的3個.tar.gz文 件搬到/usr3/software/,因而你輸入:
$mv ~/text-browser/*.tar.gz /usr3/software/
我想你必定已經知道,打入 ~/text 以後按 TAB 就能夠補全text-browser這 個長文件名吧?這是
Bash 的基本功能。我廢話?好了,就當你知道吧。不過今 天我要講的東西比這個複雜一些。
Go on! 剛剛輸入到這裏,你忽然想起,應該在 /usr3/software/ 下先創建一個目錄 叫browsers,這樣放進去的文件比較好管理。
因而你 Ctrl-u,刪掉了這行命令。唉呀,這麼長的命令一下就沒了。是否是 有點惋惜?這還不算麻煩。而後你
mkdir /usr3/software/browser
mv ~/text-browser/*.tar.gz /usr3/software/browser
嗯。TAB 是幫了你很多忙。但是你實際上有更好的辦法來完成這項工做。好吧, 看看
readline 怎樣神奇的完成你的任務:
咱們回到這種狀況:
$mv ~/text-browser/*.tar.gz /usr3/software/
你剛纔是按了 Ctrl-u 刪除了全部輸入的東西。惋惜啊!你要是按 M-#(也就是 按住 PC 機的 Alt 鍵,再按 #,實際上就是 Alt-Shift-3),那麼
Bash 就會在這樣最開頭插入一個 '#',而後輸入這行。這樣命令就被做爲一行註釋載 入了歷史。
這有什麼好處?這樣你的這行命令裏的內容就能夠被再次利用。看着:你接 着輸入:
mkdir ...
等等,你是否是想輸入 /usr3/software/?你不用再敲一遍了!直接按 M-.(Alt 加句號),看看, /usr3/software/ 是否是出如今命令行上了?M-. 就是調用了 yank-last-arg 函數,把上一條命令的最後一個參數放在命令行上。好了,回車 吧!
你接着輸入:
mv ...
等等,這下是該輸入 ~/text-browser/*.tar.gz 了。煩不煩啊?換一種方式吧。 請按:'M-1 M-.'(把上一條命令的第一個參數放在命令行上)。這樣命令行成爲 了:
mv /usr3/software/browser
怎麼成這樣了?看看你的「上一條命令」是什麼吧?是……你本身看。因此這個 參數不是你想要的。那麼繼續再按一次 'M-.'。看到了吧?你的命令行已經成爲:
mv ~/text-browser/*.tar.gz
好。打一個空格。再按一下 'M-.'。命令行變成了:
mv ~/text-browser/*.tar.gz /usr3/software/browser
這就是你想要的!
是否是看起來你仍是花了很多工夫?可是想想,若是你是要執行這樣一個 命令呢?
mv /data/ftp/pub/TUG/texmf/tex/latex/CJK/GB/GB.cap \
/usr/local/texlive/texmf-local/tex/latex/CJK/GB/
嗯。記住這個有用命令:M-. , 它的前面能夠用 M-0, ... 做爲數字參數。
第二招:補全命令名,文件名和變量名
你知道 TAB 能夠補全命令行上不少東西。但是你遇到這種狀況的時候怎麼辦?
man a-very-very-long-command-name
你輸入了 man a-ver... 以後,按 TAB,什麼反應也沒有。由於 TAB 執行的是 「按狀況補全」(complete),它看到 man,知道這應該是一個命令,那麼它認爲: 「後面應該是一個文件名參數。」 可是你想要的是命令的名字怎麼辦?答案: 按 'M-!'.
再來看:你須要設置 XMODIFIERS='@im=fcitx'。你輸入了
export XM...
按 TAB? 沒有反應。爲何呢?由於 TAB 的補全想要一個文件名,而當前目錄 沒有開頭是 'XM...' 的文件。那麼你怎麼補全?答案:'M-$'。
其實
readline 的補全方式被
Bash 擴充了不少。看看有多少吧!
'TAB': complete
'\M-!': complete-command
'\M-/': complete-filename
'\M-@': complete-hostname
'\M-~': complete-username
'\M-$': complete-variable
本身試試吧!
第三招:擴展命令行
你的一個目錄裏有不少相似的文件,名字叫 T12.txt, T12.log, T23.txt, T23.log, T13.txt, T13.log…… 有後綴 txt 的,也有後綴 log 的。... 你 想把其中的某些 T*.txt 都移動到另一個目錄,而T*.log都不動。可是T*.txt 也不是所有都要移動。因此你想把T*.txt 都放在命令行上,而後選擇其中一些。 你輸入:
mv T...
接着按 'M-*'(insert-completions)。結果 T 開頭的文件都被放到命令行上了。 嗯。這在某些時候是有用的,但是如今它把 T*.log 的文件也放上去了。不行。 咱們因而繼續輸入:
mv T*.txt
好了,如今咱們可使用 'C-x*'(先按ctrl-x,而後按*)。 結果全部名字T*.txt 的文件都被放到了命令行上面。'C-x*' 執行的函數叫作 glob-expand-word.
配置篇
你是否是以爲那些命令很難記住?不順手?別怕!它們都是能夠改變的,就 像Emacs的鍵綁定那樣,能夠被任意的改變!
全部使用
readline的程序,都使用一個配置文件來決定它的行爲和鍵綁定。 這個文件通常是 INPUTRC 環境變量肯定的。若是這個環境變量沒有值,那麼缺 省使用 ~/.inputrc。
~/.inputrc 文件很簡單,只有4種語句:
1. 註釋
2. 變量設置語句(set variable value)
3. 鍵綁定('keyseq':function)
4. 條件語句($if ... $endif)
咱們先不說其它的,先來看看鍵綁定吧!
鍵綁定
1. 綁定語句。
你如今就能夠動手設置你喜歡的控制方式。好比,我發現有些時候我須要在 命令行上作上 mark(Emacs 術語),而後把mark 和光標之間的 region(Emacs術 語) 刪掉,這個操做在 Emacs 裏叫作kill-region. 可是咱們發現這個函數在
Bash 裏缺省是沒有綁定的。若是我但願獲得跟 Emacs 同樣的綁定 C-w 的話, 就把這行插入到 ~/.inputrc:
'\C-w':kill-region
2. 使綁定生效。 爲了使這個鍵綁定生效,你須要執行 re-read-init-file 函數。這個函數缺省 綁定在了 'C-x C-r'。你修改 ~/.inputrc 以後在
Bash 裏輸入 'C-x C-r' 就 可使新的配置生效了。
3. 列出可用的函數。
不過你怎麼知道那些函數能夠被綁定呢?
readline 的 info 頁列出了不少 函數,但是你不會每次都去info裏查詢吧,很麻煩啊。其實你可使用
bash的 bind 命令來獲得全部的鍵綁定:
$bind -p
能夠顯示全部現有的已經綁定和沒有綁定的函數。沒有被綁定的函數被顯示爲 '(not bound)',並被加上了註釋。就像這樣:
'\C-g': abort
'\C-x\C-g': abort
'\M-\C-g': abort
'\C-j': accept-line
'\C-m': accept-line
# alias-expand-line (not bound)
# arrow-key-prefix (not bound)
# backward-byte (not bound)
'\C-b': backward-char
'\M-OD': backward-char
'\C-h': backward-delete-char
'\C-?': backward-delete-char
你能夠把這個命令的輸出做爲一個模板,嵌入到 ~/.inputrc 文件。把你喜歡的 函數綁定到方便的按鍵。
其實
readline 有三個函數可讓你方便的查詢函數,變量和宏的綁定狀況, 它們是:
dump-functions
dump-variables
dump-macros
但是它們缺省都沒有被綁定到任何按鍵。你能夠爲它們分別設置相似 'C-xf', 'C-xv', 'C-xm' 這樣容易記憶的綁定。
4. 若是忘了綁定……
這樣你就能夠設置你須要的綁定啦!可是你仍是有可能在須要的時候忽然記 不起哪些鍵綁定能夠補全。這時候你輸入:
$bind -p | grep compl
獲得結果:
'\C-i': complete
'\M-\e': complete
'TAB': complete
'\M-!': complete-command
'\M-/': complete-filename
'\M-@': complete-hostname
'\M-{': complete-into-braces
'\M-~': complete-username
'\M-$': complete-variable
'\M-\C-i': dynamic-complete-history
'\M-g': glob-complete-word
'\M-*': insert-completions
.......
這樣你記不住一個鍵的時候就能夠方便的查詢,這樣幾回以後,你就會把本身需 要的按鍵都記住了。
配置變量
1. 體驗:
Bash 的
readline 有一些變量能夠控制它的行爲。好比:
bell-style 能夠控制出錯時是 audible(發出響聲),visible(閃動屏幕), 仍是none(什麼都不作);editing-mode 能夠控制你是用 Emacs 的輸入方式仍是 用 vi 的;
completion-query-times 的值控制在補全的個數超過多少N時,
bash 提示: 「Display all N possibilities? (y or n)」; 若是我設置 expand-tilde 爲 on,當輸入「ls ~/doc」,按 TAB 時,命令行 會自動變成 'ls /home/wy/doc'. 若是把 visible-stats 設置爲 on,那麼列出補全的時候,目錄,可執行文 件,符號鏈接,會被分別使用 /, *, @ 來標記,就像 ls -F 的到的結果。 2. 設置: 設置的方法極其簡單,就在 ~/.inputrc 文件裏寫入相似語句: set visible-stats on 而後 'C-x C-r' 使設置生效。 3. 怎樣知道有哪些設置? 能夠設置的參數是不少的。使用命令 $bind -v 就能夠獲得全部這些能夠設置的變量和它們的值了