On Fri, Jul 22, 2016 at 1:54 PM, Michael Welle <mwe012008@gmx.net> wrote:
Hello,

Matt Price <moptop99@gmail.com> writes:

> On Fri, Jul 22, 2016 at 11:38 AM, Matt Price <moptop99@gmail.com> wrote:
>
>>
>> (2) Is it possible to set the default value for interactive file selection
>> to something OTHER than the currect directory of the current buffer?
>> Something like:
>>
>> (let
>>   ((base-dir "./Assignment1/"))
>>   (org-attach--attach))
>>
>> I'd like to set different base directories when attaching files to
>> subtrees of different first-level trees in a buffer. I guess I would set
>> the value for the base directory with a property.
>>
>
> OK, I made some progress on this:
>
> (let ((default-directory  (concat default-directory "Assignment1/") ))
> (call-interactively 'org-attach-attach))
>
> However, I'd like to do something like:
>
> (let
>     ((parent-basedir nil))
>   (save-excursion
>     (outline-up-heading)
>     (setq parent-basedir (org-get-entry "BASEDIR")))
>   (let
>       ((default-directory (concat default-directory parent-basedir) ))
>     (call-interactively 'org-attach-attach  )))
>
>
>
> But there are errors I don't understand in this code. Any hints? Thanks
> again!
well, I guess the errors are too secret to share them with us? The first
I can see is that org-get-entry doesn't need parameters. And the overall
structure looks strange, but that could be just me ;).

:-( No, they're not too secret, I just have a terrible head cold and can hardly think, so didn't think to include it!

The overall structure feels strange to me -- I just want a way of retaining a temprary variable value in a let that also includes a temporary excursion to the parent node. More on that shortly.
 
The reason for the current behaviour is the interactive form of
org-attach-attach. Ad hoc I have no idea how to change that. What I
would try is to (cd your-wanted-dir) before calling org-attach-attach.
Maybe a bit of cleanup if useful after calling the function.

So it turns out  that, like most interactive functions, org-attach-attach uses the built-in read-file-name macro, which relies on the value of "default-directory", which is buffer-local. By calling org-attach-attach from inside a let statement, I can get the behaviour I want:
(let
  ((default-directory (concat default-directory "Galileo/")))
  (org-attach-attach))


 The problem now is that I need to access a property from the parent node in order ot dynamically set the appropriate value for default-directory, and I'm struggling to do that.

Here is a minimal test file:

* Galileo :ASSIGNMENT:
:PROPERTIES:
:BASEDIR:  Galileo
:END:


** testing
#+BEGIN_SRC emacs-lisp
  (let
      ((parent-basedir nil))
    (save-excursion
      (outline-up-heading)
      (setq parent-basedir (org-entry-get (point) "BASEDIR"))
      (message parent-basedir))
    (let
        ((default-directory (concat default-directory parent-basedir) ))
      (call-interactively 'org-attach-attach  )))
#+END_SRC

This seems to work but so far I'm having issues actually opening the attachment.  This may be due to the way that org-attach constructs links to attachments (I prefer not to copy, as my disk space is limited).
Anyway, thanks for your help; this seems to be getting closer, despite what feels like substantial mental impairment due to increased cranial pressure (ouch!)
Matt


Regards
hmw