Como devo obter o nome do arquivo do buffer original em um buffer clonado indireto?

8

Queria examinar partes diferentes de um buffer em dois quadros diferentes, pois tenho dois monitores de formas diferentes nas quais não consigo abranger facilmente um único quadro. Alguns sites me levaram a usar o Google clone-indirect-buffer, o que funciona muito bem.

No entanto, buffer-file-namepara o novo buffer é nil. Como posso determinar com segurança o nome do arquivo do buffer original (do qual este é um clone)?

rneatherway
fonte
2
Qual é a diferença / vantagem em clonar o buffer e simplesmente visitar o buffer nos dois quadros simultaneamente?
Nathanael Farley
5
Os clones respondem a eventos como estreitamento / ampliação, dobra de código e dobra de contorno independentemente um do outro. Se fosse o mesmo buffer em duas janelas, esses tipos de eventos seriam espelhados em cada janela. Os clones são úteis por, por exemplo, ter visualizações diferentes de diferentes partes do buffer ao mesmo tempo.
Dan
Na verdade, não tenho certeza se você pode abrir o buffer em dois quadros simultaneamente. Claro que você pode em duas janelas no mesmo quadro, mas se eu tentar mudar para o buffer em outro quadro com C-x bfoco, então o comutador muda para o quadro que já mostra o buffer.
rneatherway
1
@NathanaelFarley Eu uso buffers indiretos quando estou compartilhando terminalmente com minhas faculdades inclinadas ao vim que podem usar o buffer indireto com algo como o modo maligno.
Stsquad

Respostas:

12

Eu mantenho o manual do Emacs e o manual do Elisp na discagem rápida para perguntas como estas.

No manual Elisp sobre buffers indiretos :

Função: buffer-base-buffer & buffer opcional

Essa função retorna o buffer base do buffer, que é o padrão para o buffer atual. Se o buffer não for indireto, o valor será nulo. Caso contrário, o valor é outro buffer, que nunca é um buffer indireto.

Você provavelmente quer (buffer-file-name (buffer-base-buffer))ou algo assim.

purple_arrows
fonte
Sim, é isso. Eu ainda gosto da minha defadviceopção, no entanto. ;)
Dan
3

Esta é uma resposta indireta à sua pergunta - não sei como descobrir qual é o nome do arquivo do buffer original sem fazer o seguinte. (EDIT: a resposta de @ purple_arrows preenche os detalhes: você pode usá-lo buffer-base-buffer. Aceite essa resposta como a mais correta.)

O conselho a seguir associará o nome do arquivo do buffer original a cada um de seus clones indiretos:

(defadvice clone-indirect-buffer (around associate-filename activate)
  "Associate the original filename with the cloned buffer."
  (let ((filename buffer-file-name))
    ad-do-it
    (setq buffer-file-name filename)))

Agora, cada um dos clones tem o mesmo nome de arquivo que o buffer original.

Eu uso muito buffers indiretamente clonados e gostaria de poder, por exemplo, salvar o arquivo associado quando estou trabalhando com qualquer um dos buffers, em vez do original. Este conselho foi minha solução para o fluxo de trabalho desejado.

Dan
fonte