我正在尝试解决为什么 bash 选项卡完成在我的 Fedora 19 桌面上不起作用。恐怕我只知道还有什么可以添加到可能相关的。
我尝试为别名添加一个完成:alias m='man'.
所以,我添加complete -F _man m到我的.bashrc.
问题是_man用于完成的函数不是在 bash 会话开始时定义的,而是在对$ man命令执行第一个 tab-competition 时定义的。
所以:
$ complete -p | grep _man可以不返回任何内容,也可以返回:
complete -F _man man
complete -F _man apropos
complete -F _man whatis
Run Code Online (Sandbox Code Playgroud)
因此,当我尝试按$ m命令完成选项卡时,我可以得到:
$ m -bash: completing : function « _man » not found
$ m
Run Code Online (Sandbox Code Playgroud)
而且我有功能相同的问题_aptitude和_apt-get
我想要的是,一旦 bash 启动,就使用 my.bashrc强制创建函数_man, 。_aptitude_apt-get
也许可以使用compgen内置。
我的 bash 版本是: …
compgen -d -- $cur 将建议仅对 pwd 中的目录进行补全吗?
我可以让它在另一个目录中建议某些目录的目录完成吗?
例如。如果我在/curr_dir,并且我想为/other_dir我做什么生成目录完成?我如何指定它compgen,这样我就不需要去/other_dir
在我的 bash-completion 函数中,我尝试cd在调用之前对该目录执行 a操作,compgen但是在按下<Tab>.
我正在为一个实用程序编写一个 bash 选项卡完成文件,该文件有时需要表单上的完整 URL:protocol://host:port. 这包含两个冒号,已被证明对制表符补全有问题。这是因为冒号被视为分词符。我已阅读,我不应该改变COMP_WORDBREAKS直接,所以我想用_get_comp_words_by_ref和__ltrim_colon_completions为这里建议:如何重置COMP_WORDBREAKS,而不影响其他完成脚本?
这适用于单个冒号,但第二个冒号会导致一个小问题,如这个最小示例所示:
这个例子说明了这个问题。它出现在建议中的任意数量的冒号上。
[root@2e3e8853cc0c /]# cat /etc/bash_completion.d/foo
_foo()
{
local cur
COMPREPLY=()
_get_comp_words_by_ref -n : -c cur
COMPREPLY=( $(compgen -W "http://host:1234/aaa http://host:1234/bbb http://host:1234/ccc" -- ${cur}) )
__ltrim_colon_completions "$cur"
return 0
}
complete -F _foo foo
Run Code Online (Sandbox Code Playgroud)
foo成功完成公共部分后点击选项卡。之后点击两次 Tab 会产生以下建议:
[root@2e3e8853cc0c /]# foo http://host:1234/
1234/aaa 1234/bbb 1234/ccc
Run Code Online (Sandbox Code Playgroud)
想要的结果当然是:
[root@2e3e8853cc0c /]# foo http://host:1234/
http://host:1234/aaa http://host:1234/bbb http://host:1234/ccc
Run Code Online (Sandbox Code Playgroud)
之后,按 a、b 或 c 加选项卡按预期工作,它完成了完整的 URL。
关于如何产生正确输出的任何建议?我是否需要手动更改COMPREPLY变量,还是我只是使用了错误的函数?
我发现这shopt -s nullglob显然禁用了文件和目录的制表符完成,并shopt -u nullglob恢复了它。为什么目录的制表符完成显然依赖于nullglob未设置?
我4.2.37(1)-release在 Debian 7 上使用 Bash 。
我使用 bash_completion 来点击选项卡并查看分支名称和目录。这一切都有效。我将其放入我的 bash_profile 中以便连接 bash_completion:
if [ -f `brew --prefix`/etc/bash_completion ]; then
. `brew --prefix`/etc/bash_completion
fi
Run Code Online (Sandbox Code Playgroud)
当我现在启动终端时,我得到:
-bash: @MyNameHERE: command not found
Run Code Online (Sandbox Code Playgroud)
如果我从 bash_profile 中删除第一个片段,这个问题就会消失,但 bash_completion 将不起作用。有什么想法吗?
酿造医生结果:
Please note that these warnings are just used to help the Homebrew maintainers with debugging if you file an issue. If everything you use Homebrew for is working fine: please don't worry and just ignore them. Thanks!
Warning: Unbrewed header files were found in /usr/local/include.
If you didn't put them there …Run Code Online (Sandbox Code Playgroud) 在 bash 中工作最大的烦恼之一是命令完成的长期中断。有数百个编程命令完成,每天都会编写更多的命令,其中一些是由发行版(我目前主要使用 ubuntu linux)或上游编写的,还有一些是由我公司的人员编写的。在任何特定时间,都有数十个损坏是不可避免的。我接受。
我不接受的是,损坏的命令完成使我无法完成文件名完成。文件名补全对我的工作效率至关重要;当我无法访问它时,我的工作流程会非常痛苦和混乱。
有一段时间,我只是禁用了所有命令完成,因为我认为可靠的文件名完成对我来说比所有其他命令完成的组合值更重要。
但是......然后我决定再试一次,所以我没有将它们全部禁用,而是在我的 .bashrc 中将我知道被破坏的那些一一列入黑名单:
#
# Blacklist for known broken command completions
#
# Command completions prevent vim'ing .jpg files!? Not ok.
complete -r vi
complete -r vim
complete -r view
complete -r google-chrome # google-chrome ./myFil<tab>
# The rest of these are gratuitous strong evil magic
# that can't be killed by "complete -r",
# so stronger good magic "complete -F _minimal" is necessary instead.
complete -F _minimal ci # ci -l ./java<tab> …Run Code Online (Sandbox Code Playgroud) 我已经实现了一些 perl 脚本,在某些情况下,我必须将一些命令行参数传递到我的程序中。可用性角度我决定将一些添加bash completion script到我的项目中。 .请让我知道我可以把我的bash completion script
自定义 Perl 脚本位置
C:\scripts\tool\bin\ktools.pl
还要添加bin系统变量的路径。
我已经把我的自动完成脚本放在
C:\scripts\tool\bin\etc\bash_completion.d\ktools\foo
Bash 完成脚本
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo ktools
Run Code Online (Sandbox Code Playgroud)
当用户输入ktools -- + press tab命令行或 git bash时,应自动建议命令。
在新版本的 git 中添加了我可能永远不会使用的新命令。
有没有办法可以禁用这些命令,以便我的选项卡完成速度更快?
例如:以前,git check<tab>会自动完成git checkout
但现在git check<tab>由于有git check-mailmap较新的 git 版本而无法完成选项卡。
这只是其中的一个例子。
或者,如果我可以“强制”git 将选项卡完整地“检查”到checkout.
编辑:我使用 vanilla bash 没有额外的修改
GNU建议使用 --name=value语法为 long 选项传递参数。它使长选项能够接受本身是可选的参数。
假设您有一组完整的可能参数。您如何为这样的选项编写 bash 完成代码?我希望完成在完成一个明确的参数时添加空间,但不是之前。