Fazendo quadros / janelas do emacs inviolados para alterações automáticas do emacs

2

Eu queria saber se existe uma maneira de marcar certos quadros em uma sessão do emacs de janela dividida como invioláveis para mudar. Eu normalmente tenho 4 quadros para arquivos de fontes e 2-3 quadros para outras visões como compilação / grep-find / etc.
Eu gostaria de marcar os últimos quadros de alguma forma para que eles nunca sejam divididos ou tenham seus conteúdos alterados pelo emacs. Dessa forma, se eu clicar em um resultado da pesquisa, não tenho a divisão da janela de compilação e um arquivo de origem inserido. Eu quero que todos os arquivos de origem entrem em minhas janelas de origem e fiquem fora de minhas janelas de visualização divergente. Existe uma maneira de fazer isso?

    
por asm 22.01.2010 / 15:33

2 respostas

1

Sim, há uma maneira de fazer isso, mas não acho que seja fácil. Uma rápida olhada nas funções e variáveis relacionadas ao frame confirmou minha crença de que não há uma solução fácil aqui. O problema é que o Emacs não saberia o que fazer, uma vez que esses quadros são os únicos quadros restantes, e algo precisava ser feito para / com eles.

Acho que seria possível codificar um pacote que avisasse todas as funções de manipulação de quadros de baixo nível, de modo que alguns quadros ficassem intocados por qualquer operação, mas isso exigiria identificar e interpretar cada uma dessas funções de baixo nível. . Eu acho que uma abordagem melhor (a menos que você seja um assistente elisp) seria identificar as funções que você usa que o incomodam dessa maneira, e ver se há uma função comum ou grupo de funções que eles usam para determinar qual quadro exibir sua saída, e então partiu para mudar esse comportamento.

Eu provavelmente usaria um parâmetro de quadro ( frame-parameter e modify-frame-parameters ) para armazenar se um determinado quadro era ou não inviolável. Isso pode ser definido manualmente por você, ou talvez no final da função que preenche o quadro com qualquer dado (através do uso de uma função de wrapper ou (mais provavelmente) defadvice). Em seguida, encontre uma função que altere uma delas e observe sua origem. Que função (s) chamou para determinar qual quadro usar? Modifique e / ou avise essas funções (ou talvez algo chamado por essas funções) para não considerar quadros com este determinado conjunto de parâmetros. Como um caso especial, se não houver outros frames disponíveis, crie um novo frame e devolva-o.

Você também pode ter várias classes de quadros (por exemplo, quadro de origem, quadro de compilação / erros) e permitir que alguns deles sejam reutilizados por certas funções, mas não por outras. Quão complexo você consegue, realmente, depende de você e da sua imaginação.

De qualquer forma, parece à primeira vista ser muito factível, mas não trivial.

Agora, tendo dito tudo isso, há um pacote que pode ajudá-lo a se aproximar do que você quer: One- on-One Emacs . Não sei se ele protege os quadros da maneira que você quer, no entanto. E a partir da descrição, parece que ele redefine várias funções principais, em vez de avisá-las, o que poderia torná-las extremamente específicas à versão (isso é apenas uma sensação de que eu li a descrição dele; não olhei o código para veja se é isso que realmente está acontecendo).

Boa sorte!

    
por 23.01.2010 / 14:31
1

Uma opção poderia ser pesquisar como o gdb-many-windows funciona - esse modo é muito agressivo quanto à preservação de um layout de janela específico.

Além disso, é possível salvar uma configuração de quadro / janela em um registrador e recuperar essa configuração do registrador posteriormente.

Terceira opção: aqui está uma solução no elisp (você poderia apenas avaliá-lo no buffer de rascunho para testá-lo e adicioná-lo ao seu .emacs se quiser) %pr_e% Configure todos os tamanhos de quadro e de janela e posicione como desejar e digite Control-c s, e seu layout será armazenado. Em seguida, digite Control-c f para recuperá-lo se o layout for alterado. Isso inclui todos os tamanhos de janela, número de divisões de janela e qual buffer está em cada janela e onde cada janela está em sua área de trabalho.

Eu fiz estas ligações apenas para responder a esta pergunta agora, mas eu gosto delas o suficiente, eu realmente vou mantê-las no meu .emacs agora, obrigado pela ótima pergunta.

    
por 30.01.2010 / 02:50

Tags