在Emacs中匹配括号

时间:2011-12-25 00:59:06

标签: emacs lisp

在GNU Emacs中,有一项功能可以在代码中突出显示相同颜色的匹配括号。

然而,当括号所包含的代码非常长时,有几个嵌套的if用于等等,那么这个功能并不真正有用,因为其中一个括号将不可见。

说我有以下内容,

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

 } 

如果我的光标位于}大括号上,我希望有一些功能可以让我跳过/看到{大括号,然后,如果满意,请回到{{ 1}}支持任何未来的编码。

这在Emacs中可行吗?

5 个答案:

答案 0 :(得分:28)

这实际上是一个非常标准的绑定:C-M-fC-M-b默认返回和转发。在大多数模式中,C-M-f会将您带到匹配的大括号,而C-M-b会将您带回到匹配的大括号。这也适用于引号之类的东西,几乎相同。

如果您已使用C-fC-b进行导航,则很容易记住这些绑定。 (如果你不这样做,你应该这样做。)他们就像一个被表达式移动的角色向前和向后移动(这取决于模式)。

答案 1 :(得分:1)

back-sexp是我使用的。绑定到ESC-left。然后ESC-right回到你原来的位置

答案 2 :(得分:1)

如果您还没有:blink-matching-paren-distance,那么可能有用的第一件事就是了解此选项。如果sexp非常大,则需要增加选项值,否则paren匹配会过早放弃,并且在没有不匹配时显示不匹配。

第二件事可以帮助确保blink-matching-parenblink-matching-paren-on-screen都是非nil。然后,要查看开始分隔符,只需删除结束分隔符,然后再次键入它。当你插入它时,开头就会显而易见。

答案 3 :(得分:1)

尝试显示匹配的括号代码的mic paren,即使在当前屏幕外找到也是如此。

答案 4 :(得分:1)

(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的“%”)

我还将C-<key>绑定到forward-sexp,将C-S-<key>绑定到backward-sexp,这样我就可以快速浏览文件中的函数。