如何实现代码折叠Emacs中的作用?如何实现代码折叠Emacs中的作用?(How to achiev

2019-05-16 21:23发布

请告诉我,以实现像代码折叠的最好方式,或骑自行车的是组织模式的使用类型。 什么是在elisp的创建这种类型的行为最好的解决办法?

编辑:对不起,我并不清楚。 我想程序elisp的东西做的东西非常相似,代码折叠,或实际上最喜欢的组织模式与可扩展的层次结构。 我想知道实现这一影响的最佳途径。 我想我已经听说过Emacs的覆盖是一个很好的解决方案,但我不知道。

至于折叠我只是使用内置集合选择性显示

编辑号2:

感谢您的答案,但我想我问错了问题,所以让我尽量在我所试图做的更加清晰。 我想创建以下

当你把你的点上的功能和调用这个函数的elisp它会把不管它是函数的定义(我想只是使用find标签这个的),并在当前缓冲区展开。 我们的想法是,如果你要跳转到不同的缓冲区读取功能定义我觉得它的上下文切换到另一个文件。 所以,我想它表现得像代码只折叠它拉在代码缓冲外部。 这带来了一些问题,因为它不能实际上可以将代码粘贴到缓冲区或者是有人将它保存它会保存在代码中拉出。 所以我想知道如果有一种方式来创建一个缓冲区,也没有缓冲的部分内的区域。 我觉得有道理。

Answer 1:

折叠通常使用Emacs是不必要的,因为它明确地贯彻以人折叠代码时手动执行的操作工具。

大多数人都用简单的增量搜索很好的成功。 见某处提到的“富”? 输入Cs foo ,查找定义,按回车键,读它,然后按CX CX回到原来的位置。 简单的和非常有用的。

大多数模式都支持i菜单MX imenu会让你跳转到一个函数的定义(等)的名字。 你也可以把它绑定到一个鼠标点击来获得功能的菜单(或将其添加到菜单栏,看到信息页有详细说明)。 它是为功能型数据,这将让你看到哪个函数是在当前模式行内。 (为什么这么久你的功能有关系吗?)

还有speedbar,其中显示信息i菜单(和其他东西)图形。

如果你希望得到您的文件的概述,尝试的Mx occur ”给定一个正则表达式,它会创建与当前缓冲区每个匹配新的缓冲区,你可以搜索‘(defun定义’来获得的功能的概述当前文件的工具。点击该结果将你移动到文件中的那个位置。

所以无论如何,想想你真正想实现的,和Emacs可能实现了。 不要用不完善的工具,让你折不断展开的东西战斗。



Answer 2:

隐藏式显示模式( hs-minor-mode )具有缺省键绑定Cc @ CMh触发折叠( hs-hide-all



Answer 3:

另一种方法对皮肤的猫:

碰巧,你不需要对任何包装或额外的配置。 只要到任何的源文件,类型

M-1 CX $和魔术发生!

像往常一样,它的白魔法:CX $将带给你的代码了。

我们可以使用Emacs的帮助系统,发现这是怎么回事:章ķCX $告诉我们,以上组合键调用set选择性显示 ,带一个数字参数(M-1字头经过1作为值的函数这样的说法的)和,勿庸置疑,设置变量选择性显示该参数的值。

从轻微的emacs巫术博客

只是为了完整性:M-3 CX $将显示更深层次的嵌套代码等。

FWIW我今天做了一个小小的帮手基于不便。 发现这里以便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))))))


Answer 4:

我使用大纲次要模式折我的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)
)


Answer 5:

您也可以通过代码使用与CEDET按照init文件代码折叠:

(global-semantic-folding-mode t)

这段代码的评估后,小三角形将出现在fringle区域,所以你将能够折叠与使用它的发展代码。 该方法是更精确,因为它使用句法信息,从源代码中提取



Answer 6:

HS-次要模式精美的作品。

当折叠DWIM(做什么我的意思)配对它的工作原理更漂亮。 再有就是折叠式DWIM-组织,它提供了组织模式就像键绑定代码折叠! 两者都可以通过果酱安装(我认为ELPA)。



Answer 7:

显然,没有完美的解决方案,但我认为最好的一个是这样的:

http://www.emacswiki.org/emacs/FoldingMode



Answer 8:

vimish-fold也是一个很好的和简单的解决方案。

https://github.com/mrkkrp/vimish-fold 。

从主页:

这是为了在像Vim的执行文本折叠的包装。 它具有以下特点:

  • 有源区的折叠;
  • 良好的视觉反馈:很显然这部分文字折;
  • 持久性默认情况下:当您关闭文件,你的皱褶不会消失;
  • 持久性很好地进行扩展,你可以在数百有很多无不良影响的褶皱文件的工作;
  • 它不会破坏缩进或东西;
  • 褶皱可以从折叠状态到未折叠和背部很容易进行切换;
  • 现有的褶皱之间的快速导航;
  • 你可以使用鼠标来展开倍(仅适用于他们适合初学者,而不是);
  • 对于阿维包的球迷:你可以使用阿维与击键的最少数量的折叠的文字!

使用优秀use-package安装和使用这个片段在我的配置激活它:

(use-package vimish-fold
  :ensure t
  :config (vimish-fold-global-mode t))


Answer 9:

emacs的带有HS-次要模式其中fascilitates代码平衡表达式之间折叠http://www.emacswiki.org/emacs/HideShow



Answer 10:

我相信,你对你的“项目”的比较折叠不太好,因为折叠是要改变外观,同时保持缓冲区内容不变(文字)。 您的项目将涉及显示额外的文本,同时保持缓冲区内容不变,AFAIU。 所以。 它不是可实现的作为文本插入和折叠的组合物(然后,将缓存器内容会改变)。

但也许,它确实有可能使用相同的机制折叠与实现- “覆盖” ......考虑“前串”和“后弦” 覆盖性能 ; 也许,你可以把你的函数定义为属于该点处的零长度覆盖这些字符串。 看外形的标志区功能叠加看到如何在大纲模式下使用。



Answer 11:

如果使用hs-minor-mode ,它可能是一个好主意,还设定了更为方便快捷,如:

(eval-after-load 'hideshow
 '(progn
   (global-set-key (kbd "C-+") 'hs-toggle-hiding)))


Answer 12:

从灵感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)))

瞧, Cx $突然即使没有任何有用成了Cu也不是M-4的业务。



文章来源: How to achieve code folding effects in Emacs?