From: "Kévin Le Gouguec" <kevin.legouguec@gmail.com> To: emacs-orgmode@gnu.org Subject: Setting org-todo-keywords through directory-local variables Date: Wed, 20 May 2020 23:12:47 +0200 [thread overview] Message-ID: <87mu62gvjk.fsf@gmail.com> (raw) Hello, I'd like to set org-todo-keywords and org-todo-keyword-faces through directory-local variables, to get rid of duplicate #+SEQ_TODO lines in my Org files[1]. Right now I see two obstacles for this to work: (1) org-set-regexps-and-options, which sets up a bunch of TODO-related machinery, insists on using (default-value 'org-todo-keywords), (2) this function is called in the major mode function, which IIUC means that directory-local values have not been applied yet. The first obstacle looks like it can be easily removed[2]; the second obstacle looks more substantial. It is trivially side-stepped by sticking (hack-local-variables) at the top of org-mode; to my untrained eye, it looks like TRT would rather be for Org to add org-set-regexps-and-options to hack-local-variables-hook. This sounds like a risky change though: I imagine that a lot of what happens in the major mode function depends on what org-set-regexps-and-options sets up, and would therefore need to be moved to this hook as well. Figuring which parts should be moved seems like a non-trivial task that might introduce some regressions… Can anyone confirm that this would (in principle) be the way forward, or tell me if I am missing something[3]? Thank you for your time. [1] For example: #+begin_src elisp ((org-mode . ((org-todo-keywords . ((sequence "REPORT" "REPORTED" "WAITING" "FIXED") (sequence "CANCELED"))) (org-todo-keyword-faces . (("REPORT" . org-todo) ("REPORTED" . warning) ("WAITING" . warning) ("FIXED" . org-done) ("CANCELED" . shadow)))))) #+end_src I'd like that so much that I went through the trouble of writing safe-local-variable predicates for these variables: #+begin_src elisp (put 'org-todo-keywords 'safe-local-variable (lambda (x) (cl-every (lambda (seq) (and (memq (car seq) '(sequence type)) (cl-every (lambda (i) (stringp i)) (cdr seq)))) x))) (put 'org-todo-keyword-faces 'safe-local-variable (lambda (x) (cl-every (lambda (pair) (pcase pair (`(,keyword . ,face) (and (stringp keyword) (or (facep face) (listp face)))))) x))) #end_src [2] I tried to go through org.el's history, but I could not find a rationale for using default-value. [3] Alternatively, maybe the answer is as simple as "Org documents should be self-sufficient; keywords should be explicitly set in #+SEQ_TODO lines"; that wouldn't sound right though, since org-todo-keywords is customizable.
next reply other threads:[~2020-05-20 21:15 UTC|newest] Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-05-20 21:12 Kévin Le Gouguec [this message] 2020-05-21 23:12 ` Kévin Le Gouguec 2020-05-22 15:11 ` Nicolas Goaziou 2020-05-23 12:58 ` Kévin Le Gouguec 2020-06-24 17:54 ` Kévin Le Gouguec 2020-09-05 15:39 ` Bastien 2020-05-22 8:42 ` Nicolas Goaziou
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style List information: https://www.orgmode.org/ * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=87mu62gvjk.fsf@gmail.com \ --to=kevin.legouguec@gmail.com \ --cc=emacs-orgmode@gnu.org \ --subject='Re: Setting org-todo-keywords through directory-local variables' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Code repositories for project(s) associated with this inbox: https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).