为什么emacs中没有代码折叠?

Pie*_*rre 26 emacs folding

关于如何在emacs中获取代码折叠有几个问题,而不必在评论中添加任何特殊字符,如"标记".有人说"没有完美的解决方案".
似乎可以通过解析正在编写的程序的源来查找匹配的括号或括号,或者基于缩进来完成它.您还可以使用使用不同方法的脚本组合.
那么为什么人们普遍认为没有"完美"和直接的方式在emac中获得代码折叠?emacs或其体系结构中是否存在某些难以编程的内容?如果这很容易,经过这么多年聪明的人使用emacs你会认为有人会写它.

Leo*_*yev 24

你应该使用Hideshow(hs-minor-mode)和fold-dwim.el.它完全按照你的建议 - 寻找匹配的大括号/ parens,并且可以设置为缩减缩进.

对于大多数常见语言,有一个强大的折叠解决方案,如果没有,所有折叠包都是高度可定制的.事实上,唯一的缺点是折叠方法的扩散(对此有fold-dwim很大帮助); 我曾经认为,因为没有人能指出我一个明确的解决方案,折叠是艰难的或不可能的 - 实际上,事实恰恰相反.你只需要做一点实验,看看什么最适合你.

我曾经使用过folding.el(比如把我的东西分组.emacs),outline-minor-mode现在就是Hideshow.有一些机会,它们都不会完全按照您想要的方式工作(例如,您可能需要设置轮廓正则表达式,或定义折叠标记folding.el),但结果很简单.默认的键绑定可能有点巴洛克式,但这可以通过fold-dwim和/或hideshow-org(强烈推荐用于Hideshow,参见Emacswiki隐藏页面;你也可以hideshow-org使用一些快速和脏的elisp 来模仿其他折叠模式的行为fold-dwim)来解决.一旦你弄清楚你喜欢的设置,只需通过钩子或缓冲区局部变量自动打开它,并观察你的代码折叠:)(见下文,注意+边缘的可点击的).

alt text http://img198.imageshack.us/img198/4029/screenshot1oc.png

  • AFAIK,即使对于python和lua等流行语言也没有完美的hs-minor-mode设置.与其他编辑器(如vim)相比,缩进(= selective-display)的回退也有点过于原始.我是emacs用户多年,一直在使用你的所有建议,但我同意原始海报. (2认同)

rry*_*yan 11

你应该看看CEDET.它可以很好地进行代码折叠,以及许多其他花哨的功能,如果你从IDE切换到Emacs,你可能正在寻找它.

http://cedet.sourceforge.net/

具体来说,寻找`global-semantic-tag-folding-mode'


Ham*_*aya 8

您不需要任何额外的东西,只需为要折叠的文件类型启用outline-minor-mode.

  • 我认为大纲 - 次要模式将是接受的答案,而不是cedet,因为它内置了emacs.(http://mytechrants.wordpress.com/2009/01/05/emacs-tip-of-the-day-collapsing-functions/) (2认同)

imz*_*hev 5

但事实上,Emacs 有多种解决方案;我在http://en.wikipedia.org/w/index.php?title=Code_folding&oldid=375300945#cite_note-2列出了其中一些(我碰巧遇到的)。

不过,我遗漏了一些东西:在某些情况下,我想结合几种机制:例如,对于降价,我想使用基于轮廓的折叠(对于部分)和基于缩进的折叠(对于引用、代码块等)——这样就不用为 Markdown 实现完整的解析器了。

他们来了:

Emacs 中基于标记的折叠

Emacs 中基于标记的折叠是通过折叠次要模式实现的。

Emacs 中基于缩进的折叠

人们可以使用set-selective-displayEmacs 中的函数根据缩进级别隐藏行,如通用代码折叠注释中所建议的那样。

Emacs 中依赖于语法的折叠

Emacs 中依赖于语法的折叠由以下各项支持:

Fold-dwim接口统一了多种折叠机制 。

另请参阅http://www.emacswiki.org/emacs/CategoryHideStuff

在 Emacs 中折叠用户选择的区域

Emacs 中用户选择区域的折叠是通过hide-region-hide命令实现的。