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

149

如何实现类似代码折叠或 org-mode 使用的循环类型?在 elisp 中创建此类行为的最佳解决方案是什么?

编辑:对不起,我的表述不够清晰。我想在 elisp 中编写某些与代码折叠非常相似的程序,更确切地说是与具有可扩展层次结构的 org-mode 最相似的程序。我想知道实现这种效果的最佳方法。我认为我听说过 Emacs 可以使用覆盖层来解决这个问题,但我不确定。

至于折叠,我只是使用内置的 set-selective-display。

第二次编辑:

感谢答案,但我认为我问错了问题,所以让我尝试更清楚地解释我要做什么。我想创建以下内容:

当你将光标放在一个函数上并调用这个elisp函数时,它会从任何位置(我想简单地使用 find-tag)获取函数定义并在当前缓冲区中展开。如果必须跳转到另一个缓冲区来查看函数定义,我觉得这是一种上下文切换到另一个文件。因此,我希望它的行为类似于代码折叠,但它会从缓冲区外部拉入代码。这会带来一些问题,因为它不能实际粘贴代码到缓冲区中,如果有人保存它,它将保存所提取的代码。因此,我想知道是否有办法在缓冲区内创建一个不是缓冲区的区域。我认为这很有意义。


1
你正在寻找一种方法,当你在函数调用中使用点时,它可以跳转到函数定义?就像获取有关elisp函数的帮助将让您跳转到elisp代码一样?我认为如果没有“项目”的概念,您无法做到这一点。例如,您如何知道要跳转到哪个“swap”函数? - Brian Postow
2
参见:https://dev59.com/cXRC5IYBdhLWcg3wMd9S#448724,其中选择性显示被微调以实现一些类似折叠的效果。 - Michael Paulukonis
我建议您删除您的 EDIT NB 2 并为此提出一个新问题。 - Stefan
14个回答

2

2
如果您使用了hs-minor-mode,建议设置更方便的快捷键,例如:
(eval-after-load 'hideshow
 '(progn
   (global-set-key (kbd "C-+") 'hs-toggle-hiding)))

1

einSelbst的回答的启发:

(advice-add 'set-selective-display
            :filter-args (lambda (args)
                           (if (or (car args) selective-display)
                               args
                             (list (1+ (current-column)))))
            '((name . set-selective-display-from-cursor-column)))

瞧,C-x $变得有用了,即使没有任何C-uM-4的操作。


0
如果你正在进行一些 JavaScript 编程,并使用 js2-mode.el,你可以: C-c C-f: 切换隐藏/显示全部 C-c C-e: 隐藏元素 C-c C-s: 显示元素

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