当前位置:  开发笔记 > 编程语言 > 正文

如何使用别名来完成bash完成?

如何解决《如何使用别名来完成bash完成?》经验,为你挑选了7个好方法。

例证:

我是一个使用bash v3.2.17的mac,我正在使用通过macports安装的git和bash_completion变体.

当我输入git checkout m.例如,我把它完成了master.

但是,我有一个别名git checkout,gco.当我输入时gco m,我没有自动完成分支名称.

理想情况下,我希望自动完成只是神奇地为我的所有别名工作.可能吗?如果做不到这一点,我想为每个别名手动定制它.那么,我该怎么做呢?



1> 小智..:

如上面的评论所述,

complete -o default -o nospace -F _git_checkout gco

将不再有效.但是,__git_completegit-completion.bash中有一个函数可用于设置别名的完成,如下所示:

__git_complete gco _git_checkout


如果你对git使用全局别名"g",你也可以添加``__git_complete g __git_main```来获得所有git命令的代码completition.
我应该把它放在哪里?
终于想出了如何正确地做到这一点!步骤1)将`git-completion.bash`从`<你的git安装文件夹>/etc/bash-completion.d /`复制到`〜/ .git-completion.bash`步骤2)添加`source~/.git -completion.bash`到你的`.bash_profile`步骤3)在.bash_profile中的上一行之后的任何地方添加`__git_complete gco _git_checkout`.步骤4)重新启动shell并享受别名自动完成!:)
这是我在许多错误的答案中看到的唯一正确的答案.
^^对于那些新的git/shell/bash.上面的注释引用了全局shell别名,而不是本机git别名.
@benregn我把它直接放在我的`〜/ .bash_profile`中的`source~/.git_completion.sh`下面
有一个很好的[Gist](https://gist.github.com/JuggoPop/10706934)提供了设置它所需的所有信息
-1这个答案似乎假设您已经阅读并理解了一些较旧的错误答案(但是哪一个?),因此知道该文件所属的文件和文件所在的位置.尽量只假设问题中确定的事物的知识.

2> Hesky Fisher..:

我也遇到了这个问题,并提出了这段代码.这将自动为您完成所有别名.在声明所有(或任何)别名后运行它.

# wrap_alias takes three arguments:
# $1: The name of the alias
# $2: The command used in the alias
# $3: The arguments in the alias all in one string
# Generate a wrapper completion function (completer) for an alias
# based on the command and the given arguments, if there is a
# completer for the command, and set the wrapper as the completer for
# the alias.
function wrap_alias() {
  [[ "$#" == 3 ]] || return 1

  local alias_name="$1"
  local aliased_command="$2"
  local alias_arguments="$3"
  local num_alias_arguments=$(echo "$alias_arguments" | wc -w)

  # The completion currently being used for the aliased command.
  local completion=$(complete -p $aliased_command 2> /dev/null)

  # Only a completer based on a function can be wrapped so look for -F
  # in the current completion. This check will also catch commands
  # with no completer for which $completion will be empty.
  echo $completion | grep -q -- -F || return 0

  local namespace=alias_completion::

  # Extract the name of the completion function from a string that
  # looks like: something -F function_name something
  # First strip the beginning of the string up to the function name by
  # removing "* -F " from the front.
  local completion_function=${completion##* -F }
  # Then strip " *" from the end, leaving only the function name.
  completion_function=${completion_function%% *}

  # Try to prevent an infinite loop by not wrapping a function
  # generated by this function. This can happen when the user runs
  # this twice for an alias like ls='ls --color=auto' or alias l='ls'
  # and alias ls='l foo'
  [[ "${completion_function#$namespace}" != $completion_function ]] && return 0

  local wrapper_name="${namespace}${alias_name}"

  eval "
function ${wrapper_name}() {
  let COMP_CWORD+=$num_alias_arguments
  args=( \"${alias_arguments}\" )
  COMP_WORDS=( $aliased_command \${args[@]} \${COMP_WORDS[@]:1} )
  $completion_function
  }
"

  # To create the new completion we use the old one with two
  # replacements:
  # 1) Replace the function with the wrapper.
  local new_completion=${completion/-F * /-F $wrapper_name }
  # 2) Replace the command being completed with the alias.
  new_completion="${new_completion% *} $alias_name"

  eval "$new_completion"
}

# For each defined alias, extract the necessary elements and use them
# to call wrap_alias.
eval "$(alias -p | sed -e 's/alias \([^=][^=]*\)='\''\([^ ][^ ]*\) *\(.*\)'\''/wrap_alias \1 \2 '\''\3'\'' /')"

unset wrap_alias


由于某些原因,"让COMP_CWORD + = $ num_alias_arguments"行无法在Mac OS X上运行.用`((COMP_CWORD + = $ num_alias_arguments)替换它``修复它虽然
请参阅http://superuser.com/a/437508/102281上此脚本的更新版本(例如,我添加了对某些git完成所需的COMP_LINE和COMP_POINT的支持).
哇,太棒了 - 谢谢!`wrap_alias`在别名定义中用双引号扼杀,我猜它对多命令别名(`alias'foo = bar; baz'`)没有多大意义,所以我要多加一个`| grep -v'["; |&]'`在'alias -p`之后.另外,它对于数百个别名定义来说有点慢,但我很高兴确认使用`echo`而不是`eval`并将输出管道输出到一个缓存文件(然后可以一次性"eval")工作正常并且速度超快.
另一个提示:`wrap_alias`需要设置完成,所以我不得不在`wrap_alias`代码前移动`source/etc/bash_completion`.
在将'let COMP_CWORD + = $ num_alias_arguments`行更改为'let \"COMP_CWORD + = $ num_alias_arguments \"`之后,这对我在OS X 10.7.2上起作用了.

3> Chris Lloyd..:

git-completion.bash有一行:

complete -o default -o nospace -F _git git

查看该行(和_git函数),您可以将此行添加到.bash_profile:

complete -o default -o nospace -F _git_checkout gco


某些_git_*bash函数不再使用此方法

4> wonderfulthu..:

我有别名g ='git',并结合我的git别名我输入类似的东西

$ g co 

对我的特定用例更简单的修复是向git-completion添加一行.

在这一行的正下方:

__git_complete git _git

我添加了这一行来处理我的单个'g'别名:

__git_complete g _git


(我正在使用Cygwin.)我在`/ etc/bash_completion.d/git`中找不到文件`git-completion`或那行,但我添加了`complete -o default -o nospace -F _git g `在`.bash_aliases`中的别名后,它有效!

5> Cyker..:

理想情况下,我希望自动完成只是神奇地为我的所有别名工作.可能吗?

是的,可以使用complete-alias项目(在Linux上).对Mac的支持是实验性的,但用户已报告成功.


非常感谢,这比弄清楚世界上每个实用程序如何实现bash完成要好得多.
确实,节省了我一些时间来配置别名的补全。
在Linux上像超级按钮一样工作(在Mac上未经测试)。感谢您编写!

6> hcs42..:

此论坛页面显示了一个解决方案

将这些行放入您的.bashrc.bash_profile:

# Author.: Ole J
# Date...: 23.03.2008
# License: Whatever

# Wraps a completion function
# make-completion-wrapper  
#                          
# eg.
#   alias agi='apt-get install'
#   make-completion-wrapper _apt_get _apt_get_install apt-get install
# defines a function called _apt_get_install (that's $2) that will complete
# the 'agi' alias. (complete -F _apt_get_install agi)
#
function make-completion-wrapper () {
    local function_name="$2"
    local arg_count=$(($#-3))
    local comp_function_name="$1"
    shift 2
    local function="
function $function_name {
    ((COMP_CWORD+=$arg_count))
    COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
    "$comp_function_name"
    return 0
}"
    eval "$function"
}

# and now the commands that are specific to this SO question

alias gco='git checkout'

# we create a _git_checkout_mine function that will do the completion for "gco"
# using the completion function "_git"
make-completion-wrapper _git _git_checkout_mine git checkout

# we tell bash to actually use _git_checkout_mine to complete "gco"
complete -o bashdefault -o default -o nospace -F _git_checkout_mine gco

这个解决方案类似于balshetzer的脚本,但只有这个实际上适合我.(balshetzer的剧本在我的一些别名上有问题.)



7> kub1x..:

另一种选择是使用~/.bash_completion文件。要创建gco别名,git checkout只需将其放在其中:

_xfunc git __git_complete gco _git_checkout

然后,~/.bashrc您只需要输入别名本身:

alias gco='git checkout'

两行。而已。

说明:

这些~/bash_completion获取来自主bash_completion脚本末尾。在gentoo中,我在中找到了主要脚本/usr/share/bash-completion/bash_completion

_xfunc git位负责git-completion为您寻找文件,因此您无需放入任何其他内容~/.bashrc

接受的答案要求您.git-completion.sh~/.bashrc我认为很and脚的文件中复制并获取它。


PS:我仍在尝试弄清楚如何不将整个git-completion脚本提供给我的bash环境。如果找到方法,请发表评论或编辑。

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有