Por que usar buffers indiretos?

Respostas:

16

Para ver e editar vários locais do mesmo buffer. Portanto, você não precisa rolar um buffer longo, mas simplesmente alternar a janela para a região visível. Cada buffer clonado também possui anel de marca diferente, estreitamento e outras propriedades do buffer. Se você não usar o buffer indireto, mas criar outra janela do mesmo buffer, tudo será compartilhado e você não poderá executar outros recursos avançados além da visualização e edição de locais diferentes. Por exemplo, com um buffer indireto, você pode dobrar todo o bloco de código, criar efetivamente uma "árvore de tags" sem afetar o buffer original. Usando uma janela, os dois buffers nas duas janelas são dobrados porque os dois são iguais.

Em suma, o buffer indireto é um buffer completamente diferente que compartilha o mesmo texto e arquivo no seu buffer original; portanto, quando você salva o buffer clonado, ele também salva o arquivo original.

Tu Do
fonte
3
Concordo que os buffers indiretos têm benefícios. Mas seu primeiro ponto não precisa que os buffers sejam indiretos. Você pode ver e editar vários locais do mesmo buffer, mesmo que o mesmo seja simplesmente aberto em duas janelas. Mas sim, estreitamento independente, dobragem, etc, são características fortes de um buffer indireto na minha opinião.
Kaushal Modi
5
Edite também o mesmo buffer com vários modos (combine o buffer indireto com o estreitamento). Você pode editar algumas partes de um tampão com modos de remarcação, outra parte com modos pitão, outra parte com os modos de JSON
freakhill
Você pode ver vários locais usando várias janelas sozinho, mas como existe apenas um valor de ponto nessa situação, os buffers de comutação não preservarão os locais nas duas janelas, mas apenas um.
politza
9

Um caso de uso está usando um modo principal diferente em uma parte de um arquivo.

Por exemplo, eu estava trabalhando com documentos xml com código dentro de certos elementos. Queria poder editar o documento inteiro como se fosse xml, mas ainda tenho todos os principais recursos de modo para a linguagem de programação incorporados em certos elementos. Por isso, reduzi o corpo desses elementos em um buffer indireto que estava executando o modo principal apropriado.

Aqui está uma função da minha configuração que eu uso para fazer isso:

(defun indirect-region (start end)
  "Edit the current region in another indirect buffer.
    Prompt for a major mode to activate."
  (interactive "r")
  (let ((buffer-name (generate-new-buffer-name "*indirect*"))
        (mode (intern
               (completing-read
                "Mode: "
                (mapcar (lambda (e)
                          (list (symbol-name e)))
                        (apropos-internal "-mode$" 'commandp))
                nil t))))
    (pop-to-buffer (make-indirect-buffer (current-buffer) buffer-name))
    (funcall mode)
    (narrow-to-region start end)
    (goto-char (point-min))
    (shrink-window-if-larger-than-buffer)))

Nota: isso não é perfeito, coisas como o bloqueio de fonte exigem trabalho adicional especial para uso neste cenário.

Jordon Biondo
fonte
3

Os buffers indiretos oferecem várias visualizações do mesmo buffer, em particular, várias restrições, cada uma das quais atua, em muitos aspectos, como um buffer separado.

Como o Comentário da biblioteca narrow-indirect.eldiz:

Você pode usar buffers indiretos para mais do que você imagina. Você pode usar clones obtidos de partes de buffers Dired, por exemplo, para fornecer visualizações úteis (ativas) em uma lista de diretórios. Existem apenas algumas chaves / comandos (como gatualizar a listagem) que não funcionam, porque dependem da exibição de todo o buffer Dired. Experimente e, sem dúvida, você encontrará novos usos interessantes para buffers indiretos.

Desenhou
fonte