Ihor Radchenko <yanta...@gmail.com> writes: > Arthur Miller <arthur.mil...@live.com> writes: > >>> By "generic" I did not mean general-purpose all-functional framework. >>> We just need something to remove code duplication in >>> org-export-dispatch, org-agenda, org-capture, org-set-tags-command, etc >>> They all share pretty similar code to generate dialogues. >>> >>> As for familiarity, I understand and it is exactly the reason why I >>> suggested to factor out the menu code from capture templates. >> >> I am not really familiar with those other dialogues but org-capture, so I >> only >> had that one in the mind. Yes, I agree if the similar code is used/shared in >> several places than it does make sense to refactor it out. > > This refactoring could be a practical way to get something similar to > your proposal into Org core. At least, if the menus are factored out > appropriately.
As I see from 'org-capture' function, it does not seem to be terribly hard to factor menu creation out. There seem to be two parts: template selection which is already done by 'org-capture-select-template' function, and then the main work that one has to implement on its own, which is specific to whatever one would like to implement. I just did a quick refactor to test the idea: #+begin_src emacs-lisp (require 'org-capture) (defun org-menu (&optional goto keys) (interactive "P") (let* ((entry (org-capture-select-template keys))) (cond ((equal entry "C") (customize-variable 'org-capture-templates)) ((equal entry "q") (user-error "Abort")) (t (let ((f (nth 2 entry))) (if (not f) (error "Missing function specification.") (if (commandp f) (call-interactively f) (if (functionp f) (funcall f) (error "Invalid function specification."))))))))) (defun org-capture-some-menu () (interactive) (let ((org-capture-templates `(("F" "Functions") ("Fh" "Hello World" (lambda () (message "Hello, World"))) ("Ff" "Find file" ,(function find-file))))) (org-menu))) (define-key global-map (kbd "C-S-m") #'org-capture-some-menu) #+end_src Instead of hardcoding the actual work in the conditional statement, there should be a function to be called, so org-capture would setup its own work, some random "exec" menu like here would setup its own and so on. I haven't look at other parts of org you have mentioned, so I am not yet sure if the approach would work for all the kids in the block. I don't think it would that much harder to refactor this out, but I might be wrong, since I am not that familiar with org code. Factoring this out of Org itself, as suggested by RMS in the link you posted might be much more work though. I haven't looked at that, and question is if that is really worth the effort? I would agree with him that things like org-table and date/time handling would be great to have in entire Emacs, without need to load org, at least bigger parts of it. If I remember well, table mode started outside of org as its own minor mode and got merged into org. > The above statement is a hint that patches are welcome :) As said, I am not that well familiar with org in-depth, and with other places that might need to be factored out, so I don't promise anything. Initially I just got a quick idea while working on a project of mine with org-capture, and hacked the 'org-capture' function to implement my idea :). /a