bash:コマンドの完成のためにスペースの代わりに。

bash:コマンドの完成のためにスペースの代わりに。

私の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-dirtrueの場合は、このディレクトリの内容をオートコンプリート/git/function/getで作成する必要があります)
  • 入力するとdelete.TAB(存在することを確認する必要がありsub-dir、trueの場合はこのディレクトリの内容をオートコンプリート/git/function/deleteで生成する必要があります)

カスタム関数を動的にロードするより良いソリューションを知っている場合は、いくつかのヒントを共有していただきありがとうございます。

答え1

プログラム可能な完成文字は簡単に変更できます。

bind '".":complete'

しかし、私はこれが行く道ではないと思います。

より良い方法は、階層(またはgetなどの特定のディレクトリ)からすべての実行可能ファイルをインポートし、このファイルのリストを結果deleteセットとして使用することです。complete -E # ...complete -I # ...

関連情報