Quando especificar um nome de pacote nos pacotes de uso: garantir tag?

7

use-packagepermite instalar pacotes automaticamente usando a :ensuretag Você pode fazer isso da seguinte maneira

(use-package <package>
  :ensure t)

Mas para alguns pacotes que não funcionam, como auctex. Nesses casos, você pode especificar o pacote da ensureseguinte maneira

(use-package tex
  :ensure auctex)

De acordo com este blog / tutorial / site , o motivo é

porque, uma vez instalado, auctexsubstitui o texpacote.

O que isso significa e como posso saber quando fazer isso para outros pacotes?

LinFelix
fonte

Respostas:

11

Mas para alguns pacotes que não funcionam. Tais como auctex.

A razão pela qual (use-package tex :ensure t)não funciona auctexé porque auctexnomeia um pacote GNU ELPA (consulte (emacs) Packages), enquanto texnomeia um recurso (consulte (elisp) Named Features) fornecido pelo auctexpacote.

Em outras palavras, texnomeia um único arquivo tex.elque é distribuído como parte do auctexpacote. Considere os seguintes exemplos:

Digitando M-xpp-macroexpand-last-sexpRETcom ponto após

(use-package tex
  :ensure t)

dá uma forma que se resume a

(progn
  (use-package-ensure-elpa 'tex '(t) 'nil)
  (require 'tex nil t))

considerando que fazer o mesmo com

(use-package tex
  :ensure auctex)

expande efetivamente para

(progn
  (use-package-ensure-elpa 'tex '(auctex) 'nil)
  (require 'tex nil t))

Isso ilustra a diferença de objetivo entre o NAMEargumento to use-packagee sua :ensurepalavra-chave. O primeiro declara que nomeado feature o restante da estrofe pertence / padrões, exatamente com o mesmo significado que em with-eval-after-load; veja (elisp) Hooks for Loading.

O último apenas pede que o (s) pacote (s) fornecido (s) seja instalado através do segundo argumento da função use-package-ensure-elpa, onde tapenas significa o pacote nomeado pelo atual NAME. use-package-ensure-elpapor sua vez, chamadas package-install; para detalhes sobre isso, consulte (emacs) Package Installation.

De acordo com este blog / tutorial / site, o motivo é

porque, uma vez instalado, o auctex substitui o pacote tex.

O que isso significa

Infelizmente, isso é errado e enganador. "Substituir" geralmente se refere à substituição ou correção de funcionalidades existentes, por exemplo, através de conselhos . Quando um pacote fornece o mesmo recurso nomeado que outro, ocultando o último das funções de carregamento do Emacs, isso é chamado de "sombreamento".

A distribuição do AUCTeX substitui e estende várias funcionalidades internas relacionadas ao TeX, mas não obscurece nenhuma biblioteca interna. Você pode confirmar isso inspecionando o resultado de M-xlist-load-path-shadowsRET.

Uma autoridade melhor é a use-packageprópria documentação: https://github.com/jwiegley/use-package/#package-installation .

como posso saber quando fazer isso para outros pacotes?

Depende de como você deseja agrupar suas use-packageestrofes e o nome do pacote correspondente. Por exemplo, se você deseja colocar todas ou a maioria das configurações relacionadas à sua organização em uma única (use-package org ...), mas deseja usar a org-plus-contribdistribuição da organização em vez da interna, escreva

(use-package org
  :ensure org-plus-contrib
  ...)

Você não escreveria

(use-package org-plus-contrib
  :ensure t
  ...)

porque não há nenhum arquivo chamado org-plus-contrib.el, mesmo se houver um pacote com o nome org-plus-contrib. Você da mesma forma não escreveria

(use-package auctex
  :ensure t
  ...)

pela mesma razão - não é recurso não nomeado auctex(não é um arquivo auctex.el, mas não chama (provide 'auctex)).


Observe que nenhuma dessas discrepâncias / semânticas é específica use-package; esses são todos os recursos (poderosos e úteis) do Emacs que use-packagesó podem ir tão longe na abstração.

Manjericão
fonte