2012-03-25 23 views
3

因此,我開始學習一些lisp/elisp來優化我的emacs環境,並且我開始製作一個簡單的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"))) 

所以這是非常基本的,而「這是一場比賽」的作品,因爲它應該,但是當它應該拋出「不是」 ,它不會,而是它給了我「錯誤的類型參數:整數或標記p,t」。

是否有人熟悉建議使用不同的功能,或者我應該自己寫,而不是使用show-paren-function。或者有沒有解決這個錯誤的方法(有點像異常處理)?

+1

您也可以嘗試的標準函數[向後SEXP(http://www.gnu.org/software/emacs/manual/html_node/emacs/Expressions .html),如果parens不平衡,這也會引發異常。 – Tom 2012-03-25 19:05:32

回答

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的代碼,在我看來,這個錯誤是一個錯誤,因爲它來自於表達(goto-char pos)其中post

無論如何,show-paren-function使用scan-sexps來尋找匹配的paren。從它在show-paren-function做的方式適應,爲你的情況下,簡化的功能是:

​​
+0

謝謝,刪除如果陳述工作完美,我也不確定是否是顯示paren功能的實際方式告訴它找不到匹配。 – user652650 2012-03-25 18:08:38

+1

您的'condition-case'將會匹配'error'類型的錯誤和'quote'類型的錯誤類型(不存在的錯誤類型),因爲您在錯誤之前添加了額外的錯誤。 – Stefan 2012-03-25 19:19:35

+0

@Stefan謝謝,我修正了它 – Francesco 2012-03-25 19:22:31

2

用show-括號功能用於此目的是矯枉過正(就像給你的汽車修理廠,如果油支票水平已經改變,以確定汽車是否需要更多的油),並且不正確,正如你已經注意到的那樣。

我建議你嘗試

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

由於'前瞻性'的變化點,我認爲它將需要包裹在一個'保存偏移'形式的代碼。 – Francesco 2012-03-25 19:40:54

+0

謝謝@stefan!我意識到這可能不是正確的方式,我只是試圖在開始重構之前一起破解一個可用的原型。 – user652650 2012-03-25 20:25:12