题
什么是最好的方式来实现什么样的代码折叠式或类型的自行车,组织模式的用途。什么是最好的解决方案在工作基本是在封闭的情况下进行创造这种类型的行为?
编辑:对不起,我并不清楚。我想要程序的东西在工作基本是在封闭的情况下进行,并事情非常类似于代码折叠,或者实际上最喜欢的组织模式的层次结构,可以扩大。我想知道的最好的方式来实现这一影响。我想我有听说过emacs的重叠是一个很好的解决方案,但我不知道。
尽折叠我只是使用的系统设置的选择性-显示
编辑2号:
谢谢你的答案,但我认为我问错了问题所以让我尝试将更清楚什么我想要做的。我想创建的以下
当你把你的一点上的一个函数,并称这个工作基本是在封闭的情况下进行的功能,它将把功能定义无论它是(我想到的只是使用找到标记为这一)和展现它在目前的缓冲器。这个想法是如果你有跳跃到一个不同的缓冲器阅读的功能定义我觉得其背景下切换到另一个文件。所以我想表现得像码的只有折叠它拉在代码的外部从缓冲区。这提出了一些问题,因为它可能不实际上贴上编码进入缓冲区,或者如果保存人它将拯救拉代码。所以我想知道是否有一种方法,以创建一个区域内的一个缓冲器,也不一部分的缓冲区。我想这是有道理的。
解决方案
折叠通常与emacs的不必要的,因为它具有显式实现人折叠代码时手动执行的操作的工具。
大多数人都用简单的增量搜索很好的成功。见某处提到的“富”?键入<大骨节病> C-S 骨节病> foo
,查找定义,按回车键,读它,然后按<大骨节病> C-X 骨节病> C-X 骨节病>回到原来的位置。简单和非常有用的。
大多数模式支持的 i菜单。 M-X imenu
将让你跳转到函数的定义(等)以名称。你也可以把它绑定到一个鼠标点击来获得功能的菜单(或将其添加到菜单栏,看到信息页有详细说明)。它是为功能型数据,这将让你看到哪个函数是在当前模式行内。 (为什么这么久你的功能有关系吗?)
还有 speedbar ,其中显示信息i菜单(和其他东西)图形。
如果你想获得你的文件的概述,请尝试<大骨节病>的Mx 骨节病> occur
“给定一个正则表达式,它会创建与当前缓冲区每个匹配新的缓冲区,你可以搜索”( defun定义”来获得当前文件实现功能的概述。点击该结果将你移动到文件中的那个位置。
所以无论如何,想想你真正要实现,和Emacs可能实现了。不要用不完善的工具,让你折不断展开的东西战斗。
其他提示
隐藏式显示模式(hs-minor-mode
)使用默认键绑定C-c @ C-M-h
触发折叠(hs-hide-all
)
对皮肤的猫的另一种方法:
碰巧,你不需要任何包装或额外的配置 那。只要到任何源文件,类型
<强> M-1 C-X $ 并魔法发生!
像往常一样,它的白魔法: C-X $ 将带给你的代码后面
我们可以使用Emacs的帮助系统,发现这是怎么回事:C-H K C的-X $ 告诉我们,以上组合键调用 设置选择性显示下,带一个数值参数的函数 (在M-1的前缀通过1作为参数的值),并且 勿庸置疑,设置变量选择性显示,它的值 这样的说法。
只是为了完整性:的 M-3 C-X $ 强>将显示更深的嵌套代码等
FWIW我今天做了一个小小的帮手基于不便。发现 rel="noreferrer">使得F5切换代码基于当前光标位置折叠:
(global-set-key (kbd "<f5>") '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))))))
我使用的大纲小的模式折叠我蟒蛇的代码。而不是需要的地方{{{和}}}如在折模式,它使用那里的区块定义。
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-次要模式工作很漂亮。
在与折叠DWIM(做什么我的意思)配对它的工作原理更漂亮。再有就是折叠式DWIM-组织,它提供了组织模式就像键绑定代码折叠!两者都可以通过果酱安装(我认为ELPA)。
显然没有完美的解决方案,但我认为最好的一个是这样的:
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))
emacs的带有HS-次要模式其中fascilitates平衡表达式之间代码折叠 http://www.emacswiki.org/emacs/HideShow
我相信,你对你的“项目”的比较折叠不太好,因为折叠是要改变外观,同时保持缓冲区内容不变(文字)。您的项目将涉及显示额外的文本,同时保持缓冲区内容不变,AFAIU。所以。它不是可实现的作为文本插入和折叠的组合物(然后,将缓存器内容会改变)。
但也许,它确实有可能使用相同的机制折叠与实现 - “覆盖” ......考虑“前串”和“后弦”的叠加特性;也许,你可以把你的函数定义为属于该点处的零长度覆盖这些字符串。看概述标志区域一>函数来看看如何叠加在轮廓模式被使用。
如果您使用hs-minor-mode
,这可能是一个好主意,还设定了更为方便快捷,e.g:
(eval-after-load 'hideshow
'(progn
(global-set-key (kbd "C-+") 'hs-toggle-hiding)))
使用从 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-u
也不M-4
业务成为有用的。