Ativar automaticamente modos menores no modo fundamental

8

Por design, o fundamental-modeesqueleto é ó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-modenã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-modebuffer (* 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-modebuffers).

Aqui está um caso de uso que fez isso fazer essa pergunta aqui. Ao fazer M-x esup( esuppacote), ele cria um *esup-log*buffer com fundamental-modeo 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-modede uma maneira verdadeiramente global, fundamental-modeou 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-modee o override-global-modein use-package/bind-key.el. E acontece que o valor init do meu modo é nile o de override-global-modeis 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?

Kaushal Modi
fonte
Um modo de ligação de chave personalizado semelhante é ativado em fundamental-modebuffers para mim, então talvez o problema esteja na definição do seu modo. override-global-mode
npostavs 17/09/2015
@npostavs Obrigado. Vou rever como use-packageimplementa isso.
Kaushal Modi
@npostavs Por favor, verifique a pergunta atualizada .. Acontece que estou enfrentando esse problema simplesmente porque o valor init do meu modo é nil; mas eu o habilito globalmente.
precisa saber é o seguinte
1
Em buffer.c, parece que get-buffer-createcorre o buffer-list-update-hookmesmo no fim de sua função, talvez você pode anexar sua própria função com condições para esse gancho?
lawlist
1
O Emacs usa buffers temporários "internos" para todos os tipos de finalidades (por exemplo, fazer a conversão do sistema de codificação para E / S de / para um arquivo ou processo pode usar um buffer temporário). Esses buffers usam o modo fundamental e acho certo que eles não habilitem o modo menor. Quanto a outros buffers, a regra para mim é a seguinte: se você quiser ver esse buffer (exceto para fins de depuração), provavelmente não deve usar o modo fundamental.
Stefan

Respostas:

4

A única maneira de obter um modo secundário ativado por padrão nos fundamental-modebuffers é definir o valor init desse modo secundário como t.

(define-minor-mode my-minor-mode
 "My minor mode"
 :init-value t)

Observe que simplesmente ativar um modo secundário globalizado (consulte C-h i g (elisp) Defining Minor Modes) com valor init nil não faz a mesma coisa. Nesse caso, um fundamental-modebuffer 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-modebuffers, precisará fazer

(setq-default the-minor-mode t)
Kaushal Modi
fonte
1
Eu acho que para outros modos menores você poderia fazer (setq-default 'the-minor-mode t)para obter o mesmo efeito.
npostavs 17/09/2015
Bom ponto! Vou atualizar a resposta (removi a aspas simples). Obrigado!
precisa saber é o seguinte
Se você adicionou (setq-default modi-mode 1)à função turn-on-modi-modee (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.
Nispio 16/04
@nispio Esse é um bom ponto. Ainda não precisei fazer isso. Mas agora eu sei o que preciso fazer se precisar alternar meu modo secundário em um buffer de modo fundamental.
precisa saber é o seguinte
2

Não use fundamental-mode - pelo menos não de forma interativa. Você raramente quer entrar fundamental-mode. Quase sempre há algo melhor.

O objetivo principal fundamental-modeé não ter o manuseio usual no modo principal (ganchos etc.). Você pode pensar fundamental-modecomo 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 de fundamental-mode. (Eu uso indented-text-mode.)


Anteriormente, havia default-major-modeisso, o que eu acho que era um pouco mais claro, mas eles decidiram preterir isso (ainda funciona, é claro).

default-major-mode is a variable defined in `C source code`.
Its value is indented-text-mode

  This variable is obsolete since 23.2;
  use `major-mode' instead.

Documentation:
Value of `major-mode` for new buffers.
Desenhou
fonte
Eu não estou usando o fundamental-mode. O cerne da questão é que, quando qualquer pacote usa get-buffer-createpara gerar um buffer temporário, esse buffer é criado fundamental-modecomo 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).
21815 Kaushal Modi
Poucos desses pacotes posso listar: esup,keyfreq
Kaushal Modi
Um pacote que apenas chama get-buffer-createnã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.
Desenhou
Eu ficaria curioso para saber por que isso foi rebaixado.
Tirou
@ Drew porque não resolve o problema. O OP afirma explicitamente que outros modos estão criando buffers no modo fundamental, e sua solução proposta é não usar o modo fundamental.
Nispio 15/04
0

A função get-buffer-createé definida em buffer.ce, no final dessa função, chama o buffer-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.

lista de leis
fonte