2008-12-09 15 views
9

Chcę, aby mój bufor emacs miał inną nazwę niż nazwa pliku. Zamiast ustawiania tego ręcznie za każdym razem, chcę mieć to dzieje się automatycznie na podstawie zawartości plików, coś jak:Jak ustawić nazwę bufora Emacs z lokalną zmienną pliku?

// Zmienne lokalne:
// bufor-name: MyName
// Koniec:

Ale to nie działa, ponieważ nazwa-bufora jest funkcją, a nie zmienną. Jak mogę to zrobić?

Odpowiedz

12

można powiedzieć:

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

Jest to podstęp chociaż.

Można inaczej zaprogramować hak find-file-hook w swoim .emacs, który zmienia nazwę bufora na określoną zawartość zmiennej lokalnej. Coś jak:

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

Następnie w określonym pliku masz

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

z większą moc mózgu można mieć ładniejszy rozwiązanie.

Należy pamiętać, że istnieje już rozszerzenie dla potrzeb. Spójrz w Emacs wiki.

+0

Chyba Emacs będzie ostrzegał o "eval" za każdym razem, ale fajny pomysł! – ShreevatsaR

+0

Tak, tak, to za każdym razem ostrzega o "eval". Możesz wtedy ustawić zmienną "enable-local-variable" na t, jeśli ci to przeszkadza. To nie jest bezpieczne ... – Pierre

3

Dzięki Pierre. Twój przykładowy plik o nazwie pdp-buffer-name działał bardzo dobrze.

Zrobiłem jedno ulepszenie, ponieważ zauważyłem, że emacs traktował zmienną lokalną jako "niebezpieczną", tj. Zawsze pytając, czy wartość powinna zostać zastosowana. Ponieważ chcę, aby to działało z wieloma różnymi wartościami bez zagracania mojego .emacs z listą "bezpiecznych" wartości, dodałem radę. W nomenklaturze poprzedniego przykładu wygląda to tak:

;; 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

To powinno zdecydowanie rozwiązać rozwiązanie. Miły ! – Pierre

Powiązane problemy