什么是实现代码折叠或org-mode使用的循环类型的最佳方式.在elisp中创建这种行为的最佳解决方案是什么?
编辑:对不起,我不清楚.我想在elisp中编写一些与代码折叠非常相似的东西,或者实际上最像org-mode的层次结构可以扩展.我想知道实现这种影响的最佳方法.我想我听过emacs叠加是一个很好的解决方案,但我不知道.
就折叠而言,我只使用内置的set-selective-display
编辑号2:
谢谢你的答案,但我想我问的是错误的问题,所以让我试着更清楚我想要做什么.我想创建以下内容
当你把你的观点放在一个函数上并调用这个elisp函数时,它将把函数定义放在任何地方(我只想使用find-tag)并在当前缓冲区展开它.我的想法是,如果你必须跳转到不同的缓冲区来读取函数定义,我觉得它的上下文切换到另一个文件.所以我希望它表现得像代码折叠只是它从缓冲区拉入外部代码.这会带来一些问题,因为它无法将代码实际粘贴到缓冲区中,或者如果有人保存它,它将保存拉入的代码.所以我想知道是否有办法在缓冲区内创建一个也不属于缓冲区的区域.我认为这是有道理的.
emacs通常不需要折叠,因为它具有明确实现人们在折叠代码时手动执行的操作的工具.
通过简单的增量搜索,大多数人都取得了很好 看到某处提到的"foo"?键入C-sfoo
,找到定义,按回车键,读取它,然后按C-x C-x返回到原来的位置.简单而且非常有用.
大多数模式支持imenu. M-ximenu
将允许您按名称跳转到函数定义(等).您还可以将其绑定到鼠标单击以获取功能菜单(或将其添加到菜单栏;有关详细信息,请参阅信息页面).它为哪个功能模式提供数据,它可以让你看到你当前在模式行中的哪个功能.(为什么你的功能这么长?)
还有speedbar,它以图形方式显示imenu信息(和其他内容).
如果你想得到你的文件的概述,试试M-xoccur
".给定一个正则表达式,它将创建一个新的缓冲区,当前缓冲区中的每个匹配.你可以搜索"(defun"以获得当前文件的功能概述单击结果将移动到文件中的该位置.
所以无论如何,想想你真正想要实现的目标,而Emacs可能会实现这一目标.不要与不完美的工具对抗,让你不断折叠和展开东西.
hide-show mode(hs-minor-mode
),默认键绑定C-c @ C-M-h
触发fold (hs-hide-all
)
皮肤猫的另一种方法:
碰巧的是,您不需要任何包或额外配置.只需转到任何源文件,输入即可
M-1 Cx $和魔法发生了!
像往常一样,它是白色魔法:Cx $会带回你的代码.
我们可以使用Emacs的帮助系统来发现正在发生的事情:Ch k Cx $告诉我们上面的组合键是调用 set-selective-display,这个函数接受一个数字参数(M-1前缀传递1作为值该参数的一部分,并且,毫不奇怪,将变量selective-display设置为该参数的值.
来自次要的emacs魔法博客
只是为了完整性:M-3 Cx $将显示更深层次的嵌套代码,依此类推.
FWIW我今天基于smth做了一个小帮手.在这里找到,以便F5根据当前光标位置切换代码折叠:
(global-set-key (kbd "") 'set-selective-display-dlw) (defun set-selective-display-dlw (&optional level) "Fold text indented same of more than the cursor. If level is set, set the indent level to LEVEL. If 'selective-display' is already set to LEVEL, clicking F5 again will unset 'selective-display' by setting it to 0." (interactive "P") (if (eq selective-display (1+ (current-column))) (set-selective-display 0) (set-selective-display (or level (1+ (current-column))))))
我使用outline次模式来折叠我的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) )
您还可以使用CEDET和init文件中的以下代码来获取代码折叠:
(global-semantic-folding-mode t)
在评估此代码后,小三角形将出现在fringle区域中,因此您可以使用它折叠和展开代码.这种方法更精确,因为它使用从源代码中提取的语法信息
hs-minor-mode工作得很漂亮.
当与fold-dwim搭配时,它的效果会更加美妙(我的意思是这样做).然后是fold-dwim-org,它为代码折叠提供类似于键绑定的组织模式!两者都可以通过果酱安装(我认为是elpa).
显然没有完美的解决方案,但我认为最好的解决方案是:
http://www.emacswiki.org/emacs/FoldingMode
vimish-fold
也是一个很好的解决方案。
https://github.com/mrkkrp/vimish-fold。
从首页:
这个软件包可以像Vim一样执行文本折叠。它具有以下功能:
折叠活动区域;
良好的视觉反馈:很明显,文本的哪一部分被折叠;
默认情况下是持久性的:关闭文件时,褶皱不会消失;
持久性可以很好地扩展,您可以处理数百个具有很多折痕的文件,而不会产生不利影响;
它不会破坏缩进或其他东西;
折痕可以很容易地从折起状态切换到展开和返回;
现有折页之间的快速导航;
您可以使用鼠标展开折叠(对初学者有益,不仅对他们而言);
对于avy包的粉丝:您可以使用avy折叠带有最少按键次数的文本!
使用出色的软件,use-package
我在配置中使用以下代码片段安装并激活了它:
(use-package vimish-fold :ensure t :config (vimish-fold-global-mode t))