为啥emacs中没有代码折叠?
Posted
技术标签:
【中文标题】为啥emacs中没有代码折叠?【英文标题】:Why is there no code-folding in emacs?为什么emacs中没有代码折叠? 【发布时间】:2011-01-24 20:53:49 【问题描述】:关于如何在 emacs 中进行代码折叠有几个关于 SO 的问题,而不必在 cmets 中添加任何特殊字符,例如“标记”。有人说“没有完美的解决方案”。 似乎可以通过解析正在编写的程序的源代码并查找匹配的括号或括号来完成,或者基于缩进来完成。您还可以使用使用不同方法的脚本组合。 那么为什么人们普遍认为在 emac 中没有“完美”和直接的方法来获得代码折叠呢? emacs 或其架构中是否有某些东西使其难以编程?如果这很容易,那么在聪明人使用 emacs 这么多年之后,您会认为有人会编写它。
【问题讨论】:
因为“真正的程序员”不需要代码折叠! 其实很简单,大家自己写吧。 @fuzzy “真正的程序员”使用磁化针和稳定的手。 (xkcd.com/378) lisp 诅咒的一个很好的例子。 (winestockwebdesign.com/Essays/Lisp_Curse.html) @JarrodRoberson - 当然应该是“真正的程序员”使用narrow-to-region
;)
【参考方案1】:
您应该查看 CEDET。如果您从 IDE 切换到 Emacs,它可以很好地进行代码折叠,以及您可能正在寻找的许多其他花哨的功能。
http://cedet.sourceforge.net/
具体来说,寻找`global-semantic-tag-folding-mode'
【讨论】:
【参考方案2】:您不需要任何额外的东西,只需为要折叠的文件类型启用大纲-次要模式。
【讨论】:
我原以为 outline-minor-mode 将是公认的答案,而不是 cedet,因为它是内置于 emacs 中的。 (mytechrants.wordpress.com/2009/01/05/…) 非常酷 - 我不知道这个。我正在寻找一种在 markdown-mode ala org-mode 中折叠标题的方法。 大纲模式用于标题,不一定适合代码编辑:通常,代码块是打开和关闭的,块之间可能会有一些东西。这不是您可以通过基于标题的解决方案实现的。 我喜欢将它与outshine.el
包结合使用。虽然到目前为止我只将它用于我的.emacs
。【参考方案3】:
您应该将 Hideshow (hs-minor-mode
) 与 fold-dwim.el
结合使用。它完全按照您的建议进行 - 查找匹配的大括号/括号,并且可以设置为退回到缩进。
对于大多数常用语言,有一个强大的折叠解决方案,如果没有,所有折叠包都是高度可定制的。事实上,唯一的缺点是折叠方法的激增(fold-dwim
对此有很大帮助);我曾经认为,因为没有人能指出一个明确的解决方案,折叠是困难的或不可能的——事实上,恰恰相反。您只需进行一些试验,看看哪种方法最适合您。
我使用过folding.el
(例如,在我的.emacs
中对内容进行分组)、outline-minor-mode
,现在还有 Hideshow。有可能它们都不能完全按照您想要的方式工作(例如,您可能需要设置大纲正则表达式,或为folding.el
定义折叠标记),但事实证明这很容易。默认的键绑定可能有点巴洛克式,但这可以通过fold-dwim
和/或hideshow-org
进行补救(强烈推荐用于 Hideshow,参见 Emacswiki hideshow 页面;您还可以通过一些其他折叠模式模仿 hideshow-org
的行为又快又脏的 elisp 和 fold-dwim
)。一旦你确定了你喜欢的设置,只需通过钩子或缓冲区局部变量自动打开它,然后看你的代码折叠起来:)(见下文,注意页边空白处可点击的+
)。
alt text http://img198.imageshack.us/img198/4029/screenshot1oc.png
【讨论】:
AFAIK,出于某种原因,即使对于 python 和 lua 等流行语言,也没有完美的 hs-minor-mode 设置。与 vim 等其他编辑器相比,缩进(= 选择性显示)的回退有点过于原始。我是 emacs 用户多年,一直在使用您的所有建议,但我同意原始发帖人。 hideshowvis.el也值得一看。hs-minor-mode
和 vimrc-mode
与vim
的标准折叠、
、
一起工作得很好。【参考方案4】:
我使用folding-mode 已经有一段时间了。使用自动插入模板和缩写,它对我来说非常适合一些漂亮的代码块。
能够制作折叠的缓冲区(用于打印/发送电子邮件)一直是我的愿望。我的一些折叠标签用于安全/密码隐藏。
【讨论】:
【参考方案5】:但事实上,Emacs 有多种解决方案;我在http://en.wikipedia.org/w/index.php?title=Code_folding&oldid=375300945#cite_note-2 列出了其中一些(我碰巧遇到的)。
虽然,我缺少一些东西:在某些情况下,我想结合几种机制:例如,对于降价,我想使用基于轮廓的折叠(对于部分)和基于缩进折叠(用于引用、代码块等)——为了不用为 Markdown 实现一个完整的解析器。
他们在这里:
Emacs 中基于令牌的折叠
folding minor mode 支持 Emacs 中基于令牌的折叠。
Emacs 中基于缩进的折叠
可以使用 Emacs 中的 set-selective-display
函数根据缩进级别隐藏行,如 Universal code folding 注释中所建议的那样。
Emacs 中依赖于语法的折叠
Emacs 中依赖于语法的折叠受以下支持:
outline 和 allout 模式 用于特殊的专用“大纲”-语法;
通过 hideshow 次要模式用于某些编程语言;
还有,
由semantic-tag-folding 次要模式和senator-fold-tag
命令
syntaxes supported by semantic,
以及doc-mode 用于 JavaDoc 或 Doxygen cmets,
通过
TeX-fold-mode
sgml-fold-element
命令,
nxml-outln图书馆
在相应的语言特定模式下,以及可能在特定语法的其他模式下。
几种折叠机制由 fold-dwim接口。
另见http://www.emacswiki.org/emacs/CategoryHideStuff。
在 Emacs 中折叠用户选择的区域
Emacs 中用户选择区域的折叠是通过hide-region-hide 命令实现的。
【讨论】:
【参考方案6】:是的,最后代码折叠出现在 emacs 中。在 melpa.org 包库中尝试 yafolding。
【讨论】:
【参考方案7】:我知道这有点旧,但对我来说 origami.el 开箱即用非常好。
【讨论】:
以上是关于为啥emacs中没有代码折叠?的主要内容,如果未能解决你的问题,请参考以下文章