emacs-orgmode
[Top][All Lists]
Advanced

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

Re: org-tag-persistent-alist AND per-file dynamic tags


From: chris
Subject: Re: org-tag-persistent-alist AND per-file dynamic tags
Date: Mon, 29 Nov 2021 04:49:00 +0100

On Saturday, 6 November 2021 10:10:55 CET Victor A. Stoichita wrote:

> Greetings to all,

>

> Reading the manual about setting glopal/per-file tags [1], I wonder if

> it is possible to use org-tag-persistent-alist AND per-file

> dynamic tags.


I use footnote 53 from https://orgmode.org/manual/Setting-Tags.html.

I put my tags in `tags-file.org`, using `#+TAGS:`.

I've put the next two lines in `init.el`.


(setq org-agenda-files (list "~/path-to/tags-file.org")

         org-complete-tags-always-offer-all-agenda-tags t)


And I have completion on both the tags in `tags-file.org` and tags in the current buffer.

I don't use `org-tag-alist`, so the comments made in https://emacs.stackexchange.com/q/69369#comment111307_69369, would not apply.


I use a script to collect the tags, based on Kitchin's https://stackoverflow.com/a/27527252, and help from `#emacs`.

I use `with-temp-buffer` because otherwise all the files accessed by `org-map-entries` are showing when I do `C-x C-b` and I find it cumbersome.

The tags are sorted by frequency, which is not necessary here, but it's really nice.

I suppose you could put a `defun nice-function-name` on top of it, but so far, it's only a hack.

`~/path-to-directory` and `tags-file.org` should be tweaked to your needs. `default-directory` can be used for the former, too.

(caveat: the script makes use of `-flatten`, `-map` and `-uniq, from `dash.el`. It also makes use of `mapcar` where `-map` would do, `seq-sort` where `-sort` would do, `seq-reduce` where `-reduce` would do. Standard elisp has `flatten-tree`, for `-flatten`, `mapcar` for `-map`, `delete-dups` for `-uniq`. https://github.com/Droogans/unmaintainable-code)


(let* ((dir "~/path-to-directory")

       (all-tags

        (-flatten

         (-map

          (lambda (fpath)

            (with-temp-buffer

              (insert-file-contents fpath)

              (org-mode)

              (org-map-entries

               (lambda ()

                 (let ((tag-string (car (last (org-heading-components)))))

                   (when tag-string

                     (split-string tag-string ":" t)))) nil nil)))

          (directory-files-recursively dir "^[^#].*org$")))))

  (let ((tags-count

         (cl-loop for tag in (-uniq all-tags)

                  collect (cons tag (cl-count tag all-tags :test 'string=)))))

    (let ((tags-list

           (mapcar 'car (seq-sort (lambda (a b) (< (cdr b) (cdr a))) tags-count))))

      (let ((tags-string

             (cl-reduce (lambda (a b) (concat a " " b)) tags-list)))

        (let ((filled-tags-string

               (with-temp-buffer

                 (setq fill-column 70

                       fill-prefix "#+TAGS: ")

                 (insert (concat "#+TAGS: " tags-string)) (fill-paragraph) (buffer-string))))

          (with-temp-file "tags-file.org" (insert filled-tags-string)))))))



>

> When using org-set-tags-command, I’d like to select from a list

> comprising both:

> 1. the list of predefined tags in org-tag-persistent-alist

> 2. the list of all the tags that are already in use in the current

>    buffer (some of which might not be in the persistent alist). I don’t

>    want to use the #+TAGS keyword at file-level, just the list of tags

>    already attached to some headline in the buffer.

>

> The manual says:

> > If you have globally defined your preferred set of tags using the

> > variable org-tag-alist, but would like to use a dynamic tag list in

> > a specific file, add an empty ‘TAGS’ keyword to that file

>

> And then it says:

> > If you have a preferred set of tags that you would like to use in every

> > file, in addition to those defined on a per-file basis by ‘TAGS’

> > keyword, then you may specify a list of tags with the variable

> > org-tag-persistent-alist.

>

> I tried to combine both behaviors by putting an empty ’TAGS’ keyword at

> the top of my file. But this still only gives me the tags in

> org-tag-persistent-alist. What would be the best way to add to it for

> completion the tags already used in the buffer?

>

> Regards,

> Victor

>

> Footnotes:

> [1]  https://orgmode.org/manual/Setting-Tags.html




reply via email to

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