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
(ou Options > 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:
(defgroup checkbox nil
"Quick manipulation of textual checkboxes."
:group 'convenience)
(defcustom checkbox-states '("[ ]" "[x]")
"Checkbox states to cycle between.
First item will be the state for new checkboxes."
:group 'checkbox
:type '(repeat string))
O defgroup
cria um novo grupo na interface Personalização no convenience
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 usado defvar
, mas como quero que isso seja facilmente personalizável, optei por usá-lo defcustom
. 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 para Convenience > 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ões INS
(inserir) e DEL
(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.
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.