2012-03-25 3 views
3

Also lerne ich ein bisschen Lisp/Elisp um meine Emacs-Umgebung zu optimieren, und ich habe begonnen eine einfache Emacs-Bibliothek zu erstellen, die der große Roadblock in der Lage ist Sagen Sie, ob eine eingegebene Klammer eine Übereinstimmung aufweist oder nicht. Ich habe die Emacs-Quelle (paren.el.gz) durchgesehen und festgestellt, dass ich die Funktion show-paren-function verwenden kann, um festzustellen, ob es eine Übereinstimmung ist oder nicht.Reagieren auf ein "falsches Argument"

Hier ist, was ich bisher habe:

(defun it-is-a-paren() 
    (interactive) 
    (insert ")") 
    (if (show-paren-function) 
     (message "%s" "it is a match") 
     (message "%s" "it is not"))) 

Also das ist ziemlich einfach, und „es ist ein Spiel“ funktioniert wie es sollte, aber wenn es angeblich „es ist nicht“ zu werfen es tut es nicht, stattdessen gibt es mir "Wrong type argument: integer-oder-marker-p, t".

Ist jemand vertraut genug, um die Verwendung einer anderen Funktion zu empfehlen, oder vielleicht sollte ich meine eigene schreiben anstatt show-paren-function zu verwenden. Oder gibt es einen Weg um diesen Fehler (so etwas wie Ausnahmebehandlung)?

+1

Sie können auch versuchen, die Standardfunktion [rückwärts sexp] versuchen empfehlen (http://www.gnu.org/software/emacs/manual/html_node/emacs/Expressions .html), die auch eine Ausnahme auslöst, wenn die Parens unbalanciert sind. – Tom

Antwort

4

Das "Ausnahme-Handling" -ähnliche Konstrukt, das Sie suchen, ist condition-case.

(defun its-a-paren() 
    (interactive) 
    (insert ")") 
    (condition-case ex 
     (if (show-paren-function) 
      (message "its a match") 
     (message "its not")) 
    (error (message "its not")))) 

Edit: Blick in show-paren-function ‚s-Code, so scheint es mir, dass dieser Fehler ein Fehler ist, wie es aus dem Ausdruck kommt (goto-char pos) wo post ist.

Anyways, show-paren-function verwendet scan-sexps, um nach dem passenden Paren zu suchen. Die Anpassung der Art und Weise es in show-paren-function getan hat, wäre eine vereinfachte Funktion für Ihren Fall sein:

(defun its-a-paren() 
    (interactive) 
    (insert ")") 
    (condition-case() 
     (progn 
     (scan-sexps (point) -1) 
     (message "It's a match")) 
    (error (message "It's not a match")))) 
+0

Danke, das Entfernen wenn das wie gesagt einwandfrei funktioniert, ich bin mir auch nicht sicher, ob es der eigentliche Weg zur show-paren-Funktion ist zu sagen, dass es kein passendes finden kann. – user652650

+1

Ihr 'condition-case' wird Fehler des Typs' error' und des Typs 'quote' (ein Fehlertyp, der nicht existiert) aufgrund des zusätzlichen Fehlers" Sie haben zuvor hinzugefügt "entsprechen. – Stefan

+0

@Stefan Danke, ich habe es behoben – Francesco

2

Mit Show-paren-Funktion für diesen Zweck viel des Guten ist (wie Ihr Auto in eine Werkstatt zu geben eine Überprüfung, ob die Öl Level hat sich geändert, um festzustellen, ob das Auto mehr Öl benötigt) und funktioniert nicht richtig, wie Sie bemerkt haben.

Ich würde Sie

(condition-case nil 
    (progn (forward-sexp -1) 
      (message "Moved to the matching opener")) 
    (scan-error (message "No matching opener"))) 
+1

Da 'forward-sexp 'Änderungen zeigen, denke ich, dass es notwendig wäre, Ihren Code in ein' save-excurv' Formular zu verpacken. – Francesco

+0

Danke @stefan! Mir war bewusst, dass es wahrscheinlich nicht der richtige Weg war, ich habe nur versucht, einen funktionierenden Prototyp zu hacken, bevor ich mit dem Refactoring anfing. – user652650