¿Cómo poner en la lista negra un paquete?

8

Estoy usando company-modepara fines de finalización. Pero de alguna manera, algún paquete siempre llega auto-complete, lo que colisiona company-mode, ya que ambos ofrecen una ventana emergente con candidatos de finalización. Quiero poner en la lista negra auto-complete, ya que no lo necesito. ¿Cómo puedo hacer eso? Sé que hay una variable package-pinned-package, pero no puedo ver cómo poner en la lista negra un paquete, ¿tal vez usando un archivo no válido?

Arne
fuente
1
Tenga en cuenta que no hay colisión per se. Para autocomplete-modeque sea un problema, primero debe habilitarse, lo mismo ocurre company-mode.
wasamasa
Por alguna razón, se habilita sin que yo haga ninguna personalización.
Arne
Si es un requisito de otro paquete, entonces debe instalarse, pero debería ser posible que no autocompleteesté activo en ningún búfer donde company-modeesté activo. ¿Quizás necesita deshabilitar manualmente autocompleteen *mode-hookcualquiera de los modos principales afectados?
Mark Aufflick
1
Te sugiero que descubras qué hace. O eres tú (y algo en tu archivo de inicio, una posibilidad que se ha vuelto mucho más probable desde la aceptación de los kits de inicio) u otro paquete (que es un error). Tanto la bisección como la búsqueda ~/.emacs.dde algo a lo largo de las líneas de (auto-complete-mode)funcionarían.
wasamasa
1
Los paquetes generalmente no deberían habilitar el modo de autocompletar para usted (salvo algunas circunstancias muy específicas). Si está 100% seguro de que no lo está habilitando, le sugiero que presente un problema en ese paquete para informarlo.
Malabarba

Respuestas:

7

No sé cómo incluir en la lista negra la instalación de un paquete. Pero es fácil evitar que se cargue . Si coloca (provide 'auto-complete)su archivo init, cualquier paquete que intente cargar auto-completese le informará que ya está cargado.

(Más precisamente, esto se encarga de las bibliotecas que se cargan auto-completede la manera normal, con require. Si hay algún código que se usa loaddirectamente (lo que sería inusual), debe poner esto en un archivo separado llamadoauto-complete.el ).

Por supuesto, si el paquete lo requiere auto-complete, probablemente sea porque lo usará. Pero tal vez un paquete solo declara fuentes de autocompletado y, de lo contrario, tiene una funcionalidad útil. Para que pueda hacer la parte que no desea un no-op. Dependiendo de lo que haga el paquete, es posible que necesite otras definiciones similares.

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

Lo que @Gilles escribió es la respuesta general que también habría dado.

Pero tenga en cuenta que el uso provideno no evitar que el código se cargue el paquete. Impide que el código cargue el paquete solo por require. Si el código usa load, etc. load-library, load-fileentonces este truco no tiene efecto.

Si realmente necesita evitar que el código cargue una biblioteca determinada, un mejor enfoque es proporcionar una biblioteca proxy que se cargue en su lugar. Por ejemplo, en un directorio que viene antes en su load-path, agregue un falso auto-complete.elque no hace nada excepto (provide 'auto-complete).

De esa manera, cada vez que el código intente cargar la biblioteca usando loado load-librarysu biblioteca proxy se cargará en lugar de la que está evitando.

Sin embargo, si el código usa load-filey proporciona la dirección absoluta del archivo de la biblioteca que está tratando de evitar, ese archivo se cargará. No veo una buena solución para ese caso (excepto para eliminar o reemplazar ese archivo).

Dibujó
fuente