Por design, o fundamental-mode
esqueleto é óbvio, pois outros modos principais devem derivar desse.
Na página de informações (elisp) Major Modes
, temos:
Este é o comando principal do modo Fundamental. Diferente de outros comandos de modo, ele não executa nenhum gancho de modo (* note Convenções principais de modo: :), pois você não deve personalizar esse modo.
Por essa razão,
- Nós não temos a
fundamental-mode-hook
. - Também
my-minor-mode
não é habilitado SOMENTE neste modo principal, embora os buffers tenham(global-my-minor-mode 1)
na minha configuração.
Abaixo funcionaria, mas somente se eu digitar manualmente M-x fundamental-mode
:
(add-hook 'after-change-major-mode-hook #'my-minor-mode)
Não ajuda no caso abaixo em que um fundamental-mode
buffer (* abcd *) é criado por padrão:
(with-current-buffer (get-buffer-create "*abcd*")
(insert "Hello world"))
Por que desejo ativar um modo secundário fundamental-mode
?
Eu gosto de manter minhas ligações de teclas personalizadas no meu mapa de modo secundário. Eu tenho esse modo secundário ativado globalmente (mas não é ativado apenas em fundamental-mode
buffers).
Aqui está um caso de uso que fez isso fazer essa pergunta aqui. Ao fazer M-x esup
( esup
pacote), ele cria um *esup-log*
buffer com fundamental-mode
o modo principal. Mas cada vez que eu preciso habilitar meu modo secundário manualmente nele para usar minhas ligações convenientes.
Eu gostaria de ativar my-minor-mode
de uma maneira verdadeiramente global, fundamental-mode
ou não.
Atualização 1:
Aqui está o meu menor definição modo: modi-mode
.
Atualização 2:
Com base no comentário do @npostavs , revi as diferenças entre o meu modo menor modi-mode
e o override-global-mode
in use-package/bind-key.el
. E acontece que o valor init do meu modo é nil
e o de override-global-mode
is t
.
Se eu alterar o valor init do meu modo para t
, ele também será ativado nos buffers do modo fundamental! Mas o ato de (global-modi-mode 1)
não termina com o mesmo resultado. Isso é estranho? Provavelmente um bug?
fonte
fundamental-mode
buffers para mim, então talvez o problema esteja na definição do seu modo.override-global-mode
use-package
implementa isso.nil
; mas eu o habilito globalmente.buffer.c
, parece queget-buffer-create
corre obuffer-list-update-hook
mesmo no fim de sua função, talvez você pode anexar sua própria função com condições para esse gancho?Respostas:
A única maneira de obter um modo secundário ativado por padrão nos
fundamental-mode
buffers é definir o valor init desse modo secundário comot
.Observe que simplesmente ativar um modo secundário globalizado (consulte
C-h i g (elisp) Defining Minor Modes
) com valor initnil
não faz a mesma coisa. Nesse caso, umfundamental-mode
buffer será criado com esse modo secundário desativado.O acima, obviamente, funcionará apenas se você controlar a fonte do modo secundário. Para todos os outros modos secundários que vêm com pacotes diferentes, se você deseja ativar um modo secundário por padrão nos
fundamental-mode
buffers, precisará fazerfonte
(setq-default 'the-minor-mode t)
para obter o mesmo efeito.(setq-default modi-mode 1)
à funçãoturn-on-modi-mode
e(setq-default modi-mode nil) to the function
turn-off-modi-mode`, então você seria um passo para realmente ativar e desativar o modo globalmente.Não use
fundamental-mode
- pelo menos não de forma interativa. Você raramente quer entrarfundamental-mode
. Quase sempre há algo melhor.O objetivo principal
fundamental-mode
é não ter o manuseio usual no modo principal (ganchos etc.). Você pode pensarfundamental-mode
como uma classe abstrata.Se algum pacote o colocar em um buffer que esteja
fundamental-mode
, faça o que for necessário para evitar isso - use outro modo para isso.Considere personalizar
major-mode
para que o padrão seja algo diferente defundamental-mode
. (Eu usoindented-text-mode
.)Anteriormente, havia
default-major-mode
isso, o que eu acho que era um pouco mais claro, mas eles decidiram preterir isso (ainda funciona, é claro).fonte
fundamental-mode
. O cerne da questão é que, quando qualquer pacote usaget-buffer-create
para gerar um buffer temporário, esse buffer é criadofundamental-mode
como o modo principal. Nesses buffers, meu modo secundário não será ativado por padrão (porque seu valor de inicialização é nulo; mesmo que eu tenha sido ativado globalmente).esup
,keyfreq
get-buffer-create
não faz nada para estabelecer o modo principal (ou qualquer modo secundário). Deveria (para o pacote em questão)? Se for o caso, considere entrar em contato com o mantenedor do pacote. Caso contrário, considere ativar o modo principal ou secundário preferido. IOW, se é sobre o que você deseja, e não sobre o que o pacote deve configurar em geral, você deve configurá-lo da maneira que desejar.A função
get-buffer-create
é definida embuffer.c
e, no final dessa função, chama obuffer-list-update-hook
. Esse gancho pode ser usado para executar uma função personalizada, mas é necessário adicionar determinadas condições para impedir que a função personalizada seja acionada em momentos inoportunos sempre que esse gancho for chamado por outras funções.fonte