2013-07-27 11 views
5

Próbuję odwzorować wszystkie wpisy z organizacji w pliku i zebrać część nagłówka, jeśli jest dopasowana przez niektóre wyrażenie regularne."Dopasowywanie ciągów znaków" nie działa w "wpisach na mapie org"

Problem polega na tym, że dopasowanie łańcuchowe zawsze zwraca zero. Widzę, że wszystko inne działa poprawnie, kiedy przechodzę przez edebug.

Tu zmniejszyły problem tak daleko, jak tylko mogę:

(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)) 

Linie 3 w test.org: Prace

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

string-mecz w porządku inaczej:

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

Kilka rzeczy, które próbowałem:
- Usuwanie właściwości ciągów przed e dopasowanie.
- Zamiast tego należy wykonać ponowne wyszukiwanie.
- Przeniesienie dopasowania regex do oddzielnej funkcji.
- zastąpione "wpisy mapy org" z "mapcar" i przetestowane na liście, działa poprawnie.

Używam Emacsa 24.3.1 (x86_64-unknown-linux-gnu, GTK + w wersji 3.4.2)

Wszelkie wskazówki będą mile widziane.

+0

Kiedy przechodzisz przez edebug, czy "nagłówek" przedstawia oczekiwaną wartość? – Malabarba

+0

Tak, 'heading' przedstawia oczekiwaną wartość w edebug. – michaelJohn

Odpowiedz

3

Może to być po prostu, że case-fold-search jakoś zostaje ustawiony na nil natomiast kod jest uruchomiony (stąd „A-Z” nie pasuje małe litery dłużej)? Jeśli tak, to należy go naprawić, zastępując A-Z0-9 za pomocą .

+0

Wygląda na to, że 'org-map-entries' wywołuje' org-entry-properties', które ustawia 'case-fold-search' na' nil' przed wywołaniem 'org-back-to-heading' i dając kontrolę do zastosowanej funkcji . – michaelJohn

2

Wskazówka: Użyj org-element! Przynajmniej jeśli użycie Org v8 + jest wykonalne.

Oto zabawny przykład, na którym można się oprzeć. Skopiuj go do bufora Org i oceń bloki kodu.

Edytuj: więcej przykładów. Zasadniczo nie mogę się rozmnażać. Zobacz ostatni nagłówek dla swojej funkcji 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 | 
+0

Wow, szkoda, że ​​nie znalazłem "org-element" rok temu! To działa, ale nadal chcę wiedzieć, dlaczego 'org-map-entries' nie jest – michaelJohn

+1

Zobacz zaktualizowany przykład. Można również użyć "org-map-entries", ale jest mniej wydajne. 'org-element' żył w' contrib' przez jakiś czas, ale jest teraz częścią jądra 'org-mode'. – Rasmus

0

Mam prawidłowy wynik od samego początku. Emacs 24.3.4. Tryb Org w wersji 8.0.6. Powinieneś zaktualizować swoją konfigurację.

Powiązane problemy