2014-01-05 3 views
2

Я хотел бы иметь глобальную комбинацию клавиш, которая показывает значение переменной. Однако значение переменной может измениться в соответствии с текущим основным режимом в текущем буфере.Локальные переменные режима в Emacs

Я попытался добавить следующее к моей ~/.emacs:

(defun my-elisp-mode-setup() 
    (defvar-local *current-mode-var* "elisp-mode") 
) 
(defun my-sh-mode-setup() 
    (defvar-local *current-mode-var* "sh-mode") 
) 
(add-hook 'emacs-lisp-mode-hook 'my-elisp-mode-setup) 
(add-hook 'sh-mode-hook 'my-sh-mode-setup) 

Если я теперь начать Emacs с emacs test.sh и затем введите M-x describe-variable *current-mode-var* в test.sh буфере, я получаю

*current-mode-var*'s value is "elisp-mode" 

    Automatically becomes buffer-local when set. 

Documentation: 
Not documented as a variable. 

в то время как я ожидал get *current-mode-var*'s value is "sh-mode"

ответ

2

Переменные изменяются только при первом объявлении. Все дальнейшие объявления пропущены. Вместо этого вам нужен setq.

+0

Спасибо! Если я использую 'setq', как тогда переменная станет локальной? –

+1

Это буфер локальный после объявления. Это что-то вроде объявления типа и назначения в C: назначение не меняет тип. Поэтому 'defvar-local', за которым следует' setq', будет * not * изменять переменную на нелокальную. –

+0

Хорошо. Означает ли это, что вам нужно добавить '(defvar-local * current-mode-var * nil)' в '~/.emacs', а затем использовать' setq' в режимах? –

2

Если все, что вы хотите сделать, это проверить переменную, чтобы определить основной режим (который, по-видимому, это то, что вы делаете), а затем просто изучить переменную major-mode. Вот для чего это.

И если вы хотите/командную клавишу, чтобы сделать это, то просто создать:

(defun which-mode() 
    "Echo the current major mode in the echo area." 
    (interactive) 
    (message "Major mode: %s" major-mode)) 

Или использовать переменную mode-name, если вы предпочитаете имя основных режима человеческого людей.

2

Я предпочитаю официальный родной пакет https://www.emacswiki.org/emacs/ModeLocal. лучше настраивается, потому что вам не требуется add-hook

Например

(require 'mode-local) 
(setq-mode-local sh-mode *current-mode-var* "sh-mode") 
(setq-mode-local emacs-lisp-mode *current-mode-var* "elisp-mode") 

Тогда только изменяя режим причины изменения значения *current-mode-var*

Смежные вопросы