Emacs中匹配括号

23
在GNU Emacs中,有一个功能可以用相同的颜色突出显示代码中匹配的括号。
然而,当括号所包含的代码非常长且嵌套多层if,for等语句时,这个功能并不是特别有用,因为其中一个括号将无法被看到。
假设我有以下代码:
for(int i=0; i< N; ++i)
 {
  /*Long code*/

 } 
如果我的光标在 } 括号上,我希望有一些功能可以让我跳转/查看 { 括号,然后,如果满意,返回到 } 括号以进行未来的编码。在Emacs中能实现吗?

请参见https://dev59.com/Qmkw5IYBdhLWcg3wg6yg。 - Brian Burns
5个回答

35

这实际上是一个非常标准的绑定:默认情况下,C-M-fC-M-b用于前后移动。在大多数模式下,C-M-f会将您带到匹配的括号处,而C-M-b则会将您带回匹配的括号处。对于引号之类的东西,也基本相同。

如果您已经使用C-fC-b进行导航,则这些绑定易于记忆。(如果您还没有使用它们,应该开始使用。)它们就像将向前和向后移动字符变为按表达式移动(取决于模式)一样简单。


我认为如果两个大括号之间有足够的距离,除了显示消息或导航之外,它还应该将屏幕分成两部分(第二部分具有重复缓冲区),并显示两个大括号。 - aartist

2
第一件可能有帮助的事情是了解这个选项,如果你还不知道的话:blink-matching-paren-distance。如果Sexp非常大,则需要增加选项值,否则括号匹配会很快放弃,并在没有不匹配时显示不匹配。
第二个有用的方法是确保blink-matching-parenblink-matching-paren-on-screen都是非nil的。然后,要看到开放定界符,只需删除闭合定界符,然后再次键入即可。插入时,开放式将变得明显。

1

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


3
在我的情况下(在c模式中),这些函数分别绑定到M-C-f和M-C-b。 - Daimrod

1
尝试使用mic paren,即使在当前屏幕之外找到匹配的括号代码也会显示出来。

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,这样我可以非常快速地浏览文件中的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接