2008-12-09 11 views
9

Quiero que mi memoria intermedia de emacs tenga un nombre diferente al del archivo. En lugar de establecer manualmente cada vez, yo quiero tener esto suceda automáticamente basándose en el contenido del archivo, algo así como:¿Cómo configuro un nombre de buffer de Emacs con una variable local de archivo?

// variables locales:
// buffer-name: MiNombre
// Fin:

Pero esto no funciona porque el nombre del búfer es una función, no una variable. ¿Cómo puedo hacer esto?

Respuesta

12

Se podría decir:

// Local Variables: 
// eval: (rename-buffer "my-buffer-name-here") 
// end: 

Es un truco sin embargo.

De lo contrario, podría programar un gancho find-file-hook en su .emacs que cambia el nombre del búfer a un contenido de variable local específico. Algo así como:

(defvar pdp-buffer-name nil) 

(defun pdp-rename-buffer-if-necessary() 
    "Rename the current buffer according to the value of variable" 
    (interactive) 
    (if (and pdp-buffer-name (stringp pdp-buffer-name)) 
     (rename-buffer pdp-buffer-name))) 

(add-hook 'find-file-hook 'pdp-rename-buffer-if-necessary) 

Luego, en el archivo específico que tienen

// Local Variables: 
// pdp-buffer-name: "pierre" 
// end: 

Con más energía del cerebro que podría tener una solución más agradable.

Tenga en cuenta que ya podría existir una extensión para su necesidad. Mire en el Emacs wiki.

+0

Supongo que Emacs advertirá sobre el "eval" cada vez, ¡pero qué buena idea! – ShreevatsaR

+0

Sí, bien, advierte sobre "eval" cada vez. Luego puede establecer la variable "enable-local-variable" en t si le molesta. Sin embargo, no es seguro ... – Pierre

3

Gracias Pierre. Tu ejemplo pdp-buffer-name elisp funcionó muy bien.

Realicé una mejora porque noté que emacs estaba tratando la variable local como "insegura", es decir, siempre preguntaba si el valor debería aplicarse. Como quiero que esto funcione con muchos valores diferentes sin saturar mis .emacs con una lista de valores "seguros", agregué un consejo. Con la nomenclatura del ejemplo anterior, se ve así:

;; allow all values for "pdp-buffer-name" 
(defadvice safe-local-variable-p (after allow-pdp-buffer-name (sym val) activate) 
    (if (eq sym 'pdp-buffer-name)  
     (setq ad-return-value t)) 
) 
+0

Esto debería completar la solución definitivamente. Agradable ! – Pierre

Cuestiones relacionadas