6

我正在尝试映射文件中的所有 org 条目并收集部分标题(如果它与某些正则表达式匹配)。

问题是字符串匹配总是返回 nil。当我逐步使用 edebug 时,我可以看到其他一切都正常工作。

在这里,我尽我所能减少了这个问题:

(defun test ()
  (let ((found nil))
    (org-map-entries (lambda ()
               (let ((heading (org-get-heading t t)))
             (when (string-match "[ \t]*>>>[ \t]*\\([A-Z0-9_-]+\\)"
                         heading)
               (push (match-string 1 heading) found))))

             nil '("test.org"))
    found))

test.org 中的 3 行:

* >>> one
* two
* >>> three

否则字符串匹配工作正常:

(string-match "[ \t]*>>>[ \t]*\\([A-Z0-9_-]+\\)" ">>> one")
=> 0

我尝试过的一些事情:
- 在匹配之前删除字符串属性。
- 改为围绕重新搜索进行实施。
- 将正则表达式匹配移动到单独的函数。
- 将 'org-map-entries' 替换为 'mapcar' 并在列表中进行测试,效果很好。

我正在使用 GNU Emacs 24.3.1(x86_64-unknown-linux-gnu,GTK+ 版本 3.4.2)

任何提示将不胜感激。

4

3 回答 3

3

提示:使用org-element!至少如果使用 Org v8+ 是可行的。

这是一个可以构建的玩具示例。将其复制到 Org 缓冲区并评估代码块。

编辑:更多示例。基本上,我无法重现。请参阅test函数的最后一个标题。

* >>> one
#+begin_src emacs-lisp :file test2.org
  (save-excursion (find-file "test2.org")
                  (delete-region (point-min) (point-max))
                  (insert "* >>> one2\n* two2"))
#+end_src

#+RESULTS:
[[file:test2.org]]

A function
#+begin_src emacs-lisp
  (defun my/tagged-headings (&optional regexp file full-element)
    "Return headings matching regexp.  If simple is t return only the headline.  Else return the element.  Requires Org-Element (Org>8)"
    (require 'org-element)
    (save-excursion
      (when (and file (file-exists-p file))
        (find-file file))
      (let (found
            (regexp (if regexp regexp "^>>>")))
        (org-element-map
            (org-element-parse-buffer)
            'headline
          '(lambda (h)
             (when  (string-match "^>>>" (org-element-property :raw-value h))
               (push (if full-element h (org-element-property :raw-value h)) found))))
        found)))
#+end_src

#+begin_src emacs-lisp
(my/tagged-headings)
#+end_src

#+RESULTS:
| >>> three | >>> one |

#+begin_src emacs-lisp
(my/tagged-headings nil "test2.org")
#+end_src

#+RESULTS:
| >>> one2 |

* two

#+begin_src emacs-lisp
  (defun my/tagged-headings2 ()
    (let (found)
      (org-map-entries (lambda () 
                         (save-excursion
                           (when (search-forward-regexp "^*+[[:space:]]*>+" (point-at-eol) t)
                             (push (org-get-heading t t) found)
                             ))))
      found))
#+end_src


#+begin_src emacs-lisp 
(my/tagged-headings2)
#+end_src

#+RESULTS:
| >>> three | >>> one |


* >>> three 



#+begin_src emacs-lisp
  (defun test (&optional file)
    (save-excursion
      (when (and file (file-exists-p file)) (find-file file))
      (let ((found nil))
        (org-map-entries (lambda ()
                           (let ((heading (org-get-heading t t)))
                             (when (string-match "[ \t]*>>>[ \t]*\\([A-Z0-9_-]+\\)"
                                                 heading)
                               (push (match-string 1 heading) found)))))
        found)))
#+end_src

#+begin_src emacs-lisp
(test)
#+end_src

#+RESULTS:
| three | one |

#+begin_src emacs-lisp
(test "test2.org")
#+end_src

#+RESULTS:
| one2 |
于 2013-07-28T00:13:30.253 回答
3

难道仅仅是在代码运行时case-fold-search以某种方式设置为nil(因此“AZ”不再匹配小写字符)?如果是这样,替换A-Z0-9[:alnum:]应该可以解决它。

于 2013-07-28T06:53:56.020 回答
1

我从一开始就得到了正确的结果。Emacs 24.3.4。组织模式版本 8.0.6。您应该更新您的设置。

于 2013-07-28T08:24:53.867 回答