Estou trabalhando com um grande número de arquivos, que guardo em um diretório. Toda vez que vou para esse diretório e pressiono acidentalmente Tabduas vezes, leva muito tempo (pode demorar mais de um minuto) para mostrar os arquivos que correspondem ao padrão, e fico bastante irritado com esse comportamento.
Por exemplo, minha estrutura de diretórios é:
my-project/
├── docs/
├── data/ <---- contains around 200k files.
└── analyser/
Como ainda amo a conclusão, existe alguma maneira de desativar esse recurso apenas no data/
diretório? Como definir o tempo limite por 5 segundos ou um script que desativa automaticamente a conclusão quando dentro de um diretório específico?
bash
autocomplete
neizod
fonte
fonte
Respostas:
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: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 :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):
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 adicionarcomplete -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: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 duasprintf
linhas para operação silenciosa.Outras opções incluem um
.noautocomplete
arquivo de sinalizador por diretório que você podetouch
em um diretório conforme necessário; e adivinhando o tamanho do diretório usando o GNUstat
. 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
aocomplete
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.)fonte
Se o seu
data
diretório contiver arquivos com um sufixo específico, por exemplo.out
, você poderá definir suabash
variávelFIGNORE
como".out"
e estes serão ignorados. Embora seja possível usar nomes de diretório também, isso não ajuda nos nomes de diretório de trabalho atuais.Exemplo:
Crie milhares de arquivos de teste de 100 KB no host físico com HDDs de ataque 1:
Defina a
bash
variável:$ FIGNORE=".json"
Crie o arquivo de teste:
$ touch test.out
Teste em 5.000 arquivos:
Nenhum atraso entre o vi e o single
tab
anteriortest.out
aparece.Teste em 50.000 arquivos:
A guia Única cria uma fração de segundo de atraso antes que
test.out
apareça.Teste em 200.000 arquivos:
Um atraso de 1 segundo entre o vi e o single
tab
anterior étest.out
exibido.Referências:
Excert de homem bash
fonte
$ vi <tab><tab>
, leva muito tempo de qualquer maneira. : \.json
arquivos e um único arquivo de texto chamadofoo.txt
. ligandoFIGNORE='.json'
, digito$ vi <tab>
e ainda preciso esperar meio minuto para que eu me complete$ vi foo.txt
. --- cenário real Eu não vou editar ou misturar tipos de arquivos dentro desse diretório, mas se eu ligarFIGNORE
e (acidentalmente) pressionar tab, meu teclado ficará paralisado por um longo tempo sem a menor sugestão de algo comoDisplay all 188275 possibilities? (y or n)
, o que me diz que posso ter meu teclado de volta.Acho que é isso que você deseja (emprestou algum código de @ mr.spuratic)
Observe que isso não impede que você pressione TAB usando o caminho completo (por exemplo,
vim /directory/contains/lots/files<tab><tab>
fonte
pushd
/popd
. Como isso usa apenas uma matriz regular, não uma matriz associativa, também funcionará no bash 3.x.