Emacs Org-mode 可否有方法隐藏 :PROPERTIES: drawer(HELP WANTED!)

如图所示

在使用org-noter creat-skeleton 后满屏的PROPERTIES, 谷歌未找到方法, 特地来论坛求助各位大佬

可以用 overlay 隐藏

(save-excursion
  (goto-char (point-min))
  (while (re-search-forward "^ +:PROPERTIES:\n\\(.+\n\\)+ +:END:\n" nil t)
    (with-silent-modifications
      (overlay-put (make-overlay (match-beginning 0) (match-end 0)) 'display ""))))

谢谢大佬的帮助, 我不是太懂overlay, 可否告知上述代码如何使用?

M-x eval-expression, 然后粘贴上面的代码,回车。

执行成功后并无变化呀

上面的代码只是临时生效,要想每次打开时都隐藏,可以加到hook里。

(defun org-hide-properties ()
  "Hide org headline's properties using overlay."
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward
            "^ +:PROPERTIES:\n\\( +:.+?:.+\n\\)+ +:END:\n" nil t)
      (with-silent-modifications
        (overlay-put (make-overlay
                      (match-beginning 0) (match-end 0))
                     'display "")))))

(add-hook 'org-mode-hook #'org-hide-properties)

在 stackoverflow 找到一个帖子,亲测可用: https://stackoverflow.com/questions/17478260/completely-hide-the-properties-drawer-in-org-mode

我这也是 org-noter 的笔记

执行后,什么信息都没有?也没报错?

啊 我昨天也试了的 可是不行诶 我是org 9.3 是因为这个原因吗 GNU Emacs 27.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.22, cairo version 1.17.3) of 2020-08-29

返回了一个nil

Strange, It’s impossible.

你把光标放在开头,然后 eval-expression

(re-search-forward
            "^ +:PROPERTIES:\n\\( +:.+?:.+\n\\)+ +:END:\n" nil t)

看能不能搜索到properties?

我就把 org-cycle-hide-drawers 这个函数的定义 eval 了一下,然后重新打开文件,按 shift-tab (org-shifttab)隐藏再展开就会发现 properties 被隐藏了。但是只是定义了一个函数而已……咋起作用的我其实没太明白。

附我的环境: org-mode 9.4, emacs 26.1

仍然返回为nil诶

正则匹配是没有问题的,应该是你操作出了什么问题。

我复制粘贴后,以hook形式可是重启后还是无效诶

那我就不知道,最后再试一下把 with-silent-mo… 去掉的代码:

(defun org-hide-properties ()
  "Hide org headline's properties using overlay."
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward
            "^ +:PROPERTIES:\n\\( +:.+?:.*\n\\)+ +:END:\n" nil t)
      (overlay-put (make-overlay
                    (match-beginning 0) (match-end 0))
                   'display ""))))

(add-hook 'org-mode-hook #'org-hide-properties)

正则匹配不成功,我不能理解。你把配置放在了加载路径里了吗,eval 配置了吗,kill掉buffer再重新打开文档了吗?

(while (re-search-forward
          "^:PROPERTIES:\n\\(:.*:.*\n\\)+:END:" nil t)

换成这个后能够正常工作了,谢谢大佬

我明白原因了,你应该用了 org-indent-mode .

改一下,无论是否开启 org-indent-mode 都兼容的代码:

(defun org-hide-properties ()
  "Hide org headline's properties using overlay."
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward
            "^ *:PROPERTIES:\n\\( *:.+?:.*\n\\)+ *:END:\n" nil t)
      (overlay-put (make-overlay
                    (match-beginning 0) (match-end 0))
                   'display ""))))

(add-hook 'org-mode-hook #'org-hide-properties)
3赞