2016-03-21 13 views
1

Ich habe vor kurzem Emacs 24.5.1 von 24.1 auf meinem OSX-Rechner aktualisiert. Ich verwende die native Cocoa Emacs-Anwendung.M-x Set-Variable funktioniert nicht in Emacs 24.5.1

Seit der Aktualisierung konnte ich M-x set-variable nicht verwenden, um den Wert einer Variablen zu ändern. Die Variable wird in meinem .emacs mit der Syntax definiert:

(defvar project-root-directory nil) 

Mit der obigen Definition, nach der Emacs gestartet und die .emacs Datei ohne Fehler geladen, wenn ich getroffen M-x set-variable, Emacs beklagen, dass project-root-directory Variable existiert nicht.

Hat sich irgendetwas mit der Defvar-Syntax in Emacs 24.5 geändert, die das Setzen einer Variablen mit M-x nicht erlaubt?

Antwort

3

Die Antwort auf Ihre Frage ist ja, hat etwas für Emacs ändern 24.5, die diese Funktion brach. Genauer gesagt wurde der Bruch in Emacs 24.3 und nicht in 24.5 eingeführt.

Vor Emacs 24.3 (das heißt, für Jahrzehnte!), Es war genug, um gerade auf * als erstes Zeichen des doc-String, eine Variable in eine Benutzervariablen zu machen, so könnte es mit set-variable verwendet werden. (. Die * zeigt nicht als Teil der angezeigten doc string)

Mit anderen Worten, vor der Emacs 24.3, alles, was Sie tun musste, war dies, in der Lage sein, verwenden M-x set-variable:

(defvar foo 42 "*This is a user variable.") 

War es eine gute Idee für Emacs, dieses Feature fallen zu lassen? Manche denken das. (Tue ich nicht.)


Wie ist die aktuelle Situation?

Wie @Thomas sagte, funktioniert set-variable für Variablen, die mit defcustom definiert sind. Genauer gesagt ist es jedoch für Variablen definiert, für die custom-variable-p nicht-null zurückgibt.

So können Sie immer noch M-x set-variable mit einer Variablen verwenden, die definiert wurde defvar verwenden, vorausgesetzt, Sie geben einen Nicht-Null standard-value Eigenschaft (das macht es custom-variable-p erfüllen):

(defvar foo 42 "This is a user variable.") 
    (put 'foo 'standard-value 42) 
+0

Danke für das Detail. Es beantwortet meine quälende Frage, ob etwas zwischen 24.1 und 24.5 Versionen unterbrochen wurde. – Specksynder

1

Ihre Variable sollte eine Benutzeroption Variablenname, d. H. Eine Lisp-Variable sein, die von Benutzern angepasst werden soll. So verwendet defcustom statt defvar:

(defcustom project-root-directory nil 
    "The root directory of the project.") 

Sie könnten für die Variable mit einem besseren Docstring kommen wollen als in diesem Beispiel.

(Dies war bereits der Fall vor Emacs24.)

+0

Große, das gut für mich gearbeitet . Vielen Dank. (Es ist seltsam, dass Variablen definiert mit 'Defvar' verwendet, um eine Benutzeroption Variablenname in meiner Konfiguration früher zu definieren, aber ich werde in Zukunft defcustom verwenden) – Specksynder

+0

Danke, aber können Sie bitte @ Drews Antwort als richtig akzeptieren? Ich denke, es ist viel besser als meins. – Thomas

+0

Ich hatte darüber nachgedacht, aber ich wollte die Punkte, die ich dir zuerkannte, nicht aus Respekt wegnehmen, weil ich der Erste war. Da es Ihr Wunsch ist und Drews Antwort ausführlicher ist, werde ich seine Antwort als die richtige Antwort akzeptieren. :-) – Specksynder

Verwandte Themen