emacs ऑर्ग-मोड ऑब्जेक्ट को प्रोग्रामेटिक रूप से जेनरेट करें



elisp org-mode (1)

शुरुआती (14 मार्च, 2014): सबसे पहले कच्चा मसौदा

संपादित करें (15 मार्च, 2014): फ़ंक्शन नामित फ़ंक्शन को बनाया और संशोधित किया गया। चलने वाली चर org-file का पथ किसी मौजूदा संगठन- org-file मेल खाना चाहिए। सूची में वेरिएबल्स का उपयोग करने के साथ स्पष्ट सीमा के चलते चलने वाले main-heading और sub-heading का उपयोग नहीं किया जा रहा है, जो कि '( - अर्थात, उन दोनों चर को इस परिस्थिति में मान्यता प्राप्त नहीं है) से शुरू होता है। org-capture.el से function org-capture फ़ंक्शन org-capture.el org-capture-set-plist की सामग्री को शामिल करने के लिए संशोधित किया गया है, जिसके बदले में org-capture-entry के पहले दो तत्वों को समाप्त करने के लिए संशोधित किया गया है (उर्फ org-capture-templates ) - दोनों प्रविष्टियाँ (यानी :key और :description ) मैन्युअल रूप से उपयोगकर्ता-इंटरफ़ेस से एक टेम्पलेट चुनने के लिए हैं, और जब इस example साथ किया जा रहा है, तो किसी ऑर्गेनिक बफर को प्रोग्रामेटिक रूप से जेनरेट करने की आवश्यकता नहीं है.इसके अलावा, मैन्युअल रूप से टेम्पलेट का चयन करने से संबंधित फ़ंक्शन org-capture का भाग हटा दिया गया है।

संपादित करें (16 मार्च, 2014): संशोधित चर और लिखित सूची के आधार पर, @sds और @lunaryorn द्वारा प्रदान किए गए पाठों के आधार पर निम्नलिखित धागा में: https://stackoverflow.com/a/22440518/2112489 चार वैकल्पिक आवक चर जोड़ा गया है - (1 ) main-heading ; (2) sub-heading-headline ; (3) sub-heading-complete ; और (4) plain-list उदाहरण अब या तो इंटरैक्टिव रूप से या निम्न प्रारूप का उपयोग करके फ़ंक्शन का मूल्यांकन करके काम करते हैं: (org-generate "PROJECT" "Thesis" "** Thesis\n:PROPERTIES:\n:END:" '("a" "b" "c"))

संपादित करें (मार्च 1 9, 2014): org-generate अब एक गैर-इंटरैक्टिव फ़ंक्शन है जिसमें आवक चर की आवश्यकता है - डॉक्टर-स्ट्रिंग को अपडेट किया गया है। example एक फ़ंक्शन बनाया गया है जो org-generate लिए नए प्रारूप का उपयोग org-generate

;; EXAMPLES:
;; (org-generate 'entry "/Users/HOME/Desktop/myproject.org" "PROJECT" "Thesis" "** Thesis\n   :PROPERTIES:\n   :END:")
;; (org-generate 'item "/Users/HOME/Desktop/myproject.org" "PROJECT" "Thesis" nil '("a" "b" "c"))
(defun example ()
(interactive)
  (let* (
      (org-file "/Users/HOME/Desktop/myproject.org")
      (level-one "TASKS")
      (level-two
        "Active [\#A] Generate Org-mode objects programmatically.")
      (full-level-two (concat
        "** Active [\#A] Generate Org-mode objects programmatically.\n"
        "   DEADLINE: <%<%Y-%m-%d %a>>\n"
        "   :PROPERTIES:\n"
        "   :ToodledoFolder: TASKS\n"
        "   :END:"))
       (plain-list '("foo" "bar" "baz")) )
    (org-generate 'entry org-file level-one level-two full-level-two)
    (org-generate 'item org-file level-one level-two nil plain-list) ))

(defun org-generate (type org-file level-one
  &optional level-two full-level-two plain-list)
"Formating options for `org-capture-entry` are similar to `org-capture-templates`.
However, the first two elements (i.e., `:key` and `:description`) are NOT used.
Please see the doc-string of the variable `org-capture-templates` for more info.
  (1) `type`:  required -- 'entry | 'item
  (2) `org-file`:  required -- path to the org-mode file.
  (3) `level-one`:  required -- main heading.
  (4) `level-two`:  optional -- sub-heading headline (only).
  (5) `full-level-two`:  optional -- complete sub-heading.
  (6) `plain-list`:  optional -- a list.
EXAMPLES:
  `(org-generate 'entry org-file level-one level-two full-level-two)`
  `(org-generate 'item org-file level-one level-two nil plain-list)` "
  (require 'org-capture)
  (let (org-capture-entry)
    (cond
      ((eq type 'entry)
        (setq org-capture-entry
          `(entry
            (file+headline ,org-file ,level-one)
              ,full-level-two :empty-lines 1 :immediate-finish t))
        (lawlist-org-capture))
      ((eq type 'item)
        (setq org-capture-entry
          `(item
            (file+olp ,org-file ,level-one ,level-two)
              nil :empty-lines 1 :immediate-finish t))
        (mapcar (lambda (x)
          (progn
            (setcar (nthcdr 2 org-capture-entry) x)
            (lawlist-org-capture) ))
          plain-list)))))

(defun lawlist-org-capture ()
    (let* ((orig-buf (current-buffer))
     (annotation (if (and (boundp 'org-capture-link-is-already-stored)
        org-capture-link-is-already-stored)
         (plist-get org-store-link-plist :annotation)
       (ignore-errors (org-store-link nil))))
     (entry org-capture-entry)
     initial)
      (setq initial (or org-capture-initial
      (and (org-region-active-p)
           (buffer-substring (point) (mark)))))
      (when (stringp initial)
  (remove-text-properties 0 (length initial) '(read-only t) initial))
      (when (stringp annotation)
  (remove-text-properties 0 (length annotation)
        '(read-only t) annotation))
  (setq org-capture-plist (copy-sequence (nthcdr 3 entry)))
  (org-capture-put :target (nth 1 entry))
  (let ((txt (nth 2 entry)) (type (or (nth 0 entry) 'entry)))
    (when (or (not txt) (and (stringp txt) (not (string-match "\\S-" txt))))
      (cond
       ((eq type 'item) (setq txt "- %?"))
       ((eq type 'checkitem) (setq txt "- [ ] %?"))
       ((eq type 'table-line) (setq txt "| %? |"))
       ((member type '(nil entry)) (setq txt "* %?\n  %a"))))
    (org-capture-put :template txt :type type))
  (org-capture-get-template)
  (org-capture-put :original-buffer orig-buf
       :original-file (or (buffer-file-name orig-buf)
              (and (featurep 'dired)
             (car (rassq orig-buf
                   dired-buffers))))
       :original-file-nondirectory
       (and (buffer-file-name orig-buf)
            (file-name-nondirectory
             (buffer-file-name orig-buf)))
       :annotation annotation
       :initial initial
       :return-to-wconf (current-window-configuration)
       :default-time
       (or org-overriding-default-time
           (org-current-time)))
  (org-capture-set-target-location)
  (condition-case error
      (org-capture-put :template (org-capture-fill-template))
    ((error quit)
     (if (get-buffer "*Capture*") (kill-buffer "*Capture*"))
     (error "Capture abort: %s" error)))
  (setq org-capture-clock-keep (org-capture-get :clock-keep))
    (condition-case error
        (org-capture-place-template
         (equal (car (org-capture-get :target)) 'function))
      ((error quit)
       (if (and (buffer-base-buffer (current-buffer))
          (string-match "\\`CAPTURE-" (buffer-name)))
     (kill-buffer (current-buffer)))
       (set-window-configuration (org-capture-get :return-to-wconf))
       (error "Error.")))
    (if (and (derived-mode-p 'org-mode)
       (org-capture-get :clock-in))
        (condition-case nil
      (progn
        (if (org-clock-is-active)
      (org-capture-put :interrupted-clock
           (copy-marker org-clock-marker)))
        (org-clock-in)
        (org-set-local 'org-capture-clock-was-started t))
    (error
     "Could not start the clock in this capture buffer")))
    (if (org-capture-get :immediate-finish)
        (org-capture-finalize))))

उदाहरण http://www.lawlist.com/images/programmatic_org_file.png

मैं वास्तव में हार्ड-कोडिंग सिंटैक्स के बिना ऑर्ग-मोड टेक्स्ट वाले तार उत्पन्न करना चाहता हूं उदाहरण के लिए, मैं एक समारोह को चलाने के लिए चाहता हूं जैसे कि (org-generate (org-generate-heading "heading" (org-generate-plain-list '("foo" "bar" "baz"))) और यह वापस करेगा:

* heading
  - foo
  - bar
  - baz

दूसरे शब्दों में, मैं ऑर्गे-मोड दस्तावेज़ों को मनमाना की जटिलता के बिना बनाना चाहता हूं बिना माइक्रोमैनेजिंग सिंटैक्टीक फीचर जैसे तारांकनों और इंडेंटेन्टेशन, केवल मापदंडों के साथ फ़ंक्शन कॉल करके, जो कुछ ऑर्ग ऑब्जेक्ट्स वापस करता है। क्या यह करना मुमकिन है? शायद org-element माध्यम से?





org-mode