Re: [O] Configure Helm Source from org-tags-view

2019-08-09 Thread Nathan Neff
On Fri, Aug 9, 2019 at 2:14 PM Adam Porter  wrote:

> Nathan Neff  writes:
>
> > I know, but rifle has so many dependencies
> >
> > Rifle is truly awesome, I just have to convince myself to trust
> > f.el and d.el or whatever those one-letter libraries are :-)
>
> helm-org-rifle's dependencies are libraries which have been around for
> over 6 years and are used by many thousands of people.  The one-letter
> names are because Emacs Lisp has no namespaces, and the convention is to
> use package prefixes on all symbols, so long package names make for long
> symbol names, which makes programming tedious.
>

This is good to know - I don't really have any rhyme/reason as to what
I use and don't use;  For example, I use Helm which isn't part of default
Emacs.

Thanks again,
--Nate


Re: [O] Configure Helm Source from org-tags-view

2019-08-09 Thread Adam Porter
Nathan Neff  writes:

> I know, but rifle has so many dependencies
>
> Rifle is truly awesome, I just have to convince myself to trust
> f.el and d.el or whatever those one-letter libraries are :-)

helm-org-rifle's dependencies are libraries which have been around for
over 6 years and are used by many thousands of people.  The one-letter
names are because Emacs Lisp has no namespaces, and the convention is to
use package prefixes on all symbols, so long package names make for long
symbol names, which makes programming tedious.




Re: [O] Configure Helm Source from org-tags-view

2019-08-09 Thread Nathan Neff
I know, but rifle has so many dependencies

Rifle is truly awesome, I just have to convince myself to trust
f.el and d.el or whatever those one-letter libraries are :-)

Thanks,
--Nate


On Fri, Aug 9, 2019 at 6:10 AM Adam Porter  wrote:

> Nathan Neff  writes:
>
> > Hello all,
> >
> > Has anyone created a Helm source from the results of org-agenda?
> >
> > Specifically org-tags-view I think would be a cool Helm source to
> > configure where the headings that have certain tags could be displayed
> > by Helm.
> >
> > I looked @ the code for org-tags-view and it's fairly straight forward -
> however, I think
> > that the function itself is tightly coupled between finding the results
> and displaying the
> > results.  In other words, there's no "easy" function that I see which
> would provide headings
> > that match a tags search that I could use as a Helm source.
> >
> > I think I would need to copy quite a bit of code from org-tags-view into
> a different
> > function to create a Helm source.  Am I missing something?
> >
> > Has anyone else done something similar?
>
> That's what helm-org-rifle is for.  For example, later in the thread you
> mentioned searching for a "staff" tag.  That would be very easy:
>
> 1.  M-x helm-org-rifle-agenda-files RET (I have it bound to a key).
> 2.  Type ":staff:".
> 3.  See results.
>
>
>


Re: [O] Configure Helm Source from org-tags-view

2019-08-09 Thread Adam Porter
Nathan Neff  writes:

> Hello all,
>
> Has anyone created a Helm source from the results of org-agenda?
>
> Specifically org-tags-view I think would be a cool Helm source to 
> configure where the headings that have certain tags could be displayed
> by Helm.
>
> I looked @ the code for org-tags-view and it's fairly straight forward - 
> however, I think
> that the function itself is tightly coupled between finding the results and 
> displaying the
> results.  In other words, there's no "easy" function that I see which would 
> provide headings
> that match a tags search that I could use as a Helm source.
>
> I think I would need to copy quite a bit of code from org-tags-view into a 
> different
> function to create a Helm source.  Am I missing something?
>
> Has anyone else done something similar?

That's what helm-org-rifle is for.  For example, later in the thread you
mentioned searching for a "staff" tag.  That would be very easy:

1.  M-x helm-org-rifle-agenda-files RET (I have it bound to a key).
2.  Type ":staff:".
3.  See results.




Re: [O] Configure Helm Source from org-tags-view

2019-08-08 Thread Jean Louis
* Nathan Neff  [2019-08-08 22:47]:
> Hi Jean Louis,
> 
> Thank you for your time and advice - I am trying to spend time
> learning Elisp and more of the underpinnings in org-mode - so your
> advice was very helpful.
> 
> In fact, I found that org-scan-tags is called by org-map-entries -
> org-map-entries can specify a SCOPE of 'agenda (not the same
> as the 'agenda that's provided to org-scan tags).
> 
> So, I got the code down to a one-liner!
> 
> ;; This searches all agenda-files and returns a bunch of
> ;; stuff that I can re-use in Helm
> (org-map-entries 'agenda bkm 'agenda)

Good if it works for you.

Me, I don't need much programming for Org. What I did for me is
sending assignments by email.

#+PROPERTY: ASSIGNED_ALL John

*** Policies on gold prospecting  :staff:
:PROPERTIES:
:CREATED:  [2019-05-11 Sat 11:14]
:ID:   c9c92a1e-7f60-43b0-8dcf-c16ef47dca52
:ASSIGNED: John
:END:

Then if I execute the function, it asks me to send email with some
subject to Ezekiel, and he received the Org heading in the email.

That way I am distributing tasks to people who don't have computer,
they read it on phone and do it.

That is what I did with Org mode

 (setq *rcd-org-members-for-assigned-tasks*
   '((1 "John" "Management" "managem...@example.com" management)

;; Whereby "John" is in :ASSIGNED, then comes email identity, then comes
;; signature and settings for mutt. I use mutt to send auto emails from
;; Emacs.

(defun rcd-org-extract-assigned-member-email-data ()
  "Fetches ASSIGNED individual from subtree and returns the data"
  (let ((assigned (org-entry-get nil "ASSIGNED")))
(if (not assigned)
(let* ((individual (completing-read "Receiver:" 
(assigned-members-complete
  (let ((id (rcd/org-find-assigned-member-id individual)))
(if id (rcd/org-find-assigned-member-email-data id)
  nil)))
  (let ((id (rcd/org-find-assigned-member-id assigned)))
(rcd/org-find-assigned-member-email-data id)

(defun rcd-org-subtree-to-file (signature)
  "Saves subtree to file"
  (org-back-to-heading)
  (let* ((filename (concatenate 'string (getenv "TMPDIR") (rcd/file-timestamp) 
".org")))
(org-copy-subtree)
(find-file-noselect filename)
(with-temp-file filename
  (org-mode)
  (yank)
  (insert "\n\n")
  (insert-file-contents signature)
  )
filename))

(defun rcd/org-find-headline ()
  "Finds current Org headline"
  (org-with-wide-buffer
   (org-back-to-heading t)
   (let ((case-fold-search nil))
 (when (looking-at org-complex-heading-regexp)
   (match-string-no-properties 4)

(defun rcd-org-mutt-send-file (name email subject file  prefix)
  "Uses mutt to quickly send the file"
  (let* ((prefix (if prefix prefix (mutt/prepared-subject)))
 (to (format "\"%s <%s>\"" name email))
 ;; (to (rcd-mutt-escape-string to))
 (subject (concatenate 'string "\"" prefix ": " subject "\""))
 (command (format "mutt -s %s -i \"%s\" %s" subject file to)))
(shell-command command)
(message command)))

(defun mutt/prepared-subject ()
  (let ((subjects '("TASK" "UPDATED" "EXPENSES UPDATED" 
 "POLICY" "READ THIS" "PROJECT" "QUESTION"))
(completion-ignore-case t))
(completing-read "Choose subject: " subjects nil nil)))

(defun assigned-members-complete ()
  (let ((list (loop for i in *rcd-org-members-for-assigned-tasks* collect (cons 
(second i) (second i)
list))

(defun rcd/org-send-assigned-task ()
  "Sends assigned task to designated individual as Org"
  (interactive)
  (let* ((member-data (rcd-org-extract-assigned-member-email-data))
 (id (if member-data (first member-data) nil))
 (signature (if (equal (type-of (symbol-value (fifth member-data))) 
'cons)
(third (symbol-value (fifth member-data))) ""))
 (file (rcd-org-subtree-to-file signature))
 (subject (rcd/org-find-headline))
 (esubject (escape-% subject))
 (ask (unless id (y-or-n-p "No assignment found. Do you want to send it 
by email?")))
 (name (if id (third member-data)))
 ;; (name (if ask (read-from-minibuffer "Name:") name))
 (voice (format "The task '%s' is being sent to '%s'" subject name))
 (email (if id (if (equal (type-of (fourth member-data)) 'cons)
   (car (fourth member-data))
 (fourth member-data
 (email (if ask (cf-search-email (read-from-minibuffer "Search for 
email: ")) email))
 (really (y-or-n-p (format "Do you really want to send it to: %s?" (if 
ask email name)
(if (and really (or id ask))
  (if (string-match "@" email)
(progn
  ;; (message (escape-% subject))
  (speak voice)
  (rcd-org-mutt-send-file name email esubject file))
(message "No email specified"))
  (message "Aborted sending."


Re: [O] Configure Helm Source from org-tags-view

2019-08-08 Thread Nathan Neff
Hi Jean Louis,

Thank you for your time and advice - I am trying to spend time
learning Elisp and more of the underpinnings in org-mode - so your
advice was very helpful.

In fact, I found that org-scan-tags is called by org-map-entries -
org-map-entries can specify a SCOPE of 'agenda (not the same
as the 'agenda that's provided to org-scan tags).

So, I got the code down to a one-liner!

;; This searches all agenda-files and returns a bunch of
;; stuff that I can re-use in Helm
(org-map-entries 'agenda "bkm" 'agenda)

As an aside:
When I run this in org-babel, it gives me a table with two cells:
| foo:Foo.org :bkm: | inbox:
   Formatting Strings:bkm:emacs: |

Why doesn't this table have two *rows* instead of two *cells*?
If anyone knows the fix for this, I'd appreciate it.  It probably has
something to do with the type
of data that's returned by the function, but I'll look into it later.

Thanks,
--Nate



Thanks for your help,
--Nate





On Thu, Aug 8, 2019 at 3:30 PM Jean Louis  wrote:

> * Nathan Neff  [2019-08-08 22:24]:
> > I removed the staff from the beginning of the function call, and changed
> > staff to bar  I also removed the (or (and)) conditions :-)
> >
> > Now, I need to see how to make this function search all agenda files - it
> > seems
> > to work only on the headlines in Foo.org
>
> I am glad that it works somehow for you.
>
> I would not like that type of abuse on myself...
>
> I would just do this:
>
> M-x helm-occur
>
> :staff
>
> and it would be enough.
>


Re: [O] Configure Helm Source from org-tags-view

2019-08-08 Thread Jean Louis
* Nathan Neff  [2019-08-08 22:24]:
> I removed the staff from the beginning of the function call, and changed
> staff to bar  I also removed the (or (and)) conditions :-)
> 
> Now, I need to see how to make this function search all agenda files - it
> seems
> to work only on the headlines in Foo.org

I am glad that it works somehow for you.

I would not like that type of abuse on myself...

I would just do this:

M-x helm-occur

:staff

and it would be enough.



Re: [O] Configure Helm Source from org-tags-view

2019-08-08 Thread Jean Louis
* Nathan Neff  [2019-08-08 22:04]:
> Hi Jean,
> 
> Thank you - however, I can't get this function to return anything.
> 
> org-scan-tags accepts an action, a matcher and a todo-only.
> 
> Code:
> 
> (org-scan-tags 'agenda ;; Action
>   '(staff lambda (todo tags-list level)  ;; Matcher
>(progn
> (setq org-cached-props nil)
> (or (and (member staff tags-list)
> ;; End Matcher
>org--matcher-tags-todo-only) ;; Todo-only
> 
> * To my knowledge, the 'agenda is the action, and the list starting with
> `(staff ) is the matcher.

If you do not have tag "staff" you cannot find anything. So change it
to your own tag. But now after reading I see you have it actually

And function is not going to work outside Org buffer. So I have
evaluated it with M-:

In fact I did following:

(setq a (org-scan-tags 'agenda '(staff lambda (todo tags-list level) (progn 
(setq org-cached-props nil) (or (and (member staff tags-list)  
org--matcher-tags-todo-only))

Then I have inspected 'a' in scratch buffer.

I see that it has various properties for faces, so is not quite the
best output.

> * Why does the tag I'm searching for (staff) appear as the first
> atom in the matcher parameter?  Why isn't it just a lambda?

Me not developer.

> * I don't quite understand what the or and and are doing.  It seems
> like I don't need either of them.

I just tried giving some pointers, so in org-scan-tags is probably the
solution.

When I looked at that function I got fascinated with the type of
programming that I don't like, maybe it is common in Emacs Lisp, but
not what I used to learn from Common Lisp. And I program in Emacs Lisp
in such way that one function evaluates and gives out some results. I
do not work with global variables from within functions.

I was programming in Perl and I stopped the nonsense, but not quite
"just in time". When looking at that function org-scan-tags it looks
to me as Perl. It is LISP without its beauty. I keep functions small
and simple.

My knowledge about "right way" is tiny. All I know is that it looks
ugly as Perl.

I would never do it this way. Not my style.

I would make a function that scans tags and gives out Emacs Lisp
structure, whatever it is.

Then anybody can do with the results whatever they want. We can then
make tags into helm or any other feature.

> My org-agenda-files contains files and I have a headline with the
> tag staff - no quotes, and the function's not returning anything.

Oh, you do have it?

-- don't abuse yourself by looking below

(defvar org--matcher-tags-todo-only nil)

(defun org-scan-tags (action matcher todo-only  start-level)
  "Scan headline tags with inheritance and produce output ACTION.

ACTION can be `sparse-tree' to produce a sparse tree in the current buffer,
or `agenda' to produce an entry list for an agenda view.  It can also be
a Lisp form or a function that should be called at each matched headline, in
this case the return value is a list of all return values from these calls.

MATCHER is a function accepting three arguments, returning
a non-nil value whenever a given set of tags qualifies a headline
for inclusion.  See `org-make-tags-matcher' for more information.
As a special case, it can also be set to t (respectively nil) in
order to match all (respectively none) headline.

When TODO-ONLY is non-nil, only lines with a TODO keyword are
included in the output.

START-LEVEL can be a string with asterisks, reducing the scope to
headlines matching this string."
  (require 'org-agenda)
  (let* ((re (concat "^"
 (if start-level
 ;; Get the correct level to match
 (concat "\\*\\{" (number-to-string start-level) "\\} ")
   org-outline-regexp)
 " *\\(" (regexp-opt org-todo-keywords-1 'words) "\\)?"
 " *\\(.*?\\)\\([ \t]:\\(?:" org-tag-re ":\\)+\\)?[ \t]*$"))
 (props (list 'face 'default
  'done-face 'org-agenda-done
  'undone-face 'default
  'mouse-face 'highlight
  'org-not-done-regexp org-not-done-regexp
  'org-todo-regexp org-todo-regexp
  'org-complex-heading-regexp org-complex-heading-regexp
  'help-echo
  (format "mouse-2 or RET jump to Org file %S"
  (abbreviate-file-name
   (or (buffer-file-name (buffer-base-buffer))
   (buffer-name (buffer-base-buffer)))
 (org-map-continue-from nil)
 lspos tags tags-list
 (tags-alist (list (cons 0 org-file-tags)))
 (llast 0) rtn rtn1 level category i txt
 todo marker entry priority
 ts-date ts-date-type ts-date-pair)
(unless (or 

Re: [O] Configure Helm Source from org-tags-view

2019-08-08 Thread Nathan Neff
Okay, I got this to work in org-babel in a file foo.org
that has headlines like this:

* Foo.org :bar:

#+BEGIN_SRC emacs-lisp

(org-scan-tags 'agenda ;; Action
  '(lambda (todo tags-list level)  ;; Matcher
   (progn
(setq org-cached-props nil)
(member "bar" tags-list))) ;; End
Matcher
   org--matcher-tags-todo-only) ;; Todo-only
#+END_SRC

I removed the "staff" from the beginning of the function call, and changed
staff to "bar"  I also removed the (or (and)) conditions :-)

Now, I need to see how to make this function search all agenda files - it
seems
to work only on the headlines in Foo.org

Thanks,
--Nate

On Thu, Aug 8, 2019 at 3:03 PM Nathan Neff  wrote:

> Hi Jean,
>
> Thank you - however, I can't get this function to return anything.
>
> org-scan-tags accepts an action, a matcher and a todo-only.
>
> Code:
>
> (org-scan-tags 'agenda ;; Action
>   '(staff lambda (todo tags-list level)  ;; Matcher
>(progn
> (setq org-cached-props nil)
> (or (and (member staff tags-list)
> ;; End Matcher
>org--matcher-tags-todo-only) ;; Todo-only
>
> * To my knowledge, the 'agenda is the action, and the list starting with
> `(staff ) is the matcher.
> * Why does the tag I'm searching for ("staff") appear as the first "atom"
> in the
> "matcher" parameter?  Why isn't it just a lambda?
> * I don't quite understand what the "or" and "and" are doing.  It seems
> like
> I don't need either of them.
>
> My org-agenda-files contains files and I have a headline with the tag
> "staff"
> - no quotes, and the function's not returning anything.
>
> Thanks,
> --Nate
>
>
> On Thu, Aug 8, 2019 at 2:13 PM Jean Louis  wrote:
>
>> * Nathan Neff  [2019-08-08 18:50]:
>> > Hello all,
>> >
>> > Has anyone created a Helm source from the results of org-agenda?
>> >
>> > Specifically org-tags-view I think would be a cool Helm source to
>> > configure where the headings that have certain tags could be displayed
>> > by Helm.
>> >
>> > I looked @ the code for org-tags-view and it's fairly straight
>> > forward - however, I think that the function itself is tightly
>> > coupled between finding the results and displaying the results.  In
>> > other words, there's no easy function that I see which would provide
>> > headings that match a tags search that I could use as a Helm source.
>>
>> If tag is 'staff, this below will give structure out:
>>
>> (org-scan-tags 'agenda '(staff lambda (todo tags-list level) (progn
>> (setq org-cached-props nil) (or (and (member staff tags-list)
>> org--matcher-tags-todo-only)
>>
>> Now `org-scan-tags` could be inspected if it constructs some lists,
>> alist, that are somewhat nicer than such output.
>>
>> But that output can be converted to HELM completion.
>>
>> Jean
>>
>


Re: [O] Configure Helm Source from org-tags-view

2019-08-08 Thread Nathan Neff
Hi Jean,

Thank you - however, I can't get this function to return anything.

org-scan-tags accepts an action, a matcher and a todo-only.

Code:

(org-scan-tags 'agenda ;; Action
  '(staff lambda (todo tags-list level)  ;; Matcher
   (progn
(setq org-cached-props nil)
(or (and (member staff tags-list)
;; End Matcher
   org--matcher-tags-todo-only) ;; Todo-only

* To my knowledge, the 'agenda is the action, and the list starting with
`(staff ) is the matcher.
* Why does the tag I'm searching for ("staff") appear as the first "atom"
in the
"matcher" parameter?  Why isn't it just a lambda?
* I don't quite understand what the "or" and "and" are doing.  It seems like
I don't need either of them.

My org-agenda-files contains files and I have a headline with the tag
"staff"
- no quotes, and the function's not returning anything.

Thanks,
--Nate


On Thu, Aug 8, 2019 at 2:13 PM Jean Louis  wrote:

> * Nathan Neff  [2019-08-08 18:50]:
> > Hello all,
> >
> > Has anyone created a Helm source from the results of org-agenda?
> >
> > Specifically org-tags-view I think would be a cool Helm source to
> > configure where the headings that have certain tags could be displayed
> > by Helm.
> >
> > I looked @ the code for org-tags-view and it's fairly straight
> > forward - however, I think that the function itself is tightly
> > coupled between finding the results and displaying the results.  In
> > other words, there's no easy function that I see which would provide
> > headings that match a tags search that I could use as a Helm source.
>
> If tag is 'staff, this below will give structure out:
>
> (org-scan-tags 'agenda '(staff lambda (todo tags-list level) (progn
> (setq org-cached-props nil) (or (and (member staff tags-list)
> org--matcher-tags-todo-only)
>
> Now `org-scan-tags` could be inspected if it constructs some lists,
> alist, that are somewhat nicer than such output.
>
> But that output can be converted to HELM completion.
>
> Jean
>


Re: [O] Configure Helm Source from org-tags-view

2019-08-08 Thread Jean Louis
* Nathan Neff  [2019-08-08 18:50]:
> Hello all,
> 
> Has anyone created a Helm source from the results of org-agenda?
> 
> Specifically org-tags-view I think would be a cool Helm source to
> configure where the headings that have certain tags could be displayed
> by Helm.
> 
> I looked @ the code for org-tags-view and it's fairly straight
> forward - however, I think that the function itself is tightly
> coupled between finding the results and displaying the results.  In
> other words, there's no easy function that I see which would provide
> headings that match a tags search that I could use as a Helm source.

If tag is 'staff, this below will give structure out:

(org-scan-tags 'agenda '(staff lambda (todo tags-list level) (progn
(setq org-cached-props nil) (or (and (member staff tags-list)
org--matcher-tags-todo-only)

Now `org-scan-tags` could be inspected if it constructs some lists,
alist, that are somewhat nicer than such output.

But that output can be converted to HELM completion.

Jean



Re: [O] Configure Helm Source from org-tags-view

2019-08-08 Thread Jean Louis
* Nathan Neff  [2019-08-08 18:50]:
> Hello all,
> 
> Has anyone created a Helm source from the results of org-agenda?
> 
> Specifically org-tags-view I think would be a cool Helm source to
> configure where the headings that have certain tags could be displayed
> by Helm.
> 
> I looked @ the code for org-tags-view and it's fairly straight
> forward - however, I think that the function itself is tightly
> coupled between finding the results and displaying the results.  In
> other words, there's no easy function that I see which would provide
> headings that match a tags search that I could use as a Helm source.

I almost never use the tags view. But now I have tried it. I
understand.

Maybe you find out what is the result or evaluation that creates that
list, maybe it is some list of lists, and it could get ready for HELM
completion with few tweaks.

Jean