From mboxrd@z Thu Jan 1 00:00:00 1970 From: stardiviner Subject: Re: [Feature Request] Add an dispatcher command (keybinding) for inserting dynamic blocks Date: Thu, 20 Dec 2018 10:10:28 +0800 Message-ID: <87k1k57xt7.fsf@gmail.com> References: <871s7lvn4n.fsf@gmail.com> <3332dc93-afb1-0854-6298-06e0939aff3a@free.fr> <87wop1zcwo.fsf@nicolasgoaziou.fr> Reply-To: numbchild@gmail.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:36144) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gZnn1-0000XG-6m for emacs-orgmode@gnu.org; Wed, 19 Dec 2018 21:10:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gZnmt-0006c7-39 for emacs-orgmode@gnu.org; Wed, 19 Dec 2018 21:10:17 -0500 Received: from [61.175.244.13] (port=4509 helo=dark.localdomain) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gZnmn-0006KM-EH for emacs-orgmode@gnu.org; Wed, 19 Dec 2018 21:10:07 -0500 In-reply-to: <87wop1zcwo.fsf@nicolasgoaziou.fr> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: emacs-orgmode@gnu.org Cc: Thierry Banel --=-=-= Content-Type: text/plain I add code patch in attachment. Nicolas, can you review it? Any suggestion welcome. After running test with "make test", I got some failed test might related to my code changing. But I checked out the tests, have not found anywhere invoking the renamed functions. Ran 814 tests, 808 results as expected, 6 unexpected (2018-12-20 09:57:41+0800) 9 expected failures 6 unexpected results: FAILED ob-D/inhomogeneous_table FAILED ob-D/list-list-var FAILED ob-D/list-var FAILED ob-D/vector-var FAILED test-org-clock/clocktable/lang FAILED test-org-colview/columns-width --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-org.el-Add-dispatch-command-for-inserting-dynamic-bl.patch >From 16ff083a475b7f125136a7bbd131e85833ad822d Mon Sep 17 00:00:00 2001 From: stardiviner Date: Thu, 20 Dec 2018 09:21:38 +0800 Subject: [PATCH] org.el: Add dispatch command for inserting dynamic blocks * lisp/org.el (org-dynamic-block-insert-dispatch): The dispatch command for inserting dynamic blocks. (org-dynamic-block-parameters, org-dynamic-block-functions, org-dynamic-block-types, org-dynamic-block-set-parameters, org-dynamic-block-get-parameter): New custom option, and new functions about dynamic blocks. (org-clock-report, org-columns-insert-dblock) Those functions are renamed to new name, and removed corresponding keybinding, take controled by dispatch command org-dynamic-block-insert-dispatch. * doc/org-manual.org: Add manual for dispatch command ~org-dynamic-block-insert-dispatch~. --- doc/org-manual.org | 9 ++++--- etc/ORG-NEWS | 20 +++++++++++++++ lisp/org-clock.el | 2 +- lisp/org-colview.el | 2 +- lisp/org-compat.el | 2 -- lisp/org.el | 59 ++++++++++++++++++++++++++++++++++++++++----- 6 files changed, 81 insertions(+), 13 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index 051ffaa4d..37afad5b2 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -19872,9 +19872,12 @@ users mailing list, at mailto:emacs-orgmode@gnu.org. Org supports /dynamic blocks/ in Org documents. They are inserted with begin and end markers like any other code block, but the contents -are updated automatically by a user function. For example, {{{kbd(C-c -C-x C-r)}}} inserts a dynamic table that updates the work time (see -[[*Clocking Work Time]]). +are updated automatically by a user function. You can use dispatch +command ~org-dynamic-block-insert-dispatch~ which is bind to +keybinding {{{kbd(C-c C-x i)}}} by default. + +For example, {{{kbd(C-c C-x i)}}} + ~clocktable~ inserts a dynamic +table that updates the work time (see [[*Clocking Work Time]]). Dynamic blocks can have names and function parameters. The syntax is similar to source code block specifications: diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 811e98147..5bce606f9 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -12,6 +12,11 @@ Please send Org bug reports to mailto:emacs-orgmode@gnu.org. * Version 9.2 ** Incompatible changes +*** Renamed some dynamic block generate functions name + +- Renamed ~org-clock-report~ to ~org-insert-dblock:clocktable~ +- Renamed ~org-columns-insert-dblock~ to ~org-insert-dblock:columnview~ + *** Removal of OrgStruct mode mode and radio lists OrgStruct minor mode and radio lists mechanism (~org-list-send-list~ @@ -170,6 +175,15 @@ This is consistent with the naming of =org-dblock-write:columnview= options, where =:match= is also used as a headlines filter. ** New features + +*** Add a dispatcher command to insert dynamic blocks + +You can add dynamic block into ~org-dynamic-block-parameters~ with +function ~org-dynamic-block-set-parameters~ just like +~org-link-set-parameters~. All dynamic blocks in +~org-dynamic-block-set-parameters~ can be used by +~org-dynamic-block-insert-dispatch~ command. + *** Add ~:results link~ support for Babel With this output format, create a link to the file specified in @@ -314,6 +328,12 @@ remove it. ** New commands and functions +*** ~org-dynamic-block-insert-dispatch~ + +Use default keybinding =[C-c C-x i]= to run command +~org-dynamic-block-insert-dispatch~. It will prompt user to select +dynamic block in ~org-dynamic-block-parameters~. + *** ~org-insert-structure-template~ This function can be used to wrap existing text of Org elements in diff --git a/lisp/org-clock.el b/lisp/org-clock.el index 494423e4e..ebe7b8637 100644 --- a/lisp/org-clock.el +++ b/lisp/org-clock.el @@ -2024,7 +2024,7 @@ fontified, and then returned." (point-at-bol))))) ;;;###autoload -(defun org-clock-report (&optional arg) +(defun org-insert-dblock:clocktable (&optional arg) "Update or create a table containing a report about clocked time. If point is inside an existing clocktable block, update it. diff --git a/lisp/org-colview.el b/lisp/org-colview.el index 932275836..6a9a8a601 100644 --- a/lisp/org-colview.el +++ b/lisp/org-colview.el @@ -1489,7 +1489,7 @@ PARAMS is a property list of parameters: (org-table-align))))) ;;;###autoload -(defun org-columns-insert-dblock () +(defun org-insert-dblock:columnview () "Create a dynamic block capturing a column view table." (interactive) (let ((id (completing-read diff --git a/lisp/org-compat.el b/lisp/org-compat.el index 77bf03650..bfe9fae9c 100644 --- a/lisp/org-compat.el +++ b/lisp/org-compat.el @@ -214,8 +214,6 @@ Counting starts at 1." (define-obsolete-function-alias 'org-babel-trim 'org-trim "Org 9.0") (define-obsolete-variable-alias 'org-html-style 'org-html-head "24.4") -(define-obsolete-function-alias 'org-insert-columns-dblock - 'org-columns-insert-dblock "Org 9.0") (define-obsolete-variable-alias 'org-export-babel-evaluate 'org-export-use-babel "Org 9.1") (define-obsolete-function-alias 'org-activate-bracket-links diff --git a/lisp/org.el b/lisp/org.el index 8dddf0295..924cd3866 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -132,7 +132,7 @@ Stars are put in group 1 and the trimmed body in group 2.") (declare-function org-clock-in-last "org-clock" (&optional arg)) (declare-function org-clock-out "org-clock" (&optional switch-to-state fail-quietly at-time)) (declare-function org-clock-remove-overlays "org-clock" (&optional beg end noremove)) -(declare-function org-clock-report "org-clock" (&optional arg)) +(declare-function org-insert-dblock:clocktable "org-clock" (&optional arg)) (declare-function org-clock-sum "org-clock" (&optional tstart tend headline-filter propname)) (declare-function org-clock-sum-current-item "org-clock" (&optional tstart)) (declare-function org-clock-timestamps-down "org-clock" (&optional n)) @@ -140,7 +140,7 @@ Stars are put in group 1 and the trimmed body in group 2.") (declare-function org-clock-update-time-maybe "org-clock" ()) (declare-function org-clocking-buffer "org-clock" ()) (declare-function org-clocktable-shift "org-clock" (dir n)) -(declare-function org-columns-insert-dblock "org-colview" ()) +(declare-function org-insert-dblock:columnview "org-colview" ()) (declare-function org-duration-from-minutes "org-duration" (minutes &optional fmt canonical)) (declare-function org-element-at-point "org-element" ()) (declare-function org-element-cache-refresh "org-element" (pos)) @@ -11645,6 +11645,54 @@ If COMMAND is not given, use `org-update-dblock'." (unless (re-search-forward org-dblock-end-re nil t) (error "Dynamic block not terminated")))))) +(defcustom org-dynamic-block-parameters + '(("columnview" :function org-insert-dblock:columnview) + ("clocktable" :function org-insert-dblock:clocktable)) + "An alist of properties that defines all the Org dynamic blocks." + :type '(alist :tag "dynamic block name" + :value-type plist) + :group 'org-block + :package-version '(Org . "9.1")) + +(defun org-dynamic-block-get-parameter (type key) + "Get TYPE dynamic block property for KEY. +TYPE is a string and KEY is a plist keyword." + (plist-get + (cdr (assoc type org-dynamic-block-parameters)) + key)) + +(defun org-dynamic-block-set-parameters (type &rest parameters) + "Set dynamic block TYPE properties to PARAMETERS. +PARAMETERS should be :key val pairs. Use it like `org-link-set-parameters'." + (let ((data (assoc type org-dynamic-block-parameters))) + (if data (setcdr data (org-combine-plists (cdr data) parameters)) + (push (cons type parameters) org-dynamic-block-parameters)))) + +(defun org-dynamic-block-types () + "Return a list of known dynamic block types." + (mapcar #'car org-dynamic-block-parameters)) + +(defun org-dynamic-block-functions () + "Return a list of functions that are called to insert dynamic block." + (cl-loop for dblock in org-dynamic-block-parameters + with insert-func + do (setq insert-func (org-dynamic-block-get-parameter (car dblock) :function)) + if insert-func + collect insert-func)) + +(defun org-dynamic-block-insert-dispatch (dblock-type) + "Select and insert an Org type dynamic block. +This is a dispatching function which prompts for the type of +dynamic block to insert. It dispatches to functions which names +matches the pattern `org-insert-dblock:*'" + (interactive (list + (completing-read "dynamic block: " + (mapcar #'car org-dynamic-block-parameters)))) + (let ((func (org-dynamic-block-get-parameter dblock-type :function))) + (if (functionp func) + (funcall func) + (message "No such dynamic block: %s" func)))) + (defun org-dblock-update (&optional arg) "User command for updating dynamic blocks. Update the dynamic block at point. With prefix ARG, update all dynamic @@ -19047,6 +19095,7 @@ COMMANDS is a list of alternating OLDDEF NEWDEF command names." (org-defkey org-mode-map (kbd "C-c C-x C-w") #'org-cut-special) (org-defkey org-mode-map (kbd "C-c C-x M-w") #'org-copy-special) (org-defkey org-mode-map (kbd "C-c C-x C-y") #'org-paste-special) +(org-defkey org-mode-map (kbd "C-c C-x i") #'org-dynamic-block-insert-dispatch) (org-defkey org-mode-map (kbd "C-c C-x C-t") #'org-toggle-time-stamp-overlays) (org-defkey org-mode-map (kbd "C-c C-x C-i") #'org-clock-in) (org-defkey org-mode-map (kbd "C-c C-x C-x") #'org-clock-in-last) @@ -19055,7 +19104,6 @@ COMMANDS is a list of alternating OLDDEF NEWDEF command names." (org-defkey org-mode-map (kbd "C-c C-x C-j") #'org-clock-goto) (org-defkey org-mode-map (kbd "C-c C-x C-q") #'org-clock-cancel) (org-defkey org-mode-map (kbd "C-c C-x C-d") #'org-clock-display) -(org-defkey org-mode-map (kbd "C-c C-x C-r") #'org-clock-report) (org-defkey org-mode-map (kbd "C-c C-x C-u") #'org-dblock-update) (org-defkey org-mode-map (kbd "C-c C-x C-l") #'org-toggle-latex-fragment) (org-defkey org-mode-map (kbd "C-c C-x C-v") #'org-toggle-inline-images) @@ -19067,7 +19115,6 @@ COMMANDS is a list of alternating OLDDEF NEWDEF command names." (org-defkey org-mode-map (kbd "C-c C-x e") #'org-set-effort) (org-defkey org-mode-map (kbd "C-c C-x E") #'org-inc-effort) (org-defkey org-mode-map (kbd "C-c C-x o") #'org-toggle-ordered-property) -(org-defkey org-mode-map (kbd "C-c C-x i") #'org-columns-insert-dblock) (org-defkey org-mode-map (kbd "C-c C-,") #'org-insert-structure-template) (org-defkey org-mode-map (kbd "C-c C-x .") #'org-timer) (org-defkey org-mode-map (kbd "C-c C-x -") #'org-timer-item) @@ -20850,7 +20897,7 @@ an argument, unconditionally call `org-insert-heading'." "--" ["Set property" org-set-property (not (org-before-first-heading-p))] ["Column view of properties" org-columns t] - ["Insert Column View DBlock" org-columns-insert-dblock t]) + ["Insert Column View DBlock" org-insert-dblock:columnview t]) ("Dates and Scheduling" ["Timestamp" org-time-stamp (not (org-before-first-heading-p))] ["Timestamp (inactive)" org-time-stamp-inactive (not (org-before-first-heading-p))] @@ -20885,7 +20932,7 @@ an argument, unconditionally call `org-insert-heading'." ["Goto running clock" org-clock-goto t] "--" ["Display times" org-clock-display t] - ["Create clock table" org-clock-report t] + ["Create clock table" org-insert-dblock:clocktable t] "--" ["Record DONE time" (progn (setq org-log-done (not org-log-done)) -- 2.20.0 --=-=-= Content-Type: text/plain -- [ stardiviner ] I try to make every word tell the meaning what I want to express. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 --=-=-=--