Quando eu navego na ajuda do Emacs em busca de funções C-h f
, geralmente quero espiar a implementação do Elisp / C. Quero entrar view-mode
automaticamente quando acessar o código-fonte dessa maneira para evitar modificações desnecessárias. Existe um gancho ou função que eu possa aconselhar para fazer isso?
10
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)
Respostas:
Atualização (após uma noite de sono): Esta resposta tem uma falha importante: permite
view-mode
navegar em qualquer função, não apenas nas fontes do Emacs. Isso pode ser corrigido, mas é melhor usar a resposta de @phils .Ao fazer
C-h f describe-function RET
e depois de ler o código fonte dodescribe-function
que eu descobri que ele cria um "botão" de um tipo especial de links para definições de funções:help-function-def
.A execução
zrgrep
com esta string ("help-function-def
") me indicouhelp-mode.el.gz
.Depois de toda essa escavação, podemos substituir esse tipo de botão pelo nosso (observe o comentário no código):
Até onde eu sei, não há nenhuma função para adicionar conselhos: o Emacs usa um
lambda
aqui. Por outro lado (como indicado por @rationalrevolt ), pode-se substituir ahelp-function
propriedade dohelp-function-def
tipo de botão:fonte
button-type-get
ebutton-type-put
substituir o lambda pelo meu que encaminha para o lambda existente.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: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 bufferview-mode
não será ativado.Edit 2: Constantine forneceu uma solução para esse problema nos comentários abaixo:
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 deview-mode
, pois o primeiro aceita umEXIT-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 novamenteview-mode
.Edit 3: Seguindo esse caminho, também podemos ver que o especificado
EXIT-ACTION
é passado para aview-mode-exit
função e sua doutrina nos fornece uma solução alternativa:Portanto, podemos usar o seguinte:
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 usarview-mode
. Minha configuração fica assim:Obviamente, você pode fazer o mesmo pelo diretório elpa e por qualquer outro diretório que contenha código fonte de terceiros.
fonte
.dir-locals.el
me uso ...)find-file-hook
e umaread-only-dirs
lista, mas eu gosto dessa abordagem.((nil . ((eval . (view-mode 1)))))
qual é a maneira mais simples deView-quit
matar os buffers acessados via ajuda? Caso contrário, depois de sair da visualização de origem pressionandoq
, o buffer permanece para trás e, quando acessa fontes do mesmo arquivo posteriormente a partir da ajuda novamente, o modo de exibição não é iniciado.view-mode
.((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
(note em(view-mode-enter ...)
vez de(view-mode 1)
). Dessa forma, pressionarq
mata o buffer eview-mode
é ativado na próxima vez que visito o mesmo arquivo.Eu acho que tudo que você precisa é adicionar um gancho :
fonte
view-mode
ao navegar para qualquer função usandoC-h f
, não apenas as fontes do Emacs.find-THING
comandos interativos utilizam esse gancho e os botões de ajuda o ignoram.Isso não aborda seu caso específico, mas o caso mais geral de alternar para
view-mode
sempre que você visita um arquivo de origem a partir de um buffer de ajuda. Estou oferecendo isso como uma alternativa à resposta de @ Constantine, já que não era legível como comentário.Parece que recebi isso originalmente do EmacsWiki .
fonte
Aqui está uma solução que funciona para documentação interna e um exemplo que mostra como estendê-la ao ELPA. Ele funciona combinando o caminho para o arquivo atual com algumas expressões regulares e aplicando
read-only-mode
se alguma delas corresponder.Observe que o buffer é somente leitura se você o visitar
dired
também, não apenas pela ajuda.Adicionei um gancho que é executado depois de entrar para
emacs-lisp-mode
verificar se o caminho para o arquivo corresponde/\.el\.gz$/
e se aplica o modo somente leitura.Aqui está um exemplo que verifica o ELPA também, usando a heurística de que qualquer caminho que contenha
.emacs.d/elpa
é realmente código ELPA.fonte