Como colocar um pacote na lista negra?

8

Estou usando company-modepara fins de conclusão. Mas de alguma forma, alguns pacotes auto-completetambém são atraídos, o que colide company-mode, pois ambos oferecem um pop-up com candidatos à conclusão. Quero entrar na lista negra auto-complete, pois não preciso disso. Como eu posso fazer isso? Sei que há uma variável package-pinned-package, mas não consigo ver como colocar um pacote na lista negra - talvez usando um arquivo inválido?

Arne
fonte
11
Observe que não há colisão em si. Para autocomplete-modeser um problema, ele deve ser ativado primeiro, o mesmo vale para company-mode.
wasamasa
Por algum motivo, ele é ativado sem que eu faça nenhuma personalização.
Arne10
Se for um requisito de outro pacote, ele deverá ser instalado, mas deve ser possível não autocompleteestar ativo em nenhum buffer em que company-modeesteja ativo. Talvez você precise desativar manualmente autocompleteos *mode-hookmodos principais afetados?
Mark Aufflick
11
Eu sugiro que você descubra o que faz. Ou é você (e algo no seu arquivo init, uma possibilidade que se tornou muito mais provável desde a aceitação dos kits iniciais) ou outro pacote (que é um bug). A bissecção e a busca ~/.emacs.dde algo ao longo das linhas (auto-complete-mode)funcionariam.
wasamasa
11
Os pacotes geralmente não devem habilitar o modo de preenchimento automático para você (salve algumas circunstâncias muito específicas). Se você tem 100% de certeza de que não está ativando, sugiro que você arquive um problema nesse pacote que relate isso.
Malabarba

Respostas:

7

Não sei como colocar na lista negra a instalação de um pacote. Mas é fácil impedi-lo de carregado . Se você colocar (provide 'auto-complete)seu arquivo init, qualquer pacote que tentar carregar auto-completeserá informado de que já está carregado.

(Mais precisamente, isso cuida de bibliotecas que carregam auto-complete da maneira normal, com require. Se houver algum código que use loaddiretamente (o que seria incomum), você precisará colocá-lo em um arquivo separado chamadoauto-complete.el .)

Obviamente, se o pacote exigir auto-complete, é provavelmente porque ele será usado. Mas talvez um pacote declare apenas fontes de preenchimento automático e tenha funcionalidade útil caso contrário. Então você pode fazer a parte que você não quer no-op. Dependendo do que o pacote faz, você pode precisar de outras definições semelhantes.

(provide 'auto-complete)
(defmacro ac-define-source (&rest ignored)
  "A no-op since I blacklist `auto-complete'.")
Gilles 'SO- parar de ser mau'
fonte
7

O que o @Gilles escreveu é a resposta geral que eu também daria.

Mas note que o uso providese não impedir que o código de carregar o pacote. Impede que o código carregue o pacote apenas por require. Se o código usa load, load-library, load-fileetc, então este truque não tem efeito.

Se você realmente precisar impedir que o código carregue uma determinada biblioteca, uma abordagem melhor é fornecer uma biblioteca proxy que seja carregada em seu lugar. Por exemplo, em um diretório anterior ao seu load-path, adicione um falso auto-complete.elque não faz nada, exceto (provide 'auto-complete).

Dessa forma, sempre que o código tentar carregar a biblioteca usando loadou load-librarysua biblioteca proxy será carregada em vez da que você está evitando.

No entanto, se o código usar load-filee fornecer o endereço absoluto do arquivo da biblioteca que você está tentando evitar, esse arquivo será carregado. Não vejo uma boa solução para esse caso (exceto para remover ou substituir esse arquivo).

Desenhou
fonte