当“read -e”在 bash 中处于活动状态时,当前的制表符完成似乎仅匹配文件名:
read -e
[[TabTab]]
abc.txt bcd.txt cde.txt
Run Code Online (Sandbox Code Playgroud)
我希望完成是由我定义的一组字符串,而文件/目录/主机名完成等应在“read -e”期间停用。
在脚本之外
complete -W 'string1 string2 string3' -E
Run Code Online (Sandbox Code Playgroud)
效果很好,但在使用“read -e”时我无法在脚本内完成这种工作。
我使用官方安装脚本安装了 rustup+rust+cargo 。
如何启用 shell 补全,以便能够cargo <TAB>在终端中键入并查看可能的命令,例如cargo check?
在bash完成脚本中,假设COMPREPLY=(aa/ba/ aa/bb/).调用脚本时,完成选项对用户来说是这样的:
$ foo aa/b<TAB>
aa/ba/
aa/bb/
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够更好地控制这些选项的显示方式.特别是,我想只向用户显示每个COMPREPLY选项的子字符串,类似于bash中目录完成的工作方式:
$ foo aa/b<TAB>
ba/
bb/
Run Code Online (Sandbox Code Playgroud)
有没有办法在bash中这样做?
我有一个允许在后台执行Bash进程的脚本,我将其称为"backy".我想在后台运行的程序我这样调用:
backy long-running-script param1 param2
Run Code Online (Sandbox Code Playgroud)
现在的问题是,long-running-script如果我添加另一个脚本,我将失去Bash完成.
我想编写一个Bash完成文件,它不仅保留Bash完成long-running-script及其所有参数,也保留了我想用backy调用的每个其他脚本.
我有一些Bash完成的经验,但我只是错过了我可以插入到我的Bash完成脚本中的命令,以便在完成要调用的脚本时完成.有任何想法吗?
到目前为止我完成了:
have backy &&
_backy_complete()
{
local cur prev goals
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
# How to get the completion from the script that is the param for backy,
# in a generic way?
COMPREPLY=( ????? )
return 0
} &&
complete -F _backy_complete backy
Run Code Online (Sandbox Code Playgroud)
编辑 - 解决方案:
感谢Lekensteyn,我用这一行替换了现有bash完成脚本的内容:
complete -F _command backy
Run Code Online (Sandbox Code Playgroud) 在$ PATH和all中完成命令,可执行文件时,我想省略名为#foo#和bar~的文件.我不介意放置这些备份文件,但在完成命令时不希望看到它们.我是否需要以某种方式为此编写bash-completer函数?
在我正在谈论的提示中,它完成了第一个单词;
bash# auda[TAB]
Run Code Online (Sandbox Code Playgroud) 我有以下目录结构:
/home/tichy/xxx/yyy/aaa
/home/tichy/xxx/yyy/aab
/home/tichy/xxx/yyy/aac
Run Code Online (Sandbox Code Playgroud)
我想输入cdw y <TAB>并得到cdw yyy/<CURSOR>,所以我可以添加cdw yyy/a <TAB>并获得cdw yyy/aa <CURSOR>
我想出的解决方案给了我以下内容:
cdw y <TAB> => cdw yyy <SPACE> <CURSOR>
以下代码我到目前为止:
_cdw () {
local cur prev dirs
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
COMPREPLY=($(compgen -d -- /home/tichy/xxx/${cur}|perl -pe 's{^/home/tichy/xxx/}{}'))
# no difference, a bit more logical:
dirs=$(compgen -o nospace -d /home/tichy/xxx/${cur}|perl -pe 's/{^/home/tichy/xxx/}{}')
COMPREPLY=($(compgen -d -W ${dir} ${cur}|perl -pe 's{^/home/tichy/xxx/}{}'))
return 0
}
complete -F _cdw cdw
cdw () {
cd /home/tichy/xxx/$@
}
Run Code Online (Sandbox Code Playgroud)
有什么想法有什么不对吗?在我看来,完成过程似乎已经完成,并没有期待任何更多的输入.
我正在使用Git和git-completion,一切正常,只有一个例外:当我这样做时
git p some_remote [TAB]
我得到自动完成建议当前目录中的文件(错误).p是一个Git别名:
$ cat ~/.gitconfig
[alias]
p = push
Run Code Online (Sandbox Code Playgroud)
当我做的时候:
git push some_remote [TAB]
Run Code Online (Sandbox Code Playgroud)
我得到了当前存储库中的分支的建议(正确).在这两种情况下,完成some_remote工作正常.
这是什么原因?
我经常使用命令历史扩展使用表单!n:m,其中n是历史命令m的编号,是参数的编号或其缩写形式.
有没有办法在现场扩展这些论点,以便我可以选项卡完成它们?
一个简单的例子:
$ mycmd long/path/with/plenty/of/subdirectories/
$ cp !$/tediously-verbose-filename.txt .
Run Code Online (Sandbox Code Playgroud)
我希望能够使用参数重复,而不必完全输入文件名(或使用ls或使用虚拟运行echo).
当可能的选项可能包含空格时,我遇到了bash-completion的问题.
假设我想要一个与第一个参数相呼应的函数:
function test1() {
echo $1
}
Run Code Online (Sandbox Code Playgroud)
我生成一个可能的完成选项列表(一些有空格,一些没有),但我无法正确处理空格.
function pink() {
# my real-world example generates a similar string using awk and other commands
echo "nick\ mason syd-barrett david_gilmour roger\ waters richard\ wright"
}
function _test() {
cur=${COMP_WORDS[COMP_CWORD]}
use=`pink`
COMPREPLY=( $( compgen -W "$use" -- $cur ) )
}
complete -o filenames -F _test test
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,我得到:
$ test <tab><tab>
david_gilmour nick roger waters
mason richard syd-barrett wright
$ test r<tab><tab>
richard roger waters wright
Run Code Online (Sandbox Code Playgroud)
这显然不是我的意思.
如果我没有分配一个数组COMPREPLY,即只有$( …
我的代码全部位于我的计算机/ a/b/c/d/e/myCode上的以下目录中.当我想编译project1时,我很生气地键入make/a/b/c/d/e/myCode/project1.为了解决这个问题,我在bashrc中创建了一个函数,如下所示:
function make_project { make /a/b/c/d/e/myCode/$1; }
Run Code Online (Sandbox Code Playgroud)
然后我称之为:
make_project project1
Run Code Online (Sandbox Code Playgroud)
这很好用.唯一的问题是我没有project1的自动完成功能.因此,如果我有一个名为my_complicatedly_named_project的复杂名称的项目,我将需要输入整个名称.是否有任何方法让bash知道参数是/ a/b/c/d/e/myCode /中的目录它可以自动完成吗?
bash ×10
bash-completion ×10
autocomplete ×1
directory ×1
executable ×1
git ×1
path ×1
readline ×1
rust ×1
rust-cargo ×1
rustup ×1