2012-11-25 1 views
9

Il org-mode ha il meccanismo Capture-Refile-Archive. Lo uso spesso per prendere appunti e registri. Voglio anche usarlo per costruire il mio vocabolario. Ad esempio, quando incontro alcune parole nuove durante la lettura di un testo in inglese, voglio semplicemente digitare C-c c v e per registrare la parola nel mio file di vocabolario Word-List-EN.org. Voglio anche che le parole siano categorizzate in Lettere, ad esempio cashew verranno registrate nella voce /C/CA. Voglio digitare C-c c v E per registrare le mie parole in esperanto in un file come vortaro.org. Come configurare org-capture-templates per implementare questo? Ho letto l'org-info e non ho ancora idea. Il manuale dice che posso usare qualcosa come (function function-finding-location). Ma devo definire il mio function-finding-location. Spero che i maestri elisp possano aiutarmi!Come utilizzare il meccanismo "capture-refile" in modalità org per creare il mio vocabolario?

+0

"/ C/CA" dovrebbe essere l'intestazione dell'albero o si intende una barra per indicare un sottolivello? – pmr

+1

Il problema principale che vedo è questo: 'org-capture' decide sulla posizione quando la invochi. Ciò significa che non puoi selezionare la posizione in quel punto perché non hai ancora inserito la parola (ha senso, no?). Quindi, probabilmente dovresti avere una refile personalizzata invece di acquisire. Invia la parola catturata al file giusto ('english.org') e poi usa la tua refile personalizzata. – pmr

+0

Sì,/C/CA significa sottolivello 2-nd, una voce 'CA' sotto' C'. – Vivodo

risposta

1

Ho avuto enormi problemi a ottenere l'org-capture per qualcosa di simile, ma org-remember ha funzionato bene. Ecco il mio rilevanti bit .emacs:

(require 'org-install) 
(setq org-directory "~/.orgfiles/") 
(setq org-default-notes-file (expand-file-name "~/.orgfiles/notes.org")) 
(setq remember-annotation-functions '(org-remember-annotation)) 
(setq remember-handler-functions '(org-remember-handler)) 
(add-hook 'remember-mode-hook 'org-remember-apply-template) 
(setq org-agenda-files '("~/.orgfiles")) 
(global-set-key "\C-cl" 'org-store-link) 
(global-set-key "\C-cc" 'org-remember) 
(global-set-key "\C-ca" 'org-agenda) 
(global-set-key "\C-cb" 'org-iswitchb) 
(setq org-remember-templates 
     '(("Todo" ?t "* TODO %^{Brief Description} %^g\n%? Added: %U" "~/.orgfiles/TODO.org" "Tasks") 
    ("Idea" ?i "* %^{Brief Description} %^g\n%? Added: %U" "~/.orgfiles/Idea.org" "Ideas") 
    ("Study" ?s "* %^{Brief Description} %^g\n%? Added: %U" "~/.orgfiles/Study.org" "Study") 
    ("Receipt" ?r "** %^{Brief Description} %U %^g\n%?" "~/.orgfiles/Receipt.org") 
    ) 
) 
4

penso PMR ha ragione sul fatto che le funzioni per la scelta di un percorso di file come parte di un modello accadono troppo presto per le vostre esigenze.

Un modo per integrarsi con il flusso di lavoro refile di acquisizione dell'organizzazione sarebbe utilizzare il sistema di modello di acquisizione standard per archiviare la nuova parola nel buffer vocab, quindi utilizzare una funzione elisp personalizzata come hook, probabilmente in org-capture-before- finalize-hook, per archiviare la nuova definizione nella giusta posizione.

Ho scritto la seguente funzione come un esempio che richiede una parola e una definizione e la inserisce in un buffer org nel posto giusto. Se è adatto alle tue esigenze, puoi associarlo a una chiave a tua scelta o usarlo come punto di partenza per l'approccio hook.

;; 
;; remove extra spaces between stars and the headline text 
;; 
(defun tidy-headlines() 
    (interactive) 
    (save-excursion 
    (goto-char (point-min)) 
    (while (re-search-forward "^\\*+\\([[:space:]][[:space:]]+\\)" (point-max) t) 
     (replace-match " " nil nil nil 1)))) 

;; 
;; function for storing things in vocab files like cashew /C/CA/Cashew 
;; 
(defun insert-vocab-word (vocab-word definition) 
    "prompts for a word then opens a vocab file and puts the word in place" 
    (interactive "sWord: \nsDefinition: ") 
    (find-file "~/org/vocab.org") 
    (tidy-headlines) 
    (goto-char (point-min)) 
    (let* ((first-char (upcase (substring vocab-word 0 1))) 
     (first-two-chars (upcase (substring vocab-word 0 2)))) 
    (while (and (re-search-forward "^\\* " (point-max) t) 
       (string< (buffer-substring-no-properties (point) (+ 1 (point))) first-char))) 
    (if (string= (buffer-substring-no-properties (point) (+ 1 (point))) first-char) 
     (let* ((end-of-subtree (save-excursion (org-end-of-subtree) (point)))) 
      (while (and (re-search-forward "^\\*\\* " end-of-subtree t) 
        (string< (buffer-substring-no-properties (point) (+ 2 (point))) first-two-chars))) 
      (if (string= (buffer-substring-no-properties (point) (+ 2 (point))) first-two-chars) 
       (let* ((end-of-subtree2 (save-excursion (org-end-of-subtree) (point)))) 
       (while (and (re-search-forward "^\\*\\*\\* " end-of-subtree2 t) 
          (string< (word-at-point) vocab-word))) 
       (if (string< vocab-word (word-at-point)) 
        (progn 
         (beginning-of-line) 
         (org-insert-heading t)) 
        (org-insert-heading-after-current)) 
       (insert vocab-word) 
       (org-insert-subheading t) 
       (insert definition)) 
      (progn 
       (if (string< first-two-chars (buffer-substring-no-properties (point) (+ 2 (point)))) 
        (progn 
        (beginning-of-line) 
        (org-insert-heading t)) 
       (org-insert-heading-after-current)) 
       (insert first-two-chars) 
       (org-insert-subheading t) 
       (insert vocab-word) 
       (org-insert-subheading t) 
       (insert definition)))) 
     (progn 
     (org-insert-heading-after-current) 
     (insert first-char) 
     (org-insert-subheading t) 
     (insert first-two-chars) 
     (org-insert-subheading t) 
     (insert vocab-word) 
     (org-insert-subheading t) 
     (insert definition))))) 
+0

Sembra che 'vocab.org' non dovrebbe essere vuoto in primo luogo. – Dror