我已经成功地为各种 Git 别名配置了 Bash 完成。例如:
$ git config alias.subject
!git --no-pager show --quiet --pretty='%s'
$ function _git_subject() { _git_show; }
$ git subject my<TAB>
$ git subject my-branch
Run Code Online (Sandbox Code Playgroud)
但是,我有一个 Git 别名,我不知道如何为其设置 Bash 完成。问题是我希望别名能够像顶级 Git 命令本身一样完成。别名是这样的:
$ git config alias.alias
alias = !"f() { if [[ \"$#\" != 1 ]]; then >&2 echo \"Usage: git alias COMMAND\"; return 1; fi; git config alias.\"$1\"; }; f"
# Example
$ git alias s
status
Run Code Online (Sandbox Code Playgroud)
我试过使用_git, __git_main, 和__git_wrap__git_main …
是否有支持文件名完成的bash-completion脚本?我主要使用mercurial,我可以输入:
hg diff test/test_<tab>
Run Code Online (Sandbox Code Playgroud)
它将显示/完成所有修改过的测试文件.它适用于大多数子命令,即hg add <tab><tab>只列出未跟踪的文件.这真的很方便.
来自git contrib seams的bash脚本不支持此功能.有没有其他选择,或者你如何在命令行上使用git?
编辑2015
git-completion.bash支持完整的文件名完成,因为~1.8.2
我想为一个(相当复杂的)Bash完成脚本编写一个单元测试,最好用Python编写 - 只需要以编程方式获取Bash完成的值.测试应如下所示:
def test_completion():
# trigger_completion should return what a user should get on triggering
# Bash completion like this: 'pbt createkvm<TAB>'
assert trigger_completion('pbt createkvm') == "module1 module2 module3"
Run Code Online (Sandbox Code Playgroud)
如何以编程方式模拟Bash完成以检查我的工具的测试套件内的完成值?
我安装了git和git-flow完成,将这些行添加到root的.bashrc和Ubuntu 12.04机器上的normal_user:
source /etc/git-completion.bash
source /etc/git-flow-completion.bash
GIT_PS1_SHOWUPSTREAM="verbose"
GIT_PS1_SHOWDIRTYSTATE=true
PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
Run Code Online (Sandbox Code Playgroud)
当我以root身份登录或者normal_user时,git完成工作.但是,如果我使用"sudo -s"或"sudo su"git完成不起作用,每次按回车时我都会不断收到"__git_ps1:command not found".我试图删除"source"命令并使用"apt-get install bash-completion"(已经安装了bash-completion).因此,即使没有2源,我也会得到完全相同的行为.
有人知道问题是什么以及如何使其发挥作用?
我的bash中存在区分大小写的目录列表的问题.例如
$ touch nohupa nohuPb
$ ls nohup*
nohupa nohuPb
Run Code Online (Sandbox Code Playgroud)
但是我确实期待它只列出nohupa而不是nohuPb.因为nohuPb有大写字母P.我不知道我的.bashrc集合中哪个变量*工作忽略大小写.
任何的想法 ?
我用
cur="${COMP_WORDS[COMP_CWORD]}"
opts=`sqlite3 test.db "${QUERY[COMP_CWORD]}"`
SAVEIFS="$IFS"
IFS=$'\n'
COMPREPLY=( $(compgen -S"'" -P"'" -W "${opts}" $cur) )
IFS="$SAVEIFS"
Run Code Online (Sandbox Code Playgroud)
从数据库中获取可能的变体并完成它们TAB.只要这些变异可能包含空格,它是方便易使用,以autoquote它们'作为前缀和后缀,所以当我按下A,B,TAB和只有一个与变种AB前缀,然后我得到这样的事情'ABC DEF'.
但问题是,如果以后有很多变种,然后A,B,TAB我得到的'AB,然后我按TAB再次,它是NOP,只有在第三TAB按我得到尽可能完整.
有没有办法将TAB冲压减少到一个或至少两个?
我正在创建一个函数来为我使用的命令提供可编程完成功能(在http://www.debian-administration.org/articles/317的帮助下).shell脚本用法如下:
script.sh command [command options]
Run Code Online (Sandbox Code Playgroud)
其中command可以是'foo'或'bar','foo'的命令选项是'a_foo = value'和'b_foo = value','bar'的命令选项是'a_bar = value'和'b_bar = value' .
这是我正在使用的配置:
_script() {
local cur command all_commands
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
command="${COMP_WORDS[1]}"
all_commands="foo bar"
case "${command}" in
foo)
COMPREPLY=( $(compgen -W "--a_foo --b_foo" -- ${cur}) ); return 0;;
bar)
COMPREPLY=( $(compgen -W "--a_bar --b_bar" -- ${cur}) ); return 0;;
*) ;;
esac
COMPREPLY=( $(compgen -W "${all_commands}" -- ${cur}) )
return 0
}
complete -F _script script.sh
Run Code Online (Sandbox Code Playgroud)
这主要是按照我的意愿行事:
% script.sh f[TAB]
Run Code Online (Sandbox Code Playgroud)
完成:
% script.sh foo
Run Code Online (Sandbox Code Playgroud)
(根据需要设有尾随空格) …
bash中的自动完成(使用Tab)适用于文件夹,但不适用于文件.
这是.bashrc文件的底部部分的外观,安装和更新了bash-completion部分:
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
在 shell ( GNU bash, version 4.2.47(1)-release (x86_64-suse-linux-gnu)) 中,当我点击 tab 进行自动补全时,“$”在变量名补全后被转义,但如果没有补全,那么它只会响铃。例如
$ ls $JDK_H<tab>
Run Code Online (Sandbox Code Playgroud)
结果是
$ ls \$JDK_HOME (with a trailing space)
Run Code Online (Sandbox Code Playgroud)
在旧的 GNU bash 版本 3.2.51(1)-release (x86_64-suse-linux-gnu) 上,它在完成后没有转义“$”,这正是我想要的。
有没有一种方法可以让旧的行为没有强烈的副作用?我的 BASHOPTS 和 SHELLOPTS 是:
# (indented for readability)
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote
:force_fignore:histappend:interactive_comments:login_shell
:progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history
:interactive-comments:monitor
Run Code Online (Sandbox Code Playgroud)
谢谢。我正在使用 SLES SP11。
- 更新。其他完成似乎照常工作,例如cd或echo不转义$. 我也暂时注释掉了/etc/share/bash-completion/bash_completion我的/etc/bash.bashrcwhich,阻止了$逃逸。所以这看起来像是某种完整的配置问题。
我正在尝试为我的 CLI 工具提供一个用 Python 编写的 bash 完成脚本。根据Python Packaging Authority,data_files在 setup.py 中正是我需要的:
尽管配置 package_data 足以满足大多数需求,但在某些情况下,您可能需要将数据文件放在包之外。data_files 指令允许您这样做。如果您需要安装其他程序使用的文件,而这些程序可能不知道 Python 包,这将非常有用。
所以我添加了这样的完成文件:
data_files=[
('/usr/share/bash-completion/completions', ['completion/dotenv']),
],
Run Code Online (Sandbox Code Playgroud)
并尝试使用以下方法对其进行测试:
pip install -e .
在我的虚拟环境中。但是,未安装完成脚本。我忘记了什么或pip坏了吗?完整的项目可以在这里找到