Quais são os benefícios do uso de buffers indiretos ? Sob quais circunstâncias eles são úteis?
Quais são os benefícios do uso de buffers indiretos ? Sob quais circunstâncias eles são úteis?
Respostas:
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.
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.
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.el
diz:
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
g
atualizar 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.