函数(org-heading-components)
和(org-element-property)
生成星数和整数的整数。我想将整个标题存储为变量,然后使用re-search-forward
(或类似的函数)返回到该标题,但我预见到它会出现问题找不到整数。我需要将整个标题存储为变量,因为我经常使用重复标题的todo条目,但其他组件是不同的。
例如,以下todo:
** Active [#A] Ask the geniuses on stackoverflow how to do this. :lawlist:
使用(org-heading-components)
进行评估时,如下所示:
(2 2 "Active" 65 "Ask the geniuses on stackoverflow how to do this." ":lawlist:")
因此,当将其存储为变量并稍后使用re-search-forward
时会出现问题,因为2 2
与**
不同,65
不一样为[#A]
。
(defun lawlist ()
(interactive)
(let* (
(beg (point))
(complete-heading (org-heading-components) ))
* * *
(goto-char (point-min))
(re-search-forward complete-heading nil t) ))
答案 0 :(得分:1)
有一个很棒的组织部分可能适合你:org-id-copy
和
org-id-goto
。它适用于缓冲区和会话的精确度:
org-id-copy
生成一个字符串。您可以将该字符串提供给
org-id-goto
将带您进入该标题。即使你已经
关闭原始缓冲区。即使你重新启动了Emacs。
答案 1 :(得分:1)
您应该能够按如下方式转换输出:
org-odd-levels-only
则适用,但这与输出无关。以下内容将返回缓冲区中显示的标题字符串。它不适用于re-search-forward
,但可以使用search-forward
(它不会转义任何字符)。
(defun zin/search-test ()
(interactive)
(let ((head (org-element-interpret-data (org-element-at-point))))
(message "%s" (format "%s" (car (split-string head "\n"))))))
这不会将其设置为任何变量,您必须将其包装在将设置所需变量的适当函数中。然后使用(search-forward <var> nil t)
进行匹配,如果无法找到它,则不会出错。
答案 2 :(得分:0)
编辑(2013年12月15日):基于变量org-heading-regexp
(在org.el
中定义)及其修改的更新解决方案包括(如果存在)a第二行包含截止日期 - 即lawlist-org-heading-regexp
。该修订版还包括一个漂亮的函数regexp-quote
,它是由@Drew在超级用户上教给我的:https://superuser.com/questions/688781/how-to-highlight-string-and-unhighlight-string-in-buffer-make-overlay?noredirect=1#comment874515_688781 (buffer-substring-no-properties beg end)
用于将字符串设置为变量。
编辑(2013年12月17日):添加了isearch-highlight
和isearch-dehighlight
,并对highlight-regexp
和unhighlight-regexp
进行了评论。使用更复杂的函数移动点时,highlight-regexp
无法可靠地突出显示整个字符串 - 这可能是因为屏幕没有刷新,或者也可能是由其他因素引起的 - 例如,hl-line -mode等) - 放置各种sit-for 0
并未解决问题highlight-regexp
- isearch-highlight
效果更好。
编辑(2014年1月6日):另请参阅此相关主题以获取完整的正则表达式,以匹配从星号到注释末尾的整个待办事项的任何元素:https://stackoverflow.com/a/20960301/2112489
(require 'org)
(defvar lawlist-org-heading-regexp
"^\\(\\*+\\)\\(?: +\\(.*?\\)\\)?[ \t]*\\(\n.*DEADLINE.*$\\)"
"Match headline, plus second line with a deadline.")
(defun example ()
(interactive)
(switch-to-buffer (get-buffer-create "foo"))
(org-mode)
(insert "* Example\n\n")
(insert "** Active [#A] This is an active todo. :lawlist:\n")
(insert " DEADLINE: <2013-12-15 Sun 08:00> SCHEDULED: <2013-12-15 Sun>\n\n")
(insert "** Next-Action [#B] This is an inactive todo. :lawlist:\n")
(insert " DEADLINE: <2013-12-16 Mon 08:00> SCHEDULED: <2013-12-16 Mon>")
(goto-char (point-min))
(sit-for 2)
(re-search-forward (regexp-quote "** Active [#A] "))
(sit-for 2)
(let ((init-pos (point)))
(org-back-to-heading t)
(let* (
lawlist-item-whole
lawlist-item-partial
(beg (point)))
(if (and
(looking-at org-heading-regexp)
(and (looking-at lawlist-org-heading-regexp) (match-string 3)))
(re-search-forward lawlist-org-heading-regexp nil t)
(re-search-forward org-heading-regexp nil t))
(let ((end (point)))
(setq lawlist-item-whole (buffer-substring-no-properties beg end))
(setq lawlist-item-partial (buffer-substring-no-properties beg init-pos))
(re-search-backward (regexp-quote lawlist-item-whole) nil t)
;; (highlight-regexp (regexp-quote lawlist-item-whole))
(isearch-highlight beg end)
(sit-for 2)
;; (unhighlight-regexp (regexp-quote lawlist-item-whole))
(isearch-dehighlight)
(re-search-forward (regexp-quote lawlist-item-partial) nil t)
(sit-for 2)
(kill-buffer "foo")))))
编辑(2013年10月27日):暂时保留的先前解决方案,作为演变过程的历史部分,直至最终答案。但是,它不再是首选方法。
(defun lawlist-org-heading-components ()
(org-back-to-heading t)
(if (let (case-fold-search) (looking-at org-complex-heading-regexp))
(concat
(cond
((equal (org-match-string-no-properties 1) "**")
"^[*][*]")
((equal (org-match-string-no-properties 1) "*")
"^[*]"))
(cond
((and (match-end 2) (aref (match-string 2) 1))
(concat " " (org-match-string-no-properties 2))))
(cond
((and (match-end 3) (aref (match-string 3) 2))
(concat " \\" (org-match-string-no-properties 3))))
(cond
((and (match-end 4) (aref (match-string 4) 3))
(concat " " (org-match-string-no-properties 4))))
(cond
((and (match-end 5) (aref (match-string 5) 4))
(concat " " (org-match-string-no-properties 5)))))))