2016-06-23 36 views
0

Ich bin ziemlich neu in Emacs, aber ich weiß genug, um gefährlich zu sein. Ich habe meine .emacs-Datei von Grund auf neu erstellt und jetzt in einer Organisationsdatei gespeichert. Ich versuche jetzt, es auf das nächste Level zu bringen und meine Konfiguration benutzerfreundlicher für mich zu machen.Emacs-Funktion gibt Symbols Wert als Variable ist void:

Ich benutze meistens Emacs zum Schreiben. Bücher, Blogs, Drehbuchschreiben usw. Ich versuche eine Funktion zu erstellen, die mehrere Modi aktiviert und die Einstellungen im laufenden Betrieb hinzufügt.

Zum Beispiel verwende ich Olivetti-Modus beim Schreiben. Es zentriert den Text. Jedes Mal muss ich die Olivetti-Set-Breite anpassen. Ich dachte, ich würde Lust bekommen und die Rechtschreibprüfung aktivieren und auch den Linum-Modus ausschalten.

aber jedes Mal wenn ich es versuchen, erhalte ich die Fehlermeldung:

Symbol's value as variable is void: my-writing 

Kann mir jemand erklären, was ich falsch mache? Ich habe ziemlich viel google-fu'd, aber ich habe eindeutig eine Lücke in meinem Verständnis von dem, was ich tue.

#+BEGIN_SRC emacs-lisp 
(defun my-writing() 
"Start olivetti mode, set the width to 120, turn on spell-check." 
((interactive) 
(olivetti-mode) 
(setq olivetti-set-width . 120) 
(flyspell-mode) 
(global-linum-mode 0))) 

(add-hook 'olivetti-mode-hook 
    (lambda() olivetti-mode my-writing t)) 

#+END_SRC 

Vielen Dank im Voraus.

Antwort

2

Um global-linum-mode für bestimmte Haupt-Modi zu deaktivieren, siehe automatically disable a global minor mode for a specific major mode

[Da olivetti-mode ist ein kleiner-Modus, der auf das, was ist Haupt-Modus aktiviert nachfolgende bereits im Puffer vorhanden, kann das ursprüngliche Plakat möchten Schalten Sie linum-modelokal im aktuellen Puffer aus, indem Sie am Ende der Funktion my-writing(linum-mode -1) hinzufügen (siehe unten). Diese Idee geht jedoch davon aus, dass das ursprüngliche Plakat zum Aufruf my-writing hat linum-mode aktiv in den aktuellen Puffern kurz vor wollte.]

Die Funktion my-writing in der Ausgangsfrage enthält einen zusätzlichen Satz von Klammern, die weggelassen werden sollen, und die Haken Einstellung ist nicht in der richtigen Form.

olivetti-set-width ist eine Funktion, die ein Argument, so können Sie setq nicht verwenden - siehe Funktion beginnend in Zeile 197: https://github.com/rnkn/olivetti/blob/master/olivetti.elsetq verwendet wird, wenn eine variable Einstellung nicht eine Funktion.

Obwohl flyspell-mode ist in der Regel zwischen lokal, ist es eine gute Idee ist, ein Argument von 1 in der Gewohnheit, der Verwendung auf einem Moll-Modus zu aktivieren oder ein -1 oder 0 es auszuschalten. Wenn ein Argument weggelassen wird, funktioniert der Aufruf des Moll-Modus als Ein/Aus-Schalter.

Sofern keine andere Einzelteile sind bereits an die befestigt, die einen Haken mit puffern lokalen Einstellungen für die Verwendung Priorisierung oder besondere Gründe benötigen, brauchen Sie nicht die optionalen Argumente für add-hook - das heißt, APPEND und LOCAL.

Es gibt keine offensichtlich Grund (olivetti-mode) als Teil des aufrufen, die automatisch am hinteren Ende der Initialisierung des Moll-Modus, so gibt es nun eine Überprüfung, um zu sehen, ob dieser Modus bereits aktiviert wurde aufgerufen wird. In diesem Beispiel wird die angezeigt, um zu veranschaulichen, wie die Verwendung formatiert wird.Das ursprüngliche Poster sollte jedoch in Betracht ziehen, (add-hook 'olivetti-mode-hook 'my-writing) zu entfernen, da es scheinbar keinen Zweck erfüllt, wenn der Benutzer M-x my-writing anstelle von M-x olivetti-mode aufrufen wird. Der Haken wäre in letzterem Fall nützlich - d. H. Bei der Eingabe von M-x olivetti-mode - in diesem Fall besteht keine Notwendigkeit, (unless olivetti-mode (olivetti-mode 1)) als Teil von my-writing zu haben.

#+BEGIN_SRC emacs-lisp 
(defun my-writing() 
"Start olivetti mode, set the width to 120, turn on spell-check." 
(interactive) 
    (unless olivetti-mode (olivetti-mode 1)) 
    (linum-mode -1) ;; see comments above 
    (olivetti-set-width 120) 
    (flyspell-mode 1)) 

;; original poster to consider eliminating this hook 
(add-hook 'olivetti-mode-hook 'my-writing) 

#+END_SRC 
+0

Ich habe alle Änderungen vorgenommen und es sieht genauso aus wie deins. Jetzt bekomme ich einen neuen Fehler: Die Lisp-Verschachtelung überschreitet 'max-lisp-eval-depth'. – MBH

+0

Ich entschuldige mich für die Annahme, dass "Olivetti-Modus" ein Major-Modus war - es ist in der Tat ein Moll-Modus. Ich habe den Code aktualisiert. Bitte versuchen Sie es erneut mit der geänderten Version. – lawlist

+0

Es funktioniert! Danke für die Hilfe und die Erklärung. (Ich hatte das vor ein paar Wochen versucht und so musste ich meine Akte durchgehen und den ganzen Unsinn beseitigen. Jetzt funktioniert es perfekt.) – MBH

2

lawlist's answer beschreibt, wie Sie gehen über das tun, was Sie tatsächlich zu erreichen versucht, aber der spezielle Fehler Sie bekommen ist, weil Emacs Lisp (wie Common Lisp, aber nicht Scheme) ein Lisp-2 ist. Wenn Sie ein Symbol mit einer Funktion unter Verwendung defun verbinden, macht es den Wert dieses Symbols (als eine Variable) diese Funktion nicht, es macht die Funktion Wert dieses Symbols die Funktion. Sie werden die gleichen Fehler in einer stark vereinfachten Situation erhalten:

(defun foo() 
    42) 

(list foo) 

Das Symbol foo keinen Wert hier als Variable haben. Um etwas, das Sie später FUNCALL passieren könnte oder anwenden, müssen Sie entweder das Symbol foo verwenden, zB:

(funcall 'foo) 
;=> 42 

oder die Form (function foo):

(funcall (function foo)) 
;=> 42 

, die mit der Stenographie abgekürzt werden kann #‘:

(funcall #'foo) 
;=> 42 

Sie bekommen die Fehler wegen:

(add-hook 'olivetti-mode-hook 
    (lambda() olivetti-mode my-writing t)) 

der my-Schreiben als Variable zu verwenden versucht, aber es hat keinen Variablenwert an diesem Punkt.