Como a maioria dos usuários do Emacs, eu personalizei um modo alterando as variáveis. O que nunca me ocorreu é toda a mentalidade de programação por trás de personalizar isso e aquilo. Percebi isso quando comecei a olhar para o código fonte do eshell. Eu não sou um programador elisp, mas especificamente em-ls.el
parece usar defcustom
, defgroup
etc. Isso parece ser uma sombra mundial de variáveis globalmente definido que os usa código elisp. Então, uma pergunta seria: o uso de defcustom
outra maneira de fazer variáveis globais (personalizáveis)?
Alguém pode me indicar como usar corretamente (primeiro entender) toda a ideia por trás defcustom
, quando usar, por que, quando não? Talvez um exemplo para iniciantes para um iniciante no elisp.
customize
instalações e quando personalizar manualmente? Ou você está interessado em escrever um modo? A última é a situação em que você pode realmente usar coisas comodefcustom
essas.Respostas:
O sistema de personalização é um recurso interno do Emacs projetado para resolver com precisão o problema que você descreve - a programação pode não ser a maneira ideal para o usuário médio configurar seu editor.
O ponto de entrada principal para a funcionalidade de personalização é
M-x customize RET
(ouOptions > Customize Emacs > Top-level Customization Group
no menu). A partir daí, você verá um sistema de menus interativo para ajustar as configurações. Essa interface impõe que todas as configurações sejam do tipo correto (número, sequência, cor, etc.), evitando a principal fonte de erro encontrada quando os usuários configuram o Emacs programaticamente. Se o usuário optar por persistir as alterações feitas na interface do usuário, as configurações serão armazenadas em uma seção especial no arquivo de inicialização do usuário (leia-se.emacs
:).defcustom
é um invólucro em torno da funcionalidade Emacs Lisp de nível inferior,defvar
que declara a variável e a torna visível na interface de personalização. Ele também permite que o desenvolvedor forneça metadados extras necessários para exibir um controle interativo apropriado - ou seja, que tipo de valor é armazenado nessa variável? Uma string arbitrária? Um número? Uma escolha entre um conjunto fixo de opções? etc.defgroup
é uma construção de agrupamento para essas opções personalizáveis, para que possam ser organizadas em uma boa hierarquia.Essa funcionalidade deve ser usada sempre que um dado for considerado uma opção configurável para o usuário, em vez de um detalhe interno da biblioteca.
Aqui está um exemplo simples extraído de uma pequena biblioteca minha:
O
defgroup
cria um novo grupo na interface Personalização noconvenience
item de nível superior . Eu então precisava de uma variável para armazenar os possíveis estados da caixa de seleção. Eu poderia ter usadodefvar
, mas como quero que isso seja facilmente personalizável, optei por usá-lodefcustom
. A:group
parte indica que pertence ao grupo definido anteriormente e:type
indica que é uma sequência de cadeias. Há também um valor padrão e uma descrição. Existem também recursos adicionais (não mostrados aqui) para transformar valores inseridos pelo usuário.Se agora eu corro
M-x customize RET
e navego paraConvenience > Checkbox
, vejo o seguinte:Não é a interface mais bonita do mundo, mas observe que ele possui ferramentas interativas para personalizar o valor de "Estados da caixa de seleção" (
checkbox-states
internamente). Ele mostra os valores atuais da sequência, juntamente com os botõesINS
(inserir) eDEL
(excluir), e permite editar os valores da sequência nas caixas de edição. Quando terminarmos, podemos decidir se devemos aplicar nossas alterações, revertê-las ou aplicá-las e salvá-las para sessões futuras.fonte
defcustom
) são que ele cuida automaticamente de : (1) verificação de tipo , para ajudar a impedir que você atribua um valor incorreto a uma variável (desde que o escritor tenha sedefcustom
esforçado para fornecer um tipo razoável check), (2) inicialização (:initialize
) e cções de atualização (acionadas) (:set
).Sim. Especialmente se você quiser que os usuários do seu código possam alterar variáveis facilmente através da interface de personalização do Mx .
O defcustom oferece dois benefícios importantes para seus usuários: documentação e segurança de tipo. É bom ter documentação lá. A segurança de tipo permite especificar quais tipos de valores válidos suas variáveis podem receber.
É claro que defvar é bom se tudo o que você está fazendo é personalizar por si mesmo e não antecipar um uso mais amplo. No entanto, alguns diriam que manter o defcustom completamente é um bom hábito a inculcar.
A página de manual do defcustom tem mais esclarecimentos. O tópico Personalizações no manual possui detalhes completos.
Pessoalmente, acho o defcustom menos complicado durante o desenvolvimento, pois não preciso lidar com problemas de recarga com o defvar e o setq.
fonte