Você pode usar variáveis de diretório local para tornar os arquivos de origem do Emacs somente leitura por padrão. (Veja também C-hig (emacs) Directory Variables
RET).
Crie um arquivo chamado .dir-locals.el
na raiz da árvore de diretórios que você deseja proteger, com o seguinte conteúdo:
((nil . ((eval . (view-mode 1)))))
Edit: Michał Politowski aponta nos comentários que ativar view-mode
dessa maneira é problemático, porque quando você dispensa o buffer com qele também desativa o modo, o que significa que na próxima vez que você visitar esse buffer view-mode
não será ativado.
Edit 2: Constantine forneceu uma solução para esse problema nos comentários abaixo:
((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
Isso utilmente adiciona um teste para garantir que o buffer já esteja visitando um arquivo, mas a principal mudança é o uso de view-mode-enter
vez de view-mode
, pois o primeiro aceita um EXIT-ACTION
argumento que determina o que fazer quando qé digitado. Nesse caso, a ação de saída é eliminar o buffer, garantindo que na próxima vez que o arquivo seja visitado, ele acabe novamente view-mode
.
Edit 3: Seguindo esse caminho, também podemos ver que o especificado EXIT-ACTION
é passado para a view-mode-exit
função e sua doutrina nos fornece uma solução alternativa:
view-no-disable-on-exit is a variable defined in `view.el'.
Its value is nil
Documentation:
If non-nil, View mode "exit" commands don't actually disable View mode.
Instead, these commands just switch buffers or windows.
This is set in certain buffers by specialized features such as help commands
that use View mode automatically.
Portanto, podemos usar o seguinte:
((nil . ((eval . (when buffer-file-name
(setq-local view-no-disable-on-exit t)
(view-mode-enter))))))
Eu uso a abordagem alternativa que você pode especificar inteiramente no seu arquivo init (em vez de criar um .dir-locals.el
arquivo), e simplesmente os faço como somente leitura, em vez de usar view-mode
. Minha configuração fica assim:
;; Emacs
(dir-locals-set-class-variables
'emacs
'((nil . ((buffer-read-only . t)
(show-trailing-whitespace . nil)
(tab-width . 8)
(eval . (whitespace-mode -1))))))
(dir-locals-set-directory-class "/usr/local/src/emacs" 'emacs)
(dir-locals-set-directory-class "/usr/local/share/emacs" 'emacs)
(dir-locals-set-directory-class "/usr/share/emacs" 'emacs)
Obviamente, você pode fazer o mesmo pelo diretório elpa e por qualquer outro diretório que contenha código fonte de terceiros.
emacs-lisp-mode
e o façoC-x C-q
se quiser editar o código-fonte.(defun set-buffer-read-only () (setq buffer-read-only t)) (add-hook 'emacs-lisp-mode-hook 'set-buffer-read-only)