gpt4 book ai didi

linux - 在 Bash 脚本中查找基于文件名的自动完成

转载 作者:太空狗 更新时间:2023-10-29 12:07:33 25 4
gpt4 key购买 nike

有一个命令行功能我一直想要很久,我也想过如何最好地实现它,但我一无所获......

所以我想要的是当我开始输入文件名并点击 Tab 键时,例如:

# git add Foo<tab>

我希望它运行一个 find 。 -name "*$1*" 并基本上将匹配文件的完整路径自动完成到我的命令行。

我目前拥有的:

我知道我必须编写一个函数来使用我想要的参数调用应用程序,例如 git add。之后需要捕捉tab-keystroke事件,做上面提到的find,如果多则显示结果,如果有则填入结果。

我没弄清楚的是:

如何在函数内的函数内捕获 Tab 键事件。

所以基本上是伪代码:

gadd() {git add autocomplete_file_search($1)}

autocomplete_file_search(keyword) {
if( tab-key-pressed ){
files = find . -name "*$1*";
if( filecount > 1 ) {
show list;
}
if( files == 1 ) {
return files
}
}
}

有什么想法吗?

谢谢。

最佳答案

匹配文件名中的任何位置相当复杂,我不确定它是否真的那么有用。在文件名开头进行匹配更有意义,也更容易实现,甚至可以递归实现。

现在,您提到 find 是一项要求,但 bash(从 4.0 版开始)也可以递归地查找文件,让 bash 来做这部分工作应该更有效率。要在 bash 中递归匹配,您可以通过运行 shopt -s globstar 来启用 globstar shell 选项。 ,然后是两个连续的星号,** , 将递归匹配。

接下来,假设您想在 git 存储库中递归匹配文件,我们最好有一种方法来检测我们实际上是在 git 存储库中,否则,如果您不小心在 / 中触发它例如,您的提示将在等待 bash 搜索整个文件系统时挂起。以下函数在确定我们是否在 git 存储库中时应该相当有效。给定当前工作目录,例如/foo/bar/baz , 它会寻找 /foo/bar/baz/.git , /foo/bar/.git , /foo/.git , /.git如果找到一个则返回 true,否则返回 false。

isgit() {
local p=$PWD
while [[ $p ]]; do
[[ -d $p/.git ]] && return
p=${p%/*}
done
return 1
}

为简单起见,我们将创建一个 gadd命令添加补全。完成功能只能应用于命令的第一个字。例如。我们可以为 git 添加完成, 但不是 git add ,因此我们将创建一个新命令,将 git add 变为变成一个词。

gadd() {
git add "$@"
}

现在是实际的完成函数。当通过点击 TAB 触发时,将使用三个参数调用该函数。 $1是正在完成的命令,$2是正在完成的命令行的当前字,$3是该行的前一个词。所以我们要搜索的文件将由 glob **/"$2"* 匹配。 ;所有以 "$2" 开头的文件.我们迭代这些文件名,并将它们附加到 COMPREPLY 数组。如果函数完成时 COMPREPLY 数组仅包含一个值,则该词将被该值替换。如果它包含多个值,请再次按 Tab 键以获取所有匹配项的列表。

shopt -s globstar
_git_add_complete() {
local file
isgit || return
for file in **/"$2"*; do
# If the glob doesn't match, we'll get the glob itself, so make sure
# we have an existing file
[[ -e $file ]] || continue

# If it's a directory, add a trailing /
[[ -d $file ]] && file+=/
COMPREPLY+=( "$file" )
done
}
complete -F _git_add_complete gadd

将以上三个代码块添加到您的~/.bashrc ,然后打开一个新的终端,输入一个git仓库并尝试gadd something<tab> .

关于linux - 在 Bash 脚本中查找基于文件名的自动完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4791642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com