【问题标题】:How to easily outline arbitrary (data) structures in text?如何在文本中轻松勾勒出任意(数据)结构?
【发布时间】:2013-05-04 23:17:55
【问题描述】:

所以我遇到了this

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

this:

root --+---> child1
       +---> child2 --+--> subchild1
       |              +--> subchild2
       +---> child3

并且想知道使用什么工具(编辑器包/捆绑包等)可以轻松/以编程方式概述和编辑此类结构。

PS:我更喜欢 emacs,但为了完整起见,如果答案中包含其他编辑器/工具,我将不胜感激。

【问题讨论】:

    标签: emacs editor structure draw


    【解决方案1】:

    第二个例子显然更复杂,我不打算解决它,但大纲模式/次要模式将很好地用于基于缩进的树,所以这里有一个方法,带有大纲基于任意重复前缀字符串的标题(本示例中为四个空格,但可根据需要进行配置)。

    如果您加载/评估下面的代码,然后加载数据文件(包括局部变量),那么您可以使用 SHIFT+TAB 隐藏/显示分支并使用提升/降级分支SHIFT+LEFTSHIFT+RIGHT(光标键)。当然,所有其他 outline-minor-mode 功能也可用。

    mysite/
        manage.py
        mysite/
            __init__.py
            settings.py
                urls.py
            wsgi.py
    
    ;;; Local Variables:
    ;;; my-outline-prefix: "    "
    ;;; eval: (my-outline-minor-mode 1)
    ;;; End:
    
    (global-set-key (kbd "<S-tab>") 'outline-toggle-children)
    (global-set-key (kbd "<S-left>") 'outline-promote)
    (global-set-key (kbd "<S-right>") 'outline-demote)
    
    (defvar my-outline-prefix "    "
      "Prefix string denoting a single outline level for `my-outline-minor-mode'.")
    
    (defvar my-outline-max-level 20
      "Maximum number of levels for `my-outline-minor-mode'.")
    
    (define-minor-mode my-outline-minor-mode
      "Outline levels based on repetitions of `my-outline-prefix'."
      0 nil nil
      (outline-minor-mode 1)
      (setq-local outline-level 'my-outline-level)
      (setq-local outline-regexp (format "\\(%s\\)*" 
                                         (regexp-quote my-outline-prefix)))
      (setq outline-heading-alist '())
      (let ((level 0)
            (level-prefix ""))
        (while (< level my-outline-max-level)
          (setq outline-heading-alist (cons (cons level-prefix level) 
                                            outline-heading-alist)
                level (1+ level)
                level-prefix (concat level-prefix my-outline-prefix)))
        (setq outline-heading-alist (nreverse outline-heading-alist))))
    
    (defun my-outline-level ()
      "Counts how many times `my-outline-prefix' appears at the start of the line."
      (let* ((data (match-data))
             (start (car data))
             (end (cadr data))
             (indent (- end start)))
        (/ indent (length my-outline-prefix))))
    

    【讨论】:

    • 您能否详细说明“包含局部变量”?...关于第二个示例的任何其他词或提示?
    • 数据文件中包含一个局部变量列表,正如我在答案中所示。见C-h i g (emacs) File Variables RET。但由于我已将缩进值默认设置为四个空格,因此您也可以只加载数据文件并在此实例中键入 M-x my-outline-minor-mode
    • Maybe 大纲模式仍然可以在第二个示例中工作,但我怀疑仅用于扩展和折叠现有结构。其他人可能有更好的主意。
    • 展开和折叠不是这里的关键
    • 如果你真的需要这个,一个选择是使用一个通用的树操作库,然后研究如何将它插入到这种格式中。您希望将文本解析为树,然后根据每个树操作重新生成文本输出。 Tree Mode 很可能提供了第一部分的难题,但毫无疑问,第二部分将涉及大量工作。
    【解决方案2】:

    至于第二个例子,你可以使用 Emacs 从一个节点跳转到另一个节点 M-x search-forward-regexp RET \(-*\)\(\+\)\(-+&gt;\)

    而不是使用窄到区域之类的东西。除了缩小 Emacs 之外,还提供了隐藏内容的命令。

    使用一些基于此节点检测的 lisp,您可以在列表中读取找到的数据等。

    【讨论】:

    • 您会注意到尾随连字符的数量不同,因此它更像-*\+-+&gt;。当然,谁知道那是实际生成的输出,还是某人用于紧凑树表示的 ascii 艺术。
    猜你喜欢
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多