Bash

目錄中文件名的自動完成

  • July 4, 2021

這個問題與這個問題非常相似,但我無法理解解決方案。我也知道這個教程,但我仍然無法理解我做錯了什麼。

我正在嘗試自動完成放置在的目錄列表/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

引用自:https://unix.stackexchange.com/questions/28283