Impede o preenchimento automático de caminho de usar o CDPATH no bash?

3

No meu Mac, o bash (versão 3.2.53 (1)) autocomplete os argumentos de linha de comando usando arquivos somente no diretório atual.

Em uma máquina Linux no trabalho, o bash (versão 4.1.2 (1)) autocomplete os argumentos de linha de comando usando arquivos dos diretórios pai e do diretório atual.

Por exemplo, dada a árvore de diretórios:

/home/pjl/
    bin/
    foo/
        book/

Se no meu Mac eu faço:

$ cd foo
$ cd b<TAB>
$ cd book

o bash autocomplete somente para book . No entanto, quando estou na máquina Linux e faço exatamente a mesma coisa:

$ cd foo
$ cd b<TAB>
bin book
$ cd b
O

bash apresenta duas opções: book do diretório atual e bin do diretório pai.

Como o bash pode autocompletar somente usando o diretório atual (como acontece no meu Mac)?

Em ambas máquinas, tenho CDPATH definido como:

.:..:../..:../../..:../../../..:../../../../..:/home/pjl/src:/home/pjl

e se eu desabilitar CDPATH na máquina Linux, então o autocomplete bash usando somente o diretório atual (que é o que eu quero); daí eu sei que o bash no Linux está usando CDPATH .

Mas como posso manter CDPATH set (então cd 'ing funciona como antes), mas não tem o bash usando CDPATH ao fazer autocompletar?

Um comportamento aceitável alternativo seria o autocomplemento favorecer o diretório atual e usar CDPATH se e somente se nada no diretório atual corresponder.

    
por Paul J. Lucas 20.08.2015 / 00:11

2 respostas

2

A maneira correta seria usar o seguinte em seu ~/.bashrc como @Gilles sugerido acima (versão mais curta aqui):

_my_cd () { CDPATH= _cd "$@";}

Uma maneira melhor seria verificar CDPATH se e somente se nenhuma correspondência for encontrada localmente:

_my_cd () { CDPATH= _cd "$@"; if [ -z "$COMPREPLY" ]; then _cd "$@"; fi;}

Desta forma, você obtém a funcionalidade de conclusão programável sem ser um incômodo. Não se esqueça

complete -F _my_cd cd

Por algum motivo, /usr/share/bash-completion/bash_completion tem -o nospace para cd (mesmo que nospace pareça ser o padrão), assim você pode ter:

complete -F _my_cd -o nospace cd
    
por 19.11.2015 / 20:52
2

O culpado é o seu bash_completion , e não sua versão bash.

Com a versão principal do repo de bash_completion , cd preenchimento automático inclui diretórios em CDPATH .

Você pode fazer alterações diretamente no seu local bash_completion , mas é melhor escrever seu próprio cd auto-completar.

Se você quiser um efeito global, crie um arquivo chamado /etc/bash_completion.d/cd com o seguinte conteúdo:

_cd()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    _init_completion || return

    local IFS=$'\n' i

    compopt -o filenames

    local -r mark_dirs=$(_rl_enabled mark-directories && echo y)
    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y)

    _filedir -d

    if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
        i=${COMPREPLY[0]}
        if [[ "$i" == "$cur" && $i != "*/" ]]; then
            COMPREPLY[0]="${i}/"
        fi
    fi

    return 0
}
if shopt -q cdable_vars; then
    complete -v -F _cd -o nospace cd
else
    complete -F _cd -o nospace cd
fi

Esta versão obteve tudo do original, excluindo a parte CDPATH .

Se você deseja usar apenas para sua configuração, edite .bashrc com o seguinte:

_my_cd () {
  declare CDPATH=
  _cd "$@" 
}

complete -F _my_cd cd

Há alguns casos em que a conclusão do bash não funcionou com CDPATH no seu Mac OSX, seu bash_completion é muito antigo ou você ainda não o carregou.

Você pode usar a variável BASH_COMPLETION_COMPAT_DIR para definir o local onde bash_completion carrega sua função de conclusão personalizada, o padrão é /etc/bash_completion.d .

    
por 20.08.2015 / 06:13