Соответствующие скобки в Emacs - PullRequest
19 голосов
/ 25 декабря 2011

В GNU Emacs есть функция выделения одинаковых квадратных скобок в коде.

Однако, когда код, заключенный в квадратные скобки, действительно длинный, с несколькими вложенными if, for и т. Д., Эта функция не очень полезна, поскольку одна из скобок не будет видна.

Скажи, что у меня есть следующее,

for(int i=0; i< N; ++i)
 {
  /*Long code*/

 } 

Если мой курсор находится на фигурной скобке }, я хотел бы иметь некоторую функцию, которая позволит мне прыгнуть / увидеть фигурную скобку {, а затем, если она будет удовлетворена, вернуться к фигурной скобке } для любого будущее кодирование.

Возможно ли это в Emacs?

Ответы [ 5 ]

28 голосов
/ 25 декабря 2011

Это на самом деле очень стандартная привязка: C-M-f и C-M-b для возврата назад и вперед по умолчанию.В большинстве режимов C-M-f приведет вас вперед к соответствующей скобке, а C-M-b вернет вас назад к соответствующей скобке.Это также работает для таких вещей, как кавычки, примерно так же.

Эти привязки легко запомнить, если вы уже используете C-f и C-b для навигации.(Если вы этого не сделаете, вы должны это сделать.) Они похожи на движение вперед и назад от персонажа, поднятого до движения по выражению (что зависит от режима).

1 голос
/ 19 июля 2012
(defun px-match-paren (arg)
  "Go to the matching paren if on a paren; otherwise insert <key>."
  (interactive "p")
  (cond
   ((char-equal 41 (char-before)) (backward-list 1))
   ((char-equal 125 (char-before)) (backward-list 1))
   ((and
     (char-equal 123 (char-before))
     (char-equal 10 (char-after)))
    (backward-char 1) (forward-list 1))
   ((looking-at "\\s\(") (forward-list 1))
   ((looking-at "\\s\)") (backward-list 1))
   (t (self-insert-command (or arg 1)))))

<key>, с которой вы связываете эту команду, будет переключать открывающую и закрывающую фигурную скобку, если точка находится до или после нее, в противном случае вставьте <key> (очень похоже на "%" в vi)

Iтакже свяжите C-<key> с forward-sexp и C-S-<key> с backward-sexp, чтобы я мог действительно быстро перемещаться по функциям в файле.

1 голос
/ 25 декабря 2011

Попробуйте mic paren , который показывает соответствующий код в скобках, даже если он находится за пределами текущего экрана.

1 голос
/ 25 декабря 2011

Первое, что может помочь, это знание этой опции, если вы этого еще не сделали: blink-matching-paren-distance. Если sexp очень велик, вам нужно увеличить значение параметра, иначе совпадение с паренами слишком рано прекращается, и при несоответствии наблюдается несоответствие.

Второе, что может помочь, это убедиться, что blink-matching-paren и blink-matching-paren-on-screen не являются nil. Затем, чтобы увидеть начальный разделитель, просто удалите закрывающий разделитель и введите его снова. Когда вы вставите его, первый станет очевидным.

1 голос
/ 25 декабря 2011

backward-sexp - это то, что я использую. привязан к ESC-слева. Тогда ESC-право вернуться туда, где вы были

...