2014-01-05 69 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 test.sh啓動Emacs,然後在test.sh緩衝類型M-x describe-variable *current-mode-var*,我得到

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

    Automatically becomes buffer-local when set. 

Documentation: 
Not documented as a variable. 

,而我預期得到*current-mode-var*'s value is "sh-mode"

回答

2

只有在首次聲明時纔會跳出變量。所有進一步的聲明都被跳過。 您需要改爲setq

+0

感謝的價值!如果我使用'setq',那麼變量如何變成本地? –

+1

聲明後它是本地緩衝區。這類似於聲明類型並在C中分配 :賦值不會更改類型。所以'defvar-local'後面跟'setq'將*不會*改變 變量到非本地。 –

+0

好的。這是否意味着你必須在'〜/ .emacs'中添加'(defvar-local * current-mode-var * nil)',然後在模式鉤子中使用'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*