Emacs - выбор между скобками

У меня есть следующие определения в моем .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", он действительно пометит область, и повторное нажатие на нее отскочит назад и отметит ее.

Так что в основном у меня есть функции, которые я хотел... но наоборот, и я не знаю, почему. Может кто-нибудь объяснить, что здесь происходит, и, возможно, предложить решение?


person scry    schedule 24.06.2012    source источник
comment
Можете ли вы пояснить это лучше - может быть, на примере: но происходит то, что select переходит к соответствующей скобке, и если я затем делаю goto, он выбирает все. Так что в основном у меня есть функции, которые я хотел... но наоборот, и я не знаю, почему. Может кто-нибудь объяснить, что здесь происходит, и, возможно, предложить решение?   -  person Specksynder    schedule 24.06.2012


Ответы (1)


Может, поставить метку перед перемещением точки?

(defun select-in-parens ()
  (interactive)
  (set-mark (point))
  (goto-match-paren 1))
person fakedrake    schedule 24.06.2012
comment
неплохо! Я обсуждаю, хочу ли я, чтобы он также снимал отметку, если s-exp уже отмечен (что-то вроде проверки пометки-активности, затем сохранения-экскурсии, найти, находится ли отметка в другом параллелепипеде?). но я думаю, что это нормально. - person scry; 24.06.2012
comment
Я считаю, что было бы правильнее использовать push-mark вместо set-mark. Помимо правильности этого, если вы однажды захотите поделиться своим кодом, вам будет проще иметь старую метку в кольце меток и добавить некоторую логику на ее основе... - person fakedrake; 24.06.2012
comment
за исключением того, что push-mark не делает то, что я хочу: отмечаю все, что находится между скобками. - person scry; 25.06.2012
comment
push-mark должен нажать новую метку в кольце меток, расположенном в позиции курсора. После вызова push-mark активная метка находится в позиции курсора, только если вы хотите вернуться к предыдущей метке, все, что вам нужно сделать, это нажать на кольцо метки. Надеюсь, я правильно понял ваш комментарий. - person fakedrake; 28.06.2012
comment
Ну, я не особо заинтересован в том, чтобы вернуться к предыдущей отметке, просто хочу быстро отметить секс-экспресс. - person scry; 29.06.2012