У меня есть следующие определения в моем .emacs.d:
;;; 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-]. Когда я иду к парену и нажимаю клавишу "перейти", он делает то, что я хочу - переходит к другому. Если после этого я нажму клавишу "выбрать"... она сделает то же самое, не отмечая область, и повторное нажатие на нее после этого заставит ее прыгать между скобками. Но если после этого я нажму "goto", он действительно пометит область, и повторное нажатие на нее отскочит назад и отметит ее.
Так что в основном у меня есть функции, которые я хотел... но наоборот, и я не знаю, почему. Может кто-нибудь объяснить, что здесь происходит, и, возможно, предложить решение?