¿Cómo debo obtener el nombre de archivo del búfer original en un búfer clonado indirecto?

8

Quería ver diferentes partes de un búfer en dos cuadros diferentes, ya que tengo dos monitores de diferentes formas que no puedo abarcar fácilmente un solo cuadro. Un poco de google me llevó a usar clone-indirect-buffer, que funciona muy bien.

Sin embargo, buffer-file-namepara el nuevo búfer es nil. ¿Cómo puedo determinar de manera confiable el nombre de archivo del búfer original (del que este es un clon)?

camino
fuente
2
¿Cuál es la diferencia / ventaja de clonar el búfer y simplemente visitar el búfer en ambos cuadros simultáneamente?
Nathanael Farley
55
Los clones responden a eventos como estrechamiento / ensanchamiento, plegado de código y plegado de contornos independientemente uno del otro. Si fuera el mismo búfer en dos ventanas, este tipo de eventos se reflejarían en cada ventana. Los clones son útiles para, por ejemplo, tener diferentes vistas de diferentes partes del búfer al mismo tiempo.
Dan
No estoy realmente seguro de si puede abrir el búfer en dos cuadros simultáneamente. Por supuesto, puede hacerlo en dos ventanas en el mismo marco, pero si trato de cambiar al búfer en otro marco con el C-x bfoco cambia al marco que ya muestra el búfer.
Rneatherway
1
@NathanaelFarley Utilizo búferes indirectos cuando estoy compartiendo terminales con mis universidades inclinadas vim que pueden usar el búfer indirecto con algo como el modo malvado.
stsquad

Respuestas:

12

Mantengo el manual de Emacs y el manual de Elisp en marcado rápido para preguntas como estas.

Del manual de Elisp sobre memorias intermedias indirectas :

Función: buffer-base-buffer y buffer opcional

Esta función devuelve el búfer base del búfer, que por defecto es el búfer actual. Si el búfer no es indirecto, el valor es nulo. De lo contrario, el valor es otro búfer, que nunca es un búfer indirecto.

Probablemente quieras (buffer-file-name (buffer-base-buffer))o algo así.

flechas_púrpura
fuente
SIP eso es. Sin embargo, todavía me gusta mi defadviceopción. ;)
Dan
3

Esta es una respuesta indirecta a su pregunta: no estoy seguro de cómo averiguar cuál es el nombre de archivo del búfer original sin hacer lo siguiente. (EDITAR: la respuesta de @ purple_arrows completa los detalles: puedes usarla buffer-base-buffer. Acepta esa respuesta como la más correcta).

El siguiente consejo asociará el nombre de archivo del búfer original con cada uno de sus clones indirectos:

(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)))

Ahora, cada uno de los clones tiene el mismo nombre de archivo que el búfer original.

Utilizo mucho los búferes clonados indirectamente y me gusta poder, por ejemplo, guardar el archivo asociado cuando estoy trabajando con cualquiera de los búferes, en lugar del original. Este consejo fue mi solución para ese flujo de trabajo deseado.

Dan
fuente