2012-03-25 7 views
3

私はemacs環境を最適化するために少しlisp/elispを学び始めています。簡単なemacsライブラリを作成し始めました。主なロードブロックは入力された括弧に一致するかどうかを確認します。私はemacsのソース(paren.el.gz)を見ていて、関数show-paren-functionを使用して一致するかどうかを判断できることに気付きました。「間違った型引数」に反応する

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

だからこれはかなり基本的なもの、そして「それが一致している」それが必要として動作しますが、それがスローになっているとき、「そうではありません」:ここでは

は、私がこれまで持っているものです、そうではなく、代わりに私に "間違った型の引数:integer-or-marker-p、t"を与えます。

別の機能の使用について助言するのに十分な知識を持っている人、またはshow-paren-functionを使用する代わりに、自分自身で作成する必要があります。あるいは、このエラー(例外処理のようなもの)を回避する手段がありますか?

+1

を試してみてくださいお勧めします.html)。これは、括弧がアンバランスな場合にも例外をスローします。 – Tom

答えて

4

あなたが探している "例外処理"のような構造は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")))) 

編集:show-paren-functionのコードを見ると、postで表現(goto-char pos)から来ていると、このエラーはバグであると私には思えます。

とにかく、show-paren-functionscan-sexpsを使用して、一致する括弧を探します。それはshow-paren-functionで行うの方法から適応、あなたのケースのための単純化された機能は次のようになります。この目的のためにショー括弧機能を使用して

​​
+0

私はshow-paren-functionが一致を見つけることができないと言う実際の方法であるかどうかを確かめています。 – user652650

+1

あなたの 'condition-case'は、' error'の前に追加された余分なもののために、 'error'型のエラーと' quote'(存在しないエラー型)のエラーにマッチします。 – Stefan

+0

@Stefanありがとう、私はそれを修正しました – Francesco

2

がガレージに撥油性かどうかをチェックし、あなたの車を与えるように(過剰ですあなたが気付いたように、車がより多くのオイルを必要としているかどうかを判断するためにレベルが変更されています)。

私はあなたがまた、標準関数[後方-S式](http://www.gnu.org/software/emacs/manual/html_node/emacs/Expressionsを試すことができます

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

'forward-sexp'がポイントを変更するので、' save-excursion'フォーム内でコードを折り返す必要があると思います。 – Francesco

+0

ありがとう@stefan!おそらく正しい方法ではないと私は認識していました。私はリファクタリングを開始する前に、動作するプロトタイプをハックしようとしていました。 – user652650

関連する問題