Thanks Gustavo, notes below: On Sun, Oct 27, 2019 at 5:58 PM Gustavo Barros wrote: > Hi Nate, > > On Sun, Oct 27 2019, Nathan Neff wrote: > > > 1) My org-agenda-files show up in the list. For example, foo.org and > bar.org show up in the refile targets, despite the > > function should return nil if a heading does not contain "Tasks" > > Curiously, I’ve been scratching this itch just today. So I might as well > share. > > I presume you are using some of the specific values of > `org-refile-use-outline-path'. If that’s the case, the file level as a > refile target is hardcoded in `org-refile-get-targets', independently of > what you might have in `org-refile-target-verify-function'. > > We have somewhere in `org-refile-get-targets': > > #+begin_src emacs-lisp > (when (eq org-refile-use-outline-path 'file) > (push (list (file-name-nondirectory f) f nil nil) tgs)) > (when (eq org-refile-use-outline-path 'buffer-name) > (push (list (buffer-name (buffer-base-buffer)) f nil nil) tgs)) > (when (eq org-refile-use-outline-path 'full-file-path) > (push (list (file-truename (buffer-file-name (buffer-base-buffer))) f > nil nil) tgs)) > #+end_src > > (`tgs' is the local variable which is collecting candidates for return). > > So, you might not use `org-refile-use-outline-path'. In this case the > file info will be provided in the end of the refile target in > parentheses (for targets outside the current buffer). And the file level > will not be offered as a target. > > I, however like `org-refile-use-outline-path' and set it to 'file. But I > also want to not be able to refile to the file level. So I advised > `org-refile-get-targets' with: > > #+begin_src emacs-lisp > (defun my/org-refile-filter-targets (orig-fun &rest args) > (let ((targets (apply orig-fun args)) > (agenda-files (mapcar #'file-name-nondirectory org-agenda-files))) > (cl-remove-if (lambda (x) > (member (car x) agenda-files)) > targets))) > (advice-add 'org-refile-get-targets :around #'my/org-refile-filter-targets) > #+end_src > > This presumes (setq org-refile-use-outline-path 'file). If you use any > other value, you should probably adjust the function’s let bound > variables for the case. This is also sort of hackish, so exert your own > due caution in choosing whether or not to use it. > Indeed, I do use org-refile-use-outline-path 'file. However, I have a simple directory specified for my org-agenda-files. ("~/org-mode") Therefore I'll need to do something a bit different. It appears that your solution creates "targets" which is the targets list of course, and then it creates "agenda-files" which goes through org-agenda-files and finds all the filenames in org-agenda files. It then mutates "targets", and removes any entry which is a filename from org-agenda-files. Since my org-agenda-files is simply ("~/org-mode/") none of the entries match. Hmmm, let me ask: Why not simply go through targets and remove any entry whose value is a simple filename? Why search org-agenda-files first? This function also assumes that the org-refile-targets always comes from org-agenda-files. I'll play with your function and see what I can get -- thank you for the head-start! Thanks --Nate > > HTH, > Gustavo. >