2012-06-24 60 views
2

之间进行选择,我有以下defun定义在我的.emacs.d:Emacs的 - 括号

;;; http://emacswiki.org/emacs/ParenthesisMatching 
(defun goto-match-paren (arg) 
    "Go to the matching if on(){}[], similar to vi style of % " 
    (interactive "p") 
    ;; first, check for "outside of bracket" positions expected by forward-sexp, etc. 
    (cond ((looking-at "[\[\(\{]") (forward-sexp)) 
     ((looking-back "[\]\)\}]" 1) (backward-sexp)) 
     ;; now, try to succeed from inside of a bracket 
     ((looking-at "[\]\)\}]") (forward-char) (backward-sexp)) 
     ((looking-back "[\[\(\{]" 1) (backward-char) (forward-sexp)) 
     (t nil))) 

(defun select-in-parens() 
    (interactive) 
    (goto-match-paren 1) 
    (set-mark (point))) 

我原本只是有了第一个功能。然后我添加了第二个,我打算选择整个s表达式。现在,我有一个绑定到M- [,另一个绑定到M-]。当我去找一个paren并点击“goto”键时,它按照我想要的 - 跳到另一个。如果我在那之后点击“选择”键...它会做同样的事情,不标记区域,并且在它之后重复点击它使它在对角线之间跳跃。但是如果我在那之后做了“转到”,它会确实标记该区域,并且反复地点击它跳回并取消标记。

所以基本上我有我想要的功能......但是相反,我不知道为什么。有人可以解释一下这里发生了什么,并可能提供解决方案吗?

+0

你能澄清这更好的 - 也许用一个例子:“但是,什么情况是,‘选择’去匹配一对括号,如果我那么做‘转到’,即一个选择一切,所以基本上我有。我想要的功能......但是相反,我不知道为什么,有人可以解释这里发生了什么,并且可能提供解决方案吗?“ – Specksynder

回答

2

移动点之前可能是标记吗?

(defun select-in-parens() 
    (interactive) 
    (set-mark (point)) 
    (goto-match-paren 1)) 
+0

不错!我在辩论,如果s-exp已经被标记了,我是否也希望它也取消标记(类似于mark-active测试,然后是save-excursion,发现标记是否在其他paren?)。但我认为这很好。 – scry

+1

我相信使用'push-mark'而不是'set-mark'会更“正确”。除了这一点的正确性,如果你有一天想要分享你的代码,你会更容易在标记环中添加旧标记,并根据该标记添加一些逻辑... – fakedrake

+0

,除了标记不做我想要的是:标记父亲之间的一切。 – scry