2012-06-24 59 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