2014-02-20 58 views
5

在emacs中,我們可以定義可定製的用戶選項變量。如何爲由defcustom定義的變量設置緩衝區局部值?

defcustom - 中的Emacs Lisp http://www.gnu.org/software/emacs/manual/html_node/eintr/defcustom.html

編程和我們可以讓變量有緩衝區本地綁定。

創建緩衝區局部 - GNU的Emacs Lisp參考手冊http://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Buffer_002dLocal.html#Creating-Buffer_002dLocal

如果我想打不可自定義變量,我可以使用make-local-variablesetq-local

但我找不到任何方法如何讓自定義變量具有緩衝區本地綁定。

即使我叫make-local-variabledefcustom定義的變量,custom-set-variables設置爲全球價值

如果我打電話setq-local,則將值設置爲局部變量。這個比較好。但我不認爲這是最佳做法。

是否有任何有效的方法來設置由defcustom定義的變量的緩衝區局部值?

+1

要設置(在代碼中)* any *變量的緩衝區局部變量,可以使用'setq-local'(或Emacs 24.3之前的'make-local-variable')。這*是最佳做法。你的問題實際上是「如何在* defcustom'聲明中指定一個變量應該總是緩衝區本地?」 ?或者也許「我如何使用Customize用戶界面爲變量設置緩衝區本地值?」 ? – phils

+0

@phils對不起,我的語言能力。我想問的是「是否有一個像setq-local'和'custom-set-variables'這樣的函數?」。但@Drew發佈了全面的答案。謝謝。 – kumar8600

回答

4

答案是:您不能,至少不能使用自定義用戶界面。

你可以做的是添加一個sexp來設置變量的緩衝區本地值到init文件中。

一個以下的

  • 讓它總是緩衝區的地方,不管緩衝區是什麼:

    (make-variable-buffer-local 'the-variable)

    你可以把這個任何在你的init文件中。

  • 讓它局部於緩衝區只對當前緩衝區,即對於一些緩衝您選擇它後:

    (make-local-variable 'the-variable)

    對於這一點,你需要把SEXP在選擇一個SEXP你想要的緩衝區。這可能是,例如:

    (with-current-buffer (get-buffer-create "the-buffer-name") (make-local-variable 'the-variable))

    這假定緩衝區可以合理地創建或已經存在。如果你這樣做,之後你的custom-file已被加載。也就是說,在您的init文件中,在加載custom-file(我推薦)之後,或者如果您不使用custom-file,則在自定義自動生成的任何代碼(例如,custom-set-variables)之後。

    您可以選擇將make-local-variable sexp放在模式鉤子上,因此無論何時處於具有特定模式的緩衝區中,都會執行。

所有的說,我提交了一份enhancement request Emacs的開發在2012年,要求用戶能夠使用自定義UI設置(也可能保存)的用戶選項緩衝區局部值。到目前爲止,它睡在「願望清單」類別中。

+0

謝謝你的回答。我不想爲可自定義的用戶選項變量使用'setq'。我沒有選擇,只能使用'setq'。我希望你的請求能被接受。 – kumar8600

1

defcustom表格後寫

(make-variable-buffer-local 'my-var) 

現在,如果你在一定的緩衝更改值,其他緩衝區將保持RESP。交付舊的定製的。

+0

我知道這可以工作,當我使用'setq'。但是我想問一下使用'custom-set-variables'時的情況。對不起,謝謝。 – kumar8600

1

問題是Customize主要用於持久配置,即保存在配置文件中的配置,所以它也適用於未來的Emacs會話。但緩衝區不是持久的:當你重新啓動Emacs時,你會得到一個新的緩衝區對象。
因此,持久定製「per-buffer」不是一個明確定義的概念。另一方面,我們可以/應該爲特定於某些主要模式(即「每個模式」設置)的設置添加自定義支持。

+1

謝謝你的好消息。自定義在定義用戶可配置值時是很好的。但我想通過我的插件來控制它們。每次啓動'window-configuration-change-hook'時,我都會設想一種調用'custom-set-variables'的方法。但我認爲這是骯髒的方式... – kumar8600