簡體   English   中英

我可以通過擴展名制作制表符完成過濾器文件嗎?

[英]Can I make tab-completion filter files by extension?

假設myprogram僅使用*.data文件作為命令行參數。 在終端,當我們這樣做

$ myprogram <tab>

我們只希望列出*.data文件以供選項卡自動完成。 這種行為是如何實現的? 正在使用的shell是Bash。

選項1

在bash shell中鍵入以下內容

complete -f -X '!*.data' myprogram

-f選項告訴complete僅基於文件名而不是目錄完成。 -X選項允許您指定過濾器模式。

選項2

注意:此解決方案是全球性的。 它會影響每個目錄和每個命令的tab-completion(意思是像cdrm這樣的東西,以及myprogram )。 它的工作原理是允許您指定不會出現在tab-complete中的文件擴展名。 這不完全是您要求的,但如果您的工作目錄中除了*.data之外沒有多少文件,則排除所有選項不會太麻煩。 由於這兩個原因,這個選項可能不是你想要的,但仍然值得注意。

~/.bash_profile文件中添加該行

FIGNORE=".py:.txt:.out:.exe:.c:<etc>"

其語法是創建一個以冒號分隔的要忽略的文件擴展名列表。 保存新的.bash_profile您必須鍵入. ~/.bash_profile . ~/.bash_profile表示您所做的更改生效。

更多信息

有關完整命令的更多信息,請參閱Bash手冊中的Programmable Completion Builtins

更好地使用_filedir而不是“raw” complete

理由

  • grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
  • 波浪號( ~ )路徑正在擴展
  • 刪除目錄的前綴,即對於/home/tux/Do<TAB><TAB> ,作為回復獲得的列表將刪除'/ home / tux',因此更加緊湊
  • 更容易實現,更安全

MWE

寫一個文件“completions / myprogram”,你可以找到它. completions/myprogram . completions/myprogram 內容:

_myprogram()
{
    # init bash-completion's stuff
    _init_completion || return

    # fill COMPREPLY using bash-completion's routine
    _filedir '@(data)'
}
complete -F _myprogram myprogram

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM