emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orgmode] Re: add a whole directory as one item to refile targets


From: Sebastian
Subject: Re: [Orgmode] Re: add a whole directory as one item to refile targets
Date: Mon, 12 Oct 2009 18:47:46 +0200

Am Montag, den 12.10.2009, 15:48 +0200 schrieb Eraldo Helal:
> > What is Reference/ supposed to be in this case -- a directory?  Refiling
> > only works to headings (or top level headings) in files in org-mode IIRC.
> Yes it is supposed to be a directory...
> 
> I have org files in many directorys... about like so:
>  reference/emacs/emacs.org
>  reference/eros/eros.org
>  reference/Avalon/Avalon.org
>  reference/Gimp/Gimp.org
>  reference/office/office.org
>  reference/home/home.org
>  reference/poems/poems.org
> ...
> 
> What would be a smart way to get a headline from the file inbox.org
> named "* Erich Fried poems" to poems.org?
> Considering that poems.org is not part of the agenda nor a refile target.
> 
> What I am doing until now is:
>  folding the headline (tab)
>  cutting the headline (C-k)
>  making a split screen (C-x 2)
>  changing buffer (C-x o)
>  opening poems.org (C-x C-f "reference/poems/poems.org")
>  pasting headline (C-y)
>  changing buffer (C-x o)
>  removing split view (C-x 1)
> 
> Poems.org is not part of the agenda because it is reference material
> and not an active file.
> It is also not a refile target because I would have to make every .org
> file in all subdirectories a refile target and sometimes the
> appropriate file does not yet exist, in which case I need to create
> it.
> 
> Any ideas?
> Do I need to further try to make clear what I mean?
> 
> Greetings,
> Eraldo
> 


Since having so many targets for refiling slows down refiling a lot, I
do this here.


I've set `org-refile-targets' like this (custom-set-variables):

 '(org-refile-targets (quote ((org-agenda-files :maxlevel . 3)
      (sr-org-refile-targets :maxlevel . 2))))



In addition, I have this here in my setup:



(defvar sr-org-refile-targets nil 
  "List of refile targets for Org-remember.
   See `org-refile-targets'.")

(defvar sr-org-refile-dir-excludes  "^[#\\.].*$")
(defvar sr-org-refile-file-excludes "^[#\\.].*$")


(defun sr-find-org-refile-targets
    (&optional recurse dirs file-excludes dir-excludes)
  "Fill the variable `sr-org-refile-targets'.
Optional parameters:
  recurse        If `t', scan the directory recusively.
  dirs           A list of directories to scan for *.org files.
  file-excludes  Regular expression. If a filename matches this regular
expression,
                 do not add it to `sr-org-refile-targets'.
  dir-excludes   Regular expression. If a directory name matches this
regular expression,
                 do not add it to `sr-org-refile-targets'."
  (let ((targets (or dirs (list org-directory)))
        (fex (or file-excludes  "^[#\\.].*$"))
        (dex (or dir-excludes  "^[#\\.].*$"))
        path)
    (dolist (dir targets)
      (if (file-directory-p dir)
          (let ((all (directory-files dir nil "^[^#\\.].*$")))
            (dolist (f all)
              (setq path (concat (file-name-as-directory dir) f))
              (cond
               ((file-directory-p path)
                (if (and recurse (not (string-match dex f)))
                      (sr-find-org-refile-targets t (list path) fex
dex)))
               ((and (string-match "^[^#\\.].*\\.org$" f) (not
(string-match fex f)))
                (setq sr-org-refile-targets (append (list path)
sr-org-refile-targets))))))
        (message "Not a directory: %s" path))
      )))



(defun sr-add-to-org-refile-targets ( recurse dirs )
  "Add a directory to org-refile targets recursively."
  (interactive "P\nDdirectory: ")
  (sr-find-org-refile-targets
   (if recurse t nil)
   (list dirs)
   sr-org-refile-file-excludes
   sr-org-refile-dir-excludes)
  (message "org-refile-targets: \n%s" sr-org-refile-targets))






Now I call the function `sr-add-to-org-refile-targets' whenever I need
to add all Org-files in a directory recursively.




Sebastian








reply via email to

[Prev in Thread] Current Thread [Next in Thread]