P: como posso obter novos buffers para honrar o mapeamento auto-mode-alist
?
Ao encontrar um arquivo , o Emacs compara a extensão do arquivo com a auto-mode-alist
para determinar qual modo principal usar para o buffer do arquivo. Existe uma maneira de usar as informações auto-mode-alist
para determinar o modo de um buffer que ainda não possui um arquivo associado a ele?
Ou seja: se eu abrir um novo buffer cujo nome tem algo parecido com uma extensão de arquivo, posso fazê-lo abrir automaticamente no modo esperado? Por exemplo, se eu abrir um novo buffer a-new-buffer.el
que ainda não esteja associado a um arquivo, quero que ele seja aberto no emacs-lisp-mode
modo padrão.
buffers
major-mode
Dan
fonte
fonte
auto-mode-alist
, faça com que o buffer " visite " o arquivo (e isso cuida de tudo).org
buffer temporário para testar novas funções nas quais estou escrevendo para usoorg-mode
; b) umR
buffer temporário para fazer algumas manipulações estatísticas rápidas e descartáveis; c) um buffer de texto temporário para compor um email. Em cada caso, não quero criar um arquivo para visitar, apenas quero um buffer descartável que, no entanto, seja aberto no modo apropriado.C-x C-f
se não " criar um arquivo de visita ". Esse é um mal-entendido fundamental. Eles simplesmente fazem exatamente o que você está procurando. É somente se e quando você tenta salvar o buffer que um arquivo é criado. Se você não tentar salvar o buffer, nenhum arquivo será criado. O que você quer, pelo que entendi até agora, é "visitar um arquivo" (o que realmente significa abrir um buffer no modo adequado).Respostas:
Comandos de visita a arquivos, como
C-x C-f
não criar um arquivo para visitar. Eles fazem o que você está procurando.É somente se e quando você tenta salvar o buffer que um arquivo é criado .
Se você não tentar salvar o buffer, nenhum arquivo será criado. O que você quer, pelo que entendi até agora, é " visitar um arquivo " (o que realmente significa abrir um buffer no modo adequado).
fonte
n
para não salvar ou (frequentemente) eu apenas salvo o buffer. E depois eu jogue o arquivo criado ... ou não).*scratch*
: você é solicitado a salvar quando esse dedo bate automaticamenteC-x C-s
.Se estiver usando a solução de Juri Linkov há anos.
Eu crio buffers temporários com algo parecido
C-x
b
test.org
C-j
. Omajor-mode
é determinado pela extensão do arquivo viaauto-mode-alist
.Para testar o efeito, você pode tentar
(prog1 (and (switch-to-buffer "my-new.org") major-mode) (kill-buffer "my-new.org"))
=>
org-mode
. Em uma limpeza,emacs -q
o teste retornariafundamental-mode
.fonte
advice
opção que eu estava usando. Não tenho certeza se estou seguindo para que(prog1...)
serve a parte, mas a(setq-default major-mode ...)
parte é bastante agradável.prog1
teste apenas mostra que você obtém o esperadomajor-mode
ao alternar para um buffer. Avalie asetq-default
peça e execute o teste. Voltaráorg-mode
Sem osetq-default
retornofundamental-mode
.Descobri uma maneira baseada em conselhos usando idéias que vieram dos comentários de @ Drew e da resposta de @ glucas, que gravarei aqui caso sejam úteis para qualquer pessoa.
A versão curta: use
after
conselhos para consultar se o buffer tem um nome de arquivo associado, defina um temporariamente, se não tiver, e deixe o restante doset-auto-mode
maquinário cuidar dos detalhes. Após um pouco de teste (não extenso), parece estar funcionando bem.Para
ido-switch-buffer
e baunilhaswitch-to-buffer
, os dois conselhos seriam:Acho essa opção útil, além do
find-file
ponto em que @Drew levantou, porque meus dedos podem ficar à frente do meu cérebro: a memória muscular geralmente me leva ao território de troca para buffer antes que me ocorra completamente quefind-file
faria o que eu precisava. Agora, as duas opções estão disponíveis.UPDATE: bug pequeno, mas potencialmente irritante no código acima: ele executará novamente o gancho de modo no buffer sempre que você mudar para ele. A seguir, é fornecido um nome de arquivo real fora do
/tmp
diretório e evita esse problema:fonte
A
set-auto-mode
função define o modo com base no arquivo associado a um buffer. Aqui está uma função que define temporariamente abuffer-file-name
partir do nome do buffer para definir o modo:Você pode executar isso quando um buffer for renomeado usando o conselho:
Não tenho certeza sobre o melhor lugar para conectar isso e afetar novos buffers. Aqui estou usando o
buffer-list-update-hook
, mas que é chamado em mais casos do que precisamos.fonte
buffer-list-update-hook
porque ochange-major-mode-hook
não estava sendo chamado com o buffer atual esperado. Para o registro, provavelmente faz mais sentido aconselhar sua função switch-buffer como o @Dan faz em sua resposta.Você pode usar os buffers * scratch * com a finalidade de criar buffers temporários com o mesmo modo principal que o arquivo em que você pode estar trabalhando.
Aqui está uma resposta do emacs SE que pode resolver seu problema:
Como alternar rapidamente entre um arquivo e um buffer * scratch * com o mesmo modo principal?
A pergunta e resposta referenciadas foram postadas por mim. A resposta na função faz o seguinte:
*scratch-X-mode*
se ainda não existir, e alterna para esse buffer recém-criado.*scratch-X-mode*
já existir, ele simplesmente alterna para esse buffer.fonte
Há algumas boas respostas aqui, mas eu queria acrescentar mais uma coisa. O Emacs tem muitos recursos e muitas vezes existem várias maneiras de fazer algo. Você pode adicionar tags na parte superior de qualquer arquivo que diga ao emacs qual o seu tipo, independentemente da extensão. Por exemplo, adicionando isso:
No topo de um arquivo, o emacs saberá que é um arquivo Python, mesmo sem a
.py
extensão. Observe que o#
início da linha é um comentário no estilo Python. Para diferentes tipos de arquivo, você pode usar comentários diferentes. Por exemplo, para especificar um arquivo Lisp que você usa;
para iniciar uma linha de comentário e definir o modo no emacs assim:Consulte Especificando variáveis de arquivo e escolhendo modos de arquivo .
fonte
switch-buffer
) e a configuração automática do modo para algo diferente defundamental-mode
.