2015-04-29 21 views
29

說bash的配置有以下別名:擊完成:別名完成榮譽庫特定的Git的別名

alias up="git --git-dir /path/to/backup/.git"

,並特別庫 - 且只有庫 - 有以下git的別名:

[alias] 
backup = commit --allow-empty-message 

如何能up自動完成backup


這種自動完成backup但不up

cd /a/different/dir 
git --git-dir=/path/to/backup/.git ba 

這種自動完成up標準Git命令而不是backup

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main up


編輯:伊坦是正確的,完成功能需要看到擴大的別名,所以我創建了以下內容:

CompletableAlias() { 
    if (($#<2)); then 
     return 1 
    fi 
    source_c="$1" 
    target_c="$2" 
    target_a=("${@:2}") 
    target_s="${target_a[*]}" 
    alias "${source_c}=${target_s}" 
    completion_modifier="__${source_c}_completion" 
    completion_original="$(complete -p "$target_c" 2>/dev/null | 
          sed 's/.*-F\W\+\(\w\+\).*/\1/' 
         )" 
    if [[ -n "$completion_original" ]]; then 
     read -r -d '' completion_function <<-EOF 
     function $completion_modifier() { 
      COMP_LINE="\${COMP_LINE/#${source_c}/${target_s}}" 
      ((COMP_POINT+=${#target_s}-${#source_c})) 
      ((COMP_CWORD+=${#target_a[@]}-1)) 
      COMP_WORDS=(${target_a[@]} \${COMP_WORDS[@]:1}) 
      $completion_original 
     } 
EOF 
     eval "$completion_function" 
     completion_command="$(complete -p "$target_c" | 
           sed "s/${completion_original}/${completion_modifier}/; 
            s/\w\+\$/${source_c}/" 
          )" 
     $completion_command 
    fi 
} 


source "/usr/share/bash-completion/completions/git" 

CompletableAlias "up" "git" "--git-dir" "/path/to/backup/.git" 

但也有莫名其妙的問題:

  • up bac<Tab>不起作用
  • up <Tab>使用默認的完成和未列出的git子
  • 還有更多...

編輯2:更新腳本來修復使用的建議上述問題在Re: Bash completion of aliased commands。顯然這是一個相當普遍的任務。但是現在我遇到了這樣的錯誤消息:

$ cd /a/different/dir 
$ up backup<Tab> fatal: Not a git repository (or any of the parent directories): .git 
+0

完成函數看到「up」還是擴展的別名? –

+0

如果完成函數在命令中讀入'up',它不會像預期的那樣運行,則使用輔助函數展開爲'backup',以便確保將確切的命令發送到完成函數。這就是許多完成者功能的方式,他們期望(或假設)命令是他們編程的。因此,如果你去附加一個其他命令的完成者,它不會工作(因此中間人功能)。要開始你可能會顯示一些調用-xv的輸出,以確保你的函數正在做你期望的(或者它的差異) – osirisgothra

回答

1

你真的不應該在這樣複雜的情況下使用別名,使用bash functions。別名更像C中的預處理器(使用意義上的),當函數更像...代碼函數時。而且我發現它們也更「自動完成」。

你也可以看看這個問題在其他shell如何解決,如fish