Algumas pessoas podem pensar que é mais simples de usar setq
. Algumas pessoas podem pensar que é mais lispy. Na realidade, é ingênuo no caso geral.
É verdade que, para algumas opções de usuário, isso não importa. Mas para outros, isso importa, e setq
é a abordagem errada para essas opções. Então, como regra geral, setq
é a abordagem errada.
Se você usar custom-set-variables
ou em customize-set-variable
vez de setq
, ou se você usar a interface do usuário Personalizar (por exemplo M-x customize-option
), terá certeza de que qualquer código de inicialização ou atualização pretendido necessário para o valor da opção será automaticamente acionado e executado conforme necessário. Se você usar setq
, isso não será feito.
Agora, também é o caso de a maioria das opções de usuário, especialmente muitas escritas para bibliotecas de terceiros, não fazem uso das defcustom
palavras - chave :set
e :initialize
, e o uso setq
não importa para elas. Mas muitas opções de baunilha do Emacs usam essas palavras-chave e, para aquelas que o fazem, setq
não é a coisa certa. Portanto, se você deseja usar o código Lisp e não a interface do usuário Personalizar para definir suas opções, é melhor usar custom-set-variables
ou em customize-set-variable
vez de setq
. Nunca dói e às vezes ajuda (muito).
Mas o que eu recomendo é fazer as duas coisas:
Use a interface do usuário Personalizar em vez de escrever o código Lisp para isso.
Defina a variávelcustom-file
, para que o Customize grave personalizações nesse arquivo e não no seu arquivo init ( ~/.emacs
). IOW, mantenha seu código de inicialização escrito à mão separado do código automático escrito por Customize.
:type
comdefvar
- Eu não acho que isso deve ser limitado a opções de usuário. Infelizmente, muitos programadores são preguiçosos no uso:type
e o resultado não é muito útil (isso não é culpa do Customize).setq
vez decustomize-set-variable
exatamente uma vez. (Aquela vez foi paraauto-revert-interval
, e eu mais tarde percebeu que o usosetq
antes de carregamentoautorevert
era realmente muito mais rápido que usarcustomize-set-variable
.)Prefiro
setq
maiscustomize
por vários motivos:(setq foo (calculate-foo))
). Eu uso esse poder o tempo todo em minha configuração para manter as coisas secas. Para mim, o objetivo principal do uso do Emacs é a programação, e acustomize
interface não faz nada além de atrapalhar.setq
presta-se melhor ao controle de versão e organização de código. Dividi minha inicialização entre dezenas de arquivos; se tudo estivesse em umcustom.el
arquivo enorme , seria muito mais difícil encontrar e editar rapidamente as configurações.customize
interface parece uma relíquia horrível das piores UIs dos anos 90. Eu preferiria editar texto com o poder do Emacs qualquer dia.@Drew faz alguns pontos positivos sobre algumas sutilezas com
:set
e:initialize
. Uso o Emacs há anos e raramente encontro problemas assim. Quando eu faço, é fácil de trocarsetq
paracustom-set-variable
em casos específicos.fonte
customize-set-variable(s)
, e é melhor por causa dos gatilhos que eles executam automaticamente. 2. Você pode usar vários comandos de personalização para ver todas as suas variáveis definidas e / ou salvas em diferentes hierarquias, para obter a organização de diferentes grupos automaticamente, sem precisar usar arquivos separados no controle de versão. 3. Melhorou muito. Se você não gostar da interface do usuário, ainda poderá usar a personalização programaticamente e através dos comandos interativos que evitam o modo de personalização para obter todos os outros benefícios do uso da personalização.Uma vantagem de usar em
setq
vez decustomize
é legibilidade. Um é livre para anotar cada personalização ao seu gosto, o que IMO melhora a legibilidade. Também é possível agrupar personalizações relacionadas, o que melhora a modularidade. Finalmente, eu diria que navegar através de um buffer elisp é mais "fácil" do que navegar na interface do usuário e nos widgets.Por outro lado, a personalização permite reverter facilmente para valores padrão que podem ser inestimáveis quando as coisas dão errado.
EDIT: A resposta de Drew fornece uma excelente razão para usar,
customize-set-variables
que pode fornecer todas as vantagens que apontei. No entanto, a UI de personalização não se presta a configurações portáteis entre plataformas diferentes tão facilmente quanto o elisp bruto. Se você precisar que uma variável tenha a configuração dependente do sistema operacional, será necessário fazer o fallback para elisp em muitos casos. Meu argumento sobre a navegação mais fácil nos buffers elisp ainda permanece.fonte
setq
, basta comentar asetq
linha e reiniciar o emacs.custom-set-variables
é "elisp bruto" e eu o uso todos os dias em várias máquinas. Apenas copie-o para fora do local onde o personaliza o grava (se você não o escreveu).Outra alternativa é usar o pacote de uso de John Wiegley . Isso fornece uma maneira programática de configurar pacotes que funcionam bem com o processo de inicialização de pacotes do emacs 24+. Aqui está um exemplo de uso do leia-me:
O ponto é que use package é uma macro e não avalia seus argumentos imediatamente. Os parâmetros
:init
e:config
são avaliados em diferentes estágios do processo de inicialização, possibilitando a configuração de cada pacote em um único local, mas cada parte sendo executada no estágio apropriado de inicialização.Sem algo parecido,
use-package
alguns pacotes exigem que parte de seu código de inicialização seja anterior(package-initialize)
e outra parte seja posterior. Se você tem muitos pacotes assim, suas primeiras inicializações teriam que ser intercaladas.Outro benefício
use-package
é que ele pode instalar automaticamente os pacotes ausentes usando o package.el se você levar o .emacs para uma nova máquina ou se você compartilhar sua configuração com outro usuário e toda a inicialização puder ser adiada até que um pacote realmente precise ser carregado.Também existem argumentos de palavras-chave adicionais que permitem mais controle sobre o processo de inicialização.
Tudo o que foi dito, uma grande vantagem da personalização é que ela mostra o que há para ser configurado em qualquer pacote. Essa é uma das razões pelas quais ainda o uso em muitos dos meus pacotes.
fonte
use-package
ele próprio oferece vantagens da configuração modularizada, além de importar e configurar pacotes em um único local. Mas sim, o exemplo está usandosetq
. Poderia muito bem ter usadocustomize-set-variable
aqui? Não tenho certeza. Poderíamos / devemos trocá-lo (oucustomize-set-value
) porsetq
?:custom
palavra - chave.