Isso não é perfeito, mas, novamente, a conclusão do bash é uma coisa bastante complicada ...
A maneira mais simples é por comando, é um pouco mais flexível do que FIGNORE
você pode:
complete -f -X "/myproject/data/*" vi
Isso instrui o preenchimento automático de que a conclusão vi
é para arquivos e para remover os padrões correspondentes ao -X
filtro. A desvantagem é que o padrão não é normalizado e, portanto, as ../data
variações não coincidem.
A próxima melhor coisa pode ser uma PROMPT_COMMAND
função personalizada :
# associative arrays of non-autocomplete directories
declare -A noacdirs=([/myproject/data]=1 )
function _myprompt {
[[ -n "${noacdirs[$PWD]}" ]] && {
echo autocomplete off
bind 'set disable-completion on'
} || {
echo autocomplete on
bind 'set disable-completion off'
}
}
PROMPT_COMMAND=_myprompt
Isso desabilita a conclusão (completamente) quando você está no diretório, mas desabilita-o para todos os caminhos, não apenas para os arquivos desse diretório.
Em geral, seria mais útil desabilitar isso seletivamente para caminhos definidos, mas acredito que a única maneira é usar uma função de conclusão padrão (bash-4.1 e posterior com complete -D
) e muita confusão.
Isso deve funcionar para você, mas pode ter efeitos colaterais indesejados (por exemplo, alterações na conclusão esperada em alguns casos):
declare -A noacdirs=([/myproject/data]=1 )
_xcomplete() {
local cur=${COMP_WORDS[COMP_CWORD]} # the current token
name=$(readlink -f "${cur:-./}") # poor man's path canonify
dirname=$(dirname "$name/.")
[[ -n "${noacdirs[$dirname]}" ]] && {
COMPREPLY=( "" ) # dummy to prevent completion
return
}
# let default kick in
COMPREPLY=()
}
complete -o bashdefault -o default -F _xcomplete vi
Isso funciona para a conclusão de vi
, outros comandos podem ser adicionados conforme necessário. Ele deve parar a conclusão de arquivos nos diretórios nomeados, independentemente do caminho ou diretório de trabalho.
Acredito que a abordagem geral com complete -D
é adicionar dinamicamente funções de conclusão para cada comando conforme ele é encontrado. Também pode ser necessário adicionar complete -E
(conclusão do nome do comando quando o buffer de entrada estiver vazio).
Atualização
Aqui está uma versão híbrida das PROMPT_COMMAND
soluções da função e conclusão, é um pouco mais fácil de entender e hackear, eu acho:
declare -A noacdirs=([/myproject/data]=1 [/project2/bigdata]=1)
_xcomplete() {
local cmd=${COMP_WORDS[0]}
local cur=${COMP_WORDS[COMP_CWORD]} # the current token
[[ -z "$cur" && -n "$nocomplete" ]] && {
printf "\n(restricted completion for $cmd in $nocomplete)\n"
printf "$PS2 $COMP_LINE"
COMPREPLY=( "" ) # dummy to prevent completion
return
}
COMPREPLY=() # let default kick in
}
function _myprompt {
nocomplete=
# uncomment next line for hard-coded list of directories
[[ -n "${noacdirs[$PWD]}" ]] && nocomplete=$PWD
# uncomment next line for per-directory ".noautocomplete"
# [[ -f ./.noautocomplete ]] && nocomplete=$PWD
# uncomment next line for size-based guessing of large directories
# [[ $(stat -c %s .) -gt 512*1024 ]] && nocomplete=$PWD
}
PROMPT_COMMAND=_myprompt
complete -o bashdefault -o default -F _xcomplete vi cp scp diff
Essa função de prompt define a nocomplete
variável quando você digita um dos diretórios configurados. O comportamento de conclusão modificado entra em ação apenas quando essa variável está em branco e somente quando você tenta concluir a partir de uma sequência vazia, permitindo a conclusão de nomes parciais (remova a -z "$cur"
condição para impedir a conclusão completa). Comente as duas printf
linhas para operação silenciosa.
Outras opções incluem um .noautocomplete
arquivo de sinalizador por diretório que você pode touch
em um diretório conforme necessário; e adivinhando o tamanho do diretório usando o GNU stat
. Você pode usar qualquer uma ou todas essas três opções.
(O stat
método é apenas um palpite , o tamanho do diretório relatado aumenta com o conteúdo, é uma "marca d'água alta" que geralmente não diminui quando os arquivos são excluídos sem alguma intervenção administrativa. É mais barato do que determinar o conteúdo real de um site potencialmente grande Comportamento preciso e incremento por arquivo dependem do sistema de arquivos subjacente. Acho que é um indicador confiável nos sistemas Linux ext2 / 3/4, pelo menos.)
O bash adiciona um espaço extra, mesmo quando uma conclusão vazia é retornada (isso ocorre apenas quando a conclusão é finalizada no final de uma linha). Você pode adicionar -o nospace
ao complete
comando para evitar isso.
Um niggle restante é que, se você fizer backup do cursor no início de um token e clicar na guia, a conclusão padrão será ativada novamente. Considere isso um recurso ;-)
(Ou você pode brincar com isso ${COMP_LINE:$COMP_POINT-1:1}
se quiser engenharia em excesso, mas acho que o bash falha ao definir as variáveis de conclusão de maneira confiável quando você faz backup e tenta concluir no meio de um comando.)