2014-01-05 42 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*