shell 补齐路径_bash shell:命令的文件名自动补全设置
大家都知道 bash
里有個(gè)文件自動(dòng)補(bǔ)全功能,按兩下?Tab?鍵顯示出候選補(bǔ)全文件名,不同程序會(huì)顯示相應(yīng)的文件類型(根據(jù)擴(kuò)展名來(lái)判斷),例如
mplayer 會(huì)顯示媒體文件(如 avi、mpg、mkv),而不會(huì)顯示文本文件(如 txt、cfg、ini),而 Vim
則是反過(guò)來(lái),這樣的一直以來(lái)相當(dāng)好用,不過(guò)還是有些時(shí)候還是挺煩人的。
有時(shí)我想用 Vim 的 diff 功能來(lái)比較文件,比如兩個(gè) java 的
class 文件,雖然 class 文件是二進(jìn)制文件,但在 Vim 中可以轉(zhuǎn)換成十六進(jìn)制來(lái)顯示,方便比較。打了 Vim
命令后,按兩下?Tab?并補(bǔ)全候選不會(huì)有
class 文件,所以你得手動(dòng)輸入。
mplayer
的一個(gè)參數(shù)?-ass-styles,這個(gè)參數(shù)用于使用外部
ass 字幕的樣式,后面接一個(gè) ass 文件的路徑,用樣也不會(huì)顯示出來(lái),因?yàn)?bash 的自動(dòng)補(bǔ)全里并沒有為這個(gè)參數(shù)定義過(guò)。
這兩個(gè)例子只是最近用到,其實(shí)一直以來(lái)也遇過(guò)這種情況,很多時(shí)候我會(huì)把按兩次?Tab?來(lái)當(dāng)
ls
命令使用,看看目錄下有什么文件,但這樣會(huì)讓某些文件沒顯示出來(lái),讓你誤以為文件不存在,當(dāng)前目錄短文件名就直接輸入算了,好幾層的目錄和長(zhǎng)文件名就麻煩,對(duì)于這種情況,我的土方法是
把打了一半的命令行?Ctrl
+ c?掉,然后用 ls 看列一下,復(fù)制粘貼路徑出來(lái)
或者先直接補(bǔ)全路徑后,把光標(biāo)移回開頭輸入命令名
這樣太不夠效率了,尤其是在調(diào)試時(shí),命令參數(shù)記得比路徑還要熟的,干脆關(guān)掉這個(gè)文件擴(kuò)展名檢測(cè)功能好了。
我記得 bash 的補(bǔ)全腳本在
/etc/bash_completion,這個(gè)文件好長(zhǎng),稍微看了一下,發(fā)現(xiàn)有關(guān)聯(lián)的代碼,比如這段看來(lái)就是定義補(bǔ)全的擴(kuò)展名
complete -f -X '!*.fig' xfig
complete -f -X '!*.@(mid?(i)|MID?(I)|cmf|CMF)' playmidi
complete -f -X '!*.@(mid?(i)|MID?(I)|rmi|RMI|rcp|RCP|[gr]36|[GR]36|g18|G18|mod|MOD|xm|XM|it|IT|x3m|X3M|kar|KAR)' timidity
complete -f -X '*.@(o|so|so.!(conf)|a|rpm|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MPG|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)' vi vim gvim rvim view rview rgvim rgview gview
complete -f -X '*.@(o|so|so.!(conf)|a|rpm|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MPG|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)' emacs
complete -f -X '!*.@(exe|EXE|com|COM|scr|SCR|exe.so)' wine
直接執(zhí)行?complete?會(huì)輸出當(dāng)前定義過(guò)補(bǔ)全的命令,看樣子也是在
/etc/bash_completion 里定義的
$ complete | grep " mplayer\| vim"
complete -o filenames -F _mplayer mplayer
complete -o filenames -F _filedir_xspec vim
man 了一下 complete 命令,沒有手冊(cè),屬于 builtin
命令,上網(wǎng)找,簡(jiǎn)介在?這里?,用法在
大概看了一下用法,就是?complete
補(bǔ)全行為選項(xiàng) 命令名
-F:執(zhí)行指定函數(shù)名,候選結(jié)果保存在?COMPREPLY?數(shù)組變量里,補(bǔ)全功能更強(qiáng)大,可以實(shí)現(xiàn)命令參數(shù)補(bǔ)全,函數(shù)名在
/etc/bash_completion 定義的。
-f:補(bǔ)全文件名,后可跟?-X?參數(shù)。
-X:過(guò)濾表達(dá)式,符合表達(dá)式的文件名會(huì)被排除,即不會(huì)在補(bǔ)全候選顯示出來(lái),如果以感嘆號(hào)開頭,則表示反轉(zhuǎn),即符合表達(dá)式的文件名才顯示。
-o:補(bǔ)全類型,filenames?表示補(bǔ)全的是一個(gè)文件,跟?-f?參數(shù)使用才有效;其它值如?dirnames?表示補(bǔ)全目錄。
-F?執(zhí)行的函數(shù)比?-f
-X?更早執(zhí)行,這樣說(shuō)起來(lái)有點(diǎn)混亂,我測(cè)試了一下,
當(dāng)你輸入好「命令名 」,按兩下Tab鍵,開始補(bǔ)全。
bash
執(zhí)行了?-F?指定的函數(shù),函數(shù)執(zhí)行完后輸出數(shù)組變量?COMPREPLY?的結(jié)果,這個(gè)變量值有可能為空。
繼續(xù)根據(jù)?-f
-X?里的表達(dá)式,符合表達(dá)式的文件名不則顯示,同時(shí)結(jié)果再根據(jù)?-o?指定補(bǔ)全類型來(lái)決定是否顯示。
就以 Vim 和 mplayer 舉例
對(duì)于 Vim 來(lái)說(shuō),它最終被定義的行為這樣
complete -o filenames -F _filedir_xspec -f -X '*.@(o|so|so.!(conf)|a|rpm|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MPG|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)' vim
先執(zhí)行?_filedir_xspec?函數(shù),而這個(gè)函數(shù)執(zhí)行后變量?COMPREPLY?為空,所以什么也沒輸出。接著補(bǔ)全文件名,可以看?class?字符串在表達(dá)式里面,所以不顯示。如果刪掉?class|?再運(yùn)行,就可以匹配
class 文件了。
對(duì)于mplayer,它最終被定義的行為這樣
complete -o filenames -F _mplayer mplayer
先執(zhí)行了?_mplayer?函數(shù),這個(gè)函數(shù)在
/etc/bash_completion 代碼非常多,mplayer 的選項(xiàng)參數(shù)都打上去了,所以能補(bǔ)全 mplayer
的選項(xiàng)參數(shù)。到補(bǔ)全文件名時(shí),沒有指定過(guò)濾表達(dá)式,所以什么都沒做。亦即它的補(bǔ)全功能全由?_mplayer?函數(shù)完成。
以上結(jié)果純屬連猜帶蒙,若有錯(cuò)誤,煩請(qǐng)指正,為了介紹一個(gè)小功能碼了這么多字容易嘛我,所以
臨時(shí)禁用 Vim 的補(bǔ)全功能就是
complete vim
保留路徑補(bǔ)全,但不要擴(kuò)展名檢測(cè),不指定「-X」即可
complete -f vim
只補(bǔ)全文件
complete -o filenames -f vim
只補(bǔ)全目錄
complete -o dirnames vim
總結(jié)
以上是生活随笔為你收集整理的shell 补齐路径_bash shell:命令的文件名自动补全设置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python调用cplex求解_CPLE
- 下一篇: idea验证失败_SVN提示https证