私のbash関数ディレクトリはここにあり、/git/function
構造は次のとおりです。
/git/function/
├── delete
│ ├── delete.dir
│ └── delete.file
├── main.sh
├── get
│├── get.dir.sh
│└── get.file.sh
使い方 main.sh
使用法:get + space + TAB(/git/function/get/
ディレクトリからオートコンプリート)
出力:
dir file
次:選択を選択するとget file
スクリプトが実行されます。/git/function/get/get.file.sh
#!/bin/bash
# Directory where the functions are located
functiondir="/git/function"
# List of supported commands:
commands=(
"get"
"delete"
)
# Function to execute the 'get' command
get() {
echo "Running $functiondir/get/get.$1.sh"
}
# Function to execute the 'delete' command
delete() {
echo "Running $functiondir/delete/delete.$1.sh"
}
# Autocompletion function for command names
_completion() {
# Find all files in the specified function directory with the given command name
local function_files=$(find "$functiondir/$1" -maxdepth 1 -type f -name "$1.*.sh" -printf '%f\n' | sed "s/^$1\.//;s/\.sh$//")
# Generate autocompletion options based on the found files
COMPREPLY=($(compgen -W "$function_files" -- "${COMP_WORDS[COMP_CWORD]}"))
}
# Set autocompletion for 'get' and 'delete' commands using the _completion function
complete -F _completion -o filenames "${commands[@]}"
いくつかの質問があります。
- main.shは.bashrcに由来しています。
- コマンド補完.の代わりに使用したいと思います。space
/git/function/
main.shにアドインを追加せずに、サブディレクトリからコンテンツを動的に作成する必要があります。- たとえば、コマンドの最初の部分は次のようになります。入力した場合get.TAB (存在することを確認し、
sub-dir
trueの場合は、このディレクトリの内容をオートコンプリート/git/function/get
で作成する必要があります) - 入力するとdelete.TAB(存在することを確認する必要があり
sub-dir
、trueの場合はこのディレクトリの内容をオートコンプリート/git/function/delete
で生成する必要があります)
カスタム関数を動的にロードするより良いソリューションを知っている場合は、いくつかのヒントを共有していただきありがとうございます。
答え1
プログラム可能な完成文字は簡単に変更できます。
bind '".":complete'
しかし、私はこれが行く道ではないと思います。
より良い方法は、階層(またはget
などの特定のディレクトリ)からすべての実行可能ファイルをインポートし、このファイルのリストを結果delete
セットとして使用することです。complete -E # ...
complete -I # ...