2013-12-04 2 views
6

Я использовал, чтобы иметь возможность ввести следующее:Bash для пути в аргументе (с знака равенства присутствует)

$> ./foo --arg = <TAB>

Где Foo любая программа Я написал, и он предоставит мне список файлов в текущем каталоге, как обычно делает табло-завершение. Мне не нужно вносить какие-либо изменения в/etc/bash_completion.

В последнее время, однако, это исчезло по неизвестной причине. Кто-нибудь знает, как снова включить эту функцию?

FWIW, это по-прежнему делает правильно, что (обратите внимание на отсутствие знака равенства):

$> ./foo --arg <TAB>

ответ

7

Я удалил все скрипты завершения bash и начал добавлять их один за другим, если какой-либо из них вызывает проблему.

В моем случае это был сценарий завершения npm, который был причиной этой проблемы.

Не уверен (пока), в чем проблема, но это сценарий завершения, который вызвал одинаковые значения знак не работает, как и раньше:

###-begin-npm-completion-### 
    # 
    # npm command completion script 
    # 
    # Installation: npm completion >> ~/.bashrc (or ~/.zshrc) 
    # Or, maybe: npm completion > /usr/local/etc/bash_completion.d/npm 
    # 

    COMP_WORDBREAKS=${COMP_WORDBREAKS/=/} 
    COMP_WORDBREAKS=${COMP_WORDBREAKS/@/} 
    export COMP_WORDBREAKS 

    if type complete &>/dev/null; then 
     _npm_completion() { 
     local si="$IFS" 
     IFS=$'\n' COMPREPLY=($(COMP_CWORD="$COMP_CWORD" \ 
           COMP_LINE="$COMP_LINE" \ 
           COMP_POINT="$COMP_POINT" \ 
           npm completion -- "${COMP_WORDS[@]}" \ 
           2>/dev/null)) || return $? 
     IFS="$si" 
     } 
     complete -F _npm_completion npm 
    elif type compdef &>/dev/null; then 
     _npm_completion() { 
     si=$IFS 
     compadd -- $(COMP_CWORD=$((CURRENT-1)) \ 
        COMP_LINE=$BUFFER \ 
        COMP_POINT=0 \ 
        npm completion -- "${words[@]}" \ 
        2>/dev/null) 
     IFS=$si 
     } 
     compdef _npm_completion npm 
    elif type compctl &>/dev/null; then 
     _npm_completion() { 
     local cword line point words si 
     read -Ac words 
     read -cn cword 
     let cword-=1 
     read -l line 
     read -ln point 
     si="$IFS" 
     IFS=$'\n' reply=($(COMP_CWORD="$cword" \ 
          COMP_LINE="$line" \ 
          COMP_POINT="$point" \ 
          npm completion -- "${words[@]}" \ 
          2>/dev/null)) || return $? 
     IFS="$si" 
     } 
     compctl -K _npm_completion npm 
    fi 
    ###-end-npm-completion-### 
+1

См. Http://stackoverflow.com/questions/10528695/how-to-reset-comp-wordbreaks-without-effecting-other-completion-script – user123444555621

+0

Да, они изменяют переменную COMP_WORDBREAKS. Спасибо что подметил это.Это объясняет, почему этот скрипт нарушает поведение завершения в целом. Я вхожу в проблему при npm. –

+1

Отличная работа! Это было именно преступником. Действительно отличная работа, отслеживающая это. – Javaxtreme

1

Не уверен, что окружающая среда вы находитесь, но на одном из последних CentOS

complete -D -o default 

позволяет завершение имени файла после лексемы без пробелов, как по умолчанию. Для того, чтобы переключить его в другом направлении:

complete -D -o nospace 

Однако, это выглядит как более ранние версии встроенной команды не имеют опцию -D.

+0

В моей версии Linux (Ubuntu 12.04) есть опция -D, однако полная -D -o по умолчанию не устраняет проблему. – Javaxtreme

+0

FWIW Я могу включить и выключить поведение, как описано в бродяге Ubuntu 12.04. Поведение все еще происходит в санированной башке? (например, 'env -i bash --norc') –

+0

@Javaxtreme Вы смогли решить эту проблему. BTW, я могу подтвердить, что он работает, как и ожидалось, в санированной башке. –

1

Я решил те же проблемы с Ubuntu 12.04 с помощью https://github.com/ai/rake-completion. Вы должны

  1. загрузить файл wget -O ~/scripts/rake https://raw.githubusercontent.com/ai/rake-completion/master/rake
  2. добавить в свой .bashrc: . ~/scripts/rake

или Вы можете использовать один из других способов на этой странице.

Смежные вопросы