Não sou muito claro sobre todas as variações de variáveis locais de buffer, mesmo depois de ler todo o documento e várias postagens aqui no SX.
Aqui está um resumo dos meus entendimentos:
(defvar foo ..)
declara uma variável dinâmica para o arquivo. Mas a variável (1) não é conhecida por outros arquivos, a menos que inclua também uma defvar
instrução e (2) a variável é de escopo global, não local de buffer.
(make-variable-buffer-local foo)
após o que foi defvar
dito acima, diz ao compilador e a todos os demais que a variável foo deve ser tratada como local do buffer em qualquer lugar em que for definida, quando for definida. Portanto, esse padrão é um bom estilo para declarar uma variável local de buffer, colocando as duas instruções consecutivas no arquivo.
(defvar xxx ...) ;declare xxx with global scope
(make-variable-buffer-local 'xxx) ;but now make it buffer-local everywhere
Por conveniência, o (defvar-local xxx ...)
formulário pode ser usado como uma linha, no lugar das duas linhas acima:
(defvar-local xxx ...) ;make xxx buffer local everywhere
Uma vez declarada como acima, a variável xxx pode ser usada como qualquer outra variável nas instruções setq.
Se eu apenas quero ter uma única instância de uma variável local buffer que já é uma variável dinâmica global, eu usaria as seguintes declarações. O primeiro declara a variável dinâmica de escopo global e a segunda instrução cria apenas uma instância de uma versão local do buffer dessa variável, no buffer atual:
(defvar xxx ...) ;declare xxx with global scope
(make-local-variable 'xxx) ;make xxx local in this buffer only
Agora, para minhas perguntas explícitas (todas as perguntas acima foram implícitas sobre se meu entendimento está correto).
Ao definir o valor das variáveis, posso usar setq
ou
setq-local
. Quando deve setq-local
ser usado? Por quê?
O que acontece se eu usar setq-local
em vars locais de buffer local ou vars não locais de buffer?
É setq-local
necessário para uma defvar-local
variável declarada?
Em setq-local
uma defvar
variável declarada normal , a transformará em uma variável local de buffer? (Em outras palavras, é de setq-local
alguma forma o equivalente a uma (make-variable-local xxx)
declaração?
(setq-local VAR VALUE)
é apenas uma abreviação de (set (make-local-variable VAR) VALUE)
, que era (e ainda é) um idioma comum.