完全隐藏org-mode中的:PROPERTIES:抽屉

30

请问是否可以帮我完全隐藏:PROPERTIES:抽屉,包括标有:PROPERTIES:的那一行。

* TASKS (with deadines)

    ** Next Action [#A] Ask the geniuses how to do this.  :lawlist:
       DEADLINE: <2013-07-04 Thu >
         :PROPERTIES:
         :ToodledoID: 330686790
         :ToodledoFolder: TASKS
         :Hash:     afa88f17317bbe2ce0ce661333cdcfb4
         :END:
       This line is for notes, which appears underneath the properties drawer.

* UNDATED (without deadlines)

    ** Someday [#A] Close but no cigar -- keep trying.  :lawlist:
          :PROPERTIES:
          :ToodledoID: 330686680
          :ToodledoFolder: TASKS
          :Hash:     eb0b8d360b5b1453dd66ed0c5698e135
          :END:
       This line is for notes, which appears underneath the properties drawer.

我在谷歌上搜索并未发现这个功能,因此我猜想需要编写一些特殊的代码来实现这个功能请求。换句话说,我认为这不是一个超级用户的问题,因为需要用一些特殊的代码来创造这个功能。

3个回答

34
下面的答案完全隐藏了从:PROPERTIES::END:之间的所有内容。可以通过评估(org-cycle-hide-drawers 'children)(org-cycle-hide-drawers 'all)来测试,或与其他与轮廓视图循环相关的函数结合使用。在org-mode系列中包含的展开标准函数都可以工作,例如show-allorg-show-subtree等。
(require 'org)

(defun org-cycle-hide-drawers (state)
  "Re-hide all drawers after a visibility state change."
  (when (and (derived-mode-p 'org-mode)
             (not (memq state '(overview folded contents))))
    (save-excursion
      (let* ((globalp (memq state '(contents all)))
             (beg (if globalp
                    (point-min)
                    (point)))
             (end (if globalp
                    (point-max)
                    (if (eq state 'children)
                      (save-excursion
                        (outline-next-heading)
                        (point))
                      (org-end-of-subtree t)))))
        (goto-char beg)
        (while (re-search-forward org-drawer-regexp end t)
          (save-excursion
            (beginning-of-line 1)
            (when (looking-at org-drawer-regexp)
              (let* ((start (1- (match-beginning 0)))
                     (limit
                       (save-excursion
                         (outline-next-heading)
                           (point)))
                     (msg (format
                            (concat
                              "org-cycle-hide-drawers:  "
                              "`:END:`"
                              " line missing at position %s")
                            (1+ start))))
                (if (re-search-forward "^[ \t]*:END:" limit t)
                  (outline-flag-region start (point-at-eol) t)
                  (user-error msg))))))))))

任何对在各种视图之间进行选项卡切换感兴趣的人(包括显示:PROPERTIES:抽屉中内容的用户),可以通过在org-cycle-internal-local上添加一个额外条件(t ;; 默认操作:隐藏子树... 之前进行简单修改。请注意保留HTML标记。
((eq org-cycle-subtree-status 'subtree)
  (org-show-subtree)
  (org-unlogged-message "ALL")
  (setq org-cycle-subtree-status 'all))

截屏 -- 抽屉隐藏:

https://www.lawlist.com/images/org_mode_properties_a.png


截屏 -- 抽屉显示:

https://www.lawlist.com/images/org_mode_properties_b.png


2
顺便把它发送到上游,为什么不这样做呢? - Michaël
1
@apc -- 该答案考虑到用户将使用上面的新函数替换旧内置函数。通过使用与内置函数相同的名称,新函数有效地取代了旧内置函数。以防旧内置函数尚未加载/读取,此答案的第一行强制整个库加载,以便新函数可以取代旧内置函数。 - lawlist
1
感谢这个很棒的功能。关于代码 org-cycle-internal-local,将其放在 cond 块的开头而不是接近结尾的位置,给了我更好的结果。然后,Tab 键在以下四种状态之间循环:1)完全折叠,2)文本+子项,3)2 + 子项文本,4)3 + 抽屉。 - Harshavardhan
1
@Inspired_Blue -- 从你对 org-cycle-hide-drawers 的相关回答(以及与 org-cycle-internal-local 修改有关的附加评论)来看,你需要比评论提供的更多的帮助。这个回答是在2017年撰写的(大约5年前),在那段时间内 org-cycle-internal-local 的代码完全可能已经发生了变化。你最好在 https://emacs.stackexchange.com 上发起一个新问题,这样你就可以得到专门针对你特定用例的关注,并考虑到当前版本的 org-mode - lawlist
1
对于一直关注讨论的人:我在这里交叉链接一个基于以上讨论发起的跟进问题!(https://emacs.stackexchange.com/questions/73558/completely-hide-the-properties-drawer-in-org-mode) @lawlist:感谢您的输入! - Inspired_Blue
显示剩余10条评论

0

现在就算你加了很多额外的编码,也根本不可能实现...

问题是:你怎么才能把它重新显示出来呢?你只会看到“…”吗?


必须有一个简单的解决方案,比如使用“re-search-forward”和从缓冲区顶部到底部的保存回溯来处理每一行以“:PROPERTIES:”开头直到包括“:END:”这个词。然后点击“代码折叠”按钮,使其在前一行下面折叠起来。接着点击“展开所有内容”按钮以显示所有内容,然后再次循环操作。 - lawlist
最好的情况是在第一行的末尾放置一个倒三角形来表示代码折叠。 :) - lawlist
现在存在一个功能齐全的解决方案 -- :) - lawlist
@american-ninja-warrior -- 很抱歉回复晚了。我看到至少还有一个人和你有同样的问题(根据你的问题得到的赞数)。在这个帖子中,被接受的答案包含了一个完整的解决方案,就我所知 -- 我从2013年开始一直在使用那个解决方案至今。 - lawlist

-2

这允许您切换当前所在标题的属性。

(defun org-toggle-properties ()
  ;; toggle visibility of properties in current header if it exists
  (save-excursion
    (when (not (org-at-heading-p))
      (org-previous-visible-heading 1))
    (when (org-header-property-p)
      (let* ((a (re-search-forward "\n\\:" nil t)))
        (if (outline-invisible-p (point))
            (outline-show-entry)
          (org-cycle-hide-drawers 'all))))))

1
问题的要求是寻找一种完全隐藏 :PROPERTIES: 抽屉的方法,包括标有 :PROPERTIES: 的那一行。此外,在 2018 年 09 月 23 日之后克隆的最新版本 org-mode 中不存在函数 org-header-property-p。我也在几个早期版本的 org-mode 中使用了 grep 命令,该函数也不存在。由于缺少组件,我无法测试该函数,因此不知道是否存在其他问题。同时,Google 无法找到 org-header-property-p - lawlist

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