2011-08-01 45 views
2

在組織文件中將CATEGORY轉換爲PROPERTY的最佳方法是什麼?在emacs組織文件中將CATEGORY轉換爲PROPERTY的最佳方法

#+CATEGORY: NETWORKING 

:PROPERTIES: 
:CATEGORY: NETWORKING 
:END: 

我用下面的elisp的代碼來做到這一點。

(let ((buf_name "home.org") (current_line 0) (current_string "")) 
    (set-buffer buf_name) 
    (goto-char (point-min)) 
    (while (re-search-forward "#\\+CATEGORY: \\(.*$\\)" nil t) 
    (replace-match ":PROPERTIES:\n:CATEGORY: \\1\n:END:"))) 

有沒有更好的方法。

編輯: - 正則表達式

"#\\+CATEGORY: \\(\\w+\\)" 

已被修飾以

"#\\+CATEGORY: \\(.*$\\)" 

因爲我不得不在沒有被識別爲一個字一個 「C++」 CATEGORY,只有 「C」 「C++」被認爲是一個詞。

回答

1

您可以使用此:

(let ((buf_name "home.org") 
     (current_line 0) 
     (current_string "")) 
    (with-current-buffer buf_name 
    (replace-regexp "#\\+CATEGORY: \\(\\w+\\)" 
        ":PROPERTIES:\n:CATEGORY: \\1\n:END:" 
        t 
        (point-min) 
        (point-max)))) 

但它只是一個風格的變化,也沒有概念更好的辦法。

此外:屬性抽屜和類別不是等價的:第二個擴展直到文件結尾,第一個僅在當前子樹內。 所以你很可能不得不手動編輯它之後。

+0

Talespin_Kit的使用和更換' - match'寫口齒不清時是比較正確的。 'replace-regexp'的文檔實際上告訴你這麼做,因爲它「運行得更快,不會設置標記或打印任何東西」。 – phils

1

試試這個:

(save-excursion 
    (let* (file-cat 
    (file-list (org-agenda-files t))) 
    (dolist (file file-list) 
     (find-file file) 
     (goto-char (point-min)) 
     (re-search-forward "CATEGORY") 
     (setq file-cat (substring-no-properties 
       (org-get-category (point)))) 
     (beginning-of-line) 
     (kill-line) 
     (goto-char (point-min)) 
     (outline-next-heading) 
     (org-set-property "CATEGORY" file-cat) 
     (while (not (condition-case nil (outline-forward-same-level 1) 
      (error t))) 
    (org-set-property "CATEGORY" file-cat)) 
     (save-buffer)))) 

上面的代碼獲取文件類別,刪除過時的行,然後將每個頂層標題爲舊文件類別的類別屬性。

編輯:編輯的代碼來適應時所指出的喬納森`重新搜索forward`的

+0

如果您的#+類別是您的頂級標題之後的行,以便它通過所有子標題傳播,這將如何工作? (* Top \ n#+ Category:Category \ n ** blah \ n ** blah2) –

+0

我編輯了代碼以適應這種情況。感謝您指出。 – suvayu

相關問題