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-dir存在,如果为真则生成此目录的内容/git/function/get作为自动完成)
  • 如果我输入delete.TAB(我应该检查是否sub-dir存在,如果为真则生成此目录的内容/git/function/delete作为自动完成)

如果您知道动态加载自定义函数的更好解决方案,如果您能分享一些技巧,我将不胜感激

答案1

可编程完成字符可以轻松更改:

bind '".":complete'

不过,我不认为这是该走的路。

我想更好的方法是从层次结构中获取所有可执行文件(或只是某些目录,如get和),并使用此文件列表作为和delete的结果集complete -E # ...complete -I # ...

相关内容