如何在Emacs中实现代码折叠效果?

什么是实现类似代码折叠的最佳方式,或者组织模式使用的循环类型。 在elisp中创建这种类型的行为最好的解决方案是什么?

编辑:对不起,我不清楚。 我想在elisp中编写一些与代码折叠非常相似的东西,或者实际上最类似于可以扩展的层次结构的org模式。 我想知道实现这种影响的最佳方法。 我想我听说emacs覆盖是一个很好的解决方案,但我不知道。

就折叠而言,我只是使用内置的set-selective-display

编辑号码2:

谢谢你的回答,但我想我问的是错误的问题,所以让我试着更清楚我想要做什么。 我想创建以下内容

当你把你的观点放在一个函数上,并调用这个elisp函数时,它会把函数定义放在任何地方(我正在考虑为此使用find-tag)并将其展开到当前缓冲区中。 这个想法是,如果你不得不跳转到不同的缓冲区来读取函数定义,我觉得它的上下文切换到另一个文件。 所以我希望它像代码折叠一样行为,只是它从缓冲区拉入外部代码。 这提出了一些问题,因为它不能将代码粘贴到缓冲区中,或者如果有人保存它,它将保存拉入的代码。 所以我想知道是否有办法在缓冲区内创建一个也不是缓冲区的区域。 我认为这是有道理的。


对于emacs来说,折叠通常是不必要的,因为它具有明确实现人们在折叠代码时手动执行的操作的工具。

大多数人通过简单的增量搜索获得了很好的成功 请参阅某处的“foo”? 键入Cs foo ,找到定义,按回车,读取它,然后按Cx Cx返回到您的位置。 简单而且非常有用。

大多数模式支持imenu。 Mx imenu会让你跳转到一个名称的函数定义(等)。 您还可以将它绑定到鼠标单击以获取功能菜单(或将其添加到菜单栏;有关更多详细信息,请参阅“信息”页面)。 它提供了哪些函数模式的数据,这可以让您看到模式行中当前处于哪个函数。 (为什么你的功能这么长,虽然?)

还有speedbar,它以图形方式显示imenu信息(以及其他内容)。

如果你想得到你的文件的概述,请尝试Mx occur “,给定一个正则表达式,它将为当前缓冲区中的每个匹配项创建一个新的缓冲区,你可以搜索”(defun)“来获得当前文件实现,点击结果会将你移动到文件中的那个位置。

无论如何,想想你真正想要达到的目标,Emacs可能会实现它。 不要与不完美的工具作斗争,这些工具会让你不断折叠和展开事物。


隐藏显示模式( hs-minor-mode ),默认键绑定Cc @ CMh触发折叠( hs-hide-all


我使用大纲次要模式折叠我的Python代码。 不需要像折叠模式那样放置{{{和}},它使用块定义的位置。

http://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.html http://www.emacswiki.org/emacs/OutlineMinorMode

我很确定它带有emacs。 然后我将它添加到我的.emacs中

;;======= Code folding =======
(add-hook 'python-mode-hook 'my-python-outline-hook)
; this gets called by outline to deteremine the level. Just use the length of the whitespace
(defun py-outline-level ()
  (let (buffer-invisibility-spec)
    (save-excursion
      (skip-chars-forward "    ")
      (current-column))))
; this get called after python mode is enabled
(defun my-python-outline-hook ()
  ; outline uses this regexp to find headers. I match lines with no indent and indented "class"
  ; and "def" lines.
  (setq outline-regexp "[^ t]|[ t]*(def|class) ")
  ; enable our level computation
  (setq outline-level 'py-outline-level)
  ; do not use their C-c@ prefix, too hard to type. Note this overides some bindings.
  (setq outline-minor-mode-prefix "C-t")
  ; turn on outline mode
  (outline-minor-mode t)
  ; initially hide all but the headers
  ;(hide-body)
  ; make paren matches visible
  (show-paren-mode 1)
)
链接地址: http://www.djcxy.com/p/62173.html

上一篇: How to achieve code folding effects in Emacs?

下一篇: Using Emacs as an IDE