Se você deseja copiar algumas informações para outro buffer e, a partir de então, permitir que os buffers evoluam independentemente, você pode fazer exatamente isso .
Mas se você deseja que o outro buffer reflita o conteúdo original em tempo real, o Emacs fornece isso com buffers indiretos . Um buffer indireto é outro buffer que tem o mesmo conteúdo que o original (modificações em um buffer são refletidas no outro buffer), mas configurações diferentes: um modo principal diferente, modos secundários diferentes, variáveis locais diferentes, um ponto diferente, marcas diferentes , um estreitamento diferente etc.
Assim, é possível visualizar uma parte de um buffer em um modo principal diferente, mantendo o controle das modificações no buffer original e refletindo as modificações de volta ao buffer original. Primeiro faça um buffer indireto com M-x clone-indirect buffer
; há também o clone-indirect-buffer-other-window
que está vinculado a C-x 4 c
( C-x 4
prefixo da janela e c
para clone ). No buffer clonado, restrinja a região que você deseja: selecione a parte interessante e execute C-x n n
( narrow-to-region
). Mude o modo principal conforme desejado.
Você pode automatizar isso com um comando como este para uso interativo:
(defun edit-region-in-foo-mode (beg end)
(interactive "@r")
(let ((new-buffer (clone-indirect-buffer nil t)))
(narrow-to-region beg end)
(foo-mode)))
Para uso em programação:
(defmacro with-indirect-buffer-in-foo-mode (beg end &rest body)
`(with-current-buffer (clone-indirect-buffer nil nil)
(narrow-to-region beg end)
(foo-mode)
(unwind-protect
,body
(kill-buffer (current-buffer)))))
Gilles 'SO- parar de ser mau'
fonte
M-x copy-to-buffer
, eu estava sugerindo , então eu vermelho a resposta @legoscia, que provavelmente é o que você deseja. se o processo de extração e o modo principal são as mesmas, uma função será melhorGostei do que @Gilles escreveu. Modifiquei o que o @Gilles escreveu para perguntar ao usuário que modo ele gostaria de usar. Você pode editar o que escrevi para fornecer os modos que preferir ou até alterar a chamada para concluir a leitura, para permitir que você forneça um modo não fornecido na lista padrão.
fonte
Para um caso de uso semelhante, eu escrevi uma função elisp
modi/switch-to-scratch-and-back
que permite alternar rapidamente entre um buffer FILE e um buffer * scratch * com o mesmo modo principal que o buffer FILE. A função com hiperlink acima levará você a uma pergunta existente do emacs SE.Aqui está como você pode usar essa função:
Aqui está um exemplo de função de wrapper
copy-current-buffer-to-scratch
a uma chave, se desejar, e sua execução fornecerá um buffer * scratch * com o conteúdo do seu buffer de trabalho.Esta é apenas outra maneira de fazer o que você deseja; você pode querer usar buffers indiretos sobre os quais a solução @Gilles fala. Essa abordagem é útil se você precisar fazer algumas edições pesadas em um buffer temporário sem arriscar salvamentos acidentais no buffer original até chegar a uma solução estável.
Um exemplo de caso de uso é experimentar funções elisp experimentais antes de salvá-las no init do emacs.
fonte