2008-12-09 2 views
9

Я хочу, чтобы мой буфер emacs имел другое имя, чем имя файла. Вместо того чтобы устанавливать это вручную каждый раз, когда я хочу, чтобы это произошло автоматически на основе содержимого файла, что-то вроде:Как установить имя буфера Emacs с локальной переменной файла?

// Локальные переменные:
// буфер имя: MyName
// Конец:

Но это не работает, потому что имя буфера является функцией, а не переменной. Как я могу это сделать?

ответ

12

Вы могли бы сказать:

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

Это трюк, хотя.

В противном случае вы можете запрограммировать крючок find-file-hook в своем .emacs, который переименовывает буфер в определенное локальное содержимое переменной. Что-то вроде:

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

Затем в конкретном файле у вас есть

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

При большей мощности мозга вы могли бы иметь более хорошее решение.

Обратите внимание, что уже существует расширение для вашей потребности. Посмотрите в Emacs wiki.

+0

Я думаю, Emacs будет предупреждать об «eval» каждый раз, но хорошая идея! – ShreevatsaR 2008-12-09 17:28:21

+0

Да, он всегда предупреждает об «eval». Затем вы можете установить переменную «enable-local-variable» в t, если это вас беспокоит. Это не безопасно, хотя ... – Pierre 2008-12-10 15:36:39

3

Спасибо Пьер. Ваш пример pidp-buffer-name elisp работал очень хорошо.

Я сделал одно усовершенствование, потому что заметил, что emacs обрабатывает локальную переменную как «небезопасную», т. Е. Всегда запрашивая вопрос о том, следует ли применять значение. Поскольку я хочу, чтобы это работало со многими разными значениями, не загромождая мои .emacs со списком «безопасных» значений, я добавил несколько советов. С номенклатурой предыдущего примера это выглядит так:

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