Bash
目錄中文件名的自動完成
這個問題與這個問題非常相似,但我無法理解解決方案。我也知道這個教程,但我仍然無法理解我做錯了什麼。
我正在嘗試自動完成放置在的目錄列表
/something/
:$ ls /something/ One Other Three
以某種方式發生這種情況:
$ hi [TAB] One Other Three $ hi O[TAB] One Other
只有當第一個詞是
hi
而不是只有在裡面/something/
。這就是我正在做的事情
.profile
:_codeComplete() { local cur=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen `ls /something/` -- $cur) ) } complete -F _codeComplete "hi "
嘗試:
_codeComplete() { local cur=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W "$(ls /something/)" -- $cur) ) } complete -F _codeComplete hi
您需要指定
-W
選項compgen
並引用生成單詞列表的命令。有關如何在此部落格上編寫完成函式的更多資訊:編寫您自己的 Bash 完成函式
讓我嘗試改進已接受的答案。
原始答案將因文件名包含空格而失敗。經過一番調查,我意識到您可以將輸入分隔符更改為行尾:
IFS=$'\n'
使函式正確處理空格。
_codeComplete() { local cur=${COMP_WORDS[COMP_CWORD]} IFS=$'\n' tmp=( $(compgen -W "$(ls ~/something/ )" -- $cur)) COMPREPLY=( "${tmp[@]// /\ }" ) } complete -F _codeComplete hi