From dfbab1da2c5348b9a8b9002005dd8ad451154a83 Mon Sep 17 00:00:00 2001 From: Andreas Gerler Date: Thu, 30 Jan 2020 14:39:18 +0100 Subject: [PATCH] update org-mode --- bba.org | 4 +- elpa/org-20191028/ob-keys.el | 106 - elpa/org-20191028/org-attach.el | 625 -- elpa/org-20191028/org-autoloads.el | 820 --- elpa/org-20191028/orgcard.pdf | Bin 118708 -> 0 bytes elpa/{org-20191028 => org-20200127}/COPYING | 0 .../README_ELPA | 0 elpa/{org-20191028 => org-20200127}/dir | 3 +- .../etc/ORG-NEWS | 490 +- .../etc/styles/OrgOdtContentTemplate.xml | 0 .../etc/styles/OrgOdtStyles.xml | 0 .../etc/styles/README | 2 +- elpa/{org-20191028 => org-20200127}/ob-C.el | 8 +- elpa/{org-20191028 => org-20200127}/ob-J.el | 2 +- elpa/{org-20191028 => org-20200127}/ob-R.el | 2 +- elpa/{org-20191028 => org-20200127}/ob-abc.el | 2 +- .../ob-asymptote.el | 2 +- elpa/{org-20191028 => org-20200127}/ob-awk.el | 2 +- .../{org-20191028 => org-20200127}/ob-calc.el | 2 +- .../ob-clojure.el | 99 +- .../ob-comint.el | 2 +- elpa/{org-20191028 => org-20200127}/ob-coq.el | 2 +- .../{org-20191028 => org-20200127}/ob-core.el | 81 +- elpa/{org-20191028 => org-20200127}/ob-css.el | 2 +- .../ob-ditaa.el | 2 +- elpa/{org-20191028 => org-20200127}/ob-dot.el | 2 +- .../{org-20191028 => org-20200127}/ob-ebnf.el | 2 +- .../ob-emacs-lisp.el | 28 +- elpa/org-20200127/ob-eshell.el | 109 + .../{org-20191028 => org-20200127}/ob-eval.el | 2 +- elpa/{org-20191028 => org-20200127}/ob-exp.el | 3 +- .../ob-forth.el | 2 +- .../ob-fortran.el | 2 +- .../ob-gnuplot.el | 2 +- .../ob-groovy.el | 2 +- .../ob-haskell.el | 2 +- .../ob-hledger.el | 2 +- elpa/{org-20191028 => org-20200127}/ob-io.el | 2 +- .../{org-20191028 => org-20200127}/ob-java.el | 2 +- elpa/{org-20191028 => org-20200127}/ob-js.el | 2 +- .../ob-latex.el | 2 +- .../ob-ledger.el | 2 +- .../ob-lilypond.el | 2 +- .../{org-20191028 => org-20200127}/ob-lisp.el | 4 +- elpa/{org-20191028 => org-20200127}/ob-lob.el | 2 +- elpa/{org-20191028 => org-20200127}/ob-lua.el | 14 +- .../ob-makefile.el | 2 +- .../ob-matlab.el | 2 +- .../ob-maxima.el | 2 +- .../ob-mscgen.el | 2 +- .../ob-ocaml.el | 6 +- .../ob-octave.el | 2 +- elpa/{org-20191028 => org-20200127}/ob-org.el | 2 +- .../{org-20191028 => org-20200127}/ob-perl.el | 2 +- .../ob-picolisp.el | 2 +- .../ob-plantuml.el | 20 +- .../ob-processing.el | 2 +- .../ob-python.el | 2 +- elpa/{org-20191028 => org-20200127}/ob-ref.el | 2 +- .../{org-20191028 => org-20200127}/ob-ruby.el | 2 +- .../{org-20191028 => org-20200127}/ob-sass.el | 2 +- .../ob-scheme.el | 2 +- .../ob-screen.el | 2 +- elpa/{org-20191028 => org-20200127}/ob-sed.el | 2 +- .../ob-shell.el | 2 +- .../{org-20191028 => org-20200127}/ob-shen.el | 2 +- elpa/{org-20191028 => org-20200127}/ob-sql.el | 33 +- .../ob-sqlite.el | 3 +- .../{org-20191028 => org-20200127}/ob-stan.el | 2 +- .../ob-table.el | 2 +- .../ob-tangle.el | 66 +- .../{org-20191028 => org-20200127}/ob-vala.el | 2 +- elpa/{org-20191028 => org-20200127}/ob.el | 4 +- .../org-bbdb.el => org-20200127/ol-bbdb.el} | 38 +- .../ol-bibtex.el} | 28 +- .../ol-docview.el} | 15 +- .../ol-eshell.el} | 16 +- .../org-eww.el => org-20200127/ol-eww.el} | 20 +- .../org-gnus.el => org-20200127/ol-gnus.el} | 36 +- .../org-info.el => org-20200127/ol-info.el} | 12 +- .../org-irc.el => org-20200127/ol-irc.el} | 14 +- .../org-mhe.el => org-20200127/ol-mhe.el} | 18 +- .../org-rmail.el => org-20200127/ol-rmail.el} | 18 +- .../org-w3m.el => org-20200127/ol-w3m.el} | 16 +- elpa/org-20200127/ol.el | 1898 ++++++ elpa/{org-20191028 => org-20200127}/org | 5938 +++++++++-------- .../org-agenda.el | 581 +- .../org-archive.el | 4 +- elpa/org-20200127/org-attach-git.el | 119 + elpa/org-20200127/org-attach.el | 768 +++ elpa/org-20200127/org-autoloads.el | 1657 +++++ .../org-capture.el | 169 +- .../org-clock.el | 202 +- .../org-colview.el | 56 +- .../org-compat.el | 101 +- .../org-crypt.el | 4 +- .../org-ctags.el | 2 +- .../org-datetree.el | 2 +- .../org-duration.el | 2 +- .../org-element.el | 212 +- .../org-entities.el | 2 +- .../org-faces.el | 10 +- .../org-feed.el | 6 +- .../org-footnote.el | 6 +- .../org-goto.el | 4 +- .../org-habit.el | 73 +- elpa/{org-20191028 => org-20200127}/org-id.el | 181 +- .../org-indent.el | 2 +- .../org-inlinetask.el | 13 +- .../org-install.el | 0 elpa/org-20200127/org-keys.el | 928 +++ .../org-lint.el | 40 +- .../org-list.el | 69 +- .../org-loaddefs.el | 641 +- .../org-macro.el | 5 +- .../org-macs.el | 78 +- .../org-mobile.el | 16 +- .../org-mouse.el | 2 +- elpa/org-20200127/org-num.el | 471 ++ .../org-pcomplete.el | 12 +- .../{org-20191028 => org-20200127}/org-pkg.el | 2 +- .../org-plot.el | 4 +- .../org-protocol.el | 11 +- .../{org-20191028 => org-20200127}/org-src.el | 69 +- .../org-table.el | 4054 +++++------ .../org-tempo.el | 2 +- .../org-timer.el | 11 +- .../org-version.el | 7 +- elpa/{org-20191028 => org-20200127}/org.el | 4986 ++++---------- elpa/org-20200127/orgcard.pdf | Bin 0 -> 118282 bytes .../ox-ascii.el | 21 +- .../ox-beamer.el | 25 +- .../{org-20191028 => org-20200127}/ox-html.el | 150 +- .../ox-icalendar.el | 123 +- .../ox-latex.el | 328 +- elpa/{org-20191028 => org-20200127}/ox-man.el | 2 +- elpa/{org-20191028 => org-20200127}/ox-md.el | 24 +- elpa/{org-20191028 => org-20200127}/ox-odt.el | 44 +- elpa/{org-20191028 => org-20200127}/ox-org.el | 2 +- .../ox-publish.el | 11 +- .../ox-texinfo.el | 18 +- elpa/{org-20191028 => org-20200127}/ox.el | 76 +- init.el | 4 +- 143 files changed, 15516 insertions(+), 11585 deletions(-) delete mode 100644 elpa/org-20191028/ob-keys.el delete mode 100644 elpa/org-20191028/org-attach.el delete mode 100644 elpa/org-20191028/org-autoloads.el delete mode 100644 elpa/org-20191028/orgcard.pdf rename elpa/{org-20191028 => org-20200127}/COPYING (100%) rename elpa/{org-20191028 => org-20200127}/README_ELPA (100%) rename elpa/{org-20191028 => org-20200127}/dir (81%) rename elpa/{org-20191028 => org-20200127}/etc/ORG-NEWS (90%) rename elpa/{org-20191028 => org-20200127}/etc/styles/OrgOdtContentTemplate.xml (100%) rename elpa/{org-20191028 => org-20200127}/etc/styles/OrgOdtStyles.xml (100%) rename elpa/{org-20191028 => org-20200127}/etc/styles/README (95%) rename elpa/{org-20191028 => org-20200127}/ob-C.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-J.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-R.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-abc.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-asymptote.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-awk.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-calc.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-clojure.el (70%) rename elpa/{org-20191028 => org-20200127}/ob-comint.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-coq.el (97%) rename elpa/{org-20191028 => org-20200127}/ob-core.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-css.el (96%) rename elpa/{org-20191028 => org-20200127}/ob-ditaa.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-dot.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-ebnf.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-emacs-lisp.el (78%) create mode 100644 elpa/org-20200127/ob-eshell.el rename elpa/{org-20191028 => org-20200127}/ob-eval.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-exp.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-forth.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-fortran.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-gnuplot.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-groovy.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-haskell.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-hledger.el (97%) rename elpa/{org-20191028 => org-20200127}/ob-io.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-java.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-js.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-latex.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-ledger.el (97%) rename elpa/{org-20191028 => org-20200127}/ob-lilypond.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-lisp.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-lob.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-lua.el (96%) rename elpa/{org-20191028 => org-20200127}/ob-makefile.el (96%) rename elpa/{org-20191028 => org-20200127}/ob-matlab.el (95%) rename elpa/{org-20191028 => org-20200127}/ob-maxima.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-mscgen.el (97%) rename elpa/{org-20191028 => org-20200127}/ob-ocaml.el (97%) rename elpa/{org-20191028 => org-20200127}/ob-octave.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-org.el (97%) rename elpa/{org-20191028 => org-20200127}/ob-perl.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-picolisp.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-plantuml.el (89%) rename elpa/{org-20191028 => org-20200127}/ob-processing.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-python.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-ref.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-ruby.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-sass.el (97%) rename elpa/{org-20191028 => org-20200127}/ob-scheme.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-screen.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-sed.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-shell.el (99%) rename elpa/{org-20191028 => org-20200127}/ob-shen.el (97%) rename elpa/{org-20191028 => org-20200127}/ob-sql.el (89%) rename elpa/{org-20191028 => org-20200127}/ob-sqlite.el (97%) rename elpa/{org-20191028 => org-20200127}/ob-stan.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-table.el (98%) rename elpa/{org-20191028 => org-20200127}/ob-tangle.el (92%) rename elpa/{org-20191028 => org-20200127}/ob-vala.el (98%) rename elpa/{org-20191028 => org-20200127}/ob.el (93%) rename elpa/{org-20191028/org-bbdb.el => org-20200127/ol-bbdb.el} (95%) rename elpa/{org-20191028/org-bibtex.el => org-20200127/ol-bibtex.el} (96%) rename elpa/{org-20191028/org-docview.el => org-20200127/ol-docview.el} (89%) rename elpa/{org-20191028/org-eshell.el => org-20200127/ol-eshell.el} (85%) rename elpa/{org-20191028/org-eww.el => org-20200127/ol-eww.el} (92%) rename elpa/{org-20191028/org-gnus.el => org-20200127/ol-gnus.el} (91%) rename elpa/{org-20191028/org-info.el => org-20200127/ol-info.el} (95%) rename elpa/{org-20191028/org-irc.el => org-20200127/ol-irc.el} (97%) rename elpa/{org-20191028/org-mhe.el => org-20200127/ol-mhe.el} (94%) rename elpa/{org-20191028/org-rmail.el => org-20200127/ol-rmail.el} (91%) rename elpa/{org-20191028/org-w3m.el => org-20200127/ol-w3m.el} (95%) create mode 100644 elpa/org-20200127/ol.el rename elpa/{org-20191028 => org-20200127}/org (90%) rename elpa/{org-20191028 => org-20200127}/org-agenda.el (95%) rename elpa/{org-20191028 => org-20200127}/org-archive.el (99%) create mode 100644 elpa/org-20200127/org-attach-git.el create mode 100644 elpa/org-20200127/org-attach.el create mode 100644 elpa/org-20200127/org-autoloads.el rename elpa/{org-20191028 => org-20200127}/org-capture.el (95%) rename elpa/{org-20191028 => org-20200127}/org-clock.el (95%) rename elpa/{org-20191028 => org-20200127}/org-colview.el (97%) rename elpa/{org-20191028 => org-20200127}/org-compat.el (92%) rename elpa/{org-20191028 => org-20200127}/org-crypt.el (99%) rename elpa/{org-20191028 => org-20200127}/org-ctags.el (99%) rename elpa/{org-20191028 => org-20200127}/org-datetree.el (99%) rename elpa/{org-20191028 => org-20200127}/org-duration.el (99%) rename elpa/{org-20191028 => org-20200127}/org-element.el (97%) rename elpa/{org-20191028 => org-20200127}/org-entities.el (99%) rename elpa/{org-20191028 => org-20200127}/org-faces.el (99%) rename elpa/{org-20191028 => org-20200127}/org-feed.el (99%) rename elpa/{org-20191028 => org-20200127}/org-footnote.el (99%) rename elpa/{org-20191028 => org-20200127}/org-goto.el (98%) rename elpa/{org-20191028 => org-20200127}/org-habit.el (89%) rename elpa/{org-20191028 => org-20200127}/org-id.el (84%) rename elpa/{org-20191028 => org-20200127}/org-indent.el (99%) rename elpa/{org-20191028 => org-20200127}/org-inlinetask.el (97%) rename elpa/{org-20191028 => org-20200127}/org-install.el (100%) create mode 100644 elpa/org-20200127/org-keys.el rename elpa/{org-20191028 => org-20200127}/org-lint.el (97%) rename elpa/{org-20191028 => org-20200127}/org-list.el (98%) rename elpa/{org-20191028 => org-20200127}/org-loaddefs.el (94%) rename elpa/{org-20191028 => org-20200127}/org-macro.el (99%) rename elpa/{org-20191028 => org-20200127}/org-macs.el (93%) rename elpa/{org-20191028 => org-20200127}/org-mobile.el (99%) rename elpa/{org-20191028 => org-20200127}/org-mouse.el (99%) create mode 100644 elpa/org-20200127/org-num.el rename elpa/{org-20191028 => org-20200127}/org-pcomplete.el (97%) rename elpa/{org-20191028 => org-20200127}/org-pkg.el (53%) rename elpa/{org-20191028 => org-20200127}/org-plot.el (99%) rename elpa/{org-20191028 => org-20200127}/org-protocol.el (99%) rename elpa/{org-20191028 => org-20200127}/org-src.el (97%) rename elpa/{org-20191028 => org-20200127}/org-table.el (93%) rename elpa/{org-20191028 => org-20200127}/org-tempo.el (99%) rename elpa/{org-20191028 => org-20200127}/org-timer.el (98%) rename elpa/{org-20191028 => org-20200127}/org-version.el (73%) rename elpa/{org-20191028 => org-20200127}/org.el (85%) create mode 100644 elpa/org-20200127/orgcard.pdf rename elpa/{org-20191028 => org-20200127}/ox-ascii.el (99%) rename elpa/{org-20191028 => org-20200127}/ox-beamer.el (98%) rename elpa/{org-20191028 => org-20200127}/ox-html.el (97%) rename elpa/{org-20191028 => org-20200127}/ox-icalendar.el (91%) rename elpa/{org-20191028 => org-20200127}/ox-latex.el (94%) rename elpa/{org-20191028 => org-20200127}/ox-man.el (99%) rename elpa/{org-20191028 => org-20200127}/ox-md.el (97%) rename elpa/{org-20191028 => org-20200127}/ox-odt.el (99%) rename elpa/{org-20191028 => org-20200127}/ox-org.el (99%) rename elpa/{org-20191028 => org-20200127}/ox-publish.el (99%) rename elpa/{org-20191028 => org-20200127}/ox-texinfo.el (99%) rename elpa/{org-20191028 => org-20200127}/ox.el (99%) diff --git a/bba.org b/bba.org index a54f6577..890574e4 100644 --- a/bba.org +++ b/bba.org @@ -28,12 +28,12 @@ To be precise, this is what's in the first part of my =~/.emacs.d/init.el= (what (setq load-path (append - (list (expand-file-name "~/.emacs.d/") (expand-file-name "~/.emacs.d/elpa/org-20150629")) + (list (expand-file-name "~/.emacs.d/") (expand-file-name "~/.emacs.d/elpa/org-20200127")) ;; (expand-file-name "/usr/share/emacs/lisp/") load-path)) - (add-to-list 'load-path "~/.emacs/elpa/org-20171030") + (add-to-list 'load-path "~/.emacs/elpa/org-20200127") ;; (add-to-list 'load-path "~/elisp/org-mode/contrib/lisp") ;; Load the rest of the packages diff --git a/elpa/org-20191028/ob-keys.el b/elpa/org-20191028/ob-keys.el deleted file mode 100644 index 627648d2..00000000 --- a/elpa/org-20191028/ob-keys.el +++ /dev/null @@ -1,106 +0,0 @@ -;;; ob-keys.el --- Key Bindings for Babel -*- lexical-binding: t; -*- - -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. - -;; Author: Eric Schulte -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Add Org Babel keybindings to the Org mode keymap for exposing -;; Org Babel functions. These will all share a common prefix. See -;; the value of `org-babel-key-bindings' for a list of interactive -;; functions and their associated keys. - -;;; Code: -(require 'ob-core) - -(defvar org-babel-key-prefix "\C-c\C-v" - "The key prefix for Babel interactive key-bindings. -See `org-babel-key-bindings' for the list of interactive babel -functions which are assigned key bindings, and see -`org-babel-map' for the actual babel keymap.") - -(defvar org-babel-map (make-sparse-keymap) - "The keymap for interactive Babel functions.") - -;;;###autoload -(defun org-babel-describe-bindings () - "Describe all keybindings behind `org-babel-key-prefix'." - (interactive) - (describe-bindings org-babel-key-prefix)) - -(defvar org-babel-key-bindings - '(("p" . org-babel-previous-src-block) - ("\C-p" . org-babel-previous-src-block) - ("n" . org-babel-next-src-block) - ("\C-n" . org-babel-next-src-block) - ("e" . org-babel-execute-maybe) - ("\C-e" . org-babel-execute-maybe) - ("o" . org-babel-open-src-block-result) - ("\C-o" . org-babel-open-src-block-result) - ("\C-v" . org-babel-expand-src-block) - ("v" . org-babel-expand-src-block) - ("u" . org-babel-goto-src-block-head) - ("\C-u" . org-babel-goto-src-block-head) - ("g" . org-babel-goto-named-src-block) - ("r" . org-babel-goto-named-result) - ("\C-r" . org-babel-goto-named-result) - ("\C-b" . org-babel-execute-buffer) - ("b" . org-babel-execute-buffer) - ("\C-s" . org-babel-execute-subtree) - ("s" . org-babel-execute-subtree) - ("\C-d" . org-babel-demarcate-block) - ("d" . org-babel-demarcate-block) - ("\C-t" . org-babel-tangle) - ("t" . org-babel-tangle) - ("\C-f" . org-babel-tangle-file) - ("f" . org-babel-tangle-file) - ("\C-c" . org-babel-check-src-block) - ("c" . org-babel-check-src-block) - ("\C-j" . org-babel-insert-header-arg) - ("j" . org-babel-insert-header-arg) - ("\C-l" . org-babel-load-in-session) - ("l" . org-babel-load-in-session) - ("\C-i" . org-babel-lob-ingest) - ("i" . org-babel-lob-ingest) - ("\C-I" . org-babel-view-src-block-info) - ("I" . org-babel-view-src-block-info) - ("\C-z" . org-babel-switch-to-session) - ("z" . org-babel-switch-to-session-with-code) - ("\C-a" . org-babel-sha1-hash) - ("a" . org-babel-sha1-hash) - ("h" . org-babel-describe-bindings) - ("\C-x" . org-babel-do-key-sequence-in-edit-buffer) - ("x" . org-babel-do-key-sequence-in-edit-buffer) - ("k" . org-babel-remove-result-one-or-many) - ("\C-\M-h" . org-babel-mark-block)) - "Alist of key bindings and interactive Babel functions. -This list associates interactive Babel functions -with keys. Each element of this list will add an entry to the -`org-babel-map' using the letter key which is the `car' of the -a-list placed behind the generic `org-babel-key-prefix'.") - -(provide 'ob-keys) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; ob-keys.el ends here diff --git a/elpa/org-20191028/org-attach.el b/elpa/org-20191028/org-attach.el deleted file mode 100644 index 4100d6f0..00000000 --- a/elpa/org-20191028/org-attach.el +++ /dev/null @@ -1,625 +0,0 @@ -;;; org-attach.el --- Manage file attachments to Org tasks -*- lexical-binding: t; -*- - -;; Copyright (C) 2008-2019 Free Software Foundation, Inc. - -;; Author: John Wiegley -;; Keywords: org data task - -;; This file is part of GNU Emacs. -;; -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; See the Org manual for information on how to use it. -;; -;; Attachments are managed in a special directory called "data", which -;; lives in the same directory as the org file itself. If this data -;; directory is initialized as a Git repository, then org-attach will -;; automatically commit changes when it sees them. -;; -;; Attachment directories are identified using a UUID generated for the -;; task which has the attachments. These are added as property to the -;; task when necessary, and should not be deleted or changed by the -;; user, ever. UUIDs are generated by a mechanism defined in the variable -;; `org-id-method'. - -;;; Code: - -(require 'cl-lib) -(require 'org) -(require 'org-id) -(require 'vc-git) - -(declare-function dired-dwim-target-directory "dired-aux") - -(defgroup org-attach nil - "Options concerning entry attachments in Org mode." - :tag "Org Attach" - :group 'org) - -(defcustom org-attach-directory "data/" - "The directory where attachments are stored. -If this is a relative path, it will be interpreted relative to the directory -where the Org file lives." - :group 'org-attach - :type 'directory - :safe #'stringp) - -(defcustom org-attach-commit t - "If non-nil commit attachments with git. -This is only done if the Org file is in a git repository." - :group 'org-attach - :type 'boolean - :version "26.1" - :package-version '(Org . "9.0")) - -(defcustom org-attach-git-annex-cutoff (* 32 1024) - "If non-nil, files larger than this will be annexed instead of stored." - :group 'org-attach - :version "24.4" - :package-version '(Org . "8.0") - :type '(choice - (const :tag "None" nil) - (integer :tag "Bytes"))) - -(defcustom org-attach-auto-tag "ATTACH" - "Tag that will be triggered automatically when an entry has an attachment." - :group 'org-attach - :type '(choice - (const :tag "None" nil) - (string :tag "Tag"))) - -(defcustom org-attach-file-list-property "Attachments" - "The property used to keep a list of attachment belonging to this entry. -This is not really needed, so you may set this to nil if you don't want it. -Also, for entries where children inherit the directory, the list of -attachments is not kept in this property." - :group 'org-attach - :type '(choice - (const :tag "None" nil) - (string :tag "Tag"))) - -(defcustom org-attach-method 'cp - "The preferred method to attach a file. -Allowed values are: - -mv rename the file to move it into the attachment directory -cp copy the file -ln create a hard link. Note that this is not supported - on all systems, and then the result is not defined. -lns create a symbol link. Note that this is not supported - on all systems, and then the result is not defined." - :group 'org-attach - :type '(choice - (const :tag "Copy" cp) - (const :tag "Move/Rename" mv) - (const :tag "Hard Link" ln) - (const :tag "Symbol Link" lns))) - -(defcustom org-attach-expert nil - "Non-nil means do not show the splash buffer with the attach dispatcher." - :group 'org-attach - :type 'boolean) - -(defcustom org-attach-allow-inheritance t - "Non-nil means allow attachment directories be inherited." - :group 'org-attach - :type 'boolean) - -(defvar org-attach-inherited nil - "Indicates if the last access to the attachment directory was inherited.") - -(defcustom org-attach-store-link-p nil - "Non-nil means store a link to a file when attaching it." - :group 'org-attach - :version "24.1" - :type '(choice - (const :tag "Don't store link" nil) - (const :tag "Link to origin location" t) - (const :tag "Link to the attach-dir location" attached))) - -(defcustom org-attach-archive-delete nil - "Non-nil means attachments are deleted upon archiving a subtree. -When set to `query', ask the user instead." - :group 'org-attach - :version "26.1" - :package-version '(Org . "8.3") - :type '(choice - (const :tag "Never delete attachments" nil) - (const :tag "Always delete attachments" t) - (const :tag "Query the user" query))) - -(defcustom org-attach-annex-auto-get 'ask - "Confirmation preference for automatically getting annex files. -If \\='ask, prompt using `y-or-n-p'. If t, always get. If nil, never get." - :group 'org-attach - :package-version '(Org . "9.0") - :version "26.1" - :type '(choice - (const :tag "confirm with `y-or-n-p'" ask) - (const :tag "always get from annex if necessary" t) - (const :tag "never get from annex" nil))) - -;;;###autoload -(defun org-attach () - "The dispatcher for attachment commands. -Shows a list of commands and prompts for another key to execute a command." - (interactive) - (let (c marker) - (when (eq major-mode 'org-agenda-mode) - (setq marker (or (get-text-property (point) 'org-hd-marker) - (get-text-property (point) 'org-marker))) - (unless marker - (error "No task in current line"))) - (save-excursion - (when marker - (set-buffer (marker-buffer marker)) - (goto-char marker)) - (org-back-to-heading t) - (save-excursion - (save-window-excursion - (unless org-attach-expert - (with-output-to-temp-buffer "*Org Attach*" - (princ "Select an Attachment Command: - -a Select a file and attach it to the task, using `org-attach-method'. -c/m/l/y Attach a file using copy/move/link/symbolic-link method. -u Attach a file from URL (downloading it). -n Create a new attachment, as an Emacs buffer. -z Synchronize the current task with its attachment - directory, in case you added attachments yourself. - -o Open current task's attachments. -O Like \"o\", but force opening in Emacs. -f Open current task's attachment directory. -F Like \"f\", but force using dired in Emacs. - -d Delete one attachment, you will be prompted for a file name. -D Delete all of a task's attachments. A safer way is - to open the directory in dired and delete from there. - -s Set a specific attachment directory for this entry or reset to default. -i Make children of the current entry inherit its attachment directory."))) - (org-fit-window-to-buffer (get-buffer-window "*Org Attach*")) - (message "Select command: [acmlyunzoOfFdD]") - (setq c (read-char-exclusive)) - (and (get-buffer "*Org Attach*") (kill-buffer "*Org Attach*")))) - (cond - ((memq c '(?a ?\C-a)) (call-interactively 'org-attach-attach)) - ((memq c '(?c ?\C-c)) - (let ((org-attach-method 'cp)) (call-interactively 'org-attach-attach))) - ((memq c '(?m ?\C-m)) - (let ((org-attach-method 'mv)) (call-interactively 'org-attach-attach))) - ((memq c '(?l ?\C-l)) - (let ((org-attach-method 'ln)) (call-interactively 'org-attach-attach))) - ((memq c '(?y ?\C-y)) - (let ((org-attach-method 'lns)) (call-interactively 'org-attach-attach))) - ((memq c '(?u ?\C-u)) - (let ((org-attach-method 'url)) (call-interactively 'org-attach-url))) - ((memq c '(?n ?\C-n)) (call-interactively 'org-attach-new)) - ((memq c '(?z ?\C-z)) (call-interactively 'org-attach-sync)) - ((memq c '(?o ?\C-o)) (call-interactively 'org-attach-open)) - ((eq c ?O) (call-interactively 'org-attach-open-in-emacs)) - ((memq c '(?f ?\C-f)) (call-interactively 'org-attach-reveal)) - ((memq c '(?F)) (call-interactively 'org-attach-reveal-in-emacs)) - ((memq c '(?d ?\C-d)) (call-interactively - 'org-attach-delete-one)) - ((eq c ?D) (call-interactively 'org-attach-delete-all)) - ((eq c ?q) (message "Abort")) - ((memq c '(?s ?\C-s)) (call-interactively - 'org-attach-set-directory)) - ((memq c '(?i ?\C-i)) (call-interactively - 'org-attach-set-inherit)) - (t (error "No such attachment command %c" c)))))) - -(defun org-attach-dir (&optional create-if-not-exists-p) - "Return the directory associated with the current entry. -This first checks for a local property ATTACH_DIR, and then for an inherited -property ATTACH_DIR_INHERIT. If neither exists, the default mechanism -using the entry ID will be invoked to access the unique directory for the -current entry. -If the directory does not exist and CREATE-IF-NOT-EXISTS-P is non-nil, -the directory and (if necessary) the corresponding ID will be created." - (let (attach-dir uuid) - (setq org-attach-inherited (org-entry-get nil "ATTACH_DIR_INHERIT")) - (cond - ((setq attach-dir (org-entry-get nil "ATTACH_DIR")) - (org-attach-check-absolute-path attach-dir)) - ((and org-attach-allow-inheritance - (org-entry-get nil "ATTACH_DIR_INHERIT" t)) - (setq attach-dir - (org-with-wide-buffer - (if (marker-position org-entry-property-inherited-from) - (goto-char org-entry-property-inherited-from) - (org-back-to-heading t)) - (let (org-attach-allow-inheritance) - (org-attach-dir create-if-not-exists-p)))) - (org-attach-check-absolute-path attach-dir) - (setq org-attach-inherited t)) - (t ; use the ID - (org-attach-check-absolute-path nil) - (setq uuid (org-id-get (point) create-if-not-exists-p)) - (when (or uuid create-if-not-exists-p) - (unless uuid (error "ID retrieval/creation failed")) - (setq attach-dir (expand-file-name - (format "%s/%s" - (substring uuid 0 2) - (substring uuid 2)) - (expand-file-name org-attach-directory)))))) - (when attach-dir - (if (and create-if-not-exists-p - (not (file-directory-p attach-dir))) - (make-directory attach-dir t)) - (and (file-exists-p attach-dir) - attach-dir)))) - -(defun org-attach-check-absolute-path (dir) - "Check if we have enough information to root the attachment directory. -When DIR is given, check also if it is already absolute. Otherwise, -assume that it will be relative, and check if `org-attach-directory' is -absolute, or if at least the current buffer has a file name. -Throw an error if we cannot root the directory." - (or (and dir (file-name-absolute-p dir)) - (file-name-absolute-p org-attach-directory) - (buffer-file-name (buffer-base-buffer)) - (error "Need absolute `org-attach-directory' to attach in buffers without filename"))) - -(defun org-attach-set-directory (&optional arg) - "Set the ATTACH_DIR node property and ask to move files there. -The property defines the directory that is used for attachments -of the entry. When called with `\\[universal-argument]', reset \ -the directory to -the default ID based one." - (interactive "P") - (let ((old (org-attach-dir)) - (new - (progn - (if arg (org-entry-delete nil "ATTACH_DIR") - (let ((dir (read-directory-name - "Attachment directory: " - (org-entry-get nil - "ATTACH_DIR" - (and org-attach-allow-inheritance t))))) - (org-entry-put nil "ATTACH_DIR" dir))) - (org-attach-dir t)))) - (unless (or (string= old new) - (not old)) - (when (yes-or-no-p "Copy over attachments from old directory? ") - (copy-directory old new t nil t)) - (when (yes-or-no-p (concat "Delete " old)) - (delete-directory old t))))) - -(defun org-attach-set-inherit () - "Set the ATTACH_DIR_INHERIT property of the current entry. -The property defines the directory that is used for attachments -of the entry and any children that do not explicitly define (by setting -the ATTACH_DIR property) their own attachment directory." - (interactive) - (org-entry-put nil "ATTACH_DIR_INHERIT" "t") - (message "Children will inherit attachment directory")) - -(defun org-attach-use-annex () - "Return non-nil if git annex can be used." - (let ((git-dir (vc-git-root (expand-file-name org-attach-directory)))) - (and org-attach-git-annex-cutoff - (or (file-exists-p (expand-file-name "annex" git-dir)) - (file-exists-p (expand-file-name ".git/annex" git-dir)))))) - -(defun org-attach-annex-get-maybe (path) - "Call git annex get PATH (via shell) if using git annex. -Signals an error if the file content is not available and it was not retrieved." - (let* ((default-directory (expand-file-name org-attach-directory)) - (path-relative (file-relative-name path))) - (when (and (org-attach-use-annex) - (not - (string-equal - "found" - (shell-command-to-string - (format "git annex find --format=found --in=here %s" - (shell-quote-argument path-relative)))))) - (let ((should-get - (if (eq org-attach-annex-auto-get 'ask) - (y-or-n-p (format "Run git annex get %s? " path-relative)) - org-attach-annex-auto-get))) - (if should-get - (progn (message "Running git annex get \"%s\"." path-relative) - (call-process "git" nil nil nil "annex" "get" path-relative)) - (error "File %s stored in git annex but it is not available, and was not retrieved" - path)))))) - -(defun org-attach-commit () - "Commit changes to git if `org-attach-directory' is properly initialized. -This checks for the existence of a \".git\" directory in that directory." - (let* ((dir (expand-file-name org-attach-directory)) - (git-dir (vc-git-root dir)) - (use-annex (org-attach-use-annex)) - (changes 0)) - (when (and git-dir (executable-find "git")) - (with-temp-buffer - (cd dir) - (dolist (new-or-modified - (split-string - (shell-command-to-string - "git ls-files -zmo --exclude-standard") "\0" t)) - (if (and use-annex - (>= (file-attribute-size (file-attributes new-or-modified)) - org-attach-git-annex-cutoff)) - (call-process "git" nil nil nil "annex" "add" new-or-modified) - (call-process "git" nil nil nil "add" new-or-modified)) - (cl-incf changes)) - (dolist (deleted - (split-string - (shell-command-to-string "git ls-files -z --deleted") "\0" t)) - (call-process "git" nil nil nil "rm" deleted) - (cl-incf changes)) - (when (> changes 0) - (shell-command "git commit -m 'Synchronized attachments'")))))) - -(defun org-attach-tag (&optional off) - "Turn the autotag on or (if OFF is set) off." - (when org-attach-auto-tag - (save-excursion - (org-back-to-heading t) - (org-toggle-tag org-attach-auto-tag (if off 'off 'on))))) - -(defun org-attach-untag () - "Turn the autotag off." - (org-attach-tag 'off)) - -(defun org-attach-store-link (file) - "Add a link to `org-stored-link' when attaching a file. -Only do this when `org-attach-store-link-p' is non-nil." - (setq org-stored-links - (cons (list (org-attach-expand-link file) - (file-name-nondirectory file)) - org-stored-links))) - -(defun org-attach-url (url) - (interactive "MURL of the file to attach: \n") - (org-attach-attach url)) - -(defun org-attach-attach (file &optional visit-dir method) - "Move/copy/link FILE into the attachment directory of the current task. -If VISIT-DIR is non-nil, visit the directory with dired. -METHOD may be `cp', `mv', `ln', `lns' or `url' default taken from -`org-attach-method'." - (interactive - (list - (read-file-name "File to keep as an attachment:" - (or (progn - (require 'dired-aux) - (dired-dwim-target-directory)) - default-directory)) - current-prefix-arg - nil)) - (setq method (or method org-attach-method)) - (let ((basename (file-name-nondirectory file))) - (when (and org-attach-file-list-property (not org-attach-inherited)) - (org-entry-add-to-multivalued-property - (point) org-attach-file-list-property basename)) - (let* ((attach-dir (org-attach-dir t)) - (fname (expand-file-name basename attach-dir))) - (cond - ((eq method 'mv) (rename-file file fname)) - ((eq method 'cp) (copy-file file fname)) - ((eq method 'ln) (add-name-to-file file fname)) - ((eq method 'lns) (make-symbolic-link file fname)) - ((eq method 'url) (url-copy-file file fname))) - (when org-attach-commit - (org-attach-commit)) - (org-attach-tag) - (cond ((eq org-attach-store-link-p 'attached) - (org-attach-store-link fname)) - ((eq org-attach-store-link-p t) - (org-attach-store-link file))) - (if visit-dir - (dired attach-dir) - (message "File %S is now a task attachment." basename))))) - -(defun org-attach-attach-cp () - "Attach a file by copying it." - (interactive) - (let ((org-attach-method 'cp)) (call-interactively 'org-attach-attach))) -(defun org-attach-attach-mv () - "Attach a file by moving (renaming) it." - (interactive) - (let ((org-attach-method 'mv)) (call-interactively 'org-attach-attach))) -(defun org-attach-attach-ln () - "Attach a file by creating a hard link to it. -Beware that this does not work on systems that do not support hard links. -On some systems, this apparently does copy the file instead." - (interactive) - (let ((org-attach-method 'ln)) (call-interactively 'org-attach-attach))) -(defun org-attach-attach-lns () - "Attach a file by creating a symbolic link to it. - -Beware that this does not work on systems that do not support symbolic links. -On some systems, this apparently does copy the file instead." - (interactive) - (let ((org-attach-method 'lns)) (call-interactively 'org-attach-attach))) - -(defun org-attach-new (file) - "Create a new attachment FILE for the current task. -The attachment is created as an Emacs buffer." - (interactive "sCreate attachment named: ") - (when (and org-attach-file-list-property (not org-attach-inherited)) - (org-entry-add-to-multivalued-property - (point) org-attach-file-list-property file)) - (let ((attach-dir (org-attach-dir t))) - (org-attach-tag) - (find-file (expand-file-name file attach-dir)) - (message "New attachment %s" file))) - -(defun org-attach-delete-one (&optional file) - "Delete a single attachment." - (interactive) - (let* ((attach-dir (org-attach-dir t)) - (files (org-attach-file-list attach-dir)) - (file (or file - (completing-read - "Delete attachment: " - (mapcar (lambda (f) - (list (file-name-nondirectory f))) - files))))) - (setq file (expand-file-name file attach-dir)) - (unless (file-exists-p file) - (error "No such attachment: %s" file)) - (delete-file file) - (when org-attach-commit - (org-attach-commit)))) - -(defun org-attach-delete-all (&optional force) - "Delete all attachments from the current task. -This actually deletes the entire attachment directory. -A safer way is to open the directory in dired and delete from there." - (interactive "P") - (when (and org-attach-file-list-property (not org-attach-inherited)) - (org-entry-delete (point) org-attach-file-list-property)) - (let ((attach-dir (org-attach-dir))) - (when - (and attach-dir - (or force - (y-or-n-p "Are you sure you want to remove all attachments of this entry? "))) - (shell-command (format "rm -fr %s" attach-dir)) - (message "Attachment directory removed") - (when org-attach-commit - (org-attach-commit)) - (org-attach-untag)))) - -(defun org-attach-sync () - "Synchronize the current tasks with its attachments. -This can be used after files have been added externally." - (interactive) - (when org-attach-commit - (org-attach-commit)) - (when (and org-attach-file-list-property (not org-attach-inherited)) - (org-entry-delete (point) org-attach-file-list-property)) - (let ((attach-dir (org-attach-dir))) - (when attach-dir - (let ((files (org-attach-file-list attach-dir))) - (org-attach-tag (not files)) - (when org-attach-file-list-property - (dolist (file files) - (unless (string-match "^\\.\\.?\\'" file) - (org-entry-add-to-multivalued-property - (point) org-attach-file-list-property file)))))))) - -(defun org-attach-file-list (dir) - "Return a list of files in the attachment directory. -This ignores files ending in \"~\"." - (delq nil - (mapcar (lambda (x) (if (string-match "^\\.\\.?\\'" x) nil x)) - (directory-files dir nil "[^~]\\'")))) - -(defun org-attach-reveal (&optional if-exists) - "Show the attachment directory of the current task. -This will attempt to use an external program to show the directory." - (interactive "P") - (let ((attach-dir (org-attach-dir (not if-exists)))) - (and attach-dir (org-open-file attach-dir)))) - -(defun org-attach-reveal-in-emacs () - "Show the attachment directory of the current task in dired." - (interactive) - (let ((attach-dir (org-attach-dir t))) - (dired attach-dir))) - -(defun org-attach-open (&optional in-emacs) - "Open an attachment of the current task. -If there are more than one attachment, you will be prompted for the file name. -This command will open the file using the settings in `org-file-apps' -and in the system-specific variants of this variable. -If IN-EMACS is non-nil, force opening in Emacs." - (interactive "P") - (let* ((attach-dir (org-attach-dir t)) - (files (org-attach-file-list attach-dir)) - (file (if (= (length files) 1) - (car files) - (completing-read "Open attachment: " - (mapcar #'list files) nil t))) - (path (expand-file-name file attach-dir))) - (org-attach-annex-get-maybe path) - (org-open-file path in-emacs))) - -(defun org-attach-open-in-emacs () - "Open attachment, force opening in Emacs. -See `org-attach-open'." - (interactive) - (org-attach-open 'in-emacs)) - -(defun org-attach-expand (file) - "Return the full path to the current entry's attachment file FILE. -Basically, this adds the path to the attachment directory." - (expand-file-name file (org-attach-dir))) - -(defun org-attach-expand-link (file) - "Return a file link pointing to the current entry's attachment file FILE. -Basically, this adds the path to the attachment directory, and a \"file:\" -prefix." - (concat "file:" (org-attach-expand file))) - -(defun org-attach-archive-delete-maybe () - "Maybe delete subtree attachments when archiving. -This function is called by `org-archive-hook'. The option -`org-attach-archive-delete' controls its behavior." - (when org-attach-archive-delete - (org-attach-delete-all (not (eq org-attach-archive-delete 'query))))) - - -;; Attach from dired. - -;; Add the following lines to the config file to get a binding for -;; dired-mode. - -;; (add-hook -;; 'dired-mode-hook -;; (lambda () -;; (define-key dired-mode-map (kbd "C-c C-x a") #'org-attach-dired-to-subtree)))) - -;;;###autoload -(defun org-attach-dired-to-subtree (files) - "Attach FILES marked or current file in dired to subtree in other window. -Takes the method given in `org-attach-method' for the attach action. -Precondition: Point must be in a dired buffer. -Idea taken from `gnus-dired-attach'." - (interactive - (list (dired-get-marked-files))) - (unless (eq major-mode 'dired-mode) - (user-error "This command must be triggered in a dired buffer.")) - (let ((start-win (selected-window)) - (other-win - (get-window-with-predicate - (lambda (window) - (with-current-buffer (window-buffer window) - (eq major-mode 'org-mode)))))) - (unless other-win - (user-error - "Can't attach to subtree. No window displaying an Org buffer")) - (select-window other-win) - (dolist (file files) - (org-attach-attach file)) - (select-window start-win))) - - - -(add-hook 'org-archive-hook 'org-attach-archive-delete-maybe) - -(provide 'org-attach) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; org-attach.el ends here diff --git a/elpa/org-20191028/org-autoloads.el b/elpa/org-20191028/org-autoloads.el deleted file mode 100644 index a49a7fef..00000000 --- a/elpa/org-20191028/org-autoloads.el +++ /dev/null @@ -1,820 +0,0 @@ -;;; org-autoloads.el --- automatically extracted autoloads -;; -;;; Code: -(add-to-list 'load-path (directory-file-name (or (file-name-directory #$) (car load-path)))) - -;;;### (autoloads nil "org" "org.el" (23994 42575 349796 102000)) -;;; Generated autoloads from org.el - -(autoload 'org-babel-do-load-languages "org" "\ -Load the languages defined in `org-babel-load-languages'. - -\(fn SYM VALUE)" nil nil) - -(autoload 'org-babel-load-file "org" "\ -Load Emacs Lisp source code blocks in the Org FILE. -This function exports the source code using `org-babel-tangle' -and then loads the resulting file using `load-file'. With prefix -arg (noninteractively: 2nd arg) COMPILE the tangled Emacs Lisp -file to byte-code before it is loaded. - -\(fn FILE &optional COMPILE)" t nil) - -(autoload 'org-version "org" "\ -Show the Org version. -Interactively, or when MESSAGE is non-nil, show it in echo area. -With prefix argument, or when HERE is non-nil, insert it at point. -In non-interactive uses, a reduced version string is output unless -FULL is given. - -\(fn &optional HERE FULL MESSAGE)" t nil) - -(autoload 'turn-on-orgtbl "org" "\ -Unconditionally turn on `orgtbl-mode'. - -\(fn)" nil nil) - -(autoload 'org-clock-persistence-insinuate "org" "\ -Set up hooks for clock persistence. - -\(fn)" nil nil) - -(autoload 'org-mode "org" "\ -Outline-based notes management and organizer, alias -\"Carsten's outline-mode for keeping track of everything.\" - -Org mode develops organizational tasks around a NOTES file which -contains information about projects as plain text. Org mode is -implemented on top of Outline mode, which is ideal to keep the content -of large files well structured. It supports ToDo items, deadlines and -time stamps, which magically appear in the diary listing of the Emacs -calendar. Tables are easily created with a built-in table editor. -Plain text URL-like links connect to websites, emails (VM), Usenet -messages (Gnus), BBDB entries, and any files related to the project. -For printing and sharing of notes, an Org file (or a part of it) -can be exported as a structured ASCII or HTML file. - -The following commands are available: - -\\{org-mode-map} - -\(fn)" t nil) - -(autoload 'org-cycle "org" "\ -TAB-action and visibility cycling for Org mode. - -This is the command invoked in Org mode by the `TAB' key. Its main -purpose is outline visibility cycling, but it also invokes other actions -in special contexts. - -When this function is called with a `\\[universal-argument]' prefix, rotate the entire -buffer through 3 states (global cycling) - 1. OVERVIEW: Show only top-level headlines. - 2. CONTENTS: Show all headlines of all levels, but no body text. - 3. SHOW ALL: Show everything. - -With a `\\[universal-argument] \\[universal-argument]' prefix argument, switch to the startup visibility, -determined by the variable `org-startup-folded', and by any VISIBILITY -properties in the buffer. - -With a `\\[universal-argument] \\[universal-argument] \\[universal-argument]' prefix argument, show the entire buffer, including -any drawers. - -When inside a table, re-align the table and move to the next field. - -When point is at the beginning of a headline, rotate the subtree started -by this line through 3 different states (local cycling) - 1. FOLDED: Only the main headline is shown. - 2. CHILDREN: The main headline and the direct children are shown. - From this state, you can move to one of the children - and zoom in further. - 3. SUBTREE: Show the entire subtree, including body text. -If there is no subtree, switch directly from CHILDREN to FOLDED. - -When point is at the beginning of an empty headline and the variable -`org-cycle-level-after-item/entry-creation' is set, cycle the level -of the headline by demoting and promoting it to likely levels. This -speeds up creation document structure by pressing `TAB' once or several -times right after creating a new headline. - -When there is a numeric prefix, go up to a heading with level ARG, do -a `show-subtree' and return to the previous cursor position. If ARG -is negative, go up that many levels. - -When point is not at the beginning of a headline, execute the global -binding for `TAB', which is re-indenting the line. See the option -`org-cycle-emulate-tab' for details. - -As a special case, if point is at the beginning of the buffer and there is -no headline in line 1, this function will act as if called with prefix arg -\(`\\[universal-argument] TAB', same as `S-TAB') also when called without prefix arg, but only -if the variable `org-cycle-global-at-bob' is t. - -\(fn &optional ARG)" t nil) - -(autoload 'org-global-cycle "org" "\ -Cycle the global visibility. For details see `org-cycle'. -With `\\[universal-argument]' prefix ARG, switch to startup visibility. -With a numeric prefix, show all headlines up to that level. - -\(fn &optional ARG)" t nil) - -(autoload 'org-run-like-in-org-mode "org" "\ -Run a command, pretending that the current buffer is in Org mode. -This will temporarily bind local variables that are typically bound in -Org mode to the values they have in Org mode, and then interactively -call CMD. - -\(fn CMD)" nil nil) - -(autoload 'org-store-link "org" "\ -Store a link to the current location. -\\ -This link is added to `org-stored-links' and can later be inserted -into an Org buffer with `org-insert-link' (`\\[org-insert-link]'). - -For some link types, a `\\[universal-argument]' prefix ARG is interpreted. A single -`\\[universal-argument]' negates `org-context-in-file-links' for file links or -`org-gnus-prefer-web-links' for links to Usenet articles. - -A `\\[universal-argument] \\[universal-argument]' prefix ARG forces skipping storing functions that are not -part of Org core. - -A `\\[universal-argument] \\[universal-argument] \\[universal-argument]' prefix ARG forces storing a link for each line in the -active region. - -Assume the function is called interactively if INTERACTIVE? is -non-nil. - -\(fn ARG &optional INTERACTIVE\\=\\?)" t nil) - -(autoload 'org-insert-link-global "org" "\ -Insert a link like Org mode does. -This command can be called in any mode to insert a link in Org syntax. - -\(fn)" t nil) - -(autoload 'org-open-at-point-global "org" "\ -Follow a link or a time-stamp like Org mode does. -Also follow links and emails as seen by `thing-at-point'. -This command can be called in any mode to follow an external -link or a time-stamp that has Org mode syntax. Its behavior -is undefined when called on internal links like fuzzy links. -Raise a user error when there is nothing to follow. - -\(fn)" t nil) - -(autoload 'org-open-link-from-string "org" "\ -Open a link in the string S, as if it was in Org mode. - -\(fn S &optional ARG REFERENCE-BUFFER)" t nil) - -(autoload 'org-switchb "org" "\ -Switch between Org buffers. - -With `\\[universal-argument]' prefix, restrict available buffers to files. - -With `\\[universal-argument] \\[universal-argument]' prefix, restrict available buffers to agenda files. - -\(fn &optional ARG)" t nil) - -(autoload 'org-cycle-agenda-files "org" "\ -Cycle through the files in `org-agenda-files'. -If the current buffer visits an agenda file, find the next one in the list. -If the current buffer does not, find the first agenda file. - -\(fn)" t nil) - -(autoload 'org-submit-bug-report "org" "\ -Submit a bug report on Org via mail. - -Don't hesitate to report any problems or inaccurate documentation. - -If you don't have setup sending mail from (X)Emacs, please copy the -output buffer into your mail program, as it gives us important -information about your Org version and configuration. - -\(fn)" t nil) - -(autoload 'org-reload "org" "\ -Reload all Org Lisp files. -With prefix arg UNCOMPILED, load the uncompiled versions. - -\(fn &optional UNCOMPILED)" t nil) - -(autoload 'org-customize "org" "\ -Call the customize function with org as argument. - -\(fn)" t nil) - -;;;*** - -;;;### (autoloads nil "org-agenda" "org-agenda.el" (23994 42575 282485 -;;;;;; 977000)) -;;; Generated autoloads from org-agenda.el - -(autoload 'org-toggle-sticky-agenda "org-agenda" "\ -Toggle `org-agenda-sticky'. - -\(fn &optional ARG)" t nil) - -(autoload 'org-agenda "org-agenda" "\ -Dispatch agenda commands to collect entries to the agenda buffer. -Prompts for a command to execute. Any prefix arg will be passed -on to the selected command. The default selections are: - -a Call `org-agenda-list' to display the agenda for current day or week. -t Call `org-todo-list' to display the global todo list. -T Call `org-todo-list' to display the global todo list, select only - entries with a specific TODO keyword (the user gets a prompt). -m Call `org-tags-view' to display headlines with tags matching - a condition (the user is prompted for the condition). -M Like `m', but select only TODO entries, no ordinary headlines. -e Export views to associated files. -s Search entries for keywords. -S Search entries for keywords, only with TODO keywords. -/ Multi occur across all agenda files and also files listed - in `org-agenda-text-search-extra-files'. -< Restrict agenda commands to buffer, subtree, or region. - Press several times to get the desired effect. -> Remove a previous restriction. -# List \"stuck\" projects. -! Configure what \"stuck\" means. -C Configure custom agenda commands. - -More commands can be added by configuring the variable -`org-agenda-custom-commands'. In particular, specific tags and TODO keyword -searches can be pre-defined in this way. - -If the current buffer is in Org mode and visiting a file, you can also -first press `<' once to indicate that the agenda should be temporarily -\(until the next use of `\\[org-agenda]') restricted to the current file. -Pressing `<' twice means to restrict to the current subtree or region -\(if active). - -\(fn &optional ARG ORG-KEYS RESTRICTION)" t nil) - -(autoload 'org-batch-agenda "org-agenda" "\ -Run an agenda command in batch mode and send the result to STDOUT. -If CMD-KEY is a string of length 1, it is used as a key in -`org-agenda-custom-commands' and triggers this command. If it is a -longer string it is used as a tags/todo match string. -Parameters are alternating variable names and values that will be bound -before running the agenda command. - -\(fn CMD-KEY &rest PARAMETERS)" nil t) - -(autoload 'org-batch-agenda-csv "org-agenda" "\ -Run an agenda command in batch mode and send the result to STDOUT. -If CMD-KEY is a string of length 1, it is used as a key in -`org-agenda-custom-commands' and triggers this command. If it is a -longer string it is used as a tags/todo match string. -Parameters are alternating variable names and values that will be bound -before running the agenda command. - -The output gives a line for each selected agenda item. Each -item is a list of comma-separated values, like this: - -category,head,type,todo,tags,date,time,extra,priority-l,priority-n - -category The category of the item -head The headline, without TODO kwd, TAGS and PRIORITY -type The type of the agenda entry, can be - todo selected in TODO match - tagsmatch selected in tags match - diary imported from diary - deadline a deadline on given date - scheduled scheduled on given date - timestamp entry has timestamp on given date - closed entry was closed on given date - upcoming-deadline warning about deadline - past-scheduled forwarded scheduled item - block entry has date block including g. date -todo The todo keyword, if any -tags All tags including inherited ones, separated by colons -date The relevant date, like 2007-2-14 -time The time, like 15:00-16:50 -extra Sting with extra planning info -priority-l The priority letter if any was given -priority-n The computed numerical priority -agenda-day The day in the agenda where this is listed - -\(fn CMD-KEY &rest PARAMETERS)" nil t) - -(autoload 'org-store-agenda-views "org-agenda" "\ -Store agenda views. - -\(fn &rest PARAMETERS)" t nil) - -(autoload 'org-batch-store-agenda-views "org-agenda" "\ -Run all custom agenda commands that have a file argument. - -\(fn &rest PARAMETERS)" nil t) - -(autoload 'org-agenda-list "org-agenda" "\ -Produce a daily/weekly view from all files in variable `org-agenda-files'. -The view will be for the current day or week, but from the overview buffer -you will be able to go to other days/weeks. - -With a numeric prefix argument in an interactive call, the agenda will -span ARG days. Lisp programs should instead specify SPAN to change -the number of days. SPAN defaults to `org-agenda-span'. - -START-DAY defaults to TODAY, or to the most recent match for the weekday -given in `org-agenda-start-on-weekday'. - -When WITH-HOUR is non-nil, only include scheduled and deadline -items if they have an hour specification like [h]h:mm. - -\(fn &optional ARG START-DAY SPAN WITH-HOUR)" t nil) - -(autoload 'org-search-view "org-agenda" "\ -Show all entries that contain a phrase or words or regular expressions. - -With optional prefix argument TODO-ONLY, only consider entries that are -TODO entries. The argument STRING can be used to pass a default search -string into this function. If EDIT-AT is non-nil, it means that the -user should get a chance to edit this string, with cursor at position -EDIT-AT. - -The search string can be viewed either as a phrase that should be found as -is, or it can be broken into a number of snippets, each of which must match -in a Boolean way to select an entry. The default depends on the variable -`org-agenda-search-view-always-boolean'. -Even if this is turned off (the default) you can always switch to -Boolean search dynamically by preceding the first word with \"+\" or \"-\". - -The default is a direct search of the whole phrase, where each space in -the search string can expand to an arbitrary amount of whitespace, -including newlines. - -If using a Boolean search, the search string is split on whitespace and -each snippet is searched separately, with logical AND to select an entry. -Words prefixed with a minus must *not* occur in the entry. Words without -a prefix or prefixed with a plus must occur in the entry. Matching is -case-insensitive. Words are enclosed by word delimiters (i.e. they must -match whole words, not parts of a word) if -`org-agenda-search-view-force-full-words' is set (default is nil). - -Boolean search snippets enclosed by curly braces are interpreted as -regular expressions that must or (when preceded with \"-\") must not -match in the entry. Snippets enclosed into double quotes will be taken -as a whole, to include whitespace. - -- If the search string starts with an asterisk, search only in headlines. -- If (possibly after the leading star) the search string starts with an - exclamation mark, this also means to look at TODO entries only, an effect - that can also be achieved with a prefix argument. -- If (possibly after star and exclamation mark) the search string starts - with a colon, this will mean that the (non-regexp) snippets of the - Boolean search must match as full words. - -This command searches the agenda files, and in addition the files -listed in `org-agenda-text-search-extra-files' unless a restriction lock -is active. - -\(fn &optional TODO-ONLY STRING EDIT-AT)" t nil) - -(autoload 'org-todo-list "org-agenda" "\ -Show all (not done) TODO entries from all agenda file in a single list. -The prefix arg can be used to select a specific TODO keyword and limit -the list to these. When using `\\[universal-argument]', you will be prompted -for a keyword. A numeric prefix directly selects the Nth keyword in -`org-todo-keywords-1'. - -\(fn &optional ARG)" t nil) - -(autoload 'org-tags-view "org-agenda" "\ -Show all headlines for all `org-agenda-files' matching a TAGS criterion. -The prefix arg TODO-ONLY limits the search to TODO entries. - -\(fn &optional TODO-ONLY MATCH)" t nil) - -(autoload 'org-agenda-list-stuck-projects "org-agenda" "\ -Create agenda view for projects that are stuck. -Stuck projects are project that have no next actions. For the definitions -of what a project is and how to check if it stuck, customize the variable -`org-stuck-projects'. - -\(fn &rest IGNORE)" t nil) - -(autoload 'org-diary "org-agenda" "\ -Return diary information from org files. -This function can be used in a \"sexp\" diary entry in the Emacs calendar. -It accesses org files and extracts information from those files to be -listed in the diary. The function accepts arguments specifying what -items should be listed. For a list of arguments allowed here, see the -variable `org-agenda-entry-types'. - -The call in the diary file should look like this: - - &%%(org-diary) ~/path/to/some/orgfile.org - -Use a separate line for each org file to check. Or, if you omit the file name, -all files listed in `org-agenda-files' will be checked automatically: - - &%%(org-diary) - -If you don't give any arguments (as in the example above), the default value -of `org-agenda-entry-types' is used: (:deadline :scheduled :timestamp :sexp). -So the example above may also be written as - - &%%(org-diary :deadline :timestamp :sexp :scheduled) - -The function expects the lisp variables `entry' and `date' to be provided -by the caller, because this is how the calendar works. Don't use this -function from a program - use `org-agenda-get-day-entries' instead. - -\(fn &rest ARGS)" nil nil) - -(autoload 'org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item "org-agenda" "\ -Do we have a reason to ignore this TODO entry because it has a time stamp? - -\(fn &optional END)" nil nil) - -(autoload 'org-agenda-set-restriction-lock "org-agenda" "\ -Set restriction lock for agenda to current subtree or file. -When in a restricted subtree, remove it. - -The restriction will span over the entire file if TYPE is `file', -or if type is '(4), or if the cursor is before the first headline -in the file. Otherwise, only apply the restriction to the current -subtree. - -\(fn &optional TYPE)" t nil) - -(autoload 'org-calendar-goto-agenda "org-agenda" "\ -Compute the Org agenda for the calendar date displayed at the cursor. -This is a command that has to be installed in `calendar-mode-map'. - -\(fn)" t nil) - -(autoload 'org-agenda-to-appt "org-agenda" "\ -Activate appointments found in `org-agenda-files'. - -With a `\\[universal-argument]' prefix, refresh the list of appointments. - -If FILTER is t, interactively prompt the user for a regular -expression, and filter out entries that don't match it. - -If FILTER is a string, use this string as a regular expression -for filtering entries out. - -If FILTER is a function, filter out entries against which -calling the function returns nil. This function takes one -argument: an entry from `org-agenda-get-day-entries'. - -FILTER can also be an alist with the car of each cell being -either `headline' or `category'. For example: - - \\='((headline \"IMPORTANT\") - (category \"Work\")) - -will only add headlines containing IMPORTANT or headlines -belonging to the \"Work\" category. - -ARGS are symbols indicating what kind of entries to consider. -By default `org-agenda-to-appt' will use :deadline*, :scheduled* -\(i.e., deadlines and scheduled items with a hh:mm specification) -and :timestamp entries. See the docstring of `org-diary' for -details and examples. - -If an entry has a APPT_WARNTIME property, its value will be used -to override `appt-message-warning-time'. - -\(fn &optional REFRESH FILTER &rest ARGS)" t nil) - -;;;*** - -;;;### (autoloads nil "org-capture" "org-capture.el" (23994 42575 -;;;;;; 289881 936000)) -;;; Generated autoloads from org-capture.el - -(autoload 'org-capture-string "org-capture" "\ -Capture STRING with the template selected by KEYS. - -\(fn STRING &optional KEYS)" t nil) - -(autoload 'org-capture "org-capture" "\ -Capture something. -\\ -This will let you select a template from `org-capture-templates', and -then file the newly captured information. The text is immediately -inserted at the target location, and an indirect buffer is shown where -you can edit it. Pressing `\\[org-capture-finalize]' brings you back to the previous -state of Emacs, so that you can continue your work. - -When called interactively with a `\\[universal-argument]' prefix argument GOTO, don't -capture anything, just go to the file/headline where the selected -template stores its notes. - -With a `\\[universal-argument] \\[universal-argument]' prefix argument, go to the last note stored. - -When called with a `C-0' (zero) prefix, insert a template at point. - -When called with a `C-1' (one) prefix, force prompting for a date when -a datetree entry is made. - -ELisp programs can set KEYS to a string associated with a template -in `org-capture-templates'. In this case, interactive selection -will be bypassed. - -If `org-capture-use-agenda-date' is non-nil, capturing from the -agenda will use the date at point as the default date. Then, a -`C-1' prefix will tell the capture process to use the HH:MM time -of the day at point (if any) or the current HH:MM time. - -\(fn &optional GOTO KEYS)" t nil) - -(autoload 'org-capture-import-remember-templates "org-capture" "\ -Set `org-capture-templates' to be similar to `org-remember-templates'. - -\(fn)" t nil) - -;;;*** - -;;;### (autoloads nil "org-colview" "org-colview.el" (23994 42575 -;;;;;; 292988 339000)) -;;; Generated autoloads from org-colview.el - -(autoload 'org-columns-remove-overlays "org-colview" "\ -Remove all currently active column overlays. - -\(fn)" t nil) - -(autoload 'org-columns-get-format-and-top-level "org-colview" "\ - - -\(fn)" nil nil) - -(autoload 'org-columns "org-colview" "\ -Turn on column view on an Org mode file. - -Column view applies to the whole buffer if point is before the -first headline. Otherwise, it applies to the first ancestor -setting \"COLUMNS\" property. If there is none, it defaults to -the current headline. With a `\\[universal-argument]' prefix argument, turn on column -view for the whole buffer unconditionally. - -When COLUMNS-FMT-STRING is non-nil, use it as the column format. - -\(fn &optional GLOBAL COLUMNS-FMT-STRING)" t nil) - -(autoload 'org-columns-compute "org-colview" "\ -Summarize the values of PROPERTY hierarchically. -Also update existing values for PROPERTY according to the first -column specification. - -\(fn PROPERTY)" t nil) - -(autoload 'org-dblock-write:columnview "org-colview" "\ -Write the column view table. - -PARAMS is a property list of parameters: - -`:id' (mandatory) - - The ID property of the entry where the columns view should be - built. When the symbol `local', call locally. When `global' - call column view with the cursor at the beginning of the - buffer (usually this means that the whole buffer switches to - column view). When \"file:path/to/file.org\", invoke column - view at the start of that file. Otherwise, the ID is located - using `org-id-find'. - -`:exclude-tags' - - List of tags to exclude from column view table. - -`:format' - - When non-nil, specify the column view format to use. - -`:hlines' - - When non-nil, insert a hline before each item. When - a number, insert a hline before each level inferior or equal - to that number. - -`:indent' - - When non-nil, indent each ITEM field according to its level. - -`:match' - - When set to a string, use this as a tags/property match filter. - -`:maxlevel' - - When set to a number, don't capture headlines below this level. - -`:skip-empty-rows' - - When non-nil, skip rows where all specifiers other than ITEM - are empty. - -`:vlines' - - When non-nil, make each column a column group to enforce - vertical lines. - -\(fn PARAMS)" nil nil) - -(autoload 'org-columns-insert-dblock "org-colview" "\ -Create a dynamic block capturing a column view table. - -\(fn)" t nil) - -(autoload 'org-agenda-columns "org-colview" "\ -Turn on or update column view in the agenda. - -\(fn)" t nil) - -;;;*** - -;;;### (autoloads nil "org-compat" "org-compat.el" (23994 42575 294341 -;;;;;; 936000)) -;;; Generated autoloads from org-compat.el - -(autoload 'org-check-version "org-compat" "\ -Try very hard to provide sensible version strings. - -\(fn)" nil t) - -;;;*** - -;;;### (autoloads nil "org-duration" "org-duration.el" (23994 42575 -;;;;;; 300963 551000)) -;;; Generated autoloads from org-duration.el - -(autoload 'org-duration-set-regexps "org-duration" "\ -Set duration related regexps. - -\(fn)" t nil) - -(autoload 'org-duration-p "org-duration" "\ -Non-nil when string S is a time duration. - -\(fn S)" nil nil) - -(autoload 'org-duration-to-minutes "org-duration" "\ -Return number of minutes of DURATION string. - -When optional argument CANONICAL is non-nil, ignore -`org-duration-units' and use standard time units value. - -A bare number is translated into minutes. The empty string is -translated into 0.0. - -Return value as a float. Raise an error if duration format is -not recognized. - -\(fn DURATION &optional CANONICAL)" nil nil) - -(autoload 'org-duration-from-minutes "org-duration" "\ -Return duration string for a given number of MINUTES. - -Format duration according to `org-duration-format' or FMT, when -non-nil. - -When optional argument CANONICAL is non-nil, ignore -`org-duration-units' and use standard time units value. - -Raise an error if expected format is unknown. - -\(fn MINUTES &optional FMT CANONICAL)" nil nil) - -(autoload 'org-duration-h:mm-only-p "org-duration" "\ -Non-nil when every duration in TIMES has \"H:MM\" or \"H:MM:SS\" format. - -TIMES is a list of duration strings. - -Return nil if any duration is expressed with units, as defined in -`org-duration-units'. Otherwise, if any duration is expressed -with \"H:MM:SS\" format, return `h:mm:ss'. Otherwise, return -`h:mm'. - -\(fn TIMES)" nil nil) - -;;;*** - -;;;### (autoloads nil "org-goto" "org-goto.el" (23994 42575 313089 -;;;;;; 494000)) -;;; Generated autoloads from org-goto.el - -(autoload 'org-goto-location "org-goto" "\ -Let the user select a location in current buffer. -This function uses a recursive edit. It returns the selected -position or nil. - -\(fn &optional BUF HELP)" nil nil) - -(autoload 'org-goto "org-goto" "\ -Look up a different location in the current file, keeping current visibility. - -When you want look-up or go to a different location in a -document, the fastest way is often to fold the entire buffer and -then dive into the tree. This method has the disadvantage, that -the previous location will be folded, which may not be what you -want. - -This command works around this by showing a copy of the current -buffer in an indirect buffer, in overview mode. You can dive -into the tree in that copy, use org-occur and incremental search -to find a location. When pressing RET or `Q', the command -returns to the original buffer in which the visibility is still -unchanged. After RET it will also jump to the location selected -in the indirect buffer and expose the headline hierarchy above. - -With a prefix argument, use the alternative interface: e.g., if -`org-goto-interface' is `outline' use `outline-path-completion'. - -\(fn &optional ALTERNATIVE-INTERFACE)" t nil) - -;;;*** - -;;;### (autoloads nil "org-lint" "org-lint.el" (23994 42575 323648 -;;;;;; 811000)) -;;; Generated autoloads from org-lint.el - -(autoload 'org-lint "org-lint" "\ -Check current Org buffer for syntax mistakes. - -By default, run all checkers. With a `\\[universal-argument]' prefix ARG, select one -category of checkers only. With a `\\[universal-argument] \\[universal-argument]' prefix, run one precise -checker by its name. - -ARG can also be a list of checker names, as symbols, to run. - -\(fn &optional ARG)" t nil) - -;;;*** - -;;;### (autoloads nil "org-macs" "org-macs.el" (23994 42575 329756 -;;;;;; 315000)) -;;; Generated autoloads from org-macs.el - -(autoload 'org-load-noerror-mustsuffix "org-macs" "\ -Load FILE with optional arguments NOERROR and MUSTSUFFIX. - -\(fn FILE)" nil t) - -;;;*** - -;;;### (autoloads nil "org-version" "org-version.el" (23994 42575 -;;;;;; 346718 252000)) -;;; Generated autoloads from org-version.el - -(autoload 'org-release "org-version" "\ -The release version of Org. -Inserted by installing Org mode or when a release is made. - -\(fn)" nil nil) - -(autoload 'org-git-version "org-version" "\ -The Git version of Org mode. -Inserted by installing Org or when a release is made. - -\(fn)" nil nil) - -(defvar org-odt-data-dir "/usr/share/emacs/etc/org" "\ -The location of ODT styles.") - -;;;*** - -;;;### (autoloads nil nil ("ob-C.el" "ob-J.el" "ob-R.el" "ob-abc.el" -;;;;;; "ob-asymptote.el" "ob-awk.el" "ob-calc.el" "ob-clojure.el" -;;;;;; "ob-comint.el" "ob-coq.el" "ob-core.el" "ob-css.el" "ob-ditaa.el" -;;;;;; "ob-dot.el" "ob-ebnf.el" "ob-emacs-lisp.el" "ob-eval.el" -;;;;;; "ob-exp.el" "ob-forth.el" "ob-fortran.el" "ob-gnuplot.el" -;;;;;; "ob-groovy.el" "ob-haskell.el" "ob-hledger.el" "ob-io.el" -;;;;;; "ob-java.el" "ob-js.el" "ob-keys.el" "ob-latex.el" "ob-ledger.el" -;;;;;; "ob-lilypond.el" "ob-lisp.el" "ob-lob.el" "ob-lua.el" "ob-makefile.el" -;;;;;; "ob-matlab.el" "ob-maxima.el" "ob-mscgen.el" "ob-ocaml.el" -;;;;;; "ob-octave.el" "ob-org.el" "ob-perl.el" "ob-picolisp.el" -;;;;;; "ob-plantuml.el" "ob-processing.el" "ob-python.el" "ob-ref.el" -;;;;;; "ob-ruby.el" "ob-sass.el" "ob-scheme.el" "ob-screen.el" "ob-sed.el" -;;;;;; "ob-shell.el" "ob-shen.el" "ob-sql.el" "ob-sqlite.el" "ob-stan.el" -;;;;;; "ob-table.el" "ob-tangle.el" "ob-vala.el" "ob.el" "org-archive.el" -;;;;;; "org-attach.el" "org-bbdb.el" "org-bibtex.el" "org-clock.el" -;;;;;; "org-crypt.el" "org-ctags.el" "org-datetree.el" "org-docview.el" -;;;;;; "org-element.el" "org-entities.el" "org-eshell.el" "org-eww.el" -;;;;;; "org-faces.el" "org-feed.el" "org-footnote.el" "org-gnus.el" -;;;;;; "org-habit.el" "org-id.el" "org-indent.el" "org-info.el" -;;;;;; "org-inlinetask.el" "org-install.el" "org-irc.el" "org-list.el" -;;;;;; "org-loaddefs.el" "org-macro.el" "org-mhe.el" "org-mobile.el" -;;;;;; "org-mouse.el" "org-pcomplete.el" "org-pkg.el" "org-plot.el" -;;;;;; "org-protocol.el" "org-rmail.el" "org-src.el" "org-table.el" -;;;;;; "org-tempo.el" "org-timer.el" "org-w3m.el" "ox-ascii.el" -;;;;;; "ox-beamer.el" "ox-html.el" "ox-icalendar.el" "ox-latex.el" -;;;;;; "ox-man.el" "ox-md.el" "ox-odt.el" "ox-org.el" "ox-publish.el" -;;;;;; "ox-texinfo.el" "ox.el") (23994 42575 381500 755000)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; End: -;;; org-autoloads.el ends here diff --git a/elpa/org-20191028/orgcard.pdf b/elpa/org-20191028/orgcard.pdf deleted file mode 100644 index 494f3f0cf2782dd5018a758c3ad5ae3353d94d4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118708 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%0DiFsu^86t#oUxYga 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

JVX%0_0U$WCoG+J*On|Gd+N125sGET=`2 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 to get a visual indication of the numbering +in the outline. The numbering is also automatically updated upon +changes in the buffer. + +*** New property =HTML_HEADLINE_CLASS= in HTML export + +The new property =HTML_HEADLINE_CLASS= assigns a class attribute to +a headline. + +*** Allow LaTeX attributes and captions for "table.el" tables + +Supported LaTeX attributes are ~:float~, ~:center~, ~:font~ and +~:caption~. + +*** Attach buffer contents to headline + +With == key from attachment dispatcher (==), it is now +possible to write the contents of a buffer to a file in the headline +attachment directory. + +*** iCalendar export respects a =CLASS= property + +Set the =CLASS= property on an entry to specify a visibility class for +that entry only during iCalendar export. The property can be set to +anything the calendar server supports. The iCalendar standard defines +the values =PUBLIC=, =CONFIDENTIAL=, =PRIVATE=, which can be +interpreted as publicly visible, accessible to a specific group, and +private respectively. + +This property can be inherited during iCalendar export, depending on +the value of ~org-use-property-inheritance~. + +*** New parameter for =INCLUDE= keyword + +Add =:coding CODING-SYSTEM= to include files using a different coding +system than the main Org document. For example: + +#+begin_example +,#+INCLUDE: "myfile.cmd" src cmd :coding cp850-dos +#+end_example + +*** New values in clock tables' step: =month= and =year= +*** ODT export handles numbers cookies in lists +*** New cell movement functions in tables + +~S-~, ~S-~, ~S-~, and ~S-~ now move cells in +the corresponding direction by swapping with the adjacent cell. + +*** New option to natively fontify LaTeX snippets and environments + +A 'native option was added to org-highlight-latex-and-related. It +matches the same structures than 'latex but it calls +org-src-font-lock-fontify-block instead, thus bringing about full +LaTeX font locking. + +*** ~org-clone-subtree-with-time-shift~ learned to shift backward in time + +== (~org-clone-subtree-with-time-shift~) now takes a +negative value as a valid repeater to shift time stamps in backward +in cloned subtrees. You can give, for example, ‘-3d’ to shift three +days in the past. + +*** Toggle display of all vs. undone scheduled habits conveniently + +== (~org-habit-toggle-display-in-agenda~) in an agenda toggles +the display of all habits to those which are undone and scheduled. +This is a function for convenience. + +*** New parameter for SQL Babel blocks: ~:dbconnection~ + +The new parameter ~:dbconnection~ allows to specify a connection name +in a SQL block header: this name is used to look up connection +parameters in ~sql-connection-alist~. + +*** New =:scale= attribute supported by LaTeX exporters + +The builtin "latex" exporters now accept and use a =:scale= attribute, +which scales an image by a given factor. + +This attribute is wrapped around the =scale= parameter of LaTeX's +=\includegraphics= (bitmap images) or a TiKZ's =\scalebox=. +Therefore, its value should be some string palatable to LaTeX as +a positive float Its default value is an empty string (i.e. disabled). + +This attribute overrides the =:width= and =:height= attributes. + +#+begin_example +,#+name: Beastie +,#+caption: I think I saw this curious horse already, but where ? +,#+LATEX_ATTR: :scale 2 +[[https://orgmode.org/img/org-mode-unicorn-logo.png]] +#+end_example + +*** Allow specifying the target for a table of contents + +The =+TOC= keyword now accepts a =:target:= attribute that specifies +the headline to use for making the table of contents. + +#+begin_example +,* Target + :PROPERTIES: + :CUSTOM_ID: TargetSection + :END: +,** Heading A +,** Heading B +,* Another section +,#+TOC: headlines 1 :target "#TargetSection" +#+end_example + +** New functions +*** ~org-dynamic-block-insert-dblock~ + +Use default keybinding == to run command +~org-dynamic-block-insert-dblock~. It will prompt user to select +dynamic block in ~org-dynamic-block-alist~. + +*** ~org-table-cell-up~ +*** ~org-table-cell-down~ +*** ~org-table-cell-left~ +*** ~org-table-cell-right~ +*** ~org-habit-toggle-display-in-agenda~ +** Removed functions and variables +*** Removed Org Drill + +You can install it back from MELPA. + +*** ~org-babel-set-current-result-hash~ +*** ~org-capture-insert-template-here~ +*** ~org-attach-directory~ + +It has been deprecated in favor of ~org-attach-id-dir~ which is less +ambiguous given the restructured org-attach. + +*** ~org-enable-fixed-width-editor~ + +This variable was not used through the code base. + +** Miscellaneous +*** Change signature for ~org-list-to-subtree~ + +The function now accepts the level of the subtree as an optional +argument. It no longer deduces it from the current level. + +*** LaTeX preview is simplified + +Function ~org-latex-preview~, formerly known as +~org-toggle-latex-fragment~, has a hopefully simpler and more +predictable behavior. See its docstring for details. + +*** ~org-table-copy-down~ supports patterns + +When ~org-table-copy-increment~ is non-nil, it is now possible to +increment fields like =A1=, or =0A=, i.e., any string prefixed or +suffixed with a whole number. + +*** No more special indentation for description items + +Descriptions items are indented like regular ones, i.e., text starts +after the bullet. Special indentation used to introduce bugs when +inserting sub-items in a description list. + +*** New hook: ~org-todo-repeat-hook~ + +This hook was actually introduced in Org 9.2.1, but wasn't advertised. + +*** Org Table reads numbers starting with 0 as strings +*** Disable fast tag selection interface via prefix arg + +A call of ~org-set-tags-command~ with prefix argument C-u C-u avoids +the fast tag selection interface and instead offers the plain +interface. + +*** ~:mkdirp~ now supports create directory for ~:dir~ path + +The ~:mkdirp~ header argument used to only work for ~:tangle~ tangle +files. Now ~:mkdirp~ works for ~:dir~ too. This is more convenient for +specify default directory and with ~:file~ header argument. + +*** New variable: ~org-agenda-breadcrumbs-separator~ + +If breadcrumbs are showed in org-agenda with the help of "%b" format +in ~org-agenda-prefix-format~, user can customize breadcrumbs's +separator using ~org-agenda-breadcrumbs-separator~. + +*** New variable ~org-attach-commands~ + +This variable makes it possible to customize the list of commands for +the attachment dispatcher. + +*** New ID method based on timestamp + +If one chooses, it is now possible to create ID's based on timestamp +(ISO8601) instead of UUID by changing org-id-method to ts. + +For an improved folder structure when using timestamp as ID, make sure +to promote ~org-attach-id-ts-folder-format~ to the first element of +~org-attach-id-to-path-function-list~ in your configuration at the +same time. + +*** New customization: ~org-id-locations-relative~ + +New customization to make the persisting of org-id-locations between +sessions to store links to files as relative instead of absolute. The +links will be stored as relative to the path of org-id-locations-file. + +*** ~org-ctrl-c-tab~ is functional before the first headline + +I.e. treat the whole file as if it was a subtree. + +Also fold everything below the chosen level. Former behavior was to +leave unfolded subtrees unfolded. + +*** ~org-kill-note-or-show-branches~ is functional before the first headline + +I.e. treat the whole file as if it was a subtree. + +*** Respect narrowing when agenda command is restricted to buffer + * Version 9.2 ** Incompatible changes *** Removal of OrgStruct mode mode and radio lists @@ -31,7 +491,7 @@ Org 9.2 comes with a new template expansion mechanism, combining ~org-insert-structure-template~ bound to ~C-c C-,~. If you customized the ~org-structure-template-alist~ option manually, -you probably need to udpate it, see the docstring for accepted values. +you probably need to update it, see the docstring for accepted values. If you prefer using previous patterns, e.g. = +;; Keywords: literate programming, reproducible research +;; Homepage: https://orgmode.org + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; Org Babel support for evaluating Eshell source code. + +;;; Code: +(require 'ob) +(require 'eshell) + +(declare-function eshell-send-input "esh-mode" + (&optional use-region queue-p no-newline)) + +(defvar eshell-last-output-start) +(defvar eshell-last-output-end) +(defvar eshell-last-input-end) + +(defvar org-babel-default-header-args:eshell '()) + +(defun org-babel-execute:eshell (body params) + "Execute a block of Eshell code BODY with PARAMS. +This function is called by `org-babel-execute-src-block'. + +The BODY can be any code which allowed executed in Eshell. +Eshell allow to execute normal shell command and Elisp code. +More details please reference Eshell Info. + +The PARAMS are variables assignments." + (let* ((session (org-babel-eshell-initiate-session + (cdr (assq :session params)))) + (full-body (org-babel-expand-body:generic + body params (org-babel-variable-assignments:eshell params)))) + (if session + (progn + (with-current-buffer session + (dolist (line (split-string full-body "\n")) + (goto-char eshell-last-output-end) + (insert line) + (eshell-send-input)) + ;; get output of last input + ;; TODO: collect all output instead of last command's output. + (goto-char eshell-last-input-end) + (buffer-substring-no-properties (point) eshell-last-output-start))) + (with-temp-buffer + (eshell-command full-body t) + (buffer-string))))) + +(defun org-babel-prep-session:eshell (session params) + "Prepare SESSION according to the header arguments specified in PARAMS." + (let* ((session (org-babel-eshell-initiate-session session)) + ;; Eshell session buffer is read from variable `eshell-buffer-name'. + (eshell-buffer-name session) + (var-lines (org-babel-variable-assignments:eshell params))) + (call-interactively #'eshell) + (mapc #'eshell-command var-lines) + session)) + +(defun ob-eshell-session-live-p (session) + "Non-nil if Eshell SESSION exists." + (get-buffer session)) + +(defun org-babel-eshell-initiate-session (&optional session _params) + "Initiate a session named SESSION." + (when (and session (not (string= session "none"))) + (save-window-excursion + (unless (ob-eshell-session-live-p session) + (let ((eshell-buffer-name session)) (eshell)))) + session)) + +(defun org-babel-variable-assignments:eshell (params) + "Convert ob-eshell :var specified variables into Eshell variables assignments." + (mapcar + (lambda (pair) + (format "(setq %s %S)" (car pair) (cdr pair))) + (org-babel--get-vars params))) + +(defun org-babel-load-session:eshell (session body params) + "Load BODY into SESSION with PARAMS." + (save-window-excursion + (let ((buffer (org-babel-prep-session:eshell session params))) + (with-current-buffer buffer + (goto-char (point-max)) + (insert (org-babel-chomp body))) + buffer))) + +(provide 'ob-eshell) + +;;; ob-eshell.el ends here diff --git a/elpa/org-20191028/ob-eval.el b/elpa/org-20200127/ob-eval.el similarity index 98% rename from elpa/org-20191028/ob-eval.el rename to elpa/org-20200127/ob-eval.el index 8d5b7ed2..a939d934 100644 --- a/elpa/org-20191028/ob-eval.el +++ b/elpa/org-20200127/ob-eval.el @@ -1,6 +1,6 @@ ;;; ob-eval.el --- Babel Functions for External Code Evaluation -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research, comint diff --git a/elpa/org-20191028/ob-exp.el b/elpa/org-20200127/ob-exp.el similarity index 99% rename from elpa/org-20191028/ob-exp.el rename to elpa/org-20200127/ob-exp.el index 177104b0..bbf9b55a 100644 --- a/elpa/org-20191028/ob-exp.el +++ b/elpa/org-20200127/ob-exp.el @@ -1,6 +1,6 @@ ;;; ob-exp.el --- Exportation of Babel Source Blocks -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Authors: Eric Schulte ;; Dan Davison @@ -32,7 +32,6 @@ (declare-function org-element-type "org-element" (element)) (declare-function org-escape-code-in-string "org-src" (s)) (declare-function org-export-copy-buffer "ox" ()) -(declare-function org-fill-template "org" (template alist)) (declare-function org-in-commented-heading-p "org" (&optional no-inheritance)) (defvar org-src-preserve-indentation) diff --git a/elpa/org-20191028/ob-forth.el b/elpa/org-20200127/ob-forth.el similarity index 98% rename from elpa/org-20191028/ob-forth.el rename to elpa/org-20200127/ob-forth.el index 5d4fe304..aef6784c 100644 --- a/elpa/org-20191028/ob-forth.el +++ b/elpa/org-20200127/ob-forth.el @@ -1,6 +1,6 @@ ;;; ob-forth.el --- Babel Functions for Forth -*- lexical-binding: t; -*- -;; Copyright (C) 2014-2019 Free Software Foundation, Inc. +;; Copyright (C) 2014-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research, forth diff --git a/elpa/org-20191028/ob-fortran.el b/elpa/org-20200127/ob-fortran.el similarity index 99% rename from elpa/org-20191028/ob-fortran.el rename to elpa/org-20200127/ob-fortran.el index 1431eb40..154465f2 100644 --- a/elpa/org-20191028/ob-fortran.el +++ b/elpa/org-20200127/ob-fortran.el @@ -1,6 +1,6 @@ ;;; ob-fortran.el --- Babel Functions for Fortran -*- lexical-binding: t; -*- -;; Copyright (C) 2011-2019 Free Software Foundation, Inc. +;; Copyright (C) 2011-2020 Free Software Foundation, Inc. ;; Authors: Sergey Litvinov ;; Eric Schulte diff --git a/elpa/org-20191028/ob-gnuplot.el b/elpa/org-20200127/ob-gnuplot.el similarity index 99% rename from elpa/org-20191028/ob-gnuplot.el rename to elpa/org-20200127/ob-gnuplot.el index cc4c3cb2..d11c55f7 100644 --- a/elpa/org-20191028/ob-gnuplot.el +++ b/elpa/org-20200127/ob-gnuplot.el @@ -1,6 +1,6 @@ ;;; ob-gnuplot.el --- Babel Functions for Gnuplot -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-groovy.el b/elpa/org-20200127/ob-groovy.el similarity index 98% rename from elpa/org-20191028/ob-groovy.el rename to elpa/org-20200127/ob-groovy.el index a22e21df..38e2a169 100644 --- a/elpa/org-20191028/ob-groovy.el +++ b/elpa/org-20200127/ob-groovy.el @@ -1,6 +1,6 @@ ;;; ob-groovy.el --- Babel Functions for Groovy -*- lexical-binding: t; -*- -;; Copyright (C) 2013-2019 Free Software Foundation, Inc. +;; Copyright (C) 2013-2020 Free Software Foundation, Inc. ;; Author: Miro Bezjak ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-haskell.el b/elpa/org-20200127/ob-haskell.el similarity index 99% rename from elpa/org-20191028/ob-haskell.el rename to elpa/org-20200127/ob-haskell.el index a683b110..e004a340 100644 --- a/elpa/org-20191028/ob-haskell.el +++ b/elpa/org-20200127/ob-haskell.el @@ -1,6 +1,6 @@ ;;; ob-haskell.el --- Babel Functions for Haskell -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-hledger.el b/elpa/org-20200127/ob-hledger.el similarity index 97% rename from elpa/org-20191028/ob-hledger.el rename to elpa/org-20200127/ob-hledger.el index 4fb1f694..06d03b67 100644 --- a/elpa/org-20191028/ob-hledger.el +++ b/elpa/org-20200127/ob-hledger.el @@ -1,6 +1,6 @@ ;; ob-hledger.el --- Babel Functions for hledger -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Simon Michael ;; Keywords: literate programming, reproducible research, plain text accounting diff --git a/elpa/org-20191028/ob-io.el b/elpa/org-20200127/ob-io.el similarity index 98% rename from elpa/org-20191028/ob-io.el rename to elpa/org-20200127/ob-io.el index 9817c641..4d1f1542 100644 --- a/elpa/org-20191028/ob-io.el +++ b/elpa/org-20200127/ob-io.el @@ -1,6 +1,6 @@ ;;; ob-io.el --- Babel Functions for Io -*- lexical-binding: t; -*- -;; Copyright (C) 2012-2019 Free Software Foundation, Inc. +;; Copyright (C) 2012-2020 Free Software Foundation, Inc. ;; Author: Andrzej Lichnerowicz ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-java.el b/elpa/org-20200127/ob-java.el similarity index 98% rename from elpa/org-20191028/ob-java.el rename to elpa/org-20200127/ob-java.el index b055f85e..4b3d4548 100644 --- a/elpa/org-20191028/ob-java.el +++ b/elpa/org-20200127/ob-java.el @@ -1,6 +1,6 @@ ;;; ob-java.el --- Babel Functions for Java -*- lexical-binding: t; -*- -;; Copyright (C) 2011-2019 Free Software Foundation, Inc. +;; Copyright (C) 2011-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-js.el b/elpa/org-20200127/ob-js.el similarity index 99% rename from elpa/org-20191028/ob-js.el rename to elpa/org-20200127/ob-js.el index dd53ef69..8f66d102 100644 --- a/elpa/org-20191028/ob-js.el +++ b/elpa/org-20200127/ob-js.el @@ -1,6 +1,6 @@ ;;; ob-js.el --- Babel Functions for Javascript -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research, js diff --git a/elpa/org-20191028/ob-latex.el b/elpa/org-20200127/ob-latex.el similarity index 99% rename from elpa/org-20191028/ob-latex.el rename to elpa/org-20200127/ob-latex.el index adf83d46..e0cc1033 100644 --- a/elpa/org-20191028/ob-latex.el +++ b/elpa/org-20200127/ob-latex.el @@ -1,6 +1,6 @@ ;;; ob-latex.el --- Babel Functions for LaTeX -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-ledger.el b/elpa/org-20200127/ob-ledger.el similarity index 97% rename from elpa/org-20191028/ob-ledger.el rename to elpa/org-20200127/ob-ledger.el index 56599298..e63e1060 100644 --- a/elpa/org-20191028/ob-ledger.el +++ b/elpa/org-20200127/ob-ledger.el @@ -1,6 +1,6 @@ ;;; ob-ledger.el --- Babel Functions for Ledger -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Eric S Fraga ;; Keywords: literate programming, reproducible research, accounting diff --git a/elpa/org-20191028/ob-lilypond.el b/elpa/org-20200127/ob-lilypond.el similarity index 99% rename from elpa/org-20191028/ob-lilypond.el rename to elpa/org-20200127/ob-lilypond.el index 4538ed5c..eb3372fa 100644 --- a/elpa/org-20191028/ob-lilypond.el +++ b/elpa/org-20200127/ob-lilypond.el @@ -1,6 +1,6 @@ ;;; ob-lilypond.el --- Babel Functions for Lilypond -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Martyn Jago ;; Keywords: babel language, literate programming diff --git a/elpa/org-20191028/ob-lisp.el b/elpa/org-20200127/ob-lisp.el similarity index 98% rename from elpa/org-20191028/ob-lisp.el rename to elpa/org-20200127/ob-lisp.el index e717fc34..f0e1ff63 100644 --- a/elpa/org-20191028/ob-lisp.el +++ b/elpa/org-20200127/ob-lisp.el @@ -1,6 +1,6 @@ ;;; ob-lisp.el --- Babel Functions for Common Lisp -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Authors: Joel Boehland ;; Eric Schulte @@ -107,7 +107,7 @@ a property list containing the parameters of the block." (point-min) (point-max))))) (cdr (assq :package params))))))) (org-babel-result-cond (cdr (assq :result-params params)) - result + (org-strip-quotes result) (condition-case nil (read (org-babel-lisp-vector-to-list result)) (error result)))) diff --git a/elpa/org-20191028/ob-lob.el b/elpa/org-20200127/ob-lob.el similarity index 99% rename from elpa/org-20191028/ob-lob.el rename to elpa/org-20200127/ob-lob.el index a6194c4b..8c341e67 100644 --- a/elpa/org-20191028/ob-lob.el +++ b/elpa/org-20200127/ob-lob.el @@ -1,6 +1,6 @@ ;;; ob-lob.el --- Functions Supporting the Library of Babel -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Authors: Eric Schulte ;; Dan Davison diff --git a/elpa/org-20191028/ob-lua.el b/elpa/org-20200127/ob-lua.el similarity index 96% rename from elpa/org-20191028/ob-lua.el rename to elpa/org-20200127/ob-lua.el index 9a665057..b046b54b 100644 --- a/elpa/org-20191028/ob-lua.el +++ b/elpa/org-20200127/ob-lua.el @@ -1,6 +1,6 @@ ;;; ob-lua.el --- Org Babel functions for Lua evaluation -*- lexical-binding: t; -*- -;; Copyright (C) 2014, 2016-2019 Free Software Foundation, Inc. +;; Copyright (C) 2014, 2016-2020 Free Software Foundation, Inc. ;; Authors: Dieter Schoen ;; Keywords: literate programming, reproducible research @@ -55,7 +55,7 @@ (defcustom org-babel-lua-mode 'lua-mode "Preferred lua mode for use in running lua interactively. -This will typically be 'lua-mode." +This will typically be `lua-mode'." :group 'org-babel :version "26.1" :package-version '(Org . "8.3") @@ -69,7 +69,7 @@ This will typically be 'lua-mode." :type 'string) (defcustom org-babel-lua-None-to 'hline - "Replace 'None' in lua tables with this before returning." + "Replace `None' in lua tables with this before returning." :group 'org-babel :version "26.1" :package-version '(Org . "8.3") @@ -284,8 +284,8 @@ fd:close()") (defun org-babel-lua-evaluate-external-process (body &optional result-type result-params preamble) "Evaluate BODY in external lua process. -If RESULT-TYPE equals 'output then return standard output as a -string. If RESULT-TYPE equals 'value then return the value of the +If RESULT-TYPE equals `output' then return standard output as a +string. If RESULT-TYPE equals `value' then return the value of the last statement in BODY, as elisp." (let ((raw (pcase result-type @@ -316,8 +316,8 @@ last statement in BODY, as elisp." (defun org-babel-lua-evaluate-session (session body &optional result-type result-params) "Pass BODY to the Lua process in SESSION. -If RESULT-TYPE equals 'output then return standard output as a -string. If RESULT-TYPE equals 'value then return the value of the +If RESULT-TYPE equals `output' then return standard output as a +string. If RESULT-TYPE equals `value' then return the value of the last statement in BODY, as elisp." (let* ((send-wait (lambda () (comint-send-input nil t) (sleep-for 0 5))) (dump-last-value diff --git a/elpa/org-20191028/ob-makefile.el b/elpa/org-20200127/ob-makefile.el similarity index 96% rename from elpa/org-20191028/ob-makefile.el rename to elpa/org-20200127/ob-makefile.el index 938d17bd..15bf6ee8 100644 --- a/elpa/org-20191028/ob-makefile.el +++ b/elpa/org-20200127/ob-makefile.el @@ -1,6 +1,6 @@ ;;; ob-makefile.el --- Babel Functions for Makefile -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Thomas S. Dye diff --git a/elpa/org-20191028/ob-matlab.el b/elpa/org-20200127/ob-matlab.el similarity index 95% rename from elpa/org-20191028/ob-matlab.el rename to elpa/org-20200127/ob-matlab.el index 4ad188ad..958357f3 100644 --- a/elpa/org-20191028/ob-matlab.el +++ b/elpa/org-20200127/ob-matlab.el @@ -1,6 +1,6 @@ ;;; ob-matlab.el --- Babel support for Matlab -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Dan Davison ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-maxima.el b/elpa/org-20200127/ob-maxima.el similarity index 98% rename from elpa/org-20191028/ob-maxima.el rename to elpa/org-20200127/ob-maxima.el index c8f3a61f..5d38cc30 100644 --- a/elpa/org-20191028/ob-maxima.el +++ b/elpa/org-20200127/ob-maxima.el @@ -1,6 +1,6 @@ ;;; ob-maxima.el --- Babel Functions for Maxima -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Eric S Fraga ;; Eric Schulte diff --git a/elpa/org-20191028/ob-mscgen.el b/elpa/org-20200127/ob-mscgen.el similarity index 97% rename from elpa/org-20191028/ob-mscgen.el rename to elpa/org-20200127/ob-mscgen.el index 86fcc284..fa4d3e3a 100644 --- a/elpa/org-20191028/ob-mscgen.el +++ b/elpa/org-20200127/ob-mscgen.el @@ -1,6 +1,6 @@ ;;; ob-msc.el --- Babel Functions for Mscgen -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Juan Pechiar ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-ocaml.el b/elpa/org-20200127/ob-ocaml.el similarity index 97% rename from elpa/org-20191028/ob-ocaml.el rename to elpa/org-20200127/ob-ocaml.el index 0c0ffe44..6972dae2 100644 --- a/elpa/org-20191028/ob-ocaml.el +++ b/elpa/org-20200127/ob-ocaml.el @@ -1,6 +1,6 @@ ;;; ob-ocaml.el --- Babel Functions for Ocaml -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research @@ -83,11 +83,11 @@ (raw (org-trim clean)) (result-params (cdr (assq :result-params params)))) (string-match - "\\(\\(.*\n\\)*\\)[^:\n]+ : \\([^=\n]+\\) =\\(\n\\| \\)\\(.+\\)$" + "\\(\\(.*\n\\)*\\)[^:\n]+ : \\([^=\n]+\\) =[[:space:]]+\\(\\(.\\|\n\\)+\\)$" raw) (let ((output (match-string 1 raw)) (type (match-string 3 raw)) - (value (match-string 5 raw))) + (value (match-string 4 raw))) (org-babel-reassemble-table (org-babel-result-cond result-params (cond diff --git a/elpa/org-20191028/ob-octave.el b/elpa/org-20200127/ob-octave.el similarity index 99% rename from elpa/org-20191028/ob-octave.el rename to elpa/org-20200127/ob-octave.el index d334fa51..fbfc9b97 100644 --- a/elpa/org-20191028/ob-octave.el +++ b/elpa/org-20200127/ob-octave.el @@ -1,6 +1,6 @@ ;;; ob-octave.el --- Babel Functions for Octave and Matlab -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Dan Davison ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-org.el b/elpa/org-20200127/ob-org.el similarity index 97% rename from elpa/org-20191028/ob-org.el rename to elpa/org-20200127/ob-org.el index def25096..63165019 100644 --- a/elpa/org-20191028/ob-org.el +++ b/elpa/org-20200127/ob-org.el @@ -1,6 +1,6 @@ ;;; ob-org.el --- Babel Functions for Org Code Blocks -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-perl.el b/elpa/org-20200127/ob-perl.el similarity index 98% rename from elpa/org-20191028/ob-perl.el rename to elpa/org-20200127/ob-perl.el index 810271f5..2daf5774 100644 --- a/elpa/org-20191028/ob-perl.el +++ b/elpa/org-20200127/ob-perl.el @@ -1,6 +1,6 @@ ;;; ob-perl.el --- Babel Functions for Perl -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Authors: Dan Davison ;; Eric Schulte diff --git a/elpa/org-20191028/ob-picolisp.el b/elpa/org-20200127/ob-picolisp.el similarity index 99% rename from elpa/org-20191028/ob-picolisp.el rename to elpa/org-20200127/ob-picolisp.el index 4f702529..ec2a2284 100644 --- a/elpa/org-20191028/ob-picolisp.el +++ b/elpa/org-20200127/ob-picolisp.el @@ -1,6 +1,6 @@ ;;; ob-picolisp.el --- Babel Functions for Picolisp -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Authors: Thorsten Jolitz ;; Eric Schulte diff --git a/elpa/org-20191028/ob-plantuml.el b/elpa/org-20200127/ob-plantuml.el similarity index 89% rename from elpa/org-20191028/ob-plantuml.el rename to elpa/org-20200127/ob-plantuml.el index 91229a29..14fc4361 100644 --- a/elpa/org-20191028/ob-plantuml.el +++ b/elpa/org-20200127/ob-plantuml.el @@ -1,6 +1,6 @@ ;;; ob-plantuml.el --- Babel Functions for Plantuml -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Zhang Weize ;; Keywords: literate programming, reproducible research @@ -60,16 +60,20 @@ are expected to be scalar variables." (defun org-babel-plantuml-make-body (body params) "Return PlantUML input string. + BODY is the content of the source block and PARAMS is a property list of source block parameters. This function relies on the `org-babel-expand-body:generic' function to extract `:var' entries from PARAMS and on the `org-babel-variable-assignments:plantuml' -function to convert variables to PlantUML assignments." - (concat - "@startuml\n" - (org-babel-expand-body:generic - body params (org-babel-variable-assignments:plantuml params)) - "\n@enduml")) +function to convert variables to PlantUML assignments. + +If BODY does not contain @startXXX ... @endXXX clauses, @startuml +... @enduml will be added." + (let ((full-body + (org-babel-expand-body:generic + body params (org-babel-variable-assignments:plantuml params)))) + (if (string-prefix-p "@start" body t) full-body + (format "@startuml\n%s\n@enduml" full-body)))) (defun org-babel-execute:plantuml (body params) "Execute a block of plantuml code with org-babel. @@ -93,6 +97,8 @@ This function is called by `org-babel-execute-src-block'." " -teps" "") (if (string= (file-name-extension out-file) "pdf") " -tpdf" "") + (if (string= (file-name-extension out-file) "tex") + " -tlatex" "") (if (string= (file-name-extension out-file) "vdx") " -tvdx" "") (if (string= (file-name-extension out-file) "xmi") diff --git a/elpa/org-20191028/ob-processing.el b/elpa/org-20200127/ob-processing.el similarity index 99% rename from elpa/org-20191028/ob-processing.el rename to elpa/org-20200127/ob-processing.el index 7bb9fa1b..fc1beadf 100644 --- a/elpa/org-20191028/ob-processing.el +++ b/elpa/org-20200127/ob-processing.el @@ -1,6 +1,6 @@ ;;; ob-processing.el --- Babel functions for processing -*- lexical-binding: t; -*- -;; Copyright (C) 2015-2019 Free Software Foundation, Inc. +;; Copyright (C) 2015-2020 Free Software Foundation, Inc. ;; Author: Jarmo Hurri (adapted from ob-asymptote.el written by Eric Schulte) ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-python.el b/elpa/org-20200127/ob-python.el similarity index 99% rename from elpa/org-20191028/ob-python.el rename to elpa/org-20200127/ob-python.el index c36bf2dc..823f6e63 100644 --- a/elpa/org-20191028/ob-python.el +++ b/elpa/org-20200127/ob-python.el @@ -1,6 +1,6 @@ ;;; ob-python.el --- Babel Functions for Python -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Authors: Eric Schulte ;; Dan Davison diff --git a/elpa/org-20191028/ob-ref.el b/elpa/org-20200127/ob-ref.el similarity index 99% rename from elpa/org-20191028/ob-ref.el rename to elpa/org-20200127/ob-ref.el index 8c066f71..19905bf6 100644 --- a/elpa/org-20191028/ob-ref.el +++ b/elpa/org-20200127/ob-ref.el @@ -1,6 +1,6 @@ ;;; ob-ref.el --- Babel Functions for Referencing External Data -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Authors: Eric Schulte ;; Dan Davison diff --git a/elpa/org-20191028/ob-ruby.el b/elpa/org-20200127/ob-ruby.el similarity index 99% rename from elpa/org-20191028/ob-ruby.el rename to elpa/org-20200127/ob-ruby.el index be76727a..90956271 100644 --- a/elpa/org-20191028/ob-ruby.el +++ b/elpa/org-20200127/ob-ruby.el @@ -1,6 +1,6 @@ ;;; ob-ruby.el --- Babel Functions for Ruby -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-sass.el b/elpa/org-20200127/ob-sass.el similarity index 97% rename from elpa/org-20191028/ob-sass.el rename to elpa/org-20200127/ob-sass.el index b19314c6..60c081dc 100644 --- a/elpa/org-20191028/ob-sass.el +++ b/elpa/org-20200127/ob-sass.el @@ -1,6 +1,6 @@ ;;; ob-sass.el --- Babel Functions for the Sass CSS generation language -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-scheme.el b/elpa/org-20200127/ob-scheme.el similarity index 99% rename from elpa/org-20191028/ob-scheme.el rename to elpa/org-20200127/ob-scheme.el index 21d9fad2..bfd53d5d 100644 --- a/elpa/org-20191028/ob-scheme.el +++ b/elpa/org-20200127/ob-scheme.el @@ -1,6 +1,6 @@ ;;; ob-scheme.el --- Babel Functions for Scheme -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Authors: Eric Schulte ;; Michael Gauland diff --git a/elpa/org-20191028/ob-screen.el b/elpa/org-20200127/ob-screen.el similarity index 98% rename from elpa/org-20191028/ob-screen.el rename to elpa/org-20200127/ob-screen.el index a3d79841..ad00ee07 100644 --- a/elpa/org-20191028/ob-screen.el +++ b/elpa/org-20200127/ob-screen.el @@ -1,6 +1,6 @@ ;;; ob-screen.el --- Babel Support for Interactive Terminal -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Benjamin Andresen ;; Keywords: literate programming, interactive shell diff --git a/elpa/org-20191028/ob-sed.el b/elpa/org-20200127/ob-sed.el similarity index 98% rename from elpa/org-20191028/ob-sed.el rename to elpa/org-20200127/ob-sed.el index be4cff48..f926da89 100644 --- a/elpa/org-20191028/ob-sed.el +++ b/elpa/org-20200127/ob-sed.el @@ -1,6 +1,6 @@ ;;; ob-sed.el --- Babel Functions for Sed Scripts -*- lexical-binding: t; -*- -;; Copyright (C) 2015-2019 Free Software Foundation, Inc. +;; Copyright (C) 2015-2020 Free Software Foundation, Inc. ;; Author: Bjarte Johansen ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-shell.el b/elpa/org-20200127/ob-shell.el similarity index 99% rename from elpa/org-20191028/ob-shell.el rename to elpa/org-20200127/ob-shell.el index 88342bab..1383f42f 100644 --- a/elpa/org-20191028/ob-shell.el +++ b/elpa/org-20200127/ob-shell.el @@ -1,6 +1,6 @@ ;;; ob-shell.el --- Babel Functions for Shell Evaluation -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-shen.el b/elpa/org-20200127/ob-shen.el similarity index 97% rename from elpa/org-20191028/ob-shen.el rename to elpa/org-20200127/ob-shen.el index f2daa676..1ce71132 100644 --- a/elpa/org-20191028/ob-shen.el +++ b/elpa/org-20200127/ob-shen.el @@ -1,6 +1,6 @@ ;;; ob-shen.el --- Babel Functions for Shen -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research, shen diff --git a/elpa/org-20191028/ob-sql.el b/elpa/org-20200127/ob-sql.el similarity index 89% rename from elpa/org-20191028/ob-sql.el rename to elpa/org-20200127/ob-sql.el index 2a581889..59cf1956 100644 --- a/elpa/org-20191028/ob-sql.el +++ b/elpa/org-20200127/ob-sql.el @@ -1,6 +1,6 @@ ;;; ob-sql.el --- Babel Functions for SQL -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research @@ -39,6 +39,7 @@ ;; - dbport ;; - dbuser ;; - dbpassword +;; - dbconnection (to reference connections in sql-connection-alist) ;; - database ;; - colnames (default, nil, means "yes") ;; - result-params @@ -73,6 +74,7 @@ (declare-function org-table-to-lisp "org-table" (&optional txt)) (declare-function cygwin-convert-file-name-to-windows "cygw32.c" (file &optional absolute-p)) +(defvar sql-connection-alist) (defvar org-babel-default-header-args:sql '()) (defconst org-babel-header-args:sql @@ -174,16 +176,35 @@ Otherwise, use Emacs' standard conversion function." ((string= "windows-nt" system-type) file) (t (format "%S" (convert-standard-filename file))))) +(defun org-babel-find-db-connection-param (params name) + "Return database connection parameter NAME. +Given a parameter NAME, if :dbconnection is defined in PARAMS +then look for the parameter into the corresponding connection +defined in `sql-connection-alist`, otherwise look into PARAMS. +Look `sql-connection-alist` (part of SQL mode) for how to define +database connections." + (if (assq :dbconnection params) + (let* ((dbconnection (cdr (assq :dbconnection params))) + (name-mapping '((:dbhost . sql-server) + (:dbport . sql-port) + (:dbuser . sql-user) + (:dbpassword . sql-password) + (:database . sql-database))) + (mapped-name (cdr (assq name name-mapping)))) + (cadr (assq mapped-name + (cdr (assoc dbconnection sql-connection-alist))))) + (cdr (assq name params)))) + (defun org-babel-execute:sql (body params) "Execute a block of Sql code with Babel. This function is called by `org-babel-execute-src-block'." (let* ((result-params (cdr (assq :result-params params))) (cmdline (cdr (assq :cmdline params))) - (dbhost (cdr (assq :dbhost params))) - (dbport (cdr (assq :dbport params))) - (dbuser (cdr (assq :dbuser params))) - (dbpassword (cdr (assq :dbpassword params))) - (database (cdr (assq :database params))) + (dbhost (org-babel-find-db-connection-param params :dbhost)) + (dbport (org-babel-find-db-connection-param params :dbport)) + (dbuser (org-babel-find-db-connection-param params :dbuser)) + (dbpassword (org-babel-find-db-connection-param params :dbpassword)) + (database (org-babel-find-db-connection-param params :database)) (engine (cdr (assq :engine params))) (colnames-p (not (equal "no" (cdr (assq :colnames params))))) (in-file (org-babel-temp-file "sql-in-")) diff --git a/elpa/org-20191028/ob-sqlite.el b/elpa/org-20200127/ob-sqlite.el similarity index 97% rename from elpa/org-20191028/ob-sqlite.el rename to elpa/org-20200127/ob-sqlite.el index 04bf4fe2..957ee653 100644 --- a/elpa/org-20191028/ob-sqlite.el +++ b/elpa/org-20200127/ob-sqlite.el @@ -1,6 +1,6 @@ ;;; ob-sqlite.el --- Babel Functions for SQLite Databases -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research @@ -28,7 +28,6 @@ ;;; Code: (require 'ob) -(declare-function org-fill-template "org" (template alist)) (declare-function org-table-convert-region "org-table" (beg0 end0 &optional separator)) (declare-function orgtbl-to-csv "org-table" (table params)) diff --git a/elpa/org-20191028/ob-stan.el b/elpa/org-20200127/ob-stan.el similarity index 98% rename from elpa/org-20191028/ob-stan.el rename to elpa/org-20200127/ob-stan.el index 47b871d1..c563a6c3 100644 --- a/elpa/org-20191028/ob-stan.el +++ b/elpa/org-20200127/ob-stan.el @@ -1,6 +1,6 @@ ;;; ob-stan.el --- Babel Functions for Stan -*- lexical-binding: t; -*- -;; Copyright (C) 2015-2019 Free Software Foundation, Inc. +;; Copyright (C) 2015-2020 Free Software Foundation, Inc. ;; Author: Kyle Meyer ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-table.el b/elpa/org-20200127/ob-table.el similarity index 98% rename from elpa/org-20191028/ob-table.el rename to elpa/org-20200127/ob-table.el index 42eecea1..3132965c 100644 --- a/elpa/org-20191028/ob-table.el +++ b/elpa/org-20200127/ob-table.el @@ -1,6 +1,6 @@ ;;; ob-table.el --- Support for Calling Babel Functions from Tables -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob-tangle.el b/elpa/org-20200127/ob-tangle.el similarity index 92% rename from elpa/org-20191028/ob-tangle.el rename to elpa/org-20200127/ob-tangle.el index dbab56f7..94603986 100644 --- a/elpa/org-20191028/ob-tangle.el +++ b/elpa/org-20200127/ob-tangle.el @@ -1,6 +1,6 @@ ;;; ob-tangle.el --- Extract Source Code From Org Files -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research @@ -30,6 +30,7 @@ (require 'cl-lib) (require 'org-src) (require 'org-macs) +(require 'ol) (declare-function make-directory "files" (dir &optional parents)) (declare-function org-at-heading-p "org" (&optional ignored)) @@ -38,17 +39,10 @@ (declare-function org-before-first-heading-p "org" ()) (declare-function org-element-at-point "org-element" ()) (declare-function org-element-type "org-element" (element)) -(declare-function org-fill-template "org" (template alist)) (declare-function org-heading-components "org" ()) -(declare-function org-id-find "org-id" (id &optional markerp)) (declare-function org-in-commented-heading-p "org" (&optional no-inheritance)) -(declare-function org-link-escape "org" (text &optional table merge)) -(declare-function org-open-link-from-string "org" (s &optional arg reference-buffer)) -(declare-function org-store-link "org" (arg &optional interactive?)) (declare-function outline-previous-heading "outline" ()) -(defvar org-link-types-re) - (defcustom org-babel-tangle-lang-exts '(("emacs-lisp" . "el") ("elisp" . "el")) @@ -180,7 +174,7 @@ export file for all source blocks. Optional argument LANG can be used to limit the exported source code blocks by language. Return a list whose CAR is the tangled file name." (interactive "fFile to tangle: \nP") - (let ((visited-p (get-file-buffer (expand-file-name file))) + (let ((visited-p (find-buffer-visiting (expand-file-name file))) to-be-removed) (prog1 (save-window-excursion @@ -234,13 +228,7 @@ used to limit the exported source code blocks by language." (let* ((lang (car by-lang)) (specs (cdr by-lang)) (ext (or (cdr (assoc lang org-babel-tangle-lang-exts)) lang)) - (lang-f (intern - (concat - (or (and (cdr (assoc lang org-src-lang-modes)) - (symbol-name - (cdr (assoc lang org-src-lang-modes)))) - lang) - "-mode"))) + (lang-f (org-src-get-lang-mode lang)) she-banged) (mapc (lambda (spec) @@ -331,8 +319,6 @@ references." (delete-region (save-excursion (beginning-of-line 1) (point)) (save-excursion (end-of-line 1) (forward-char 1) (point))))) -(defvar org-stored-links) -(defvar org-bracket-link-regexp) (defun org-babel-spec-to-string (spec) "Insert SPEC into the current file. @@ -428,7 +414,7 @@ non-nil, return the full association list to be used by (match-string 1 extra)) org-coderef-label-format)) (link (let ((l (org-no-properties (org-store-link nil)))) - (and (string-match org-bracket-link-regexp l) + (and (string-match org-link-bracket-re l) (match-string 1 l)))) (source-name (or (nth 4 info) @@ -502,22 +488,21 @@ non-nil, return the full association list to be used by result))) (defun org-babel-tangle-comment-links (&optional info) - "Return a list of begin and end link comments for the code block at point." - (let ((link-data - `(("start-line" . ,(number-to-string - (org-babel-where-is-src-block-head))) - ("file" . ,(buffer-file-name)) - ("link" . ,(org-link-escape - (progn - (call-interactively #'org-store-link) - (org-no-properties (car (pop org-stored-links)))))) - ("source-name" . - ,(nth 4 (or info (org-babel-get-src-block-info 'light))))))) + "Return a list of begin and end link comments for the code block at point. +INFO, when non nil, is the source block information, as returned +by `org-babel-get-src-block-info'." + (let ((link-data (pcase (or info (org-babel-get-src-block-info 'light)) + (`(,_ ,_ ,_ ,_ ,name ,start ,_) + `(("start-line" . ,(org-with-point-at start + (number-to-string + (line-number-at-pos)))) + ("file" . ,(buffer-file-name)) + ("link" . ,(org-no-properties (org-store-link nil))) + ("source-name" . ,name)))))) (list (org-fill-template org-babel-tangle-comment-format-beg link-data) (org-fill-template org-babel-tangle-comment-format-end link-data)))) ;; de-tangling functions -(defvar org-bracket-link-analytic-regexp) (defun org-babel-detangle (&optional source-code-file) "Propagate changes in source file back original to Org file. This requires that code blocks were tangled with link comments @@ -527,9 +512,9 @@ which enable the original code blocks to be found." (when source-code-file (find-file source-code-file)) (goto-char (point-min)) (let ((counter 0) new-body end) - (while (re-search-forward org-bracket-link-analytic-regexp nil t) + (while (re-search-forward org-link-bracket-re nil t) (when (re-search-forward - (concat " " (regexp-quote (match-string 5)) " ends here")) + (concat " " (regexp-quote (match-string 2)) " ends here")) (setq end (match-end 0)) (forward-line -1) (save-excursion @@ -543,17 +528,15 @@ which enable the original code blocks to be found." "Jump from a tangled code file to the related Org mode file." (interactive) (let ((mid (point)) - start body-start end - target-buffer target-char link path block-name body) + start body-start end target-buffer target-char link block-name body) (save-window-excursion (save-excursion - (while (and (re-search-backward org-bracket-link-analytic-regexp nil t) + (while (and (re-search-backward org-link-bracket-re nil t) (not ; ever wider searches until matching block comments (and (setq start (line-beginning-position)) (setq body-start (line-beginning-position 2)) (setq link (match-string 0)) - (setq path (match-string 3)) - (setq block-name (match-string 5)) + (setq block-name (match-string 2)) (save-excursion (save-match-data (re-search-forward @@ -563,12 +546,9 @@ which enable the original code blocks to be found." (unless (and start (< start mid) (< mid end)) (error "Not in tangled code")) (setq body (buffer-substring body-start end))) - (when (string-match "::" path) - (setq path (substring path 0 (match-beginning 0)))) - (find-file (or (car (org-id-find path)) path)) - (setq target-buffer (current-buffer)) ;; Go to the beginning of the relative block in Org file. - (org-open-link-from-string link) + (org-link-open-from-string link) + (setq target-buffer (current-buffer)) (if (string-match "[^ \t\n\r]:\\([[:digit:]]+\\)" block-name) (let ((n (string-to-number (match-string 1 block-name)))) (if (org-before-first-heading-p) (goto-char (point-min)) diff --git a/elpa/org-20191028/ob-vala.el b/elpa/org-20200127/ob-vala.el similarity index 98% rename from elpa/org-20191028/ob-vala.el rename to elpa/org-20200127/ob-vala.el index 85868d8e..e9c214f7 100644 --- a/elpa/org-20191028/ob-vala.el +++ b/elpa/org-20200127/ob-vala.el @@ -1,6 +1,6 @@ ;;; ob-vala.el --- Babel functions for Vala evaluation -*- lexical-binding: t; -*- -;; Copyright (C) 2017-2019 Free Software Foundation, Inc. +;; Copyright (C) 2017-2020 Free Software Foundation, Inc. ;; Author: Christian Garbs ;; Keywords: literate programming, reproducible research diff --git a/elpa/org-20191028/ob.el b/elpa/org-20200127/ob.el similarity index 93% rename from elpa/org-20191028/ob.el rename to elpa/org-20200127/ob.el index 86d6928b..7347baba 100644 --- a/elpa/org-20191028/ob.el +++ b/elpa/org-20200127/ob.el @@ -1,6 +1,6 @@ ;;; ob.el --- Working with Code Blocks in Org -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Authors: Eric Schulte ;; Keywords: literate programming, reproducible research @@ -24,11 +24,11 @@ ;;; Code: (require 'org-macs) (require 'org-compat) +(require 'org-keys) (require 'ob-eval) (require 'ob-core) (require 'ob-comint) (require 'ob-exp) -(require 'ob-keys) (require 'ob-table) (require 'ob-lob) (require 'ob-ref) diff --git a/elpa/org-20191028/org-bbdb.el b/elpa/org-20200127/ol-bbdb.el similarity index 95% rename from elpa/org-20191028/org-bbdb.el rename to elpa/org-20200127/ol-bbdb.el index c1f79734..23db47ae 100644 --- a/elpa/org-20191028/org-bbdb.el +++ b/elpa/org-20200127/ol-bbdb.el @@ -1,6 +1,6 @@ -;;; org-bbdb.el --- Support for links to BBDB entries -*- lexical-binding: t; -*- +;;; ol-bbdb.el --- Links to BBDB entries -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Authors: Carsten Dominik ;; Thomas Baumann @@ -93,23 +93,22 @@ ;; ;;; Code: -(require 'org) (require 'cl-lib) +(require 'org-compat) +(require 'org-macs) +(require 'ol) -;; Declare external functions and variables +;; Declare functions and variables (declare-function bbdb "ext:bbdb-com" (string elidep)) (declare-function bbdb-company "ext:bbdb-com" (string elidep)) -(declare-function bbdb-current-record "ext:bbdb-com" - (&optional planning-on-modifying)) +(declare-function bbdb-current-record "ext:bbdb-com" (&optional planning-on-modifying)) (declare-function bbdb-name "ext:bbdb-com" (string elidep)) -(declare-function bbdb-completing-read-record "ext:bbdb-com" - (prompt &optional omit-records)) +(declare-function bbdb-completing-read-record "ext:bbdb-com" (prompt &optional omit-records)) (declare-function bbdb-record-field "ext:bbdb" (record field)) (declare-function bbdb-record-getprop "ext:bbdb" (record property)) (declare-function bbdb-record-name "ext:bbdb" (record)) -(declare-function bbdb-records "ext:bbdb" - (&optional dont-check-disk already-in-db-buffer)) +(declare-function bbdb-records "ext:bbdb" (&optional dont-check-disk already-in-db-buffer)) (declare-function bbdb-split "ext:bbdb" (string separators)) (declare-function bbdb-string-trim "ext:bbdb" (string)) (declare-function bbdb-record-get-field "ext:bbdb" (record field)) @@ -121,10 +120,13 @@ ;; `bbdb-record-xfield' replaces it in recent BBDB v3.x+ (declare-function bbdb-record-xfield "ext:bbdb" (record label)) +(declare-function calendar-absolute-from-gregorian "calendar" (date)) +(declare-function calendar-gregorian-from-absolute "calendar" (date)) (declare-function calendar-leap-year-p "calendar" (year)) + (declare-function diary-ordinal-suffix "diary-lib" (n)) -(with-no-warnings (defvar date)) ;; unprefixed, from calendar.el +(with-no-warnings (defvar date)) ;unprefixed, from calendar.el ;; Customization @@ -160,13 +162,13 @@ used." '(("birthday" . (lambda (name years suffix) (concat "Birthday: [[bbdb:" name "][" name " (" - (format "%s" years) ; handles numbers as well as strings - suffix ")]]"))) + (format "%s" years) ; handles numbers as well as strings + suffix ")]]"))) ("wedding" . (lambda (name years suffix) (concat "[[bbdb:" name "][" name "'s " - (format "%s" years) - suffix " wedding anniversary]]")))) + (format "%s" years) + suffix " wedding anniversary]]")))) "How different types of anniversaries should be formatted. An alist of elements (STRING . FORMAT) where STRING is the name of an anniversary class and format is either: @@ -230,7 +232,7 @@ date year)." (bbdb-record-getprop rec 'company) (car (bbdb-record-field rec 'organization)))) (link (concat "bbdb:" name))) - (org-store-link-props :type "bbdb" :name name :company company + (org-link-store-props :type "bbdb" :name name :company company :link link :description name) link))) @@ -532,10 +534,10 @@ END:VEVENT\n" (concat (capitalize categ) " " (nth 1 rec)) categ))))) -(provide 'org-bbdb) +(provide 'ol-bbdb) ;; Local variables: ;; generated-autoload-file: "org-loaddefs.el" ;; End: -;;; org-bbdb.el ends here +;;; ol-bbdb.el ends here diff --git a/elpa/org-20191028/org-bibtex.el b/elpa/org-20200127/ol-bibtex.el similarity index 96% rename from elpa/org-20191028/org-bibtex.el rename to elpa/org-20200127/ol-bibtex.el index 9891012b..ad662271 100644 --- a/elpa/org-20191028/org-bibtex.el +++ b/elpa/org-20200127/ol-bibtex.el @@ -1,6 +1,6 @@ -;;; org-bibtex.el --- Org links to BibTeX entries -*- lexical-binding: t; -*- +;;; ol-bibtex.el --- Links to BibTeX entries -*- lexical-binding: t; -*- ;; -;; Copyright (C) 2007-2019 Free Software Foundation, Inc. +;; Copyright (C) 2007-2020 Free Software Foundation, Inc. ;; ;; Authors: Bastien Guerry ;; Carsten Dominik @@ -107,21 +107,37 @@ ;;; Code: -(require 'org) (require 'bibtex) (require 'cl-lib) (require 'org-compat) +(require 'org-macs) +(require 'ol) (defvar org-agenda-overriding-header) (defvar org-agenda-search-view-always-boolean) (defvar org-bibtex-description nil) ; dynamically scoped from org.el (defvar org-id-locations) +(defvar org-property-end-re) +(defvar org-special-properties) +(defvar org-window-config-before-follow-link) (declare-function bibtex-beginning-of-entry "bibtex" ()) (declare-function bibtex-generate-autokey "bibtex" ()) (declare-function bibtex-parse-entry "bibtex" (&optional content)) (declare-function bibtex-url "bibtex" (&optional pos no-browse)) +(declare-function org-back-to-heading "org" (&optional invisible-ok)) +(declare-function org-entry-get "org" (pom property &optional inherit literal-nil)) +(declare-function org-entry-properties "org" (&optional pom which)) +(declare-function org-get-tags "org" (&optional pos local)) +(declare-function org-heading-components "org" ()) +(declare-function org-insert-heading "org" (&optional arg invisible-ok top)) +(declare-function org-map-entries "org" (func &optional match scope &rest skip)) +(declare-function org-narrow-to-subtree "org" ()) +(declare-function org-open-file "org" (path &optional in-emacs line search)) +(declare-function org-set-property "org" (property value)) +(declare-function org-toggle-tag "org" (tag &optional onoff)) + ;;; Bibtex data (defvar org-bibtex-types @@ -488,7 +504,7 @@ With optional argument OPTIONAL, also prompt for optional fields." (save-excursion (bibtex-beginning-of-entry) (bibtex-parse-entry))))) - (org-store-link-props + (org-link-store-props :key (cdr (assoc "=key=" entry)) :author (or (cdr (assoc "author" entry)) "[no author]") :editor (or (cdr (assoc "editor" entry)) "[no editor]") @@ -742,6 +758,6 @@ This function relies `org-search-view' to locate results." string (or org-bibtex-prefix "") org-bibtex-type-property-name)))) -(provide 'org-bibtex) +(provide 'ol-bibtex) -;;; org-bibtex.el ends here +;;; ol-bibtex.el ends here diff --git a/elpa/org-20191028/org-docview.el b/elpa/org-20200127/ol-docview.el similarity index 89% rename from elpa/org-20191028/org-docview.el rename to elpa/org-20200127/ol-docview.el index 40b06d3b..22b63029 100644 --- a/elpa/org-20191028/org-docview.el +++ b/elpa/org-20200127/ol-docview.el @@ -1,6 +1,6 @@ -;;; org-docview.el --- Support for links to doc-view-mode buffers -*- lexical-binding: t; -*- +;;; ol-docview.el --- Links to Docview mode buffers -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Jan Böcker ;; Keywords: outlines, hypermedia, calendar, wp @@ -43,11 +43,12 @@ ;;; Code: -(require 'org) (require 'doc-view) +(require 'ol) (declare-function doc-view-goto-page "doc-view" (page)) (declare-function image-mode-window-get "image-mode" (prop &optional winprops)) +(declare-function org-open-file "org" (path &optional in-emacs line search)) (org-link-set-parameters "docview" :follow #'org-docview-open @@ -84,7 +85,7 @@ (let* ((path buffer-file-name) (page (image-mode-window-get 'page)) (link (concat "docview:" path "::" (number-to-string page)))) - (org-store-link-props + (org-link-store-props :type "docview" :link link :description path)))) @@ -93,11 +94,11 @@ "Use the existing file name completion for file. Links to get the file name, then ask the user for the page number and append it." - (concat (replace-regexp-in-string "^file:" "docview:" (org-file-complete-link)) + (concat (replace-regexp-in-string "^file:" "docview:" (org-link-complete-file)) "::" (read-from-minibuffer "Page:" "1"))) -(provide 'org-docview) +(provide 'ol-docview) -;;; org-docview.el ends here +;;; ol-docview.el ends here diff --git a/elpa/org-20191028/org-eshell.el b/elpa/org-20200127/ol-eshell.el similarity index 85% rename from elpa/org-20191028/org-eshell.el rename to elpa/org-20200127/ol-eshell.el index be6db477..7e742f88 100644 --- a/elpa/org-20191028/org-eshell.el +++ b/elpa/org-20200127/ol-eshell.el @@ -1,6 +1,6 @@ -;;; org-eshell.el - Support for Links to Working Directories in Eshell -*- lexical-binding: t; -*- +;;; ol-eshell.el - Links to Working Directories in Eshell -*- lexical-binding: t; -*- -;; Copyright (C) 2011-2019 Free Software Foundation, Inc. +;; Copyright (C) 2011-2020 Free Software Foundation, Inc. ;; Author: Konrad Hinsen @@ -23,9 +23,11 @@ ;;; Code: -(require 'org) (require 'eshell) (require 'esh-mode) +(require 'ol) + +(declare-function eshell/pwd "em-dirs.el" (&rest args)) (org-link-set-parameters "eshell" :follow #'org-eshell-open @@ -55,12 +57,12 @@ "Store a link that, when opened, switches back to the current eshell buffer and the current working directory." (when (eq major-mode 'eshell-mode) - (let* ((command (concat "cd " dired-directory)) + (let* ((command (concat "cd " (eshell/pwd))) (link (concat (buffer-name) ":" command))) - (org-store-link-props + (org-link-store-props :link (concat "eshell:" link) :description command)))) -(provide 'org-eshell) +(provide 'ol-eshell) -;;; org-eshell.el ends here +;;; ol-eshell.el ends here diff --git a/elpa/org-20191028/org-eww.el b/elpa/org-20200127/ol-eww.el similarity index 92% rename from elpa/org-20191028/org-eww.el rename to elpa/org-20200127/ol-eww.el index 47f02a32..f32c06b6 100644 --- a/elpa/org-20191028/org-eww.el +++ b/elpa/org-20200127/ol-eww.el @@ -1,6 +1,6 @@ -;;; org-eww.el --- Store url and kill from Eww mode for Org -*- lexical-binding: t -*- +;;; ol-eww.el --- Store URL and kill from Eww mode -*- lexical-binding: t -*- -;; Copyright (C) 2014-2019 Free Software Foundation, Inc. +;; Copyright (C) 2014-2020 Free Software Foundation, Inc. ;; Author: Marco Wahl a ;; Keywords: link, eww @@ -44,7 +44,7 @@ ;;; Code: -(require 'org) +(require 'ol) (require 'cl-lib) (defvar eww-current-title) @@ -55,12 +55,12 @@ (declare-function eww-current-url "eww") -;; Store Org-link in eww-mode buffer +;; Store Org link in Eww mode buffer (org-link-set-parameters "eww" :follow #'eww :store #'org-eww-store-link) (defun org-eww-store-link () "Store a link to the url of an EWW buffer." (when (eq major-mode 'eww-mode) - (org-store-link-props + (org-link-store-props :type "eww" :link (if (< emacs-major-version 25) eww-current-url @@ -72,7 +72,7 @@ (eww-current-url)))))) -;; Some auxiliary functions concerning links in eww buffers +;; Some auxiliary functions concerning links in Eww buffers (defun org-eww-goto-next-url-property-change () "Move to the start of next link if exists. Otherwise point is not moved. Return point." @@ -93,7 +93,7 @@ Otherwise point is not moved. Return point." (defun org-eww-copy-for-org-mode () "Copy current buffer content or active region with `org-mode' style links. This will encode `link-title' and `link-location' with -`org-make-link-string' and insert the transformed text into the +`org-link-make-string' and insert the transformed text into the kill ring, so that it can be yanked into an Org mode buffer with links working correctly. @@ -144,7 +144,7 @@ keep the structure of the Org file." (if (org-string-nw-p link-location) ;; Hint: link-location is different ;; for form-elements. - (org-make-link-string link-location link-title) + (org-link-make-string link-location link-title) link-title)))) (goto-char temp-position) ; reset point before jump next anchor (setq out-bound t))) ; for break out `while' loop @@ -171,6 +171,6 @@ keep the structure of the Org file." (add-hook 'eww-mode-hook #'org-eww-extend-eww-keymap) -(provide 'org-eww) +(provide 'ol-eww) -;;; org-eww.el ends here +;;; ol-eww.el ends here diff --git a/elpa/org-20191028/org-gnus.el b/elpa/org-20200127/ol-gnus.el similarity index 91% rename from elpa/org-20191028/org-gnus.el rename to elpa/org-20200127/ol-gnus.el index 9e07500c..99472315 100644 --- a/elpa/org-20191028/org-gnus.el +++ b/elpa/org-20200127/ol-gnus.el @@ -1,6 +1,6 @@ -;;; org-gnus.el --- Support for Links to Gnus Groups and Messages -*- lexical-binding: t; -*- +;;; ol-gnus.el --- Links to Gnus Groups and Messages -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Tassilo Horn @@ -35,7 +35,7 @@ (require 'gnus-util) (require 'nnheader) (require 'nnir) -(require 'org) +(require 'ol) ;;; Declare external functions and variables @@ -104,6 +104,7 @@ If `org-store-link' was called with a prefix arg the meaning of (defun org-gnus-article-link (group newsgroups message-id x-no-archive) "Create a link to a Gnus article. + The article is specified by its MESSAGE-ID. Additional parameters are the Gnus GROUP, the NEWSGROUPS the article was posted to and the X-NO-ARCHIVE header value of that article. @@ -115,12 +116,12 @@ Otherwise create a link to the article inside Gnus. If `org-store-link' was called with a prefix arg the meaning of `org-gnus-prefer-web-links' is reversed." (if (and (org-xor current-prefix-arg org-gnus-prefer-web-links) - newsgroups ;; Make web links only for nntp groups - (not x-no-archive)) ;; and if X-No-Archive isn't set. - (format (if (string-match "gmane\\." newsgroups) + newsgroups ;make web links only for nntp groups + (not x-no-archive)) ;and if X-No-Archive isn't set + (format (if (string-match-p "gmane\\." newsgroups) "http://mid.gmane.org/%s" "http://groups.google.com/groups/search?as_umsgid=%s") - (org-fixup-message-id-for-http message-id)) + (url-encode-url message-id)) (concat "gnus:" group "#" message-id))) (defun org-gnus-store-link () @@ -129,9 +130,9 @@ If `org-store-link' was called with a prefix arg the meaning of (`gnus-group-mode (let ((group (gnus-group-group-name))) (when group - (org-store-link-props :type "gnus" :group group) + (org-link-store-props :type "gnus" :group group) (let ((description (org-gnus-group-link group))) - (org-add-link-props :link description :description description) + (org-link-add-props :link description :description description) description)))) ((or `gnus-summary-mode `gnus-article-mode) (let* ((group @@ -169,12 +170,12 @@ If `org-store-link' was called with a prefix arg the meaning of (setq to (or to (gnus-fetch-original-field "To"))) (setq newsgroups (gnus-fetch-original-field "Newsgroups")) (setq x-no-archive (gnus-fetch-original-field "x-no-archive"))) - (org-store-link-props :type "gnus" :from from :date date :subject subject + (org-link-store-props :type "gnus" :from from :date date :subject subject :message-id message-id :group group :to to) (let ((link (org-gnus-article-link group newsgroups message-id x-no-archive)) - (description (org-email-link-description))) - (org-add-link-props :link link :description description) + (description (org-link-email-description))) + (org-link-add-props :link link :description description) link))) (`message-mode (setq org-store-link-plist nil) ;reset @@ -197,11 +198,11 @@ If `org-store-link' was called with a prefix arg the meaning of (subject (mail-fetch-field "Subject")) newsgroup xarchive) ;those are always nil for gcc (unless gcc (error "Can not create link: No Gcc header found")) - (org-store-link-props :type "gnus" :from from :subject subject + (org-link-store-props :type "gnus" :from from :subject subject :message-id id :group gcc :to to) (let ((link (org-gnus-article-link gcc newsgroup id xarchive)) - (description (org-email-link-description))) - (org-add-link-props :link link :description description) + (description (org-link-email-description))) + (org-link-add-props :link link :description description) link))))))) (defun org-gnus-open-nntp (path) @@ -264,7 +265,6 @@ If `org-store-link' was called with a prefix arg the meaning of (org-gnus-no-server (gnus-no-server)) (t (gnus)))) -(provide 'org-gnus) - +(provide 'ol-gnus) -;;; org-gnus.el ends here +;;; ol-gnus.el ends here diff --git a/elpa/org-20191028/org-info.el b/elpa/org-20200127/ol-info.el similarity index 95% rename from elpa/org-20191028/org-info.el rename to elpa/org-20200127/ol-info.el index e21ac6b8..58d45a7f 100644 --- a/elpa/org-20191028/org-info.el +++ b/elpa/org-20200127/ol-info.el @@ -1,6 +1,6 @@ -;;; org-info.el --- Support for Links to Info Nodes -*- lexical-binding: t; -*- +;;; ol-info.el --- Links to Info Nodes -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -30,7 +30,7 @@ ;;; Code: -(require 'org) +(require 'ol) ;; Declare external functions and variables @@ -54,7 +54,7 @@ "#" Info-current-node)) (desc (concat (file-name-nondirectory Info-current-file) "#" Info-current-node))) - (org-store-link-props :type "info" :file Info-current-file + (org-link-store-props :type "info" :file Info-current-file :node Info-current-node :link link :desc desc) link))) @@ -143,6 +143,6 @@ See `org-link-parameters' for details about PATH, DESC and FORMAT." (format "@ref{%s,%s,,%s,}" node title manual))) (_ nil)))) -(provide 'org-info) +(provide 'ol-info) -;;; org-info.el ends here +;;; ol-info.el ends here diff --git a/elpa/org-20191028/org-irc.el b/elpa/org-20200127/ol-irc.el similarity index 97% rename from elpa/org-20191028/org-irc.el rename to elpa/org-20200127/ol-irc.el index dd8fd161..3a347791 100644 --- a/elpa/org-20191028/org-irc.el +++ b/elpa/org-20200127/ol-irc.el @@ -1,6 +1,6 @@ -;;; org-irc.el --- Store Links to IRC Sessions -*- lexical-binding: t; -*- +;;; ol-irc.el --- Links to IRC Sessions -*- lexical-binding: t; -*- ;; -;; Copyright (C) 2008-2019 Free Software Foundation, Inc. +;; Copyright (C) 2008-2020 Free Software Foundation, Inc. ;; ;; Author: Philip Jackson ;; Keywords: erc, irc, link, org @@ -48,7 +48,7 @@ ;;; Code: -(require 'org) +(require 'ol) (declare-function erc-buffer-filter "erc" (predicate &optional proc)) (declare-function erc-channel-p "erc" (channel)) @@ -155,7 +155,7 @@ the session itself." (parsed-line (org-irc-erc-get-line-from-log erc-line))) (if (erc-logging-enabled nil) (progn - (org-store-link-props + (org-link-store-props :type "file" :description (concat "'" (org-irc-ellipsify-description (cadr parsed-line) 20) @@ -168,7 +168,7 @@ the session itself." (link (org-irc-parse-link link-text))) (if link-text (progn - (org-store-link-props + (org-link-store-props :type "irc" :link (concat "irc:/" link-text) :description (concat "irc session `" link-text "'") @@ -260,10 +260,10 @@ FORMAT." (`md (format "[%s](irc:%s)" desc link)) (_ nil)))) -(provide 'org-irc) +(provide 'ol-irc) ;; Local variables: ;; generated-autoload-file: "org-loaddefs.el" ;; End: -;;; org-irc.el ends here +;;; ol-irc.el ends here diff --git a/elpa/org-20191028/org-mhe.el b/elpa/org-20200127/ol-mhe.el similarity index 94% rename from elpa/org-20191028/org-mhe.el rename to elpa/org-20200127/ol-mhe.el index a37c41ad..099882db 100644 --- a/elpa/org-20191028/org-mhe.el +++ b/elpa/org-20200127/ol-mhe.el @@ -1,6 +1,6 @@ -;;; org-mhe.el --- Support for Links to MH-E Messages -*- lexical-binding: t; -*- +;;; ol-mhe.el --- Links to MH-E Messages -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Author: Thomas Baumann ;; Keywords: outlines, hypermedia, calendar, wp @@ -31,7 +31,7 @@ ;;; Code: (require 'org-macs) -(require 'org) +(require 'ol) ;; Customization variables @@ -88,12 +88,12 @@ supported by MH-E." (subject (org-mhe-get-header "Subject:")) (date (org-mhe-get-header "Date:")) link desc) - (org-store-link-props :type "mh" :from from :to to :date date + (org-link-store-props :type "mh" :from from :to to :date date :subject subject :message-id message-id) - (setq desc (org-email-link-description)) + (setq desc (org-link-email-description)) (setq link (concat "mhe:" (org-mhe-get-message-real-folder) "#" (org-unbracket-string "<" ">" message-id))) - (org-add-link-props :link link :description desc) + (org-link-add-props :link link :description desc) link)))) (defun org-mhe-open (path) @@ -199,7 +199,7 @@ folders." (mh-search-choose) (if (eq mh-searcher 'pick) (progn - (setq article (org-add-angle-brackets article)) + (setq article (org-link-add-angle-brackets article)) (mh-search folder (list "--message-id" article)) (when (and org-mhe-search-all-folders (not (org-mhe-get-message-real-folder))) @@ -214,6 +214,6 @@ folders." (kill-buffer) (error "Message not found")))) -(provide 'org-mhe) +(provide 'ol-mhe) -;;; org-mhe.el ends here +;;; ol-mhe.el ends here diff --git a/elpa/org-20191028/org-rmail.el b/elpa/org-20200127/ol-rmail.el similarity index 91% rename from elpa/org-20191028/org-rmail.el rename to elpa/org-20200127/ol-rmail.el index c3d941e6..cad8eaa1 100644 --- a/elpa/org-20191028/org-rmail.el +++ b/elpa/org-20200127/ol-rmail.el @@ -1,6 +1,6 @@ -;;; org-rmail.el --- Support for Links to Rmail Messages -*- lexical-binding: t; -*- +;;; ol-rmail.el --- Links to Rmail Messages -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -30,7 +30,7 @@ ;;; Code: -(require 'org) +(require 'ol) ;; Declare external functions and variables (declare-function rmail-show-message "rmail" (&optional n no-summary)) @@ -65,13 +65,13 @@ (subject (mail-fetch-field "subject")) (date (mail-fetch-field "date")) desc link) - (org-store-link-props + (org-link-store-props :type "rmail" :from from :to to :date date :subject subject :message-id message-id) (setq message-id (org-unbracket-string "<" ">" message-id)) - (setq desc (org-email-link-description)) + (setq desc (org-link-email-description)) (setq link (concat "rmail:" folder "#" message-id)) - (org-add-link-props :link link :description desc) + (org-link-add-props :link link :description desc) (rmail-show-message rmail-current-message) link))))) @@ -89,7 +89,7 @@ (require 'rmail) (cond ((null article) (setq article "")) ((stringp article) - (setq article (org-add-angle-brackets article))) + (setq article (org-link-add-angle-brackets article))) (t (user-error "Wrong RMAIL link format"))) (let (message-number) (save-excursion @@ -110,6 +110,6 @@ message-number) (error "Message not found")))) -(provide 'org-rmail) +(provide 'ol-rmail) -;;; org-rmail.el ends here +;;; ol-rmail.el ends here diff --git a/elpa/org-20191028/org-w3m.el b/elpa/org-20200127/ol-w3m.el similarity index 95% rename from elpa/org-20191028/org-w3m.el rename to elpa/org-20200127/ol-w3m.el index 7db34738..5b03b8d3 100644 --- a/elpa/org-20191028/org-w3m.el +++ b/elpa/org-20200127/ol-w3m.el @@ -1,6 +1,6 @@ -;;; org-w3m.el --- Support from Copy and Paste From w3m -*- lexical-binding: t; -*- +;;; ol-w3m.el --- Copy and Paste From W3M -*- lexical-binding: t; -*- -;; Copyright (C) 2008-2019 Free Software Foundation, Inc. +;; Copyright (C) 2008-2020 Free Software Foundation, Inc. ;; Author: Andy Stewart ;; Keywords: outlines, hypermedia, calendar, wp @@ -41,7 +41,7 @@ ;;; Code: -(require 'org) +(require 'ol) (defvar w3m-current-url) (defvar w3m-current-title) @@ -50,7 +50,7 @@ (defun org-w3m-store-link () "Store a link to a w3m buffer." (when (eq major-mode 'w3m-mode) - (org-store-link-props + (org-link-store-props :type "w3m" :link w3m-current-url :url (url-view-url t) @@ -59,7 +59,7 @@ (defun org-w3m-copy-for-org-mode () "Copy current buffer content or active region with Org style links. This will encode `link-title' and `link-location' with -`org-make-link-string', and insert the transformed test into the kill ring, +`org-link-make-string', and insert the transformed test into the kill ring, so that it can be yanked into an Org buffer with links working correctly." (interactive) (let* ((regionp (org-region-active-p)) @@ -98,7 +98,7 @@ so that it can be yanked into an Org buffer with links working correctly." (setq return-content (concat return-content (if (org-string-nw-p link-location) - (org-make-link-string link-location link-title) + (org-link-make-string link-location link-title) link-title)))) (goto-char temp-position) ; reset point before jump next anchor (setq out-bound t))) ; for break out `while' loop @@ -179,6 +179,6 @@ Return t if there is no previous link; otherwise, return nil." (define-key w3m-minor-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) (define-key w3m-minor-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode))) -(provide 'org-w3m) +(provide 'ol-w3m) -;;; org-w3m.el ends here +;;; ol-w3m.el ends here diff --git a/elpa/org-20200127/ol.el b/elpa/org-20200127/ol.el new file mode 100644 index 00000000..9bdd3ad3 --- /dev/null +++ b/elpa/org-20200127/ol.el @@ -0,0 +1,1898 @@ +;;; ol.el --- Org links library -*- lexical-binding: t; -*- + +;; Copyright (C) 2018-2020 Free Software Foundation, Inc. + +;; Author: Carsten Dominik +;; Keywords: outlines, hypermedia, calendar, wp + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; This library provides tooling to handle both external and internal +;; links. + +;;; Code: + +(require 'org-compat) +(require 'org-macs) + +(defvar clean-buffer-list-kill-buffer-names) +(defvar org-agenda-buffer-name) +(defvar org-comment-string) +(defvar org-highlight-links) +(defvar org-id-link-to-org-use-id) +(defvar org-inhibit-startup) +(defvar org-outline-regexp-bol) +(defvar org-src-source-file-name) +(defvar org-time-stamp-formats) +(defvar org-ts-regexp) + +(declare-function calendar-cursor-to-date "calendar" (&optional error event)) +(declare-function dired-get-filename "dired" (&optional localp no-error-if-not-filep)) +(declare-function org-at-heading-p "org" (&optional _)) +(declare-function org-back-to-heading "org" (&optional invisible-ok)) +(declare-function org-do-occur "org" (regexp &optional cleanup)) +(declare-function org-element-at-point "org-element" ()) +(declare-function org-element-cache-refresh "org-element" (pos)) +(declare-function org-element-context "org-element" (&optional element)) +(declare-function org-element-lineage "org-element" (datum &optional types with-self)) +(declare-function org-element-link-parser "org-element" ()) +(declare-function org-element-property "org-element" (property element)) +(declare-function org-element-type "org-element" (element)) +(declare-function org-element-update-syntax "org-element" ()) +(declare-function org-entry-get "org" (pom property &optional inherit literal-nil)) +(declare-function org-find-property "org" (property &optional value)) +(declare-function org-get-heading "org" (&optional no-tags no-todo no-priority no-comment)) +(declare-function org-heading-components "org" ()) +(declare-function org-id-find-id-file "org-id" (id)) +(declare-function org-id-store-link "org-id" ()) +(declare-function org-insert-heading "org" (&optional arg invisible-ok top)) +(declare-function org-load-modules-maybe "org" (&optional force)) +(declare-function org-mark-ring-push "org" (&optional pos buffer)) +(declare-function org-occur "org" (regexp &optional keep-previous callback)) +(declare-function org-open-file "org" (path &optional in-emacs line search)) +(declare-function org-overview "org" ()) +(declare-function org-restart-font-lock "org" ()) +(declare-function org-show-context "org" (&optional key)) +(declare-function org-src-coderef-format "org-src" (&optional element)) +(declare-function org-src-coderef-regexp "org-src" (fmt &optional label)) +(declare-function org-src-edit-buffer-p "org-src" (&optional buffer)) +(declare-function org-src-source-buffer "org-src" ()) +(declare-function org-src-source-type "org-src" ()) +(declare-function org-time-stamp-format "org" (&optional long inactive)) +(declare-function outline-next-heading "outline" ()) + + +;;; Customization + +(defgroup org-link nil + "Options concerning links in Org mode." + :tag "Org Link" + :group 'org) + +(defcustom org-link-parameters nil + "An alist of properties that defines all the links in Org mode. +The key in each association is a string of the link type. +Subsequent optional elements make up a plist of link properties. + +:follow - A function that takes the link path as an argument. + +:export - A function that takes the link path, description and +export-backend as arguments. + +:store - A function responsible for storing the link. See the +function `org-store-link-functions'. + +:complete - A function that inserts a link with completion. The +function takes one optional prefix argument. + +:face - A face for the link, or a function that returns a face. +The function takes one argument which is the link path. The +default face is `org-link'. + +:mouse-face - The mouse-face. The default is `highlight'. + +:display - `full' will not fold the link in descriptive +display. Default is `org-link'. + +:help-echo - A string or function that takes (window object position) +as arguments and returns a string. + +:keymap - A keymap that is active on the link. The default is +`org-mouse-map'. + +:htmlize-link - A function for the htmlize-link. Defaults +to (list :uri \"type:path\") + +:activate-func - A function to run at the end of font-lock +activation. The function must accept (link-start link-end path bracketp) +as arguments." + :group 'org-link + :package-version '(Org . "9.1") + :type '(alist :tag "Link display parameters" + :value-type plist) + :safe nil) + +(defcustom org-link-descriptive t + "Non-nil means Org displays descriptive links. + +E.g. [[https://orgmode.org][Org website]] is be displayed as +\"Org Website\", hiding the link itself and just displaying its +description. When set to nil, Org displays the full links +literally. + +You can interactively set the value of this variable by calling +`org-toggle-link-display' or from the \"Org > Hyperlinks\" menu." + :group 'org-link + :type 'boolean + :safe #'booleanp) + +(defcustom org-link-make-description-function nil + "Function to use for generating link descriptions from links. +This function must take two parameters: the first one is the +link, the second one is the description generated by +`org-insert-link'. The function should return the description to +use." + :group 'org-link + :type '(choice (const nil) (function)) + :safe #'null) + +(defcustom org-link-file-path-type 'adaptive + "How the path name in file links should be stored. +Valid values are: + +relative Relative to the current directory, i.e. the directory of the file + into which the link is being inserted. +absolute Absolute path, if possible with ~ for home directory. +noabbrev Absolute path, no abbreviation of home directory. +adaptive Use relative path for files in the current directory and sub- + directories of it. For other files, use an absolute path." + :group 'org-link + :type '(choice + (const relative) + (const absolute) + (const noabbrev) + (const adaptive)) + :safe #'symbolp) + +(defcustom org-link-abbrev-alist nil + "Alist of link abbreviations. +The car of each element is a string, to be replaced at the start of a link. +The cdrs are replacement values, like (\"linkkey\" . REPLACE). Abbreviated +links in Org buffers can have an optional tag after a double colon, e.g., + + [[linkkey:tag][description]] + +The `linkkey' must be a single word, starting with a letter, followed +by letters, numbers, `-' or `_'. + +If REPLACE is a string, the tag will simply be appended to create the link. +If the string contains \"%s\", the tag will be inserted there. If the string +contains \"%h\", it will cause a url-encoded version of the tag to be inserted +at that point (see the function `url-hexify-string'). If the string contains +the specifier \"%(my-function)\", then the custom function `my-function' will +be invoked: this function takes the tag as its only argument and must return +a string. + +REPLACE may also be a function that will be called with the tag as the +only argument to create the link, which should be returned as a string. + +See the manual for examples." + :group 'org-link + :type '(repeat + (cons (string :tag "Protocol") + (choice + (string :tag "Format") + (function)))) + :safe (lambda (val) + (pcase val + (`(,(pred stringp) . ,(pred stringp)) t) + (_ nil)))) + +(defgroup org-link-follow nil + "Options concerning following links in Org mode." + :tag "Org Follow Link" + :group 'org-link) + +(defcustom org-link-translation-function nil + "Function to translate links with different syntax to Org syntax. +This can be used to translate links created for example by the Planner +or emacs-wiki packages to Org syntax. +The function must accept two parameters, a TYPE containing the link +protocol name like \"rmail\" or \"gnus\" as a string, and the linked path, +which is everything after the link protocol. It should return a cons +with possibly modified values of type and path. +Org contains a function for this, so if you set this variable to +`org-translate-link-from-planner', you should be able follow many +links created by planner." + :group 'org-link-follow + :type '(choice (const nil) (function)) + :safe #'null) + +(defcustom org-link-doi-server-url "https://doi.org/" + "The URL of the DOI server." + :group 'org-link-follow + :version "24.3" + :type 'string + :safe #'stringp) + +(defcustom org-link-frame-setup + '((vm . vm-visit-folder-other-frame) + (vm-imap . vm-visit-imap-folder-other-frame) + (gnus . org-gnus-no-new-news) + (file . find-file-other-window) + (wl . wl-other-frame)) + "Setup the frame configuration for following links. +When following a link with Emacs, it may often be useful to display +this link in another window or frame. This variable can be used to +set this up for the different types of links. +For VM, use any of + `vm-visit-folder' + `vm-visit-folder-other-window' + `vm-visit-folder-other-frame' +For Gnus, use any of + `gnus' + `gnus-other-frame' + `org-gnus-no-new-news' +For FILE, use any of + `find-file' + `find-file-other-window' + `find-file-other-frame' +For Wanderlust use any of + `wl' + `wl-other-frame' +For the calendar, use the variable `calendar-setup'. +For BBDB, it is currently only possible to display the matches in +another window." + :group 'org-link-follow + :type '(list + (cons (const vm) + (choice + (const vm-visit-folder) + (const vm-visit-folder-other-window) + (const vm-visit-folder-other-frame))) + (cons (const vm-imap) + (choice + (const vm-visit-imap-folder) + (const vm-visit-imap-folder-other-window) + (const vm-visit-imap-folder-other-frame))) + (cons (const gnus) + (choice + (const gnus) + (const gnus-other-frame) + (const org-gnus-no-new-news))) + (cons (const file) + (choice + (const find-file) + (const find-file-other-window) + (const find-file-other-frame))) + (cons (const wl) + (choice + (const wl) + (const wl-other-frame)))) + :safe nil) + +(defcustom org-link-search-must-match-exact-headline 'query-to-create + "Non-nil means internal fuzzy links can only match headlines. + +When nil, the a fuzzy link may point to a target or a named +construct in the document. When set to the special value +`query-to-create', offer to create a new headline when none +matched. + +Spaces and statistics cookies are ignored during heading searches." + :group 'org-link-follow + :version "24.1" + :type '(choice + (const :tag "Use fuzzy text search" nil) + (const :tag "Match only exact headline" t) + (const :tag "Match exact headline or query to create it" + query-to-create)) + :safe #'symbolp) + +(defcustom org-link-use-indirect-buffer-for-internals nil + "Non-nil means use indirect buffer to display infile links. +Activating internal links (from one location in a file to another location +in the same file) normally just jumps to the location. When the link is +activated with a `\\[universal-argument]' prefix (or with mouse-3), the link \ +is displayed in +another window. When this option is set, the other window actually displays +an indirect buffer clone of the current buffer, to avoid any visibility +changes to the current buffer." + :group 'org-link-follow + :type 'boolean + :safe #'booleanp) + +(defcustom org-link-shell-confirm-function 'yes-or-no-p + "Non-nil means ask for confirmation before executing shell links. + +Shell links can be dangerous: just think about a link + + [[shell:rm -rf ~/*][Google Search]] + +This link would show up in your Org document as \"Google Search\", +but really it would remove your entire home directory. +Therefore we advise against setting this variable to nil. +Just change it to `y-or-n-p' if you want to confirm with a +single keystroke rather than having to type \"yes\"." + :group 'org-link-follow + :type '(choice + (const :tag "with yes-or-no (safer)" yes-or-no-p) + (const :tag "with y-or-n (faster)" y-or-n-p) + (const :tag "no confirmation (dangerous)" nil)) + :safe nil) + +(defcustom org-link-shell-skip-confirm-regexp "" + "Regexp to skip confirmation for shell links." + :group 'org-link-follow + :version "24.1" + :type 'regexp + :safe nil) + +(defcustom org-link-elisp-confirm-function 'yes-or-no-p + "Non-nil means ask for confirmation before executing Emacs Lisp links. +Elisp links can be dangerous: just think about a link + + [[elisp:(shell-command \"rm -rf ~/*\")][Google Search]] + +This link would show up in your Org document as \"Google Search\", +but really it would remove your entire home directory. +Therefore we advise against setting this variable to nil. +Just change it to `y-or-n-p' if you want to confirm with a +single keystroke rather than having to type \"yes\"." + :group 'org-link-follow + :type '(choice + (const :tag "with yes-or-no (safer)" yes-or-no-p) + (const :tag "with y-or-n (faster)" y-or-n-p) + (const :tag "no confirmation (dangerous)" nil)) + :safe nil) + +(defcustom org-link-elisp-skip-confirm-regexp "" + "A regexp to skip confirmation for Elisp links." + :group 'org-link-follow + :version "24.1" + :type 'regexp + :safe nil) + +(defgroup org-link-store nil + "Options concerning storing links in Org mode." + :tag "Org Store Link" + :group 'org-link) + +(defcustom org-link-context-for-files t + "Non-nil means file links from `org-store-link' contain context. +\\ +A search string is added to the file name with \"::\" as separator +and used to find the context when the link is activated by the command +`org-open-at-point'. When this option is t, the entire active region +is be placed in the search string of the file link. If set to a +positive integer N, only the first N lines of context are stored. + +Using a prefix argument to the command `org-store-link' \ +\(`\\[universal-argument] \\[org-store-link]') +negates this setting for the duration of the command." + :group 'org-link-store + :type '(choice boolean integer) + :safe (lambda (val) (or (booleanp val) (integerp val)))) + +(defcustom org-link-email-description-format "Email %c: %s" + "Format of the description part of a link to an email or usenet message. +The following %-escapes will be replaced by corresponding information: + +%F full \"From\" field +%f name, taken from \"From\" field, address if no name +%T full \"To\" field +%t first name in \"To\" field, address if no name +%c correspondent. Usually \"from NAME\", but if you sent it yourself, it + will be \"to NAME\". See also the variable `org-from-is-user-regexp'. +%s subject +%d date +%m message-id. + +You may use normal field width specification between the % and the letter. +This is for example useful to limit the length of the subject. + +Examples: \"%f on: %.30s\", \"Email from %f\", \"Email %c\"" + :group 'org-link-store + :package-version '(Org . 9.3) + :type 'string + :safe #'stringp) + +(defcustom org-link-from-user-regexp + (let ((mail (and (org-string-nw-p user-mail-address) + (format "\\<%s\\>" (regexp-quote user-mail-address)))) + (name (and (org-string-nw-p user-full-name) + (format "\\<%s\\>" (regexp-quote user-full-name))))) + (if (and mail name) (concat mail "\\|" name) (or mail name))) + "Regexp matched against the \"From:\" header of an email or Usenet message. +It should match if the message is from the user him/herself." + :group 'org-link-store + :type 'regexp + :safe #'stringp) + +(defcustom org-link-keep-stored-after-insertion nil + "Non-nil means keep link in list for entire session. +\\ +The command `org-store-link' adds a link pointing to the current +location to an internal list. These links accumulate during a session. +The command `org-insert-link' can be used to insert links into any +Org file (offering completion for all stored links). + +When this option is nil, every link which has been inserted once using +`\\[org-insert-link]' will be removed from the list, to make completing the \ +unused +links more efficient." + :group 'org-link-store + :type 'boolean + :safe #'booleanp) + +;;; Public variables + +(defconst org-target-regexp (let ((border "[^<>\n\r \t]")) + (format "<<\\(%s\\|%s[^<>\n\r]*%s\\)>>" + border border border)) + "Regular expression matching a link target.") + +(defconst org-radio-target-regexp (format "<%s>" org-target-regexp) + "Regular expression matching a radio target.") + +(defvar-local org-target-link-regexp nil + "Regular expression matching radio targets in plain text.") + +(defvar org-link-types-re nil + "Matches a link that has a url-like prefix like \"http:\"") + +(defvar org-link-angle-re nil + "Matches link with angular brackets, spaces are allowed.") + +(defvar org-link-plain-re nil + "Matches plain link, without spaces.") + +(defvar org-link-bracket-re nil + "Matches a link in double brackets.") + +(defvar org-link-any-re nil + "Regular expression matching any link.") + +(defvar-local org-link-abbrev-alist-local nil + "Buffer-local version of `org-link-abbrev-alist', which see. +The value of this is taken from the LINK keywords.") + +(defvar org-stored-links nil + "Contains the links stored with `org-store-link'.") + +(defvar org-store-link-plist nil + "Plist with info about the most recently link created with `org-store-link'.") + +(defvar org-create-file-search-functions nil + "List of functions to construct the right search string for a file link. + +These functions are called in turn with point at the location to +which the link should point. + +A function in the hook should first test if it would like to +handle this file type, for example by checking the `major-mode' +or the file extension. If it decides not to handle this file, it +should just return nil to give other functions a chance. If it +does handle the file, it must return the search string to be used +when following the link. The search string will be part of the +file link, given after a double colon, and `org-open-at-point' +will automatically search for it. If special measures must be +taken to make the search successful, another function should be +added to the companion hook `org-execute-file-search-functions', +which see. + +A function in this hook may also use `setq' to set the variable +`description' to provide a suggestion for the descriptive text to +be used for this link when it gets inserted into an Org buffer +with \\[org-insert-link].") + +(defvar org-execute-file-search-functions nil + "List of functions to execute a file search triggered by a link. + +Functions added to this hook must accept a single argument, the +search string that was part of the file link, the part after the +double colon. The function must first check if it would like to +handle this search, for example by checking the `major-mode' or +the file extension. If it decides not to handle this search, it +should just return nil to give other functions a chance. If it +does handle the search, it must return a non-nil value to keep +other functions from trying. + +Each function can access the current prefix argument through the +variable `current-prefix-arg'. Note that a single prefix is used +to force opening a link in Emacs, so it may be good to only use a +numeric or double prefix to guide the search function. + +In case this is needed, a function in this hook can also restore +the window configuration before `org-open-at-point' was called using: + + (set-window-configuration org-window-config-before-follow-link)") + +(defvar org-open-link-functions nil + "Hook for functions finding a plain text link. +These functions must take a single argument, the link content. +They will be called for links that look like [[link text][description]] +when LINK TEXT does not have a protocol like \"http:\" and does not look +like a filename (e.g. \"./blue.png\"). + +These functions will be called *before* Org attempts to resolve the +link by doing text searches in the current buffer - so if you want a +link \"[[target]]\" to still find \"<>\", your function should +handle this as a special case. + +When the function does handle the link, it must return a non-nil value. +If it decides that it is not responsible for this link, it must return +nil to indicate that that Org can continue with other options like +exact and fuzzy text search.") + + +;;; Internal Variables + +(defconst org-link--forbidden-chars "]\t\n\r<>" + "Characters forbidden within a link, as a string.") + +(defvar org-link--history nil + "History for inserted links.") + +(defvar org-link--insert-history nil + "Minibuffer history for links inserted with `org-insert-link'.") + +(defvar org-link--search-failed nil + "Non-nil when last link search failed.") + + +;;; Internal Functions + +(defun org-link--try-special-completion (type) + "If there is completion support for link type TYPE, offer it." + (let ((fun (org-link-get-parameter type :complete))) + (if (functionp fun) + (funcall fun) + (read-string "Link (no completion support): " (concat type ":"))))) + +(defun org-link--prettify (link) + "Return a human-readable representation of LINK. +The car of LINK must be a raw link. The cdr of LINK must be +either a link description or nil." + (let ((desc (or (cadr link) ""))) + (concat (format "%-45s" (substring desc 0 (min (length desc) 40))) + "<" (car link) ">"))) + +(defun org-link--decode-compound (hex) + "Unhexify Unicode hex-chars HEX. +E.g. \"%C3%B6\" is the German o-Umlaut. Note: this function also +decodes single byte encodings like \"%E1\" (a-acute) if not +followed by another \"%[A-F0-9]{2}\" group." + (save-match-data + (let* ((bytes (cdr (split-string hex "%"))) + (ret "") + (eat 0) + (sum 0)) + (while bytes + (let* ((val (string-to-number (pop bytes) 16)) + (shift-xor + (if (= 0 eat) + (cond + ((>= val 252) (cons 6 252)) + ((>= val 248) (cons 5 248)) + ((>= val 240) (cons 4 240)) + ((>= val 224) (cons 3 224)) + ((>= val 192) (cons 2 192)) + (t (cons 0 0))) + (cons 6 128)))) + (when (>= val 192) (setq eat (car shift-xor))) + (setq val (logxor val (cdr shift-xor))) + (setq sum (+ (lsh sum (car shift-xor)) val)) + (when (> eat 0) (setq eat (- eat 1))) + (cond + ((= 0 eat) ;multi byte + (setq ret (concat ret (char-to-string sum))) + (setq sum 0)) + ((not bytes) ; single byte(s) + (setq ret (org-link--decode-single-byte-sequence hex)))))) + ret))) + +(defun org-link--decode-single-byte-sequence (hex) + "Unhexify hex-encoded single byte character sequence HEX." + (mapconcat (lambda (byte) + (char-to-string (string-to-number byte 16))) + (cdr (split-string hex "%")) + "")) + +(defun org-link--fontify-links-to-this-file () + "Fontify links to the current file in `org-stored-links'." + (let ((f (buffer-file-name)) a b) + (setq a (mapcar (lambda(l) + (let ((ll (car l))) + (when (and (string-match "^file:\\(.+\\)::" ll) + (equal f (expand-file-name (match-string 1 ll)))) + ll))) + org-stored-links)) + (when (featurep 'org-id) + (setq b (mapcar (lambda(l) + (let ((ll (car l))) + (when (and (string-match "^id:\\(.+\\)$" ll) + (equal f (expand-file-name + (or (org-id-find-id-file + (match-string 1 ll)) "")))) + ll))) + org-stored-links))) + (mapcar (lambda(l) + (put-text-property 0 (length l) 'face 'font-lock-comment-face l)) + (delq nil (append a b))))) + +(defun org-link--buffer-for-internals () + "Return buffer used for displaying the target of internal links." + (cond + ((not org-link-use-indirect-buffer-for-internals) (current-buffer)) + ((string-suffix-p "(Clone)" (buffer-name)) + (message "Buffer is already a clone, not making another one") + ;; We also do not modify visibility in this case. + (current-buffer)) + (t ;make a new indirect buffer for displaying the link + (let* ((indirect-buffer-name (concat (buffer-name) "(Clone)")) + (indirect-buffer + (or (get-buffer indirect-buffer-name) + (make-indirect-buffer (current-buffer) + indirect-buffer-name + 'clone)))) + (with-current-buffer indirect-buffer (org-overview)) + indirect-buffer)))) + +(defun org-link--search-radio-target (target) + "Search a radio target matching TARGET in current buffer. +White spaces are not significant." + (let ((re (format "<<<%s>>>" + (mapconcat #'regexp-quote + (split-string target) + "[ \t]+\\(?:\n[ \t]*\\)?"))) + (origin (point))) + (goto-char (point-min)) + (catch :radio-match + (while (re-search-forward re nil t) + (forward-char -1) + (let ((object (org-element-context))) + (when (eq (org-element-type object) 'radio-target) + (goto-char (org-element-property :begin object)) + (org-show-context 'link-search) + (throw :radio-match nil)))) + (goto-char origin) + (user-error "No match for radio target: %s" target)))) + + +;;; Public API + +(defun org-link-types () + "Return a list of known link types." + (mapcar #'car org-link-parameters)) + +(defun org-link-get-parameter (type key) + "Get TYPE link property for KEY. +TYPE is a string and KEY is a plist keyword. See +`org-link-parameters' for supported keywords." + (plist-get (cdr (assoc type org-link-parameters)) + key)) + +(defun org-link-set-parameters (type &rest parameters) + "Set link TYPE properties to PARAMETERS. +PARAMETERS should be keyword value pairs. See +`org-link-parameters' for supported keys." + (let ((data (assoc type org-link-parameters))) + (if data (setcdr data (org-combine-plists (cdr data) parameters)) + (push (cons type parameters) org-link-parameters) + (org-link-make-regexps) + (when (featurep 'org-element) (org-element-update-syntax))))) + +(defun org-link-make-regexps () + "Update the link regular expressions. +This should be called after the variable `org-link-parameters' has changed." + (let ((types-re (regexp-opt (org-link-types) t))) + (setq org-link-types-re + (concat "\\`" types-re ":") + org-link-angle-re + (format "<%s:\\([^>\n]*\\(?:\n[ \t]*[^> \t\n][^>\n]*\\)*\\)>" + types-re) + org-link-plain-re + (concat + "\\<" types-re ":" + "\\([^][ \t\n()<>]+\\(?:([[:word:]0-9_]+)\\|\\([^[:punct:] \t\n]\\|/\\)\\)\\)") + ;; "\\([^]\t\n\r<>() ]+[^]\t\n\r<>,.;() ]\\)") + org-link-bracket-re + (rx (seq "[[" + ;; URI part: match group 1. + (group + (one-or-more + (or (not (any "[]\\")) + (and "\\" (zero-or-more "\\\\") (any "[]")) + (and (one-or-more "\\") (not (any "[]")))))) + "]" + ;; Description (optional): match group 2. + (opt "[" (group (+? anything)) "]") + "]")) + org-link-any-re + (concat "\\(" org-link-bracket-re "\\)\\|\\(" + org-link-angle-re "\\)\\|\\(" + org-link-plain-re "\\)")))) + +(defun org-link-complete-file (&optional arg) + "Create a file link using completion." + (let ((file (read-file-name "File: ")) + (pwd (file-name-as-directory (expand-file-name "."))) + (pwd1 (file-name-as-directory (abbreviate-file-name + (expand-file-name "."))))) + (cond ((equal arg '(16)) + (concat "file:" + (abbreviate-file-name (expand-file-name file)))) + ((string-match + (concat "^" (regexp-quote pwd1) "\\(.+\\)") file) + (concat "file:" (match-string 1 file))) + ((string-match + (concat "^" (regexp-quote pwd) "\\(.+\\)") + (expand-file-name file)) + (concat "file:" + (match-string 1 (expand-file-name file)))) + (t (concat "file:" file))))) + +(defun org-link-email-description (&optional fmt) + "Return the description part of an email link. +This takes information from `org-store-link-plist' and formats it +according to FMT (default from `org-link-email-description-format')." + (setq fmt (or fmt org-link-email-description-format)) + (let* ((p org-store-link-plist) + (to (plist-get p :toaddress)) + (from (plist-get p :fromaddress)) + (table + (list + (cons "%c" (plist-get p :fromto)) + (cons "%F" (plist-get p :from)) + (cons "%f" (or (plist-get p :fromname) (plist-get p :fromaddress) "?")) + (cons "%T" (plist-get p :to)) + (cons "%t" (or (plist-get p :toname) (plist-get p :toaddress) "?")) + (cons "%s" (plist-get p :subject)) + (cons "%d" (plist-get p :date)) + (cons "%m" (plist-get p :message-id))))) + (when (string-match "%c" fmt) + ;; Check if the user wrote this message + (if (and org-link-from-user-regexp from to + (save-match-data (string-match org-link-from-user-regexp from))) + (setq fmt (replace-match "to %t" t t fmt)) + (setq fmt (replace-match "from %f" t t fmt)))) + (org-replace-escapes fmt table))) + +(defun org-link-store-props (&rest plist) + "Store link properties. +The properties are pre-processed by extracting names, addresses +and dates." + (let ((x (plist-get plist :from))) + (when x + (let ((adr (mail-extract-address-components x))) + (setq plist (plist-put plist :fromname (car adr))) + (setq plist (plist-put plist :fromaddress (nth 1 adr)))))) + (let ((x (plist-get plist :to))) + (when x + (let ((adr (mail-extract-address-components x))) + (setq plist (plist-put plist :toname (car adr))) + (setq plist (plist-put plist :toaddress (nth 1 adr)))))) + (let ((x (ignore-errors (date-to-time (plist-get plist :date))))) + (when x + (setq plist (plist-put plist :date-timestamp + (format-time-string + (org-time-stamp-format t) x))) + (setq plist (plist-put plist :date-timestamp-inactive + (format-time-string + (org-time-stamp-format t t) x))))) + (let ((from (plist-get plist :from)) + (to (plist-get plist :to))) + (when (and from to org-link-from-user-regexp) + (setq plist + (plist-put plist :fromto + (if (string-match org-link-from-user-regexp from) + (concat "to %t") + (concat "from %f")))))) + (setq org-store-link-plist plist)) + +(defun org-link-add-props (&rest plist) + "Add these properties to the link property list." + (let (key value) + (while plist + (setq key (pop plist) value (pop plist)) + (setq org-store-link-plist + (plist-put org-store-link-plist key value))))) + +(defun org-link-encode (text table) + "Return percent escaped representation of string TEXT. +TEXT is a string with the text to escape. TABLE is a list of +characters that should be escaped." + (mapconcat + (lambda (c) + (if (memq c table) + (mapconcat (lambda (e) (format "%%%.2X" e)) + (or (encode-coding-char c 'utf-8) + (error "Unable to percent escape character: %c" c)) + "") + (char-to-string c))) + text "")) + +(defun org-link-decode (s) + "Decode percent-encoded parts in string S. +E.g. \"%C3%B6\" becomes the german o-Umlaut." + (replace-regexp-in-string "\\(%[0-9A-Za-z]\\{2\\}\\)+" + #'org-link--decode-compound s t t)) + +(defun org-link-escape (link) + "Backslash-escape sensitive characters in string LINK." + (replace-regexp-in-string + (rx (seq (group (zero-or-more "\\")) (group (or string-end (any "[]"))))) + (lambda (m) + (concat (match-string 1 m) + (match-string 1 m) + (and (/= (match-beginning 2) (match-end 2)) "\\"))) + link nil t 1)) + +(defun org-link-unescape (link) + "Remove escaping backslash characters from string LINK." + (replace-regexp-in-string + (rx (group (one-or-more "\\")) (or string-end (any "[]"))) + (lambda (_) + (concat (make-string (/ (- (match-end 1) (match-beginning 1)) 2) ?\\))) + link nil t 1)) + +(defun org-link-make-string (link &optional description) + "Make a bracket link, consisting of LINK and DESCRIPTION. +LINK is escaped with backslashes for inclusion in buffer." + (unless (org-string-nw-p link) (error "Empty link")) + (let* ((uri (org-link-escape link)) + (zero-width-space (string ?\x200B)) + (description + (and (org-string-nw-p description) + ;; Description cannot contain two consecutive square + ;; brackets, or end with a square bracket. To prevent + ;; this, insert a zero width space character between + ;; the brackets, or at the end of the description. + (replace-regexp-in-string + "\\(]\\)\\(]\\)" + (concat "\\1" zero-width-space "\\2") + (replace-regexp-in-string "]\\'" + (concat "\\&" zero-width-space) + (org-trim description)))))) + (format "[[%s]%s]" + uri + (if description (format "[%s]" description) "")))) + +(defun org-store-link-functions () + "List of functions that are called to create and store a link. + +The functions are defined in the `:store' property of +`org-link-parameters'. + +Each function will be called in turn until one returns a non-nil +value. Each function should check if it is responsible for +creating this link (for example by looking at the major mode). +If not, it must exit and return nil. If yes, it should return +a non-nil value after calling `org-link-store-props' with a list +of properties and values. Special properties are: + +:type The link prefix, like \"http\". This must be given. +:link The link, like \"http://www.astro.uva.nl/~dominik\". + This is obligatory as well. +:description Optional default description for the second pair + of brackets in an Org mode link. The user can still change + this when inserting this link into an Org mode buffer. + +In addition to these, any additional properties can be specified +and then used in capture templates." + (cl-loop for link in org-link-parameters + with store-func + do (setq store-func (org-link-get-parameter (car link) :store)) + if store-func + collect store-func)) + +(defun org-link-expand-abbrev (link) + "Replace link abbreviations in LINK string. +Abbreviations are defined in `org-link-abbrev-alist'." + (if (not (string-match "^\\([^:]*\\)\\(::?\\(.*\\)\\)?$" link)) link + (let* ((key (match-string 1 link)) + (as (or (assoc key org-link-abbrev-alist-local) + (assoc key org-link-abbrev-alist))) + (tag (and (match-end 2) (match-string 3 link))) + rpl) + (if (not as) + link + (setq rpl (cdr as)) + (cond + ((symbolp rpl) (funcall rpl tag)) + ((string-match "%(\\([^)]+\\))" rpl) + (replace-match + (save-match-data + (funcall (intern-soft (match-string 1 rpl)) tag)) t t rpl)) + ((string-match "%s" rpl) (replace-match (or tag "") t t rpl)) + ((string-match "%h" rpl) + (replace-match (url-hexify-string (or tag "")) t t rpl)) + (t (concat rpl tag))))))) + +(defun org-link-open (link &optional arg) + "Open a link object LINK. +Optional argument is passed to `org-open-file' when S is +a \"file\" link." + (let ((type (org-element-property :type link)) + (path (org-element-property :path link))) + (cond + ((equal type "file") + (if (string-match "[*?{]" (file-name-nondirectory path)) + (dired path) + ;; Look into `org-link-parameters' in order to find + ;; a DEDICATED-FUNCTION to open file. The function will be + ;; applied on raw link instead of parsed link due to the + ;; limitation in `org-add-link-type' ("open" function called + ;; with a single argument). If no such function is found, + ;; fallback to `org-open-file'. + (let* ((option (org-element-property :search-option link)) + (app (org-element-property :application link)) + (dedicated-function + (org-link-get-parameter (if app (concat type "+" app) type) + :follow))) + (if dedicated-function + (funcall dedicated-function + (concat path + (and option (concat "::" option)))) + (apply #'org-open-file + path + (cond (arg) + ((equal app "emacs") 'emacs) + ((equal app "sys") 'system)) + (cond ((not option) nil) + ((string-match-p "\\`[0-9]+\\'" option) + (list (string-to-number option))) + (t (list nil option)))))))) + ((functionp (org-link-get-parameter type :follow)) + (funcall (org-link-get-parameter type :follow) path)) + ((member type '("coderef" "custom-id" "fuzzy" "radio")) + (unless (run-hook-with-args-until-success 'org-open-link-functions path) + (if (not arg) (org-mark-ring-push) + (switch-to-buffer-other-window (org-link--buffer-for-internals))) + (let ((destination + (org-with-wide-buffer + (if (equal type "radio") + (org-link--search-radio-target + (org-element-property :path link)) + (org-link-search + (pcase type + ("custom-id" (concat "#" path)) + ("coderef" (format "(%s)" path)) + (_ path)) + ;; Prevent fuzzy links from matching themselves. + (and (equal type "fuzzy") + (+ 2 (org-element-property :begin link))))) + (point)))) + (unless (and (<= (point-min) destination) + (>= (point-max) destination)) + (widen)) + (goto-char destination)))) + (t (browse-url-at-point))))) + +(defun org-link-open-from-string (s &optional arg) + "Open a link in the string S, as if it was in Org mode. +Optional argument is passed to `org-open-file' when S is +a \"file\" link." + (interactive "sLink: \nP") + (pcase (with-temp-buffer + (let ((org-inhibit-startup nil)) + (insert s) + (org-mode) + (goto-char (point-min)) + (org-element-link-parser))) + (`nil (user-error "No valid link in %S" s)) + (link (org-link-open link arg)))) + +(defun org-link-search (s &optional avoid-pos stealth) + "Search for a search string S. + +If S starts with \"#\", it triggers a custom ID search. + +If S is enclosed within parenthesis, it initiates a coderef +search. + +If S is surrounded by forward slashes, it is interpreted as +a regular expression. In Org mode files, this will create an +`org-occur' sparse tree. In ordinary files, `occur' will be used +to list matches. If the current buffer is in `dired-mode', grep +will be used to search in all files. + +When AVOID-POS is given, ignore matches near that position. + +When optional argument STEALTH is non-nil, do not modify +visibility around point, thus ignoring `org-show-context-detail' +variable. + +Search is case-insensitive and ignores white spaces. Return type +of matched result, which is either `dedicated' or `fuzzy'." + (unless (org-string-nw-p s) (error "Invalid search string \"%s\"" s)) + (let* ((case-fold-search t) + (origin (point)) + (normalized (replace-regexp-in-string "\n[ \t]*" " " s)) + (starred (eq (string-to-char normalized) ?*)) + (words (split-string (if starred (substring s 1) s))) + (s-multi-re (mapconcat #'regexp-quote words "\\(?:[ \t\n]+\\)")) + (s-single-re (mapconcat #'regexp-quote words "[ \t]+")) + type) + (cond + ;; Check if there are any special search functions. + ((run-hook-with-args-until-success 'org-execute-file-search-functions s)) + ((eq (string-to-char s) ?#) + ;; Look for a custom ID S if S starts with "#". + (let* ((id (substring normalized 1)) + (match (org-find-property "CUSTOM_ID" id))) + (if match (progn (goto-char match) (setf type 'dedicated)) + (error "No match for custom ID: %s" id)))) + ((string-match "\\`(\\(.*\\))\\'" normalized) + ;; Look for coderef targets if S is enclosed within parenthesis. + (let ((coderef (match-string-no-properties 1 normalized)) + (re (substring s-single-re 1 -1))) + (goto-char (point-min)) + (catch :coderef-match + (while (re-search-forward re nil t) + (let ((element (org-element-at-point))) + (when (and (memq (org-element-type element) + '(example-block src-block)) + (org-match-line + (concat ".*?" (org-src-coderef-regexp + (org-src-coderef-format element) + coderef)))) + (setq type 'dedicated) + (goto-char (match-beginning 2)) + (throw :coderef-match nil)))) + (goto-char origin) + (error "No match for coderef: %s" coderef)))) + ((string-match "\\`/\\(.*\\)/\\'" normalized) + ;; Look for a regular expression. + (funcall (if (derived-mode-p 'org-mode) #'org-occur #'org-do-occur) + (match-string 1 s))) + ;; From here, we handle fuzzy links. + ;; + ;; Look for targets, only if not in a headline search. + ((and (not starred) + (let ((target (format "<<%s>>" s-multi-re))) + (catch :target-match + (goto-char (point-min)) + (while (re-search-forward target nil t) + (backward-char) + (let ((context (org-element-context))) + (when (eq (org-element-type context) 'target) + (setq type 'dedicated) + (goto-char (org-element-property :begin context)) + (throw :target-match t)))) + nil)))) + ;; Look for elements named after S, only if not in a headline + ;; search. + ((and (not starred) + (let ((name (format "^[ \t]*#\\+NAME: +%s[ \t]*$" s-single-re))) + (catch :name-match + (goto-char (point-min)) + (while (re-search-forward name nil t) + (let ((element (org-element-at-point))) + (when (equal words + (split-string + (org-element-property :name element))) + (setq type 'dedicated) + (beginning-of-line) + (throw :name-match t)))) + nil)))) + ;; Regular text search. Prefer headlines in Org mode buffers. + ;; Ignore COMMENT keyword, TODO keywords, priority cookies, + ;; statistics cookies and tags. + ((and (derived-mode-p 'org-mode) + (let ((title-re + (format "%s.*\\(?:%s[ \t]\\)?.*%s" + org-outline-regexp-bol + org-comment-string + (mapconcat #'regexp-quote words ".+"))) + (cookie-re "\\[[0-9]*\\(?:%\\|/[0-9]*\\)\\]") + (comment-re (format "\\`%s[ \t]+" org-comment-string))) + (goto-char (point-min)) + (catch :found + (while (re-search-forward title-re nil t) + (when (equal words + (split-string + (replace-regexp-in-string + cookie-re "" + (replace-regexp-in-string + comment-re "" (org-get-heading t t t))))) + (throw :found t))) + nil))) + (beginning-of-line) + (setq type 'dedicated)) + ;; Offer to create non-existent headline depending on + ;; `org-link-search-must-match-exact-headline'. + ((and (derived-mode-p 'org-mode) + (eq org-link-search-must-match-exact-headline 'query-to-create) + (yes-or-no-p "No match - create this as a new heading? ")) + (goto-char (point-max)) + (unless (bolp) (newline)) + (org-insert-heading nil t t) + (insert s "\n") + (beginning-of-line 0)) + ;; Only headlines are looked after. No need to process + ;; further: throw an error. + ((and (derived-mode-p 'org-mode) + (or starred org-link-search-must-match-exact-headline)) + (goto-char origin) + (error "No match for fuzzy expression: %s" normalized)) + ;; Regular text search. + ((catch :fuzzy-match + (goto-char (point-min)) + (while (re-search-forward s-multi-re nil t) + ;; Skip match if it contains AVOID-POS or it is included in + ;; a link with a description but outside the description. + (unless (or (and avoid-pos + (<= (match-beginning 0) avoid-pos) + (> (match-end 0) avoid-pos)) + (and (save-match-data + (org-in-regexp org-link-bracket-re)) + (match-beginning 3) + (or (> (match-beginning 3) (point)) + (<= (match-end 3) (point))) + (org-element-lineage + (save-match-data (org-element-context)) + '(link) t))) + (goto-char (match-beginning 0)) + (setq type 'fuzzy) + (throw :fuzzy-match t))) + nil)) + ;; All failed. Throw an error. + (t (goto-char origin) + (error "No match for fuzzy expression: %s" normalized))) + ;; Disclose surroundings of match, if appropriate. + (when (and (derived-mode-p 'org-mode) (not stealth)) + (org-show-context 'link-search)) + type)) + +(defun org-link-heading-search-string (&optional string) + "Make search string for the current headline or STRING." + (let ((s (or string + (and (derived-mode-p 'org-mode) + (save-excursion + (org-back-to-heading t) + (org-element-property :raw-value + (org-element-at-point)))))) + (lines org-link-context-for-files)) + (unless string (setq s (concat "*" s))) ;Add * for headlines + (setq s (replace-regexp-in-string "\\[[0-9]+%\\]\\|\\[[0-9]+/[0-9]+\\]" "" s)) + (when (and string (integerp lines) (> lines 0)) + (let ((slines (org-split-string s "\n"))) + (when (< lines (length slines)) + (setq s (mapconcat + #'identity + (reverse (nthcdr (- (length slines) lines) + (reverse slines))) "\n"))))) + (mapconcat #'identity (split-string s) " "))) + +(defun org-link-display-format (s) + "Replace links in string S with their description. +If there is no description, use the link target." + (save-match-data + (replace-regexp-in-string + org-link-bracket-re + (lambda (m) (or (match-string 2 m) (match-string 1 m))) + s nil t))) + +(defun org-link-add-angle-brackets (s) + "Wrap string S within angle brackets." + (unless (equal (substring s 0 1) "<") (setq s (concat "<" s))) + (unless (equal (substring s -1) ">") (setq s (concat s ">"))) + s) + + +;;; Built-in link types + +;;;; "doi" link type +(defun org-link--open-doi (path) + "Open a \"doi\" type link. +PATH is a the path to search for, as a string." + (browse-url (url-encode-url (concat org-link-doi-server-url path)))) + +(org-link-set-parameters "doi" :follow #'org-link--open-doi) + +;;;; "elisp" link type +(defun org-link--open-elisp (path) + "Open a \"elisp\" type link. +PATH is the sexp to evaluate, as a string." + (if (or (and (org-string-nw-p org-link-elisp-skip-confirm-regexp) + (string-match-p org-link-elisp-skip-confirm-regexp path)) + (not org-link-elisp-confirm-function) + (funcall org-link-elisp-confirm-function + (format "Execute %S as Elisp? " + (org-add-props path nil 'face 'org-warning)))) + (message "%s => %s" path + (if (eq ?\( (string-to-char path)) + (eval (read path)) + (call-interactively (read path)))) + (user-error "Abort"))) + +(org-link-set-parameters "elisp" :follow #'org-link--open-elisp) + +;;;; "file" link type +(org-link-set-parameters "file" :complete #'org-link-complete-file) + +;;;; "help" link type +(defun org-link--open-help (path) + "Open a \"help\" type link. +PATH is a symbol name, as a string." + (pcase (intern path) + ((and (pred fboundp) variable) (describe-function variable)) + ((and (pred boundp) function) (describe-variable function)) + (name (user-error "Unknown function or variable: %s" name)))) + +(org-link-set-parameters "help" :follow #'org-link--open-help) + +;;;; "http", "https", "mailto", "ftp", and "news" link types +(dolist (scheme '("ftp" "http" "https" "mailto" "news")) + (org-link-set-parameters scheme + :follow + (lambda (url) (browse-url (concat scheme ":" url))))) + +;;;; "shell" link type +(defun org-link--open-shell (path) + "Open a \"shell\" type link. +PATH is the command to execute, as a string." + (if (or (and (org-string-nw-p org-link-shell-skip-confirm-regexp) + (string-match-p org-link-shell-skip-confirm-regexp path)) + (not org-link-shell-confirm-function) + (funcall org-link-shell-confirm-function + (format "Execute %S in shell? " + (org-add-props path nil 'face 'org-warning)))) + (let ((buf (generate-new-buffer "*Org Shell Output*"))) + (message "Executing %s" path) + (shell-command path buf) + (when (featurep 'midnight) + (setq clean-buffer-list-kill-buffer-names + (cons (buffer-name buf) + clean-buffer-list-kill-buffer-names)))) + (user-error "Abort"))) + +(org-link-set-parameters "shell" :follow #'org-link--open-shell) + + +;;; Interactive Functions + +;;;###autoload +(defun org-next-link (&optional search-backward) + "Move forward to the next link. +If the link is in hidden text, expose it. When SEARCH-BACKWARD +is non-nil, move backward." + (interactive) + (let ((pos (point)) + (search-fun (if search-backward #'re-search-backward + #'re-search-forward))) + ;; Tweak initial position. If last search failed, wrap around. + ;; Otherwise, make sure we do not match current link. + (cond + ((not (and org-link--search-failed (eq this-command last-command))) + (cond + ((and (not search-backward) (looking-at org-link-any-re)) + (goto-char (match-end 0))) + (search-backward + (pcase (org-in-regexp org-link-any-re nil t) + (`(,beg . ,_) (goto-char beg)) + (_ nil))) + (t nil))) + (search-backward + (goto-char (point-max)) + (message "Link search wrapped back to end of buffer")) + (t + (goto-char (point-min)) + (message "Link search wrapped back to beginning of buffer"))) + (setq org-link--search-failed nil) + (catch :found + (while (funcall search-fun org-link-any-re nil t) + (let ((context (save-excursion + (unless search-backward (forward-char -1)) + (org-element-context)))) + (pcase (org-element-lineage context '(link) t) + (`nil nil) + (link + (goto-char (org-element-property :begin link)) + (when (org-invisible-p) (org-show-context)) + (throw :found t))))) + (goto-char pos) + (setq org-link--search-failed t) + (message "No further link found")))) + +;;;###autoload +(defun org-previous-link () + "Move backward to the previous link. +If the link is in hidden text, expose it." + (interactive) + (org-next-link t)) + +;;;###autoload +(defun org-toggle-link-display () + "Toggle the literal or descriptive display of links." + (interactive) + (if org-link-descriptive (remove-from-invisibility-spec '(org-link)) + (add-to-invisibility-spec '(org-link))) + (org-restart-font-lock) + (setq org-link-descriptive (not org-link-descriptive))) + +;;;###autoload +(defun org-store-link (arg &optional interactive?) + "Store a link to the current location. +\\ +This link is added to `org-stored-links' and can later be inserted +into an Org buffer with `org-insert-link' (`\\[org-insert-link]'). + +For some link types, a `\\[universal-argument]' prefix ARG is interpreted. \ +A single +`\\[universal-argument]' negates `org-context-in-file-links' for file links or +`org-gnus-prefer-web-links' for links to Usenet articles. + +A `\\[universal-argument] \\[universal-argument]' prefix ARG forces \ +skipping storing functions that are not +part of Org core. + +A `\\[universal-argument] \\[universal-argument] \\[universal-argument]' \ +prefix ARG forces storing a link for each line in the +active region. + +Assume the function is called interactively if INTERACTIVE? is +non-nil." + (interactive "P\np") + (org-load-modules-maybe) + (if (and (equal arg '(64)) (org-region-active-p)) + (save-excursion + (let ((end (region-end))) + (goto-char (region-beginning)) + (set-mark (point)) + (while (< (point-at-eol) end) + (move-end-of-line 1) (activate-mark) + (let (current-prefix-arg) + (call-interactively 'org-store-link)) + (move-beginning-of-line 2) + (set-mark (point))))) + (setq org-store-link-plist nil) + (let (link cpltxt desc description search txt custom-id agenda-link) + (cond + ;; Store a link using an external link type, if any function is + ;; available. If more than one can generate a link from current + ;; location, ask which one to use. + ((and (not (equal arg '(16))) + (let ((results-alist nil)) + (dolist (f (org-store-link-functions)) + (when (funcall f) + ;; XXX: return value is not link's plist, so we + ;; store the new value before it is modified. It + ;; would be cleaner to ask store link functions to + ;; return the plist instead. + (push (cons f (copy-sequence org-store-link-plist)) + results-alist))) + (pcase results-alist + (`nil nil) + (`((,_ . ,_)) t) ;single choice: nothing to do + (`((,name . ,_) . ,_) + ;; Reinstate link plist associated to the chosen + ;; function. + (apply #'org-link-store-props + (cdr (assoc-string + (completing-read + "Which function for creating the link? " + (mapcar #'car results-alist) + nil t (symbol-name name)) + results-alist))) + t)))) + (setq link (plist-get org-store-link-plist :link)) + (setq desc (or (plist-get org-store-link-plist :description) + link))) + + ;; Store a link from a remote editing buffer. + ((org-src-edit-buffer-p) + (let ((coderef-format (org-src-coderef-format)) + (format-link + (lambda (label) + (if org-src-source-file-name + (format "file:%s::(%s)" org-src-source-file-name label) + (format "(%s)" label))))) + (cond + ;; Code references do not exist in this type of buffer. + ;; Pretend we're linking from the source buffer directly. + ((not (memq (org-src-source-type) '(example-block src-block))) + (with-current-buffer (org-src-source-buffer) + (org-store-link arg interactive?)) + (setq link nil)) + ;; A code reference exists. Use it. + ((save-excursion + (beginning-of-line) + (re-search-forward (org-src-coderef-regexp coderef-format) + (line-end-position) + t)) + (setq link (funcall format-link (match-string-no-properties 3)))) + ;; No code reference. Create a new one then store the link + ;; to it, but only in the function is called interactively. + (interactive? + (end-of-line) + (let* ((label (read-string "Code line label: ")) + (reference (format coderef-format label)) + (gc (- 79 (length reference)))) + (if (< (current-column) gc) + (org-move-to-column gc t) + (insert " ")) + (insert reference) + (setq link (funcall format-link label)))) + ;; No code reference, and non-interactive call. Don't know + ;; what to do. Give up. + (t (setq link nil))))) + + ;; We are in the agenda, link to referenced location + ((equal (bound-and-true-p org-agenda-buffer-name) (buffer-name)) + (let ((m (or (get-text-property (point) 'org-hd-marker) + (get-text-property (point) 'org-marker)))) + (when m + (org-with-point-at m + (setq agenda-link (org-store-link nil interactive?)))))) + + ((eq major-mode 'calendar-mode) + (let ((cd (calendar-cursor-to-date))) + (setq link + (format-time-string + (car org-time-stamp-formats) + (apply 'encode-time + (list 0 0 0 (nth 1 cd) (nth 0 cd) (nth 2 cd) + nil nil nil)))) + (org-link-store-props :type "calendar" :date cd))) + + ((eq major-mode 'help-mode) + (setq link (concat "help:" (save-excursion + (goto-char (point-min)) + (looking-at "^[^ ]+") + (match-string 0)))) + (org-link-store-props :type "help")) + + ((eq major-mode 'w3-mode) + (setq cpltxt (if (and (buffer-name) + (not (string-match "Untitled" (buffer-name)))) + (buffer-name) + (url-view-url t)) + link (url-view-url t)) + (org-link-store-props :type "w3" :url (url-view-url t))) + + ((eq major-mode 'image-mode) + (setq cpltxt (concat "file:" + (abbreviate-file-name buffer-file-name)) + link cpltxt) + (org-link-store-props :type "image" :file buffer-file-name)) + + ;; In dired, store a link to the file of the current line + ((derived-mode-p 'dired-mode) + (let ((file (dired-get-filename nil t))) + (setq file (if file + (abbreviate-file-name + (expand-file-name (dired-get-filename nil t))) + ;; otherwise, no file so use current directory. + default-directory)) + (setq cpltxt (concat "file:" file) + link cpltxt))) + + ((setq search (run-hook-with-args-until-success + 'org-create-file-search-functions)) + (setq link (concat "file:" (abbreviate-file-name buffer-file-name) + "::" search)) + (setq cpltxt (or description link))) + + ((and (buffer-file-name (buffer-base-buffer)) (derived-mode-p 'org-mode)) + (org-with-limited-levels + (setq custom-id (org-entry-get nil "CUSTOM_ID")) + (cond + ;; Store a link using the target at point + ((org-in-regexp "[^<]<<\\([^<>]+\\)>>[^>]" 1) + (setq cpltxt + (concat "file:" + (abbreviate-file-name + (buffer-file-name (buffer-base-buffer))) + "::" (match-string 1)) + link cpltxt)) + ((and (featurep 'org-id) + (or (eq org-id-link-to-org-use-id t) + (and interactive? + (or (eq org-id-link-to-org-use-id 'create-if-interactive) + (and (eq org-id-link-to-org-use-id + 'create-if-interactive-and-no-custom-id) + (not custom-id)))) + (and org-id-link-to-org-use-id (org-entry-get nil "ID")))) + ;; Store a link using the ID at point + (setq link (condition-case nil + (prog1 (org-id-store-link) + (setq desc (or (plist-get org-store-link-plist + :description) + ""))) + (error + ;; Probably before first headline, link only to file + (concat "file:" + (abbreviate-file-name + (buffer-file-name (buffer-base-buffer)))))))) + (t + ;; Just link to current headline + (setq cpltxt (concat "file:" + (abbreviate-file-name + (buffer-file-name (buffer-base-buffer))))) + ;; Add a context search string + (when (org-xor org-link-context-for-files (equal arg '(4))) + (let* ((element (org-element-at-point)) + (name (org-element-property :name element))) + (setq txt (cond + ((org-at-heading-p) nil) + (name) + ((org-region-active-p) + (buffer-substring (region-beginning) (region-end))))) + (when (or (null txt) (string-match "\\S-" txt)) + (setq cpltxt + (concat cpltxt "::" + (condition-case nil + (org-link-heading-search-string txt) + (error ""))) + desc (or name + (nth 4 (ignore-errors (org-heading-components))) + "NONE"))))) + (when (string-match "::\\'" cpltxt) + (setq cpltxt (substring cpltxt 0 -2))) + (setq link cpltxt))))) + + ((buffer-file-name (buffer-base-buffer)) + ;; Just link to this file here. + (setq cpltxt (concat "file:" + (abbreviate-file-name + (buffer-file-name (buffer-base-buffer))))) + ;; Add a context string. + (when (org-xor org-link-context-for-files (equal arg '(4))) + (setq txt (if (org-region-active-p) + (buffer-substring (region-beginning) (region-end)) + (buffer-substring (point-at-bol) (point-at-eol)))) + ;; Only use search option if there is some text. + (when (string-match "\\S-" txt) + (setq cpltxt + (concat cpltxt "::" (org-link-heading-search-string txt)) + desc "NONE"))) + (setq link cpltxt)) + + (interactive? + (user-error "No method for storing a link from this buffer")) + + (t (setq link nil))) + + ;; We're done setting link and desc, clean up + (when (consp link) (setq cpltxt (car link) link (cdr link))) + (setq link (or link cpltxt) + desc (or desc cpltxt)) + (cond ((not desc)) + ((equal desc "NONE") (setq desc nil)) + (t (setq desc (org-link-display-format desc)))) + ;; Return the link + (if (not (and interactive? link)) + (or agenda-link (and link (org-link-make-string link desc))) + (push (list link desc) org-stored-links) + (message "Stored: %s" (or desc link)) + (when custom-id + (setq link (concat "file:" (abbreviate-file-name + (buffer-file-name)) "::#" custom-id)) + (push (list link desc) org-stored-links)) + (car org-stored-links))))) + +;;;###autoload +(defun org-insert-link (&optional complete-file link-location description) + "Insert a link. At the prompt, enter the link. + +Completion can be used to insert any of the link protocol prefixes in use. + +The history can be used to select a link previously stored with +`org-store-link'. When the empty string is entered (i.e. if you just +press `RET' at the prompt), the link defaults to the most recently +stored link. As `SPC' triggers completion in the minibuffer, you need to +use `M-SPC' or `C-q SPC' to force the insertion of a space character. + +You will also be prompted for a description, and if one is given, it will +be displayed in the buffer instead of the link. + +If there is already a link at point, this command will allow you to edit +link and description parts. + +With a `\\[universal-argument]' prefix, prompts for a file to link to. The \ +file name can be +selected using completion. The path to the file will be relative to the +current directory if the file is in the current directory or a subdirectory. +Otherwise, the link will be the absolute path as completed in the minibuffer +\(i.e. normally ~/path/to/file). You can configure this behavior using the +option `org-link-file-path-type'. + +With a `\\[universal-argument] \\[universal-argument]' prefix, enforce an \ +absolute path even if the file is in +the current directory or below. + +A `\\[universal-argument] \\[universal-argument] \\[universal-argument]' \ +prefix negates `org-link-keep-stored-after-insertion'. + +If the LINK-LOCATION parameter is non-nil, this value will be used as +the link location instead of reading one interactively. + +If the DESCRIPTION parameter is non-nil, this value will be used as the +default description. Otherwise, if `org-link-make-description-function' +is non-nil, this function will be called with the link target, and the +result will be the default link description. When called non-interactively, +don't allow to edit the default description." + (interactive "P") + (let* ((wcf (current-window-configuration)) + (origbuf (current-buffer)) + (region (when (org-region-active-p) + (buffer-substring (region-beginning) (region-end)))) + (remove (and region (list (region-beginning) (region-end)))) + (desc region) + (link link-location) + (abbrevs org-link-abbrev-alist-local) + entry all-prefixes auto-desc) + (cond + (link-location) ; specified by arg, just use it. + ((org-in-regexp org-link-bracket-re 1) + ;; We do have a link at point, and we are going to edit it. + (setq remove (list (match-beginning 0) (match-end 0))) + (setq desc (when (match-end 2) (match-string-no-properties 2))) + (setq link (read-string "Link: " + (org-link-unescape + (match-string-no-properties 1))))) + ((or (org-in-regexp org-link-angle-re) + (org-in-regexp org-link-plain-re)) + ;; Convert to bracket link + (setq remove (list (match-beginning 0) (match-end 0)) + link (read-string "Link: " + (org-unbracket-string "<" ">" (match-string 0))))) + ((member complete-file '((4) (16))) + ;; Completing read for file names. + (setq link (org-link-complete-file complete-file))) + (t + ;; Read link, with completion for stored links. + (org-link--fontify-links-to-this-file) + (org-switch-to-buffer-other-window "*Org Links*") + (with-current-buffer "*Org Links*" + (erase-buffer) + (insert "Insert a link. +Use TAB to complete link prefixes, then RET for type-specific completion support\n") + (when org-stored-links + (insert "\nStored links are available with / or M-p/n \ +\(most recent with RET):\n\n") + (insert (mapconcat #'org-link--prettify + (reverse org-stored-links) + "\n"))) + (goto-char (point-min))) + (let ((cw (selected-window))) + (select-window (get-buffer-window "*Org Links*" 'visible)) + (with-current-buffer "*Org Links*" (setq truncate-lines t)) + (unless (pos-visible-in-window-p (point-max)) + (org-fit-window-to-buffer)) + (and (window-live-p cw) (select-window cw))) + (setq all-prefixes (append (mapcar #'car abbrevs) + (mapcar #'car org-link-abbrev-alist) + (org-link-types))) + (unwind-protect + ;; Fake a link history, containing the stored links. + (let ((org-link--history + (append (mapcar #'car org-stored-links) + org-link--insert-history))) + (setq link + (org-completing-read + "Link: " + (append + (mapcar (lambda (x) (concat x ":")) all-prefixes) + (mapcar #'car org-stored-links)) + nil nil nil + 'org-link--history + (caar org-stored-links))) + (unless (org-string-nw-p link) (user-error "No link selected")) + (dolist (l org-stored-links) + (when (equal link (cadr l)) + (setq link (car l)) + (setq auto-desc t))) + (when (or (member link all-prefixes) + (and (equal ":" (substring link -1)) + (member (substring link 0 -1) all-prefixes) + (setq link (substring link 0 -1)))) + (setq link (with-current-buffer origbuf + (org-link--try-special-completion link))))) + (set-window-configuration wcf) + (kill-buffer "*Org Links*")) + (setq entry (assoc link org-stored-links)) + (or entry (push link org-link--insert-history)) + (setq desc (or desc (nth 1 entry))))) + + (when (funcall (if (equal complete-file '(64)) 'not 'identity) + (not org-link-keep-stored-after-insertion)) + (setq org-stored-links (delq (assoc link org-stored-links) + org-stored-links))) + + (when (and (string-match org-link-plain-re link) + (not (string-match org-ts-regexp link))) + ;; URL-like link, normalize the use of angular brackets. + (setq link (org-unbracket-string "<" ">" link))) + + ;; Check if we are linking to the current file with a search + ;; option If yes, simplify the link by using only the search + ;; option. + (when (and buffer-file-name + (let ((case-fold-search nil)) + (string-match "\\`file:\\(.+?\\)::" link))) + (let ((path (match-string-no-properties 1 link)) + (search (substring-no-properties link (match-end 0)))) + (save-match-data + (when (equal (file-truename buffer-file-name) (file-truename path)) + ;; We are linking to this same file, with a search option + (setq link search))))) + + ;; Check if we can/should use a relative path. If yes, simplify + ;; the link. + (let ((case-fold-search nil)) + (when (string-match "\\`\\(file\\|docview\\):" link) + (let* ((type (match-string-no-properties 0 link)) + (path-start (match-end 0)) + (search (and (string-match "::\\(.*\\)\\'" link) + (match-string 1 link))) + (path + (if search + (substring-no-properties + link path-start (match-beginning 0)) + (substring-no-properties link (match-end 0)))) + (origpath path)) + (cond + ((or (eq org-link-file-path-type 'absolute) + (equal complete-file '(16))) + (setq path (abbreviate-file-name (expand-file-name path)))) + ((eq org-link-file-path-type 'noabbrev) + (setq path (expand-file-name path))) + ((eq org-link-file-path-type 'relative) + (setq path (file-relative-name path))) + (t + (save-match-data + (if (string-match (concat "^" (regexp-quote + (expand-file-name + (file-name-as-directory + default-directory)))) + (expand-file-name path)) + ;; We are linking a file with relative path name. + (setq path (substring (expand-file-name path) + (match-end 0))) + (setq path (abbreviate-file-name (expand-file-name path))))))) + (setq link (concat type path (and search (concat "::" search)))) + (when (equal desc origpath) + (setq desc path))))) + + (unless auto-desc + (let ((initial-input + (cond + (description) + ((not org-link-make-description-function) desc) + (t (condition-case nil + (funcall org-link-make-description-function link desc) + (error + (message "Can't get link description from %S" + (symbol-name org-link-make-description-function)) + (sit-for 2) + nil)))))) + (setq desc (if (called-interactively-p 'any) + (read-string "Description: " initial-input) + initial-input)))) + + (unless (org-string-nw-p desc) (setq desc nil)) + (when remove (apply #'delete-region remove)) + (insert (org-link-make-string link desc)) + ;; Redisplay so as the new link has proper invisible characters. + (sit-for 0))) + +;;;###autoload +(defun org-insert-all-links (arg &optional pre post) + "Insert all links in `org-stored-links'. +When a universal prefix, do not delete the links from `org-stored-links'. +When `ARG' is a number, insert the last N link(s). +`PRE' and `POST' are optional arguments to define a string to +prepend or to append." + (interactive "P") + (let ((org-link-keep-stored-after-insertion (equal arg '(4))) + (links (copy-sequence org-stored-links)) + (pr (or pre "- ")) + (po (or post "\n")) + (cnt 1) l) + (if (null org-stored-links) + (message "No link to insert") + (while (and (or (listp arg) (>= arg cnt)) + (setq l (if (listp arg) + (pop links) + (pop org-stored-links)))) + (setq cnt (1+ cnt)) + (insert pr) + (org-insert-link nil (car l) (or (cadr l) "")) + (insert po))))) + +;;;###autoload +(defun org-insert-last-stored-link (arg) + "Insert the last link stored in `org-stored-links'." + (interactive "p") + (org-insert-all-links arg "" "\n")) + +;;;###autoload +(defun org-insert-link-global () + "Insert a link like Org mode does. +This command can be called in any mode to insert a link in Org syntax." + (interactive) + (org-load-modules-maybe) + (org-run-like-in-org-mode 'org-insert-link)) + +;;;###autoload +(defun org-update-radio-target-regexp () + "Find all radio targets in this file and update the regular expression. +Also refresh fontification if needed." + (interactive) + (let ((old-regexp org-target-link-regexp) + ;; Some languages, e.g., Chinese, do not use spaces to + ;; separate words. Also allow to surround radio targets with + ;; line-breakable characters. + (before-re "\\(?:^\\|[^[:alnum:]]\\|\\c|\\)\\(") + (after-re "\\)\\(?:$\\|[^[:alnum:]]\\|\\c|\\)") + (targets + (org-with-wide-buffer + (goto-char (point-min)) + (let (rtn) + (while (re-search-forward org-radio-target-regexp nil t) + ;; Make sure point is really within the object. + (backward-char) + (let ((obj (org-element-context))) + (when (eq (org-element-type obj) 'radio-target) + (cl-pushnew (org-element-property :value obj) rtn + :test #'equal)))) + rtn)))) + (setq org-target-link-regexp + (and targets + (concat before-re + (mapconcat + (lambda (x) + (replace-regexp-in-string + " +" "\\s-+" (regexp-quote x) t t)) + targets + "\\|") + after-re))) + (unless (equal old-regexp org-target-link-regexp) + ;; Clean-up cache. + (let ((regexp (cond ((not old-regexp) org-target-link-regexp) + ((not org-target-link-regexp) old-regexp) + (t + (concat before-re + (mapconcat + (lambda (re) + (substring re (length before-re) + (- (length after-re)))) + (list old-regexp org-target-link-regexp) + "\\|") + after-re))))) + (when (featurep 'org-element) + (org-with-point-at 1 + (while (re-search-forward regexp nil t) + (org-element-cache-refresh (match-beginning 1)))))) + ;; Re fontify buffer. + (when (memq 'radio org-highlight-links) + (org-restart-font-lock))))) + + +;;; Initialize Regexps + +(org-link-make-regexps) + + +(provide 'ol) + +;;; ol.el ends here diff --git a/elpa/org-20191028/org b/elpa/org-20200127/org similarity index 90% rename from elpa/org-20191028/org rename to elpa/org-20200127/org index 09061855..197a4953 100644 --- a/elpa/org-20191028/org +++ b/elpa/org-20200127/org @@ -1,8 +1,8 @@ This is org, produced by makeinfo version 6.5 from org.texi. -This manual is for Org version 9.2. +This manual is for Org version 9.3. - Copyright © 2004–2019 Free Software Foundation, Inc. + Copyright © 2004–2020 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, @@ -15,7 +15,7 @@ This manual is for Org version 9.2. (a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual.” -INFO-DIR-SECTION Emacs editing modes +INFO-DIR-SECTION Emacs START-INFO-DIR-ENTRY * Org Mode: (org). Outline-based notes management and organizer. END-INFO-DIR-ENTRY @@ -26,9 +26,9 @@ File: org, Node: Top, Next: Introduction, Up: (dir) The Org Manual ************** -This manual is for Org version 9.2. +This manual is for Org version 9.3. - Copyright © 2004–2019 Free Software Foundation, Inc. + Copyright © 2004–2020 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, @@ -51,7 +51,8 @@ This manual is for Org version 9.2. * Tags:: Tagging headlines and matching sets of tags. * Properties and Columns:: Storing information about an entry. * Dates and Times:: Making items useful for planning. -* Capture, Refile, Archive: Capture Refile Archive. The ins and outs for projects. +* Refiling and Archiving:: Moving and copying information with ease. +* Capture and Attachments:: Dealing with external data. * Agenda Views:: Collecting information into views. * Markup for Rich Contents:: Compose beautiful documents. * Exporting:: Sharing and publishing notes. @@ -86,7 +87,6 @@ Document Structure * Plain Lists:: Additional structure within an entry. * Drawers:: Tucking stuff away. * Blocks:: Folding blocks. -* Creating Footnotes:: How footnotes are defined in Org’s syntax. Visibility Cycling @@ -149,7 +149,7 @@ TODO Extensions Progress Logging -* Closing items:: When was this entry marked DONE? +* Closing items:: When was this entry marked as done? * Tracking TODO state changes:: When did the status change? * Tracking your habits:: How consistent have you been? @@ -204,15 +204,22 @@ Clocking Work Time * The clock table:: Detailed reports. * Resolving idle time:: Resolving time when you’ve been idle. -Capture, Refile, Archive +Refiling and Archiving -* Capture:: Capturing new stuff. -* Attachments:: Add files to tasks. -* RSS Feeds:: Getting input from RSS feeds. -* Protocols:: External access to Emacs and Org. * Refile and Copy:: Moving/copying a tree from one place to another. * Archiving:: What to do with finished products. +Archiving + +* Moving subtrees:: Moving a tree to an archive file. +* Internal archiving:: Switch off a tree but keep it in the file. + +Capture and Attachments + +* Capture:: Capturing new stuff. +* Attachments:: Attach files to outlines. +* RSS Feeds:: Getting input from RSS feeds. + Capture * Setting up capture:: Where notes will be stored. @@ -225,16 +232,13 @@ Capture templates * Template expansion:: Filling in information about time and context. * Templates in contexts:: Only show a template in a specific context. -Protocols - -* store-link protocol:: Store a link, push URL to kill-ring. -* capture protocol:: Fill a buffer with external information. -* open-source protocol:: Edit published contents. - -Archiving +Attachments -* Moving subtrees:: Moving a tree to an archive file. -* Internal archiving:: Switch off a tree but keep it in the file. +* Attachment defaults and dispatcher:: How to access attachment commands +* Attachment options:: Configuring the attachment system +* Attachment links:: Hyperlink access to attachments +* Automatic version-control with Git:: Everything safely stored away +* Attach from Dired:: Using dired to select an attachment Agenda Views @@ -260,7 +264,7 @@ Presentation and Sorting * Categories:: Not all tasks are equal. * Time-of-day specifications:: How the agenda knows the time. * Sorting of agenda items:: The order of things. -* Filtering/limiting agenda times:: Dynamically narrow the agenda. +* Filtering/limiting agenda items:: Dynamically narrow the agenda. Custom Agenda Views @@ -279,6 +283,7 @@ Markup for Rich Contents * Images:: Display an image. * Captions:: Describe tables, images... * Horizontal Rules:: Make a line. +* Creating Footnotes:: Edit and read footnotes. Embedded LaTeX @@ -295,7 +300,7 @@ Exporting * Macro Replacement:: Use macros to create templates. * Comment Lines:: What will not be exported. * ASCII/Latin-1/UTF-8 export:: Exporting to flat files with encoding. -* Beamer Export:: +* Beamer Export:: Producing presentations and slides. * HTML Export:: Exporting to HTML. * LaTeX Export:: Exporting to LaTeX and processing to PDF. * Markdown Export:: Exporting to Markdown. @@ -323,6 +328,7 @@ HTML Export * HTML doctypes:: Exporting various (X)HTML flavors. * HTML preamble and postamble:: Inserting preamble and postamble. * Quoting HTML tags:: Using direct HTML in Org files. +* Headlines in HTML export:: Formatting headlines. * Links in HTML export:: Inserting and formatting links. * Tables in HTML export:: How to modify the formatting of tables. * Images in HTML export:: How to insert figures into HTML output. @@ -425,25 +431,37 @@ Miscellaneous * Completion:: ‘M-’ guesses completions. * Structure Templates:: Quick insertion of structural elements. -* Escape Character:: * Speed Keys:: Electric commands at the beginning of a headline. -* Code Evaluation Security:: Org files evaluate in-line code. -* Customization:: Adapting Org to your taste. -* In-buffer Settings:: Overview of keywords. -* The Very Busy C-c C-c Key:: When in doubt, press ‘C-c C-c’. * Clean View:: Getting rid of leading stars in the outline. -* TTY Keys:: Using Org on a tty. +* Dynamic Headline Numbering:: Display and update outline numbering. +* The Very Busy C-c C-c Key:: When in doubt, press ‘C-c C-c’. +* In-buffer Settings:: Overview of keywords. +* Org Syntax:: Formal description of Org’s syntax. * Documentation Access:: Read documentation about current syntax. +* Escape Character:: +* Code Evaluation Security:: Org files evaluate in-line code. * Interaction:: With other Emacs packages. +* TTY Keys:: Using Org on a tty. +* Protocols:: External access to Emacs and Org. * Org Crypt:: Encrypting Org files. * Org Mobile:: Viewing and capture on a mobile device. -* Org Syntax:: Formal description of Org’s syntax. + +Clean View + +* Org Indent Mode:: +* Hard indentation:: Interaction * Cooperation:: Packages Org cooperates with. * Conflicts:: Packages that lead to conflicts. +Protocols + +* The store-link protocol:: Store a link, push URL to kill-ring. +* The capture protocol:: Fill a buffer with external information. +* The open-source protocol:: Edit published contents. + Org Mobile * Setting up the staging area:: For the mobile device. @@ -655,10 +673,10 @@ which selects Org mode for this buffer no matter what the file’s name is. See also the variable ‘org-insert-mode-line-in-empty-file’. Many commands in Org work on the region if the region is _active_. -To make use of this, you need to have ‘transient-mark-mode’ turned on, -which is the default. If you do not like ‘transient-mark-mode’, you can -create an active region by using the mouse to select a region, or -pressing ‘C-’ twice before moving point. +To make use of this, you need to have Transient Mark mode turned on, +which is the default. If you do not like it, you can create an active +region by using the mouse to select a region, or pressing ‘C-’ +twice before moving point. ---------- Footnotes ---------- @@ -834,7 +852,6 @@ bound to the ‘’ key. * Plain Lists:: Additional structure within an entry. * Drawers:: Tucking stuff away. * Blocks:: Folding blocks. -* Creating Footnotes:: How footnotes are defined in Org’s syntax.  File: org, Node: Headlines, Next: Visibility Cycling, Up: Document Structure @@ -857,8 +874,12 @@ start with one or more stars, on the left margin(1). For example: it as a title for your own headings. Some people find the many stars too noisy and would prefer an outline -that has whitespace followed by a single star as headline starters. See -*note Clean View::. +that has whitespace followed by a single star as headline starters. +This can be achieved using a Org Indent minor mode. See *note Clean +View:: for more information. + + Headlines are not numbered. However, you may want to dynamically +number some, or all, of them. See *note Dynamic Headline Numbering::. An empty line after the end of a subtree is considered part of it and is hidden when the subtree is folded. However, if you leave at least @@ -1302,7 +1323,7 @@ example: But in the end, no individual scenes matter but the film as a whole. Important actors in this film are: - Elijah Wood :: He plays Frodo - - Sean Astin :: He plays Sam, Frodo's friend. I still remember him + - Sean Astin :: He plays Sam, Frodo's friend. I still remember him very well from his role as Mikey Walsh in /The Goonies/. Org supports these lists by tuning filling and wrapping commands to @@ -1403,8 +1424,8 @@ to disable them individually. ‘C-c C-*’ Turn the whole plain list into a subtree of the current heading. - Checkboxes (see *note Checkboxes::) become TODO, respectively DONE, - keywords when unchecked, respectively checked. + Checkboxes (see *note Checkboxes::) become ‘TODO’, respectively + ‘DONE’, keywords when unchecked, respectively checked. ‘S-’ ‘S-’ @@ -1491,7 +1512,7 @@ in a similar way to state changes, use or ‘ ’ instead.  -File: org, Node: Blocks, Next: Creating Footnotes, Prev: Drawers, Up: Document Structure +File: org, Node: Blocks, Prev: Drawers, Up: Document Structure 2.8 Blocks ========== @@ -1507,91 +1528,6 @@ by using #+STARTUP: hideblocks #+STARTUP: nohideblocks - -File: org, Node: Creating Footnotes, Prev: Blocks, Up: Document Structure - -2.9 Creating Footnotes -====================== - -Org mode supports the creation of footnotes. - - A footnote is started by a footnote marker in square brackets in -column 0, no indentation allowed. It ends at the next footnote -definition, headline, or after two consecutive empty lines. The -footnote reference is simply the marker in square brackets, inside text. -Markers always start with ‘fn:’. For example: - - The Org homepage[fn:1] now looks a lot better than it used to. - ... - [fn:1] The link is: https://orgmode.org - - Org mode extends the number-based syntax to _named_ footnotes and -optional inline definition. Here are the valid references: - -‘[fn:NAME]’ - A named footnote reference, where NAME is a unique label word, or, - for simplicity of automatic creation, a number. - -‘[fn:: This is the inline definition of this footnote]’ - A LaTeX-like anonymous footnote where the definition is given - directly at the reference point. - -‘[fn:NAME: a definition]’ - An inline definition of a footnote, which also specifies a name for - the note. Since Org allows multiple references to the same note, - you can then use ‘[fn:NAME]’ to create additional references. - - Footnote labels can be created automatically, or you can create names -yourself. This is handled by the variable ‘org-footnote-auto-label’ and -its corresponding ‘STARTUP’ keywords. See the docstring of that -variable for details. - - The following command handles footnotes: - -‘C-c C-x f’ - The footnote action command. - - When point is on a footnote reference, jump to the definition. - When it is at a definition, jump to the—first—reference. - - Otherwise, create a new footnote. Depending on the variable - ‘org-footnote-define-inline’(1), the definition is placed right - into the text as part of the reference, or separately into the - location determined by the variable ‘org-footnote-section’. - - When this command is called with a prefix argument, a menu of - additional options is offered: - - ‘s’ Sort the footnote definitions by reference sequence. - ‘r’ Renumber the simple ‘fn:N’ footnotes. - ‘S’ Short for first ‘r’, then ‘s’ action. - ‘n’ Rename all footnotes into a ‘fn:1’ ... ‘fn:n’ sequence. - ‘d’ Delete the footnote at point, including definition and - references. - - Depending on the variable ‘org-footnote-auto-adjust’(2), - renumbering and sorting footnotes can be automatic after each - insertion or deletion. - -‘C-c C-c’ - If point is on a footnote reference, jump to the definition. If it - is at the definition, jump back to the reference. When called at a - footnote location with a prefix argument, offer the same menu as - ‘C-c C-x f’. - -‘C-c C-o’ or ‘mouse-1/2’ - Footnote labels are also links to the corresponding definition or - reference, and you can use the usual commands to follow these - links. - - ---------- Footnotes ---------- - - (1) The corresponding in-buffer setting is: ‘#+STARTUP: fninline’ or -‘#+STARTUP: nofninline’. - - (2) The corresponding in-buffer options are ‘#+STARTUP: fnadjust’ and -‘#+STARTUP: nofnadjust’. -  File: org, Node: Tables, Next: Hyperlinks, Prev: Document Structure, Up: Top @@ -1620,8 +1556,8 @@ File: org, Node: Built-in Table Editor, Next: Column Width and Alignment, Up: Org makes it easy to format tables in plain ASCII. Any line with ‘|’ as the first non-whitespace character is considered part of a table. ‘|’ is also the column separator(1). Moreover, a line starting with ‘|-’ is -a horizontal rule. It separates rows explicitely. Rows before the -first horizontal rule are header lines. A table might look like this: +a horizontal rule. It separates rows explicitly. Rows before the first +horizontal rule are header lines. A table might look like this: | Name | Phone | Age | |-------+-------+-----| @@ -1719,6 +1655,18 @@ Column and row editing ‘M-S-’ (‘org-table-kill-row’) Kill the current row or horizontal line. +‘S-’ (‘org-table-move-cell-up’) + Move cell up by swapping with adjacent cell. + +‘S-’ (‘org-table-move-cell-down’) + Move cell down by swapping with adjacent cell. + +‘S-’ (‘org-table-move-cell-left’) + Move cell left by swapping with adjacent cell. + +‘S-’ (‘org-table-move-cell-right’) + Move cell right by swapping with adjacent cell. + ‘M-S-’ (‘org-table-insert-row’) Insert a new row above the current row. With a prefix argument, the line is created below the current one. @@ -1786,12 +1734,15 @@ Calculations ‘S-’ (‘org-table-copy-down’) When current field is empty, copy from first non-empty field above. When not empty, copy current field down to next row and move point - along with it. Depending on the variable - ‘org-table-copy-increment’, integer field values can be incremented - during copy. Integers that are too large are not incremented, - however. Also, a ‘0’ prefix argument temporarily disables the - increment. This key is also used by shift-selection and related - modes (see *note Conflicts::). + along with it. + + Depending on the variable ‘org-table-copy-increment’, integer and + time stamp field values, and fields prefixed or suffixed with a + whole number, can be incremented during copy. Also, a ‘0’ prefix + argument temporarily disables the increment. + + This key is also used by shift-selection and related modes (see + *note Conflicts::). Miscellaneous ------------- @@ -1867,12 +1818,12 @@ leading to inconveniently wide columns. Maybe you want to hide away several columns or display them with a fixed width, regardless of content, as shown in the following example. - |---+---------------------+--------| |---+-------…|…| + |---+---------------------+--------| |---+-------…+…| | | <6> | | | | <6> …|…| | 1 | one | some | ----\ | 1 | one …|…| | 2 | two | boring | ----/ | 2 | two …|…| | 3 | This is a long text | column | | 3 | This i…|…| - |---+---------------------+--------| |---+-------…|…| + |---+---------------------+--------| |---+-------…+…| To set the width of a column, one field anywhere in the column may contain just the string ‘’ where N specifies the width as a number of @@ -2099,7 +2050,7 @@ traditional Lisp formula equivalents are ‘org-table-current-dline’ and Copy text or values of each row of column 1 of the table named FOO into column 2 of the current table. -‘@3 = 2 * remote(FOO, @@1$$#)’ +‘@3 = 2 * remote(FOO, @1$$#)’ Insert the doubled value of each column of row 1 of the table named FOO into row 3 of the current table. @@ -2928,16 +2879,19 @@ or alternatively [[LINK]] - The LINK part cannot contain ‘[’ and ‘]’ characters. You can replace -them with their percent-encoded counterparts, which are, respectively, -‘%5B’ and ‘%5D’. You also need to encode ‘%’ characters as ‘%25’. -Optionally, it may also come handy to encode consecutive spaces as -‘%20’. + Some ‘\’, ‘[’ and ‘]’ characters in the LINK part need to be +“escaped”, i.e., preceded by another ‘\’ character. More specifically, +the following characters, and only them, must be escaped: + + 1. all ‘[’ and ‘]’ characters, + 2. every ‘\’ character preceding either ‘]’ or ‘[’, + 3. every ‘\’ character at the end of the link. - Org takes for granted that such links are correctly escaped. -Luckily, functions inserting links (see *note Handling Links::) take -care of this. You really need to bother about it only when inserting -manually a URI within square brackets. + Functions inserting links (see *note Handling Links::) properly +escape ambiguous characters. You only need to bother about the rules +above when inserting directly, or yanking, a URI within square brackets. +When in doubt, you may use the function ‘org-link-escape’, which turns a +link string into its escaped form. Once a link in the buffer is complete, with all brackets present, Org changes the display so that ‘DESCRIPTION’ is displayed instead of @@ -2973,33 +2927,39 @@ File: org, Node: Internal Links, Next: Radio Targets, Prev: Link Format, Up: 4.2 Internal Links ================== -If the link does not look like a URL, it is considered to be internal in -the current file. The most important case is a link like -‘[[#my-custom-id]]’ which links to the entry with the ‘CUSTOM_ID’ -property ‘my-custom-id’. You are responsible yourself to make sure -these custom IDs are unique in a file. +A link that does not look like a URL—i.e., does not start with a known +scheme or a file name—refers to the current document. You can follow it +with ‘C-c C-o’ when point is on the link, or with a mouse click (see +*note Handling Links::). - Links such as ‘[[My Target]]’ or ‘[[My Target][Find my target]]’ lead -to a text search in the current file. + Org provides several refinements to internal navigation within a +document. Most notably, a construct like ‘[[#my-custom-id]]’ +specifically targets the entry with the ‘CUSTOM_ID’ property set to +‘my-custom-id’. Also, an internal link looking like ‘[[*Some section]]’ +points to a headline with the name ‘Some section’(1). - The link can be followed with ‘C-c C-o’ when point is on the link, or -with a mouse click (see *note Handling Links::). Links to custom IDs -point to the corresponding headline. The preferred match for a text -link is a _dedicated target_: the same string in double angular -brackets, like ‘<>’. + When the link does not belong to any of the cases above, Org looks +for a _dedicated target_: the same string in double angular brackets, +like ‘<>’. If no dedicated target exists, the link tries to match the exact name -of an element within the buffer. Naming is done with the ‘NAME’ -keyword, which has to be put in the line before the element it refers -to, as in the following example +of an element within the buffer. Naming is done, unsurprisingly, with +the ‘NAME’ keyword, which has to be put in the line before the element +it refers to, as in the following example #+NAME: My Target | a | table | |----+------------| | of | four cells | - If none of the above succeeds, Org searches for a headline that is -exactly the link text but may also include a TODO keyword and tags(1). + Ultimately, if none of the above succeeds, Org searches for a +headline that is exactly the link text but may also include a TODO +keyword and tags, or initiates a plain text search, according to the +value of ‘org-link-search-must-match-exact-headline’. + + Note that you must make sure custom IDs, dedicated targets, and names +are unique throughout the document. Org provides a linter to assist you +in the process, if needed. See *note Org Syntax::. During export, internal links are used to mark objects and assign them a number. Marked objects are then referenced by links pointing to @@ -3058,38 +3018,104 @@ Org supports links to files, websites, Usenet and email messages, BBDB database entries and links to both IRC conversations and their logs. External links are URL-like locators. They start with a short identifying string followed by a colon. There can be no space after the -colon. The following list shows examples for each link type. - -‘https://staff.science.uva.nl/c.dominik/’ on the web -‘doi:10.1000/182’ DOI for an electronic resource -‘file:/home/dominik/images/jupiter.jpg’ file, absolute path -‘/home/dominik/images/jupiter.jpg’ same as above -‘file:papers/last.pdf’ file, relative path -‘./papers/last.pdf’ same as above -‘file:/ssh:me@some.where:papers/last.pdf’ file, path on remote machine -‘/ssh:me@some.where:papers/last.pdf’ same as above -‘file:sometextfile::NNN’ file, jump to line number -‘file:projects.org’ another Org file -‘file:projects.org::some words’ text search in Org file(1) -‘file:projects.org::*task title’ heading search in Org file -‘file+sys:/path/to/file’ open via OS, like double-click -‘file+emacs:/path/to/file’ force opening by Emacs -‘docview:papers/last.pdf::NNN’ open in doc-view mode at page -‘id:B7423F4D-2E8A-471B-8810-C40F074717E9’ link to heading by ID -‘news:comp.emacs’ Usenet link -‘mailto:adent@galaxy.net’ mail link -‘mhe:folder’ MH-E folder link -‘mhe:folder#id’ MH-E message link -‘rmail:folder’ Rmail folder link -‘rmail:folder#id’ Rmail message link -‘gnus:group’ Gnus group link -‘gnus:group#id’ Gnus article link -‘bbdb:R.*Stallman’ BBDB link (with regexp) -‘irc:/irc.com/#emacs/bob’ IRC link -‘info:org#External links’ Info node link -‘shell:ls *.org’ shell command -‘elisp:org-agenda’ interactive Elisp command -‘elisp:(find-file "Elisp.org")’ Elisp form to evaluate +colon. + + Here is the full set of built-in link types: + +‘file’ + File links. File name may be remote, absolute, or relative. + + Additionally, you can specify a line number, or a text search. In + Org files, you may link to a headline name, a custom ID, or a code + reference instead. + + As a special case, “file” prefix may be omitted if the file name is + complete, e.g., it starts with ‘./’, or ‘/’. + +‘attachment’ + Same as file links but for files and folders attached to the + current node (see *note Attachments::). Attachment links are + intended to behave exactly as file links but for files relative to + the attachment directory. + +‘bbdb’ + Link to a BBDB record, with possible regexp completion. + +‘docview’ + Link to a document opened with DocView mode. You may specify a + page number. + +‘doi’ + Link to an electronic resource, through its handle. + +‘elisp’ + Execute an Elisp command upon activation. + +‘gnus’, ‘rmail’, ‘mhe’ + Link to messages or folders from a given Emacs’ MUA. + +‘help’ + Display documentation of a symbol in ‘*Help*’ buffer. + +‘http’, ‘https’ + Web links. + +‘id’ + Link to a specific headline by its ID property, in an Org file. + +‘info’ + Link to an Info manual, or to a specific node. + +‘irc’ + Link to an IRC channel. + +‘mailto’ + Link to message composition. + +‘news’ + Usenet links. + +‘shell’ + Execute a shell command upon activation. + + The following table illustrates the link types above, along with +their options: + +Link Type Example +------------------------------------------------------------------------ +http ‘http://staff.science.uva.nl/c.dominik/’ +https ‘https://orgmode.org/’ +doi ‘doi:10.1000/182’ +file ‘file:/home/dominik/images/jupiter.jpg’ + ‘/home/dominik/images/jupiter.jpg’ (same as above) + ‘file:papers/last.pdf’ + ‘./papers/last.pdf’ (same as above) + ‘file:/ssh:me@some.where:papers/last.pdf’ (remote) + ‘/ssh:me@some.where:papers/last.pdf’ (same as above) + ‘file:sometextfile::NNN’ (jump to line number) + ‘file:projects.org’ + ‘file:projects.org::some words’ (text search)(1) + ‘file:projects.org::*task title’ (headline search) + ‘file:projects.org::#custom-id’ (headline search) +attachment ‘attachment:projects.org’ + ‘attachment:projects.org::some words’ (text search) +docview ‘docview:papers/last.pdf::NNN’ +id ‘id:B7423F4D-2E8A-471B-8810-C40F074717E9’ +news ‘news:comp.emacs’ +mailto ‘mailto:adent@galaxy.net’ +mhe ‘mhe:folder’ (folder link) + ‘mhe:folder#id’ (message link) +rmail ‘rmail:folder’ (folder link) + ‘rmail:folder#id’ (message link) +gnus ‘gnus:group’ (group link) + ‘gnus:group#id’ (article link) +bbdb ‘bbdb:R.*Stallman’ (record with regexp) +irc ‘irc:/irc.com/#emacs/bob’ +help ‘help:org-store-link’ +info ‘info:org#External links’ +shell ‘shell:ls *.org’ +elisp ‘elisp:(find-file "Elisp.org")’ (Elisp form to evaluate) + ‘elisp:org-agenda’ (interactive Elisp command) On top of these built-in link types, additional ones are available through the ‘contrib/’ directory (see *note Installation::). For @@ -3118,10 +3144,10 @@ HTML export (see *note HTML Export::) inlines the image as a clickable button. If there is no description at all and the link points to an image, that image is inlined into the exported HTML file. - Org also finds external links in the normal text and activates them -as links. If spaces must be part of the link (for example in -‘bbdb:Richard Stallman’), or if you need to remove ambiguities about the -end of the link, enclose the link in square or angular brackets. + Org also recognizes external links amid normal text and activates +them as links. If spaces must be part of the link (for example in +‘bbdb:R.*Stallman’), or if you need to remove ambiguities about the end +of the link, enclose the link in square or angular brackets. ---------- Footnotes ---------- @@ -3166,8 +3192,8 @@ _Email/News clients: VM, Rmail, Wanderlust, MH-E, Gnus_ Pretty much all Emacs mail clients are supported. The link points to the current article, or, in some Gnus buffers, to the group. The description is constructed according to the variable - ‘org-email-link-description-format’. By default, it refers to the - addressee and the subject, possibly truncated. + ‘org-link-email-description-format’. By default, it refers to the + addressee and the subject. _Web browsers: W3, W3M and EWW_ Here the link is the current URL, with the page title as the @@ -3312,13 +3338,12 @@ descriptive text. (4) After insertion of a stored link, the link will be removed from the list of stored links. To keep it in the list for later use, use a triple ‘C-u’ prefix argument to ‘C-c C-l’, or configure the option -‘org-keep-stored-link-after-insertion’. +‘org-link-keep-stored-after-insertion’. (5) This works if a function has been defined in the ‘:complete’ property of a link in ‘org-link-parameters’. - (6) See the variable -‘org-display-internal-link-with-indirect-buffer’. + (6) See the variable ‘org-link-use-indirect-buffer-for-internals’.  File: org, Node: Using Links Outside Org, Next: Link Abbreviations, Prev: Handling Links, Up: Hyperlinks @@ -3409,6 +3434,9 @@ Links::) to a file, it encodes the words in the current line as a search string that can be used to find this line back later when following the link with ‘C-c C-o’. + Note that all search options apply for Attachment links in the same +way that they apply for File links. + Here is the syntax of the different ways to attach a search to a file link, together with explanations for each: @@ -3417,6 +3445,7 @@ link, together with explanations for each: [[file:~/xx.org::*My Target]] [[file:~/xx.org::#my-custom-id]] [[file:~/xx.org::/regexp/]] + [[attachment:main.c::255]] ‘255’ Jump to line 255. @@ -3469,7 +3498,7 @@ need to be added to the hook variables ‘org-execute-file-search-functions’. See the docstring for these variables for more information. Org actually uses this mechanism for BibTeX database files, and you can use the corresponding code as an -implementation example. See the file ‘org-bibtex.el’. +implementation example. See the file ‘ol-bibtex.el’.  File: org, Node: TODO Items, Next: Tags, Prev: Hyperlinks, Up: Top @@ -3526,21 +3555,15 @@ for example: selection interface; this is the default behavior when ‘org-use-fast-todo-selection’ is non-‘nil’. - The same rotation can also be done “remotely” from the agenda + The same state changing can also be done “remotely” from the agenda buffer with the ‘t’ command key (see *note Agenda Commands::). -‘C-u C-c C-t’ - When TODO keywords have no selection keys, select a specific - keyword using completion; otherwise force cycling through TODO - states with no prompt. When ‘org-use-fast-todo-selection’ is set - to ‘prefix’, use the fast selection interface. - ‘S-’ ‘S-’ Select the following/preceding TODO state, similar to cycling. Useful mostly if more than two TODO states are possible (see *note TODO Extensions::). See also *note Conflicts::, for a discussion - of the interaction with ‘shift-selection-mode’. See also the - variable ‘org-treat-S-cursor-todo-selection-as-state-change’. + of the interaction with shift-selection. See also the variable + ‘org-treat-S-cursor-todo-selection-as-state-change’. ‘C-c / t’ (‘org-show-todo-tree’) View TODO items in a _sparse tree_ (see *note Sparse Trees::). @@ -3597,8 +3620,8 @@ File: org, Node: Workflow states, Next: TODO types, Up: TODO Extensions 5.2.1 TODO keywords as workflow states -------------------------------------- -You can use TODO keywords to indicate different _sequential_ states in -the process of working on an item, for example(1): +You can use TODO keywords to indicate different, possibly _sequential_ +states in the process of working on an item, for example(1): (setq org-todo-keywords '((sequence "TODO" "FEEDBACK" "VERIFY" "|" "DONE" "DELEGATED"))) @@ -3612,12 +3635,13 @@ state. ‘FEEDBACK’, then to ‘VERIFY’, and finally to ‘DONE’ and ‘DELEGATED’. You may also use a numeric prefix argument to quickly select a specific state. For example ‘C-3 C-c C-t’ changes the state immediately to -‘VERIFY’. Or you can use ‘S-’ to go backward through the -sequence. If you define many keywords, you can use in-buffer completion -(see *note Completion::) or even a special one-key selection scheme (see -*note Fast access to TODO states::) to insert these words into the -buffer. Changing a TODO state can be logged with a timestamp, see *note -Tracking TODO state changes::, for more information. +‘VERIFY’. Or you can use ‘S-’ and ‘S-’ to go forward and +backward through the states. If you define many keywords, you can use +in-buffer completion (see *note Completion::) or a special one-key +selection scheme (see *note Fast access to TODO states::) to insert +these words into the buffer. Changing a TODO state can be logged with a +timestamp, see *note Tracking TODO state changes::, for more +information. ---------- Footnotes ---------- @@ -3634,25 +3658,29 @@ The second possibility is to use TODO keywords to indicate different _types_ of action items. For example, you might want to indicate that items are for “work” or “home”. Or, when you work with several people on a single project, you might want to assign action items directly to -persons, by using their names as TODO keywords. This would be set up -like this: +persons, by using their names as TODO keywords. This type of +functionality is actually much better served by using tags (see *note +Tags::), so the TODO implementation is kept just for backward +compatibility. + + Using TODO types, it would be set up like this: (setq org-todo-keywords '((type "Fred" "Sara" "Lucy" "|" "DONE"))) - In this case, different keywords do not indicate a sequence, but -rather different types. So the normal work flow would be to assign a -task to a person, and later to mark it DONE. Org mode supports this -style by adapting the workings of the command ‘C-c C-t’(1). When used -several times in succession, it still cycles through all names, in order -to first select the right type for a task. But when you return to the -item after some time and execute ‘C-c C-t’ again, it will switch from -any name directly to ‘DONE’. Use prefix arguments or completion to -quickly select a specific name. You can also review the items of a -specific TODO type in a sparse tree by using a numeric prefix to ‘C-c / -t’. For example, to see all things Lucy has to do, you would use ‘C-3 -C-c / t’. To collect Lucy’s items from all agenda files into a single -buffer, you would use the numeric prefix argument as well when creating -the global TODO list: ‘C-3 M-x org-agenda t’. + In this case, different keywords do not indicate states, but rather +different types. So the normal work flow would be to assign a task to a +person, and later to mark it DONE. Org mode supports this style by +adapting the workings of the command ‘C-c C-t’(1). When used several +times in succession, it still cycles through all names, in order to +first select the right type for a task. But when you return to the item +after some time and execute ‘C-c C-t’ again, it will switch from any +name directly to ‘DONE’. Use prefix arguments or completion to quickly +select a specific name. You can also review the items of a specific +TODO type in a sparse tree by using a numeric prefix to ‘C-c / t’. For +example, to see all things Lucy has to do, you would use ‘C-3 C-c / t’. +To collect Lucy’s items from all agenda files into a single buffer, you +would use the numeric prefix argument as well when creating the global +TODO list: ‘C-3 M-x org-agenda t’. ---------- Footnotes ---------- @@ -3690,14 +3718,14 @@ correct sequence. In addition to typing a keyword or using completion above example, ‘C-u C-u C-c C-t’ or ‘C-S-’ would jump from ‘TODO’ or ‘DONE’ to ‘REPORT’, and any of the words in the second row to ‘CANCELED’. Note that the ‘C-S-’ key binding conflict with - ‘shift-selection-mode’ (see *note Conflicts::). + shift-selection (see *note Conflicts::). ‘S-’ ‘S-’ ‘S-’ and ‘S-’ walk through _all_ keywords from all sub-sequences, so for example ‘S-’ would switch from ‘DONE’ to ‘REPORT’ in the example above. For a discussion of the - interaction with ‘shift-selection-mode’, see *note Conflicts::. + interaction with shift-selection, see *note Conflicts::.  File: org, Node: Fast access to TODO states, Next: Per-file keywords, Prev: Multiple sets in one file, Up: TODO Extensions @@ -3801,15 +3829,15 @@ File: org, Node: TODO dependencies, Prev: Faces for TODO keywords, Up: TODO E ----------------------- The structure of Org files—hierarchy and lists—makes it easy to define -TODO dependencies. Usually, a parent TODO task should not be marked -DONE until all TODO subtasks, or children tasks, are marked as DONE. +TODO dependencies. Usually, a parent TODO task should not be marked as +done until all TODO subtasks, or children tasks, are marked as done. Sometimes there is a logical sequence to (sub)tasks, so that one subtask -cannot be acted upon before all siblings above it have been marked DONE. -If you customize the variable ‘org-enforce-todo-dependencies’, Org -blocks entries from changing state to DONE while they have TODO children -that are not DONE. Furthermore, if an entry has a property ‘ORDERED’, -each of its TODO children is blocked until all earlier siblings are -marked DONE. Here is an example: +cannot be acted upon before all siblings above it have been marked as +done. If you customize the variable ‘org-enforce-todo-dependencies’, +Org blocks entries from changing state to DONE while they have TODO +children that are not DONE. Furthermore, if an entry has a property +‘ORDERED’, each of its TODO children is blocked until all earlier +siblings are marked as done. Here is an example: * TODO Blocked until (two) is done ** DONE one @@ -3843,8 +3871,8 @@ property (see *note Properties and Columns::): Change TODO state, regardless of any state blocking. If you set the variable ‘org-agenda-dim-blocked-tasks’, TODO entries -that cannot be marked DONE because of unmarked children are shown in a -dimmed font or even made invisible in agenda views (see *note Agenda +that cannot be marked as done because of unmarked children are shown in +a dimmed font or even made invisible in agenda views (see *note Agenda Views::). You can also block changes of TODO states by using checkboxes (see @@ -3862,16 +3890,25 @@ File: org, Node: Progress Logging, Next: Priorities, Prev: TODO Extensions, 5.3 Progress Logging ==================== -Org mode can automatically record a timestamp and optionally a note when -you mark a TODO item as DONE, or even each time you change the state of -a TODO item. This system is highly configurable, settings can be on a -per-keyword basis and can be localized to a file or even a subtree. For -information on how to clock working time for a task, see *note Clocking -Work Time::. +To record a timestamp and a note when changing a TODO state, call the +command ‘org-todo’ with a prefix argument. + +‘C-u C-c C-t’ (‘org-todo’) + Prompt for a note and record a the time of the TODO state change. + The note is inserted as a list item below the headline, but can + also be placed into a drawer, see *note Tracking TODO state + changes::. + + If you want to be more systematic, Org mode can automatically record +a timestamp and optionally a note when you mark a TODO item as DONE, or +even each time you change the state of a TODO item. This system is +highly configurable, settings can be on a per-keyword basis and can be +localized to a file or even a subtree. For information on how to clock +working time for a task, see *note Clocking Work Time::. * Menu: -* Closing items:: When was this entry marked DONE? +* Closing items:: When was this entry marked as done? * Tracking TODO state changes:: When did the status change? * Tracking your habits:: How consistent have you been? @@ -3881,8 +3918,8 @@ File: org, Node: Closing items, Next: Tracking TODO state changes, Up: Progre 5.3.1 Closing items ------------------- -The most basic logging is to keep track of _when_ a certain TODO item -was marked DONE. This can be achieved with(1) +The most basic automatic logging is to keep track of _when_ a certain +TODO item was marked as done. This can be achieved with(1) (setq org-log-done 'time) @@ -3897,7 +3934,7 @@ note along with the timestamp, use(2) (setq org-log-done 'note) -You are then be prompted for a note, and that note is stored below the +You are then prompted for a note, and that note is stored below the entry with a ‘Closing Note’ heading. ---------- Footnotes ---------- @@ -3912,13 +3949,12 @@ File: org, Node: Tracking TODO state changes, Next: Tracking your habits, Pre 5.3.2 Tracking TODO state changes --------------------------------- -When TODO keywords are used as workflow states (see *note *Workflow -states: Workflow states.), you might want to keep track of when a state -change occurred and maybe take a note about this change. You can either -record just a timestamp, or a time-stamped note. These records are -inserted after the headline as an itemized list, newest first(1). When -taking a lot of notes, you might want to get the notes out of the way -into a drawer (see *note Drawers::). Customize the variable +You might want to automatically keep track of when a state change +occurred and maybe take a note about this change. You can either record +just a timestamp, or a time-stamped note. These records are inserted +after the headline as an itemized list, newest first(1). When taking a +lot of notes, you might want to get the notes out of the way into a +drawer (see *note Drawers::). Customize the variable ‘org-log-into-drawer’ to get this behavior—the recommended drawer for this is called ‘LOGBOOK’(2). You can also overrule the setting of this variable for a subtree by setting a ‘LOG_INTO_DRAWER’ property. @@ -3932,7 +3968,7 @@ with the setting (setq org-todo-keywords '((sequence "TODO(t)" "WAIT(w@/!)" "|" "DONE(d!)" "CANCELED(c@)"))) -to record a timestamp without a note for TODO keywords configured with +To record a timestamp without a note for TODO keywords configured with ‘@’, just type ‘C-c C-c’ to enter a blank note when prompted. You not only define global TODO keywords and fast access keys, but @@ -4079,7 +4115,8 @@ the way habits are displayed in the agenda. ‘org-habit-show-habits-only-for-today’ If non-‘nil’, only show habits in today’s agenda view. The default - value is ‘t’. + value is ‘t’. Pressing ‘C-u K’ in the agenda toggles this + variable. Lastly, pressing ‘K’ in the agenda buffer causes habits to temporarily be disabled and do not appear at all. Press ‘K’ again to @@ -4122,7 +4159,7 @@ be TODO items. Increase/decrease the priority of the current headline(1). Note that these keys are also used to modify timestamps (see *note Creating Timestamps::). See also *note Conflicts::, for a - discussion of the interaction with ‘shift-selection-mode’. + discussion of the interaction with shift-selection. You can change the range of allowed priorities by setting the variables ‘org-highest-priority’, ‘org-lowest-priority’, and @@ -4145,10 +4182,10 @@ File: org, Node: Breaking Down Tasks, Next: Checkboxes, Prev: Priorities, Up It is often advisable to break down large tasks into smaller, manageable subtasks. You can do this by creating an outline tree below a TODO item, with detailed subtasks on the tree(1). To keep an overview of the -fraction of subtasks that have already been marked DONE, insert either -‘[/]’ or ‘[%]’ anywhere in the headline. These cookies are updated each -time the TODO status of a child changes, or when pressing ‘C-c C-c’ on -the cookie. For example: +fraction of subtasks that have already been marked as done, insert +either ‘[/]’ or ‘[%]’ anywhere in the headline. These cookies are +updated each time the TODO status of a child changes, or when pressing +‘C-c C-c’ on the cookie. For example: * Organize Party [33%] ** TODO Call people [1/2] @@ -4201,8 +4238,7 @@ a checkbox by starting it with the string ‘[ ]’. This feature is similar to TODO items (see *note TODO Items::), but is more lightweight. Checkboxes are not included into the global TODO list, so they are often great to split a task into a number of simple steps. Or you can use -them in a shopping list. To toggle a checkbox, use ‘C-c C-c’, or use -the mouse (thanks to Piotr Zielinski’s ‘org-mouse.el’). +them in a shopping list. Here is an example of a checkbox list. @@ -5014,7 +5050,7 @@ SUMMARY-TYPE ‘X’ Checkbox status, ‘[X]’ if all children are ‘[X]’. ‘X/’ Checkbox status, ‘[n/m]’. ‘X%’ Checkbox status, ‘[n%]’. - ‘:’ Sum times, HH:MM, plain numbers are hours. + ‘:’ Sum times, HH:MM, plain numbers are minutes. ‘:min’ Smallest time value in column. ‘:max’ Largest time value. ‘:mean’ Arithmetic mean of time values. @@ -5206,6 +5242,10 @@ this block looks like this: When non-‘nil’, skip rows where the only non-empty specifier of the column view is ‘ITEM’. +‘:exclude-tags’ + List of tags to exclude from column view table: entries with these + tags will be excluded from the column view. + ‘:indent’ When non-‘nil’, indent each ‘ITEM’ field according to its level. @@ -5246,7 +5286,7 @@ block. with the main distribution of Org—visit .  -File: org, Node: Dates and Times, Next: Capture Refile Archive, Prev: Properties and Columns, Up: Top +File: org, Node: Dates and Times, Next: Refiling and Archiving, Prev: Properties and Columns, Up: Top 8 Dates and Times ***************** @@ -5270,8 +5310,8 @@ a much wider sense.  File: org, Node: Timestamps, Next: Creating Timestamps, Up: Dates and Times -8.1 Timestamps, Deadlines and Scheduling -======================================== +8.1 Timestamps +============== A timestamp is a specification of a date (possibly with a time or a range of times) in a special format, either ‘<2003-09-16 Tue>’ or @@ -5300,9 +5340,9 @@ Timestamp with repeater interval * Pick up Sam at school <2007-05-16 Wed 12:30 +1w> -Diary-style sexp entries +Diary-style expression entries For more complex date specifications, Org mode supports using the - special sexp diary entries implemented in the Emacs calendar/diary + special expression diary entries implemented in the Emacs Calendar package(2). For example, with optional time: * 22:00-23:00 The nerd meeting on every 2nd Thursday of the month @@ -5332,11 +5372,11 @@ format::. The day name is optional when you type the date yourself. However, any date inserted or modified by Org adds that day name, for reading convenience. - (2) When working with the standard diary sexp functions, you need to -be very careful with the order of the arguments. That order depends -evilly on the variable ‘calendar-date-style’. For example, to specify a -date December 12, 2005, the call might look like ‘(diary-date 12 1 -2005)’ or ‘(diary-date 1 12 2005)’ or ‘(diary-date 2005 12 1)’, + (2) When working with the standard diary expression functions, you +need to be very careful with the order of the arguments. That order +depends evilly on the variable ‘calendar-date-style’. For example, to +specify a date December 12, 2005, the call might look like ‘(diary-date +12 1 2005)’ or ‘(diary-date 1 12 2005)’ or ‘(diary-date 2005 12 1)’, depending on the settings. This has been the source of much confusion. Org mode users can resort to special versions of these functions like ‘org-date’ or ‘org-anniversary’. These work just like the corresponding @@ -5578,14 +5618,14 @@ Both the timestamp and the keyword have to be positioned immediately after the task they refer to. ‘DEADLINE’ - Meaning: the task (most likely a TODO item, though not necessarily) - is supposed to be finished on that date. + Meaning: the task—most likely a TODO item, though not + necessarily—is supposed to be finished on that date. On the deadline date, the task is listed in the agenda. In addition, the agenda for _today_ carries a warning about the approaching or missed deadline, starting ‘org-deadline-warning-days’ before the due date, and continuing - until the entry is marked DONE. An example: + until the entry is marked as done. An example: *** TODO write article about the Earth for the Guide DEADLINE: <2004-02-29 Sun> @@ -5603,8 +5643,8 @@ after the task they refer to. The headline is listed under the given date(1). In addition, a reminder that the scheduled date has passed is present in the - compilation for _today_, until the entry is marked DONE, i.e., the - task is automatically forwarded until completed. + compilation for _today_, until the entry is marked as done, i.e., + the task is automatically forwarded until completed. *** TODO Call Trillian for a date on New Years Eve. SCHEDULED: <2004-12-25 Sat> @@ -5630,14 +5670,14 @@ after the task they refer to. You may use timestamps with repeaters in scheduling and deadline entries. Org mode issues early and late warnings based on the assumption that the timestamp represents the _nearest instance_ of the -repeater. However, the use of diary S-exp entries like +repeater. However, the use of diary expression entries like <%%(diary-float t 42)> in scheduling and deadline timestamps is limited. Org mode does not -know enough about the internals of each S-exp function to issue early -and late warnings. However, it shows the item on each day where the -S-exp entry matches. +know enough about the internals of each function to issue early and late +warnings. However, it shows the item on each day where the expression +entry matches. * Menu: @@ -5646,8 +5686,8 @@ S-exp entry matches. ---------- Footnotes ---------- - (1) It will still be listed on that date after it has been marked -DONE. If you do not like this, set the variable + (1) It will still be listed on that date after it has been marked as +done. If you do not like this, set the variable ‘org-agenda-skip-scheduled-if-done’.  @@ -5729,15 +5769,15 @@ entry, the repeater should come first and the warning period last Deadlines and scheduled items produce entries in the agenda when they are over-due, so it is important to be able to mark such an entry as -DONE once you have done so. When you mark a ‘DEADLINE’ or a ‘SCHEDULED’ +done once you have done so. When you mark a ‘DEADLINE’ or a ‘SCHEDULED’ with the TODO keyword ‘DONE’, it no longer produces entries in the agenda. The problem with this is, however, is that then also the _next_ instance of the repeated entry will not be active. Org mode deals with -this in the following way: when you try to mark such an entry DONE, +this in the following way: when you try to mark such an entry as done, using ‘C-c C-t’, it shifts the base date of the repeating timestamp by the repeater interval, and immediately sets the entry state back to -TODO(2). In the example above, setting the state to DONE would actually -switch the date like this: +TODO(2). In the example above, setting the state to ‘DONE’ would +actually switch the date like this: ** TODO Pay the rent DEADLINE: <2005-11-01 Tue +1m> @@ -5855,17 +5895,18 @@ File: org, Node: Clocking commands, Next: The clock table, Up: Clocking Work ‘C-c C-x C-i’ (‘org-clock-in’) Start the clock on the current item (clock-in). This inserts the - CLOCK keyword together with a timestamp. If this is not the first - clocking of this item, the multiple CLOCK lines are wrapped into a - ‘LOGBOOK’ drawer (see also the variable ‘org-clock-into-drawer’). - You can also overrule the setting of this variable for a subtree by - setting a ‘CLOCK_INTO_DRAWER’ or ‘LOG_INTO_DRAWER’ property. When - called with a ‘C-u’ prefix argument, select the task from a list of - recently clocked tasks. With two ‘C-u C-u’ prefixes, clock into - the task at point and mark it as the default task; the default task - is always be available with letter ‘d’ when selecting a clocking - task. With three ‘C-u C-u C-u’ prefixes, force continuous clocking - by starting the clock when the last clock stopped. + ‘CLOCK’ keyword together with a timestamp. If this is not the + first clocking of this item, the multiple ‘CLOCK’ lines are wrapped + into a ‘LOGBOOK’ drawer (see also the variable + ‘org-clock-into-drawer’). You can also overrule the setting of + this variable for a subtree by setting a ‘CLOCK_INTO_DRAWER’ or + ‘LOG_INTO_DRAWER’ property. When called with a ‘C-u’ prefix + argument, select the task from a list of recently clocked tasks. + With two ‘C-u C-u’ prefixes, clock into the task at point and mark + it as the default task; the default task is always be available + with letter ‘d’ when selecting a clocking task. With three ‘C-u + C-u C-u’ prefixes, force continuous clocking by starting the clock + when the last clock stopped. While the clock is running, Org shows the current clocking time in the mode line, along with the title of the task. The clock time @@ -5967,13 +6008,11 @@ Org mode can produce quite complex reports based on the time clocking information. Such a report is called a _clock table_, because it is formatted as one or several Org tables. -‘C-c C-x C-r’ (‘org-clock-report’) - Insert a dynamic block (see *note Dynamic Blocks::) containing a - clock report as an Org mode table into the current file. When - point is at an existing clock table, just update it. When called - with a prefix argument, jump to the first clock report in the - current document and update it. The clock table includes archived - trees. + You can insert, or update, a clock table through Org dynamic blocks +insert command (see *note Dynamic Blocks::), by pressing ‘C-c C-x x c l +o c k t a b l e ’. When called with a prefix argument, jump to the +first clock table in the current document and update it. The clock +table includes archived trees. ‘C-c C-c’ or ‘C-c C-x C-u’ (‘org-dblock-update’) Update dynamic block at point. Point needs to be in the ‘BEGIN’ @@ -6059,8 +6098,9 @@ selected: The starting day of the month. The default is 1 for the first. ‘:step’ - Set to ‘week’ or ‘day’ to split the table into chunks. To use - this, ‘:block’ or ‘:tstart’, ‘:tend’ are needed. + Set to ‘day’, ‘week’, ‘month’ or ‘year’ to split the table into + chunks. To use this, either ‘:block’, or ‘:tstart’ and ‘:tend’ are + required. ‘:stepskip0’ When non-‘nil’, do not show steps that have zero time. @@ -6095,6 +6135,10 @@ using the ‘:formatter’ parameter. ‘:indent’ Indent each headline field according to its level. +‘:hidefiles’ + Hide the file column when multiple files are used to produce the + table. + ‘:tcolumns’ Number of columns to be used for times. If this is smaller than ‘:maxlevel’, lower levels are lumped into one column. @@ -6384,107 +6428,306 @@ same commands. mode line.  -File: org, Node: Capture Refile Archive, Next: Agenda Views, Prev: Dates and Times, Up: Top +File: org, Node: Refiling and Archiving, Next: Capture and Attachments, Prev: Dates and Times, Up: Top -9 Capture, Refile, Archive -************************** +9 Refiling and Archiving +************************ -An important part of any organization system is the ability to quickly -capture new ideas and tasks, and to associate reference material with -them. Org does this using a process called _capture_. It also can -store files related to a task (_attachments_) in a special directory. -Once in the system, tasks and projects need to be moved around. Moving -completed project trees to an archive file keeps the system compact and -fast. +Once information is in the system, it may need to be moved around. Org +provides Refile, Copy and Archive commands for this. Refile and Copy +helps with moving and copying outlines. Archiving helps to keep the +system compact and fast. * Menu: -* Capture:: Capturing new stuff. -* Attachments:: Add files to tasks. -* RSS Feeds:: Getting input from RSS feeds. -* Protocols:: External access to Emacs and Org. * Refile and Copy:: Moving/copying a tree from one place to another. * Archiving:: What to do with finished products.  -File: org, Node: Capture, Next: Attachments, Up: Capture Refile Archive +File: org, Node: Refile and Copy, Next: Archiving, Up: Refiling and Archiving -9.1 Capture -=========== +9.1 Refile and Copy +=================== -Capture lets you quickly store notes with little interruption of your -work flow. Org’s method for capturing new items is heavily inspired by -John Wiegley’s excellent Remember package. +When reviewing the captured data, you may want to refile or to copy some +of the entries into a different list, for example into a project. +Cutting, finding the right location, and then pasting the note is +cumbersome. To simplify this process, you can use the following special +command: -* Menu: +‘C-c C-w’ (‘org-refile’) + Refile the entry or region at point. This command offers possible + locations for refiling the entry and lets you select one with + completion. The item (or all items in the region) is filed below + the target heading as a subitem. Depending on + ‘org-reverse-note-order’, it is either the first or last subitem. -* Setting up capture:: Where notes will be stored. -* Using capture:: Commands to invoke and terminate capture. -* Capture templates:: Define the outline of different note types. + By default, all level 1 headlines in the current buffer are + considered to be targets, but you can have more complex definitions + across a number of files. See the variable ‘org-refile-targets’ + for details. If you would like to select a location via a + file-path-like completion along the outline path, see the variables + ‘org-refile-use-outline-path’ and + ‘org-outline-path-complete-in-steps’. If you would like to be able + to create new nodes as new parents for refiling on the fly, check + the variable ‘org-refile-allow-creating-parent-nodes’. When the + variable ‘org-log-refile’(1) is set, a timestamp or a note is + recorded whenever an entry is refiled. - -File: org, Node: Setting up capture, Next: Using capture, Up: Capture +‘C-u C-c C-w’ + Use the refile interface to jump to a heading. -9.1.1 Setting up capture ------------------------- +‘C-u C-u C-c C-w’ (‘org-refile-goto-last-stored’) + Jump to the location where ‘org-refile’ last moved a tree to. -The following customization sets a default target file for notes. +‘C-2 C-c C-w’ + Refile as the child of the item currently being clocked. - (setq org-default-notes-file (concat org-directory "/notes.org")) +‘C-3 C-c C-w’ + Refile and keep the entry in place. Also see ‘org-refile-keep’ to + make this the default behavior, and beware that this may result in + duplicated ‘ID’ properties. - You may also define a global key for capturing new material (see -*note Activation::). +‘C-0 C-c C-w’ or ‘C-u C-u C-u C-c C-w’ (‘org-refile-cache-clear’) + Clear the target cache. Caching of refile targets can be turned on + by setting ‘org-refile-use-cache’. To make the command see new + possible targets, you have to clear the cache with this command. - -File: org, Node: Using capture, Next: Capture templates, Prev: Setting up capture, Up: Capture +‘C-c M-w’ (‘org-copy’) + Copying works like refiling, except that the original note is not + deleted. -9.1.2 Using capture -------------------- + ---------- Footnotes ---------- -‘M-x org-capture’ (‘org-capture’) - Display the capture templates menu. If you have templates defined - (see *note Capture templates::), it offers these templates for - selection or use a new Org outline node as the default template. - It inserts the template into the target file and switch to an - indirect buffer narrowed to this new node. You may then insert the - information you want. + (1) Note the corresponding ‘STARTUP’ options ‘logrefile’, +‘lognoterefile’, and ‘nologrefile’. -‘C-c C-c’ (‘org-capture-finalize’) - Once you have finished entering information into the capture - buffer, ‘C-c C-c’ returns you to the window configuration before - the capture process, so that you can resume your work without - further distraction. When called with a prefix argument, finalize - and then jump to the captured item. + +File: org, Node: Archiving, Prev: Refile and Copy, Up: Refiling and Archiving -‘C-c C-w’ (‘org-capture-refile’) - Finalize the capture process by refiling the note to a different - place (see *note Refile and Copy::). Please realize that this is a - normal refiling command that will be executed—so point position at - the moment you run this command is important. If you have inserted - a tree with a parent and children, first move point back to the - parent. Any prefix argument given to this command is passed on to - the ‘org-refile’ command. +9.2 Archiving +============= -‘C-c C-k’ (‘org-capture-kill’) - Abort the capture process and return to the previous state. +When a project represented by a (sub)tree is finished, you may want to +move the tree out of the way and to stop it from contributing to the +agenda. Archiving is important to keep your working files compact and +global searches like the construction of agenda views fast. - You can also call ‘org-capture’ in a special way from the agenda, -using the ‘k c’ key combination. With this access, any timestamps -inserted by the selected capture template defaults to the date at point -in the agenda, rather than to the current date. +‘C-c C-x C-a’ (‘org-archive-subtree-default’) + Archive the current entry using the command specified in the + variable ‘org-archive-default-command’. - To find the locations of the last stored capture, use ‘org-capture’ -with prefix commands: +* Menu: -‘C-u M-x org-capture’ - Visit the target location of a capture template. You get to select - the template in the usual way. +* Moving subtrees:: Moving a tree to an archive file. +* Internal archiving:: Switch off a tree but keep it in the file. -‘C-u C-u M-x org-capture’ - Visit the last stored capture item in its buffer. + +File: org, Node: Moving subtrees, Next: Internal archiving, Up: Archiving - You can also jump to the bookmark ‘org-capture-last-stored’, which is -automatically created unless you set ‘org-capture-bookmark’ to ‘nil’. +9.2.1 Moving a tree to an archive file +-------------------------------------- + +The most common archiving action is to move a project tree to another +file, the archive file. + +‘C-c C-x C-s’ or short ‘C-c $’ (‘org-archive-subtree’) + Archive the subtree starting at point position to the location + given by ‘org-archive-location’. + +‘C-u C-c C-x C-s’ + Check if any direct children of the current headline could be moved + to the archive. To do this, check each subtree for open TODO + entries. If none is found, the command offers to move it to the + archive location. If point is _not_ on a headline when this + command is invoked, check level 1 trees. + +‘C-u C-u C-c C-x C-s’ + As above, but check subtree for timestamps instead of TODO entries. + The command offers to archive the subtree if it _does_ contain a + timestamp, and that timestamp is in the past. + + The default archive location is a file in the same directory as the +current file, with the name derived by appending ‘_archive’ to the +current file name. You can also choose what heading to file archived +items under, with the possibility to add them to a datetree in a file. +For information and examples on how to specify the file and the heading, +see the documentation string of the variable ‘org-archive-location’. + + There is also an in-buffer option for setting this variable, for +example: + + #+ARCHIVE: %s_done:: + + If you would like to have a special archive location for a single +entry or a (sub)tree, give the entry an ‘ARCHIVE’ property with the +location as the value (see *note Properties and Columns::). + + When a subtree is moved, it receives a number of special properties +that record context information like the file from where the entry came, +its outline path the archiving time etc. Configure the variable +‘org-archive-save-context-info’ to adjust the amount of information +added. + + +File: org, Node: Internal archiving, Prev: Moving subtrees, Up: Archiving + +9.2.2 Internal archiving +------------------------ + +If you want to just switch off—for agenda views—certain subtrees without +moving them to a different file, you can use the ‘ARCHIVE’ tag. + + A headline that is marked with the ‘ARCHIVE’ tag (see *note Tags::) +stays at its location in the outline tree, but behaves in the following +way: + + • It does not open when you attempt to do so with a visibility + cycling command (see *note Visibility Cycling::). You can force + cycling archived subtrees with ‘C-’, or by setting the option + ‘org-cycle-open-archived-trees’. Also normal outline commands, + like ‘outline-show-all’, open archived subtrees. + + • During sparse tree construction (see *note Sparse Trees::), matches + in archived subtrees are not exposed, unless you configure the + option ‘org-sparse-tree-open-archived-trees’. + + • During agenda view construction (see *note Agenda Views::), the + content of archived trees is ignored unless you configure the + option ‘org-agenda-skip-archived-trees’, in which case these trees + are always included. In the agenda you can press ‘v a’ to get + archives temporarily included. + + • Archived trees are not exported (see *note Exporting::), only the + headline is. Configure the details using the variable + ‘org-export-with-archived-trees’. + + • Archived trees are excluded from column view unless the variable + ‘org-columns-skip-archived-trees’ is configured to ‘nil’. + + The following commands help manage the ‘ARCHIVE’ tag: + +‘C-c C-x a’ (‘org-toggle-archive-tag’) + Toggle the archive tag for the current headline. When the tag is + set, the headline changes to a shadowed face, and the subtree below + it is hidden. + +‘C-u C-c C-x a’ + Check if any direct children of the current headline should be + archived. To do this, check each subtree for open TODO entries. + If none is found, the command offers to set the ‘ARCHIVE’ tag for + the child. If point is _not_ on a headline when this command is + invoked, check the level 1 trees. + +‘C-’ (‘org-force-cycle-archived’) + Cycle a tree even if it is tagged with ‘ARCHIVE’. + +‘C-c C-x A’ (‘org-archive-to-archive-sibling’) + Move the current entry to the _Archive Sibling_. This is a sibling + of the entry with the heading ‘Archive’ and the archive tag. The + entry becomes a child of that sibling and in this way retains a lot + of its original context, including inherited tags and approximate + position in the outline. + + +File: org, Node: Capture and Attachments, Next: Agenda Views, Prev: Refiling and Archiving, Up: Top + +10 Capture and Attachments +************************** + +An important part of any organization system is the ability to quickly +capture new ideas and tasks, and to associate reference material with +them. Org does this using a process called _capture_. It also can +store files related to a task (_attachments_) in a special directory. +Finally, it can parse RSS feeds for information. To learn how to let +external programs (for example a web browser) trigger Org to capture +material, see *note Protocols::. + +* Menu: + +* Capture:: Capturing new stuff. +* Attachments:: Attach files to outlines. +* RSS Feeds:: Getting input from RSS feeds. + + +File: org, Node: Capture, Next: Attachments, Up: Capture and Attachments + +10.1 Capture +============ + +Capture lets you quickly store notes with little interruption of your +work flow. Org’s method for capturing new items is heavily inspired by +John Wiegley’s excellent Remember package. + +* Menu: + +* Setting up capture:: Where notes will be stored. +* Using capture:: Commands to invoke and terminate capture. +* Capture templates:: Define the outline of different note types. + + +File: org, Node: Setting up capture, Next: Using capture, Up: Capture + +10.1.1 Setting up capture +------------------------- + +The following customization sets a default target file for notes. + + (setq org-default-notes-file (concat org-directory "/notes.org")) + + You may also define a global key for capturing new material (see +*note Activation::). + + +File: org, Node: Using capture, Next: Capture templates, Prev: Setting up capture, Up: Capture + +10.1.2 Using capture +-------------------- + +‘M-x org-capture’ (‘org-capture’) + Display the capture templates menu. If you have templates defined + (see *note Capture templates::), it offers these templates for + selection or use a new Org outline node as the default template. + It inserts the template into the target file and switch to an + indirect buffer narrowed to this new node. You may then insert the + information you want. + +‘C-c C-c’ (‘org-capture-finalize’) + Once you have finished entering information into the capture + buffer, ‘C-c C-c’ returns you to the window configuration before + the capture process, so that you can resume your work without + further distraction. When called with a prefix argument, finalize + and then jump to the captured item. + +‘C-c C-w’ (‘org-capture-refile’) + Finalize the capture process by refiling the note to a different + place (see *note Refile and Copy::). Please realize that this is a + normal refiling command that will be executed—so point position at + the moment you run this command is important. If you have inserted + a tree with a parent and children, first move point back to the + parent. Any prefix argument given to this command is passed on to + the ‘org-refile’ command. + +‘C-c C-k’ (‘org-capture-kill’) + Abort the capture process and return to the previous state. + + You can also call ‘org-capture’ in a special way from the agenda, +using the ‘k c’ key combination. With this access, any timestamps +inserted by the selected capture template defaults to the date at point +in the agenda, rather than to the current date. + + To find the locations of the last stored capture, use ‘org-capture’ +with prefix commands: + +‘C-u M-x org-capture’ + Visit the target location of a capture template. You get to select + the template in the usual way. + +‘C-u C-u M-x org-capture’ + Visit the last stored capture item in its buffer. + + You can also jump to the bookmark ‘org-capture-last-stored’, which is +automatically created unless you set ‘org-capture-bookmark’ to ‘nil’. To insert the capture at point in an Org buffer, call ‘org-capture’ with a ‘C-0’ prefix argument. @@ -6492,8 +6735,8 @@ with a ‘C-0’ prefix argument.  File: org, Node: Capture templates, Prev: Using capture, Up: Capture -9.1.3 Capture templates ------------------------ +10.1.3 Capture templates +------------------------ You can use templates for different types of capture items, and for different target locations. The easiest way to create such templates is @@ -6515,7 +6758,7 @@ configuration would look like: ("j" "Journal" entry (file+datetree "~/org/journal.org") "* %?\nEntered on %U\n %i\n %a"))) -If you then press ‘t’ from the capture menu, Org will prepare the + If you then press ‘t’ from the capture menu, Org will prepare the template for you like this: * TODO @@ -6531,7 +6774,7 @@ place where you started the capture process. going through the interactive template selection, you can create your key binding like this: - (define-key global-map "\C-cx" + (define-key global-map (kbd "C-c x") (lambda () (interactive) (org-capture nil "x"))) * Menu: @@ -6543,8 +6786,8 @@ key binding like this:  File: org, Node: Template elements, Next: Template expansion, Up: Capture templates -9.1.3.1 Template elements -......................... +10.1.3.1 Template elements +.......................... Now lets look at the elements of a template definition. Each entry in ‘org-capture-templates’ is a list with the following items: @@ -6639,9 +6882,12 @@ template The template for creating the capture item. If you leave this empty, an appropriate default template will be used. Otherwise this is a string with escape codes, which will be replaced - depending on time and context of the capture call. The string with - escapes may be loaded from a template file, using the special - syntax ‘(file "template filename")’. See below for more details. + depending on time and context of the capture call. You may also + get this template string from a file(3), or dynamically, from a + function using either syntax: + + (file "/path/to/template-file") + (function FUNCTION-RETURNING-THE-TEMPLATE) properties The rest of the entry is a property list of additional options. @@ -6715,11 +6961,14 @@ properties. Please rewrite your date/week-tree targets using level, months or ISO weeks as sublevels and then dates on the lowest level. Tags are allowed in the tree structure. + (3) When the file name is not absolute, Org assumes it is relative to +‘org-directory’. +  File: org, Node: Template expansion, Next: Templates in contexts, Prev: Template elements, Up: Capture templates -9.1.3.2 Template expansion -.......................... +10.1.3.2 Template expansion +........................... In the template itself, special “%-escapes”(1) allow dynamic insertion of content. The templates are expanded in the order given here: @@ -6846,13 +7095,13 @@ Types::), any property you store with ‘org-store-link-props’ can be accessed in capture templates in a similar way. (3) This is always the other, not the user. See the variable -‘org-from-is-user-regexp’. +‘org-link-from-user-regexp’.  File: org, Node: Templates in contexts, Prev: Template expansion, Up: Capture templates -9.1.3.3 Templates in contexts -............................. +10.1.3.3 Templates in contexts +.............................. To control whether a capture template should be accessible from a specific context, you can customize ‘org-capture-templates-contexts’. @@ -6872,28 +7121,44 @@ template. In that case, add this command key like this: See the docstring of the variable for more information.  -File: org, Node: Attachments, Next: RSS Feeds, Prev: Capture, Up: Capture Refile Archive +File: org, Node: Attachments, Next: RSS Feeds, Prev: Capture, Up: Capture and Attachments -9.2 Attachments -=============== +10.2 Attachments +================ + +It is often useful to associate reference material with an outline node. +Small chunks of plain text can simply be stored in the subtree of a +project. Hyperlinks (see *note Hyperlinks::) can establish associations +with files that live elsewhere on your computer or in the cloud, like +emails or source code files belonging to a project. + + Another method is _attachments_, which are files located in a +directory belonging to an outline node. Org uses directories either +named by a unique ID of each entry, or by a ‘DIR’ property. + +* Menu: + +* Attachment defaults and dispatcher:: How to access attachment commands +* Attachment options:: Configuring the attachment system +* Attachment links:: Hyperlink access to attachments +* Automatic version-control with Git:: Everything safely stored away +* Attach from Dired:: Using dired to select an attachment + + +File: org, Node: Attachment defaults and dispatcher, Next: Attachment options, Up: Attachments -It is often useful to associate reference material with an outline -node/task. Small chunks of plain text can simply be stored in the -subtree of a project. Hyperlinks (see *note Hyperlinks::) can establish -associations with files that live elsewhere on your computer or in the -cloud, like emails or source code files belonging to a project. Another -method is _attachments_, which are files located in a directory -belonging to an outline node. Org uses directories named by the unique -ID of each entry. These directories are located in the ‘data/’ -directory which lives in the same directory where your Org file -lives(1). If you initialize this directory with ‘git init’, Org -automatically commits changes when it sees them. The attachment system -has been contributed to Org by John Wiegley. - - In cases where it seems better to do so, you can attach a directory -of your choice to an entry. You can also make children inherit the -attachment directory from a parent, so that an entire subtree uses the -same attached directory. +10.2.1 Attachment defaults and dispatcher +----------------------------------------- + +By default, org-attach will use ID properties when adding attachments to +outline nodes. This makes working with attachments fully automated. +There is no decision needed for folder-name or location. ID-based +directories are by default located in the ‘data/’ directory, which lives +in the same directory where your Org file lives(1). For more control +over the setup, see *note Attachment options::. + + When attachments are made using ‘org-attach’ a default tag ‘ATTACH’ +is added to the node that gets the attachments. The following commands deal with attachments: @@ -6912,6 +7177,10 @@ same attached directory. Attach a file using the copy/move/link method. Note that hard links are not supported on all systems. + ‘b’ (‘org-attach-buffer’) + Select a buffer and save it as a file in the task’s attachment + directory. + ‘n’ (‘org-attach-new’) Create a new attachment as an Emacs buffer. @@ -6943,17 +7212,148 @@ same attached directory. ‘s’ (‘org-attach-set-directory’) Set a specific directory as the entry’s attachment directory. - This works by putting the directory path into the ‘ATTACH_DIR’ + This works by putting the directory path into the ‘DIR’ property. - ‘i’ (‘org-attach-set-inherit’) - Set the ‘ATTACH_DIR_INHERIT’ property, so that children use - the same directory for attachments as the parent does. + ‘S’ (‘org-attach-unset-directory’) + Remove the attachment directory. This command removes the + ‘DIR’ property and asks the user to either move content inside + that folder, if an ‘ID’ property is set, delete the content, + or to leave the attachment directory as is but no longer + attached to the outline node. + + ---------- Footnotes ---------- + + (1) If you move entries or Org files from one directory to another, +you may want to configure ‘org-attach-id-dir’ to contain an absolute +path. + + +File: org, Node: Attachment options, Next: Attachment links, Prev: Attachment defaults and dispatcher, Up: Attachments + +10.2.2 Attachment options +------------------------- + +There are a couple of options for attachments that are worth mentioning. + +‘org-attach-id-dir’ + The directory where attachments are stored when ‘ID’ is used as + method. + +‘org-attach-dir-relative’ + When setting the ‘DIR’ property on a node using ‘C-c C-a s’ + (‘org-attach-set-directory’), absolute links are entered by + default. This option changes that to relative links. + +‘org-attach-use-inheritance’ + By default folders attached to an outline node are inherited from + parents according to ‘org-use-property-inheritance’. If one + instead want to set inheritance specifically for org-attach that + can be done using ‘org-attach-use-inheritance’. Inheriting + documents through the node hierarchy makes a lot of sense in most + cases. Especially since the introduction of *note Attachment + links::. The following example shows one use case for attachment + inheritance: + + * Chapter A ... + :PROPERTIES: + :DIR: Chapter A/ + :END: + ** Introduction + Some text + + #+NAME: Image 1 + [[Attachment:image 1.jpg]] + + Without inheritance one would not be able to resolve the link to + image ‘1.jpg’, since the link is inside a sub-heading to ‘Chapter + A’. + + Inheritance works the same way for both ‘ID’ and ‘DIR’ property. + If both properties are defined on the same headline then ‘DIR’ + takes precedence. This is also true if inheritance is enabled. If + ‘DIR’ is inherited from a parent node in the outline, that property + still takes precedence over an ‘ID’ property defined on the node + itself. + +‘org-attach-method’ + When attaching files using the dispatcher ‘C-c C-a’ it defaults to + copying files. The behavior can be changed by customizing + ‘org-attach-method’. Options are Copy, Move/Rename, Hard link or + Symbolic link. + +‘org-attach-preferred-new-method’ + This customization lets you choose the default way to attach to + nodes without existing ‘ID’ and ‘DIR’ property. It defaults to + ‘id’ but can also be set to ‘dir’, ‘ask’ or ‘nil’. + +‘org-attach-archive-delete’ + Configure this to determine if attachments should be deleted or not + when a subtree that has attachments is archived. + +‘org-attach-auto-tag’ + When attaching files to a heading it will be assigned a tag + according to what is set here. + +‘org-attach-id-to-path-function-list’ + When ‘ID’ is used for attachments, the ID is parsed into a part of + a directory-path. See ‘org-attach-id-uuid-folder-format’ for the + default function. Define a new one and add it as first element in + ‘org-attach-id-to-path-function-list’ if you want the folder + structure in any other way. All functions in this list will be + tried when resolving existing ID’s into paths, to maintain backward + compatibility with existing folders in your system. + +‘org-attach-expert’ + Do not show the splash buffer with the attach dispatcher when + ‘org-attach-expert’ is set to non-‘nil’. + + See customization group ‘Org Attach’ if you want to change the +default settings. + + +File: org, Node: Attachment links, Next: Automatic version-control with Git, Prev: Attachment options, Up: Attachments + +10.2.3 Attachment links +----------------------- + +Attached files and folders can be referenced using attachment links. +This makes it easy to refer to the material added to an outline node. +Especially if it was attached using the unique ID of the entry! - It is possible to attach files to a subtree from a Dired buffer. To -use this feature, have one window in Dired mode containing the file(s) -to be attached and another window with point in the subtree that shall -get the attachments. In the Dired window, with point on a file, ‘M-x + * TODO Some task + :PROPERTIES: + :ID: 95d50008-c12e-479f-a4f2-cc0238205319 + :END: + See attached document for more information: [[attachment:info.org]] + + See *note External Links:: for more information about these links. + + +File: org, Node: Automatic version-control with Git, Next: Attach from Dired, Prev: Attachment links, Up: Attachments + +10.2.4 Automatic version-control with Git +----------------------------------------- + +If the directory attached to an outline node is a Git repository, Org +can be configured to automatically commit changes to that repository +when it sees them. + + To make Org mode take care of versioning of attachments for you, add +the following to your Emacs config: + + (require 'org-attach-git) + + +File: org, Node: Attach from Dired, Prev: Automatic version-control with Git, Up: Attachments + +10.2.5 Attach from Dired +------------------------ + +It is possible to attach files to a subtree from a Dired buffer. To use +this feature, have one window in Dired mode containing the file(s) to be +attached and another window with point in the subtree that shall get the +attachments. In the Dired window, with point on a file, ‘M-x org-attach-dired-to-subtree’ attaches the file to the subtree using the attachment method set by variable ‘org-attach-method’. When files are marked in the Dired window then all marked files get attached. @@ -6978,17 +7378,11 @@ specific attachment method. (let ((org-attach-method 'cp)) (call-interactively #'org-attach-dired-to-subtree)))))) - ---------- Footnotes ---------- - - (1) If you move entries or Org files from one directory to another, -you may want to configure ‘org-attach-directory’ to contain an absolute -path. -  -File: org, Node: RSS Feeds, Next: Protocols, Prev: Attachments, Up: Capture Refile Archive +File: org, Node: RSS Feeds, Prev: Attachments, Up: Capture and Attachments -9.3 RSS Feeds -============= +10.3 RSS Feeds +============== Org can add and change entries based on information found in RSS feeds and Atom feeds. You could use this to make a task out of each new @@ -7022,358 +7416,10 @@ adding the same item several times. ‘org-feed.el’ and the docstring of ‘org-feed-alist’.  -File: org, Node: Protocols, Next: Refile and Copy, Prev: RSS Feeds, Up: Capture Refile Archive - -9.4 Protocols for External Access -================================= +File: org, Node: Agenda Views, Next: Markup for Rich Contents, Prev: Capture and Attachments, Up: Top -Org protocol is a means to trigger custom actions in Emacs from external -applications. Any application that supports calling external programs -with an URL as argument may be used with this functionality. For -example, you can configure bookmarks in your web browser to send a link -to the current page to Org and create a note from it using capture (see -*note Capture::). You can also create a bookmark that tells Emacs to -open the local source file of a remote website you are browsing. - - In order to use Org protocol from an application, you need to -register ‘org-protocol://’ as a valid scheme-handler. External calls -are passed to Emacs through the ‘emacsclient’ command, so you also need -to ensure an Emacs server is running. More precisely, when the -application calls - - emacsclient org-protocol://PROTOCOL?key1=val1&key2=val2 - -Emacs calls the handler associated to PROTOCOL with argument ‘(:key1 -val1 :key2 val2)’. - - Org protocol comes with three predefined protocols, detailed in the -following sections. Configure ‘org-protocol-protocol-alist’ to define -your own. - -* Menu: - -* store-link protocol:: Store a link, push URL to kill-ring. -* capture protocol:: Fill a buffer with external information. -* open-source protocol:: Edit published contents. - - -File: org, Node: store-link protocol, Next: capture protocol, Up: Protocols - -9.4.1 ‘store-link’ protocol ---------------------------- - -Using ‘store-link’ handler, you can copy links, insertable through ‘M-x -org-insert-link’ or yanking thereafter. More precisely, the command - - emacsclient org-protocol://store-link?url=URL&title=TITLE - -stores the following link: - - [[URL][TITLE]] - - In addition, URL is pushed on the kill-ring for yanking. You need to -encode URL and TITLE if they contain slashes, and probably quote those -for the shell. - - To use this feature from a browser, add a bookmark with an arbitrary -name, e.g., ‘Org: store-link’ and enter this as _Location_: - - javascript:location.href='org-protocol://store-link?url='+ - encodeURIComponent(location.href); - - -File: org, Node: capture protocol, Next: open-source protocol, Prev: store-link protocol, Up: Protocols - -9.4.2 ‘capture’ protocol ------------------------- - -Activating “capture” handler pops up a ‘Capture’ buffer and fills the -capture template associated to the ‘X’ key with them. - - emacsclient org-protocol://capture?template=X?url=URL?title=TITLE?body=BODY - - To use this feature, add a bookmark with an arbitrary name, e.g., -‘Org: capture’, and enter this as ‘Location’: - - javascript:location.href='org-protocol://capture?template=x'+ - '&url='+encodeURIComponent(window.location.href)+ - '&title='+encodeURIComponent(document.title)+ - '&body='+encodeURIComponent(window.getSelection()); - - The result depends on the capture template used, which is set in the -bookmark itself, as in the example above, or in -‘org-protocol-default-template-key’. - - The following template placeholders are available: - - %:link The URL - %:description The webpage title - %:annotation Equivalent to [[%:link][%:description]] - %i The selected text - - -File: org, Node: open-source protocol, Prev: capture protocol, Up: Protocols - -9.4.3 ‘open-source’ protocol ----------------------------- - -The ‘open-source’ handler is designed to help with editing local sources -when reading a document. To that effect, you can use a bookmark with -the following location: - - javascript:location.href='org-protocol://open-source?&url='+ - encodeURIComponent(location.href) - - The variable ‘org-protocol-project-alist’ maps URLs to local file -names, by stripping URL parameters from the end and replacing the -‘:base-url’ with ‘:working-directory’ and ‘:online-suffix’ with -‘:working-suffix’. For example, assuming you own a local copy of -‘https://orgmode.org/worg/’ contents at ‘/home/user/worg’, you can set -‘org-protocol-project-alist’ to the following - - (setq org-protocol-project-alist - '(("Worg" - :base-url "https://orgmode.org/worg/" - :working-directory "/home/user/worg/" - :online-suffix ".html" - :working-suffix ".org"))) - -If you are now browsing -‘https://orgmode.org/worg/org-contrib/org-protocol.html’ and find a typo -or have an idea about how to enhance the documentation, simply click the -bookmark and start editing. - - However, such mapping may not yield the desired results. Suppose you -maintain an online store located at ‘http://example.com/’. The local -sources reside in ‘/home/user/example/’. It is common practice to serve -all products in such a store through one file and rewrite URLs that do -not match an existing file on the server. That way, a request to -‘http://example.com/print/posters.html’ might be rewritten on the server -to something like -‘http://example.com/shop/products.php/posters.html.php’. The -‘open-source’ handler probably cannot find a file named -‘/home/user/example/print/posters.html.php’ and fails. - - Such an entry in ‘org-protocol-project-alist’ may hold an additional -property ‘:rewrites’. This property is a list of cons cells, each of -which maps a regular expression to a path relative to the -‘:working-directory’. - - Now map the URL to the path ‘/home/user/example/products.php’ by -adding ‘:rewrites’ rules like this: - - (setq org-protocol-project-alist - '(("example.com" - :base-url "http://example.com/" - :working-directory "/home/user/example/" - :online-suffix ".php" - :working-suffix ".php" - :rewrites (("example.com/print/" . "products.php") - ("example.com/$" . "index.php"))))) - -Since ‘example.com/$’ is used as a regular expression, it maps -‘http://example.com/’, ‘https://example.com’, ‘http://www.example.com/’ -and similar to ‘/home/user/example/index.php’. - - The ‘:rewrites’ rules are searched as a last resort if and only if no -existing file name is matched. - - Two functions can help you filling ‘org-protocol-project-alist’ with -valid contents: ‘org-protocol-create’ and ‘org-protocol-create-for-org’. -The latter is of use if you’re editing an Org file that is part of a -publishing project. - - -File: org, Node: Refile and Copy, Next: Archiving, Prev: Protocols, Up: Capture Refile Archive - -9.5 Refile and Copy -=================== - -When reviewing the captured data, you may want to refile or to copy some -of the entries into a different list, for example into a project. -Cutting, finding the right location, and then pasting the note is -cumbersome. To simplify this process, you can use the following special -command: - -‘C-c M-w’ (‘org-copy’) - Copying works like refiling, except that the original note is not - deleted. - -‘C-c C-w’ (‘org-refile’) - Refile the entry or region at point. This command offers possible - locations for refiling the entry and lets you select one with - completion. The item (or all items in the region) is filed below - the target heading as a subitem. Depending on - ‘org-reverse-note-order’, it is either the first or last subitem. - - By default, all level 1 headlines in the current buffer are - considered to be targets, but you can have more complex definitions - across a number of files. See the variable ‘org-refile-targets’ - for details. If you would like to select a location via a - file-path-like completion along the outline path, see the variables - ‘org-refile-use-outline-path’ and - ‘org-outline-path-complete-in-steps’. If you would like to be able - to create new nodes as new parents for refiling on the fly, check - the variable ‘org-refile-allow-creating-parent-nodes’. When the - variable ‘org-log-refile’(1) is set, a timestamp or a note is - recorded whenever an entry is refiled. - -‘C-u C-c C-w’ - Use the refile interface to jump to a heading. - -‘C-u C-u C-c C-w’ (‘org-refile-goto-last-stored’) - Jump to the location where ‘org-refile’ last moved a tree to. - -‘C-2 C-c C-w’ - Refile as the child of the item currently being clocked. - -‘C-3 C-c C-w’ - Refile and keep the entry in place. Also see ‘org-refile-keep’ to - make this the default behavior, and beware that this may result in - duplicated ‘ID’ properties. - -‘C-0 C-c C-w’ or ‘C-u C-u C-u C-c C-w’ (‘org-refile-cache-clear’) - Clear the target cache. Caching of refile targets can be turned on - by setting ‘org-refile-use-cache’. To make the command see new - possible targets, you have to clear the cache with this command. - - ---------- Footnotes ---------- - - (1) Note the corresponding ‘STARTUP’ options ‘logrefile’, -‘lognoterefile’, and ‘nologrefile’. - - -File: org, Node: Archiving, Prev: Refile and Copy, Up: Capture Refile Archive - -9.6 Archiving -============= - -When a project represented by a (sub)tree is finished, you may want to -move the tree out of the way and to stop it from contributing to the -agenda. Archiving is important to keep your working files compact and -global searches like the construction of agenda views fast. - -‘C-c C-x C-a’ (‘org-archive-subtree-default’) - Archive the current entry using the command specified in the - variable ‘org-archive-default-command’. - -* Menu: - -* Moving subtrees:: Moving a tree to an archive file. -* Internal archiving:: Switch off a tree but keep it in the file. - - -File: org, Node: Moving subtrees, Next: Internal archiving, Up: Archiving - -9.6.1 Moving a tree to an archive file --------------------------------------- - -The most common archiving action is to move a project tree to another -file, the archive file. - -‘C-c C-x C-s’ or short ‘C-c $’ (‘org-archive-subtree’) - Archive the subtree starting at point position to the location - given by ‘org-archive-location’. - -‘C-u C-c C-x C-s’ - Check if any direct children of the current headline could be moved - to the archive. To do this, check each subtree for open TODO - entries. If none is found, the command offers to move it to the - archive location. If point is _not_ on a headline when this - command is invoked, check level 1 trees. - -‘C-u C-u C-c C-x C-s’ - As above, but check subtree for timestamps instead of TODO entries. - The command offers to archive the subtree if it _does_ contain a - timestamp, and that timestamp is in the past. - - The default archive location is a file in the same directory as the -current file, with the name derived by appending ‘_archive’ to the -current file name. You can also choose what heading to file archived -items under, with the possibility to add them to a datetree in a file. -For information and examples on how to specify the file and the heading, -see the documentation string of the variable ‘org-archive-location’. - - There is also an in-buffer option for setting this variable, for -example: - - #+ARCHIVE: %s_done:: - - If you would like to have a special archive location for a single -entry or a (sub)tree, give the entry an ‘ARCHIVE’ property with the -location as the value (see *note Properties and Columns::). - - When a subtree is moved, it receives a number of special properties -that record context information like the file from where the entry came, -its outline path the archiving time etc. Configure the variable -‘org-archive-save-context-info’ to adjust the amount of information -added. - - -File: org, Node: Internal archiving, Prev: Moving subtrees, Up: Archiving - -9.6.2 Internal archiving ------------------------- - -If you want to just switch off—for agenda views—certain subtrees without -moving them to a different file, you can use the ‘ARCHIVE’ tag. - - A headline that is marked with the ‘ARCHIVE’ tag (see *note Tags::) -stays at its location in the outline tree, but behaves in the following -way: - - • It does not open when you attempt to do so with a visibility - cycling command (see *note Visibility Cycling::). You can force - cycling archived subtrees with ‘C-’, or by setting the option - ‘org-cycle-open-archived-trees’. Also normal outline commands, - like ‘outline-show-all’, open archived subtrees. - - • During sparse tree construction (see *note Sparse Trees::), matches - in archived subtrees are not exposed, unless you configure the - option ‘org-sparse-tree-open-archived-trees’. - - • During agenda view construction (see *note Agenda Views::), the - content of archived trees is ignored unless you configure the - option ‘org-agenda-skip-archived-trees’, in which case these trees - are always included. In the agenda you can press ‘v a’ to get - archives temporarily included. - - • Archived trees are not exported (see *note Exporting::), only the - headline is. Configure the details using the variable - ‘org-export-with-archived-trees’. - - • Archived trees are excluded from column view unless the variable - ‘org-columns-skip-archived-trees’ is configured to ‘nil’. - - The following commands help manage the ‘ARCHIVE’ tag: - -‘C-c C-x a’ (‘org-toggle-archive-tag’) - Toggle the archive tag for the current headline. When the tag is - set, the headline changes to a shadowed face, and the subtree below - it is hidden. - -‘C-u C-c C-x a’ - Check if any direct children of the current headline should be - archived. To do this, check each subtree for open TODO entries. - If none is found, the command offers to set the ‘ARCHIVE’ tag for - the child. If point is _not_ on a headline when this command is - invoked, check the level 1 trees. - -‘C-’ (‘org-force-cycle-archived’) - Cycle a tree even if it is tagged with ‘ARCHIVE’. - -‘C-c C-x A’ (‘org-archive-to-archive-sibling’) - Move the current entry to the _Archive Sibling_. This is a sibling - of the entry with the heading ‘Archive’ and the archive tag. The - entry becomes a child of that sibling and in this way retains a lot - of its original context, including inherited tags and approximate - position in the outline. - - -File: org, Node: Agenda Views, Next: Markup for Rich Contents, Prev: Capture Refile Archive, Up: Top - -10 Agenda Views -*************** +11 Agenda Views +*************** Due to the way Org works, TODO items, time-stamped items, and tagged headlines can be scattered throughout a file or even a number of files. @@ -7429,7 +7475,7 @@ the window configuration is restored when the agenda exits:  File: org, Node: Agenda Files, Next: Agenda Dispatcher, Up: Agenda Views -10.1 Agenda Files +11.1 Agenda Files ================= The information to be shown is normally collected from all _agenda @@ -7455,7 +7501,7 @@ easiest way to maintain it is through the following commands Cycle through agenda file list, visiting one file after the other. ‘M-x org-switchb’ - Command to use an iswitchb-like interface to switch to and between + Command to use an Iswitchb-like interface to switch to and between Org buffers. The Org menu contains the current list of files and can be used to visit @@ -7505,7 +7551,7 @@ command actually limits the command to the current file, and ignores  File: org, Node: Agenda Dispatcher, Next: Built-in Agenda Views, Prev: Agenda Files, Up: Agenda Views -10.2 The Agenda Dispatcher +11.2 The Agenda Dispatcher ========================== The views are created through a dispatcher, accessible with ‘M-x @@ -7517,10 +7563,12 @@ commands: ‘a’ Create the calendar-like agenda (see *note Weekly/daily agenda::). -‘t’ or ‘T’ +‘t’ +‘T’ Create a list of all TODO items (see *note Global TODO list::). -‘m’ or ‘M’ +‘m’ +‘M’ Create a list of headlines matching a given expression (see *note Matching tags and properties::). @@ -7536,11 +7584,13 @@ commands: ‘multi-occur’. A prefix argument can be used to specify the number of context lines for each match, default is 1. -‘#’ or ‘!’ +‘#’ +‘!’ Create a list of stuck projects (see *note Stuck projects::). ‘<’ - Restrict an agenda command to the current buffer(1). After + Restrict an agenda command to the current buffer(1). If narrowing + is in effect restrict to the narrowed part of the buffer. After pressing ‘<’, you still need to press the character selecting the command. @@ -7578,7 +7628,7 @@ the current region/subtree.  File: org, Node: Built-in Agenda Views, Next: Presentation and Sorting, Prev: Agenda Dispatcher, Up: Agenda Views -10.3 The Built-in Agenda Views +11.3 The Built-in Agenda Views ============================== In this section we describe the built-in views. @@ -7594,7 +7644,7 @@ In this section we describe the built-in views.  File: org, Node: Weekly/daily agenda, Next: Global TODO list, Up: Built-in Agenda Views -10.3.1 Weekly/daily agenda +11.3.1 Weekly/daily agenda -------------------------- The purpose of the weekly/daily _agenda_ is to act like a page of a @@ -7645,13 +7695,13 @@ current date works in the agenda buffer, as well as the commands ‘S’, convert to other calendars, respectively. ‘c’ can be used to switch back and forth between calendar and agenda. - If you are using the diary only for S-exp entries and holidays, it is -faster to not use the above setting, but instead to copy or even move -the entries into an Org file. Org mode evaluates diary-style sexp -entries, and does it faster because there is no overhead for first -creating the diary display. Note that the sexp entries must start at -the left margin, no whitespace is allowed before them, as seen in the -following segment of an Org file:(2) + If you are using the diary only for expression entries and holidays, +it is faster to not use the above setting, but instead to copy or even +move the entries into an Org file. Org mode evaluates diary-style +expression entries, and does it faster because there is no overhead for +first creating the diary display. Note that the expression entries must +start at the left margin, no whitespace is allowed before them, as seen +in the following segment of an Org file:(2) * Holidays :PROPERTIES: @@ -7686,7 +7736,7 @@ Basically, you need a field named ‘anniversary’ for the BBDB record which contains the date in the format ‘YYYY-MM-DD’ or ‘MM-DD’, followed by a space and the class of the anniversary (‘birthday’, ‘wedding’, or a format string). If you omit the class, it defaults to ‘birthday’. Here -are a few examples, the header for the file ‘org-bbdb.el’ contains more +are a few examples, the header for the file ‘ol-bbdb.el’ contains more detailed information. 1973-06-22 @@ -7738,7 +7788,7 @@ and therefore independent of the value of ‘calendar-date-style’.  File: org, Node: Global TODO list, Next: Matching tags and properties, Prev: Weekly/daily agenda, Up: Built-in Agenda Views -10.3.2 The global TODO list +11.3.2 The global TODO list --------------------------- The global TODO list contains all unfinished TODO items formatted and @@ -7748,9 +7798,9 @@ collected into a single place. Show the global TODO list. This collects the TODO items from all agenda files (see *note Agenda Views::) into a single buffer. By default, this lists items with a state the is not a DONE state. - The buffer is in ‘agenda-mode’, so there are commands to examine - and manipulate the TODO entries directly from that buffer (see - *note Agenda Commands::). + The buffer is in Agenda mode, so there are commands to examine and + manipulate the TODO entries directly from that buffer (see *note + Agenda Commands::). ‘M-x org-agenda T’ (‘org-todo-list’) Like the above, but allows selection of a specific TODO keyword. @@ -7780,11 +7830,13 @@ it more compact: • Some people view a TODO item that has been _scheduled_ for execution or have a _deadline_ (see *note Timestamps::) as no longer _open_. Configure the variables - ‘org-agenda-todo-ignore-scheduled’, - ‘org-agenda-todo-ignore-deadlines’, - ‘org-agenda-todo-ignore-timestamp’ and/or - ‘org-agenda-todo-ignore-with-date’ to exclude such items from the - global TODO list. + ‘org-agenda-todo-ignore-scheduled’ to exclude some or all scheduled + items from the global TODO list, ‘org-agenda-todo-ignore-deadlines’ + to exclude some or all items with a deadline set, + ‘org-agenda-todo-ignore-timestamp’ to exclude some or all items + with an active timestamp other than a DEADLINE or a SCHEDULED + timestamp and/or ‘org-agenda-todo-ignore-with-date’ to exclude + items with at least one active timestamp. • TODO items may have sublevels to break up the task into subtasks. In such cases it may be enough to list only the highest level TODO @@ -7794,7 +7846,7 @@ it more compact:  File: org, Node: Matching tags and properties, Next: Search view, Prev: Global TODO list, Up: Built-in Agenda Views -10.3.3 Matching tags and properties +11.3.3 Matching tags and properties ----------------------------------- If headlines in the agenda files are marked with _tags_ (see *note @@ -7943,7 +7995,7 @@ Examples:  File: org, Node: Search view, Next: Stuck projects, Prev: Matching tags and properties, Up: Built-in Agenda Views -10.3.4 Search view +11.3.4 Search view ------------------ This agenda view is a general text search facility for Org mode entries. @@ -7966,7 +8018,8 @@ matched by the regular expression ‘8\.11[bg]’, meaning to exclude both search, other ‘+’ characters are optional. For more details, see the docstring of the command ‘org-search-view’. - You can incrementally adjust a boolean search with the following keys + You can incrementally and conveniently adjust a boolean search from +the agenda search view with the following keys ‘[’ Add a positive search word ‘]’ Add a negative search word @@ -7979,7 +8032,7 @@ the files listed in ‘org-agenda-text-search-extra-files’.  File: org, Node: Stuck projects, Prev: Search view, Up: Built-in Agenda Views -10.3.5 Stuck projects +11.3.5 Stuck projects --------------------- If you are following a system like David Allen’s GTD to organize your @@ -8024,7 +8077,7 @@ this entry is searched for stuck projects.  File: org, Node: Presentation and Sorting, Next: Agenda Commands, Prev: Built-in Agenda Views, Up: Agenda Views -10.4 Presentation and Sorting +11.4 Presentation and Sorting ============================= Before displaying items in an agenda view, Org mode visually prepares @@ -8041,12 +8094,12 @@ cleaned-up version of the outline headline associated with the item. * Categories:: Not all tasks are equal. * Time-of-day specifications:: How the agenda knows the time. * Sorting of agenda items:: The order of things. -* Filtering/limiting agenda times:: Dynamically narrow the agenda. +* Filtering/limiting agenda items:: Dynamically narrow the agenda.  File: org, Node: Categories, Next: Time-of-day specifications, Up: Presentation and Sorting -10.4.1 Categories +11.4.1 Categories ----------------- The category is a broad label assigned to each agenda item. By default, @@ -8060,15 +8113,13 @@ specify it with a special line in the buffer, like this: category you want to apply as the value. The display in the agenda buffer looks best if the category is not -longer than 10 characters. - - You can set up icons for category by customizing the -‘org-agenda-category-icon-alist’ variable. +longer than 10 characters. You can set up icons for category by +customizing the ‘org-agenda-category-icon-alist’ variable.  File: org, Node: Time-of-day specifications, Next: Sorting of agenda items, Prev: Categories, Up: Presentation and Sorting -10.4.2 Time-of-day specifications +11.4.2 Time-of-day specifications --------------------------------- Org mode checks each agenda item for a time-of-day specification. The @@ -8121,9 +8172,9 @@ timed entries are embedded in a time grid, like ‘org-agenda-search-headline-for-time’ variable to a ‘nil’ value.  -File: org, Node: Sorting of agenda items, Next: Filtering/limiting agenda times, Prev: Time-of-day specifications, Up: Presentation and Sorting +File: org, Node: Sorting of agenda items, Next: Filtering/limiting agenda items, Prev: Time-of-day specifications, Up: Presentation and Sorting -10.4.3 Sorting of agenda items +11.4.3 Sorting of agenda items ------------------------------ Before being inserted into a view, the items are sorted. How this is @@ -8153,89 +8204,57 @@ done depends on the type of view. the estimated effort of an entry (see *note Effort Estimates::).  -File: org, Node: Filtering/limiting agenda times, Prev: Sorting of agenda items, Up: Presentation and Sorting +File: org, Node: Filtering/limiting agenda items, Prev: Sorting of agenda items, Up: Presentation and Sorting -10.4.4 Filtering/limiting agenda times +11.4.4 Filtering/limiting agenda items -------------------------------------- -Agenda built-in or customized commands are statically defined. Agenda -filters and limits provide two ways of dynamically narrowing down the -list of agenda entries: _filters_ and _limits_. Filters only act on the -display of the items, while limits take effect before the list of agenda -entries is built. Filters are more often used interactively, while -limits are mostly useful when defined as local variables within custom -agenda commands. +Agenda built-in or custom commands are statically defined. Agenda +filters and limits allow to flexibly narrow down the list of agenda +entries. + + _Filters_ only change the visibility of items, are very fast and are +mostly used interactively(1). You can switch quickly between different +filters without having to recreate the agenda. _Limits_ on the other +hand take effect before the agenda buffer is populated, so they are +mostly useful when defined as local variables within custom agenda +commands. Filtering in the agenda ....................... -‘/’ (‘org-agenda-filter-by-tag’) - Filter the agenda view with respect to a tag and/or effort - estimates. The difference between this and a custom agenda command - is that filtering is very fast, so that you can switch quickly - between different filters without having to recreate the agenda.(1) - - You are prompted for a tag selection letter; ‘’ means any tag - at all. Pressing ‘’ at that prompt offers completion to - select a tag, including any tags that do not have a selection - character. The command then hides all entries that do not contain - or inherit this tag. When called with prefix argument, remove the - entries that _do_ have the tag. A second ‘/’ at the prompt turns - off the filter and shows any hidden entries. Pressing ‘+’ or ‘-’ - switches between filtering and excluding the next tag. - - Org also supports automatic, context-aware tag filtering. If the - variable ‘org-agenda-auto-exclude-function’ is set to a - user-defined function, that function can decide which tags should - be excluded from the agenda automatically. Once this is set, the - ‘/’ command then accepts ‘’ as a sub-option key and runs the - auto exclusion logic. For example, let’s say you use a ‘Net’ tag - to identify tasks which need network access, an ‘Errand’ tag for - errands in town, and a ‘Call’ tag for making phone calls. You - could auto-exclude these tags based on the availability of the - Internet, and outside of business hours, with something like this: - - (defun org-my-auto-exclude-function (tag) - (and (cond - ((string= tag "Net") - (/= 0 (call-process "/sbin/ping" nil nil nil - "-c1" "-q" "-t1" "mail.gnu.org"))) - ((or (string= tag "Errand") (string= tag "Call")) - (let ((hour (nth 2 (decode-time)))) - (or (< hour 8) (> hour 21))))) - (concat "-" tag))) - - (setq org-agenda-auto-exclude-function 'org-my-auto-exclude-function) +The general filtering command is ‘org-agenda-filter’, bound to ‘/’. +Before we introduce it, we describe commands for individual filter +types. All filtering commands handle prefix arguments in the same way: +A single ‘C-u’ prefix negates the filter, so it removes lines selected +by the filter. A double prefix adds the new filter condition to the +one(s) already in place, so filter elements are accumulated. + +‘\’ (‘org-agenda-filter-by-tag’) + Filter the agenda view with respect to a tag. You are prompted for + a tag selection letter; ‘’ means any tag at all. Pressing + ‘’ at that prompt offers completion to select a tag, including + any tags that do not have a selection character. The command then + hides all entries that do not contain or inherit this tag. + Pressing ‘+’ or ‘-’ at the prompt switches between filtering for + and against the next tag. To clear the filter, press ‘\’ twice + (once to call the command again, and once at the prompt). ‘<’ (‘org-agenda-filter-by-category’) - Filter the current agenda view with respect to the category of the - item at point. Pressing ‘<’ another time removes this filter. - When called with a prefix argument exclude the category of the item - at point from the agenda. - - You can add a filter preset in custom agenda commands through the - option ‘org-agenda-category-filter-preset’. See *note Setting - options::. - -‘^’ (‘org-agenda-filter-by-top-headline’) - Filter the current agenda view and only display the siblings and - the parent headline of the one at point. + Filter by category of the line at point, and show only entries with + this category. When called with a prefix argument, hide all + entries with the category at point. To clear the filter, call this + command again by pressing ‘<’. ‘=’ (‘org-agenda-filter-by-regexp’) Filter the agenda view by a regular expression: only show agenda - entries matching the regular expression the user entered. When - called with a prefix argument, it filters _out_ entries matching - the regexp. Called in a regexp-filtered agenda view, remove the - filter, unless there are two universal prefix arguments, in which - case filters are cumulated. - - You can add a filter preset in custom agenda commands through the - option ‘org-agenda-regexp-filter-preset’. See *note Setting - options::. + entries matching the regular expression the user entered. To clear + the filter, call the command again by pressing ‘=’. ‘_’ (‘org-agenda-filter-by-effort’) - Filter the agenda view with respect to effort estimates. You first - need to set up allowed efforts globally, for example + Filter the agenda view with respect to effort estimates, so select + tasks that take the right amount of time. You first need to set up + a list of efforts globally, for example (setq org-global-properties '(("Effort_ALL". "0 0:10 0:30 1:00 2:00 3:00 4:00"))) @@ -8247,19 +8266,68 @@ Filtering in the agenda smaller-or-equal, equal, or larger-or-equal than the selected value. For application of the operator, entries without a defined effort are treated according to the value of - ‘org-sort-agenda-noeffort-is-high’. - - When called with a prefix argument, it removes entries matching the - condition. With two universal prefix arguments, it clears effort - filters, which can be accumulated. + ‘org-sort-agenda-noeffort-is-high’. To clear the filter, press ‘_’ + twice (once to call the command again, and once at the first + prompt). - You can add a filter preset in custom agenda commands through the - option ‘org-agenda-effort-filter-preset’. See *note Setting - options::. +‘^’ (‘org-agenda-filter-by-top-headline’) + Filter the current agenda view and only display items that fall + under the same top-level headline as the current entry. To clear + the filter, call this command again by pressing ‘^’. + +‘/’ (‘org-agenda-filter’) + This is the unified interface to four of the five filter methods + described above. At the prompt, specify different filter elements + in a single string, with full completion support. For example, + + +work-John+<0:10-/plot/ + + selects entries with category ‘work’ and effort estimates below 10 + minutes, and deselects entries with tag ‘John’ or matching the + regexp ‘plot’. You can leave ‘+’ out if that does not lead to + ambiguities. The sequence of elements is arbitrary. The filter + syntax assumes that there is no overlap between categories and + tags. Otherwise, tags take priority. If you reply to the prompt + with the empty string, all filtering is removed. If a filter is + specified, it replaces all current filters. But if you call the + command with a double prefix argument, or if you add an additional + ‘+’ (e.g., ‘++work’) to the front of the string, the new filter + elements are added to the active ones. A single prefix argument + applies the entire filter in a negative sense. ‘|’ (‘org-agenda-filter-remove-all’) Remove all filters in the current agenda view. +Computed tag filtering +...................... + +If the variable ‘org-agenda-auto-exclude-function’ is set to a +user-defined function, that function can select tags that should be used +as a tag filter when requested. The function will be called with +lower-case versions of all tags represented in the current view. The +function should return ‘"-tag"’ if the filter should remove entries with +that tag, ‘"+tag"’ if only entries with this tag should be kept, or +‘nil’ if that tag is irrelevant. For example, let’s say you use a ‘Net’ +tag to identify tasks which need network access, an ‘Errand’ tag for +errands in town, and a ‘Call’ tag for making phone calls. You could +auto-exclude these tags based on the availability of the Internet, and +outside of business hours, with something like this: + + (defun my-auto-exclude-fn (tag) + (when (cond ((string= tag "net") + (/= 0 (call-process "/sbin/ping" nil nil nil + "-c1" "-q" "-t1" "mail.gnu.org"))) + ((member tag '("errand" "call")) + (let ((hr (nth 2 (decode-time)))) + (or (< hr 8) (> hr 21))))) + (concat "-" tag))) + + (setq org-agenda-auto-exclude-function #'my-auto-exclude-fn) + + You can apply this self-adapting filter by using a triple prefix +argument to ‘org-agenda-filter’, i.e. press ‘C-u C-u C-u /’, or by +pressing ‘’ in ‘org-agenda-filter-by-tag’. + Setting limits for the agenda ............................. @@ -8303,8 +8371,10 @@ rebuilding the agenda: ---------- Footnotes ---------- - (1) Custom commands can preset a filter by binding the variable -‘org-agenda-tag-filter-preset’ as an option. This filter is then + (1) Custom agenda commands can preset a filter by binding one of the +variables ‘org-agenda-tag-filter-preset’, +‘org-agenda-category-filter-preset’, ‘org-agenda-effort-filter-preset’ +or ‘org-agenda-regexp-filter-preset’ as an option. This filter is then applied to the view and persists as a basic filter through refreshes and more secondary filtering. The filter is a global property of the entire agenda view—in a block agenda, you should only set this in the global @@ -8313,7 +8383,7 @@ options section, not in the section of an individual block.  File: org, Node: Agenda Commands, Next: Custom Agenda Views, Prev: Presentation and Sorting, Up: Agenda Views -10.5 Commands in the Agenda Buffer +11.5 Commands in the Agenda Buffer ================================== Entries in the agenda buffer are linked back to the Org file or diary @@ -8441,15 +8511,15 @@ Change display agenda::. ‘v l’ or ‘v L’ or short ‘l’ (‘org-agenda-log-mode’) - Toggle Logbook mode. In Logbook mode, entries that were marked - DONE while logging was on (see the variable ‘org-log-done’) are + Toggle Logbook mode. In Logbook mode, entries that were marked as + done while logging was on (see the variable ‘org-log-done’) are shown in the agenda, as are entries that have been clocked on that day. You can configure the entry types that should be included in log mode using the variable ‘org-agenda-log-mode-items’. When - called with a ‘C-u’ prefix, show all possible logbook entries, - including state changes. When called with two prefix arguments - ‘C-u C-u’, show only logging information, nothing else. ‘v L’ is - equivalent to ‘C-u v l’. + called with a ‘C-u’ prefix argument, show all possible logbook + entries, including state changes. When called with two prefix + arguments ‘C-u C-u’, show only logging information, nothing else. + ‘v L’ is equivalent to ‘C-u v l’. ‘v [’ or short ‘[’ (‘org-agenda-manipulate-query-add’) Include inactive timestamps into the current view. Only for @@ -8542,7 +8612,9 @@ Remote editing ‘t’ (‘org-agenda-todo’) Change the TODO state of the item, both in the agenda and in the - original Org file. + original Org file. A prefix arg is passed through to the + ‘org-todo’ command, so for example a ‘C-u’ prefix are will trigger + taking a note to document the state change. ‘C-S-’ (‘org-agenda-todo-nextset’) Switch to the next set of TODO keywords. @@ -8699,7 +8771,7 @@ Bulk remote editing selected entries removed after the bulk. If you want them to persist, set ‘org-agenda-bulk-persistent-marks’ to ‘t’ or hit ‘p’ at the prompt. - ‘*’ + ‘p’ Toggle persistent marks. ‘$’ @@ -8822,7 +8894,7 @@ ignored.  File: org, Node: Custom Agenda Views, Next: Exporting Agenda Views, Prev: Agenda Commands, Up: Agenda Views -10.6 Custom Agenda Views +11.6 Custom Agenda Views ======================== Custom agenda commands serve two purposes: to store and quickly access @@ -8840,7 +8912,7 @@ commands.  File: org, Node: Storing searches, Next: Block agenda, Up: Custom Agenda Views -10.6.1 Storing searches +11.6.1 Storing searches ----------------------- The first application of custom searches is the definition of keyboard @@ -8868,14 +8940,14 @@ Emacs init file. The following example contains all valid agenda views: ("hp" tags "+home+Peter") ("hk" tags "+home+Kim"))) -The initial string in each entry defines the keys you have to press + The initial string in each entry defines the keys you have to press after the dispatcher command in order to access the command. Usually -this will be just a single character, but if you have many similar -commands, you can also define two-letter combinations where the first -character is the same in several combinations and serves as a prefix -key(1). The second parameter is the search type, followed by the string -or regular expression to be used for the matching. The example above -will therefore define: +this is just a single character, but if you have many similar commands, +you can also define two-letter combinations where the first character is +the same in several combinations and serves as a prefix key(1). The +second parameter is the search type, followed by the string or regular +expression to be used for the matching. The example above will +therefore define: ‘x’ as a global search for agenda entries planned(2) this week/day. @@ -8929,7 +9001,7 @@ planning information is taken into account.  File: org, Node: Block agenda, Next: Setting options, Prev: Storing searches, Up: Custom Agenda Views -10.6.2 Block agenda +11.6.2 Block agenda ------------------- Another possibility is the construction of agenda views that comprise @@ -8958,7 +9030,7 @@ view for office tasks.  File: org, Node: Setting options, Prev: Block agenda, Up: Custom Agenda Views -10.6.3 Setting options for custom commands +11.6.3 Setting options for custom commands ------------------------------------------ Org mode contains a number of variables regulating agenda construction @@ -9034,7 +9106,7 @@ command key ‘r’. In that case, add this command key like this:  File: org, Node: Exporting Agenda Views, Next: Agenda Column View, Prev: Custom Agenda Views, Up: Agenda Views -10.7 Exporting Agenda Views +11.7 Exporting Agenda Views =========================== If you are away from your computer, it can be very useful to have a @@ -9138,8 +9210,9 @@ Information::, for more information. ---------- Footnotes ---------- - (1) For HTML you need to install Hrvoje Nikšić’s ‘htmlize.el’ from -Hrvoje Nikšić’s repository (https://github.com/hniksic/emacs-htmlize). + (1) For HTML you need to install Hrvoje Nikšić’s ‘htmlize.el’ as an +Emacs package from MELPA or from Hrvoje Nikšić’s repository +(https://github.com/hniksic/emacs-htmlize). (2) To create PDF output, the Ghostscript ps2pdf utility must be installed on the system. Selecting a PDF file also creates the @@ -9155,7 +9228,7 @@ examples.  File: org, Node: Agenda Column View, Prev: Exporting Agenda Views, Up: Agenda Views -10.8 Using Column View in the Agenda +11.8 Using Column View in the Agenda ==================================== Column view (see *note Column View::) is normally used to view and edit @@ -9174,12 +9247,15 @@ environment. This causes the following issues: 1. Org needs to make a decision which columns format to use. Since the entries in the agenda are collected from different files, and different files may have different columns formats, this is a - non-trivial problem. Org first checks if the variable + non-trivial problem. Org first checks if ‘org-overriding-columns-format’ is currently set, and if so, takes - the format from there. Otherwise it takes the format associated - with the first item in the agenda, or, if that item does not have a - specific format (defined in a property, or in its file), it uses - ‘org-columns-default-format’. + the format from there. You should set this variable only in the + _local settings section_ of a custom agenda command (see *note + Custom Agenda Views::) to make it valid for that specific agenda + view. If no such binding exists, it checks, in sequence, + ‘org-columns-default-format-for-agenda’, the format associated with + the first item in the agenda (through a property or a ‘#+COLUMNS’ + setting in that buffer) and finally ‘org-columns-default-format’. 2. If any of the columns has a summary type defined (see *note Column attributes::), turning on column view in the agenda visits all @@ -9215,7 +9291,7 @@ environment. This causes the following issues:  File: org, Node: Markup for Rich Contents, Next: Exporting, Prev: Agenda Views, Up: Top -11 Markup for Rich Contents +12 Markup for Rich Contents *************************** Org is primarily about organizing and searching through your plain-text @@ -9238,11 +9314,12 @@ currently reading. * Images:: Display an image. * Captions:: Describe tables, images... * Horizontal Rules:: Make a line. +* Creating Footnotes:: Edit and read footnotes.  File: org, Node: Paragraphs, Next: Emphasis and Monospace, Up: Markup for Rich Contents -11.1 Paragraphs +12.1 Paragraphs =============== Paragraphs are separated by at least one empty line. If you need to @@ -9279,12 +9356,12 @@ right margin. You can include quotations in Org documents like this:  File: org, Node: Emphasis and Monospace, Next: Subscripts and Superscripts, Prev: Paragraphs, Up: Markup for Rich Contents -11.2 Emphasis and Monospace +12.2 Emphasis and Monospace =========================== You can make words ‘*bold*’, ‘/italic/’, ‘_underlined_’, ‘=verbatim=’ and ‘~code~’, and, if you must, ‘+strike-through+’. Text in the code -and verbatim string is not processed for Org mode specific syntax; it is +and verbatim string is not processed for Org specific syntax; it is exported verbatim. To turn off fontification for marked up text, you can set @@ -9294,7 +9371,7 @@ available markup syntax, you can customize ‘org-emphasis-alist’.  File: org, Node: Subscripts and Superscripts, Next: Special Symbols, Prev: Emphasis and Monospace, Up: Markup for Rich Contents -11.3 Subscripts and Superscripts +12.3 Subscripts and Superscripts ================================ ‘^’ and ‘_’ are used to indicate super- and subscripts. To increase the @@ -9316,7 +9393,7 @@ change this convention. For example, when setting this variable to  File: org, Node: Special Symbols, Next: Embedded LaTeX, Prev: Subscripts and Superscripts, Up: Markup for Rich Contents -11.4 Special Symbols +12.4 Special Symbols ==================== You can use LaTeX-like syntax to insert special symbols—named @@ -9366,7 +9443,7 @@ Export Settings::).  File: org, Node: Embedded LaTeX, Next: Literal Examples, Prev: Special Symbols, Up: Markup for Rich Contents -11.5 Embedded LaTeX +12.5 Embedded LaTeX =================== Plain ASCII is normally sufficient for almost all note taking. @@ -9392,7 +9469,7 @@ for simplicity I am blurring this distinction.  File: org, Node: LaTeX fragments, Next: Previewing LaTeX fragments, Up: Embedded LaTeX -11.5.1 LaTeX fragments +12.5.1 LaTeX fragments ---------------------- Org mode can contain LaTeX math fragments, and it supports ways to @@ -9445,7 +9522,7 @@ create images, any LaTeX environment is handled.  File: org, Node: Previewing LaTeX fragments, Next: CDLaTeX mode, Prev: LaTeX fragments, Up: Embedded LaTeX -11.5.2 Previewing LaTeX fragments +12.5.2 Previewing LaTeX fragments --------------------------------- If you have a working LaTeX installation and ‘dvipng’, ‘dvisvgm’ or @@ -9459,14 +9536,16 @@ previewing within Org mode. particular, the ‘:scale’ (and for HTML export, ‘:html-scale’) property of the former can be used to adjust the size of the preview images. -‘C-c C-x C-l’ (‘org-toggle-latex-fragment’) +‘C-c C-x C-l’ (‘org-latex-preview’) Produce a preview image of the LaTeX fragment at point and overlay it over the source code. If there is no fragment at point, process - all fragments in the current entry (between two headlines). When - called with a prefix argument, process the entire subtree. When - called with two prefix arguments, or when point is before the first - headline, process the entire buffer. + all fragments in the current entry—between two headlines. + + When called with a single prefix argument, clear all images in the + current entry. Two prefix arguments produce a preview image for + all fragments in the buffer, while three of them clear all the + images in that buffer. You can turn on the previewing of all LaTeX fragments in a file with @@ -9486,18 +9565,21 @@ variable ‘org-preview-latex-default-process’ accordingly.  File: org, Node: CDLaTeX mode, Prev: Previewing LaTeX fragments, Up: Embedded LaTeX -11.5.3 Using CDLaTeX to enter math +12.5.3 Using CDLaTeX to enter math ---------------------------------- CDLaTeX mode is a minor mode that is normally used in combination with a major LaTeX mode like AUCTeX in order to speed-up insertion of environments and math templates. Inside Org mode, you can make use of some of the features of CDLaTeX mode. You need to install ‘cdlatex.el’ -and ‘texmathp.el’ (the latter comes also with AUCTeX) from -. Do not use CDLaTeX -mode itself under Org mode, but use the light version ‘org-cdlatex-mode’ -that comes as part of Org mode. Turn it on for the current buffer with -‘M-x org-cdlatex-mode’, or for all Org files with +and ‘texmathp.el’ (the latter comes also with AUCTeX) using MELPA +(https://melpa.org/) with the Emacs packaging system +(https://www.gnu.org/software/emacs/manual/html_node/emacs/Package-Installation.html) +or alternatively from +. Do not use +CDLaTeX mode itself under Org mode, but use the special version Org +CDLaTeX minor mode that comes as part of Org. Turn it on for the +current buffer with ‘M-x org-cdlatex-mode’, or for all Org files with (add-hook 'org-mode-hook 'turn-on-org-cdlatex) @@ -9552,7 +9634,7 @@ see the documentation of the function ‘org-inside-LaTeX-fragment-p’.  File: org, Node: Literal Examples, Next: Images, Prev: Embedded LaTeX, Up: Markup for Rich Contents -11.6 Literal Examples +12.6 Literal Examples ===================== You can include literal examples that should not be subjected to markup. @@ -9563,11 +9645,19 @@ source code and similar examples. Some example from a text file. #+END_EXAMPLE - Note that such blocks may be _indented_ in order to align nicely with -indented text and in particular with plain list structure (see *note -Plain Lists::). For simplicity when using small examples, you can also -start the example lines with a colon followed by a space. There may -also be additional whitespace before the colon: + There is one limitation, however. You must insert a comma right +before lines starting with either ‘*’, ‘,*’, ‘#+’ or ‘,#+’, as those may +be interpreted as outlines nodes or some other special syntax. Org +transparently strips these additional commas whenever it accesses the +contents of the block. + + #+BEGIN_EXAMPLE + ,* I am no real headline + #+END_EXAMPLE + + For simplicity when using small examples, you can also start the +example lines with a colon followed by a space. There may also be +additional whitespace before the colon: Here is an example : Some example from a text file. @@ -9622,8 +9712,12 @@ the labels with no parentheses. Here is an example: In line [[(sc)]] we remember the current position. [[(jump)][Line (jump)]] jumps to point-min. - Finally, you can use ‘-i’ to preserve the indentation of a specific -code block (see *note Editing Source Code::). + Source code and examples may be _indented_ in order to align nicely +with the surrounding text, and in particular with plain list structure +(see *note Plain Lists::). By default, Org only retains the relative +indentation between lines, e.g., when exporting the contents of the +block. However, you can use the ‘-i’ switch to also preserve the global +indentation, if it does matter. See *note Editing Source Code::. If the syntax for the label format conflicts with the language syntax, use a ‘-l’ switch to change the format, for example @@ -9641,10 +9735,10 @@ a shortcut is provided (see *note Structure Templates::). ‘C-c '’ (‘org-edit-special’) Edit the source code example at point in its native mode. This works by switching to a temporary buffer with the source code. You - need to exit by pressing ‘C-c '’ again(4). The edited version then + need to exit by pressing ‘C-c '’ again. The edited version then replaces the old version in the Org buffer. Fixed-width regions—where each line starts with a colon followed by a space—are - edited using ‘artist-mode’(5) to allow creating ASCII drawings + edited using Artist mode(4) to allow creating ASCII drawings easily. Using this command in an empty line creates a new fixed-width region. @@ -9672,18 +9766,13 @@ more information on evaluating code blocks. while using line numbers for the links, which might be useful to explain those in an Org mode example code. - (4) Upon exit, lines starting with ‘*’, ‘,*’, ‘#+’ and ‘,#+’ get a -comma prepended, to keep them from being interpreted by Org as outline -nodes or special syntax. These commas are stripped when editing with -‘C-c '’, and also before export. - - (5) You may select a different-mode with the variable + (4) You may select a different mode with the variable ‘org-edit-fixed-width-region-mode’.  File: org, Node: Images, Next: Captions, Prev: Literal Examples, Up: Markup for Rich Contents -11.7 Images +12.7 Images =========== An image is a link to an image file(1) that does not have a description @@ -9700,7 +9789,7 @@ with ‘CAPTION’ and ‘NAME’ keywords as follows: #+NAME: fig:SED-HR4049 [[./img/a.jpg]] -Such images can be displayed within the buffer with the following + Such images can be displayed within the buffer with the following command: ‘C-c C-x C-v’ (‘org-toggle-inline-images’) @@ -9721,7 +9810,7 @@ buffer with the ‘STARTUP’ options ‘inlineimages’ and ‘noinlineimages  File: org, Node: Captions, Next: Horizontal Rules, Prev: Images, Up: Markup for Rich Contents -11.8 Captions +12.8 Captions ============= You can assign a caption to a specific part of a document by inserting a @@ -9741,18 +9830,101 @@ LaTeX equations, source code blocks. Depending on the export back-end, those may or may not be handled.  -File: org, Node: Horizontal Rules, Prev: Captions, Up: Markup for Rich Contents +File: org, Node: Horizontal Rules, Next: Creating Footnotes, Prev: Captions, Up: Markup for Rich Contents -11.9 Horizontal Rules +12.9 Horizontal Rules ===================== A line consisting of only dashes, and at least 5 of them, is exported as a horizontal line. + +File: org, Node: Creating Footnotes, Prev: Horizontal Rules, Up: Markup for Rich Contents + +12.10 Creating Footnotes +======================== + +A footnote is started by a footnote marker in square brackets in column +0, no indentation allowed. It ends at the next footnote definition, +headline, or after two consecutive empty lines. The footnote reference +is simply the marker in square brackets, inside text. Markers always +start with ‘fn:’. For example: + + The Org homepage[fn:1] now looks a lot better than it used to. + ... + [fn:1] The link is: https://orgmode.org + + Org mode extends the number-based syntax to _named_ footnotes and +optional inline definition. Here are the valid references: + +‘[fn:NAME]’ + A named footnote reference, where NAME is a unique label word, or, + for simplicity of automatic creation, a number. + +‘[fn:: This is the inline definition of this footnote]’ + An anonymous footnote where the definition is given directly at the + reference point. + +‘[fn:NAME: a definition]’ + An inline definition of a footnote, which also specifies a name for + the note. Since Org allows multiple references to the same note, + you can then use ‘[fn:NAME]’ to create additional references. + + Footnote labels can be created automatically, or you can create names +yourself. This is handled by the variable ‘org-footnote-auto-label’ and +its corresponding ‘STARTUP’ keywords. See the docstring of that +variable for details. + + The following command handles footnotes: + +‘C-c C-x f’ + The footnote action command. + + When point is on a footnote reference, jump to the definition. + When it is at a definition, jump to the—first—reference. + + Otherwise, create a new footnote. Depending on the variable + ‘org-footnote-define-inline’(1), the definition is placed right + into the text as part of the reference, or separately into the + location determined by the variable ‘org-footnote-section’. + + When this command is called with a prefix argument, a menu of + additional options is offered: + + ‘s’ Sort the footnote definitions by reference sequence. + ‘r’ Renumber the simple ‘fn:N’ footnotes. + ‘S’ Short for first ‘r’, then ‘s’ action. + ‘n’ Rename all footnotes into a ‘fn:1’ ... ‘fn:n’ sequence. + ‘d’ Delete the footnote at point, including definition and + references. + + Depending on the variable ‘org-footnote-auto-adjust’(2), + renumbering and sorting footnotes can be automatic after each + insertion or deletion. + +‘C-c C-c’ + If point is on a footnote reference, jump to the definition. If it + is at the definition, jump back to the reference. When called at a + footnote location with a prefix argument, offer the same menu as + ‘C-c C-x f’. + +‘C-c C-o’ or ‘mouse-1/2’ + Footnote labels are also links to the corresponding definition or + reference, and you can use the usual commands to follow these + links. + + ---------- Footnotes ---------- + + (1) The corresponding in-buffer setting is: ‘#+STARTUP: fninline’ or +‘#+STARTUP: nofninline’. + + (2) The corresponding in-buffer options are ‘#+STARTUP: fnadjust’ and +‘#+STARTUP: nofnadjust’. +  File: org, Node: Exporting, Next: Publishing, Prev: Markup for Rich Contents, Up: Top -12 Exporting +13 Exporting ************ At some point you might want to print your notes, publish them on the @@ -9799,7 +9971,7 @@ the Markdown back-end, add this to your Emacs config: * Macro Replacement:: Use macros to create templates. * Comment Lines:: What will not be exported. * ASCII/Latin-1/UTF-8 export:: Exporting to flat files with encoding. -* Beamer Export:: +* Beamer Export:: Producing presentations and slides. * HTML Export:: Exporting to HTML. * LaTeX Export:: Exporting to LaTeX and processing to PDF. * Markdown Export:: Exporting to Markdown. @@ -9814,7 +9986,7 @@ the Markdown back-end, add this to your Emacs config:  File: org, Node: The Export Dispatcher, Next: Export Settings, Up: Exporting -12.1 The Export Dispatcher +13.1 The Export Dispatcher ========================== The export dispatcher is the main interface for Org’s exports. A @@ -9883,7 +10055,7 @@ further alter what is exported, and how.  File: org, Node: Export Settings, Next: Table of Contents, Prev: The Export Dispatcher, Up: Exporting -12.2 Export Settings +13.2 Export Settings ==================== Export options can be set: globally with variables; for an individual @@ -9996,7 +10168,7 @@ following arguments. link in the output (‘org-export-with-broken-links’). ‘c’ - Toggle inclusion of CLOCK keywords (‘org-export-with-clocks’). + Toggle inclusion of ‘CLOCK’ keywords (‘org-export-with-clocks’). ‘creator’ Toggle inclusion of creator information in the exported file @@ -10059,7 +10231,7 @@ following arguments. ‘tasks’ Toggle inclusion of tasks (TODO items); or ‘nil’ to remove all - tasks; or ‘todo’ to remove DONE tasks; or list the keywords to keep + tasks; or ‘todo’ to remove done tasks; or list the keywords to keep (‘org-export-with-tasks’). ‘tex’ @@ -10110,7 +10282,7 @@ configuration. See *note LaTeX specific export settings::.  File: org, Node: Table of Contents, Next: Include Files, Prev: Export Settings, Up: Exporting -12.3 Table of Contents +13.3 Table of Contents ====================== The table of contents includes all headlines in the document. Its depth @@ -10154,6 +10326,21 @@ file requires the inclusion of the titletoc package. Because of compatibility issues, titletoc has to be loaded _before_ hyperref. Customize the ‘org-latex-default-packages-alist’ variable. + The following example inserts a table of contents that links to the +children of the specified target. + + * Target + :PROPERTIES: + :CUSTOM_ID: TargetSection + :END: + ** Heading A + ** Heading B + * Another section + #+TOC: headlines 1 :target #TargetSection + + The ‘:target’ attribute is supported in HTML, Markdown, ODT, and +ASCII export. + Use the ‘TOC’ keyword to generate list of tables—respectively, all listings—with captions. @@ -10173,7 +10360,7 @@ headline from the table of contents.  File: org, Node: Include Files, Next: Macro Replacement, Prev: Table of Contents, Up: Exporting -12.4 Include Files +13.4 Include Files ================== During export, you can include the content of another file. For @@ -10230,8 +10417,7 @@ with the custom ID ‘theory’, you can use #+INCLUDE: "./paper.org::#theory" :only-contents t - The following command allows navigating back and forth to the -included document: + The following command allows navigating to the included document: ‘C-c '’ (‘org-edit~special’) @@ -10246,7 +10432,7 @@ and named elements.  File: org, Node: Macro Replacement, Next: Comment Lines, Prev: Include Files, Up: Exporting -12.5 Macro Replacement +13.5 Macro Replacement ====================== Macros replace text snippets during export. Macros are defined globally @@ -10346,7 +10532,7 @@ character.  File: org, Node: Comment Lines, Next: ASCII/Latin-1/UTF-8 export, Prev: Macro Replacement, Up: Exporting -12.6 Comment Lines +13.6 Comment Lines ================== Lines starting with zero or more whitespace characters followed by one @@ -10374,7 +10560,7 @@ of a headline.  File: org, Node: ASCII/Latin-1/UTF-8 export, Next: Beamer Export, Prev: Comment Lines, Up: Exporting -12.7 ASCII/Latin-1/UTF-8 export +13.7 ASCII/Latin-1/UTF-8 export =============================== ASCII export produces an output file containing only plain ASCII @@ -10469,7 +10655,7 @@ has these two left and right justification blocks:  File: org, Node: Beamer Export, Next: HTML Export, Prev: ASCII/Latin-1/UTF-8 export, Up: Exporting -12.8 Beamer Export +13.8 Beamer Export ================== Org uses Beamer export to convert an Org file tree structure into @@ -10489,7 +10675,7 @@ popular display formats.  File: org, Node: Beamer export commands, Next: Beamer specific export settings, Up: Beamer Export -12.8.1 Beamer export commands +13.8.1 Beamer export commands ----------------------------- ‘C-c C-e l b’ (‘org-beamer-export-to-latex’) @@ -10513,7 +10699,7 @@ File: org, Node: Beamer export commands, Next: Beamer specific export settings  File: org, Node: Beamer specific export settings, Next: Frames and Blocks in Beamer, Prev: Beamer export commands, Up: Beamer Export -12.8.2 Beamer specific export settings +13.8.2 Beamer specific export settings -------------------------------------- Beamer export back-end has several additional keywords for customizing @@ -10563,7 +10749,7 @@ settings (see *note Export Settings::).  File: org, Node: Frames and Blocks in Beamer, Next: Beamer specific syntax, Prev: Beamer specific export settings, Up: Beamer Export -12.8.3 Frames and Blocks in Beamer +13.8.3 Frames and Blocks in Beamer ---------------------------------- Org transforms heading levels into Beamer’s sectioning elements, frames @@ -10630,7 +10816,7 @@ relevance.  File: org, Node: Beamer specific syntax, Next: Editing support, Prev: Frames and Blocks in Beamer, Up: Beamer Export -12.8.4 Beamer specific syntax +13.8.4 Beamer specific syntax ----------------------------- Since Org’s Beamer export back-end is an extension of the LaTeX @@ -10683,24 +10869,23 @@ or square brackets, and ‘:options’ for inserting optional arguments.  File: org, Node: Editing support, Next: A Beamer example, Prev: Beamer specific syntax, Up: Beamer Export -12.8.5 Editing support +13.8.5 Editing support ---------------------- -The ‘org-beamer-mode’ is a special minor mode for faster editing of -Beamer documents. +Org Beamer mode is a special minor mode for faster editing of Beamer +documents. #+STARTUP: beamer ‘C-c C-b’ (‘org-beamer-select-environment’) - The ‘org-beamer-mode’ provides this key for quicker selections in - Beamer normal environments, and for selecting the ‘BEAMER_COL’ - property. + Org Beamer mode provides this key for quicker selections in Beamer + normal environments, and for selecting the ‘BEAMER_COL’ property.  File: org, Node: A Beamer example, Prev: Editing support, Up: Beamer Export -12.8.6 A Beamer example +13.8.6 A Beamer example ----------------------- Here is an example of an Org document ready for Beamer export. @@ -10740,7 +10925,7 @@ Here is an example of an Org document ready for Beamer export.  File: org, Node: HTML Export, Next: LaTeX Export, Prev: Beamer Export, Up: Exporting -12.9 HTML Export +13.9 HTML Export ================ Org mode contains an HTML exporter with extensive HTML formatting @@ -10753,6 +10938,7 @@ compatible with XHTML 1.0 strict standard. * HTML doctypes:: Exporting various (X)HTML flavors. * HTML preamble and postamble:: Inserting preamble and postamble. * Quoting HTML tags:: Using direct HTML in Org files. +* Headlines in HTML export:: Formatting headlines. * Links in HTML export:: Inserting and formatting links. * Tables in HTML export:: How to modify the formatting of tables. * Images in HTML export:: How to insert figures into HTML output. @@ -10764,7 +10950,7 @@ compatible with XHTML 1.0 strict standard.  File: org, Node: HTML export commands, Next: HTML specific export settings, Up: HTML Export -12.9.1 HTML export commands +13.9.1 HTML export commands --------------------------- ‘C-c C-e h h’ (‘org-html-export-to-html’) @@ -10781,7 +10967,7 @@ File: org, Node: HTML export commands, Next: HTML specific export settings, U  File: org, Node: HTML specific export settings, Next: HTML doctypes, Prev: HTML export commands, Up: HTML Export -12.9.2 HTML specific export settings +13.9.2 HTML specific export settings ------------------------------------ HTML export has a number of keywords, similar to the general options @@ -10840,7 +11026,7 @@ sections of the manual.  File: org, Node: HTML doctypes, Next: HTML preamble and postamble, Prev: HTML specific export settings, Up: HTML Export -12.9.3 HTML doctypes +13.9.3 HTML doctypes -------------------- Org can export to various (X)HTML flavors. @@ -10909,7 +11095,7 @@ the ‘HTML_CONTAINER’ property for the headline.  File: org, Node: HTML preamble and postamble, Next: Quoting HTML tags, Prev: HTML doctypes, Up: HTML Export -12.9.4 HTML preamble and postamble +13.9.4 HTML preamble and postamble ---------------------------------- The HTML exporter has delineations for preamble and postamble. The @@ -10931,15 +11117,14 @@ insert the postamble in the format specified in the a postamble if ‘org-html-postamble’ is set to ‘nil’.  -File: org, Node: Quoting HTML tags, Next: Links in HTML export, Prev: HTML preamble and postamble, Up: HTML Export +File: org, Node: Quoting HTML tags, Next: Headlines in HTML export, Prev: HTML preamble and postamble, Up: HTML Export -12.9.5 Quoting HTML tags +13.9.5 Quoting HTML tags ------------------------ The HTML export back-end transforms ‘<’ and ‘>’ to ‘<’ and ‘>’. - - To include raw HTML code in the Org file so the HTML export back-end -can insert that HTML code in the output, use this inline syntax: +To include raw HTML code in the Org file so the HTML export back-end can +insert that HTML code in the output, use this inline syntax: ‘@@html:...@@’. For example: @@html:@@bold text@@html:@@ @@ -10953,9 +11138,23 @@ can insert that HTML code in the output, use this inline syntax: #+END_EXPORT  -File: org, Node: Links in HTML export, Next: Tables in HTML export, Prev: Quoting HTML tags, Up: HTML Export +File: org, Node: Headlines in HTML export, Next: Links in HTML export, Prev: Quoting HTML tags, Up: HTML Export + +13.9.6 Headlines in HTML export +------------------------------- + +Headlines are exported to ‘

’, ‘

’, etc. Each headline gets the +‘id’ attribute from ‘CUSTOM_ID’ property, or a unique generated value, +see *note Internal Links::. + + When ‘org-html-self-link-headlines’ is set to a non-‘nil’ value, the +text of the headlines is also wrapped in ‘’ tags. These tags have a +‘href’ attribute making the headlines link to themselves. + + +File: org, Node: Links in HTML export, Next: Tables in HTML export, Prev: Headlines in HTML export, Up: HTML Export -12.9.6 Links in HTML export +13.9.7 Links in HTML export --------------------------- The HTML export back-end transforms Org’s internal links (see *note @@ -10985,7 +11184,7 @@ the link’s title and style:  File: org, Node: Tables in HTML export, Next: Images in HTML export, Prev: Links in HTML export, Up: HTML Export -12.9.7 Tables in HTML export +13.9.8 Tables in HTML export ---------------------------- The HTML export back-end uses ‘org-html-table-default-attributes’ when @@ -11026,7 +11225,7 @@ following lines before the table in the Org file:  File: org, Node: Images in HTML export, Next: Math formatting in HTML export, Prev: Tables in HTML export, Up: HTML Export -12.9.8 Images in HTML export +13.9.9 Images in HTML export ---------------------------- The HTML export back-end has features to convert Org image links to HTML @@ -11061,8 +11260,8 @@ as-is.  File: org, Node: Math formatting in HTML export, Next: Text areas in HTML export, Prev: Images in HTML export, Up: HTML Export -12.9.9 Math formatting in HTML export -------------------------------------- +13.9.10 Math formatting in HTML export +-------------------------------------- LaTeX math snippets (see *note LaTeX fragments::) can be displayed in two different ways on HTML pages. The default is to use the MathJax @@ -11114,7 +11313,7 @@ MathJax manual (http://docs.mathjax.org) to learn about extensions.  File: org, Node: Text areas in HTML export, Next: CSS support, Prev: Math formatting in HTML export, Up: HTML Export -12.9.10 Text areas in HTML export +13.9.11 Text areas in HTML export --------------------------------- Before Org mode’s Babel, one popular approach to publishing code in HTML @@ -11142,7 +11341,7 @@ line.  File: org, Node: CSS support, Next: JavaScript support, Prev: Text areas in HTML export, Up: HTML Export -12.9.11 CSS support +13.9.12 CSS support ------------------- You can modify the CSS style definitions for the exported file. The @@ -11204,7 +11403,8 @@ them. Both of these approaches can avoid referring to an external file. In order to add styles to a sub-tree, use the ‘HTML_CONTAINER_CLASS’ property to assign a class to the tree. In order to specify CSS styles for a particular headline, you can use the ID specified in a ‘CUSTOM_ID’ -property. +property. You can also assign a specific class to a headline with the +‘HTML_HEADLINE_CLASS’ property. Never change the ‘org-html-style-default’ constant. Instead use other simpler ways of customizing as described above. @@ -11218,7 +11418,7 @@ the variables ‘org-html-todo-kwd-class-prefix’ and  File: org, Node: JavaScript support, Prev: CSS support, Up: HTML Export -12.9.12 JavaScript supported display of web pages +13.9.13 JavaScript supported display of web pages ------------------------------------------------- Sebastian Rose has written a JavaScript program especially designed to @@ -11293,7 +11493,7 @@ to your pages, configure the variable ‘org-export-html-use-infojs’.  File: org, Node: LaTeX Export, Next: Markdown Export, Prev: HTML Export, Up: Exporting -12.10 LaTeX Export +13.10 LaTeX Export ================== The LaTeX export back-end can handle complex documents, incorporate @@ -11329,7 +11529,7 @@ blank lines to tell apart syntactical elements, such as paragraphs.  File: org, Node: LaTeX/PDF export commands, Next: LaTeX specific export settings, Up: LaTeX Export -12.10.1 LaTeX/PDF export commands +13.10.1 LaTeX/PDF export commands --------------------------------- ‘C-c C-e l l’ (‘org-latex-export-to-latex’) @@ -11369,7 +11569,7 @@ latexmk, can select the correct bibliography compiler.  File: org, Node: LaTeX specific export settings, Next: LaTeX header and sectioning, Prev: LaTeX/PDF export commands, Up: LaTeX Export -12.10.2 LaTeX specific export settings +13.10.2 LaTeX specific export settings -------------------------------------- The LaTeX export back-end has several additional keywords for @@ -11431,7 +11631,7 @@ general options (see *note Export Settings::). ‘SUBTITLE’ The document’s subtitle. It is typeset as per ‘org-latex-subtitle-format’. If ‘org-latex-subtitle-separate’ is - non-‘nil’, it is typed as part of the ‘\title’ macro. See + non-‘nil’, it is typed outside of the ‘\title’ macro. See ‘org-latex-hyperref-template’ for customizing metadata items. See ‘org-latex-title-command’ for typesetting description into the document’s front matter. @@ -11441,7 +11641,7 @@ general options (see *note Export Settings::).  File: org, Node: LaTeX header and sectioning, Next: Quoting LaTeX code, Prev: LaTeX specific export settings, Up: LaTeX Export -12.10.3 LaTeX header and sectioning structure +13.10.3 LaTeX header and sectioning structure --------------------------------------------- The LaTeX export back-end converts the first three of Org’s outline @@ -11488,7 +11688,7 @@ previewing LaTeX snippets (see *note Previewing LaTeX fragments::).  File: org, Node: Quoting LaTeX code, Next: Tables in LaTeX export, Prev: LaTeX header and sectioning, Up: LaTeX Export -12.10.4 Quoting LaTeX code +13.10.4 Quoting LaTeX code -------------------------- The LaTeX export back-end can insert any arbitrary LaTeX code, see *note @@ -11513,7 +11713,7 @@ exports any code between begin and end markers:  File: org, Node: Tables in LaTeX export, Next: Images in LaTeX export, Prev: Quoting LaTeX code, Up: LaTeX Export -12.10.5 Tables in LaTeX export +13.10.5 Tables in LaTeX export ------------------------------ The LaTeX export back-end can pass several LaTeX attributes for table @@ -11617,7 +11817,7 @@ situations, such as matrix product or spanning multiple pages:  File: org, Node: Images in LaTeX export, Next: Plain lists in LaTeX export, Prev: Tables in LaTeX export, Up: LaTeX Export -12.10.6 Images in LaTeX export +13.10.6 Images in LaTeX export ------------------------------ The LaTeX export back-end processes image links in Org files that do not @@ -11629,12 +11829,15 @@ the image. But for TikZ () images, the back-end uses an ‘\input’ macro wrapped within a ‘tikzpicture’ environment. - For specifying image ‘:width’, ‘:height’, and other ‘:options’, use -this syntax: + For specifying image ‘:width’, ‘:height’, ‘:scale’ and other +‘:options’, use this syntax: #+ATTR_LATEX: :width 5cm :options angle=90 [[./img/sed-hr4049.pdf]] + A ‘:scale’ attribute overrides both ‘:width’ and ‘:height’ +attributes. + For custom commands for captions, use the ‘:caption’ attribute. It overrides the default ‘#+CAPTION’ value: @@ -11681,7 +11884,7 @@ export back-end to comment out the ‘\includegraphics’ macro.  File: org, Node: Plain lists in LaTeX export, Next: Source blocks in LaTeX export, Prev: Images in LaTeX export, Up: LaTeX Export -12.10.7 Plain lists in LaTeX export +13.10.7 Plain lists in LaTeX export ----------------------------------- The LaTeX export back-end accepts the ‘environment’ and ‘options’ @@ -11712,7 +11915,7 @@ four:  File: org, Node: Source blocks in LaTeX export, Next: Example blocks in LaTeX export, Prev: Plain lists in LaTeX export, Up: LaTeX Export -12.10.8 Source blocks in LaTeX export +13.10.8 Source blocks in LaTeX export ------------------------------------- The LaTeX export back-end can make source code blocks into floating @@ -11752,7 +11955,7 @@ file, use the ‘org-latex-listings-options’ and  File: org, Node: Example blocks in LaTeX export, Next: Special blocks in LaTeX export, Prev: Source blocks in LaTeX export, Up: LaTeX Export -12.10.9 Example blocks in LaTeX export +13.10.9 Example blocks in LaTeX export -------------------------------------- The LaTeX export back-end wraps the contents of example blocks in a @@ -11770,7 +11973,7 @@ specify a custom environment.  File: org, Node: Special blocks in LaTeX export, Next: Horizontal rules in LaTeX export, Prev: Example blocks in LaTeX export, Up: LaTeX Export -12.10.10 Special blocks in LaTeX export +13.10.10 Special blocks in LaTeX export --------------------------------------- For other special blocks in the Org file, the LaTeX export back-end @@ -11810,7 +12013,7 @@ attribute. It overrides standard ‘CAPTION’ value, if any. For example:  File: org, Node: Horizontal rules in LaTeX export, Prev: Special blocks in LaTeX export, Up: LaTeX Export -12.10.11 Horizontal rules in LaTeX export +13.10.11 Horizontal rules in LaTeX export ----------------------------------------- The LaTeX export back-end converts horizontal rules by the specified @@ -11822,7 +12025,7 @@ The LaTeX export back-end converts horizontal rules by the specified  File: org, Node: Markdown Export, Next: OpenDocument Text Export, Prev: LaTeX Export, Up: Exporting -12.11 Markdown Export +13.11 Markdown Export ===================== The Markdown export back-end, “md”, converts an Org file to Markdown @@ -11857,7 +12060,7 @@ level before the absolute limit (see *note Export Settings::).  File: org, Node: OpenDocument Text Export, Next: Org Export, Prev: Markdown Export, Up: Exporting -12.12 OpenDocument Text Export +13.12 OpenDocument Text Export ============================== The ODT export back-end handles creating of OpenDocument Text (ODT) @@ -11888,7 +12091,7 @@ Version 1.2  File: org, Node: Pre-requisites for ODT export, Next: ODT export commands, Up: OpenDocument Text Export -12.12.1 Pre-requisites for ODT export +13.12.1 Pre-requisites for ODT export ------------------------------------- The ODT export back-end relies on the zip program to create the final @@ -11898,7 +12101,7 @@ executable. Without it, export cannot finish.  File: org, Node: ODT export commands, Next: ODT specific export settings, Prev: Pre-requisites for ODT export, Up: OpenDocument Text Export -12.12.2 ODT export commands +13.12.2 ODT export commands --------------------------- ‘C-c C-e o o’ (‘org-export-to-odt’) @@ -11927,7 +12130,7 @@ File: org, Node: ODT export commands, Next: ODT specific export settings, Pre  File: org, Node: ODT specific export settings, Next: Extending ODT export, Prev: ODT export commands, Up: OpenDocument Text Export -12.12.3 ODT specific export settings +13.12.3 ODT specific export settings ------------------------------------ The ODT export back-end has several additional keywords for customizing @@ -11955,7 +12158,7 @@ ODT output. Setting these keywords works similar to the general options  File: org, Node: Extending ODT export, Next: Applying custom styles, Prev: ODT specific export settings, Up: OpenDocument Text Export -12.12.4 Extending ODT export +13.12.4 Extending ODT export ---------------------------- The ODT export back-end can produce documents in other formats besides @@ -11995,7 +12198,7 @@ Here are some generic commands:  File: org, Node: Applying custom styles, Next: Links in ODT export, Prev: Extending ODT export, Up: OpenDocument Text Export -12.12.5 Applying custom styles +13.12.5 Applying custom styles ------------------------------ The ODT export back-end comes with many OpenDocument styles (see *note @@ -12041,7 +12244,7 @@ problems.  File: org, Node: Links in ODT export, Next: Tables in ODT export, Prev: Applying custom styles, Up: OpenDocument Text Export -12.12.6 Links in ODT export +13.12.6 Links in ODT export --------------------------- ODT exporter creates native cross-references for internal links. It @@ -12058,7 +12261,7 @@ with a cross-reference and sequence number of the labeled entity. See  File: org, Node: Tables in ODT export, Next: Images in ODT export, Prev: Links in ODT export, Up: OpenDocument Text Export -12.12.7 Tables in ODT export +13.12.7 Tables in ODT export ---------------------------- The ODT export back-end handles native Org mode tables (see *note @@ -12102,7 +12305,7 @@ tables in ODT export::.  File: org, Node: Images in ODT export, Next: Math formatting in ODT export, Prev: Tables in ODT export, Up: OpenDocument Text Export -12.12.8 Images in ODT export +13.12.8 Images in ODT export ---------------------------- Embedding images @@ -12187,7 +12390,7 @@ The ODT export back-end can anchor images to ‘as-char’, ‘paragraph’, or  File: org, Node: Math formatting in ODT export, Next: Labels and captions in ODT export, Prev: Images in ODT export, Up: OpenDocument Text Export -12.12.9 Math formatting in ODT export +13.12.9 Math formatting in ODT export ------------------------------------- The ODT exporter has special support for handling math. @@ -12200,7 +12403,7 @@ The ODT exporter has special support for handling math.  File: org, Node: LaTeX math snippets, Next: MathML and OpenDocument formula files, Up: Math formatting in ODT export -12.12.9.1 LaTeX math snippets +13.12.9.1 LaTeX math snippets ............................. LaTeX math snippets (see *note LaTeX fragments::) can be embedded in the @@ -12273,7 +12476,7 @@ PNG images  File: org, Node: MathML and OpenDocument formula files, Prev: LaTeX math snippets, Up: Math formatting in ODT export -12.12.9.2 MathML and OpenDocument formula files +13.12.9.2 MathML and OpenDocument formula files ............................................... When embedding LaTeX math snippets in ODT documents is not reliable, @@ -12290,7 +12493,7 @@ or  File: org, Node: Labels and captions in ODT export, Next: Literal examples in ODT export, Prev: Math formatting in ODT export, Up: OpenDocument Text Export -12.12.10 Labels and captions in ODT export +13.12.10 Labels and captions in ODT export ------------------------------------------ ODT format handles labeling and captioning of objects based on their @@ -12323,7 +12526,7 @@ the following setting:  File: org, Node: Literal examples in ODT export, Next: Advanced topics in ODT export, Prev: Labels and captions in ODT export, Up: OpenDocument Text Export -12.12.11 Literal examples in ODT export +13.12.11 Literal examples in ODT export --------------------------------------- The ODT export back-end supports literal examples (see *note Literal @@ -12342,7 +12545,7 @@ for that source language.  File: org, Node: Advanced topics in ODT export, Prev: Literal examples in ODT export, Up: OpenDocument Text Export -12.12.12 Advanced topics in ODT export +13.12.12 Advanced topics in ODT export -------------------------------------- The ODT export back-end has extensive features useful for power users @@ -12629,7 +12832,7 @@ of the ‘’ element in the OpenDocument-v1.2 specification.  File: org, Node: Org Export, Next: Texinfo Export, Prev: OpenDocument Text Export, Up: Exporting -12.13 Org Export +13.13 Org Export ================ _org_ export back-end creates a normalized version of the Org document @@ -12650,7 +12853,7 @@ Org export commands  File: org, Node: Texinfo Export, Next: iCalendar Export, Prev: Org Export, Up: Exporting -12.14 Texinfo Export +13.14 Texinfo Export ==================== * Menu: @@ -12673,7 +12876,7 @@ File: org, Node: Texinfo Export, Next: iCalendar Export, Prev: Org Export, U  File: org, Node: Texinfo export commands, Next: Texinfo specific export settings, Up: Texinfo Export -12.14.1 Texinfo export commands +13.14.1 Texinfo export commands ------------------------------- ‘C-c C-e i t’ (‘org-texinfo-export-to-texinfo’) @@ -12688,7 +12891,7 @@ File: org, Node: Texinfo export commands, Next: Texinfo specific export settin  File: org, Node: Texinfo specific export settings, Next: Texinfo file header, Prev: Texinfo export commands, Up: Texinfo Export -12.14.2 Texinfo specific export settings +13.14.2 Texinfo specific export settings ---------------------------------------- The Texinfo export back-end has several additional keywords for @@ -12729,7 +12932,7 @@ general options (see *note Export Settings::).  File: org, Node: Texinfo file header, Next: Texinfo title and copyright page, Prev: Texinfo specific export settings, Up: Texinfo Export -12.14.3 Texinfo file header +13.14.3 Texinfo file header --------------------------- After creating the header for a Texinfo file, the Texinfo back-end @@ -12752,7 +12955,7 @@ document by setting the ‘TEXINFO_CLASS’ keyword to that class.  File: org, Node: Texinfo title and copyright page, Next: Info directory file, Prev: Texinfo file header, Up: Texinfo Export -12.14.4 Texinfo title and copyright page +13.14.4 Texinfo title and copyright page ---------------------------------------- The default template for hard copy output has a title page with ‘TITLE’ @@ -12787,7 +12990,7 @@ does not appear in the structure of the document.  File: org, Node: Info directory file, Next: Headings and sectioning structure, Prev: Texinfo title and copyright page, Up: Texinfo Export -12.14.5 Info directory file +13.14.5 Info directory file --------------------------- The end result of the Texinfo export process is the creation of an Info @@ -12805,7 +13008,7 @@ the file fits.  File: org, Node: Headings and sectioning structure, Next: Indices, Prev: Info directory file, Up: Texinfo Export -12.14.6 Headings and sectioning structure +13.14.6 Headings and sectioning structure ----------------------------------------- The Texinfo export back-end uses a pre-defined scheme to convert Org @@ -12847,7 +13050,7 @@ file. See *note (texinfo)The Top Node::, for more information.  File: org, Node: Indices, Next: Quoting Texinfo code, Prev: Headings and sectioning structure, Up: Texinfo Export -12.14.7 Indices +13.14.7 Indices --------------- The Texinfo export back-end recognizes these indexing keywords if used @@ -12873,7 +13076,7 @@ the index after its contents.  File: org, Node: Quoting Texinfo code, Next: Plain lists in Texinfo export, Prev: Indices, Up: Texinfo Export -12.14.8 Quoting Texinfo code +13.14.8 Quoting Texinfo code ---------------------------- Use any of the following three methods to insert or escape raw Texinfo @@ -12892,13 +13095,13 @@ code:  File: org, Node: Plain lists in Texinfo export, Next: Tables in Texinfo export, Prev: Quoting Texinfo code, Up: Texinfo Export -12.14.9 Plain lists in Texinfo export +13.14.9 Plain lists in Texinfo export ------------------------------------- The Texinfo export back-end by default converts description lists in the Org file using the default command ‘@table’, which results in a table -with two columns. To change this behavior, specify ‘:table-type’ with -‘ftable’ or ‘vtable’ attributes. For more information, see *note +with two columns. To change this behavior, set ‘:table-type’ attribute +to either ‘ftable’ or ‘vtable’ value. For more information, see *note (texinfo)Two-column Tables::. The Texinfo export back-end by default also applies a text highlight @@ -12924,10 +13127,20 @@ becomes This is the common text for variables foo and bar. @end table + Ordered lists are numbered when exported to Texinfo format. Such +numbering obeys any counter (see *note Plain Lists::) in the first item +of the list. The ‘:enum’ attribute also let you start the list at a +specific number, or switch to a lettered list, as illustrated here + + #+ATTR_TEXINFO: :enum A + 1. Alpha + 2. Bravo + 3. Charlie +  File: org, Node: Tables in Texinfo export, Next: Images in Texinfo export, Prev: Plain lists in Texinfo export, Up: Texinfo Export -12.14.10 Tables in Texinfo export +13.14.10 Tables in Texinfo export --------------------------------- When exporting tables, the Texinfo export back-end uses the widest cell @@ -12940,7 +13153,7 @@ of line length, use the ‘:columns’ attribute. See example below.  File: org, Node: Images in Texinfo export, Next: Quotations in Texinfo export, Prev: Tables in Texinfo export, Up: Texinfo Export -12.14.11 Images in Texinfo export +13.14.11 Images in Texinfo export --------------------------------- Insert a file link to the image in the Org file, and the Texinfo export @@ -12955,7 +13168,7 @@ the text using Texinfo code, as shown in the example:  File: org, Node: Quotations in Texinfo export, Next: Special blocks in Texinfo export, Prev: Images in Texinfo export, Up: Texinfo Export -12.14.12 Quotations in Texinfo export +13.14.12 Quotations in Texinfo export ------------------------------------- You can write the text of a quotation within a quote block (see *note @@ -12980,7 +13193,7 @@ quotation with the ‘:tag’ attribute.  File: org, Node: Special blocks in Texinfo export, Next: A Texinfo example, Prev: Quotations in Texinfo export, Up: Texinfo Export -12.14.13 Special blocks in Texinfo export +13.14.13 Special blocks in Texinfo export ----------------------------------------- The Texinfo export back-end converts special blocks to commands with the @@ -13001,7 +13214,7 @@ becomes  File: org, Node: A Texinfo example, Prev: Special blocks in Texinfo export, Up: Texinfo Export -12.14.14 A Texinfo example +13.14.14 A Texinfo example -------------------------- Here is a more detailed example Org file. See *note (texinfo)GNU Sample @@ -13063,7 +13276,7 @@ Texts:: for an equivalent example using Texinfo code. :APPENDIX: t :END: - #+TEXINFO: @include fdl.texi + #+INCLUDE: fdl.org * Index :PROPERTIES: @@ -13073,7 +13286,7 @@ Texts:: for an equivalent example using Texinfo code.  File: org, Node: iCalendar Export, Next: Other Built-in Back-ends, Prev: Texinfo Export, Up: Exporting -12.15 iCalendar Export +13.15 iCalendar Export ====================== A large part of Org mode’s interoperability success is its ability to @@ -13122,16 +13335,16 @@ unique, yet enable synchronization programs trace the connections. ‘org-icalendar-combined-agenda-file’ file name. The iCalendar export back-end includes ‘SUMMARY’, ‘DESCRIPTION’, -‘LOCATION’ and ‘TIMEZONE’ properties from the Org entries when -exporting. To force the back-end to inherit the ‘LOCATION’ and -‘TIMEZONE’ properties, configure the ‘org-use-property-inheritance’ +‘LOCATION’, ‘TIMEZONE’ and ‘CLASS’ properties from the Org entries when +exporting. To force the back-end to inherit the ‘LOCATION’, ‘TIMEZONE’ +and ‘CLASS’ properties, configure the ‘org-use-property-inheritance’ variable. - When Org entries do not have ‘SUMMARY’, ‘DESCRIPTION’ and ‘LOCATION’ -properties, the iCalendar export back-end derives the summary from the -headline, and derives the description from the body of the Org item. -The ‘org-icalendar-include-body’ variable limits the maximum number of -characters of the content are turned into its description. + When Org entries do not have ‘SUMMARY’, ‘DESCRIPTION’, ‘LOCATION’ and +‘CLASS’ properties, the iCalendar export back-end derives the summary +from the headline, and derives the description from the body of the Org +item. The ‘org-icalendar-include-body’ variable limits the maximum +number of characters of the content are turned into its description. The ‘TIMEZONE’ property can be used to specify a per-entry time zone, and is applied to any entry with timestamp information. Time zones @@ -13139,6 +13352,18 @@ should be specified as per the IANA time zone database format, e.g., ‘Asia/Almaty’. Alternately, the property value can be ‘UTC’, to force UTC time for this entry only. + The ‘CLASS’ property can be used to specify a per-entry visibility +class or access restrictions, and is applied to any entry with class +information. The iCalendar standard defines three visibility classes: +‘PUBLIC’ + The entry is publicly visible (this is the default). +‘CONFIDENTIAL’ + Only a limited group of clients get access to the event. +‘PRIVATE’ + The entry can be retrieved only by its owner. + The server should treat unknown class properties the same as +‘PRIVATE’. + Exporting to iCalendar format depends in large part on the capabilities of the destination application. Some are more lenient than others. Consult the Org mode FAQ for advice on specific applications. @@ -13146,7 +13371,7 @@ others. Consult the Org mode FAQ for advice on specific applications.  File: org, Node: Other Built-in Back-ends, Next: Advanced Export Configuration, Prev: iCalendar Export, Up: Exporting -12.16 Other Built-in Back-ends +13.16 Other Built-in Back-ends ============================== Other export back-ends included with Org are: @@ -13164,7 +13389,7 @@ for usage and configuration details.  File: org, Node: Advanced Export Configuration, Next: Export in Foreign Buffers, Prev: Other Built-in Back-ends, Up: Exporting -12.17 Advanced Export Configuration +13.17 Advanced Export Configuration =================================== Hooks @@ -13311,7 +13536,7 @@ user-friendly improvements.  File: org, Node: Export in Foreign Buffers, Prev: Advanced Export Configuration, Up: Exporting -12.18 Export in Foreign Buffers +13.18 Export in Foreign Buffers =============================== The export back-ends in Org often include commands to convert selected @@ -13344,7 +13569,7 @@ org-html-convert-region-to-html’.  File: org, Node: Publishing, Next: Working with Source Code, Prev: Exporting, Up: Top -13 Publishing +14 Publishing ************* Org includes a publishing management system that allows you to configure @@ -13369,7 +13594,7 @@ server.  File: org, Node: Configuration, Next: Uploading Files, Up: Publishing -13.1 Configuration +14.1 Configuration ================== Publishing needs significant configuration to specify files, destination @@ -13389,7 +13614,7 @@ and many other properties of a project.  File: org, Node: Project alist, Next: Sources and destinations, Up: Configuration -13.1.1 The variable ‘org-publish-project-alist’ +14.1.1 The variable ‘org-publish-project-alist’ ----------------------------------------------- Publishing is configured almost entirely through setting the value of @@ -13415,7 +13640,7 @@ sequence given.  File: org, Node: Sources and destinations, Next: Selecting files, Prev: Project alist, Up: Configuration -13.1.2 Sources and destinations for files +14.1.2 Sources and destinations for files ----------------------------------------- Most properties are optional, but some should always be set. In @@ -13447,7 +13672,7 @@ to put published files.  File: org, Node: Selecting files, Next: Publishing action, Prev: Sources and destinations, Up: Configuration -13.1.3 Selecting files +14.1.3 Selecting files ---------------------- By default, all files with extension ‘.org’ in the base directory are @@ -13475,7 +13700,7 @@ following properties  File: org, Node: Publishing action, Next: Publishing options, Prev: Selecting files, Up: Configuration -13.1.4 Publishing action +14.1.4 Publishing action ------------------------ Publishing means that a file is copied to the destination directory and @@ -13519,7 +13744,7 @@ do this.  File: org, Node: Publishing options, Next: Publishing links, Prev: Publishing action, Up: Configuration -13.1.5 Options for the exporters +14.1.5 Options for the exporters -------------------------------- The property list can be used to set many export options for the HTML @@ -13639,6 +13864,7 @@ HTML specific properties ‘:html-postamble’ ‘org-html-postamble’ ‘:html-preamble-format’ ‘org-html-preamble-format’ ‘:html-preamble’ ‘org-html-preamble’ +‘:html-self-link-headlines’ ‘org-html-self-link-headlines’ ‘:html-table-align-individual-field’ ‘de{org-html-table-align-individual-fields’ ‘:html-table-attributes’ ‘org-html-table-default-attributes’ ‘:html-table-caption-above’ ‘org-html-table-caption-above’ @@ -13653,6 +13879,7 @@ HTML specific properties ‘:html-use-infojs’ ‘org-html-use-infojs’ ‘:html-validation-link’ ‘org-html-validation-link’ ‘:html-viewport’ ‘org-html-viewport’ +‘:html-wrap-src-lines’ ‘org-html-wrap-src-lines’ ‘:html-xml-declaration’ ‘org-html-xml-declaration’ LaTeX specific properties @@ -13740,7 +13967,7 @@ Texinfo specific properties  File: org, Node: Publishing links, Next: Site map, Prev: Publishing options, Up: Configuration -13.1.6 Publishing links +14.1.6 Publishing links ----------------------- To create a link from one Org file to another, you would use something @@ -13769,7 +13996,7 @@ HTML, the following links all point to a dedicated anchor in ‘foo.html’.  File: org, Node: Site map, Next: Generating an index, Prev: Publishing links, Up: Configuration -13.1.7 Generating a sitemap +14.1.7 Generating a sitemap --------------------------- The following properties may be used to control publishing of a map of @@ -13839,7 +14066,7 @@ files for a given project.  File: org, Node: Generating an index, Prev: Site map, Up: Configuration -13.1.8 Generating an index +14.1.8 Generating an index -------------------------- Org mode can generate an index across the files of a publishing project. @@ -13863,7 +14090,7 @@ contains an exclamation mark creates a sub item.  File: org, Node: Uploading Files, Next: Sample Configuration, Prev: Configuration, Up: Publishing -13.2 Uploading Files +14.2 Uploading Files ==================== For those people already utilizing third party sync tools such as Rsync @@ -13899,7 +14126,7 @@ been modified.  File: org, Node: Sample Configuration, Next: Triggering Publication, Prev: Uploading Files, Up: Publishing -13.3 Sample Configuration +14.3 Sample Configuration ========================= Below we provide two example configurations. The first one is a simple @@ -13914,7 +14141,7 @@ complex, with a multi-component project.  File: org, Node: Simple example, Next: Complex example, Up: Sample Configuration -13.3.1 Example: simple publishing configuration +14.3.1 Example: simple publishing configuration ----------------------------------------------- This example publishes a set of Org files to the ‘public_html’ directory @@ -13933,7 +14160,7 @@ on the local machine.  File: org, Node: Complex example, Prev: Simple example, Up: Sample Configuration -13.3.2 Example: complex publishing configuration +14.3.2 Example: complex publishing configuration ------------------------------------------------ This more complicated example publishes an entire website, including Org @@ -13982,22 +14209,22 @@ place on the web server, and publishing images to it.  File: org, Node: Triggering Publication, Prev: Sample Configuration, Up: Publishing -13.4 Triggering Publication +14.4 Triggering Publication =========================== Once properly configured, Org can publish with the following commands: -‘C-c C-e X’ (‘org-publish’) +‘C-c C-e P x’ (‘org-publish’) Prompt for a specific project and publish all files that belong to it. -‘C-c C-e P’ (‘org-publish-current-project’) +‘C-c C-e P p’ (‘org-publish-current-project’) Publish the project containing the current file. -‘C-c C-e F’ (‘org-publish-current-file’) +‘C-c C-e P f’ (‘org-publish-current-file’) Publish only the current file. -‘C-c C-e E’ (‘org-publish-all’) +‘C-c C-e P a’ (‘org-publish-all’) Publish every project. Org uses timestamps to track when a file has changed. The above @@ -14010,7 +14237,7 @@ if files include other files via ‘SETUPFILE’ or ‘INCLUDE’ keywords.  File: org, Node: Working with Source Code, Next: Miscellaneous, Prev: Publishing, Up: Top -14 Working with Source Code +15 Working with Source Code *************************** Source code here refers to any plain text collection of computer @@ -14105,7 +14332,7 @@ described in the following sections.  File: org, Node: Structure of Code Blocks, Next: Using Header Arguments, Up: Working with Source Code -14.1 Structure of Code Blocks +15.1 Structure of Code Blocks ============================= Org offers two ways to structure source code in Org documents: in a @@ -14171,7 +14398,7 @@ or  File: org, Node: Using Header Arguments, Next: Environment of a Code Block, Prev: Structure of Code Blocks, Up: Working with Source Code -14.2 Using Header Arguments +15.2 Using Header Arguments =========================== Org comes with many header arguments common to all languages. New @@ -14329,7 +14556,7 @@ evaluation of ‘factorial’ code block.  File: org, Node: Environment of a Code Block, Next: Evaluating Code Blocks, Prev: Using Header Arguments, Up: Working with Source Code -14.3 Environment of a Code Block +15.3 Environment of a Code Block ================================ Passing arguments @@ -14630,10 +14857,12 @@ Choosing a working directory The ‘dir’ header argument specifies the default directory during code block execution. If it is absent, then the directory associated with -the current buffer is used. In other words, supplying ‘:dir PATH’ +the current buffer is used. In other words, supplying ‘:dir DIRECTORY’ temporarily has the same effect as changing the current directory with -‘M-x cd PATH’, and then not setting ‘dir’. Under the surface, ‘dir’ -simply sets the value of the Emacs variable ‘default-directory’. +‘M-x cd DIRECTORY’, and then not setting ‘dir’. Under the +surface, ‘dir’ simply sets the value of the Emacs variable +‘default-directory’. Setting ‘mkdirp’ header argument to a non-‘nil’ +value creates the directory, if necessary. For example, to save the plot file in the ‘Work/’ folder of the home directory—notice tilde is expanded: @@ -14682,7 +14911,7 @@ appending to the end of the code block for execution.  File: org, Node: Evaluating Code Blocks, Next: Results of Evaluation, Prev: Environment of a Code Block, Up: Working with Source Code -14.4 Evaluating Code Blocks +15.4 Evaluating Code Blocks =========================== A note about security: With code evaluation comes the risk of harm. Org @@ -14856,7 +15085,7 @@ Settings::).  File: org, Node: Results of Evaluation, Next: Exporting Code Blocks, Prev: Evaluating Code Blocks, Up: Working with Source Code -14.5 Results of Evaluation +15.5 Results of Evaluation ========================== How Org handles results of a code block execution depends on many header @@ -14864,19 +15093,18 @@ arguments working together. The primary determinant, however, is the ‘results’ header argument. It accepts four classes of options. Each code block can take only one option per class: -collection +Collection For how the results should be collected from the code block; -type +Type For which type of result the code block will return; affects how Org processes and inserts results in the Org buffer; -format - For the result; affects how Org processes and inserts results in - the Org buffer; +Format + For the result; affects how Org processes results; -handling - For processing results after evaluation of the code block; +Handling + For inserting results once they are properly formatted. Collection ---------- @@ -15015,10 +15243,10 @@ default behavior is to automatically determine the result type. draw(unitcircle); #+END_SRC - If ‘file’ is missing, Org generates the base name of the output - file from the name of the code block, and its extension from the - ‘file-ext’ header argument. In that case, both the name and the - extension are mandatory(1). + If ‘file’ header argument is missing, Org generates the base name + of the output file from the name of the code block, and its + extension from the ‘file-ext’ header argument. In that case, both + the name and the extension are mandatory. #+name: circle #+BEGIN_SRC asymptote :results value file :file-ext pdf @@ -15084,8 +15312,8 @@ follows from the type specified above. Interpreted as raw Org mode. Inserted directly into the buffer. Aligned if it is a table. Usage example: ‘:results value raw’. - The ‘wrap’ header argument unconditionnally marks the results block -by appending strings to ‘#+BEGIN_’ and ‘#+END_’. If no string is + The ‘wrap’ header argument unconditionally marks the results block by +appending strings to ‘#+BEGIN_’ and ‘#+END_’. If no string is specified, Org wraps the results in a ‘#+BEGIN_results’ ... ‘#+END_results’ block. It takes precedent over the ‘results’ value listed above. E.g., @@ -15181,20 +15409,10 @@ to pass data between code blocks. |-------| | 1.371 | - ---------- Footnotes ---------- - - (1) Due to the way this header argument is implemented, it implies -“:results file”. Therefore if it is set for multiple blocks at once (by -a subtree or buffer property for example), all blocks are forced to -produce file results. This is seldom desired behavior, so it is -recommended to set this header only on a per-block basis. It is -possible that this aspect of the implementation might change in the -future. -  File: org, Node: Exporting Code Blocks, Next: Extracting Source Code, Prev: Results of Evaluation, Up: Working with Source Code -14.6 Exporting Code Blocks +15.6 Exporting Code Blocks ========================== It is possible to export the _code_ of code blocks, the _results_ of @@ -15246,7 +15464,7 @@ blocks in sub-trees excluded from export (see *note Export Settings::).  File: org, Node: Extracting Source Code, Next: Languages, Prev: Exporting Code Blocks, Up: Working with Source Code -14.7 Extracting Source Code +15.7 Extracting Source Code =========================== Extracting source code from code blocks is a basic task in literate @@ -15286,8 +15504,8 @@ FILENAME file’s location. Example: ‘:tangle FILENAME’. The ‘mkdirp’ header argument creates parent directories for tangled -files if the directory does not exist. ‘yes’ enables directory creation -and ‘no’ inhibits directory creation. +files if the directory does not exist. A ‘yes’ value enables directory +creation whereas ‘no’ inhibits it. The ‘comments’ header argument controls inserting comments into tangled files. These are above and beyond whatever comments may already @@ -15385,23 +15603,25 @@ block header arguments:  File: org, Node: Languages, Next: Editing Source Code, Prev: Extracting Source Code, Up: Working with Source Code -14.8 Languages +15.8 Languages ============== Code blocks in the following languages are supported. Language Identifier Language Identifier ----------------------------------------------------------------------- -Asymptote ‘asymptote’ Lua ‘lua’ -Awk ‘awk’ MATLAB ‘matlab’ -C ‘C’ Mscgen ‘mscgen’ -C++ ‘C++’(1) OCaml ‘ocaml’ -Clojure ‘clojure’ Octave ‘octave’ -CSS ‘css’ Org mode ‘org’ -D ‘D’(2) Oz ‘oz’ -ditaa ‘ditaa’ Perl ‘perl’ -Emacs Calc ‘calc’ Plantuml ‘plantuml’ -Emacs Lisp ‘emacs-lisp’ Processing.js ‘processing’ +Asymptote ‘asymptote’ Lisp ‘lisp’ +Awk ‘awk’ Lua ‘lua’ +C ‘C’ MATLAB ‘matlab’ +C++ ‘C++’(1) Mscgen ‘mscgen’ +Clojure ‘clojure’ Objective ‘ocaml’ + Caml +CSS ‘css’ Octave ‘octave’ +D ‘D’(2) Org mode ‘org’ +ditaa ‘ditaa’ Oz ‘oz’ +Emacs Calc ‘calc’ Perl ‘perl’ +Emacs Lisp ‘emacs-lisp’ Plantuml ‘plantuml’ +Eshell ‘eshell’ Processing.js ‘processing’ Fortran ‘fortran’ Python ‘python’ Gnuplot ‘gnuplot’ R ‘R’ GNU Screen ‘screen’ Ruby ‘ruby’ @@ -15412,7 +15632,6 @@ Javascript ‘js’ shell ‘sh’ LaTeX ‘latex’ SQL ‘sql’ Ledger ‘ledger’ SQLite ‘sqlite’ Lilypond ‘lilypond’ Vala ‘vala’ -Lisp ‘lisp’ Additional documentation for some languages is at . @@ -15449,10 +15668,10 @@ language.  File: org, Node: Editing Source Code, Next: Noweb Reference Syntax, Prev: Languages, Up: Working with Source Code -14.9 Editing Source Code +15.9 Editing Source Code ======================== -Use ‘C-c '’ to edit the current code block. It opens a new major-mode +Use ‘C-c '’ to edit the current code block. It opens a new major mode edit buffer containing the body of the source code block, ready for any edits. Use ‘C-c '’ again to close the buffer and return to the Org buffer. @@ -15508,7 +15727,7 @@ and Emacs Lisp languages.  File: org, Node: Noweb Reference Syntax, Next: Library of Babel, Prev: Editing Source Code, Up: Working with Source Code -14.10 Noweb Reference Syntax +15.10 Noweb Reference Syntax ============================ Org supports named blocks in Noweb(1) style syntax: @@ -15707,7 +15926,7 @@ Note that now the expansion contains the results of the code block  File: org, Node: Library of Babel, Next: Key bindings and Useful Functions, Prev: Noweb Reference Syntax, Up: Working with Source Code -14.11 Library of Babel +15.11 Library of Babel ====================== The “Library of Babel” is a collection of code blocks. Like a function @@ -15723,7 +15942,7 @@ regular code blocks of an Org file, and then load the Org file with  File: org, Node: Key bindings and Useful Functions, Next: Batch Execution, Prev: Library of Babel, Up: Working with Source Code -14.12 Key bindings and Useful Functions +15.12 Key bindings and Useful Functions ======================================= Many common Org mode key sequences are re-bound depending on the @@ -15768,7 +15987,7 @@ Key binding Function  File: org, Node: Batch Execution, Prev: Key bindings and Useful Functions, Up: Working with Source Code -14.13 Batch Execution +15.13 Batch Execution ===================== Org mode features, including working with source code facilities can be @@ -15793,31 +16012,32 @@ mode’s usefulness.  File: org, Node: Miscellaneous, Next: Hacking, Prev: Working with Source Code, Up: Top -15 Miscellaneous +16 Miscellaneous **************** * Menu: * Completion:: ‘M-’ guesses completions. * Structure Templates:: Quick insertion of structural elements. -* Escape Character:: * Speed Keys:: Electric commands at the beginning of a headline. -* Code Evaluation Security:: Org files evaluate in-line code. -* Customization:: Adapting Org to your taste. -* In-buffer Settings:: Overview of keywords. -* The Very Busy C-c C-c Key:: When in doubt, press ‘C-c C-c’. * Clean View:: Getting rid of leading stars in the outline. -* TTY Keys:: Using Org on a tty. +* Dynamic Headline Numbering:: Display and update outline numbering. +* The Very Busy C-c C-c Key:: When in doubt, press ‘C-c C-c’. +* In-buffer Settings:: Overview of keywords. +* Org Syntax:: Formal description of Org’s syntax. * Documentation Access:: Read documentation about current syntax. +* Escape Character:: +* Code Evaluation Security:: Org files evaluate in-line code. * Interaction:: With other Emacs packages. +* TTY Keys:: Using Org on a tty. +* Protocols:: External access to Emacs and Org. * Org Crypt:: Encrypting Org files. * Org Mobile:: Viewing and capture on a mobile device. -* Org Syntax:: Formal description of Org’s syntax.  File: org, Node: Completion, Next: Structure Templates, Up: Miscellaneous -15.1 Completion +16.1 Completion =============== Org has in-buffer completions. Unlike minibuffer completions, which are @@ -15832,14 +16052,13 @@ integral part of Emacs and Org provides several shortcuts. Complete word at point. - • At the beginning of a headline, complete TODO keywords. + • At the beginning of an empty headline, complete TODO keywords. • After ‘\’, complete TeX symbols supported by the exporter. • After ‘*’, complete headlines in the current buffer so that - they can be used in search links like: - - [[*find this headline]] + they can be used in search links like: ‘[[*find this + headline]]’ • After ‘:’ in a headline, complete tags. Org deduces the list of tags from the ‘TAGS’ in-buffer option (see *note Setting @@ -15864,9 +16083,9 @@ integral part of Emacs and Org provides several shortcuts. Ispell.  -File: org, Node: Structure Templates, Next: Escape Character, Prev: Completion, Up: Miscellaneous +File: org, Node: Structure Templates, Next: Speed Keys, Prev: Completion, Up: Miscellaneous -15.2 Structure Templates +16.2 Structure Templates ======================== With just a few keystrokes, it is possible to insert empty structural @@ -15894,41 +16113,21 @@ example, ‘< s ’ creates a code block. Enable it by customizing ‘C’ ‘#+BEGIN_COMMENT’ ... ‘#+END_COMMENT’ ‘e’ ‘#+BEGIN_EXAMPLE’ ... ‘#+END_EXAMPLE’ ‘E’ ‘#+BEGIN_EXPORT’ ... ‘#+END_EXPORT’ -‘h’ ‘#+BEGIN_EXPORT html’ ... ‘#+END_EXPORT’ -‘l’ ‘#+BEGIN_EXPORT latex’ ... ‘#+END_EXPORT’ -‘q’ ‘#+BEGIN_QUOTE’ ... ‘#+END_QUOTE’ -‘s’ ‘#+BEGIN_SRC’ ... ‘#+END_SRC’ -‘v’ ‘#+BEGIN_VERSE’ ... ‘#+END_VERSE’ - - ---------- Footnotes ---------- - - (1) For more information, please refer to the commentary section in -‘org-tempo.el’. - - -File: org, Node: Escape Character, Next: Speed Keys, Prev: Structure Templates, Up: Miscellaneous - -15.3 Escape Character -===================== - -You may sometimes want to write text that looks like Org syntax, but -should really read as plain text. Org may use a specific escape -character in some situations, e.g., a backslash in macros (see *note -Macro Replacement::). In the general case, however, we suggest to use -the zero width space. You can get it with one of the following: - - C-x 8 zero width space - C-x 8 200B +‘h’ ‘#+BEGIN_EXPORT html’ ... ‘#+END_EXPORT’ +‘l’ ‘#+BEGIN_EXPORT latex’ ... ‘#+END_EXPORT’ +‘q’ ‘#+BEGIN_QUOTE’ ... ‘#+END_QUOTE’ +‘s’ ‘#+BEGIN_SRC’ ... ‘#+END_SRC’ +‘v’ ‘#+BEGIN_VERSE’ ... ‘#+END_VERSE’ - For example, in order to write ‘[[1,2]]’ as-is in your document, you -can write this, where ‘X’ denotes the zero width space character: + ---------- Footnotes ---------- - [[X1,2]] + (1) For more information, please refer to the commentary section in +‘org-tempo.el’.  -File: org, Node: Speed Keys, Next: Code Evaluation Security, Prev: Escape Character, Up: Miscellaneous +File: org, Node: Speed Keys, Next: Clean View, Prev: Structure Templates, Up: Miscellaneous -15.4 Speed Keys +16.3 Speed Keys =============== Single keystrokes can execute custom commands in an Org file when point @@ -15951,83 +16150,190 @@ headline, shows currently active Speed Keys, including the user-defined ones.  -File: org, Node: Code Evaluation Security, Next: Customization, Prev: Speed Keys, Up: Miscellaneous +File: org, Node: Clean View, Next: Dynamic Headline Numbering, Prev: Speed Keys, Up: Miscellaneous -15.5 Code Evaluation and Security Issues -======================================== +16.4 A Cleaner Outline View +=========================== -Unlike plain text, running code comes with risk. Each source code -block, in terms of risk, is equivalent to an executable file. Org -therefore puts a few confirmation prompts by default. This is to alert -the casual user from accidentally running untrusted code. +Org’s outline with stars and no indents can look cluttered for short +documents. For _book-like_ long documents, the effect is not as +noticeable. Org provides an alternate stars and indentation scheme, as +shown on the right in the following table. It displays only one star +and indents text to line up with the heading: - For users who do not run code blocks or write code regularly, Org’s -default settings should suffice. However, some users may want to tweak -the prompts for fewer interruptions. To weigh the risks of automatic -execution of code blocks, here are some details about code evaluation. + * Top level headline | * Top level headline + ** Second level | * Second level + *** Third level | * Third level + some text | some text + *** Third level | * Third level + more text | more text + * Another top level headline | * Another top level headline - Org evaluates code in the following circumstances: + Org can achieve this in two ways, (1) by just displaying the buffer +in this way without changing it, or (2) by actually indenting every line +in the desired amount with hard spaces and hiding leading stars. -_Source code blocks_ - Org evaluates source code blocks in an Org file during export. Org - also evaluates a source code block with the ‘C-c C-c’ key chord. - Users exporting or running code blocks must load files only from - trusted sources. Be wary of customizing variables that remove or - alter default security measures. +* Menu: - -- User Option: org-confirm-babel-evaluate - When ‘t’, Org prompts the user for confirmation before - executing each code block. When ‘nil’, Org executes code - blocks without prompting the user for confirmation. When this - option is set to a custom function, Org invokes the function - with these two arguments: the source code language and the - body of the code block. The custom function must return - either a ‘t’ or ‘nil’, which determines if the user is - prompted. Each source code language can be handled separately - through this function argument. +* Org Indent Mode:: +* Hard indentation:: - For example, here is how to execute ditaa code blocks without - prompting: + +File: org, Node: Org Indent Mode, Next: Hard indentation, Up: Clean View - (defun my-org-confirm-babel-evaluate (lang body) - (not (string= lang "ditaa"))) ;don't ask for ditaa - (setq org-confirm-babel-evaluate #'my-org-confirm-babel-evaluate) +16.4.1 Org Indent Mode +---------------------- -_Following ‘shell’ and ‘elisp’ links_ - Org has two link types that can directly evaluate code (see *note - External Links::). Because such code is not visible, these links - have a potential risk. Org therefore prompts the user when it - encounters such links. The customization variables are: +To display the buffer in the indented view, activate Org Indent minor +mode, using ‘M-x org-indent-mode’. Text lines that are not headlines +are prefixed with virtual spaces to vertically align with the headline +text(1). - -- User Option: org-confirm-shell-link-function - Function that prompts the user before executing a shell link. + To make more horizontal space, the headlines are shifted by two +characters. Configure ‘org-indent-indentation-per-level’ variable for a +different number. - -- User Option: org-confirm-elisp-link-function - Function that prompts the user before executing an Emacs Lisp - link. + By default, Org Indent mode turns off ‘org-adapt-indentation’ and +does hide leading stars by locally setting ‘org-hide-leading-stars’ to +‘t’: only one star on each headline is visible, the rest are masked with +the same font color as the background. If you want to customize this +default behavior, see ‘org-indent-mode-turns-on-hiding-stars’ and +‘org-indent-mode-turns-off-org-adapt-indentation’. -_Formulas in tables_ - Formulas in tables (see *note The Spreadsheet::) are code that is - evaluated either by the Calc interpreter, or by the Emacs Lisp - interpreter. + To globally turn on Org Indent mode for all files, customize the +variable ‘org-startup-indented’. To control it for individual files, +use ‘STARTUP’ keyword as follows: + + #+STARTUP: indent + #+STARTUP: noindent + + ---------- Footnotes ---------- + + (1) Org Indent mode also sets ‘wrap-prefix’ correctly for indenting +and wrapping long lines of headlines or text. This minor mode also +handles Visual Line mode and directly applied settings through +‘word-wrap’.  -File: org, Node: Customization, Next: In-buffer Settings, Prev: Code Evaluation Security, Up: Miscellaneous +File: org, Node: Hard indentation, Prev: Org Indent Mode, Up: Clean View -15.6 Customization -================== +16.4.2 Hard indentation +----------------------- + +It is possible to use hard spaces to achieve the indentation instead, if +the bare ASCII file should have the indented look also outside Emacs(1). +With Org’s support, you have to indent all lines to line up with the +outline headers. You would use these settings: + + (setq org-adapt-indentation t + org-hide-leading-stars t + org-odd-levels-only t) + +_Indentation of text below headlines_ (‘org-adapt-indentation’) + The first setting modifies paragraph filling, line wrapping, and + structure editing commands to preserving or adapting the + indentation as appropriate. + +_Hiding leading stars_ (‘org-hide-leading-stars’) + The second setting makes leading stars invisible by applying the + face ‘org-hide’ to them. For per-file preference, use these file + ‘STARTUP’ options: + + #+STARTUP: hidestars + #+STARTUP: showstars + +_Odd levels_ (‘org-odd-levels-only’) + The third setting makes Org use only odd levels, 1, 3, 5, ..., in + the outline to create more indentation. On a per-file level, + control this with: + + #+STARTUP: odd + #+STARTUP: oddeven + + To convert a file between single and double stars layouts, use ‘M-x + org-convert-to-odd-levels’ and ‘M-x org-convert-to-oddeven-levels’. + + ---------- Footnotes ---------- + + (1) This works, but requires extra effort. Org Indent mode is more +convenient for most applications. + + +File: org, Node: Dynamic Headline Numbering, Next: The Very Busy C-c C-c Key, Prev: Clean View, Up: Miscellaneous + +16.5 Dynamic Headline Numbering +=============================== + +The Org Num minor mode, toggled with ‘M-x org-num-mode’, displays +outline numbering on top of headlines. It also updates it automatically +upon changes to the structure of the document. + + By default, all headlines are numbered. You can limit numbering to +specific headlines according to their level, tags, ‘COMMENT’ keyword, or +‘UNNUMBERED’ property. Set ‘org-num-max-level’, ‘org-num-skip-tags’, +‘org-num-skip-commented’, ‘org-num-skip-unnumbered’, or +‘org-num-skip-footnotes’ accordingly. + + If ‘org-num-skip-footnotes’ is non-‘nil’, footnotes sections (see +*note Creating Footnotes::) are not numbered either. + + You can control how the numbering is displayed by setting +‘org-num-face’ and ‘org-num-format-function’. + + +File: org, Node: The Very Busy C-c C-c Key, Next: In-buffer Settings, Prev: Dynamic Headline Numbering, Up: Miscellaneous + +16.6 The Very Busy ‘C-c C-c’ Key +================================ + +The ‘C-c C-c’ key in Org serves many purposes depending on the context. +It is probably the most over-worked, multi-purpose key combination in +Org. Its uses are well documented throughout this manual, but here is a +consolidated list for easy reference. + + • If any highlights shown in the buffer from the creation of a sparse + tree, or from clock display, remove such highlights. + + • If point is in one of the special ‘KEYWORD’ lines, scan the buffer + for these lines and update the information. Also reset the Org + file cache used to temporary store the contents of URLs used as + values for keywords like ‘SETUPFILE’. + + • If point is inside a table, realign the table. + + • If point is on a ‘TBLFM’ keyword, re-apply the formulas to the + entire table. + + • If the current buffer is a capture buffer, close the note and file + it. With a prefix argument, also jump to the target location after + saving the note. + + • If point is on a ‘<<>>’, update radio targets and + corresponding links in this buffer. + + • If point is on a property line or at the start or end of a property + drawer, offer property commands. + + • If point is at a footnote reference, go to the corresponding + definition, and _vice versa_. + + • If point is on a statistics cookie, update it. + + • If point is in a plain list item with a checkbox, toggle the status + of the checkbox. -Org has more than 500 variables for customization. They can be accessed -through the usual ‘M-x org-customize’ command. Or through the Org menu: -Org → Customization → Browse Org Group. + • If point is on a numbered item in a plain list, renumber the + ordered list. + + • If point is on the ‘#+BEGIN’ line of a dynamic block, the block is + updated. - Org also has per-file settings for some variables (see *note -In-buffer Settings::). + • If point is at a timestamp, fix the day name in the timestamp.  -File: org, Node: In-buffer Settings, Next: The Very Busy C-c C-c Key, Prev: Customization, Up: Miscellaneous +File: org, Node: In-buffer Settings, Next: Org Syntax, Prev: The Very Busy C-c C-c Key, Up: Miscellaneous -15.7 Summary of In-Buffer Settings +16.7 Summary of In-Buffer Settings ================================== In-buffer settings start with ‘#+’, followed by a keyword, a colon, and @@ -16096,36 +16402,23 @@ and reopening the Org file in Emacs also activates the changes. settings is ‘org-startup-folded’ with a default value of ‘t’, which is the same as ‘overview’. - ‘overview’ - Top-level headlines only. - - ‘content’ - All headlines. - - ‘showall’ - No folding on any entry. - - ‘showeverything’ - Show even drawer contents. + ‘overview’ Top-level headlines only. + ‘content’ All headlines. + ‘showall’ No folding on any entry. + ‘showeverything’ Show even drawer contents. Dynamic virtual indentation is controlled by the variable ‘org-startup-indented’(1). - ‘indent’ - Start with ‘org-indent-mode’ turned on. - - ‘noindent’ - Start with ‘org-indent-mode’ turned off. + ‘indent’ Start with Org Indent mode turned on. + ‘noindent’ Start with Org Indent mode turned off. Aligns tables consistently upon visiting a file. The corresponding variable is ‘org-startup-align-all-tables’ with ‘nil’ as default value. - ‘align’ - Align all tables. - - ‘noalign’ - Do not align tables on startup. + ‘align’ Align all tables. + ‘noalign’ Do not align tables on startup. Shrink table columns with a width cookie. The corresponding variable is ‘org-startup-shrink-all-tables’ with ‘nil’ as default @@ -16135,151 +16428,79 @@ and reopening the Org file in Emacs also activates the changes. The corresponding variable is ‘org-startup-with-inline-images’, with a default value ‘nil’ to avoid delays when visiting a file. - ‘inlineimages’ - Show inline images. - - ‘noinlineimages’ - Do not show inline images on startup. + ‘inlineimages’ Show inline images. + ‘noinlineimages’ Do not show inline images on startup. Logging the closing and reopening of TODO items and clock intervals can be configured using these options (see variables ‘org-log-done’, ‘org-log-note-clock-out’, and ‘org-log-repeat’). - ‘logdone’ - Record a timestamp when an item is marked DONE. - - ‘lognotedone’ - Record timestamp and a note when DONE. - - ‘nologdone’ - Do not record when items are marked DONE. - - ‘logrepeat’ - Record a time when reinstating a repeating item. - - ‘lognoterepeat’ - Record a note when reinstating a repeating item. - - ‘nologrepeat’ - Do not record when reinstating repeating item. - - ‘lognoteclock-out’ - Record a note when clocking out. - - ‘nolognoteclock-out’ - Do not record a note when clocking out. - - ‘logreschedule’ - Record a timestamp when scheduling time changes. - - ‘lognotereschedule’ - Record a note when scheduling time changes. - - ‘nologreschedule’ - Do not record when a scheduling date changes. - - ‘logredeadline’ - Record a timestamp when deadline changes. - - ‘lognoteredeadline’ - Record a note when deadline changes. - - ‘nologredeadline’ - Do not record when a deadline date changes. - - ‘logrefile’ - Record a timestamp when refiling. - - ‘lognoterefile’ - Record a note when refiling. - - ‘nologrefile’ - Do not record when refiling. + ‘logdone’ Record a timestamp when an item is marked as done. + ‘lognotedone’ Record timestamp and a note when DONE. + ‘nologdone’ Do not record when items are marked as done. + ‘logrepeat’ Record a time when reinstating a repeating item. + ‘lognoterepeat’ Record a note when reinstating a repeating item. + ‘nologrepeat’ Do not record when reinstating repeating item. + ‘lognoteclock-out’ Record a note when clocking out. + ‘nolognoteclock-out’ Do not record a note when clocking out. + ‘logreschedule’ Record a timestamp when scheduling time changes. + ‘lognotereschedule’ Record a note when scheduling time changes. + ‘nologreschedule’ Do not record when a scheduling date changes. + ‘logredeadline’ Record a timestamp when deadline changes. + ‘lognoteredeadline’ Record a note when deadline changes. + ‘nologredeadline’ Do not record when a deadline date changes. + ‘logrefile’ Record a timestamp when refiling. + ‘lognoterefile’ Record a note when refiling. + ‘nologrefile’ Do not record when refiling. Here are the options for hiding leading stars in outline headings, and for indenting outlines. The corresponding variables are ‘org-hide-leading-stars’ and ‘org-odd-levels-only’, both with a default setting ‘nil’ (meaning ‘showstars’ and ‘oddeven’). - ‘hidestars’ - Make all but one of the stars starting a headline invisible. - - ‘showstars’ - Show all stars starting a headline. - - ‘indent’ - Virtual indentation according to outline level. - - ‘noindent’ - No virtual indentation according to outline level. - - ‘odd’ - Allow only odd outline levels (1, 3, ...). - - ‘oddeven’ - Allow all outline levels. + ‘hidestars’ Make all but one of the stars starting a headline invisible. + ‘showstars’ Show all stars starting a headline. + ‘indent’ Virtual indentation according to outline level. + ‘noindent’ No virtual indentation according to outline level. + ‘odd’ Allow only odd outline levels (1, 3, ...). + ‘oddeven’ Allow all outline levels. To turn on custom format overlays over timestamps (variables ‘org-put-time-stamp-overlays’ and ‘org-time-stamp-overlay-formats’), use: - ‘customtime’ - Overlay custom time format. + ‘customtime’ Overlay custom time format. The following options influence the table spreadsheet (variable ‘constants-unit-system’). - ‘constcgs’ - ‘constants.el’ should use the c-g-s unit system. - - ‘constSI’ - ‘constants.el’ should use the SI unit system. + ‘constcgs’ ‘constants.el’ should use the c-g-s unit system. + ‘constSI’ ‘constants.el’ should use the SI unit system. To influence footnote settings, use the following keywords. The corresponding variables are ‘org-footnote-define-inline’, ‘org-footnote-auto-label’, and ‘org-footnote-auto-adjust’. - ‘fninline’ - Define footnotes inline. - - ‘fnnoinline’ - Define footnotes in separate section. - - ‘fnlocal’ - Define footnotes near first reference, but not inline. - - ‘fnprompt’ - Prompt for footnote labels. - - ‘fnauto’ - Create ‘[fn:1]’-like labels automatically (default). - - ‘fnconfirm’ - Offer automatic label for editing or confirmation. - - ‘fnadjust’ - Automatically renumber and sort footnotes. - - ‘nofnadjust’ - Do not renumber and sort automatically. + ‘fninline’ Define footnotes inline. + ‘fnnoinline’ Define footnotes in separate section. + ‘fnlocal’ Define footnotes near first reference, but not inline. + ‘fnprompt’ Prompt for footnote labels. + ‘fnauto’ Create ‘[fn:1]’-like labels automatically (default). + ‘fnconfirm’ Offer automatic label for editing or confirmation. + ‘fnadjust’ Automatically renumber and sort footnotes. + ‘nofnadjust’ Do not renumber and sort automatically. To hide blocks on startup, use these keywords. The corresponding variable is ‘org-hide-block-startup’. - ‘hideblocks’ - Hide all begin/end blocks on startup. - - ‘nohideblocks’ - Do not hide blocks on startup. + ‘hideblocks’ Hide all begin/end blocks on startup. + ‘nohideblocks’ Do not hide blocks on startup. The display of entities as UTF-8 characters is governed by the variable ‘org-pretty-entities’ and the keywords - ‘entitiespretty’ - Show entities as UTF-8 characters where possible. - - ‘entitiesplain’ - Leave entities plain. + ‘entitiespretty’ Show entities as UTF-8 characters where possible. + ‘entitiesplain’ Leave entities plain. ‘#+TAGS: TAG1(c1) TAG2(c2)’ These lines (several such lines are allowed) specify the valid tags @@ -16294,208 +16515,151 @@ and reopening the Org file in Emacs also activates the changes. ---------- Footnotes ---------- - (1) Note that ‘org-indent-mode’ also sets the ‘wrap-prefix’ property, -such that ‘visual-line-mode’ (or purely setting ‘word-wrap’) wraps long -lines (including headlines) correctly indented. + (1) Note that Org Indent mode also sets the ‘wrap-prefix’ property, +such that Visual Line mode (or purely setting ‘word-wrap’) wraps long +lines, including headlines, correctly indented.  -File: org, Node: The Very Busy C-c C-c Key, Next: Clean View, Prev: In-buffer Settings, Up: Miscellaneous - -15.8 The Very Busy ‘C-c C-c’ Key -================================ - -The ‘C-c C-c’ key in Org serves many purposes depending on the context. -It is probably the most over-worked, multi-purpose key combination in -Org. Its uses are well documented throughout this manual, but here is a -consolidated list for easy reference. - - • If any highlights shown in the buffer from the creation of a sparse - tree, or from clock display, remove such highlights. - - • If point is in one of the special ‘KEYWORD’ lines, scan the buffer - for these lines and update the information. Also reset the Org - file cache used to temporary store the contents of URLs used as - values for keywords like ‘SETUPFILE’. - - • If point is inside a table, realign the table. The table realigns - even if automatic table editor is turned off. - - • If point is on a ‘TBLFM’ keyword, re-apply the formulas to the - entire table. +File: org, Node: Org Syntax, Next: Documentation Access, Prev: In-buffer Settings, Up: Miscellaneous - • If the current buffer is a capture buffer, close the note and file - it. With a prefix argument, also jump to the target location after - saving the note. +16.8 Org Syntax +=============== - • If point is on a ‘<<>>’, update radio targets and - corresponding links in this buffer. +A reference document providing a formal description of Org’s syntax is +available as a draft on Worg +(https://orgmode.org/worg/dev/org-syntax.html), written and maintained +by Nicolas Goaziou. It defines Org’s core internal concepts such as +“headlines”, “sections”, “affiliated keywords”, “(greater) elements” and +“objects”. Each part of an Org document belongs to one of the previous +categories. - • If point is on a property line or at the start or end of a property - drawer, offer property commands. + To explore the abstract structure of an Org buffer, run this in a +buffer: - • If point is at a footnote reference, go to the corresponding - definition, and _vice versa_. + M-: (org-element-parse-buffer) - • If point is on a statistics cookie, update it. +It outputs a list containing the buffer’s content represented as an +abstract structure. The export engine relies on the information stored +in this list. Most interactive commands—e.g., for structure +editing—also rely on the syntactic meaning of the surrounding context. - • If point is in a plain list item with a checkbox, toggle the status - of the checkbox. + You can probe the syntax of your documents with the command - • If point is on a numbered item in a plain list, renumber the - ordered list. + M-x org-lint - • If point is on the ‘#+BEGIN’ line of a dynamic block, the block is - updated. +It runs a number of checks to find common mistakes. It then displays +their location in a dedicated buffer, along with a description and a +“trust level”, since false-positive are possible. From there, you can +operate on the reports with the following keys: - • If point is at a timestamp, fix the day name in the timestamp. +‘C-j’, ‘’ Display the offending line +‘’ Move point to the offending line +‘g’ Check the document again +‘h’ Hide all reports from the same checker +‘i’ Also remove them from all subsequent checks +‘S’ Sort reports by the column at point  -File: org, Node: Clean View, Next: TTY Keys, Prev: The Very Busy C-c C-c Key, Up: Miscellaneous - -15.9 A Cleaner Outline View -=========================== - -Org’s default outline with stars and no indents can become too cluttered -for short documents. For _book-like_ long documents, the effect is not -as noticeable. Org provides an alternate stars and indentation scheme, -as shown on the right in the following table. It uses only one star and -indents text to line with the heading: - - * Top level headline | * Top level headline - ** Second level | * Second level - *** Third level | * Third level - some text | some text - *** Third level | * Third level - more text | more text - * Another top level headline | * Another top level headline - - To turn this mode on, use the minor mode, ‘org-indent-mode’. Text -lines that are not headlines are prefixed with spaces to vertically -align with the headline text(1). - - To make more horizontal space, the headlines are shifted by two -stars. This can be configured by the ‘org-indent-indentation-per-level’ -variable. Only one star on each headline is visible, the rest are -masked with the same font color as the background. - - Note that turning on ‘org-indent-mode’ sets ‘org-hide-leading-stars’ -to ‘t’ and ‘org-adapt-indentation’ to ‘nil’. - - To globally turn on ‘org-indent-mode’ for all files, customize the -variable ‘org-startup-indented’. - - To turn on indenting for individual files, use ‘STARTUP’ keyword as -follows: - - #+STARTUP: indent - - Indent on startup makes Org use hard spaces to align text with -headings as shown in examples below. +File: org, Node: Documentation Access, Next: Escape Character, Prev: Org Syntax, Up: Miscellaneous -_Indentation of text below headlines_ - Indent text to align with the headline. +16.9 Context Dependent Documentation +==================================== - *** Third level - more text, now indented +‘C-c C-x I’ in an Org file tries to open a suitable section of the Org +manual depending on the syntax at point. For example, using it on a +headline displays “Document Structure” section. - Org supports this with paragraph filling, line wrapping, and - structure editing, preserving or adapting the indentation as - appropriate(2). + ‘q’ closes the Info window. -_Hiding leading stars_ - Org can make leading stars invisible. For global preference, - configure the variable ‘org-hide-leading-stars’. For per-file - preference, use these file ‘STARTUP’ options: + +File: org, Node: Escape Character, Next: Code Evaluation Security, Prev: Documentation Access, Up: Miscellaneous - #+STARTUP: hidestars - #+STARTUP: showstars +16.10 Escape Character +====================== - With stars hidden, the tree is shown as: +You may sometimes want to write text that looks like Org syntax, but +should really read as plain text. Org may use a specific escape +character in some situations, i.e., a backslash in macros (see *note +Macro Replacement::) and links (see *note Link Format::), or a comma in +source and example blocks (see *note Literal Examples::). In the +general case, however, we suggest to use the zero width space. You can +insert one with any of the following: - * Top level headline - * Second level - * Third level - ... + C-x 8 zero width space + C-x 8 200B - Because Org makes the font color the same as the background color - to hide to stars, sometimes ‘org-hide’ face may need tweaking to - get the effect right. For some black and white combinations, - ‘grey90’ on a white background might mask the stars better. + For example, in order to write ‘[[1,2]]’ as-is in your document, you +may write instead -_Odd levels_ - Using stars for only odd levels, 1, 3, 5, ..., can also clean up - the clutter. This removes two stars from each level(3). For Org - to properly handle this cleaner structure during edits and exports, - configure the variable ‘org-odd-levels-only’. To set this - per-file, use either one of the following lines: + [X[1,2]] - #+STARTUP: odd - #+STARTUP: oddeven + where ‘X’ denotes the zero width space character. - To switch between single and double stars layouts, use ‘M-x - org-convert-to-odd-levels’ and ‘M-x org-convert-to-oddeven-levels’. + +File: org, Node: Code Evaluation Security, Next: Interaction, Prev: Escape Character, Up: Miscellaneous - ---------- Footnotes ---------- +16.11 Code Evaluation and Security Issues +========================================= - (1) The ‘org-indent-mode’ also sets the ‘wrap-prefix’ correctly for -indenting and wrapping long lines of headlines or text. This minor mode -handles ‘visual-line-mode’ and directly applied settings through -‘word-wrap’. +Unlike plain text, running code comes with risk. Each source code +block, in terms of risk, is equivalent to an executable file. Org +therefore puts a few confirmation prompts by default. This is to alert +the casual user from accidentally running untrusted code. - (2) Also see the variable ‘org-adapt-indentation’. + For users who do not run code blocks or write code regularly, Org’s +default settings should suffice. However, some users may want to tweak +the prompts for fewer interruptions. To weigh the risks of automatic +execution of code blocks, here are some details about code evaluation. - (3) Because ‘LEVEL=2’ has 3 stars, ‘LEVEL=3’ has 5 stars, and so on. + Org evaluates code in the following circumstances: - -File: org, Node: TTY Keys, Next: Documentation Access, Prev: Clean View, Up: Miscellaneous +_Source code blocks_ + Org evaluates source code blocks in an Org file during export. Org + also evaluates a source code block with the ‘C-c C-c’ key chord. + Users exporting or running code blocks must load files only from + trusted sources. Be wary of customizing variables that remove or + alter default security measures. -15.10 Using Org on a TTY -======================== + -- User Option: org-confirm-babel-evaluate + When ‘t’, Org prompts the user for confirmation before + executing each code block. When ‘nil’, Org executes code + blocks without prompting the user for confirmation. When this + option is set to a custom function, Org invokes the function + with these two arguments: the source code language and the + body of the code block. The custom function must return + either a ‘t’ or ‘nil’, which determines if the user is + prompted. Each source code language can be handled separately + through this function argument. -Org provides alternative key bindings for TTY and modern mobile devices -that cannot perform movement commands on point and key bindings with -modifier keys. Some of these workarounds may be more cumbersome than -necessary. Users should look into customizing these further based on -their usage needs. For example, the normal ‘S-’ for editing -timestamp might be better with ‘C-c .’ chord. + For example, here is how to execute ditaa code blocks without + prompting: -Default Alternative 1 Speed key Alternative 2 ----------------------------------------------------------------- -‘S-’ ‘C-u ’ ‘C’ -‘M-’ ‘C-c C-x l’ ‘l’ ‘Esc ’ -‘M-S-’ ‘C-c C-x L’ ‘L’ -‘M-’ ‘C-c C-x r’ ‘r’ ‘Esc ’ -‘M-S-’ ‘C-c C-x R’ ‘R’ -‘M-’ ‘C-c C-x u’ ‘Esc ’ -‘M-S-’ ‘C-c C-x U’ ‘U’ -‘M-’ ‘C-c C-x d’ ‘Esc ’ -‘M-S-’ ‘C-c C-x D’ ‘D’ -‘S-’ ‘C-c C-x c’ -‘M-’ ‘C-c C-x m’ ‘Esc ’ -‘M-S-’ ‘C-c C-x M’ -‘S-’ ‘C-c ’ -‘S-’ ‘C-c ’ -‘S-’ ‘C-c ’ -‘S-’ ‘C-c ’ -‘C-S-’ ‘C-c C-x ’ -‘C-S-’ ‘C-c C-x ’ + (defun my-org-confirm-babel-evaluate (lang body) + (not (string= lang "ditaa"))) ;don't ask for ditaa + (setq org-confirm-babel-evaluate #'my-org-confirm-babel-evaluate) - -File: org, Node: Documentation Access, Next: Interaction, Prev: TTY Keys, Up: Miscellaneous +_Following ‘shell’ and ‘elisp’ links_ + Org has two link types that can directly evaluate code (see *note + External Links::). Because such code is not visible, these links + have a potential risk. Org therefore prompts the user when it + encounters such links. The customization variables are: -15.11 Context Dependent Documentation -===================================== + -- User Option: org-link-shell-confirm-function + Function that prompts the user before executing a shell link. -‘C-c C-x I’ in an Org file tries to open a suitable section of the Org -manual depending on the syntax at point. For example, using it on a -headline displays “Document Structure” section. + -- User Option: org-link-elisp-confirm-function + Function that prompts the user before executing an Emacs Lisp + link. - ‘q’ closes the Info window. +_Formulas in tables_ + Formulas in tables (see *note The Spreadsheet::) are code that is + evaluated either by the Calc interpreter, or by the Emacs Lisp + interpreter.  -File: org, Node: Interaction, Next: Org Crypt, Prev: Documentation Access, Up: Miscellaneous +File: org, Node: Interaction, Next: TTY Keys, Prev: Code Evaluation Security, Up: Miscellaneous -15.12 Interaction with Other Packages +16.12 Interaction with Other Packages ===================================== Org’s compatibility and the level of interaction with other Emacs @@ -16509,7 +16673,7 @@ packages are documented here.  File: org, Node: Cooperation, Next: Conflicts, Up: Interaction -15.12.1 Packages that Org cooperates with +16.12.1 Packages that Org cooperates with ----------------------------------------- ‘calc.el’ by Dave Gillespie @@ -16578,18 +16742,18 @@ File: org, Node: Cooperation, Next: Conflicts, Up: Interaction  File: org, Node: Conflicts, Prev: Cooperation, Up: Interaction -15.12.2 Packages that conflict with Org mode +16.12.2 Packages that conflict with Org mode -------------------------------------------- -In Emacs, ‘shift-selection-mode’ combines motions of point with shift -key to enlarge regions. Emacs sets this mode by default. This -conflicts with Org’s use of ‘S-’ commands to change timestamps, -TODO keywords, priorities, and item bullet types, etc. Since -‘S-’ commands outside of specific contexts do not do anything, -Org offers the variable ‘org-support-shift-select’ for customization. -Org mode accommodates shift selection by (i) making it available outside -of the special contexts where special commands apply, and (ii) extending -an existing active region even if point moves across a special context. +In Emacs, shift-selection combines motions of point with shift key to +enlarge regions. Emacs sets this mode by default. This conflicts with +Org’s use of ‘S-’ commands to change timestamps, TODO keywords, +priorities, and item bullet types, etc. Since ‘S-’ commands +outside of specific contexts do not do anything, Org offers the variable +‘org-support-shift-select’ for customization. Org mode accommodates +shift selection by (i) making it available outside of the special +contexts where special commands apply, and (ii) extending an existing +active region even if point moves across a special context. ‘cua.el’ by Kim F. Storm Org key bindings conflict with ‘S-’ keys used by CUA mode. @@ -16648,36 +16812,232 @@ an existing active region even if point moves across a special context. (add-hook 'org-shiftdown-final-hook 'windmove-down) (add-hook 'org-shiftright-final-hook 'windmove-right) -‘yasnippet.el’ - The way Org mode binds the ‘’ key (binding to ‘[tab]’ instead - of ‘"\t"’) overrules YASnippet’s access to this key. The following - code fixed this problem: +‘yasnippet.el’ + The way Org mode binds the ‘’ key (binding to ‘[tab]’ instead + of ‘"\t"’) overrules YASnippet’s access to this key. The following + code fixed this problem: + + (add-hook 'org-mode-hook + (lambda () + (setq-local yas/trigger-key [tab]) + (define-key yas/keymap [tab] 'yas/next-field-or-maybe-expand))) + + The latest version of YASnippet does not play well with Org mode. + If the above code does not fix the conflict, start by defining the + following function: + + (defun yas/org-very-safe-expand () + (let ((yas/fallback-behavior 'return-nil)) (yas/expand))) + + Then, tell Org mode to use that function: + + (add-hook 'org-mode-hook + (lambda () + (make-variable-buffer-local 'yas/trigger-key) + (setq yas/trigger-key [tab]) + (add-to-list 'org-tab-first-hook 'yas/org-very-safe-expand) + (define-key yas/keymap [tab] 'yas/next-field))) + + +File: org, Node: TTY Keys, Next: Protocols, Prev: Interaction, Up: Miscellaneous + +16.13 Using Org on a TTY +======================== + +Org provides alternative key bindings for TTY and modern mobile devices +that cannot perform movement commands on point and key bindings with +modifier keys. Some of these workarounds may be more cumbersome than +necessary. Users should look into customizing these further based on +their usage needs. For example, the normal ‘S-’ for editing +timestamp might be better with ‘C-c .’ chord. + +Default Alternative 1 Speed key Alternative 2 +---------------------------------------------------------------- +‘S-’ ‘C-u ’ ‘C’ +‘M-’ ‘C-c C-x l’ ‘l’ ‘Esc ’ +‘M-S-’ ‘C-c C-x L’ ‘L’ +‘M-’ ‘C-c C-x r’ ‘r’ ‘Esc ’ +‘M-S-’ ‘C-c C-x R’ ‘R’ +‘M-’ ‘C-c C-x u’ ‘Esc ’ +‘M-S-’ ‘C-c C-x U’ ‘U’ +‘M-’ ‘C-c C-x d’ ‘Esc ’ +‘M-S-’ ‘C-c C-x D’ ‘D’ +‘S-’ ‘C-c C-x c’ +‘M-’ ‘C-c C-x m’ ‘Esc ’ +‘M-S-’ ‘C-c C-x M’ +‘S-’ ‘C-c ’ +‘S-’ ‘C-c ’ +‘S-’ ‘C-c ’ +‘S-’ ‘C-c ’ +‘C-S-’ ‘C-c C-x ’ +‘C-S-’ ‘C-c C-x ’ + + +File: org, Node: Protocols, Next: Org Crypt, Prev: TTY Keys, Up: Miscellaneous + +16.14 Protocols for External Access +=================================== + +Org protocol is a tool to trigger custom actions in Emacs from external +applications. Any application that supports calling external programs +with an URL as argument may be used with this functionality. For +example, you can configure bookmarks in your web browser to send a link +to the current page to Org and create a note from it using capture (see +*note Capture::). You can also create a bookmark that tells Emacs to +open the local source file of a remote website you are browsing. + + In order to use Org protocol from an application, you need to +register ‘org-protocol://’ as a valid scheme-handler. External calls +are passed to Emacs through the ‘emacsclient’ command, so you also need +to ensure an Emacs server is running. More precisely, when the +application calls + + emacsclient org-protocol://PROTOCOL?key1=val1&key2=val2 + +Emacs calls the handler associated to PROTOCOL with argument ‘(:key1 +val1 :key2 val2)’. + + Org protocol comes with three predefined protocols, detailed in the +following sections. Configure ‘org-protocol-protocol-alist’ to define +your own. + +* Menu: + +* The store-link protocol:: Store a link, push URL to kill-ring. +* The capture protocol:: Fill a buffer with external information. +* The open-source protocol:: Edit published contents. + + +File: org, Node: The store-link protocol, Next: The capture protocol, Up: Protocols + +16.14.1 The ‘store-link’ protocol +--------------------------------- + +Using the ‘store-link’ handler, you can copy links, to that they can be +inserted using ‘M-x org-insert-link’ or yanking. More precisely, the +command + + emacsclient org-protocol://store-link?url=URL&title=TITLE + +stores the following link: + + [[URL][TITLE]] + + In addition, URL is pushed on the kill-ring for yanking. You need to +encode URL and TITLE if they contain slashes, and probably quote those +for the shell. + + To use this feature from a browser, add a bookmark with an arbitrary +name, e.g., ‘Org: store-link’ and enter this as _Location_: + + javascript:location.href='org-protocol://store-link?url='+ + encodeURIComponent(location.href); + + +File: org, Node: The capture protocol, Next: The open-source protocol, Prev: The store-link protocol, Up: Protocols + +16.14.2 The ‘capture’ protocol +------------------------------ + +Activating the “capture” handler pops up a ‘Capture’ buffer in Emacs, +using acapture template. + + emacsclient org-protocol://capture?template=X?url=URL?title=TITLE?body=BODY + + To use this feature, add a bookmark with an arbitrary name, e.g., +‘Org: capture’, and enter this as ‘Location’: + + javascript:location.href='org-protocol://capture?template=x'+ + '&url='+encodeURIComponent(window.location.href)+ + '&title='+encodeURIComponent(document.title)+ + '&body='+encodeURIComponent(window.getSelection()); + + The capture template to be used can be specified in the bookmark +(like ‘X’ above). If unspecified, the template key is set in the +variable ‘org-protocol-default-template-key’. The following template +placeholders are available: + + %:link The URL + %:description The webpage title + %:annotation Equivalent to [[%:link][%:description]] + %i The selected text + + +File: org, Node: The open-source protocol, Prev: The capture protocol, Up: Protocols + +16.14.3 The ‘open-source’ protocol +---------------------------------- + +The ‘open-source’ handler is designed to help with editing local sources +when reading a document. To that effect, you can use a bookmark with +the following location: + + javascript:location.href='org-protocol://open-source?&url='+ + encodeURIComponent(location.href) + + The variable ‘org-protocol-project-alist’ maps URLs to local file +names, by stripping URL parameters from the end and replacing the +‘:base-url’ with ‘:working-directory’ and ‘:online-suffix’ with +‘:working-suffix’. For example, assuming you own a local copy of +‘https://orgmode.org/worg/’ contents at ‘/home/user/worg’, you can set +‘org-protocol-project-alist’ to the following + + (setq org-protocol-project-alist + '(("Worg" + :base-url "https://orgmode.org/worg/" + :working-directory "/home/user/worg/" + :online-suffix ".html" + :working-suffix ".org"))) + +If you are now browsing +‘https://orgmode.org/worg/org-contrib/org-protocol.html’ and find a typo +or have an idea about how to enhance the documentation, simply click the +bookmark and start editing. + + However, such mapping may not always yield the desired results. +Suppose you maintain an online store located at ‘http://example.com/’. +The local sources reside in ‘/home/user/example/’. It is common +practice to serve all products in such a store through one file and +rewrite URLs that do not match an existing file on the server. That +way, a request to ‘http://example.com/print/posters.html’ might be +rewritten on the server to something like +‘http://example.com/shop/products.php/posters.html.php’. The +‘open-source’ handler probably cannot find a file named +‘/home/user/example/print/posters.html.php’ and fails. + + Such an entry in ‘org-protocol-project-alist’ may hold an additional +property ‘:rewrites’. This property is a list of cons cells, each of +which maps a regular expression to a path relative to the +‘:working-directory’. - (add-hook 'org-mode-hook - (lambda () - (setq-local yas/trigger-key [tab]) - (define-key yas/keymap [tab] 'yas/next-field-or-maybe-expand))) + Now map the URL to the path ‘/home/user/example/products.php’ by +adding ‘:rewrites’ rules like this: - The latest version of YASnippet does not play well with Org mode. - If the above code does not fix the conflict, start by defining the - following function: + (setq org-protocol-project-alist + '(("example.com" + :base-url "http://example.com/" + :working-directory "/home/user/example/" + :online-suffix ".php" + :working-suffix ".php" + :rewrites (("example.com/print/" . "products.php") + ("example.com/$" . "index.php"))))) - (defun yas/org-very-safe-expand () - (let ((yas/fallback-behavior 'return-nil)) (yas/expand))) +Since ‘example.com/$’ is used as a regular expression, it maps +‘http://example.com/’, ‘https://example.com’, ‘http://www.example.com/’ +and similar to ‘/home/user/example/index.php’. - Then, tell Org mode to use that function: + The ‘:rewrites’ rules are searched as a last resort if and only if no +existing file name is matched. - (add-hook 'org-mode-hook - (lambda () - (make-variable-buffer-local 'yas/trigger-key) - (setq yas/trigger-key [tab]) - (add-to-list 'org-tab-first-hook 'yas/org-very-safe-expand) - (define-key yas/keymap [tab] 'yas/next-field))) + Two functions can help you filling ‘org-protocol-project-alist’ with +valid contents: ‘org-protocol-create’ and ‘org-protocol-create-for-org’. +The latter is of use if you’re editing an Org file that is part of a +publishing project.  -File: org, Node: Org Crypt, Next: Org Mobile, Prev: Interaction, Up: Miscellaneous +File: org, Node: Org Crypt, Next: Org Mobile, Prev: Protocols, Up: Miscellaneous -15.13 Org Crypt +16.15 Org Crypt =============== Org Crypt encrypts the text of an entry, but not the headline, or @@ -16719,9 +17079,9 @@ specifying the respective key as property ‘CRYPTKEY’, e.g.: text from being encrypted again.  -File: org, Node: Org Mobile, Next: Org Syntax, Prev: Org Crypt, Up: Miscellaneous +File: org, Node: Org Mobile, Prev: Org Crypt, Up: Miscellaneous -15.14 Org Mobile +16.16 Org Mobile ================ Org Mobile is a protocol for synchronizing Org files between Emacs and @@ -16751,7 +17111,7 @@ _sets_ (see *note Per-file keywords::) and _mutually exclusive_ tags  File: org, Node: Setting up the staging area, Next: Pushing to the mobile application, Up: Org Mobile -15.14.1 Setting up the staging area +16.16.1 Setting up the staging area ----------------------------------- The mobile application needs access to a file directory on a server(1) @@ -16788,7 +17148,7 @@ docstring of that variable.  File: org, Node: Pushing to the mobile application, Next: Pulling from the mobile application, Prev: Setting up the staging area, Up: Org Mobile -15.14.2 Pushing to the mobile application +16.16.2 Pushing to the mobile application ----------------------------------------- The command ‘org-mobile-push’ copies files listed in ‘org-mobile-files’ @@ -16823,7 +17183,7 @@ unique.  File: org, Node: Pulling from the mobile application, Prev: Pushing to the mobile application, Up: Org Mobile -15.14.3 Pulling from the mobile application +16.16.3 Pulling from the mobile application ------------------------------------------- The command ‘org-mobile-pull’ synchronizes changes with the server. @@ -16869,46 +17229,6 @@ pull again. (1) The file will be empty after this operation. - -File: org, Node: Org Syntax, Prev: Org Mobile, Up: Miscellaneous - -15.15 Org Syntax -================ - -A reference document providing a formal description of Org’s syntax is -available as a draft on Worg -(https://orgmode.org/worg/dev/org-syntax.html), written and maintained -by Nicolas Goaziou. It defines Org’s core internal concepts such as -“headlines”, “sections”, “affiliated keywords”, “(greater) elements” and -“objects”. Each part of an Org document belongs to one of the previous -categories. - - To explore the abstract structure of an Org buffer, run this in a -buffer: - - M-: (org-element-parse-buffer) - -It outputs a list containing the buffer’s content represented as an -abstract structure. The export engine relies on the information stored -in this list. Most interactive commands—e.g., for structure -editing—also rely on the syntactic meaning of the surrounding context. - - You can probe the syntax of your documents with the command - - M-x org-lint - -It runs a number of checks to find common mistakes. It then displays -their location in a dedicated buffer, along with a description and a -“trust level”, since false-positive are possible. From there, you can -operate on the reports with the following keys: - -‘C-j’, ‘’ Display the offending line -‘’ Move point to the offending line -‘g’ Check the document again -‘h’ Hide all reports from the same checker -‘i’ Also remove them from all subsequent checks -‘S’ Sort reports by the column at point -  File: org, Node: Hacking, Next: History and Acknowledgments, Prev: Miscellaneous, Up: Top @@ -16969,10 +17289,10 @@ process of adding Org links to Unix man pages, which look like this [[man:printf][The printf manual]] -The following ‘org-man.el’ file implements it +The following ‘ol-man.el’ file implements it - ;;; org-man.el - Support for links to man pages in Org mode - (require 'org) + ;;; ol-man.el - Support for links to man pages in Org mode + (require 'ol) (org-link-set-parameters "man" :follow org-man-command @@ -16991,7 +17311,7 @@ The following ‘org-man.el’ file implements it (let* ((page (org-man-get-page-name)) (link (concat "man:" page)) (description (format "Man page for %s" page))) - (org-store-link-props + (org-link-store-props :type "man" :link link :description description)))) @@ -17014,17 +17334,17 @@ The following ‘org-man.el’ file implements it (`ascii (format "%s (%s)" desc path)) (t path)))) - (provide 'org-man) - ;;; org-man.el ends here + (provide ol-man) + ;;; ol-man.el ends here To activate links to man pages in Org, enter this in the Emacs init file: - (require 'org-man) + (require 'ol-man) -A review of ‘org-man.el’: +A review of ‘ol-man.el’: - 1. First, ‘(require 'org)’ ensures ‘org.el’ is loaded. + 1. First, ‘(require 'ol)’ ensures that ‘ol.el’ is loaded. 2. Then ‘org-link-set-parameters’ defines a new link type with ‘man’ prefix and associates functions for following, exporting and @@ -17035,8 +17355,8 @@ A review of ‘org-man.el’: For example, ‘org-man-store-link’ is responsible for storing a link when ‘org-store-link’ (see *note Handling Links::) is called from a - buffer displaying a man page. It first checks if the ‘major-mode’ - is appropriate. If check fails, the function returns ‘nil’, which + buffer displaying a man page. It first checks if the major mode is + appropriate. If check fails, the function returns ‘nil’, which means it isn’t responsible for creating a link to the current buffer. Otherwise the function makes a link string by combining the ‘man:’ prefix with the man topic. It also provides a default @@ -17310,9 +17630,12 @@ A.6 Dynamic Blocks 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, ‘C-c C-x C-r’ -inserts a dynamic table that updates the work time (see *note Clocking -Work Time::). +updated automatically by a user function. + + You can insert a dynamic block with +‘org-dynamic-block-insert-dblock’, which is bound to ‘C-c C-x x’ by +default. For example, ‘C-c C-x x c l o c k t a b l e ’ inserts a +table that updates the work time (see *note Clocking Work Time::). Dynamic blocks can have names and function parameters. The syntax is similar to source code block specifications: @@ -17331,13 +17654,12 @@ similar to source code block specifications: Before updating a dynamic block, Org removes content between the ‘BEGIN’ and ‘END’ markers. Org then reads the parameters on the ‘BEGIN’ -line for passing to the writer function. If the function expects to -access the removed content, then Org expects an extra parameter, -‘:content’, on the ‘BEGIN’ line. +line for passing to the writer function as a plist. The previous +content of the dynamic block becomes erased from the buffer and appended +to the plist under ‘:content’. - The syntax for naming a writer function with a dynamic block labelled -‘myblock’ is: ‘org-dblock-write:myblock’. Parameters come from the -‘BEGIN’ line. + The syntax for naming a writer function with a dynamic block labeled +‘myblock’ is: ‘org-dblock-write:myblock’. The following is an example of a dynamic block and a block writer function that updates the time when the function was last run: @@ -17840,8 +18162,8 @@ Sebastian Rose Without Sebastian, the HTML/XHTML publishing of Org would be the pitiful work of an ignorant amateur. Sebastian has pushed this part of Org onto a much higher level. He also wrote ‘org-info.js’, - a Java script for displaying webpages derived from Org using an - Info-like or a folding interface with single-key navigation. + a JavaScript program for displaying webpages derived from Org using + an Info-like or a folding interface with single-key navigation. See below for the full list of contributions! Again, please let me know what I am missing here! @@ -17899,14 +18221,14 @@ B.3 List of Contributions • Russel Adams came up with the idea for drawers. - • Thomas Baumann wrote ‘org-bbdb.el’ and ‘org-mhe.el’. + • Thomas Baumann wrote ‘ol-bbdb.el’ and ‘ol-mhe.el’. • Christophe Bataillon created the great unicorn logo that we use on the Org mode website. • Alex Bochannek provided a patch for rounding timestamps. - • Jan Böcker wrote ‘org-docview.el’. + • Jan Böcker wrote ‘ol-docview.el’. • Brad Bozarth showed how to pull RSS feed data into Org files. @@ -17983,7 +18305,7 @@ B.3 List of Contributions • Manuel Hermenegildo has contributed various ideas, small fixes and patches. - • Phil Jackson wrote ‘org-irc.el’. + • Phil Jackson wrote ‘ol-irc.el’. • Scott Jaderholm proposed footnotes, control over whitespace between folded entries, and column view for properties. @@ -18089,7 +18411,7 @@ B.3 List of Contributions • Ulf Stegemann created the table to translate special symbols to HTML, LaTeX, UTF-8, Latin-1 and ASCII. - • Andy Stewart contributed code to ‘org-w3m.el’, to copy HTML content + • Andy Stewart contributed code to ‘ol-w3m.el’, to copy HTML content with links transformation to Org syntax. • David O’Toole wrote ‘org-publish.el’ and drafted the manual chapter @@ -18123,7 +18445,7 @@ B.3 List of Contributions • Piotr Zielinski wrote ‘org-mouse.el’, proposed agenda blocks and contributed various ideas and code snippets. - • Marco Wahl wrote ‘org-eww.el’. + • Marco Wahl wrote ‘ol-eww.el’.  File: org, Node: GNU Free Documentation License, Next: Main Index, Prev: History and Acknowledgments, Up: Top @@ -18133,7 +18455,7 @@ Appendix C GNU Free Documentation License Version 1.3, 3 November 2008 - Copyright © 2000, 2001, 2002, 2007, 2008, 2013, 2014, 2018 Free Software Foundation, Inc. + Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies @@ -18576,27 +18898,27 @@ Appendix C GNU Free Documentation License site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. -ADDENDUM: How to use this License for your documents -==================================================== +C.1 ADDENDUM: How to use this License for your documents +======================================================== To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: - Copyright (C) YEAR YOUR NAME. - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.3 - or any later version published by the Free Software Foundation; - with no Invariant Sections, no Front-Cover Texts, and no Back-Cover - Texts. A copy of the license is included in the section entitled ``GNU - Free Documentation License''. + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with...Texts.” line with this: - with the Invariant Sections being LIST THEIR TITLES, with - the Front-Cover Texts being LIST, and with the Back-Cover Texts - being LIST. + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the @@ -18617,7 +18939,7 @@ D Main Index * Menu: * *this*, in post header argument: Results of Evaluation. - (line 272) + (line 271) * + suffix, in properties: Property Syntax. (line 48) * _ALL suffix, in properties: Property Syntax. (line 46) * abbreviation, links: Link Abbreviations. (line 6) @@ -18630,9 +18952,9 @@ D Main Index * agenda: Weekly/daily agenda. (line 6) * agenda dispatcher: Agenda Dispatcher. (line 6) * agenda files: Agenda Files. (line 6) -* agenda files, removing buffers: Agenda Commands. (line 494) -* agenda filtering: Filtering/limiting agenda times. - (line 17) +* agenda files, removing buffers: Agenda Commands. (line 496) +* agenda filtering: Filtering/limiting agenda items. + (line 20) * agenda views: Agenda Views. (line 6) * agenda views, custom: Custom Agenda Views. (line 6) * agenda views, exporting: Exporting Agenda Views. @@ -18653,11 +18975,11 @@ D Main Index * alignment in tables: Column Width and Alignment. (line 6) * ALLTAGS, special property: Special Properties. (line 13) -* ALT_TITLE, property: Table of Contents. (line 53) +* ALT_TITLE, property: Table of Contents. (line 68) * ALT_TITLE, property <1>: Headings and sectioning structure. (line 24) * angle bracket links: Link Format. (line 6) -* angular brackets, around links: External Links. (line 70) +* angular brackets, around links: External Links. (line 136) * anniversaries, from BBDB: Weekly/daily agenda. (line 78) * API, for mapping: Using the Mapping API. (line 6) @@ -18678,18 +19000,24 @@ D Main Index * ARCHIVE, property <1>: Moving subtrees. (line 37) * ARCHIVE, tag: Internal archiving. (line 6) * archived entries, in agenda views: Agenda Views. (line 37) -* archiving: Archiving. (line 6) +* archiving: Refiling and Archiving. + (line 6) +* archiving <1>: Archiving. (line 6) * arguments, in code blocks: Environment of a Code Block. (line 9) * ASCII export: ASCII/Latin-1/UTF-8 export. (line 6) * ASCII, keyword: ASCII/Latin-1/UTF-8 export. (line 63) -* Atom feeds: RSS Feeds. (line 6) -* attach from Dired: Attachments. (line 79) -* attachments: Attachments. (line 6) -* ATTACH_DIR, property: Attachments. (line 71) -* ATTACH_DIR_INHERIT, property: Attachments. (line 76) +* Atom feeds: Capture and Attachments. + (line 6) +* Atom feeds <1>: RSS Feeds. (line 6) +* attach from Dired: Attach from Dired. (line 6) +* attachment links: External Links. (line 6) +* attachment links, searching: Search Options. (line 6) +* attachments: Capture and Attachments. + (line 6) +* attachments <1>: Attachments. (line 6) * ATTR_ASCII, keyword: ASCII/Latin-1/UTF-8 export. (line 74) * ATTR_BEAMER, keyword: Beamer specific syntax. @@ -18737,6 +19065,7 @@ D Main Index * autoload: Activation. (line 6) * babel, languages: Languages. (line 6) * babel, library of: Library of Babel. (line 6) +* backslashes, in links: Link Format. (line 17) * backtrace of an error: Feedback. (line 66) * BBDB links: External Links. (line 6) * BBDB, anniversaries: Weekly/daily agenda. (line 78) @@ -18763,7 +19092,7 @@ D Main Index (line 27) * BEAMER_THEME, keyword: Beamer specific export settings. (line 11) -* BEGIN clocktable: The clock table. (line 35) +* BEGIN clocktable: The clock table. (line 33) * BEGIN columnview: Capturing column view. (line 11) * BEGIN_CENTER: Paragraphs. (line 32) @@ -18773,7 +19102,7 @@ D Main Index (line 63) * BEGIN_EXPORT beamer: Beamer specific syntax. (line 19) -* BEGIN_EXPORT html: Quoting HTML tags. (line 14) +* BEGIN_EXPORT html: Quoting HTML tags. (line 13) * BEGIN_EXPORT latex: Quoting LaTeX code. (line 18) * BEGIN_EXPORT texinfo: Quoting Texinfo code. (line 9) @@ -18782,14 +19111,14 @@ D Main Index * BEGIN_JUSTIFYRIGHT: ASCII/Latin-1/UTF-8 export. (line 84) * BEGIN_QUOTE: Paragraphs. (line 25) -* BEGIN_SRC: Literal Examples. (line 30) +* BEGIN_SRC: Literal Examples. (line 38) * BEGIN_SRC <1>: Structure of Code Blocks. (line 6) * BEGIN_VERSE: Paragraphs. (line 13) * BIND, keyword: Export Settings. (line 210) * block agenda: Block agenda. (line 6) * BLOCKED, special property: Special Properties. (line 13) -* blocking, of checkboxes: Checkboxes. (line 46) +* blocking, of checkboxes: Checkboxes. (line 45) * blocks, folding: Blocks. (line 6) * bold text, markup rules: Emphasis and Monospace. (line 6) @@ -18806,9 +19135,9 @@ D Main Index * Calc package: The Spreadsheet. (line 6) * calc.el: Cooperation. (line 7) * calculations, in tables: Built-in Table Editor. - (line 167) + (line 179) * calculations, in tables <1>: The Spreadsheet. (line 6) -* calendar commands, from agenda: Agenda Commands. (line 444) +* calendar commands, from agenda: Agenda Commands. (line 446) * calendar integration: Weekly/daily agenda. (line 32) * calendar, for selecting date: The date/time prompt. (line 75) @@ -18820,14 +19149,15 @@ D Main Index * CAPTION, keyword <2>: Images in HTML export. (line 28) * captions, markup rules: Captions. (line 6) -* capture: Capture Refile Archive. +* capture: Capture and Attachments. (line 6) * capture <1>: Capture. (line 6) -* capture protocol: capture protocol. (line 6) -* capturing, from agenda: Agenda Commands. (line 343) +* capture protocol: The capture protocol. + (line 6) +* capturing, from agenda: Agenda Commands. (line 345) * category: Categories. (line 6) -* category filtering, in agenda: Filtering/limiting agenda times. - (line 17) +* category filtering, in agenda: Filtering/limiting agenda items. + (line 20) * category, for tags/property match: Matching tags and properties. (line 64) * CATEGORY, keyword: Categories. (line 6) @@ -18839,23 +19169,24 @@ D Main Index * cdlatex.el: Cooperation. (line 24) * center blocks: Paragraphs. (line 32) * center image in LaTeX export: Images in LaTeX export. - (line 57) + (line 60) * change agenda display: Agenda Commands. (line 63) -* checkbox blocking: Checkboxes. (line 46) -* checkbox statistics: Checkboxes. (line 30) +* checkbox blocking: Checkboxes. (line 45) +* checkbox statistics: Checkboxes. (line 29) * checkboxes: Checkboxes. (line 6) * checkboxes and TODO dependencies: TODO dependencies. (line 53) * children, subtree visibility state: Global and local cycling. (line 6) * CINDEX, keyword: Indices. (line 6) +* CLASS, property: iCalendar Export. (line 51) * clean outline view: Clean View. (line 6) * clocking time: Clocking Work Time. (line 6) * CLOCKSUM, special property: Special Properties. (line 13) -* CLOCKSUM, special property <1>: Agenda Column View. (line 29) +* CLOCKSUM, special property <1>: Agenda Column View. (line 32) * CLOCKSUM_T, special property: Special Properties. (line 13) -* CLOCKSUM_T, special property <1>: Agenda Column View. (line 53) +* CLOCKSUM_T, special property <1>: Agenda Column View. (line 56) * clocktable, dynamic block: The clock table. (line 6) -* CLOCK_MODELINE_TOTAL, property: Clocking commands. (line 20) +* CLOCK_MODELINE_TOTAL, property: Clocking commands. (line 21) * CLOSED, special property: Special Properties. (line 13) * code block, batch execution: Batch Execution. (line 6) * code block, editing: Editing Source Code. (line 6) @@ -18889,6 +19220,7 @@ D Main Index * COLUMNS, property: Property Inheritance. (line 22) * COLUMNS, property <1>: In-buffer Settings. (line 23) +* comma escape, in literal examples: Literal Examples. (line 14) * commands, in agenda buffer: Agenda Commands. (line 6) * comment block: Comment Lines. (line 10) * comment lines: Comment Lines. (line 6) @@ -18923,9 +19255,11 @@ D Main Index * converter: Advanced topics in ODT export. (line 12) * COOKIE_DATA, property: Breaking Down Tasks. (line 21) -* COOKIE_DATA, property <1>: Checkboxes. (line 30) +* COOKIE_DATA, property <1>: Checkboxes. (line 29) * coordinates, of field: References. (line 89) -* copying notes: Refile and Copy. (line 6) +* copying notes: Refiling and Archiving. + (line 6) +* copying notes <1>: Refile and Copy. (line 6) * copying, of subtrees: Structure Editing. (line 6) * COPYING, property: Texinfo title and copyright page. (line 19) @@ -18937,8 +19271,7 @@ D Main Index * custom agenda views: Custom Agenda Views. (line 6) * custom date/time format: Custom time format. (line 6) * custom search strings: Custom Searches. (line 6) -* customization: Customization. (line 6) -* CUSTOM_ID, property: Internal Links. (line 6) +* CUSTOM_ID, property: Internal Links. (line 11) * CUSTOM_ID, property <1>: Handling Links. (line 21) * cutting, of subtrees: Structure Editing. (line 6) * cycling, in plain lists: Plain Lists. (line 70) @@ -18980,13 +19313,17 @@ D Main Index * DESCRIPTION, property: Headings and sectioning structure. (line 24) * DESCRIPTION, property <1>: iCalendar Export. (line 51) -* diary entries, creating from agenda: Agenda Commands. (line 453) +* diary entries, creating from agenda: Agenda Commands. (line 455) * diary integration: Weekly/daily agenda. (line 32) * diary style timestamps: Timestamps. (line 34) * dictionary word completion: Completion. (line 6) * dir file, in Texinfo export: Info directory file. (line 6) * dir, header argument: Environment of a Code Block. (line 302) +* DIR, property: Attachment defaults and dispatcher. + (line 67) +* DIR, property <1>: Attachment defaults and dispatcher. + (line 72) * directories, for publishing: Sources and destinations. (line 6) * dispatcher, for export commands: The Export Dispatcher. @@ -19021,8 +19358,8 @@ D Main Index * edits, catching invisible: Catching invisible edits. (line 6) * effort estimates: Effort Estimates. (line 6) -* effort filtering, in agenda: Filtering/limiting agenda times. - (line 17) +* effort filtering, in agenda: Filtering/limiting agenda items. + (line 20) * EFFORT, property: Effort Estimates. (line 6) * Elisp links: External Links. (line 6) * ellipsis, special symbol: Special Symbols. (line 36) @@ -19032,8 +19369,10 @@ D Main Index * embedding images in ODT: Images in ODT export. (line 6) * entities: Special Symbols. (line 6) +* enum, Texinfo attribute: Plain lists in Texinfo export. + (line 35) * epilogue, header argument: Environment of a Code Block. - (line 350) + (line 352) * escape character: Escape Character. (line 6) * escape syntax, for links: Link Format. (line 17) * eval, header argument: Evaluating Code Blocks. @@ -19083,20 +19422,20 @@ D Main Index * file links, searching: Search Options. (line 6) * file name completion: Handling Links. (line 92) * file, header argument: Results of Evaluation. - (line 152) + (line 151) * FILE, special property: Special Properties. (line 13) * file-desc, header argument: Results of Evaluation. - (line 173) + (line 172) * file-ext, header argument: Results of Evaluation. - (line 162) + (line 161) * files for agenda: Agenda Files. (line 6) * files, adding to agenda list: Agenda Files. (line 16) * files, selecting for publishing: Selecting files. (line 6) * FILETAGS, keyword: Tag Inheritance. (line 20) * FILETAGS, keyword <1>: In-buffer Settings. (line 34) * filladapt.el: Conflicts. (line 43) -* filtering entries, in agenda: Filtering/limiting agenda times. - (line 17) +* filtering entries, in agenda: Filtering/limiting agenda items. + (line 20) * Filters, exporting: Advanced Export Configuration. (line 31) * FINDEX, keyword: Indices. (line 6) @@ -19107,12 +19446,12 @@ D Main Index * folding, sparse trees: Sparse Trees. (line 6) * following links: Handling Links. (line 102) * footers, in code blocks: Environment of a Code Block. - (line 342) + (line 344) * footnotes: Creating Footnotes. (line 6) * format specifier, in spreadsheet: Formula syntax for Calc. (line 17) * format, of links: Link Format. (line 6) -* formatting source code, markup rules: Literal Examples. (line 23) +* formatting source code, markup rules: Literal Examples. (line 31) * formula debugging: Editing and debugging formulas. (line 132) * formula editing: Editing and debugging formulas. @@ -19125,7 +19464,7 @@ D Main Index (line 6) * formula, for table column: Column formulas. (line 6) * formula, in tables: Built-in Table Editor. - (line 167) + (line 179) * function index, in Texinfo export: Indices. (line 6) * global cycling: Global and local cycling. (line 20) @@ -19153,15 +19492,18 @@ D Main Index * HEADER, keyword: Using Header Arguments. (line 114) * headers, in code blocks: Environment of a Code Block. - (line 342) + (line 344) * headline navigation: Motion. (line 6) * headline tagging: Tags. (line 6) * headline, promotion and demotion: Structure Editing. (line 6) * headlines: Headlines. (line 6) +* headlines, in HTML export: Headlines in HTML export. + (line 6) +* Help links: External Links. (line 6) * hide text: Visibility Cycling. (line 6) * hiding leading stars: Clean View. (line 6) * hlines, header argument: Results of Evaluation. - (line 102) + (line 101) * hooks: Hooks (2). (line 6) * horizontal rule, in tables: Built-in Table Editor. (line 6) @@ -19174,7 +19516,7 @@ D Main Index * HTML export, CSS: CSS support. (line 6) * HTML, and Orgtbl mode: Translator functions. (line 6) -* HTML, keyword: Quoting HTML tags. (line 14) +* HTML, keyword: Quoting HTML tags. (line 13) * html-style, OPTIONS item: CSS support. (line 56) * HTML5, export new elements: HTML doctypes. (line 25) * HTML_CONTAINER, keyword: HTML specific export settings. @@ -19185,6 +19527,7 @@ D Main Index * HTML_HEAD, keyword: HTML specific export settings. (line 35) * HTML_HEAD, keyword <1>: CSS support. (line 49) +* HTML_HEADLINE_CLASS, property: CSS support. (line 62) * HTML_HEAD_EXTRA, keyword: HTML specific export settings. (line 39) * HTML_HEAD_EXTRA, keyword <1>: CSS support. (line 49) @@ -19207,7 +19550,7 @@ D Main Index (line 34) * idle, resolve, dangling: Resolving idle time. (line 9) * image, centering in LaTeX export: Images in LaTeX export. - (line 57) + (line 60) * ImageMagick: Math formatting in HTML export. (line 6) * ImageMagick <1>: LaTeX math snippets. (line 50) @@ -19223,12 +19566,14 @@ D Main Index * inactive timestamp: Timestamps. (line 50) * include files, during export: Include Files. (line 6) * INCLUDE, keyword: Include Files. (line 6) -* Indent mode: Clean View. (line 20) +* Indent mode: Org Indent Mode. (line 6) * indentation, in code blocks: Editing Source Code. (line 32) -* indentation, in source blocks: Literal Examples. (line 73) +* indentation, in source blocks: Literal Examples. (line 81) * index, in a publishing project: Generating an index. (line 6) * INDEX, keyword: Generating an index. (line 17) * INDEX, property: Indices. (line 14) +* indic, Texinfo attribute: Plain lists in Texinfo export. + (line 12) * Info: Documentation Access. (line 6) * Info directory file, in Texinfo export: Info directory file. @@ -19255,7 +19600,7 @@ D Main Index * internal links, in HTML export: Links in HTML export. (line 6) * introduction: Introduction. (line 6) -* irc links: External Links. (line 6) +* IRC links: External Links. (line 6) * italic text, markup rules: Emphasis and Monospace. (line 6) * ITEM, special property: Special Properties. (line 13) @@ -19282,7 +19627,7 @@ D Main Index * LANGUAGE, keyword: Export Settings. (line 38) * LANGUAGE, keyword <1>: LaTeX specific export settings. (line 20) -* LAST_REPEAT, property: Clocking commands. (line 20) +* LAST_REPEAT, property: Clocking commands. (line 21) * LaTeX class: LaTeX header and sectioning. (line 6) * LaTeX export: LaTeX Export. (line 6) @@ -19320,12 +19665,14 @@ D Main Index (line 30) * Latin-1 export: ASCII/Latin-1/UTF-8 export. (line 6) +* lettered lists, in Texinfo export: Plain lists in Texinfo export. + (line 35) * level, for tags/property match: Matching tags and properties. (line 64) * LibreOffice: OpenDocument Text Export. (line 6) -* limits, in agenda: Filtering/limiting agenda times. - (line 111) +* limits, in agenda: Filtering/limiting agenda items. + (line 128) * line breaks, markup rules: Paragraphs. (line 9) * lines, include: Include Files. (line 36) * link abbreviations: Link Abbreviations. (line 6) @@ -19357,7 +19704,7 @@ D Main Index * LOCATION, property: iCalendar Export. (line 51) * logging, of progress: Progress Logging. (line 6) * LOGGING, property: Tracking TODO state changes. - (line 46) + (line 45) * LOGGING, property <1>: Property Inheritance. (line 37) * LOG_INTO_DRAWER, property: Tracking TODO state changes. @@ -19371,7 +19718,7 @@ D Main Index * maintainer: Feedback. (line 6) * mapping entries, API: Using the Mapping API. (line 6) -* mappings in open-source protocol: open-source protocol. +* mappings in open-source protocol: The open-source protocol. (line 67) * mark ring: Handling Links. (line 139) * Markdown export: Markdown Export. (line 6) @@ -19390,7 +19737,9 @@ D Main Index * MH-E links: External Links. (line 6) * minlevel, include: Include Files. (line 22) * minor mode for tables: Orgtbl Mode. (line 6) -* mkdirp, header argument: Extracting Source Code. +* mkdirp, header argument: Environment of a Code Block. + (line 302) +* mkdirp, header argument <1>: Extracting Source Code. (line 42) * mode, for Calc: Formula syntax for Calc. (line 17) @@ -19421,6 +19770,8 @@ D Main Index (line 118) * noweb-sep, header argument: Noweb Reference Syntax. (line 150) +* number headlines: Dynamic Headline Numbering. + (line 6) * occur, command: Sparse Trees. (line 6) * occur-tree: Storing searches. (line 11) * odd-levels-only outlines: Clean View. (line 6) @@ -19433,21 +19784,22 @@ D Main Index * ODT_STYLES_FILE, keyword <1>: Applying custom styles. (line 29) * only-contents, include: Include Files. (line 53) -* open-source protocol: open-source protocol. +* open-source protocol: The open-source protocol. (line 6) * OpenDocument: OpenDocument Text Export. (line 6) * option keyword completion: Completion. (line 6) * options, for custom agenda views: Setting options. (line 6) -* options, for customization: Customization. (line 6) * options, for export: Export Settings. (line 6) * options, for publishing: Publishing options. (line 6) * OPTIONS, keyword: Export Settings. (line 6) * ordered lists: Plain Lists. (line 6) * ORDERED, property: TODO dependencies. (line 6) -* ORDERED, property <1>: Checkboxes. (line 46) +* ORDERED, property <1>: Checkboxes. (line 45) * Org export: Org Export. (line 6) * Org mode, turning on: Activation. (line 24) +* Org Num mode: Dynamic Headline Numbering. + (line 6) * Org protocol, set-up: Protocols. (line 14) * org-agenda, command: Weekly/daily agenda. (line 10) * Orgtbl mode: Orgtbl Mode. (line 6) @@ -19456,7 +19808,7 @@ D Main Index * ORGTBL, keyword: Radio tables. (line 21) * outline tree: Headlines. (line 6) * output-dir, header argument: Results of Evaluation. - (line 152) + (line 151) * overview, global visibility state: Global and local cycling. (line 20) * packages, interaction with other: Interaction. (line 6) @@ -19475,11 +19827,11 @@ D Main Index * plain lists: Plain Lists. (line 6) * plain lists, in LaTeX export: Plain lists in LaTeX export. (line 6) -* plain text external links: External Links. (line 70) +* plain text external links: External Links. (line 136) * plot tables using Gnuplot: Org Plot. (line 6) * PLOT, keyword: Org Plot. (line 12) * post, header argument: Results of Evaluation. - (line 272) + (line 271) * presentation, of agenda items: Presentation and Sorting. (line 6) * print edition: Summary. (line 54) @@ -19495,7 +19847,7 @@ D Main Index * progress logging: Progress Logging. (line 6) * projects, for publishing: Project alist. (line 6) * prologue, header argument: Environment of a Code Block. - (line 342) + (line 344) * promotion, of subtrees: Structure Editing. (line 6) * proof, in LaTeX export: Special blocks in LaTeX export. (line 6) @@ -19512,20 +19864,24 @@ D Main Index * PROPERTY, keyword: Property Syntax. (line 46) * PROPERTY, keyword <1>: In-buffer Settings. (line 48) * property, macro: Macro Replacement. (line 68) -* protocol, capture: capture protocol. (line 6) +* protocol, capture: The capture protocol. + (line 6) * protocol, new protocol: Protocols. (line 25) -* protocol, open-source: open-source protocol. +* protocol, open-source: The open-source protocol. (line 6) -* protocol, open-source rewritten URL: open-source protocol. +* protocol, open-source rewritten URL: The open-source protocol. (line 32) -* protocol, open-source, set-up mapping: open-source protocol. +* protocol, open-source, set-up mapping: The open-source protocol. (line 67) -* protocol, store-link: store-link protocol. (line 6) -* protocols, for external access: Protocols. (line 6) +* protocol, store-link: The store-link protocol. + (line 6) +* protocols, for external access: Capture and Attachments. + (line 6) +* protocols, for external access <1>: Protocols. (line 6) * publishing: Publishing. (line 6) * publishing options: Publishing options. (line 6) -* query editing, in agenda: Filtering/limiting agenda times. - (line 17) +* query editing, in agenda: Filtering/limiting agenda items. + (line 20) * quote blocks: Paragraphs. (line 25) * radio tables: Radio tables. (line 6) * radio targets: Radio Targets. (line 6) @@ -19540,14 +19896,16 @@ D Main Index * references, to a different table: References. (line 134) * references, to fields: References. (line 15) * references, to ranges: References. (line 64) -* refiling notes: Refile and Copy. (line 6) +* refiling notes: Refiling and Archiving. + (line 6) +* refiling notes <1>: Refile and Copy. (line 6) * refresh set-up: In-buffer Settings. (line 11) * region, active: Structure Editing. (line 132) * regular expressions, with tags search: Matching tags and properties. (line 53) * relative timer: Timers. (line 6) * reminders: Weekly/daily agenda. (line 125) -* remote editing, bulk, from agenda: Agenda Commands. (line 350) +* remote editing, bulk, from agenda: Agenda Commands. (line 352) * remote editing, from agenda: Agenda Commands. (line 223) * remote editing, undo: Agenda Commands. (line 227) * remote references: References. (line 134) @@ -19562,7 +19920,7 @@ D Main Index * results, macro: Macro Replacement. (line 84) * revealing context: Global and local cycling. (line 42) -* rewritten URL in open-source protocol: open-source protocol. +* rewritten URL in open-source protocol: The open-source protocol. (line 32) * Rmail links: External Links. (line 6) * row separator, in tables: Built-in Table Editor. @@ -19570,7 +19928,9 @@ D Main Index * row, of field coordinates: References. (line 89) * rownames, header argument: Environment of a Code Block. (line 73) -* RSS feeds: RSS Feeds. (line 6) +* RSS feeds: Capture and Attachments. + (line 6) +* RSS feeds <1>: RSS Feeds. (line 6) * rsync: Uploading Files. (line 6) * SCHEDULED marker: Deadlines and Scheduling. (line 31) @@ -19588,9 +19948,11 @@ D Main Index (line 6) * SELECT_TAGS, keyword: Export Settings. (line 44) * sep, header argument: Results of Evaluation. - (line 178) + (line 177) +* sep, Texinfo attribute: Plain lists in Texinfo export. + (line 17) * SEQ_TODO, keyword: Per-file keywords. (line 6) -* SEQ_TODO, keyword <1>: In-buffer Settings. (line 265) +* SEQ_TODO, keyword <1>: In-buffer Settings. (line 180) * session, header argument: Environment of a Code Block. (line 272) * setting tags: Setting Tags. (line 6) @@ -19600,8 +19962,8 @@ D Main Index * shebang, header argument: Extracting Source Code. (line 83) * shell links: External Links. (line 6) +* shift-selection: Conflicts. (line 6) * shift-selection-mode: Plain Lists. (line 95) -* shift-selection-mode <1>: Conflicts. (line 6) * show all, command: Global and local cycling. (line 39) * show all, global visibility state: Global and local cycling. @@ -19618,7 +19980,7 @@ D Main Index (line 6) * sorting, of plain list: Plain Lists. (line 159) * sorting, of subtrees: Structure Editing. (line 6) -* source block: Literal Examples. (line 30) +* source block: Literal Examples. (line 38) * source blocks, in LaTeX export: Source blocks in LaTeX export. (line 6) * source code, batch execution: Batch Execution. (line 6) @@ -19643,7 +20005,7 @@ D Main Index (line 6) * sparse tree, for deadlines: Inserting deadline/schedule. (line 26) -* sparse tree, for TODO: TODO Basics. (line 41) +* sparse tree, for TODO: TODO Basics. (line 35) * sparse tree, tag based: Tags. (line 6) * sparse trees: Sparse Trees. (line 6) * special blocks, in ASCII export: ASCII/Latin-1/UTF-8 export. @@ -19656,17 +20018,17 @@ D Main Index * speed keys: Speed Keys. (line 6) * speedbar.el: Cooperation. (line 41) * spreadsheet capabilities: The Spreadsheet. (line 6) -* square brackets in links: Link Format. (line 17) -* square brackets, around links: External Links. (line 70) +* square brackets, around links: External Links. (line 136) * startup visibility: Global and local cycling. (line 35) * STARTUP, keyword: Initial visibility. (line 12) * STARTUP, keyword <1>: Blocks. (line 14) * STARTUP, keyword <2>: In-buffer Settings. (line 65) -* statistics, for checkboxes: Checkboxes. (line 30) +* statistics, for checkboxes: Checkboxes. (line 29) * statistics, for TODO items: Breaking Down Tasks. (line 6) -* store-link protocol: store-link protocol. (line 6) -* storing link, in a source code buffer: Literal Examples. (line 99) +* store-link protocol: The store-link protocol. + (line 6) +* storing link, in a source code buffer: Literal Examples. (line 111) * storing links: Handling Links. (line 9) * strike-through text, markup rules: Emphasis and Monospace. (line 6) @@ -19726,7 +20088,7 @@ D Main Index * table of contents, exclude entries: Table of Contents. (line 15) * table syntax: Built-in Table Editor. (line 6) -* table types, in Texinfo export: Plain lists in Texinfo export. +* table-type, Texinfo attribute: Plain lists in Texinfo export. (line 6) * table.el: Cooperation. (line 49) * tables: Tables. (line 6) @@ -19741,8 +20103,8 @@ D Main Index * tables, in other modes: Tables in Arbitrary Syntax. (line 6) * tag completion: Completion. (line 6) -* tag filtering, in agenda: Filtering/limiting agenda times. - (line 17) +* tag filtering, in agenda: Filtering/limiting agenda items. + (line 20) * tag inheritance: Tag Inheritance. (line 6) * tag searches: Tag Searches. (line 6) * tags: Tags. (line 6) @@ -19752,7 +20114,7 @@ D Main Index * tags, as an agenda view: Storing searches. (line 11) * tags, groups: Tag Hierarchy. (line 6) * TAGS, keyword: Setting Tags. (line 22) -* TAGS, keyword <1>: In-buffer Settings. (line 258) +* TAGS, keyword <1>: In-buffer Settings. (line 173) * tags, setting: Setting Tags. (line 6) * TAGS, special property: Special Properties. (line 13) * tags-todo: Storing searches. (line 11) @@ -19763,7 +20125,7 @@ D Main Index (line 89) * tangling: Extracting Source Code. (line 6) -* targets, for links: Internal Links. (line 6) +* targets, for links: Internal Links. (line 17) * targets, radio: Radio Targets. (line 6) * tasks, breaking down: Breaking Down Tasks. (line 6) * tasks, repeated: Repeated tasks. (line 6) @@ -19854,11 +20216,11 @@ D Main Index * TODO workflow: Workflow states. (line 6) * todo, as an agenda view: Storing searches. (line 11) * TODO, keyword: Per-file keywords. (line 6) -* TODO, keyword <1>: In-buffer Settings. (line 265) +* TODO, keyword <1>: In-buffer Settings. (line 180) * TODO, special property: Special Properties. (line 13) * todo-tree: Storing searches. (line 11) -* top headline filtering, in agenda: Filtering/limiting agenda times. - (line 17) +* top headline filtering, in agenda: Filtering/limiting agenda items. + (line 20) * Top node, in Texinfo export: Headings and sectioning structure. (line 37) * transient mark mode: Structure Editing. (line 132) @@ -19871,7 +20233,7 @@ D Main Index (line 6) * types as TODO keywords: TODO types. (line 6) * TYP_TODO, keyword: Per-file keywords. (line 6) -* TYP_TODO, keyword <1>: In-buffer Settings. (line 265) +* TYP_TODO, keyword <1>: In-buffer Settings. (line 180) * underlined text, markup rules: Emphasis and Monospace. (line 6) * undoing remote-editing events: Agenda Commands. (line 227) @@ -19889,7 +20251,6 @@ D Main Index * var, header argument: Environment of a Code Block. (line 9) * variable index, in Texinfo export: Indices. (line 6) -* variables, for customization: Customization. (line 6) * vectors, in table calculations: Formula syntax for Calc. (line 14) * verbatim blocks, in LaTeX export: Example blocks in LaTeX export. @@ -19904,15 +20265,15 @@ D Main Index * visibility cycling, drawers: Drawers. (line 6) * VISIBILITY, property: Initial visibility. (line 17) * visible text, printing: Sparse Trees. (line 52) -* VM links: External Links. (line 43) -* Wanderlust links: External Links. (line 43) +* VM links: External Links. (line 109) +* Wanderlust links: External Links. (line 109) * weekly agenda: Weekly/daily agenda. (line 6) * windmove.el: Conflicts. (line 60) * workflow states as TODO keywords: Workflow states. (line 6) * working directory, in a code block: Environment of a Code Block. (line 302) * wrap, header argument: Results of Evaluation. - (line 231) + (line 230) * xelatex: LaTeX/PDF export commands. (line 25) * yasnippet.el: Conflicts. (line 74) @@ -19932,71 +20293,71 @@ E Key Index * !: Setting Tags. (line 126) * ! (Agenda dispatcher): Stuck projects. (line 17) * # (Agenda dispatcher): Stuck projects. (line 14) -* $: Agenda Commands. (line 263) -* %: Agenda Commands. (line 377) -* ': CDLaTeX mode. (line 54) -* *: Agenda Commands. (line 357) -* * (Agenda dispatcher): Agenda Dispatcher. (line 49) -* +: Agenda Commands. (line 285) -* ,: Agenda Commands. (line 277) -* -: Agenda Commands. (line 290) +* $: Agenda Commands. (line 265) +* %: Agenda Commands. (line 379) +* ': CDLaTeX mode. (line 57) +* *: Agenda Commands. (line 359) +* * (Agenda dispatcher): Agenda Dispatcher. (line 53) +* +: Agenda Commands. (line 287) +* ,: Agenda Commands. (line 279) +* -: Agenda Commands. (line 292) * .: Agenda Commands. (line 118) -* / (Agenda dispatcher): Agenda Dispatcher. (line 28) +* / (Agenda dispatcher): Agenda Dispatcher. (line 30) * 1..9,0: Using column view. (line 35) -* :: Agenda Commands. (line 273) +* :: Agenda Commands. (line 275) * <: Using column view. (line 66) * < <1>: The date/time prompt. (line 81) -* < (Agenda dispatcher): Agenda Dispatcher. (line 38) -* < < (Agenda dispatcher): Agenda Dispatcher. (line 43) +* < (Agenda dispatcher): Agenda Dispatcher. (line 41) +* < < (Agenda dispatcher): Agenda Dispatcher. (line 47) * >: Using column view. (line 66) * > <1>: The date/time prompt. (line 81) -* > <2>: Agenda Commands. (line 326) +* > <2>: Agenda Commands. (line 328) * ? (Agenda dispatcher): Pulling from the mobile application. (line 39) * [: Agenda Commands. (line 142) -* ^: CDLaTeX mode. (line 40) -* _: CDLaTeX mode. (line 40) -* `: CDLaTeX mode. (line 48) +* ^: CDLaTeX mode. (line 43) +* _: CDLaTeX mode. (line 43) +* `: CDLaTeX mode. (line 51) * a: Using column view. (line 56) * A: Agenda Commands. (line 64) -* a <1>: Agenda Commands. (line 250) +* a <1>: Agenda Commands. (line 252) * a (Agenda dispatcher): Weekly/daily agenda. (line 10) * b: Agenda Commands. (line 115) -* B: Agenda Commands. (line 381) +* B: Agenda Commands. (line 383) * C: Resolving idle time. (line 46) -* c: Agenda Commands. (line 445) -* c <1>: Agenda Commands. (line 448) -* C <1>: Agenda Commands. (line 479) +* c: Agenda Commands. (line 447) +* c <1>: Agenda Commands. (line 450) +* C <1>: Agenda Commands. (line 481) * C (Agenda dispatcher): Storing searches. (line 11) * C (Capture menu: Capture templates. (line 11) * C-#: Advanced features. (line 11) * C-': Agenda Files. (line 26) * C-,: Agenda Files. (line 26) -* C-0 C-c C-w: Refile and Copy. (line 50) -* C-2 C-c C-w: Refile and Copy. (line 42) -* C-3 C-c C-w: Refile and Copy. (line 45) +* C-0 C-c C-w: Refile and Copy. (line 46) +* C-2 C-c C-w: Refile and Copy. (line 38) +* C-3 C-c C-w: Refile and Copy. (line 41) * C-c !: Creating Timestamps. (line 25) -* C-c #: Checkboxes. (line 88) +* C-c #: Checkboxes. (line 87) * C-c $: Moving subtrees. (line 10) * C-c %: Handling Links. (line 139) * C-c &: Handling Links. (line 144) * C-c ': Editing and debugging formulas. (line 37) -* C-c ' <1>: Literal Examples. (line 90) -* C-c ' <2>: Include Files. (line 64) +* C-c ' <1>: Literal Examples. (line 102) +* C-c ' <2>: Include Files. (line 63) * C-c ' <3>: Editing Source Code. (line 6) * C-c ' <4>: Cooperation. (line 59) * C-c *: Structure Editing. (line 124) * C-c * <1>: Plain Lists. (line 143) * C-c * <2>: Updating the table. (line 14) * C-c +: Built-in Table Editor. - (line 168) + (line 180) * C-c ,: Priorities. (line 25) * C-c -: Plain Lists. (line 131) * C-c - <1>: Built-in Table Editor. - (line 113) + (line 125) * C-c .: Creating Timestamps. (line 11) * C-c /: Sparse Trees. (line 16) * C-c / <1>: Conflicts. (line 51) @@ -20011,7 +20372,7 @@ E Key Index * C-c / m <1>: Property Searches. (line 11) * C-c / p: Property Searches. (line 29) * C-c / r: Sparse Trees. (line 20) -* C-c / t: TODO Basics. (line 41) +* C-c / t: TODO Basics. (line 35) * C-c ;: Comment Lines. (line 20) * C-c <: Creating Timestamps. (line 32) * C-c =: Column formulas. (line 33) @@ -20023,46 +20384,63 @@ E Key Index * C-c @: Structure Editing. (line 61) * C-c C-*: Plain Lists. (line 148) * C-c C-,: Structure Templates. (line 11) -* C-c C-a: Attachments. (line 27) -* C-c C-a <1>: Agenda Commands. (line 298) -* C-c C-a a: Attachments. (line 32) -* C-c C-a c: Attachments. (line 38) -* C-c C-a d: Attachments. (line 64) -* C-c C-a D: Attachments. (line 67) -* C-c C-a f: Attachments. (line 58) -* C-c C-a F: Attachments. (line 61) -* C-c C-a i: Attachments. (line 76) -* C-c C-a l: Attachments. (line 38) -* C-c C-a m: Attachments. (line 38) -* C-c C-a n: Attachments. (line 42) -* C-c C-a o: Attachments. (line 49) -* C-c C-a O: Attachments. (line 55) -* C-c C-a s: Attachments. (line 71) -* C-c C-a z: Attachments. (line 45) +* C-c C-a: Attachment defaults and dispatcher. + (line 19) +* C-c C-a <1>: Agenda Commands. (line 300) +* C-c C-a a: Attachment defaults and dispatcher. + (line 24) +* C-c C-a b: Attachment defaults and dispatcher. + (line 34) +* C-c C-a c: Attachment defaults and dispatcher. + (line 30) +* C-c C-a d: Attachment defaults and dispatcher. + (line 60) +* C-c C-a D: Attachment defaults and dispatcher. + (line 63) +* C-c C-a f: Attachment defaults and dispatcher. + (line 54) +* C-c C-a F: Attachment defaults and dispatcher. + (line 57) +* C-c C-a l: Attachment defaults and dispatcher. + (line 30) +* C-c C-a m: Attachment defaults and dispatcher. + (line 30) +* C-c C-a n: Attachment defaults and dispatcher. + (line 38) +* C-c C-a o: Attachment defaults and dispatcher. + (line 45) +* C-c C-a O: Attachment defaults and dispatcher. + (line 51) +* C-c C-a s: Attachment defaults and dispatcher. + (line 67) +* C-c C-a S: Attachment defaults and dispatcher. + (line 72) +* C-c C-a z: Attachment defaults and dispatcher. + (line 41) * C-c C-b: Motion. (line 18) * C-c C-b <1>: Editing support. (line 12) * C-c C-c: Plain Lists. (line 126) -* C-c C-c <1>: Creating Footnotes. (line 67) -* C-c C-c <2>: Built-in Table Editor. +* C-c C-c <1>: Built-in Table Editor. (line 60) -* C-c C-c <3>: Column Width and Alignment. +* C-c C-c <2>: Column Width and Alignment. (line 17) -* C-c C-c <4>: Editing and debugging formulas. +* C-c C-c <3>: Editing and debugging formulas. (line 45) -* C-c C-c <5>: Editing and debugging formulas. +* C-c C-c <4>: Editing and debugging formulas. (line 91) -* C-c C-c <6>: Editing and debugging formulas. +* C-c C-c <5>: Editing and debugging formulas. (line 98) -* C-c C-c <7>: Checkboxes. (line 53) -* C-c C-c <8>: Setting Tags. (line 20) -* C-c C-c <9>: Setting Tags. (line 130) -* C-c C-c <10>: Property Syntax. (line 95) -* C-c C-c <11>: Using column view. (line 49) -* C-c C-c <12>: Capturing column view. - (line 67) -* C-c C-c <13>: Creating Timestamps. (line 29) -* C-c C-c <14>: Clocking commands. (line 52) -* C-c C-c <15>: The clock table. (line 19) +* C-c C-c <6>: Checkboxes. (line 52) +* C-c C-c <7>: Setting Tags. (line 20) +* C-c C-c <8>: Setting Tags. (line 130) +* C-c C-c <9>: Property Syntax. (line 95) +* C-c C-c <10>: Using column view. (line 49) +* C-c C-c <11>: Capturing column view. + (line 71) +* C-c C-c <12>: Creating Timestamps. (line 29) +* C-c C-c <13>: Clocking commands. (line 53) +* C-c C-c <14>: The clock table. (line 17) +* C-c C-c <15>: Creating Footnotes. (line 65) * C-c C-c <16>: Evaluating Code Blocks. (line 22) * C-c C-c <17>: Key bindings and Useful Functions. @@ -20078,7 +20456,7 @@ E Key Index * C-c C-c s: Property Syntax. (line 98) * C-c C-d: Inserting deadline/schedule. (line 10) -* C-c C-d <1>: Agenda Commands. (line 305) +* C-c C-d <1>: Agenda Commands. (line 307) * C-c C-e: The Export Dispatcher. (line 16) * C-c C-e c a: iCalendar Export. (line 43) @@ -20092,10 +20470,6 @@ E Key Index (line 52) * C-c C-e C-v: The Export Dispatcher. (line 64) -* C-c C-e E: Triggering Publication. - (line 19) -* C-c C-e F: Triggering Publication. - (line 16) * C-c C-e h h: HTML export commands. (line 7) * C-c C-e h H: HTML export commands. @@ -20127,8 +20501,14 @@ E Key Index * C-c C-e o O: ODT export commands. (line 23) * C-c C-e O o: Org Export. (line 15) * C-c C-e O v: Org Export. (line 19) -* C-c C-e P: Triggering Publication. +* C-c C-e P a: Triggering Publication. + (line 19) +* C-c C-e P f: Triggering Publication. + (line 16) +* C-c C-e P p: Triggering Publication. (line 13) +* C-c C-e P x: Triggering Publication. + (line 9) * C-c C-e t a: ASCII/Latin-1/UTF-8 export. (line 26) * C-c C-e t A: ASCII/Latin-1/UTF-8 export. @@ -20142,8 +20522,6 @@ E Key Index * C-c C-e t U: ASCII/Latin-1/UTF-8 export. (line 35) * C-c C-e v: Sparse Trees. (line 52) -* C-c C-e X: Triggering Publication. - (line 9) * C-c C-f: Motion. (line 15) * C-c C-j: Motion. (line 24) * C-c C-k: Global and local cycling. @@ -20151,10 +20529,10 @@ E Key Index * C-c C-k (Capture buffer): Using capture. (line 31) * C-c C-l: Handling Links. (line 69) * C-c C-n: Motion. (line 9) -* C-c C-o: Creating Footnotes. (line 73) -* C-c C-o <1>: Handling Links. (line 106) -* C-c C-o <2>: Creating Timestamps. (line 40) -* C-c C-o <3>: Agenda Commands. (line 56) +* C-c C-o: Handling Links. (line 106) +* C-c C-o <1>: Creating Timestamps. (line 40) +* C-c C-o <2>: Agenda Commands. (line 56) +* C-c C-o <3>: Creating Footnotes. (line 71) * C-c C-o <4>: Key bindings and Useful Functions. (line 11) * C-c C-p: Motion. (line 12) @@ -20167,9 +20545,9 @@ E Key Index (line 52) * C-c C-s: Inserting deadline/schedule. (line 18) -* C-c C-s <1>: Agenda Commands. (line 301) +* C-c C-s <1>: Agenda Commands. (line 303) * C-c C-t: TODO Basics. (line 14) -* C-c C-t <1>: Clocking commands. (line 70) +* C-c C-t <1>: Clocking commands. (line 71) * C-c C-u: Motion. (line 21) * C-c C-v a: Key bindings and Useful Functions. (line 20) @@ -20267,8 +20645,8 @@ E Key Index * C-c C-v z: Key bindings and Useful Functions. (line 20) * C-c C-w: Structure Editing. (line 99) -* C-c C-w <1>: Refile and Copy. (line 17) -* C-c C-w <2>: Agenda Commands. (line 247) +* C-c C-w <1>: Refile and Copy. (line 13) +* C-c C-w <2>: Agenda Commands. (line 249) * C-c C-w (Capture buffer): Using capture. (line 22) * C-c C-x ,: Timers. (line 44) * C-c C-x -: Timers. (line 36) @@ -20280,76 +20658,76 @@ E Key Index * C-c C-x > <1>: Agenda Commands. (line 206) * C-c C-x a: Internal archiving. (line 39) * C-c C-x A: Internal archiving. (line 54) -* C-c C-x a <1>: Agenda Commands. (line 255) -* C-c C-x A <1>: Agenda Commands. (line 259) +* C-c C-x a <1>: Agenda Commands. (line 257) +* C-c C-x A <1>: Agenda Commands. (line 261) * C-c C-x b: Global and local cycling. (line 59) * C-c C-x b <1>: Agenda Commands. (line 49) * C-c C-x c: Structure Editing. (line 91) * C-c C-x C-a: Archiving. (line 12) -* C-c C-x C-a <1>: Agenda Commands. (line 250) -* C-c C-x C-b: Checkboxes. (line 59) +* C-c C-x C-a <1>: Agenda Commands. (line 252) +* C-c C-x C-b: Checkboxes. (line 58) * C-c C-x C-c: Using column view. (line 10) * C-c C-x C-c <1>: Agenda Commands. (line 197) * C-c C-x C-c <2>: Agenda Column View. (line 12) -* C-c C-x C-d: Clocking commands. (line 83) -* C-c C-x C-e: Clocking commands. (line 49) +* C-c C-x C-d: Clocking commands. (line 84) +* C-c C-x C-e: Clocking commands. (line 50) * C-c C-x C-e <1>: Effort Estimates. (line 20) * C-c C-x C-i: Clocking commands. (line 7) -* C-c C-x C-j: Clocking commands. (line 78) +* C-c C-x C-j: Clocking commands. (line 79) * C-c C-x C-l: Previewing LaTeX fragments. (line 18) * C-c C-x C-n: Handling Links. (line 151) -* C-c C-x C-o: Clocking commands. (line 35) +* C-c C-x C-o: Clocking commands. (line 36) * C-c C-x C-p: Handling Links. (line 151) -* C-c C-x C-q: Clocking commands. (line 74) -* C-c C-x C-r: The clock table. (line 11) +* C-c C-x C-q: Clocking commands. (line 75) * C-c C-x C-s: Moving subtrees. (line 10) -* C-c C-x C-s <1>: Agenda Commands. (line 263) +* C-c C-x C-s <1>: Agenda Commands. (line 265) * C-c C-x C-t: Custom time format. (line 13) * C-c C-x C-u: Capturing column view. - (line 67) -* C-c C-x C-u <1>: The clock table. (line 19) -* C-c C-x C-u <2>: Dynamic Blocks. (line 22) + (line 71) +* C-c C-x C-u <1>: The clock table. (line 17) +* C-c C-x C-u <2>: Dynamic Blocks. (line 25) * C-c C-x C-v: Images. (line 24) * C-c C-x C-w: Structure Editing. (line 65) * C-c C-x C-w <1>: Built-in Table Editor. - (line 144) -* C-c C-x C-x: Clocking commands. (line 43) + (line 156) +* C-c C-x C-x: Clocking commands. (line 44) * C-c C-x C-y: Structure Editing. (line 73) * C-c C-x C-y <1>: Built-in Table Editor. - (line 148) + (line 160) * C-c C-x d: Drawers. (line 18) * C-c C-x e: Effort Estimates. (line 15) -* C-c C-x f: Creating Footnotes. (line 44) +* C-c C-x f: Creating Footnotes. (line 42) * C-c C-x g: RSS Feeds. (line 23) * C-c C-x G: RSS Feeds. (line 27) * C-c C-x i: Capturing column view. - (line 63) + (line 67) * C-c C-x I: Documentation Access. (line 6) * C-c C-x M-w: Structure Editing. (line 69) * C-c C-x M-w <1>: Built-in Table Editor. - (line 138) + (line 150) * C-c C-x o: TODO dependencies. (line 38) -* C-c C-x o <1>: Checkboxes. (line 80) +* C-c C-x o <1>: Checkboxes. (line 79) * C-c C-x p: Property Syntax. (line 86) * C-c C-x p <1>: Using Header Arguments. (line 70) * C-c C-x q: Tag Hierarchy. (line 86) * C-c C-x v: Global and local cycling. (line 65) +* C-c C-x x: Dynamic Blocks. (line 10) * C-c C-x \: Subscripts and Superscripts. (line 20) * C-c C-x \ <1>: Special Symbols. (line 31) * C-c C-x _: Timers. (line 47) * C-c C-y: Creating Timestamps. (line 62) -* C-c C-y <1>: Clocking commands. (line 52) +* C-c C-y <1>: Clocking commands. (line 53) * C-c C-z: Drawers. (line 39) -* C-c C-z <1>: Agenda Commands. (line 293) -* C-c M-w: Refile and Copy. (line 13) +* C-c C-z <1>: Agenda Commands. (line 295) +* C-c M-w: Refile and Copy. (line 51) * C-c RET: Built-in Table Editor. - (line 117) + (line 129) * C-c SPC: Built-in Table Editor. (line 67) * C-c TAB: Global and local cycling. @@ -20363,33 +20741,33 @@ E Key Index * C-c ^: Structure Editing. (line 103) * C-c ^ <1>: Plain Lists. (line 159) * C-c ^ <2>: Built-in Table Editor. - (line 121) + (line 133) * C-c `: Built-in Table Editor. - (line 186) + (line 201) * C-c {: Editing and debugging formulas. (line 34) -* C-c { <1>: CDLaTeX mode. (line 22) +* C-c { <1>: CDLaTeX mode. (line 25) * C-c |: Built-in Table Editor. (line 42) * C-c | <1>: Built-in Table Editor. - (line 205) + (line 220) * C-c }: Editing and debugging formulas. (line 29) * C-c } <1>: Editing and debugging formulas. (line 83) * C-c ~: Cooperation. (line 63) * C-g: Setting Tags. (line 120) -* C-k: Agenda Commands. (line 241) +* C-k: Agenda Commands. (line 243) * C-RET: Structure Editing. (line 26) -* C-S-DOWN: Clocking commands. (line 58) +* C-S-DOWN: Clocking commands. (line 59) * C-S-LEFT: Multiple sets in one file. (line 28) -* C-S-LEFT <1>: Agenda Commands. (line 238) +* C-S-LEFT <1>: Agenda Commands. (line 240) * C-S-RET: Structure Editing. (line 33) * C-S-RIGHT: Multiple sets in one file. (line 28) -* C-S-RIGHT <1>: Agenda Commands. (line 235) -* C-S-UP: Clocking commands. (line 58) +* C-S-RIGHT <1>: Agenda Commands. (line 237) +* C-S-UP: Clocking commands. (line 59) * C-TAB: Internal archiving. (line 51) * C-u C-c !: Creating Timestamps. (line 25) * C-u C-c *: Updating the table. (line 19) @@ -20400,14 +20778,14 @@ E Key Index (line 14) * C-u C-c C-c: Updating the table. (line 19) * C-u C-c C-l: Handling Links. (line 92) -* C-u C-c C-t: TODO Basics. (line 28) -* C-u C-c C-w: Refile and Copy. (line 36) +* C-u C-c C-t: Progress Logging. (line 10) +* C-u C-c C-w: Refile and Copy. (line 32) * C-u C-c C-x a: Internal archiving. (line 44) * C-u C-c C-x C-s: Moving subtrees. (line 14) * C-u C-c C-x C-u: Capturing column view. - (line 71) -* C-u C-c C-x C-u <1>: The clock table. (line 23) -* C-u C-c C-x C-u <2>: Dynamic Blocks. (line 25) + (line 75) +* C-u C-c C-x C-u <1>: The clock table. (line 21) +* C-u C-c C-x C-u <2>: Dynamic Blocks. (line 28) * C-u C-c TAB: Column Width and Alignment. (line 54) * C-u C-u C-c !: Creating Timestamps. (line 25) @@ -20418,12 +20796,12 @@ E Key Index * C-u C-u C-c C-c: Updating the table. (line 24) * C-u C-u C-c C-t: Multiple sets in one file. (line 28) -* C-u C-u C-c C-w: Refile and Copy. (line 39) +* C-u C-u C-c C-w: Refile and Copy. (line 35) * C-u C-u C-c C-x C-s: Moving subtrees. (line 21) * C-u C-u C-c TAB: Column Width and Alignment. (line 57) -* C-u C-u C-u C-c C-t: TODO dependencies. (line 46) -* C-u C-u C-u C-c C-w: Refile and Copy. (line 50) +* C-u C-u C-u C-c C-w: Refile and Copy. (line 46) +* C-u C-u C-u C-u C-c C-t: TODO dependencies. (line 46) * C-u C-u C-u TAB: Global and local cycling. (line 39) * C-u C-u TAB: Global and local cycling. @@ -20455,19 +20833,19 @@ E Key Index * g: Using column view. (line 22) * G: Agenda Commands. (line 181) * g <1>: Agenda Commands. (line 186) -* H: Agenda Commands. (line 483) -* I: Agenda Commands. (line 330) -* i: Agenda Commands. (line 452) +* H: Agenda Commands. (line 485) +* I: Agenda Commands. (line 332) +* i: Agenda Commands. (line 454) * j: Agenda Commands. (line 121) * J: Agenda Commands. (line 124) -* J <1>: Agenda Commands. (line 340) +* J <1>: Agenda Commands. (line 342) * k: Resolving idle time. (line 23) * K: Resolving idle time. (line 29) -* k <1>: Agenda Commands. (line 343) +* k <1>: Agenda Commands. (line 345) * k c (Agenda): Using capture. (line 33) * l: Agenda Commands. (line 131) -* m: Agenda Commands. (line 351) -* M: Agenda Commands. (line 470) +* m: Agenda Commands. (line 353) +* M: Agenda Commands. (line 472) * m (Agenda dispatcher): Tag Searches. (line 15) * M (Agenda dispatcher): Tag Searches. (line 19) * m (Agenda dispatcher) <1>: Property Searches. (line 15) @@ -20476,7 +20854,7 @@ E Key Index (line 13) * M (Agenda dispatcher) <2>: Matching tags and properties. (line 21) -* M-*: Agenda Commands. (line 373) +* M-*: Agenda Commands. (line 375) * M-a: Built-in Table Editor. (line 78) * M-DOWN: Structure Editing. (line 58) @@ -20498,18 +20876,18 @@ E Key Index * M-LEFT <1>: Plain Lists. (line 108) * M-LEFT <2>: Built-in Table Editor. (line 88) -* M-m: Agenda Commands. (line 369) +* M-m: Agenda Commands. (line 371) * M-RET: Structure Editing. (line 7) * M-RET <1>: Plain Lists. (line 83) * M-RET <2>: Built-in Table Editor. - (line 155) + (line 167) * M-RET <3>: Timers. (line 40) * M-RIGHT: Structure Editing. (line 46) * M-RIGHT <1>: Plain Lists. (line 108) * M-RIGHT <2>: Built-in Table Editor. (line 91) * M-S-DOWN: Built-in Table Editor. - (line 109) + (line 121) * M-S-DOWN <1>: Editing and debugging formulas. (line 74) * M-S-LEFT: Structure Editing. (line 49) @@ -20520,7 +20898,7 @@ E Key Index (line 81) * M-S-RET: Structure Editing. (line 29) * M-S-RET <1>: Plain Lists. (line 91) -* M-S-RET <2>: Checkboxes. (line 76) +* M-S-RET <2>: Checkboxes. (line 75) * M-S-RIGHT: Structure Editing. (line 52) * M-S-RIGHT <1>: Plain Lists. (line 113) * M-S-RIGHT <2>: Built-in Table Editor. @@ -20548,25 +20926,25 @@ E Key Index (line 11) * M-v: The date/time prompt. (line 81) -* mouse-1: Creating Footnotes. (line 73) -* mouse-1 <1>: Handling Links. (line 131) -* mouse-1 <2>: The date/time prompt. +* mouse-1: Handling Links. (line 131) +* mouse-1 <1>: The date/time prompt. (line 81) -* mouse-2: Creating Footnotes. (line 73) -* mouse-2 <1>: Handling Links. (line 131) -* mouse-2 <2>: Agenda Commands. (line 36) +* mouse-1 <2>: Creating Footnotes. (line 71) +* mouse-2: Handling Links. (line 131) +* mouse-2 <1>: Agenda Commands. (line 36) +* mouse-2 <2>: Creating Footnotes. (line 71) * mouse-3: Handling Links. (line 135) * mouse-3 <1>: Agenda Commands. (line 29) * n: Using column view. (line 39) * n <1>: Agenda Commands. (line 20) * o: Agenda Commands. (line 68) -* O: Agenda Commands. (line 334) +* O: Agenda Commands. (line 336) * p: Using column view. (line 39) * p <1>: Agenda Commands. (line 23) -* P: Agenda Commands. (line 282) +* P: Agenda Commands. (line 284) * q: Setting Tags. (line 123) * q <1>: Using column view. (line 26) -* q <2>: Agenda Commands. (line 489) +* q <2>: Agenda Commands. (line 491) * r: Using column view. (line 22) * r <1>: Global TODO list. (line 25) * R: Agenda Commands. (line 154) @@ -20581,67 +20959,75 @@ E Key Index * s: Resolving idle time. (line 35) * S: Resolving idle time. (line 40) * s <1>: Agenda Commands. (line 193) -* S <1>: Agenda Commands. (line 474) -* s (Agenda dispatcher): Agenda Dispatcher. (line 23) +* S <1>: Agenda Commands. (line 476) +* s (Agenda dispatcher): Agenda Dispatcher. (line 25) * s (Agenda dispatcher) <1>: Search view. (line 10) * S-DOWN: Plain Lists. (line 95) -* S-DOWN <1>: Editing and debugging formulas. +* S-DOWN <1>: Built-in Table Editor. + (line 112) +* S-DOWN <2>: Editing and debugging formulas. (line 66) -* S-DOWN <2>: Priorities. (line 33) -* S-DOWN <3>: Creating Timestamps. (line 50) -* S-DOWN <4>: The date/time prompt. +* S-DOWN <3>: Priorities. (line 33) +* S-DOWN <4>: Creating Timestamps. (line 50) +* S-DOWN <5>: The date/time prompt. (line 81) -* S-DOWN <5>: Agenda Commands. (line 290) +* S-DOWN <6>: Agenda Commands. (line 292) * S-LEFT: Plain Lists. (line 154) -* S-LEFT <1>: Editing and debugging formulas. +* S-LEFT <1>: Built-in Table Editor. + (line 115) +* S-LEFT <2>: Editing and debugging formulas. (line 66) -* S-LEFT <2>: TODO Basics. (line 34) -* S-LEFT <3>: Multiple sets in one file. +* S-LEFT <3>: TODO Basics. (line 28) +* S-LEFT <4>: Multiple sets in one file. (line 36) -* S-LEFT <4>: Property Syntax. (line 103) -* S-LEFT <5>: Using column view. (line 39) -* S-LEFT <6>: Creating Timestamps. (line 45) -* S-LEFT <7>: The date/time prompt. +* S-LEFT <5>: Property Syntax. (line 103) +* S-LEFT <6>: Using column view. (line 39) +* S-LEFT <7>: Creating Timestamps. (line 45) +* S-LEFT <8>: The date/time prompt. (line 81) -* S-LEFT <8>: The clock table. (line 28) -* S-LEFT <9>: Agenda Commands. (line 322) -* S-M-DOWN: Clocking commands. (line 63) +* S-LEFT <9>: The clock table. (line 26) +* S-LEFT <10>: Agenda Commands. (line 324) +* S-M-DOWN: Clocking commands. (line 64) * S-M-LEFT: Using column view. (line 72) -* S-M-RET: TODO Basics. (line 60) +* S-M-RET: TODO Basics. (line 54) * S-M-RIGHT: Using column view. (line 69) -* S-M-UP: Clocking commands. (line 63) +* S-M-UP: Clocking commands. (line 64) * S-RET: Built-in Table Editor. - (line 173) + (line 185) * S-RIGHT: Plain Lists. (line 154) -* S-RIGHT <1>: Editing and debugging formulas. +* S-RIGHT <1>: Built-in Table Editor. + (line 118) +* S-RIGHT <2>: Editing and debugging formulas. (line 66) -* S-RIGHT <2>: TODO Basics. (line 34) -* S-RIGHT <3>: Multiple sets in one file. +* S-RIGHT <3>: TODO Basics. (line 28) +* S-RIGHT <4>: Multiple sets in one file. (line 36) -* S-RIGHT <4>: Property Syntax. (line 103) -* S-RIGHT <5>: Using column view. (line 39) -* S-RIGHT <6>: Creating Timestamps. (line 45) -* S-RIGHT <7>: The date/time prompt. +* S-RIGHT <5>: Property Syntax. (line 103) +* S-RIGHT <6>: Using column view. (line 39) +* S-RIGHT <7>: Creating Timestamps. (line 45) +* S-RIGHT <8>: The date/time prompt. (line 81) -* S-RIGHT <8>: The clock table. (line 28) -* S-RIGHT <9>: Agenda Commands. (line 309) +* S-RIGHT <9>: The clock table. (line 26) +* S-RIGHT <10>: Agenda Commands. (line 311) * S-TAB: Global and local cycling. (line 20) * S-TAB <1>: Built-in Table Editor. (line 70) * S-UP: Plain Lists. (line 95) -* S-UP <1>: Editing and debugging formulas. +* S-UP <1>: Built-in Table Editor. + (line 109) +* S-UP <2>: Editing and debugging formulas. (line 66) -* S-UP <2>: Priorities. (line 33) -* S-UP <3>: Creating Timestamps. (line 50) -* S-UP <4>: The date/time prompt. +* S-UP <3>: Priorities. (line 33) +* S-UP <4>: Creating Timestamps. (line 50) +* S-UP <5>: The date/time prompt. (line 81) -* S-UP <5>: Agenda Commands. (line 285) +* S-UP <6>: Agenda Commands. (line 287) * SPC: Setting Tags. (line 114) * SPC <1>: Agenda Commands. (line 29) * t: Agenda Commands. (line 231) -* T: Agenda Commands. (line 268) -* t (Agenda dispatcher): TODO Basics. (line 52) +* T: Agenda Commands. (line 270) +* t (Agenda dispatcher): TODO Basics. (line 46) * t (Agenda dispatcher) <1>: Global TODO list. (line 10) * T (Agenda dispatcher): Global TODO list. (line 18) * TAB: Global and local cycling. @@ -20654,9 +21040,9 @@ E Key Index (line 56) * TAB <5>: Setting Tags. (line 108) * TAB <6>: Agenda Commands. (line 36) -* TAB <7>: CDLaTeX mode. (line 26) -* u: Agenda Commands. (line 361) -* U: Agenda Commands. (line 365) +* TAB <7>: CDLaTeX mode. (line 29) +* u: Agenda Commands. (line 363) +* U: Agenda Commands. (line 367) * v: Using column view. (line 52) * v a: Agenda Commands. (line 146) * v A: Agenda Commands. (line 151) @@ -20672,9 +21058,9 @@ E Key Index * v y: Agenda Commands. (line 101) * v [: Agenda Commands. (line 142) * w: Agenda Commands. (line 81) -* X: Agenda Commands. (line 337) -* x: Agenda Commands. (line 493) -* z: Agenda Commands. (line 293) +* X: Agenda Commands. (line 339) +* x: Agenda Commands. (line 495) +* z: Agenda Commands. (line 295)  File: org, Node: Command and Function Index, Next: Variable Index, Prev: Key Index, Up: Top @@ -20688,64 +21074,66 @@ F Command and Function Index * lisp-complete-symbol: Editing and debugging formulas. (line 63) * next-error: Sparse Trees. (line 32) -* or-clock-goto: Clocking commands. (line 78) +* or-clock-goto: Clocking commands. (line 79) * org-agenda: Activation. (line 13) -* org-agenda-add-note: Agenda Commands. (line 293) -* org-agenda-archive: Agenda Commands. (line 263) +* org-agenda-add-note: Agenda Commands. (line 295) +* org-agenda-archive: Agenda Commands. (line 265) * org-agenda-archive-default-with-confirmation: Agenda Commands. - (line 250) -* org-agenda-archive-to-archive-sibling: Agenda Commands. (line 259) + (line 252) +* org-agenda-archive-to-archive-sibling: Agenda Commands. (line 261) * org-agenda-archives-mode: Agenda Commands. (line 146) -* org-agenda-bulk-action: Agenda Commands. (line 381) -* org-agenda-bulk-mark: Agenda Commands. (line 351) -* org-agenda-bulk-mark-all: Agenda Commands. (line 357) -* org-agenda-bulk-mark-regexp: Agenda Commands. (line 377) -* org-agenda-bulk-remove-all-marks: Agenda Commands. (line 365) -* org-agenda-bulk-toggle: Agenda Commands. (line 369) -* org-agenda-bulk-toggle-all: Agenda Commands. (line 373) -* org-agenda-bulk-unmark: Agenda Commands. (line 361) -* org-agenda-capture: Agenda Commands. (line 343) -* org-agenda-clock-cancel: Agenda Commands. (line 337) +* org-agenda-bulk-action: Agenda Commands. (line 383) +* org-agenda-bulk-mark: Agenda Commands. (line 353) +* org-agenda-bulk-mark-all: Agenda Commands. (line 359) +* org-agenda-bulk-mark-regexp: Agenda Commands. (line 379) +* org-agenda-bulk-remove-all-marks: Agenda Commands. (line 367) +* org-agenda-bulk-toggle: Agenda Commands. (line 371) +* org-agenda-bulk-toggle-all: Agenda Commands. (line 375) +* org-agenda-bulk-unmark: Agenda Commands. (line 363) +* org-agenda-capture: Agenda Commands. (line 345) +* org-agenda-clock-cancel: Agenda Commands. (line 339) * org-agenda-clock-goto: Agenda Commands. (line 124) -* org-agenda-clock-goto <1>: Agenda Commands. (line 340) -* org-agenda-clock-in: Agenda Commands. (line 330) -* org-agenda-clock-out: Agenda Commands. (line 334) +* org-agenda-clock-goto <1>: Agenda Commands. (line 342) +* org-agenda-clock-in: Agenda Commands. (line 332) +* org-agenda-clock-out: Agenda Commands. (line 336) * org-agenda-clockreport-mode: Agenda Commands. (line 154) * org-agenda-columns: Agenda Commands. (line 197) * org-agenda-columns <1>: Agenda Column View. (line 12) -* org-agenda-convert-date: Agenda Commands. (line 479) -* org-agenda-date-prompt: Agenda Commands. (line 326) +* org-agenda-convert-date: Agenda Commands. (line 481) +* org-agenda-date-prompt: Agenda Commands. (line 328) * org-agenda-day-view: Agenda Commands. (line 71) -* org-agenda-deadline: Agenda Commands. (line 305) -* org-agenda-diary-entry: Agenda Commands. (line 452) -* org-agenda-do-date-earlier: Agenda Commands. (line 322) -* org-agenda-do-date-later: Agenda Commands. (line 309) +* org-agenda-deadline: Agenda Commands. (line 307) +* org-agenda-diary-entry: Agenda Commands. (line 454) +* org-agenda-do-date-earlier: Agenda Commands. (line 324) +* org-agenda-do-date-later: Agenda Commands. (line 311) * org-agenda-drag-line-backward: Agenda Commands. (line 210) * org-agenda-drag-line-forward: Agenda Commands. (line 217) * org-agenda-earlier: Agenda Commands. (line 115) * org-agenda-entry-text-mode: Agenda Commands. (line 173) -* org-agenda-exit: Agenda Commands. (line 493) +* org-agenda-exit: Agenda Commands. (line 495) * org-agenda-file-to-front: Agenda Files. (line 16) -* org-agenda-filter-by-category: Filtering/limiting agenda times. - (line 56) -* org-agenda-filter-by-effort: Filtering/limiting agenda times. - (line 82) -* org-agenda-filter-by-regexp: Filtering/limiting agenda times. - (line 70) -* org-agenda-filter-by-tag: Filtering/limiting agenda times. - (line 18) -* org-agenda-filter-by-top-headline: Filtering/limiting agenda times. - (line 66) +* org-agenda-filter: Filtering/limiting agenda items. + (line 73) +* org-agenda-filter-by-category: Filtering/limiting agenda items. + (line 38) +* org-agenda-filter-by-effort: Filtering/limiting agenda items. + (line 49) +* org-agenda-filter-by-regexp: Filtering/limiting agenda items. + (line 44) +* org-agenda-filter-by-tag: Filtering/limiting agenda items. + (line 28) +* org-agenda-filter-by-top-headline: Filtering/limiting agenda items. + (line 68) * org-agenda-follow-mode: Agenda Commands. (line 42) * org-agenda-goto: Agenda Commands. (line 36) -* org-agenda-goto-calendar: Agenda Commands. (line 445) +* org-agenda-goto-calendar: Agenda Commands. (line 447) * org-agenda-goto-date: Agenda Commands. (line 121) * org-agenda-goto-today: Agenda Commands. (line 118) -* org-agenda-holidays: Agenda Commands. (line 483) -* org-agenda-kill: Agenda Commands. (line 241) +* org-agenda-holidays: Agenda Commands. (line 485) +* org-agenda-kill: Agenda Commands. (line 243) * org-agenda-later: Agenda Commands. (line 110) -* org-agenda-limit-interactively: Filtering/limiting agenda times. - (line 147) +* org-agenda-limit-interactively: Filtering/limiting agenda items. + (line 164) * org-agenda-list: Weekly/daily agenda. (line 10) * org-agenda-list-stuck-projects: Stuck projects. (line 14) * org-agenda-log-mode: Agenda Commands. (line 131) @@ -20753,30 +21141,30 @@ F Command and Function Index * org-agenda-month-view: Agenda Commands. (line 91) * org-agenda-next-line: Agenda Commands. (line 20) * org-agenda-open-link: Agenda Commands. (line 56) -* org-agenda-phases-of-moon: Agenda Commands. (line 470) +* org-agenda-phases-of-moon: Agenda Commands. (line 472) * org-agenda-previous-line: Agenda Commands. (line 23) -* org-agenda-priority: Agenda Commands. (line 277) -* org-agenda-priority-down: Agenda Commands. (line 290) -* org-agenda-priority-up: Agenda Commands. (line 285) -* org-agenda-quit: Agenda Commands. (line 489) +* org-agenda-priority: Agenda Commands. (line 279) +* org-agenda-priority-down: Agenda Commands. (line 292) +* org-agenda-priority-up: Agenda Commands. (line 287) +* org-agenda-quit: Agenda Commands. (line 491) * org-agenda-recenter: Agenda Commands. (line 33) * org-agenda-redo: Agenda Commands. (line 186) -* org-agenda-refile: Agenda Commands. (line 247) +* org-agenda-refile: Agenda Commands. (line 249) * org-agenda-remove-restriction-lock: Agenda Files. (line 52) * org-agenda-remove-restriction-lock <1>: Agenda Files. (line 65) * org-agenda-remove-restriction-lock <2>: Agenda Commands. (line 206) * org-agenda-reset-view: Agenda Commands. (line 107) -* org-agenda-schedule: Agenda Commands. (line 301) +* org-agenda-schedule: Agenda Commands. (line 303) * org-agenda-set-restriction-lock: Agenda Files. (line 43) -* org-agenda-set-tags: Agenda Commands. (line 273) +* org-agenda-set-tags: Agenda Commands. (line 275) * org-agenda-show-and-scroll-up: Agenda Commands. (line 29) -* org-agenda-show-priority: Agenda Commands. (line 282) -* org-agenda-show-tags: Agenda Commands. (line 268) -* org-agenda-sunrise-sunset: Agenda Commands. (line 474) +* org-agenda-show-priority: Agenda Commands. (line 284) +* org-agenda-show-tags: Agenda Commands. (line 270) +* org-agenda-sunrise-sunset: Agenda Commands. (line 476) * org-agenda-switch-to: Agenda Commands. (line 39) * org-agenda-todo: Agenda Commands. (line 231) -* org-agenda-todo-nextset: Agenda Commands. (line 235) -* org-agenda-toggle-archive-tag: Agenda Commands. (line 255) +* org-agenda-todo-nextset: Agenda Commands. (line 237) +* org-agenda-toggle-archive-tag: Agenda Commands. (line 257) * org-agenda-toggle-diary: Agenda Commands. (line 127) * org-agenda-tree-to-indirect-buffer: Agenda Commands. (line 49) * org-agenda-undo: Agenda Commands. (line 227) @@ -20791,20 +21179,30 @@ F Command and Function Index (line 11) * org-ascii-convert-region-to-utf8: Export in Foreign Buffers. (line 14) +* org-ascii-export-as-ascii: ASCII/Latin-1/UTF-8 export. + (line 35) * org-ascii-export-to-ascii: ASCII/Latin-1/UTF-8 export. (line 26) -* org-ascii-export-to-ascii <1>: ASCII/Latin-1/UTF-8 export. - (line 35) -* org-attach: Attachments. (line 27) -* org-attach <1>: Agenda Commands. (line 298) -* org-attach-attach: Attachments. (line 32) -* org-attach-dired-to-subtree: Attachments. (line 79) -* org-attach-new: Attachments. (line 42) -* org-attach-open: Attachments. (line 49) -* org-attach-open-in-emacs: Attachments. (line 55) -* org-attach-reveal: Attachments. (line 58) -* org-attach-reveal-in-emacs: Attachments. (line 61) -* org-attach-sync: Attachments. (line 45) +* org-attach: Attachment defaults and dispatcher. + (line 19) +* org-attach <1>: Agenda Commands. (line 300) +* org-attach-attach: Attachment defaults and dispatcher. + (line 24) +* org-attach-buffer: Attachment defaults and dispatcher. + (line 34) +* org-attach-dired-to-subtree: Attach from Dired. (line 6) +* org-attach-new: Attachment defaults and dispatcher. + (line 38) +* org-attach-open: Attachment defaults and dispatcher. + (line 45) +* org-attach-open-in-emacs: Attachment defaults and dispatcher. + (line 51) +* org-attach-reveal: Attachment defaults and dispatcher. + (line 54) +* org-attach-reveal-in-emacs: Attachment defaults and dispatcher. + (line 57) +* org-attach-sync: Attachment defaults and dispatcher. + (line 41) * org-babel-check-src-block: Key bindings and Useful Functions. (line 20) * org-babel-demarcate-block: Key bindings and Useful Functions. @@ -20882,7 +21280,7 @@ F Command and Function Index * org-beamer-select-environment: Editing support. (line 12) * org-buffer-property-keys: Using the Property API. (line 34) -* org-calendar-goto-agenda: Agenda Commands. (line 448) +* org-calendar-goto-agenda: Agenda Commands. (line 450) * org-capture: Activation. (line 13) * org-capture <1>: Using capture. (line 7) * org-capture-finalize: Using capture. (line 15) @@ -20894,20 +21292,19 @@ F Command and Function Index (line 33) * org-check-deadlines: Inserting deadline/schedule. (line 26) -* org-clock-cancel: Clocking commands. (line 74) -* org-clock-display: Clocking commands. (line 83) +* org-clock-cancel: Clocking commands. (line 75) +* org-clock-display: Clocking commands. (line 84) * org-clock-in: Clocking commands. (line 7) -* org-clock-in-last: Clocking commands. (line 43) -* org-clock-modify-effort-estimate: Clocking commands. (line 49) +* org-clock-in-last: Clocking commands. (line 44) +* org-clock-modify-effort-estimate: Clocking commands. (line 50) * org-clock-modify-effort-estimate <1>: Effort Estimates. (line 20) -* org-clock-out: Clocking commands. (line 35) -* org-clock-report: The clock table. (line 11) -* org-clock-timestamp-down: Clocking commands. (line 63) -* org-clock-timestamp-up: Clocking commands. (line 63) -* org-clock-timestamps-down: Clocking commands. (line 58) -* org-clock-timestamps-up: Clocking commands. (line 58) -* org-clocktable-try-shift: The clock table. (line 28) -* org-clocktable-write-default: The clock table. (line 116) +* org-clock-out: Clocking commands. (line 36) +* org-clock-timestamp-down: Clocking commands. (line 64) +* org-clock-timestamp-up: Clocking commands. (line 64) +* org-clock-timestamps-down: Clocking commands. (line 59) +* org-clock-timestamps-up: Clocking commands. (line 59) +* org-clocktable-try-shift: The clock table. (line 26) +* org-clocktable-write-default: The clock table. (line 115) * org-clone-subtree-with-time-shift: Structure Editing. (line 91) * org-columns-delete: Using column view. (line 72) * org-columns-edit-allowed: Using column view. (line 56) @@ -20922,7 +21319,7 @@ F Command and Function Index * org-columns-show-value: Using column view. (line 52) * org-columns-widen: Using column view. (line 66) * org-compute-property-at-point: Property Syntax. (line 112) -* org-copy: Refile and Copy. (line 13) +* org-copy: Refile and Copy. (line 51) * org-copy-subtree: Structure Editing. (line 69) * org-copy-visible: Global and local cycling. (line 65) @@ -20934,9 +21331,9 @@ F Command and Function Index * org-cycle-agenda-files: Agenda Files. (line 26) * org-date-from-calendar: Creating Timestamps. (line 32) * org-dblock-update: Capturing column view. - (line 67) -* org-dblock-update <1>: The clock table. (line 19) -* org-dblock-update <2>: Dynamic Blocks. (line 22) + (line 71) +* org-dblock-update <1>: The clock table. (line 17) +* org-dblock-update <2>: Dynamic Blocks. (line 25) * org-deadline: Inserting deadline/schedule. (line 10) * org-delete-property: Property Syntax. (line 106) @@ -20946,8 +21343,9 @@ F Command and Function Index * org-demote-subtree: Structure Editing. (line 52) * org-do-demote: Structure Editing. (line 46) * org-do-promote: Structure Editing. (line 43) -* org-edit-special: Literal Examples. (line 90) -* org-edit-special <1>: Include Files. (line 64) +* org-dynamic-block-insert-dblock: Dynamic Blocks. (line 10) +* org-edit-special: Literal Examples. (line 102) +* org-edit-special <1>: Include Files. (line 63) * org-edit-special <2>: Cooperation. (line 59) * org-entities-help: Special Symbols. (line 16) * org-entry-add-to-multivalued-property: Using the Property API. @@ -20969,7 +21367,7 @@ F Command and Function Index * org-entry-remove-from-multivalued-property: Using the Property API. (line 53) * org-evaluate-time-range: Creating Timestamps. (line 62) -* org-evaluate-time-range <1>: Clocking commands. (line 52) +* org-evaluate-time-range <1>: Clocking commands. (line 53) * org-export: The Export Dispatcher. (line 16) * org-export-define-backend: Adding Export Back-ends. @@ -20991,11 +21389,11 @@ F Command and Function Index * org-icalendar-combine-agenda-files: iCalendar Export. (line 47) * org-icalendar-export-agenda-files: iCalendar Export. (line 43) * org-icalendar-export-to-ics: iCalendar Export. (line 39) -* org-indent-mode: Clean View. (line 20) +* org-indent-mode: Org Indent Mode. (line 6) * org-info-find-node: Documentation Access. (line 6) * org-insert-columns-dblock: Capturing column view. - (line 63) + (line 67) * org-insert-drawer: Drawers. (line 18) * org-insert-drawer <1>: Property Syntax. (line 90) * org-insert-heading: Plain Lists. (line 83) @@ -21010,8 +21408,8 @@ F Command and Function Index (line 37) * org-insert-structure-template: Structure Templates. (line 11) * org-insert-todo-heading: Structure Editing. (line 29) -* org-insert-todo-heading <1>: TODO Basics. (line 60) -* org-insert-todo-heading <2>: Checkboxes. (line 76) +* org-insert-todo-heading <1>: TODO Basics. (line 54) +* org-insert-todo-heading <2>: Checkboxes. (line 75) * org-insert-todo-heading-respect-content: Structure Editing. (line 33) * org-latex-convert-region-to-latex: Export in Foreign Buffers. (line 20) @@ -21021,6 +21419,9 @@ F Command and Function Index (line 7) * org-latex-export-to-pdf: LaTeX/PDF export commands. (line 14) +* org-latex-preview: Previewing LaTeX fragments. + (line 18) +* org-link-escape: Link Format. (line 25) * org-link-set-parameters: Adding Hyperlink Types. (line 69) * org-lint: Org Syntax. (line 24) @@ -21046,7 +21447,7 @@ F Command and Function Index * org-move-subtree-down: Structure Editing. (line 58) * org-move-subtree-up: Structure Editing. (line 55) * org-narrow-to-block: Structure Editing. (line 118) -* org-narrow-to-block <1>: Dynamic Blocks. (line 56) +* org-narrow-to-block <1>: Dynamic Blocks. (line 58) * org-narrow-to-subtree: Structure Editing. (line 115) * org-next-link: Handling Links. (line 151) * org-next-visible-heading: Motion. (line 9) @@ -21070,9 +21471,9 @@ F Command and Function Index (line 90) * org-promote-subtree: Structure Editing. (line 49) * org-property-action: Property Syntax. (line 95) -* org-protocol-create: open-source protocol. +* org-protocol-create: The open-source protocol. (line 67) -* org-protocol-create-for-org: open-source protocol. +* org-protocol-create-for-org: The open-source protocol. (line 67) * org-publish: Triggering Publication. (line 9) @@ -21086,9 +21487,9 @@ F Command and Function Index * org-publish-find-property: Site map. (line 21) * org-publish-find-title: Site map. (line 21) * org-refile: Structure Editing. (line 99) -* org-refile <1>: Refile and Copy. (line 17) -* org-refile-cache-clear: Refile and Copy. (line 50) -* org-refile-goto-last-stored: Refile and Copy. (line 39) +* org-refile <1>: Refile and Copy. (line 13) +* org-refile-cache-clear: Refile and Copy. (line 46) +* org-refile-goto-last-stored: Refile and Copy. (line 35) * org-remove-file: Agenda Files. (line 22) * org-reveal: Global and local cycling. (line 42) @@ -21105,7 +21506,7 @@ F Command and Function Index (line 35) * org-set-startup-visibility <1>: Initial visibility. (line 23) * org-set-tags-command: Setting Tags. (line 11) -* org-show-todo-tree: TODO Basics. (line 41) +* org-show-todo-tree: TODO Basics. (line 35) * org-sort: Structure Editing. (line 103) * org-sparse-tree: Sparse Trees. (line 16) * org-speed-command-help: Speed Keys. (line 18) @@ -21125,20 +21526,20 @@ F Command and Function Index * org-table-blank-field: Built-in Table Editor. (line 67) * org-table-copy-down: Built-in Table Editor. - (line 173) + (line 185) * org-table-copy-region: Built-in Table Editor. - (line 138) + (line 150) * org-table-create-or-convert-from-region: Built-in Table Editor. (line 42) * org-table-create-or-convert-from-region <1>: Built-in Table Editor. - (line 205) + (line 220) * org-table-create-with-table.el: Cooperation. (line 63) * org-table-cut-region: Built-in Table Editor. - (line 144) + (line 156) * org-table-delete-column: Built-in Table Editor. (line 94) * org-table-edit-field: Built-in Table Editor. - (line 186) + (line 201) * org-table-edit-formulas: Editing and debugging formulas. (line 37) * org-table-end-of-field: Built-in Table Editor. @@ -21153,7 +21554,7 @@ F Command and Function Index * org-table-expand: Column Width and Alignment. (line 57) * org-table-export: Built-in Table Editor. - (line 210) + (line 225) * org-table-fedit-abort: Editing and debugging formulas. (line 49) * org-table-fedit-finish: Editing and debugging formulas. @@ -21181,19 +21582,27 @@ F Command and Function Index * org-table-field-info: Editing and debugging formulas. (line 25) * org-table-hline-and-move: Built-in Table Editor. - (line 117) + (line 129) * org-table-import: Built-in Table Editor. - (line 196) + (line 211) * org-table-insert-column: Built-in Table Editor. (line 97) * org-table-insert-hline: Built-in Table Editor. - (line 113) + (line 125) * org-table-insert-row: Built-in Table Editor. - (line 109) + (line 121) * org-table-iterate: Updating the table. (line 24) * org-table-iterate-buffer-tables: Updating the table. (line 32) * org-table-kill-row: Built-in Table Editor. (line 106) +* org-table-move-cell-down: Built-in Table Editor. + (line 112) +* org-table-move-cell-left: Built-in Table Editor. + (line 115) +* org-table-move-cell-right: Built-in Table Editor. + (line 118) +* org-table-move-cell-up: Built-in Table Editor. + (line 109) * org-table-move-column-left: Built-in Table Editor. (line 88) * org-table-move-column-right: Built-in Table Editor. @@ -21207,7 +21616,7 @@ F Command and Function Index * org-table-next-row: Built-in Table Editor. (line 73) * org-table-paste-rectangle: Built-in Table Editor. - (line 148) + (line 160) * org-table-previous-field: Built-in Table Editor. (line 70) * org-table-recalculate: Updating the table. (line 14) @@ -21216,9 +21625,9 @@ F Command and Function Index * org-table-shrink: Column Width and Alignment. (line 54) * org-table-sort-lines: Built-in Table Editor. - (line 121) + (line 133) * org-table-sum: Built-in Table Editor. - (line 168) + (line 180) * org-table-toggle-column-width: Column Width and Alignment. (line 44) * org-table-toggle-coordinate-overlays: Editing and debugging formulas. @@ -21228,7 +21637,7 @@ F Command and Function Index * org-table-toggle-formula-debugger: Editing and debugging formulas. (line 34) * org-table-wrap-region: Built-in Table Editor. - (line 155) + (line 167) * org-tags-view: Tag Searches. (line 15) * org-tags-view <1>: Property Searches. (line 15) * org-tags-view <2>: Matching tags and properties. @@ -21251,31 +21660,29 @@ F Command and Function Index * org-timer-stop: Timers. (line 47) * org-timestamp-down-day: Creating Timestamps. (line 45) * org-timestamp-up-day: Creating Timestamps. (line 45) -* org-todo: Clocking commands. (line 70) +* org-todo: Clocking commands. (line 71) * org-todo <1>: Using the Mapping API. (line 77) * org-todo-list: Global TODO list. (line 10) * org-todo-list <1>: Global TODO list. (line 18) * org-toggle-archive-tag: Internal archiving. (line 39) -* org-toggle-checkbox: Checkboxes. (line 53) +* org-toggle-checkbox: Checkboxes. (line 52) * org-toggle-comment: Comment Lines. (line 20) * org-toggle-heading: Structure Editing. (line 124) * org-toggle-inline-images: Images. (line 24) -* org-toggle-latex-fragment: Previewing LaTeX fragments. - (line 18) * org-toggle-ordered-property: TODO dependencies. (line 38) -* org-toggle-ordered-property <1>: Checkboxes. (line 80) +* org-toggle-ordered-property <1>: Checkboxes. (line 79) * org-toggle-pretty-entities: Subscripts and Superscripts. (line 20) * org-toggle-pretty-entities <1>: Special Symbols. (line 31) -* org-toggle-sticky-agenda: Agenda Dispatcher. (line 49) +* org-toggle-sticky-agenda: Agenda Dispatcher. (line 53) * org-toggle-tag: Using the Mapping API. (line 85) * org-toggle-tags-groups: Tag Hierarchy. (line 86) * org-toggle-time-stamp-overlays: Custom time format. (line 13) * org-tree-to-indirect-buffer: Global and local cycling. (line 59) -* org-update-statistics-cookies: Checkboxes. (line 88) +* org-update-statistics-cookies: Checkboxes. (line 87) * org-version: Feedback. (line 13) * org-yank: Structure Editing. (line 79) * orgtbl-ascii-draw: Org Plot. (line 109) @@ -21320,35 +21727,35 @@ org-customize’ and then click yourself through the tree. [index] * Menu: -* cdlatex-simplify-sub-super-scripts: CDLaTeX mode. (line 40) +* cdlatex-simplify-sub-super-scripts: CDLaTeX mode. (line 43) * constants-unit-system: References. (line 120) -* constants-unit-system <1>: In-buffer Settings. (line 202) +* constants-unit-system <1>: In-buffer Settings. (line 141) * LaTeX-verbatim-environments: A LaTeX example. (line 19) -* org-adapt-indentation: Clean View. (line 49) -* org-agenda-auto-exclude-function: Filtering/limiting agenda times. - (line 32) -* org-agenda-bulk-custom-functions: Agenda Commands. (line 350) -* org-agenda-bulk-custom-functions <1>: Agenda Commands. (line 429) -* org-agenda-bulk-persistent-marks: Agenda Commands. (line 381) -* org-agenda-category-filter-preset: Filtering/limiting agenda times. - (line 61) -* org-agenda-category-icon-alist: Categories. (line 19) +* org-adapt-indentation: Hard indentation. (line 16) +* org-agenda-auto-exclude-function: Filtering/limiting agenda items. + (line 98) +* org-agenda-bulk-custom-functions: Agenda Commands. (line 352) +* org-agenda-bulk-custom-functions <1>: Agenda Commands. (line 431) +* org-agenda-bulk-persistent-marks: Agenda Commands. (line 383) +* org-agenda-category-filter-preset: Filtering/limiting agenda items. + (line 6) +* org-agenda-category-icon-alist: Categories. (line 16) * org-agenda-clock-consistency-checks: Agenda Commands. (line 165) * org-agenda-columns-add-appointments-to-effort-sum: Effort Estimates. (line 41) -* org-agenda-confirm-kill: Agenda Commands. (line 241) +* org-agenda-confirm-kill: Agenda Commands. (line 243) * org-agenda-custom-commands: Sparse Trees. (line 37) * org-agenda-custom-commands <1>: Storing searches. (line 11) * org-agenda-custom-commands <2>: Setting options. (line 6) * org-agenda-custom-commands <3>: Extracting Agenda Information. (line 10) * org-agenda-custom-commands-contexts: Setting options. (line 59) -* org-agenda-diary-file: Agenda Commands. (line 458) +* org-agenda-diary-file: Agenda Commands. (line 460) * org-agenda-dim-blocked-tasks: TODO dependencies. (line 48) * org-agenda-dim-blocked-tasks <1>: Speeding Up Your Agendas. (line 15) -* org-agenda-effort-filter-preset: Filtering/limiting agenda times. - (line 101) +* org-agenda-effort-filter-preset: Filtering/limiting agenda items. + (line 6) * org-agenda-entry-text-maxlines: Agenda Commands. (line 173) * org-agenda-exporter-settings: Exporting Agenda Views. (line 14) @@ -21360,24 +21767,24 @@ org-customize’ and then click yourself through the tree. * org-agenda-inhibit-startup: Speeding Up Your Agendas. (line 19) * org-agenda-log-mode-items: Agenda Commands. (line 131) -* org-agenda-max-effort: Filtering/limiting agenda times. - (line 118) -* org-agenda-max-entries: Filtering/limiting agenda times. - (line 115) -* org-agenda-max-tags: Filtering/limiting agenda times. - (line 124) -* org-agenda-max-todos: Filtering/limiting agenda times. - (line 121) +* org-agenda-max-effort: Filtering/limiting agenda items. + (line 135) +* org-agenda-max-entries: Filtering/limiting agenda items. + (line 132) +* org-agenda-max-tags: Filtering/limiting agenda items. + (line 141) +* org-agenda-max-todos: Filtering/limiting agenda items. + (line 138) * org-agenda-overriding-header: Special Agenda Views. (line 38) * org-agenda-prefix-format: Presentation and Sorting. (line 6) -* org-agenda-regexp-filter-preset: Filtering/limiting agenda times. - (line 77) +* org-agenda-regexp-filter-preset: Filtering/limiting agenda items. + (line 6) * org-agenda-restore-windows-after-quit: Agenda Views. (line 42) * org-agenda-search-headline-for-time: Time-of-day specifications. (line 16) -* org-agenda-show-inherited-tags: Agenda Commands. (line 268) +* org-agenda-show-inherited-tags: Agenda Commands. (line 270) * org-agenda-show-inherited-tags <1>: Speeding Up Your Agendas. (line 23) * org-agenda-skip-archived-trees: Internal archiving. (line 23) @@ -21408,15 +21815,15 @@ org-customize’ and then click yourself through the tree. * org-agenda-start-with-clockreport-mode: Agenda Commands. (line 154) * org-agenda-start-with-entry-text-mode: Agenda Commands. (line 173) * org-agenda-start-with-follow-mode: Agenda Commands. (line 42) -* org-agenda-sticky: Agenda Dispatcher. (line 49) -* org-agenda-tag-filter-preset: Filtering/limiting agenda times. - (line 18) +* org-agenda-sticky: Agenda Dispatcher. (line 53) +* org-agenda-tag-filter-preset: Filtering/limiting agenda items. + (line 6) * org-agenda-tags-column: Presentation and Sorting. (line 6) * org-agenda-tags-todo-honor-ignore-options: Matching tags and properties. (line 21) -* org-agenda-text-search-extra-files: Agenda Dispatcher. (line 28) -* org-agenda-text-search-extra-files <1>: Search view. (line 33) +* org-agenda-text-search-extra-files: Agenda Dispatcher. (line 30) +* org-agenda-text-search-extra-files <1>: Search view. (line 34) * org-agenda-time-grid: Time-of-day specifications. (line 46) * org-agenda-time-grid <1>: Agenda Commands. (line 181) @@ -21425,7 +21832,7 @@ org-customize’ and then click yourself through the tree. * org-agenda-todo-ignore-timestamp: Global TODO list. (line 42) * org-agenda-todo-ignore-with-date: Global TODO list. (line 42) * org-agenda-todo-list-sublevels: Breaking Down Tasks. (line 6) -* org-agenda-todo-list-sublevels <1>: Global TODO list. (line 51) +* org-agenda-todo-list-sublevels <1>: Global TODO list. (line 53) * org-agenda-use-tag-inheritance: Tag Inheritance. (line 32) * org-agenda-use-tag-inheritance <1>: Speeding Up Your Agendas. (line 23) @@ -21435,7 +21842,7 @@ org-customize’ and then click yourself through the tree. * org-agenda-window-setup: Agenda Views. (line 42) * org-alphabetical-lists: Plain Lists. (line 15) * org-archive-default-command: Archiving. (line 12) -* org-archive-default-command <1>: Agenda Commands. (line 250) +* org-archive-default-command <1>: Agenda Commands. (line 252) * org-archive-location: Moving subtrees. (line 10) * org-archive-location <1>: In-buffer Settings. (line 15) * org-archive-save-context-info: Moving subtrees. (line 41) @@ -21443,15 +21850,24 @@ org-customize’ and then click yourself through the tree. (line 16) * org-ascii-text-width: ASCII/Latin-1/UTF-8 export. (line 13) -* org-attach-directory: Attachments. (line 6) -* org-attach-method: Attachments. (line 32) +* org-attach-archive-delete: Attachment options. (line 60) +* org-attach-auto-tag: Attachment options. (line 64) +* org-attach-dir-relative: Attachment options. (line 13) +* org-attach-expert: Attachment options. (line 77) +* org-attach-id-dir: Attachment options. (line 9) +* org-attach-id-to-path-function-list: Attachment options. (line 68) +* org-attach-method: Attachment defaults and dispatcher. + (line 24) +* org-attach-method <1>: Attachment options. (line 49) +* org-attach-preferred-new-method: Attachment options. (line 55) +* org-attach-use-inheritance: Attachment options. (line 18) * org-babel-default-header-args: Using Header Arguments. (line 19) * org-babel-default-header-args <1>: Using Header Arguments. (line 19) * org-babel-inline-result-wrap: Evaluating Code Blocks. (line 27) -* org-babel-load-languages: Languages. (line 35) +* org-babel-load-languages: Languages. (line 36) * org-babel-post-tangle-hook: Extracting Source Code. (line 122) * org-beamer-environments-default: Frames and Blocks in Beamer. @@ -21469,38 +21885,35 @@ org-customize’ and then click yourself through the tree. * org-capture-templates: Capture templates. (line 11) * org-capture-templates-contexts: Templates in contexts. (line 6) -* org-capture-use-agenda-date: Agenda Commands. (line 343) +* org-capture-use-agenda-date: Agenda Commands. (line 345) * org-catch-invisible-edits: Catching invisible edits. (line 6) * org-clock-continuously: Clocking commands. (line 7) -* org-clock-continuously <1>: Clocking commands. (line 43) +* org-clock-continuously <1>: Clocking commands. (line 44) * org-clock-continuously <2>: Resolving idle time. (line 78) -* org-clock-display-default-range: The clock table. (line 79) +* org-clock-display-default-range: The clock table. (line 77) * org-clock-idle-time: Resolving idle time. (line 14) -* org-clock-in-prepare-hook: Clocking commands. (line 20) +* org-clock-in-prepare-hook: Clocking commands. (line 21) * org-clock-into-drawer: Clocking commands. (line 7) -* org-clock-mode-line-total: Clocking commands. (line 20) +* org-clock-mode-line-total: Clocking commands. (line 21) * org-clock-persist: Clocking Work Time. (line 19) * org-clock-report-include-clocking-task: Agenda Commands. (line 154) * org-clock-x11idle-program-name: Resolving idle time. (line 14) -* org-clocktable-defaults: The clock table. (line 38) +* org-clocktable-defaults: The clock table. (line 36) * org-closed-keep-when-no-todo: Closing items. (line 11) -* org-coderef-label-format: Literal Examples. (line 76) +* org-coderef-label-format: Literal Examples. (line 88) * org-columns: Using column view. (line 10) * org-columns-default-format: Using column view. (line 10) * org-columns-default-format <1>: Effort Estimates. (line 31) * org-columns-default-format <2>: Agenda Commands. (line 197) * org-columns-default-format <3>: Agenda Column View. (line 19) +* org-columns-default-format-for-agenda: Agenda Column View. (line 19) * org-columns-skip-archived-trees: Internal archiving. (line 33) * org-columns-summary-types: Column attributes. (line 51) * org-complete-tags-always-offer-all-agenda-tags: Setting Tags. (line 22) * org-confirm-babel-evaluate: Code Evaluation Security. (line 25) -* org-confirm-elisp-link-function: Code Evaluation Security. - (line 52) -* org-confirm-shell-link-function: Code Evaluation Security. - (line 49) * org-create-file-search-functions: Custom Searches. (line 12) * org-crypt-tag-matcher: Org Crypt. (line 10) * org-ctrl-k-protect-subtree: Headlines. (line 6) @@ -21510,7 +21923,7 @@ org-customize’ and then click yourself through the tree. (line 30) * org-cycle-include-plain-lists: Plain Lists. (line 70) * org-cycle-open-archived-trees: Internal archiving. (line 13) -* org-cycle-separator-lines: Headlines. (line 24) +* org-cycle-separator-lines: Headlines. (line 28) * org-deadline-warning-days: Deadlines and Scheduling. (line 14) * org-deadline-warning-days <1>: Inserting deadline/schedule. @@ -21521,14 +21934,11 @@ org-customize’ and then click yourself through the tree. * org-default-priority <1>: In-buffer Settings. (line 43) * org-directory: Template elements. (line 50) * org-display-custom-times: Custom time format. (line 6) -* org-display-internal-link-with-indirect-buffer: Handling Links. - (line 135) * org-disputed-keys: Conflicts. (line 27) * org-done, face: Faces for TODO keywords. (line 6) * org-edit-src-auto-save-idle-delay: Editing Source Code. (line 11) * org-effort-property: Effort Estimates. (line 6) -* org-email-link-description-format: Handling Links. (line 31) * org-enforce-todo-dependencies: TODO dependencies. (line 6) * org-enforce-todo-dependencies <1>: TODO dependencies. (line 53) * org-entities-user: Special Symbols. (line 16) @@ -21615,23 +22025,23 @@ org-customize’ and then click yourself through the tree. (line 16) * org-fast-tag-selection-single-key: Setting Tags. (line 141) * org-file-apps: Handling Links. (line 106) -* org-file-apps <1>: Attachments. (line 49) +* org-file-apps <1>: Attachment defaults and dispatcher. + (line 45) * org-fontify-emphasized-text: Emphasis and Monospace. (line 11) -* org-footnote-auto-adjust: Creating Footnotes. (line 62) -* org-footnote-auto-adjust <1>: In-buffer Settings. (line 211) -* org-footnote-auto-label: Creating Footnotes. (line 34) -* org-footnote-auto-label <1>: In-buffer Settings. (line 211) -* org-footnote-define-inline: Creating Footnotes. (line 47) -* org-footnote-define-inline <1>: In-buffer Settings. (line 211) +* org-footnote-auto-adjust: Creating Footnotes. (line 60) +* org-footnote-auto-adjust <1>: In-buffer Settings. (line 147) +* org-footnote-auto-label: Creating Footnotes. (line 32) +* org-footnote-auto-label <1>: In-buffer Settings. (line 147) +* org-footnote-define-inline: Creating Footnotes. (line 45) +* org-footnote-define-inline <1>: In-buffer Settings. (line 147) * org-footnote-section: Headlines. (line 17) -* org-footnote-section <1>: Creating Footnotes. (line 47) +* org-footnote-section <1>: Creating Footnotes. (line 45) * org-format-latex-header: LaTeX fragments. (line 6) * org-format-latex-header <1>: Previewing LaTeX fragments. (line 12) * org-format-latex-options: Previewing LaTeX fragments. (line 12) -* org-from-is-user-regexp: Template expansion. (line 104) * org-global-properties: Property Syntax. (line 76) * org-global-properties <1>: Effort Estimates. (line 31) * org-goto-auto-isearch: Motion. (line 24) @@ -21645,13 +22055,13 @@ org-customize’ and then click yourself through the tree. (line 87) * org-habit-show-habits-only-for-today: Tracking your habits. (line 94) -* org-hide, face: Clean View. (line 68) +* org-hide, face: Hard indentation. (line 21) * org-hide-block-startup: Blocks. (line 6) -* org-hide-block-startup <1>: In-buffer Settings. (line 239) -* org-hide-leading-stars: In-buffer Settings. (line 172) -* org-hide-leading-stars <1>: Clean View. (line 54) +* org-hide-block-startup <1>: In-buffer Settings. (line 160) +* org-hide-leading-stars: Hard indentation. (line 21) +* org-hide-leading-stars <1>: In-buffer Settings. (line 123) * org-hide-macro-markers: Macro Replacement. (line 88) -* org-hierarchical-checkbox-statistics: Checkboxes. (line 30) +* org-hierarchical-checkbox-statistics: Checkboxes. (line 29) * org-hierarchical-todo-statistics: Breaking Down Tasks. (line 25) * org-highest-priority: Priorities. (line 38) * org-highest-priority <1>: In-buffer Settings. (line 43) @@ -21692,6 +22102,8 @@ org-customize’ and then click yourself through the tree. (line 6) * org-html-preamble-format: HTML preamble and postamble. (line 6) +* org-html-self-link-headlines: Headlines in HTML export. + (line 10) * org-html-style-default: CSS support. (line 44) * org-html-table-align-individual-fields: Tables in HTML export. (line 20) @@ -21719,11 +22131,13 @@ org-customize’ and then click yourself through the tree. * org-icalendar-use-scheduled: iCalendar Export. (line 11) * org-id-link-to-org-use-id: Handling Links. (line 21) * org-imenu-depth: Cooperation. (line 37) -* org-indent-indentation-per-level: Clean View. (line 24) +* org-indent-indentation-per-level: Org Indent Mode. (line 11) +* org-indent-mode-turns-off-org-adapt-indentation: Org Indent Mode. + (line 15) +* org-indent-mode-turns-on-hiding-stars: Org Indent Mode. (line 15) * org-infojs-options: JavaScript support. (line 71) * org-insert-mode-line-in-empty-file: Activation. (line 30) * org-irc-links-to-logs: Handling Links. (line 45) -* org-keep-stored-link-after-insertion: Handling Links. (line 69) * org-latex-bibtex-compiler: LaTeX/PDF export commands. (line 25) * org-latex-classes: LaTeX specific export settings. @@ -21753,15 +22167,15 @@ org-customize’ and then click yourself through the tree. * org-latex-hyperref-template <1>: LaTeX specific export settings. (line 54) * org-latex-images-centered: Images in LaTeX export. - (line 57) -* org-latex-listings: Literal Examples. (line 23) + (line 60) +* org-latex-listings: Literal Examples. (line 31) * org-latex-listings-options: Source blocks in LaTeX export. (line 25) * org-latex-minted-options: Source blocks in LaTeX export. (line 25) -* org-latex-package-alist: LaTeX specific export settings. +* org-latex-packages-alist: LaTeX specific export settings. (line 20) -* org-latex-packages-alist: LaTeX header and sectioning. +* org-latex-packages-alist <1>: LaTeX header and sectioning. (line 13) * org-latex-subtitle-format: LaTeX specific export settings. (line 63) @@ -21779,28 +22193,37 @@ org-customize’ and then click yourself through the tree. * org-latex-to-mathml-jar-file: LaTeX math snippets. (line 20) * org-link-abbrev-alist: Link Abbreviations. (line 12) * org-link-abbrev-alist <1>: In-buffer Settings. (line 38) +* org-link-elisp-confirm-function: Code Evaluation Security. + (line 52) +* org-link-email-description-format: Handling Links. (line 31) * org-link-frame-setup: Handling Links. (line 121) +* org-link-from-user-regexp: Template expansion. (line 104) +* org-link-keep-stored-after-insertion: Handling Links. (line 69) * org-link-parameters: Adding Hyperlink Types. (line 69) +* org-link-search-must-match-exact-headline: Internal Links. (line 31) +* org-link-shell-confirm-function: Code Evaluation Security. + (line 49) +* org-link-use-indirect-buffer-for-internals: Handling Links. (line 135) * org-list-automatic-rules: Plain Lists. (line 63) * org-list-automatic-rules <1>: Checkboxes. (line 6) * org-list-demote-modify-bullet: Plain Lists. (line 57) * org-list-indent-offset: Plain Lists. (line 57) * org-list-use-circular-motion: Plain Lists. (line 95) * org-log-done: Tracking TODO state changes. - (line 29) + (line 28) * org-log-done <1>: Agenda Commands. (line 131) -* org-log-done <2>: In-buffer Settings. (line 117) +* org-log-done <2>: In-buffer Settings. (line 101) * org-log-into-drawer: Tracking TODO state changes. (line 6) -* org-log-into-drawer <1>: Agenda Commands. (line 293) -* org-log-note-clock-out: Clocking commands. (line 35) -* org-log-note-clock-out <1>: In-buffer Settings. (line 117) +* org-log-into-drawer <1>: Agenda Commands. (line 295) +* org-log-note-clock-out: Clocking commands. (line 36) +* org-log-note-clock-out <1>: In-buffer Settings. (line 101) * org-log-redeadline: Inserting deadline/schedule. (line 10) -* org-log-refile: Refile and Copy. (line 17) +* org-log-refile: Refile and Copy. (line 13) * org-log-repeat: Repeated tasks. (line 40) -* org-log-repeat <1>: In-buffer Settings. (line 117) +* org-log-repeat <1>: In-buffer Settings. (line 101) * org-log-reschedule: Inserting deadline/schedule. (line 18) * org-log-states-order-reversed: Tracking TODO state changes. @@ -21818,10 +22241,24 @@ org-customize’ and then click yourself through the tree. (line 6) * org-mobile-inbox-for-pull: Pulling from the mobile application. (line 12) +* org-num-face: Dynamic Headline Numbering. + (line 19) +* org-num-format-function: Dynamic Headline Numbering. + (line 19) +* org-num-max-level: Dynamic Headline Numbering. + (line 10) +* org-num-skip-commented: Dynamic Headline Numbering. + (line 10) +* org-num-skip-footnotes: Dynamic Headline Numbering. + (line 16) +* org-num-skip-tags: Dynamic Headline Numbering. + (line 10) +* org-num-skip-unnumbered: Dynamic Headline Numbering. + (line 10) * org-odd-levels-only: Matching tags and properties. (line 64) -* org-odd-levels-only <1>: In-buffer Settings. (line 172) -* org-odd-levels-only <2>: Clean View. (line 74) +* org-odd-levels-only <1>: Hard indentation. (line 29) +* org-odd-levels-only <2>: In-buffer Settings. (line 123) * org-odd-levels-only <3>: Special Agenda Views. (line 41) * org-odt-category-map-alist: Labels and captions in ODT export. @@ -21845,48 +22282,48 @@ org-customize’ and then click yourself through the tree. (line 158) * org-odt-table-styles <1>: Advanced topics in ODT export. (line 226) -* org-outline-path-complete-in-steps: Refile and Copy. (line 17) -* org-overriding-columns-format: Agenda Column View. (line 19) +* org-outline-path-complete-in-steps: Refile and Copy. (line 13) * org-plain-list-ordered-item-terminator: Plain Lists. (line 15) * org-plain-list-ordered-item-terminator <1>: Plain Lists. (line 131) * org-popup-calendar-for-date-prompt: The date/time prompt. (line 75) -* org-pretty-entities: In-buffer Settings. (line 248) +* org-pretty-entities: In-buffer Settings. (line 166) * org-preview-latex-default-process: Previewing LaTeX fragments. (line 6) * org-priority-faces: Priorities. (line 13) * org-priority-start-cycle-with-default: Priorities. (line 33) * org-property-allowed-value-functions: Using the Property API. (line 63) -* org-protocol-default-template-key: capture protocol. (line 19) -* org-protocol-project-alist: open-source protocol. +* org-protocol-default-template-key: The capture protocol. + (line 19) +* org-protocol-project-alist: The open-source protocol. (line 13) * org-publish-project-alist: Project alist. (line 6) * org-publish-project-alist <1>: Publishing options. (line 12) * org-publish-use-timestamps-flag: Triggering Publication. (line 21) -* org-put-time-stamp-overlays: In-buffer Settings. (line 195) +* org-put-time-stamp-overlays: In-buffer Settings. (line 135) * org-read-date-display-live: The date/time prompt. (line 94) * org-read-date-force-compatible-dates: The date/time prompt. (line 60) * org-read-date-prefer-future: The date/time prompt. (line 6) -* org-refile-allow-creating-parent-nodes: Refile and Copy. (line 17) -* org-refile-keep: Refile and Copy. (line 45) -* org-refile-targets: Refile and Copy. (line 17) -* org-refile-use-cache: Refile and Copy. (line 50) -* org-refile-use-outline-path: Refile and Copy. (line 17) +* org-refile-allow-creating-parent-nodes: Refile and Copy. (line 13) +* org-refile-keep: Refile and Copy. (line 41) +* org-refile-targets: Refile and Copy. (line 13) +* org-refile-use-cache: Refile and Copy. (line 46) +* org-refile-use-outline-path: Refile and Copy. (line 13) * org-remove-highlights-with-change: Sparse Trees. (line 20) -* org-remove-highlights-with-change <1>: Clocking commands. (line 83) +* org-remove-highlights-with-change <1>: Clocking commands. (line 84) * org-replace-disputed-keys: Conflicts. (line 17) * org-return-follows-link: Handling Links. (line 127) -* org-reverse-note-order: Refile and Copy. (line 17) +* org-reverse-note-order: Refile and Copy. (line 13) * org-scheduled-delay-days: Deadlines and Scheduling. (line 42) * org-show-context-detail: Sparse Trees. (line 6) -* org-sort-agenda-noeffort-is-high: Filtering/limiting agenda times. - (line 88) +* org-sort-agenda-noeffort-is-high: Filtering/limiting agenda items. + (line 56) * org-sparse-tree-open-archived-trees: Internal archiving. (line 19) * org-special-ctrl-a/e: Headlines. (line 6) * org-special-ctrl-k: Headlines. (line 6) @@ -21900,20 +22337,20 @@ org-customize’ and then click yourself through the tree. * org-src-window-setup: Editing Source Code. (line 28) * org-startup-align-all-tables: Column Width and Alignment. (line 19) -* org-startup-align-all-tables <1>: In-buffer Settings. (line 93) +* org-startup-align-all-tables <1>: In-buffer Settings. (line 83) * org-startup-folded: Initial visibility. (line 6) * org-startup-folded <1>: In-buffer Settings. (line 67) * org-startup-folded <2>: Speeding Up Your Agendas. (line 19) -* org-startup-indented: In-buffer Settings. (line 84) -* org-startup-indented <1>: Clean View. (line 32) +* org-startup-indented: Org Indent Mode. (line 22) +* org-startup-indented <1>: In-buffer Settings. (line 77) * org-startup-shrink-all-tables: Column Width and Alignment. (line 64) -* org-startup-shrink-all-tables <1>: In-buffer Settings. (line 103) +* org-startup-shrink-all-tables <1>: In-buffer Settings. (line 90) * org-startup-with-inline-images: Images. (line 24) -* org-startup-with-inline-images <1>: In-buffer Settings. (line 107) +* org-startup-with-inline-images <1>: In-buffer Settings. (line 94) * org-startup-with-latex-preview: Previewing LaTeX fragments. - (line 26) + (line 28) * org-store-link-props: Template expansion. (line 102) * org-structure-template-alist: Structure Templates. (line 17) * org-stuck-projects: Stuck projects. (line 17) @@ -21923,13 +22360,13 @@ org-customize’ and then click yourself through the tree. * org-table-automatic-realign: Column Width and Alignment. (line 10) * org-table-copy-increment: Built-in Table Editor. - (line 173) + (line 185) * org-table-current-column: References. (line 89) * org-table-current-dline: References. (line 89) * org-table-duration-custom-format: Durations and time values. (line 6) * org-table-export-default-format: Built-in Table Editor. - (line 210) + (line 225) * org-table-formula: In-buffer Settings. (line 28) * org-table-formula-constants: References. (line 113) * org-table-formula-constants <1>: In-buffer Settings. (line 28) @@ -21937,7 +22374,7 @@ org-customize’ and then click yourself through the tree. * org-table-use-standard-references: Editing and debugging formulas. (line 6) * org-tag-alist: Setting Tags. (line 22) -* org-tag-alist <1>: In-buffer Settings. (line 258) +* org-tag-alist <1>: In-buffer Settings. (line 173) * org-tag-faces: Tags. (line 10) * org-tag-persistent-alist: Setting Tags. (line 37) * org-tags-column: Setting Tags. (line 11) @@ -21961,25 +22398,25 @@ org-customize’ and then click yourself through the tree. * org-texinfo-table-default-markup: Plain lists in Texinfo export. (line 12) * org-time-stamp-custom-formats: Custom time format. (line 6) -* org-time-stamp-overlay-formats: In-buffer Settings. (line 195) +* org-time-stamp-overlay-formats: In-buffer Settings. (line 135) * org-time-stamp-rounding-minutes: Creating Timestamps. (line 16) * org-timer-default-timer: Timers. (line 23) * org-todo, face: Faces for TODO keywords. (line 6) * org-todo-keyword-faces: Faces for TODO keywords. (line 6) -* org-todo-keywords: TODO Basics. (line 41) +* org-todo-keywords: TODO Basics. (line 35) * org-todo-keywords <1>: TODO Extensions. (line 6) * org-todo-keywords <2>: Global TODO list. (line 18) -* org-todo-keywords <3>: In-buffer Settings. (line 265) +* org-todo-keywords <3>: In-buffer Settings. (line 180) * org-todo-repeat-to-state: Repeated tasks. (line 22) -* org-todo-state-tags-triggers: TODO Basics. (line 62) +* org-todo-state-tags-triggers: TODO Basics. (line 56) * org-track-ordered-property-with-tag: TODO dependencies. (line 38) -* org-track-ordered-property-with-tag <1>: Checkboxes. (line 80) +* org-track-ordered-property-with-tag <1>: Checkboxes. (line 79) * org-treat-insert-todo-heading-as-state-change: Structure Editing. (line 29) * org-treat-S-cursor-todo-selection-as-state-change: TODO Basics. - (line 34) + (line 28) * org-use-property-inheritance: Property Inheritance. (line 6) * org-use-property-inheritance <1>: Using Header Arguments. @@ -22002,560 +22439,569 @@ org-customize’ and then click yourself through the tree.  Tag Table: -Node: Top879 -Node: Introduction21533 -Node: Summary21990 -Node: Installation24702 -Ref: Using Emacs packaging system25327 -Ref: Downloading Org as an archive25884 -Ref: Using Org's git repository26542 -Node: Activation27438 -Ref: Activation-Footnote-129082 -Node: Feedback29209 -Ref: How to create a useful backtrace31802 -Ref: Feedback-Footnote-132954 -Node: Conventions33080 -Ref: TODO keywords tags properties etc33246 -Ref: Key bindings and commands34131 -Node: Document Structure34761 -Node: Headlines36006 -Ref: Headlines-Footnote-137073 -Node: Visibility Cycling37352 -Node: Global and local cycling37737 -Ref: Global and local cycling-Footnote-140471 -Ref: Global and local cycling-Footnote-240533 -Node: Initial visibility40837 -Ref: Initial visibility-Footnote-141905 -Node: Catching invisible edits42098 -Node: Motion42569 -Node: Structure Editing44028 -Node: Sparse Trees50487 -Ref: Sparse Trees-Footnote-153043 -Ref: Sparse Trees-Footnote-253158 -Node: Plain Lists53234 -Ref: Plain Lists-Footnote-160730 -Ref: Plain Lists-Footnote-261094 -Ref: Plain Lists-Footnote-361194 -Ref: Plain Lists-Footnote-461451 -Ref: Plain Lists-Footnote-561628 -Ref: Plain Lists-Footnote-661732 -Ref: Plain Lists-Footnote-761838 -Node: Drawers61908 -Ref: Drawers-Footnote-163573 -Node: Blocks63685 -Node: Creating Footnotes64300 -Ref: Creating Footnotes-Footnote-167462 -Ref: Creating Footnotes-Footnote-267568 -Node: Tables67675 -Node: Built-in Table Editor68353 -Ref: Creation and conversion70083 -Ref: Re-aligning and field motion71021 -Ref: Column and row editing71948 -Ref: Regions73904 -Ref: Calculations75303 -Ref: Miscellaneous (1)76101 -Ref: Built-in Table Editor-Footnote-178161 -Node: Column Width and Alignment78269 -Node: Column Groups81601 -Node: Orgtbl Mode83163 -Node: The Spreadsheet83972 -Node: References85441 -Ref: Field references85895 -Ref: Range references88334 -Ref: Field coordinates in formulas89556 -Ref: Named references90542 -Ref: Remote references91513 -Ref: References-Footnote-192435 -Ref: References-Footnote-292663 -Ref: References-Footnote-392766 -Node: Formula syntax for Calc93091 -Ref: Formula syntax for Calc-Footnote-198613 -Node: Formula syntax for Lisp98952 -Node: Durations and time values100730 -Node: Field and range formulas102112 -Node: Column formulas104576 -Node: Lookup functions106683 -Node: Editing and debugging formulas108647 -Ref: Using multiple TBLFM lines113159 -Ref: Debugging formulas114002 -Node: Updating the table114426 -Node: Advanced features115793 -Ref: Advanced features-Footnote-1120239 -Node: Org Plot120347 -Ref: Graphical plots using Gnuplot120543 -Ref: Plot options121742 -Ref: ASCII bar plots123515 -Node: Hyperlinks124765 -Node: Link Format125624 -Ref: Link Format-Footnote-1127540 -Ref: Link Format-Footnote-2127772 -Node: Internal Links127904 -Ref: Internal Links-Footnote-1130121 -Ref: Internal Links-Footnote-2130361 -Node: Radio Targets130502 -Node: External Links131214 -Ref: External Links-Footnote-1135355 -Node: Handling Links135779 -Ref: Handling Links-Footnote-1143481 -Ref: Handling Links-Footnote-2143642 -Ref: Handling Links-Footnote-3143832 -Ref: Handling Links-Footnote-4144128 -Ref: Handling Links-Footnote-5144390 -Ref: Handling Links-Footnote-6144512 -Node: Using Links Outside Org144591 -Node: Link Abbreviations145061 -Node: Search Options147947 -Ref: Search Options-Footnote-1149906 -Node: Custom Searches149987 -Node: TODO Items151017 -Ref: TODO Items-Footnote-1152137 -Node: TODO Basics152251 -Node: TODO Extensions155170 -Node: Workflow states156218 -Ref: Workflow states-Footnote-1157577 -Node: TODO types157693 -Ref: TODO types-Footnote-1159332 -Node: Multiple sets in one file159404 -Node: Fast access to TODO states161366 -Ref: Fast access to TODO states-Footnote-1162244 -Ref: Fast access to TODO states-Footnote-2162351 -Node: Per-file keywords162653 -Ref: Per-file keywords-Footnote-1164097 -Node: Faces for TODO keywords164301 -Node: TODO dependencies165369 -Node: Progress Logging167818 -Node: Closing items168534 -Ref: Closing items-Footnote-1169519 -Ref: Closing items-Footnote-2169593 -Node: Tracking TODO state changes169671 -Ref: Tracking TODO state changes-Footnote-1172879 -Ref: Tracking TODO state changes-Footnote-2172941 -Ref: Tracking TODO state changes-Footnote-3173099 -Node: Tracking your habits173377 -Node: Priorities177729 -Ref: Priorities-Footnote-1179859 -Node: Breaking Down Tasks179932 -Ref: Breaking Down Tasks-Footnote-1181965 -Node: Checkboxes182072 -Ref: Checkboxes-Footnote-1186720 -Ref: Checkboxes-Footnote-2186848 -Ref: Checkboxes-Footnote-3187028 -Node: Tags187142 -Node: Tag Inheritance188230 -Ref: Tag Inheritance-Footnote-1190097 -Ref: Tag Inheritance-Footnote-2190201 -Node: Setting Tags190331 -Ref: Setting Tags-Footnote-1196802 -Ref: Setting Tags-Footnote-2196980 -Node: Tag Hierarchy197058 -Node: Tag Searches200619 -Node: Properties and Columns201925 -Node: Property Syntax203318 -Node: Special Properties207588 -Node: Property Searches209335 -Node: Property Inheritance210770 -Node: Column View212637 -Node: Defining columns213883 -Node: Scope of column definitions214263 -Node: Column attributes215173 -Ref: Column attributes-Footnote-1219577 -Ref: Column attributes-Footnote-2219708 -Ref: Column attributes-Footnote-3219906 -Node: Using column view220045 -Ref: Turning column view on or off220206 -Ref: Editing values221184 -Ref: Modifying column view on-the-fly222554 -Node: Capturing column view222926 -Ref: Capturing column view-Footnote-1226166 -Node: Dates and Times226303 -Node: Timestamps227217 -Ref: Timestamps-Footnote-1229614 -Ref: Timestamps-Footnote-2229910 -Node: Creating Timestamps230653 -Node: The date/time prompt233662 -Ref: The date/time prompt-Footnote-1238397 -Ref: The date/time prompt-Footnote-2238568 -Ref: The date/time prompt-Footnote-3238679 -Node: Custom time format238777 -Node: Deadlines and Scheduling240541 -Ref: Deadlines and Scheduling-Footnote-1244094 -Node: Inserting deadline/schedule244254 -Ref: Inserting deadline/schedule-Footnote-1246241 -Ref: Inserting deadline/schedule-Footnote-2246402 -Ref: Inserting deadline/schedule-Footnote-3246528 -Node: Repeated tasks246654 -Ref: Repeated tasks-Footnote-1251131 -Ref: Repeated tasks-Footnote-2251214 -Ref: Repeated tasks-Footnote-3251497 -Node: Clocking Work Time251719 -Ref: Clocking Work Time-Footnote-1252919 -Ref: Clocking Work Time-Footnote-2253072 -Node: Clocking commands253214 -Ref: Clocking commands-Footnote-1258297 -Ref: Clocking commands-Footnote-2258412 -Ref: Clocking commands-Footnote-3258494 -Ref: Clocking commands-Footnote-4258557 -Node: The clock table258640 -Ref: The clock table-Footnote-1266594 -Ref: The clock table-Footnote-2266703 -Ref: The clock table-Footnote-3266801 -Node: Resolving idle time266927 -Ref: Resolving idle time (1)267118 -Ref: Continuous clocking270315 -Ref: Resolving idle time-Footnote-1270857 -Node: Effort Estimates271336 -Ref: Effort Estimates-Footnote-1274112 -Node: Timers274223 -Node: Capture Refile Archive276437 -Node: Capture277418 -Node: Setting up capture277934 -Node: Using capture278290 -Node: Capture templates280681 -Node: Template elements282704 -Ref: Template elements-Footnote-1289403 -Ref: Template elements-Footnote-2289736 -Node: Template expansion289923 -Ref: Template expansion-Footnote-1293838 -Ref: Template expansion-Footnote-2293929 -Ref: Template expansion-Footnote-3294119 -Node: Templates in contexts294216 -Node: Attachments295050 -Ref: Attachments-Footnote-1299737 -Node: RSS Feeds299891 -Node: Protocols301351 -Node: store-link protocol302813 -Node: capture protocol303627 -Node: open-source protocol304771 -Node: Refile and Copy307978 -Ref: Refile and Copy-Footnote-1310444 -Node: Archiving310558 -Node: Moving subtrees311266 -Node: Internal archiving313290 -Node: Agenda Views316010 -Node: Agenda Files318411 -Ref: Agenda Files-Footnote-1321317 -Ref: Agenda Files-Footnote-2321461 -Node: Agenda Dispatcher321659 -Ref: Agenda Dispatcher-Footnote-1324393 -Ref: Agenda Dispatcher-Footnote-2324491 -Node: Built-in Agenda Views324597 -Node: Weekly/daily agenda325189 -Ref: Calendar/Diary integration326524 -Ref: Anniversaries from BBDB328583 -Ref: Appointment reminders330375 -Ref: Weekly/daily agenda-Footnote-1330925 -Ref: Weekly/daily agenda-Footnote-2331169 -Node: Global TODO list331389 -Node: Matching tags and properties334011 -Node: Search view341079 -Node: Stuck projects342676 -Node: Presentation and Sorting344808 -Node: Categories345780 -Node: Time-of-day specifications346524 -Ref: Time-of-day specifications-Footnote-1348510 -Node: Sorting of agenda items348633 -Node: Filtering/limiting agenda times350246 -Ref: Filtering in the agenda350885 -Ref: Setting limits for the agenda355552 -Ref: Filtering/limiting agenda times-Footnote-1357101 -Node: Agenda Commands357517 -Ref: Motion (1)358245 -Ref: View/Go to Org file358448 -Ref: Change display359954 -Ref: Remote editing367453 -Ref: Bulk remote editing selected entries372613 -Ref: Calendar commands375708 -Ref: Quit and exit377589 -Ref: Agenda Commands-Footnote-1377951 -Ref: Agenda Commands-Footnote-2378027 -Ref: Agenda Commands-Footnote-3378131 -Node: Custom Agenda Views378218 -Node: Storing searches378865 -Ref: Storing searches-Footnote-1381814 -Ref: Storing searches-Footnote-2381931 -Node: Block agenda382178 -Node: Setting options383429 -Node: Exporting Agenda Views387038 -Ref: Exporting Agenda Views-Footnote-1391572 -Ref: Exporting Agenda Views-Footnote-2391726 -Ref: Exporting Agenda Views-Footnote-3391876 -Ref: Exporting Agenda Views-Footnote-4392063 -Node: Agenda Column View392145 -Node: Markup for Rich Contents395255 -Node: Paragraphs396490 -Node: Emphasis and Monospace397620 -Node: Subscripts and Superscripts398271 -Node: Special Symbols399323 -Ref: Special Symbols-Footnote-1401231 -Ref: Special Symbols-Footnote-2401396 -Node: Embedded LaTeX401493 -Ref: Embedded LaTeX-Footnote-1402337 -Node: LaTeX fragments402533 -Ref: LaTeX fragments-Footnote-1404684 -Node: Previewing LaTeX fragments404877 -Ref: Previewing LaTeX fragments-Footnote-1406315 -Node: CDLaTeX mode406563 -Ref: CDLaTeX mode-Footnote-1409119 -Node: Literal Examples409266 -Ref: Literal Examples-Footnote-1413845 -Ref: Literal Examples-Footnote-2414215 -Ref: Literal Examples-Footnote-3414393 -Ref: Literal Examples-Footnote-4414578 -Ref: Literal Examples-Footnote-5414843 -Node: Images414941 -Ref: Images-Footnote-1416020 -Ref: Images-Footnote-2416143 -Node: Captions416304 -Node: Horizontal Rules416999 -Node: Exporting417223 -Node: The Export Dispatcher419937 -Node: Export Settings422650 -Ref: Export Settings-Footnote-1430738 -Ref: Export Settings-Footnote-2430850 -Ref: Export Settings-Footnote-3430951 -Node: Table of Contents431149 -Ref: Table of Contents-Footnote-1433438 -Node: Include Files433605 -Ref: Include Files-Footnote-1436552 -Node: Macro Replacement436730 -Ref: Macro Replacement-Footnote-1440605 -Node: Comment Lines440822 -Ref: Comment Lines-Footnote-1441680 -Node: ASCII/Latin-1/UTF-8 export441784 -Ref: ASCII export commands442633 -Ref: ASCII specific export settings443166 -Ref: Header and sectioning structure443610 -Ref: Quoting ASCII text443884 -Ref: ASCII specific attributes444256 -Ref: ASCII special blocks444533 -Node: Beamer Export444880 -Node: Beamer export commands445625 -Node: Beamer specific export settings446325 -Node: Frames and Blocks in Beamer448225 -Ref: Frames and Blocks in Beamer-Footnote-1451592 -Node: Beamer specific syntax451751 -Node: Editing support453725 -Node: A Beamer example454216 -Node: HTML Export455465 -Node: HTML export commands456515 -Node: HTML specific export settings457061 -Node: HTML doctypes459150 -Node: HTML preamble and postamble461326 -Node: Quoting HTML tags462516 -Node: Links in HTML export463210 -Node: Tables in HTML export464668 -Node: Images in HTML export466123 -Node: Math formatting in HTML export467608 -Ref: Math formatting in HTML export-Footnote-1469141 -Ref: Math formatting in HTML export-Footnote-2469265 -Ref: Math formatting in HTML export-Footnote-3469526 -Node: Text areas in HTML export469698 -Node: CSS support470838 -Ref: CSS support-Footnote-1474388 -Node: JavaScript support474568 -Node: LaTeX Export477821 -Node: LaTeX/PDF export commands479594 -Ref: LaTeX/PDF export commands-Footnote-1481092 -Node: LaTeX specific export settings481294 -Node: LaTeX header and sectioning484521 -Node: Quoting LaTeX code486633 -Node: Tables in LaTeX export487424 -Node: Images in LaTeX export491837 -Node: Plain lists in LaTeX export494335 -Node: Source blocks in LaTeX export495350 -Node: Example blocks in LaTeX export496775 -Node: Special blocks in LaTeX export497496 -Node: Horizontal rules in LaTeX export498754 -Node: Markdown Export499149 -Ref: Markdown export commands499611 -Ref: Header and sectioning structure (1)500048 -Node: OpenDocument Text Export500465 -Ref: OpenDocument Text Export-Footnote-1501566 -Node: Pre-requisites for ODT export501715 -Node: ODT export commands502088 -Node: ODT specific export settings503264 -Node: Extending ODT export504310 -Ref: Automatically exporting to other formats505116 -Ref: Converting between document formats505542 -Node: Applying custom styles506084 -Ref: Applying custom styles the easy way506611 -Ref: Using third-party styles and templates507569 -Node: Links in ODT export507866 -Node: Tables in ODT export508523 -Node: Images in ODT export510528 -Ref: Embedding images510727 -Ref: Embedding clickable images511044 -Ref: Sizing and scaling of embedded images511378 -Ref: Anchoring of images513062 -Node: Math formatting in ODT export513384 -Node: LaTeX math snippets513808 -Ref: LaTeX math snippets-Footnote-1516056 -Ref: LaTeX math snippets-Footnote-2516132 -Node: MathML and OpenDocument formula files516177 -Node: Labels and captions in ODT export516680 -Node: Literal examples in ODT export517951 -Node: Advanced topics in ODT export518787 -Ref: Configuring a document converter519092 -Ref: Working with OpenDocument style files520033 -Ref: x-orgodtstyles-xml520499 -Ref: x-orgodtcontenttemplate-xml520841 -Ref: x-overriding-factory-styles521485 -Ref: Creating one-off styles522729 -Ref: Customizing tables in ODT export524733 -Ref: Validating OpenDocument XML529593 -Ref: Advanced topics in ODT export-Footnote-1530390 -Ref: Advanced topics in ODT export-Footnote-2530494 -Ref: Advanced topics in ODT export-Footnote-3530587 -Node: Org Export530935 -Ref: Org export commands531286 -Node: Texinfo Export531592 -Node: Texinfo export commands532570 -Node: Texinfo specific export settings533190 -Node: Texinfo file header534338 -Node: Texinfo title and copyright page535316 -Node: Info directory file536675 -Node: Headings and sectioning structure537395 -Node: Indices539420 -Node: Quoting Texinfo code540444 -Node: Plain lists in Texinfo export540937 -Node: Tables in Texinfo export542296 -Node: Images in Texinfo export542787 -Node: Quotations in Texinfo export543420 -Node: Special blocks in Texinfo export544368 -Node: A Texinfo example545016 -Node: iCalendar Export547123 -Node: Other Built-in Back-ends550856 -Node: Advanced Export Configuration551483 -Ref: Hooks551690 -Ref: Filters552613 -Ref: Defining filters for individual files555122 -Ref: Extending an existing back-end555928 -Node: Export in Foreign Buffers558168 -Node: Publishing559316 -Node: Configuration560194 -Node: Project alist560971 -Node: Sources and destinations562108 -Node: Selecting files563421 -Node: Publishing action564371 -Ref: Publishing action-Footnote-1566195 -Node: Publishing options566358 -Ref: Generic properties567105 -Ref: ASCII specific properties568992 -Ref: Beamer specific properties570592 -Ref: HTML specific properties571157 -Ref: LaTeX specific properties575378 -Ref: Markdown specific properties578302 -Ref: ODT specific properties578540 -Ref: Texinfo specific properties579472 -Node: Publishing links580819 -Node: Site map582194 -Node: Generating an index585506 -Node: Uploading Files586293 -Node: Sample Configuration588071 -Node: Simple example588564 -Node: Complex example589212 -Node: Triggering Publication591256 -Node: Working with Source Code592269 -Node: Structure of Code Blocks597124 -Node: Using Header Arguments599603 -Ref: System-wide header arguments600325 -Ref: Header arguments in Org mode properties601248 -Ref: Code block specific header arguments603076 -Ref: Header arguments in function calls604575 -Node: Environment of a Code Block605249 -Ref: Passing arguments605458 -Ref: Using sessions613328 -Ref: Choosing a working directory614727 -Ref: Inserting headers and footers616465 -Node: Evaluating Code Blocks616975 -Ref: How to evaluate source code617425 -Ref: Limit code block evaluation620327 -Ref: Cache results of evaluation621187 -Ref: Evaluating Code Blocks-Footnote-1623773 -Ref: Evaluating Code Blocks-Footnote-2623907 -Node: Results of Evaluation624065 -Ref: Collection624905 -Ref: Type627165 -Ref: Format630445 -Ref: Handling632695 -Ref: Post-processing633410 -Ref: Results of Evaluation-Footnote-1635160 -Node: Exporting Code Blocks635582 -Node: Extracting Source Code637930 -Ref: Header arguments638906 -Ref: Functions642451 -Ref: Hooks (1)642702 -Ref: Jumping between code and Org642937 -Node: Languages643447 -Ref: Languages-Footnote-1646075 -Ref: Languages-Footnote-2646233 -Node: Editing Source Code646387 -Node: Noweb Reference Syntax649110 -Ref: Noweb Reference Syntax-Footnote-1654617 -Node: Library of Babel654707 -Node: Key bindings and Useful Functions655420 -Node: Batch Execution657840 -Node: Miscellaneous658618 -Node: Completion659714 -Node: Structure Templates661624 -Ref: Structure Templates-Footnote-1663375 -Node: Escape Character663467 -Node: Speed Keys664188 -Node: Code Evaluation Security665371 -Node: Customization668227 -Node: In-buffer Settings668664 -Ref: In-buffer Settings-Footnote-1677647 -Node: The Very Busy C-c C-c Key677857 -Node: Clean View679821 -Ref: Clean View-Footnote-1683253 -Ref: Clean View-Footnote-2683492 -Ref: Clean View-Footnote-3683551 -Node: TTY Keys683632 -Node: Documentation Access685239 -Node: Interaction685648 -Node: Cooperation686063 -Node: Conflicts688950 -Node: Org Crypt693557 -Node: Org Mobile695091 -Node: Setting up the staging area696429 -Ref: Setting up the staging area-Footnote-1697664 -Ref: Setting up the staging area-Footnote-2697871 -Node: Pushing to the mobile application698043 -Ref: Pushing to the mobile application-Footnote-1699049 -Ref: Pushing to the mobile application-Footnote-2699140 -Ref: Pushing to the mobile application-Footnote-3699507 -Node: Pulling from the mobile application699583 -Ref: Pulling from the mobile application-Footnote-1701891 -Node: Org Syntax701944 -Node: Hacking703559 -Node: Hooks (2)704505 -Node: Add-on Packages704828 -Node: Adding Hyperlink Types705366 -Node: Adding Export Back-ends708789 -Node: Tables in Arbitrary Syntax710041 -Node: Radio tables711305 -Node: A LaTeX example713437 -Ref: A LaTeX example-Footnote-1717284 -Ref: A LaTeX example-Footnote-2717327 -Ref: A LaTeX example-Footnote-3717488 -Node: Translator functions717940 -Node: Dynamic Blocks720111 -Node: Special Agenda Views722257 -Ref: Special Agenda Views-Footnote-1725963 -Ref: Special Agenda Views-Footnote-2726170 -Node: Speeding Up Your Agendas726302 -Node: Extracting Agenda Information727356 -Node: Using the Property API731156 -Node: Using the Mapping API734506 -Node: History and Acknowledgments738537 -Ref: From Carsten738730 -Ref: From Bastien742154 -Ref: List of Contributions744286 -Node: GNU Free Documentation License752495 -Node: Main Index777875 -Node: Key Index871484 -Node: Command and Function Index925433 -Node: Variable Index970155 +Node: Top865 +Node: Introduction22116 +Node: Summary22573 +Node: Installation25285 +Ref: Using Emacs packaging system25910 +Ref: Downloading Org as an archive26467 +Ref: Using Org's git repository27125 +Node: Activation28021 +Ref: Activation-Footnote-129636 +Node: Feedback29763 +Ref: How to create a useful backtrace32356 +Ref: Feedback-Footnote-133508 +Node: Conventions33634 +Ref: TODO keywords tags properties etc33800 +Ref: Key bindings and commands34685 +Node: Document Structure35315 +Node: Headlines36482 +Ref: Headlines-Footnote-137763 +Node: Visibility Cycling38042 +Node: Global and local cycling38427 +Ref: Global and local cycling-Footnote-141161 +Ref: Global and local cycling-Footnote-241223 +Node: Initial visibility41527 +Ref: Initial visibility-Footnote-142595 +Node: Catching invisible edits42788 +Node: Motion43259 +Node: Structure Editing44718 +Node: Sparse Trees51177 +Ref: Sparse Trees-Footnote-153733 +Ref: Sparse Trees-Footnote-253848 +Node: Plain Lists53924 +Ref: Plain Lists-Footnote-161433 +Ref: Plain Lists-Footnote-261797 +Ref: Plain Lists-Footnote-361897 +Ref: Plain Lists-Footnote-462154 +Ref: Plain Lists-Footnote-562331 +Ref: Plain Lists-Footnote-662435 +Ref: Plain Lists-Footnote-762541 +Node: Drawers62611 +Ref: Drawers-Footnote-164276 +Node: Blocks64388 +Node: Tables64976 +Node: Built-in Table Editor65654 +Ref: Creation and conversion67383 +Ref: Re-aligning and field motion68321 +Ref: Column and row editing69248 +Ref: Regions71605 +Ref: Calculations73004 +Ref: Miscellaneous (1)73817 +Ref: Built-in Table Editor-Footnote-175877 +Node: Column Width and Alignment75985 +Node: Column Groups79317 +Node: Orgtbl Mode80879 +Node: The Spreadsheet81688 +Node: References83157 +Ref: Field references83611 +Ref: Range references86050 +Ref: Field coordinates in formulas87272 +Ref: Named references88257 +Ref: Remote references89228 +Ref: References-Footnote-190150 +Ref: References-Footnote-290378 +Ref: References-Footnote-390481 +Node: Formula syntax for Calc90806 +Ref: Formula syntax for Calc-Footnote-196328 +Node: Formula syntax for Lisp96667 +Node: Durations and time values98445 +Node: Field and range formulas99827 +Node: Column formulas102291 +Node: Lookup functions104398 +Node: Editing and debugging formulas106362 +Ref: Using multiple TBLFM lines110874 +Ref: Debugging formulas111717 +Node: Updating the table112141 +Node: Advanced features113508 +Ref: Advanced features-Footnote-1117954 +Node: Org Plot118062 +Ref: Graphical plots using Gnuplot118258 +Ref: Plot options119457 +Ref: ASCII bar plots121230 +Node: Hyperlinks122480 +Node: Link Format123339 +Ref: Link Format-Footnote-1125397 +Ref: Link Format-Footnote-2125629 +Node: Internal Links125761 +Ref: Internal Links-Footnote-1128318 +Ref: Internal Links-Footnote-2128558 +Node: Radio Targets128699 +Node: External Links129411 +Ref: External Links-Footnote-1134881 +Node: Handling Links135305 +Ref: Handling Links-Footnote-1142987 +Ref: Handling Links-Footnote-2143148 +Ref: Handling Links-Footnote-3143338 +Ref: Handling Links-Footnote-4143634 +Ref: Handling Links-Footnote-5143896 +Ref: Handling Links-Footnote-6144018 +Node: Using Links Outside Org144093 +Node: Link Abbreviations144563 +Node: Search Options147449 +Ref: Search Options-Footnote-1149548 +Node: Custom Searches149629 +Node: TODO Items150658 +Ref: TODO Items-Footnote-1151778 +Node: TODO Basics151892 +Node: TODO Extensions154522 +Node: Workflow states155570 +Ref: Workflow states-Footnote-1156964 +Node: TODO types157080 +Ref: TODO types-Footnote-1158894 +Node: Multiple sets in one file158966 +Node: Fast access to TODO states160906 +Ref: Fast access to TODO states-Footnote-1161784 +Ref: Fast access to TODO states-Footnote-2161891 +Node: Per-file keywords162193 +Ref: Per-file keywords-Footnote-1163637 +Node: Faces for TODO keywords163841 +Node: TODO dependencies164909 +Node: Progress Logging167371 +Node: Closing items168503 +Ref: Closing items-Footnote-1169498 +Ref: Closing items-Footnote-2169572 +Node: Tracking TODO state changes169650 +Ref: Tracking TODO state changes-Footnote-1172777 +Ref: Tracking TODO state changes-Footnote-2172839 +Ref: Tracking TODO state changes-Footnote-3172997 +Node: Tracking your habits173275 +Node: Priorities177691 +Ref: Priorities-Footnote-1179810 +Node: Breaking Down Tasks179883 +Ref: Breaking Down Tasks-Footnote-1181919 +Node: Checkboxes182026 +Ref: Checkboxes-Footnote-1186563 +Ref: Checkboxes-Footnote-2186691 +Ref: Checkboxes-Footnote-3186871 +Node: Tags186985 +Node: Tag Inheritance188073 +Ref: Tag Inheritance-Footnote-1189940 +Ref: Tag Inheritance-Footnote-2190044 +Node: Setting Tags190174 +Ref: Setting Tags-Footnote-1196645 +Ref: Setting Tags-Footnote-2196823 +Node: Tag Hierarchy196901 +Node: Tag Searches200462 +Node: Properties and Columns201768 +Node: Property Syntax203161 +Node: Special Properties207431 +Node: Property Searches209178 +Node: Property Inheritance210613 +Node: Column View212480 +Node: Defining columns213726 +Node: Scope of column definitions214106 +Node: Column attributes215016 +Ref: Column attributes-Footnote-1219422 +Ref: Column attributes-Footnote-2219553 +Ref: Column attributes-Footnote-3219751 +Node: Using column view219890 +Ref: Turning column view on or off220051 +Ref: Editing values221029 +Ref: Modifying column view on-the-fly222399 +Node: Capturing column view222771 +Ref: Capturing column view-Footnote-1226153 +Node: Dates and Times226290 +Node: Timestamps227204 +Ref: Timestamps-Footnote-1229555 +Ref: Timestamps-Footnote-2229851 +Node: Creating Timestamps230600 +Node: The date/time prompt233609 +Ref: The date/time prompt-Footnote-1238344 +Ref: The date/time prompt-Footnote-2238515 +Ref: The date/time prompt-Footnote-3238626 +Node: Custom time format238724 +Node: Deadlines and Scheduling240488 +Ref: Deadlines and Scheduling-Footnote-1244053 +Node: Inserting deadline/schedule244216 +Ref: Inserting deadline/schedule-Footnote-1246203 +Ref: Inserting deadline/schedule-Footnote-2246364 +Ref: Inserting deadline/schedule-Footnote-3246490 +Node: Repeated tasks246616 +Ref: Repeated tasks-Footnote-1251102 +Ref: Repeated tasks-Footnote-2251185 +Ref: Repeated tasks-Footnote-3251468 +Node: Clocking Work Time251690 +Ref: Clocking Work Time-Footnote-1252890 +Ref: Clocking Work Time-Footnote-2253043 +Node: Clocking commands253185 +Ref: Clocking commands-Footnote-1258285 +Ref: Clocking commands-Footnote-2258400 +Ref: Clocking commands-Footnote-3258482 +Ref: Clocking commands-Footnote-4258545 +Node: The clock table258628 +Ref: The clock table-Footnote-1266641 +Ref: The clock table-Footnote-2266750 +Ref: The clock table-Footnote-3266848 +Node: Resolving idle time266974 +Ref: Resolving idle time (1)267165 +Ref: Continuous clocking270362 +Ref: Resolving idle time-Footnote-1270904 +Node: Effort Estimates271383 +Ref: Effort Estimates-Footnote-1274159 +Node: Timers274270 +Node: Refiling and Archiving276484 +Node: Refile and Copy277042 +Ref: Refile and Copy-Footnote-1279490 +Node: Archiving279604 +Node: Moving subtrees280312 +Node: Internal archiving282336 +Node: Capture and Attachments285056 +Node: Capture285856 +Node: Setting up capture286375 +Node: Using capture286733 +Node: Capture templates289126 +Node: Template elements291160 +Ref: Template elements-Footnote-1297916 +Ref: Template elements-Footnote-2298249 +Ref: Template elements-Footnote-3298436 +Node: Template expansion298531 +Ref: Template expansion-Footnote-1302448 +Ref: Template expansion-Footnote-2302539 +Ref: Template expansion-Footnote-3302729 +Node: Templates in contexts302828 +Node: Attachments303664 +Node: Attachment defaults and dispatcher304685 +Ref: Attachment defaults and dispatcher-Footnote-1308031 +Node: Attachment options308182 +Node: Attachment links311652 +Node: Automatic version-control with Git312286 +Node: Attach from Dired312796 +Node: RSS Feeds314155 +Node: Agenda Views315600 +Node: Agenda Files318002 +Ref: Agenda Files-Footnote-1320908 +Ref: Agenda Files-Footnote-2321052 +Node: Agenda Dispatcher321250 +Ref: Agenda Dispatcher-Footnote-1324052 +Ref: Agenda Dispatcher-Footnote-2324150 +Node: Built-in Agenda Views324256 +Node: Weekly/daily agenda324848 +Ref: Calendar/Diary integration326183 +Ref: Anniversaries from BBDB328259 +Ref: Appointment reminders330050 +Ref: Weekly/daily agenda-Footnote-1330600 +Ref: Weekly/daily agenda-Footnote-2330844 +Node: Global TODO list331064 +Node: Matching tags and properties333909 +Node: Search view340977 +Node: Stuck projects342619 +Node: Presentation and Sorting344751 +Node: Categories345723 +Node: Time-of-day specifications346464 +Ref: Time-of-day specifications-Footnote-1348450 +Node: Sorting of agenda items348573 +Node: Filtering/limiting agenda items350186 +Ref: Filtering in the agenda350886 +Ref: Computed tag filtering354981 +Ref: Setting limits for the agenda356475 +Ref: Filtering/limiting agenda items-Footnote-1358024 +Node: Agenda Commands358576 +Ref: Motion (1)359304 +Ref: View/Go to Org file359507 +Ref: Change display361013 +Ref: Remote editing368523 +Ref: Bulk remote editing selected entries373851 +Ref: Calendar commands376946 +Ref: Quit and exit378827 +Ref: Agenda Commands-Footnote-1379189 +Ref: Agenda Commands-Footnote-2379265 +Ref: Agenda Commands-Footnote-3379369 +Node: Custom Agenda Views379456 +Node: Storing searches380103 +Ref: Storing searches-Footnote-1383050 +Ref: Storing searches-Footnote-2383167 +Node: Block agenda383414 +Node: Setting options384665 +Node: Exporting Agenda Views388274 +Ref: Exporting Agenda Views-Footnote-1392808 +Ref: Exporting Agenda Views-Footnote-2392996 +Ref: Exporting Agenda Views-Footnote-3393146 +Ref: Exporting Agenda Views-Footnote-4393333 +Node: Agenda Column View393415 +Node: Markup for Rich Contents396758 +Node: Paragraphs398051 +Node: Emphasis and Monospace399181 +Node: Subscripts and Superscripts399827 +Node: Special Symbols400879 +Ref: Special Symbols-Footnote-1402787 +Ref: Special Symbols-Footnote-2402952 +Node: Embedded LaTeX403049 +Ref: Embedded LaTeX-Footnote-1403893 +Node: LaTeX fragments404089 +Ref: LaTeX fragments-Footnote-1406240 +Node: Previewing LaTeX fragments406433 +Ref: Previewing LaTeX fragments-Footnote-1407911 +Node: CDLaTeX mode408159 +Ref: CDLaTeX mode-Footnote-1410884 +Node: Literal Examples411031 +Ref: Literal Examples-Footnote-1416137 +Ref: Literal Examples-Footnote-2416507 +Ref: Literal Examples-Footnote-3416685 +Ref: Literal Examples-Footnote-4416870 +Node: Images416968 +Ref: Images-Footnote-1418050 +Ref: Images-Footnote-2418173 +Node: Captions418334 +Node: Horizontal Rules419029 +Node: Creating Footnotes419280 +Ref: Creating Footnotes-Footnote-1422404 +Ref: Creating Footnotes-Footnote-2422510 +Node: Exporting422617 +Node: The Export Dispatcher425382 +Node: Export Settings428095 +Ref: Export Settings-Footnote-1436189 +Ref: Export Settings-Footnote-2436301 +Ref: Export Settings-Footnote-3436402 +Node: Table of Contents436600 +Ref: Table of Contents-Footnote-1439269 +Node: Include Files439436 +Ref: Include Files-Footnote-1442368 +Node: Macro Replacement442546 +Ref: Macro Replacement-Footnote-1446421 +Node: Comment Lines446638 +Ref: Comment Lines-Footnote-1447496 +Node: ASCII/Latin-1/UTF-8 export447600 +Ref: ASCII export commands448449 +Ref: ASCII specific export settings448982 +Ref: Header and sectioning structure449426 +Ref: Quoting ASCII text449700 +Ref: ASCII specific attributes450072 +Ref: ASCII special blocks450349 +Node: Beamer Export450696 +Node: Beamer export commands451441 +Node: Beamer specific export settings452141 +Node: Frames and Blocks in Beamer454041 +Ref: Frames and Blocks in Beamer-Footnote-1457408 +Node: Beamer specific syntax457567 +Node: Editing support459541 +Node: A Beamer example460007 +Node: HTML Export461256 +Node: HTML export commands462361 +Node: HTML specific export settings462907 +Node: HTML doctypes464996 +Node: HTML preamble and postamble467172 +Node: Quoting HTML tags468362 +Node: Headlines in HTML export469056 +Node: Links in HTML export469646 +Node: Tables in HTML export471111 +Node: Images in HTML export472566 +Node: Math formatting in HTML export474051 +Ref: Math formatting in HTML export-Footnote-1475586 +Ref: Math formatting in HTML export-Footnote-2475710 +Ref: Math formatting in HTML export-Footnote-3475971 +Node: Text areas in HTML export476143 +Node: CSS support477283 +Ref: CSS support-Footnote-1480930 +Node: JavaScript support481110 +Node: LaTeX Export484363 +Node: LaTeX/PDF export commands486136 +Ref: LaTeX/PDF export commands-Footnote-1487634 +Node: LaTeX specific export settings487836 +Node: LaTeX header and sectioning491063 +Node: Quoting LaTeX code493175 +Node: Tables in LaTeX export493966 +Node: Images in LaTeX export498379 +Node: Plain lists in LaTeX export500977 +Node: Source blocks in LaTeX export501992 +Node: Example blocks in LaTeX export503417 +Node: Special blocks in LaTeX export504138 +Node: Horizontal rules in LaTeX export505396 +Node: Markdown Export505791 +Ref: Markdown export commands506253 +Ref: Header and sectioning structure (1)506690 +Node: OpenDocument Text Export507107 +Ref: OpenDocument Text Export-Footnote-1508208 +Node: Pre-requisites for ODT export508357 +Node: ODT export commands508730 +Node: ODT specific export settings509906 +Node: Extending ODT export510952 +Ref: Automatically exporting to other formats511758 +Ref: Converting between document formats512184 +Node: Applying custom styles512726 +Ref: Applying custom styles the easy way513253 +Ref: Using third-party styles and templates514211 +Node: Links in ODT export514508 +Node: Tables in ODT export515165 +Node: Images in ODT export517170 +Ref: Embedding images517369 +Ref: Embedding clickable images517686 +Ref: Sizing and scaling of embedded images518020 +Ref: Anchoring of images519704 +Node: Math formatting in ODT export520026 +Node: LaTeX math snippets520450 +Ref: LaTeX math snippets-Footnote-1522698 +Ref: LaTeX math snippets-Footnote-2522774 +Node: MathML and OpenDocument formula files522819 +Node: Labels and captions in ODT export523322 +Node: Literal examples in ODT export524593 +Node: Advanced topics in ODT export525429 +Ref: Configuring a document converter525734 +Ref: Working with OpenDocument style files526675 +Ref: x-orgodtstyles-xml527141 +Ref: x-orgodtcontenttemplate-xml527483 +Ref: x-overriding-factory-styles528127 +Ref: Creating one-off styles529371 +Ref: Customizing tables in ODT export531375 +Ref: Validating OpenDocument XML536235 +Ref: Advanced topics in ODT export-Footnote-1537032 +Ref: Advanced topics in ODT export-Footnote-2537136 +Ref: Advanced topics in ODT export-Footnote-3537229 +Node: Org Export537577 +Ref: Org export commands537928 +Node: Texinfo Export538234 +Node: Texinfo export commands539212 +Node: Texinfo specific export settings539832 +Node: Texinfo file header540980 +Node: Texinfo title and copyright page541958 +Node: Info directory file543317 +Node: Headings and sectioning structure544037 +Node: Indices546062 +Node: Quoting Texinfo code547086 +Node: Plain lists in Texinfo export547579 +Node: Tables in Texinfo export549300 +Node: Images in Texinfo export549791 +Node: Quotations in Texinfo export550424 +Node: Special blocks in Texinfo export551372 +Node: A Texinfo example552020 +Node: iCalendar Export554117 +Node: Other Built-in Back-ends558401 +Node: Advanced Export Configuration559028 +Ref: Hooks559235 +Ref: Filters560158 +Ref: Defining filters for individual files562667 +Ref: Extending an existing back-end563473 +Node: Export in Foreign Buffers565713 +Node: Publishing566861 +Node: Configuration567739 +Node: Project alist568516 +Node: Sources and destinations569653 +Node: Selecting files570966 +Node: Publishing action571916 +Ref: Publishing action-Footnote-1573740 +Node: Publishing options573903 +Ref: Generic properties574650 +Ref: ASCII specific properties576537 +Ref: Beamer specific properties578137 +Ref: HTML specific properties578702 +Ref: LaTeX specific properties583094 +Ref: Markdown specific properties586018 +Ref: ODT specific properties586256 +Ref: Texinfo specific properties587188 +Node: Publishing links588535 +Node: Site map589910 +Node: Generating an index593222 +Node: Uploading Files594009 +Node: Sample Configuration595787 +Node: Simple example596280 +Node: Complex example596928 +Node: Triggering Publication598972 +Node: Working with Source Code599993 +Node: Structure of Code Blocks604848 +Node: Using Header Arguments607327 +Ref: System-wide header arguments608049 +Ref: Header arguments in Org mode properties608972 +Ref: Code block specific header arguments610800 +Ref: Header arguments in function calls612299 +Node: Environment of a Code Block612973 +Ref: Passing arguments613182 +Ref: Using sessions621052 +Ref: Choosing a working directory622451 +Ref: Inserting headers and footers624305 +Node: Evaluating Code Blocks624815 +Ref: How to evaluate source code625265 +Ref: Limit code block evaluation628167 +Ref: Cache results of evaluation629027 +Ref: Evaluating Code Blocks-Footnote-1631613 +Ref: Evaluating Code Blocks-Footnote-2631747 +Node: Results of Evaluation631905 +Ref: Collection632707 +Ref: Type634967 +Ref: Format638260 +Ref: Handling640509 +Ref: Post-processing641224 +Node: Exporting Code Blocks642938 +Node: Extracting Source Code645286 +Ref: Header arguments646262 +Ref: Functions649803 +Ref: Hooks (1)650054 +Ref: Jumping between code and Org650289 +Node: Languages650799 +Ref: Languages-Footnote-1653518 +Ref: Languages-Footnote-2653676 +Node: Editing Source Code653830 +Node: Noweb Reference Syntax656553 +Ref: Noweb Reference Syntax-Footnote-1662060 +Node: Library of Babel662150 +Node: Key bindings and Useful Functions662863 +Node: Batch Execution665283 +Node: Miscellaneous666061 +Node: Completion667234 +Node: Structure Templates669151 +Ref: Structure Templates-Footnote-1670896 +Node: Speed Keys670988 +Node: Clean View672160 +Node: Org Indent Mode673346 +Ref: Org Indent Mode-Footnote-1674547 +Node: Hard indentation674771 +Ref: Hard indentation-Footnote-1676246 +Node: Dynamic Headline Numbering676352 +Node: The Very Busy C-c C-c Key677313 +Node: In-buffer Settings679222 +Ref: In-buffer Settings-Footnote-1687920 +Node: Org Syntax688118 +Node: Documentation Access689768 +Node: Escape Character690182 +Node: Code Evaluation Security691038 +Node: Interaction693900 +Node: Cooperation694318 +Node: Conflicts697205 +Node: TTY Keys701802 +Node: Protocols703399 +Node: The store-link protocol704853 +Node: The capture protocol705696 +Node: The open-source protocol706855 +Node: Org Crypt710087 +Node: Org Mobile711619 +Node: Setting up the staging area712938 +Ref: Setting up the staging area-Footnote-1714173 +Ref: Setting up the staging area-Footnote-2714380 +Node: Pushing to the mobile application714552 +Ref: Pushing to the mobile application-Footnote-1715558 +Ref: Pushing to the mobile application-Footnote-2715649 +Ref: Pushing to the mobile application-Footnote-3716016 +Node: Pulling from the mobile application716092 +Ref: Pulling from the mobile application-Footnote-1718400 +Node: Hacking718453 +Node: Hooks (2)719399 +Node: Add-on Packages719722 +Node: Adding Hyperlink Types720260 +Node: Adding Export Back-ends723672 +Node: Tables in Arbitrary Syntax724924 +Node: Radio tables726188 +Node: A LaTeX example728320 +Ref: A LaTeX example-Footnote-1732167 +Ref: A LaTeX example-Footnote-2732210 +Ref: A LaTeX example-Footnote-3732371 +Node: Translator functions732823 +Node: Dynamic Blocks734994 +Node: Special Agenda Views737235 +Ref: Special Agenda Views-Footnote-1740941 +Ref: Special Agenda Views-Footnote-2741148 +Node: Speeding Up Your Agendas741280 +Node: Extracting Agenda Information742334 +Node: Using the Property API746134 +Node: Using the Mapping API749484 +Node: History and Acknowledgments753515 +Ref: From Carsten753708 +Ref: From Bastien757139 +Ref: List of Contributions759271 +Node: GNU Free Documentation License767474 +Ref: ADDENDUM How to use this License for your documents791425 +Node: Main Index792818 +Node: Key Index889200 +Node: Command and Function Index945002 +Node: Variable Index991266  End Tag Table diff --git a/elpa/org-20191028/org-agenda.el b/elpa/org-20200127/org-agenda.el similarity index 95% rename from elpa/org-20191028/org-agenda.el rename to elpa/org-20200127/org-agenda.el index 690d7e27..78433617 100644 --- a/elpa/org-20191028/org-agenda.el +++ b/elpa/org-20200127/org-agenda.el @@ -1,8 +1,9 @@ ;;; org-agenda.el --- Dynamic task and appointment lists for Org -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik +;; Maintainer: Bastien Guerry ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: https://orgmode.org ;; @@ -46,6 +47,7 @@ ;;; Code: (require 'cl-lib) +(require 'ol) (require 'org) (require 'org-macs) @@ -90,6 +92,7 @@ (defvar org-habit-show-habits) (defvar org-habit-show-habits-only-for-today) (defvar org-habit-show-all-today) +(defvar org-habit-scheduled-past-days) ;; Defined somewhere in this file, but used before definition. (defvar org-agenda-buffer-name "*Org Agenda*") @@ -381,6 +384,9 @@ the daily/weekly agenda, see `org-agenda-skip-function'.") (const :scheduled*) (const :timestamp) (const :sexp)))) + (list :tag "Columns format" + (const org-overriding-columns-format) + (string :tag "Format")) (list :tag "Standard skipping condition" :value (org-agenda-skip-function '(org-agenda-skip-entry-if)) (const org-agenda-skip-function) @@ -461,7 +467,7 @@ type The command type, any of the following symbols: ... A user-defined function. match What to search for: - a single keyword for TODO keyword searches - - a tags match expression for tags searches + - a tags/property/todo match expression for searches - a word search expression for text searches. - a regular expression for occur searches For all other commands, this should be the empty string. @@ -548,11 +554,11 @@ should provide a description for the prefix, like (const :format "" stuck) (const :tag "" :format "" "") ,org-agenda-custom-commands-local-options) - (list :tag "Tags search" + (list :tag "Tags/Property match (all agenda files)" (const :format "" tags) (string :tag "Match") ,org-agenda-custom-commands-local-options) - (list :tag "Tags search, TODO entries only" + (list :tag "Tags/Property match of TODO entries (all agenda files)" (const :format "" tags-todo) (string :tag "Match") ,org-agenda-custom-commands-local-options) @@ -1706,6 +1712,13 @@ Custom commands can set this variable in the options section." :version "26.1" :package-version '(Org . "9.1")) +(defcustom org-agenda-breadcrumbs-separator "->" + "The separator of breadcrumbs in agenda lines." + :group 'org-agenda-line-format + :package-version '(Org . "9.3") + :type 'string + :safe #'stringp) + (defvar org-prefix-format-compiled nil "The compiled prefix format and associated variables. This is a list where first element is a list of variable bindings, and second @@ -2021,7 +2034,8 @@ estimate." The sole argument to the function, which is called once for each possible tag, is a string giving the name of the tag. The function should return either nil if the tag should be included -as normal, or \"-\" to exclude the tag. +as normal, \"-\" to exclude the tag, or \"+\" to exclude +lines not carrying this tag. Note that for the purpose of tag filtering, only the lower-case version of all tags will be considered, so that this function will only ever see the lower-case version of all tags." @@ -2186,7 +2200,6 @@ The following commands are available: (interactive) (let ((agenda-local-vars-to-keep '(text-scale-mode-amount - text-scale-mode text-scale-mode-lighter face-remapping-alist)) (save (buffer-local-variables))) @@ -2387,9 +2400,10 @@ The following commands are available: (org-defkey org-agenda-mode-map "]" 'org-agenda-manipulate-query-subtract) (org-defkey org-agenda-mode-map "{" 'org-agenda-manipulate-query-add-re) (org-defkey org-agenda-mode-map "}" 'org-agenda-manipulate-query-subtract-re) -(org-defkey org-agenda-mode-map "/" 'org-agenda-filter-by-tag) +(org-defkey org-agenda-mode-map "\\" 'org-agenda-filter-by-tag) (org-defkey org-agenda-mode-map "_" 'org-agenda-filter-by-effort) (org-defkey org-agenda-mode-map "=" 'org-agenda-filter-by-regexp) +(org-defkey org-agenda-mode-map "/" 'org-agenda-filter) (org-defkey org-agenda-mode-map "|" 'org-agenda-filter-remove-all) (org-defkey org-agenda-mode-map "~" 'org-agenda-limit-interactively) (org-defkey org-agenda-mode-map "<" 'org-agenda-filter-by-category) @@ -2470,8 +2484,20 @@ The following commands are available: :keys "v A"] "--" ["Remove Restriction" org-agenda-remove-restriction-lock org-agenda-restrict]) - ["Write view to file" org-agenda-write t] + ("Filter current view" + ["with generic interface" org-agenda-filter t] + "--" + ["by category at cursor" org-agenda-filter-by-category t] + ["by tag" org-agenda-filter-by-tag t] + ["by effort" org-agenda-filter-by-effort t] + ["by regexp" org-agenda-filter-by-regexp t] + ["by top-level headline" org-agenda-filter-by-top-headline t] + "--" + ["Remove all filtering" org-agenda-filter-remove-all t] + "--" + ["limit" org-agenda-limit-interactively t]) ["Rebuild buffer" org-agenda-redo t] + ["Write view to file" org-agenda-write t] ["Save all Org buffers" org-save-all-org-buffers t] "--" ["Show original entry" org-agenda-show t] @@ -2839,7 +2865,13 @@ Pressing `<' twice means to restrict to the current subtree or region (org-back-to-heading t) (move-marker org-agenda-restrict-begin (point)) (move-marker org-agenda-restrict-end - (progn (org-end-of-subtree t))))))) + (progn (org-end-of-subtree t))))) + ((and (eq restriction 'buffer) + (or (< 1 (point-min)) + (< (point-max) (1+ (buffer-size))))) + (setq org-agenda-restrict (current-buffer)) + (move-marker org-agenda-restrict-begin (point-min)) + (move-marker org-agenda-restrict-end (point-max))))) ;; For example the todo list should not need it (but does...) (cond @@ -3077,16 +3109,42 @@ s Search for keywords M Like m, but only TODO entries (setq second-time t) (org-fit-window-to-buffer)) + ;; Hint to navigation if window too small for all information + (setq header-line-format + (when (not (pos-visible-in-window-p (point-max))) + "Use SPC, DEL, C-n or C-p to navigate.")) + ;; Ask for selection - (message "Press key for agenda command%s:" - (if (or restrict-ok org-agenda-overriding-restriction) - (if org-agenda-overriding-restriction - " (restriction lock active)" - (if restriction - (format " (restricted to %s)" restriction) - " (unrestricted)")) - "")) - (setq c (read-char-exclusive)) + (cl-loop + do (progn + (message "Press key for agenda command%s:" + (if (or restrict-ok org-agenda-overriding-restriction) + (if org-agenda-overriding-restriction + " (restriction lock active)" + (if restriction + (format " (restricted to %s)" restriction) + " (unrestricted)")) + "")) + (setq c (read-char-exclusive))) + until (not (memq c '(14 16 ?\s ?\d))) + do (cl-case c + (14 (if (not (pos-visible-in-window-p (point-max))) + (ignore-errors (scroll-up 1)) + (message "End of buffer") + (sit-for 1))) + (16 (if (not (pos-visible-in-window-p (point-min))) + (ignore-errors (scroll-down 1)) + (message "Beginning of buffer") + (sit-for 1))) + (?\s (if (not (pos-visible-in-window-p (point-max))) + (scroll-up nil) + (message "End of buffer") + (sit-for 1))) + (?\d (if (not (pos-visible-in-window-p (point-min))) + (scroll-down nil) + (message "Beginning of buffer") + (sit-for 1))))) + (message "") (cond ((assoc (char-to-string c) custom) @@ -3259,7 +3317,7 @@ todo The todo keyword, if any tags All tags including inherited ones, separated by colons date The relevant date, like 2007-2-14 time The time, like 15:00-16:50 -extra Sting with extra planning info +extra String with extra planning info priority-l The priority letter if any was given priority-n The computed numerical priority agenda-day The day in the agenda where this is listed" @@ -3535,7 +3593,7 @@ removed from the entry content. Currently only `planning' is allowed here." (add-text-properties (match-beginning 0) (match-end 0) '(face org-link)))) (goto-char (point-min)) - (while (re-search-forward org-bracket-link-regexp (point-max) t) + (while (re-search-forward org-link-bracket-re (point-max) t) (set-text-properties (match-beginning 0) (match-end 0) nil)) (goto-char (point-min)) @@ -3608,6 +3666,11 @@ removed from the entry content. Currently only `planning' is allowed here." (defvar org-agenda-regexp-filter nil) (defvar org-agenda-effort-filter nil) (defvar org-agenda-top-headline-filter nil) + +(defvar org-agenda-represented-categories nil + "Cache for the list of all categories in the agenda.") +(defvar org-agenda-represented-tags nil + "Cache for the list of all categories in the agenda.") (defvar org-agenda-tag-filter-preset nil "A preset of the tags filter used for secondary agenda filtering. This must be a list of strings, each string must be a single tag preceded @@ -3618,6 +3681,20 @@ the entire agenda view. In a block agenda, it will not work reliably to define a filter for one of the individual blocks. You need to set it in the global options and expect it to be applied to the entire view.") +(defconst org-agenda-filter-variables + '((category . org-agenda-category-filter) + (tag . org-agenda-tag-filter) + (effort . org-agenda-effort-filter) + (regexp . org-agenda-regexp-filter)) + "Alist of filter types and associated variables") +(defun org-agenda-filter-any () + "Is any filter active?" + (let ((form (cons 'or (mapcar (lambda (x) + (if (or (symbol-value (cdr x)) + (get :preset-filter x)) + t nil)) + org-agenda-filter-variables)))) + (eval form))) (defvar org-agenda-category-filter-preset nil "A preset of the category filter used for secondary agenda filtering. This must be a list of strings, each string must be a single category @@ -3715,6 +3792,7 @@ FILTER-ALIST is an alist of filters we need to apply when (put 'org-agenda-tag-filter :preset-filter nil) (put 'org-agenda-category-filter :preset-filter nil) (put 'org-agenda-regexp-filter :preset-filter nil) + (put 'org-agenda-effort-filter :preset-filter nil) ;; Popup existing buffer (org-agenda-prepare-window (get-buffer org-agenda-buffer-name) filter-alist) @@ -3816,6 +3894,8 @@ FILTER-ALIST is an alist of filters we need to apply when (org-with-point-at mrk (mapcar #'downcase (org-get-tags))))))))) (run-hooks 'org-agenda-finalize-hook) + (setq org-agenda-represented-tags nil + org-agenda-represented-categories nil) (when org-agenda-top-headline-filter (org-agenda-filter-top-headline-apply org-agenda-top-headline-filter)) @@ -3941,7 +4021,7 @@ dimming them." the header at `org-hd-marker' is blocked according to `org-entry-blocked-p', then if `org-agenda-dim-blocked-tasks' is 'invisible and the header is not blocked by checkboxes, set the -text property `org-todo-blocked' to 'invisible, otherwise set it +text property `org-todo-blocked' to `invisible', otherwise set it to t." (when (get-text-property 0 'todo-state entry) (let ((entry-marker (get-text-property 0 'org-hd-marker entry)) @@ -4125,6 +4205,9 @@ items if they have an hour specification like [h]h:mm." span (nth 2 org-agenda-overriding-arguments))) (when (and (integerp arg) (> arg 0)) (setq span arg arg nil)) + (when (numberp span) + (unless (< 0 span) + (user-error "Agenda creation impossible for this span(=%d days)." span))) (catch 'exit (setq org-agenda-buffer-name (or org-agenda-buffer-tmp-name @@ -4627,7 +4710,7 @@ Press `\\[org-agenda-manipulate-query-add]', \ `\\[org-agenda-manipulate-query-subtract]' to add/sub word, \ `\\[org-agenda-manipulate-query-add-re]', \ `\\[org-agenda-manipulate-query-subtract-re]' to add/sub regexp, \ -`\\[universal-argument] \\[org-agenda-redo]' to edit\n")) +`\\[universal-argument] \\[org-agenda-redo]' for a fresh search\n")) (add-text-properties pos (1- (point)) (list 'face 'org-agenda-structure))) (buffer-string))) @@ -5052,6 +5135,7 @@ of what a project is and how to check if it stuck, customize the variable (cons 'org-diary-default-entry diary-list-entries-hook)) (diary-file-name-prefix nil) ; turn this feature off (diary-modify-entry-list-string-function 'org-modify-diary-entry-string) + (diary-time-regexp (concat "^" diary-time-regexp)) entries (org-disable-agenda-to-diary t)) (save-excursion @@ -5201,7 +5285,7 @@ function from a program - use `org-agenda-get-day-entries' instead." (when results (setq results (mapcar (lambda (i) (replace-regexp-in-string - org-bracket-link-regexp "\\3" i)) results)) + org-link-bracket-re "\\2" i)) results)) (concat (org-agenda-finalize-entries results) "\n")))) ;;; Agenda entry finders @@ -5867,7 +5951,14 @@ See also the user option `org-agenda-clock-consistency-checks'." (error "No valid Clock line") (throw 'next t)) (unless (match-end 3) - (setq issue "No end time" + (setq issue + (format + "No end time: (%s)" + (org-duration-from-minutes + (floor + (- (float-time (org-current-time)) + (float-time (org-time-string-to-time (match-string 1)))) + 60))) face (or (plist-get pl :no-end-time-face) face)) (throw 'next t)) (setq ts (match-string 1) @@ -6164,6 +6255,7 @@ scheduled items with an hour specification like [h]h:mm." (diff (- current schedule)) (warntime (get-text-property (point) 'org-appt-warntime)) (pastschedp (< schedule today)) + (futureschedp (> schedule today)) (habitp (and (fboundp 'org-is-habit-p) (org-is-habit-p))) (suppress-delay (let ((deadline (and org-agenda-skip-scheduled-delay-if-deadline @@ -6201,7 +6293,8 @@ scheduled items with an hour specification like [h]h:mm." habitp (bound-and-true-p org-habit-show-all-today)) (when (or (and (> ddays 0) (< diff ddays)) - (> diff org-scheduled-past-days) + (> diff (or (and habitp org-habit-scheduled-past-days) + org-scheduled-past-days)) (> schedule current) (and (/= current schedule) (/= current today) @@ -6255,9 +6348,17 @@ scheduled items with an hour specification like [h]h:mm." (head (buffer-substring (point) (line-end-position))) (time (cond - ;; No time of day designation if it is only - ;; a reminder. - ((and (/= current schedule) (/= current repeat)) nil) + ;; No time of day designation if it is only a + ;; reminder, except for habits, which always show + ;; the time of day. Habits are an exception + ;; because if there is a time of day, that is + ;; interpreted to mean they should usually happen + ;; then, even if doing the habit was missed. + ((and + (not habitp) + (/= current schedule) + (/= current repeat)) + nil) ((string-match " \\([012]?[0-9]:[0-9][0-9]\\)" s) (concat (substring s (match-beginning 1)) " ")) (t 'time))) @@ -6271,6 +6372,8 @@ scheduled items with an hour specification like [h]h:mm." head level category tags time nil habitp)) (face (cond ((and (not habitp) pastschedp) 'org-scheduled-previously) + ((and habitp futureschedp) + 'org-agenda-done) (todayp 'org-scheduled-today) (t 'org-scheduled))) (habitp (and habitp (org-habit-parse-todo)))) @@ -6540,8 +6643,8 @@ Any match of REMOVE-RE will be removed from TXT." (setq breadcrumbs (org-with-point-at (org-get-at-bol 'org-marker) (let ((s (org-format-outline-path (org-get-outline-path) (1- (frame-width)) - nil "->"))) - (if (eq "" s) "" (concat s "->")))))) + nil org-agenda-breadcrumbs-separator))) + (if (eq "" s) "" (concat s org-agenda-breadcrumbs-separator)))))) (setq time (cond (s2 (concat (org-agenda-time-of-day-to-ampm-maybe s1) "-" (org-agenda-time-of-day-to-ampm-maybe s2) @@ -6555,11 +6658,9 @@ Any match of REMOVE-RE will be removed from TXT." extra (or (and (not habitp) extra) "") category (if (symbolp category) (symbol-name category) category) level (or level "")) - (if (string-match org-bracket-link-regexp category) + (if (string-match org-link-bracket-re category) (progn - (setq l (if (match-end 3) - (- (match-end 3) (match-beginning 3)) - (- (match-end 1) (match-beginning 1)))) + (setq l (string-width (or (match-string 2) (match-string 1)))) (when (< l (or org-prefix-category-length 0)) (setq category (copy-sequence category)) (org-add-props category nil @@ -6709,8 +6810,9 @@ and stored in the variable `org-prefix-format-compiled'." (floor (abs (string-to-number (match-string 2 s))))) (setq org-prefix-category-max-length (let ((x (match-string 2 s))) - (when (string-match-p "\\.[0-9]+" x) - (string-to-number (substring (match-string 0 x) 1)))))) + (save-match-data + (and (string-match "\\.[0-9]+" x) + (string-to-number (substring (match-string 0 x) 1))))))) (if (eq var 'eval) (setq varform `(format ,f (org-eval ,(read (match-string 4 s))))) (if opt @@ -7207,14 +7309,14 @@ subtree." ;;; Agenda commands (defun org-agenda-check-type (error &rest types) - "Check if agenda buffer is of allowed type. + "Check if agenda buffer or component is of allowed type. If ERROR is non-nil, throw an error, otherwise just return nil. Allowed types are `agenda' `todo' `tags' `search'." (cond ((not org-agenda-type) (error "No Org agenda currently displayed")) ((memq org-agenda-type types) t) (error - (error "Not allowed in %s-type agenda buffers" org-agenda-type)) + (error "Not allowed in '%s'-type agenda buffer or component" org-agenda-type)) (t nil))) (defun org-agenda-Quit () @@ -7393,13 +7495,13 @@ With a prefix argument, do so in all agenda buffers." (defun org-agenda-filter-by-category (strip) "Filter lines in the agenda buffer that have a specific category. The category is that of the current line. -Without prefix argument, keep only the lines of that category. -With a prefix argument, exclude the lines of that category." +With a `\\[universal-argument]' prefix argument, exclude the lines of that category. +When there is already a category filter in place, this command removes the filter." (interactive "P") (if (and org-agenda-filtered-by-category org-agenda-category-filter) (org-agenda-filter-show-all-cat) - (let ((cat (org-no-properties (org-agenda-get-category)))) + (let ((cat (org-no-properties (org-get-at-eol 'org-category 1)))) (cond ((and cat strip) (org-agenda-filter-apply @@ -7424,7 +7526,8 @@ search from." (defvar org-agenda-filtered-by-top-headline nil) (defun org-agenda-filter-by-top-headline (strip) "Keep only those lines that are descendants from the same top headline. -The top headline is that of the current line." +The top headline is that of the current line. With prefix arg STRIP, hide +all lines of the category at point." (interactive "P") (if org-agenda-filtered-by-top-headline (progn @@ -7436,47 +7539,60 @@ The top headline is that of the current line." (error "No top-level headline at point"))))) (defvar org-agenda-regexp-filter nil) -(defun org-agenda-filter-by-regexp (strip) - "Filter agenda entries by regular expressions. - -With one prefix argument, filter out entries matching the regexp. -If there is already a regexp filter, remove it unless called with -two prefix arguments." +(defun org-agenda-filter-by-regexp (strip-or-accumulate) + "Filter agenda entries by a regular expressions. +You will be prompted for the regular expression, and the agenda +view will only show entries that are matched by that expression. + +With one `\\[universal-argument]' prefix argument, hide entries matching the regexp. +When there is already a regexp filter active, this command removed the +filter. However, with two `\\[universal-argument]' prefix arguments, add a new condition to +an already existing regexp filter." (interactive "P") - (cond - ((and org-agenda-regexp-filter (not (equal strip '(16)))) - (org-agenda-filter-show-all-re) - (message "Regexp filter removed")) - (t (let ((flt (concat (if (equal strip '(4)) "-" "+") - (read-from-minibuffer - (if (equal strip '(4)) - "Filter out entries matching regexp: " - "Narrow to entries matching regexp: "))))) - (push flt org-agenda-regexp-filter) - (org-agenda-filter-apply org-agenda-regexp-filter 'regexp))))) + (let* ((strip (equal strip-or-accumulate '(4))) + (accumulate (equal strip-or-accumulate '(16)))) + (cond + ((and org-agenda-regexp-filter (not accumulate)) + (org-agenda-filter-show-all-re) + (message "Regexp filter removed")) + (t (let ((flt (concat (if strip "-" "+") + (read-from-minibuffer + (if strip + "Hide entries matching regexp: " + "Narrow to entries matching regexp: "))))) + (push flt org-agenda-regexp-filter) + (org-agenda-filter-apply org-agenda-regexp-filter 'regexp)))))) (defvar org-agenda-effort-filter nil) -(defun org-agenda-filter-by-effort (strip) +(defun org-agenda-filter-by-effort (strip-or-accumulate) "Filter agenda entries by effort. -With no prefix argument, keep entries matching the effort condition. -With one prefix argument, filter out entries matching the condition. -With two prefix arguments, remove the effort filters." +With no `\\[universal-argument]' prefix argument, keep entries matching the effort condition. +With one `\\[universal-argument]' prefix argument, filter out entries matching the condition. +With two `\\[universal-argument]' prefix arguments, add a second condition to the existing filter. +This last option is in practice not very useful, but it is available for +consistency with the other filter commands." (interactive "P") - (cond - ((member strip '(nil 4)) - (let* ((efforts (split-string - (or (cdr (assoc (concat org-effort-property "_ALL") - org-global-properties)) - "0 0:10 0:30 1:00 2:00 3:00 4:00 5:00 6:00 7:00"))) - ;; XXX: the following handles only up to 10 different - ;; effort values. - (allowed-keys (if (null efforts) nil - (mapcar (lambda (n) (mod n 10)) ;turn 10 into 0 - (number-sequence 1 (length efforts))))) - (op nil)) - (while (not (memq op '(?< ?> ?=))) - (setq op (read-char-exclusive "Effort operator? (> = or <)"))) - ;; Select appropriate duration. Ignore non-digit characters. + (let* ((efforts (split-string + (or (cdr (assoc (concat org-effort-property "_ALL") + org-global-properties)) + "0 0:10 0:30 1:00 2:00 3:00 4:00 5:00 6:00 7:00"))) + ;; XXX: the following handles only up to 10 different + ;; effort values. + (allowed-keys (if (null efforts) nil + (mapcar (lambda (n) (mod n 10)) ;turn 10 into 0 + (number-sequence 1 (length efforts))))) + (keep (equal strip-or-accumulate '(16))) + (negative (equal strip-or-accumulate '(4))) + (current org-agenda-effort-filter) + (op nil)) + (while (not (memq op '(?< ?> ?= ?_))) + (setq op (read-char-exclusive + "Effort operator? (> = or <) or press `_' again to remove filter"))) + ;; Select appropriate duration. Ignore non-digit characters. + (if (eq op ?_) + (progn + (org-agenda-filter-show-all-effort) + (message "Effort filter removed")) (let ((prompt (apply #'format (concat "Effort %c " @@ -7488,15 +7604,149 @@ With two prefix arguments, remove the effort filters." (while (not (memq eff allowed-keys)) (message prompt) (setq eff (- (read-char-exclusive) 48))) + (org-agenda-filter-show-all-effort) (setq org-agenda-effort-filter - (list (concat (if strip "-" "+") - (char-to-string op) - ;; Numbering is 1 2 3 ... 9 0, but we want - ;; 0 1 2 ... 8 9. - (nth (mod (1- eff) 10) efforts))))) - (org-agenda-filter-apply org-agenda-effort-filter 'effort))) - (t (org-agenda-filter-show-all-effort) - (message "Effort filter removed")))) + (append + (list (concat (if negative "-" "+") + (char-to-string op) + ;; Numbering is 1 2 3 ... 9 0, but we want + ;; 0 1 2 ... 8 9. + (nth (mod (1- eff) 10) efforts))) + (if keep current nil))) + (org-agenda-filter-apply org-agenda-effort-filter 'effort))))) + + +(defun org-agenda-filter (&optional strip-or-accumulate) + "Prompt for a general filter string and apply it to the agenda. + +The string may contain filter elements like + ++category ++tag ++ and = are also allowed as effort operators ++/regexp/ + +Instead of `+', `-' is allowed to strip the agenda of matching entries. +`+' is optional if it is not required to separate two string parts. +Multiple filter elements can be concatenated without spaces, for example + + +work-John<0:10-/plot/ + +selects entries with category `work' and effort estimates below 10 minutes, +and deselects entries with tag `John' or matching the regexp `plot'. + +During entry of the filter, completion for tags, categories and effort +values is offered. Since the syntax for categories and tags is identical +there should be no overlap between categories and tags. If there is, tags +get priority. + +A single `\\[universal-argument]' prefix arg STRIP-OR-ACCUMULATE will negate the +entire filter, which can be useful in connection with the prompt history. + +A double `\\[universal-argument] \\[universal-argument]' prefix arg will add the new filter elements to the +existing ones. A shortcut for this is to add an additional `+' at the +beginning of the string, like `+-John'. + +With a triple prefix argument, execute the computed filtering defined in +the variable `org-agenda-auto-exclude-function'." + (interactive "P") + (if (equal strip-or-accumulate '(64)) + ;; Execute the auto-exclude action + (if (not org-agenda-auto-exclude-function) + (user-error "`org-agenda-auto-exclude-function' is undefined") + (org-agenda-filter-show-all-tag) + (setq org-agenda-tag-filter nil) + (dolist (tag (org-agenda-get-represented-tags)) + (let ((modifier (funcall org-agenda-auto-exclude-function tag))) + (when modifier + (push modifier org-agenda-tag-filter)))) + (unless (null org-agenda-tag-filter) + (org-agenda-filter-apply org-agenda-tag-filter 'tag 'expand))) + ;; Prompt for a filter and act + (let* ((tag-list (org-agenda-get-represented-tags)) + (category-list (org-agenda-get-represented-categories)) + (negate (equal strip-or-accumulate '(4))) + (f-string (completing-read + (concat + (if negate "Negative filter" "Filter") + " [+cat-tag<0:10-/regexp/]: ") + 'org-agenda-filter-completion-function)) + (keep (or (if (string-match "^\\+[+-]" f-string) + (progn (setq f-string (substring f-string 1)) t)) + (equal strip-or-accumulate '(16)))) + (fc (if keep org-agenda-category-filter)) + (ft (if keep org-agenda-tag-filter)) + (fe (if keep org-agenda-effort-filter)) + (fr (if keep org-agenda-regexp-filter)) + pm s) + (while (string-match "^[ \t]*\\([-+]\\)?\\(\\([^-+<>=/ \t]+\\)\\|\\([<>=][0-9:]+\\)\\|\\(/\\([^/]+\\)/?\\)\\)" f-string) + (setq pm (if (match-beginning 1) (match-string 1 f-string) "+")) + (when negate + (setq pm (if (equal pm "+") "-" "+"))) + (cond + ((match-beginning 3) + ;; category or tag + (setq s (match-string 3 f-string)) + (cond + ((member s tag-list) + (add-to-list 'ft (concat pm s) 'append 'equal)) + ((member s category-list) + (add-to-list 'fc (concat pm s) 'append 'equal)) + (t (message + "`%s%s' filter ignored because tag/category is not represented" + pm s)))) + ((match-beginning 4) + ;; effort + (add-to-list 'fe (concat pm (match-string 4 f-string)) t 'equal)) + ((match-beginning 5) + ;; regexp + (add-to-list 'fr (concat pm (match-string 6 f-string)) t 'equal))) + (setq f-string (substring f-string (match-end 0)))) + (org-agenda-filter-remove-all) + (and fc (org-agenda-filter-apply + (setq org-agenda-category-filter fc) 'category)) + (and ft (org-agenda-filter-apply + (setq org-agenda-tag-filter ft) 'tag)) + (and fe (org-agenda-filter-apply + (setq org-agenda-effort-filter fe) 'effort)) + (and fr (org-agenda-filter-apply + (setq org-agenda-regexp-filter fr) 'regexp)) + ))) + +(defun org-agenda-filter-completion-function (string _predicate &optional flag) + "Complete a complex filter string +FLAG specifies the type of completion operation to perform. This +function is passed as a collection function to `completing-read', +which see." + (let ((completion-ignore-case t) ;tags are case-sensitive + (confirm (lambda (x) (stringp x))) + (prefix "") + (operator "") + table) + (when (string-match "^\\(.*\\([-+<>=]\\)\\)\\([^-+<>=]*\\)$" string) + (setq prefix (match-string 1 string) + operator (match-string 2 string) + string (match-string 3 string))) + (cond + ((member operator '("+" "-" "" nil)) + (setq table (append (org-agenda-get-represented-categories) + (org-agenda-get-represented-tags)))) + ((member operator '("<" ">" "=")) + (setq table (split-string + (or (cdr (assoc (concat org-effort-property "_ALL") + org-global-properties)) + "0 0:10 0:30 1:00 2:00 3:00 4:00 5:00 6:00 7:00") + " +"))) + (t (setq table nil))) + (pcase flag + (`t (all-completions string table confirm)) + (`lambda (assoc string table)) ;exact match? + (`nil + (pcase (try-completion string table confirm) + ((and completion (pred stringp)) + (concat prefix completion)) + (completion completion))) + (_ nil)))) (defun org-agenda-filter-remove-all () "Remove all filters from the current agenda buffer." @@ -7513,14 +7763,17 @@ With two prefix arguments, remove the effort filters." (org-agenda-filter-show-all-effort)) (org-agenda-finalize)) -(defun org-agenda-filter-by-tag (arg &optional char exclude) +(defun org-agenda-filter-by-tag (strip-or-accumulate &optional char exclude) "Keep only those lines in the agenda buffer that have a specific tag. The tag is selected with its fast selection letter, as configured. -With a `\\[universal-argument]' prefix, exclude the agenda search. +With a `\\[universal-argument]' prefix, apply the filter negatively, stripping all matches. + +With a `\\[universal-argument] \\[universal-argument]' prefix, add the new tag to the existing filter +instead of replacing it. -With a `\\[universal-argument] \\[universal-argument]' prefix, filter the literal tag, \ +With a `\\[universal-argument] \\[universal-argument] \\[universal-argument]' prefix, filter the literal tag, \ i.e. don't filter on all its group members. @@ -7529,33 +7782,38 @@ should be used to exclude the search - the interactive user can also press `-' or `+' to switch between filtering and excluding." (interactive "P") (let* ((alist org-tag-alist-for-agenda) + (seen-chars nil) (tag-chars (mapconcat (lambda (x) (if (and (not (symbolp (car x))) - (cdr x)) - (char-to-string (cdr x)) + (cdr x) + (not (member (cdr x) seen-chars))) + (progn + (push (cdr x) seen-chars) + (char-to-string (cdr x))) "")) org-tag-alist-for-agenda "")) - (valid-char-list (append '(?\t ?\r ?/ ?. ?\s ?q) + (valid-char-list (append '(?\t ?\r ?\\ ?. ?\s ?q) (string-to-list tag-chars))) - (exclude (or exclude (equal arg '(4)))) - (expand (not (equal arg '(16)))) + (exclude (or exclude (equal strip-or-accumulate '(4)))) + (accumulate (equal strip-or-accumulate '(16))) + (expand (not (equal strip-or-accumulate '(64)))) (inhibit-read-only t) (current org-agenda-tag-filter) a n tag) (unless char (while (not (memq char valid-char-list)) (org-unlogged-message - "%s by tag [%s ]:tag-char, [TAB]:tag, %s[/]:off, [+/-]:filter/exclude%s, [q]:quit" - (if exclude "Exclude" "Filter") + "%s by tag%s: [%s ]tag-char [TAB]tag %s[\\]off [q]uit" + (if exclude "Exclude[+]" "Filter[-]") + (if expand "" " (no grouptag expand)") tag-chars - (if org-agenda-auto-exclude-function "[RET], " "") - (if expand "" ", no grouptag expand")) + (if org-agenda-auto-exclude-function "[RET] " "")) (setq char (read-char-exclusive)) ;; Excluding or filtering down (cond ((eq char ?-) (setq exclude t)) ((eq char ?+) (setq exclude nil))))) (when (eq char ?\t) - (unless (local-variable-p 'org-global-tags-completion-table (current-buffer)) + (unless (local-variable-p 'org-global-tags-completion-table) (setq-local org-global-tags-completion-table (org-global-tags-completion-table))) (let ((completion-ignore-case t)) @@ -7572,7 +7830,7 @@ also press `-' or `+' to switch between filtering and excluding." (push modifier org-agenda-tag-filter)))) (unless (null org-agenda-tag-filter) (org-agenda-filter-apply org-agenda-tag-filter 'tag expand)))) - ((eq char ?/) + ((eq char ?\\) (org-agenda-filter-show-all-tag) (when (get 'org-agenda-tag-filter :preset-filter) (org-agenda-filter-apply org-agenda-tag-filter 'tag expand))) @@ -7589,21 +7847,36 @@ also press `-' or `+' to switch between filtering and excluding." (setq tag (car a)) (setq org-agenda-tag-filter (cons (concat (if exclude "-" "+") tag) - current)) + (if accumulate current nil))) (org-agenda-filter-apply org-agenda-tag-filter 'tag expand)) (t (error "Invalid tag selection character %c" char))))) -(defun org-agenda-get-represented-tags () - "Get a list of all tags currently represented in the agenda." - (let (p tags) - (save-excursion - (goto-char (point-min)) - (while (setq p (next-single-property-change (point) 'tags)) - (goto-char p) - (mapc (lambda (x) (add-to-list 'tags x)) - (get-text-property (point) 'tags)))) - tags)) +(defun org-agenda-get-represented-categories () + "Return a list of all categories used in this agenda buffer." + (or org-agenda-represented-categories + (when (derived-mode-p 'org-agenda-mode) + (let ((pos (point-min)) categories) + (while (and (< pos (point-max)) + (setq pos (next-single-property-change + pos 'org-category nil (point-max)))) + (push (get-text-property pos 'org-category) categories)) + (setq org-agenda-represented-categories + (nreverse (org-uniquify (delq nil categories)))))))) +(defun org-agenda-get-represented-tags () + "Return a list of all tags used in this agenda buffer. +These will be lower-case, for filtering." + (or org-agenda-represented-tags + (when (derived-mode-p 'org-agenda-mode) + (let ((pos (point-min)) tags-lists tt) + (while (and (< pos (point-max)) + (setq pos (next-single-property-change + pos 'tags nil (point-max)))) + (setq tt (get-text-property pos 'tags)) + (if tt (push tt tags-lists))) + (setq org-agenda-represented-tags + (nreverse (org-uniquify + (delq nil (apply 'append tags-lists))))))))) (defun org-agenda-filter-make-matcher (filter type &optional expand) "Create the form that tests a line for agenda filter. Optional @@ -7653,7 +7926,7 @@ tags in the FILTER if any of the tags in FILTER are grouptags." filter))) (dolist (x filter) (push (org-agenda-filter-effort-form x) f)))) - (cons 'and (nreverse f)))) + (cons (if (eq type 'category) 'or 'and) (nreverse f)))) (defun org-agenda-filter-make-matcher-tag-exp (tags op) "Return a form associated to tag-expression TAGS. @@ -7666,7 +7939,7 @@ function to set the right switches in the returned form." (dolist (x tags (cons (if (eq op ?-) 'and 'or) form)) (let* ((tag (substring x 1)) (f (cond - ((string= "" tag) '(not tags)) + ((string= "" tag) 'tags) ((and (string-match-p "\\`{" tag) (string-match-p "}\\'" tag)) ;; TAG is a regexp. (list 'org-match-any-p (substring tag 1 -1) 'tags)) @@ -7721,7 +7994,8 @@ tags in the FILTER if any of the tags in FILTER are grouptags." ;; Deactivate `org-agenda-entry-text-mode' when filtering (when org-agenda-entry-text-mode (org-agenda-entry-text-mode)) (let (tags cat txt) - (setq org-agenda-filter-form (org-agenda-filter-make-matcher filter type expand)) + (setq org-agenda-filter-form (org-agenda-filter-make-matcher + filter type expand)) ;; Only set `org-agenda-filtered-by-category' to t when a unique ;; category is used as the filter: (setq org-agenda-filtered-by-category @@ -7731,7 +8005,7 @@ tags in the FILTER if any of the tags in FILTER are grouptags." (save-excursion (goto-char (point-min)) (while (not (eobp)) - (if (org-get-at-bol 'org-marker) + (if (org-get-at-bol 'org-hd-marker) (progn (setq tags (org-get-at-bol 'tags) cat (org-agenda-get-category) @@ -7774,7 +8048,8 @@ tags in the FILTER if any of the tags in FILTER are grouptags." (save-excursion (goto-char (point-min)) (let ((inhibit-read-only t) pos) - (while (setq pos (text-property-any (point) (point-max) 'org-filter-type type)) + (while (setq pos (text-property-any (point) (point-max) + 'org-filter-type type)) (goto-char pos) (remove-text-properties (point) (next-single-property-change (point) 'org-filter-type) @@ -8306,56 +8581,51 @@ When called with a prefix argument, include all archive files as well." ((eq org-agenda-show-log 'clockcheck) " ClkCk") (org-agenda-show-log " Log") (t "")) + (if (org-agenda-filter-any) " " "") (if (or org-agenda-category-filter (get 'org-agenda-category-filter :preset-filter)) '(:eval (propertize - (concat " <" + (concat "[" (mapconcat 'identity (append (get 'org-agenda-category-filter :preset-filter) org-agenda-category-filter) "") - ">") + "]") 'face 'org-agenda-filter-category 'help-echo "Category used in filtering")) "") (if (or org-agenda-tag-filter (get 'org-agenda-tag-filter :preset-filter)) '(:eval (propertize - (concat " {" - (mapconcat + (concat (mapconcat 'identity (append (get 'org-agenda-tag-filter :preset-filter) org-agenda-tag-filter) - "") - "}") + "")) 'face 'org-agenda-filter-tags 'help-echo "Tags used in filtering")) "") (if (or org-agenda-effort-filter (get 'org-agenda-effort-filter :preset-filter)) '(:eval (propertize - (concat " {" - (mapconcat + (concat (mapconcat 'identity (append (get 'org-agenda-effort-filter :preset-filter) org-agenda-effort-filter) - "") - "}") + "")) 'face 'org-agenda-filter-effort 'help-echo "Effort conditions used in filtering")) "") (if (or org-agenda-regexp-filter (get 'org-agenda-regexp-filter :preset-filter)) '(:eval (propertize - (concat " [" - (mapconcat - 'identity + (concat (mapconcat + (lambda (x) (concat (substring x 0 1) "/" (substring x 1) "/")) (append (get 'org-agenda-regexp-filter :preset-filter) org-agenda-regexp-filter) - "") - "]") + "")) 'face 'org-agenda-filter-regexp 'help-echo "Regexp used in filtering")) "") (if org-agenda-archives-mode @@ -8462,7 +8732,7 @@ Point is in the buffer where the item originated.") (buffer (marker-buffer marker)) (pos (marker-position marker)) (type (org-get-at-bol 'type)) - dbeg dend (n 0) conf) + dbeg dend (n 0)) (org-with-remote-undo buffer (with-current-buffer buffer (save-excursion @@ -8474,14 +8744,20 @@ Point is in the buffer where the item originated.") dend (min (point-max) (1+ (point-at-eol))))) (goto-char dbeg) (while (re-search-forward "^[ \t]*\\S-" dend t) (setq n (1+ n))))) - (setq conf (or (eq t org-agenda-confirm-kill) - (and (numberp org-agenda-confirm-kill) - (> n org-agenda-confirm-kill)))) - (and conf - (not (y-or-n-p - (format "Delete entry with %d lines in buffer \"%s\"? " - n (buffer-name buffer)))) - (error "Abort")) + (when (or (eq t org-agenda-confirm-kill) + (and (numberp org-agenda-confirm-kill) + (> n org-agenda-confirm-kill))) + (let ((win-conf (current-window-configuration))) + (unwind-protect + (and + (prog2 + (org-agenda-tree-to-indirect-buffer nil) + (not (y-or-n-p + (format "Delete entry with %d lines in buffer \"%s\"? " + n (buffer-name buffer)))) + (kill-buffer org-last-indirect-buffer)) + (error "Abort")) + (set-window-configuration win-conf)))) (let ((org-agenda-buffer-name bufname-orig)) (org-remove-subtree-entries-from-agenda buffer dbeg dend)) (with-current-buffer buffer (delete-region dbeg dend)) @@ -8615,9 +8891,9 @@ It also looks at the text of the entry itself." ((and buffer lk) (mapcar (lambda(l) (with-current-buffer buffer - (setq trg (and (string-match org-bracket-link-regexp l) + (setq trg (and (string-match org-link-bracket-re l) (match-string 1 l))) - (if (or (not trg) (string-match org-any-link-re trg)) + (if (or (not trg) (string-match org-link-any-re trg)) (org-with-wide-buffer (goto-char marker) (when (search-forward l nil lkend) @@ -8631,11 +8907,11 @@ It also looks at the text of the entry itself." (goto-char (match-beginning 0)) (org-open-at-point))))) lk)) - ((or (org-in-regexp (concat "\\(" org-bracket-link-regexp "\\)")) + ((or (org-in-regexp (concat "\\(" org-link-bracket-re "\\)")) (save-excursion (beginning-of-line 1) - (looking-at (concat ".*?\\(" org-bracket-link-regexp "\\)")))) - (org-open-link-from-string (match-string 1))) + (looking-at (concat ".*?\\(" org-link-bracket-re "\\)")))) + (org-link-open-from-string (match-string 1))) (t (message "No link to open here"))))) (defun org-agenda-copy-local-variable (var) @@ -8653,8 +8929,8 @@ displayed Org file fills the frame." (interactive) (if (and org-return-follows-link (not (org-get-at-bol 'org-marker)) - (org-in-regexp org-bracket-link-regexp)) - (org-open-link-from-string (match-string 0)) + (org-in-regexp org-link-bracket-re)) + (org-link-open-from-string (match-string 0)) (let* ((marker (or (org-get-at-bol 'org-marker) (org-agenda-error))) (buffer (marker-buffer marker)) @@ -8738,7 +9014,7 @@ if it was hidden in the outline." (set-window-start (selected-window) (point-at-bol)) (cond ((= more 0) - (outline-hide-subtree) + (org-flag-subtree t) (save-excursion (org-back-to-heading) (run-hook-with-args 'org-cycle-hook 'folded)) @@ -8887,6 +9163,7 @@ the same tree node, and the headline of the tree node in the Org file." (hdmarker (org-get-at-bol 'org-hd-marker)) (todayp (org-agenda-today-p (org-get-at-bol 'day))) (inhibit-read-only t) + org-loop-over-headlines-in-active-region org-agenda-headline-snapshot-before-repeat newhead just-one) (org-with-remote-undo buffer (with-current-buffer buffer @@ -9878,9 +10155,9 @@ The prefix arg is passed through to the command if possible." ;; Prompt for the bulk command. (org-unlogged-message - (concat (if org-agenda-persistent-marks "Bulk (persistent): " "Bulk: ") + (concat "Bulk (" (if org-agenda-persistent-marks "" "don't ") "[p]ersist marks): " "[$]arch [A]rch->sib [t]odo [+/-]tag [s]chd [d]eadline [r]efile " - "[S]catter [f]unction [p]ersist-toggle " + "[S]catter [f]unction " (and org-agenda-bulk-custom-functions (format " Custom: [%s]" (mapconcat (lambda (f) (char-to-string (car f))) @@ -10218,12 +10495,12 @@ to override `appt-message-warning-time'." (append entries (apply 'org-agenda-get-day-entries file today scope))))) - ;; Map thru entries and find if we should filter them out + ;; Map through entries and find if we should filter them out (mapc (lambda (x) (let* ((evt (org-trim (replace-regexp-in-string - org-bracket-link-regexp "\\3" + org-link-bracket-re "\\2" (or (get-text-property 1 'txt x) "")))) (cat (get-text-property (1- (length x)) 'org-category x)) (tod (get-text-property 1 'time-of-day x)) diff --git a/elpa/org-20191028/org-archive.el b/elpa/org-20200127/org-archive.el similarity index 99% rename from elpa/org-20191028/org-archive.el rename to elpa/org-20200127/org-archive.el index 55c5681b..b33025be 100644 --- a/elpa/org-20191028/org-archive.el +++ b/elpa/org-20200127/org-archive.el @@ -1,6 +1,6 @@ ;;; org-archive.el --- Archiving for Org -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -450,7 +450,7 @@ Archiving time is retained in the ARCHIVE_TIME node property." (format-time-string (substring (cdr org-time-stamp-formats) 1 -1))) (outline-up-heading 1 t) - (outline-hide-subtree) + (org-flag-subtree t) (org-cycle-show-empty-lines 'folded) (when org-provide-todo-statistics ;; Update TODO statistics of parent. diff --git a/elpa/org-20200127/org-attach-git.el b/elpa/org-20200127/org-attach-git.el new file mode 100644 index 00000000..31945ff2 --- /dev/null +++ b/elpa/org-20200127/org-attach-git.el @@ -0,0 +1,119 @@ +;;; org-attach-git.el --- Automatic git commit extension to org-attach -*- lexical-binding: t; -*- + +;; Copyright (C) 2019-2020 Free Software Foundation, Inc. + +;; Original Author: John Wiegley +;; Restructurer: Gustav Wikström +;; Keywords: org data git + +;; This file is part of GNU Emacs. +;; +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; An extension to org-attach. If `org-attach-id-dir' is initialized +;; as a Git repository, then org-attach-git will automatically commit +;; changes when it sees them. Requires git-annex. + +;;; Code: + +(require 'org-attach) +(require 'vc-git) + +(defcustom org-attach-git-annex-cutoff (* 32 1024) + "If non-nil, files larger than this will be annexed instead of stored." + :group 'org-attach + :version "24.4" + :package-version '(Org . "8.0") + :type '(choice + (const :tag "None" nil) + (integer :tag "Bytes"))) + +(defcustom org-attach-git-annex-auto-get 'ask + "Confirmation preference for automatically getting annex files. +If \\='ask, prompt using `y-or-n-p'. If t, always get. If nil, never get." + :group 'org-attach + :package-version '(Org . "9.0") + :version "26.1" + :type '(choice + (const :tag "confirm with `y-or-n-p'" ask) + (const :tag "always get from annex if necessary" t) + (const :tag "never get from annex" nil))) + +(defun org-attach-git-use-annex () + "Return non-nil if git annex can be used." + (let ((git-dir (vc-git-root (expand-file-name org-attach-id-dir)))) + (and org-attach-git-annex-cutoff + (or (file-exists-p (expand-file-name "annex" git-dir)) + (file-exists-p (expand-file-name ".git/annex" git-dir)))))) + +(defun org-attach-git-annex-get-maybe (path) + "Call git annex get PATH (via shell) if using git annex. +Signals an error if the file content is not available and it was not retrieved." + (let* ((default-directory (expand-file-name org-attach-id-dir)) + (path-relative (file-relative-name path))) + (when (and (org-attach-git-use-annex) + (not + (string-equal + "found" + (shell-command-to-string + (format "git annex find --format=found --in=here %s" + (shell-quote-argument path-relative)))))) + (let ((should-get + (if (eq org-attach-git-annex-auto-get 'ask) + (y-or-n-p (format "Run git annex get %s? " path-relative)) + org-attach-git-annex-auto-get))) + (unless should-get + (error "File %s stored in git annex but unavailable" path)) + (message "Running git annex get \"%s\"." path-relative) + (call-process "git" nil nil nil "annex" "get" path-relative))))) + +(defun org-attach-git-commit (&optional _) + "Commit changes to git if `org-attach-id-dir' is properly initialized. +This checks for the existence of a \".git\" directory in that directory. + +Takes an unused optional argument for the sake of being compatible +with hook `org-attach-after-change-hook'." + (let* ((dir (expand-file-name org-attach-id-dir)) + (git-dir (vc-git-root dir)) + (use-annex (org-attach-git-use-annex)) + (changes 0)) + (when (and git-dir (executable-find "git")) + (with-temp-buffer + (cd dir) + (dolist (new-or-modified + (split-string + (shell-command-to-string + "git ls-files -zmo --exclude-standard") "\0" t)) + (if (and use-annex + (>= (file-attribute-size (file-attributes new-or-modified)) + org-attach-git-annex-cutoff)) + (call-process "git" nil nil nil "annex" "add" new-or-modified) + (call-process "git" nil nil nil "add" new-or-modified)) + (cl-incf changes)) + (dolist (deleted + (split-string + (shell-command-to-string "git ls-files -z --deleted") "\0" t)) + (call-process "git" nil nil nil "rm" deleted) + (cl-incf changes)) + (when (> changes 0) + (shell-command "git commit -m 'Synchronized attachments'")))))) + +(add-hook 'org-attach-after-change-hook 'org-attach-git-commit) +(add-hook 'org-attach-open-hook 'org-attach-git-annex-get-maybe) + +(provide 'org-attach-git) + +;;; org-attach-git.el ends here diff --git a/elpa/org-20200127/org-attach.el b/elpa/org-20200127/org-attach.el new file mode 100644 index 00000000..ce1bf9bb --- /dev/null +++ b/elpa/org-20200127/org-attach.el @@ -0,0 +1,768 @@ +;;; org-attach.el --- Manage file attachments to Org outlines -*- lexical-binding: t; -*- + +;; Copyright (C) 2008-2020 Free Software Foundation, Inc. + +;; Author: John Wiegley +;; Maintainer: Bastien Guerry +;; Keywords: org data attachment +;; This file is part of GNU Emacs. +;; +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; See the Org manual for information on how to use it. +;; +;; Attachments are managed either by using a custom property DIR or by +;; using property ID from org-id. When DIR is defined, a location in +;; the filesystem is directly attached to the outline node. When +;; org-id is used, attachments are stored in a folder named after the +;; ID, in a location defined by `org-attach-id-dir'. DIR has +;; precedence over ID when both parameters are defined for the current +;; outline node (also when inherited parameters are taken into +;; account). + +;;; Code: + +(require 'cl-lib) +(require 'org) +(require 'ol) +(require 'org-id) + +(declare-function dired-dwim-target-directory "dired-aux") + +(defgroup org-attach nil + "Options concerning attachments in Org mode." + :tag "Org Attach" + :group 'org) + +(defcustom org-attach-id-dir "data/" + "The directory where attachments are stored. +If this is a relative path, it will be interpreted relative to the directory +where the Org file lives." + :group 'org-attach + :type 'directory + :safe #'stringp) + +(defcustom org-attach-dir-relative nil + "Non-nil means directories in DIR property are added as relative links. +Defaults to absolute location." + :group 'org-attach + :type 'boolean + :package-version '(Org . "9.3") + :safe #'booleanp) + +(defcustom org-attach-auto-tag "ATTACH" + "Tag that will be triggered automatically when an entry has an attachment." + :group 'org-attach + :type '(choice + (const :tag "None" nil) + (string :tag "Tag"))) + +(defcustom org-attach-preferred-new-method 'id + "Preferred way to attach to nodes without existing ID and DIR property. +This choice is used when adding attachments to nodes without ID +and DIR properties. + +Allowed values are: + +id Create and use an ID parameter +dir Create and use a DIR parameter +ask Ask the user for input of which method to choose +nil Prefer to not create a new parameter + + nil means that ID or DIR has to be created explicitly + before attaching files." + :group 'org-attach + :package-version '(org . "9.3") + :type '(choice + (const :tag "ID parameter" id) + (const :tag "DIR parameter" dir) + (const :tag "Ask user" ask) + (const :tag "Don't create" nil))) + +(defcustom org-attach-method 'cp + "The preferred method to attach a file. +Allowed values are: + +mv rename the file to move it into the attachment directory +cp copy the file +ln create a hard link. Note that this is not supported + on all systems, and then the result is not defined. +lns create a symbol link. Note that this is not supported + on all systems, and then the result is not defined." + :group 'org-attach + :type '(choice + (const :tag "Copy" cp) + (const :tag "Move/Rename" mv) + (const :tag "Hard Link" ln) + (const :tag "Symbol Link" lns))) + +(defcustom org-attach-expert nil + "Non-nil means do not show the splash buffer with the attach dispatcher." + :group 'org-attach + :type 'boolean) + +(defcustom org-attach-use-inheritance 'selective + "Attachment inheritance for the outline. + +Enabling inheritance for org-attach implies two things. First, +that attachment links will look through all parent headings until +it finds the linked attachment. Second, that running org-attach +inside a node without attachments will make org-attach operate on +the first parent heading it finds with an attachment. + +Selective means to respect the inheritance setting in +`org-use-property-inheritance'." + :group 'org-attach + :type '(choice + (const :tag "Don't use inheritance" nil) + (const :tag "Inherit parent node attachments" t) + (const :tag "Respect org-use-property-inheritance" selective)) + :type 'boolean) + +(defcustom org-attach-store-link-p nil + "Non-nil means store a link to a file when attaching it." + :group 'org-attach + :version "24.1" + :type '(choice + (const :tag "Don't store link" nil) + (const :tag "Link to origin location" t) + (const :tag "Link to the attach-dir location" attached))) + +(defcustom org-attach-archive-delete nil + "Non-nil means attachments are deleted upon archiving a subtree. +When set to `query', ask the user instead." + :group 'org-attach + :version "26.1" + :package-version '(Org . "8.3") + :type '(choice + (const :tag "Never delete attachments" nil) + (const :tag "Always delete attachments" t) + (const :tag "Query the user" query))) + +(defun org-attach-id-uuid-folder-format (id) + "Translate an UUID ID into a folder-path. +Default format for how Org translates ID properties to a path for +attachments. Useful if ID is generated with UUID." + (format "%s/%s" + (substring id 0 2) + (substring id 2))) + +(defun org-attach-id-ts-folder-format (id) + "Translate an ID based on a timestamp to a folder-path. +Useful way of translation if ID is generated based on ISO8601 +timestamp. Splits the attachment folder hierarchy into +year-month, the rest." + (format "%s/%s" + (substring id 0 6) + (substring id 6))) + +(defcustom org-attach-id-to-path-function-list '(org-attach-id-uuid-folder-format + org-attach-id-ts-folder-format) + "List of functions parsing an ID string into a folder-path. +The first function in this list defines the preferred function +which will be used when creating new attachment folders. All +functions of this list will be tried when looking for existing +attachment folders based on ID." + :group 'org-attach + :package-version '(Org . "9.3") + :type '(repeat (function :tag "Function with ID as input"))) + +(defvar org-attach-after-change-hook nil + "Hook to be called when files have been added or removed to the attachment folder.") + +(defvar org-attach-open-hook nil + "Hook that is invoked by `org-attach-open'. + +Created mostly to be compatible with org-attach-git after removing +git-functionality from this file.") + +(defcustom org-attach-commands + '(((?a ?\C-a) org-attach-attach + "Select a file and attach it to the task, using `org-attach-method'.") + ((?c ?\C-c) org-attach-attach-cp + "Attach a file using copy method.") + ((?m ?\C-m) org-attach-attach-mv + "Attach a file using move method.") + ((?l ?\C-l) org-attach-attach-ln + "Attach a file using link method.") + ((?y ?\C-y) org-attach-attach-lns + "Attach a file using symbolic-link method.") + ((?u ?\C-u) org-attach-url + "Attach a file from URL (downloading it).") + ((?b) org-attach-buffer + "Select a buffer and attach its contents to the task.") + ((?n ?\C-n) org-attach-new + "Create a new attachment, as an Emacs buffer.") + ((?z ?\C-z) org-attach-sync + "Synchronize the current node with its attachment\n directory, in case \ +you added attachments yourself.\n") + ((?o ?\C-o) org-attach-open + "Open current node's attachments.") + ((?O) org-attach-open-in-emacs + "Like \"o\", but force opening in Emacs.") + ((?f ?\C-f) org-attach-reveal + "Open current node's attachment directory. Create if missing.") + ((?F) org-attach-reveal-in-emacs + "Like \"f\", but force using Dired in Emacs.\n") + ((?d ?\C-d) org-attach-delete-one + "Delete one attachment, you will be prompted for a file name.") + ((?D) org-attach-delete-all + "Delete all of a node's attachments. A safer way is\n to open the \ +directory in dired and delete from there.\n") + ((?s ?\C-s) org-attach-set-directory + "Set a specific attachment directory for this entry. Sets DIR property.") + ((?S ?\C-S) org-attach-unset-directory + "Unset the attachment directory for this entry. Removes DIR property.") + ((?q) (lambda () (interactive) (message "Abort")) "Abort.")) + "The list of commands for the attachment dispatcher. +Each entry in this list is a list of three elements: +- A list of keys (characters) to select the command (the fist + character in the list is shown in the attachment dispatcher's + splash buffer and minibuffer prompt). +- A command that is called interactively when one of these keys + is pressed. +- A docstring for this command in the attachment dispatcher's + splash buffer." + :group 'org-attach + :package-version '(Org . "9.3") + :type '(repeat (list (repeat :tag "Keys" character) + (function :tag "Command") + (string :tag "Docstring")))) + +;;;###autoload +(defun org-attach () + "The dispatcher for attachment commands. +Shows a list of commands and prompts for another key to execute a command." + (interactive) + (let ((dir (org-attach-dir nil 'no-fs-check)) + c marker) + (when (eq major-mode 'org-agenda-mode) + (setq marker (or (get-text-property (point) 'org-hd-marker) + (get-text-property (point) 'org-marker))) + (unless marker + (error "No item in current line"))) + (save-excursion + (when marker + (set-buffer (marker-buffer marker)) + (goto-char marker)) + (org-back-to-heading t) + (save-excursion + (save-window-excursion + (unless org-attach-expert + (with-output-to-temp-buffer "*Org Attach*" + (princ + (concat "Attachment folder:\n" + (or dir + "Can't find an existing attachment-folder") + (unless (and dir (file-directory-p dir)) + "\n(Not yet created)") + "\n\n" + (format "Select an Attachment Command:\n\n%s" + (mapconcat + (lambda (entry) + (pcase entry + (`((,key . ,_) ,_ ,docstring) + (format "%c %s" + key + (replace-regexp-in-string "\n\\([\t ]*\\)" + " " + docstring + nil nil 1))) + (_ + (user-error + "Invalid `org-attach-commands' item: %S" + entry)))) + org-attach-commands + "\n")))))) + (org-fit-window-to-buffer (get-buffer-window "*Org Attach*")) + (message "Select command: [%s]" + (concat (mapcar #'caar org-attach-commands))) + (setq c (read-char-exclusive)) + (and (get-buffer "*Org Attach*") (kill-buffer "*Org Attach*")))) + (let ((command (cl-some (lambda (entry) + (and (memq c (nth 0 entry)) (nth 1 entry))) + org-attach-commands))) + (if (commandp command t) + (call-interactively command) + (error "No such attachment command: %c" c)))))) + +(defun org-attach-dir (&optional create-if-not-exists-p no-fs-check) + "Return the directory associated with the current outline node. +First check for DIR property, then ID property. +`org-attach-use-inheritance' determines whether inherited +properties also will be considered. + +If an ID property is found the default mechanism using that ID +will be invoked to access the directory for the current entry. +Note that this method returns the directory as declared by ID or +DIR even if the directory doesn't exist in the filesystem. + +If CREATE-IF-NOT-EXIST-P is non-nil, `org-attach-dir-get-create' +is run. If NO-FS-CHECK is non-nil, the function returns the path +to the attachment even if it has not yet been initialized in the +filesystem. + +If no attachment directory can be derived, return nil." + (let (attach-dir id) + (cond + (create-if-not-exists-p + (setq attach-dir (org-attach-dir-get-create))) + ((setq attach-dir (org-entry-get nil "DIR" org-attach-use-inheritance)) + (org-attach-check-absolute-path attach-dir)) + ;; Deprecated and removed from documentation, but still + ;; works. FIXME: Remove after major nr change. + ((setq attach-dir (org-entry-get nil "ATTACH_DIR" org-attach-use-inheritance)) + (org-attach-check-absolute-path attach-dir)) + ((setq id (org-entry-get nil "ID" org-attach-use-inheritance)) + (org-attach-check-absolute-path nil) + (setq attach-dir (org-attach-dir-from-id id 'try-all)))) + (if no-fs-check + attach-dir + (when (and attach-dir (file-directory-p attach-dir)) + attach-dir)))) + +(defun org-attach-dir-get-create () + "Return existing or new directory associated with the current outline node. +`org-attach-preferred-new-method' decides how to attach new +directory if neither ID nor DIR property exist. + +If the attachment by some reason cannot be created an error will be raised." + (interactive) + (let ((attach-dir (org-attach-dir nil 'no-fs-check))) + (unless attach-dir + (let (answer) + (when (eq org-attach-preferred-new-method 'ask) + (message "Create new ID [1] property or DIR [2] property for attachments?") + (setq answer (read-char-exclusive))) + (cond + ((or (eq org-attach-preferred-new-method 'id) (eq answer ?1)) + (setq attach-dir (org-attach-dir-from-id (org-id-get nil t)))) + ((or (eq org-attach-preferred-new-method 'dir) (eq answer ?2)) + (setq attach-dir (org-attach-set-directory))) + ((eq org-attach-preferred-new-method 'nil) + (error "No existing directory. DIR or ID property has to be explicitly created"))))) + (unless attach-dir + (error "No attachment directory is associated with the current node")) + (unless (file-directory-p attach-dir) + (make-directory attach-dir t)) + attach-dir)) + +(defun org-attach-dir-from-id (id &optional try-all) + "Returns a folder path based on `org-attach-id-dir' and ID. +If TRY-ALL is non-nil, try all id-to-path functions in +`org-attach-id-to-path-function-list' and return the first path +that exist in the filesystem, or the first one if none exist. +Otherwise only use the first function in that list." + (let ((attach-dir-preferred (expand-file-name + (funcall (car org-attach-id-to-path-function-list) id) + (expand-file-name org-attach-id-dir)))) + (if try-all + (let ((attach-dir attach-dir-preferred) + (fun-list (cdr org-attach-id-to-path-function-list))) + (while (and fun-list (not (file-directory-p attach-dir))) + (setq attach-dir (expand-file-name + (funcall (car fun-list) id) + (expand-file-name org-attach-id-dir))) + (setq fun-list (cdr fun-list))) + (if (file-directory-p attach-dir) + attach-dir + attach-dir-preferred)) + attach-dir-preferred))) + +(defun org-attach-check-absolute-path (dir) + "Check if we have enough information to root the attachment directory. +When DIR is given, check also if it is already absolute. Otherwise, +assume that it will be relative, and check if `org-attach-id-dir' is +absolute, or if at least the current buffer has a file name. +Throw an error if we cannot root the directory." + (or (and dir (file-name-absolute-p dir)) + (file-name-absolute-p org-attach-id-dir) + (buffer-file-name (buffer-base-buffer)) + (error "Need absolute `org-attach-id-dir' to attach in buffers without filename"))) + +(defun org-attach-set-directory () + "Set the DIR node property and ask to move files there. +The property defines the directory that is used for attachments +of the entry. Creates relative links if `org-attach-dir-relative' +is non-nil. + +Return the directory." + (interactive) + (let ((old (org-attach-dir)) + (new + (let* ((attach-dir (read-directory-name + "Attachment directory: " + (org-entry-get nil "DIR"))) + (current-dir (file-name-directory (or default-directory + buffer-file-name))) + (attach-dir-relative (file-relative-name attach-dir current-dir))) + (org-entry-put nil "DIR" (if org-attach-dir-relative + attach-dir-relative + attach-dir)) + attach-dir))) + (unless (or (string= old new) + (not old)) + (when (yes-or-no-p "Copy over attachments from old directory? ") + (copy-directory old new t t t)) + (when (yes-or-no-p (concat "Delete " old)) + (delete-directory old t))) + new)) + +(defun org-attach-unset-directory () + "Removes DIR node property. +If attachment folder is changed due to removal of DIR-property +ask to move attachments to new location and ask to delete old +attachment-folder. + +Change of attachment-folder due to unset might be if an ID +property is set on the node, or if a separate inherited +DIR-property exists (that is different than the unset one)." + (interactive) + (let ((old (org-attach-dir)) + (new + (progn + (org-entry-delete nil "DIR") + ;; ATTACH-DIR is deprecated and removed from documentation, + ;; but still works. Remove code for it after major nr change. + (org-entry-delete nil "ATTACH_DIR") + (org-attach-dir)))) + (unless (or (string= old new) + (not old)) + (when (and new (yes-or-no-p "Copy over attachments from old directory? ")) + (copy-directory old new t nil t)) + (when (yes-or-no-p (concat "Delete " old)) + (delete-directory old t))))) + +(defun org-attach-tag (&optional off) + "Turn the autotag on or (if OFF is set) off." + (when org-attach-auto-tag + (save-excursion + (org-back-to-heading t) + (org-toggle-tag org-attach-auto-tag (if off 'off 'on))))) + +(defun org-attach-untag () + "Turn the autotag off." + (org-attach-tag 'off)) + +(defun org-attach-store-link (file) + "Add a link to `org-stored-link' when attaching a file. +Only do this when `org-attach-store-link-p' is non-nil." + (setq org-stored-links + (cons (list (org-attach-expand-link file) + (file-name-nondirectory file)) + org-stored-links))) + +(defun org-attach-url (url) + (interactive "MURL of the file to attach: \n") + (let ((org-attach-method 'url)) + (org-attach-attach url))) + +(defun org-attach-buffer (buffer-name) + "Attach BUFFER-NAME's contents to current outline node. +BUFFER-NAME is a string. Signals a `file-already-exists' error +if it would overwrite an existing filename." + (interactive "bBuffer whose contents should be attached: ") + (let* ((attach-dir (org-attach-dir 'get-create)) + (output (expand-file-name buffer-name attach-dir))) + (when (file-exists-p output) + (signal 'file-already-exists (list "File exists" output))) + (run-hook-with-args 'org-attach-after-change-hook attach-dir) + (org-attach-tag) + (with-temp-file output + (insert-buffer-substring buffer-name)))) + +(defun org-attach-attach (file &optional visit-dir method) + "Move/copy/link FILE into the attachment directory of the current outline node. +If VISIT-DIR is non-nil, visit the directory with dired. +METHOD may be `cp', `mv', `ln', `lns' or `url' default taken from +`org-attach-method'." + (interactive + (list + (read-file-name "File to keep as an attachment: " + (or (progn + (require 'dired-aux) + (dired-dwim-target-directory)) + default-directory)) + current-prefix-arg + nil)) + (setq method (or method org-attach-method)) + (let ((basename (file-name-nondirectory file))) + (let* ((attach-dir (org-attach-dir 'get-create)) + (fname (expand-file-name basename attach-dir))) + (cond + ((eq method 'mv) (rename-file file fname)) + ((eq method 'cp) (copy-file file fname)) + ((eq method 'ln) (add-name-to-file file fname)) + ((eq method 'lns) (make-symbolic-link file fname)) + ((eq method 'url) (url-copy-file file fname))) + (run-hook-with-args 'org-attach-after-change-hook attach-dir) + (org-attach-tag) + (cond ((eq org-attach-store-link-p 'attached) + (org-attach-store-link fname)) + ((eq org-attach-store-link-p t) + (org-attach-store-link file))) + (if visit-dir + (dired attach-dir) + (message "File %S is now an attachment" basename))))) + +(defun org-attach-attach-cp () + "Attach a file by copying it." + (interactive) + (let ((org-attach-method 'cp)) (call-interactively 'org-attach-attach))) +(defun org-attach-attach-mv () + "Attach a file by moving (renaming) it." + (interactive) + (let ((org-attach-method 'mv)) (call-interactively 'org-attach-attach))) +(defun org-attach-attach-ln () + "Attach a file by creating a hard link to it. +Beware that this does not work on systems that do not support hard links. +On some systems, this apparently does copy the file instead." + (interactive) + (let ((org-attach-method 'ln)) (call-interactively 'org-attach-attach))) +(defun org-attach-attach-lns () + "Attach a file by creating a symbolic link to it. + +Beware that this does not work on systems that do not support symbolic links. +On some systems, this apparently does copy the file instead." + (interactive) + (let ((org-attach-method 'lns)) (call-interactively 'org-attach-attach))) + +(defun org-attach-new (file) + "Create a new attachment FILE for the current outline node. +The attachment is created as an Emacs buffer." + (interactive "sCreate attachment named: ") + (let ((attach-dir (org-attach-dir 'get-create))) + (org-attach-tag) + (find-file (expand-file-name file attach-dir)) + (message "New attachment %s" file))) + +(defun org-attach-delete-one (&optional file) + "Delete a single attachment." + (interactive) + (let* ((attach-dir (org-attach-dir)) + (files (org-attach-file-list attach-dir)) + (file (or file + (completing-read + "Delete attachment: " + (mapcar (lambda (f) + (list (file-name-nondirectory f))) + files))))) + (setq file (expand-file-name file attach-dir)) + (unless (file-exists-p file) + (error "No such attachment: %s" file)) + (delete-file file) + (run-hook-with-args 'org-attach-after-change-hook attach-dir))) + +(defun org-attach-delete-all (&optional force) + "Delete all attachments from the current outline node. +This actually deletes the entire attachment directory. +A safer way is to open the directory in dired and delete from there." + (interactive "P") + (let ((attach-dir (org-attach-dir))) + (when (and attach-dir + (or force + (yes-or-no-p "Really remove all attachments of this entry? "))) + (delete-directory attach-dir (yes-or-no-p "Recursive?") t) + (message "Attachment directory removed") + (run-hook-with-args 'org-attach-after-change-hook attach-dir) + (org-attach-untag)))) + +(defun org-attach-sync () + "Synchronize the current outline node with its attachments. +This can be used after files have been added externally." + (interactive) + (let ((attach-dir (org-attach-dir))) + (when attach-dir + (run-hook-with-args 'org-attach-after-change-hook attach-dir) + (let ((files (org-attach-file-list attach-dir))) + (org-attach-tag (not files)))) + (unless attach-dir (org-attach-tag t)))) + +(defun org-attach-file-list (dir) + "Return a list of files in the attachment directory. +This ignores files ending in \"~\"." + (delq nil + (mapcar (lambda (x) (if (string-match "^\\.\\.?\\'" x) nil x)) + (directory-files dir nil "[^~]\\'")))) + +(defun org-attach-reveal () + "Show the attachment directory of the current outline node. +This will attempt to use an external program to show the +directory. Will create an attachment and folder if it doesn't +exist yet. Respects `org-attach-preferred-new-method'." + (interactive) + (org-open-file (org-attach-dir-get-create))) + +(defun org-attach-reveal-in-emacs () + "Show the attachment directory of the current outline node in dired. +Will create an attachment and folder if it doesn't exist yet. +Respects `org-attach-preferred-new-method'." + (interactive) + (dired (org-attach-dir-get-create))) + +(defun org-attach-open (&optional in-emacs) + "Open an attachment of the current outline node. +If there are more than one attachment, you will be prompted for the file name. +This command will open the file using the settings in `org-file-apps' +and in the system-specific variants of this variable. +If IN-EMACS is non-nil, force opening in Emacs." + (interactive "P") + (let ((attach-dir (org-attach-dir))) + (if attach-dir + (let* ((file (pcase (org-attach-file-list attach-dir) + (`(,file) file) + (files (completing-read "Open attachment: " + (mapcar #'list files) nil t)))) + (path (expand-file-name file attach-dir))) + (run-hook-with-args 'org-attach-open-hook path) + (org-open-file path in-emacs)) + (error "No attachment directory exist")))) + +(defun org-attach-open-in-emacs () + "Open attachment, force opening in Emacs. +See `org-attach-open'." + (interactive) + (org-attach-open 'in-emacs)) + +(defun org-attach-expand (file) + "Return the full path to the current entry's attachment file FILE. +Basically, this adds the path to the attachment directory." + (expand-file-name file (org-attach-dir))) + +(defun org-attach-expand-link (file) + "Return a file link pointing to the current entry's attachment file FILE. +Basically, this adds the path to the attachment directory, and a \"file:\" +prefix." + (concat "file:" (org-attach-expand file))) + +(org-link-set-parameters "attachment" + :follow #'org-attach-open-link + :export #'org-attach-export-link + :complete #'org-attach-complete-link) + +(defun org-attach-open-link (link &optional in-emacs) + "Attachment link type LINK is expanded with the attached directory and opened. + +With optional prefix argument IN-EMACS, Emacs will visit the file. +With a double \\[universal-argument] \\[universal-argument] \ +prefix arg, Org tries to avoid opening in Emacs +and to use an external application to visit the file." + (interactive "P") + (let (line search) + (cond + ((string-match "::\\([0-9]+\\)\\'" link) + (setq line (string-to-number (match-string 1 link)) + link (substring link 0 (match-beginning 0)))) + ((string-match "::\\(.+\\)\\'" link) + (setq search (match-string 1 link) + link (substring link 0 (match-beginning 0))))) + (if (string-match "[*?{]" (file-name-nondirectory link)) + (dired (org-attach-expand link)) + (org-open-file (org-attach-expand link) in-emacs line search)))) + +(defun org-attach-complete-link () + "Advise the user with the available files in the attachment directory." + (let ((attach-dir (org-attach-dir))) + (if attach-dir + (let* ((attached-dir (expand-file-name attach-dir)) + (file (read-file-name "File: " attached-dir)) + (pwd (file-name-as-directory attached-dir)) + (pwd-relative (file-name-as-directory + (abbreviate-file-name attached-dir)))) + (cond + ((string-match (concat "^" (regexp-quote pwd-relative) "\\(.+\\)") file) + (concat "attachment:" (match-string 1 file))) + ((string-match (concat "^" (regexp-quote pwd) "\\(.+\\)") + (expand-file-name file)) + (concat "attachment:" (match-string 1 (expand-file-name file)))) + (t (concat "attachment:" file)))) + (error "No attachment directory exist")))) + +(defun org-attach-export-link (link description format) + "Translate attachment LINK from Org mode format to exported FORMAT. +Also includes the DESCRIPTION of the link in the export." + (save-excursion + (let (path desc) + (cond + ((string-match "::\\([0-9]+\\)\\'" link) + (setq link (substring link 0 (match-beginning 0)))) + ((string-match "::\\(.+\\)\\'" link) + (setq link (substring link 0 (match-beginning 0))))) + (setq path (file-relative-name (org-attach-expand link)) + desc (or description link)) + (pcase format + (`html (format "%s" path desc)) + (`latex (format "\\href{%s}{%s}" path desc)) + (`texinfo (format "@uref{%s,%s}" path desc)) + (`ascii (format "%s (%s)" desc path)) + (`md (format "[%s](%s)" desc path)) + (_ path))))) + +(defun org-attach-archive-delete-maybe () + "Maybe delete subtree attachments when archiving. +This function is called by `org-archive-hook'. The option +`org-attach-archive-delete' controls its behavior." + (when org-attach-archive-delete + (org-attach-delete-all (not (eq org-attach-archive-delete 'query))))) + + +;; Attach from dired. + +;; Add the following lines to the config file to get a binding for +;; dired-mode. + +;; (add-hook +;; 'dired-mode-hook +;; (lambda () +;; (define-key dired-mode-map (kbd "C-c C-x a") #'org-attach-dired-to-subtree)))) + +;;;###autoload +(defun org-attach-dired-to-subtree (files) + "Attach FILES marked or current file in dired to subtree in other window. +Takes the method given in `org-attach-method' for the attach action. +Precondition: Point must be in a dired buffer. +Idea taken from `gnus-dired-attach'." + (interactive + (list (dired-get-marked-files))) + (unless (eq major-mode 'dired-mode) + (user-error "This command must be triggered in a dired buffer")) + (let ((start-win (selected-window)) + (other-win + (get-window-with-predicate + (lambda (window) + (with-current-buffer (window-buffer window) + (eq major-mode 'org-mode)))))) + (unless other-win + (user-error + "Can't attach to subtree. No window displaying an Org buffer")) + (select-window other-win) + (dolist (file files) + (org-attach-attach file)) + (select-window start-win) + (when (eq 'mv org-attach-method) + (revert-buffer)))) + + + +(add-hook 'org-archive-hook 'org-attach-archive-delete-maybe) + +(provide 'org-attach) + +;; Local variables: +;; generated-autoload-file: "org-loaddefs.el" +;; End: + +;;; org-attach.el ends here diff --git a/elpa/org-20200127/org-autoloads.el b/elpa/org-20200127/org-autoloads.el new file mode 100644 index 00000000..469edef5 --- /dev/null +++ b/elpa/org-20200127/org-autoloads.el @@ -0,0 +1,1657 @@ +;;; org-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "ob-C" "ob-C.el" (0 0 0 0)) +;;; Generated autoloads from ob-C.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-C" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-J" "ob-J.el" (0 0 0 0)) +;;; Generated autoloads from ob-J.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-J" '("obj-" "org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-R" "ob-R.el" (0 0 0 0)) +;;; Generated autoloads from ob-R.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-R" '("ob-R-" "org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-abc" "ob-abc.el" (0 0 0 0)) +;;; Generated autoloads from ob-abc.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-abc" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-asymptote" "ob-asymptote.el" (0 0 0 0)) +;;; Generated autoloads from ob-asymptote.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-asymptote" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-awk" "ob-awk.el" (0 0 0 0)) +;;; Generated autoloads from ob-awk.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-awk" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-calc" "ob-calc.el" (0 0 0 0)) +;;; Generated autoloads from ob-calc.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-calc" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-clojure" "ob-clojure.el" (0 0 0 0)) +;;; Generated autoloads from ob-clojure.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-clojure" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-comint" "ob-comint.el" (0 0 0 0)) +;;; Generated autoloads from ob-comint.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-comint" '("org-babel-comint-"))) + +;;;*** + +;;;### (autoloads nil "ob-coq" "ob-coq.el" (0 0 0 0)) +;;; Generated autoloads from ob-coq.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-coq" '("org-babel-" "coq-program-name"))) + +;;;*** + +;;;### (autoloads nil "ob-css" "ob-css.el" (0 0 0 0)) +;;; Generated autoloads from ob-css.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-css" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-ditaa" "ob-ditaa.el" (0 0 0 0)) +;;; Generated autoloads from ob-ditaa.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-ditaa" '("org-"))) + +;;;*** + +;;;### (autoloads nil "ob-dot" "ob-dot.el" (0 0 0 0)) +;;; Generated autoloads from ob-dot.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-dot" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-ebnf" "ob-ebnf.el" (0 0 0 0)) +;;; Generated autoloads from ob-ebnf.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-ebnf" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-emacs-lisp" "ob-emacs-lisp.el" (0 0 0 0)) +;;; Generated autoloads from ob-emacs-lisp.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-emacs-lisp" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-eshell" "ob-eshell.el" (0 0 0 0)) +;;; Generated autoloads from ob-eshell.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-eshell" '("ob-eshell-session-live-p" "org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-eval" "ob-eval.el" (0 0 0 0)) +;;; Generated autoloads from ob-eval.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-eval" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-exp" "ob-exp.el" (0 0 0 0)) +;;; Generated autoloads from ob-exp.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-exp" '("org-"))) + +;;;*** + +;;;### (autoloads nil "ob-forth" "ob-forth.el" (0 0 0 0)) +;;; Generated autoloads from ob-forth.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-forth" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-fortran" "ob-fortran.el" (0 0 0 0)) +;;; Generated autoloads from ob-fortran.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-fortran" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-gnuplot" "ob-gnuplot.el" (0 0 0 0)) +;;; Generated autoloads from ob-gnuplot.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-gnuplot" '("org-babel-" "*org-babel-gnuplot-"))) + +;;;*** + +;;;### (autoloads nil "ob-groovy" "ob-groovy.el" (0 0 0 0)) +;;; Generated autoloads from ob-groovy.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-groovy" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-haskell" "ob-haskell.el" (0 0 0 0)) +;;; Generated autoloads from ob-haskell.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-haskell" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-hledger" "ob-hledger.el" (0 0 0 0)) +;;; Generated autoloads from ob-hledger.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-hledger" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-io" "ob-io.el" (0 0 0 0)) +;;; Generated autoloads from ob-io.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-io" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-java" "ob-java.el" (0 0 0 0)) +;;; Generated autoloads from ob-java.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-java" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-js" "ob-js.el" (0 0 0 0)) +;;; Generated autoloads from ob-js.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-js" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-latex" "ob-latex.el" (0 0 0 0)) +;;; Generated autoloads from ob-latex.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-latex" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-ledger" "ob-ledger.el" (0 0 0 0)) +;;; Generated autoloads from ob-ledger.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-ledger" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-lilypond" "ob-lilypond.el" (0 0 0 0)) +;;; Generated autoloads from ob-lilypond.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-lilypond" '("org-babel-" "lilypond-mode"))) + +;;;*** + +;;;### (autoloads nil "ob-lisp" "ob-lisp.el" (0 0 0 0)) +;;; Generated autoloads from ob-lisp.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-lisp" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-lua" "ob-lua.el" (0 0 0 0)) +;;; Generated autoloads from ob-lua.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-lua" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-makefile" "ob-makefile.el" (0 0 0 0)) +;;; Generated autoloads from ob-makefile.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-makefile" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-maxima" "ob-maxima.el" (0 0 0 0)) +;;; Generated autoloads from ob-maxima.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-maxima" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-mscgen" "ob-mscgen.el" (0 0 0 0)) +;;; Generated autoloads from ob-mscgen.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-mscgen" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-ocaml" "ob-ocaml.el" (0 0 0 0)) +;;; Generated autoloads from ob-ocaml.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-ocaml" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-octave" "ob-octave.el" (0 0 0 0)) +;;; Generated autoloads from ob-octave.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-octave" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-org" "ob-org.el" (0 0 0 0)) +;;; Generated autoloads from ob-org.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-org" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-perl" "ob-perl.el" (0 0 0 0)) +;;; Generated autoloads from ob-perl.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-perl" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-picolisp" "ob-picolisp.el" (0 0 0 0)) +;;; Generated autoloads from ob-picolisp.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-picolisp" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-plantuml" "ob-plantuml.el" (0 0 0 0)) +;;; Generated autoloads from ob-plantuml.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-plantuml" '("org-"))) + +;;;*** + +;;;### (autoloads nil "ob-processing" "ob-processing.el" (0 0 0 0)) +;;; Generated autoloads from ob-processing.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-processing" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-python" "ob-python.el" (0 0 0 0)) +;;; Generated autoloads from ob-python.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-python" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-ref" "ob-ref.el" (0 0 0 0)) +;;; Generated autoloads from ob-ref.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-ref" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-ruby" "ob-ruby.el" (0 0 0 0)) +;;; Generated autoloads from ob-ruby.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-ruby" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-sass" "ob-sass.el" (0 0 0 0)) +;;; Generated autoloads from ob-sass.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-sass" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-scheme" "ob-scheme.el" (0 0 0 0)) +;;; Generated autoloads from ob-scheme.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-scheme" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-screen" "ob-screen.el" (0 0 0 0)) +;;; Generated autoloads from ob-screen.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-screen" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-sed" "ob-sed.el" (0 0 0 0)) +;;; Generated autoloads from ob-sed.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-sed" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-shell" "ob-shell.el" (0 0 0 0)) +;;; Generated autoloads from ob-shell.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-shell" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-shen" "ob-shen.el" (0 0 0 0)) +;;; Generated autoloads from ob-shen.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-shen" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-sql" "ob-sql.el" (0 0 0 0)) +;;; Generated autoloads from ob-sql.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-sql" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-sqlite" "ob-sqlite.el" (0 0 0 0)) +;;; Generated autoloads from ob-sqlite.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-sqlite" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-stan" "ob-stan.el" (0 0 0 0)) +;;; Generated autoloads from ob-stan.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-stan" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ob-table" "ob-table.el" (0 0 0 0)) +;;; Generated autoloads from ob-table.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-table" '("org-"))) + +;;;*** + +;;;### (autoloads nil "ob-vala" "ob-vala.el" (0 0 0 0)) +;;; Generated autoloads from ob-vala.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-vala" '("org-babel-"))) + +;;;*** + +;;;### (autoloads nil "ol" "ol.el" (0 0 0 0)) +;;; Generated autoloads from ol.el + +(autoload 'org-next-link "ol" "\ +Move forward to the next link. +If the link is in hidden text, expose it. When SEARCH-BACKWARD +is non-nil, move backward. + +\(fn &optional SEARCH-BACKWARD)" t nil) + +(autoload 'org-previous-link "ol" "\ +Move backward to the previous link. +If the link is in hidden text, expose it. + +\(fn)" t nil) + +(autoload 'org-toggle-link-display "ol" "\ +Toggle the literal or descriptive display of links. + +\(fn)" t nil) + +(autoload 'org-store-link "ol" "\ +Store a link to the current location. +\\ +This link is added to `org-stored-links' and can later be inserted +into an Org buffer with `org-insert-link' (`\\[org-insert-link]'). + +For some link types, a `\\[universal-argument]' prefix ARG is interpreted. A single +`\\[universal-argument]' negates `org-context-in-file-links' for file links or +`org-gnus-prefer-web-links' for links to Usenet articles. + +A `\\[universal-argument] \\[universal-argument]' prefix ARG forces skipping storing functions that are not +part of Org core. + +A `\\[universal-argument] \\[universal-argument] \\[universal-argument]' prefix ARG forces storing a link for each line in the +active region. + +Assume the function is called interactively if INTERACTIVE? is +non-nil. + +\(fn ARG &optional INTERACTIVE\\=\\?)" t nil) + +(autoload 'org-insert-link "ol" "\ +Insert a link. At the prompt, enter the link. + +Completion can be used to insert any of the link protocol prefixes in use. + +The history can be used to select a link previously stored with +`org-store-link'. When the empty string is entered (i.e. if you just +press `RET' at the prompt), the link defaults to the most recently +stored link. As `SPC' triggers completion in the minibuffer, you need to +use `M-SPC' or `C-q SPC' to force the insertion of a space character. + +You will also be prompted for a description, and if one is given, it will +be displayed in the buffer instead of the link. + +If there is already a link at point, this command will allow you to edit +link and description parts. + +With a `\\[universal-argument]' prefix, prompts for a file to link to. The file name can be +selected using completion. The path to the file will be relative to the +current directory if the file is in the current directory or a subdirectory. +Otherwise, the link will be the absolute path as completed in the minibuffer +\(i.e. normally ~/path/to/file). You can configure this behavior using the +option `org-link-file-path-type'. + +With a `\\[universal-argument] \\[universal-argument]' prefix, enforce an absolute path even if the file is in +the current directory or below. + +A `\\[universal-argument] \\[universal-argument] \\[universal-argument]' prefix negates `org-link-keep-stored-after-insertion'. + +If the LINK-LOCATION parameter is non-nil, this value will be used as +the link location instead of reading one interactively. + +If the DESCRIPTION parameter is non-nil, this value will be used as the +default description. Otherwise, if `org-link-make-description-function' +is non-nil, this function will be called with the link target, and the +result will be the default link description. When called non-interactively, +don't allow to edit the default description. + +\(fn &optional COMPLETE-FILE LINK-LOCATION DESCRIPTION)" t nil) + +(autoload 'org-insert-all-links "ol" "\ +Insert all links in `org-stored-links'. +When a universal prefix, do not delete the links from `org-stored-links'. +When `ARG' is a number, insert the last N link(s). +`PRE' and `POST' are optional arguments to define a string to +prepend or to append. + +\(fn ARG &optional PRE POST)" t nil) + +(autoload 'org-insert-last-stored-link "ol" "\ +Insert the last link stored in `org-stored-links'. + +\(fn ARG)" t nil) + +(autoload 'org-insert-link-global "ol" "\ +Insert a link like Org mode does. +This command can be called in any mode to insert a link in Org syntax. + +\(fn)" t nil) + +(autoload 'org-update-radio-target-regexp "ol" "\ +Find all radio targets in this file and update the regular expression. +Also refresh fontification if needed. + +\(fn)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ol" '("org-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ol-bbdb" "ol-bbdb.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from ol-bbdb.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ol-bbdb" '("org-bbdb-"))) + +;;;*** + +;;;### (autoloads nil "ol-bibtex" "ol-bibtex.el" (0 0 0 0)) +;;; Generated autoloads from ol-bibtex.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ol-bibtex" '("org-"))) + +;;;*** + +;;;### (autoloads nil "ol-docview" "ol-docview.el" (0 0 0 0)) +;;; Generated autoloads from ol-docview.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ol-docview" '("org-docview-"))) + +;;;*** + +;;;### (autoloads nil "ol-eshell" "ol-eshell.el" (0 0 0 0)) +;;; Generated autoloads from ol-eshell.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ol-eshell" '("org-eshell-"))) + +;;;*** + +;;;### (autoloads nil "ol-eww" "ol-eww.el" (0 0 0 0)) +;;; Generated autoloads from ol-eww.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ol-eww" '("org-eww-"))) + +;;;*** + +;;;### (autoloads nil "ol-gnus" "ol-gnus.el" (0 0 0 0)) +;;; Generated autoloads from ol-gnus.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ol-gnus" '("org-gnus-"))) + +;;;*** + +;;;### (autoloads nil "ol-info" "ol-info.el" (0 0 0 0)) +;;; Generated autoloads from ol-info.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ol-info" '("org-info-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ol-irc" "ol-irc.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from ol-irc.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ol-irc" '("org-irc-"))) + +;;;*** + +;;;### (autoloads nil "ol-mhe" "ol-mhe.el" (0 0 0 0)) +;;; Generated autoloads from ol-mhe.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ol-mhe" '("org-mhe-"))) + +;;;*** + +;;;### (autoloads nil "ol-rmail" "ol-rmail.el" (0 0 0 0)) +;;; Generated autoloads from ol-rmail.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ol-rmail" '("org-rmail-"))) + +;;;*** + +;;;### (autoloads nil "ol-w3m" "ol-w3m.el" (0 0 0 0)) +;;; Generated autoloads from ol-w3m.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ol-w3m" '("org-w3m-"))) + +;;;*** + +;;;### (autoloads nil "org" "org.el" (0 0 0 0)) +;;; Generated autoloads from org.el + +(autoload 'org-babel-do-load-languages "org" "\ +Load the languages defined in `org-babel-load-languages'. + +\(fn SYM VALUE)" nil nil) + +(autoload 'org-babel-load-file "org" "\ +Load Emacs Lisp source code blocks in the Org FILE. +This function exports the source code using `org-babel-tangle' +and then loads the resulting file using `load-file'. With +optional prefix argument COMPILE, the tangled Emacs Lisp file is +byte-compiled before it is loaded. + +\(fn FILE &optional COMPILE)" t nil) + +(autoload 'org-version "org" "\ +Show the Org version. +Interactively, or when MESSAGE is non-nil, show it in echo area. +With prefix argument, or when HERE is non-nil, insert it at point. +In non-interactive uses, a reduced version string is output unless +FULL is given. + +\(fn &optional HERE FULL MESSAGE)" t nil) + +(autoload 'org-clock-persistence-insinuate "org" "\ +Set up hooks for clock persistence. + +\(fn)" nil nil) + +(autoload 'org-mode "org" "\ +Outline-based notes management and organizer, alias +\"Carsten's outline-mode for keeping track of everything.\" + +Org mode develops organizational tasks around a NOTES file which +contains information about projects as plain text. Org mode is +implemented on top of Outline mode, which is ideal to keep the content +of large files well structured. It supports ToDo items, deadlines and +time stamps, which magically appear in the diary listing of the Emacs +calendar. Tables are easily created with a built-in table editor. +Plain text URL-like links connect to websites, emails (VM), Usenet +messages (Gnus), BBDB entries, and any files related to the project. +For printing and sharing of notes, an Org file (or a part of it) +can be exported as a structured ASCII or HTML file. + +The following commands are available: + +\\{org-mode-map} + +\(fn)" t nil) + +(autoload 'org-cycle "org" "\ +TAB-action and visibility cycling for Org mode. + +This is the command invoked in Org mode by the `TAB' key. Its main +purpose is outline visibility cycling, but it also invokes other actions +in special contexts. + +When this function is called with a `\\[universal-argument]' prefix, rotate the entire +buffer through 3 states (global cycling) + 1. OVERVIEW: Show only top-level headlines. + 2. CONTENTS: Show all headlines of all levels, but no body text. + 3. SHOW ALL: Show everything. + +With a `\\[universal-argument] \\[universal-argument]' prefix argument, switch to the startup visibility, +determined by the variable `org-startup-folded', and by any VISIBILITY +properties in the buffer. + +With a `\\[universal-argument] \\[universal-argument] \\[universal-argument]' prefix argument, show the entire buffer, including +any drawers. + +When inside a table, re-align the table and move to the next field. + +When point is at the beginning of a headline, rotate the subtree started +by this line through 3 different states (local cycling) + 1. FOLDED: Only the main headline is shown. + 2. CHILDREN: The main headline and the direct children are shown. + From this state, you can move to one of the children + and zoom in further. + 3. SUBTREE: Show the entire subtree, including body text. +If there is no subtree, switch directly from CHILDREN to FOLDED. + +When point is at the beginning of an empty headline and the variable +`org-cycle-level-after-item/entry-creation' is set, cycle the level +of the headline by demoting and promoting it to likely levels. This +speeds up creation document structure by pressing `TAB' once or several +times right after creating a new headline. + +When there is a numeric prefix, go up to a heading with level ARG, do +a `show-subtree' and return to the previous cursor position. If ARG +is negative, go up that many levels. + +When point is not at the beginning of a headline, execute the global +binding for `TAB', which is re-indenting the line. See the option +`org-cycle-emulate-tab' for details. + +As a special case, if point is at the beginning of the buffer and there is +no headline in line 1, this function will act as if called with prefix arg +\(`\\[universal-argument] TAB', same as `S-TAB') also when called without prefix arg, but only +if the variable `org-cycle-global-at-bob' is t. + +\(fn &optional ARG)" t nil) + +(autoload 'org-global-cycle "org" "\ +Cycle the global visibility. For details see `org-cycle'. +With `\\[universal-argument]' prefix ARG, switch to startup visibility. +With a numeric prefix, show all headlines up to that level. + +\(fn &optional ARG)" t nil) + +(autoload 'org-run-like-in-org-mode "org" "\ +Run a command, pretending that the current buffer is in Org mode. +This will temporarily bind local variables that are typically bound in +Org mode to the values they have in Org mode, and then interactively +call CMD. + +\(fn CMD)" nil nil) + +(autoload 'org-open-file "org" "\ +Open the file at PATH. +First, this expands any special file name abbreviations. Then the +configuration variable `org-file-apps' is checked if it contains an +entry for this file type, and if yes, the corresponding command is launched. + +If no application is found, Emacs simply visits the file. + +With optional prefix argument IN-EMACS, Emacs will visit the file. +With a double \\[universal-argument] \\[universal-argument] prefix arg, Org tries to avoid opening in Emacs +and to use an external application to visit the file. + +Optional LINE specifies a line to go to, optional SEARCH a string +to search for. If LINE or SEARCH is given, the file will be +opened in Emacs, unless an entry from `org-file-apps' that makes +use of groups in a regexp matches. + +If you want to change the way frames are used when following a +link, please customize `org-link-frame-setup'. + +If the file does not exist, throw an error. + +\(fn PATH &optional IN-EMACS LINE SEARCH)" nil nil) + +(autoload 'org-open-at-point-global "org" "\ +Follow a link or a time-stamp like Org mode does. +Also follow links and emails as seen by `thing-at-point'. +This command can be called in any mode to follow an external +link or a time-stamp that has Org mode syntax. Its behavior +is undefined when called on internal links like fuzzy links. +Raise a user error when there is nothing to follow. + +\(fn)" t nil) + +(autoload 'org-offer-links-in-entry "org" "\ +Offer links in the current entry and return the selected link. +If there is only one link, return it. +If NTH is an integer, return the NTH link found. +If ZERO is a string, check also this string for a link, and if +there is one, return it. + +\(fn BUFFER MARKER &optional NTH ZERO)" nil nil) + +(autoload 'org-switchb "org" "\ +Switch between Org buffers. + +With `\\[universal-argument]' prefix, restrict available buffers to files. + +With `\\[universal-argument] \\[universal-argument]' prefix, restrict available buffers to agenda files. + +\(fn &optional ARG)" t nil) + +(autoload 'org-cycle-agenda-files "org" "\ +Cycle through the files in `org-agenda-files'. +If the current buffer visits an agenda file, find the next one in the list. +If the current buffer does not, find the first agenda file. + +\(fn)" t nil) + +(autoload 'org-submit-bug-report "org" "\ +Submit a bug report on Org via mail. + +Don't hesitate to report any problems or inaccurate documentation. + +If you don't have setup sending mail from (X)Emacs, please copy the +output buffer into your mail program, as it gives us important +information about your Org version and configuration. + +\(fn)" t nil) + +(autoload 'org-reload "org" "\ +Reload all Org Lisp files. +With prefix arg UNCOMPILED, load the uncompiled versions. + +\(fn &optional UNCOMPILED)" t nil) + +(autoload 'org-customize "org" "\ +Call the customize function with org as argument. + +\(fn)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org" '("org-" "turn-on-org-cdlatex"))) + +;;;*** + +;;;### (autoloads nil "org-agenda" "org-agenda.el" (0 0 0 0)) +;;; Generated autoloads from org-agenda.el + +(autoload 'org-toggle-sticky-agenda "org-agenda" "\ +Toggle `org-agenda-sticky'. + +\(fn &optional ARG)" t nil) + +(autoload 'org-agenda "org-agenda" "\ +Dispatch agenda commands to collect entries to the agenda buffer. +Prompts for a command to execute. Any prefix arg will be passed +on to the selected command. The default selections are: + +a Call `org-agenda-list' to display the agenda for current day or week. +t Call `org-todo-list' to display the global todo list. +T Call `org-todo-list' to display the global todo list, select only + entries with a specific TODO keyword (the user gets a prompt). +m Call `org-tags-view' to display headlines with tags matching + a condition (the user is prompted for the condition). +M Like `m', but select only TODO entries, no ordinary headlines. +e Export views to associated files. +s Search entries for keywords. +S Search entries for keywords, only with TODO keywords. +/ Multi occur across all agenda files and also files listed + in `org-agenda-text-search-extra-files'. +< Restrict agenda commands to buffer, subtree, or region. + Press several times to get the desired effect. +> Remove a previous restriction. +# List \"stuck\" projects. +! Configure what \"stuck\" means. +C Configure custom agenda commands. + +More commands can be added by configuring the variable +`org-agenda-custom-commands'. In particular, specific tags and TODO keyword +searches can be pre-defined in this way. + +If the current buffer is in Org mode and visiting a file, you can also +first press `<' once to indicate that the agenda should be temporarily +\(until the next use of `\\[org-agenda]') restricted to the current file. +Pressing `<' twice means to restrict to the current subtree or region +\(if active). + +\(fn &optional ARG ORG-KEYS RESTRICTION)" t nil) + +(autoload 'org-batch-agenda "org-agenda" "\ +Run an agenda command in batch mode and send the result to STDOUT. +If CMD-KEY is a string of length 1, it is used as a key in +`org-agenda-custom-commands' and triggers this command. If it is a +longer string it is used as a tags/todo match string. +Parameters are alternating variable names and values that will be bound +before running the agenda command. + +\(fn CMD-KEY &rest PARAMETERS)" nil t) + +(autoload 'org-batch-agenda-csv "org-agenda" "\ +Run an agenda command in batch mode and send the result to STDOUT. +If CMD-KEY is a string of length 1, it is used as a key in +`org-agenda-custom-commands' and triggers this command. If it is a +longer string it is used as a tags/todo match string. +Parameters are alternating variable names and values that will be bound +before running the agenda command. + +The output gives a line for each selected agenda item. Each +item is a list of comma-separated values, like this: + +category,head,type,todo,tags,date,time,extra,priority-l,priority-n + +category The category of the item +head The headline, without TODO kwd, TAGS and PRIORITY +type The type of the agenda entry, can be + todo selected in TODO match + tagsmatch selected in tags match + diary imported from diary + deadline a deadline on given date + scheduled scheduled on given date + timestamp entry has timestamp on given date + closed entry was closed on given date + upcoming-deadline warning about deadline + past-scheduled forwarded scheduled item + block entry has date block including g. date +todo The todo keyword, if any +tags All tags including inherited ones, separated by colons +date The relevant date, like 2007-2-14 +time The time, like 15:00-16:50 +extra String with extra planning info +priority-l The priority letter if any was given +priority-n The computed numerical priority +agenda-day The day in the agenda where this is listed + +\(fn CMD-KEY &rest PARAMETERS)" nil t) + +(autoload 'org-store-agenda-views "org-agenda" "\ +Store agenda views. + +\(fn &rest PARAMETERS)" t nil) + +(autoload 'org-batch-store-agenda-views "org-agenda" "\ +Run all custom agenda commands that have a file argument. + +\(fn &rest PARAMETERS)" nil t) + +(autoload 'org-agenda-list "org-agenda" "\ +Produce a daily/weekly view from all files in variable `org-agenda-files'. +The view will be for the current day or week, but from the overview buffer +you will be able to go to other days/weeks. + +With a numeric prefix argument in an interactive call, the agenda will +span ARG days. Lisp programs should instead specify SPAN to change +the number of days. SPAN defaults to `org-agenda-span'. + +START-DAY defaults to TODAY, or to the most recent match for the weekday +given in `org-agenda-start-on-weekday'. + +When WITH-HOUR is non-nil, only include scheduled and deadline +items if they have an hour specification like [h]h:mm. + +\(fn &optional ARG START-DAY SPAN WITH-HOUR)" t nil) + +(autoload 'org-search-view "org-agenda" "\ +Show all entries that contain a phrase or words or regular expressions. + +With optional prefix argument TODO-ONLY, only consider entries that are +TODO entries. The argument STRING can be used to pass a default search +string into this function. If EDIT-AT is non-nil, it means that the +user should get a chance to edit this string, with cursor at position +EDIT-AT. + +The search string can be viewed either as a phrase that should be found as +is, or it can be broken into a number of snippets, each of which must match +in a Boolean way to select an entry. The default depends on the variable +`org-agenda-search-view-always-boolean'. +Even if this is turned off (the default) you can always switch to +Boolean search dynamically by preceding the first word with \"+\" or \"-\". + +The default is a direct search of the whole phrase, where each space in +the search string can expand to an arbitrary amount of whitespace, +including newlines. + +If using a Boolean search, the search string is split on whitespace and +each snippet is searched separately, with logical AND to select an entry. +Words prefixed with a minus must *not* occur in the entry. Words without +a prefix or prefixed with a plus must occur in the entry. Matching is +case-insensitive. Words are enclosed by word delimiters (i.e. they must +match whole words, not parts of a word) if +`org-agenda-search-view-force-full-words' is set (default is nil). + +Boolean search snippets enclosed by curly braces are interpreted as +regular expressions that must or (when preceded with \"-\") must not +match in the entry. Snippets enclosed into double quotes will be taken +as a whole, to include whitespace. + +- If the search string starts with an asterisk, search only in headlines. +- If (possibly after the leading star) the search string starts with an + exclamation mark, this also means to look at TODO entries only, an effect + that can also be achieved with a prefix argument. +- If (possibly after star and exclamation mark) the search string starts + with a colon, this will mean that the (non-regexp) snippets of the + Boolean search must match as full words. + +This command searches the agenda files, and in addition the files +listed in `org-agenda-text-search-extra-files' unless a restriction lock +is active. + +\(fn &optional TODO-ONLY STRING EDIT-AT)" t nil) + +(autoload 'org-todo-list "org-agenda" "\ +Show all (not done) TODO entries from all agenda file in a single list. +The prefix arg can be used to select a specific TODO keyword and limit +the list to these. When using `\\[universal-argument]', you will be prompted +for a keyword. A numeric prefix directly selects the Nth keyword in +`org-todo-keywords-1'. + +\(fn &optional ARG)" t nil) + +(autoload 'org-tags-view "org-agenda" "\ +Show all headlines for all `org-agenda-files' matching a TAGS criterion. +The prefix arg TODO-ONLY limits the search to TODO entries. + +\(fn &optional TODO-ONLY MATCH)" t nil) + +(autoload 'org-agenda-list-stuck-projects "org-agenda" "\ +Create agenda view for projects that are stuck. +Stuck projects are project that have no next actions. For the definitions +of what a project is and how to check if it stuck, customize the variable +`org-stuck-projects'. + +\(fn &rest IGNORE)" t nil) + +(autoload 'org-diary "org-agenda" "\ +Return diary information from org files. +This function can be used in a \"sexp\" diary entry in the Emacs calendar. +It accesses org files and extracts information from those files to be +listed in the diary. The function accepts arguments specifying what +items should be listed. For a list of arguments allowed here, see the +variable `org-agenda-entry-types'. + +The call in the diary file should look like this: + + &%%(org-diary) ~/path/to/some/orgfile.org + +Use a separate line for each org file to check. Or, if you omit the file name, +all files listed in `org-agenda-files' will be checked automatically: + + &%%(org-diary) + +If you don't give any arguments (as in the example above), the default value +of `org-agenda-entry-types' is used: (:deadline :scheduled :timestamp :sexp). +So the example above may also be written as + + &%%(org-diary :deadline :timestamp :sexp :scheduled) + +The function expects the lisp variables `entry' and `date' to be provided +by the caller, because this is how the calendar works. Don't use this +function from a program - use `org-agenda-get-day-entries' instead. + +\(fn &rest ARGS)" nil nil) + +(autoload 'org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item "org-agenda" "\ +Do we have a reason to ignore this TODO entry because it has a time stamp? + +\(fn &optional END)" nil nil) + +(autoload 'org-agenda-set-restriction-lock "org-agenda" "\ +Set restriction lock for agenda to current subtree or file. +When in a restricted subtree, remove it. + +The restriction will span over the entire file if TYPE is `file', +or if type is '(4), or if the cursor is before the first headline +in the file. Otherwise, only apply the restriction to the current +subtree. + +\(fn &optional TYPE)" t nil) + +(autoload 'org-calendar-goto-agenda "org-agenda" "\ +Compute the Org agenda for the calendar date displayed at the cursor. +This is a command that has to be installed in `calendar-mode-map'. + +\(fn)" t nil) + +(autoload 'org-agenda-to-appt "org-agenda" "\ +Activate appointments found in `org-agenda-files'. + +With a `\\[universal-argument]' prefix, refresh the list of appointments. + +If FILTER is t, interactively prompt the user for a regular +expression, and filter out entries that don't match it. + +If FILTER is a string, use this string as a regular expression +for filtering entries out. + +If FILTER is a function, filter out entries against which +calling the function returns nil. This function takes one +argument: an entry from `org-agenda-get-day-entries'. + +FILTER can also be an alist with the car of each cell being +either `headline' or `category'. For example: + + \\='((headline \"IMPORTANT\") + (category \"Work\")) + +will only add headlines containing IMPORTANT or headlines +belonging to the \"Work\" category. + +ARGS are symbols indicating what kind of entries to consider. +By default `org-agenda-to-appt' will use :deadline*, :scheduled* +\(i.e., deadlines and scheduled items with a hh:mm specification) +and :timestamp entries. See the docstring of `org-diary' for +details and examples. + +If an entry has a APPT_WARNTIME property, its value will be used +to override `appt-message-warning-time'. + +\(fn &optional REFRESH FILTER &rest ARGS)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-agenda" '("org-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "org-attach" "org-attach.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from org-attach.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-attach" '("org-attach-"))) + +;;;*** + +;;;### (autoloads nil "org-attach-git" "org-attach-git.el" (0 0 0 +;;;;;; 0)) +;;; Generated autoloads from org-attach-git.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-attach-git" '("org-attach-git-"))) + +;;;*** + +;;;### (autoloads nil "org-capture" "org-capture.el" (0 0 0 0)) +;;; Generated autoloads from org-capture.el + +(autoload 'org-capture-string "org-capture" "\ +Capture STRING with the template selected by KEYS. + +\(fn STRING &optional KEYS)" t nil) + +(autoload 'org-capture "org-capture" "\ +Capture something. +\\ +This will let you select a template from `org-capture-templates', and +then file the newly captured information. The text is immediately +inserted at the target location, and an indirect buffer is shown where +you can edit it. Pressing `\\[org-capture-finalize]' brings you back to the previous +state of Emacs, so that you can continue your work. + +When called interactively with a `\\[universal-argument]' prefix argument GOTO, don't +capture anything, just go to the file/headline where the selected +template stores its notes. + +With a `\\[universal-argument] \\[universal-argument]' prefix argument, go to the last note stored. + +When called with a `C-0' (zero) prefix, insert a template at point. + +When called with a `C-1' (one) prefix, force prompting for a date when +a datetree entry is made. + +ELisp programs can set KEYS to a string associated with a template +in `org-capture-templates'. In this case, interactive selection +will be bypassed. + +If `org-capture-use-agenda-date' is non-nil, capturing from the +agenda will use the date at point as the default date. Then, a +`C-1' prefix will tell the capture process to use the HH:MM time +of the day at point (if any) or the current HH:MM time. + +\(fn &optional GOTO KEYS)" t nil) + +(autoload 'org-capture-import-remember-templates "org-capture" "\ +Set `org-capture-templates' to be similar to `org-remember-templates'. + +\(fn)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-capture" '("org-capture-"))) + +;;;*** + +;;;### (autoloads nil "org-colview" "org-colview.el" (0 0 0 0)) +;;; Generated autoloads from org-colview.el + +(autoload 'org-columns-remove-overlays "org-colview" "\ +Remove all currently active column overlays. + +\(fn)" t nil) + +(autoload 'org-columns-get-format-and-top-level "org-colview" "\ + + +\(fn)" nil nil) + +(autoload 'org-columns "org-colview" "\ +Turn on column view on an Org mode file. + +Column view applies to the whole buffer if point is before the +first headline. Otherwise, it applies to the first ancestor +setting \"COLUMNS\" property. If there is none, it defaults to +the current headline. With a `\\[universal-argument]' prefix argument, turn on column +view for the whole buffer unconditionally. + +When COLUMNS-FMT-STRING is non-nil, use it as the column format. + +\(fn &optional GLOBAL COLUMNS-FMT-STRING)" t nil) + +(autoload 'org-columns-compute "org-colview" "\ +Summarize the values of PROPERTY hierarchically. +Also update existing values for PROPERTY according to the first +column specification. + +\(fn PROPERTY)" t nil) + +(autoload 'org-dblock-write:columnview "org-colview" "\ +Write the column view table. + +PARAMS is a property list of parameters: + +`:id' (mandatory) + + The ID property of the entry where the columns view should be + built. When the symbol `local', call locally. When `global' + call column view with the cursor at the beginning of the + buffer (usually this means that the whole buffer switches to + column view). When \"file:path/to/file.org\", invoke column + view at the start of that file. Otherwise, the ID is located + using `org-id-find'. + +`:exclude-tags' + + List of tags to exclude from column view table. + +`:format' + + When non-nil, specify the column view format to use. + +`:hlines' + + When non-nil, insert a hline before each item. When + a number, insert a hline before each level inferior or equal + to that number. + +`:indent' + + When non-nil, indent each ITEM field according to its level. + +`:match' + + When set to a string, use this as a tags/property match filter. + +`:maxlevel' + + When set to a number, don't capture headlines below this level. + +`:skip-empty-rows' + + When non-nil, skip rows where all specifiers other than ITEM + are empty. + +`:vlines' + + When non-nil, make each column a column group to enforce + vertical lines. + +\(fn PARAMS)" nil nil) + +(autoload 'org-columns-insert-dblock "org-colview" "\ +Create a dynamic block capturing a column view table. + +\(fn)" t nil) + +(autoload 'org-agenda-columns "org-colview" "\ +Turn on or update column view in the agenda. + +\(fn)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-colview" '("org-"))) + +;;;*** + +;;;### (autoloads nil "org-compat" "org-compat.el" (0 0 0 0)) +;;; Generated autoloads from org-compat.el + +(autoload 'org-check-version "org-compat" "\ +Try very hard to provide sensible version strings. + +\(fn)" nil t) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-compat" '("org-"))) + +;;;*** + +;;;### (autoloads nil "org-crypt" "org-crypt.el" (0 0 0 0)) +;;; Generated autoloads from org-crypt.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-crypt" '("org-"))) + +;;;*** + +;;;### (autoloads nil "org-ctags" "org-ctags.el" (0 0 0 0)) +;;; Generated autoloads from org-ctags.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-ctags" '("org-ctags-"))) + +;;;*** + +;;;### (autoloads nil "org-duration" "org-duration.el" (0 0 0 0)) +;;; Generated autoloads from org-duration.el + +(autoload 'org-duration-set-regexps "org-duration" "\ +Set duration related regexps. + +\(fn)" t nil) + +(autoload 'org-duration-p "org-duration" "\ +Non-nil when string S is a time duration. + +\(fn S)" nil nil) + +(autoload 'org-duration-to-minutes "org-duration" "\ +Return number of minutes of DURATION string. + +When optional argument CANONICAL is non-nil, ignore +`org-duration-units' and use standard time units value. + +A bare number is translated into minutes. The empty string is +translated into 0.0. + +Return value as a float. Raise an error if duration format is +not recognized. + +\(fn DURATION &optional CANONICAL)" nil nil) + +(autoload 'org-duration-from-minutes "org-duration" "\ +Return duration string for a given number of MINUTES. + +Format duration according to `org-duration-format' or FMT, when +non-nil. + +When optional argument CANONICAL is non-nil, ignore +`org-duration-units' and use standard time units value. + +Raise an error if expected format is unknown. + +\(fn MINUTES &optional FMT CANONICAL)" nil nil) + +(autoload 'org-duration-h:mm-only-p "org-duration" "\ +Non-nil when every duration in TIMES has \"H:MM\" or \"H:MM:SS\" format. + +TIMES is a list of duration strings. + +Return nil if any duration is expressed with units, as defined in +`org-duration-units'. Otherwise, if any duration is expressed +with \"H:MM:SS\" format, return `h:mm:ss'. Otherwise, return +`h:mm'. + +\(fn TIMES)" nil nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-duration" '("org-duration-"))) + +;;;*** + +;;;### (autoloads nil "org-entities" "org-entities.el" (0 0 0 0)) +;;; Generated autoloads from org-entities.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-entities" '("org-entit"))) + +;;;*** + +;;;### (autoloads nil "org-faces" "org-faces.el" (0 0 0 0)) +;;; Generated autoloads from org-faces.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-faces" '("org-"))) + +;;;*** + +;;;### (autoloads nil "org-goto" "org-goto.el" (0 0 0 0)) +;;; Generated autoloads from org-goto.el + +(autoload 'org-goto-location "org-goto" "\ +Let the user select a location in current buffer. +This function uses a recursive edit. It returns the selected +position or nil. + +\(fn &optional BUF HELP)" nil nil) + +(autoload 'org-goto "org-goto" "\ +Look up a different location in the current file, keeping current visibility. + +When you want look-up or go to a different location in a +document, the fastest way is often to fold the entire buffer and +then dive into the tree. This method has the disadvantage, that +the previous location will be folded, which may not be what you +want. + +This command works around this by showing a copy of the current +buffer in an indirect buffer, in overview mode. You can dive +into the tree in that copy, use org-occur and incremental search +to find a location. When pressing RET or `Q', the command +returns to the original buffer in which the visibility is still +unchanged. After RET it will also jump to the location selected +in the indirect buffer and expose the headline hierarchy above. + +With a prefix argument, use the alternative interface: e.g., if +`org-goto-interface' is `outline' use `outline-path-completion'. + +\(fn &optional ALTERNATIVE-INTERFACE)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-goto" '("org-goto-"))) + +;;;*** + +;;;### (autoloads nil "org-habit" "org-habit.el" (0 0 0 0)) +;;; Generated autoloads from org-habit.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-habit" '("org-"))) + +;;;*** + +;;;### (autoloads nil "org-inlinetask" "org-inlinetask.el" (0 0 0 +;;;;;; 0)) +;;; Generated autoloads from org-inlinetask.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-inlinetask" '("org-inlinetask-"))) + +;;;*** + +;;;### (autoloads nil "org-keys" "org-keys.el" (0 0 0 0)) +;;; Generated autoloads from org-keys.el + +(autoload 'org-babel-describe-bindings "org-keys" "\ +Describe all keybindings behind `org-babel-key-prefix'. + +\(fn)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-keys" '("org-"))) + +;;;*** + +;;;### (autoloads nil "org-lint" "org-lint.el" (0 0 0 0)) +;;; Generated autoloads from org-lint.el + +(autoload 'org-lint "org-lint" "\ +Check current Org buffer for syntax mistakes. + +By default, run all checkers. With a `\\[universal-argument]' prefix ARG, select one +category of checkers only. With a `\\[universal-argument] \\[universal-argument]' prefix, run one precise +checker by its name. + +ARG can also be a list of checker names, as symbols, to run. + +\(fn &optional ARG)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-lint" '("org-lint-"))) + +;;;*** + +;;;### (autoloads nil "org-list" "org-list.el" (0 0 0 0)) +;;; Generated autoloads from org-list.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-list" '("org-"))) + +;;;*** + +;;;### (autoloads nil "org-macro" "org-macro.el" (0 0 0 0)) +;;; Generated autoloads from org-macro.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-macro" '("org-macro-"))) + +;;;*** + +;;;### (autoloads nil "org-macs" "org-macs.el" (0 0 0 0)) +;;; Generated autoloads from org-macs.el + +(autoload 'org-load-noerror-mustsuffix "org-macs" "\ +Load FILE with optional arguments NOERROR and MUSTSUFFIX. + +\(fn FILE)" nil t) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-macs" '("org-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "org-mobile" "org-mobile.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from org-mobile.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-mobile" '("org-mobile-"))) + +;;;*** + +;;;### (autoloads nil "org-mouse" "org-mouse.el" (0 0 0 0)) +;;; Generated autoloads from org-mouse.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-mouse" '("org-mouse-"))) + +;;;*** + +;;;### (autoloads nil "org-num" "org-num.el" (0 0 0 0)) +;;; Generated autoloads from org-num.el + +(autoload 'org-num-default-format "org-num" "\ +Default numbering display function. +NUMBERING is a list of numbers. + +\(fn NUMBERING)" nil nil) + +(autoload 'org-num-mode "org-num" "\ +Dynamic numbering of headlines in an Org buffer. + +\(fn &optional ARG)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-num" '("org-num-"))) + +;;;*** + +;;;### (autoloads nil "org-pcomplete" "org-pcomplete.el" (0 0 0 0)) +;;; Generated autoloads from org-pcomplete.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-pcomplete" '("pcomplete/org-mode/" "org-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "org-plot" "org-plot.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from org-plot.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-plot" '("org-plot"))) + +;;;*** + +;;;### (autoloads nil "org-protocol" "org-protocol.el" (0 0 0 0)) +;;; Generated autoloads from org-protocol.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-protocol" '("org-protocol-"))) + +;;;*** + +;;;### (autoloads nil "org-src" "org-src.el" (0 0 0 0)) +;;; Generated autoloads from org-src.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-src" '("org-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "org-table" "org-table.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from org-table.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-table" '("org"))) + +;;;*** + +;;;### (autoloads nil "org-tempo" "org-tempo.el" (0 0 0 0)) +;;; Generated autoloads from org-tempo.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-tempo" '("org-tempo-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "org-timer" "org-timer.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from org-timer.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-timer" '("org-timer-"))) + +;;;*** + +;;;### (autoloads nil "org-version" "org-version.el" (0 0 0 0)) +;;; Generated autoloads from org-version.el + +(autoload 'org-release "org-version" "\ +The release version of Org. +Inserted by installing Org mode or when a release is made. + +\(fn)" nil nil) + +(autoload 'org-git-version "org-version" "\ +The Git version of Org mode. +Inserted by installing Org or when a release is made. + +\(fn)" nil nil) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ox" "ox.el" (0 +;;;;;; 0 0 0)) +;;; Generated autoloads from ox.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox" '("org-export-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ox-ascii" "ox-ascii.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from ox-ascii.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox-ascii" '("org-ascii-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ox-beamer" "ox-beamer.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from ox-beamer.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox-beamer" '("org-beamer-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ox-html" "ox-html.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from ox-html.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox-html" '("org-html-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ox-icalendar" +;;;;;; "ox-icalendar.el" (0 0 0 0)) +;;; Generated autoloads from ox-icalendar.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox-icalendar" '("org-icalendar-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ox-latex" "ox-latex.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from ox-latex.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox-latex" '("org-latex-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ox-man" "ox-man.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from ox-man.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox-man" '("org-man-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ox-md" "ox-md.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from ox-md.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox-md" '("org-md-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ox-odt" "ox-odt.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from ox-odt.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox-odt" '("org-odt-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ox-org" "ox-org.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from ox-org.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox-org" '("org-org-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ox-publish" "ox-publish.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from ox-publish.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox-publish" '("org-publish-"))) + +;;;*** + +;;;### (autoloads "actual autoloads are elsewhere" "ox-texinfo" "ox-texinfo.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from ox-texinfo.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox-texinfo" '("org-texinfo-"))) + +;;;*** + +;;;### (autoloads nil nil ("ob-core.el" "ob-lob.el" "ob-matlab.el" +;;;;;; "ob-tangle.el" "ob.el" "ol-bbdb.el" "ol-irc.el" "org-archive.el" +;;;;;; "org-attach.el" "org-clock.el" "org-datetree.el" "org-element.el" +;;;;;; "org-feed.el" "org-footnote.el" "org-id.el" "org-indent.el" +;;;;;; "org-install.el" "org-loaddefs.el" "org-mobile.el" "org-pkg.el" +;;;;;; "org-plot.el" "org-table.el" "org-timer.el" "ox-ascii.el" +;;;;;; "ox-beamer.el" "ox-html.el" "ox-icalendar.el" "ox-latex.el" +;;;;;; "ox-man.el" "ox-md.el" "ox-odt.el" "ox-org.el" "ox-publish.el" +;;;;;; "ox-texinfo.el" "ox.el") (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; org-autoloads.el ends here diff --git a/elpa/org-20191028/org-capture.el b/elpa/org-20200127/org-capture.el similarity index 95% rename from elpa/org-20191028/org-capture.el rename to elpa/org-20200127/org-capture.el index d24045fd..d4921c04 100644 --- a/elpa/org-20191028/org-capture.el +++ b/elpa/org-20200127/org-capture.el @@ -1,6 +1,6 @@ ;;; org-capture.el --- Fast note taking in Org -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -51,10 +51,16 @@ (require 'org) (declare-function org-at-encrypted-entry-p "org-crypt" ()) +(declare-function org-at-table-p "org-table" (&optional table-type)) (declare-function org-clock-update-mode-line "org-clock" (&optional refresh)) (declare-function org-datetree-find-date-create "org-datetree" (date &optional keep-restriction)) (declare-function org-decrypt-entry "org-crypt" ()) +(declare-function org-element-at-point "org-element" ()) +(declare-function org-element-lineage "org-element" (datum &optional types with-self)) +(declare-function org-element-property "org-element" (property element)) (declare-function org-encrypt-entry "org-crypt" ()) +(declare-function org-insert-link "ol" (&optional complete-file link-location default-description)) +(declare-function org-link-make-string "ol" (link &optional description)) (declare-function org-table-analyze "org-table" ()) (declare-function org-table-current-dline "org-table" ()) (declare-function org-table-fix-formulas "org-table" (key replace &optional limit delta remove)) @@ -64,9 +70,12 @@ (defvar org-end-time-was-given) (defvar org-remember-default-headline) (defvar org-remember-templates) +(defvar org-store-link-plist) (defvar org-table-border-regexp) (defvar org-table-current-begin-pos) +(defvar org-table-dataline-regexp) (defvar org-table-fix-formulas-confirm) +(defvar org-table-hline-regexp) (defvar org-table-hlines) (defvar org-capture-clock-was-started nil @@ -654,10 +663,9 @@ of the day at point (if any) or the current HH:MM time." :annotation annotation :initial initial :return-to-wconf (current-window-configuration) - :default-time - (or org-overriding-default-time - (org-current-time))) - (org-capture-set-target-location) + :default-time (or org-overriding-default-time + (org-current-time))) + (org-capture-set-target-location (and (equal goto 0) 'here)) (condition-case error (org-capture-put :template (org-capture-fill-template)) ((error quit) @@ -665,49 +673,44 @@ of the day at point (if any) or the current HH:MM time." (error "Capture abort: %s" (error-message-string error)))) (setq org-capture-clock-keep (org-capture-get :clock-keep)) - (if (equal goto 0) - ;;insert at point - (org-capture-insert-template-here) - (condition-case error - (org-capture-place-template - (eq (car (org-capture-get :target)) 'function)) - ((error quit) - (when (and (buffer-base-buffer (current-buffer)) - (string-prefix-p "CAPTURE-" (buffer-name))) - (kill-buffer (current-buffer))) - (set-window-configuration (org-capture-get :return-to-wconf)) - (error "Capture template `%s': %s" - (org-capture-get :key) - (error-message-string error)))) - (when (and (derived-mode-p 'org-mode) (org-capture-get :clock-in)) - (condition-case nil - (progn - (when (org-clock-is-active) - (org-capture-put :interrupted-clock - (copy-marker org-clock-marker))) - (org-clock-in) - (setq-local org-capture-clock-was-started t)) - (error "Could not start the clock in this capture buffer"))) - (when (org-capture-get :immediate-finish) - (org-capture-finalize))))))))) + (condition-case error + (org-capture-place-template + (eq (car (org-capture-get :target)) 'function)) + ((error quit) + (when (and (buffer-base-buffer (current-buffer)) + (string-prefix-p "CAPTURE-" (buffer-name))) + (kill-buffer (current-buffer))) + (set-window-configuration (org-capture-get :return-to-wconf)) + (error "Capture template `%s': %s" + (org-capture-get :key) + (error-message-string error)))) + (when (and (derived-mode-p 'org-mode) (org-capture-get :clock-in)) + (condition-case nil + (progn + (when (org-clock-is-active) + (org-capture-put :interrupted-clock + (copy-marker org-clock-marker))) + (org-clock-in) + (setq-local org-capture-clock-was-started t)) + (error "Could not start the clock in this capture buffer"))) + (when (org-capture-get :immediate-finish) + (org-capture-finalize)))))))) (defun org-capture-get-template () "Get the template from a file or a function if necessary." - (let ((txt (org-capture-get :template)) file) - (cond - ((and (listp txt) (eq (car txt) 'file)) - (if (file-exists-p - (setq file (expand-file-name (nth 1 txt) org-directory))) - (setq txt (org-file-contents file)) - (setq txt (format "* Template file %s not found" (nth 1 txt))))) - ((and (listp txt) (eq (car txt) 'function)) - (if (fboundp (nth 1 txt)) - (setq txt (funcall (nth 1 txt))) - (setq txt (format "* Template function %s not found" (nth 1 txt))))) - ((not txt) (setq txt "")) - ((stringp txt)) - (t (setq txt "* Invalid capture template"))) - (org-capture-put :template txt))) + (org-capture-put + :template + (pcase (org-capture-get :template) + (`nil "") + ((and (pred stringp) template) template) + (`(file ,file) + (let ((filename (expand-file-name file org-directory))) + (if (file-exists-p filename) (org-file-contents filename) + (format "* Template file %S not found" file)))) + (`(function ,f) + (if (functionp f) (funcall f) + (format "* Template function %S not found" f))) + (_ "* Invalid capture template")))) (defun org-capture-finalize (&optional stay-with-capture) "Finalize the capture process. @@ -918,6 +921,8 @@ Store them in the capture property list." (let ((target-entry-p t)) (save-excursion (pcase (or target (org-capture-get :target)) + (`here + (org-capture-put :exact-position (point) :insert-here t)) (`(file ,path) (set-buffer (org-capture-target-buffer path)) (org-capture-put-target-region-and-position) @@ -1115,11 +1120,14 @@ may have been stored before." "Place the template as a new Org entry." (let ((template (org-capture-get :template)) (reversed? (org-capture-get :prepend)) + (exact-position (org-capture-get :exact-position)) + (insert-here? (org-capture-get :insert-here)) (level 1)) (org-capture-verify-tree template) - (when (org-capture-get :exact-position) - (goto-char (org-capture-get :exact-position))) + (when exact-position (goto-char exact-position)) (cond + ;; Force insertion at point. + ((org-capture-get :insert-here) nil) ;; Insert as a child of the current entry. ((org-capture-get :target-entry-p) (setq level (org-get-valid-level @@ -1136,7 +1144,9 @@ may have been stored before." (unless (bolp) (insert "\n")) (org-capture-empty-lines-before) (let ((beg (point))) - (org-paste-subtree level template 'for-yank) + (save-restriction + (when insert-here? (narrow-to-region beg beg)) + (org-paste-subtree level template 'for-yank)) (org-capture-position-for-last-stored beg) (let ((end (if (org-at-heading-p) (line-end-position 0) (point)))) (org-capture-empty-lines-after) @@ -1163,10 +1173,11 @@ may have been stored before." (cond ((org-capture-get :exact-position) ;; User gave a specific position. Start ;; looking for lists from here. - (cons (save-excursion - (goto-char (org-capture-get :exact-position)) - (line-beginning-position)) - (org-entry-end-position))) + (org-with-point-at (org-capture-get :exact-position) + (cons (line-beginning-position) + (if (org-capture-get :insert-here) + (line-beginning-position) + (org-entry-end-position))))) ((org-capture-get :target-entry-p) ;; At a heading, limit search to its body. (cons (line-beginning-position 2) @@ -1189,7 +1200,8 @@ may have been stored before." ;; No list found. Move to the location when to insert ;; template. Skip planning info and properties drawers, if ;; any. - (goto-char (cond ((not prepend?) end) + (goto-char (cond ((org-capture-get :insert-here) beg) + ((not prepend?) end) ((org-before-first-heading-p) beg) (t (max (save-excursion (org-end-of-meta-data) @@ -1271,8 +1283,10 @@ may have been stored before." beg end) (cond ((org-capture-get :exact-position) - (setq beg (org-capture-get :exact-position)) - (setq end (save-excursion (outline-next-heading) (point)))) + (org-with-point-at (org-capture-get :exact-position) + (setq beg (line-beginning-position)) + (setq end (if (org-capture-get :insert-here) beg + (org-entry-end-position))))) ((not (org-capture-get :target-entry-p)) ;; Table is not necessarily under a heading. Find first table ;; in the buffer. @@ -1298,10 +1312,11 @@ may have been stored before." (goto-char end) (unless (bolp) (insert "\n")) (let ((origin (point))) - (insert "| |\n|----|\n") + (insert "| |\n|---|\n") (narrow-to-region origin (point)))) ;; In the current table, find the appropriate location for TEXT. (cond + ((org-capture-get :insert-here) nil) ((and table-line-pos (string-match "\\(I+\\)\\([-+][0-9]+\\)" table-line-pos)) (goto-char (point-min)) @@ -1447,44 +1462,6 @@ Point will remain at the first line after the inserted text." (defvar org-clock-marker) ; Defined in org.el -(defun org-capture-insert-template-here () - "Insert the capture template at point." - (let* ((template (org-capture-get :template)) - (type (org-capture-get :type)) - beg end pp) - (unless (bolp) (insert "\n")) - (setq beg (point)) - (cond - ((and (eq type 'entry) (derived-mode-p 'org-mode)) - (org-capture-verify-tree (org-capture-get :template)) - (org-paste-subtree nil template t)) - ((and (memq type '(item checkitem)) - (derived-mode-p 'org-mode) - (save-excursion (skip-chars-backward " \t\n") - (setq pp (point)) - (org-in-item-p))) - (goto-char pp) - (org-insert-item) - (skip-chars-backward " ") - (skip-chars-backward "-+*0123456789).") - (delete-region (point) (point-at-eol)) - (setq beg (point)) - (org-remove-indentation template) - (insert template) - (org-capture-empty-lines-after) - (goto-char beg) - (org-list-repair) - (org-end-of-item)) - (t - (insert template) - (org-capture-empty-lines-after) - (skip-chars-forward " \t\n") - (unless (eobp) (beginning-of-line)))) - (setq end (point)) - (goto-char beg) - (when (re-search-forward "%\\?" end t) - (replace-match "")))) - (defun org-capture-set-plist (entry) "Initialize the property list from the template definition." (setq org-capture-plist (copy-sequence (nthcdr 5 entry))) @@ -1592,14 +1569,14 @@ The template may still contain \"%?\" for cursor positioning." (replace-match "[[\\1][%^{Link description}]]" nil nil v-a) v-a)) (v-l (if (and v-a (string-match l-re v-a)) - (replace-match "\\1" nil nil v-a) + (replace-match "[[\\1]]" nil nil v-a) v-a)) (v-n user-full-name) (v-k (if (marker-buffer org-clock-marker) (org-no-properties org-clock-heading) "")) (v-K (if (marker-buffer org-clock-marker) - (org-make-link-string + (org-link-make-string (format "%s::*%s" (buffer-file-name (marker-buffer org-clock-marker)) v-k) diff --git a/elpa/org-20191028/org-clock.el b/elpa/org-20200127/org-clock.el similarity index 95% rename from elpa/org-20191028/org-clock.el rename to elpa/org-20200127/org-clock.el index 1761f693..a95c8543 100644 --- a/elpa/org-20191028/org-clock.el +++ b/elpa/org-20200127/org-clock.el @@ -1,6 +1,6 @@ ;;; org-clock.el --- The time clocking code for Org mode -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -35,13 +35,17 @@ (declare-function notifications-notify "notifications" (&rest params)) (declare-function org-element-property "org-element" (property element)) (declare-function org-element-type "org-element" (element)) +(declare-function org-link-display-format "ol" (s)) +(declare-function org-link-heading-search-string "ol" (&optional string)) +(declare-function org-link-make-string "ol" (link &optional description)) (declare-function org-table-goto-line "org-table" (n)) +(declare-function org-dynamic-block-define "org" (type func)) -(defvar org-frame-title-format-backup frame-title-format) +(defvar org-frame-title-format-backup nil) (defvar org-state) +(defvar org-link-bracket-re) (defvar org-time-stamp-formats) - (defgroup org-clock nil "Options concerning clocking working time in Org mode." :tag "Org Clock" @@ -303,6 +307,7 @@ string as argument." :link nil :narrow '40! :indent t + :hidefiles nil :formula nil :timestamp nil :level nil @@ -524,8 +529,7 @@ cannot be translated." (cond ((functionp org-clock-heading-function) (funcall org-clock-heading-function)) ((org-before-first-heading-p) "???") - (t (replace-regexp-in-string - org-bracket-link-analytic-regexp "\\5" + (t (org-link-display-format (org-no-properties (org-get-heading t t t t)))))) (defun org-clock-menu () @@ -804,6 +808,7 @@ If PLAY-SOUND is non-nil, it overrides `org-clock-sound'." "Show notification. Use `org-show-notification-handler' if defined, use libnotify if available, or fall back on a message." + (ignore-errors (require 'notifications)) (cond ((functionp org-show-notification-handler) (funcall org-show-notification-handler notification)) ((stringp org-show-notification-handler) @@ -1352,6 +1357,7 @@ the default behavior." ;; add to frame title (when (or (eq org-clock-clocked-in-display 'frame-title) (eq org-clock-clocked-in-display 'both)) + (setq org-frame-title-format-backup frame-title-format) (setq frame-title-format org-clock-frame-title-format)) (org-clock-update-mode-line) (when org-clock-mode-line-timer @@ -1542,6 +1548,14 @@ line and position cursor in that line." (org-log-states-order-reversed (goto-char (car (last positions)))) (t (goto-char (car positions)))))))) +(defun org-clock-restore-frame-title-format () + "Restore `frame-title-format' from `org-frame-title-format-backup'. +`frame-title-format' is restored if `org-frame-title-format-backup' is not nil +and current `frame-title-format' is equal to `org-clock-frame-title-format'." + (when (and org-frame-title-format-backup + (equal frame-title-format org-clock-frame-title-format)) + (setq frame-title-format org-frame-title-format-backup))) + ;;;###autoload (defun org-clock-out (&optional switch-to-state fail-quietly at-time) "Stop the currently running clock. @@ -1553,7 +1567,7 @@ to, overriding the existing value of `org-clock-out-switch-to-state'." (when (not (org-clocking-p)) (setq global-mode-string (delq 'org-mode-line-string global-mode-string)) - (setq frame-title-format org-frame-title-format-backup) + (org-clock-restore-frame-title-format) (force-mode-line-update) (if fail-quietly (throw 'exit t) (user-error "No active clock"))) (let ((org-clock-out-switch-to-state @@ -1609,7 +1623,7 @@ to, overriding the existing value of `org-clock-out-switch-to-state'." (setq org-clock-idle-timer nil)) (setq global-mode-string (delq 'org-mode-line-string global-mode-string)) - (setq frame-title-format org-frame-title-format-backup) + (org-clock-restore-frame-title-format) (when org-clock-out-switch-to-state (save-excursion (org-back-to-heading t) @@ -1709,7 +1723,7 @@ Optional argument N tells to change by that many units." (when (not (org-clocking-p)) (setq global-mode-string (delq 'org-mode-line-string global-mode-string)) - (setq frame-title-format org-frame-title-format-backup) + (org-clock-restore-frame-title-format) (force-mode-line-update) (error "No active clock")) (save-excursion ; Do not replace this with `with-current-buffer'. @@ -1723,9 +1737,10 @@ Optional argument N tells to change by that many units." (sit-for 2))) (move-marker org-clock-marker nil) (move-marker org-clock-hd-marker nil) + (setq org-clock-current-task nil) (setq global-mode-string (delq 'org-mode-line-string global-mode-string)) - (setq frame-title-format org-frame-title-format-backup) + (org-clock-restore-frame-title-format) (force-mode-line-update) (message "Clock canceled") (run-hooks 'org-clock-cancel-hook)) @@ -2053,6 +2068,8 @@ in the buffer and update it." (start (goto-char start))) (org-update-dblock)) +(org-dynamic-block-define "clocktable" #'org-clock-report) + (defun org-day-of-week (day month year) "Return the day of the week as an integer." (nth 6 @@ -2391,6 +2408,7 @@ the currently selected interval size." (ws (plist-get params :wstart)) (ms (plist-get params :mstart)) (step (plist-get params :step)) + (hide-files (plist-get params :hidefiles)) (formatter (or (plist-get params :formatter) org-clock-clocktable-formatter 'org-clocktable-write-default)) @@ -2445,7 +2463,9 @@ the currently selected interval size." ;; Even though `file-with-archives' can consist of ;; multiple files, we consider this is one extended file ;; instead. - (and (consp files) (not (eq scope 'file-with-archives))))) + (and (not hide-files) + (consp files) + (not (eq scope 'file-with-archives))))) (funcall formatter origin @@ -2616,12 +2636,12 @@ from the dynamic block definition." (when narrow-cut-p (setq headline (if (and (string-match - (format "\\`%s\\'" org-bracket-link-regexp) + (format "\\`%s\\'" org-link-bracket-re) headline) - (match-end 3)) + (match-end 2)) (format "[[%s][%s]]" (match-string 1 headline) - (org-shorten-string (match-string 3 headline) + (org-shorten-string (match-string 2 headline) narrow)) (org-shorten-string headline narrow)))) (cl-flet ((format-field (f) (format (cond ((not emph) "%s |") @@ -2689,80 +2709,88 @@ LEVEL is an integer. Indent by two spaces per level above 1." (if (= level 1) "" (concat "\\_" (make-string (* 2 (1- level)) ?\s)))) -(defun org-clocktable-increment-day (ts &optional n) - "Increment day in TS by N (defaulting to 1). -The TS argument has the same type as the return values of -`float-time' or `current-time'." - (let ((tsd (org-decode-time ts))) - (cl-incf (nth 3 tsd) (or n 1)) - (setf (nth 8 tsd) nil) ; no time zone: increasing day skips one whole day - (apply 'encode-time tsd))) - (defun org-clocktable-steps (params) - "Step through the range to make a number of clock tables." - (let* ((ts (plist-get params :tstart)) - (te (plist-get params :tend)) - (ws (plist-get params :wstart)) - (ms (plist-get params :mstart)) - (step0 (plist-get params :step)) - (stepskip0 (plist-get params :stepskip0)) - (block (plist-get params :block)) - cc tsb) - (when block - (setq cc (org-clock-special-range block nil t ws ms) - ts (or (car cc) - ;; The year Org was born. - "<2003-01-01 Thu 00:00>") - te (nth 1 cc))) - (cond - ((numberp ts) - ;; If ts is a number, it's an absolute day number from - ;; org-agenda. - (pcase-let ((`(,month ,day ,year) (calendar-gregorian-from-absolute ts))) - (setq ts (float-time (encode-time 0 0 0 day month year))))) - (ts (setq ts (org-matcher-time ts)))) - (cond - ((numberp te) - ;; Likewise for te. - (pcase-let ((`(,month ,day ,year) (calendar-gregorian-from-absolute te))) - (setq te (float-time (encode-time 0 0 0 day month year))))) - (te (setq te (org-matcher-time te)))) - (setq tsb - (if (eq step0 'week) - (let ((dow (nth 6 (org-decode-time ts)))) - (if (<= dow ws) ts - (float-time (org-clocktable-increment-day ts ; decrement - (- ws dow))))) - ts)) - (while (< tsb te) + "Create one or more clock tables, according to PARAMS. +Step through the range specifications in plist PARAMS to make +a number of clock tables." + (let* ((ignore-empty-tables (plist-get params :stepskip0)) + (step (plist-get params :step)) + (step-header + (pcase step + (`day "Daily report: ") + (`week "Weekly report starting on: ") + (`month "Monthly report starting on: ") + (`year "Annual report starting on: ") + (_ (user-error "Unknown `:step' specification: %S" step)))) + (week-start (or (plist-get params :wstart) 1)) + (month-start (or (plist-get params :mstart) 1)) + (range + (pcase (plist-get params :block) + (`nil nil) + (range + (org-clock-special-range range nil t week-start month-start)))) + ;; For both START and END, any number is an absolute day + ;; number from Agenda. Otherwise, consider value to be an Org + ;; timestamp string. The `:block' property has precedence + ;; over `:tstart' and `:tend'. + (start + (pcase (if range (car range) (plist-get params :tstart)) + ((and (pred numberp) n) + (pcase-let ((`(,m ,d ,y) (calendar-gregorian-from-absolute n))) + (apply #'encode-time (list 0 0 org-extend-today-until d m y)))) + (timestamp + (seconds-to-time + (org-matcher-time (or timestamp + ;; The year Org was born. + "<2003-01-01 Thu 00:00>")))))) + (end + (pcase (if range (nth 1 range) (plist-get params :tend)) + ((and (pred numberp) n) + (pcase-let ((`(,m ,d ,y) (calendar-gregorian-from-absolute n))) + (apply #'encode-time (list 0 0 org-extend-today-until d m y)))) + (timestamp (seconds-to-time (org-matcher-time timestamp)))))) + (while (time-less-p start end) (unless (bolp) (insert "\n")) - (let* ((start-time (max tsb ts)) - (dow (nth 6 (org-decode-time tsb))) - (days-to-skip (cond ((eq step0 'day) 1) - ;; else 'week: - ((= dow ws) 7) - (t (- ws dow))))) - (setq tsb (float-time (org-clocktable-increment-day tsb days-to-skip))) - (insert "\n" - (if (eq step0 'day) "Daily report: " - "Weekly report starting on: ") - (org-format-time-string (org-time-stamp-format nil t) start-time) - "\n") - (let ((table-begin (line-beginning-position 0)) - (step-time - (org-dblock-write:clocktable - (org-combine-plists - params - (list - :header "" :step nil :block nil - :tstart (org-format-time-string (org-time-stamp-format t t) - start-time) - :tend (org-format-time-string (org-time-stamp-format t t) - (min te tsb))))))) - (re-search-forward "^[ \t]*#\\+END:") - (when (and stepskip0 (equal step-time 0)) - ;; Remove the empty table - (delete-region (line-beginning-position) table-begin)))) + ;; Insert header before each clock table. + (insert "\n" + step-header + (format-time-string (org-time-stamp-format nil t) start) + "\n") + ;; Compute NEXT, which is the end of the current clock table, + ;; according to step. + (let* ((next + (apply #'encode-time + (pcase-let + ((`(,_ ,_ ,_ ,d ,m ,y ,dow . ,_) (decode-time start))) + (pcase step + (`day (list 0 0 org-extend-today-until (1+ d) m y)) + (`week + (let ((offset (if (= dow week-start) 7 + (mod (- week-start dow) 7)))) + (list 0 0 org-extend-today-until (+ d offset) m y))) + (`month (list 0 0 0 month-start (1+ m) y)) + (`year (list 0 0 org-extend-today-until 1 1 (1+ y))))))) + (table-begin (line-beginning-position 0)) + (step-time + ;; Write clock table between START and NEXT. + (org-dblock-write:clocktable + (org-combine-plists + params (list :header "" + :step nil + :block nil + :tstart (format-time-string + (org-time-stamp-format t t) + start) + :tend (format-time-string + (org-time-stamp-format t t) + ;; Never include clocks past END. + (if (time-less-p end next) end next))))))) + (let ((case-fold-search t)) (re-search-forward "^[ \t]*#\\+END:")) + ;; Remove the table if it is empty and `:stepskip0' is + ;; non-nil. + (when (and ignore-empty-tables (equal step-time 0)) + (delete-region (line-beginning-position) table-begin)) + (setq start next)) (end-of-line 0)))) (defun org-clock-get-table-data (file params) @@ -2846,8 +2874,8 @@ PROPERTIES: The list properties specified in the `:properties' parameter (hdl (if (not link) headline (let ((search - (org-make-org-heading-search-string headline))) - (org-make-link-string + (org-link-heading-search-string headline))) + (org-link-make-string (if (not (buffer-file-name)) search (format "file:%s::%s" (buffer-file-name) search)) ;; Prune statistics cookies. Replace diff --git a/elpa/org-20191028/org-colview.el b/elpa/org-20200127/org-colview.el similarity index 97% rename from elpa/org-20191028/org-colview.el rename to elpa/org-20200127/org-colview.el index 27120dd5..e967154a 100644 --- a/elpa/org-20191028/org-colview.el +++ b/elpa/org-20200127/org-colview.el @@ -1,6 +1,6 @@ ;;; org-colview.el --- Column View in Org -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -41,6 +41,9 @@ (declare-function org-element-property "org-element" (property element)) (declare-function org-element-restriction "org-element" (element)) (declare-function org-element-type "org-element" (element)) +(declare-function org-dynamic-block-define "org" (type func)) +(declare-function org-link-display-format "ol" (s)) +(declare-function org-link-open-from-string "ol" (s &optional arg)) (defvar org-agenda-columns-add-appointments-to-effort-sum) (defvar org-agenda-columns-compute-summary-properties) @@ -253,7 +256,7 @@ value for ITEM property." (concat (make-string (1- (org-current-level)) (if org-hide-leading-stars ?\s ?*)) "* ")))) - (concat stars (org-columns-compact-links value)))) + (concat stars (org-link-display-format value)))) (`(,_ ,_ ,_ ,_ nil) value) ;; If PRINTF is set, assume we are displaying a number and ;; obey to the format string. @@ -517,14 +520,6 @@ for the duration of the command.") (when (local-variable-p 'org-colview-initial-truncate-line-value) (setq truncate-lines org-colview-initial-truncate-line-value)))) -(defun org-columns-compact-links (s) - "Replace [[link][desc]] with [desc] or [link]." - (while (string-match org-bracket-link-regexp s) - (setq s (replace-match - (concat "[" (match-string (if (match-end 3) 3 1) s) "]") - t t s))) - s) - (defun org-columns-show-value () "Show the full value of the property." (interactive) @@ -570,7 +565,9 @@ for the duration of the command.") (defvar org-overriding-columns-format nil "When set, overrides any other format definition for the agenda. Don't set this, this is meant for dynamic scoping. Set -`org-local-columns-format' instead.") +`org-columns-default-format' and `org-columns-default-format-for-agenda' +instead. You should use this variable only in the local settings +section for a custom agenda view.") (defvar-local org-local-columns-format nil "When set, overrides any other format definition for the agenda. @@ -772,7 +769,7 @@ around it." (defun org-columns-open-link (&optional arg) (interactive "P") (let ((value (get-char-property (point) 'org-columns-value))) - (org-open-link-from-string value arg))) + (org-link-open-from-string value arg))) ;;;###autoload (defun org-columns-get-format-and-top-level () @@ -1132,16 +1129,7 @@ as a canonical duration, i.e., using units defined in "Apply FUN to time values TIMES. Return the result as a duration." (org-duration-from-minutes - (apply fun - (mapcar (lambda (time) - ;; Unlike to `org-duration-to-minutes' standard - ;; behavior, we want to consider plain numbers as - ;; hours. As a consequence, we treat them - ;; differently. - (if (string-match-p "\\`[0-9]+\\(?:\\.[0-9]*\\)?\\'" time) - (* 60 (string-to-number time)) - (org-duration-to-minutes time))) - times)) + (apply fun (mapcar #'org-duration-to-minutes times)) (org-duration-h:mm-only-p times))) (defun org-columns--compute-spec (spec &optional update) @@ -1262,7 +1250,7 @@ When PRINTF is non-nil, use it to format the result." "Summarize CHECK-BOXES with a check-box cookie." (format "[%d/%d]" (cl-count-if (lambda (b) (or (equal b "[X]") - (string-match-p "\\[\\([1-9]\\)/\\1\\]" b))) + (string-match-p "\\[\\([1-9]\\)/\\1\\]" b))) check-boxes) (length check-boxes))) @@ -1348,14 +1336,15 @@ and variances (respectively) of the individual estimates." ;;; Dynamic block for Column view -(defun org-columns--capture-view (maxlevel match skip-empty format local) +(defun org-columns--capture-view (maxlevel match skip-empty exclude-tags format local) "Get the column view of the current buffer. MAXLEVEL sets the level limit. SKIP-EMPTY tells whether to skip empty rows, an empty row being one where all the column view -specifiers but ITEM are empty. FORMAT is a format string for -columns, or nil. When LOCAL is non-nil, only capture headings in -current subtree. +specifiers but ITEM are empty. EXCLUDE-TAGS is a list of tags +that will be excluded from the resulting view. FORMAT is a +format string for columns, or nil. When LOCAL is non-nil, only +capture headings in current subtree. This function returns a list containing the title row and all other rows. Each row is a list of fields, as strings, or @@ -1378,9 +1367,13 @@ other rows. Each row is a list of fields, as strings, or 'org-columns-value 'org-columns-value-modified))) row))) - (unless (and skip-empty - (let ((r (delete-dups (remove "" row)))) - (or (null r) (and has-item (= (length r) 1))))) + (unless (or + (and skip-empty + (let ((r (delete-dups (remove "" row)))) + (or (null r) (and has-item (= (length r) 1))))) + (and exclude-tags + (cl-some (lambda (tag) (member tag exclude-tags)) + (org-get-tags)))) (push (cons (org-reduced-level (org-current-level)) (nreverse row)) table))))) (or (and maxlevel (format "LEVEL<=%d" maxlevel)) @@ -1480,6 +1473,7 @@ PARAMS is a property list of parameters: (org-columns--capture-view (plist-get params :maxlevel) (plist-get params :match) (plist-get params :skip-empty-rows) + (plist-get params :exclude-tags) (plist-get params :format) view-pos)))))) (when table @@ -1556,6 +1550,7 @@ PARAMS is a property list of parameters: (id))))) (org-update-dblock)) +(org-dynamic-block-define "columnview" #'org-columns-insert-dblock) ;;; Column view in the agenda @@ -1573,6 +1568,7 @@ PARAMS is a property list of parameters: (cond ((bound-and-true-p org-overriding-columns-format)) ((bound-and-true-p org-local-columns-format)) + ((bound-and-true-p org-columns-default-format-for-agenda)) ((let ((m (org-get-at-bol 'org-hd-marker))) (and m (or (org-entry-get m "COLUMNS" t) diff --git a/elpa/org-20191028/org-compat.el b/elpa/org-20200127/org-compat.el similarity index 92% rename from elpa/org-20191028/org-compat.el rename to elpa/org-20200127/org-compat.el index 7603f968..c1aaf17c 100644 --- a/elpa/org-20191028/org-compat.el +++ b/elpa/org-20200127/org-compat.el @@ -1,6 +1,6 @@ ;;; org-compat.el --- Compatibility Code for Older Emacsen -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -46,8 +46,8 @@ (declare-function org-end-of-subtree "org" (&optional invisible-ok to-heading)) (declare-function org-get-heading "org" (&optional no-tags no-todo no-priority no-comment)) (declare-function org-get-tags "org" (&optional pos local)) -(declare-function org-link-display-format "org" (s)) -(declare-function org-link-set-parameters "org" (type &rest rest)) +(declare-function org-link-display-format "ol" (s)) +(declare-function org-link-set-parameters "ol" (type &rest rest)) (declare-function org-log-into-drawer "org" ()) (declare-function org-make-tag-string "org" (tags)) (declare-function org-reduced-level "org" (l)) @@ -108,6 +108,10 @@ is nil)." (defalias 'org-line-number-display-width 'line-number-display-width) (defun org-line-number-display-width (&rest _) 0)) +(if (fboundp 'buffer-hash) + (defalias 'org-buffer-hash 'buffer-hash) + (defun org-buffer-hash () (md5 (current-buffer)))) + (unless (fboundp 'file-attribute-modification-time) (defsubst file-attribute-modification-time (attributes) "The modification time in ATTRIBUTES returned by `file-attributes'. @@ -302,6 +306,15 @@ Counting starts at 1." (define-obsolete-variable-alias 'org-effort-durations 'org-duration-units "Org 9.2") +(define-obsolete-function-alias 'org-toggle-latex-fragment 'org-latex-preview + "Org 9.3") + +(define-obsolete-function-alias 'org-remove-latex-fragment-image-overlays + 'org-clear-latex-preview "Org 9.3") + +(define-obsolete-variable-alias 'org-attach-directory + 'org-attach-id-dir "Org 9.3") + (defun org-in-fixed-width-region-p () "Non-nil if point in a fixed-width region." (save-match-data @@ -355,7 +368,7 @@ See `org-link-parameters' for documentation on the other parameters." ;;;; Functions unused in Org core. (defun org-table-recognize-table.el () "If there is a table.el table nearby, recognize it and move into it." - (when (and org-table-tab-recognizes-table.el (org-at-table.el-p)) + (when (org-at-table.el-p) (beginning-of-line) (unless (or (looking-at org-table-dataline-regexp) (not (looking-at org-table1-hline-regexp))) @@ -486,6 +499,84 @@ use of this function is for the stuck project list." (define-obsolete-variable-alias 'org-agenda-overriding-columns-format 'org-overriding-columns-format "Org 9.2.2") +(define-obsolete-variable-alias 'org-doi-server-url + 'org-link-doi-server-url "Org 9.3") + +(define-obsolete-variable-alias 'org-email-link-description-format + 'org-link-email-description-format "Org 9.3") + +(define-obsolete-variable-alias 'org-make-link-description-function + 'org-link-make-description-function "Org 9.3") + +(define-obsolete-variable-alias 'org-from-is-user-regexp + 'org-link-from-user-regexp "Org 9.3") + +(define-obsolete-variable-alias 'org-descriptive-links + 'org-link-descriptive "Org 9.3") + +(define-obsolete-variable-alias 'org-context-in-file-links + 'org-link-context-for-files "Org 9.3") + +(define-obsolete-variable-alias 'org-keep-stored-link-after-insertion + 'org-link-keep-stored-after-insertion "Org 9.3") + +(define-obsolete-variable-alias 'org-display-internal-link-with-indirect-buffer + 'org-link-use-indirect-buffer-for-internals "Org 9.3") + +(define-obsolete-variable-alias 'org-confirm-shell-link-function + 'org-link-shell-confirm-function "Org 9.3") + +(define-obsolete-variable-alias 'org-confirm-shell-link-not-regexp + 'org-link-shell-skip-confirm-regexp "Org 9.3") + +(define-obsolete-variable-alias 'org-confirm-elisp-link-function + 'org-link-elisp-confirm-function "Org 9.3") + +(define-obsolete-variable-alias 'org-confirm-elisp-link-not-regexp + 'org-link-elisp-skip-confirm-regexp "Org 9.3") + +(define-obsolete-function-alias 'org-file-complete-link + 'org-link-complete-file "Org 9.3") + +(define-obsolete-function-alias 'org-email-link-description + 'org-link-email-description "Org 9.3") + +(define-obsolete-function-alias 'org-make-link-string + 'org-link-make-string "Org 9.3") + +(define-obsolete-function-alias 'org-store-link-props + 'org-link-store-props "Org 9.3") + +(define-obsolete-function-alias 'org-add-link-props + 'org-link-add-props "Org 9.3") + +(define-obsolete-function-alias 'org-make-org-heading-search-string + 'org-link-heading-search-string "Org 9.3") + +(define-obsolete-function-alias 'org-make-link-regexps + 'org-link-make-regexps "Org 9.3") + +(define-obsolete-variable-alias 'org-angle-link-re + 'org-link-angle-re "Org 9.3") + +(define-obsolete-variable-alias 'org-plain-link-re + 'org-link-plain-re "Org 9.3") + +(define-obsolete-variable-alias 'org-bracket-link-regexp + 'org-link-bracket-re "Org 9.3") + +(define-obsolete-variable-alias 'org-bracket-link-analytic-regexp + 'org-link-bracket-re "Org 9.3") + +(define-obsolete-variable-alias 'org-any-link-re + 'org-link-any-re "Org 9.3") + +(define-obsolete-function-alias 'org-open-link-from-string + 'org-link-open-from-string "Org 9.3") + +(define-obsolete-function-alias 'org-add-angle-brackets + 'org-link-add-angle-brackets "Org 9.3") + ;; The function was made obsolete by commit 65399674d5 of 2013-02-22. ;; This make-obsolete call was added 2016-09-01. (make-obsolete 'org-capture-import-remember-templates @@ -535,7 +626,7 @@ use of this function is for the stuck project list." ;;;; Obsolete link types -(eval-after-load 'org +(eval-after-load 'ol '(progn (org-link-set-parameters "file+emacs") ;since Org 9.0 (org-link-set-parameters "file+sys"))) ;since Org 9.0 diff --git a/elpa/org-20191028/org-crypt.el b/elpa/org-20200127/org-crypt.el similarity index 99% rename from elpa/org-20191028/org-crypt.el rename to elpa/org-20200127/org-crypt.el index 9cd76c9e..4b46a314 100644 --- a/elpa/org-20191028/org-crypt.el +++ b/elpa/org-20200127/org-crypt.el @@ -1,5 +1,5 @@ ;;; org-crypt.el --- Public Key Encryption for Org Entries -*- lexical-binding: t; -*- -;; Copyright (C) 2007-2019 Free Software Foundation, Inc. +;; Copyright (C) 2007-2020 Free Software Foundation, Inc. ;; Emacs Lisp Archive Entry ;; Filename: org-crypt.el @@ -190,7 +190,7 @@ See `org-crypt-disable-auto-save'." (error (insert contents) (error (nth 1 err))))) (when folded (goto-char start-heading) - (outline-hide-subtree)) + (org-flag-subtree t)) nil))))) (defun org-decrypt-entry () diff --git a/elpa/org-20191028/org-ctags.el b/elpa/org-20200127/org-ctags.el similarity index 99% rename from elpa/org-20191028/org-ctags.el rename to elpa/org-20200127/org-ctags.el index 111be379..08885d26 100644 --- a/elpa/org-20191028/org-ctags.el +++ b/elpa/org-20200127/org-ctags.el @@ -1,6 +1,6 @@ ;;; org-ctags.el - Integrate Emacs "tags" Facility with Org -*- lexical-binding: t; -*- ;; -;; Copyright (C) 2007-2019 Free Software Foundation, Inc. +;; Copyright (C) 2007-2020 Free Software Foundation, Inc. ;; Author: Paul Sexton diff --git a/elpa/org-20191028/org-datetree.el b/elpa/org-20200127/org-datetree.el similarity index 99% rename from elpa/org-20191028/org-datetree.el rename to elpa/org-20200127/org-datetree.el index b4797de1..6469abef 100644 --- a/elpa/org-20191028/org-datetree.el +++ b/elpa/org-20200127/org-datetree.el @@ -1,6 +1,6 @@ ;;; org-datetree.el --- Create date entries in a tree -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp diff --git a/elpa/org-20191028/org-duration.el b/elpa/org-20200127/org-duration.el similarity index 99% rename from elpa/org-20191028/org-duration.el rename to elpa/org-20200127/org-duration.el index e350bc74..155bfae6 100644 --- a/elpa/org-20191028/org-duration.el +++ b/elpa/org-20200127/org-duration.el @@ -1,6 +1,6 @@ ;;; org-duration.el --- Library handling durations -*- lexical-binding: t; -*- -;; Copyright (C) 2017-2019 Free Software Foundation, Inc. +;; Copyright (C) 2017-2020 Free Software Foundation, Inc. ;; Author: Nicolas Goaziou ;; Keywords: outlines, hypermedia, calendar, wp diff --git a/elpa/org-20191028/org-element.el b/elpa/org-20200127/org-element.el similarity index 97% rename from elpa/org-20191028/org-element.el rename to elpa/org-20200127/org-element.el index 77b8f95a..2788a8b7 100644 --- a/elpa/org-20191028/org-element.el +++ b/elpa/org-20200127/org-element.el @@ -1,6 +1,6 @@ ;;; org-element.el --- Parser for Org Syntax -*- lexical-binding: t; -*- -;; Copyright (C) 2012-2019 Free Software Foundation, Inc. +;; Copyright (C) 2012-2020 Free Software Foundation, Inc. ;; Author: Nicolas Goaziou ;; Keywords: outlines, hypermedia, calendar, wp @@ -58,10 +58,54 @@ ;;; Code: -(require 'org) (require 'avl-tree) (require 'cl-lib) - +(require 'ol) +(require 'org) +(require 'org-compat) +(require 'org-entities) +(require 'org-footnote) +(require 'org-list) +(require 'org-macs) +(require 'org-table) + +(declare-function org-at-heading-p "org" (&optional _)) +(declare-function org-end-of-subtree "org" (&optional invisible-ok to-heading)) +(declare-function org-escape-code-in-string "org-src" (s)) +(declare-function org-macro-escape-arguments "org-macro" (&rest args)) +(declare-function org-macro-extract-arguments "org-macro" (s)) +(declare-function org-reduced-level "org" (l)) +(declare-function org-unescape-code-in-string "org-src" (s)) +(declare-function outline-next-heading "outline" ()) +(declare-function outline-previous-heading "outline" ()) + +(defvar org-archive-tag) +(defvar org-clock-line-re) +(defvar org-closed-string) +(defvar org-comment-string) +(defvar org-complex-heading-regexp) +(defvar org-dblock-start-re) +(defvar org-deadline-string) +(defvar org-done-keywords) +(defvar org-drawer-regexp) +(defvar org-edit-src-content-indentation) +(defvar org-emph-re) +(defvar org-emphasis-regexp-components) +(defvar org-keyword-time-not-clock-regexp) +(defvar org-match-substring-regexp) +(defvar org-odd-levels-only) +(defvar org-outline-regexp-bol) +(defvar org-planning-line-re) +(defvar org-property-drawer-re) +(defvar org-property-format) +(defvar org-property-re) +(defvar org-scheduled-string) +(defvar org-src-preserve-indentation) +(defvar org-tags-column) +(defvar org-time-stamp-formats) +(defvar org-todo-regexp) +(defvar org-ts-regexp-both) +(defvar org-verbatim-re) ;;; Definitions And Rules @@ -91,7 +135,7 @@ specially in `org-element--object-lex'.") (setq org-element-paragraph-separate (concat "^\\(?:" ;; Headlines, inlinetasks. - org-outline-regexp "\\|" + "\\*+ " "\\|" ;; Footnote definitions. "\\[fn:[-_[:word:]]+\\]" "\\|" ;; Diary sexps. @@ -117,7 +161,7 @@ specially in `org-element--object-lex'.") ;; LaTeX environments. "\\\\begin{\\([A-Za-z0-9*]+\\)}" "\\|" ;; Clock lines. - (regexp-quote org-clock-string) "\\|" + "CLOCK:" "\\|" ;; Lists. (let ((term (pcase org-plain-list-ordered-item-terminator (?\) ")") (?. "\\.") (_ "[.)]"))) @@ -928,7 +972,7 @@ Return value is a plist." Return a list whose CAR is `headline' and CDR is a plist containing `:raw-value', `:title', `:begin', `:end', `:pre-blank', `:contents-begin' and `:contents-end', `:level', -`:priority', `:tags', `:todo-keyword',`:todo-type', `:scheduled', +`:priority', `:tags', `:todo-keyword', `:todo-type', `:scheduled', `:deadline', `:closed', `:archivedp', `:commentedp' `:footnote-section-p', `:post-blank' and `:post-affiliated' keywords. @@ -1723,7 +1767,7 @@ Return a list whose CAR is `clock' and CDR is a plist containing (save-excursion (let* ((case-fold-search nil) (begin (point)) - (value (progn (search-forward org-clock-string (line-end-position) t) + (value (progn (search-forward "CLOCK:" (line-end-position) t) (skip-chars-forward " \t") (org-element-timestamp-parser))) (duration (and (search-forward " => " (line-end-position) t) @@ -1748,7 +1792,7 @@ Return a list whose CAR is `clock' and CDR is a plist containing (defun org-element-clock-interpreter (clock _) "Interpret CLOCK element as Org syntax." - (concat org-clock-string " " + (concat "CLOCK: " (org-element-timestamp-interpreter (org-element-property :value clock) nil) (let ((duration (org-element-property :duration clock))) @@ -2834,7 +2878,7 @@ Assume point is at the beginning of the snippet." When at a footnote reference, return a list whose car is `footnote-reference' and cdr a plist with `:label', `:type', -`:begin', `:end', `:content-begin', `:contents-end' and +`:begin', `:end', `:contents-begin', `:contents-end' and `:post-blank' as keywords. Otherwise, return nil." (when (looking-at org-footnote-re) (let ((closing (with-syntax-table org-element--pair-square-table @@ -3097,10 +3141,10 @@ Assume point is at the beginning of the link." (setq contents-begin (match-beginning 1)) (setq contents-end (match-end 1))) ;; Type 2: Standard link, i.e. [[https://orgmode.org][homepage]] - ((looking-at org-bracket-link-regexp) + ((looking-at org-link-bracket-re) (setq format 'bracket) - (setq contents-begin (match-beginning 3)) - (setq contents-end (match-end 3)) + (setq contents-begin (match-beginning 2)) + (setq contents-end (match-end 2)) (setq link-end (match-end 0)) ;; RAW-LINK is the original link. Decode any encoding. ;; Expand any abbreviation in it. @@ -3147,7 +3191,7 @@ Assume point is at the beginning of the link." (setq type "fuzzy") (setq path raw-link)))) ;; Type 3: Plain link, e.g., https://orgmode.org - ((looking-at org-plain-link-re) + ((looking-at org-link-plain-re) (setq format 'plain) (setq raw-link (match-string-no-properties 0)) (setq type (match-string-no-properties 1)) @@ -3156,7 +3200,7 @@ Assume point is at the beginning of the link." ;; Type 4: Angular link, e.g., . Unlike to ;; bracket links, follow RFC 3986 and remove any extra ;; whitespace in URI. - ((looking-at org-angle-link-re) + ((looking-at org-link-angle-re) (setq format 'angle) (setq type (match-string-no-properties 1)) (setq link-end (match-end 0)) @@ -3854,7 +3898,8 @@ element it has to parse." ((org-at-heading-p) (org-element-inlinetask-parser limit raw-secondary-p)) ;; From there, elements can have affiliated keywords. - (t (let ((affiliated (org-element--collect-affiliated-keywords limit))) + (t (let ((affiliated (org-element--collect-affiliated-keywords + limit (memq granularity '(nil object))))) (cond ;; Jumping over affiliated keywords put point off-limits. ;; Parse them as regular keywords. @@ -3940,7 +3985,7 @@ element it has to parse." ;; that element, and, in the meantime, collect information they give ;; into appropriate properties. Hence the following function. -(defun org-element--collect-affiliated-keywords (limit) +(defun org-element--collect-affiliated-keywords (limit parse) "Collect affiliated keywords from point down to LIMIT. Return a list whose CAR is the position at the first of them and @@ -3949,13 +3994,16 @@ beginning of the first line after them. As a special case, if element doesn't start at the beginning of the line (e.g., a paragraph starting an item), CAR is current -position of point and CDR is nil." +position of point and CDR is nil. + +When PARSE is non-nil, values from keywords belonging to +`org-element-parsed-keywords' are parsed as secondary strings." (if (not (bolp)) (list (point)) (let ((case-fold-search t) (origin (point)) ;; RESTRICT is the list of objects allowed in parsed - ;; keywords value. - (restrict (org-element-restriction 'keyword)) + ;; keywords value. If PARSE is nil, no object is allowed. + (restrict (and parse (org-element-restriction 'keyword))) output) (while (and (< (point) limit) (looking-at org-element--affiliated-re)) (let* ((raw-kwd (upcase (match-string 1))) @@ -3964,35 +4012,35 @@ position of point and CDR is nil." (kwd (or (cdr (assoc raw-kwd org-element-keyword-translation-alist)) raw-kwd)) + ;; PARSED? is non-nil when keyword should have its + ;; value parsed. + (parsed? (member kwd org-element-parsed-keywords)) ;; Find main value for any keyword. (value - (save-match-data - (org-trim - (buffer-substring-no-properties - (match-end 0) (line-end-position))))) - ;; PARSEDP is non-nil when keyword should have its - ;; value parsed. - (parsedp (member kwd org-element-parsed-keywords)) - ;; If KWD is a dual keyword, find its secondary - ;; value. Maybe parse it. - (dualp (member kwd org-element-dual-keywords)) + (let ((beg (match-end 0)) + (end (save-excursion + (end-of-line) + (skip-chars-backward " \t") + (point)))) + (if parsed? + (org-element--parse-objects beg end nil restrict) + (org-trim (buffer-substring-no-properties beg end))))) + ;; If KWD is a dual keyword, find its secondary value. + ;; Maybe parse it. + (dual? (member kwd org-element-dual-keywords)) (dual-value - (and dualp + (and dual? (let ((sec (match-string-no-properties 2))) - (if (or (not sec) (not parsedp)) sec + (cond + ((and sec parsed?) (save-match-data (org-element--parse-objects - (match-beginning 2) (match-end 2) nil restrict)))))) + (match-beginning 2) (match-end 2) nil restrict))) + (sec sec))))) ;; Attribute a property name to KWD. (kwd-sym (and kwd (intern (concat ":" (downcase kwd)))))) ;; Now set final shape for VALUE. - (when parsedp - (setq value - (org-element--parse-objects - (match-end 0) - (progn (end-of-line) (skip-chars-backward " \t") (point)) - nil restrict))) - (when dualp + (when dual? (setq value (and (or value dual-value) (cons value dual-value)))) (when (or (member kwd org-element-multiple-keywords) ;; Attributes can always appear on multiple lines. @@ -4312,54 +4360,52 @@ elements. Elements are accumulated into ACC." (save-excursion (goto-char beg) - ;; Visible only: skip invisible parts at the beginning of the - ;; element. - (when (and visible-only (org-invisible-p2)) - (goto-char (min (1+ (org-find-visible)) end))) ;; When parsing only headlines, skip any text before first one. (when (and (eq granularity 'headline) (not (org-at-heading-p))) (org-with-limited-levels (outline-next-heading))) (let (elements) (while (< (point) end) - ;; Find current element's type and parse it accordingly to - ;; its category. - (let* ((element (org-element--current-element - end granularity mode structure)) - (type (org-element-type element)) - (cbeg (org-element-property :contents-begin element))) - (goto-char (org-element-property :end element)) - ;; Visible only: skip invisible parts between siblings. - (when (and visible-only (org-invisible-p2)) - (goto-char (min (1+ (org-find-visible)) end))) - ;; Fill ELEMENT contents by side-effect. - (cond - ;; If element has no contents, don't modify it. - ((not cbeg)) - ;; Greater element: parse it between `contents-begin' and - ;; `contents-end'. Make sure GRANULARITY allows the - ;; recursion, or ELEMENT is a headline, in which case going - ;; inside is mandatory, in order to get sub-level headings. - ((and (memq type org-element-greater-elements) - (or (memq granularity '(element object nil)) - (and (eq granularity 'greater-element) - (eq type 'section)) - (eq type 'headline))) - (org-element--parse-elements - cbeg (org-element-property :contents-end element) - ;; Possibly switch to a special mode. - (org-element--next-mode type t) - (and (memq type '(item plain-list)) - (org-element-property :structure element)) - granularity visible-only element)) - ;; ELEMENT has contents. Parse objects inside, if - ;; GRANULARITY allows it. - ((memq granularity '(object nil)) - (org-element--parse-objects - cbeg (org-element-property :contents-end element) element - (org-element-restriction type)))) - (push (org-element-put-property element :parent acc) elements) - ;; Update mode. - (setq mode (org-element--next-mode type nil)))) + ;; Visible only: skip invisible parts due to folding. + (if (and visible-only (org-invisible-p nil t)) + (progn + (goto-char (org-find-visible)) + (when (and (eolp) (not (eobp))) (forward-char))) + ;; Find current element's type and parse it accordingly to + ;; its category. + (let* ((element (org-element--current-element + end granularity mode structure)) + (type (org-element-type element)) + (cbeg (org-element-property :contents-begin element))) + (goto-char (org-element-property :end element)) + ;; Fill ELEMENT contents by side-effect. + (cond + ;; If element has no contents, don't modify it. + ((not cbeg)) + ;; Greater element: parse it between `contents-begin' and + ;; `contents-end'. Ensure GRANULARITY allows recursion, + ;; or ELEMENT is a headline, in which case going inside + ;; is mandatory, in order to get sub-level headings. + ((and (memq type org-element-greater-elements) + (or (memq granularity '(element object nil)) + (and (eq granularity 'greater-element) + (eq type 'section)) + (eq type 'headline))) + (org-element--parse-elements + cbeg (org-element-property :contents-end element) + ;; Possibly switch to a special mode. + (org-element--next-mode type t) + (and (memq type '(item plain-list)) + (org-element-property :structure element)) + granularity visible-only element)) + ;; ELEMENT has contents. Parse objects inside, if + ;; GRANULARITY allows it. + ((memq granularity '(object nil)) + (org-element--parse-objects + cbeg (org-element-property :contents-end element) element + (org-element-restriction type)))) + (push (org-element-put-property element :parent acc) elements) + ;; Update mode. + (setq mode (org-element--next-mode type nil))))) ;; Return result. (apply #'org-element-set-contents acc (nreverse elements))))) @@ -5513,7 +5559,7 @@ the process stopped before finding the expected result." (defconst org-element--cache-sensitive-re (concat - org-outline-regexp-bol "\\|" + "^\\*+ " "\\|" "\\\\end{[A-Za-z0-9*]+}[ \t]*$" "\\|" "^[ \t]*\\(?:" "#\\+\\(?:BEGIN[:_]\\|END\\(?:_\\|:?[ \t]*$\\)\\)" "\\|" diff --git a/elpa/org-20191028/org-entities.el b/elpa/org-20200127/org-entities.el similarity index 99% rename from elpa/org-20191028/org-entities.el rename to elpa/org-20200127/org-entities.el index a5c05eaa..e32ce269 100644 --- a/elpa/org-20191028/org-entities.el +++ b/elpa/org-20200127/org-entities.el @@ -1,6 +1,6 @@ ;;; org-entities.el --- Support for Special Entities -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik , ;; Ulf Stegemann diff --git a/elpa/org-20191028/org-faces.el b/elpa/org-20200127/org-faces.el similarity index 99% rename from elpa/org-20191028/org-faces.el rename to elpa/org-20200127/org-faces.el index b3e01fe8..30eab9bc 100644 --- a/elpa/org-20191028/org-faces.el +++ b/elpa/org-20200127/org-faces.el @@ -1,6 +1,6 @@ ;;; org-faces.el --- Face definitions -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -559,10 +559,6 @@ month and 365.24 days for a year)." "Face for tag(s) in the mode-line when filtering the agenda." :group 'org-faces) -(defface org-agenda-filter-regexp '((t :inherit mode-line)) - "Face for regexp(s) in the mode-line when filtering the agenda." - :group 'org-faces) - (defface org-agenda-filter-category '((t :inherit mode-line)) "Face for categories in the mode-line when filtering the agenda." :group 'org-faces) @@ -571,6 +567,10 @@ month and 365.24 days for a year)." "Face for effort in the mode-line when filtering the agenda." :group 'org-faces) +(defface org-agenda-filter-regexp '((t :inherit mode-line)) + "Face for regexp(s) in the mode-line when filtering the agenda." + :group 'org-faces) + (defface org-time-grid ;Copied from `font-lock-variable-name-face' '((((class color) (min-colors 16) (background light)) (:foreground "DarkGoldenrod")) (((class color) (min-colors 16) (background dark)) (:foreground "LightGoldenrod")) diff --git a/elpa/org-20191028/org-feed.el b/elpa/org-20200127/org-feed.el similarity index 99% rename from elpa/org-20191028/org-feed.el rename to elpa/org-20200127/org-feed.el index 0f186730..58bbba7c 100644 --- a/elpa/org-20191028/org-feed.el +++ b/elpa/org-20200127/org-feed.el @@ -1,6 +1,6 @@ ;;; org-feed.el --- Add RSS feed items to Org files -*- lexical-binding: t; -*- ;; -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -407,12 +407,12 @@ it can be a list structured like an entry in `org-feed-alist'." ;; Write the new status ;; We do this only now, in case something goes wrong above, so ;; that would would end up with a status that does not reflect - ;; which items truely have been handled + ;; which items truly have been handled (org-feed-write-status inbox-pos drawer status) ;; Normalize the visibility of the inbox tree (goto-char inbox-pos) - (outline-hide-subtree) + (org-flag-subtree t) (org-show-children) ;; Hooks and messages diff --git a/elpa/org-20191028/org-footnote.el b/elpa/org-20200127/org-footnote.el similarity index 99% rename from elpa/org-20191028/org-footnote.el rename to elpa/org-20200127/org-footnote.el index 4a296b13..14b0a2a0 100644 --- a/elpa/org-20191028/org-footnote.el +++ b/elpa/org-20200127/org-footnote.el @@ -1,6 +1,6 @@ ;;; org-footnote.el --- Footnote support in Org -*- lexical-binding: t; -*- ;; -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -56,7 +56,7 @@ (defvar electric-indent-mode) (defvar org-blank-before-new-entry) ; defined in org.el -(defvar org-bracket-link-regexp) ; defined in org.el +(defvar org-link-bracket-re) ; defined in org.el (defvar org-complex-heading-regexp) ; defined in org.el (defvar org-odd-levels-only) ; defined in org.el (defvar org-outline-regexp) ; defined in org.el @@ -489,7 +489,7 @@ This function is meant to be used for fontification only." (goto-char beg) (let ((linkp (save-match-data - (org-in-regexp org-bracket-link-regexp)))) + (org-in-regexp org-link-bracket-re)))) (and linkp (< (point) (cdr linkp)))))) ;; Verify point doesn't belong to a LaTeX macro. (not (org-inside-latex-macro-p)) diff --git a/elpa/org-20191028/org-goto.el b/elpa/org-20200127/org-goto.el similarity index 98% rename from elpa/org-20191028/org-goto.el rename to elpa/org-20200127/org-goto.el index a399899c..dd9c0fad 100644 --- a/elpa/org-20191028/org-goto.el +++ b/elpa/org-20200127/org-goto.el @@ -1,6 +1,6 @@ ;;; org-goto.el --- Fast navigation in an Org buffer -*- lexical-binding: t; -*- -;; Copyright (C) 2012-2019 Free Software Foundation, Inc. +;; Copyright (C) 2012-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -172,7 +172,6 @@ When nil, you can use these keybindings to navigate the buffer: (defun org-goto-local-auto-isearch () "Start isearch." (interactive) - (goto-char (point-min)) (let ((keys (this-command-keys))) (when (eq (lookup-key isearch-mode-map keys) 'isearch-printing-char) (isearch-mode t) @@ -228,7 +227,6 @@ position or nil." (isearch-hide-immediately nil) (isearch-search-fun-function (lambda () #'org-goto--local-search-headings)) - (org-goto-selected-point org-goto-exit-command) (help (or help org-goto-help))) (save-excursion (save-window-excursion diff --git a/elpa/org-20191028/org-habit.el b/elpa/org-20200127/org-habit.el similarity index 89% rename from elpa/org-20191028/org-habit.el rename to elpa/org-20200127/org-habit.el index d19ab1b8..ec99a8f0 100644 --- a/elpa/org-20191028/org-habit.el +++ b/elpa/org-20200127/org-habit.el @@ -1,6 +1,6 @@ ;;; org-habit.el --- The habit tracking code for Org -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; Author: John Wiegley ;; Keywords: outlines, hypermedia, calendar, wp @@ -89,6 +89,21 @@ It will be green even if it was done after the deadline." :group 'org-habit :type 'boolean) +(defcustom org-habit-scheduled-past-days nil +"Value to use instead of `org-scheduled-past-days', for habits only. + +If nil, `org-scheduled-past-days' is used. + +Setting this to say 10000 is a way to make habits always show up +as a reminder, even if you set `org-scheduled-past-days' to a +small value because you regard scheduled items as a way of +\"turning on\" TODO items on a particular date, rather than as a +means of creating calendar-based reminders." + :group 'org-habit + :type '(choice integer (const nil)) + :package-version '(Org . "9.3") + :safe (lambda (v) (or (integerp v) (null v)))) + (defface org-habit-clear-face '((((background light)) (:background "#8270f9")) (((background dark)) (:background "blue"))) @@ -373,31 +388,30 @@ current time." (throw :exit s)))))))))) donep))) markedp face) - (if donep - (let ((done-time (time-add - starting - (days-to-time - (- start (time-to-days starting)))))) - - (aset graph index org-habit-completed-glyph) - (setq markedp t) - (put-text-property - index (1+ index) 'help-echo - (format-time-string (org-time-stamp-format) done-time) graph) - (while (and done-dates - (= start (car done-dates))) - (setq last-done-date (car done-dates) - done-dates (cdr done-dates)))) - (if todayp - (aset graph index org-habit-today-glyph))) + (cond + (donep + (aset graph index org-habit-completed-glyph) + (setq markedp t) + (while (and done-dates (= start (car done-dates))) + (setq last-done-date (car done-dates)) + (setq done-dates (cdr done-dates)))) + (todayp + (aset graph index org-habit-today-glyph))) (setq face (if (or in-the-past-p todayp) (car faces) (cdr faces))) - (if (and in-the-past-p - (not (eq face 'org-habit-overdue-face)) - (not markedp)) - (setq face (cdr faces))) - (put-text-property index (1+ index) 'face face graph)) + (when (and in-the-past-p + (not (eq face 'org-habit-overdue-face)) + (not markedp)) + (setq face (cdr faces))) + (put-text-property index (1+ index) 'face face graph) + (put-text-property index (1+ index) + 'help-echo + (concat (format-time-string + (org-time-stamp-format) + (time-add starting (days-to-time (- start (time-to-days starting))))) + (if donep " DONE" "")) + graph)) (setq start (1+ start) index (1+ index))) graph)) @@ -435,7 +449,18 @@ current time." (message "Habits turned %s" (if org-habit-show-habits "on" "off"))) -(org-defkey org-agenda-mode-map "K" 'org-habit-toggle-habits) +(defun org-habit-toggle-display-in-agenda (arg) + "Toggle display of habits in agenda. +With ARG toggle display of all vs. undone scheduled habits. +See `org-habit-show-all-today'." + (interactive "P") + (if (not arg) + (org-habit-toggle-habits) + (org-agenda-check-type t 'agenda) + (setq org-habit-show-all-today (not org-habit-show-all-today)) + (when org-habit-show-habits (org-agenda-redo)))) + +(org-defkey org-agenda-mode-map "K" 'org-habit-toggle-display-in-agenda) (provide 'org-habit) diff --git a/elpa/org-20191028/org-id.el b/elpa/org-20200127/org-id.el similarity index 84% rename from elpa/org-20191028/org-id.el rename to elpa/org-20200127/org-id.el index ee131651..3efbde04 100644 --- a/elpa/org-20191028/org-id.el +++ b/elpa/org-20200127/org-id.el @@ -1,6 +1,6 @@ ;;; org-id.el --- Global identifiers for Org entries -*- lexical-binding: t; -*- ;; -;; Copyright (C) 2008-2019 Free Software Foundation, Inc. +;; Copyright (C) 2008-2020 Free Software Foundation, Inc. ;; ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -71,9 +71,11 @@ ;;; Code: (require 'org) +(require 'ol) (declare-function message-make-fqdn "message" ()) (declare-function org-goto-location "org-goto" (&optional _buf help)) +(declare-function org-link-set-parameters "ol" (type &rest rest)) ;;; Customization @@ -140,11 +142,15 @@ org Org's own internal method, using an encoding of the current time to uuid Create random (version 4) UUIDs. If the program defined in `org-id-uuid-program' is available it is used to create the ID. - Otherwise an internal functions is used." + Otherwise an internal functions is used. + +ts Create ID's based on ISO8601 timestamps (without separators + and without timezone, local time). Precision down to seconds." :group 'org-id :type '(choice (const :tag "Org's internal method" org) - (const :tag "external: uuidgen" uuid))) + (const :tag "external: uuidgen" uuid) + (const :tag "ISO8601 timestamp" ts))) (defcustom org-id-prefix nil "The prefix for IDs. @@ -161,7 +167,7 @@ to have no space characters in them." "Non-nil means add the domain name to new IDs. This ensures global uniqueness of IDs, and is also suggested by the relevant RFCs. This is relevant only if `org-id-method' is -`org'. When uuidgen is used, the domain will never be added. +`org' or `ts'. When uuidgen is used, the domain will never be added. The default is to not use this because we have no really good way to get the true domain, and Org entries will normally not be shared with enough @@ -189,6 +195,22 @@ This variable is only relevant when `org-id-track-globally' is set." :group 'org-id :type 'file) +(defcustom org-id-locations-file-relative nil + "Determines if org-id-locations should be stored as relative links. +Non-nil means that links to locations are stored as links +relative to the location of where `org-id-locations-file' is +stored. + +Nil means to store absolute paths to files. + +This customization is useful when folders are shared across +systems but mounted at different roots. Relative path to +`org-id-locations-file' still has to be maintained across +systems." + :group 'org-id + :type 'boolean + :package-version '(Org . "9.3")) + (defvar org-id-locations nil "List of files with IDs in those files.") @@ -350,6 +372,13 @@ So a typical ID could look like \"Org:4nd91V40HI\"." (require 'message) (concat "@" (message-make-fqdn)))))) (setq unique (concat etime postfix)))) + ((eq org-id-method 'ts) + (let ((ts (format-time-string "%Y%m%dT%H%M%S.%6N")) + (postfix (if org-id-include-domain + (progn + (require 'message) + (concat "@" (message-make-fqdn)))))) + (setq unique (concat ts postfix)))) (t (error "Invalid `org-id-method'"))) (concat prefix unique))) @@ -447,81 +476,56 @@ and TIME is a Lisp time value (HI LO USEC)." Store the relation between files and corresponding IDs. This will scan all agenda files, all associated archives, and all files currently mentioned in `org-id-locations'. -When FILES is given, scan these files instead." +When FILES is given, scan also these files." (interactive) (if (not org-id-track-globally) (error "Please turn on `org-id-track-globally' if you want to track IDs") - (let* ((org-id-search-archives - (or org-id-search-archives - (and (symbolp org-id-extra-files) - (symbol-value org-id-extra-files) - (member 'agenda-archives org-id-extra-files)))) - (files - (or files - (append - ;; Agenda files and all associated archives - (org-agenda-files t org-id-search-archives) - ;; Explicit extra files - (if (symbolp org-id-extra-files) - (symbol-value org-id-extra-files) - org-id-extra-files) - ;; Files associated with live Org buffers - (delq nil - (mapcar (lambda (b) - (with-current-buffer b - (and (derived-mode-p 'org-mode) (buffer-file-name)))) - (buffer-list))) - ;; All files known to have IDs - org-id-files))) - org-agenda-new-buffers - file nfiles tfile ids reg found id seen (ndup 0)) - (when (member 'agenda-archives files) - (setq files (delq 'agenda-archives (copy-sequence files)))) - (setq nfiles (length files)) - (while (setq file (pop files)) - (unless silent - (message "Finding ID locations (%d/%d files): %s" - (- nfiles (length files)) nfiles file)) - (setq tfile (file-truename file)) - (when (and (file-exists-p file) (not (member tfile seen))) - (push tfile seen) - (setq ids nil) - (with-current-buffer (org-get-agenda-file-buffer file) - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (while (re-search-forward "^[ \t]*:ID:[ \t]+\\(\\S-+\\)[ \t]*$" - nil t) - (setq id (match-string-no-properties 1)) - (if (member id found) - (progn - (message "Duplicate ID \"%s\", also in file %s" - id (or (car (delq - nil - (mapcar - (lambda (x) - (if (member id (cdr x)) - (car x))) - reg))) - (buffer-file-name))) - (when (= ndup 0) - (ding) - (sit-for 2)) - (setq ndup (1+ ndup))) - (push id found) - (push id ids))) - (push (cons (abbreviate-file-name file) ids) reg)))))) - (org-release-buffers org-agenda-new-buffers) - (setq org-agenda-new-buffers nil) - (setq org-id-locations reg) + (let* ((files (delete-dups + (mapcar #'file-truename + (append + ;; Agenda files and all associated archives + (org-agenda-files t org-id-search-archives) + ;; Explicit extra files + (unless (symbolp org-id-extra-files) + org-id-extra-files) + ;; All files known to have IDs + org-id-files + ;; function input + files)))) + (nfiles (length files)) + ids seen-ids (ndup 0) (i 0) file-id-alist) + (with-temp-buffer + (delay-mode-hooks + (org-mode) + (dolist (file files) + (unless silent + (setq i (1+ i)) + (message "Finding ID locations (%d/%d files): %s" + i nfiles file)) + (when (file-exists-p file) + (insert-file-contents file nil nil nil 'replace) + (setq ids (org-map-entries + (lambda () + (org-entry-get (point) "ID")) + "ID<>\"\"")) + (dolist (id ids) + (if (member id seen-ids) + (progn + (message "Duplicate ID \"%s\"" id) + (setq ndup (1+ ndup))) + (push id seen-ids))) + (when ids + (setq file-id-alist (cons (cons (abbreviate-file-name file) ids) + file-id-alist))))))) + (setq org-id-locations file-id-alist) (setq org-id-files (mapcar 'car org-id-locations)) - (org-id-locations-save) ;; this function can also handle the alist form + (org-id-locations-save) ;; now convert to a hash (setq org-id-locations (org-id-alist-to-hash org-id-locations)) - (if (> ndup 0) - (message "WARNING: %d duplicate IDs found, check *Messages* buffer" ndup) - (message "%d unique files scanned for IDs" (length org-id-files))) + (when (> ndup 0) + (warn "WARNING: %d duplicate IDs found, check *Messages* buffer" ndup)) + (message "%d files scanned, %d files contains IDs and in total %d IDs found." + nfiles (length org-id-files) (hash-table-count org-id-locations)) org-id-locations))) (defun org-id-locations-save () @@ -530,6 +534,16 @@ When FILES is given, scan these files instead." (let ((out (if (hash-table-p org-id-locations) (org-id-hash-to-alist org-id-locations) org-id-locations))) + (when (and org-id-locations-file-relative out) + (setq out (mapcar + (lambda (item) + (if (file-name-absolute-p (car item)) + (cons (file-relative-name + (car item) (file-name-directory + org-id-locations-file)) + (cdr item)) + item)) + out))) (with-temp-file org-id-locations-file (let ((print-level nil) (print-length nil)) @@ -543,7 +557,12 @@ When FILES is given, scan these files instead." (condition-case nil (progn (insert-file-contents org-id-locations-file) - (setq org-id-locations (read (current-buffer)))) + (setq org-id-locations (read (current-buffer))) + (let ((loc (file-name-directory org-id-locations-file))) + (mapc (lambda (item) + (unless (file-name-absolute-p (car item)) + (setf (car item) (expand-file-name (car item) loc)))) + org-id-locations))) (error (message "Could not read org-id-values from %s. Setting it to nil." org-id-locations-file)))) @@ -553,10 +572,12 @@ When FILES is given, scan these files instead." (defun org-id-add-location (id file) "Add the ID with location FILE to the database of ID locations." ;; Only if global tracking is on, and when the buffer has a file - (when (and org-id-track-globally id file) - (unless org-id-locations (org-id-locations-load)) - (puthash id (abbreviate-file-name file) org-id-locations) - (add-to-list 'org-id-files (abbreviate-file-name file)))) + (let ((afile (abbreviate-file-name file))) + (when (and org-id-track-globally id file) + (unless org-id-locations (org-id-locations-load)) + (puthash id afile org-id-locations) + (unless (member afile org-id-files) + (add-to-list 'org-id-files afile))))) (unless noninteractive (add-hook 'kill-emacs-hook 'org-id-locations-save)) @@ -566,7 +587,7 @@ When FILES is given, scan these files instead." (let (res x) (maphash (lambda (k v) - (if (setq x (member v res)) + (if (setq x (assoc v res)) (setcdr x (cons k (cdr x))) (push (list v k) res))) hash) @@ -650,7 +671,7 @@ optional argument MARKERP, return the position as a new marker." (match-string 4) (match-string 0))) link)))) - (org-store-link-props :link link :description desc :type "id") + (org-link-store-props :link link :description desc :type "id") link))) (defun org-id-open (id) diff --git a/elpa/org-20191028/org-indent.el b/elpa/org-20200127/org-indent.el similarity index 99% rename from elpa/org-20191028/org-indent.el rename to elpa/org-20200127/org-indent.el index a69293a8..51719194 100644 --- a/elpa/org-20191028/org-indent.el +++ b/elpa/org-20200127/org-indent.el @@ -1,6 +1,6 @@ ;;; org-indent.el --- Dynamic indentation for Org -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp diff --git a/elpa/org-20191028/org-inlinetask.el b/elpa/org-20200127/org-inlinetask.el similarity index 97% rename from elpa/org-20191028/org-inlinetask.el rename to elpa/org-20200127/org-inlinetask.el index 775facd2..60e3e0cc 100644 --- a/elpa/org-20191028/org-inlinetask.el +++ b/elpa/org-20200127/org-inlinetask.el @@ -1,6 +1,6 @@ ;;; org-inlinetask.el --- Tasks Independent of Outline Hierarchy -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -268,17 +268,6 @@ If the task has an end part, also demote it." (goto-char beg) (org-fixup-indentation diff))))))) -(defun org-inlinetask-get-current-indentation () - "Get the indentation of the last non-while line above this one." - (save-excursion - (beginning-of-line 1) - (skip-chars-backward " \t\n") - (beginning-of-line 1) - (or (org-at-item-p) - (looking-at "[ \t]*")) - (goto-char (match-end 0)) - (current-column))) - (defvar org-indent-indentation-per-level) ; defined in org-indent.el (defface org-inlinetask '((t :inherit shadow)) diff --git a/elpa/org-20191028/org-install.el b/elpa/org-20200127/org-install.el similarity index 100% rename from elpa/org-20191028/org-install.el rename to elpa/org-20200127/org-install.el diff --git a/elpa/org-20200127/org-keys.el b/elpa/org-20200127/org-keys.el new file mode 100644 index 00000000..4d4e1241 --- /dev/null +++ b/elpa/org-20200127/org-keys.el @@ -0,0 +1,928 @@ +;;; org-keys.el --- Key bindings for Org mode -*- lexical-binding: t; -*- + +;; Copyright (C) 2018-2020 Free Software Foundation, Inc. + +;; Author: Nicolas Goaziou + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; This library adds bindings for Org mode buffers. It also +;; implements both Speed keys and Babel speed keys. See manual for +;; details. + +;;; Code: + +(require 'cl-lib) + +(defvar org-outline-regexp) + +(declare-function org-add-note "org" ()) +(declare-function org-agenda "org" (&optional arg org-keys restriction)) +(declare-function org-agenda-file-to-front "org" (&optional to-end)) +(declare-function org-agenda-remove-restriction-lock "org" (&optional noupdate)) +(declare-function org-agenda-set-restriction-lock "org" (&optional type)) +(declare-function org-archive-subtree "org" (&optional find-done)) +(declare-function org-archive-subtree-default "org" ()) +(declare-function org-archive-subtree-default-with-confirmation "org" ()) +(declare-function org-archive-to-archive-sibling "org" ()) +(declare-function org-at-heading-p "org" (&optional ignored)) +(declare-function org-attach "org" ()) +(declare-function org-backward-element "org" ()) +(declare-function org-backward-heading-same-level "org" (arg &optional invisible-ok)) +(declare-function org-backward-paragraph "org" ()) +(declare-function org-backward-sentence "org" (&optional arg)) +(declare-function org-beginning-of-line "org" (&optional n)) +(declare-function org-clock-cancel "org" ()) +(declare-function org-clock-display "org" (&optional arg)) +(declare-function org-clock-goto "org" (&optional select)) +(declare-function org-clock-in "org" (&optional select start-time)) +(declare-function org-clock-in-last "org" (&optional arg)) +(declare-function org-clock-out "org" (&optional switch-to-state fail-quietly at-time)) +(declare-function org-clone-subtree-with-time-shift "org" (n &optional shift)) +(declare-function org-columns "org" (&optional global columns-fmt-string)) +(declare-function org-comment-dwim "org" (arg)) +(declare-function org-copy "org" ()) +(declare-function org-copy-special "org" ()) +(declare-function org-copy-visible "org" (beg end)) +(declare-function org-ctrl-c-ctrl-c "org" (&optional arg)) +(declare-function org-ctrl-c-minus "org" ()) +(declare-function org-ctrl-c-ret "org" ()) +(declare-function org-ctrl-c-star "org" ()) +(declare-function org-ctrl-c-tab "org" (&optional arg)) +(declare-function org-cut-special "org" ()) +(declare-function org-cut-subtree "org" (&optional n)) +(declare-function org-cycle "org" (&optional arg)) +(declare-function org-cycle-agenda-files "org" ()) +(declare-function org-date-from-calendar "org" ()) +(declare-function org-dynamic-block-insert-dblock "org" (&optional arg)) +(declare-function org-dblock-update "org" (&optional arg)) +(declare-function org-deadline "org" (arg1 &optional time)) +(declare-function org-decrease-number-at-point "org" (&optional inc)) +(declare-function org-delete-backward-char "org" (n)) +(declare-function org-delete-char "org" (n)) +(declare-function org-delete-indentation "org" (&optional arg)) +(declare-function org-demote-subtree "org" ()) +(declare-function org-display-outline-path "org" (&optional file current separator just-return-string)) +(declare-function org-down-element "org" ()) +(declare-function org-edit-special "org" (&optional arg)) +(declare-function org-element-at-point "org-element" ()) +(declare-function org-element-type "org-element" (element)) +(declare-function org-emphasize "org" (&optional char)) +(declare-function org-end-of-line "org" (&optional n)) +(declare-function org-entry-put "org" (pom property value)) +(declare-function org-eval-in-calendar "org" (form &optional keepdate)) +(declare-function org-evaluate-time-range "org" (&optional to-buffer)) +(declare-function org-export-dispatch "org" (&optional arg)) +(declare-function org-feed-goto-inbox "org" (feed)) +(declare-function org-feed-update-all "org" ()) +(declare-function org-fill-paragraph "org" (&optional justify region)) +(declare-function org-find-file-at-mouse "org" (ev)) +(declare-function org-footnote-action "org" (&optional special)) +(declare-function org-force-cycle-archived "org" ()) +(declare-function org-force-self-insert "org" (n)) +(declare-function org-forward-element "org" ()) +(declare-function org-forward-heading-same-level "org" (arg &optional invisible-ok)) +(declare-function org-forward-paragraph "org" ()) +(declare-function org-forward-sentence "org" (&optional arg)) +(declare-function org-goto "org" (&optional alternative-interface)) +(declare-function org-goto-calendar "org" (&optional arg)) +(declare-function org-inc-effort "org" ()) +(declare-function org-increase-number-at-point "org" (&optional inc)) +(declare-function org-info-find-node "org" (&optional nodename)) +(declare-function org-insert-all-links "org" (arg &optional pre post)) +(declare-function org-insert-drawer "org" (&optional arg drawer)) +(declare-function org-insert-heading-respect-content "org" (&optional invisible-ok)) +(declare-function org-insert-last-stored-link "org" (arg)) +(declare-function org-insert-link "org" (&optional complete-file link-location default-description)) +(declare-function org-insert-structure-template "org" (type)) +(declare-function org-insert-todo-heading "org" (arg &optional force-heading)) +(declare-function org-insert-todo-heading-respect-content "org" (&optional force-state)) +(declare-function org-kill-line "org" (&optional arg)) +(declare-function org-kill-note-or-show-branches "org" ()) +(declare-function org-list-make-subtree "org" ()) +(declare-function org-mark-element "org" ()) +(declare-function org-mark-ring-goto "org" (&optional n)) +(declare-function org-mark-ring-push "org" (&optional pos buffer)) +(declare-function org-mark-subtree "org" (&optional up)) +(declare-function org-match-sparse-tree "org" (&optional todo-only match)) +(declare-function org-meta-return "org" (&optional arg)) +(declare-function org-metadown "org" (&optional _arg)) +(declare-function org-metaleft "org" (&optional _)) +(declare-function org-metaright "org" (&optional _arg)) +(declare-function org-metaup "org" (&optional _arg)) +(declare-function org-narrow-to-block "org" ()) +(declare-function org-narrow-to-element "org" ()) +(declare-function org-narrow-to-subtree "org" ()) +(declare-function org-next-block "org" (arg &optional backward block-regexp)) +(declare-function org-next-link "org" (&optional search-backward)) +(declare-function org-next-visible-heading "org" (arg)) +(declare-function org-open-at-mouse "org" (ev)) +(declare-function org-open-at-point "org" (&optional arg reference-buffer)) +(declare-function org-open-line "org" (n)) +(declare-function org-paste-special "org" (arg)) +(declare-function org-plot/gnuplot "org-plot" (&optional params)) +(declare-function org-previous-block "org" (arg &optional block-regexp)) +(declare-function org-previous-link "org" ()) +(declare-function org-previous-visible-heading "org" (arg)) +(declare-function org-priority "org" (&optional action show)) +(declare-function org-promote-subtree "org" ()) +(declare-function org-redisplay-inline-images "org" ()) +(declare-function org-refile "org" (&optional arg1 default-buffer rfloc msg)) +(declare-function org-reftex-citation "org" ()) +(declare-function org-reload "org" (&optional arg1)) +(declare-function org-remove-file "org" (&optional file)) +(declare-function org-resolve-clocks "org" (&optional only-dangling-p prompt-fn last-valid)) +(declare-function org-return "org" (&optional indent)) +(declare-function org-return-indent "org" ()) +(declare-function org-reveal "org" (&optional siblings)) +(declare-function org-schedule "org" (arg &optional time)) +(declare-function org-self-insert-command "org" (N)) +(declare-function org-set-effort "org" (&optional increment value)) +(declare-function org-set-property "org" (property value)) +(declare-function org-set-property-and-value "org" (use-last)) +(declare-function org-set-tags-command "org" (&optional arg)) +(declare-function org-shiftcontroldown "org" (&optional n)) +(declare-function org-shiftcontrolleft "org" ()) +(declare-function org-shiftcontrolright "org" ()) +(declare-function org-shiftcontrolup "org" (&optional n)) +(declare-function org-shiftdown "org" (&optional arg)) +(declare-function org-shiftleft "org" (&optional arg)) +(declare-function org-shiftmetadown "org" (&optional _arg)) +(declare-function org-shiftmetaleft "org" ()) +(declare-function org-shiftmetaright "org" ()) +(declare-function org-shiftmetaup "org" (&optional arg)) +(declare-function org-shiftright "org" (&optional arg)) +(declare-function org-shifttab "org" (&optional arg)) +(declare-function org-shiftup "org" (&optional arg)) +(declare-function org-show-all "org" (&optional types)) +(declare-function org-show-children "org" (&optional level)) +(declare-function org-show-subtree "org" ()) +(declare-function org-sort "org" (&optional with-case)) +(declare-function org-sparse-tree "org" (&optional arg type)) +(declare-function org-table-blank-field "org" ()) +(declare-function org-table-copy-down "org" (n)) +(declare-function org-table-create-or-convert-from-region "org" (arg)) +(declare-function org-table-create-with-table\.el "org-table" ()) +(declare-function org-table-edit-field "org" (arg)) +(declare-function org-table-eval-formula "org" (&optional arg equation suppress-align suppress-const suppress-store suppress-analysis)) +(declare-function org-table-field-info "org" (arg)) +(declare-function org-table-rotate-recalc-marks "org" (&optional newchar)) +(declare-function org-table-sum "org" (&optional beg end nlast)) +(declare-function org-table-toggle-coordinate-overlays "org" ()) +(declare-function org-table-toggle-formula-debugger "org" ()) +(declare-function org-time-stamp "org" (arg &optional inactive)) +(declare-function org-time-stamp-inactive "org" (&optional arg)) +(declare-function org-timer "org" (&optional restart no-insert)) +(declare-function org-timer-item "org" (&optional arg)) +(declare-function org-timer-pause-or-continue "org" (&optional stop)) +(declare-function org-timer-set-timer "org" (&optional opt)) +(declare-function org-timer-start "org" (&optional offset)) +(declare-function org-timer-stop "org" ()) +(declare-function org-todo "org" (&optional arg1)) +(declare-function org-toggle-archive-tag "org" (&optional find-done)) +(declare-function org-toggle-checkbox "org" (&optional toggle-presence)) +(declare-function org-toggle-comment "org" ()) +(declare-function org-toggle-fixed-width "org" ()) +(declare-function org-toggle-inline-images "org" (&optional include-linked)) +(declare-function org-latex-preview "org" (&optional arg)) +(declare-function org-toggle-narrow-to-subtree "org" ()) +(declare-function org-toggle-ordered-property "org" ()) +(declare-function org-toggle-pretty-entities "org" ()) +(declare-function org-toggle-tags-groups "org" ()) +(declare-function org-toggle-time-stamp-overlays "org" ()) +(declare-function org-transpose-element "org" ()) +(declare-function org-transpose-words "org" ()) +(declare-function org-tree-to-indirect-buffer "org" (&optional arg)) +(declare-function org-up-element "org" ()) +(declare-function org-update-statistics-cookies "org" (all)) +(declare-function org-yank "org" (&optional arg)) +(declare-function orgtbl-ascii-plot "org-table" (&optional ask)) + + + +;;; Variables + +(defvar org-mode-map (make-sparse-keymap) + "Keymap fo Org mode.") + +(defvaralias 'org-CUA-compatible 'org-replace-disputed-keys) + +(defcustom org-replace-disputed-keys nil + "Non-nil means use alternative key bindings for some keys. + +Org mode uses S- keys for changing timestamps and priorities. +These keys are also used by other packages like Shift Select mode, +CUA mode or Windmove. If you want to use Org mode together with +one of these other modes, or more generally if you would like to +move some Org mode commands to other keys, set this variable and +configure the keys with the variable `org-disputed-keys'. + +This option is only relevant at load-time of Org mode, and must be set +*before* org.el is loaded. Changing it requires a restart of Emacs to +become effective." + :group 'org-startup + :type 'boolean + :safe #'booleanp) + +(defcustom org-use-extra-keys nil + "Non-nil means use extra key sequence definitions for certain commands. +This happens automatically if `window-system' is nil. This +variable lets you do the same manually. You must set it before +loading Org." + :group 'org-startup + :type 'boolean + :safe #'booleanp) + +(defcustom org-disputed-keys + '(([(shift up)] . [(meta p)]) + ([(shift down)] . [(meta n)]) + ([(shift left)] . [(meta -)]) + ([(shift right)] . [(meta +)]) + ([(control shift right)] . [(meta shift +)]) + ([(control shift left)] . [(meta shift -)])) + "Keys for which Org mode and other modes compete. +This is an alist, cars are the default keys, second element specifies +the alternative to use when `org-replace-disputed-keys' is t. + +Keys can be specified in any syntax supported by `define-key'. +The value of this option takes effect only at Org mode startup, +therefore you'll have to restart Emacs to apply it after changing." + :group 'org-startup + :type 'alist) + +(defcustom org-mouse-1-follows-link + (if (boundp 'mouse-1-click-follows-link) mouse-1-click-follows-link t) + "Non-nil means mouse-1 on a link will follow the link. +A longer mouse click will still set point. Needs to be set +before org.el is loaded." + :group 'org-link-follow + :version "26.1" + :package-version '(Org . "8.3") + :type '(choice + (const :tag "A double click follows the link" double) + (const :tag "Unconditionally follow the link with mouse-1" t) + (integer :tag "mouse-1 click does not follow the link if longer than N ms" 450)) + :safe t) + +(defcustom org-tab-follows-link nil + "Non-nil means on links TAB will follow the link. +Needs to be set before Org is loaded. +This really should not be used, it does not make sense, and the +implementation is bad." + :group 'org-link-follow + :type 'boolean) + +(defcustom org-follow-link-hook nil + "Hook that is run after a link has been followed." + :group 'org-link-follow + :type 'hook) + +(defcustom org-return-follows-link nil + "Non-nil means on links RET will follow the link. +In tables, the special behavior of RET has precedence." + :group 'org-link-follow + :type 'boolean + :safe t) + + +;;; Functions + +;;;; Base functions +(defun org-key (key) + "Select key according to `org-replace-disputed-keys' and `org-disputed-keys'. +Or return the original if not disputed." + (when org-replace-disputed-keys + (let* ((nkey (key-description key)) + (x (cl-find-if (lambda (x) (equal (key-description (car x)) nkey)) + org-disputed-keys))) + (setq key (if x (cdr x) key)))) + key) + +(defun org-defkey (keymap key def) + "Define a key, possibly translated, as returned by `org-key'." + (define-key keymap (org-key key) def)) + +(defun org-remap (map &rest commands) + "In MAP, remap the functions given in COMMANDS. +COMMANDS is a list of alternating OLDDEF NEWDEF command names." + (let (new old) + (while commands + (setq old (pop commands) new (pop commands)) + (org-defkey map (vector 'remap old) new)))) + + +;;; Mouse map + +(defvar org-mouse-map (make-sparse-keymap)) +(org-defkey org-mouse-map [mouse-2] 'org-open-at-mouse) +(org-defkey org-mouse-map [mouse-3] 'org-find-file-at-mouse) + +(when org-mouse-1-follows-link + (org-defkey org-mouse-map [follow-link] 'mouse-face)) + +(when org-tab-follows-link + (org-defkey org-mouse-map (kbd "") #'org-open-at-point) + (org-defkey org-mouse-map (kbd "TAB") #'org-open-at-point)) + + +;;; Read date map + +(defvar org-read-date-minibuffer-local-map + (let* ((map (make-sparse-keymap))) + (set-keymap-parent map minibuffer-local-map) + (org-defkey map (kbd ".") + (lambda () (interactive) + ;; Are we at the beginning of the prompt? + (if (looking-back "^[^:]+: " + (let ((inhibit-field-text-motion t)) + (line-beginning-position))) + (org-eval-in-calendar '(calendar-goto-today)) + (insert ".")))) + (org-defkey map (kbd "C-.") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-goto-today)))) + (org-defkey map (kbd "M-S-") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-backward-month 1)))) + (org-defkey map (kbd "ESC S-") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-backward-month 1)))) + (org-defkey map (kbd "M-S-") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-forward-month 1)))) + (org-defkey map (kbd "ESC S-") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-forward-month 1)))) + (org-defkey map (kbd "M-S-") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-backward-year 1)))) + (org-defkey map (kbd "ESC S-") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-backward-year 1)))) + (org-defkey map (kbd "M-S-") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-forward-year 1)))) + (org-defkey map (kbd "ESC S-") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-forward-year 1)))) + (org-defkey map (kbd "S-") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-backward-week 1)))) + (org-defkey map (kbd "S-") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-forward-week 1)))) + (org-defkey map (kbd "S-") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-backward-day 1)))) + (org-defkey map (kbd "S-") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-forward-day 1)))) + (org-defkey map (kbd "!") + (lambda () (interactive) + (org-eval-in-calendar '(diary-view-entries)) + (message ""))) + (org-defkey map (kbd ">") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-scroll-left 1)))) + (org-defkey map (kbd "<") + (lambda () (interactive) + (org-eval-in-calendar '(calendar-scroll-right 1)))) + (org-defkey map (kbd "C-v") + (lambda () (interactive) + (org-eval-in-calendar + '(calendar-scroll-left-three-months 1)))) + (org-defkey map (kbd "M-v") + (lambda () (interactive) + (org-eval-in-calendar + '(calendar-scroll-right-three-months 1)))) + map) + "Keymap for minibuffer commands when using `org-read-date'.") + + +;;; Global bindings + +;;;; Outline functions +(define-key org-mode-map [menu-bar headings] 'undefined) +(define-key org-mode-map [menu-bar hide] 'undefined) +(define-key org-mode-map [menu-bar show] 'undefined) + +(define-key org-mode-map [remap outline-mark-subtree] #'org-mark-subtree) +(define-key org-mode-map [remap outline-show-subtree] #'org-show-subtree) +(define-key org-mode-map [remap outline-forward-same-level] + #'org-forward-heading-same-level) +(define-key org-mode-map [remap outline-backward-same-level] + #'org-backward-heading-same-level) +(define-key org-mode-map [remap outline-show-branches] + #'org-kill-note-or-show-branches) +(define-key org-mode-map [remap outline-promote] #'org-promote-subtree) +(define-key org-mode-map [remap outline-demote] #'org-demote-subtree) +(define-key org-mode-map [remap outline-insert-heading] #'org-ctrl-c-ret) +(define-key org-mode-map [remap outline-next-visible-heading] + #'org-next-visible-heading) +(define-key org-mode-map [remap outline-previous-visible-heading] + #'org-previous-visible-heading) +(define-key org-mode-map [remap show-children] #'org-show-children) + +;;;; Make `C-c C-x' a prefix key +(org-defkey org-mode-map (kbd "C-c C-x") (make-sparse-keymap)) + +;;;; TAB key with modifiers +(org-defkey org-mode-map (kbd "C-i") #'org-cycle) +(org-defkey org-mode-map (kbd "") #'org-cycle) +(org-defkey org-mode-map (kbd "C-") #'org-force-cycle-archived) +;; Override text-mode binding to expose `complete-symbol' for +;; pcomplete functionality. +(org-defkey org-mode-map (kbd "M-") nil) +(org-defkey org-mode-map (kbd "M-TAB") nil) +(org-defkey org-mode-map (kbd "ESC ") nil) +(org-defkey org-mode-map (kbd "ESC TAB") nil) + +(org-defkey org-mode-map (kbd "") #'org-shifttab) +(org-defkey org-mode-map (kbd "S-") #'org-shifttab) +(org-defkey org-mode-map (kbd "S-TAB") #'org-shifttab) +(define-key org-mode-map (kbd "") #'org-shifttab) + +;;;; RET/ key with modifiers +(org-defkey org-mode-map (kbd "S-") #'org-table-copy-down) +(org-defkey org-mode-map (kbd "S-RET") #'org-table-copy-down) +(org-defkey org-mode-map (kbd "M-S-") #'org-insert-todo-heading) +(org-defkey org-mode-map (kbd "M-S-RET") #'org-insert-todo-heading) +(org-defkey org-mode-map (kbd "ESC S-") #'org-insert-todo-heading) +(org-defkey org-mode-map (kbd "ESC S-RET") #'org-insert-todo-heading) +(org-defkey org-mode-map (kbd "M-") #'org-meta-return) +(org-defkey org-mode-map (kbd "M-RET") #'org-meta-return) +(org-defkey org-mode-map (kbd "ESC ") #'org-meta-return) +(org-defkey org-mode-map (kbd "ESC RET") #'org-meta-return) + +;;;; Cursor keys with modifiers +(org-defkey org-mode-map (kbd "M-") #'org-metaleft) +(org-defkey org-mode-map (kbd "M-") #'org-metaright) +(org-defkey org-mode-map (kbd "ESC ") #'org-metaright) +(org-defkey org-mode-map (kbd "M-") #'org-metaup) +(org-defkey org-mode-map (kbd "ESC ") #'org-metaup) +(org-defkey org-mode-map (kbd "M-") #'org-metadown) +(org-defkey org-mode-map (kbd "ESC ") #'org-metadown) + +(org-defkey org-mode-map (kbd "C-M-S-") #'org-increase-number-at-point) +(org-defkey org-mode-map (kbd "C-M-S-") #'org-decrease-number-at-point) +(org-defkey org-mode-map (kbd "M-S-") #'org-shiftmetaleft) +(org-defkey org-mode-map (kbd "ESC S-") #'org-shiftmetaleft) +(org-defkey org-mode-map (kbd "M-S-") #'org-shiftmetaright) +(org-defkey org-mode-map (kbd "ESC S-") #'org-shiftmetaright) +(org-defkey org-mode-map (kbd "M-S-") #'org-shiftmetaup) +(org-defkey org-mode-map (kbd "ESC S-") #'org-shiftmetaup) +(org-defkey org-mode-map (kbd "M-S-") #'org-shiftmetadown) +(org-defkey org-mode-map (kbd "ESC S-") #'org-shiftmetadown) + +(org-defkey org-mode-map (kbd "S-") #'org-shiftup) +(org-defkey org-mode-map (kbd "S-") #'org-shiftdown) +(org-defkey org-mode-map (kbd "S-") #'org-shiftleft) +(org-defkey org-mode-map (kbd "S-") #'org-shiftright) + +(org-defkey org-mode-map (kbd "C-S-") #'org-shiftcontrolright) +(org-defkey org-mode-map (kbd "C-S-") #'org-shiftcontrolleft) +(org-defkey org-mode-map (kbd "C-S-") #'org-shiftcontrolup) +(org-defkey org-mode-map (kbd "C-S-") #'org-shiftcontroldown) + +;;;; Extra keys for TTY access. + +;; We only set them when really needed because otherwise the +;; menus don't show the simple keys + +(when (or org-use-extra-keys (not window-system)) + (org-defkey org-mode-map (kbd "C-c C-x c") #'org-table-copy-down) + (org-defkey org-mode-map (kbd "C-c C-x m") #'org-meta-return) + (org-defkey org-mode-map (kbd "C-c C-x M") #'org-insert-todo-heading) + (org-defkey org-mode-map (kbd "C-c C-x RET") #'org-meta-return) + (org-defkey org-mode-map (kbd "ESC RET") #'org-meta-return) + (org-defkey org-mode-map (kbd "ESC ") #'org-metaleft) + (org-defkey org-mode-map (kbd "C-c C-x l") #'org-metaleft) + (org-defkey org-mode-map (kbd "ESC ") #'org-metaright) + (org-defkey org-mode-map (kbd "C-c C-x r") #'org-metaright) + (org-defkey org-mode-map (kbd "C-c C-x u") #'org-metaup) + (org-defkey org-mode-map (kbd "C-c C-x d") #'org-metadown) + (org-defkey org-mode-map (kbd "C-c C-x L") #'org-shiftmetaleft) + (org-defkey org-mode-map (kbd "C-c C-x R") #'org-shiftmetaright) + (org-defkey org-mode-map (kbd "C-c C-x U") #'org-shiftmetaup) + (org-defkey org-mode-map (kbd "C-c C-x D") #'org-shiftmetadown) + (org-defkey org-mode-map (kbd "C-c ") #'org-shiftup) + (org-defkey org-mode-map (kbd "C-c ") #'org-shiftdown) + (org-defkey org-mode-map (kbd "C-c ") #'org-shiftleft) + (org-defkey org-mode-map (kbd "C-c ") #'org-shiftright) + (org-defkey org-mode-map (kbd "C-c C-x ") #'org-shiftcontrolright) + (org-defkey org-mode-map (kbd "C-c C-x ") #'org-shiftcontrolleft)) + +;;;; Narrowing bindings +(org-defkey org-mode-map (kbd "C-x n s") #'org-narrow-to-subtree) +(org-defkey org-mode-map (kbd "C-x n b") #'org-narrow-to-block) +(org-defkey org-mode-map (kbd "C-x n e") #'org-narrow-to-element) + +;;;; Remap usual Emacs bindings +(org-remap org-mode-map + 'self-insert-command 'org-self-insert-command + 'delete-char 'org-delete-char + 'delete-backward-char 'org-delete-backward-char + 'kill-line 'org-kill-line + 'open-line 'org-open-line + 'yank 'org-yank + 'comment-dwim 'org-comment-dwim + 'move-beginning-of-line 'org-beginning-of-line + 'move-end-of-line 'org-end-of-line + 'forward-paragraph 'org-forward-paragraph + 'backward-paragraph 'org-backward-paragraph + 'backward-sentence 'org-backward-sentence + 'forward-sentence 'org-forward-sentence + 'fill-paragraph 'org-fill-paragraph + 'delete-indentation 'org-delete-indentation + 'transpose-words 'org-transpose-words) + +;;;; All the other keys +(org-defkey org-mode-map (kbd "|") #'org-force-self-insert) +(org-defkey org-mode-map (kbd "C-c C-r") #'org-reveal) +(org-defkey org-mode-map (kbd "C-M-t") #'org-transpose-element) +(org-defkey org-mode-map (kbd "M-}") #'org-forward-element) +(org-defkey org-mode-map (kbd "ESC }") #'org-forward-element) +(org-defkey org-mode-map (kbd "M-{") #'org-backward-element) +(org-defkey org-mode-map (kbd "ESC {") #'org-backward-element) +(org-defkey org-mode-map (kbd "C-c C-^") #'org-up-element) +(org-defkey org-mode-map (kbd "C-c C-_") #'org-down-element) +(org-defkey org-mode-map (kbd "C-c C-f") #'org-forward-heading-same-level) +(org-defkey org-mode-map (kbd "C-c C-b") #'org-backward-heading-same-level) +(org-defkey org-mode-map (kbd "C-c M-f") #'org-next-block) +(org-defkey org-mode-map (kbd "C-c M-b") #'org-previous-block) +(org-defkey org-mode-map (kbd "C-c $") #'org-archive-subtree) +(org-defkey org-mode-map (kbd "C-c C-x C-s") #'org-archive-subtree) +(org-defkey org-mode-map (kbd "C-c C-x C-a") #'org-archive-subtree-default) +(org-defkey org-mode-map (kbd "C-c C-x d") #'org-insert-drawer) +(org-defkey org-mode-map (kbd "C-c C-x a") #'org-toggle-archive-tag) +(org-defkey org-mode-map (kbd "C-c C-x A") #'org-archive-to-archive-sibling) +(org-defkey org-mode-map (kbd "C-c C-x b") #'org-tree-to-indirect-buffer) +(org-defkey org-mode-map (kbd "C-c C-x q") #'org-toggle-tags-groups) +(org-defkey org-mode-map (kbd "C-c C-j") #'org-goto) +(org-defkey org-mode-map (kbd "C-c C-t") #'org-todo) +(org-defkey org-mode-map (kbd "C-c C-q") #'org-set-tags-command) +(org-defkey org-mode-map (kbd "C-c C-s") #'org-schedule) +(org-defkey org-mode-map (kbd "C-c C-d") #'org-deadline) +(org-defkey org-mode-map (kbd "C-c ;") #'org-toggle-comment) +(org-defkey org-mode-map (kbd "C-c C-w") #'org-refile) +(org-defkey org-mode-map (kbd "C-c M-w") #'org-copy) +(org-defkey org-mode-map (kbd "C-c /") #'org-sparse-tree) ;minor-mode reserved +(org-defkey org-mode-map (kbd "C-c \\") #'org-match-sparse-tree) ;minor-mode r. +(org-defkey org-mode-map (kbd "C-c RET") #'org-ctrl-c-ret) +(org-defkey org-mode-map (kbd "C-c C-x c") #'org-clone-subtree-with-time-shift) +(org-defkey org-mode-map (kbd "C-c C-x v") #'org-copy-visible) +(org-defkey org-mode-map (kbd "C-") #'org-insert-heading-respect-content) +(org-defkey org-mode-map (kbd "C-S-") #'org-insert-todo-heading-respect-content) +(org-defkey org-mode-map (kbd "C-c C-x C-n") #'org-next-link) +(org-defkey org-mode-map (kbd "C-c C-x C-p") #'org-previous-link) +(org-defkey org-mode-map (kbd "C-c C-l") #'org-insert-link) +(org-defkey org-mode-map (kbd "C-c M-l") #'org-insert-last-stored-link) +(org-defkey org-mode-map (kbd "C-c C-M-l") #'org-insert-all-links) +(org-defkey org-mode-map (kbd "C-c C-o") #'org-open-at-point) +(org-defkey org-mode-map (kbd "C-c %") #'org-mark-ring-push) +(org-defkey org-mode-map (kbd "C-c &") #'org-mark-ring-goto) +(org-defkey org-mode-map (kbd "C-c C-z") #'org-add-note) ;alternative binding +(org-defkey org-mode-map (kbd "C-c .") #'org-time-stamp) ;minor-mode reserved +(org-defkey org-mode-map (kbd "C-c !") #'org-time-stamp-inactive) ;minor-mode r. +(org-defkey org-mode-map (kbd "C-c ,") #'org-priority) ;minor-mode reserved +(org-defkey org-mode-map (kbd "C-c C-y") #'org-evaluate-time-range) +(org-defkey org-mode-map (kbd "C-c >") #'org-goto-calendar) +(org-defkey org-mode-map (kbd "C-c <") #'org-date-from-calendar) +(org-defkey org-mode-map (kbd "C-,") #'org-cycle-agenda-files) +(org-defkey org-mode-map (kbd "C-'") #'org-cycle-agenda-files) +(org-defkey org-mode-map (kbd "C-c [") #'org-agenda-file-to-front) +(org-defkey org-mode-map (kbd "C-c ]") #'org-remove-file) +(org-defkey org-mode-map (kbd "C-c C-x <") #'org-agenda-set-restriction-lock) +(org-defkey org-mode-map (kbd "C-c C-x >") #'org-agenda-remove-restriction-lock) +(org-defkey org-mode-map (kbd "C-c -") #'org-ctrl-c-minus) +(org-defkey org-mode-map (kbd "C-c *") #'org-ctrl-c-star) +(org-defkey org-mode-map (kbd "C-c TAB") #'org-ctrl-c-tab) +(org-defkey org-mode-map (kbd "C-c ^") #'org-sort) +(org-defkey org-mode-map (kbd "C-c C-c") #'org-ctrl-c-ctrl-c) +(org-defkey org-mode-map (kbd "C-c C-k") #'org-kill-note-or-show-branches) +(org-defkey org-mode-map (kbd "C-c #") #'org-update-statistics-cookies) +(org-defkey org-mode-map (kbd "RET") #'org-return) +(org-defkey org-mode-map (kbd "C-j") #'org-return-indent) +(org-defkey org-mode-map (kbd "C-c ?") #'org-table-field-info) +(org-defkey org-mode-map (kbd "C-c SPC") #'org-table-blank-field) +(org-defkey org-mode-map (kbd "C-c +") #'org-table-sum) +(org-defkey org-mode-map (kbd "C-c =") #'org-table-eval-formula) +(org-defkey org-mode-map (kbd "C-c '") #'org-edit-special) +(org-defkey org-mode-map (kbd "C-c `") #'org-table-edit-field) +(org-defkey org-mode-map (kbd "C-c \" a") #'orgtbl-ascii-plot) +(org-defkey org-mode-map (kbd "C-c \" g") #'org-plot/gnuplot) +(org-defkey org-mode-map (kbd "C-c |") #'org-table-create-or-convert-from-region) +(org-defkey org-mode-map (kbd "C-#") #'org-table-rotate-recalc-marks) +(org-defkey org-mode-map (kbd "C-c ~") #'org-table-create-with-table.el) +(org-defkey org-mode-map (kbd "C-c C-a") #'org-attach) +(org-defkey org-mode-map (kbd "C-c }") #'org-table-toggle-coordinate-overlays) +(org-defkey org-mode-map (kbd "C-c {") #'org-table-toggle-formula-debugger) +(org-defkey org-mode-map (kbd "C-c C-e") #'org-export-dispatch) +(org-defkey org-mode-map (kbd "C-c :") #'org-toggle-fixed-width) +(org-defkey org-mode-map (kbd "C-c C-x C-f") #'org-emphasize) +(org-defkey org-mode-map (kbd "C-c C-x f") #'org-footnote-action) +(org-defkey org-mode-map (kbd "C-c @") #'org-mark-subtree) +(org-defkey org-mode-map (kbd "M-h") #'org-mark-element) +(org-defkey org-mode-map (kbd "ESC h") #'org-mark-element) +(org-defkey org-mode-map (kbd "C-c C-*") #'org-list-make-subtree) +(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 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) +(org-defkey org-mode-map (kbd "C-c C-x C-z") #'org-resolve-clocks) +(org-defkey org-mode-map (kbd "C-c C-x C-o") #'org-clock-out) +(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 x") #'org-dynamic-block-insert-dblock) +(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-latex-preview) +(org-defkey org-mode-map (kbd "C-c C-x C-v") #'org-toggle-inline-images) +(org-defkey org-mode-map (kbd "C-c C-x C-M-v") #'org-redisplay-inline-images) +(org-defkey org-mode-map (kbd "C-c C-x \\") #'org-toggle-pretty-entities) +(org-defkey org-mode-map (kbd "C-c C-x C-b") #'org-toggle-checkbox) +(org-defkey org-mode-map (kbd "C-c C-x p") #'org-set-property) +(org-defkey org-mode-map (kbd "C-c C-x P") #'org-set-property-and-value) +(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-,") #'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) +(org-defkey org-mode-map (kbd "C-c C-x 0") #'org-timer-start) +(org-defkey org-mode-map (kbd "C-c C-x _") #'org-timer-stop) +(org-defkey org-mode-map (kbd "C-c C-x ;") #'org-timer-set-timer) +(org-defkey org-mode-map (kbd "C-c C-x ,") #'org-timer-pause-or-continue) +(org-defkey org-mode-map (kbd "C-c C-x C-c") #'org-columns) +(org-defkey org-mode-map (kbd "C-c C-x !") #'org-reload) +(org-defkey org-mode-map (kbd "C-c C-x g") #'org-feed-update-all) +(org-defkey org-mode-map (kbd "C-c C-x G") #'org-feed-goto-inbox) +(org-defkey org-mode-map (kbd "C-c C-x [") #'org-reftex-citation) +(org-defkey org-mode-map (kbd "C-c C-x I") #'org-info-find-node) + + +;;; Speed keys + +(defcustom org-use-speed-commands nil + "Non-nil means activate single letter commands at beginning of a headline. +This may also be a function to test for appropriate locations where speed +commands should be active. + +For example, to activate speed commands when the point is on any +star at the beginning of the headline, you can do this: + + (setq org-use-speed-commands + (lambda () (and (looking-at org-outline-regexp) (looking-back \"^\\**\"))))" + :group 'org-structure + :type '(choice + (const :tag "Never" nil) + (const :tag "At beginning of headline stars" t) + (function))) + +(defcustom org-speed-commands-user nil + "Alist of additional speed commands. +This list will be checked before `org-speed-commands-default' +when the variable `org-use-speed-commands' is non-nil +and when the cursor is at the beginning of a headline. +The car of each entry is a string with a single letter, which must +be assigned to `self-insert-command' in the global map. +The cdr is either a command to be called interactively, a function +to be called, or a form to be evaluated. +An entry that is just a list with a single string will be interpreted +as a descriptive headline that will be added when listing the speed +commands in the Help buffer using the `?' speed command." + :group 'org-structure + :type '(repeat :value ("k" . ignore) + (choice :value ("k" . ignore) + (list :tag "Descriptive Headline" (string :tag "Headline")) + (cons :tag "Letter and Command" + (string :tag "Command letter") + (choice + (function) + (sexp)))))) + +(defcustom org-speed-command-hook + '(org-speed-command-activate org-babel-speed-command-activate) + "Hook for activating speed commands at strategic locations. +Hook functions are called in sequence until a valid handler is +found. + +Each hook takes a single argument, a user-pressed command key +which is also a `self-insert-command' from the global map. + +Within the hook, examine the cursor position and the command key +and return nil or a valid handler as appropriate. Handler could +be one of an interactive command, a function, or a form. + +Set `org-use-speed-commands' to non-nil value to enable this +hook. The default setting is `org-speed-command-activate'." + :group 'org-structure + :version "24.1" + :type 'hook) + +(defconst org-speed-commands-default + '(("Outline Navigation") + ("n" . (org-speed-move-safe 'org-next-visible-heading)) + ("p" . (org-speed-move-safe 'org-previous-visible-heading)) + ("f" . (org-speed-move-safe 'org-forward-heading-same-level)) + ("b" . (org-speed-move-safe 'org-backward-heading-same-level)) + ("F" . org-next-block) + ("B" . org-previous-block) + ("u" . (org-speed-move-safe 'outline-up-heading)) + ("j" . org-goto) + ("g" . (org-refile t)) + ("Outline Visibility") + ("c" . org-cycle) + ("C" . org-shifttab) + (" " . org-display-outline-path) + ("s" . org-toggle-narrow-to-subtree) + ("k" . org-cut-subtree) + ("=" . org-columns) + ("Outline Structure Editing") + ("U" . org-metaup) + ("D" . org-metadown) + ("r" . org-metaright) + ("l" . org-metaleft) + ("R" . org-shiftmetaright) + ("L" . org-shiftmetaleft) + ("i" . (progn (forward-char 1) (call-interactively + 'org-insert-heading-respect-content))) + ("^" . org-sort) + ("w" . org-refile) + ("a" . org-archive-subtree-default-with-confirmation) + ("@" . org-mark-subtree) + ("#" . org-toggle-comment) + ("Clock Commands") + ("I" . org-clock-in) + ("O" . org-clock-out) + ("Meta Data Editing") + ("t" . org-todo) + ("," . (org-priority)) + ("0" . (org-priority ?\ )) + ("1" . (org-priority ?A)) + ("2" . (org-priority ?B)) + ("3" . (org-priority ?C)) + (":" . org-set-tags-command) + ("e" . org-set-effort) + ("E" . org-inc-effort) + ("W" . (lambda(m) (interactive "sMinutes before warning: ") + (org-entry-put (point) "APPT_WARNTIME" m))) + ("Agenda Views etc") + ("v" . org-agenda) + ("/" . org-sparse-tree) + ("Misc") + ("o" . org-open-at-point) + ("?" . org-speed-command-help) + ("<" . (org-agenda-set-restriction-lock 'subtree)) + (">" . (org-agenda-remove-restriction-lock))) + "The default speed commands.") + +(defun org-print-speed-command (e) + (if (> (length (car e)) 1) + (progn + (princ "\n") + (princ (car e)) + (princ "\n") + (princ (make-string (length (car e)) ?-)) + (princ "\n")) + (princ (car e)) + (princ " ") + (if (symbolp (cdr e)) + (princ (symbol-name (cdr e))) + (prin1 (cdr e))) + (princ "\n"))) + +(defun org-speed-command-help () + "Show the available speed commands." + (interactive) + (unless org-use-speed-commands + (user-error "Speed commands are not activated, customize `org-use-speed-commands'")) + (with-output-to-temp-buffer "*Help*" + (princ "User-defined Speed commands\n===========================\n") + (mapc #'org-print-speed-command org-speed-commands-user) + (princ "\n") + (princ "Built-in Speed commands\n=======================\n") + (mapc #'org-print-speed-command org-speed-commands-default)) + (with-current-buffer "*Help*" + (setq truncate-lines t))) + +(defun org-speed-move-safe (cmd) + "Execute CMD, but make sure that the cursor always ends up in a headline. +If not, return to the original position and throw an error." + (interactive) + (let ((pos (point))) + (call-interactively cmd) + (unless (and (bolp) (org-at-heading-p)) + (goto-char pos) + (error "Boundary reached while executing %s" cmd)))) + +(defun org-speed-command-activate (keys) + "Hook for activating single-letter speed commands. +`org-speed-commands-default' specifies a minimal command set. +Use `org-speed-commands-user' for further customization." + (when (or (and (bolp) (looking-at org-outline-regexp)) + (and (functionp org-use-speed-commands) + (funcall org-use-speed-commands))) + (cdr (assoc keys (append org-speed-commands-user + org-speed-commands-default))))) + + +;;; Babel speed keys + +(defvar org-babel-key-prefix "\C-c\C-v" + "The key prefix for Babel interactive key-bindings. +See `org-babel-key-bindings' for the list of interactive Babel +functions which are assigned key bindings, and see +`org-babel-map' for the actual babel keymap.") + +(defvar org-babel-map (make-sparse-keymap) + "The keymap for interactive Babel functions.") + +(defvar org-babel-key-bindings + '(("p" . org-babel-previous-src-block) + ("\C-p" . org-babel-previous-src-block) + ("n" . org-babel-next-src-block) + ("\C-n" . org-babel-next-src-block) + ("e" . org-babel-execute-maybe) + ("\C-e" . org-babel-execute-maybe) + ("o" . org-babel-open-src-block-result) + ("\C-o" . org-babel-open-src-block-result) + ("\C-v" . org-babel-expand-src-block) + ("v" . org-babel-expand-src-block) + ("u" . org-babel-goto-src-block-head) + ("\C-u" . org-babel-goto-src-block-head) + ("g" . org-babel-goto-named-src-block) + ("r" . org-babel-goto-named-result) + ("\C-r" . org-babel-goto-named-result) + ("\C-b" . org-babel-execute-buffer) + ("b" . org-babel-execute-buffer) + ("\C-s" . org-babel-execute-subtree) + ("s" . org-babel-execute-subtree) + ("\C-d" . org-babel-demarcate-block) + ("d" . org-babel-demarcate-block) + ("\C-t" . org-babel-tangle) + ("t" . org-babel-tangle) + ("\C-f" . org-babel-tangle-file) + ("f" . org-babel-tangle-file) + ("\C-c" . org-babel-check-src-block) + ("c" . org-babel-check-src-block) + ("\C-j" . org-babel-insert-header-arg) + ("j" . org-babel-insert-header-arg) + ("\C-l" . org-babel-load-in-session) + ("l" . org-babel-load-in-session) + ("\C-i" . org-babel-lob-ingest) + ("i" . org-babel-lob-ingest) + ("\C-I" . org-babel-view-src-block-info) + ("I" . org-babel-view-src-block-info) + ("\C-z" . org-babel-switch-to-session) + ("z" . org-babel-switch-to-session-with-code) + ("\C-a" . org-babel-sha1-hash) + ("a" . org-babel-sha1-hash) + ("h" . org-babel-describe-bindings) + ("\C-x" . org-babel-do-key-sequence-in-edit-buffer) + ("x" . org-babel-do-key-sequence-in-edit-buffer) + ("k" . org-babel-remove-result-one-or-many) + ("\C-\M-h" . org-babel-mark-block)) + "Alist of key bindings and interactive Babel functions. +This list associates interactive Babel functions +with keys. Each element of this list will add an entry to the +`org-babel-map' using the letter key which is the `car' of the +a-list placed behind the generic `org-babel-key-prefix'.") + +(define-key org-mode-map org-babel-key-prefix org-babel-map) +(pcase-dolist (`(,key . ,def) org-babel-key-bindings) + (define-key org-babel-map key def)) + +(defun org-babel-speed-command-activate (keys) + "Hook for activating single-letter code block commands." + (when (and (bolp) + (let ((case-fold-search t)) (looking-at "[ \t]*#\\+begin_src")) + (eq 'src-block (org-element-type (org-element-at-point)))) + (cdr (assoc keys org-babel-key-bindings)))) + +;;;###autoload +(defun org-babel-describe-bindings () + "Describe all keybindings behind `org-babel-key-prefix'." + (interactive) + (describe-bindings org-babel-key-prefix)) + + +(provide 'org-keys) +;;; org-keys.el ends here diff --git a/elpa/org-20191028/org-lint.el b/elpa/org-20200127/org-lint.el similarity index 97% rename from elpa/org-20191028/org-lint.el rename to elpa/org-20200127/org-lint.el index 95cbb8dc..5be1ec72 100644 --- a/elpa/org-20191028/org-lint.el +++ b/elpa/org-20200127/org-lint.el @@ -1,6 +1,6 @@ ;;; org-lint.el --- Linting for Org documents -*- lexical-binding: t; -*- -;; Copyright (C) 2015-2019 Free Software Foundation, Inc. +;; Copyright (C) 2015-2020 Free Software Foundation, Inc. ;; Author: Nicolas Goaziou ;; Keywords: outlines, hypermedia, calendar, wp @@ -106,10 +106,10 @@ ;;; Code: (require 'cl-lib) -(require 'org-element) +(require 'ob) +(require 'ol) (require 'org-macro) (require 'ox) -(require 'ob) ;;; Checkers @@ -287,9 +287,15 @@ :name 'file-application :description "Report obsolete \"file+application\" link" :categories '(link obsolete)) + (make-org-lint-checker + :name 'percent-encoding-link-escape + :description "Report obsolete escape syntax in links" + :categories '(link obsolete) + :trust 'low) (make-org-lint-checker :name 'spurious-colons - :description "Report spurious colons in tags")) + :description "Report spurious colons in tags" + :categories '(tags))) "List of all available checkers.") (defun org-lint--collect-duplicates @@ -607,14 +613,13 @@ Use :header-args: instead" "Non-existent file argument in INCLUDE keyword") (let* ((visiting (if file (find-buffer-visiting file) (current-buffer))) - (buffer (or visiting (find-file-noselect file)))) + (buffer (or visiting (find-file-noselect file))) + (org-link-search-must-match-exact-headline t)) (unwind-protect (with-current-buffer buffer (when (and search - (not - (ignore-errors - (let ((org-link-search-inhibit-query t)) - (org-link-search search nil t))))) + (not (ignore-errors + (org-link-search search nil t)))) (list (org-element-property :post-affiliated k) (format "Invalid search part \"%s\" in INCLUDE keyword" @@ -885,6 +890,23 @@ Use \"export %s\" instead" (list (org-element-property :begin l) (format "Deprecated \"file+%s\" link type" app))))))) +(defun org-lint-percent-encoding-link-escape (ast) + (org-element-map ast 'link + (lambda (l) + (when (eq 'bracket (org-element-property :format l)) + (let* ((uri (org-element-property :path l)) + (start 0) + (obsolete-flag + (catch :obsolete + (while (string-match "%\\(..\\)?" uri start) + (setq start (match-end 0)) + (unless (member (match-string 1 uri) '("25" "5B" "5D" "20")) + (throw :obsolete nil))) + (string-match-p "%" uri)))) + (when obsolete-flag + (list (org-element-property :begin l) + "Link escaped with obsolete percent-encoding syntax"))))))) + (defun org-lint-wrong-header-argument (ast) (let* ((reports) (verify diff --git a/elpa/org-20191028/org-list.el b/elpa/org-20200127/org-list.el similarity index 98% rename from elpa/org-20191028/org-list.el rename to elpa/org-20200127/org-list.el index 2a95947c..7cd8a774 100644 --- a/elpa/org-20191028/org-list.el +++ b/elpa/org-20200127/org-list.el @@ -1,9 +1,10 @@ ;;; org-list.el --- Plain lists for Org -*- lexical-binding: t; -*- ;; -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; ;; Author: Carsten Dominik ;; Bastien Guerry +;; Maintainer: Bastien Guerry ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: https://orgmode.org ;; @@ -86,7 +87,6 @@ (defvar org-clock-string) (defvar org-closed-string) (defvar org-deadline-string) -(defvar org-description-max-indent) (defvar org-done-keywords) (defvar org-drawer-regexp) (defvar org-element-all-objects) @@ -328,14 +328,6 @@ with the word \"recursive\" in the value." :group 'org-plain-lists :type 'boolean) -(defcustom org-list-description-max-indent 20 - "Maximum indentation for the second line of a description list. -When the indentation would be larger than this, it will become -5 characters instead." - :group 'org-plain-lists - :type 'integer - :safe #'wholenump) - (defcustom org-list-indent-offset 0 "Additional indentation for sub-items in a list. By setting this to a small number, usually 1 or 2, one can more @@ -348,14 +340,6 @@ clearly distinguish sub-items in a list." "Names of blocks where lists are not allowed. Names must be in lower case.") -(defvar org-list-export-context '(block inlinetask) - "Context types where lists will be interpreted during export. - -Valid types are `drawer', `inlinetask' and `block'. More -specifically, type `block' is determined by the variable -`org-list-forbidden-blocks'.") - - ;;; Predicates and regexps @@ -2074,25 +2058,13 @@ Possible values are: `folded', `children' or `subtree'. See "Return column at which body of ITEM should start." (save-excursion (goto-char item) - (if (save-excursion - (end-of-line) - (re-search-backward - "[ \t]::\\([ \t]\\|$\\)" (line-beginning-position) t)) - ;; Descriptive list item. Body starts after item's tag, if - ;; possible. - (let ((start (1+ (- (match-beginning 1) (line-beginning-position)))) - (ind (current-indentation))) - (if (> start (+ ind org-list-description-max-indent)) - (+ ind 5) - start)) - ;; Regular item. Body starts after bullet. - (looking-at "[ \t]*\\(\\S-+\\)") - (+ (progn (goto-char (match-end 1)) (current-column)) - (if (and org-list-two-spaces-after-bullet-regexp - (string-match-p org-list-two-spaces-after-bullet-regexp - (match-string 1))) - 2 - 1))))) + (looking-at "[ \t]*\\(\\S-+\\)") + (+ (progn (goto-char (match-end 1)) (current-column)) + (if (and org-list-two-spaces-after-bullet-regexp + (string-match-p org-list-two-spaces-after-bullet-regexp + (match-string 1))) + 2 + 1)))) @@ -3179,10 +3151,14 @@ Point is left at list's end." (defun org-list-make-subtree () "Convert the plain list at point into a subtree." (interactive) - (if (not (ignore-errors (goto-char (org-in-item-p)))) - (error "Not in a list") - (let ((list (save-excursion (org-list-to-lisp t)))) - (insert (org-list-to-subtree list) "\n")))) + (let ((item (org-in-item-p))) + (unless item (error "Not in a list")) + (goto-char item) + (let ((level (pcase (org-current-level) + (`nil 1) + (l (1+ (org-reduced-level l))))) + (list (save-excursion (org-list-to-lisp t)))) + (insert (org-list-to-subtree list level) "\n")))) (defun org-list-to-generic (list params) "Convert a LIST parsed through `org-list-to-lisp' to a custom format. @@ -3491,21 +3467,22 @@ with overruling parameters for `org-list-to-generic'." :cbtrans "[-] "))) (org-list-to-generic list (org-combine-plists defaults params)))) -(defun org-list-to-subtree (list &optional params) +(defun org-list-to-subtree (list &optional start-level params) "Convert LIST into an Org subtree. -LIST is as returned by `org-list-to-lisp'. PARAMS is a property -list with overruling parameters for `org-list-to-generic'." +LIST is as returned by `org-list-to-lisp'. Subtree starts at +START-LEVEL or level 1 if nil. PARAMS is a property list with +overruling parameters for `org-list-to-generic'." (let* ((blank (pcase (cdr (assq 'heading org-blank-before-new-entry)) (`t t) (`auto (save-excursion (org-with-limited-levels (outline-previous-heading)) (org-previous-line-empty-p))))) - (level (org-reduced-level (or (org-current-level) 0))) + (level (or start-level 1)) (make-stars (lambda (_type depth &optional _count) ;; Return the string for the heading, depending on DEPTH ;; of current sub-list. - (let ((oddeven-level (+ level depth))) + (let ((oddeven-level (+ level (1- depth)))) (concat (make-string (if org-odd-levels-only (1- (* 2 oddeven-level)) oddeven-level) diff --git a/elpa/org-20191028/org-loaddefs.el b/elpa/org-20200127/org-loaddefs.el similarity index 94% rename from elpa/org-20191028/org-loaddefs.el rename to elpa/org-20200127/org-loaddefs.el index 19914011..a7030269 100644 --- a/elpa/org-20191028/org-loaddefs.el +++ b/elpa/org-20200127/org-loaddefs.el @@ -72,7 +72,7 @@ ;;;*** -;;;### (autoloads nil "ob-core" "ob-core.el" "87f73d5013f14a433b1c853819ea720e") +;;;### (autoloads nil "ob-core" "ob-core.el" (0 0 0 0)) ;;; Generated autoloads from ob-core.el (autoload 'org-babel-execute-safely-maybe "ob-core" "\ @@ -304,6 +304,8 @@ Mark current source block. \(fn)" t nil) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-core" '("org-"))) + ;;;*** ;;;### (autoloads nil "ob-css" "ob-css.el" (0 0 0 0)) @@ -339,6 +341,13 @@ Mark current source block. (if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-emacs-lisp" '("org-babel-"))) +;;;*** + +;;;### (autoloads nil "ob-eshell" "ob-eshell.el" (0 0 0 0)) +;;; Generated autoloads from ob-eshell.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-eshell" '("ob-eshell-session-live-p" "org-babel-"))) + ;;;*** ;;;### (autoloads nil "ob-eval" "ob-eval.el" (0 0 0 0)) @@ -416,16 +425,6 @@ Mark current source block. (if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-js" '("org-babel-"))) -;;;*** - -;;;### (autoloads nil "ob-keys" "ob-keys.el" "11cd5f8e17581b5dd5e8d3f199ad620d") -;;; Generated autoloads from ob-keys.el - -(autoload 'org-babel-describe-bindings "ob-keys" "\ -Describe all keybindings behind `org-babel-key-prefix'. - -\(fn)" t nil) - ;;;*** ;;;### (autoloads nil "ob-latex" "ob-latex.el" (0 0 0 0)) @@ -456,7 +455,7 @@ Describe all keybindings behind `org-babel-key-prefix'. ;;;*** -;;;### (autoloads nil "ob-lob" "ob-lob.el" "6727aa97a79646b6da1990eed6bf61e3") +;;;### (autoloads nil "ob-lob" "ob-lob.el" (0 0 0 0)) ;;; Generated autoloads from ob-lob.el (autoload 'org-babel-lob-execute-maybe "ob-lob" "\ @@ -477,6 +476,8 @@ see. \(fn &optional DATUM)" nil nil) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-lob" '("org-babel-"))) + ;;;*** ;;;### (autoloads nil "ob-lua" "ob-lua.el" (0 0 0 0)) @@ -647,7 +648,7 @@ see. ;;;*** -;;;### (autoloads nil "ob-tangle" "ob-tangle.el" "82fc18eb309529449fdc9b62a6acdedb") +;;;### (autoloads nil "ob-tangle" "ob-tangle.el" (0 0 0 0)) ;;; Generated autoloads from ob-tangle.el (autoload 'org-babel-tangle-file "ob-tangle" "\ @@ -673,6 +674,8 @@ used to limit the exported source code blocks by language. \(fn &optional ARG TARGET-FILE LANG)" t nil) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-tangle" '("org-babel-"))) + ;;;*** ;;;### (autoloads nil "ob-vala" "ob-vala.el" (0 0 0 0)) @@ -680,6 +683,26 @@ used to limit the exported source code blocks by language. (if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-vala" '("org-babel-"))) +;;;*** + +;;;### (autoloads nil "ol-bbdb" "ol-bbdb.el" "34914c2b6dd87abeeea143f784675968") +;;; Generated autoloads from ol-bbdb.el + +(autoload 'org-bbdb-anniversaries "ol-bbdb" "\ +Extract anniversaries from BBDB for display in the agenda. + +\(fn)" nil nil) + +;;;*** + +;;;### (autoloads nil "ol-irc" "ol-irc.el" "a6742094ce57931eebc68012075b516d") +;;; Generated autoloads from ol-irc.el + +(autoload 'org-irc-store-link "ol-irc" "\ +Dispatch to the appropriate function to store a link to an IRC session. + +\(fn)" nil nil) + ;;;*** ;;;### (autoloads nil "org-agenda" "org-agenda.el" (0 0 0 0)) @@ -766,7 +789,7 @@ todo The todo keyword, if any tags All tags including inherited ones, separated by colons date The relevant date, like 2007-2-14 time The time, like 15:00-16:50 -extra Sting with extra planning info +extra String with extra planning info priority-l The priority letter if any was given priority-n The computed numerical priority agenda-day The day in the agenda where this is listed @@ -960,7 +983,7 @@ to override `appt-message-warning-time'. ;;;*** -;;;### (autoloads nil "org-archive" "org-archive.el" "a05928aac4856608117e562dec97e234") +;;;### (autoloads nil "org-archive" "org-archive.el" (0 0 0 0)) ;;; Generated autoloads from org-archive.el (autoload 'org-add-archive-files "org-archive" "\ @@ -1018,9 +1041,11 @@ This command is set with the variable `org-archive-default-command'. \(fn)" t nil) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-archive" '("org-a"))) + ;;;*** -;;;### (autoloads nil "org-attach" "org-attach.el" "3b5c015d85e41fc877981506897ab7e5") +;;;### (autoloads nil "org-attach" "org-attach.el" "9829a1c0b6e485a8c73bb7ab4ad64521") ;;; Generated autoloads from org-attach.el (autoload 'org-attach "org-attach" "\ @@ -1039,20 +1064,32 @@ Idea taken from `gnus-dired-attach'. ;;;*** -;;;### (autoloads nil "org-bbdb" "org-bbdb.el" "0b09ebf1301e91f5dcf98ab339378255") -;;; Generated autoloads from org-bbdb.el - -(autoload 'org-bbdb-anniversaries "org-bbdb" "\ -Extract anniversaries from BBDB for display in the agenda. +;;;### (autoloads nil "org-attach-git" "org-attach-git.el" (0 0 0 +;;;;;; 0)) +;;; Generated autoloads from org-attach-git.el -\(fn)" nil nil) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-attach-git" '("org-attach-git-"))) ;;;*** -;;;### (autoloads nil "org-bibtex" "org-bibtex.el" (0 0 0 0)) -;;; Generated autoloads from org-bibtex.el +;;;### (autoloads nil "org-attach" "org-attach.el" (0 0 0 0)) +;;; Generated autoloads from org-attach.el + +(autoload 'org-attach "org-attach" "\ +The dispatcher for attachment commands. +Shows a list of commands and prompts for another key to execute a command. -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-bibtex" '("org-"))) +\(fn)" t nil) + +(autoload 'org-attach-dired-to-subtree "org-attach" "\ +Attach FILES marked or current file in dired to subtree in other window. +Takes the method given in `org-attach-method' for the attach action. +Precondition: Point must be in a dired buffer. +Idea taken from `gnus-dired-attach'. + +\(fn FILES)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-attach" '("org-attach-"))) ;;;*** @@ -1104,7 +1141,7 @@ Set `org-capture-templates' to be similar to `org-remember-templates'. ;;;*** -;;;### (autoloads nil "org-clock" "org-clock.el" "09e036675a771d7f456be4c9cfd7ace1") +;;;### (autoloads nil "org-clock" "org-clock.el" (0 0 0 0)) ;;; Generated autoloads from org-clock.el (autoload 'org-resolve-clocks "org-clock" "\ @@ -1257,6 +1294,8 @@ Otherwise, return nil. \(fn)" t nil) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-clock" '("org-"))) + ;;;*** ;;;### (autoloads nil "org-colview" "org-colview.el" (0 0 0 0)) @@ -1385,7 +1424,7 @@ Try very hard to provide sensible version strings. ;;;*** -;;;### (autoloads nil "org-datetree" "org-datetree.el" "774ad6e1857fe8931bc781835a24a290") +;;;### (autoloads nil "org-datetree" "org-datetree.el" (0 0 0 0)) ;;; Generated autoloads from org-datetree.el (autoload 'org-datetree-find-date-create "org-datetree" "\ @@ -1407,12 +1446,7 @@ will be built under the headline at point. \(fn D &optional KEEP-RESTRICTION)" nil nil) -;;;*** - -;;;### (autoloads nil "org-docview" "org-docview.el" (0 0 0 0)) -;;; Generated autoloads from org-docview.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-docview" '("org-docview-"))) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-datetree" '("org-datetree-"))) ;;;*** @@ -1472,7 +1506,7 @@ with \"H:MM:SS\" format, return `h:mm:ss'. Otherwise, return ;;;*** -;;;### (autoloads nil "org-element" "org-element.el" "8eae44e6e665b0f8351a629596de0f23") +;;;### (autoloads nil "org-element" "org-element.el" (0 0 0 0)) ;;; Generated autoloads from org-element.el (autoload 'org-element-update-syntax "org-element" "\ @@ -1542,6 +1576,8 @@ Providing it allows for quicker computation. \(fn &optional ELEMENT)" nil nil) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-element" '("org-element-"))) + ;;;*** ;;;### (autoloads nil "org-entities" "org-entities.el" (0 0 0 0)) @@ -1549,20 +1585,6 @@ Providing it allows for quicker computation. (if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-entities" '("org-entit"))) -;;;*** - -;;;### (autoloads nil "org-eshell" "org-eshell.el" (0 0 0 0)) -;;; Generated autoloads from org-eshell.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-eshell" '("org-eshell-"))) - -;;;*** - -;;;### (autoloads nil "org-eww" "org-eww.el" (0 0 0 0)) -;;; Generated autoloads from org-eww.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-eww" '("org-eww-"))) - ;;;*** ;;;### (autoloads nil "org-faces" "org-faces.el" (0 0 0 0)) @@ -1572,7 +1594,7 @@ Providing it allows for quicker computation. ;;;*** -;;;### (autoloads nil "org-feed" "org-feed.el" "09d3f3b37609f33ffa8ab4674b169e5d") +;;;### (autoloads nil "org-feed" "org-feed.el" (0 0 0 0)) ;;; Generated autoloads from org-feed.el (autoload 'org-feed-update-all "org-feed" "\ @@ -1597,9 +1619,11 @@ Show the raw feed buffer of a feed. \(fn FEED)" t nil) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-feed" '("org-feed-"))) + ;;;*** -;;;### (autoloads nil "org-footnote" "org-footnote.el" "b41d3db2b6aa12632b8bdeafb28990e6") +;;;### (autoloads nil "org-footnote" "org-footnote.el" (0 0 0 0)) ;;; Generated autoloads from org-footnote.el (autoload 'org-footnote-action "org-footnote" "\ @@ -1618,12 +1642,7 @@ offer additional commands in a menu. \(fn &optional SPECIAL)" t nil) -;;;*** - -;;;### (autoloads nil "org-gnus" "org-gnus.el" (0 0 0 0)) -;;; Generated autoloads from org-gnus.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-gnus" '("org-gnus-"))) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-footnote" '("org-footnote-"))) ;;;*** @@ -1670,7 +1689,7 @@ With a prefix argument, use the alternative interface: e.g., if ;;;*** -;;;### (autoloads nil "org-id" "org-id.el" "74449482184943877eb07f3d613161b0") +;;;### (autoloads nil "org-id" "org-id.el" (0 0 0 0)) ;;; Generated autoloads from org-id.el (autoload 'org-id-get-create "org-id" "\ @@ -1746,7 +1765,7 @@ Scan relevant files for IDs. Store the relation between files and corresponding IDs. This will scan all agenda files, all associated archives, and all files currently mentioned in `org-id-locations'. -When FILES is given, scan these files instead. +When FILES is given, scan also these files. \(fn &optional FILES SILENT)" t nil) @@ -1760,14 +1779,21 @@ Store a link to the current entry, using its ID. \(fn)" t nil) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-id" '("org-id-"))) + ;;;*** -;;;### (autoloads nil "org-indent" "org-indent.el" "65830b3f864eb27e88fb85cea5eb1530") +;;;### (autoloads nil "org-indent" "org-indent.el" (0 0 0 0)) ;;; Generated autoloads from org-indent.el (autoload 'org-indent-mode "org-indent" "\ When active, indent text according to outline structure. +If called interactively, enable Org-Indent mode if ARG is positive, and +disable it if ARG is zero or negative. If called from Lisp, +also enable the mode if ARG is omitted or nil, and toggle it +if ARG is `toggle'; disable the mode otherwise. + Internally this works by adding `line-prefix' and `wrap-prefix' properties, after each buffer modification, on the modified zone. @@ -1777,12 +1803,7 @@ during idle time. \(fn &optional ARG)" t nil) -;;;*** - -;;;### (autoloads nil "org-info" "org-info.el" (0 0 0 0)) -;;; Generated autoloads from org-info.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-info" '("org-info-"))) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-indent" '("org-"))) ;;;*** @@ -1794,13 +1815,15 @@ during idle time. ;;;*** -;;;### (autoloads nil "org-irc" "org-irc.el" "9388cd8fe8782551d200da0772c56a00") -;;; Generated autoloads from org-irc.el +;;;### (autoloads nil "org-keys" "org-keys.el" (0 0 0 0)) +;;; Generated autoloads from org-keys.el -(autoload 'org-irc-store-link "org-irc" "\ -Dispatch to the appropriate function to store a link to an IRC session. +(autoload 'org-babel-describe-bindings "org-keys" "\ +Describe all keybindings behind `org-babel-key-prefix'. -\(fn)" nil nil) +\(fn)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-keys" '("org-"))) ;;;*** @@ -1848,14 +1871,7 @@ Load FILE with optional arguments NOERROR and MUSTSUFFIX. ;;;*** -;;;### (autoloads nil "org-mhe" "org-mhe.el" (0 0 0 0)) -;;; Generated autoloads from org-mhe.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-mhe" '("org-mhe-"))) - -;;;*** - -;;;### (autoloads nil "org-mobile" "org-mobile.el" "f2d2d0e3563b888bb9ecf8f7c178ccc2") +;;;### (autoloads nil "org-mobile" "org-mobile.el" "253ec03c4a1602a599990056d1e3d593") ;;; Generated autoloads from org-mobile.el (autoload 'org-mobile-push "org-mobile" "\ @@ -1879,6 +1895,29 @@ agenda view showing the flagged items. (if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-mouse" '("org-mouse-"))) +;;;*** + +;;;### (autoloads nil "org-num" "org-num.el" (0 0 0 0)) +;;; Generated autoloads from org-num.el + +(autoload 'org-num-default-format "org-num" "\ +Default numbering display function. +NUMBERING is a list of numbers. + +\(fn NUMBERING)" nil nil) + +(autoload 'org-num-mode "org-num" "\ +Dynamic numbering of headlines in an Org buffer. + +If called interactively, enable Org-Num mode if ARG is positive, and +disable it if ARG is zero or negative. If called from Lisp, +also enable the mode if ARG is omitted or nil, and toggle it +if ARG is `toggle'; disable the mode otherwise. + +\(fn &optional ARG)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-num" '("org-num-"))) + ;;;*** ;;;### (autoloads nil "org-pcomplete" "org-pcomplete.el" (0 0 0 0)) @@ -1888,7 +1927,7 @@ agenda view showing the flagged items. ;;;*** -;;;### (autoloads nil "org-plot" "org-plot.el" "5b1b5812de5673417289c68c9576764f") +;;;### (autoloads nil "org-plot" "org-plot.el" "b74b5a66677d21c53b9d1e79ecf3a0f3") ;;; Generated autoloads from org-plot.el (autoload 'org-plot/gnuplot "org-plot" "\ @@ -1905,13 +1944,6 @@ line directly before or after the table. (if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-protocol" '("org-protocol-"))) -;;;*** - -;;;### (autoloads nil "org-rmail" "org-rmail.el" (0 0 0 0)) -;;; Generated autoloads from org-rmail.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-rmail" '("org-rmail-"))) - ;;;*** ;;;### (autoloads nil "org-src" "org-src.el" (0 0 0 0)) @@ -1921,7 +1953,7 @@ line directly before or after the table. ;;;*** -;;;### (autoloads nil "org-table" "org-table.el" "78dad654d2f5d4809d1ddb26566dc777") +;;;### (autoloads nil "org-table" "org-table.el" "af6ff24334c69e3031aeff838dc097a3") ;;; Generated autoloads from org-table.el (autoload 'org-table-create-with-table\.el "org-table" "\ @@ -1990,28 +2022,6 @@ regexp When a regular expression, use it to match the separator. \(fn FILE SEPARATOR)" t nil) -(autoload 'org-table-export "org-table" "\ -Export table to a file, with configurable format. -Such a file can be imported into usual spreadsheet programs. - -FILE can be the output file name. If not given, it will be taken -from a TABLE_EXPORT_FILE property in the current entry or higher -up in the hierarchy, or the user will be prompted for a file -name. FORMAT can be an export format, of the same kind as it -used when `orgtbl-mode' sends a table in a different format. - -The command suggests a format depending on TABLE_EXPORT_FORMAT, -whether it is set locally or up in the hierarchy, then on the -extension of the given file name, and finally on the variable -`org-table-export-default-format'. - -\(fn &optional FILE FORMAT)" t nil) - -(autoload 'org-table-align "org-table" "\ -Align the table at point by aligning all vertical bars. - -\(fn)" t nil) - (autoload 'org-table-begin "org-table" "\ Find the beginning of the table and return its position. With a non-nil optional argument TABLE-TYPE, return the beginning @@ -2028,12 +2038,6 @@ a table. \(fn &optional TABLE-TYPE)" nil nil) -(autoload 'org-table-justify-field-maybe "org-table" "\ -Justify the current field, text to left, number to right. -Optional argument NEW may specify text to replace the current field content. - -\(fn &optional NEW)" nil nil) - (autoload 'org-table-next-field "org-table" "\ Go to the next field in the current table, creating new lines as needed. Before doing so, re-align the table if necessary. @@ -2052,26 +2056,6 @@ Before doing so, re-align the table if necessary. \(fn)" t nil) -(autoload 'org-table-copy-down "org-table" "\ -Copy the value of the current field one row below. - -If the field at the cursor is empty, copy the content of the -nearest non-empty field above. With argument N, use the Nth -non-empty field. - -If the current field is not empty, it is copied down to the next -row, and the cursor is moved with it. Therefore, repeating this -command causes the column to be filled row-by-row. - -If the variable `org-table-copy-increment' is non-nil and the -field is an integer or a timestamp, it will be incremented while -copying. By default, increment by the difference between the -value in the current field and the one in the field above. To -increment using a fixed integer, set `org-table-copy-increment' -to a number. In the case of a timestamp, increment by days. - -\(fn N)" t nil) - (autoload 'org-table-blank-field "org-table" "\ Blank the current table field or active region. @@ -2096,6 +2080,30 @@ Insert a new column into the table. \(fn)" t nil) +(autoload 'org-table-move-cell-up "org-table" "\ +Move a single cell up in a table. +Swap with anything in target cell. + +\(fn)" t nil) + +(autoload 'org-table-move-cell-down "org-table" "\ +Move a single cell down in a table. +Swap with anything in target cell. + +\(fn)" t nil) + +(autoload 'org-table-move-cell-left "org-table" "\ +Move a single cell left in a table. +Swap with anything in target cell. + +\(fn)" t nil) + +(autoload 'org-table-move-cell-right "org-table" "\ +Move a single cell right in a table. +Swap with anything in target cell. + +\(fn)" t nil) + (autoload 'org-table-delete-column "org-table" "\ Delete a column from the table. @@ -2153,45 +2161,34 @@ Delete the current row or horizontal line from the table. \(fn)" t nil) -(autoload 'org-table-sort-lines "org-table" "\ -Sort table lines according to the column at point. - -The position of point indicates the column to be used for -sorting, and the range of lines is the range between the nearest -horizontal separator lines, or the entire table of no such lines -exist. If point is before the first column, you will be prompted -for the sorting column. If there is an active region, the mark -specifies the first line and the sorting column, while point -should be in the last line to be included into the sorting. - -The command then prompts for the sorting type which can be -alphabetically, numerically, or by time (as given in a time stamp -in the field, or as a HH:MM value). Sorting in reverse order is -also possible. +(autoload 'org-table-cut-region "org-table" "\ +Copy region in table to the clipboard and blank all relevant fields. +If there is no active region, use just the field at point. -With prefix argument WITH-CASE, alphabetic sorting will be case-sensitive -if the locale allows for it. +\(fn BEG END)" t nil) -If SORTING-TYPE is specified when this function is called from a Lisp -program, no prompting will take place. SORTING-TYPE must be a character, -any of (?a ?A ?n ?N ?t ?T ?f ?F) where the capital letters indicate that -sorting should be done in reverse order. +(autoload 'org-table-copy-down "org-table" "\ +Copy the value of the current field one row below. -If the SORTING-TYPE is ?f or ?F, then GETKEY-FUNC specifies -a function to be called to extract the key. It must return a value -that is compatible with COMPARE-FUNC, the function used to compare -entries. +If the field at the cursor is empty, copy the content of the +nearest non-empty field above. With argument N, use the Nth +non-empty field. -A non-nil value for INTERACTIVE? is used to signal that this -function is being called interactively. +If the current field is not empty, it is copied down to the next +row, and the cursor is moved with it. Therefore, repeating this +command causes the column to be filled row-by-row. -\(fn &optional WITH-CASE SORTING-TYPE GETKEY-FUNC COMPARE-FUNC INTERACTIVE\\=\\?)" t nil) +If the variable `org-table-copy-increment' is non-nil and the +field is a number, a timestamp, or is either prefixed or suffixed +with a number, it will be incremented while copying. By default, +increment by the difference between the value in the current +field and the one in the field above, if any. To increment using +a fixed integer, set `org-table-copy-increment' to a number. In +the case of a timestamp, increment by days. -(autoload 'org-table-cut-region "org-table" "\ -Copy region in table to the clipboard and blank all relevant fields. -If there is no active region, use just the field at point. +However, when N is 0, do not increment the field at all. -\(fn BEG END)" t nil) +\(fn N)" t nil) (autoload 'org-table-copy-region "org-table" "\ Copy rectangular region in table to clipboard. @@ -2210,43 +2207,6 @@ lines. \(fn)" t nil) -(autoload 'org-table-convert "org-table" "\ -Convert from `org-mode' table to table.el and back. -Obviously, this only works within limits. When an Org table is converted -to table.el, all horizontal separator lines get lost, because table.el uses -these as cell boundaries and has no notion of horizontal lines. A table.el -table can be converted to an Org table only if it does not do row or column -spanning. Multiline cells will become multiple cells. Beware, Org mode -does not test if the table can be successfully converted - it blindly -applies a recipe that works for simple tables. - -\(fn)" t nil) - -(autoload 'org-table-wrap-region "org-table" "\ -Wrap several fields in a column like a paragraph. -This is useful if you'd like to spread the contents of a field over several -lines, in order to keep the table compact. - -If there is an active region, and both point and mark are in the same column, -the text in the column is wrapped to minimum width for the given number of -lines. Generally, this makes the table more compact. A prefix ARG may be -used to change the number of desired lines. For example, `C-2 \\[org-table-wrap-region]' -formats the selected text to two lines. If the region was longer than two -lines, the remaining lines remain empty. A negative prefix argument reduces -the current number of lines by that amount. The wrapped text is pasted back -into the table. If you formatted it to more lines than it was before, fields -further down in the table get overwritten - so you might need to make space in -the table first. - -If there is no region, the current field is split at the cursor position and -the text fragment to the right of the cursor is prepended to the field one -line down. - -If there is no region, but you specify a prefix ARG, the current field gets -blank, and the content is appended to the field above. - -\(fn ARG)" t nil) - (autoload 'org-table-edit-field "org-table" "\ Edit table field in a different window. This is mainly useful for fields that contain hidden parts. @@ -2258,24 +2218,6 @@ When called with a `\\[universal-argument] \\[universal-argument]' prefix, toggl \(fn ARG)" t nil) -(autoload 'org-table-sum "org-table" "\ -Sum numbers in region of current table column. -The result will be displayed in the echo area, and will be available -as kill to be inserted with \\[yank]. - -If there is an active region, it is interpreted as a rectangle and all -numbers in that rectangle will be summed. If there is no active -region and point is located in a table column, sum all numbers in that -column. - -If at least one number looks like a time HH:MM or HH:MM:SS, all other -numbers are assumed to be times as well (in decimal hours) and the -numbers are added as such. - -If NLAST is a number, only the NLAST fields will actually be summed. - -\(fn &optional BEG END NLAST)" t nil) - (autoload 'org-table-get-stored-formulas "org-table" "\ Return an alist with the stored formulas directly after current table. By default, only return active formulas, i.e., formulas located @@ -2301,23 +2243,6 @@ of the new mark. \(fn &optional NEWCHAR)" t nil) -(autoload 'org-table-analyze "org-table" "\ -Analyze table at point and store results. - -This function sets up the following dynamically scoped variables: - - `org-table-column-name-regexp', - `org-table-column-names', - `org-table-current-begin-pos', - `org-table-current-line-types', - `org-table-current-ncol', - `org-table-dlines', - `org-table-hlines', - `org-table-local-parameters', - `org-table-named-field-locations'. - -\(fn)" nil nil) - (autoload 'org-table-maybe-recalculate-line "org-table" "\ Recompute the current line if marked for it, and if we haven't just done it. @@ -2400,6 +2325,16 @@ Edit the formulas of the current table in a separate buffer. \(fn)" t nil) +(autoload 'org-table-toggle-coordinate-overlays "org-table" "\ +Toggle the display of Row/Column numbers in tables. + +\(fn)" t nil) + +(autoload 'org-table-toggle-formula-debugger "org-table" "\ +Toggle the formula debugger in tables. + +\(fn)" t nil) + (autoload 'org-table-toggle-column-width "org-table" "\ Shrink or expand current column in an Org table. @@ -2444,15 +2379,139 @@ beginning and end position of the current table. \(fn &optional BEGIN END)" t nil) -(autoload 'org-table-toggle-coordinate-overlays "org-table" "\ -Toggle the display of Row/Column numbers in tables. +(autoload 'org-table-map-tables "org-table" "\ +Apply function F to the start of all tables in the buffer. -\(fn)" t nil) +\(fn F &optional QUIETLY)" nil nil) -(autoload 'org-table-toggle-formula-debugger "org-table" "\ -Toggle the formula debugger in tables. +(autoload 'org-table-export "org-table" "\ +Export table to a file, with configurable format. +Such a file can be imported into usual spreadsheet programs. -\(fn)" t nil) +FILE can be the output file name. If not given, it will be taken +from a TABLE_EXPORT_FILE property in the current entry or higher +up in the hierarchy, or the user will be prompted for a file +name. FORMAT can be an export format, of the same kind as it +used when `-mode' sends a table in a different format. + +The command suggests a format depending on TABLE_EXPORT_FORMAT, +whether it is set locally or up in the hierarchy, then on the +extension of the given file name, and finally on the variable +`org-table-export-default-format'. + +\(fn &optional FILE FORMAT)" t nil) + +(autoload 'org-table--align-field "org-table" "\ +Format FIELD according to column WIDTH and alignment ALIGN. +FIELD is a string. WIDTH is a number. ALIGN is either \"c\", +\"l\" or\"r\". + +\(fn FIELD WIDTH ALIGN)" nil nil) + +(autoload 'org-table-justify-field-maybe "org-table" "\ +Justify the current field, text to left, number to right. +Optional argument NEW may specify text to replace the current field content. + +\(fn &optional NEW)" nil nil) + +(autoload 'org-table-sort-lines "org-table" "\ +Sort table lines according to the column at point. + +The position of point indicates the column to be used for +sorting, and the range of lines is the range between the nearest +horizontal separator lines, or the entire table of no such lines +exist. If point is before the first column, you will be prompted +for the sorting column. If there is an active region, the mark +specifies the first line and the sorting column, while point +should be in the last line to be included into the sorting. + +The command then prompts for the sorting type which can be +alphabetically, numerically, or by time (as given in a time stamp +in the field, or as a HH:MM value). Sorting in reverse order is +also possible. + +With prefix argument WITH-CASE, alphabetic sorting will be case-sensitive +if the locale allows for it. + +If SORTING-TYPE is specified when this function is called from a Lisp +program, no prompting will take place. SORTING-TYPE must be a character, +any of (?a ?A ?n ?N ?t ?T ?f ?F) where the capital letters indicate that +sorting should be done in reverse order. + +If the SORTING-TYPE is ?f or ?F, then GETKEY-FUNC specifies +a function to be called to extract the key. It must return a value +that is compatible with COMPARE-FUNC, the function used to compare +entries. + +A non-nil value for INTERACTIVE? is used to signal that this +function is being called interactively. + +\(fn &optional WITH-CASE SORTING-TYPE GETKEY-FUNC COMPARE-FUNC INTERACTIVE\\=\\?)" t nil) + +(autoload 'org-table-wrap-region "org-table" "\ +Wrap several fields in a column like a paragraph. +This is useful if you'd like to spread the contents of a field over several +lines, in order to keep the table compact. + +If there is an active region, and both point and mark are in the same column, +the text in the column is wrapped to minimum width for the given number of +lines. Generally, this makes the table more compact. A prefix ARG may be +used to change the number of desired lines. For example, `C-2 \\[org-table-wrap-region]' +formats the selected text to two lines. If the region was longer than two +lines, the remaining lines remain empty. A negative prefix argument reduces +the current number of lines by that amount. The wrapped text is pasted back +into the table. If you formatted it to more lines than it was before, fields +further down in the table get overwritten - so you might need to make space in +the table first. + +If there is no region, the current field is split at the cursor position and +the text fragment to the right of the cursor is prepended to the field one +line down. + +If there is no region, but you specify a prefix ARG, the current field gets +blank, and the content is appended to the field above. + +\(fn ARG)" t nil) + +(autoload 'org-table-sum "org-table" "\ +Sum numbers in region of current table column. +The result will be displayed in the echo area, and will be available +as kill to be inserted with \\[yank]. + +If there is an active region, it is interpreted as a rectangle and all +numbers in that rectangle will be summed. If there is no active +region and point is located in a table column, sum all numbers in that +column. + +If at least one number looks like a time HH:MM or HH:MM:SS, all other +numbers are assumed to be times as well (in decimal hours) and the +numbers are added as such. + +If NLAST is a number, only the NLAST fields will actually be summed. + +\(fn &optional BEG END NLAST)" t nil) + +(autoload 'org-table-analyze "org-table" "\ +Analyze table at point and store results. + +This function sets up the following dynamically scoped variables: + + `org-table-column-name-regexp', + `org-table-column-names', + `org-table-current-begin-pos', + `org-table-current-line-types', + `org-table-current-ncol', + `org-table-dlines', + `org-table-hlines', + `org-table-local-parameters', + `org-table-named-field-locations'. + +\(fn)" nil nil) + +(autoload 'turn-on-orgtbl "org-table" "\ +Unconditionally turn on `orgtbl-mode'. + +\(fn)" nil nil) (autoload 'orgtbl-mode "org-table" "\ The Org mode table editor as a minor mode for use in other modes. @@ -2672,7 +2731,7 @@ which will prompt for the width. ;;;*** -;;;### (autoloads nil "org-timer" "org-timer.el" "bc6a3c092cda456629c77cbbad6be0a5") +;;;### (autoloads nil "org-timer" "org-timer.el" "07f32a33f71c5980a9088d2e532ebb14") ;;; Generated autoloads from org-timer.el (autoload 'org-timer-start "org-timer" "\ @@ -2764,16 +2823,6 @@ Inserted by installing Org or when a release is made. \(fn)" nil nil) -(defvar org-odt-data-dir "/usr/share/emacs/etc/org" "\ -The location of ODT styles.") - -;;;*** - -;;;### (autoloads nil "org-w3m" "org-w3m.el" (0 0 0 0)) -;;; Generated autoloads from org-w3m.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "org-w3m" '("org-w3m-"))) - ;;;*** ;;;### (autoloads nil "org" "org.el" (0 0 0 0)) @@ -2787,9 +2836,9 @@ Load the languages defined in `org-babel-load-languages'. (autoload 'org-babel-load-file "org" "\ Load Emacs Lisp source code blocks in the Org FILE. This function exports the source code using `org-babel-tangle' -and then loads the resulting file using `load-file'. With prefix -arg (noninteractively: 2nd arg) COMPILE the tangled Emacs Lisp -file to byte-code before it is loaded. +and then loads the resulting file using `load-file'. With +optional prefix argument COMPILE, the tangled Emacs Lisp file is +byte-compiled before it is loaded. \(fn FILE &optional COMPILE)" t nil) @@ -2802,11 +2851,6 @@ FULL is given. \(fn &optional HERE FULL MESSAGE)" t nil) -(autoload 'turn-on-orgtbl "org" "\ -Unconditionally turn on `orgtbl-mode'. - -\(fn)" nil nil) - (autoload 'org-clock-persistence-insinuate "org" "\ Set up hooks for clock persistence. @@ -2900,32 +2944,29 @@ call CMD. \(fn CMD)" nil nil) -(autoload 'org-store-link "org" "\ -Store a link to the current location. -\\ -This link is added to `org-stored-links' and can later be inserted -into an Org buffer with `org-insert-link' (`\\[org-insert-link]'). +(autoload 'org-open-file "org" "\ +Open the file at PATH. +First, this expands any special file name abbreviations. Then the +configuration variable `org-file-apps' is checked if it contains an +entry for this file type, and if yes, the corresponding command is launched. -For some link types, a `\\[universal-argument]' prefix ARG is interpreted. A single -`\\[universal-argument]' negates `org-context-in-file-links' for file links or -`org-gnus-prefer-web-links' for links to Usenet articles. +If no application is found, Emacs simply visits the file. -A `\\[universal-argument] \\[universal-argument]' prefix ARG forces skipping storing functions that are not -part of Org core. +With optional prefix argument IN-EMACS, Emacs will visit the file. +With a double \\[universal-argument] \\[universal-argument] prefix arg, Org tries to avoid opening in Emacs +and to use an external application to visit the file. -A `\\[universal-argument] \\[universal-argument] \\[universal-argument]' prefix ARG forces storing a link for each line in the -active region. +Optional LINE specifies a line to go to, optional SEARCH a string +to search for. If LINE or SEARCH is given, the file will be +opened in Emacs, unless an entry from `org-file-apps' that makes +use of groups in a regexp matches. -Assume the function is called interactively if INTERACTIVE? is -non-nil. - -\(fn ARG &optional INTERACTIVE\\=\\?)" t nil) +If you want to change the way frames are used when following a +link, please customize `org-link-frame-setup'. -(autoload 'org-insert-link-global "org" "\ -Insert a link like Org mode does. -This command can be called in any mode to insert a link in Org syntax. +If the file does not exist, throw an error. -\(fn)" t nil) +\(fn PATH &optional IN-EMACS LINE SEARCH)" nil nil) (autoload 'org-open-at-point-global "org" "\ Follow a link or a time-stamp like Org mode does. @@ -2937,10 +2978,14 @@ Raise a user error when there is nothing to follow. \(fn)" t nil) -(autoload 'org-open-link-from-string "org" "\ -Open a link in the string S, as if it was in Org mode. +(autoload 'org-offer-links-in-entry "org" "\ +Offer links in the current entry and return the selected link. +If there is only one link, return it. +If NTH is an integer, return the NTH link found. +If ZERO is a string, check also this string for a link, and if +there is one, return it. -\(fn S &optional ARG REFERENCE-BUFFER)" t nil) +\(fn BUFFER MARKER &optional NTH ZERO)" nil nil) (autoload 'org-switchb "org" "\ Switch between Org buffers. @@ -2984,7 +3029,7 @@ Call the customize function with org as argument. ;;;*** -;;;### (autoloads nil "ox" "ox.el" "5c180fcee4218ffa29d079c74fe98a1e") +;;;### (autoloads nil "ox" "ox.el" "bf7e0d6c4b1ca15b2856f8064e1161e8") ;;; Generated autoloads from ox.el (autoload 'org-export-get-backend "ox" "\ @@ -3173,7 +3218,7 @@ When ARG is `\\[universal-argument] \\[universal-argument]', display the asynchr ;;;*** -;;;### (autoloads nil "ox-ascii" "ox-ascii.el" "05e3f27f1926aa80e03e60c5a144698a") +;;;### (autoloads nil "ox-ascii" "ox-ascii.el" "e486804f1465a5da9b378342aab51b39") ;;; Generated autoloads from ox-ascii.el (autoload 'org-ascii-convert-region-to-ascii "ox-ascii" "\ @@ -3283,7 +3328,7 @@ Return output file name. ;;;*** -;;;### (autoloads nil "ox-beamer" "ox-beamer.el" "8f4c533f7a78db11f5254c3eac3bd74a") +;;;### (autoloads nil "ox-beamer" "ox-beamer.el" "49dea3eb21ddbb32ea3d186811c1b7a5") ;;; Generated autoloads from ox-beamer.el (autoload 'org-beamer-mode "ox-beamer" "\ @@ -3418,7 +3463,7 @@ Return output file name. ;;;*** -;;;### (autoloads nil "ox-html" "ox-html.el" "82d63fef0c62428e845fa0420d223001") +;;;### (autoloads nil "ox-html" "ox-html.el" "c6ecd77804a3a44b354eb84eacd8bb86") ;;; Generated autoloads from ox-html.el (put 'org-html-head-include-default-style 'safe-local-variable 'booleanp) @@ -3524,7 +3569,7 @@ Return output file name. ;;;*** -;;;### (autoloads nil "ox-icalendar" "ox-icalendar.el" "3b1b67f6565e5b4d0184ce28171ddf72") +;;;### (autoloads nil "ox-icalendar" "ox-icalendar.el" "c7c03b69aa9a8e7ecce385a1f66a1190") ;;; Generated autoloads from ox-icalendar.el (autoload 'org-icalendar-export-to-ics "ox-icalendar" "\ @@ -3574,7 +3619,7 @@ The file is stored under the name chosen in ;;;*** -;;;### (autoloads nil "ox-latex" "ox-latex.el" "f053f99b85a13076e25129148beb2444") +;;;### (autoloads nil "ox-latex" "ox-latex.el" "34c654817cdf3847334af5ef9e5d7fc8") ;;; Generated autoloads from ox-latex.el (autoload 'org-latex-make-preamble "ox-latex" "\ @@ -3717,7 +3762,7 @@ Return output file name. ;;;*** -;;;### (autoloads nil "ox-md" "ox-md.el" "8c71b478d4e65b73ade054f063fd7180") +;;;### (autoloads nil "ox-md" "ox-md.el" "4ab99e949dbf6e3155ba97413135a505") ;;; Generated autoloads from ox-md.el (autoload 'org-md-export-as-markdown "ox-md" "\ @@ -3789,7 +3834,7 @@ Return output file name. ;;;*** -;;;### (autoloads nil "ox-odt" "ox-odt.el" "45fb134b33513af3eedc7e3f23c9c3cc") +;;;### (autoloads nil "ox-odt" "ox-odt.el" "f93435c1ea4d02b23b8bb4fabbeaba8e") ;;; Generated autoloads from ox-odt.el (put 'org-odt-preferred-output-format 'safe-local-variable 'stringp) @@ -3851,7 +3896,7 @@ is non-nil then the newly converted file is opened using ;;;*** -;;;### (autoloads nil "ox-org" "ox-org.el" "972097e855219af48a9bbf11d46718cf") +;;;### (autoloads nil "ox-org" "ox-org.el" "80543be9a4dc90f660e5cdded24f4ce7") ;;; Generated autoloads from ox-org.el (autoload 'org-org-export-as-org "ox-org" "\ @@ -3929,7 +3974,7 @@ Return output file name. ;;;*** -;;;### (autoloads nil "ox-publish" "ox-publish.el" "c482babb6cfcbf40e277920bd2c79d0e") +;;;### (autoloads nil "ox-publish" "ox-publish.el" "874b7fbc7347bb5ec0f7da70a299312f") ;;; Generated autoloads from ox-publish.el (defalias 'org-publish-project 'org-publish) @@ -3972,7 +4017,7 @@ the project. ;;;*** -;;;### (autoloads nil "ox-texinfo" "ox-texinfo.el" "3b67fdba7e3d087dfe1bfff25105323a") +;;;### (autoloads nil "ox-texinfo" "ox-texinfo.el" "15c22ba49acfc76009bf6acb1a301966") ;;; Generated autoloads from ox-texinfo.el (autoload 'org-texinfo-export-to-texinfo "ox-texinfo" "\ diff --git a/elpa/org-20191028/org-macro.el b/elpa/org-20200127/org-macro.el similarity index 99% rename from elpa/org-20191028/org-macro.el rename to elpa/org-20200127/org-macro.el index e1241c30..a1b987a8 100644 --- a/elpa/org-20191028/org-macro.el +++ b/elpa/org-20200127/org-macro.el @@ -1,6 +1,6 @@ ;;; org-macro.el --- Macro Replacement Code for Org -*- lexical-binding: t; -*- -;; Copyright (C) 2013-2019 Free Software Foundation, Inc. +;; Copyright (C) 2013-2020 Free Software Foundation, Inc. ;; Author: Nicolas Goaziou ;; Keywords: outlines, hypermedia, calendar, wp @@ -62,7 +62,7 @@ (declare-function org-file-contents "org" (file &optional noerror nocache)) (declare-function org-file-url-p "org" (file)) (declare-function org-in-commented-heading-p "org" (&optional no-inheritance)) -(declare-function org-link-search "org" (s &optional avoid-pos stealth)) +(declare-function org-link-search "ol" (s &optional avoid-pos stealth)) (declare-function org-mode "org" ()) (declare-function vc-backend "vc-hooks" (f)) (declare-function vc-call "vc-hooks" (fun file &rest args) t) @@ -149,6 +149,7 @@ In addition to buffer-defined macros, the function installs the following ones: \"n\", \"author\", \"email\", \"keyword\", \"time\", \"property\", and, if the buffer is associated to a file, \"input-file\" and \"modification-time\"." + (require 'org-element) (org-macro--counter-initialize) ;for "n" macro (setq org-macro-templates (nconc diff --git a/elpa/org-20191028/org-macs.el b/elpa/org-20200127/org-macs.el similarity index 93% rename from elpa/org-20191028/org-macs.el rename to elpa/org-20200127/org-macs.el index 23f96ef2..4a40765e 100644 --- a/elpa/org-20191028/org-macs.el +++ b/elpa/org-20200127/org-macs.el @@ -1,6 +1,6 @@ ;;; org-macs.el --- Top-level Definitions for Org -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -209,17 +209,6 @@ because otherwise all these markers will point to nowhere." `(let (pop-up-frames display-buffer-alist) ,@body)) -(defmacro org-table-with-shrunk-field (&rest body) - "Save field shrunk state, execute BODY and restore state." - (declare (debug (body))) - (org-with-gensyms (end shrunk size) - `(let* ((,shrunk (save-match-data (org-table--shrunk-field))) - (,end (and ,shrunk (copy-marker (overlay-end ,shrunk) t))) - (,size (and ,shrunk (- ,end (overlay-start ,shrunk))))) - (when ,shrunk (delete-overlay ,shrunk)) - (unwind-protect (progn ,@body) - (when ,shrunk (move-overlay ,shrunk (- ,end ,size) ,end)))))) - ;;; Buffer and windows @@ -346,7 +335,7 @@ if it fails." (let ((min-ind (point-max))) (save-excursion (while (re-search-forward "^[ \t]*\\S-" nil t) - (let ((ind (1- (current-column)))) + (let ((ind (current-indentation))) (if (zerop ind) (throw :exit nil) (setq min-ind (min min-ind ind)))))) min-ind)))) @@ -991,6 +980,43 @@ as-is if removal failed." (insert code) (if (org-do-remove-indentation n) (buffer-string) code))) +(defun org-fill-template (template alist) + "Find each %key of ALIST in TEMPLATE and replace it." + (let ((case-fold-search nil)) + (dolist (entry (sort (copy-sequence alist) + (lambda (a b) (< (length (car a)) (length (car b)))))) + (setq template + (replace-regexp-in-string + (concat "%" (regexp-quote (car entry))) + (or (cdr entry) "") template t t))) + template)) + +(defun org-replace-escapes (string table) + "Replace %-escapes in STRING with values in TABLE. +TABLE is an association list with keys like \"%a\" and string values. +The sequences in STRING may contain normal field width and padding information, +for example \"%-5s\". Replacements happen in the sequence given by TABLE, +so values can contain further %-escapes if they are define later in TABLE." + (let ((tbl (copy-alist table)) + (case-fold-search nil) + (pchg 0) + re rpl) + (dolist (e tbl) + (setq re (concat "%-?[0-9.]*" (substring (car e) 1))) + (when (and (cdr e) (string-match re (cdr e))) + (let ((sref (substring (cdr e) (match-beginning 0) (match-end 0))) + (safe "SREF")) + (add-text-properties 0 3 (list 'sref sref) safe) + (setcdr e (replace-match safe t t (cdr e))))) + (while (string-match re string) + (setq rpl (format (concat (substring (match-string 0 string) 0 -1) "s") + (cdr e))) + (setq string (replace-match rpl t t string)))) + (while (setq pchg (next-property-change pchg string)) + (let ((sref (get-text-property pchg 'sref string))) + (when (and sref (string-match "SREF" string pchg)) + (setq string (replace-match sref t t string))))) + string)) ;;; Text properties @@ -1039,10 +1065,16 @@ the value in cdr." (get-text-property (or (next-single-property-change 0 prop s) 0) prop s))) -(defun org-invisible-p (&optional pos) +(defun org-invisible-p (&optional pos folding-only) "Non-nil if the character after POS is invisible. -If POS is nil, use `point' instead." - (get-char-property (or pos (point)) 'invisible)) +If POS is nil, use `point' instead. When optional argument +FOLDING-ONLY is non-nil, only consider invisible parts due to +folding of a headline, a block or a drawer, i.e., not because of +fontification." + (let ((value (get-char-property (or pos (point)) 'invisible))) + (cond ((not value) nil) + (folding-only (memq value '(org-hide-block org-hide-drawer outline))) + (t value)))) (defun org-truely-invisible-p () "Check if point is at a character currently not visible. @@ -1060,6 +1092,18 @@ move it back by one char before doing this check." (backward-char 1)) (org-invisible-p))) +(defun org-find-visible () + "Return closest visible buffer position, or `point-max'" + (if (org-invisible-p) + (next-single-char-property-change (point) 'invisible) + (point))) + +(defun org-find-invisible () + "Return closest invisible buffer position, or `point-max'" + (if (org-invisible-p) + (point) + (next-single-char-property-change (point) 'invisible))) + ;;; Time @@ -1072,7 +1116,7 @@ nil, just return 0." ((numberp s) s) ((stringp s) (condition-case nil - (float-time (org-time-string-to-time s)) + (float-time (apply #'encode-time (org-parse-time-string s))) (error 0))) (t 0))) diff --git a/elpa/org-20191028/org-mobile.el b/elpa/org-20200127/org-mobile.el similarity index 99% rename from elpa/org-20191028/org-mobile.el rename to elpa/org-20200127/org-mobile.el index ecbf82be..8749e496 100644 --- a/elpa/org-20191028/org-mobile.el +++ b/elpa/org-20200127/org-mobile.el @@ -1,5 +1,5 @@ ;;; org-mobile.el --- Code for Asymmetric Sync With a Mobile Device -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2019 Free Software Foundation, Inc. +;; Copyright (C) 2009-2020 Free Software Foundation, Inc. ;; ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -31,11 +31,10 @@ ;; iPhone and Android - any external viewer/flagging/editing ;; application that uses the same conventions could be used. +(require 'cl-lib) (require 'org) (require 'org-agenda) -(require 'cl-lib) - -(defvar org-agenda-keep-restricted-file-list) +(require 'ol) ;;; Code: @@ -670,8 +669,7 @@ The table of checksums is written to the file mobile-checksums." (org-mobile-escape-olp (nth 4 (org-heading-components)))))) (defun org-mobile-escape-olp (s) - (let ((table '(?: ?/))) - (org-link-escape s table))) + (org-link-encode s '(?: ?/))) (defun org-mobile-create-sumo-agenda () "Create a file that contains all custom agenda views." @@ -965,7 +963,7 @@ is currently a noop.") (if (not (string-match "\\`olp:\\(.*?\\)$" link)) nil (let ((file (match-string 1 link))) - (setq file (org-link-unescape file)) + (setq file (org-link-decode file)) (setq file (expand-file-name file org-directory)) (save-excursion (find-file file) @@ -975,9 +973,9 @@ is currently a noop.") (point-marker)))) (let ((file (match-string 1 link)) (path (match-string 2 link))) - (setq file (org-link-unescape file)) + (setq file (org-link-decode file)) (setq file (expand-file-name file org-directory)) - (setq path (mapcar 'org-link-unescape + (setq path (mapcar #'org-link-decode (org-split-string path "/"))) (org-find-olp (cons file path)))))) diff --git a/elpa/org-20191028/org-mouse.el b/elpa/org-20200127/org-mouse.el similarity index 99% rename from elpa/org-20191028/org-mouse.el rename to elpa/org-20200127/org-mouse.el index 13d88dad..02798874 100644 --- a/elpa/org-20191028/org-mouse.el +++ b/elpa/org-20200127/org-mouse.el @@ -1,6 +1,6 @@ ;;; org-mouse.el --- Better mouse support for Org -*- lexical-binding: t; -*- -;; Copyright (C) 2006-2019 Free Software Foundation, Inc. +;; Copyright (C) 2006-2020 Free Software Foundation, Inc. ;; Author: Piotr Zielinski ;; Maintainer: Carsten Dominik diff --git a/elpa/org-20200127/org-num.el b/elpa/org-20200127/org-num.el new file mode 100644 index 00000000..a6ddce73 --- /dev/null +++ b/elpa/org-20200127/org-num.el @@ -0,0 +1,471 @@ +;;; org-num.el --- Dynamic Headlines Numbering -*- lexical-binding: t; -*- + +;; Copyright (C) 2018-2020 Free Software Foundation, Inc. + +;; Author: Nicolas Goaziou +;; Keywords: outlines, hypermedia, calendar, wp + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; This library provides dynamic numbering for Org headlines. Use +;; +;; +;; +;; to toggle it. +;; +;; You can select what is numbered according to level, tags, COMMENT +;; keyword, or UNNUMBERED property. You can also skip footnotes +;; sections. See `org-num-max-level', `org-num-skip-tags', +;; `org-num-skip-commented', `org-num-skip-unnumbered', and +;; `org-num-skip-footnotes' for details. +;; +;; You can also control how the numbering is displayed by setting +;;`org-num-face' and `org-num-format-function'. +;; +;; Internally, the library handles an ordered list, per buffer +;; position, of overlays in `org-num--overlays'. These overlays are +;; marked with the `org-num' property set to a non-nil value. +;; +;; Overlays store the level of the headline in the `level' property, +;; and the face used for the numbering in `numbering-face'. +;; +;; The `skip' property is set to t when the corresponding headline has +;; some characteristic -- e.g., a node property, or a tag -- that +;; prevents it from being numbered. +;; +;; An overlay with `org-num' property set to `invalid' is called an +;; invalid overlay. Modified overlays automatically become invalid +;; and set `org-num--invalid-flag' to a non-nil value. After +;; a change, `org-num--invalid-flag' indicates numbering needs to be +;; updated and invalid overlays indicate where the buffer needs to be +;; parsed. So does `org-num--missing-overlay' variable. See +;; `org-num--verify' function for details. +;; +;; Numbering display is done through the `after-string' property. + + +;;; Code: + +(require 'cl-lib) +(require 'org-macs) + +(defvar org-comment-string) +(defvar org-complex-heading-regexp) +(defvar org-cycle-level-faces) +(defvar org-footnote-section) +(defvar org-level-faces) +(defvar org-n-level-faces) +(defvar org-odd-levels-only) + +(declare-function org-back-to-heading "org" (&optional invisible-ok)) +(declare-function org-entry-get "org" (pom property &optional inherit literal-nil)) +(declare-function org-reduced-level "org" (l)) + + +;;; Customization + +(defcustom org-num-face nil + "Face to use for numbering. +When nil, use the same face as the headline. This value is +ignored if `org-num-format-function' specifies a face for its +output." + :group 'org-appearance + :package-version '(Org . "9.3") + :type '(choice (const :tag "Like the headline" nil) + (face :tag "Use face")) + :safe (lambda (val) (or (null val) (facep val)))) + +(defcustom org-num-format-function 'org-num-default-format + "Function used to display numbering. +It is called with one argument, a list of numbers, and should +return a string, or nil. When nil, no numbering is displayed. +Any `face' text property on the returned string overrides +`org-num-face'." + :group 'org-appearance + :package-version '(Org . "9.3") + :type 'function + :safe nil) + +(defcustom org-num-max-level nil + "Level below which headlines are not numbered. +When set to nil, all headlines are numbered." + :group 'org-appearance + :package-version '(Org . "9.3") + :type '(choice (const :tag "Number everything" nil) + (integer :tag "Stop numbering at level")) + :safe (lambda (val) (or (null val) (wholenump val)))) + +(defcustom org-num-skip-commented nil + "Non-nil means commented sub-trees are not numbered." + :group 'org-appearance + :package-version '(Org . "9.3") + :type 'boolean + :safe #'booleanp) + +(defcustom org-num-skip-footnotes nil + "Non-nil means footnotes sections are not numbered." + :group 'org-appearance + :package-version '(Org . "9.3") + :type 'boolean + :safe #'booleanp) + +(defcustom org-num-skip-tags nil + "List of tags preventing the numbering of sub-trees. + +For example, add \"ARCHIVE\" to this list to avoid numbering +archived sub-trees. + +Tag in this list prevent numbering the whole sub-tree, +irrespective to `org-use-tags-inheritance', or other means to +control tag inheritance." + :group 'org-appearance + :package-version '(Org . "9.3") + :type '(repeat (string :tag "Tag")) + :safe (lambda (val) (and (listp val) (cl-every #'stringp val)))) + +(defcustom org-num-skip-unnumbered nil + "Non-nil means numbering obeys to UNNUMBERED property." + :group 'org-appearance + :package-version '(Org . "9.3") + :type 'boolean + :safe #'booleanp) + + +;;; Internal Variables + +(defconst org-num--comment-re (format "\\`%s\\(?: \\|$\\)" org-comment-string) + "Regexp matching a COMMENT keyword at headline beginning.") + +(defvar-local org-num--overlays nil + "Ordered list of overlays used for numbering outlines.") + +(defvar-local org-num--skip-level nil + "Level below which headlines from current tree are not numbered. +When nil, all headlines are numbered. It is used to handle +inheritance of no-numbering attributes.") + +(defvar-local org-num--numbering nil + "Current headline numbering. +A numbering is a list of integers, in reverse order. So numbering +for headline \"1.2.3\" is (3 2 1).") + +(defvar-local org-num--missing-overlay nil + "Buffer position signaling a headline without an overlay.") + +(defvar-local org-num--invalid-flag nil + "Non-nil means an overlay became invalid since last update.") + + +;;; Internal Functions + +(defsubst org-num--headline-regexp () + "Return regexp matching a numbered headline." + (if (null org-num-max-level) (org-with-limited-levels org-outline-regexp-bol) + (format "^\\*\\{1,%d\\} " + (if org-odd-levels-only (1- (* 2 org-num-max-level)) + org-num-max-level)))) + +(defsubst org-num--overlay-p (o) + "Non-nil if overlay O is a numbering overlay." + (overlay-get o 'org-num)) + +(defsubst org-num--valid-overlay-p (o) + "Non-nil if overlay O is still active in the buffer." + (not (eq 'invalid (overlay-get o 'org-num)))) + +(defsubst org-num--invalidate-overlay (o) + "Mark overlay O as invalid. +Update `org-num--invalid-flag' accordingly." + (overlay-put o 'org-num 'invalid) + (setq org-num--invalid-flag t)) + +(defun org-num--clear () + "Remove all numbering overlays in current buffer." + (mapc #'delete-overlay org-num--overlays) + (setq org-num--overlays nil)) + +(defun org-num--make-overlay (numbering level skip) + "Return overlay for numbering headline at point. + +NUMBERING is the numbering to use, as a list of integers, or nil +if nothing should be displayed. LEVEL is the level of the +headline. SKIP is its skip value. + +Assume point is at a headline." + (let ((after-edit-functions + (list (lambda (o &rest _) (org-num--invalidate-overlay o)))) + (o (save-excursion + (beginning-of-line) + (skip-chars-forward "*") + (make-overlay (line-beginning-position) (1+ (point)))))) + (overlay-put o 'org-num t) + (overlay-put o 'skip skip) + (overlay-put o 'level level) + (overlay-put o 'numbering-face + (or org-num-face + ;; Compute face that would be used at the + ;; headline. We cannot extract it from the + ;; buffer: at the time the overlay is created, + ;; Font Lock has not proceeded yet. + (nth (if org-cycle-level-faces + (% (1- level) org-n-level-faces) + (1- (min level org-n-level-faces))) + org-level-faces))) + (overlay-put o 'modification-hooks after-edit-functions) + (overlay-put o 'insert-in-front-hooks after-edit-functions) + (org-num--refresh-display o numbering) + o)) + +(defun org-num--refresh-display (overlay numbering) + "Refresh OVERLAY's display. +NUMBERING specifies the new numbering, as a list of integers, or +nil if nothing should be displayed. Assume OVERLAY is valid." + (let ((display (and numbering + (funcall org-num-format-function (reverse numbering))))) + (when (and display (not (get-text-property 0 'face display))) + (org-add-props display `(face ,(overlay-get overlay 'numbering-face)))) + (overlay-put overlay 'after-string display))) + +(defun org-num--skip-value () + "Return skip value for headline at point. +Value is t when headline should not be numbered, and nil +otherwise." + (org-match-line org-complex-heading-regexp) + (let ((title (match-string 4)) + (tags (and org-num-skip-tags + (match-end 5) + (org-split-string (match-string 5) ":")))) + (or (and org-num-skip-footnotes + org-footnote-section + (equal title org-footnote-section)) + (and org-num-skip-commented + (let ((case-fold-search nil)) + (string-match org-num--comment-re title)) + t) + (and org-num-skip-tags + (cl-some (lambda (tag) (member tag org-num-skip-tags)) + tags) + t) + (and org-num-skip-unnumbered + (org-entry-get (point) "UNNUMBERED") + t)))) + +(defun org-num--current-numbering (level skip) + "Return numbering for current headline. +LEVEL is headline's level, and SKIP its skip value. Return nil +if headline should be skipped." + (cond + ;; Skipped by inheritance. + ((and org-num--skip-level (> level org-num--skip-level)) nil) + ;; Skipped by a non-nil skip value; set `org-num--skip-level' + ;; to skip the whole sub-tree later on. + (skip (setq org-num--skip-level level) nil) + (t + (setq org-num--skip-level nil) + ;; Compute next numbering, and update `org-num--numbering'. + (let ((last-level (length org-num--numbering))) + (setq org-num--numbering + (cond + ;; First headline : nil => (1), or (1 0)... + ((null org-num--numbering) (cons 1 (make-list (1- level) 0))) + ;; Sibling: (1 1) => (2 1). + ((= level last-level) + (cons (1+ (car org-num--numbering)) (cdr org-num--numbering))) + ;; Parent: (1 1 1) => (2 1), or (2). + ((< level last-level) + (let ((suffix (nthcdr (- last-level level) org-num--numbering))) + (cons (1+ (car suffix)) (cdr suffix)))) + ;; Child: (1 1) => (1 1 1), or (1 0 1 1)... + (t + (append (cons 1 (make-list (- level last-level 1) 0)) + org-num--numbering)))))))) + +(defun org-num--number-region (start end) + "Add numbering overlays between START and END positions. +When START or END are nil, use buffer boundaries. Narrowing, if +any, is ignored. Return the list of created overlays, newest +first." + (org-with-point-at (or start 1) + ;; Do not match headline starting at START. + (when start (end-of-line)) + (let ((regexp (org-num--headline-regexp)) + (new nil)) + (while (re-search-forward regexp end t) + (let* ((level (org-reduced-level + (- (match-end 0) (match-beginning 0) 1))) + (skip (org-num--skip-value)) + (numbering (org-num--current-numbering level skip))) + ;; Apply numbering to current headline. Store overlay for + ;; the return value. + (push (org-num--make-overlay numbering level skip) + new))) + new))) + +(defun org-num--update () + "Update buffer's numbering. +This function removes invalid overlays and refreshes numbering +for the valid ones in the numbering overlays list. It also adds +missing overlays to that list." + (setq org-num--skip-level nil) + (setq org-num--numbering nil) + (let ((new-overlays nil) + (overlay nil)) + (while (setq overlay (pop org-num--overlays)) + (cond + ;; Valid overlay. + ;; + ;; First handle possible missing overlays OVERLAY. If missing + ;; overlay marker is pointing before next overlay and after the + ;; last known overlay, make sure to parse the buffer between + ;; these two overlays. + ((org-num--valid-overlay-p overlay) + (let ((next (overlay-start overlay)) + (last (and new-overlays (overlay-start (car new-overlays))))) + (cond + ((null org-num--missing-overlay)) + ((> org-num--missing-overlay next)) + ((or (null last) (> org-num--missing-overlay last)) + (setq org-num--missing-overlay nil) + (setq new-overlays (nconc (org-num--number-region last next) + new-overlays))) + ;; If it is already after the last known overlay, reset it: + ;; some previous invalid overlay already triggered the + ;; necessary parsing. + (t + (setq org-num--missing-overlay nil)))) + ;; Update OVERLAY's numbering. + (let* ((level (overlay-get overlay 'level)) + (skip (overlay-get overlay 'skip)) + (numbering (org-num--current-numbering level skip))) + (org-num--refresh-display overlay numbering) + (push overlay new-overlays))) + ;; Invalid overlay. It indicates that the buffer needs to be + ;; parsed again between the two surrounding valid overlays or + ;; buffer boundaries. + (t + ;; Delete all consecutive invalid overlays: we re-create all + ;; overlays between last valid overlay and the next one. + (delete-overlay overlay) + (while (and org-num--overlays + (not (org-num--valid-overlay-p (car org-num--overlays)))) + (delete-overlay (pop org-num--overlays))) + ;; Create and register new overlays. + (let ((last (and new-overlays (overlay-start (car new-overlays)))) + (next (and org-num--overlays + (overlay-start (car org-num--overlays))))) + (setq new-overlays (nconc (org-num--number-region last next) + new-overlays)))))) + ;; If invalid position hasn't been handled yet, it must be located + ;; between last valid overlay and end of the buffer. Parse that + ;; area before returning. + (when org-num--missing-overlay + (let ((last (and new-overlays (overlay-start (car new-overlays))))) + (setq new-overlays (nconc (org-num--number-region last nil) + new-overlays)))) + ;; Numbering is now up-to-date. Reset invalid flag. Also return + ;; `org-num--overlays' in a sorted fashion. + (setq org-num--invalid-flag nil) + (setq org-num--overlays (nreverse new-overlays)))) + +(defun org-num--verify (beg end _) + "Check numbering integrity; update it if necessary. +This function is meant to be used in `after-change-functions'. +See this variable for the meaning of BEG and END." + (setq org-num--missing-overlay nil) + (save-match-data + (org-with-point-at beg + (let ((regexp (org-num--headline-regexp))) + ;; At this point, directly altered overlays between BEG and + ;; END are marked as invalid and will trigger a full update. + ;; However, there are still two cases to handle. + ;; + ;; First, some valid overlays may need to be invalidated, due + ;; to an indirect change. That happens when the skip value -- + ;; see `org-num--skip-value' -- of the heading BEG belongs to + ;; is altered, or when deleting the newline character right + ;; before the next headline. + (save-excursion + ;; Bail out if we're before first headline or within + ;; a headline too deep to be numbered. + (when (and (org-with-limited-levels + (ignore-errors (org-back-to-heading t))) + (looking-at regexp)) + (pcase (get-char-property-and-overlay (point) 'org-num) + (`(nil) + ;; At a headline, without a numbering overlay: change + ;; just created one. Mark it for parsing. + (setq org-num--missing-overlay (point))) + (`(t . ,o) + ;; Check if skip value changed. Invalidate overlay + ;; accordingly. + (unless (eq (org-num--skip-value) (overlay-get o 'skip)) + (org-num--invalidate-overlay o))) + (_ nil)))) + ;; Deleting the newline character before a numbering overlay + ;; doesn't invalidate it, even though it could land in the + ;; middle of a line. Be sure to catch this case. + (when (and (= beg end) (not (bolp))) + (pcase (get-char-property-and-overlay (point) 'org-num) + (`(t . ,o) (org-num--invalidate-overlay o)) + (_ nil))) + ;; Second, if nothing is marked as invalid, and therefore if + ;; no full update is due so far, changes may still have + ;; created new headlines, at BEG -- which is actually handled + ;; by the previous phase --, or, in case of a multi-line + ;; insertion, at END, or in-between. + (unless (or org-num--invalid-flag + org-num--missing-overlay + (<= end (line-end-position))) ;single line change + (forward-line) + (when (or (re-search-forward regexp end 'move) + ;; Check if change created a headline after END. + (progn (skip-chars-backward "*") (looking-at regexp))) + (setq org-num--missing-overlay (line-beginning-position)))))) + ;; Update numbering only if a headline was altered or created. + (when (or org-num--missing-overlay org-num--invalid-flag) + (org-num--update)))) + + +;;; Public Functions + +;;;###autoload +(defun org-num-default-format (numbering) + "Default numbering display function. +NUMBERING is a list of numbers." + (concat (mapconcat #'number-to-string numbering ".") " ")) + +;;;###autoload +(define-minor-mode org-num-mode + "Dynamic numbering of headlines in an Org buffer." + :lighter " o#" + (cond + (org-num-mode + (unless (derived-mode-p 'org-mode) + (user-error "Cannot activate headline numbering outside Org mode")) + (setq org-num--numbering nil) + (setq org-num--overlays (nreverse (org-num--number-region nil nil))) + (add-hook 'after-change-functions #'org-num--verify nil t) + (add-hook 'change-major-mode-hook #'org-num--clear nil t)) + (t + (org-num--clear) + (remove-hook 'after-change-functions #'org-num--verify t) + (remove-hook 'change-major-mode-hook #'org-num--clear t)))) + + +(provide 'org-num) +;;; org-num.el ends here diff --git a/elpa/org-20191028/org-pcomplete.el b/elpa/org-20200127/org-pcomplete.el similarity index 97% rename from elpa/org-20191028/org-pcomplete.el rename to elpa/org-20200127/org-pcomplete.el index 38fd27f6..b0ebbc4c 100644 --- a/elpa/org-20191028/org-pcomplete.el +++ b/elpa/org-20200127/org-pcomplete.el @@ -1,6 +1,6 @@ ;;; org-pcomplete.el --- In-buffer Completion Code -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; ;; Author: Carsten Dominik ;; John Wiegley @@ -44,7 +44,7 @@ (declare-function org-get-export-keywords "org" ()) (declare-function org-get-heading "org" (&optional no-tags no-todo no-priority no-comment)) (declare-function org-get-tags "org" (&optional pos local)) -(declare-function org-make-org-heading-search-string "org" (&optional string)) +(declare-function org-link-heading-search-string "ol" (&optional string)) (declare-function org-tag-alist-to-string "org" (alist &optional skip-key)) (defvar org-current-tag-alist) @@ -352,8 +352,7 @@ This needs more work, to handle headings with lots of spaces in them." (goto-char (point-min)) (let (tbl) (while (re-search-forward org-outline-regexp nil t) - (push (org-make-org-heading-search-string - (org-get-heading t t t t)) + (push (org-link-heading-search-string (org-get-heading t t t t)) tbl)) (pcomplete-uniquify-list tbl))) ;; When completing a bracketed link, i.e., "[[*", argument @@ -430,8 +429,9 @@ switches." ":tstart" ":tend" ":block" ":step" ":stepskip0" ":fileskip0" ":emphasize" ":link" ":narrow" ":indent" - ":tcolumns" ":level" ":compact" ":timestamp" - ":formula" ":formatter" ":wstart" ":mstart")))) + ":hidefiles" ":tcolumns" ":level" ":compact" + ":timestamp" ":formula" ":formatter" + ":wstart" ":mstart")))) ;;; Finish up diff --git a/elpa/org-20191028/org-pkg.el b/elpa/org-20200127/org-pkg.el similarity index 53% rename from elpa/org-20191028/org-pkg.el rename to elpa/org-20200127/org-pkg.el index 21a9db6f..2393404c 100644 --- a/elpa/org-20191028/org-pkg.el +++ b/elpa/org-20200127/org-pkg.el @@ -1,5 +1,5 @@ (define-package "org" - "20191028" "Outline-based notes management and organizer" ( )) + "20200127" "Outline-based notes management and organizer" ( )) ;; Local Variables: ;; no-byte-compile: t ;; End: diff --git a/elpa/org-20191028/org-plot.el b/elpa/org-20200127/org-plot.el similarity index 99% rename from elpa/org-20191028/org-plot.el rename to elpa/org-20200127/org-plot.el index a5635e32..8bf88392 100644 --- a/elpa/org-20191028/org-plot.el +++ b/elpa/org-20200127/org-plot.el @@ -1,6 +1,6 @@ ;;; org-plot.el --- Support for Plotting from Org -*- lexical-binding: t; -*- -;; Copyright (C) 2008-2019 Free Software Foundation, Inc. +;; Copyright (C) 2008-2020 Free Software Foundation, Inc. ;; ;; Author: Eric Schulte ;; Keywords: tables, plotting @@ -131,7 +131,7 @@ Pass PARAMS through to `orgtbl-to-generic' when exporting TABLE." "Export the data in TABLE to DATA-FILE for gnuplot. This means in a format appropriate for grid plotting by gnuplot. PARAMS specifies which columns of TABLE should be plotted as independent -and dependant variables." +and dependent variables." (interactive) (let* ((ind (- (plist-get params :ind) 1)) (deps (if (plist-member params :deps) diff --git a/elpa/org-20191028/org-protocol.el b/elpa/org-20200127/org-protocol.el similarity index 99% rename from elpa/org-20191028/org-protocol.el rename to elpa/org-20200127/org-protocol.el index 0577c315..0ff0e401 100644 --- a/elpa/org-20191028/org-protocol.el +++ b/elpa/org-20200127/org-protocol.el @@ -1,6 +1,6 @@ ;;; org-protocol.el --- Intercept Calls from Emacsclient to Trigger Custom Actions -*- lexical-binding: t; -*- ;; -;; Copyright (C) 2008-2019 Free Software Foundation, Inc. +;; Copyright (C) 2008-2020 Free Software Foundation, Inc. ;; ;; Authors: Bastien Guerry ;; Daniel M German @@ -116,6 +116,7 @@ ;;; Code: (require 'org) +(require 'ol) (declare-function org-publish-get-project-from-filename "ox-publish" (filename &optional up)) @@ -300,7 +301,7 @@ results of that splitting are returned as a list." (split-parts (split-string data sep))) (cond ((not unhexify) split-parts) ((fboundp unhexify) (mapcar unhexify split-parts)) - (t (mapcar #'org-link-unescape split-parts))))) + (t (mapcar #'org-link-decode split-parts))))) (defun org-protocol-flatten-greedy (param-list &optional strip-path replacement) "Transform PARAM-LIST into a flat list for greedy handlers. @@ -381,7 +382,7 @@ If INFO is already a property list, return it unchanged." (while data (setq result (append result - (list (pop data) (org-link-unescape (pop data)))))) + (list (pop data) (org-link-decode (pop data)))))) result) (let ((data (org-protocol-split-data info t org-protocol-data-separator))) (if default-order @@ -489,12 +490,12 @@ Now template ?b will be used." (region (or (plist-get parts :body) "")) (orglink (if (null url) title - (org-make-link-string url (or (org-string-nw-p title) url)))) + (org-link-make-string url (or (org-string-nw-p title) url)))) ;; Avoid call to `org-store-link'. (org-capture-link-is-already-stored t)) ;; Only store link if there's a URL to insert later on. (when url (push (list url title) org-stored-links)) - (org-store-link-props :type type + (org-link-store-props :type type :link url :description title :annotation orglink diff --git a/elpa/org-20191028/org-src.el b/elpa/org-20200127/org-src.el similarity index 97% rename from elpa/org-20191028/org-src.el rename to elpa/org-20200127/org-src.el index de6d0d76..7876deab 100644 --- a/elpa/org-20191028/org-src.el +++ b/elpa/org-20200127/org-src.el @@ -1,6 +1,6 @@ ;;; org-src.el --- Source code examples in Org -*- lexical-binding: t; -*- ;; -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; ;; Author: Carsten Dominik ;; Bastien Guerry @@ -32,10 +32,10 @@ ;;; Code: (require 'cl-lib) +(require 'ob-comint) (require 'org-macs) (require 'org-compat) -(require 'ob-keys) -(require 'ob-comint) +(require 'org-keys) (declare-function org-element-at-point "org-element" ()) (declare-function org-element-class "org-element" (datum &optional parent)) @@ -152,6 +152,8 @@ current-window Show edit buffer in the current window, keeping all other windows. split-window-below Show edit buffer below the current window, keeping all other windows. +split-window-right Show edit buffer to the right of the current window, + keeping all other windows. other-window Use `switch-to-buffer-other-window' to display edit buffer. reorganize-frame Show only two windows on the current frame, the current window and the edit buffer. When exiting the edit buffer, @@ -162,6 +164,7 @@ other-frame Use `switch-to-buffer-other-frame' to display edit buffer. :type '(choice (const current-window) (const split-window-below) + (const split-window-right) (const other-frame) (const other-window) (const reorganize-frame))) @@ -255,6 +258,9 @@ issued in the language major mode buffer." (defvar-local org-src--block-indentation nil) (put 'org-src--block-indentation 'permanent-local t) +(defvar-local org-src--content-indentation nil) +(put 'org-src--content-indentation 'permanent-local t) + (defvar-local org-src--end-marker nil) (put 'org-src--end-marker 'permanent-local t) @@ -270,9 +276,6 @@ issued in the language major mode buffer." (defvar-local org-src--remote nil) (put 'org-src--remote 'permanent-local t) -(defvar-local org-src--saved-temp-window-config nil) -(put 'org-src--saved-temp-window-config 'permanent-local t) - (defvar-local org-src--source-type nil "Type of element being edited, as a symbol.") (put 'org-src--source-type 'permanent-local t) @@ -304,15 +307,6 @@ Return nil if there is no such buffer." (eq (marker-buffer end) (marker-buffer org-src--end-marker)) (throw 'exit b)))))) -(defun org-src--get-lang-mode (lang) - "Return major mode that should be used for LANG. -LANG is a string, and the returned major mode is a symbol." - (intern - (concat - (let ((l (or (cdr (assoc lang org-src-lang-modes)) lang))) - (if (symbolp l) (symbol-name l) l)) - "-mode"))) - (defun org-src--coordinates (pos beg end) "Return coordinates of POS relatively to BEG and END. POS, BEG and END are buffer positions. Return value is either @@ -431,7 +425,7 @@ Assume point is in the corresponding edit buffer." (if org-src--preserve-indentation 0 (+ (or org-src--block-indentation 0) (if (memq org-src--source-type '(example-block src-block)) - org-edit-src-content-indentation + org-src--content-indentation 0)))) (use-tabs? (and (> org-src--tab-width 0) t)) (source-tab-width org-src--tab-width) @@ -475,7 +469,6 @@ When REMOTE is non-nil, do not try to preserve point or mark when moving from the edit area to the source. Leave point in edit buffer." - (setq org-src--saved-temp-window-config (current-window-configuration)) (let* ((area (org-src--contents-area datum)) (beg (copy-marker (nth 0 area))) (end (copy-marker (nth 1 area) t)) @@ -494,9 +487,9 @@ Leave point in edit buffer." (source-file-name (buffer-file-name (buffer-base-buffer))) (source-tab-width (if indent-tabs-mode tab-width 0)) (type (org-element-type datum)) - (ind (org-with-wide-buffer - (goto-char (org-element-property :begin datum)) - (current-indentation))) + (block-ind (org-with-point-at (org-element-property :begin datum) + (current-indentation))) + (content-ind org-edit-src-content-indentation) (preserve-ind (and (memq type '(example-block src-block)) (or (org-element-property :preserve-indent datum) @@ -539,7 +532,8 @@ Leave point in edit buffer." (setq org-src--end-marker end) (setq org-src--remote remote) (setq org-src--source-type type) - (setq org-src--block-indentation ind) + (setq org-src--block-indentation block-ind) + (setq org-src--content-indentation content-ind) (setq org-src--preserve-indentation preserve-ind) (setq org-src--overlay overlay) (setq org-src--allow-write-back write-back) @@ -572,7 +566,7 @@ Leave point in edit buffer." "Fontify code block. This function is called by emacs automatic fontification, as long as `org-src-fontify-natively' is non-nil." - (let ((lang-mode (org-src--get-lang-mode lang))) + (let ((lang-mode (org-src-get-lang-mode lang))) (when (fboundp lang-mode) (let ((string (buffer-substring-no-properties start end)) (modified (buffer-modified-p)) @@ -766,6 +760,15 @@ Org-babel commands." (org-src-do-at-code-block (call-interactively (lookup-key org-babel-map key))))) +(defun org-src-get-lang-mode (lang) + "Return major mode that should be used for LANG. +LANG is a string, and the returned major mode is a symbol." + (intern + (concat + (let ((l (or (cdr (assoc lang org-src-lang-modes)) lang))) + (if (symbolp l) (symbol-name l) l)) + "-mode"))) + (defun org-src-edit-buffer-p (&optional buffer) "Non-nil when current buffer is a source editing buffer. If BUFFER is non-nil, test it instead." @@ -793,7 +796,14 @@ Raise an error when current buffer is not a source editing buffer." (`other-window (switch-to-buffer-other-window buffer)) (`split-window-below - (select-window (split-window-vertically)) + (if (eq context 'exit) + (delete-window) + (select-window (split-window-vertically))) + (pop-to-buffer-same-window buffer)) + (`split-window-right + (if (eq context 'exit) + (delete-window) + (select-window (split-window-horizontally))) (pop-to-buffer-same-window buffer)) (`other-frame (pcase context @@ -950,7 +960,7 @@ the LaTeX environment in the Org mode buffer." (org-src--edit-element element (org-src--construct-edit-buffer-name (buffer-name) "LaTeX environment") - (org-src--get-lang-mode "latex") + (org-src-get-lang-mode "latex") t) t)) @@ -975,7 +985,7 @@ Throw an error when not at an export block." ;; Missing export-block type. Fallback ;; to default mode. "fundamental"))) - (mode (org-src--get-lang-mode type))) + (mode (org-src-get-lang-mode type))) (unless (functionp mode) (error "No such language mode: %s" mode)) (org-src--edit-element element @@ -1008,7 +1018,7 @@ name of the sub-editing buffer." (let* ((lang (if (eq type 'src-block) (org-element-property :language element) "example")) - (lang-f (and (eq type 'src-block) (org-src--get-lang-mode lang))) + (lang-f (and (eq type 'src-block) (org-src-get-lang-mode lang))) (babel-info (and (eq type 'src-block) (org-babel-get-src-block-info 'light))) deactivate-mark) @@ -1041,7 +1051,7 @@ name of the sub-editing buffer." (org-src--on-datum-p context)) (user-error "Not on inline source code")) (let* ((lang (org-element-property :language context)) - (lang-f (org-src--get-lang-mode lang)) + (lang-f (org-src-get-lang-mode lang)) (babel-info (org-babel-get-src-block-info 'light)) deactivate-mark) (unless (functionp lang-f) (error "No such language mode: %s" lang-f)) @@ -1172,10 +1182,7 @@ Throw an error if there is no such buffer." (write-back (org-src--goto-coordinates coordinates beg end)))) ;; Clean up left-over markers and restore window configuration. (set-marker beg nil) - (set-marker end nil) - (when org-src--saved-temp-window-config - (set-window-configuration org-src--saved-temp-window-config) - (setq org-src--saved-temp-window-config nil)))) + (set-marker end nil))) (provide 'org-src) diff --git a/elpa/org-20191028/org-table.el b/elpa/org-20200127/org-table.el similarity index 93% rename from elpa/org-20191028/org-table.el rename to elpa/org-20200127/org-table.el index f6eb4257..1141ee3b 100644 --- a/elpa/org-20191028/org-table.el +++ b/elpa/org-20200127/org-table.el @@ -1,8 +1,9 @@ ;;; org-table.el --- The Table Editor for Org -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik +;; Maintainer: Bastien Guerry ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: https://orgmode.org ;; @@ -35,51 +36,66 @@ ;;; Code: (require 'cl-lib) -(require 'org) +(require 'org-macs) +(require 'org-compat) +(require 'org-keys) +(declare-function calc-eval "calc" (str &optional separator &rest args)) +(declare-function org-at-timestamp-p "org" (&optional extended)) +(declare-function org-delete-backward-char "org" (N)) (declare-function org-element-at-point "org-element" ()) (declare-function org-element-contents "org-element" (element)) (declare-function org-element-extract-element "org-element" (element)) (declare-function org-element-interpret-data "org-element" (data)) -(declare-function org-element-lineage "org-element" - (blob &optional types with-self)) -(declare-function org-element-map "org-element" - (data types fun - &optional info first-match no-recursion with-affiliated)) -(declare-function org-element-parse-buffer "org-element" - (&optional granularity visible-only)) +(declare-function org-element-lineage "org-element" (blob &optional types with-self)) +(declare-function org-element-map "org-element" (data types fun &optional info first-match no-recursion with-affiliated)) +(declare-function org-element-parse-buffer "org-element" (&optional granularity visible-only)) (declare-function org-element-property "org-element" (property element)) (declare-function org-element-type "org-element" (element)) - +(declare-function org-entry-get "org" (pom property &optional inherit literal-nil)) (declare-function org-export-create-backend "ox" (&rest rest) t) (declare-function org-export-data-with-backend "ox" (data backend info)) -(declare-function org-export-filter-apply-functions "ox" - (filters value info)) +(declare-function org-export-filter-apply-functions "ox" (filters value info)) (declare-function org-export-first-sibling-p "ox" (blob info)) (declare-function org-export-get-backend "ox" (name)) -(declare-function org-export-get-environment "ox" - (&optional backend subtreep ext-plist)) +(declare-function org-export-get-environment "ox" (&optional backend subtreep ext-plist)) (declare-function org-export-install-filters "ox" (info)) (declare-function org-export-table-has-special-column-p "ox" (table)) (declare-function org-export-table-row-is-special-p "ox" (table-row info)) - -(declare-function calc-eval "calc" (str &optional separator &rest args)) +(declare-function org-id-find "org-id" (id &optional markerp)) +(declare-function org-indent-line "org" ()) +(declare-function org-load-modules-maybe "org" (&optional force)) +(declare-function org-restart-font-lock "org" ()) +(declare-function org-sort-remove-invisible "org" (s)) +(declare-function org-time-stamp-format "org" (&optional long inactive)) +(declare-function org-time-string-to-absolute "org" (s &optional daynr prefer buffer pos)) +(declare-function org-time-string-to-time "org" (s)) +(declare-function org-timestamp-up-day "org" (&optional arg)) (defvar constants-unit-system) +(defvar org-M-RET-may-split-line) (defvar org-element-use-cache) (defvar org-export-filters-alist) -(defvar org-table-follow-field-mode) -(defvar orgtbl-mode) ; defined below -(defvar orgtbl-mode-menu) ; defined when orgtbl mode get initialized +(defvar org-finish-function) +(defvar org-inhibit-highlight-removal) +(defvar org-inhibit-startup) +(defvar org-selected-window) +(defvar org-self-insert-cluster-for-undo) +(defvar org-self-insert-command-undo-counter) +(defvar org-ts-regexp) +(defvar org-ts-regexp-both) +(defvar org-ts-regexp-inactive) +(defvar org-ts-regexp3) +(defvar org-window-configuration) (defvar sort-fold-case) -(defvar orgtbl-after-send-table-hook nil - "Hook for functions attaching to `C-c C-c', if the table is sent. -This can be used to add additional functionality after the table is sent -to the receiver position, otherwise, if table is not sent, the functions -are not run.") + +;;; Customizables -(defvar org-table-TBLFM-begin-regexp "^[ \t]*|.*\n[ \t]*#\\+TBLFM: ") +(defgroup org-table nil + "Options concerning tables in Org mode." + :tag "Org Table" + :group 'org) (defcustom orgtbl-optimized t "Non-nil means use the optimized table editor version for `orgtbl-mode'. @@ -193,6 +209,15 @@ alignment to the right border applies." :group 'org-table-settings :type 'number) +(defcustom org-table-formula-field-format "%s" + "Format for fields which contain the result of a formula. +For example, using \"~%s~\" will display the result within tilde +characters. Beware that modifying the display can prevent the +field from being used in another formula." + :group 'org-table-settings + :version "24.1" + :type 'string) + (defgroup org-table-editing nil "Behavior of tables during editing in Org mode." :tag "Org Table Editing" @@ -241,6 +266,13 @@ this line." :group 'org-table-editing :type 'boolean) +(defcustom org-table-shrunk-column-indicator "…" + "String to be displayed in a shrunk column." + :group 'org-table-editing + :type 'string + :package-version '(Org . "9.2") + :safe (lambda (v) (and (stringp v) (not (equal v ""))))) + (defgroup org-table-calculation nil "Options concerning tables in Org mode." :tag "Org Table Calculation" @@ -276,8 +308,7 @@ t accept as input and present for editing" calc-prefer-frac nil calc-symbolic-mode nil calc-date-format (YYYY "-" MM "-" DD " " Www (" " hh ":" mm)) - calc-display-working-message t - ) + calc-display-working-message t) "List with Calc mode settings for use in `calc-eval' for table formulas. The list must contain alternating symbols (Calc modes variables and values). Don't remove any of the default settings, just change the values. Org mode @@ -310,15 +341,6 @@ So this is about 08:32:34 versus 8:33:34." :type 'boolean :safe #'booleanp) -(defcustom org-table-formula-field-format "%s" - "Format for fields which contain the result of a formula. -For example, using \"~%s~\" will display the result within tilde -characters. Beware that modifying the display can prevent the -field from being used in another formula." - :group 'org-table-settings - :version "24.1" - :type 'string) - (defcustom org-table-formula-evaluate-inline t "Non-nil means TAB and RET evaluate a formula in current table field. If the current field starts with an equal sign, it is assumed to be a formula @@ -390,7 +412,6 @@ many columns as needed. When set to `warn', issue a warning when doing so. When set to `prompt', ask user before creating a new column. Otherwise, throw an error." :group 'org-table-calculation - :version "26.1" :package-version '(Org . "8.3") :type '(choice (const :tag "Out-of-bounds field generates an error (default)" nil) @@ -416,19 +437,37 @@ available parameters." "Max lines that `org-table-convert-region' will attempt to process. The function can be slow on larger regions; this safety feature -prevents it from hanging emacs." +prevents it from hanging Emacs." :group 'org-table-import-export :type 'integer - :version "26.1" :package-version '(Org . "8.3")) -(defcustom org-table-shrunk-column-indicator "…" - "String to be displayed in a shrunk column." - :group 'org-table-editing - :type 'string - :version "27.1" - :package-version '(Org . "9.2") - :safe (lambda (v) (and (stringp v) (not (equal v ""))))) + +;;; Regexps Constants + +(defconst org-table-any-line-regexp "^[ \t]*\\(|\\|\\+-[-+]\\)" + "Detect an org-type or table-type table.") + +(defconst org-table-line-regexp "^[ \t]*|" + "Detect an org-type table line.") + +(defconst org-table-dataline-regexp "^[ \t]*|[^-]" + "Detect an org-type table line.") + +(defconst org-table-hline-regexp "^[ \t]*|-" + "Detect an org-type table hline.") + +(defconst org-table1-hline-regexp "^[ \t]*\\+-[-+]" + "Detect a table-type table hline.") + +(defconst org-table-any-border-regexp "^[ \t]*[^|+ \t]" + "Detect the first line outside a table when searching from within it. +This works for both table types.") + +(defconst org-TBLFM-regexp "^[ \t]*#\\+TBLFM: " + "Detect a #+TBLFM line.") + +(defvar org-table-TBLFM-begin-regexp "^[ \t]*|.*\n[ \t]*#\\+TBLFM: ") (defconst org-table-auto-recalculate-regexp "^[ \t]*| *# *\\(|\\|$\\)" "Regexp matching a line marked for automatic recalculation.") @@ -442,10 +481,52 @@ prevents it from hanging emacs." (defconst org-table-border-regexp "^[ \t]*[^| \t]" "Regexp matching any line outside an Org table.") +(defconst org-table-range-regexp + "@\\([-+]?I*[-+]?[0-9]*\\)\\(\\$[-+]?[0-9]+\\)?\\(\\.\\.@?\\([-+]?I*[-+]?[0-9]*\\)\\(\\$[-+]?[0-9]+\\)?\\)?" + ;; 1 2 3 4 5 + "Regular expression for matching ranges in formulas.") + +(defconst org-table-range-regexp2 + (concat + "\\(" "@[-0-9I$&]+" "\\|" "[a-zA-Z]\\{1,2\\}\\([0-9]+\\|&\\)" "\\|" "\\$[a-zA-Z0-9]+" "\\)" + "\\.\\." + "\\(" "@?[-0-9I$&]+" "\\|" "[a-zA-Z]\\{1,2\\}\\([0-9]+\\|&\\)" "\\|" "\\$[a-zA-Z0-9]+" "\\)") + "Match a range for reference display.") + +(defconst org-table-translate-regexp + (concat "\\(" "@[-0-9I$]+" "\\|" "[a-zA-Z]\\{1,2\\}\\([0-9]+\\|&\\)" "\\)") + "Match a reference that needs translation, for reference display.") + +(defconst org-table-separator-space + (propertize " " 'display '(space :relative-width 1)) + "Space used around fields when aligning the table. +This space serves as a segment separator for the purposes of the +bidirectional reordering.") + + +;;; Internal Variables + (defvar org-table-last-highlighted-reference nil) (defvar org-table-formula-history nil) +(defvar org-field-marker nil) +(defvar org-table-buffer-is-an nil) + +(defvar-local org-table-formula-constants-local nil + "Local version of `org-table-formula-constants'.") + +(defvar org-table-may-need-update t + "Indicates that a table might need an update. +This variable is set by `org-before-change-function'. +`org-table-align' sets it back to nil.") + +(defvar orgtbl-after-send-table-hook nil + "Hook for functions attaching to `C-c C-c', if the table is sent. +This can be used to add additional functionality after the table is sent +to the receiver position, otherwise, if table is not sent, the functions +are not run.") + (defvar org-table-column-names nil "Alist with column names, derived from the `!' line. This variable is initialized with `org-table-analyze'.") @@ -488,43 +569,59 @@ variable is initialized with `org-table-analyze'.") Line numbers are counted from the beginning of the table. This variable is initialized with `org-table-analyze'.") -(defconst org-table-range-regexp - "@\\([-+]?I*[-+]?[0-9]*\\)\\(\\$[-+]?[0-9]+\\)?\\(\\.\\.@?\\([-+]?I*[-+]?[0-9]*\\)\\(\\$[-+]?[0-9]+\\)?\\)?" - ;; 1 2 3 4 5 - "Regular expression for matching ranges in formulas.") +(defvar org-table-aligned-begin-marker (make-marker) + "Marker at the beginning of the table last aligned. +Used to check if cursor still is in that table, to minimize realignment.") -(defconst org-table-range-regexp2 - (concat - "\\(" "@[-0-9I$&]+" "\\|" "[a-zA-Z]\\{1,2\\}\\([0-9]+\\|&\\)" "\\|" "\\$[a-zA-Z0-9]+" "\\)" - "\\.\\." - "\\(" "@?[-0-9I$&]+" "\\|" "[a-zA-Z]\\{1,2\\}\\([0-9]+\\|&\\)" "\\|" "\\$[a-zA-Z0-9]+" "\\)") - "Match a range for reference display.") +(defvar org-table-aligned-end-marker (make-marker) + "Marker at the end of the table last aligned. +Used to check if cursor still is in that table, to minimize realignment.") -(defconst org-table-translate-regexp - (concat "\\(" "@[-0-9I$]+" "\\|" "[a-zA-Z]\\{1,2\\}\\([0-9]+\\|&\\)" "\\)") - "Match a reference that needs translation, for reference display.") +(defvar org-table-last-alignment nil + "List of flags for flushright alignment, from the last re-alignment. +This is being used to correctly align a single field after TAB or RET.") -(defconst org-table-separator-space - (propertize " " 'display '(space :relative-width 1)) - "Space used around fields when aligning the table. -This space serves as a segment separator for the purposes of the -bidirectional reordering.") +(defvar org-table-last-column-widths nil + "List of max width of fields in each column. +This is being used to correctly align a single field after TAB or RET.") -(defmacro org-table-save-field (&rest body) - "Save current field; execute BODY; restore field. -Field is restored even in case of abnormal exit." - (declare (debug (body))) - (org-with-gensyms (line column) - `(let ((,line (copy-marker (line-beginning-position))) - (,column (org-table-current-column))) - (unwind-protect - (progn ,@body) - (goto-char ,line) - (org-table-goto-column ,column) - (set-marker ,line nil))))) +(defvar-local org-table-formula-debug nil + "Non-nil means debug table formulas. +When nil, simply write \"#ERROR\" in corrupted fields.") + +(defvar-local org-table-overlay-coordinates nil + "Overlay coordinates after each align of a table.") + +(defvar org-last-recalc-line nil) + +(defvar org-show-positions nil) + +(defvar org-table-rectangle-overlays nil) + +(defvar org-table-clip nil + "Clipboard for table regions.") + +(defvar org-timecnt nil) + +(defvar org-recalc-commands nil + "List of commands triggering the recalculation of a line. +Will be filled automatically during use.") + +(defvar org-recalc-marks + '((" " . "Unmarked: no special line, no automatic recalculation") + ("#" . "Automatically recalculate this line upon TAB, RET, and C-c C-c in the line") + ("*" . "Recalculate only when entire table is recalculated with `C-u C-c *'") + ("!" . "Column name definition line. Reference in formula as $name.") + ("$" . "Parameter definition line name=value. Reference in formula as $name.") + ("_" . "Names for values in row below this one.") + ("^" . "Names for values in row above this one."))) + +(defvar org-tbl-calc-modes nil) + +(defvar org-pos nil) -;;; See org-macs.el for the definition of org-table-with-shrunk-field, -;;; including the reason why it is defined there and not here. + +;;; Macros and Inlined Functions (defmacro org-table-with-shrunk-columns (&rest body) "Expand all columns before executing BODY, then shrink them again." @@ -540,6 +637,90 @@ Field is restored even in case of abnormal exit." (set-marker ,begin nil) (set-marker ,end nil))))) +(defmacro org-table-with-shrunk-field (&rest body) + "Save field shrunk state, execute BODY and restore state." + (declare (debug (body))) + (org-with-gensyms (end shrunk size) + `(let* ((,shrunk (save-match-data (org-table--shrunk-field))) + (,end (and ,shrunk (copy-marker (overlay-end ,shrunk) t))) + (,size (and ,shrunk (- ,end (overlay-start ,shrunk))))) + (when ,shrunk (delete-overlay ,shrunk)) + (unwind-protect (progn ,@body) + (when ,shrunk (move-overlay ,shrunk (- ,end ,size) ,end)))))) + +(defmacro org-table-save-field (&rest body) + "Save current field; execute BODY; restore field. +Field is restored even in case of abnormal exit." + (declare (debug (body))) + (org-with-gensyms (line column) + `(let ((,line (copy-marker (line-beginning-position))) + (,column (org-table-current-column))) + (unwind-protect + (progn ,@body) + (goto-char ,line) + (org-table-goto-column ,column) + (set-marker ,line nil))))) + +(defsubst org-table--set-calc-mode (var &optional value) + (if (stringp var) + (setq var (assoc var '(("D" calc-angle-mode deg) + ("R" calc-angle-mode rad) + ("F" calc-prefer-frac t) + ("S" calc-symbolic-mode t))) + value (nth 2 var) var (nth 1 var))) + (if (memq var org-tbl-calc-modes) + (setcar (cdr (memq var org-tbl-calc-modes)) value) + (cons var (cons value org-tbl-calc-modes))) + org-tbl-calc-modes) + + +;;; Predicates + +(defun org-at-TBLFM-p (&optional pos) + "Non-nil when point (or POS) is in #+TBLFM line." + (save-excursion + (goto-char (or pos (point))) + (beginning-of-line) + (and (let ((case-fold-search t)) (looking-at org-TBLFM-regexp)) + (eq (org-element-type (org-element-at-point)) 'table)))) + +(defun org-at-table-p (&optional table-type) + "Non-nil if the cursor is inside an Org table. +If TABLE-TYPE is non-nil, also check for table.el-type tables." + (and (org-match-line (if table-type "[ \t]*[|+]" "[ \t]*|")) + (or (not (derived-mode-p 'org-mode)) + (let ((e (org-element-lineage (org-element-at-point) '(table) t))) + (and e (or table-type + (eq 'org (org-element-property :type e)))))))) + +(defun org-at-table.el-p () + "Non-nil when point is at a table.el table." + (and (org-match-line "[ \t]*[|+]") + (let ((element (org-element-at-point))) + (and (eq (org-element-type element) 'table) + (eq (org-element-property :type element) 'table.el))))) + +(defun org-at-table-hline-p () + "Non-nil when point is inside a hline in a table. +Assume point is already in a table." + (org-match-line org-table-hline-regexp)) + +(defun org-table-check-inside-data-field (&optional noerror assume-table) + "Non-nil when point is inside a table data field. +Raise an error otherwise, unless NOERROR is non-nil. In that +case, return nil if point is not inside a data field. When +optional argument ASSUME-TABLE is non-nil, assume point is within +a table." + (cond ((and (or assume-table (org-at-table-p)) + (not (save-excursion (skip-chars-backward " \t") (bolp))) + (not (org-at-table-hline-p)) + (not (looking-at-p "[ \t]*$")))) + (noerror nil) + (t (user-error "Not in table data field")))) + + +;;; Create, Import, and Convert Tables + ;;;###autoload (defun org-table-create-with-table.el () "Use the table.el package to insert a new table. @@ -699,205 +880,53 @@ regexp When a regular expression, use it to match the separator." (insert-file-contents file) (org-table-convert-region beg (+ (point) (- (point-max) pm)) separator))) +(defun org-table-convert () + "Convert from Org table to table.el and back. +Obviously, this only works within limits. When an Org table is converted +to table.el, all horizontal separator lines get lost, because table.el uses +these as cell boundaries and has no notion of horizontal lines. A table.el +table can be converted to an Org table only if it does not do row or column +spanning. Multiline cells will become multiple cells. Beware, Org mode +does not test if the table can be successfully converted - it blindly +applies a recipe that works for simple tables." + (interactive) + (require 'table) + (if (org-at-table.el-p) + ;; convert to Org table + (let ((beg (copy-marker (org-table-begin t))) + (end (copy-marker (org-table-end t)))) + (table-unrecognize-region beg end) + (goto-char beg) + (while (re-search-forward "^\\([ \t]*\\)\\+-.*\n" end t) + (replace-match "")) + (goto-char beg)) + (if (org-at-table-p) + ;; convert to table.el table + (let ((beg (copy-marker (org-table-begin))) + (end (copy-marker (org-table-end)))) + ;; first, get rid of all horizontal lines + (goto-char beg) + (while (re-search-forward "^\\([ \t]*\\)|-.*\n" end t) + (replace-match "")) + ;; insert a hline before first + (goto-char beg) + (org-table-insert-hline 'above) + (beginning-of-line -1) + ;; insert a hline after each line + (while (progn (beginning-of-line 3) (< (point) end)) + (org-table-insert-hline)) + (goto-char beg) + (setq end (move-marker end (org-table-end))) + ;; replace "+" at beginning and ending of hlines + (while (re-search-forward "^\\([ \t]*\\)|-" end t) + (replace-match "\\1+-")) + (goto-char beg) + (while (re-search-forward "-|[ \t]*$" end t) + (replace-match "-+")) + (goto-char beg))))) -;;;###autoload -(defun org-table-export (&optional file format) - "Export table to a file, with configurable format. -Such a file can be imported into usual spreadsheet programs. - -FILE can be the output file name. If not given, it will be taken -from a TABLE_EXPORT_FILE property in the current entry or higher -up in the hierarchy, or the user will be prompted for a file -name. FORMAT can be an export format, of the same kind as it -used when `orgtbl-mode' sends a table in a different format. - -The command suggests a format depending on TABLE_EXPORT_FORMAT, -whether it is set locally or up in the hierarchy, then on the -extension of the given file name, and finally on the variable -`org-table-export-default-format'." - (interactive) - (unless (org-at-table-p) (user-error "No table at point")) - (org-table-align) ; Make sure we have everything we need. - (let ((file (or file (org-entry-get (point) "TABLE_EXPORT_FILE" t)))) - (unless file - (setq file (read-file-name "Export table to: ")) - (unless (or (not (file-exists-p file)) - (y-or-n-p (format "Overwrite file %s? " file))) - (user-error "File not written"))) - (when (file-directory-p file) - (user-error "This is a directory path, not a file")) - (when (and (buffer-file-name (buffer-base-buffer)) - (file-equal-p - (file-truename file) - (file-truename (buffer-file-name (buffer-base-buffer))))) - (user-error "Please specify a file name that is different from current")) - (let ((fileext (concat (file-name-extension file) "$")) - (format (or format (org-entry-get (point) "TABLE_EXPORT_FORMAT" t)))) - (unless format - (let* ((formats '("orgtbl-to-tsv" "orgtbl-to-csv" "orgtbl-to-latex" - "orgtbl-to-html" "orgtbl-to-generic" - "orgtbl-to-texinfo" "orgtbl-to-orgtbl" - "orgtbl-to-unicode")) - (deffmt-readable - (replace-regexp-in-string - "\t" "\\t" - (replace-regexp-in-string - "\n" "\\n" - (or (car (delq nil - (mapcar - (lambda (f) - (and (string-match-p fileext f) f)) - formats))) - org-table-export-default-format) - t t) t t))) - (setq format - (org-completing-read - "Format: " formats nil nil deffmt-readable)))) - (if (string-match "\\([^ \t\r\n]+\\)\\( +.*\\)?" format) - (let ((transform (intern (match-string 1 format))) - (params (and (match-end 2) - (read (concat "(" (match-string 2 format) ")")))) - (table (org-table-to-lisp - (buffer-substring-no-properties - (org-table-begin) (org-table-end))))) - (unless (fboundp transform) - (user-error "No such transformation function %s" transform)) - (let (buf) - (with-current-buffer (find-file-noselect file) - (setq buf (current-buffer)) - (erase-buffer) - (fundamental-mode) - (insert (funcall transform table params) "\n") - (save-buffer)) - (kill-buffer buf)) - (message "Export done.")) - (user-error "TABLE_EXPORT_FORMAT invalid"))))) - -(defvar org-table-aligned-begin-marker (make-marker) - "Marker at the beginning of the table last aligned. -Used to check if cursor still is in that table, to minimize realignment.") -(defvar org-table-aligned-end-marker (make-marker) - "Marker at the end of the table last aligned. -Used to check if cursor still is in that table, to minimize realignment.") -(defvar org-table-last-alignment nil - "List of flags for flushright alignment, from the last re-alignment. -This is being used to correctly align a single field after TAB or RET.") -(defvar org-table-last-column-widths nil - "List of max width of fields in each column. -This is being used to correctly align a single field after TAB or RET.") -(defvar-local org-table-formula-debug nil - "Non-nil means debug table formulas. -When nil, simply write \"#ERROR\" in corrupted fields.") -(defvar-local org-table-overlay-coordinates nil - "Overlay coordinates after each align of a table.") - -(defvar org-last-recalc-line nil) - -(defun org-table--align-field (field width align) - "Format FIELD according to column WIDTH and alignement ALIGN. -FIELD is a string. WIDTH is a number. ALIGN is either \"c\", -\"l\" or\"r\"." - (let* ((spaces (- width (org-string-width field))) - (prefix (pcase align - ("l" "") - ("r" (make-string spaces ?\s)) - ("c" (make-string (/ spaces 2) ?\s)))) - (suffix (make-string (- spaces (length prefix)) ?\s))) - (concat org-table-separator-space - prefix - field - suffix - org-table-separator-space))) - -;;;###autoload -(defun org-table-align () - "Align the table at point by aligning all vertical bars." - (interactive) - (let ((beg (org-table-begin)) - (end (copy-marker (org-table-end)))) - (org-table-save-field - ;; Make sure invisible characters in the table are at the right - ;; place since column widths take them into account. - (org-font-lock-ensure beg end) - (move-marker org-table-aligned-begin-marker beg) - (move-marker org-table-aligned-end-marker end) - (goto-char beg) - (org-table-with-shrunk-columns - (let* ((indent (progn (looking-at "[ \t]*") (match-string 0))) - ;; Table's rows as lists of fields. Rules are replaced - ;; by nil. Trailing spaces are removed. - (fields (mapcar - (lambda (l) - (and (not (string-match-p org-table-hline-regexp l)) - (org-split-string l "[ \t]*|[ \t]*"))) - (split-string (buffer-substring beg end) "\n" t))) - ;; Compute number of columns. If the table contains no - ;; field, create a default table and bail out. - (columns-number - (if fields (apply #'max (mapcar #'length fields)) - (kill-region beg end) - (org-table-create org-table-default-size) - (user-error "Empty table - created default table"))) - (widths nil) - (alignments nil)) - ;; Compute alignment and width for each column. - (dotimes (i columns-number) - (let* ((max-width 1) - (fixed-align? nil) - (numbers 0) - (non-empty 0)) - (dolist (row fields) - (let ((cell (or (nth i row) ""))) - (setq max-width (max max-width (org-string-width cell))) - (cond (fixed-align? nil) - ((equal cell "") nil) - ((string-match "\\`<\\([lrc]\\)[0-9]*>\\'" cell) - (setq fixed-align? (match-string 1 cell))) - (t - (cl-incf non-empty) - (when (string-match-p org-table-number-regexp cell) - (cl-incf numbers)))))) - (push max-width widths) - (push (cond - (fixed-align?) - ((>= numbers (* org-table-number-fraction non-empty)) "r") - (t "l")) - alignments))) - (setq widths (nreverse widths)) - (setq alignments (nreverse alignments)) - ;; Store alignment of this table, for later editing of single - ;; fields. - (setq org-table-last-alignment alignments) - (setq org-table-last-column-widths widths) - ;; Build new table rows. Only replace rows that actually - ;; changed. - (dolist (row fields) - (let ((previous (buffer-substring (point) (line-end-position))) - (new - (format "%s|%s|" - indent - (if (null row) ;horizontal rule - (mapconcat (lambda (w) (make-string (+ 2 w) ?-)) - widths - "+") - (let ((cells ;add missing fields - (append row - (make-list (- columns-number - (length row)) - "")))) - (mapconcat #'identity - (cl-mapcar #'org-table--align-field - cells - widths - alignments) - "|")))))) - (if (equal new previous) - (forward-line) - (insert new "\n") - (delete-region (point) (line-beginning-position 2))))) - (set-marker end nil) - (when org-table-overlay-coordinates (org-table-overlay-coordinates)) - (setq org-table-may-need-update nil)))))) + +;;; Navigation and Structure Editing ;;;###autoload (defun org-table-begin (&optional table-type) @@ -934,54 +963,6 @@ a table." (skip-chars-backward " \t") (if (bolp) (point) (line-end-position)))))) -;;;###autoload -(defun org-table-justify-field-maybe (&optional new) - "Justify the current field, text to left, number to right. -Optional argument NEW may specify text to replace the current field content." - (cond - ((and (not new) org-table-may-need-update)) ; Realignment will happen anyway - ((org-at-table-hline-p)) - ((and (not new) - (or (not (eq (marker-buffer org-table-aligned-begin-marker) - (current-buffer))) - (< (point) org-table-aligned-begin-marker) - (>= (point) org-table-aligned-end-marker))) - ;; This is not the same table, force a full re-align. - (setq org-table-may-need-update t)) - (t - ;; Realign the current field, based on previous full realign. - (let ((pos (point)) - (col (org-table-current-column))) - (when (> col 0) - (skip-chars-backward "^|") - (if (not (looking-at " *\\([^|\n]*?\\) *\\(|\\|$\\)")) - (setq org-table-may-need-update t) - (let* ((align (nth (1- col) org-table-last-alignment)) - (width (nth (1- col) org-table-last-column-widths)) - (cell (match-string 0)) - (field (match-string 1)) - (properly-closed? (/= (match-beginning 2) (match-end 2))) - (new-cell - (save-match-data - (cond (org-table-may-need-update - (format " %s |" (or new field))) - ((not properly-closed?) - (setq org-table-may-need-update t) - (format " %s |" (or new field))) - ((not new) - (concat (org-table--align-field field width align) - "|")) - ((<= (org-string-width new) width) - (concat (org-table--align-field new width align) - "|")) - (t - (setq org-table-may-need-update t) - (format " %s |" new)))))) - (unless (equal new-cell cell) - (let (org-table-may-need-update) - (replace-match new-cell t t))) - (goto-char pos)))))))) - ;;;###autoload (defun org-table-next-field () "Go to the next field in the current table, creating new lines as needed. @@ -1090,120 +1071,17 @@ Before doing so, re-align the table if necessary." (skip-chars-backward "^|\n\r") (when (looking-at " ") (forward-char)))) -;;;###autoload -(defun org-table-copy-down (n) - "Copy the value of the current field one row below. - -If the field at the cursor is empty, copy the content of the -nearest non-empty field above. With argument N, use the Nth -non-empty field. - -If the current field is not empty, it is copied down to the next -row, and the cursor is moved with it. Therefore, repeating this -command causes the column to be filled row-by-row. - -If the variable `org-table-copy-increment' is non-nil and the -field is an integer or a timestamp, it will be incremented while -copying. By default, increment by the difference between the -value in the current field and the one in the field above. To -increment using a fixed integer, set `org-table-copy-increment' -to a number. In the case of a timestamp, increment by days." - (interactive "p") - (let* ((colpos (org-table-current-column)) - (col (current-column)) - (field (save-excursion (org-table-get-field))) - (field-up (or (save-excursion - (org-table-get (1- (org-table-current-line)) - (org-table-current-column))) "")) - (non-empty (string-match "[^ \t]" field)) - (non-empty-up (string-match "[^ \t]" field-up)) - (beg (org-table-begin)) - (orig-n n) - txt txt-up inc) - (org-table-check-inside-data-field) - (if (not non-empty) - (save-excursion - (setq txt - (catch 'exit - (while (progn (beginning-of-line 1) - (re-search-backward org-table-dataline-regexp - beg t)) - (org-table-goto-column colpos t) - (if (and (looking-at - "|[ \t]*\\([^| \t][^|]*?\\)[ \t]*|") - (<= (setq n (1- n)) 0)) - (throw 'exit (match-string 1)))))) - (setq field-up - (catch 'exit - (while (progn (beginning-of-line 1) - (re-search-backward org-table-dataline-regexp - beg t)) - (org-table-goto-column colpos t) - (if (and (looking-at - "|[ \t]*\\([^| \t][^|]*?\\)[ \t]*|") - (<= (setq n (1- n)) 0)) - (throw 'exit (match-string 1)))))) - (setq non-empty-up (and field-up (string-match "[^ \t]" field-up)))) - ;; Above field was not empty, go down to the next row. Skip - ;; alignment since we do it at the end of the process anyway. - (setq txt (org-trim field)) - (let ((org-table-may-need-update nil)) (org-table-next-row)) - (org-table-blank-field)) - (if non-empty-up (setq txt-up (org-trim field-up))) - (setq inc (cond - ((numberp org-table-copy-increment) org-table-copy-increment) - (txt-up (cond ((and (string-match org-ts-regexp3 txt-up) - (string-match org-ts-regexp3 txt)) - (- (org-time-string-to-absolute txt) - (org-time-string-to-absolute txt-up))) - ((string-match org-ts-regexp3 txt) 1) - ((string-match "\\([-+]\\)?[0-9]*\\(?:\\.[0-9]+\\)?" txt-up) - (- (string-to-number txt) - (string-to-number (match-string 0 txt-up)))) - (t 1))) - (t 1))) - (if (not txt) - (user-error "No non-empty field found") - (if (and org-table-copy-increment - (not (equal orig-n 0)) - (string-match-p "^[-+^/*0-9eE.]+$" txt) - (< (string-to-number txt) 100000000)) - (setq txt (calc-eval (concat txt "+" (number-to-string inc))))) - (insert txt) - (org-move-to-column col) - (if (and org-table-copy-increment (org-at-timestamp-p 'lax)) - (org-timestamp-up-day inc) - (org-table-maybe-recalculate-line)) - (org-table-align) - (org-move-to-column col)))) - -(defun org-table-check-inside-data-field (&optional noerror assume-table) - "Non-nil when point is inside a table data field. -Raise an error otherwise, unless NOERROR is non-nil. In that -case, return nil if point is not inside a data field. When -optional argument ASSUME-TABLE is non-nil, assume point is within -a table." - (cond ((and (or assume-table (org-at-table-p)) - (not (save-excursion (skip-chars-backward " \t") (bolp))) - (not (org-at-table-hline-p)) - (not (looking-at-p "[ \t]*$")))) - (noerror nil) - (t (user-error "Not in table data field")))) - -(defvar org-table-clip nil - "Clipboard for table regions.") - -(defun org-table-get (line column) - "Get the field in table line LINE, column COLUMN. -If LINE is larger than the number of data lines in the table, the function -returns nil. However, if COLUMN is too large, we will simply return an -empty string. -If LINE is nil, use the current line. -If COLUMN is nil, use the current column." - (setq column (or column (org-table-current-column))) - (save-excursion - (and (or (not line) (org-table-goto-line line)) - (org-trim (org-table-get-field column))))) +(defun org-table-get (line column) + "Get the field in table line LINE, column COLUMN. +If LINE is larger than the number of data lines in the table, the function +returns nil. However, if COLUMN is too large, we will simply return an +empty string. +If LINE is nil, use the current line. +If COLUMN is nil, use the current column." + (setq column (or column (org-table-current-column))) + (save-excursion + (and (or (not line) (org-table-goto-line line)) + (org-trim (org-table-get-field column))))) (defun org-table-put (line column value &optional align) "Put VALUE into line LINE, column COLUMN. @@ -1225,6 +1103,30 @@ When ALIGN is set, also realign the table." (< (point-at-eol) pos)))) cnt)) +(defun org-table-current-column () + "Return current column number." + (interactive) + (save-excursion + (let ((pos (point))) + (beginning-of-line) + (if (not (search-forward "|" pos t)) 0 + (let ((column 1) + (separator (if (org-at-table-hline-p) "[+|]" "|"))) + (while (re-search-forward separator pos t) (cl-incf column)) + column))))) + +(defun org-table-current-dline () + "Find out what table data line we are in. +Only data lines count for this." + (save-excursion + (let ((c 0) + (pos (line-beginning-position))) + (goto-char (org-table-begin)) + (while (<= (point) pos) + (when (looking-at org-table-dataline-regexp) (cl-incf c)) + (forward-line)) + c))) + (defun org-table-goto-line (N) "Go to the Nth data line in the current table. Return t when the line exists, nil if it does not exist." @@ -1319,29 +1221,36 @@ value." (car eqn) "=" (cdr eqn)))) ""))))) -(defun org-table-current-column () - "Return current column number." - (interactive) - (save-excursion - (let ((pos (point))) - (beginning-of-line) - (if (not (search-forward "|" pos t)) 0 - (let ((column 1) - (separator (if (org-at-table-hline-p) "[+|]" "|"))) - (while (re-search-forward separator pos t) (cl-incf column)) - column))))) +(defun org-table-goto-field (ref &optional create-column-p) + "Move point to a specific field in the current table. -(defun org-table-current-dline () - "Find out what table data line we are in. -Only data lines count for this." - (save-excursion - (let ((c 0) - (pos (line-beginning-position))) - (goto-char (org-table-begin)) - (while (<= (point) pos) - (when (looking-at org-table-dataline-regexp) (cl-incf c)) - (forward-line)) - c))) +REF is either the name of a field its absolute reference, as +a string. No column is created unless CREATE-COLUMN-P is +non-nil. If it is a function, it is called with the column +number as its argument as is used as a predicate to know if the +column can be created. + +This function assumes the table is already analyzed (i.e., using +`org-table-analyze')." + (let* ((coordinates + (cond + ((cdr (assoc ref org-table-named-field-locations))) + ((string-match "\\`@\\([1-9][0-9]*\\)\\$\\([1-9][0-9]*\\)\\'" ref) + (list (condition-case nil + (aref org-table-dlines + (string-to-number (match-string 1 ref))) + (error (user-error "Invalid row number in %s" ref))) + (string-to-number (match-string 2 ref)))) + (t (user-error "Unknown field: %s" ref)))) + (line (car coordinates)) + (column (nth 1 coordinates)) + (create-new-column (if (functionp create-column-p) + (funcall create-column-p column) + create-column-p))) + (when coordinates + (goto-char org-table-current-begin-pos) + (forward-line line) + (org-table-goto-column column nil create-new-column)))) ;;;###autoload (defun org-table-goto-column (n &optional on-delim force) @@ -1443,6 +1352,80 @@ non-nil, the one above is used." (above min) (t max))))))) +(defun org-table--swap-cells (row1 col1 row2 col2) + "Swap two cells indicated by the coordinates provided. +ROW1, COL1, ROW2, COL2 are integers indicating the row/column +position of the two cells that will be swapped in the table." + (let ((content1 (org-table-get row1 col1)) + (content2 (org-table-get row2 col2))) + (org-table-put row1 col1 content2) + (org-table-put row2 col2 content1))) + +(defun org-table--move-cell (direction) + "Move the current cell in a cardinal direction. +DIRECTION is a symbol among `up', `down', `left', and `right'. +The contents the current cell are swapped with cell in the +indicated direction. Raise an error if the move cannot be done." + (let ((row-shift (pcase direction (`up -1) (`down 1) (_ 0))) + (column-shift (pcase direction (`left -1) (`right 1) (_ 0)))) + (when (and (= 0 row-shift) (= 0 column-shift)) + (error "Invalid direction: %S" direction)) + ;; Initialize `org-table-current-ncol' and `org-table-dlines'. + (org-table-analyze) + (let* ((row (org-table-current-line)) + (column (org-table-current-column)) + (target-row (+ row row-shift)) + (target-column (+ column column-shift)) + (org-table-current-nrow (1- (length org-table-dlines)))) + (when (or (< target-column 1) + (< target-row 1) + (> target-column org-table-current-ncol) + (> target-row org-table-current-nrow)) + (user-error "Cannot move cell further")) + (org-table--swap-cells row column target-row target-column) + (org-table-goto-line target-row) + (org-table-goto-column target-column)))) + +;;;###autoload +(defun org-table-move-cell-up () + "Move a single cell up in a table. +Swap with anything in target cell." + (interactive) + (unless (org-table-check-inside-data-field) + (error "No table at point")) + (org-table--move-cell 'up) + (org-table-align)) + +;;;###autoload +(defun org-table-move-cell-down () + "Move a single cell down in a table. +Swap with anything in target cell." + (interactive) + (unless (org-table-check-inside-data-field) + (error "No table at point")) + (org-table--move-cell 'down) + (org-table-align)) + +;;;###autoload +(defun org-table-move-cell-left () + "Move a single cell left in a table. +Swap with anything in target cell." + (interactive) + (unless (org-table-check-inside-data-field) + (error "No table at point")) + (org-table--move-cell 'left) + (org-table-align)) + +;;;###autoload +(defun org-table-move-cell-right () + "Move a single cell right in a table. +Swap with anything in target cell." + (interactive) + (unless (org-table-check-inside-data-field) + (error "No table at point")) + (org-table--move-cell 'right) + (org-table-align)) + ;;;###autoload (defun org-table-delete-column () "Delete a column from the table." @@ -1690,140 +1673,178 @@ In particular, this does handle wide and invisible characters." "@" (list (cons (number-to-string dline) "INVALID")) dline -1 dline))))) ;;;###autoload -(defun org-table-sort-lines - (&optional with-case sorting-type getkey-func compare-func interactive?) - "Sort table lines according to the column at point. +(defun org-table-cut-region (beg end) + "Copy region in table to the clipboard and blank all relevant fields. +If there is no active region, use just the field at point." + (interactive (list + (if (org-region-active-p) (region-beginning) (point)) + (if (org-region-active-p) (region-end) (point)))) + (org-table-copy-region beg end 'cut)) -The position of point indicates the column to be used for -sorting, and the range of lines is the range between the nearest -horizontal separator lines, or the entire table of no such lines -exist. If point is before the first column, you will be prompted -for the sorting column. If there is an active region, the mark -specifies the first line and the sorting column, while point -should be in the last line to be included into the sorting. +(defun org-table--increment-field (field previous) + "Increment string FIELD according to PREVIOUS field. + +Increment FIELD only if it is a string representing a number, per +Emacs Lisp syntax, a timestamp, or is either prefixed or suffixed +with a number. In any other case, return FIELD as-is. + +If PREVIOUS has the same structure as FIELD, e.g., +a number-prefixed string with the same pattern, the increment +step is the difference between numbers (or timestamps, measured +in days) in PREVIOUS and FIELD. Otherwise, it uses +`org-table-copy-increment', if the variable contains a number, or +default to 1. + +The function assumes `org-table-copy-increment' is non-nil." + (let* ((default-step (if (numberp org-table-copy-increment) + org-table-copy-increment + 1)) + (number-regexp ;Lisp read syntax for numbers + (rx (and string-start + (opt (any "+-")) + (or (and (one-or-more digit) (opt ".")) + (and (zero-or-more digit) "." (one-or-more digit))) + (opt (any "eE") (opt (opt (any "+-")) (one-or-more digit))) + string-end))) + (number-prefix-regexp (rx (and string-start (one-or-more digit)))) + (number-suffix-regexp (rx (and (one-or-more digit) string-end))) + (analyze + (lambda (field) + ;; Analyze string FIELD and return information related to + ;; increment or nil. When non-nil, return value has the + ;; following scheme: (TYPE VALUE PATTERN) where + ;; - TYPE is a symbol among `number', `prefix', `suffix' + ;; and `timestamp', + ;; - VALUE is a timestamp if TYPE is `timestamp', or + ;; a number otherwise, + ;; - PATTERN is the field without its prefix, or suffix if + ;; TYPE is either `prefix' or `suffix' , or nil + ;; otherwise. + (cond ((not (org-string-nw-p field)) nil) + ((string-match-p number-regexp field) + (list 'number + (string-to-number field) + nil)) + ((string-match number-prefix-regexp field) + (list 'prefix + (string-to-number (match-string 0 field)) + (substring field (match-end 0)))) + ((string-match number-suffix-regexp field) + (list 'suffix + (string-to-number (match-string 0 field)) + (substring field 0 (match-beginning 0)))) + ((string-match-p org-ts-regexp3 field) + (list 'timestamp field nil)) + (t nil)))) + (next-number-string + (lambda (n1 &optional n2) + ;; Increment number N1 and return it as a string. If N2 + ;; is also a number, deduce increment step from the + ;; difference between N1 and N2. Otherwise, increment + ;; step is `default-step'. + (number-to-string (if n2 (+ n1 (- n1 n2)) (+ n1 default-step))))) + (shift-timestamp + (lambda (t1 &optional t2) + ;; Increment timestamp T1 and return it. If T2 is also + ;; a timestamp, deduce increment step from the difference, + ;; in days, between T1 and T2. Otherwise, increment by + ;; `default-step' days. + (with-temp-buffer + (insert t1) + (org-timestamp-up-day (if (not t2) default-step + (- (org-time-string-to-absolute t1) + (org-time-string-to-absolute t2)))) + (buffer-string))))) + ;; Check if both PREVIOUS and FIELD have the same type. Also, if + ;; the case of prefixed or suffixed numbers, make sure their + ;; pattern, i.e., the part of the string without the prefix or the + ;; suffix, is the same. + (pcase (cons (funcall analyze field) (funcall analyze previous)) + (`((number ,n1 ,_) . (number ,n2 ,_)) + (funcall next-number-string n1 n2)) + (`((number ,n ,_) . ,_) + (funcall next-number-string n)) + (`((prefix ,n1 ,p1) . (prefix ,n2 ,p2)) + (concat (funcall next-number-string n1 (and (equal p1 p2) n2)) p1)) + (`((prefix ,n ,p) . ,_) + (concat (funcall next-number-string n) p)) + (`((suffix ,n1 ,p1) . (suffix ,n2 ,p2)) + (concat p1 (funcall next-number-string n1 (and (equal p1 p2) n2)))) + (`((suffix ,n ,p) . ,_) + (concat p (funcall next-number-string n))) + (`((timestamp ,t1 ,_) . (timestamp ,t2 ,_)) + (funcall shift-timestamp t1 t2)) + (`((timestamp ,t1 ,_) . ,_) + (funcall shift-timestamp t1)) + (_ field)))) -The command then prompts for the sorting type which can be -alphabetically, numerically, or by time (as given in a time stamp -in the field, or as a HH:MM value). Sorting in reverse order is -also possible. +;;;###autoload +(defun org-table-copy-down (n) + "Copy the value of the current field one row below. -With prefix argument WITH-CASE, alphabetic sorting will be case-sensitive -if the locale allows for it. +If the field at the cursor is empty, copy the content of the +nearest non-empty field above. With argument N, use the Nth +non-empty field. -If SORTING-TYPE is specified when this function is called from a Lisp -program, no prompting will take place. SORTING-TYPE must be a character, -any of (?a ?A ?n ?N ?t ?T ?f ?F) where the capital letters indicate that -sorting should be done in reverse order. +If the current field is not empty, it is copied down to the next +row, and the cursor is moved with it. Therefore, repeating this +command causes the column to be filled row-by-row. -If the SORTING-TYPE is ?f or ?F, then GETKEY-FUNC specifies -a function to be called to extract the key. It must return a value -that is compatible with COMPARE-FUNC, the function used to compare -entries. - -A non-nil value for INTERACTIVE? is used to signal that this -function is being called interactively." - (interactive (list current-prefix-arg nil nil nil t)) - (when (org-region-active-p) (goto-char (region-beginning))) - ;; Point must be either within a field or before a data line. - (save-excursion - (skip-chars-backward " \t") - (when (bolp) (search-forward "|" (line-end-position) t)) - (org-table-check-inside-data-field)) - ;; Set appropriate case sensitivity and column used for sorting. - (let ((column (let ((c (org-table-current-column))) - (cond ((> c 0) c) - (interactive? - (read-number "Use column N for sorting: ")) - (t 1)))) - (sorting-type - (or sorting-type - (read-char-exclusive "Sort Table: [a]lphabetic, [n]umeric, \ -\[t]ime, [f]unc. A/N/T/F means reversed: "))) - (start (org-table-begin)) - (end (org-table-end))) - (save-restriction - ;; Narrow buffer to appropriate sorting area. - (if (org-region-active-p) - (progn (goto-char (region-beginning)) - (narrow-to-region - (point) - (save-excursion (goto-char (region-end)) - (line-beginning-position 2)))) - (narrow-to-region - (save-excursion - (if (re-search-backward org-table-hline-regexp start t) - (line-beginning-position 2) - start)) - (if (save-excursion (re-search-forward org-table-hline-regexp end t)) - (match-beginning 0) - end))) - ;; Determine arguments for `sort-subr'. Also record original - ;; position. `org-table-save-field' cannot help here since - ;; sorting is too much destructive. - (let* ((coordinates - (cons (count-lines (point-min) (line-beginning-position)) - (current-column))) - (extract-key-from-field - ;; Function to be called on the contents of the field - ;; used for sorting in the current row. - (cl-case sorting-type - ((?n ?N) #'string-to-number) - ((?a ?A) #'org-sort-remove-invisible) - ((?t ?T) - (lambda (f) - (cond ((string-match org-ts-regexp-both f) - (float-time - (org-time-string-to-time (match-string 0 f)))) - ((org-duration-p f) (org-duration-to-minutes f)) - ((string-match "\\<[0-9]+:[0-9]\\{2\\}\\>" f) - (org-duration-to-minutes (match-string 0 f))) - (t 0)))) - ((?f ?F) - (or getkey-func - (and interactive? - (org-read-function "Function for extracting keys: ")) - (error "Missing key extractor to sort rows"))) - (t (user-error "Invalid sorting type `%c'" sorting-type)))) - (predicate - (cl-case sorting-type - ((?n ?N ?t ?T) #'<) - ((?a ?A) (if with-case #'org-string-collate-lessp - (lambda (s1 s2) (org-string-collate-lessp s1 s2 nil t)))) - ((?f ?F) - (or compare-func - (and interactive? - (org-read-function - "Function for comparing keys (empty for default \ -`sort-subr' predicate): " - 'allow-empty)))))) - (shrunk-columns (remq column (org-table--list-shrunk-columns)))) - (goto-char (point-min)) - (sort-subr (memq sorting-type '(?A ?N ?T ?F)) - (lambda () - (forward-line) - (while (and (not (eobp)) - (not (looking-at org-table-dataline-regexp))) - (forward-line))) - #'end-of-line - (lambda () - (funcall extract-key-from-field - (org-trim (org-table-get-field column)))) - nil - predicate) - ;; Hide all columns but the one being sorted. - (org-table--shrink-columns shrunk-columns start end) - ;; Move back to initial field. - (forward-line (car coordinates)) - (move-to-column (cdr coordinates)))))) - -;;;###autoload -(defun org-table-cut-region (beg end) - "Copy region in table to the clipboard and blank all relevant fields. -If there is no active region, use just the field at point." - (interactive (list - (if (org-region-active-p) (region-beginning) (point)) - (if (org-region-active-p) (region-end) (point)))) - (org-table-copy-region beg end 'cut)) +If the variable `org-table-copy-increment' is non-nil and the +field is a number, a timestamp, or is either prefixed or suffixed +with a number, it will be incremented while copying. By default, +increment by the difference between the value in the current +field and the one in the field above, if any. To increment using +a fixed integer, set `org-table-copy-increment' to a number. In +the case of a timestamp, increment by days. + +However, when N is 0, do not increment the field at all." + (interactive "p") + (org-table-check-inside-data-field) + (let* ((beg (org-table-begin)) + (column (org-table-current-column)) + (initial-field (save-excursion + (let ((f (org-string-nw-p (org-table-get-field)))) + (and f (org-trim f))))) + field field-above next-field) + (save-excursion + ;; Get reference field. + (if initial-field (setq field initial-field) + (beginning-of-line) + (setq field + (catch :exit + (while (re-search-backward org-table-dataline-regexp beg t) + (let ((f (org-string-nw-p (org-table-get-field column)))) + (cond ((and (> n 1) f) (cl-decf n)) + (f (throw :exit (org-trim f))) + (t nil)) + (beginning-of-line))) + (user-error "No non-empty field found")))) + ;; Check if increment is appropriate, and how it should be done. + (when (and org-table-copy-increment (/= n 0)) + ;; If increment step is not explicit, get non-empty field just + ;; above the field being incremented to guess it. + (unless (numberp org-table-copy-increment) + (setq field-above + (let ((f (unless (= beg (line-beginning-position)) + (forward-line -1) + (not (org-at-table-hline-p)) + (org-table-get-field column)))) + (and (org-string-nw-p f) + (org-trim f))))) + ;; Compute next field. + (setq next-field (org-table--increment-field field field-above)))) + ;; Since initial field in not empty, we modify row below instead. + ;; Skip alignment since we do it at the end of the process anyway. + (when initial-field + (let ((org-table-may-need-update nil)) (org-table-next-row)) + (org-table-blank-field)) + ;; Insert the new field. NEW-FIELD may be nil if + ;; `org-table-increment' is nil, or N = 0. In that case, copy + ;; FIELD. + (insert (or next-field field)) + (org-table-maybe-recalculate-line) + (org-table-align))) ;;;###autoload (defun org-table-copy-region (beg end &optional cut) @@ -1891,160 +1912,26 @@ lines." (forward-line))) (org-table-align))) -;;;###autoload -(defun org-table-convert () - "Convert from `org-mode' table to table.el and back. -Obviously, this only works within limits. When an Org table is converted -to table.el, all horizontal separator lines get lost, because table.el uses -these as cell boundaries and has no notion of horizontal lines. A table.el -table can be converted to an Org table only if it does not do row or column -spanning. Multiline cells will become multiple cells. Beware, Org mode -does not test if the table can be successfully converted - it blindly -applies a recipe that works for simple tables." - (interactive) - (require 'table) - (if (org-at-table.el-p) - ;; convert to Org table - (let ((beg (copy-marker (org-table-begin t))) - (end (copy-marker (org-table-end t)))) - (table-unrecognize-region beg end) - (goto-char beg) - (while (re-search-forward "^\\([ \t]*\\)\\+-.*\n" end t) - (replace-match "")) - (goto-char beg)) - (if (org-at-table-p) - ;; convert to table.el table - (let ((beg (copy-marker (org-table-begin))) - (end (copy-marker (org-table-end)))) - ;; first, get rid of all horizontal lines - (goto-char beg) - (while (re-search-forward "^\\([ \t]*\\)|-.*\n" end t) - (replace-match "")) - ;; insert a hline before first - (goto-char beg) - (org-table-insert-hline 'above) - (beginning-of-line -1) - ;; insert a hline after each line - (while (progn (beginning-of-line 3) (< (point) end)) - (org-table-insert-hline)) - (goto-char beg) - (setq end (move-marker end (org-table-end))) - ;; replace "+" at beginning and ending of hlines - (while (re-search-forward "^\\([ \t]*\\)|-" end t) - (replace-match "\\1+-")) - (goto-char beg) - (while (re-search-forward "-|[ \t]*$" end t) - (replace-match "-+")) - (goto-char beg))))) - -(defun org-table-transpose-table-at-point () - "Transpose Org table at point and eliminate hlines. -So a table like - -| 1 | 2 | 4 | 5 | -|---+---+---+---| -| a | b | c | d | -| e | f | g | h | - -will be transposed as - -| 1 | a | e | -| 2 | b | f | -| 4 | c | g | -| 5 | d | h | - -Note that horizontal lines disappear." - (interactive) - (let* ((table (delete 'hline (org-table-to-lisp))) - (dline_old (org-table-current-line)) - (col_old (org-table-current-column)) - (contents (mapcar (lambda (_) - (let ((tp table)) - (mapcar - (lambda (_) - (prog1 - (pop (car tp)) - (setq tp (cdr tp)))) - table))) - (car table)))) - (goto-char (org-table-begin)) - (re-search-forward "|") - (backward-char) - (delete-region (point) (org-table-end)) - (insert (mapconcat - (lambda(x) - (concat "| " (mapconcat 'identity x " | " ) " |\n" )) - contents "")) - (org-table-goto-line col_old) - (org-table-goto-column dline_old)) - (org-table-align)) - -;;;###autoload -(defun org-table-wrap-region (arg) - "Wrap several fields in a column like a paragraph. -This is useful if you'd like to spread the contents of a field over several -lines, in order to keep the table compact. - -If there is an active region, and both point and mark are in the same column, -the text in the column is wrapped to minimum width for the given number of -lines. Generally, this makes the table more compact. A prefix ARG may be -used to change the number of desired lines. For example, \ -`C-2 \\[org-table-wrap-region]' -formats the selected text to two lines. If the region was longer than two -lines, the remaining lines remain empty. A negative prefix argument reduces -the current number of lines by that amount. The wrapped text is pasted back -into the table. If you formatted it to more lines than it was before, fields -further down in the table get overwritten - so you might need to make space in -the table first. - -If there is no region, the current field is split at the cursor position and -the text fragment to the right of the cursor is prepended to the field one -line down. - -If there is no region, but you specify a prefix ARG, the current field gets -blank, and the content is appended to the field above." - (interactive "P") - (org-table-check-inside-data-field) - (if (org-region-active-p) - ;; There is a region: fill as a paragraph. - (let ((start (region-beginning))) - (org-table-cut-region (region-beginning) (region-end)) - (when (> (length (car org-table-clip)) 1) - (user-error "Region must be limited to single column")) - (let ((nlines (cond ((not arg) (length org-table-clip)) - ((< arg 1) (+ (length org-table-clip) arg)) - (t arg)))) - (setq org-table-clip - (mapcar #'list - (org-wrap (mapconcat #'car org-table-clip " ") - nil - nlines)))) - (goto-char start) - (org-table-paste-rectangle)) - ;; No region, split the current field at point. - (unless (org-get-alist-option org-M-RET-may-split-line 'table) - (skip-chars-forward "^\r\n|")) - (cond - (arg ; Combine with field above. - (let ((s (org-table-blank-field)) - (col (org-table-current-column))) - (forward-line -1) - (while (org-at-table-hline-p) (forward-line -1)) - (org-table-goto-column col) - (skip-chars-forward "^|") - (skip-chars-backward " ") - (insert " " (org-trim s)) - (org-table-align))) - ((looking-at "\\([^|]+\\)+|") ; Split field. - (let ((s (match-string 1))) - (replace-match " |") - (goto-char (match-beginning 0)) - (org-table-next-row) - (insert (org-trim s) " ") - (org-table-align))) - (t (org-table-next-row))))) + +;;; Follow Field minor mode -(defvar org-field-marker nil) +(define-minor-mode org-table-follow-field-mode + "Minor mode to make the table field editor window follow the cursor. +When this mode is active, the field editor window will always show the +current field. The mode exits automatically when the cursor leaves the +table (but see `org-table-exit-follow-field-mode-when-leaving-table')." + nil " TblFollow" nil + (if org-table-follow-field-mode + (add-hook 'post-command-hook 'org-table-follow-fields-with-editor + 'append 'local) + (remove-hook 'post-command-hook 'org-table-follow-fields-with-editor 'local) + (let* ((buf (get-buffer "*Org Table Edit Field*")) + (win (and buf (get-buffer-window buf)))) + (when win (delete-window win)) + (when buf + (with-current-buffer buf + (move-marker org-field-marker nil)) + (kill-buffer buf))))) ;;;###autoload (defun org-table-edit-field (arg) @@ -2098,6 +1985,17 @@ toggle `org-table-follow-field-mode'." (setq-local org-field-marker pos) (message "Edit and finish with C-c C-c"))))) +(defun org-table-follow-fields-with-editor () + (if (and org-table-exit-follow-field-mode-when-leaving-table + (not (org-at-table-p))) + ;; We have left the table, exit the follow mode + (org-table-follow-field-mode -1) + (when (org-table-check-inside-data-field 'noerror) + (let ((win (selected-window))) + (org-table-edit-field nil) + (org-fit-window-to-buffer) + (select-window win))))) + (defun org-table-finish-edit-field () "Finish editing a table data field. Remove all newline characters, insert the result into the table, realign @@ -2121,117 +2019,11 @@ the table and kill the editing buffer." (org-table-align) (message "New field value inserted"))) -(define-minor-mode org-table-follow-field-mode - "Minor mode to make the table field editor window follow the cursor. -When this mode is active, the field editor window will always show the -current field. The mode exits automatically when the cursor leaves the -table (but see `org-table-exit-follow-field-mode-when-leaving-table')." - nil " TblFollow" nil - (if org-table-follow-field-mode - (add-hook 'post-command-hook 'org-table-follow-fields-with-editor - 'append 'local) - (remove-hook 'post-command-hook 'org-table-follow-fields-with-editor 'local) - (let* ((buf (get-buffer "*Org Table Edit Field*")) - (win (and buf (get-buffer-window buf)))) - (when win (delete-window win)) - (when buf - (with-current-buffer buf - (move-marker org-field-marker nil)) - (kill-buffer buf))))) - -(defun org-table-follow-fields-with-editor () - (if (and org-table-exit-follow-field-mode-when-leaving-table - (not (org-at-table-p))) - ;; We have left the table, exit the follow mode - (org-table-follow-field-mode -1) - (when (org-table-check-inside-data-field 'noerror) - (let ((win (selected-window))) - (org-table-edit-field nil) - (org-fit-window-to-buffer) - (select-window win))))) - -(defvar org-timecnt) ; dynamically scoped parameter - -;;;###autoload -(defun org-table-sum (&optional beg end nlast) - "Sum numbers in region of current table column. -The result will be displayed in the echo area, and will be available -as kill to be inserted with \\[yank]. + +;;; Formulas -If there is an active region, it is interpreted as a rectangle and all -numbers in that rectangle will be summed. If there is no active -region and point is located in a table column, sum all numbers in that -column. - -If at least one number looks like a time HH:MM or HH:MM:SS, all other -numbers are assumed to be times as well (in decimal hours) and the -numbers are added as such. - -If NLAST is a number, only the NLAST fields will actually be summed." - (interactive) - (save-excursion - (let (col (org-timecnt 0) diff h m s org-table-clip) - (cond - ((and beg end)) ; beg and end given explicitly - ((org-region-active-p) - (setq beg (region-beginning) end (region-end))) - (t - (setq col (org-table-current-column)) - (goto-char (org-table-begin)) - (unless (re-search-forward "^[ \t]*|[^-]" nil t) - (user-error "No table data")) - (org-table-goto-column col) - (setq beg (point)) - (goto-char (org-table-end)) - (unless (re-search-backward "^[ \t]*|[^-]" nil t) - (user-error "No table data")) - (org-table-goto-column col) - (setq end (point)))) - (let* ((items (apply 'append (org-table-copy-region beg end))) - (items1 (cond ((not nlast) items) - ((>= nlast (length items)) items) - (t (setq items (reverse items)) - (setcdr (nthcdr (1- nlast) items) nil) - (nreverse items)))) - (numbers (delq nil (mapcar 'org-table-get-number-for-summing - items1))) - (res (apply '+ numbers)) - (sres (if (= org-timecnt 0) - (number-to-string res) - (setq diff (* 3600 res) - h (floor diff 3600) diff (mod diff 3600) - m (floor diff 60) diff (mod diff 60) - s diff) - (format "%.0f:%02.0f:%02.0f" h m s)))) - (kill-new sres) - (when (called-interactively-p 'interactive) - (message "%s" (substitute-command-keys - (format "Sum of %d items: %-20s \ -\(\\[yank] will insert result into buffer)" (length numbers) sres)))) - sres)))) - -(defun org-table-get-number-for-summing (s) - (let (n) - (if (string-match "^ *|? *" s) - (setq s (replace-match "" nil nil s))) - (if (string-match " *|? *$" s) - (setq s (replace-match "" nil nil s))) - (setq n (string-to-number s)) - (cond - ((and (string-match "0" s) - (string-match "\\`[-+ \t0.edED]+\\'" s)) 0) - ((string-match "\\`[ \t]+\\'" s) nil) - ((string-match "\\`\\([0-9]+\\):\\([0-9]+\\)\\(:\\([0-9]+\\)\\)?\\'" s) - (let ((h (string-to-number (or (match-string 1 s) "0"))) - (m (string-to-number (or (match-string 2 s) "0"))) - (s (string-to-number (or (match-string 4 s) "0")))) - (if (boundp 'org-timecnt) (setq org-timecnt (1+ org-timecnt))) - (* 1.0 (+ h (/ m 60.0) (/ s 3600.0))))) - ((equal n 0) nil) - (t n)))) - -(defun org-table-current-field-formula (&optional key noerror) - "Return the formula active for the current field. +(defun org-table-current-field-formula (&optional key noerror) + "Return the formula active for the current field. Assumes that table is already analyzed. If KEY is given, return the key to this formula. Otherwise return the formula preceded @@ -2446,19 +2238,6 @@ If yes, store the formula and apply it." (org-table-eval-formula (and named '(4)) (org-table-formula-from-user eq)))))) -(defvar org-recalc-commands nil - "List of commands triggering the recalculation of a line. -Will be filled automatically during use.") - -(defvar org-recalc-marks - '((" " . "Unmarked: no special line, no automatic recalculation") - ("#" . "Automatically recalculate this line upon TAB, RET, and C-c C-c in the line") - ("*" . "Recalculate only when entire table is recalculated with `C-u C-c *'") - ("!" . "Column name definition line. Reference in formula as $name.") - ("$" . "Parameter definition line name=value. Reference in formula as $name.") - ("_" . "Names for values in row below this one.") - ("^" . "Names for values in row above this one."))) - ;;;###autoload (defun org-table-rotate-recalc-marks (&optional newchar) "Rotate the recalculation mark in the first column. @@ -2529,141 +2308,6 @@ of the new mark." (when (called-interactively-p 'interactive) (message "%s" (cdr (assoc newchar org-recalc-marks)))))) -;;;###autoload -(defun org-table-analyze () - "Analyze table at point and store results. - -This function sets up the following dynamically scoped variables: - - `org-table-column-name-regexp', - `org-table-column-names', - `org-table-current-begin-pos', - `org-table-current-line-types', - `org-table-current-ncol', - `org-table-dlines', - `org-table-hlines', - `org-table-local-parameters', - `org-table-named-field-locations'." - (let ((beg (org-table-begin)) - (end (org-table-end))) - (save-excursion - (goto-char beg) - ;; Extract column names. - (setq org-table-column-names nil) - (when (save-excursion - (re-search-forward "^[ \t]*| *! *\\(|.*\\)" end t)) - (let ((c 1)) - (dolist (name (org-split-string (match-string 1) " *| *")) - (cl-incf c) - (when (string-match "\\`[a-zA-Z][_a-zA-Z0-9]*\\'" name) - (push (cons name (int-to-string c)) org-table-column-names))))) - (setq org-table-column-names (nreverse org-table-column-names)) - (setq org-table-column-name-regexp - (format "\\$\\(%s\\)\\>" - (regexp-opt (mapcar #'car org-table-column-names) t))) - ;; Extract local parameters. - (setq org-table-local-parameters nil) - (save-excursion - (while (re-search-forward "^[ \t]*| *\\$ *\\(|.*\\)" end t) - (dolist (field (org-split-string (match-string 1) " *| *")) - (when (string-match - "\\`\\([a-zA-Z][_a-zA-Z0-9]*\\|%\\) *= *\\(.*\\)" field) - (push (cons (match-string 1 field) (match-string 2 field)) - org-table-local-parameters))))) - ;; Update named fields locations. We minimize `count-lines' - ;; processing by storing last known number of lines in LAST. - (setq org-table-named-field-locations nil) - (save-excursion - (let ((last (cons (point) 0))) - (while (re-search-forward "^[ \t]*| *\\([_^]\\) *\\(|.*\\)" end t) - (let ((c (match-string 1)) - (fields (org-split-string (match-string 2) " *| *"))) - (save-excursion - (forward-line (if (equal c "_") 1 -1)) - (let ((fields1 - (and (looking-at "^[ \t]*|[^|]*\\(|.*\\)") - (org-split-string (match-string 1) " *| *"))) - (line (cl-incf (cdr last) (count-lines (car last) (point)))) - (col 1)) - (setcar last (point)) ; Update last known position. - (while (and fields fields1) - (let ((field (pop fields)) - (v (pop fields1))) - (cl-incf col) - (when (and (stringp field) - (stringp v) - (string-match "\\`[a-zA-Z][_a-zA-Z0-9]*\\'" - field)) - (push (cons field v) org-table-local-parameters) - (push (list field line col) - org-table-named-field-locations)))))))))) - ;; Re-use existing markers when possible. - (if (markerp org-table-current-begin-pos) - (move-marker org-table-current-begin-pos (point)) - (setq org-table-current-begin-pos (point-marker))) - ;; Analyze the line types. - (let ((l 0) hlines dlines types) - (while (looking-at "[ \t]*|\\(-\\)?") - (push (if (match-end 1) 'hline 'dline) types) - (if (match-end 1) (push l hlines) (push l dlines)) - (forward-line) - (cl-incf l)) - (push 'hline types) ; Add an imaginary extra hline to the end. - (setq org-table-current-line-types (apply #'vector (nreverse types))) - (setq org-table-dlines (apply #'vector (cons nil (nreverse dlines)))) - (setq org-table-hlines (apply #'vector (cons nil (nreverse hlines))))) - ;; Get the number of columns from the first data line in table. - (goto-char beg) - (forward-line (aref org-table-dlines 1)) - (let* ((fields - (org-split-string - (buffer-substring (line-beginning-position) (line-end-position)) - "[ \t]*|[ \t]*")) - (nfields (length fields)) - al al2) - (setq org-table-current-ncol nfields) - (let ((last-dline - (aref org-table-dlines (1- (length org-table-dlines))))) - (dotimes (i nfields) - (let ((column (1+ i))) - (push (list (format "LR%d" column) last-dline column) al) - (push (cons (format "LR%d" column) (nth i fields)) al2)))) - (setq org-table-named-field-locations - (append org-table-named-field-locations al)) - (setq org-table-local-parameters - (append org-table-local-parameters al2)))))) - -(defun org-table-goto-field (ref &optional create-column-p) - "Move point to a specific field in the current table. - -REF is either the name of a field its absolute reference, as -a string. No column is created unless CREATE-COLUMN-P is -non-nil. If it is a function, it is called with the column -number as its argument as is used as a predicate to know if the -column can be created. - -This function assumes the table is already analyzed (i.e., using -`org-table-analyze')." - (let* ((coordinates - (cond - ((cdr (assoc ref org-table-named-field-locations))) - ((string-match "\\`@\\([1-9][0-9]*\\)\\$\\([1-9][0-9]*\\)\\'" ref) - (list (condition-case nil - (aref org-table-dlines - (string-to-number (match-string 1 ref))) - (error (user-error "Invalid row number in %s" ref))) - (string-to-number (match-string 2 ref)))) - (t (user-error "Unknown field: %s" ref)))) - (line (car coordinates)) - (column (nth 1 coordinates)) - (create-new-column (if (functionp create-column-p) - (funcall create-column-p column) - create-column-p))) - (when coordinates - (goto-char org-table-current-begin-pos) - (forward-line line) - (org-table-goto-column column nil create-new-column)))) - ;;;###autoload (defun org-table-maybe-recalculate-line () "Recompute the current line if marked for it, and if we haven't just done it." @@ -2675,19 +2319,6 @@ This function assumes the table is already analyzed (i.e., using (looking-at org-table-auto-recalculate-regexp)) (org-table-recalculate) t)) -(defvar org-tbl-calc-modes) ;; Dynamically bound in `org-table-eval-formula' -(defsubst org-set-calc-mode (var &optional value) - (if (stringp var) - (setq var (assoc var '(("D" calc-angle-mode deg) - ("R" calc-angle-mode rad) - ("F" calc-prefer-frac t) - ("S" calc-symbolic-mode t))) - value (nth 2 var) var (nth 1 var))) - (if (memq var org-tbl-calc-modes) - (setcar (cdr (memq var org-tbl-calc-modes)) value) - (cons var (cons value org-tbl-calc-modes))) - org-tbl-calc-modes) - ;;;###autoload (defun org-table-eval-formula (&optional arg equation suppress-align suppress-const @@ -2767,9 +2398,10 @@ location of point." (setq c (string-to-char (match-string 1 fmt)) n (string-to-number (match-string 2 fmt))) (if (= c ?p) - (setq org-tbl-calc-modes (org-set-calc-mode 'calc-internal-prec n)) + (setq org-tbl-calc-modes + (org-table--set-calc-mode 'calc-internal-prec n)) (setq org-tbl-calc-modes - (org-set-calc-mode + (org-table--set-calc-mode 'calc-float-format (list (cdr (assoc c '((?n . float) (?f . fix) (?s . sci) (?e . eng)))) @@ -2793,7 +2425,8 @@ location of point." (setq keep-empty t fmt (replace-match "" t t fmt))) (while (string-match "[DRFS]" fmt) - (setq org-tbl-calc-modes (org-set-calc-mode (match-string 0 fmt))) + (setq org-tbl-calc-modes + (org-table--set-calc-mode (match-string 0 fmt))) (setq fmt (replace-match "" t t fmt))) (unless (string-match "\\S-" fmt) (setq fmt nil)))) @@ -3618,7 +3251,6 @@ Parameters get priority." ["Standard Refs (B3 instead of @3$2)" org-table-fedit-toggle-ref-type :style toggle :selected org-table-buffer-is-an])) -(defvar org-pos) (defvar org-table--fedit-source nil "Position of the TBLFM line being edited.") @@ -3826,720 +3458,1385 @@ minutes or seconds." secs0))))) (if (< secs 0) (concat "-" res) res))) +(defun org-table-fedit-convert-buffer (function) + "Convert all references in this buffer, using FUNCTION." + (let ((origin (copy-marker (line-beginning-position)))) + (goto-char (point-min)) + (while (not (eobp)) + (insert (funcall function (buffer-substring (point) (line-end-position)))) + (delete-region (point) (line-end-position)) + (forward-line)) + (goto-char origin) + (set-marker origin nil))) - -;;; Columns shrinking - -(defun org-table--shrunk-field () - "Non-nil if current field is narrowed. -When non-nil, return the overlay narrowing the field." - (cl-some (lambda (o) - (and (eq 'table-column-hide (overlay-get o 'org-overlay-type)) - o)) - (overlays-at (save-excursion - (skip-chars-forward (if (org-at-table-hline-p) "^+|" - "^|") - (line-end-position)) - (1- (point)))))) +(defun org-table-fedit-toggle-ref-type () + "Convert all references in the buffer from B3 to @3$2 and back." + (interactive) + (setq-local org-table-buffer-is-an (not org-table-buffer-is-an)) + (org-table-fedit-convert-buffer + (if org-table-buffer-is-an + 'org-table-convert-refs-to-an 'org-table-convert-refs-to-rc)) + (message "Reference type switched to %s" + (if org-table-buffer-is-an "A1 etc" "@row$column"))) -(defun org-table--list-shrunk-columns () - "List currently shrunk columns in table at point." - (save-excursion - ;; We really check shrunk columns in current row only. It could - ;; be wrong if all rows do not contain the same number of columns - ;; (i.e. the table is not properly aligned). As a consequence, - ;; some columns may not be shrunk again upon aligning the table. - ;; - ;; For example, in the following table, cursor is on first row and - ;; "<>" indicates a shrunk column. - ;; - ;; | | - ;; | | <> | - ;; - ;; Aligning table from the first row will not shrink again the - ;; second row, which was not visible initially. - ;; - ;; However, fixing it requires to check every row, which may be - ;; slow on large tables. Moreover, the hindrance of this - ;; pathological case is very limited. - (beginning-of-line) - (search-forward "|") - (let ((separator (if (org-at-table-hline-p) "+" "|")) - (column 1) - (shrunk (and (org-table--shrunk-field) (list 1))) - (end (line-end-position))) - (while (search-forward separator end t) - (cl-incf column) - (when (org-table--shrunk-field) (push column shrunk))) - (nreverse shrunk)))) +(defun org-table-fedit-ref-up () + "Shift the reference at point one row/hline up." + (interactive) + (org-table-fedit-shift-reference 'up)) -(defun org-table--make-shrinking-overlay (start end display field &optional pre) - "Create an overlay to shrink text between START and END. +(defun org-table-fedit-ref-down () + "Shift the reference at point one row/hline down." + (interactive) + (org-table-fedit-shift-reference 'down)) -Use string DISPLAY instead of the real text between the two -buffer positions. FIELD is the real contents of the field, as -a string, or nil. It is meant to be displayed upon moving the -mouse onto the overlay. +(defun org-table-fedit-ref-left () + "Shift the reference at point one field to the left." + (interactive) + (org-table-fedit-shift-reference 'left)) -When optional argument PRE is non-nil, assume the overlay is -located at the beginning of the field, and prepend -`org-table-separator-space' to it. Otherwise, concatenate -`org-table-shrunk-column-indicator' at its end. +(defun org-table-fedit-ref-right () + "Shift the reference at point one field to the right." + (interactive) + (org-table-fedit-shift-reference 'right)) -Return the overlay." - (let ((show-before-edit - (lambda (o &rest _) - ;; Removing one overlay removes all other overlays in the - ;; same column. - (mapc #'delete-overlay - (cdr (overlay-get o 'org-table-column-overlays))))) - (o (make-overlay start end))) - (overlay-put o 'insert-behind-hooks (list show-before-edit)) - (overlay-put o 'insert-in-front-hooks (list show-before-edit)) - (overlay-put o 'modification-hooks (list show-before-edit)) - (overlay-put o 'org-overlay-type 'table-column-hide) - (when (stringp field) (overlay-put o 'help-echo field)) - ;; Make sure overlays stays on top of table coordinates overlays. - ;; See `org-table-overlay-coordinates'. - (overlay-put o 'priority 1) - (let ((d (if pre (concat org-table-separator-space display) - (concat display org-table-shrunk-column-indicator)))) - (org-overlay-display o d 'org-table t)) - o)) +(defun org-table--rematch-and-replace (n &optional decr hline) + "Re-match the group N, and replace it with the shifted reference." + (or (match-end n) (user-error "Cannot shift reference in this direction")) + (goto-char (match-beginning n)) + (and (looking-at (regexp-quote (match-string n))) + (replace-match (org-table-shift-refpart (match-string 0) decr hline) + t t))) -(defun org-table--shrink-field (width align start end contents) - "Shrink a table field to a specified width. +(defun org-table-fedit-shift-reference (dir) + (cond + ((org-in-regexp "\\(\\<[a-zA-Z]\\)&") + (if (memq dir '(left right)) + (org-table--rematch-and-replace 1 (eq dir 'left)) + (user-error "Cannot shift reference in this direction"))) + ((org-in-regexp "\\(\\<[a-zA-Z]\\{1,2\\}\\)\\([0-9]+\\)") + ;; A B3-like reference + (if (memq dir '(up down)) + (org-table--rematch-and-replace 2 (eq dir 'up)) + (org-table--rematch-and-replace 1 (eq dir 'left)))) + ((org-in-regexp + "\\(@\\|\\.\\.\\)\\([-+]?\\(I+\\>\\|[0-9]+\\)\\)\\(\\$\\([-+]?[0-9]+\\)\\)?") + ;; An internal reference + (if (memq dir '(up down)) + (org-table--rematch-and-replace 2 (eq dir 'up) (match-end 3)) + (org-table--rematch-and-replace 5 (eq dir 'left)))))) -WIDTH is an integer representing the number of characters to -display, in addition to `org-table-shrunk-column-indicator'. -ALIGN is the alignment of the current column, as either \"l\", -\"c\" or \"r\". START and END are, respectively, the beginning -and ending positions of the field. CONTENTS is its trimmed -contents, as a string, or `hline' for table rules. +(defun org-table-shift-refpart (ref &optional decr hline) + "Shift a reference part REF. +If DECR is set, decrease the references row/column, else increase. +If HLINE is set, this may be a hline reference, it certainly is not +a translation reference." + (save-match-data + (let* ((sign (string-match "^[-+]" ref)) n) -Real field is hidden under one or two overlays. They have the -following properties: + (if sign (setq sign (substring ref 0 1) ref (substring ref 1))) + (cond + ((and hline (string-match "^I+" ref)) + (setq n (string-to-number (concat sign (number-to-string (length ref))))) + (setq n (+ n (if decr -1 1))) + (if (= n 0) (setq n (+ n (if decr -1 1)))) + (if sign + (setq sign (if (< n 0) "-" "+") n (abs n)) + (setq n (max 1 n))) + (concat sign (make-string n ?I))) - `org-overlay-type' + ((string-match "^[0-9]+" ref) + (setq n (string-to-number (concat sign ref))) + (setq n (+ n (if decr -1 1))) + (if sign + (concat (if (< n 0) "-" "+") (number-to-string (abs n))) + (number-to-string (max 1 n)))) - Set to `table-column-hide'. Used to identify overlays - responsible for shrinking columns in a table. + ((string-match "^[a-zA-Z]+" ref) + (org-number-to-letters + (max 1 (+ (org-letters-to-number ref) (if decr -1 1))))) - `org-table-column-overlays' + (t (user-error "Cannot shift reference")))))) - It is a list with the pattern (siblings . COLUMN-OVERLAYS) - where COLUMN-OVERLAYS is the list of all overlays hiding the - same column. +(defun org-table-fedit-toggle-coordinates () + "Toggle the display of coordinates in the referenced table." + (interactive) + (let ((pos (marker-position org-pos))) + (with-current-buffer (marker-buffer org-pos) + (save-excursion + (goto-char pos) + (org-table-toggle-coordinate-overlays))))) -Whenever the text behind or next to the overlay is modified, all -the overlays in the column are deleted, effectively displaying -the column again. +(defun org-table-fedit-finish (&optional arg) + "Parse the buffer for formula definitions and install them. +With prefix ARG, apply the new formulas to the table." + (interactive "P") + (org-table-remove-rectangle-highlight) + (when org-table-use-standard-references + (org-table-fedit-convert-buffer 'org-table-convert-refs-to-rc) + (setq org-table-buffer-is-an nil)) + (let ((pos org-pos) + (sel-win org-selected-window) + (source org-table--fedit-source) + eql) + (goto-char (point-min)) + (while (re-search-forward + "^\\(@[-+I<>0-9.$@]+\\|@?[0-9]+\\|\\$\\([a-zA-Z0-9]+\\|[<>]+\\)\\) *= *\\(.*\\(\n[ \t]+.*$\\)*\\)" + nil t) + (let ((var (match-string 1)) + (form (org-trim (match-string 3)))) + (unless (equal form "") + (while (string-match "[ \t]*\n[ \t]*" form) + (setq form (replace-match " " t t form))) + (when (assoc var eql) + (user-error "Double formulas for %s" var)) + (push (cons var form) eql)))) + (set-window-configuration org-window-configuration) + (select-window sel-win) + (goto-char source) + (org-table-store-formulas eql) + (set-marker pos nil) + (set-marker source nil) + (kill-buffer "*Edit Formulas*") + (if arg + (org-table-recalculate 'all) + (message "New formulas installed - press C-u C-c C-c to apply.")))) -Return a list of overlays hiding the field, or nil if field is -already hidden." - (cond - ((= start end) nil) ;no field to narrow - ((org-table--shrunk-field) nil) ;already shrunk - ((= 0 width) ;shrink to one character - (list (org-table--make-shrinking-overlay - start end "" (if (eq 'hline contents) "" contents)))) - ((eq contents 'hline) - (list (org-table--make-shrinking-overlay - start end (make-string (1+ width) ?-) ""))) - ((equal contents "") ;no contents to hide - (list - (let ((w (org-string-width (buffer-substring start end))) - ;; We really want WIDTH + 2 whitespace, to include blanks - ;; around fields. - (full (+ 2 width))) - (if (<= w full) - (org-table--make-shrinking-overlay - (1- end) end (make-string (- full w) ?\s) "") - (org-table--make-shrinking-overlay (- end (- w full) 1) end "" ""))))) - (t - ;; If the field is not empty, display exactly WIDTH characters. - ;; It can mean to partly hide the field, or extend it with virtual - ;; blanks. To that effect, we use one or two overlays. The - ;; first, optional, one may add or hide white spaces before the - ;; contents of the field. The other, mandatory, one cuts the - ;; field or displays white spaces at the end of the field. It - ;; also always displays `org-table-shrunk-column-indicator'. - (let* ((lead (org-with-point-at start (skip-chars-forward " "))) - (trail (org-with-point-at end (abs (skip-chars-backward " ")))) - (contents-width (org-string-width - (buffer-substring (+ start lead) (- end trail))))) - (cond - ;; Contents are too large to fit in WIDTH character. Limit, if - ;; possible, blanks at the beginning of the field to a single - ;; white space, and cut the field at an appropriate location. - ((<= width contents-width) - (let ((pre - (and (> lead 0) - (org-table--make-shrinking-overlay - start (+ start lead) "" contents t))) - (post - (org-table--make-shrinking-overlay - ;; Find cut location so that WIDTH characters are - ;; visible using dichotomy. - (let* ((begin (+ start lead)) - (lower begin) - (upper (1- end)) - ;; Compensate the absence of leading space, - ;; thus preserving alignment. - (width (if (= lead 0) (1+ width) width))) - (catch :exit - (while (> (- upper lower) 1) - (let ((mean (+ (ash lower -1) - (ash upper -1) - (logand lower upper 1)))) - (pcase (org-string-width (buffer-substring begin mean)) - ((pred (= width)) (throw :exit mean)) - ((pred (< width)) (setq upper mean)) - (_ (setq lower mean))))) - upper)) - end "" contents))) - (if pre (list pre post) (list post)))) - ;; Contents fit it WIDTH characters. First compute number of - ;; white spaces needed on each side of contents, then expand or - ;; compact blanks on each side of the field in order to - ;; preserve width and obey to alignment constraints. - (t - (let* ((required (- width contents-width)) - (before - (pcase align - ;; Compensate the absence of leading space, thus - ;; preserving alignment. - ((guard (= lead 0)) -1) - ("l" 0) - ("r" required) - ("c" (/ required 2)))) - (after (- required before)) - (pre - (pcase (1- lead) - ((or (guard (= lead 0)) (pred (= before))) nil) - ((pred (< before)) - (org-table--make-shrinking-overlay - start (+ start (- lead before)) "" contents t)) - (_ - (org-table--make-shrinking-overlay - start (1+ start) - (make-string (- before (1- lead)) ?\s) - contents t)))) - (post - (pcase (1- trail) - ((pred (= after)) - (org-table--make-shrinking-overlay (1- end) end "" contents)) - ((pred (< after)) - (org-table--make-shrinking-overlay - (+ after (- end trail)) end "" contents)) - (_ - (org-table--make-shrinking-overlay - (1- end) end - (make-string (- after (1- trail)) ?\s) - contents))))) - (if pre (list pre post) (list post))))))))) +(defun org-table-fedit-abort () + "Abort editing formulas, without installing the changes." + (interactive) + (org-table-remove-rectangle-highlight) + (let ((pos org-pos) (sel-win org-selected-window)) + (set-window-configuration org-window-configuration) + (select-window sel-win) + (goto-char pos) + (move-marker pos nil) + (message "Formula editing aborted without installing changes"))) -(defun org-table--read-column-selection (select max) - "Read column selection select as a list of numbers. +(defun org-table-fedit-lisp-indent () + "Pretty-print and re-indent Lisp expressions in the Formula Editor." + (interactive) + (let ((pos (point)) beg end ind) + (beginning-of-line 1) + (cond + ((looking-at "[ \t]") + (goto-char pos) + (call-interactively 'lisp-indent-line)) + ((looking-at "[$&@0-9a-zA-Z]+ *= *[^ \t\n']") (goto-char pos)) + ((not (fboundp 'pp-buffer)) + (user-error "Cannot pretty-print. Command `pp-buffer' is not available")) + ((looking-at "[$&@0-9a-zA-Z]+ *= *'(") + (goto-char (- (match-end 0) 2)) + (setq beg (point)) + (setq ind (make-string (current-column) ?\ )) + (condition-case nil (forward-sexp 1) + (error + (user-error "Cannot pretty-print Lisp expression: Unbalanced parenthesis"))) + (setq end (point)) + (save-restriction + (narrow-to-region beg end) + (if (eq last-command this-command) + (progn + (goto-char (point-min)) + (setq this-command nil) + (while (re-search-forward "[ \t]*\n[ \t]*" nil t) + (replace-match " "))) + (pp-buffer) + (untabify (point-min) (point-max)) + (goto-char (1+ (point-min))) + (while (re-search-forward "^." nil t) + (beginning-of-line 1) + (insert ind)) + (goto-char (point-max)) + (org-delete-backward-char 1))) + (goto-char beg)) + (t nil)))) -SELECT is a string containing column ranges, separated by white -space characters, see `org-table-hide-column' for details. MAX -is the maximum column number. +(defun org-table-fedit-line-up () + "Move cursor one line up in the window showing the table." + (interactive) + (org-table-fedit-move 'previous-line)) -Return value is a sorted list of numbers. Ignore any number -outside of the [1;MAX] range." - (catch :all - (sort - (delete-dups - (cl-mapcan - (lambda (s) - (cond - ((member s '("-" "1-")) (throw :all (number-sequence 1 max))) - ((string-match-p "\\`[0-9]+\\'" s) - (let ((n (string-to-number s))) - (and (> n 0) (<= n max) (list n)))) - ((string-match "\\`\\([0-9]+\\)?-\\([0-9]+\\)?\\'" s) - (let ((n (match-string 1 s)) - (m (match-string 2 s))) - (number-sequence (if n (max 1 (string-to-number n)) - 1) - (if m (min max (string-to-number m)) - max)))) - (t nil))) ;invalid specification - (split-string select))) - #'<))) +(defun org-table-fedit-line-down () + "Move cursor one line down in the window showing the table." + (interactive) + (org-table-fedit-move 'next-line)) -(defun org-table--shrink-columns (columns beg end) - "Shrink COLUMNS in a table. -COLUMNS is a sorted list of column numbers. BEG and END are, -respectively, the beginning position and the end position of the -table." - (org-with-wide-buffer - (org-font-lock-ensure beg end) - (dolist (c columns) - (goto-char beg) - (let ((align nil) - (width nil) - (fields nil)) - (while (< (point) end) - (catch :continue - (let* ((hline? (org-at-table-hline-p)) - (separator (if hline? "+" "|"))) - ;; Move to COLUMN. - (search-forward "|") - (or (= c 1) ;already there - (search-forward separator (line-end-position) t (1- c)) - (throw :continue nil)) ;skip invalid columns - ;; Extract boundaries and contents from current field. - ;; Also set the column's width if we encounter a width - ;; cookie for the first time. - (let* ((start (point)) - (end (progn - (skip-chars-forward (concat "^|" separator) - (line-end-position)) - (point))) - (contents (if hline? 'hline - (org-trim (buffer-substring start end))))) - (push (list start end contents) fields) - (when (and (not hline?) - (string-match "\\`<\\([lrc]\\)?\\([0-9]+\\)>\\'" - contents)) - (unless align (setq align (match-string 1 contents))) - (unless width - (setq width (string-to-number (match-string 2 contents)))))))) - (forward-line)) - ;; Link overlays for current field to the other overlays in the - ;; same column. - (let ((chain (list 'siblings))) - (dolist (field fields) - (dolist (new (apply #'org-table--shrink-field - (or width 0) (or align "l") field)) - (push new (cdr chain)) - (overlay-put new 'org-table-column-overlays chain)))))))) +(defun org-table-fedit-move (command) + "Move the cursor in the window showing the table. +Use COMMAND to do the motion, repeat if necessary to end up in a data line." + (let ((org-table-allow-automatic-line-recalculation nil) + (pos org-pos) (win (selected-window)) p) + (select-window (get-buffer-window (marker-buffer org-pos))) + (setq p (point)) + (call-interactively command) + (while (and (org-at-table-p) + (org-at-table-hline-p)) + (call-interactively command)) + (or (org-at-table-p) (goto-char p)) + (move-marker pos (point)) + (select-window win))) -;;;###autoload -(defun org-table-toggle-column-width (&optional arg) - "Shrink or expand current column in an Org table. +(defun org-table-fedit-scroll (N) + (interactive "p") + (let ((other-window-scroll-buffer (marker-buffer org-pos))) + (scroll-other-window N))) -If a width cookie specifies a width W for the column, the first -W visible characters are displayed. Otherwise, the column is -shrunk to a single character. +(defun org-table-fedit-scroll-down (N) + (interactive "p") + (org-table-fedit-scroll (- N))) -When point is before the first column or after the last one, ask -for the columns to shrink or expand, as a list of ranges. -A column range can be one of the following patterns: +(defun org-table-add-rectangle-overlay (beg end &optional face) + "Add a new overlay." + (let ((ov (make-overlay beg end))) + (overlay-put ov 'face (or face 'secondary-selection)) + (push ov org-table-rectangle-overlays))) - N column N only - N-M every column between N and M (both inclusive) - N- every column between N (inclusive) and the last column - -M every column between the first one and M (inclusive) - - every column +(defun org-table-highlight-rectangle (&optional beg end face) + "Highlight rectangular region in a table. +When buffer positions BEG and END are provided, use them to +delimit the region to highlight. Otherwise, refer to point. Use +FACE, when non-nil, for the highlight." + (let* ((beg (or beg (point))) + (end (or end (point))) + (b (min beg end)) + (e (max beg end)) + (start-coordinates + (save-excursion + (goto-char b) + (cons (line-beginning-position) (org-table-current-column)))) + (end-coordinates + (save-excursion + (goto-char e) + (cons (line-beginning-position) (org-table-current-column))))) + (when (boundp 'org-show-positions) + (setq org-show-positions (cons b (cons e org-show-positions)))) + (goto-char (car start-coordinates)) + (let ((column-start (min (cdr start-coordinates) (cdr end-coordinates))) + (column-end (max (cdr start-coordinates) (cdr end-coordinates))) + (last-row (car end-coordinates))) + (while (<= (point) last-row) + (when (looking-at org-table-dataline-regexp) + (org-table-goto-column column-start) + (skip-chars-backward "^|\n") + (let ((p (point))) + (org-table-goto-column column-end) + (skip-chars-forward "^|\n") + (org-table-add-rectangle-overlay p (point) face))) + (forward-line))) + (goto-char (car start-coordinates))) + (add-hook 'before-change-functions #'org-table-remove-rectangle-highlight)) -When optional argument ARG is a string, use it as white space -separated list of column ranges. +(defun org-table-remove-rectangle-highlight (&rest _ignore) + "Remove the rectangle overlays." + (unless org-inhibit-highlight-removal + (remove-hook 'before-change-functions 'org-table-remove-rectangle-highlight) + (mapc 'delete-overlay org-table-rectangle-overlays) + (setq org-table-rectangle-overlays nil))) -When called with `\\[universal-argument]' prefix, call \ -`org-table-shrink', i.e., -shrink columns with a width cookie and expand the others. +(defvar-local org-table-coordinate-overlays nil + "Collects the coordinate grid overlays, so that they can be removed.") -When called with `\\[universal-argument] \\[universal-argument]' \ -prefix, expand all columns." - (interactive "P") - (unless (org-at-table-p) (user-error "Not in a table")) - (let* ((begin (org-table-begin)) - (end (org-table-end)) - ;; Compute an upper bound for the number of columns. - ;; Nonexistent columns are ignored anyway. - (max-columns (/ (- (line-end-position) (line-beginning-position)) 2)) - (shrunk (org-table--list-shrunk-columns)) - (columns - (pcase arg - (`nil - (if (save-excursion - (skip-chars-backward "^|" (line-beginning-position)) - (or (bolp) (looking-at-p "[ \t]*$"))) - ;; Point is either before first column or past last - ;; one. Ask for columns to operate on. - (org-table--read-column-selection - (read-string "Column ranges (e.g. 2-4 6-): ") - max-columns) - (list (org-table-current-column)))) - ((pred stringp) (org-table--read-column-selection arg max-columns)) - ((or `(4) `(16)) nil) - (_ (user-error "Invalid argument: %S" arg))))) - (pcase arg - (`(4) (org-table-shrink begin end)) - (`(16) (org-table-expand begin end)) - (_ - (org-table-expand begin end) - (org-table--shrink-columns - (cl-set-exclusive-or columns shrunk) begin end))))) +(defun org-table-overlay-coordinates () + "Add overlays to the table at point, to show row/column coordinates." + (interactive) + (mapc 'delete-overlay org-table-coordinate-overlays) + (setq org-table-coordinate-overlays nil) + (save-excursion + (let ((id 0) (ih 0) hline eol str ov) + (goto-char (org-table-begin)) + (while (org-at-table-p) + (setq eol (point-at-eol)) + (setq ov (make-overlay (point-at-bol) (1+ (point-at-bol)))) + (push ov org-table-coordinate-overlays) + (setq hline (looking-at org-table-hline-regexp)) + (setq str (if hline (format "I*%-2d" (setq ih (1+ ih))) + (format "%4d" (setq id (1+ id))))) + (org-overlay-before-string ov str 'org-special-keyword 'evaporate) + (when hline + (let ((ic 0)) + (while (re-search-forward "[+|]\\(-+\\)" eol t) + (cl-incf ic) + (let* ((beg (1+ (match-beginning 0))) + (s1 (format "$%d" ic)) + (s2 (org-number-to-letters ic)) + (str (if (eq t org-table-use-standard-references) s2 s1)) + (ov (make-overlay beg (+ beg (length str))))) + (push ov org-table-coordinate-overlays) + (org-overlay-display ov str 'org-special-keyword 'evaporate))))) + (forward-line))))) ;;;###autoload -(defun org-table-shrink (&optional begin end) - "Shrink all columns with a width cookie in the table at point. - -Columns without a width cookie are expanded. - -Optional arguments BEGIN and END, when non-nil, specify the -beginning and end position of the current table." +(defun org-table-toggle-coordinate-overlays () + "Toggle the display of Row/Column numbers in tables." (interactive) - (unless (or begin (org-at-table-p)) (user-error "Not at a table")) - (org-with-wide-buffer - (let ((begin (or begin (org-table-begin))) - (end (or end (org-table-end))) - (regexp "|[ \t]*<[lrc]?[0-9]+>[ \t]*\\(|\\|$\\)") - (columns)) - (goto-char begin) - (while (re-search-forward regexp end t) - (goto-char (match-beginning 1)) - (cl-pushnew (org-table-current-column) columns)) - (org-table-expand begin end) - ;; Make sure invisible characters in the table are at the right - ;; place since column widths take them into account. - (org-font-lock-ensure begin end) - (org-table--shrink-columns (sort columns #'<) begin end)))) + (setq org-table-overlay-coordinates (not org-table-overlay-coordinates)) + (message "Tables Row/Column numbers display turned %s" + (if org-table-overlay-coordinates "on" "off")) + (when (and (org-at-table-p) org-table-overlay-coordinates) + (org-table-align)) + (unless org-table-overlay-coordinates + (mapc 'delete-overlay org-table-coordinate-overlays) + (setq org-table-coordinate-overlays nil))) ;;;###autoload -(defun org-table-expand (&optional begin end) - "Expand all columns in the table at point. -Optional arguments BEGIN and END, when non-nil, specify the -beginning and end position of the current table." +(defun org-table-toggle-formula-debugger () + "Toggle the formula debugger in tables." (interactive) - (unless (or begin (org-at-table-p)) (user-error "Not at a table")) - (org-with-wide-buffer - (let ((begin (or begin (org-table-begin))) - (end (or end (org-table-end)))) - (remove-overlays begin end 'org-overlay-type 'table-column-hide)))) - + (setq org-table-formula-debug (not org-table-formula-debug)) + (message "Formula debugging has been turned %s" + (if org-table-formula-debug "on" "off"))) -;;; Formula editing +;;; Columns Shrinking -(defun org-table-fedit-convert-buffer (function) - "Convert all references in this buffer, using FUNCTION." - (let ((origin (copy-marker (line-beginning-position)))) - (goto-char (point-min)) - (while (not (eobp)) - (insert (funcall function (buffer-substring (point) (line-end-position)))) - (delete-region (point) (line-end-position)) - (forward-line)) - (goto-char origin) - (set-marker origin nil))) +(defun org-table--shrunk-field () + "Non-nil if current field is narrowed. +When non-nil, return the overlay narrowing the field." + (cl-some (lambda (o) + (and (eq 'table-column-hide (overlay-get o 'org-overlay-type)) + o)) + (overlays-at (save-excursion + (skip-chars-forward (if (org-at-table-hline-p) "^+|" + "^|") + (line-end-position)) + (1- (point)))))) -(defun org-table-fedit-toggle-ref-type () - "Convert all references in the buffer from B3 to @3$2 and back." - (interactive) - (setq-local org-table-buffer-is-an (not org-table-buffer-is-an)) - (org-table-fedit-convert-buffer - (if org-table-buffer-is-an - 'org-table-convert-refs-to-an 'org-table-convert-refs-to-rc)) - (message "Reference type switched to %s" - (if org-table-buffer-is-an "A1 etc" "@row$column"))) +(defun org-table--list-shrunk-columns () + "List currently shrunk columns in table at point." + (save-excursion + ;; We really check shrunk columns in current row only. It could + ;; be wrong if all rows do not contain the same number of columns + ;; (i.e. the table is not properly aligned). As a consequence, + ;; some columns may not be shrunk again upon aligning the table. + ;; + ;; For example, in the following table, cursor is on first row and + ;; "<>" indicates a shrunk column. + ;; + ;; | | + ;; | | <> | + ;; + ;; Aligning table from the first row will not shrink again the + ;; second row, which was not visible initially. + ;; + ;; However, fixing it requires to check every row, which may be + ;; slow on large tables. Moreover, the hindrance of this + ;; pathological case is very limited. + (beginning-of-line) + (search-forward "|") + (let ((separator (if (org-at-table-hline-p) "+" "|")) + (column 1) + (shrunk (and (org-table--shrunk-field) (list 1))) + (end (line-end-position))) + (while (search-forward separator end t) + (cl-incf column) + (when (org-table--shrunk-field) (push column shrunk))) + (nreverse shrunk)))) -(defun org-table-fedit-ref-up () - "Shift the reference at point one row/hline up." - (interactive) - (org-table-fedit-shift-reference 'up)) -(defun org-table-fedit-ref-down () - "Shift the reference at point one row/hline down." - (interactive) - (org-table-fedit-shift-reference 'down)) -(defun org-table-fedit-ref-left () - "Shift the reference at point one field to the left." - (interactive) - (org-table-fedit-shift-reference 'left)) -(defun org-table-fedit-ref-right () - "Shift the reference at point one field to the right." - (interactive) - (org-table-fedit-shift-reference 'right)) +(defun org-table--make-shrinking-overlay (start end display field &optional pre) + "Create an overlay to shrink text between START and END. -(defun org-table-fedit-shift-reference (dir) - (cond - ((org-in-regexp "\\(\\<[a-zA-Z]\\)&") - (if (memq dir '(left right)) - (org-rematch-and-replace 1 (eq dir 'left)) - (user-error "Cannot shift reference in this direction"))) - ((org-in-regexp "\\(\\<[a-zA-Z]\\{1,2\\}\\)\\([0-9]+\\)") - ;; A B3-like reference - (if (memq dir '(up down)) - (org-rematch-and-replace 2 (eq dir 'up)) - (org-rematch-and-replace 1 (eq dir 'left)))) - ((org-in-regexp - "\\(@\\|\\.\\.\\)\\([-+]?\\(I+\\>\\|[0-9]+\\)\\)\\(\\$\\([-+]?[0-9]+\\)\\)?") - ;; An internal reference - (if (memq dir '(up down)) - (org-rematch-and-replace 2 (eq dir 'up) (match-end 3)) - (org-rematch-and-replace 5 (eq dir 'left)))))) +Use string DISPLAY instead of the real text between the two +buffer positions. FIELD is the real contents of the field, as +a string, or nil. It is meant to be displayed upon moving the +mouse onto the overlay. -(defun org-rematch-and-replace (n &optional decr hline) - "Re-match the group N, and replace it with the shifted reference." - (or (match-end n) (user-error "Cannot shift reference in this direction")) - (goto-char (match-beginning n)) - (and (looking-at (regexp-quote (match-string n))) - (replace-match (org-table-shift-refpart (match-string 0) decr hline) - t t))) +When optional argument PRE is non-nil, assume the overlay is +located at the beginning of the field, and prepend +`org-table-separator-space' to it. Otherwise, concatenate +`org-table-shrunk-column-indicator' at its end. -(defun org-table-shift-refpart (ref &optional decr hline) - "Shift a reference part REF. -If DECR is set, decrease the references row/column, else increase. -If HLINE is set, this may be a hline reference, it certainly is not -a translation reference." - (save-match-data - (let* ((sign (string-match "^[-+]" ref)) n) +Return the overlay." + (let ((show-before-edit + (lambda (o &rest _) + ;; Removing one overlay removes all other overlays in the + ;; same column. + (mapc #'delete-overlay + (cdr (overlay-get o 'org-table-column-overlays))))) + (o (make-overlay start end))) + (overlay-put o 'insert-behind-hooks (list show-before-edit)) + (overlay-put o 'insert-in-front-hooks (list show-before-edit)) + (overlay-put o 'modification-hooks (list show-before-edit)) + (overlay-put o 'org-overlay-type 'table-column-hide) + (when (stringp field) (overlay-put o 'help-echo field)) + ;; Make sure overlays stays on top of table coordinates overlays. + ;; See `org-table-overlay-coordinates'. + (overlay-put o 'priority 1) + (let ((d (if pre (concat org-table-separator-space display) + (concat display org-table-shrunk-column-indicator)))) + (org-overlay-display o d 'org-table t)) + o)) - (if sign (setq sign (substring ref 0 1) ref (substring ref 1))) - (cond - ((and hline (string-match "^I+" ref)) - (setq n (string-to-number (concat sign (number-to-string (length ref))))) - (setq n (+ n (if decr -1 1))) - (if (= n 0) (setq n (+ n (if decr -1 1)))) - (if sign - (setq sign (if (< n 0) "-" "+") n (abs n)) - (setq n (max 1 n))) - (concat sign (make-string n ?I))) +(defun org-table--shrink-field (width align start end contents) + "Shrink a table field to a specified width. - ((string-match "^[0-9]+" ref) - (setq n (string-to-number (concat sign ref))) - (setq n (+ n (if decr -1 1))) - (if sign - (concat (if (< n 0) "-" "+") (number-to-string (abs n))) - (number-to-string (max 1 n)))) +WIDTH is an integer representing the number of characters to +display, in addition to `org-table-shrunk-column-indicator'. +ALIGN is the alignment of the current column, as either \"l\", +\"c\" or \"r\". START and END are, respectively, the beginning +and ending positions of the field. CONTENTS is its trimmed +contents, as a string, or `hline' for table rules. - ((string-match "^[a-zA-Z]+" ref) - (org-number-to-letters - (max 1 (+ (org-letters-to-number ref) (if decr -1 1))))) +Real field is hidden under one or two overlays. They have the +following properties: - (t (user-error "Cannot shift reference")))))) + `org-overlay-type' -(defun org-table-fedit-toggle-coordinates () - "Toggle the display of coordinates in the referenced table." - (interactive) - (let ((pos (marker-position org-pos))) - (with-current-buffer (marker-buffer org-pos) - (save-excursion - (goto-char pos) - (org-table-toggle-coordinate-overlays))))) + Set to `table-column-hide'. Used to identify overlays + responsible for shrinking columns in a table. -(defun org-table-fedit-finish (&optional arg) - "Parse the buffer for formula definitions and install them. -With prefix ARG, apply the new formulas to the table." - (interactive "P") - (org-table-remove-rectangle-highlight) - (when org-table-use-standard-references - (org-table-fedit-convert-buffer 'org-table-convert-refs-to-rc) - (setq org-table-buffer-is-an nil)) - (let ((pos org-pos) - (sel-win org-selected-window) - (source org-table--fedit-source) - eql) - (goto-char (point-min)) - (while (re-search-forward - "^\\(@[-+I<>0-9.$@]+\\|@?[0-9]+\\|\\$\\([a-zA-Z0-9]+\\|[<>]+\\)\\) *= *\\(.*\\(\n[ \t]+.*$\\)*\\)" - nil t) - (let ((var (match-string 1)) - (form (org-trim (match-string 3)))) - (unless (equal form "") - (while (string-match "[ \t]*\n[ \t]*" form) - (setq form (replace-match " " t t form))) - (when (assoc var eql) - (user-error "Double formulas for %s" var)) - (push (cons var form) eql)))) - (set-window-configuration org-window-configuration) - (select-window sel-win) - (goto-char source) - (org-table-store-formulas eql) - (set-marker pos nil) - (set-marker source nil) - (kill-buffer "*Edit Formulas*") - (if arg - (org-table-recalculate 'all) - (message "New formulas installed - press C-u C-c C-c to apply.")))) + `org-table-column-overlays' -(defun org-table-fedit-abort () - "Abort editing formulas, without installing the changes." - (interactive) - (org-table-remove-rectangle-highlight) - (let ((pos org-pos) (sel-win org-selected-window)) - (set-window-configuration org-window-configuration) - (select-window sel-win) - (goto-char pos) - (move-marker pos nil) - (message "Formula editing aborted without installing changes"))) + It is a list with the pattern (siblings . COLUMN-OVERLAYS) + where COLUMN-OVERLAYS is the list of all overlays hiding the + same column. -(defun org-table-fedit-lisp-indent () - "Pretty-print and re-indent Lisp expressions in the Formula Editor." - (interactive) - (let ((pos (point)) beg end ind) - (beginning-of-line 1) - (cond - ((looking-at "[ \t]") - (goto-char pos) - (call-interactively 'lisp-indent-line)) - ((looking-at "[$&@0-9a-zA-Z]+ *= *[^ \t\n']") (goto-char pos)) - ((not (fboundp 'pp-buffer)) - (user-error "Cannot pretty-print. Command `pp-buffer' is not available")) - ((looking-at "[$&@0-9a-zA-Z]+ *= *'(") - (goto-char (- (match-end 0) 2)) - (setq beg (point)) - (setq ind (make-string (current-column) ?\ )) - (condition-case nil (forward-sexp 1) - (error - (user-error "Cannot pretty-print Lisp expression: Unbalanced parenthesis"))) - (setq end (point)) - (save-restriction - (narrow-to-region beg end) - (if (eq last-command this-command) - (progn - (goto-char (point-min)) - (setq this-command nil) - (while (re-search-forward "[ \t]*\n[ \t]*" nil t) - (replace-match " "))) - (pp-buffer) - (untabify (point-min) (point-max)) - (goto-char (1+ (point-min))) - (while (re-search-forward "^." nil t) - (beginning-of-line 1) - (insert ind)) - (goto-char (point-max)) - (org-delete-backward-char 1))) - (goto-char beg)) - (t nil)))) +Whenever the text behind or next to the overlay is modified, all +the overlays in the column are deleted, effectively displaying +the column again. -(defvar org-show-positions nil) +Return a list of overlays hiding the field, or nil if field is +already hidden." + (cond + ((= start end) nil) ;no field to narrow + ((org-table--shrunk-field) nil) ;already shrunk + ((= 0 width) ;shrink to one character + (list (org-table--make-shrinking-overlay + start end "" (if (eq 'hline contents) "" contents)))) + ((eq contents 'hline) + (list (org-table--make-shrinking-overlay + start end (make-string (1+ width) ?-) ""))) + ((equal contents "") ;no contents to hide + (list + (let ((w (org-string-width (buffer-substring start end))) + ;; We really want WIDTH + 2 whitespace, to include blanks + ;; around fields. + (full (+ 2 width))) + (if (<= w full) + (org-table--make-shrinking-overlay + (1- end) end (make-string (- full w) ?\s) "") + (org-table--make-shrinking-overlay (- end (- w full) 1) end "" ""))))) + (t + ;; If the field is not empty, display exactly WIDTH characters. + ;; It can mean to partly hide the field, or extend it with virtual + ;; blanks. To that effect, we use one or two overlays. The + ;; first, optional, one may add or hide white spaces before the + ;; contents of the field. The other, mandatory, one cuts the + ;; field or displays white spaces at the end of the field. It + ;; also always displays `org-table-shrunk-column-indicator'. + (let* ((lead (org-with-point-at start (skip-chars-forward " "))) + (trail (org-with-point-at end (abs (skip-chars-backward " ")))) + (contents-width (org-string-width + (buffer-substring (+ start lead) (- end trail))))) + (cond + ;; Contents are too large to fit in WIDTH character. Limit, if + ;; possible, blanks at the beginning of the field to a single + ;; white space, and cut the field at an appropriate location. + ((<= width contents-width) + (let ((pre + (and (> lead 0) + (org-table--make-shrinking-overlay + start (+ start lead) "" contents t))) + (post + (org-table--make-shrinking-overlay + ;; Find cut location so that WIDTH characters are + ;; visible using dichotomy. + (let* ((begin (+ start lead)) + (lower begin) + (upper (1- end)) + ;; Compensate the absence of leading space, + ;; thus preserving alignment. + (width (if (= lead 0) (1+ width) width))) + (catch :exit + (while (> (- upper lower) 1) + (let ((mean (+ (ash lower -1) + (ash upper -1) + (logand lower upper 1)))) + (pcase (org-string-width (buffer-substring begin mean)) + ((pred (= width)) (throw :exit mean)) + ((pred (< width)) (setq upper mean)) + (_ (setq lower mean))))) + upper)) + end "" contents))) + (if pre (list pre post) (list post)))) + ;; Contents fit it WIDTH characters. First compute number of + ;; white spaces needed on each side of contents, then expand or + ;; compact blanks on each side of the field in order to + ;; preserve width and obey to alignment constraints. + (t + (let* ((required (- width contents-width)) + (before + (pcase align + ;; Compensate the absence of leading space, thus + ;; preserving alignment. + ((guard (= lead 0)) -1) + ("l" 0) + ("r" required) + ("c" (/ required 2)))) + (after (- required before)) + (pre + (pcase (1- lead) + ((or (guard (= lead 0)) (pred (= before))) nil) + ((pred (< before)) + (org-table--make-shrinking-overlay + start (+ start (- lead before)) "" contents t)) + (_ + (org-table--make-shrinking-overlay + start (1+ start) + (make-string (- before (1- lead)) ?\s) + contents t)))) + (post + (pcase (1- trail) + ((pred (= after)) + (org-table--make-shrinking-overlay (1- end) end "" contents)) + ((pred (< after)) + (org-table--make-shrinking-overlay + (+ after (- end trail)) end "" contents)) + (_ + (org-table--make-shrinking-overlay + (1- end) end + (make-string (- after (1- trail)) ?\s) + contents))))) + (if pre (list pre post) (list post))))))))) -(defun org-table-show-reference (&optional local) - "Show the location/value of the $ expression at point. -When LOCAL is non-nil, show references for the table at point." - (interactive) - (org-table-remove-rectangle-highlight) - (when local (org-table-analyze)) - (catch 'exit - (let ((pos (if local (point) org-pos)) - (face2 'highlight) - (org-inhibit-highlight-removal t) - (win (selected-window)) - (org-show-positions nil) - var name e what match dest) - (setq what (cond - ((org-in-regexp "^@[0-9]+[ \t=]") - (setq match (concat (substring (match-string 0) 0 -1) - "$1.." - (substring (match-string 0) 0 -1) - "$100")) - 'range) - ((or (org-in-regexp org-table-range-regexp2) - (org-in-regexp org-table-translate-regexp) - (org-in-regexp org-table-range-regexp)) - (setq match - (save-match-data - (org-table-convert-refs-to-rc (match-string 0)))) - 'range) - ((org-in-regexp "\\$[a-zA-Z][a-zA-Z0-9]*") 'name) - ((org-in-regexp "\\$[0-9]+") 'column) - ((not local) nil) - (t (user-error "No reference at point"))) - match (and what (or match (match-string 0)))) - (when (and match (not (equal (match-beginning 0) (point-at-bol)))) - (org-table-add-rectangle-overlay (match-beginning 0) (match-end 0) - 'secondary-selection)) - (add-hook 'before-change-functions - #'org-table-remove-rectangle-highlight) - (when (eq what 'name) (setq var (substring match 1))) - (when (eq what 'range) - (unless (eq (string-to-char match) ?@) (setq match (concat "@" match))) - (setq match (org-table-formula-substitute-names match))) - (unless local - (save-excursion - (end-of-line) - (re-search-backward "^\\S-" nil t) - (beginning-of-line) - (when (looking-at "\\(\\$[0-9a-zA-Z]+\\|@[0-9]+\\$[0-9]+\\|[a-zA-Z]+\ -\\([0-9]+\\|&\\)\\) *=") - (setq dest - (save-match-data - (org-table-convert-refs-to-rc (match-string 1)))) - (org-table-add-rectangle-overlay - (match-beginning 1) (match-end 1) face2)))) - (if (and (markerp pos) (marker-buffer pos)) - (if (get-buffer-window (marker-buffer pos)) - (select-window (get-buffer-window (marker-buffer pos))) - (org-switch-to-buffer-other-window (get-buffer-window - (marker-buffer pos))))) - (goto-char pos) - (org-table-force-dataline) - (let ((table-start - (if local org-table-current-begin-pos (org-table-begin)))) - (when dest - (setq name (substring dest 1)) - (cond - ((string-match-p "\\`\\$[a-zA-Z][a-zA-Z0-9]*" dest) - (org-table-goto-field dest)) - ((string-match-p "\\`@\\([1-9][0-9]*\\)\\$\\([1-9][0-9]*\\)\\'" - dest) - (org-table-goto-field dest)) - (t (org-table-goto-column (string-to-number name)))) - (move-marker pos (point)) - (org-table-highlight-rectangle nil nil face2)) - (cond - ((equal dest match)) - ((not match)) - ((eq what 'range) - (ignore-errors (org-table-get-range match table-start nil 'highlight))) - ((setq e (assoc var org-table-named-field-locations)) - (org-table-goto-field var) - (org-table-highlight-rectangle) - (message "Named field, column %d of line %d" (nth 2 e) (nth 1 e))) - ((setq e (assoc var org-table-column-names)) - (org-table-goto-column (string-to-number (cdr e))) - (org-table-highlight-rectangle) - (goto-char table-start) - (if (re-search-forward (concat "^[ \t]*| *! *.*?| *\\(" var "\\) *|") - (org-table-end) t) - (progn - (goto-char (match-beginning 1)) - (org-table-highlight-rectangle) - (message "Named column (column %s)" (cdr e))) - (user-error "Column name not found"))) - ((eq what 'column) - ;; Column number. - (org-table-goto-column (string-to-number (substring match 1))) - (org-table-highlight-rectangle) - (message "Column %s" (substring match 1))) - ((setq e (assoc var org-table-local-parameters)) - (goto-char table-start) - (if (re-search-forward (concat "^[ \t]*| *\\$ *.*?| *\\(" var "=\\)") nil t) - (progn - (goto-char (match-beginning 1)) - (org-table-highlight-rectangle) - (message "Local parameter.")) - (user-error "Parameter not found"))) - ((not var) (user-error "No reference at point")) - ((setq e (assoc var org-table-formula-constants-local)) - (message "Local Constant: $%s=%s in #+CONSTANTS line." - var (cdr e))) - ((setq e (assoc var org-table-formula-constants)) - (message "Constant: $%s=%s in `org-table-formula-constants'." - var (cdr e))) - ((setq e (and (fboundp 'constants-get) (constants-get var))) - (message "Constant: $%s=%s, from `constants.el'%s." - var e (format " (%s units)" constants-unit-system))) - (t (user-error "Undefined name $%s" var))) - (goto-char pos) - (when (and org-show-positions - (not (memq this-command '(org-table-fedit-scroll - org-table-fedit-scroll-down)))) - (push pos org-show-positions) - (push table-start org-show-positions) - (let ((min (apply 'min org-show-positions)) - (max (apply 'max org-show-positions))) - (set-window-start (selected-window) min) - (goto-char max) - (or (pos-visible-in-window-p max) - (set-window-start (selected-window) max))))) - (select-window win)))) +(defun org-table--read-column-selection (select max) + "Read column selection select as a list of numbers. + +SELECT is a string containing column ranges, separated by white +space characters, see `org-table-hide-column' for details. MAX +is the maximum column number. + +Return value is a sorted list of numbers. Ignore any number +outside of the [1;MAX] range." + (catch :all + (sort + (delete-dups + (cl-mapcan + (lambda (s) + (cond + ((member s '("-" "1-")) (throw :all (number-sequence 1 max))) + ((string-match-p "\\`[0-9]+\\'" s) + (let ((n (string-to-number s))) + (and (> n 0) (<= n max) (list n)))) + ((string-match "\\`\\([0-9]+\\)?-\\([0-9]+\\)?\\'" s) + (let ((n (match-string 1 s)) + (m (match-string 2 s))) + (number-sequence (if n (max 1 (string-to-number n)) + 1) + (if m (min max (string-to-number m)) + max)))) + (t nil))) ;invalid specification + (split-string select))) + #'<))) + +(defun org-table--shrink-columns (columns beg end) + "Shrink COLUMNS in a table. +COLUMNS is a sorted list of column numbers. BEG and END are, +respectively, the beginning position and the end position of the +table." + (org-with-wide-buffer + (org-font-lock-ensure beg end) + (dolist (c columns) + (goto-char beg) + (let ((align nil) + (width nil) + (fields nil)) + (while (< (point) end) + (catch :continue + (let* ((hline? (org-at-table-hline-p)) + (separator (if hline? "+" "|"))) + ;; Move to COLUMN. + (search-forward "|") + (or (= c 1) ;already there + (search-forward separator (line-end-position) t (1- c)) + (throw :continue nil)) ;skip invalid columns + ;; Extract boundaries and contents from current field. + ;; Also set the column's width if we encounter a width + ;; cookie for the first time. + (let* ((start (point)) + (end (progn + (skip-chars-forward (concat "^|" separator) + (line-end-position)) + (point))) + (contents (if hline? 'hline + (org-trim (buffer-substring start end))))) + (push (list start end contents) fields) + (when (and (not hline?) + (string-match "\\`<\\([lrc]\\)?\\([0-9]+\\)>\\'" + contents)) + (unless align (setq align (match-string 1 contents))) + (unless width + (setq width (string-to-number (match-string 2 contents)))))))) + (forward-line)) + ;; Link overlays for current field to the other overlays in the + ;; same column. + (let ((chain (list 'siblings))) + (dolist (field fields) + (dolist (new (apply #'org-table--shrink-field + (or width 0) (or align "l") field)) + (push new (cdr chain)) + (overlay-put new 'org-table-column-overlays chain)))))))) + +;;;###autoload +(defun org-table-toggle-column-width (&optional arg) + "Shrink or expand current column in an Org table. + +If a width cookie specifies a width W for the column, the first +W visible characters are displayed. Otherwise, the column is +shrunk to a single character. + +When point is before the first column or after the last one, ask +for the columns to shrink or expand, as a list of ranges. +A column range can be one of the following patterns: + + N column N only + N-M every column between N and M (both inclusive) + N- every column between N (inclusive) and the last column + -M every column between the first one and M (inclusive) + - every column + +When optional argument ARG is a string, use it as white space +separated list of column ranges. + +When called with `\\[universal-argument]' prefix, call \ +`org-table-shrink', i.e., +shrink columns with a width cookie and expand the others. + +When called with `\\[universal-argument] \\[universal-argument]' \ +prefix, expand all columns." + (interactive "P") + (unless (org-at-table-p) (user-error "Not in a table")) + (let* ((begin (org-table-begin)) + (end (org-table-end)) + ;; Compute an upper bound for the number of columns. + ;; Nonexistent columns are ignored anyway. + (max-columns (/ (- (line-end-position) (line-beginning-position)) 2)) + (shrunk (org-table--list-shrunk-columns)) + (columns + (pcase arg + (`nil + (if (save-excursion + (skip-chars-backward "^|" (line-beginning-position)) + (or (bolp) (looking-at-p "[ \t]*$"))) + ;; Point is either before first column or past last + ;; one. Ask for columns to operate on. + (org-table--read-column-selection + (read-string "Column ranges (e.g. 2-4 6-): ") + max-columns) + (list (org-table-current-column)))) + ((pred stringp) (org-table--read-column-selection arg max-columns)) + ((or `(4) `(16)) nil) + (_ (user-error "Invalid argument: %S" arg))))) + (pcase arg + (`(4) (org-table-shrink begin end)) + (`(16) (org-table-expand begin end)) + (_ + (org-table-expand begin end) + (org-table--shrink-columns + (cl-set-exclusive-or columns shrunk) begin end))))) + +;;;###autoload +(defun org-table-shrink (&optional begin end) + "Shrink all columns with a width cookie in the table at point. + +Columns without a width cookie are expanded. + +Optional arguments BEGIN and END, when non-nil, specify the +beginning and end position of the current table." + (interactive) + (unless (or begin (org-at-table-p)) (user-error "Not at a table")) + (org-with-wide-buffer + (let ((begin (or begin (org-table-begin))) + (end (or end (org-table-end))) + (regexp "|[ \t]*<[lrc]?[0-9]+>[ \t]*\\(|\\|$\\)") + (columns)) + (goto-char begin) + (while (re-search-forward regexp end t) + (goto-char (match-beginning 1)) + (cl-pushnew (org-table-current-column) columns)) + (org-table-expand begin end) + ;; Make sure invisible characters in the table are at the right + ;; place since column widths take them into account. + (org-font-lock-ensure begin end) + (org-table--shrink-columns (sort columns #'<) begin end)))) + +;;;###autoload +(defun org-table-expand (&optional begin end) + "Expand all columns in the table at point. +Optional arguments BEGIN and END, when non-nil, specify the +beginning and end position of the current table." + (interactive) + (unless (or begin (org-at-table-p)) (user-error "Not at a table")) + (org-with-wide-buffer + (let ((begin (or begin (org-table-begin))) + (end (or end (org-table-end)))) + (remove-overlays begin end 'org-overlay-type 'table-column-hide)))) + + +;;; Generic Tools + +;;;###autoload +(defun org-table-map-tables (f &optional quietly) + "Apply function F to the start of all tables in the buffer." + (org-with-point-at 1 + (while (re-search-forward org-table-line-regexp nil t) + (let ((table (org-element-lineage (org-element-at-point) '(table) t))) + (when table + (unless quietly + (message "Mapping tables: %d%%" + (floor (* 100.0 (point)) (buffer-size)))) + (goto-char (org-element-property :post-affiliated table)) + (let ((end (copy-marker (org-element-property :end table)))) + (unwind-protect + (progn (funcall f) (goto-char end)) + (set-marker end nil))))))) + (unless quietly (message "Mapping tables: done"))) + +;;;###autoload +(defun org-table-export (&optional file format) + "Export table to a file, with configurable format. +Such a file can be imported into usual spreadsheet programs. + +FILE can be the output file name. If not given, it will be taken +from a TABLE_EXPORT_FILE property in the current entry or higher +up in the hierarchy, or the user will be prompted for a file +name. FORMAT can be an export format, of the same kind as it +used when `-mode' sends a table in a different format. + +The command suggests a format depending on TABLE_EXPORT_FORMAT, +whether it is set locally or up in the hierarchy, then on the +extension of the given file name, and finally on the variable +`org-table-export-default-format'." + (interactive) + (unless (org-at-table-p) (user-error "No table at point")) + (org-table-align) ; Make sure we have everything we need. + (let ((file (or file (org-entry-get (point) "TABLE_EXPORT_FILE" t)))) + (unless file + (setq file (read-file-name "Export table to: ")) + (unless (or (not (file-exists-p file)) + (y-or-n-p (format "Overwrite file %s? " file))) + (user-error "File not written"))) + (when (file-directory-p file) + (user-error "This is a directory path, not a file")) + (when (and (buffer-file-name (buffer-base-buffer)) + (file-equal-p + (file-truename file) + (file-truename (buffer-file-name (buffer-base-buffer))))) + (user-error "Please specify a file name that is different from current")) + (let ((fileext (concat (file-name-extension file) "$")) + (format (or format (org-entry-get (point) "TABLE_EXPORT_FORMAT" t)))) + (unless format + (let* ((formats '("orgtbl-to-tsv" "orgtbl-to-csv" "orgtbl-to-latex" + "orgtbl-to-html" "orgtbl-to-generic" + "orgtbl-to-texinfo" "orgtbl-to-orgtbl" + "orgtbl-to-unicode")) + (deffmt-readable + (replace-regexp-in-string + "\t" "\\t" + (replace-regexp-in-string + "\n" "\\n" + (or (car (delq nil + (mapcar + (lambda (f) + (and (string-match-p fileext f) f)) + formats))) + org-table-export-default-format) + t t) t t))) + (setq format + (org-completing-read + "Format: " formats nil nil deffmt-readable)))) + (if (string-match "\\([^ \t\r\n]+\\)\\( +.*\\)?" format) + (let ((transform (intern (match-string 1 format))) + (params (and (match-end 2) + (read (concat "(" (match-string 2 format) ")")))) + (table (org-table-to-lisp + (buffer-substring-no-properties + (org-table-begin) (org-table-end))))) + (unless (fboundp transform) + (user-error "No such transformation function %s" transform)) + (let (buf) + (with-current-buffer (find-file-noselect file) + (setq buf (current-buffer)) + (erase-buffer) + (fundamental-mode) + (insert (funcall transform table params) "\n") + (save-buffer)) + (kill-buffer buf)) + (message "Export done.")) + (user-error "TABLE_EXPORT_FORMAT invalid"))))) + +;;;###autoload +(defun org-table--align-field (field width align) + "Format FIELD according to column WIDTH and alignment ALIGN. +FIELD is a string. WIDTH is a number. ALIGN is either \"c\", +\"l\" or\"r\"." + (let* ((spaces (- width (org-string-width field))) + (prefix (pcase align + ("l" "") + ("r" (make-string spaces ?\s)) + ("c" (make-string (/ spaces 2) ?\s)))) + (suffix (make-string (- spaces (length prefix)) ?\s))) + (concat org-table-separator-space + prefix + field + suffix + org-table-separator-space))) + +(defun org-table-align () + "Align the table at point by aligning all vertical bars." + (interactive) + (let ((beg (org-table-begin)) + (end (copy-marker (org-table-end)))) + (org-table-save-field + ;; Make sure invisible characters in the table are at the right + ;; place since column widths take them into account. + (org-font-lock-ensure beg end) + (move-marker org-table-aligned-begin-marker beg) + (move-marker org-table-aligned-end-marker end) + (goto-char beg) + (org-table-with-shrunk-columns + (let* ((indent (progn (looking-at "[ \t]*") (match-string 0))) + ;; Table's rows as lists of fields. Rules are replaced + ;; by nil. Trailing spaces are removed. + (fields (mapcar + (lambda (l) + (and (not (string-match-p org-table-hline-regexp l)) + (org-split-string l "[ \t]*|[ \t]*"))) + (split-string (buffer-substring beg end) "\n" t))) + ;; Compute number of columns. If the table contains no + ;; field, create a default table and bail out. + (columns-number + (if fields (apply #'max (mapcar #'length fields)) + (kill-region beg end) + (org-table-create org-table-default-size) + (user-error "Empty table - created default table"))) + (widths nil) + (alignments nil)) + ;; Compute alignment and width for each column. + (dotimes (i columns-number) + (let* ((max-width 1) + (fixed-align? nil) + (numbers 0) + (non-empty 0)) + (dolist (row fields) + (let ((cell (or (nth i row) ""))) + (setq max-width (max max-width (org-string-width cell))) + (cond (fixed-align? nil) + ((equal cell "") nil) + ((string-match "\\`<\\([lrc]\\)[0-9]*>\\'" cell) + (setq fixed-align? (match-string 1 cell))) + (t + (cl-incf non-empty) + (when (string-match-p org-table-number-regexp cell) + (cl-incf numbers)))))) + (push max-width widths) + (push (cond + (fixed-align?) + ((>= numbers (* org-table-number-fraction non-empty)) "r") + (t "l")) + alignments))) + (setq widths (nreverse widths)) + (setq alignments (nreverse alignments)) + ;; Store alignment of this table, for later editing of single + ;; fields. + (setq org-table-last-alignment alignments) + (setq org-table-last-column-widths widths) + ;; Build new table rows. Only replace rows that actually + ;; changed. + (dolist (row fields) + (let ((previous (buffer-substring (point) (line-end-position))) + (new + (format "%s|%s|" + indent + (if (null row) ;horizontal rule + (mapconcat (lambda (w) (make-string (+ 2 w) ?-)) + widths + "+") + (let ((cells ;add missing fields + (append row + (make-list (- columns-number + (length row)) + "")))) + (mapconcat #'identity + (cl-mapcar #'org-table--align-field + cells + widths + alignments) + "|")))))) + (if (equal new previous) + (forward-line) + (insert new "\n") + (delete-region (point) (line-beginning-position 2))))) + (set-marker end nil) + (when org-table-overlay-coordinates (org-table-overlay-coordinates)) + (setq org-table-may-need-update nil)))))) + +;;;###autoload +(defun org-table-justify-field-maybe (&optional new) + "Justify the current field, text to left, number to right. +Optional argument NEW may specify text to replace the current field content." + (cond + ((and (not new) org-table-may-need-update)) ; Realignment will happen anyway + ((org-at-table-hline-p)) + ((and (not new) + (or (not (eq (marker-buffer org-table-aligned-begin-marker) + (current-buffer))) + (< (point) org-table-aligned-begin-marker) + (>= (point) org-table-aligned-end-marker))) + ;; This is not the same table, force a full re-align. + (setq org-table-may-need-update t)) + (t + ;; Realign the current field, based on previous full realign. + (let ((pos (point)) + (col (org-table-current-column))) + (when (> col 0) + (skip-chars-backward "^|") + (if (not (looking-at " *\\([^|\n]*?\\) *\\(|\\|$\\)")) + (setq org-table-may-need-update t) + (let* ((align (nth (1- col) org-table-last-alignment)) + (width (nth (1- col) org-table-last-column-widths)) + (cell (match-string 0)) + (field (match-string 1)) + (properly-closed? (/= (match-beginning 2) (match-end 2))) + (new-cell + (save-match-data + (cond (org-table-may-need-update + (format " %s |" (or new field))) + ((not properly-closed?) + (setq org-table-may-need-update t) + (format " %s |" (or new field))) + ((not new) + (concat (org-table--align-field field width align) + "|")) + ((<= (org-string-width new) width) + (concat (org-table--align-field new width align) + "|")) + (t + (setq org-table-may-need-update t) + (format " %s |" new)))))) + (unless (equal new-cell cell) + (let (org-table-may-need-update) + (replace-match new-cell t t))) + (goto-char pos)))))))) + +;;;###autoload +(defun org-table-sort-lines + (&optional with-case sorting-type getkey-func compare-func interactive?) + "Sort table lines according to the column at point. + +The position of point indicates the column to be used for +sorting, and the range of lines is the range between the nearest +horizontal separator lines, or the entire table of no such lines +exist. If point is before the first column, you will be prompted +for the sorting column. If there is an active region, the mark +specifies the first line and the sorting column, while point +should be in the last line to be included into the sorting. + +The command then prompts for the sorting type which can be +alphabetically, numerically, or by time (as given in a time stamp +in the field, or as a HH:MM value). Sorting in reverse order is +also possible. + +With prefix argument WITH-CASE, alphabetic sorting will be case-sensitive +if the locale allows for it. + +If SORTING-TYPE is specified when this function is called from a Lisp +program, no prompting will take place. SORTING-TYPE must be a character, +any of (?a ?A ?n ?N ?t ?T ?f ?F) where the capital letters indicate that +sorting should be done in reverse order. + +If the SORTING-TYPE is ?f or ?F, then GETKEY-FUNC specifies +a function to be called to extract the key. It must return a value +that is compatible with COMPARE-FUNC, the function used to compare +entries. + +A non-nil value for INTERACTIVE? is used to signal that this +function is being called interactively." + (interactive (list current-prefix-arg nil nil nil t)) + (when (org-region-active-p) (goto-char (region-beginning))) + ;; Point must be either within a field or before a data line. + (save-excursion + (skip-chars-backward " \t") + (when (bolp) (search-forward "|" (line-end-position) t)) + (org-table-check-inside-data-field)) + ;; Set appropriate case sensitivity and column used for sorting. + (let ((column (let ((c (org-table-current-column))) + (cond ((> c 0) c) + (interactive? + (read-number "Use column N for sorting: ")) + (t 1)))) + (sorting-type + (or sorting-type + (read-char-exclusive "Sort Table: [a]lphabetic, [n]umeric, \ +\[t]ime, [f]unc. A/N/T/F means reversed: "))) + (start (org-table-begin)) + (end (org-table-end))) + (save-restriction + ;; Narrow buffer to appropriate sorting area. + (if (org-region-active-p) + (progn (goto-char (region-beginning)) + (narrow-to-region + (point) + (save-excursion (goto-char (region-end)) + (line-beginning-position 2)))) + (narrow-to-region + (save-excursion + (if (re-search-backward org-table-hline-regexp start t) + (line-beginning-position 2) + start)) + (if (save-excursion (re-search-forward org-table-hline-regexp end t)) + (match-beginning 0) + end))) + ;; Determine arguments for `sort-subr'. Also record original + ;; position. `org-table-save-field' cannot help here since + ;; sorting is too much destructive. + (let* ((coordinates + (cons (count-lines (point-min) (line-beginning-position)) + (current-column))) + (extract-key-from-field + ;; Function to be called on the contents of the field + ;; used for sorting in the current row. + (cl-case sorting-type + ((?n ?N) #'string-to-number) + ((?a ?A) #'org-sort-remove-invisible) + ((?t ?T) + (lambda (f) + (cond ((string-match org-ts-regexp-both f) + (float-time + (org-time-string-to-time (match-string 0 f)))) + ((org-duration-p f) (org-duration-to-minutes f)) + ((string-match "\\<[0-9]+:[0-9]\\{2\\}\\>" f) + (org-duration-to-minutes (match-string 0 f))) + (t 0)))) + ((?f ?F) + (or getkey-func + (and interactive? + (org-read-function "Function for extracting keys: ")) + (error "Missing key extractor to sort rows"))) + (t (user-error "Invalid sorting type `%c'" sorting-type)))) + (predicate + (cl-case sorting-type + ((?n ?N ?t ?T) #'<) + ((?a ?A) (if with-case #'org-string-collate-lessp + (lambda (s1 s2) (org-string-collate-lessp s1 s2 nil t)))) + ((?f ?F) + (or compare-func + (and interactive? + (org-read-function + "Function for comparing keys (empty for default \ +`sort-subr' predicate): " + 'allow-empty)))))) + (shrunk-columns (remq column (org-table--list-shrunk-columns)))) + (goto-char (point-min)) + (sort-subr (memq sorting-type '(?A ?N ?T ?F)) + (lambda () + (forward-line) + (while (and (not (eobp)) + (not (looking-at org-table-dataline-regexp))) + (forward-line))) + #'end-of-line + (lambda () + (funcall extract-key-from-field + (org-trim (org-table-get-field column)))) + nil + predicate) + ;; Hide all columns but the one being sorted. + (org-table--shrink-columns shrunk-columns start end) + ;; Move back to initial field. + (forward-line (car coordinates)) + (move-to-column (cdr coordinates)))))) + +(defun org-table-transpose-table-at-point () + "Transpose Org table at point and eliminate hlines. +So a table like + +| 1 | 2 | 4 | 5 | +|---+---+---+---| +| a | b | c | d | +| e | f | g | h | + +will be transposed as + +| 1 | a | e | +| 2 | b | f | +| 4 | c | g | +| 5 | d | h | + +Note that horizontal lines disappear." + (interactive) + (let* ((table (delete 'hline (org-table-to-lisp))) + (dline_old (org-table-current-line)) + (col_old (org-table-current-column)) + (contents (mapcar (lambda (_) + (let ((tp table)) + (mapcar + (lambda (_) + (prog1 + (pop (car tp)) + (setq tp (cdr tp)))) + table))) + (car table)))) + (goto-char (org-table-begin)) + (re-search-forward "|") + (backward-char) + (delete-region (point) (org-table-end)) + (insert (mapconcat + (lambda(x) + (concat "| " (mapconcat 'identity x " | " ) " |\n" )) + contents "")) + (org-table-goto-line col_old) + (org-table-goto-column dline_old)) + (org-table-align)) + +;;;###autoload +(defun org-table-wrap-region (arg) + "Wrap several fields in a column like a paragraph. +This is useful if you'd like to spread the contents of a field over several +lines, in order to keep the table compact. + +If there is an active region, and both point and mark are in the same column, +the text in the column is wrapped to minimum width for the given number of +lines. Generally, this makes the table more compact. A prefix ARG may be +used to change the number of desired lines. For example, \ +`C-2 \\[org-table-wrap-region]' +formats the selected text to two lines. If the region was longer than two +lines, the remaining lines remain empty. A negative prefix argument reduces +the current number of lines by that amount. The wrapped text is pasted back +into the table. If you formatted it to more lines than it was before, fields +further down in the table get overwritten - so you might need to make space in +the table first. + +If there is no region, the current field is split at the cursor position and +the text fragment to the right of the cursor is prepended to the field one +line down. + +If there is no region, but you specify a prefix ARG, the current field gets +blank, and the content is appended to the field above." + (interactive "P") + (org-table-check-inside-data-field) + (if (org-region-active-p) + ;; There is a region: fill as a paragraph. + (let ((start (region-beginning))) + (org-table-cut-region (region-beginning) (region-end)) + (when (> (length (car org-table-clip)) 1) + (user-error "Region must be limited to single column")) + (let ((nlines (cond ((not arg) (length org-table-clip)) + ((< arg 1) (+ (length org-table-clip) arg)) + (t arg)))) + (setq org-table-clip + (mapcar #'list + (org-wrap (mapconcat #'car org-table-clip " ") + nil + nlines)))) + (goto-char start) + (org-table-paste-rectangle)) + ;; No region, split the current field at point. + (unless (org-get-alist-option org-M-RET-may-split-line 'table) + (skip-chars-forward "^\r\n|")) + (cond + (arg ; Combine with field above. + (let ((s (org-table-blank-field)) + (col (org-table-current-column))) + (forward-line -1) + (while (org-at-table-hline-p) (forward-line -1)) + (org-table-goto-column col) + (skip-chars-forward "^|") + (skip-chars-backward " ") + (insert " " (org-trim s)) + (org-table-align))) + ((looking-at "\\([^|]+\\)|") ; Split field. + (let ((s (match-string 1))) + (replace-match " |") + (goto-char (match-beginning 0)) + (org-table-next-row) + (insert (org-trim s) " ") + (org-table-align))) + (t (org-table-next-row))))) + +(defun org-table--number-for-summing (s) + (let (n) + (if (string-match "^ *|? *" s) + (setq s (replace-match "" nil nil s))) + (if (string-match " *|? *$" s) + (setq s (replace-match "" nil nil s))) + (setq n (string-to-number s)) + (cond + ((and (string-match "0" s) + (string-match "\\`[-+ \t0.edED]+\\'" s)) 0) + ((string-match "\\`[ \t]+\\'" s) nil) + ((string-match "\\`\\([0-9]+\\):\\([0-9]+\\)\\(:\\([0-9]+\\)\\)?\\'" s) + (let ((h (string-to-number (or (match-string 1 s) "0"))) + (m (string-to-number (or (match-string 2 s) "0"))) + (s (string-to-number (or (match-string 4 s) "0")))) + (if (boundp 'org-timecnt) (setq org-timecnt (1+ org-timecnt))) + (* 1.0 (+ h (/ m 60.0) (/ s 3600.0))))) + ((equal n 0) nil) + (t n)))) + +;;;###autoload +(defun org-table-sum (&optional beg end nlast) + "Sum numbers in region of current table column. +The result will be displayed in the echo area, and will be available +as kill to be inserted with \\[yank]. + +If there is an active region, it is interpreted as a rectangle and all +numbers in that rectangle will be summed. If there is no active +region and point is located in a table column, sum all numbers in that +column. + +If at least one number looks like a time HH:MM or HH:MM:SS, all other +numbers are assumed to be times as well (in decimal hours) and the +numbers are added as such. + +If NLAST is a number, only the NLAST fields will actually be summed." + (interactive) + (save-excursion + (let (col (org-timecnt 0) diff h m s org-table-clip) + (cond + ((and beg end)) ; beg and end given explicitly + ((org-region-active-p) + (setq beg (region-beginning) end (region-end))) + (t + (setq col (org-table-current-column)) + (goto-char (org-table-begin)) + (unless (re-search-forward "^[ \t]*|[^-]" nil t) + (user-error "No table data")) + (org-table-goto-column col) + (setq beg (point)) + (goto-char (org-table-end)) + (unless (re-search-backward "^[ \t]*|[^-]" nil t) + (user-error "No table data")) + (org-table-goto-column col) + (setq end (point)))) + (let* ((items (apply 'append (org-table-copy-region beg end))) + (items1 (cond ((not nlast) items) + ((>= nlast (length items)) items) + (t (setq items (reverse items)) + (setcdr (nthcdr (1- nlast) items) nil) + (nreverse items)))) + (numbers (delq nil (mapcar #'org-table--number-for-summing + items1))) + (res (apply '+ numbers)) + (sres (if (= org-timecnt 0) + (number-to-string res) + (setq diff (* 3600 res) + h (floor diff 3600) diff (mod diff 3600) + m (floor diff 60) diff (mod diff 60) + s diff) + (format "%.0f:%02.0f:%02.0f" h m s)))) + (kill-new sres) + (when (called-interactively-p 'interactive) + (message (substitute-command-keys + (format "Sum of %d items: %-20s \ +\(\\[yank] will insert result into buffer)" + (length numbers) + sres)))) + sres)))) + +;;;###autoload +(defun org-table-analyze () + "Analyze table at point and store results. + +This function sets up the following dynamically scoped variables: + + `org-table-column-name-regexp', + `org-table-column-names', + `org-table-current-begin-pos', + `org-table-current-line-types', + `org-table-current-ncol', + `org-table-dlines', + `org-table-hlines', + `org-table-local-parameters', + `org-table-named-field-locations'." + (let ((beg (org-table-begin)) + (end (org-table-end))) + (save-excursion + (goto-char beg) + ;; Extract column names. + (setq org-table-column-names nil) + (when (save-excursion + (re-search-forward "^[ \t]*| *! *\\(|.*\\)" end t)) + (let ((c 1)) + (dolist (name (org-split-string (match-string 1) " *| *")) + (cl-incf c) + (when (string-match "\\`[a-zA-Z][_a-zA-Z0-9]*\\'" name) + (push (cons name (int-to-string c)) org-table-column-names))))) + (setq org-table-column-names (nreverse org-table-column-names)) + (setq org-table-column-name-regexp + (format "\\$\\(%s\\)\\>" + (regexp-opt (mapcar #'car org-table-column-names) t))) + ;; Extract local parameters. + (setq org-table-local-parameters nil) + (save-excursion + (while (re-search-forward "^[ \t]*| *\\$ *\\(|.*\\)" end t) + (dolist (field (org-split-string (match-string 1) " *| *")) + (when (string-match + "\\`\\([a-zA-Z][_a-zA-Z0-9]*\\|%\\) *= *\\(.*\\)" field) + (push (cons (match-string 1 field) (match-string 2 field)) + org-table-local-parameters))))) + ;; Update named fields locations. We minimize `count-lines' + ;; processing by storing last known number of lines in LAST. + (setq org-table-named-field-locations nil) + (save-excursion + (let ((last (cons (point) 0))) + (while (re-search-forward "^[ \t]*| *\\([_^]\\) *\\(|.*\\)" end t) + (let ((c (match-string 1)) + (fields (org-split-string (match-string 2) " *| *"))) + (save-excursion + (forward-line (if (equal c "_") 1 -1)) + (let ((fields1 + (and (looking-at "^[ \t]*|[^|]*\\(|.*\\)") + (org-split-string (match-string 1) " *| *"))) + (line (cl-incf (cdr last) (count-lines (car last) (point)))) + (col 1)) + (setcar last (point)) ; Update last known position. + (while (and fields fields1) + (let ((field (pop fields)) + (v (pop fields1))) + (cl-incf col) + (when (and (stringp field) + (stringp v) + (string-match "\\`[a-zA-Z][_a-zA-Z0-9]*\\'" + field)) + (push (cons field v) org-table-local-parameters) + (push (list field line col) + org-table-named-field-locations)))))))))) + ;; Re-use existing markers when possible. + (if (markerp org-table-current-begin-pos) + (move-marker org-table-current-begin-pos (point)) + (setq org-table-current-begin-pos (point-marker))) + ;; Analyze the line types. + (let ((l 0) hlines dlines types) + (while (looking-at "[ \t]*|\\(-\\)?") + (push (if (match-end 1) 'hline 'dline) types) + (if (match-end 1) (push l hlines) (push l dlines)) + (forward-line) + (cl-incf l)) + (push 'hline types) ; Add an imaginary extra hline to the end. + (setq org-table-current-line-types (apply #'vector (nreverse types))) + (setq org-table-dlines (apply #'vector (cons nil (nreverse dlines)))) + (setq org-table-hlines (apply #'vector (cons nil (nreverse hlines))))) + ;; Get the number of columns from the first data line in table. + (goto-char beg) + (forward-line (aref org-table-dlines 1)) + (let* ((fields + (org-split-string + (buffer-substring (line-beginning-position) (line-end-position)) + "[ \t]*|[ \t]*")) + (nfields (length fields)) + al al2) + (setq org-table-current-ncol nfields) + (let ((last-dline + (aref org-table-dlines (1- (length org-table-dlines))))) + (dotimes (i nfields) + (let ((column (1+ i))) + (push (list (format "LR%d" column) last-dline column) al) + (push (cons (format "LR%d" column) (nth i fields)) al2)))) + (setq org-table-named-field-locations + (append org-table-named-field-locations al)) + (setq org-table-local-parameters + (append org-table-local-parameters al2)))))) -(defun org-table-force-dataline () +(defun org-table--force-dataline () "Move point to the closest data line in a table. Raise an error if the table contains no data line. Preserve column when moving point." @@ -4556,144 +4853,139 @@ column when moving point." (t (user-error "No table data line around here"))) (org-move-to-column column)))) -(defun org-table-fedit-line-up () - "Move cursor one line up in the window showing the table." - (interactive) - (org-table-fedit-move 'previous-line)) - -(defun org-table-fedit-line-down () - "Move cursor one line down in the window showing the table." - (interactive) - (org-table-fedit-move 'next-line)) - -(defun org-table-fedit-move (command) - "Move the cursor in the window showing the table. -Use COMMAND to do the motion, repeat if necessary to end up in a data line." - (let ((org-table-allow-automatic-line-recalculation nil) - (pos org-pos) (win (selected-window)) p) - (select-window (get-buffer-window (marker-buffer org-pos))) - (setq p (point)) - (call-interactively command) - (while (and (org-at-table-p) - (org-at-table-hline-p)) - (call-interactively command)) - (or (org-at-table-p) (goto-char p)) - (move-marker pos (point)) - (select-window win))) - -(defun org-table-fedit-scroll (N) - (interactive "p") - (let ((other-window-scroll-buffer (marker-buffer org-pos))) - (scroll-other-window N))) - -(defun org-table-fedit-scroll-down (N) - (interactive "p") - (org-table-fedit-scroll (- N))) - -(defvar org-table-rectangle-overlays nil) - -(defun org-table-add-rectangle-overlay (beg end &optional face) - "Add a new overlay." - (let ((ov (make-overlay beg end))) - (overlay-put ov 'face (or face 'secondary-selection)) - (push ov org-table-rectangle-overlays))) - -(defun org-table-highlight-rectangle (&optional beg end face) - "Highlight rectangular region in a table. -When buffer positions BEG and END are provided, use them to -delimit the region to highlight. Otherwise, refer to point. Use -FACE, when non-nil, for the highlight." - (let* ((beg (or beg (point))) - (end (or end (point))) - (b (min beg end)) - (e (max beg end)) - (start-coordinates - (save-excursion - (goto-char b) - (cons (line-beginning-position) (org-table-current-column)))) - (end-coordinates - (save-excursion - (goto-char e) - (cons (line-beginning-position) (org-table-current-column))))) - (when (boundp 'org-show-positions) - (setq org-show-positions (cons b (cons e org-show-positions)))) - (goto-char (car start-coordinates)) - (let ((column-start (min (cdr start-coordinates) (cdr end-coordinates))) - (column-end (max (cdr start-coordinates) (cdr end-coordinates))) - (last-row (car end-coordinates))) - (while (<= (point) last-row) - (when (looking-at org-table-dataline-regexp) - (org-table-goto-column column-start) - (skip-chars-backward "^|\n") - (let ((p (point))) - (org-table-goto-column column-end) - (skip-chars-forward "^|\n") - (org-table-add-rectangle-overlay p (point) face))) - (forward-line))) - (goto-char (car start-coordinates))) - (add-hook 'before-change-functions #'org-table-remove-rectangle-highlight)) - -(defun org-table-remove-rectangle-highlight (&rest _ignore) - "Remove the rectangle overlays." - (unless org-inhibit-highlight-removal - (remove-hook 'before-change-functions 'org-table-remove-rectangle-highlight) - (mapc 'delete-overlay org-table-rectangle-overlays) - (setq org-table-rectangle-overlays nil))) - -(defvar-local org-table-coordinate-overlays nil - "Collects the coordinate grid overlays, so that they can be removed.") - -(defun org-table-overlay-coordinates () - "Add overlays to the table at point, to show row/column coordinates." - (interactive) - (mapc 'delete-overlay org-table-coordinate-overlays) - (setq org-table-coordinate-overlays nil) - (save-excursion - (let ((id 0) (ih 0) hline eol str ov) - (goto-char (org-table-begin)) - (while (org-at-table-p) - (setq eol (point-at-eol)) - (setq ov (make-overlay (point-at-bol) (1+ (point-at-bol)))) - (push ov org-table-coordinate-overlays) - (setq hline (looking-at org-table-hline-regexp)) - (setq str (if hline (format "I*%-2d" (setq ih (1+ ih))) - (format "%4d" (setq id (1+ id))))) - (org-overlay-before-string ov str 'org-special-keyword 'evaporate) - (when hline - (let ((ic 0)) - (while (re-search-forward "[+|]\\(-+\\)" eol t) - (cl-incf ic) - (let* ((beg (1+ (match-beginning 0))) - (s1 (format "$%d" ic)) - (s2 (org-number-to-letters ic)) - (str (if (eq t org-table-use-standard-references) s2 s1)) - (ov (make-overlay beg (+ beg (length str))))) - (push ov org-table-coordinate-overlays) - (org-overlay-display ov str 'org-special-keyword 'evaporate))))) - (forward-line))))) - -;;;###autoload -(defun org-table-toggle-coordinate-overlays () - "Toggle the display of Row/Column numbers in tables." - (interactive) - (setq org-table-overlay-coordinates (not org-table-overlay-coordinates)) - (message "Tables Row/Column numbers display turned %s" - (if org-table-overlay-coordinates "on" "off")) - (when (and (org-at-table-p) org-table-overlay-coordinates) - (org-table-align)) - (unless org-table-overlay-coordinates - (mapc 'delete-overlay org-table-coordinate-overlays) - (setq org-table-coordinate-overlays nil))) - -;;;###autoload -(defun org-table-toggle-formula-debugger () - "Toggle the formula debugger in tables." +(defun org-table-show-reference (&optional local) + "Show the location/value of the $ expression at point. +When LOCAL is non-nil, show references for the table at point." (interactive) - (setq org-table-formula-debug (not org-table-formula-debug)) - (message "Formula debugging has been turned %s" - (if org-table-formula-debug "on" "off"))) + (org-table-remove-rectangle-highlight) + (when local (org-table-analyze)) + (catch 'exit + (let ((pos (if local (point) org-pos)) + (face2 'highlight) + (org-inhibit-highlight-removal t) + (win (selected-window)) + (org-show-positions nil) + var name e what match dest) + (setq what (cond + ((org-in-regexp "^@[0-9]+[ \t=]") + (setq match (concat (substring (match-string 0) 0 -1) + "$1.." + (substring (match-string 0) 0 -1) + "$100")) + 'range) + ((or (org-in-regexp org-table-range-regexp2) + (org-in-regexp org-table-translate-regexp) + (org-in-regexp org-table-range-regexp)) + (setq match + (save-match-data + (org-table-convert-refs-to-rc (match-string 0)))) + 'range) + ((org-in-regexp "\\$[a-zA-Z][a-zA-Z0-9]*") 'name) + ((org-in-regexp "\\$[0-9]+") 'column) + ((not local) nil) + (t (user-error "No reference at point"))) + match (and what (or match (match-string 0)))) + (when (and match (not (equal (match-beginning 0) (point-at-bol)))) + (org-table-add-rectangle-overlay (match-beginning 0) (match-end 0) + 'secondary-selection)) + (add-hook 'before-change-functions + #'org-table-remove-rectangle-highlight) + (when (eq what 'name) (setq var (substring match 1))) + (when (eq what 'range) + (unless (eq (string-to-char match) ?@) (setq match (concat "@" match))) + (setq match (org-table-formula-substitute-names match))) + (unless local + (save-excursion + (end-of-line) + (re-search-backward "^\\S-" nil t) + (beginning-of-line) + (when (looking-at "\\(\\$[0-9a-zA-Z]+\\|@[0-9]+\\$[0-9]+\\|[a-zA-Z]+\ +\\([0-9]+\\|&\\)\\) *=") + (setq dest + (save-match-data + (org-table-convert-refs-to-rc (match-string 1)))) + (org-table-add-rectangle-overlay + (match-beginning 1) (match-end 1) face2)))) + (if (and (markerp pos) (marker-buffer pos)) + (if (get-buffer-window (marker-buffer pos)) + (select-window (get-buffer-window (marker-buffer pos))) + (org-switch-to-buffer-other-window (get-buffer-window + (marker-buffer pos))))) + (goto-char pos) + (org-table--force-dataline) + (let ((table-start + (if local org-table-current-begin-pos (org-table-begin)))) + (when dest + (setq name (substring dest 1)) + (cond + ((string-match-p "\\`\\$[a-zA-Z][a-zA-Z0-9]*" dest) + (org-table-goto-field dest)) + ((string-match-p "\\`@\\([1-9][0-9]*\\)\\$\\([1-9][0-9]*\\)\\'" + dest) + (org-table-goto-field dest)) + (t (org-table-goto-column (string-to-number name)))) + (move-marker pos (point)) + (org-table-highlight-rectangle nil nil face2)) + (cond + ((equal dest match)) + ((not match)) + ((eq what 'range) + (ignore-errors (org-table-get-range match table-start nil 'highlight))) + ((setq e (assoc var org-table-named-field-locations)) + (org-table-goto-field var) + (org-table-highlight-rectangle) + (message "Named field, column %d of line %d" (nth 2 e) (nth 1 e))) + ((setq e (assoc var org-table-column-names)) + (org-table-goto-column (string-to-number (cdr e))) + (org-table-highlight-rectangle) + (goto-char table-start) + (if (re-search-forward (concat "^[ \t]*| *! *.*?| *\\(" var "\\) *|") + (org-table-end) t) + (progn + (goto-char (match-beginning 1)) + (org-table-highlight-rectangle) + (message "Named column (column %s)" (cdr e))) + (user-error "Column name not found"))) + ((eq what 'column) + ;; Column number. + (org-table-goto-column (string-to-number (substring match 1))) + (org-table-highlight-rectangle) + (message "Column %s" (substring match 1))) + ((setq e (assoc var org-table-local-parameters)) + (goto-char table-start) + (if (re-search-forward (concat "^[ \t]*| *\\$ *.*?| *\\(" var "=\\)") nil t) + (progn + (goto-char (match-beginning 1)) + (org-table-highlight-rectangle) + (message "Local parameter.")) + (user-error "Parameter not found"))) + ((not var) (user-error "No reference at point")) + ((setq e (assoc var org-table-formula-constants-local)) + (message "Local Constant: $%s=%s in #+CONSTANTS line." + var (cdr e))) + ((setq e (assoc var org-table-formula-constants)) + (message "Constant: $%s=%s in `org-table-formula-constants'." + var (cdr e))) + ((setq e (and (fboundp 'constants-get) (constants-get var))) + (message "Constant: $%s=%s, from `constants.el'%s." + var e (format " (%s units)" constants-unit-system))) + (t (user-error "Undefined name $%s" var))) + (goto-char pos) + (when (and org-show-positions + (not (memq this-command '(org-table-fedit-scroll + org-table-fedit-scroll-down)))) + (push pos org-show-positions) + (push table-start org-show-positions) + (let ((min (apply 'min org-show-positions)) + (max (apply 'max org-show-positions))) + (set-window-start (selected-window) min) + (goto-char max) + (or (pos-visible-in-window-p max) + (set-window-start (selected-window) max))))) + (select-window win)))) -;;; The orgtbl minor mode + +;;; The Orgtbl minor mode ;; Define a minor mode which can be used in other modes in order to ;; integrate the Org table editor. @@ -4722,7 +5014,6 @@ FACE, when non-nil, for the highlight." ;; active, this binding is ignored inside tables and replaced with a ;; modified self-insert. - (defvar orgtbl-mode-map (make-keymap) "Keymap for `orgtbl-mode'.") @@ -4738,10 +5029,78 @@ FACE, when non-nil, for the highlight." 0 (quote 'org-table) 'prepend)) "Extra `font-lock-keywords' to be added when `orgtbl-mode' is active.") +;;;###autoload +(defun turn-on-orgtbl () + "Unconditionally turn on `orgtbl-mode'." + (require 'org-table) + (orgtbl-mode 1)) + ;; Install it as a minor mode. (put 'orgtbl-mode :included t) (put 'orgtbl-mode :menu-tag "Org Table Mode") +(easy-menu-define orgtbl-mode-menu orgtbl-mode-map "OrgTbl menu" + '("OrgTbl" + ["Create or convert" org-table-create-or-convert-from-region + :active (not (org-at-table-p)) :keys "C-c |" ] + "--" + ["Align" org-ctrl-c-ctrl-c :active (org-at-table-p) :keys "C-c C-c"] + ["Next Field" org-cycle :active (org-at-table-p) :keys "TAB"] + ["Previous Field" org-shifttab :active (org-at-table-p) :keys "S-TAB"] + ["Next Row" org-return :active (org-at-table-p) :keys "RET"] + "--" + ["Blank Field" org-table-blank-field :active (org-at-table-p) :keys "C-c SPC"] + ["Edit Field" org-table-edit-field :active (org-at-table-p) :keys "C-c ` "] + ["Copy Field from Above" + org-table-copy-down :active (org-at-table-p) :keys "S-RET"] + "--" + ("Column" + ["Move Column Left" org-metaleft :active (org-at-table-p) :keys "M-"] + ["Move Column Right" org-metaright :active (org-at-table-p) :keys "M-"] + ["Delete Column" org-shiftmetaleft :active (org-at-table-p) :keys "M-S-"] + ["Insert Column" org-shiftmetaright :active (org-at-table-p) :keys "M-S-"]) + ("Row" + ["Move Row Up" org-metaup :active (org-at-table-p) :keys "M-"] + ["Move Row Down" org-metadown :active (org-at-table-p) :keys "M-"] + ["Delete Row" org-shiftmetaup :active (org-at-table-p) :keys "M-S-"] + ["Insert Row" org-shiftmetadown :active (org-at-table-p) :keys "M-S-"] + ["Sort lines in region" org-table-sort-lines :active (org-at-table-p) :keys "C-c ^"] + "--" + ["Insert Hline" org-table-insert-hline :active (org-at-table-p) :keys "C-c -"]) + ("Rectangle" + ["Copy Rectangle" org-copy-special :active (org-at-table-p)] + ["Cut Rectangle" org-cut-special :active (org-at-table-p)] + ["Paste Rectangle" org-paste-special :active (org-at-table-p)] + ["Fill Rectangle" org-table-wrap-region :active (org-at-table-p)]) + "--" + ("Radio tables" + ["Insert table template" orgtbl-insert-radio-table + (cl-assoc-if #'derived-mode-p orgtbl-radio-table-templates)] + ["Comment/uncomment table" orgtbl-toggle-comment t]) + "--" + ["Set Column Formula" org-table-eval-formula :active (org-at-table-p) :keys "C-c ="] + ["Set Field Formula" (org-table-eval-formula '(4)) :active (org-at-table-p) :keys "C-u C-c ="] + ["Edit Formulas" org-table-edit-formulas :active (org-at-table-p) :keys "C-c '"] + ["Recalculate line" org-table-recalculate :active (org-at-table-p) :keys "C-c *"] + ["Recalculate all" (org-table-recalculate '(4)) :active (org-at-table-p) :keys "C-u C-c *"] + ["Iterate all" (org-table-recalculate '(16)) :active (org-at-table-p) :keys "C-u C-u C-c *"] + ["Toggle Recalculate Mark" org-table-rotate-recalc-marks :active (org-at-table-p) :keys "C-c #"] + ["Sum Column/Rectangle" org-table-sum + :active (or (org-at-table-p) (org-region-active-p)) :keys "C-c +"] + ["Which Column?" org-table-current-column :active (org-at-table-p) :keys "C-c ?"] + ["Debug Formulas" + org-table-toggle-formula-debugger :active (org-at-table-p) + :keys "C-c {" + :style toggle :selected org-table-formula-debug] + ["Show Col/Row Numbers" + org-table-toggle-coordinate-overlays :active (org-at-table-p) + :keys "C-c }" + :style toggle :selected org-table-overlay-coordinates] + "--" + ("Plot" + ["Ascii plot" orgtbl-ascii-plot :active (org-at-table-p) :keys "C-c \" a"] + ["Gnuplot" org-plot/gnuplot :active (org-at-table-p) :keys "C-c \" g"]))) + ;;;###autoload (define-minor-mode orgtbl-mode "The Org mode table editor as a minor mode for use in other modes." @@ -4896,67 +5255,6 @@ to execute outside of tables." 'delete-char 'org-delete-char 'delete-backward-char 'org-delete-backward-char) (org-defkey orgtbl-mode-map "|" 'org-force-self-insert)) - (easy-menu-define orgtbl-mode-menu orgtbl-mode-map "OrgTbl menu" - '("OrgTbl" - ["Create or convert" org-table-create-or-convert-from-region - :active (not (org-at-table-p)) :keys "C-c |" ] - "--" - ["Align" org-ctrl-c-ctrl-c :active (org-at-table-p) :keys "C-c C-c"] - ["Next Field" org-cycle :active (org-at-table-p) :keys "TAB"] - ["Previous Field" org-shifttab :active (org-at-table-p) :keys "S-TAB"] - ["Next Row" org-return :active (org-at-table-p) :keys "RET"] - "--" - ["Blank Field" org-table-blank-field :active (org-at-table-p) :keys "C-c SPC"] - ["Edit Field" org-table-edit-field :active (org-at-table-p) :keys "C-c ` "] - ["Copy Field from Above" - org-table-copy-down :active (org-at-table-p) :keys "S-RET"] - "--" - ("Column" - ["Move Column Left" org-metaleft :active (org-at-table-p) :keys "M-"] - ["Move Column Right" org-metaright :active (org-at-table-p) :keys "M-"] - ["Delete Column" org-shiftmetaleft :active (org-at-table-p) :keys "M-S-"] - ["Insert Column" org-shiftmetaright :active (org-at-table-p) :keys "M-S-"]) - ("Row" - ["Move Row Up" org-metaup :active (org-at-table-p) :keys "M-"] - ["Move Row Down" org-metadown :active (org-at-table-p) :keys "M-"] - ["Delete Row" org-shiftmetaup :active (org-at-table-p) :keys "M-S-"] - ["Insert Row" org-shiftmetadown :active (org-at-table-p) :keys "M-S-"] - ["Sort lines in region" org-table-sort-lines :active (org-at-table-p) :keys "C-c ^"] - "--" - ["Insert Hline" org-table-insert-hline :active (org-at-table-p) :keys "C-c -"]) - ("Rectangle" - ["Copy Rectangle" org-copy-special :active (org-at-table-p)] - ["Cut Rectangle" org-cut-special :active (org-at-table-p)] - ["Paste Rectangle" org-paste-special :active (org-at-table-p)] - ["Fill Rectangle" org-table-wrap-region :active (org-at-table-p)]) - "--" - ("Radio tables" - ["Insert table template" orgtbl-insert-radio-table - (cl-assoc-if #'derived-mode-p orgtbl-radio-table-templates)] - ["Comment/uncomment table" orgtbl-toggle-comment t]) - "--" - ["Set Column Formula" org-table-eval-formula :active (org-at-table-p) :keys "C-c ="] - ["Set Field Formula" (org-table-eval-formula '(4)) :active (org-at-table-p) :keys "C-u C-c ="] - ["Edit Formulas" org-table-edit-formulas :active (org-at-table-p) :keys "C-c '"] - ["Recalculate line" org-table-recalculate :active (org-at-table-p) :keys "C-c *"] - ["Recalculate all" (org-table-recalculate '(4)) :active (org-at-table-p) :keys "C-u C-c *"] - ["Iterate all" (org-table-recalculate '(16)) :active (org-at-table-p) :keys "C-u C-u C-c *"] - ["Toggle Recalculate Mark" org-table-rotate-recalc-marks :active (org-at-table-p) :keys "C-c #"] - ["Sum Column/Rectangle" org-table-sum - :active (or (org-at-table-p) (org-region-active-p)) :keys "C-c +"] - ["Which Column?" org-table-current-column :active (org-at-table-p) :keys "C-c ?"] - ["Debug Formulas" - org-table-toggle-formula-debugger :active (org-at-table-p) - :keys "C-c {" - :style toggle :selected org-table-formula-debug] - ["Show Col/Row Numbers" - org-table-toggle-coordinate-overlays :active (org-at-table-p) - :keys "C-c }" - :style toggle :selected org-table-overlay-coordinates] - "--" - ("Plot" - ["Ascii plot" orgtbl-ascii-plot :active (org-at-table-p) :keys "C-c \" a"] - ["Gnuplot" org-plot/gnuplot :active (org-at-table-p) :keys "C-c \" g"]))) t)) (defun orgtbl-ctrl-c-ctrl-c (arg) diff --git a/elpa/org-20191028/org-tempo.el b/elpa/org-20200127/org-tempo.el similarity index 99% rename from elpa/org-20191028/org-tempo.el rename to elpa/org-20200127/org-tempo.el index 78424b28..9ae27005 100644 --- a/elpa/org-20191028/org-tempo.el +++ b/elpa/org-20200127/org-tempo.el @@ -1,6 +1,6 @@ ;;; org-tempo.el --- Template expansion for Org structures -*- lexical-binding: t; -*- -;; Copyright (C) 2017-2019 Free Software Foundation, Inc. +;; Copyright (C) 2017-2020 Free Software Foundation, Inc. ;; ;; Author: Rasmus Pank Roulund ;; Keywords: outlines, hypermedia, calendar, wp diff --git a/elpa/org-20191028/org-timer.el b/elpa/org-20200127/org-timer.el similarity index 98% rename from elpa/org-20191028/org-timer.el rename to elpa/org-20200127/org-timer.el index d8319363..a1eb5e4a 100644 --- a/elpa/org-20191028/org-timer.el +++ b/elpa/org-20200127/org-timer.el @@ -1,6 +1,6 @@ ;;; org-timer.el --- Timer code for Org mode -*- lexical-binding: t; -*- -;; Copyright (C) 2008-2019 Free Software Foundation, Inc. +;; Copyright (C) 2008-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Keywords: outlines, hypermedia, calendar, wp @@ -419,7 +419,9 @@ using three `C-u' prefix arguments." (if (numberp org-timer-default-timer) (number-to-string org-timer-default-timer) org-timer-default-timer)) - (effort-minutes (ignore-errors (floor (org-get-at-eol 'effort-minutes 1)))) + (effort-minutes (let ((effort (org-entry-get nil org-effort-property))) + (when (org-string-nw-p effort) + (floor (org-duration-to-minutes effort))))) (minutes (or (and (numberp opt) (number-to-string opt)) (and (not (equal opt '(64))) effort-minutes @@ -464,7 +466,8 @@ time is up." (run-hooks 'org-timer-done-hook))))) (defun org-timer--get-timer-title () - "Construct timer title from heading or file name of Org buffer." + "Construct timer title. +Try to use an Org header, otherwise use the buffer name." (cond ((derived-mode-p 'org-agenda-mode) (let* ((marker (or (get-text-property (point) 'org-marker) @@ -480,7 +483,7 @@ time is up." ((derived-mode-p 'org-mode) (or (ignore-errors (org-get-heading)) (buffer-name (buffer-base-buffer)))) - (t (error "Not in an Org buffer")))) + (t (buffer-name (buffer-base-buffer))))) (provide 'org-timer) diff --git a/elpa/org-20191028/org-version.el b/elpa/org-20200127/org-version.el similarity index 73% rename from elpa/org-20191028/org-version.el rename to elpa/org-20200127/org-version.el index 2b12ec9e..1d487a7a 100644 --- a/elpa/org-20191028/org-version.el +++ b/elpa/org-20200127/org-version.el @@ -5,17 +5,14 @@ (defun org-release () "The release version of Org. Inserted by installing Org mode or when a release is made." - (let ((org-release "9.2.6")) + (let ((org-release "9.3.2")) org-release)) ;;;###autoload (defun org-git-version () "The Git version of Org mode. Inserted by installing Org or when a release is made." - (let ((org-git-version "9.2.6-5-g9c611f-elpa")) + (let ((org-git-version "9.3.2-8-g47b104-elpa")) org-git-version)) -;;;###autoload -(defvar org-odt-data-dir "/usr/share/emacs/etc/org" - "The location of ODT styles.") (provide 'org-version) diff --git a/elpa/org-20191028/org.el b/elpa/org-20200127/org.el similarity index 85% rename from elpa/org-20191028/org.el rename to elpa/org-20200127/org.el index 2cea47d0..88907b75 100644 --- a/elpa/org-20191028/org.el +++ b/elpa/org-20200127/org.el @@ -1,12 +1,13 @@ ;;; org.el --- Outline-based notes management and organizer -*- lexical-binding: t; -*- ;; Carstens outline-mode for keeping track of everything. -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; ;; Author: Carsten Dominik +;; Maintainer: Bastien Guerry ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: https://orgmode.org -;; Version: 9.2.6 +;; Version: 9.3.2 ;; ;; This file is part of GNU Emacs. ;; @@ -64,8 +65,6 @@ ;;; Code: (defvar org-inhibit-highlight-removal nil) ; dynamically scoped param -(defvar-local org-table-formula-constants-local nil - "Local version of `org-table-formula-constants'.") (defvar org-inlinetask-min-level) ;;;; Require other packages @@ -91,6 +90,9 @@ (eval-and-compile (require 'org-macs)) (require 'org-compat) +(require 'org-keys) +(require 'ol) +(require 'org-table) ;; `org-outline-regexp' ought to be a defconst but is let-bound in ;; some places -- e.g. see the macro `org-with-limited-levels'. @@ -159,71 +161,35 @@ Stars are put in group 1 and the trimmed body in group 2.") (declare-function org-element-swap-A-B "org-element" (elem-a elem-b)) (declare-function org-element-timestamp-parser "org-element" ()) (declare-function org-element-type "org-element" (element)) -(declare-function org-element-update-syntax "org-element" ()) (declare-function org-export-dispatch "ox" (&optional arg)) (declare-function org-export-get-backend "ox" (name)) -(declare-function org-export-get-backend "ox" (name)) -(declare-function org-export-get-environment "ox" (&optional backend subtreep ext-plist)) (declare-function org-export-get-environment "ox" (&optional backend subtreep ext-plist)) (declare-function org-feed-goto-inbox "org-feed" (feed)) (declare-function org-feed-update-all "org-feed" ()) (declare-function org-goto "org-goto" (&optional alternative-interface)) -(declare-function org-goto "org-goto" (&optional alternative-interface)) (declare-function org-id-find-id-file "org-id" (id)) (declare-function org-id-get-create "org-id" (&optional force)) (declare-function org-inlinetask-at-task-p "org-inlinetask" ()) (declare-function org-inlinetask-outline-regexp "org-inlinetask" ()) (declare-function org-inlinetask-toggle-visibility "org-inlinetask" ()) (declare-function org-latex-make-preamble "ox-latex" (info &optional template snippet?)) -(declare-function org-latex-make-preamble "ox-latex" (info &optional template snippet?)) (declare-function org-plot/gnuplot "org-plot" (&optional params)) -(declare-function org-table--shrunk-field "org-table" ()) ;; For `org-table-with-shrunk-field'. -(declare-function org-table-align "org-table" ()) -(declare-function org-table-begin "org-table" (&optional table-type)) -(declare-function org-table-beginning-of-field "org-table" (&optional n)) -(declare-function org-table-blank-field "org-table" ()) -(declare-function org-table-calc-current-TBLFM "org-table" (&optional arg)) -(declare-function org-table-copy-down "org-table" (N)) -(declare-function org-table-copy-region "org-table" (beg end &optional cut)) -(declare-function org-table-create-or-convert-from-region "org-table" (arg)) -(declare-function org-table-create-with-table.el "org-table" ()) -(declare-function org-table-cut-region "org-table" (beg end)) -(declare-function org-table-edit-field "org-table" (arg)) -(declare-function org-table-end "org-table" (&optional table-type)) -(declare-function org-table-end-of-field "org-table" (&optional n)) -(declare-function org-table-eval-formula "org-table" (&optional arg equation suppress-align suppress-const suppress-store suppress-analysis)) -(declare-function org-table-field-info "org-table" (arg)) -(declare-function org-table-insert-row "org-table" (&optional arg)) -(declare-function org-table-justify-field-maybe "org-table" (&optional new)) -(declare-function org-table-maybe-eval-formula "org-table" ()) -(declare-function org-table-maybe-recalculate-line "org-table" ()) -(declare-function org-table-next-row "org-table" ()) -(declare-function org-table-paste-rectangle "org-table" ()) -(declare-function org-table-recalculate "org-table" (&optional all noalign)) -(declare-function org-table-rotate-recalc-marks "org-table" (&optional newchar)) -(declare-function org-table-shrink "org-table" (&optional begin end)) -(declare-function org-table-sort-lines "org-table" (&optional with-case sorting-type getkey-func compare-func interactive?)) -(declare-function org-table-sum "org-table" (&optional beg end nlast)) -(declare-function org-table-toggle-column-width "org-table" (&optional arg)) -(declare-function org-table-toggle-coordinate-overlays "org-table" ()) -(declare-function org-table-toggle-formula-debugger "org-table" ()) -(declare-function org-table-wrap-region "org-table" (arg)) (declare-function org-tags-view "org-agenda" (&optional todo-only match)) (declare-function org-timer "org-timer" (&optional restart no-insert)) (declare-function org-timer-item "org-timer" (&optional arg)) (declare-function org-timer-pause-or-continue "org-timer" (&optional stop)) -(declare-function org-timer-pause-or-continue "org-timer" (&optional stop)) (declare-function org-timer-set-timer "org-timer" (&optional opt)) (declare-function org-timer-start "org-timer" (&optional offset)) (declare-function org-timer-stop "org-timer" ()) -(declare-function org-timer-stop "org-timer" ()) (declare-function org-toggle-archive-tag "org-archive" (&optional find-done)) -(declare-function orgtbl-ascii-plot "org-table" (&optional ask)) -(declare-function orgtbl-mode "org-table" (&optional arg)) +(declare-function org-update-radio-target-regexp "ol" ()) (defvar ffap-url-regexp) (defvar org-element-paragraph-separate) (defvar org-indent-indentation-per-level) +(defvar org-radio-target-regexp) +(defvar org-target-link-regexp) +(defvar org-target-regexp) ;; load languages based on value of `org-babel-load-languages' (defvar org-babel-load-languages) @@ -241,36 +207,27 @@ Stars are put in group 1 and the trimmed body in group 2.") (fmakunbound (intern (concat "org-babel-expand-body:" lang))))))) -(declare-function org-babel-tangle-file "ob-tangle" (file &optional target-file lang)) + ;;;###autoload (defun org-babel-load-file (file &optional compile) "Load Emacs Lisp source code blocks in the Org FILE. This function exports the source code using `org-babel-tangle' -and then loads the resulting file using `load-file'. With prefix -arg (noninteractively: 2nd arg) COMPILE the tangled Emacs Lisp -file to byte-code before it is loaded." +and then loads the resulting file using `load-file'. With +optional prefix argument COMPILE, the tangled Emacs Lisp file is +byte-compiled before it is loaded." (interactive "fFile to load: \nP") - (let* ((age (lambda (file) - (float-time - (time-since - (file-attribute-modification-time - (or (file-attributes (file-truename file)) - (file-attributes file))))))) - (base-name (file-name-sans-extension file)) - (exported-file (concat base-name ".el"))) - ;; tangle if the Org file is newer than the elisp file - (unless (and (file-exists-p exported-file) - (> (funcall age file) (funcall age exported-file))) - ;; Tangle-file traversal returns reversed list of tangled files - ;; and we want to evaluate the first target. - (setq exported-file - (car (last (org-babel-tangle-file file exported-file "emacs-lisp"))))) - (message "%s %s" - (if compile - (progn (byte-compile-file exported-file 'load) - "Compiled and loaded") - (progn (load-file exported-file) "Loaded")) - exported-file))) + (let* ((tangled-file (concat (file-name-sans-extension file) ".el"))) + ;; Tangle only if the Org file is newer than the Elisp file. + (unless (org-file-newer-than-p + tangled-file + (file-attribute-modification-time (file-attributes file))) + (org-babel-tangle-file file tangled-file "emacs-lisp")) + (if compile + (progn + (byte-compile-file tangled-file 'load) + (message "Compiled and loaded %s" tangled-file)) + (load-file tangled-file) + (message "Loaded %s" tangled-file)))) (defcustom org-babel-load-languages '((emacs-lisp . t)) "Languages which can be evaluated in Org buffers. @@ -606,30 +563,6 @@ An entry can be toggled between COMMENT and normal with "The property that is being used to keep track of effort estimates. Effort estimates given in this property need to have the format H:MM.") -;;;; Table - -(defconst org-table-any-line-regexp "^[ \t]*\\(|\\|\\+-[-+]\\)" - "Detect an org-type or table-type table.") - -(defconst org-table-line-regexp "^[ \t]*|" - "Detect an org-type table line.") - -(defconst org-table-dataline-regexp "^[ \t]*|[^-]" - "Detect an org-type table line.") - -(defconst org-table-hline-regexp "^[ \t]*|-" - "Detect an org-type table hline.") - -(defconst org-table1-hline-regexp "^[ \t]*\\+-[-+]" - "Detect a table-type table hline.") - -(defconst org-table-any-border-regexp "^[ \t]*[^|+ \t]" - "Detect the first line outside a table when searching from within it. -This works for both table types.") - -(defconst org-TBLFM-regexp "^[ \t]*#\\+TBLFM: " - "Detect a #+TBLFM line.") - ;;;; Timestamp (defconst org-ts-regexp "<\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} ?[^\r\n>]*?\\)>" @@ -727,7 +660,7 @@ After a match, group 1 contains the repeat expression.") (org-load-modules-maybe 'force) (org-element-cache-reset 'all))) -(defcustom org-modules '(org-w3m org-bbdb org-bibtex org-docview org-gnus org-info org-irc org-mhe org-rmail org-eww) +(defcustom org-modules '(ol-w3m ol-bbdb ol-bibtex ol-docview ol-gnus ol-info ol-irc ol-mhe ol-rmail ol-eww) "Modules that should always be loaded together with org.el. If a description starts with , the file is not part of Emacs @@ -748,60 +681,59 @@ For export specific modules, see also `org-export-backends'." :package-version '(Org . "9.2") :type '(set :greedy t - (const :tag " bbdb: Links to BBDB entries" org-bbdb) - (const :tag " bibtex: Links to BibTeX entries" org-bibtex) + (const :tag " bbdb: Links to BBDB entries" ol-bbdb) + (const :tag " bibtex: Links to BibTeX entries" ol-bibtex) (const :tag " crypt: Encryption of subtrees" org-crypt) (const :tag " ctags: Access to Emacs tags with links" org-ctags) - (const :tag " docview: Links to doc-view buffers" org-docview) - (const :tag " eww: Store link to url of eww" org-eww) - (const :tag " gnus: Links to GNUS folders/messages" org-gnus) + (const :tag " docview: Links to Docview buffers" ol-docview) + (const :tag " eww: Store link to URL of Eww" ol-eww) + (const :tag " gnus: Links to GNUS folders/messages" ol-gnus) (const :tag " habit: Track your consistency with habits" org-habit) (const :tag " id: Global IDs for identifying entries" org-id) - (const :tag " info: Links to Info nodes" org-info) + (const :tag " info: Links to Info nodes" ol-info) (const :tag " inlinetask: Tasks independent of outline hierarchy" org-inlinetask) - (const :tag " irc: Links to IRC/ERC chat sessions" org-irc) - (const :tag " mhe: Links to MHE folders/messages" org-mhe) + (const :tag " irc: Links to IRC/ERC chat sessions" ol-irc) + (const :tag " mhe: Links to MHE folders/messages" ol-mhe) (const :tag " mouse: Additional mouse support" org-mouse) (const :tag " protocol: Intercept calls from emacsclient" org-protocol) - (const :tag " rmail: Links to RMAIL folders/messages" org-rmail) + (const :tag " rmail: Links to RMAIL folders/messages" ol-rmail) (const :tag " tempo: Fast completion for structures" org-tempo) - (const :tag " w3m: Special cut/paste from w3m to Org mode." org-w3m) - (const :tag " eshell: Support for links to working directories in eshell" org-eshell) + (const :tag " w3m: Special cut/paste from w3m to Org mode." ol-w3m) + (const :tag " eshell: Links to working directories in Eshell" ol-eshell) - (const :tag "C annotate-file: Annotate a file with org syntax" org-annotate-file) - (const :tag "C bookmark: Org links to bookmarks" org-bookmark) + (const :tag "C annotate-file: Annotate a file with Org syntax" org-annotate-file) + (const :tag "C bookmark: Links to bookmarks" ol-bookmark) (const :tag "C checklist: Extra functions for checklists in repeated tasks" org-checklist) (const :tag "C choose: Use TODO keywords to mark decisions states" org-choose) (const :tag "C collector: Collect properties into tables" org-collector) (const :tag "C depend: TODO dependencies for Org mode\n\t\t\t(PARTIALLY OBSOLETE, see built-in dependency support))" org-depend) - (const :tag "C drill: Flashcards and spaced repetition for Org mode" org-drill) - (const :tag "C elisp-symbol: Org links to emacs-lisp symbols" org-elisp-symbol) + (const :tag "C elisp-symbol: Links to emacs-lisp symbols" ol-elisp-symbol) (const :tag "C eval-light: Evaluate inbuffer-code on demand" org-eval-light) (const :tag "C eval: Include command output as text" org-eval) (const :tag "C expiry: Expiry mechanism for Org entries" org-expiry) - (const :tag "C git-link: Provide org links to specific file version" org-git-link) + (const :tag "C git-link: Links to specific file version" ol-git-link) (const :tag "C interactive-query: Interactive modification of tags query\n\t\t\t(PARTIALLY OBSOLETE, see secondary filtering)" org-interactive-query) (const :tag "C invoice: Help manage client invoices in Org mode" org-invoice) (const :tag "C learn: SuperMemo's incremental learning algorithm" org-learn) (const :tag "C mac-iCal: Imports events from iCal.app to the Emacs diary" org-mac-iCal) (const :tag "C mac-link: Grab links and url from various mac Applications" org-mac-link) (const :tag "C mairix: Hook mairix search into Org for different MUAs" org-mairix) - (const :tag "C man: Support for links to manpages in Org mode" org-man) - (const :tag "C mew: Links to Mew folders/messages" org-mew) - (const :tag "C notify: Notifications for Org-mode" org-notify) - (const :tag "C notmuch: Provide org links to notmuch searches or messages" org-notmuch) + (const :tag "C man: Links to man pages in Org mode" ol-man) + (const :tag "C mew: Links to Mew folders/messages" ol-mew) + (const :tag "C notify: Notifications for Org mode" org-notify) + (const :tag "C notmuch: Provide Org links to notmuch searches or messages" ol-notmuch) (const :tag "C panel: Simple routines for us with bad memory" org-panel) (const :tag "C registry: A registry for Org links" org-registry) - (const :tag "C screen: Visit screen sessions through Org links" org-screen) - (const :tag "C screenshot: Take and manage screenshots in Org-mode files" org-screenshot) + (const :tag "C screen: Visit screen sessions through links" org-screen) + (const :tag "C screenshot: Take and manage screenshots in Org files" org-screenshot) (const :tag "C secretary: Team management with Org" org-secretary) (const :tag "C sqlinsert: Convert Org tables to SQL insertions" orgtbl-sqlinsert) (const :tag "C toc: Table of contents for Org buffer" org-toc) (const :tag "C track: Keep up with Org mode development" org-track) (const :tag "C velocity Something like Notational Velocity for Org" org-velocity) - (const :tag "C vm: Links to VM folders/messages" org-vm) + (const :tag "C vm: Links to VM folders/messages" ol-vm) (const :tag "C wikinodes: CamelCase wiki-like links" org-wikinodes) - (const :tag "C wl: Links to Wanderlust folders/messages" org-wl) + (const :tag "C wl: Links to Wanderlust folders/messages" ol-wl) (repeat :tag "External packages" :inline t (symbol :tag "Package")))) (defvar org-export-registered-backends) ; From ox.el. @@ -1119,63 +1051,6 @@ has been set." :group 'org-startup :type 'boolean) -(defvaralias 'org-CUA-compatible 'org-replace-disputed-keys) - -(defcustom org-replace-disputed-keys nil - "Non-nil means use alternative key bindings for some keys. - -Org mode uses S- keys for changing timestamps and priorities. -These keys are also used by other packages like Shift Select mode, -CUA mode or Windmove. If you want to use Org mode together with -one of these other modes, or more generally if you would like to -move some Org mode commands to other keys, set this variable and -configure the keys with the variable `org-disputed-keys'. - -This option is only relevant at load-time of Org mode, and must be set -*before* org.el is loaded. Changing it requires a restart of Emacs to -become effective." - :group 'org-startup - :type 'boolean) - -(defcustom org-use-extra-keys nil - "Non-nil means use extra key sequence definitions for certain commands. -This happens automatically if `window-system' is nil. This -variable lets you do the same manually. You must set it before -loading Org." - :group 'org-startup - :type 'boolean) - -(defcustom org-disputed-keys - '(([(shift up)] . [(meta p)]) - ([(shift down)] . [(meta n)]) - ([(shift left)] . [(meta -)]) - ([(shift right)] . [(meta +)]) - ([(control shift right)] . [(meta shift +)]) - ([(control shift left)] . [(meta shift -)])) - "Keys for which Org mode and other modes compete. -This is an alist, cars are the default keys, second element specifies -the alternative to use when `org-replace-disputed-keys' is t. - -Keys can be specified in any syntax supported by `define-key'. -The value of this option takes effect only at Org mode startup, -therefore you'll have to restart Emacs to apply it after changing." - :group 'org-startup - :type 'alist) - -(defun org-key (key) - "Select key according to `org-replace-disputed-keys' and `org-disputed-keys'. -Or return the original if not disputed." - (when org-replace-disputed-keys - (let* ((nkey (key-description key)) - (x (cl-find-if (lambda (x) (equal (key-description (car x)) nkey)) - org-disputed-keys))) - (setq key (if x (cdr x) key)))) - key) - -(defun org-defkey (keymap key def) - "Define a key, possibly translated, as returned by `org-key'." - (define-key keymap (org-key key) def)) - (defcustom org-ellipsis nil "The ellipsis to use in the Org mode outline. @@ -1313,43 +1188,158 @@ new-frame Make a new frame each time. Note that in this case (const :tag "Each time a new frame" new-frame) (const :tag "One dedicated frame" dedicated-frame))) -(defcustom org-use-speed-commands nil - "Non-nil means activate single letter commands at beginning of a headline. -This may also be a function to test for appropriate locations where speed -commands should be active. +(defconst org-file-apps-gnu + '((remote . emacs) + (system . mailcap) + (t . mailcap)) + "Default file applications on a UNIX or GNU/Linux system. +See `org-file-apps'.") + +(defconst org-file-apps-macos + '((remote . emacs) + (system . "open %s") + ("ps.gz" . "gv %s") + ("eps.gz" . "gv %s") + ("dvi" . "xdvi %s") + ("fig" . "xfig %s") + (t . "open %s")) + "Default file applications on a macOS system. +The system \"open\" is known as a default, but we use X11 applications +for some files for which the OS does not have a good default. +See `org-file-apps'.") -For example, to activate speed commands when the point is on any -star at the beginning of the headline, you can do this: +(defconst org-file-apps-windowsnt + (list '(remote . emacs) + (cons 'system (lambda (file _path) + (with-no-warnings (w32-shell-execute "open" file)))) + (cons t (lambda (file _path) + (with-no-warnings (w32-shell-execute "open" file))))) + "Default file applications on a Windows NT system. +The system \"open\" is used for most files. +See `org-file-apps'.") - (setq org-use-speed-commands - (lambda () (and (looking-at org-outline-regexp) (looking-back \"^\\**\"))))" - :group 'org-structure - :type '(choice - (const :tag "Never" nil) - (const :tag "At beginning of headline stars" t) - (function))) +(defcustom org-file-apps + '((auto-mode . emacs) + ("\\.mm\\'" . default) + ("\\.x?html?\\'" . default) + ("\\.pdf\\'" . default)) + "External applications for opening `file:path' items in a document. -(defcustom org-speed-commands-user nil - "Alist of additional speed commands. -This list will be checked before `org-speed-commands-default' -when the variable `org-use-speed-commands' is non-nil -and when the cursor is at the beginning of a headline. -The car of each entry is a string with a single letter, which must -be assigned to `self-insert-command' in the global map. -The cdr is either a command to be called interactively, a function -to be called, or a form to be evaluated. -An entry that is just a list with a single string will be interpreted -as a descriptive headline that will be added when listing the speed -commands in the Help buffer using the `?' speed command." - :group 'org-structure - :type '(repeat :value ("k" . ignore) - (choice :value ("k" . ignore) - (list :tag "Descriptive Headline" (string :tag "Headline")) - (cons :tag "Letter and Command" - (string :tag "Command letter") - (choice - (function) - (sexp)))))) +\\ +Org mode uses system defaults for different file types, but +you can use this variable to set the application for a given file +extension. The entries in this list are cons cells where the car identifies +files and the cdr the corresponding command. + +Possible values for the file identifier are: + + \"string\" A string as a file identifier can be interpreted in different + ways, depending on its contents: + + - Alphanumeric characters only: + Match links with this file extension. + Example: (\"pdf\" . \"evince %s\") + to open PDFs with evince. + + - Regular expression: Match links where the + filename matches the regexp. If you want to + use groups here, use shy groups. + + Example: (\"\\\\.x?html\\\\\\='\" . \"firefox %s\") + (\"\\\\(?:xhtml\\\\|html\\\\)\\\\\\='\" . \"firefox %s\") + to open *.html and *.xhtml with firefox. + + - Regular expression which contains (non-shy) groups: + Match links where the whole link, including \"::\", and + anything after that, matches the regexp. + In a custom command string, %1, %2, etc. are replaced with + the parts of the link that were matched by the groups. + For backwards compatibility, if a command string is given + that does not use any of the group matches, this case is + handled identically to the second one (i.e. match against + file name only). + In a custom function, you can access the group matches with + (match-string n link). + + Example: (\"\\\\.pdf::\\\\([0-9]+\\\\)\\\\\\='\" . \ +\"evince -p %1 %s\") + to open [[file:document.pdf::5]] with evince at page 5. + + `directory' Matches a directory + `remote' Matches a remote file, accessible through tramp or efs. + Remote files most likely should be visited through Emacs + because external applications cannot handle such paths. +`auto-mode' Matches files that are matched by any entry in `auto-mode-alist', + so all files Emacs knows how to handle. Using this with + command `emacs' will open most files in Emacs. Beware that this + will also open html files inside Emacs, unless you add + (\"html\" . default) to the list as well. + `system' The system command to open files, like `open' on Windows + and macOS, and mailcap under GNU/Linux. This is the command + that will be selected if you call `org-open-at-point' with a + double prefix argument (`\\[universal-argument] \ +\\[universal-argument] \\[org-open-at-point]'). + t Default for files not matched by any of the other options. + +Possible values for the command are: + + `emacs' The file will be visited by the current Emacs process. + `default' Use the default application for this file type, which is the + association for t in the list, most likely in the system-specific + part. This can be used to overrule an unwanted setting in the + system-specific variable. + `system' Use the system command for opening files, like \"open\". + This command is specified by the entry whose car is `system'. + Most likely, the system-specific version of this variable + does define this command, but you can overrule/replace it + here. +`mailcap' Use command specified in the mailcaps. + string A command to be executed by a shell; %s will be replaced + by the path to the file. + function A Lisp function, which will be called with two arguments: + the file path and the original link string, without the + \"file:\" prefix. + +For more examples, see the system specific constants +`org-file-apps-macos' +`org-file-apps-windowsnt' +`org-file-apps-gnu'." + :group 'org + :type '(repeat + (cons (choice :value "" + (string :tag "Extension") + (const :tag "System command to open files" system) + (const :tag "Default for unrecognized files" t) + (const :tag "Remote file" remote) + (const :tag "Links to a directory" directory) + (const :tag "Any files that have Emacs modes" + auto-mode)) + (choice :value "" + (const :tag "Visit with Emacs" emacs) + (const :tag "Use default" default) + (const :tag "Use the system command" system) + (string :tag "Command") + (function :tag "Function"))))) + +(defcustom org-open-non-existing-files nil + "Non-nil means `org-open-file' opens non-existing files. + +When nil, an error is thrown. + +This variable applies only to external applications because they +might choke on non-existing files. If the link is to a file that +will be opened in Emacs, the variable is ignored." + :group 'org + :type 'boolean + :safe #'booleanp) + +(defcustom org-open-directory-means-index-dot-org nil + "When non-nil a link to a directory really means to \"index.org\". +When nil, following a directory link runs Dired or opens +a finder/explorer window on that directory." + :group 'org + :type 'boolean + :safe #'booleanp) (defcustom org-bookmark-names-plist '(:last-capture "org-capture-last-stored" @@ -1707,13 +1697,6 @@ make an intelligent decision whether to insert a blank line or not." :group 'org-edit-structure :type 'hook) -(defcustom org-enable-fixed-width-editor t - "Non-nil means lines starting with \":\" are treated as fixed-width. -This currently only means they are never auto-wrapped. -When nil, such lines will be treated like ordinary lines." - :group 'org-edit-structure - :type 'boolean) - (defgroup org-sparse-trees nil "Options concerning sparse trees in Org mode." :tag "Org Sparse Trees" @@ -1732,8 +1715,8 @@ changed by an edit command." Such highlights are created by `org-occur' and `org-clock-display'. When nil, `\\[org-ctrl-c-ctrl-c]' needs to be used \ to get rid of the highlights. -The highlights created by `org-toggle-latex-fragment' always need -`\\[org-toggle-latex-fragment]' to be removed." +The highlights created by `org-latex-preview' always need +`\\[org-latex-preview]' to be removed." :group 'org-sparse-trees :group 'org-time :type 'boolean) @@ -1756,11 +1739,6 @@ as possible." :group 'org-sparse-trees :type 'hook) -(defgroup org-table nil - "Options concerning tables in Org mode." - :tag "Org Table" - :group 'org) - (defcustom org-self-insert-cluster-for-undo nil "Non-nil means cluster self-insert commands for undo when possible. If this is set, then, like in the Emacs command loop, 20 consecutive @@ -1769,155 +1747,6 @@ This is configurable, because there is some impact on typing performance." :group 'org-table :type 'boolean) -(defcustom org-table-tab-recognizes-table.el t - "Non-nil means TAB will automatically notice a table.el table. -When it sees such a table, it moves point into it and - if necessary - -calls `table-recognize-table'." - :group 'org-table-editing - :type 'boolean) - -(defgroup org-link nil - "Options concerning links in Org mode." - :tag "Org Link" - :group 'org) - -(defvar-local org-link-abbrev-alist-local nil - "Buffer-local version of `org-link-abbrev-alist', which see. -The value of this is taken from the #+LINK lines.") - -(defcustom org-link-parameters - '(("doi" :follow org--open-doi-link) - ("elisp" :follow org--open-elisp-link) - ("file" :complete org-file-complete-link) - ("ftp" :follow (lambda (path) (browse-url (concat "ftp:" path)))) - ("help" :follow org--open-help-link) - ("http" :follow (lambda (path) (browse-url (concat "http:" path)))) - ("https" :follow (lambda (path) (browse-url (concat "https:" path)))) - ("mailto" :follow (lambda (path) (browse-url (concat "mailto:" path)))) - ("news" :follow (lambda (path) (browse-url (concat "news:" path)))) - ("shell" :follow org--open-shell-link)) - "An alist of properties that defines all the links in Org mode. -The key in each association is a string of the link type. -Subsequent optional elements make up a p-list of link properties. - -:follow - A function that takes the link path as an argument. - -:export - A function that takes the link path, description and -export-backend as arguments. - -:store - A function responsible for storing the link. See the -function `org-store-link-functions'. - -:complete - A function that inserts a link with completion. The -function takes one optional prefix arg. - -:face - A face for the link, or a function that returns a face. -The function takes one argument which is the link path. The -default face is `org-link'. - -:mouse-face - The mouse-face. The default is `highlight'. - -:display - `full' will not fold the link in descriptive -display. Default is `org-link'. - -:help-echo - A string or function that takes (window object position) -as arguments and returns a string. - -:keymap - A keymap that is active on the link. The default is -`org-mouse-map'. - -:htmlize-link - A function for the htmlize-link. Defaults -to (list :uri \"type:path\") - -:activate-func - A function to run at the end of font-lock -activation. The function must accept (link-start link-end path bracketp) -as arguments." - :group 'org-link - :type '(alist :tag "Link display parameters" - :value-type plist) - :version "26.1" - :package-version '(Org . "9.1")) - -(defun org-link-get-parameter (type key) - "Get TYPE link property for KEY. -TYPE is a string and KEY is a plist keyword." - (plist-get - (cdr (assoc type org-link-parameters)) - key)) - -(defun org-link-set-parameters (type &rest parameters) - "Set link TYPE properties to PARAMETERS. - PARAMETERS should be :key val pairs." - (let ((data (assoc type org-link-parameters))) - (if data (setcdr data (org-combine-plists (cdr data) parameters)) - (push (cons type parameters) org-link-parameters) - (org-make-link-regexps) - (org-element-update-syntax)))) - -(defun org-link-types () - "Return a list of known link types." - (mapcar #'car org-link-parameters)) - -(defcustom org-link-abbrev-alist nil - "Alist of link abbreviations. -The car of each element is a string, to be replaced at the start of a link. -The cdrs are replacement values, like (\"linkkey\" . REPLACE). Abbreviated -links in Org buffers can have an optional tag after a double colon, e.g., - - [[linkkey:tag][description]] - -The `linkkey' must be a single word, starting with a letter, followed -by letters, numbers, `-' or `_'. - -If REPLACE is a string, the tag will simply be appended to create the link. -If the string contains \"%s\", the tag will be inserted there. If the string -contains \"%h\", it will cause a url-encoded version of the tag to be inserted -at that point (see the function `url-hexify-string'). If the string contains -the specifier \"%(my-function)\", then the custom function `my-function' will -be invoked: this function takes the tag as its only argument and must return -a string. - -REPLACE may also be a function that will be called with the tag as the -only argument to create the link, which should be returned as a string. - -See the manual for examples." - :group 'org-link - :type '(repeat - (cons - (string :tag "Protocol") - (choice - (string :tag "Format") - (function))))) - -(defcustom org-descriptive-links t - "Non-nil means Org will display descriptive links. -E.g. [[https://orgmode.org][Org website]] will be displayed as -\"Org Website\", hiding the link itself and just displaying its -description. When set to nil, Org will display the full links -literally. - -You can interactively set the value of this variable by calling -`org-toggle-link-display' or from the menu Org>Hyperlinks menu." - :group 'org-link - :type 'boolean) - -(defcustom org-link-file-path-type 'adaptive - "How the path name in file links should be stored. -Valid values are: - -relative Relative to the current directory, i.e. the directory of the file - into which the link is being inserted. -absolute Absolute path, if possible with ~ for home directory. -noabbrev Absolute path, no abbreviation of home directory. -adaptive Use relative path for files in the current directory and sub- - directories of it. For other files, use an absolute path." - :group 'org-link - :type '(choice - (const relative) - (const absolute) - (const noabbrev) - (const adaptive))) - (defvaralias 'org-activate-links 'org-highlight-links) (defcustom org-highlight-links '(bracket angle plain radio tag date footnote) "Types of links that should be highlighted in Org files. @@ -1942,7 +1771,6 @@ footnote Footnote labels. If you set this variable during an Emacs session, use `org-mode-restart' in the Org buffer so that the change takes effect." - :group 'org-link :group 'org-appearance :type '(set :greedy t (const :tag "Double bracket links" bracket) @@ -1953,447 +1781,22 @@ in the Org buffer so that the change takes effect." (const :tag "Timestamps" date) (const :tag "Footnotes" footnote))) -(defcustom org-make-link-description-function nil - "Function to use for generating link descriptions from links. -This function must take two parameters: the first one is the -link, the second one is the description generated by -`org-insert-link'. The function should return the description to -use." - :group 'org-link - :type '(choice (const nil) (function))) - -(defgroup org-link-store nil - "Options concerning storing links in Org mode." - :tag "Org Store Link" - :group 'org-link) - -(defcustom org-url-hexify-p t - "When non-nil, hexify URL when creating a link." - :type 'boolean - :version "24.3" - :group 'org-link-store) - -(defcustom org-email-link-description-format "Email %c: %.30s" - "Format of the description part of a link to an email or usenet message. -The following %-escapes will be replaced by corresponding information: - -%F full \"From\" field -%f name, taken from \"From\" field, address if no name -%T full \"To\" field -%t first name in \"To\" field, address if no name -%c correspondent. Usually \"from NAME\", but if you sent it yourself, it - will be \"to NAME\". See also the variable `org-from-is-user-regexp'. -%s subject -%d date -%m message-id. - -You may use normal field width specification between the % and the letter. -This is for example useful to limit the length of the subject. - -Examples: \"%f on: %.30s\", \"Email from %f\", \"Email %c\"" - :group 'org-link-store - :type 'string) - -(defcustom org-from-is-user-regexp - (let (r1 r2) - (when (and user-mail-address (not (string= user-mail-address ""))) - (setq r1 (concat "\\<" (regexp-quote user-mail-address) "\\>"))) - (when (and user-full-name (not (string= user-full-name ""))) - (setq r2 (concat "\\<" (regexp-quote user-full-name) "\\>"))) - (if (and r1 r2) (concat r1 "\\|" r2) (or r1 r2))) - "Regexp matched against the \"From:\" header of an email or usenet message. -It should match if the message is from the user him/herself." - :group 'org-link-store - :type 'regexp) - -(defcustom org-context-in-file-links t - "Non-nil means file links from `org-store-link' contain context. -\\ -A search string will be added to the file name with :: as separator -and used to find the context when the link is activated by the command -`org-open-at-point'. When this option is t, the entire active region -will be placed in the search string of the file link. If set to a -positive integer, only the first n lines of context will be stored. - -Using a prefix arg to the command `org-store-link' (`\\[universal-argument] \ -\\[org-store-link]') -negates this setting for the duration of the command." - :group 'org-link-store - :type '(choice boolean integer)) - -(defcustom org-keep-stored-link-after-insertion nil - "Non-nil means keep link in list for entire session. -\\ -The command `org-store-link' adds a link pointing to the current -location to an internal list. These links accumulate during a session. -The command `org-insert-link' can be used to insert links into any -Org file (offering completion for all stored links). - -When this option is nil, every link which has been inserted once using -`\\[org-insert-link]' will be removed from the list, to make completing the \ -unused -links more efficient." - :group 'org-link-store - :type 'boolean) - -(defgroup org-link-follow nil - "Options concerning following links in Org mode." - :tag "Org Follow Link" - :group 'org-link) - -(defcustom org-link-translation-function nil - "Function to translate links with different syntax to Org syntax. -This can be used to translate links created for example by the Planner -or emacs-wiki packages to Org syntax. -The function must accept two parameters, a TYPE containing the link -protocol name like \"rmail\" or \"gnus\" as a string, and the linked path, -which is everything after the link protocol. It should return a cons -with possibly modified values of type and path. -Org contains a function for this, so if you set this variable to -`org-translate-link-from-planner', you should be able follow many -links created by planner." - :group 'org-link-follow - :type '(choice (const nil) (function))) - -(defcustom org-follow-link-hook nil - "Hook that is run after a link has been followed." - :group 'org-link-follow - :type 'hook) - -(defcustom org-tab-follows-link nil - "Non-nil means on links TAB will follow the link. -Needs to be set before org.el is loaded. -This really should not be used, it does not make sense, and the -implementation is bad." - :group 'org-link-follow - :type 'boolean) - -(defcustom org-return-follows-link nil - "Non-nil means on links RET will follow the link. -In tables, the special behavior of RET has precedence." - :group 'org-link-follow - :type 'boolean) - -(defcustom org-mouse-1-follows-link - (if (boundp 'mouse-1-click-follows-link) mouse-1-click-follows-link t) - "Non-nil means mouse-1 on a link will follow the link. -A longer mouse click will still set point. Needs to be set -before org.el is loaded." - :group 'org-link-follow - :version "26.1" - :package-version '(Org . "8.3") - :type '(choice - (const :tag "A double click follows the link" double) - (const :tag "Unconditionally follow the link with mouse-1" t) - (integer :tag "mouse-1 click does not follow the link if longer than N ms" 450))) - (defcustom org-mark-ring-length 4 "Number of different positions to be recorded in the ring. Changing this requires a restart of Emacs to work correctly." :group 'org-link-follow :type 'integer) -(defcustom org-link-search-must-match-exact-headline 'query-to-create - "Non-nil means internal fuzzy links can only match headlines. - -When nil, the a fuzzy link may point to a target or a named -construct in the document. When set to the special value -`query-to-create', offer to create a new headline when none -matched. +(defgroup org-refile nil + "Options concerning refiling entries in Org mode." + :tag "Org Refile" + :group 'org) -Spaces and statistics cookies are ignored during heading searches." - :group 'org-link-follow - :version "24.1" - :type '(choice - (const :tag "Use fuzzy text search" nil) - (const :tag "Match only exact headline" t) - (const :tag "Match exact headline or query to create it" - query-to-create)) - :safe #'symbolp) - -(defcustom org-link-frame-setup - '((vm . vm-visit-folder-other-frame) - (vm-imap . vm-visit-imap-folder-other-frame) - (gnus . org-gnus-no-new-news) - (file . find-file-other-window) - (wl . wl-other-frame)) - "Setup the frame configuration for following links. -When following a link with Emacs, it may often be useful to display -this link in another window or frame. This variable can be used to -set this up for the different types of links. -For VM, use any of - `vm-visit-folder' - `vm-visit-folder-other-window' - `vm-visit-folder-other-frame' -For Gnus, use any of - `gnus' - `gnus-other-frame' - `org-gnus-no-new-news' -For FILE, use any of - `find-file' - `find-file-other-window' - `find-file-other-frame' -For Wanderlust use any of - `wl' - `wl-other-frame' -For the calendar, use the variable `calendar-setup'. -For BBDB, it is currently only possible to display the matches in -another window." - :group 'org-link-follow - :type '(list - (cons (const vm) - (choice - (const vm-visit-folder) - (const vm-visit-folder-other-window) - (const vm-visit-folder-other-frame))) - (cons (const vm-imap) - (choice - (const vm-visit-imap-folder) - (const vm-visit-imap-folder-other-window) - (const vm-visit-imap-folder-other-frame))) - (cons (const gnus) - (choice - (const gnus) - (const gnus-other-frame) - (const org-gnus-no-new-news))) - (cons (const file) - (choice - (const find-file) - (const find-file-other-window) - (const find-file-other-frame))) - (cons (const wl) - (choice - (const wl) - (const wl-other-frame))))) - -(defcustom org-display-internal-link-with-indirect-buffer nil - "Non-nil means use indirect buffer to display infile links. -Activating internal links (from one location in a file to another location -in the same file) normally just jumps to the location. When the link is -activated with a `\\[universal-argument]' prefix (or with mouse-3), the link \ -is displayed in -another window. When this option is set, the other window actually displays -an indirect buffer clone of the current buffer, to avoid any visibility -changes to the current buffer." - :group 'org-link-follow - :type 'boolean) - -(defcustom org-open-non-existing-files nil - "Non-nil means `org-open-file' will open non-existing files. -When nil, an error will be generated. -This variable applies only to external applications because they -might choke on non-existing files. If the link is to a file that -will be opened in Emacs, the variable is ignored." - :group 'org-link-follow - :type 'boolean) - -(defcustom org-open-directory-means-index-dot-org nil - "Non-nil means a link to a directory really means to index.org. -When nil, following a directory link will run dired or open a finder/explorer -window on that directory." - :group 'org-link-follow - :type 'boolean) - -(defcustom org-confirm-shell-link-function 'yes-or-no-p - "Non-nil means ask for confirmation before executing shell links. -Shell links can be dangerous: just think about a link - - [[shell:rm -rf ~/*][Google Search]] - -This link would show up in your Org document as \"Google Search\", -but really it would remove your entire home directory. -Therefore we advise against setting this variable to nil. -Just change it to `y-or-n-p' if you want to confirm with a -single keystroke rather than having to type \"yes\"." - :group 'org-link-follow - :type '(choice - (const :tag "with yes-or-no (safer)" yes-or-no-p) - (const :tag "with y-or-n (faster)" y-or-n-p) - (const :tag "no confirmation (dangerous)" nil))) -(put 'org-confirm-shell-link-function - 'safe-local-variable - (lambda (x) (member x '(yes-or-no-p y-or-n-p)))) - -(defcustom org-confirm-shell-link-not-regexp "" - "A regexp to skip confirmation for shell links." - :group 'org-link-follow - :version "24.1" - :type 'regexp) - -(defcustom org-confirm-elisp-link-function 'yes-or-no-p - "Non-nil means ask for confirmation before executing Emacs Lisp links. -Elisp links can be dangerous: just think about a link - - [[elisp:(shell-command \"rm -rf ~/*\")][Google Search]] - -This link would show up in your Org document as \"Google Search\", -but really it would remove your entire home directory. -Therefore we advise against setting this variable to nil. -Just change it to `y-or-n-p' if you want to confirm with a -single keystroke rather than having to type \"yes\"." - :group 'org-link-follow - :type '(choice - (const :tag "with yes-or-no (safer)" yes-or-no-p) - (const :tag "with y-or-n (faster)" y-or-n-p) - (const :tag "no confirmation (dangerous)" nil))) -(put 'org-confirm-shell-link-function - 'safe-local-variable - (lambda (x) (member x '(yes-or-no-p y-or-n-p)))) - -(defcustom org-confirm-elisp-link-not-regexp "" - "A regexp to skip confirmation for Elisp links." - :group 'org-link-follow - :version "24.1" - :type 'regexp) - -(defconst org-file-apps-defaults-gnu - '((remote . emacs) - (system . mailcap) - (t . mailcap)) - "Default file applications on a UNIX or GNU/Linux system. -See `org-file-apps'.") - -(defconst org-file-apps-defaults-macosx - '((remote . emacs) - (system . "open %s") - ("ps.gz" . "gv %s") - ("eps.gz" . "gv %s") - ("dvi" . "xdvi %s") - ("fig" . "xfig %s") - (t . "open %s")) - "Default file applications on a macOS system. -The system \"open\" is known as a default, but we use X11 applications -for some files for which the OS does not have a good default. -See `org-file-apps'.") - -(defconst org-file-apps-defaults-windowsnt - (list '(remote . emacs) - (cons 'system (lambda (file _path) - (with-no-warnings (w32-shell-execute "open" file)))) - (cons t (lambda (file _path) - (with-no-warnings (w32-shell-execute "open" file))))) - "Default file applications on a Windows NT system. -The system \"open\" is used for most files. -See `org-file-apps'.") - -(defcustom org-file-apps - '((auto-mode . emacs) - ("\\.mm\\'" . default) - ("\\.x?html?\\'" . default) - ("\\.pdf\\'" . default)) - "External applications for opening `file:path' items in a document. -\\ -Org mode uses system defaults for different file types, but -you can use this variable to set the application for a given file -extension. The entries in this list are cons cells where the car identifies -files and the cdr the corresponding command. - -Possible values for the file identifier are: - - \"string\" A string as a file identifier can be interpreted in different - ways, depending on its contents: - - - Alphanumeric characters only: - Match links with this file extension. - Example: (\"pdf\" . \"evince %s\") - to open PDFs with evince. - - - Regular expression: Match links where the - filename matches the regexp. If you want to - use groups here, use shy groups. - - Example: (\"\\\\.x?html\\\\\\='\" . \"firefox %s\") - (\"\\\\(?:xhtml\\\\|html\\\\)\\\\\\='\" . \"firefox %s\") - to open *.html and *.xhtml with firefox. - - - Regular expression which contains (non-shy) groups: - Match links where the whole link, including \"::\", and - anything after that, matches the regexp. - In a custom command string, %1, %2, etc. are replaced with - the parts of the link that were matched by the groups. - For backwards compatibility, if a command string is given - that does not use any of the group matches, this case is - handled identically to the second one (i.e. match against - file name only). - In a custom function, you can access the group matches with - (match-string n link). - - Example: (\"\\\\.pdf::\\\\([0-9]+\\\\)\\\\\\='\" . \ -\"evince -p %1 %s\") - to open [[file:document.pdf::5]] with evince at page 5. - - `directory' Matches a directory - `remote' Matches a remote file, accessible through tramp or efs. - Remote files most likely should be visited through Emacs - because external applications cannot handle such paths. -`auto-mode' Matches files that are matched by any entry in `auto-mode-alist', - so all files Emacs knows how to handle. Using this with - command `emacs' will open most files in Emacs. Beware that this - will also open html files inside Emacs, unless you add - (\"html\" . default) to the list as well. - `system' The system command to open files, like `open' on Windows - and macOS, and mailcap under GNU/Linux. This is the command - that will be selected if you call `org-open-at-point' with a - double prefix argument (`\\[universal-argument] \ -\\[universal-argument] \\[org-open-at-point]'). - t Default for files not matched by any of the other options. - -Possible values for the command are: - - `emacs' The file will be visited by the current Emacs process. - `default' Use the default application for this file type, which is the - association for t in the list, most likely in the system-specific - part. This can be used to overrule an unwanted setting in the - system-specific variable. - `system' Use the system command for opening files, like \"open\". - This command is specified by the entry whose car is `system'. - Most likely, the system-specific version of this variable - does define this command, but you can overrule/replace it - here. -`mailcap' Use command specified in the mailcaps. - string A command to be executed by a shell; %s will be replaced - by the path to the file. - function A Lisp function, which will be called with two arguments: - the file path and the original link string, without the - \"file:\" prefix. - -For more examples, see the system specific constants -`org-file-apps-defaults-macosx' -`org-file-apps-defaults-windowsnt' -`org-file-apps-defaults-gnu'." - :group 'org-link-follow - :type '(repeat - (cons (choice :value "" - (string :tag "Extension") - (const :tag "System command to open files" system) - (const :tag "Default for unrecognized files" t) - (const :tag "Remote file" remote) - (const :tag "Links to a directory" directory) - (const :tag "Any files that have Emacs modes" - auto-mode)) - (choice :value "" - (const :tag "Visit with Emacs" emacs) - (const :tag "Use default" default) - (const :tag "Use the system command" system) - (string :tag "Command") - (function :tag "Function"))))) - -(defcustom org-doi-server-url "https://doi.org/" - "The URL of the DOI server." - :type 'string - :version "24.3" - :group 'org-link-follow) - -(defgroup org-refile nil - "Options concerning refiling entries in Org mode." - :tag "Org Refile" - :group 'org) - -(defcustom org-directory "~/org" - "Directory with Org files. -This is just a default location to look for Org files. There is no need -at all to put your files into this directory. It is used in the -following situations: +(defcustom org-directory "~/org" + "Directory with Org files. +This is just a default location to look for Org files. There is no need +at all to put your files into this directory. It is used in the +following situations: 1. When a capture template specifies a target file that is not an absolute path. The path will then be interpreted relative to @@ -2706,31 +2109,35 @@ more information." :type '(choice (const sequence) (const type))) -(defcustom org-use-fast-todo-selection t +(defcustom org-use-fast-todo-selection 'auto "\\\ Non-nil means use the fast todo selection scheme with `\\[org-todo]'. This variable describes if and under what circumstances the cycling mechanism for TODO keywords will be replaced by a single-key, direct -selection scheme. +selection scheme, where the choices are displayed in a little window. -When nil, fast selection is never used. +When nil, fast selection is never used. This means that the command +will always switch to the next state. -When the symbol `prefix', it will be used when `org-todo' is called -with a prefix argument, i.e. `\\[universal-argument] \\[org-todo]' \ -in an Org buffer, and -`\\[universal-argument] t' in an agenda buffer. +When it is the symbol `auto', fast selection is whenever selection +keys have been defined. -When t, fast selection is used by default. In this case, the prefix -argument forces cycling instead. +`expert' is like `auto', but no special window with the keyword +will be shown, choices will only be listed in the prompt. In all cases, the special interface is only used if access keys have actually been assigned by the user, i.e. if keywords in the configuration are followed by a letter in parenthesis, like TODO(t)." :group 'org-todo + :set (lambda (var val) + (cond + ((eq var t) (set var 'auto)) + ((eq var 'prefix) (set var nil)) + (t (set var val)))) :type '(choice (const :tag "Never" nil) - (const :tag "By default" t) - (const :tag "Only with C-u C-c C-t" prefix))) + (const :tag "Automatically, when key letter have been defined" auto) + (const :tag "Automatically, but don't show the selection window" expert))) (defcustom org-provide-todo-statistics t "Non-nil means update todo statistics after insert and toggle. @@ -3731,6 +3138,18 @@ This variable can be set on the per-file basis by inserting a line :group 'org-properties :type 'string) +(defcustom org-columns-default-format-for-agenda nil + "The default column format in an agenda buffer. +This will be used for column view in the agenda unless a format has +been set by adding `org-overriding-columns-format' to the local +settings list of a custom agenda view. When nil, the columns format +for the first item in the agenda list will be used, or as a fall-back, +`org-columns-default-format'." + :group 'org-properties + :type '(choice + (const :tag "No default" nil) + (string :tag "Format string"))) + (defcustom org-columns-ellipses ".." "The ellipses to be used when a field in column view is truncated. When this is the empty string, as many characters as possible are shown, @@ -3949,12 +3368,11 @@ All available processes and theirs documents can be found in :image-output-type "png" :image-size-adjust (1.0 . 1.0) :latex-compiler ("latex -interaction nonstopmode -output-directory %o %f") - :image-converter ("dvipng -fg %F -bg %B -D %D -T tight -o %O %f")) + :image-converter ("dvipng -D %D -T tight -o %O %f")) (dvisvgm :programs ("latex" "dvisvgm") :description "dvi > svg" :message "you need to install the programs: latex and dvisvgm." - :use-xcolor t :image-input-type "dvi" :image-output-type "svg" :image-size-adjust (1.7 . 1.5) @@ -3964,7 +3382,6 @@ All available processes and theirs documents can be found in :programs ("latex" "convert") :description "pdf > png" :message "you need to install the programs: latex and imagemagick." - :use-xcolor t :image-input-type "pdf" :image-output-type "png" :image-size-adjust (1.0 . 1.0) @@ -3984,11 +3401,6 @@ PROPERTIES accepts the following attributes: :message string, message it when required programs cannot be found. :image-input-type string, input file type of image converter (e.g., \"dvi\"). :image-output-type string, output file type of image converter (e.g., \"png\"). - :use-xcolor boolean, when non-nil, LaTeX \"xcolor\" macro is used to - deal with background and foreground color of image. - Otherwise, dvipng style background and foreground color - format are generated. You may then refer to them in - command options with \"%F\" and \"%B\". :image-size-adjust cons of numbers, the car element is used to adjust LaTeX image size showed in buffer and the cdr element is for HTML file. This option is only useful for process @@ -4020,8 +3432,6 @@ Place-holders used by `:image-converter' and `:latex-compiler': Place-holders only used by `:image-converter': - %F foreground of image - %B background of image %D dpi, which is used to adjust image size by some processing commands. %S the image size scale ratio, which is used to adjust image size by some processing commands." @@ -4279,10 +3689,18 @@ org-level-* faces." :group 'org-appearance :type 'boolean) +(defcustom org-fontify-whole-block-delimiter-line t + "Non-nil means fontify the whole line for begin/end lines of blocks. +This is useful when setting a background color for the +org-block-begin-line and org-block-end-line faces." + :group 'org-appearance + :type 'boolean) + (defcustom org-highlight-latex-and-related nil "Non-nil means highlight LaTeX related syntax in the buffer. When non-nil, the value should be a list containing any of the following symbols: + `native' Highlight LaTeX snippets and environments natively. `latex' Highlight LaTeX snippets and environments. `script' Highlight subscript and superscript. `entities' Highlight entities." @@ -4292,6 +3710,7 @@ following symbols: :type '(choice (const :tag "No highlighting" nil) (set :greedy t :tag "Highlight" + (const :tag "LaTeX snippets and environments (native)" native) (const :tag "LaTeX snippets and environments" latex) (const :tag "Subscript and superscript" script) (const :tag "Entities" entities)))) @@ -4442,14 +3861,15 @@ This is needed for font-lock setup.") (beg end)) (declare-function org-agenda-set-restriction-lock "org-agenda" (&optional type)) (declare-function org-agenda-skip "org-agenda" ()) -(declare-function org-attach-reveal "org-attach" (&optional if-exists)) +(declare-function org-attach-expand "org-attach" (file)) +(declare-function org-attach-reveal "org-attach" ()) +(declare-function org-attach-reveal-in-emacs "org-attach" ()) (declare-function org-gnus-follow-link "org-gnus" (&optional group article)) (declare-function org-indent-mode "org-indent" (&optional arg)) (declare-function org-inlinetask-goto-beginning "org-inlinetask" ()) (declare-function org-inlinetask-goto-end "org-inlinetask" ()) (declare-function org-inlinetask-in-task-p "org-inlinetask" ()) (declare-function org-inlinetask-remove-END-maybe "org-inlinetask" ()) -(declare-function orgtbl-send-table "org-table" (&optional maybe)) (declare-function parse-time-string "parse-time" (string)) (defvar align-mode-rules-list) @@ -4462,64 +3882,11 @@ This is needed for font-lock setup.") (defvar remember-data-file) (defvar texmathp-why) -;;;###autoload -(defun turn-on-orgtbl () - "Unconditionally turn on `orgtbl-mode'." - (require 'org-table) - (orgtbl-mode 1)) - -(defun org-at-table-p (&optional table-type) - "Non-nil if the cursor is inside an Org table. -If TABLE-TYPE is non-nil, also check for table.el-type tables." - (and (org-match-line (if table-type "[ \t]*[|+]" "[ \t]*|")) - (or (not (derived-mode-p 'org-mode)) - (let ((e (org-element-lineage (org-element-at-point) '(table) t))) - (and e (or table-type - (eq 'org (org-element-property :type e)))))))) - -(defun org-at-table.el-p () - "Non-nil when point is at a table.el table." - (and (org-match-line "[ \t]*[|+]") - (let ((element (org-element-at-point))) - (and (eq (org-element-type element) 'table) - (eq (org-element-property :type element) 'table.el))))) - -(defun org-at-table-hline-p () - "Non-nil when point is inside a hline in a table. -Assume point is already in a table." - (org-match-line org-table-hline-regexp)) - -(defun org-table-map-tables (function &optional quietly) - "Apply FUNCTION to the start of all tables in the buffer." - (org-with-wide-buffer - (goto-char (point-min)) - (while (re-search-forward org-table-any-line-regexp nil t) - (unless quietly - (message "Mapping tables: %d%%" - (floor (* 100.0 (point)) (buffer-size)))) - (beginning-of-line 1) - (when (and (looking-at org-table-line-regexp) - ;; Exclude tables in src/example/verbatim/clocktable blocks - (not (org-in-block-p '("src" "example" "verbatim" "clocktable")))) - (save-excursion (funcall function)) - (or (looking-at org-table-line-regexp) - (forward-char 1))) - (re-search-forward org-table-any-border-regexp nil 1))) - (unless quietly (message "Mapping tables: done"))) - (declare-function org-clock-save-markers-for-cut-and-paste "org-clock" (beg end)) (declare-function org-clock-update-mode-line "org-clock" (&optional refresh)) (declare-function org-resolve-clocks "org-clock" (&optional also-non-dangling-p prompt last-valid)) -(defun org-at-TBLFM-p (&optional pos) - "Non-nil when point (or POS) is in #+TBLFM line." - (save-excursion - (goto-char (or pos (point))) - (beginning-of-line) - (and (let ((case-fold-search t)) (looking-at org-TBLFM-regexp)) - (eq (org-element-type (org-element-at-point)) 'table)))) - (defvar org-clock-start-time) (defvar org-clock-marker (make-marker) "Marker recording the last clock-in.") @@ -5406,12 +4773,6 @@ This is for getting out of special buffers like capture.") ;;;; Define the Org mode -;; We use a before-change function to check if a table might need -;; an update. -(defvar org-table-may-need-update t - "Indicates that a table might need an update. -This variable is set by `org-before-change-function'. -`org-table-align' sets it back to nil.") (defun org-before-change-function (_beg _end) "Every change indicates that a table might need an update." (setq org-table-may-need-update t)) @@ -5420,7 +4781,6 @@ This variable is set by `org-before-change-function'. (defvar org-agenda-keep-modes nil) ; Dynamically-scoped param. (defvar org-inhibit-logging nil) ; Dynamically-scoped param. (defvar org-inhibit-blocking nil) ; Dynamically-scoped param. -(defvar org-table-buffer-is-an nil) (defvar bidi-paragraph-direction) (defvar buffer-face-mode-face) @@ -5466,18 +4826,9 @@ can be exported as a structured ASCII or HTML file. The following commands are available: \\{org-mode-map}" - - ;; Get rid of Outline menus, they are not needed - ;; Need to do this here because define-derived-mode sets up - ;; the keymap so late. Still, it is a waste to call this each time - ;; we switch another buffer into Org mode. - (define-key org-mode-map [menu-bar headings] 'undefined) - (define-key org-mode-map [menu-bar hide] 'undefined) - (define-key org-mode-map [menu-bar show] 'undefined) - (org-load-modules-maybe) (org-install-agenda-files-menu) - (when org-descriptive-links (add-to-invisibility-spec '(org-link))) + (when org-link-descriptive (add-to-invisibility-spec '(org-link))) (add-to-invisibility-spec '(org-hide-block . t)) (add-to-invisibility-spec '(org-hide-drawer . t)) (setq-local outline-regexp org-outline-regexp) @@ -5560,11 +4911,13 @@ The following commands are available: (lambda (&rest _) (org-show-context 'isearch))) ;; Setup the pcomplete hooks - (setq-local pcomplete-command-completion-function 'org-pcomplete-initial) - (setq-local pcomplete-command-name-function 'org-command-at-point) - (setq-local pcomplete-default-completion-function 'ignore) - (setq-local pcomplete-parse-arguments-function 'org-parse-arguments) + (setq-local pcomplete-command-completion-function #'org-pcomplete-initial) + (setq-local pcomplete-command-name-function #'org-command-at-point) + (setq-local pcomplete-default-completion-function #'ignore) + (setq-local pcomplete-parse-arguments-function #'org-parse-arguments) (setq-local pcomplete-termination-string "") + (add-hook 'completion-at-point-functions + #'pcomplete-completions-at-point nil t) (setq-local buffer-face-mode-face 'org-default) ;; If empty file that did not turn on Org mode automatically, make @@ -5585,11 +4938,10 @@ The following commands are available: (t #'org-table-shrink)) t)) (when org-startup-with-inline-images (org-display-inline-images)) - (when org-startup-with-latex-preview (org-toggle-latex-fragment '(16))) + (when org-startup-with-latex-preview (org-latex-preview '(16))) (unless org-inhibit-startup-visibility-stuff (org-set-startup-visibility)) (when org-startup-truncated (setq truncate-lines t)) - (when org-startup-indented (require 'org-indent) (org-indent-mode 1)) - (org-refresh-effort-properties))) + (when org-startup-indented (require 'org-indent) (org-indent-mode 1)))) ;; Try to set `org-hide' face correctly. (let ((foreground (org-find-invisible-foreground))) (when foreground @@ -5604,7 +4956,8 @@ The following commands are available: ("8.3" . "26.1") ("9.0" . "26.1") ("9.1" . "26.1") - ("9.2" . "27.1"))) + ("9.2" . "27.1") + ("9.3" . "27.1"))) (defvar org-mode-transpose-word-syntax-table (let ((st (make-syntax-table text-mode-syntax-table))) @@ -5653,45 +5006,8 @@ the rounding returns a past time." ;;;; Font-Lock stuff, including the activators -(defvar org-mouse-map (make-sparse-keymap)) -(org-defkey org-mouse-map [mouse-2] 'org-open-at-mouse) -(org-defkey org-mouse-map [mouse-3] 'org-find-file-at-mouse) -(when org-mouse-1-follows-link - (org-defkey org-mouse-map [follow-link] 'mouse-face)) -(when org-tab-follows-link - (org-defkey org-mouse-map (kbd "") #'org-open-at-point) - (org-defkey org-mouse-map (kbd "TAB") #'org-open-at-point)) - (require 'font-lock) -(defconst org-non-link-chars "]\t\n\r<>") -(defvar org-link-types-re nil - "Matches a link that has a url-like prefix like \"http:\"") -(defvar org-link-re-with-space nil - "Matches a link with spaces, optional angular brackets around it.") -(defvar org-link-re-with-space2 nil - "Matches a link with spaces, optional angular brackets around it.") -(defvar org-link-re-with-space3 nil - "Matches a link with spaces, only for internal part in bracket links.") -(defvar org-angle-link-re nil - "Matches link with angular brackets, spaces are allowed.") -(defvar org-plain-link-re nil - "Matches plain link, without spaces.") -(defvar org-bracket-link-regexp nil - "Matches a link in double brackets.") -(defvar org-bracket-link-analytic-regexp nil - "Regular expression used to analyze links. -Here is what the match groups contain after a match: -1: http: -2: http -3: path -4: [desc] -5: desc") -(defvar org-bracket-link-analytic-regexp++ nil - "Like `org-bracket-link-analytic-regexp', but include coderef internal type.") -(defvar org-any-link-re nil - "Regular expression matching any link.") - (defconst org-match-sexp-depth 3 "Number of stacked braces for sub/superscript matching.") @@ -5729,59 +5045,6 @@ stacked delimiters is N. Escaping delimiters is not possible." "\\(" (org-create-multibrace-regexp "{" "}" org-match-sexp-depth) "\\)") "The regular expression matching a sub- or superscript, forcing braces.") -(defun org-make-link-regexps () - "Update the link regular expressions. -This should be called after the variable `org-link-parameters' has changed." - (let ((types-re (regexp-opt (org-link-types) t))) - (setq org-link-types-re - (concat "\\`" types-re ":") - org-link-re-with-space - (concat "?") - org-link-re-with-space2 - (concat "?") - org-link-re-with-space3 - (concat "\n]*\\(?:\n[ \t]*[^> \t\n][^>\n]*\\)*\\)>" - types-re) - org-plain-link-re - (concat - "\\<" types-re ":" - "\\([^][ \t\n()<>]+\\(?:([[:word:]0-9_]+)\\|\\([^[:punct:] \t\n]\\|/\\)\\)\\)") - ;; "\\([^]\t\n\r<>() ]+[^]\t\n\r<>,.;() ]\\)") - org-bracket-link-regexp - "\\[\\[\\([^][]+\\)\\]\\(\\[\\([^][]+\\)\\]\\)?\\]" - org-bracket-link-analytic-regexp - (concat - "\\[\\[" - "\\(" types-re ":\\)?" - "\\([^]]+\\)" - "\\]" - "\\(\\[" "\\([^]]+\\)" "\\]\\)?" - "\\]") - org-bracket-link-analytic-regexp++ - (concat - "\\[\\[" - "\\(" (regexp-opt (cons "coderef" (org-link-types)) t) ":\\)?" - "\\([^]]+\\)" - "\\]" - "\\(\\[" "\\([^]]+\\)" "\\]\\)?" - "\\]") - org-any-link-re - (concat "\\(" org-bracket-link-regexp "\\)\\|\\(" - org-angle-link-re "\\)\\|\\(" - org-plain-link-re "\\)")))) - -(org-make-link-regexps) - (defvar org-emph-face nil) (defun org-do-emphasis-faces (limit) @@ -5887,13 +5150,18 @@ prompted for." "Add link properties to links. This includes angle, plain, and bracket links." (catch :exit - (while (re-search-forward org-any-link-re limit t) + (while (re-search-forward org-link-any-re limit t) (let* ((start (match-beginning 0)) (end (match-end 0)) + (visible-start (or (match-beginning 3) (match-beginning 2))) + (visible-end (or (match-end 3) (match-end 2))) (style (cond ((eq ?< (char-after start)) 'angle) ((eq ?\[ (char-after (1+ start))) 'bracket) (t 'plain)))) (when (and (memq style org-highlight-links) + ;; Do not span over paragraph boundaries. + (not (string-match-p org-element-paragraph-separate + (match-string 0))) ;; Do not confuse plain links with tags. (not (and (eq style 'plain) (let ((face (get-text-property @@ -5936,9 +5204,7 @@ This includes angle, plain, and bracket links." (append `(invisible ,(or (org-link-get-parameter type :display) 'org-link)) - properties)) - (visible-start (or (match-beginning 4) (match-beginning 2))) - (visible-end (or (match-end 4) (match-end 2)))) + properties))) (add-text-properties start visible-start hidden) (add-text-properties visible-start visible-end properties) (add-text-properties visible-end end hidden) @@ -5985,60 +5251,84 @@ by a #." "Fontify #+ lines and blocks." (let ((case-fold-search t)) (when (re-search-forward - "^\\([ \t]*#\\(\\(\\+[a-zA-Z]+:?\\| \\|$\\)\\(_\\([a-zA-Z]+\\)\\)?\\)[ \t]*\\(\\([^ \t\n]*\\)[ \t]*\\(.*\\)\\)\\)" + (rx bol (group (zero-or-more blank) "#" + (group (group (or (seq "+" (one-or-more (any "a-zA-Z")) (optional ":")) + space + eol)) + (optional (group "_" (group (one-or-more (any "a-zA-Z")))))) + (zero-or-more blank) + (group (group (zero-or-more (not (any " \t\n")))) + (zero-or-more blank) + (group (zero-or-more any))))) limit t) (let ((beg (match-beginning 0)) - (block-start (match-end 0)) - (block-end nil) - (lang (match-string 7)) - (beg1 (line-beginning-position 2)) + (end-of-beginline (match-end 0)) + (block-start (match-end 0)) ; includes the \n at end of #+begin line + (block-end nil) ; will include \n after end of block content + (lang (match-string 7)) ; the language, if it is an src block + (bol-after-beginline (line-beginning-position 2)) (dc1 (downcase (match-string 2))) (dc3 (downcase (match-string 3))) - end end1 quoting block-type) + (whole-blockline org-fontify-whole-block-delimiter-line) + beg-of-endline end-of-endline nl-before-endline quoting block-type) (cond ((and (match-end 4) (equal dc3 "+begin")) ;; Truly a block (setq block-type (downcase (match-string 5)) - quoting (member block-type org-protecting-blocks)) + quoting (member block-type org-protecting-blocks)) ; src, example, export, maybe more (when (re-search-forward - (concat "^[ \t]*#\\+end" (match-string 4) "\\>.*") + (rx-to-string `(group bol (or (seq (one-or-more "*") space) + (seq (zero-or-more blank) + "#+end" + ,(match-string 4) + word-end + (zero-or-more any))))) nil t) ;; on purpose, we look further than LIMIT - (setq end (min (point-max) (match-end 0)) - end1 (min (point-max) (1- (match-beginning 0)))) - (setq block-end (match-beginning 0)) + ;; We do have a matching #+end line + (setq beg-of-endline (match-beginning 0) + end-of-endline (match-end 0) + nl-before-endline (1- (match-beginning 0))) + (setq block-end (match-beginning 0)) ; includes the final newline. (when quoting - (org-remove-flyspell-overlays-in beg1 end1) - (remove-text-properties beg end + (org-remove-flyspell-overlays-in bol-after-beginline nl-before-endline) + (remove-text-properties beg end-of-endline '(display t invisible t intangible t))) (add-text-properties - beg end '(font-lock-fontified t font-lock-multiline t)) - (add-text-properties beg beg1 '(face org-meta-line)) - (org-remove-flyspell-overlays-in beg beg1) - (add-text-properties ; For end_src - end1 (min (point-max) (1+ end)) '(face org-meta-line)) - (org-remove-flyspell-overlays-in end1 end) + beg end-of-endline '(font-lock-fontified t font-lock-multiline t)) + (org-remove-flyspell-overlays-in beg bol-after-beginline) + (org-remove-flyspell-overlays-in nl-before-endline end-of-endline) (cond ((and lang (not (string= lang "")) org-src-fontify-natively) (org-src-font-lock-fontify-block lang block-start block-end) - (add-text-properties beg1 block-end '(src-block t))) + (add-text-properties bol-after-beginline block-end '(src-block t))) (quoting - (add-text-properties beg1 (min (point-max) (1+ end1)) - (list 'face - (list :inherit - (let ((face-name - (intern (format "org-block-%s" lang)))) - (append (and (facep face-name) (list face-name)) - '(org-block))))))) ; end of source block + (add-text-properties + bol-after-beginline beg-of-endline + (list 'face + (list :inherit + (let ((face-name + (intern (format "org-block-%s" lang)))) + (append (and (facep face-name) (list face-name)) + '(org-block))))))) ((not org-fontify-quote-and-verse-blocks)) ((string= block-type "quote") (add-face-text-property - beg1 (min (point-max) (1+ end1)) 'org-quote t)) + bol-after-beginline beg-of-endline 'org-quote t)) ((string= block-type "verse") (add-face-text-property - beg1 (min (point-max) (1+ end1)) 'org-verse t))) - (add-text-properties beg beg1 '(face org-block-begin-line)) - (add-text-properties (min (point-max) (1+ end)) (min (point-max) (1+ end1)) - '(face org-block-end-line)) + bol-after-beginline beg-of-endline 'org-verse t))) + ;; Fontify the #+begin and #+end lines of the blocks + (add-text-properties + beg (if whole-blockline bol-after-beginline end-of-beginline) + '(face org-block-begin-line)) + (unless (string-prefix-p "*" (match-string 1)) + (add-text-properties + beg-of-endline + (if whole-blockline + (let ((beg-of-next-line (1+ end-of-endline))) + (min (point-max) beg-of-next-line)) + (min (point-max) end-of-endline)) + '(face org-block-end-line))) t)) ((member dc1 '("+title:" "+author:" "+email:" "+date:")) (org-remove-flyspell-overlays-in @@ -6061,13 +5351,18 @@ by a #." ;; Handle short captions. (save-excursion (beginning-of-line) - (looking-at "\\([ \t]*#\\+caption\\(?:\\[.*\\]\\)?:\\)[ \t]*")) + (looking-at (rx (group (zero-or-more blank) + "#+caption" + (optional "[" (zero-or-more any) "]") + ":") + (zero-or-more blank)))) (add-text-properties (line-beginning-position) (match-end 1) '(font-lock-fontified t face org-meta-line)) (add-text-properties (match-end 0) (line-end-position) '(font-lock-fontified t face org-block)) t) ((member dc3 '(" " "")) + ; Just a comment, the plus was not there (org-remove-flyspell-overlays-in beg (match-end 0)) (add-text-properties beg (match-end 0) @@ -6084,9 +5379,10 @@ by a #." "Fontify drawers." (when (re-search-forward org-drawer-regexp limit t) (add-text-properties - (match-beginning 0) (match-end 0) - '(font-lock-fontified t face org-special-keyword)) - (org-remove-flyspell-overlays-in (match-beginning 0) (match-end 0)) + (line-beginning-position) (line-beginning-position 2) + '(font-lock-fontified t face org-drawer)) + (org-remove-flyspell-overlays-in + (line-beginning-position) (line-beginning-position 2)) t)) (defun org-fontify-macros (limit) @@ -6107,6 +5403,24 @@ by a #." (add-text-properties closing-start end '(invisible t))) t))))) +(defun org-fontify-extend-region (beg end _old-len) + (let ((begin-re "\\(\\\\\\[\\|\\(#\\+begin_\\|\\\\begin{\\)\\S-+\\)") + (end-re "\\(\\\\\\]\\|\\(#\\+end_\\|\\\\end{\\)\\S-+\\)") + (extend (lambda (r1 r2 dir) + (let ((re (replace-regexp-in-string "\\(begin\\|end\\)" r1 + (replace-regexp-in-string "[][]" r2 + (match-string-no-properties 0))))) + (re-search-forward (regexp-quote re) nil t dir))))) + (save-match-data + (save-excursion + (goto-char beg) + (back-to-indentation) + (cond ((looking-at end-re) + (cons (or (funcall extend "begin" "[" -1) beg) end)) + ((looking-at begin-re) + (cons beg (or (funcall extend "end" "]" 1) end))) + (t (cons beg end))))))) + (defun org-activate-footnote-links (limit) "Add text properties for footnotes." (let ((fn (org-footnote-next-reference-or-definition limit))) @@ -6146,21 +5460,6 @@ by a #." (org-display-custom-time (match-beginning 1) (match-end 1))) t)) -(defvar-local org-target-link-regexp nil - "Regular expression matching radio targets in plain text.") - -(defconst org-target-regexp (let ((border "[^<>\n\r \t]")) - (format "<<\\(%s\\|%s[^<>\n\r]*%s\\)>>" - border border border)) - "Regular expression matching a link target.") - -(defconst org-radio-target-regexp (format "<%s>" org-target-regexp) - "Regular expression matching a radio target.") - -(defconst org-any-target-regexp - (format "%s\\|%s" org-radio-target-regexp org-target-regexp) - "Regular expression matching any target.") - (defun org-activate-target-links (limit) "Add text properties for target matches." (when org-target-link-regexp @@ -6178,59 +5477,6 @@ by a #." (org-rear-nonsticky-at (match-end 1)) t)))) -(defun org-update-radio-target-regexp () - "Find all radio targets in this file and update the regular expression. -Also refresh fontification if needed." - (interactive) - (let ((old-regexp org-target-link-regexp) - ;; Some languages, e.g., Chinese, do not use spaces to - ;; separate words. Also allow to surround radio targets with - ;; line-breakable characters. - (before-re "\\(?:^\\|[^[:alnum:]]\\|\\c|\\)\\(") - (after-re "\\)\\(?:$\\|[^[:alnum:]]\\|\\c|\\)") - (targets - (org-with-wide-buffer - (goto-char (point-min)) - (let (rtn) - (while (re-search-forward org-radio-target-regexp nil t) - ;; Make sure point is really within the object. - (backward-char) - (let ((obj (org-element-context))) - (when (eq (org-element-type obj) 'radio-target) - (cl-pushnew (org-element-property :value obj) rtn - :test #'equal)))) - rtn)))) - (setq org-target-link-regexp - (and targets - (concat before-re - (mapconcat - (lambda (x) - (replace-regexp-in-string - " +" "\\s-+" (regexp-quote x) t t)) - targets - "\\|") - after-re))) - (unless (equal old-regexp org-target-link-regexp) - ;; Clean-up cache. - (let ((regexp (cond ((not old-regexp) org-target-link-regexp) - ((not org-target-link-regexp) old-regexp) - (t - (concat before-re - (mapconcat - (lambda (re) - (substring re (length before-re) - (- (length after-re)))) - (list old-regexp org-target-link-regexp) - "\\|") - after-re))))) - (org-with-wide-buffer - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (org-element-cache-refresh (match-beginning 1))))) - ;; Re fontify buffer. - (when (memq 'radio org-highlight-links) - (org-restart-font-lock))))) - (defvar org-latex-and-related-regexp nil "Regular expression for highlighting LaTeX, entities and sub/superscript.") @@ -6243,17 +5489,13 @@ Result depends on variable `org-highlight-latex-and-related'." (list org-match-substring-with-braces-regexp)) (org-use-sub-superscripts (list org-match-substring-regexp)))) (re-latex - (when (memq 'latex org-highlight-latex-and-related) - (let* ((matchers (plist-get org-format-latex-options :matchers)) - (regexps (and (member "begin" matchers) - '("\\\\end{[a-zA-Z0-9\\*]+}[ \t]*$")))) - (dolist (matcher matchers) - (pcase (assoc matcher org-latex-regexps) - (`("begin" . ,_) (push "^[ \t]*\\\\begin{[a-zA-Z0-9\\*]+}" - regexps)) - (`(,_ ,regexp . ,_) (push regexp regexps)) - (_ nil))) - (nreverse regexps)))) + (when (or (memq 'latex org-highlight-latex-and-related) + (memq 'native org-highlight-latex-and-related)) + (let ((matchers (plist-get org-format-latex-options :matchers))) + (delq nil + (mapcar (lambda (x) + (and (member (car x) matchers) (nth 1 x))) + org-latex-regexps))))) (re-entities (when (memq 'entities org-highlight-latex-and-related) (list "\\\\\\(there4\\|sup[123]\\|frac[13][24]\\|[a-zA-Z]+\\)\ @@ -6263,46 +5505,31 @@ Result depends on variable `org-highlight-latex-and-related'." (append re-latex re-entities re-sub) "\\|")))) -(defun org-do-latex-and-related (limit) +(defun org-do-latex-and-related (_limit) "Highlight LaTeX snippets and environments, entities and sub/superscript. -LIMIT bounds the search for syntax to highlight. Stop at first -highlighted object, if any. Return t if some highlighting was -done, nil otherwise." +Stop at first highlighted object, if any. Return t if some +highlighting was done, nil otherwise." (when (org-string-nw-p org-latex-and-related-regexp) (catch 'found - (while (re-search-forward org-latex-and-related-regexp limit t) + (while (re-search-forward org-latex-and-related-regexp + nil t) ;; on purpose, we ignore LIMIT (unless (cl-some (lambda (f) (memq f '(org-code org-verbatim underline - org-special-keyword))) + org-special-keyword))) (save-excursion (goto-char (1+ (match-beginning 0))) (face-at-point nil t))) - (let* ((start (if (memq (char-after (1+ (match-beginning 0))) - '(?_ ?^)) - (1+ (match-beginning 0)) - (match-beginning 0))) - (end - (let* ((b (match-beginning 0)) - (e (match-end 0)) - (m (buffer-substring-no-properties b e))) - (cond - ((string-match "\\`[ \t]*\\\\begin{\\([a-zA-Z0-9\\*]+\\)}" - m) - (let ((re (format "\\\\end{%s}[ \t]*$" - (regexp-quote (match-string 1 m))))) - (or (re-search-forward re nil t) e))) - ((string-match "\\\\end{\\([a-zA-Z0-9\\*]+\\)}[ \t]*\\'" m) - (let ((re (format "^[ \t]*\\\\begin{%s}" - (regexp-quote (match-string 1 m))))) - (setq start - (or (save-excursion (re-search-backward re nil t)) - b)) - (line-end-position))) - ((string-match "\\`\\\\[a-zA-Z]+\\*?{\\'" m) - (search-forward "}" nil t)) - (t e))))) - (font-lock-prepend-text-property - start end 'face 'org-latex-and-related) - (add-text-properties start end '(font-lock-multiline t))) + (let* ((offset (if (memq (char-after (1+ (match-beginning 0))) + '(?_ ?^)) + 1 + 0)) + (start (+ offset (match-beginning 0))) + (end (match-end 0))) + (if (memq 'native org-highlight-latex-and-related) + (org-src-font-lock-fontify-block "latex" start end) + (font-lock-prepend-text-property start end + 'face 'org-latex-and-related)) + (add-text-properties (+ offset (match-beginning 0)) (match-end 0) + '(font-lock-multiline t))) (throw 'found t))) nil))) @@ -6409,12 +5636,12 @@ needs to be inserted at a specific position in the font-lock sequence.") '("^[ \t]*| *\\([#*]\\) *|" (1 'org-formula t)) '("^[ \t]*|\\( *\\([$!_^/]\\) *|.*\\)|" (1 'org-formula t)) '("| *\\(<[lrc]?[0-9]*>\\)" (1 'org-formula t)) - ;; Drawers - '(org-fontify-drawers) ;; Properties (list org-property-re '(1 'org-special-keyword t) '(3 'org-property-value t)) + ;; Drawers + '(org-fontify-drawers) ;; Link related fontification. '(org-activate-links) (when (memq 'tag lk) '(org-activate-tags (1 'org-tag prepend))) @@ -6422,7 +5649,8 @@ needs to be inserted at a specific position in the font-lock sequence.") (when (memq 'date lk) '(org-activate-dates (0 'org-date t))) (when (memq 'footnote lk) '(org-activate-footnote-links)) ;; Targets. - (list org-any-target-regexp '(0 'org-target t)) + (list org-radio-target-regexp '(0 'org-target t)) + (list org-target-regexp '(0 'org-target t)) ;; Diary sexps. '("^&?%%(.*\\|<%%([^>\n]*?>" (0 'org-sexp-date t)) ;; Macro @@ -6491,6 +5719,8 @@ needs to be inserted at a specific position in the font-lock sequence.") (setq-local org-font-lock-keywords org-font-lock-extra-keywords) (setq-local font-lock-defaults '(org-font-lock-keywords t nil nil backward-paragraph)) + (setq-local font-lock-extend-after-change-region-function + #'org-fontify-extend-region) (kill-local-variable 'font-lock-keywords) nil)) @@ -6899,28 +6129,33 @@ a list of strings specifying which drawers should not be hidden." ;; `org-drawer-regexp'. (goto-char (org-element-property :end drawer)))))))))) -(defun org-flag-drawer (flag &optional element) +(defun org-flag-drawer (flag &optional element beg end) "When FLAG is non-nil, hide the drawer we are at. -Otherwise make it visible. When optional argument ELEMENT is -a parsed drawer, as returned by `org-element-at-point', hide or -show that drawer instead." - (let ((drawer (or element - (and (save-excursion - (beginning-of-line) - (looking-at-p org-drawer-regexp)) - (org-element-at-point))))) - (when (memq (org-element-type drawer) '(drawer property-drawer)) - (let ((post (org-element-property :post-affiliated drawer))) - (org-flag-region - (save-excursion (goto-char post) (line-end-position)) - (save-excursion (goto-char (org-element-property :end drawer)) - (skip-chars-backward " \t\n") - (line-end-position)) - flag 'org-hide-drawer) - ;; When the drawer is hidden away, make sure point lies in - ;; a visible part of the buffer. - (when (invisible-p (max (1- (point)) (point-min))) - (goto-char post)))))) +Otherwise make it visible. + +When optional argument ELEMENT is a parsed drawer, as returned by +`org-element-at-point', hide or show that drawer instead. + +When buffer positions BEG and END are provided, hide or show that +region as a drawer without further ado." + (if (and beg end) (org-flag-region beg end flag 'org-hide-drawer) + (let ((drawer (or element + (and (save-excursion + (beginning-of-line) + (looking-at-p org-drawer-regexp)) + (org-element-at-point))))) + (when (memq (org-element-type drawer) '(drawer property-drawer)) + (let ((post (org-element-property :post-affiliated drawer))) + (org-flag-region + (save-excursion (goto-char post) (line-end-position)) + (save-excursion (goto-char (org-element-property :end drawer)) + (skip-chars-backward " \t\n") + (line-end-position)) + flag 'org-hide-drawer) + ;; When the drawer is hidden away, make sure point lies in + ;; a visible part of the buffer. + (when (invisible-p (max (1- (point)) (point-min))) + (goto-char post))))))) ;;;; Visibility cycling @@ -7295,11 +6530,11 @@ With a numeric prefix, show all headlines up to that level." (if (not (org-at-property-p)) (outline-next-heading) (save-excursion (org-back-to-heading t) - (outline-hide-subtree) + (org-flag-subtree t) (org-reveal) (pcase state ("folded" - (outline-hide-subtree)) + (org-flag-subtree t)) ("children" (org-show-hidden-entry) (org-show-children)) @@ -8305,7 +7540,7 @@ case." (org-skip-whitespace) (move-marker ins-point nil) (if folded - (outline-hide-subtree) + (org-flag-subtree t) (org-show-entry) (org-show-children)) (org-clean-visibility-after-subtree-move) @@ -8471,7 +7706,7 @@ When REMOVE is non-nil, remove the subtree from the clipboard." (equal org-subtree-clip (current-kill 0)) org-subtree-clip-folded) ;; The tree was folded before it was killed/copied - (outline-hide-subtree)) + (org-flag-subtree t)) (when for-yank (goto-char newend)) (when remove (pop kill-ring))))) @@ -8613,7 +7848,7 @@ with the original repeater." ""))) ;No time shift (doshift (and (org-string-nw-p shift) - (or (string-match "\\`[ \t]*\\+?\\([0-9]+\\)\\([dwmy]\\)[ \t]*\\'" + (or (string-match "\\`[ \t]*\\([+-]?[0-9]+\\)\\([dwmy]\\)[ \t]*\\'" shift) (user-error "Invalid shift specification %s" shift))))) (goto-char end-of-tree) @@ -8631,7 +7866,7 @@ with the original repeater." (nmin 1) (nmax n) (n-no-remove -1) - (idprop (org-entry-get nil "ID"))) + (idprop (org-entry-get beg "ID"))) (when (and doshift (string-match-p "<[^<>\n]+ [.+]?\\+[0-9]+[hdwmy][^<>\n]*>" template)) @@ -8927,6 +8162,7 @@ function is being called interactively." "(empty for default `sort-subr' predicate): ") 'allow-empty)))) ((member dcst '(?p ?t ?s ?d ?c ?k)) '<)))) + (org-cycle-hide-drawers 'all) (when restore-clock? (move-marker org-clock-marker (1+ (next-single-property-change @@ -9149,933 +8385,224 @@ sub-tree if optional argument INHERIT is non-nil." '((effort . identity) (effort-minutes . org-duration-to-minutes)))) -;;;; Link Stuff - -;;; Link abbreviations - -(defun org-link-expand-abbrev (link) - "Apply replacements as defined in `org-link-abbrev-alist'." - (if (string-match "^\\([^:]*\\)\\(::?\\(.*\\)\\)?$" link) - (let* ((key (match-string 1 link)) - (as (or (assoc key org-link-abbrev-alist-local) - (assoc key org-link-abbrev-alist))) - (tag (and (match-end 2) (match-string 3 link))) - rpl) - (if (not as) - link - (setq rpl (cdr as)) - (cond - ((symbolp rpl) (funcall rpl tag)) - ((string-match "%(\\([^)]+\\))" rpl) - (replace-match - (save-match-data - (funcall (intern-soft (match-string 1 rpl)) tag)) t t rpl)) - ((string-match "%s" rpl) (replace-match (or tag "") t t rpl)) - ((string-match "%h" rpl) - (replace-match (url-hexify-string (or tag "")) t t rpl)) - (t (concat rpl tag))))) - link)) - -;;; Storing and inserting links - -(defvar org-insert-link-history nil - "Minibuffer history for links inserted with `org-insert-link'.") - -(defvar org-stored-links nil - "Contains the links stored with `org-store-link'.") - -(defvar org-store-link-plist nil - "Plist with info about the most recently link created with `org-store-link'.") - -(defun org-store-link-functions () - "Return a list of functions that are called to create and store a link. - -The functions are defined in the `:store' property of -`org-link-parameters'. - -Each function is called in turn until one returns a non-nil -value. Each function should check if it is responsible for -creating this link (for example by looking at the major mode). -If not, it must exit and return nil. If yes, it should return -a non-nil value after calling `org-store-link-props' with a list -of properties and values. Special properties are: - -:type The link prefix, like \"http\". This must be given. -:link The link, like \"http://www.astro.uva.nl/~dominik\". - This is obligatory as well. -:description Optional default description for the second pair - of brackets in an Org mode link. The user can still change - this when inserting this link into an Org mode buffer. - -In addition to these, any additional properties can be specified -and then used in capture templates." - (cl-loop for link in org-link-parameters - with store-func - do (setq store-func (org-link-get-parameter (car link) :store)) - if store-func - collect store-func)) - -(defvar org-agenda-buffer-name) ; Defined in org-agenda.el -(defvar org-id-link-to-org-use-id) ; Defined in org-id.el +(defun org-find-file-at-mouse (ev) + "Open file link or URL at mouse." + (interactive "e") + (mouse-set-point ev) + (org-open-at-point 'in-emacs)) -;;;###autoload -(defun org-store-link (arg &optional interactive?) - "Store a link to the current location. -\\ -This link is added to `org-stored-links' and can later be inserted -into an Org buffer with `org-insert-link' (`\\[org-insert-link]'). +(defun org-open-at-mouse (ev) + "Open file link or URL at mouse. +See the docstring of `org-open-file' for details." + (interactive "e") + (mouse-set-point ev) + (when (eq major-mode 'org-agenda-mode) + (org-agenda-copy-local-variable 'org-link-abbrev-alist-local)) + (org-open-at-point)) -For some link types, a `\\[universal-argument]' prefix ARG is interpreted. \ -A single -`\\[universal-argument]' negates `org-context-in-file-links' for file links or -`org-gnus-prefer-web-links' for links to Usenet articles. +(defvar org-window-config-before-follow-link nil + "The window configuration before following a link. +This is saved in case the need arises to restore it.") -A `\\[universal-argument] \\[universal-argument]' prefix ARG forces \ -skipping storing functions that are not -part of Org core. +(defun org--file-default-apps () + "Return the default applications for this operating system." + (pcase system-type + (`darwin org-file-apps-macos) + (`windows-nt org-file-apps-windowsnt) + (_ org-file-apps-gnu))) -A `\\[universal-argument] \\[universal-argument] \\[universal-argument]' \ -prefix ARG forces storing a link for each line in the -active region. +(defun org--file-apps-entry-dlink-p (entry) + "Non-nil if ENTRY should be matched against the link by `org-open-file'. -Assume the function is called interactively if INTERACTIVE? is -non-nil." - (interactive "P\np") - (org-load-modules-maybe) - (if (and (equal arg '(64)) (org-region-active-p)) - (save-excursion - (let ((end (region-end))) - (goto-char (region-beginning)) - (set-mark (point)) - (while (< (point-at-eol) end) - (move-end-of-line 1) (activate-mark) - (let (current-prefix-arg) - (call-interactively 'org-store-link)) - (move-beginning-of-line 2) - (set-mark (point))))) - (setq org-store-link-plist nil) - (let (link cpltxt desc description search txt custom-id agenda-link) - (cond - ;; Store a link using an external link type, if any function is - ;; available. If more than one can generate a link from current - ;; location, ask which one to use. - ((and (not (equal arg '(16))) - (let ((results-alist nil)) - (dolist (f (org-store-link-functions)) - (when (funcall f) - ;; XXX: return value is not link's plist, so we - ;; store the new value before it is modified. It - ;; would be cleaner to ask store link functions to - ;; return the plist instead. - (push (cons f (copy-sequence org-store-link-plist)) - results-alist))) - (pcase results-alist - (`nil nil) - (`((,_ . ,_)) t) ;single choice: nothing to do - (`((,name . ,_) . ,_) - ;; Reinstate link plist associated to the chosen - ;; function. - (apply #'org-store-link-props - (cdr (assoc-string - (completing-read - "Which function for creating the link? " - (mapcar #'car results-alist) - nil t (symbol-name name)) - results-alist))) - t)))) - (setq link (plist-get org-store-link-plist :link)) - (setq desc (or (plist-get org-store-link-plist :description) - link))) - - ;; Store a link from a remote editing buffer. - ((org-src-edit-buffer-p) - (let ((coderef-format (org-src-coderef-format)) - (format-link - (lambda (label) - (if org-src-source-file-name - (format "file:%s::(%s)" org-src-source-file-name label) - (format "(%s)" label))))) - (cond - ;; Code references do not exist in this type of buffer. - ;; Pretend we're linking from the source buffer directly. - ((not (memq (org-src-source-type) '(example-block src-block))) - (with-current-buffer (org-src-source-buffer) - (org-store-link arg interactive?)) - (setq link nil)) - ;; A code reference exists. Use it. - ((save-excursion - (beginning-of-line) - (re-search-forward (org-src-coderef-regexp coderef-format) - (line-end-position) - t)) - (setq link (funcall format-link (match-string-no-properties 3)))) - ;; No code reference. Create a new one then store the link - ;; to it, but only in the function is called interactively. - (interactive? - (end-of-line) - (let* ((label (read-string "Code line label: ")) - (reference (format coderef-format label)) - (gc (- 79 (length reference)))) - (if (< (current-column) gc) - (org-move-to-column gc t) - (insert " ")) - (insert reference) - (setq link (funcall format-link label)))) - ;; No code reference, and non-interactive call. Don't know - ;; what to do. Give up. - (t (setq link nil))))) - - ;; We are in the agenda, link to referenced location - ((equal (bound-and-true-p org-agenda-buffer-name) (buffer-name)) - (let ((m (or (get-text-property (point) 'org-hd-marker) - (get-text-property (point) 'org-marker)))) - (when m - (org-with-point-at m - (setq agenda-link (org-store-link nil interactive?)))))) - - ((eq major-mode 'calendar-mode) - (let ((cd (calendar-cursor-to-date))) - (setq link - (format-time-string - (car org-time-stamp-formats) - (encode-time 0 0 0 (nth 1 cd) (nth 0 cd) (nth 2 cd)))) - (org-store-link-props :type "calendar" :date cd))) - - ((eq major-mode 'help-mode) - (setq link (concat "help:" (save-excursion - (goto-char (point-min)) - (looking-at "^[^ ]+") - (match-string 0)))) - (org-store-link-props :type "help")) - - ((eq major-mode 'w3-mode) - (setq cpltxt (if (and (buffer-name) - (not (string-match "Untitled" (buffer-name)))) - (buffer-name) - (url-view-url t)) - link (url-view-url t)) - (org-store-link-props :type "w3" :url (url-view-url t))) - - ((eq major-mode 'image-mode) - (setq cpltxt (concat "file:" - (abbreviate-file-name buffer-file-name)) - link cpltxt) - (org-store-link-props :type "image" :file buffer-file-name)) - - ;; In dired, store a link to the file of the current line - ((derived-mode-p 'dired-mode) - (let ((file (dired-get-filename nil t))) - (setq file (if file - (abbreviate-file-name - (expand-file-name (dired-get-filename nil t))) - ;; otherwise, no file so use current directory. - default-directory)) - (setq cpltxt (concat "file:" file) - link cpltxt))) - - ((setq search (run-hook-with-args-until-success - 'org-create-file-search-functions)) - (setq link (concat "file:" (abbreviate-file-name buffer-file-name) - "::" search)) - (setq cpltxt (or description link))) - - ((and (buffer-file-name (buffer-base-buffer)) (derived-mode-p 'org-mode)) - (org-with-limited-levels - (setq custom-id (org-entry-get nil "CUSTOM_ID")) - (cond - ;; Store a link using the target at point - ((org-in-regexp "[^<]<<\\([^<>]+\\)>>[^>]" 1) - (setq cpltxt - (concat "file:" - (abbreviate-file-name - (buffer-file-name (buffer-base-buffer))) - "::" (match-string 1)) - link cpltxt)) - ((and (featurep 'org-id) - (or (eq org-id-link-to-org-use-id t) - (and interactive? - (or (eq org-id-link-to-org-use-id 'create-if-interactive) - (and (eq org-id-link-to-org-use-id - 'create-if-interactive-and-no-custom-id) - (not custom-id)))) - (and org-id-link-to-org-use-id (org-entry-get nil "ID")))) - ;; Store a link using the ID at point - (setq link (condition-case nil - (prog1 (org-id-store-link) - (setq desc (or (plist-get org-store-link-plist - :description) - ""))) - (error - ;; Probably before first headline, link only to file - (concat "file:" - (abbreviate-file-name - (buffer-file-name (buffer-base-buffer)))))))) - (t - ;; Just link to current headline - (setq cpltxt (concat "file:" - (abbreviate-file-name - (buffer-file-name (buffer-base-buffer))))) - ;; Add a context search string - (when (org-xor org-context-in-file-links - (equal arg '(4))) - (let* ((element (org-element-at-point)) - (name (org-element-property :name element))) - (setq txt (cond - ((org-at-heading-p) nil) - (name) - ((org-region-active-p) - (buffer-substring (region-beginning) (region-end))))) - (when (or (null txt) (string-match "\\S-" txt)) - (setq cpltxt - (concat cpltxt "::" - (condition-case nil - (org-make-org-heading-search-string txt) - (error ""))) - desc (or name - (nth 4 (ignore-errors (org-heading-components))) - "NONE"))))) - (when (string-match "::\\'" cpltxt) - (setq cpltxt (substring cpltxt 0 -2))) - (setq link cpltxt))))) - - ((buffer-file-name (buffer-base-buffer)) - ;; Just link to this file here. - (setq cpltxt (concat "file:" - (abbreviate-file-name - (buffer-file-name (buffer-base-buffer))))) - ;; Add a context string. - (when (org-xor org-context-in-file-links - (equal arg '(4))) - (setq txt (if (org-region-active-p) - (buffer-substring (region-beginning) (region-end)) - (buffer-substring (point-at-bol) (point-at-eol)))) - ;; Only use search option if there is some text. - (when (string-match "\\S-" txt) - (setq cpltxt - (concat cpltxt "::" (org-make-org-heading-search-string txt)) - desc "NONE"))) - (setq link cpltxt)) - - (interactive? - (user-error "No method for storing a link from this buffer")) - - (t (setq link nil))) - - ;; We're done setting link and desc, clean up - (when (consp link) (setq cpltxt (car link) link (cdr link))) - (setq link (or link cpltxt) - desc (or desc cpltxt)) - (cond ((not desc)) - ((equal desc "NONE") (setq desc nil)) - (t (setq desc - (replace-regexp-in-string - org-bracket-link-analytic-regexp - (lambda (m) (or (match-string 5 m) (match-string 3 m))) - desc)))) - ;; Return the link - (if (not (and interactive? link)) - (or agenda-link (and link (org-make-link-string link desc))) - (push (list link desc) org-stored-links) - (message "Stored: %s" (or desc link)) - (when custom-id - (setq link (concat "file:" (abbreviate-file-name - (buffer-file-name)) "::#" custom-id)) - (push (list link desc) org-stored-links)) - (car org-stored-links))))) - -(defun org-store-link-props (&rest plist) - "Store link properties. -The properties are pre-processed by extracting names, addresses -and dates." - (let ((x (plist-get plist :from))) - (when x - (let ((adr (mail-extract-address-components x))) - (setq plist (plist-put plist :fromname (car adr))) - (setq plist (plist-put plist :fromaddress (nth 1 adr)))))) - (let ((x (plist-get plist :to))) - (when x - (let ((adr (mail-extract-address-components x))) - (setq plist (plist-put plist :toname (car adr))) - (setq plist (plist-put plist :toaddress (nth 1 adr)))))) - (let ((x (ignore-errors (date-to-time (plist-get plist :date))))) - (when x - (setq plist (plist-put plist :date-timestamp - (format-time-string - (org-time-stamp-format t) x))) - (setq plist (plist-put plist :date-timestamp-inactive - (format-time-string - (org-time-stamp-format t t) x))))) - (let ((from (plist-get plist :from)) - (to (plist-get plist :to))) - (when (and from to org-from-is-user-regexp) - (setq plist - (plist-put plist :fromto - (if (string-match org-from-is-user-regexp from) - (concat "to %t") - (concat "from %f")))))) - (setq org-store-link-plist plist)) - -(defun org-add-link-props (&rest plist) - "Add these properties to the link property list." - (let (key value) - (while plist - (setq key (pop plist) value (pop plist)) - (setq org-store-link-plist - (plist-put org-store-link-plist key value))))) - -(defun org-email-link-description (&optional fmt) - "Return the description part of an email link. -This takes information from `org-store-link-plist' and formats it -according to FMT (default from `org-email-link-description-format')." - (setq fmt (or fmt org-email-link-description-format)) - (let* ((p org-store-link-plist) - (to (plist-get p :toaddress)) - (from (plist-get p :fromaddress)) - (table - (list - (cons "%c" (plist-get p :fromto)) - (cons "%F" (plist-get p :from)) - (cons "%f" (or (plist-get p :fromname) (plist-get p :fromaddress) "?")) - (cons "%T" (plist-get p :to)) - (cons "%t" (or (plist-get p :toname) (plist-get p :toaddress) "?")) - (cons "%s" (plist-get p :subject)) - (cons "%d" (plist-get p :date)) - (cons "%m" (plist-get p :message-id))))) - (when (string-match "%c" fmt) - ;; Check if the user wrote this message - (if (and org-from-is-user-regexp from to - (save-match-data (string-match org-from-is-user-regexp from))) - (setq fmt (replace-match "to %t" t t fmt)) - (setq fmt (replace-match "from %f" t t fmt)))) - (org-replace-escapes fmt table))) - -(defun org-make-org-heading-search-string (&optional string) - "Make search string for the current headline or STRING." - (let ((s (or string - (and (derived-mode-p 'org-mode) - (save-excursion - (org-back-to-heading t) - (org-element-property :raw-value (org-element-at-point)))))) - (lines org-context-in-file-links)) - (unless string (setq s (concat "*" s))) ;Add * for headlines - (setq s (replace-regexp-in-string "\\[[0-9]+%\\]\\|\\[[0-9]+/[0-9]+\\]" "" s)) - (when (and string (integerp lines) (> lines 0)) - (let ((slines (org-split-string s "\n"))) - (when (< lines (length slines)) - (setq s (mapconcat - 'identity - (reverse (nthcdr (- (length slines) lines) - (reverse slines))) "\n"))))) - (mapconcat #'identity (split-string s) " "))) - -(defconst org-link-escape-chars - ;;%20 %5B %5D %25 - '(?\s ?\[ ?\] ?%) - "List of characters that should be escaped in a link when stored to Org. -This is the list that is used for internal purposes.") - -(defun org-make-link-string (link &optional description) - "Make a link with brackets, consisting of LINK and DESCRIPTION." - (unless (org-string-nw-p link) (error "Empty link")) - (let ((uri (cond ((string-match org-link-types-re link) - (concat (match-string 1 link) - (org-link-escape (substring link (match-end 1))))) - ((or (file-name-absolute-p link) - (string-match-p "\\`\\.\\.?/" link)) - (org-link-escape link)) - ;; For readability, do not encode space characters - ;; in fuzzy links. - (t (org-link-escape link (remq ?\s org-link-escape-chars))))) - (description - (and (org-string-nw-p description) - ;; Remove brackets from description, as they are fatal. - (replace-regexp-in-string - "[][]" (lambda (m) (if (equal "[" m) "{" "}")) - (org-trim description))))) - (format "[[%s]%s]" - uri - (if description (format "[%s]" description) "")))) - -(defun org-link-escape (text &optional table merge) - "Return percent escaped representation of TEXT. -TEXT is a string with the text to escape. -Optional argument TABLE is a list with characters that should be -escaped. When nil, `org-link-escape-chars' is used. -If optional argument MERGE is set, merge TABLE into -`org-link-escape-chars'." - (let ((characters-to-encode - (cond ((null table) org-link-escape-chars) - (merge (append org-link-escape-chars table)) - (t table)))) - (mapconcat - (lambda (c) - (if (or (memq c characters-to-encode) - (and org-url-hexify-p (or (< c 32) (> c 126)))) - (mapconcat (lambda (e) (format "%%%.2X" e)) - (or (encode-coding-char c 'utf-8) - (error "Unable to percent escape character: %c" c)) - "") - (char-to-string c))) - text ""))) - -(defun org-link-unescape (str) - "Unhex hexified Unicode parts in string STR. -E.g. `%C3%B6' becomes the german o-Umlaut. This is the -reciprocal of `org-link-escape', which see." - (if (org-string-nw-p str) - (replace-regexp-in-string - "\\(%[0-9A-Za-z]\\{2\\}\\)+" #'org-link-unescape-compound str t t) - str)) - -(defun org-link-unescape-compound (hex) - "Unhexify Unicode hex-chars. E.g. `%C3%B6' is the German o-Umlaut. -Note: this function also decodes single byte encodings like -`%E1' (a-acute) if not followed by another `%[A-F0-9]{2}' group." - (save-match-data - (let* ((bytes (cdr (split-string hex "%"))) - (ret "") - (eat 0) - (sum 0)) - (while bytes - (let* ((val (string-to-number (pop bytes) 16)) - (shift-xor - (if (= 0 eat) - (cond - ((>= val 252) (cons 6 252)) - ((>= val 248) (cons 5 248)) - ((>= val 240) (cons 4 240)) - ((>= val 224) (cons 3 224)) - ((>= val 192) (cons 2 192)) - (t (cons 0 0))) - (cons 6 128)))) - (when (>= val 192) (setq eat (car shift-xor))) - (setq val (logxor val (cdr shift-xor))) - (setq sum (+ (ash sum (car shift-xor)) val)) - (when (> eat 0) (setq eat (- eat 1))) - (cond - ((= 0 eat) ;multi byte - (setq ret (concat ret (char-to-string sum))) - (setq sum 0)) - ((not bytes) ; single byte(s) - (setq ret (org-link-unescape-single-byte-sequence hex)))))) - ret))) - -(defun org-link-unescape-single-byte-sequence (hex) - "Unhexify hex-encoded single byte character sequences." - (mapconcat (lambda (byte) - (char-to-string (string-to-number byte 16))) - (cdr (split-string hex "%")) "")) - -(defun org-fixup-message-id-for-http (s) - "Replace special characters in a message id, so it can be used in an http query." - (when (string-match "%" s) - (setq s (mapconcat (lambda (c) - (if (eq c ?%) - "%25" - (char-to-string c))) - s ""))) - (while (string-match "<" s) - (setq s (replace-match "%3C" t t s))) - (while (string-match ">" s) - (setq s (replace-match "%3E" t t s))) - (while (string-match "@" s) - (setq s (replace-match "%40" t t s))) - s) +It assumes that is the case when the entry uses a regular +expression which has at least one grouping construct and the +action is either a Lisp form or a command string containing +\"%1\", i.e., using at least one subexpression match as +a parameter." + (pcase entry + (`(,selector . ,action) + (and (stringp selector) + (> (regexp-opt-depth selector) 0) + (or (and (stringp action) + (string-match "%[0-9]" action)) + (consp action)))) + (_ nil))) -(defun org-link-prettify (link) - "Return a human-readable representation of LINK. -The car of LINK must be a raw link. -The cdr of LINK must be either a link description or nil." - (let ((desc (or (cadr link) ""))) - (concat (format "%-45s" (substring desc 0 (min (length desc) 40))) - "<" (car link) ">"))) +(defun org--file-apps-regexp-alist (list &optional add-auto-mode) + "Convert extensions to regular expressions in the cars of LIST. + +Also, weed out any non-string entries, because the return value +is used only for regexp matching. + +When ADD-AUTO-MODE is non-nil, make all matches in `auto-mode-alist' +point to the symbol `emacs', indicating that the file should be +opened in Emacs." + (append + (delq nil + (mapcar (lambda (x) + (unless (not (stringp (car x))) + (if (string-match "\\W" (car x)) + x + (cons (concat "\\." (car x) "\\'") (cdr x))))) + list)) + (when add-auto-mode + (mapcar (lambda (x) (cons (car x) 'emacs)) auto-mode-alist)))) ;;;###autoload -(defun org-insert-link-global () - "Insert a link like Org mode does. -This command can be called in any mode to insert a link in Org syntax." - (interactive) - (org-load-modules-maybe) - (org-run-like-in-org-mode 'org-insert-link)) - -(defun org-insert-all-links (arg &optional pre post) - "Insert all links in `org-stored-links'. -When a universal prefix, do not delete the links from `org-stored-links'. -When `ARG' is a number, insert the last N link(s). -`PRE' and `POST' are optional arguments to define a string to -prepend or to append." - (interactive "P") - (let ((org-keep-stored-link-after-insertion (equal arg '(4))) - (links (copy-sequence org-stored-links)) - (pr (or pre "- ")) - (po (or post "\n")) - (cnt 1) l) - (if (null org-stored-links) - (message "No link to insert") - (while (and (or (listp arg) (>= arg cnt)) - (setq l (if (listp arg) - (pop links) - (pop org-stored-links)))) - (setq cnt (1+ cnt)) - (insert pr) - (org-insert-link nil (car l) (or (cadr l) "")) - (insert po))))) - -(defun org-insert-last-stored-link (arg) - "Insert the last link stored in `org-stored-links'." - (interactive "p") - (org-insert-all-links arg "" "\n")) - -(defun org-link-fontify-links-to-this-file () - "Fontify links to the current file in `org-stored-links'." - (let ((f (buffer-file-name)) a b) - (setq a (mapcar (lambda(l) - (let ((ll (car l))) - (when (and (string-match "^file:\\(.+\\)::" ll) - (equal f (expand-file-name (match-string 1 ll)))) - ll))) - org-stored-links)) - (when (featurep 'org-id) - (setq b (mapcar (lambda(l) - (let ((ll (car l))) - (when (and (string-match "^id:\\(.+\\)$" ll) - (equal f (expand-file-name - (or (org-id-find-id-file - (match-string 1 ll)) "")))) - ll))) - org-stored-links))) - (mapcar (lambda(l) - (put-text-property 0 (length l) 'face 'font-lock-comment-face l)) - (delq nil (append a b))))) - -(defvar org--links-history nil) -(defun org-insert-link (&optional complete-file link-location default-description) - "Insert a link. At the prompt, enter the link. - -Completion can be used to insert any of the link protocol prefixes in use. - -The history can be used to select a link previously stored with -`org-store-link'. When the empty string is entered (i.e. if you just -press `RET' at the prompt), the link defaults to the most recently -stored link. As `SPC' triggers completion in the minibuffer, you need to -use `M-SPC' or `C-q SPC' to force the insertion of a space character. - -You will also be prompted for a description, and if one is given, it will -be displayed in the buffer instead of the link. - -If there is already a link at point, this command will allow you to edit -link and description parts. - -With a `\\[universal-argument]' prefix, prompts for a file to link to. The \ -file name can be -selected using completion. The path to the file will be relative to the -current directory if the file is in the current directory or a subdirectory. -Otherwise, the link will be the absolute path as completed in the minibuffer -\(i.e. normally ~/path/to/file). You can configure this behavior using the -option `org-link-file-path-type'. - -With a `\\[universal-argument] \\[universal-argument]' prefix, enforce an \ -absolute path even if the file is in -the current directory or below. - -A `\\[universal-argument] \\[universal-argument] \\[universal-argument]' \ -prefix negates `org-keep-stored-link-after-insertion'. - -If the LINK-LOCATION parameter is non-nil, this value will be used as -the link location instead of reading one interactively. - -If the DEFAULT-DESCRIPTION parameter is non-nil, this value will -be used as the default description. Otherwise, if -`org-make-link-description-function' is non-nil, this function -will be called with the link target, and the result will be the -default link description. When called non-interactively, don't -allow to edit the default description." - (interactive "P") - (let* ((wcf (current-window-configuration)) - (origbuf (current-buffer)) - (region (when (org-region-active-p) - (buffer-substring (region-beginning) (region-end)))) - (remove (and region (list (region-beginning) (region-end)))) - (desc region) - (link link-location) - (abbrevs org-link-abbrev-alist-local) - entry all-prefixes auto-desc) - (cond - (link-location) ; specified by arg, just use it. - ((org-in-regexp org-bracket-link-regexp 1) - ;; We do have a link at point, and we are going to edit it. - (setq remove (list (match-beginning 0) (match-end 0))) - (setq desc (when (match-end 3) (match-string-no-properties 3))) - (setq link (read-string "Link: " - (org-link-unescape - (match-string-no-properties 1))))) - ((or (org-in-regexp org-angle-link-re) - (org-in-regexp org-plain-link-re)) - ;; Convert to bracket link - (setq remove (list (match-beginning 0) (match-end 0)) - link (read-string "Link: " - (org-unbracket-string "<" ">" (match-string 0))))) - ((member complete-file '((4) (16))) - ;; Completing read for file names. - (setq link (org-file-complete-link complete-file))) - (t - ;; Read link, with completion for stored links. - (org-link-fontify-links-to-this-file) - (org-switch-to-buffer-other-window "*Org Links*") - (with-current-buffer "*Org Links*" - (erase-buffer) - (insert "Insert a link. -Use TAB to complete link prefixes, then RET for type-specific completion support\n") - (when org-stored-links - (insert "\nStored links are available with / or M-p/n (most recent with RET):\n\n") - (insert (mapconcat 'org-link-prettify - (reverse org-stored-links) "\n"))) - (goto-char (point-min))) - (let ((cw (selected-window))) - (select-window (get-buffer-window "*Org Links*" 'visible)) - (with-current-buffer "*Org Links*" (setq truncate-lines t)) - (unless (pos-visible-in-window-p (point-max)) - (org-fit-window-to-buffer)) - (and (window-live-p cw) (select-window cw))) - (setq all-prefixes (append (mapcar 'car abbrevs) - (mapcar 'car org-link-abbrev-alist) - (org-link-types))) - (unwind-protect - ;; Fake a link history, containing the stored links. - (let ((org--links-history - (append (mapcar #'car org-stored-links) - org-insert-link-history))) - (setq link - (org-completing-read - "Link: " - (append - (mapcar (lambda (x) (concat x ":")) all-prefixes) - (mapcar #'car org-stored-links)) - nil nil nil - 'org--links-history - (caar org-stored-links))) - (unless (org-string-nw-p link) (user-error "No link selected")) - (dolist (l org-stored-links) - (when (equal link (cadr l)) - (setq link (car l)) - (setq auto-desc t))) - (when (or (member link all-prefixes) - (and (equal ":" (substring link -1)) - (member (substring link 0 -1) all-prefixes) - (setq link (substring link 0 -1)))) - (setq link (with-current-buffer origbuf - (org-link-try-special-completion link))))) - (set-window-configuration wcf) - (kill-buffer "*Org Links*")) - (setq entry (assoc link org-stored-links)) - (or entry (push link org-insert-link-history)) - (setq desc (or desc (nth 1 entry))))) - - (when (funcall (if (equal complete-file '(64)) 'not 'identity) - (not org-keep-stored-link-after-insertion)) - (setq org-stored-links (delq (assoc link org-stored-links) - org-stored-links))) - - (when (and (string-match org-plain-link-re link) - (not (string-match org-ts-regexp link))) - ;; URL-like link, normalize the use of angular brackets. - (setq link (org-unbracket-string "<" ">" link))) - - ;; Check if we are linking to the current file with a search - ;; option If yes, simplify the link by using only the search - ;; option. - (when (and buffer-file-name - (let ((case-fold-search nil)) - (string-match "\\`file:\\(.+?\\)::" link))) - (let ((path (match-string-no-properties 1 link)) - (search (substring-no-properties link (match-end 0)))) - (save-match-data - (when (equal (file-truename buffer-file-name) (file-truename path)) - ;; We are linking to this same file, with a search option - (setq link search))))) - - ;; Check if we can/should use a relative path. If yes, simplify - ;; the link. - (let ((case-fold-search nil)) - (when (string-match "\\`\\(file\\|docview\\):" link) - (let* ((type (match-string-no-properties 0 link)) - (path-start (match-end 0)) - (search (and (string-match "::\\(.*\\)\\'" link) - (match-string 1 link))) - (path - (if search - (substring-no-properties - link path-start (match-beginning 0)) - (substring-no-properties link (match-end 0)))) - (origpath path)) - (cond - ((or (eq org-link-file-path-type 'absolute) - (equal complete-file '(16))) - (setq path (abbreviate-file-name (expand-file-name path)))) - ((eq org-link-file-path-type 'noabbrev) - (setq path (expand-file-name path))) - ((eq org-link-file-path-type 'relative) - (setq path (file-relative-name path))) - (t - (save-match-data - (if (string-match (concat "^" (regexp-quote - (expand-file-name - (file-name-as-directory - default-directory)))) - (expand-file-name path)) - ;; We are linking a file with relative path name. - (setq path (substring (expand-file-name path) - (match-end 0))) - (setq path (abbreviate-file-name (expand-file-name path))))))) - (setq link (concat type path (and search (concat "::" search)))) - (when (equal desc origpath) - (setq desc path))))) - - (unless auto-desc - (let ((initial-input - (cond - (default-description) - ((not org-make-link-description-function) desc) - (t (condition-case nil - (funcall org-make-link-description-function link desc) - (error - (message "Can't get link description from `%s'" - (symbol-name org-make-link-description-function)) - (sit-for 2) - nil)))))) - (setq desc (if (called-interactively-p 'any) - (read-string "Description: " initial-input) - initial-input)))) - - (unless (org-string-nw-p desc) (setq desc nil)) - (when remove (apply 'delete-region remove)) - (insert (org-make-link-string link desc)) - ;; Redisplay so as the new link has proper invisible characters. - (sit-for 0))) - -(defun org-link-try-special-completion (type) - "If there is completion support for link type TYPE, offer it." - (let ((fun (org-link-get-parameter type :complete))) - (if (functionp fun) - (funcall fun) - (read-string "Link (no completion support): " (concat type ":"))))) - -(defun org-file-complete-link (&optional arg) - "Create a file link using completion." - (let ((file (read-file-name "File: ")) - (pwd (file-name-as-directory (expand-file-name "."))) - (pwd1 (file-name-as-directory (abbreviate-file-name - (expand-file-name "."))))) - (cond ((equal arg '(16)) - (concat "file:" - (abbreviate-file-name (expand-file-name file)))) - ((string-match - (concat "^" (regexp-quote pwd1) "\\(.+\\)") file) - (concat "file:" (match-string 1 file))) - ((string-match - (concat "^" (regexp-quote pwd) "\\(.+\\)") - (expand-file-name file)) - (concat "file:" - (match-string 1 (expand-file-name file)))) - (t (concat "file:" file))))) - - -;;; Opening/following a link - -(defvar org-link-search-failed nil) - -(defvar org-open-link-functions nil - "Hook for functions finding a plain text link. -These functions must take a single argument, the link content. -They will be called for links that look like [[link text][description]] -when LINK TEXT does not have a protocol like \"http:\" and does not look -like a filename (e.g. \"./blue.png\"). - -These functions will be called *before* Org attempts to resolve the -link by doing text searches in the current buffer - so if you want a -link \"[[target]]\" to still find \"<>\", your function should -handle this as a special case. - -When the function does handle the link, it must return a non-nil value. -If it decides that it is not responsible for this link, it must return -nil to indicate that that Org can continue with other options like -exact and fuzzy text search.") - -(defun org-next-link (&optional search-backward) - "Move forward to the next link. -If the link is in hidden text, expose it." - (interactive "P") - (when (and org-link-search-failed (eq this-command last-command)) - (goto-char (point-min)) - (message "Link search wrapped back to beginning of buffer")) - (setq org-link-search-failed nil) - (let* ((pos (point)) - (ct (org-context)) - (a (assq :link ct)) - (srch-fun (if search-backward 're-search-backward 're-search-forward))) - (cond (a (goto-char (nth (if search-backward 1 2) a))) - ((looking-at org-any-link-re) - ;; Don't stay stuck at link without an org-link face - (forward-char (if search-backward -1 1)))) - (if (funcall srch-fun org-any-link-re nil t) - (progn - (goto-char (match-beginning 0)) - (when (org-invisible-p) (org-show-context))) - (goto-char pos) - (setq org-link-search-failed t) - (message "No further link found")))) +(defun org-open-file (path &optional in-emacs line search) + "Open the file at PATH. +First, this expands any special file name abbreviations. Then the +configuration variable `org-file-apps' is checked if it contains an +entry for this file type, and if yes, the corresponding command is launched. -(defun org-previous-link () - "Move backward to the previous link. -If the link is in hidden text, expose it." - (interactive) - (org-next-link t)) +If no application is found, Emacs simply visits the file. -(defun org-translate-link (s) - "Translate a link string if a translation function has been defined." - (with-temp-buffer - (insert (org-trim s)) - (org-trim (org-element-interpret-data (org-element-context))))) +With optional prefix argument IN-EMACS, Emacs will visit the file. +With a double \\[universal-argument] \\[universal-argument] \ +prefix arg, Org tries to avoid opening in Emacs +and to use an external application to visit the file. -(defun org-translate-link-from-planner (type path) - "Translate a link from Emacs Planner syntax so that Org can follow it. -This is still an experimental function, your mileage may vary." - (cond - ((member type '("http" "https" "news" "ftp")) - ;; standard Internet links are the same. - nil) - ((and (equal type "irc") (string-match "^//" path)) - ;; Planner has two / at the beginning of an irc link, we have 1. - ;; We should have zero, actually.... - (setq path (substring path 1))) - ((and (equal type "lisp") (string-match "^/" path)) - ;; Planner has a slash, we do not. - (setq type "elisp" path (substring path 1))) - ((string-match "^//\\(.*\\)/\\(<.*>\\)$" path) - ;; A typical message link. Planner has the id after the final slash, - ;; we separate it with a hash mark - (setq path (concat (match-string 1 path) "#" - (org-unbracket-string "<" ">" (match-string 2 path)))))) - (cons type path)) +Optional LINE specifies a line to go to, optional SEARCH a string +to search for. If LINE or SEARCH is given, the file will be +opened in Emacs, unless an entry from `org-file-apps' that makes +use of groups in a regexp matches. -(defun org-find-file-at-mouse (ev) - "Open file link or URL at mouse." - (interactive "e") - (mouse-set-point ev) - (org-open-at-point 'in-emacs)) +If you want to change the way frames are used when following a +link, please customize `org-link-frame-setup'. -(defun org-open-at-mouse (ev) - "Open file link or URL at mouse. -See the docstring of `org-open-file' for details." - (interactive "e") - (mouse-set-point ev) - (when (eq major-mode 'org-agenda-mode) - (org-agenda-copy-local-variable 'org-link-abbrev-alist-local)) - (org-open-at-point)) +If the file does not exist, throw an error." + (let* ((file (if (equal path "") buffer-file-name + (substitute-in-file-name (expand-file-name path)))) + (file-apps (append org-file-apps (org--file-default-apps))) + (apps (cl-remove-if #'org--file-apps-entry-dlink-p file-apps)) + (apps-dlink (cl-remove-if-not #'org--file-apps-entry-dlink-p + file-apps)) + (remp (and (assq 'remote apps) (file-remote-p file))) + (dirp (unless remp (file-directory-p file))) + (file (if (and dirp org-open-directory-means-index-dot-org) + (concat (file-name-as-directory file) "index.org") + file)) + (a-m-a-p (assq 'auto-mode apps)) + (dfile (downcase file)) + ;; Reconstruct the original link from the PATH, LINE and + ;; SEARCH args. + (link (cond (line (concat file "::" (number-to-string line))) + (search (concat file "::" search)) + (t file))) + (dlink (downcase link)) + (ext + (and (string-match "\\`.*?\\.\\([a-zA-Z0-9]+\\(\\.gz\\)?\\)\\'" dfile) + (match-string 1 dfile))) + (save-position-maybe + (let ((old-buffer (current-buffer)) + (old-pos (point)) + (old-mode major-mode)) + (lambda () + (and (derived-mode-p 'org-mode) + (eq old-mode 'org-mode) + (or (not (eq old-buffer (current-buffer))) + (not (eq old-pos (point)))) + (org-mark-ring-push old-pos old-buffer))))) + cmd link-match-data) + (cond + ((member in-emacs '((16) system)) + (setq cmd (cdr (assq 'system apps)))) + (in-emacs (setq cmd 'emacs)) + (t + (setq cmd (or (and remp (cdr (assq 'remote apps))) + (and dirp (cdr (assq 'directory apps))) + ;; First, try matching against apps-dlink if we + ;; get a match here, store the match data for + ;; later. + (let ((match (assoc-default dlink apps-dlink + 'string-match))) + (if match + (progn (setq link-match-data (match-data)) + match) + (progn (setq in-emacs (or in-emacs line search)) + nil))) ; if we have no match in apps-dlink, + ; always open the file in emacs if line or search + ; is given (for backwards compatibility) + (assoc-default dfile + (org--file-apps-regexp-alist apps a-m-a-p) + 'string-match) + (cdr (assoc ext apps)) + (cdr (assq t apps)))))) + (when (eq cmd 'system) + (setq cmd (cdr (assq 'system apps)))) + (when (eq cmd 'default) + (setq cmd (cdr (assoc t apps)))) + (when (eq cmd 'mailcap) + (require 'mailcap) + (mailcap-parse-mailcaps) + (let* ((mime-type (mailcap-extension-to-mime (or ext ""))) + (command (mailcap-mime-info mime-type))) + (if (stringp command) + (setq cmd command) + (setq cmd 'emacs)))) + (when (and (not (eq cmd 'emacs)) ; Emacs has no problems with non-ex files + (not (file-exists-p file)) + (not org-open-non-existing-files)) + (user-error "No such file: %s" file)) + (cond + ((and (stringp cmd) (not (string-match "^\\s-*$" cmd))) + ;; Remove quotes around the file name - we'll use shell-quote-argument. + (while (string-match "['\"]%s['\"]" cmd) + (setq cmd (replace-match "%s" t t cmd))) + (setq cmd (replace-regexp-in-string + "%s" + (shell-quote-argument (convert-standard-filename file)) + cmd + nil t)) -(defvar org-window-config-before-follow-link nil - "The window configuration before following a link. -This is saved in case the need arises to restore it.") + ;; Replace "%1", "%2" etc. in command with group matches from regex + (save-match-data + (let ((match-index 1) + (number-of-groups (- (/ (length link-match-data) 2) 1))) + (set-match-data link-match-data) + (while (<= match-index number-of-groups) + (let ((regex (concat "%" (number-to-string match-index))) + (replace-with (match-string match-index dlink))) + (while (string-match regex cmd) + (setq cmd (replace-match replace-with t t cmd)))) + (setq match-index (+ match-index 1))))) + + (save-window-excursion + (message "Running %s...done" cmd) + (start-process-shell-command cmd nil cmd) + (and (boundp 'org-wait) (numberp org-wait) (sit-for org-wait)))) + ((or (stringp cmd) + (eq cmd 'emacs)) + (funcall (cdr (assq 'file org-link-frame-setup)) file) + (widen) + (cond (line (org-goto-line line) + (when (derived-mode-p 'org-mode) (org-reveal))) + (search (condition-case err + (org-link-search search) + ;; Save position before error-ing out so user + ;; can easily move back to the original buffer. + (error (funcall save-position-maybe) + (error (nth 1 err))))))) + ((functionp cmd) + (save-match-data + (set-match-data link-match-data) + (condition-case nil + (funcall cmd file link) + ;; FIXME: Remove this check when most default installations + ;; of Emacs have at least Org 9.0. + ((debug wrong-number-of-arguments wrong-type-argument + invalid-function) + (user-error "Please see Org News for version 9.0 about \ +`org-file-apps'--Lisp error: %S" cmd))))) + ((consp cmd) + ;; FIXME: Remove this check when most default installations of + ;; Emacs have at least Org 9.0. Heads-up instead of silently + ;; fall back to `org-link-frame-setup' for an old usage of + ;; `org-file-apps' with sexp instead of a function for `cmd'. + (user-error "Please see Org News for version 9.0 about \ +`org-file-apps'--Error: Deprecated usage of %S" cmd)) + (t (funcall (cdr (assq 'file org-link-frame-setup)) file))) + (funcall save-position-maybe))) ;;;###autoload (defun org-open-at-point-global () @@ -10088,32 +8615,16 @@ Raise a user error when there is nothing to follow." (interactive) (let ((tap-url (thing-at-point 'url)) (tap-email (thing-at-point 'email))) - (cond ((org-in-regexp org-any-link-re) - (org-open-link-from-string (match-string-no-properties 0))) + (cond ((org-in-regexp org-link-any-re) + (org-link-open-from-string (match-string-no-properties 0))) ((or (org-in-regexp org-ts-regexp-both nil t) (org-in-regexp org-tsr-regexp-both nil t)) (org-follow-timestamp-link)) - (tap-url (org-open-link-from-string tap-url)) - (tap-email (org-open-link-from-string + (tap-url (org-link-open-from-string tap-url)) + (tap-email (org-link-open-from-string (concat "mailto:" tap-email))) (t (user-error "No link found"))))) -;;;###autoload -(defun org-open-link-from-string (s &optional arg reference-buffer) - "Open a link in the string S, as if it was in Org mode." - (interactive "sLink: \nP") - (let ((reference-buffer (or reference-buffer (current-buffer)))) - (with-temp-buffer - (let ((org-inhibit-startup (not reference-buffer))) - (org-mode) - (insert s) - (goto-char (point-min)) - (when reference-buffer - (setq org-link-abbrev-alist-local - (with-current-buffer reference-buffer - org-link-abbrev-alist-local))) - (org-open-at-point arg reference-buffer))))) - (defvar org-open-at-point-functions nil "Hook that is run when following a link at point. @@ -10121,62 +8632,7 @@ Functions in this hook must return t if they identify and follow a link at point. If they don't find anything interesting at point, they must return nil.") -(defvar org-link-search-inhibit-query nil) -(defvar clean-buffer-list-kill-buffer-names) ;Defined in midnight.el -(defun org--open-doi-link (path) - "Open a \"doi\" type link. -PATH is a the path to search for, as a string." - (browse-url (url-encode-url (concat org-doi-server-url path)))) - -(defun org--open-elisp-link (path) - "Open a \"elisp\" type link. -PATH is the sexp to evaluate, as a string." - (let ((cmd path)) - (if (or (and (org-string-nw-p - org-confirm-elisp-link-not-regexp) - (string-match-p org-confirm-elisp-link-not-regexp cmd)) - (not org-confirm-elisp-link-function) - (funcall org-confirm-elisp-link-function - (format "Execute \"%s\" as elisp? " - (org-add-props cmd nil 'face 'org-warning)))) - (message "%s => %s" cmd - (if (eq (string-to-char cmd) ?\() - (eval (read cmd)) - (call-interactively (read cmd)))) - (user-error "Abort")))) - -(defun org--open-help-link (path) - "Open a \"help\" type link. -PATH is a symbol name, as a string." - (pcase (intern path) - ((and (pred fboundp) variable) (describe-function variable)) - ((and (pred boundp) function) (describe-variable function)) - (name (user-error "Unknown function or variable: %s" name)))) - -(defun org--open-shell-link (path) - "Open a \"shell\" type link. -PATH is the command to execute, as a string." - (let ((buf (generate-new-buffer "*Org Shell Output*")) - (cmd path)) - (if (or (and (org-string-nw-p - org-confirm-shell-link-not-regexp) - (string-match - org-confirm-shell-link-not-regexp cmd)) - (not org-confirm-shell-link-function) - (funcall org-confirm-shell-link-function - (format "Execute \"%s\" in shell? " - (org-add-props cmd nil - 'face 'org-warning)))) - (progn - (message "Executing %s" cmd) - (shell-command cmd buf) - (when (featurep 'midnight) - (setq clean-buffer-list-kill-buffer-names - (cons (buffer-name buf) - clean-buffer-list-kill-buffer-names)))) - (user-error "Abort")))) - -(defun org-open-at-point (&optional arg reference-buffer) +(defun org-open-at-point (&optional arg) "Open link, timestamp, footnote or tags at point. When point is on a link, follow it. Normally, files will be @@ -10196,10 +8652,6 @@ When point is on a headline, display a list of every link in the entry, so it is possible to pick one, or all, of them. If point is on a tag, call `org-tags-view' instead. -When optional argument REFERENCE-BUFFER is non-nil, it should -specify a buffer from where the link search should happen. This -is used internally by `org-open-link-from-string'. - On top of syntactically correct links, this function also tries to open links and time-stamps in comments, node properties, and keywords if point is on something looking like a timestamp or @@ -10230,21 +8682,31 @@ a link." ;; a link, a footnote reference. ((memq type '(headline inlinetask)) (org-match-line org-complex-heading-regexp) - (if (and (match-beginning 5) - (>= (point) (match-beginning 5)) - (< (point) (match-end 5))) - ;; On tags. - (org-tags-view arg (substring (match-string 5) 0 -1)) - ;; Not on tags. - (pcase (org-offer-links-in-entry (current-buffer) (point) arg) - (`(nil . ,_) - (require 'org-attach) - (org-attach-reveal 'if-exists)) - (`(,links . ,links-end) - (dolist (link (if (stringp links) (list links) links)) - (search-forward link nil links-end) - (goto-char (match-beginning 0)) - (org-open-at-point)))))) + (let ((tags-beg (match-beginning 5)) + (tags-end (match-end 5)) + (tags-str (match-string 5))) + (if (and tags-beg (>= (point) tags-beg) (< (point) tags-end)) + ;; On tags. + (org-tags-view + arg + (save-excursion + (let* ((beg-tag (or (search-backward ":" tags-beg 'at-limit) (point))) + (end-tag (search-forward ":" tags-end nil 2))) + (buffer-substring (1+ beg-tag) (1- end-tag))))) + ;; Not on tags. + (pcase (org-offer-links-in-entry (current-buffer) (point) arg) + (`(nil . ,_) + (require 'org-attach) + (when (org-attach-dir) + (message "Opening attachment") + (if (equal arg '(4)) + (org-attach-reveal-in-emacs) + (org-attach-reveal)))) + (`(,links . ,links-end) + (dolist (link (if (stringp links) (list links) links)) + (search-forward link nil links-end) + (goto-char (match-beginning 0)) + (org-open-at-point arg))))))) ;; On a footnote reference or at definition's label. ((or (eq type 'footnote-reference) (and (eq type 'footnote-definition) @@ -10280,73 +8742,11 @@ a link." (user-error "No link found")) ((eq type 'inline-src-block) (org-babel-open-src-block-result)) ((eq type 'timestamp) (org-follow-timestamp-link)) - ((eq type 'link) - (let ((type (org-element-property :type context)) - (path (org-element-property :path context))) - ;; Switch back to REFERENCE-BUFFER needed when called in - ;; a temporary buffer through `org-open-link-from-string'. - (with-current-buffer (or reference-buffer (current-buffer)) - (cond - ((equal type "file") - (if (string-match "[*?{]" (file-name-nondirectory path)) - (dired path) - ;; Look into `org-link-parameters' in order to find - ;; a DEDICATED-FUNCTION to open file. The function - ;; will be applied on raw link instead of parsed link - ;; due to the limitation in `org-add-link-type' - ;; ("open" function called with a single argument). - ;; If no such function is found, fallback to - ;; `org-open-file'. - (let* ((option (org-element-property :search-option context)) - (app (org-element-property :application context)) - (dedicated-function - (org-link-get-parameter - (if app (concat type "+" app) type) - :follow))) - (if dedicated-function - (funcall dedicated-function - (concat path - (and option (concat "::" option)))) - (apply #'org-open-file - path - (cond (arg) - ((equal app "emacs") 'emacs) - ((equal app "sys") 'system)) - (cond ((not option) nil) - ((string-match-p "\\`[0-9]+\\'" option) - (list (string-to-number option))) - (t (list nil option)))))))) - ((functionp (org-link-get-parameter type :follow)) - (funcall (org-link-get-parameter type :follow) path)) - ((member type '("coderef" "custom-id" "fuzzy" "radio")) - (unless (run-hook-with-args-until-success - 'org-open-link-functions path) - (if (not arg) (org-mark-ring-push) - (switch-to-buffer-other-window - (org-get-buffer-for-internal-link (current-buffer)))) - (let ((destination - (org-with-wide-buffer - (if (equal type "radio") - (org-search-radio-target - (org-element-property :path context)) - (org-link-search - (pcase type - ("custom-id" (concat "#" path)) - ("coderef" (format "(%s)" path)) - (_ path)) - ;; Prevent fuzzy links from matching - ;; themselves. - (and (equal type "fuzzy") - (+ 2 (org-element-property :begin context))))) - (point)))) - (unless (and (<= (point-min) destination) - (>= (point-max) destination)) - (widen)) - (goto-char destination)))) - (t (browse-url-at-point)))))) + ((eq type 'link) (org-link-open context arg)) (t (user-error "No link found"))))) (run-hook-with-args 'org-follow-link-hook)) +;;;###autoload (defun org-offer-links-in-entry (buffer marker &optional nth zero) "Offer links in the current entry and return the selected link. If there is only one link, return it. @@ -10358,13 +8758,13 @@ there is one, return it." (goto-char marker) (let ((cnt ?0) have-zero end links link c) - (when (and (stringp zero) (string-match org-bracket-link-regexp zero)) + (when (and (stringp zero) (string-match org-link-bracket-re zero)) (push (match-string 0 zero) links) (setq cnt (1- cnt) have-zero t)) (save-excursion (org-back-to-heading t) (setq end (save-excursion (outline-next-heading) (point))) - (while (re-search-forward org-any-link-re end t) + (while (re-search-forward org-link-any-re end t) (push (match-string 0) links)) (setq links (org-uniquify (reverse links)))) (cond @@ -10381,12 +8781,12 @@ there is one, return it." (with-output-to-temp-buffer "*Select Link*" (dolist (l links) (cond - ((not (string-match org-bracket-link-regexp l)) + ((not (string-match org-link-bracket-re l)) (princ (format "[%c] %s\n" (cl-incf cnt) (org-unbracket-string "<" ">" l)))) - ((match-end 3) + ((match-end 2) (princ (format "[%c] %s (%s)\n" (cl-incf cnt) - (match-string 3 l) (match-string 1 l)))) + (match-string 2 l) (match-string 1 l)))) (t (princ (format "[%c] %s\n" (cl-incf cnt) (match-string 1 l))))))) (org-fit-window-to-buffer (get-buffer-window "*Select Link*")) @@ -10397,575 +8797,114 @@ there is one, return it." (if (equal c ?\C-m) (setq link links) (setq nth (- c ?0)) - (when have-zero (setq nth (1+ nth))) - (unless (and (integerp nth) (>= (length links) nth)) - (user-error "Invalid link selection")) - (setq link (nth (1- nth) links))))) - (cons link end))))) - -;; TODO: These functions are deprecated since `org-open-at-point' -;; hard-codes behavior for "file+emacs" and "file+sys" types. -(defun org-open-file-with-system (path) - "Open file at PATH using the system way of opening it." - (org-open-file path 'system)) -(defun org-open-file-with-emacs (path) - "Open file at PATH in Emacs." - (org-open-file path 'emacs)) - - -;;; File search - -(defvar org-create-file-search-functions nil - "List of functions to construct the right search string for a file link. -These functions are called in turn with point at the location to -which the link should point. - -A function in the hook should first test if it would like to -handle this file type, for example by checking the `major-mode' -or the file extension. If it decides not to handle this file, it -should just return nil to give other functions a chance. If it -does handle the file, it must return the search string to be used -when following the link. The search string will be part of the -file link, given after a double colon, and `org-open-at-point' -will automatically search for it. If special measures must be -taken to make the search successful, another function should be -added to the companion hook `org-execute-file-search-functions', -which see. - -A function in this hook may also use `setq' to set the variable -`description' to provide a suggestion for the descriptive text to -be used for this link when it gets inserted into an Org buffer -with \\[org-insert-link].") - -(defvar org-execute-file-search-functions nil - "List of functions to execute a file search triggered by a link. - -Functions added to this hook must accept a single argument, the -search string that was part of the file link, the part after the -double colon. The function must first check if it would like to -handle this search, for example by checking the `major-mode' or -the file extension. If it decides not to handle this search, it -should just return nil to give other functions a chance. If it -does handle the search, it must return a non-nil value to keep -other functions from trying. - -Each function can access the current prefix argument through the -variable `current-prefix-arg'. Note that a single prefix is used -to force opening a link in Emacs, so it may be good to only use a -numeric or double prefix to guide the search function. - -In case this is needed, a function in this hook can also restore -the window configuration before `org-open-at-point' was called using: - - (set-window-configuration org-window-config-before-follow-link)") - -(defun org-search-radio-target (target) - "Search a radio target matching TARGET in current buffer. -White spaces are not significant." - (let ((re (format "<<<%s>>>" - (mapconcat #'regexp-quote - (split-string target) - "[ \t]+\\(?:\n[ \t]*\\)?"))) - (origin (point))) - (goto-char (point-min)) - (catch :radio-match - (while (re-search-forward re nil t) - (backward-char) - (let ((object (org-element-context))) - (when (eq (org-element-type object) 'radio-target) - (goto-char (org-element-property :begin object)) - (org-show-context 'link-search) - (throw :radio-match nil)))) - (goto-char origin) - (user-error "No match for radio target: %s" target)))) - -(defun org-link-search (s &optional avoid-pos stealth) - "Search for a search string S. - -If S starts with \"#\", it triggers a custom ID search. - -If S is enclosed within parenthesis, it initiates a coderef -search. - -If S is surrounded by forward slashes, it is interpreted as -a regular expression. In Org mode files, this will create an -`org-occur' sparse tree. In ordinary files, `occur' will be used -to list matches. If the current buffer is in `dired-mode', grep -will be used to search in all files. - -When AVOID-POS is given, ignore matches near that position. - -When optional argument STEALTH is non-nil, do not modify -visibility around point, thus ignoring `org-show-context-detail' -variable. - -Search is case-insensitive and ignores white spaces. Return type -of matched result, which is either `dedicated' or `fuzzy'." - (unless (org-string-nw-p s) (error "Invalid search string \"%s\"" s)) - (let* ((case-fold-search t) - (origin (point)) - (normalized (replace-regexp-in-string "\n[ \t]*" " " s)) - (starred (eq (string-to-char normalized) ?*)) - (words (split-string (if starred (substring s 1) s))) - (s-multi-re (mapconcat #'regexp-quote words "\\(?:[ \t\n]+\\)")) - (s-single-re (mapconcat #'regexp-quote words "[ \t]+")) - type) - (cond - ;; Check if there are any special search functions. - ((run-hook-with-args-until-success 'org-execute-file-search-functions s)) - ((eq (string-to-char s) ?#) - ;; Look for a custom ID S if S starts with "#". - (let* ((id (substring normalized 1)) - (match (org-find-property "CUSTOM_ID" id))) - (if match (progn (goto-char match) (setf type 'dedicated)) - (error "No match for custom ID: %s" id)))) - ((string-match "\\`(\\(.*\\))\\'" normalized) - ;; Look for coderef targets if S is enclosed within parenthesis. - (let ((coderef (match-string-no-properties 1 normalized)) - (re (substring s-single-re 1 -1))) - (goto-char (point-min)) - (catch :coderef-match - (while (re-search-forward re nil t) - (let ((element (org-element-at-point))) - (when (and (memq (org-element-type element) - '(example-block src-block)) - (org-match-line - (concat ".*?" (org-src-coderef-regexp - (org-src-coderef-format element) - coderef)))) - (setq type 'dedicated) - (goto-char (match-beginning 2)) - (throw :coderef-match nil)))) - (goto-char origin) - (error "No match for coderef: %s" coderef)))) - ((string-match "\\`/\\(.*\\)/\\'" normalized) - ;; Look for a regular expression. - (funcall (if (derived-mode-p 'org-mode) #'org-occur #'org-do-occur) - (match-string 1 s))) - ;; From here, we handle fuzzy links. - ;; - ;; Look for targets, only if not in a headline search. - ((and (not starred) - (let ((target (format "<<%s>>" s-multi-re))) - (catch :target-match - (goto-char (point-min)) - (while (re-search-forward target nil t) - (backward-char) - (let ((context (org-element-context))) - (when (eq (org-element-type context) 'target) - (setq type 'dedicated) - (goto-char (org-element-property :begin context)) - (throw :target-match t)))) - nil)))) - ;; Look for elements named after S, only if not in a headline - ;; search. - ((and (not starred) - (let ((name (format "^[ \t]*#\\+NAME: +%s[ \t]*$" s-single-re))) - (catch :name-match - (goto-char (point-min)) - (while (re-search-forward name nil t) - (let ((element (org-element-at-point))) - (when (equal words - (split-string - (org-element-property :name element))) - (setq type 'dedicated) - (beginning-of-line) - (throw :name-match t)))) - nil)))) - ;; Regular text search. Prefer headlines in Org mode buffers. - ;; Ignore COMMENT keyword, TODO keywords, priority cookies, - ;; statistics cookies and tags. - ((and (derived-mode-p 'org-mode) - (let ((title-re - (format "%s.*\\(?:%s[ \t]\\)?.*%s" - org-outline-regexp-bol - org-comment-string - (mapconcat #'regexp-quote words ".+"))) - (cookie-re "\\[[0-9]*\\(?:%\\|/[0-9]*\\)\\]") - (comment-re (eval-when-compile - (format "\\`%s[ \t]+" org-comment-string)))) - (goto-char (point-min)) - (catch :found - (while (re-search-forward title-re nil t) - (when (equal words - (split-string - (replace-regexp-in-string - cookie-re "" - (replace-regexp-in-string - comment-re "" (org-get-heading t t t))))) - (throw :found t))) - nil))) - (beginning-of-line) - (setq type 'dedicated)) - ;; Offer to create non-existent headline depending on - ;; `org-link-search-must-match-exact-headline'. - ((and (derived-mode-p 'org-mode) - (not org-link-search-inhibit-query) - (eq org-link-search-must-match-exact-headline 'query-to-create) - (yes-or-no-p "No match - create this as a new heading? ")) - (goto-char (point-max)) - (unless (bolp) (newline)) - (org-insert-heading nil t t) - (insert s "\n") - (beginning-of-line 0)) - ;; Only headlines are looked after. No need to process - ;; further: throw an error. - ((and (derived-mode-p 'org-mode) - (or starred org-link-search-must-match-exact-headline)) - (goto-char origin) - (error "No match for fuzzy expression: %s" normalized)) - ;; Regular text search. - ((catch :fuzzy-match - (goto-char (point-min)) - (while (re-search-forward s-multi-re nil t) - ;; Skip match if it contains AVOID-POS or it is included in - ;; a link with a description but outside the description. - (unless (or (and avoid-pos - (<= (match-beginning 0) avoid-pos) - (> (match-end 0) avoid-pos)) - (and (save-match-data - (org-in-regexp org-bracket-link-regexp)) - (match-beginning 3) - (or (> (match-beginning 3) (point)) - (<= (match-end 3) (point))) - (org-element-lineage - (save-match-data (org-element-context)) - '(link) t))) - (goto-char (match-beginning 0)) - (setq type 'fuzzy) - (throw :fuzzy-match t))) - nil)) - ;; All failed. Throw an error. - (t (goto-char origin) - (error "No match for fuzzy expression: %s" normalized))) - ;; Disclose surroundings of match, if appropriate. - (when (and (derived-mode-p 'org-mode) (not stealth)) - (org-show-context 'link-search)) - type)) - -(defun org-get-buffer-for-internal-link (buffer) - "Return a buffer to be used for displaying the link target of internal links." - (cond - ((not org-display-internal-link-with-indirect-buffer) - buffer) - ((string-suffix-p "(Clone)" (buffer-name buffer)) - (message "Buffer is already a clone, not making another one") - ;; we also do not modify visibility in this case - buffer) - (t ; make a new indirect buffer for displaying the link - (let* ((bn (buffer-name buffer)) - (ibn (concat bn "(Clone)")) - (ib (or (get-buffer ibn) (make-indirect-buffer buffer ibn 'clone)))) - (with-current-buffer ib (org-overview)) - ib)))) - -(defun org-do-occur (regexp &optional cleanup) - "Call the Emacs command `occur'. -If CLEANUP is non-nil, remove the printout of the regular expression -in the *Occur* buffer. This is useful if the regex is long and not useful -to read." - (occur regexp) - (when cleanup - (let ((cwin (selected-window)) win beg end) - (when (setq win (get-buffer-window "*Occur*")) - (select-window win)) - (goto-char (point-min)) - (when (re-search-forward "match[a-z]+" nil t) - (setq beg (match-end 0)) - (when (re-search-forward "^[ \t]*[0-9]+" nil t) - (setq end (1- (match-beginning 0))))) - (and beg end (let ((inhibit-read-only t)) (delete-region beg end))) - (goto-char (point-min)) - (select-window cwin)))) - - -;;; The Mark Ring - -(defvar org-mark-ring nil - "Mark ring for positions before jumps in Org mode.") - -(defvar org-mark-ring-last-goto nil - "Last position in the mark ring used to go back.") - -;; Fill and close the ring -(setq org-mark-ring nil) -(setq org-mark-ring-last-goto nil) ;in case file is reloaded - -(dotimes (_ org-mark-ring-length) (push (make-marker) org-mark-ring)) -(setcdr (nthcdr (1- org-mark-ring-length) org-mark-ring) - org-mark-ring) - -(defun org-mark-ring-push (&optional pos buffer) - "Put the current position into the mark ring and rotate it. -Also push position into the Emacs mark ring. If optional -argument POS and BUFFER are not nil, mark this location instead." - (interactive) - (let ((pos (or pos (point))) - (buffer (or buffer (current-buffer)))) - (with-current-buffer buffer - (org-with-point-at pos (push-mark nil t))) - (setq org-mark-ring (nthcdr (1- org-mark-ring-length) org-mark-ring)) - (move-marker (car org-mark-ring) pos buffer)) - (message - (substitute-command-keys - "Position saved to mark ring, go back with `\\[org-mark-ring-goto]'."))) - -(defun org-mark-ring-goto (&optional n) - "Jump to the previous position in the mark ring. -With prefix arg N, jump back that many stored positions. When -called several times in succession, walk through the entire ring. -Org mode commands jumping to a different position in the current file, -or to another Org file, automatically push the old position onto the ring." - (interactive "p") - (let (p m) - (if (eq last-command this-command) - (setq p (nthcdr n (or org-mark-ring-last-goto org-mark-ring))) - (setq p org-mark-ring)) - (setq org-mark-ring-last-goto p) - (setq m (car p)) - (pop-to-buffer-same-window (marker-buffer m)) - (goto-char m) - (when (or (org-invisible-p) (org-invisible-p2)) (org-show-context 'mark-goto)))) - -(defun org-add-angle-brackets (s) - (unless (equal (substring s 0 1) "<") (setq s (concat "<" s))) - (unless (equal (substring s -1) ">") (setq s (concat s ">"))) - s) - -;;; Following specific links - -(defvar org-agenda-buffer-tmp-name) -(defvar org-agenda-start-on-weekday) -(defun org-follow-timestamp-link () - "Open an agenda view for the time-stamp date/range at point." - (cond - ((org-at-date-range-p t) - (let ((org-agenda-start-on-weekday) - (t1 (match-string 1)) - (t2 (match-string 2)) tt1 tt2) - (setq tt1 (time-to-days (org-time-string-to-time t1)) - tt2 (time-to-days (org-time-string-to-time t2))) - (let ((org-agenda-buffer-tmp-name - (format "*Org Agenda(a:%s)" - (concat (substring t1 0 10) "--" (substring t2 0 10))))) - (org-agenda-list nil tt1 (1+ (- tt2 tt1)))))) - ((org-at-timestamp-p 'lax) - (let ((org-agenda-buffer-tmp-name - (format "*Org Agenda(a:%s)" (substring (match-string 1) 0 10)))) - (org-agenda-list nil (time-to-days (org-time-string-to-time - (substring (match-string 1) 0 10))) - 1))) - (t (error "This should not happen")))) - - -;;; Following file links -(declare-function mailcap-parse-mailcaps "mailcap" (&optional path force)) -(declare-function mailcap-extension-to-mime "mailcap" (extn)) -(declare-function mailcap-mime-info - "mailcap" (string &optional request no-decode)) -(defvar org-wait nil) -(defun org-open-file (path &optional in-emacs line search) - "Open the file at PATH. -First, this expands any special file name abbreviations. Then the -configuration variable `org-file-apps' is checked if it contains an -entry for this file type, and if yes, the corresponding command is launched. - -If no application is found, Emacs simply visits the file. - -With optional prefix argument IN-EMACS, Emacs will visit the file. -With a double \\[universal-argument] \\[universal-argument] \ -prefix arg, Org tries to avoid opening in Emacs -and to use an external application to visit the file. - -Optional LINE specifies a line to go to, optional SEARCH a string -to search for. If LINE or SEARCH is given, the file will be -opened in Emacs, unless an entry from org-file-apps that makes -use of groups in a regexp matches. - -If you want to change the way frames are used when following a -link, please customize `org-link-frame-setup'. - -If the file does not exist, an error is thrown." - (let* ((file (if (equal path "") - buffer-file-name - (substitute-in-file-name (expand-file-name path)))) - (file-apps (append org-file-apps (org-default-apps))) - (apps (cl-remove-if - 'org-file-apps-entry-match-against-dlink-p file-apps)) - (apps-dlink (cl-remove-if-not - 'org-file-apps-entry-match-against-dlink-p file-apps)) - (remp (and (assq 'remote apps) (file-remote-p file))) - (dirp (unless remp (file-directory-p file))) - (file (if (and dirp org-open-directory-means-index-dot-org) - (concat (file-name-as-directory file) "index.org") - file)) - (a-m-a-p (assq 'auto-mode apps)) - (dfile (downcase file)) - ;; Reconstruct the original link from the PATH, LINE and - ;; SEARCH args. - (link (cond (line (concat file "::" (number-to-string line))) - (search (concat file "::" search)) - (t file))) - (dlink (downcase link)) - (ext - (and (string-match "\\`.*?\\.\\([a-zA-Z0-9]+\\(\\.gz\\)?\\)\\'" dfile) - (match-string 1 dfile))) - (save-position-maybe - (let ((old-buffer (current-buffer)) - (old-pos (point)) - (old-mode major-mode)) - (lambda () - (and (derived-mode-p 'org-mode) - (eq old-mode 'org-mode) - (or (not (eq old-buffer (current-buffer))) - (not (eq old-pos (point)))) - (org-mark-ring-push old-pos old-buffer))))) - cmd link-match-data) - (cond - ((member in-emacs '((16) system)) - (setq cmd (cdr (assq 'system apps)))) - (in-emacs (setq cmd 'emacs)) - (t - (setq cmd (or (and remp (cdr (assq 'remote apps))) - (and dirp (cdr (assq 'directory apps))) - ;; First, try matching against apps-dlink if we - ;; get a match here, store the match data for - ;; later. - (let ((match (assoc-default dlink apps-dlink - 'string-match))) - (if match - (progn (setq link-match-data (match-data)) - match) - (progn (setq in-emacs (or in-emacs line search)) - nil))) ; if we have no match in apps-dlink, - ; always open the file in emacs if line or search - ; is given (for backwards compatibility) - (assoc-default dfile (org-apps-regexp-alist apps a-m-a-p) - 'string-match) - (cdr (assoc ext apps)) - (cdr (assq t apps)))))) - (when (eq cmd 'system) - (setq cmd (cdr (assq 'system apps)))) - (when (eq cmd 'default) - (setq cmd (cdr (assoc t apps)))) - (when (eq cmd 'mailcap) - (require 'mailcap) - (mailcap-parse-mailcaps) - (let* ((mime-type (mailcap-extension-to-mime (or ext ""))) - (command (mailcap-mime-info mime-type))) - (if (stringp command) - (setq cmd command) - (setq cmd 'emacs)))) - (when (and (not (eq cmd 'emacs)) ; Emacs has no problems with non-ex files - (not (file-exists-p file)) - (not org-open-non-existing-files)) - (user-error "No such file: %s" file)) - (cond - ((and (stringp cmd) (not (string-match "^\\s-*$" cmd))) - ;; Remove quotes around the file name - we'll use shell-quote-argument. - (while (string-match "['\"]%s['\"]" cmd) - (setq cmd (replace-match "%s" t t cmd))) - (setq cmd (replace-regexp-in-string - "%s" - (shell-quote-argument (convert-standard-filename file)) - cmd - nil t)) + (when have-zero (setq nth (1+ nth))) + (unless (and (integerp nth) (>= (length links) nth)) + (user-error "Invalid link selection")) + (setq link (nth (1- nth) links))))) + (cons link end))))) - ;; Replace "%1", "%2" etc. in command with group matches from regex - (save-match-data - (let ((match-index 1) - (number-of-groups (- (/ (length link-match-data) 2) 1))) - (set-match-data link-match-data) - (while (<= match-index number-of-groups) - (let ((regex (concat "%" (number-to-string match-index))) - (replace-with (match-string match-index dlink))) - (while (string-match regex cmd) - (setq cmd (replace-match replace-with t t cmd)))) - (setq match-index (+ match-index 1))))) +;;; File search - (save-window-excursion - (message "Running %s...done" cmd) - (start-process-shell-command cmd nil cmd) - (and (boundp 'org-wait) (numberp org-wait) (sit-for org-wait)))) - ((or (stringp cmd) - (eq cmd 'emacs)) - (funcall (cdr (assq 'file org-link-frame-setup)) file) - (widen) - (cond (line (org-goto-line line) - (when (derived-mode-p 'org-mode) (org-reveal))) - (search (condition-case err - (org-link-search search) - ;; Save position before error-ing out so user - ;; can easily move back to the original buffer. - (error (funcall save-position-maybe) - (error (nth 1 err))))))) - ((functionp cmd) - (save-match-data - (set-match-data link-match-data) - (condition-case nil - (funcall cmd file link) - ;; FIXME: Remove this check when most default installations - ;; of Emacs have at least Org 9.0. - ((debug wrong-number-of-arguments wrong-type-argument - invalid-function) - (user-error "Please see Org News for version 9.0 about \ -`org-file-apps'--Lisp error: %S" cmd))))) - ((consp cmd) - ;; FIXME: Remove this check when most default installations of - ;; Emacs have at least Org 9.0. Heads-up instead of silently - ;; fall back to `org-link-frame-setup' for an old usage of - ;; `org-file-apps' with sexp instead of a function for `cmd'. - (user-error "Please see Org News for version 9.0 about \ -`org-file-apps'--Error: Deprecated usage of %S" cmd)) - (t (funcall (cdr (assq 'file org-link-frame-setup)) file))) - (funcall save-position-maybe))) +(defun org-do-occur (regexp &optional cleanup) + "Call the Emacs command `occur'. +If CLEANUP is non-nil, remove the printout of the regular expression +in the *Occur* buffer. This is useful if the regex is long and not useful +to read." + (occur regexp) + (when cleanup + (let ((cwin (selected-window)) win beg end) + (when (setq win (get-buffer-window "*Occur*")) + (select-window win)) + (goto-char (point-min)) + (when (re-search-forward "match[a-z]+" nil t) + (setq beg (match-end 0)) + (when (re-search-forward "^[ \t]*[0-9]+" nil t) + (setq end (1- (match-beginning 0))))) + (and beg end (let ((inhibit-read-only t)) (delete-region beg end))) + (goto-char (point-min)) + (select-window cwin)))) -(defun org-file-apps-entry-match-against-dlink-p (entry) - "This function returns non-nil if `entry' uses a regular -expression which should be matched against the whole link by -org-open-file. + +;;; The Mark Ring -It assumes that is the case when the entry uses a regular -expression which has at least one grouping construct and the -action is either a lisp form or a command string containing -`%1', i.e. using at least one subexpression match as a -parameter." - (let ((selector (car entry)) - (action (cdr entry))) - (if (stringp selector) - (and (> (regexp-opt-depth selector) 0) - (or (and (stringp action) - (string-match "%[0-9]" action)) - (consp action))) - nil))) +(defvar org-mark-ring nil + "Mark ring for positions before jumps in Org mode.") -(defun org-default-apps () - "Return the default applications for this operating system." +(defvar org-mark-ring-last-goto nil + "Last position in the mark ring used to go back.") + +;; Fill and close the ring +(setq org-mark-ring nil) +(setq org-mark-ring-last-goto nil) ;in case file is reloaded + +(dotimes (_ org-mark-ring-length) (push (make-marker) org-mark-ring)) +(setcdr (nthcdr (1- org-mark-ring-length) org-mark-ring) + org-mark-ring) + +(defun org-mark-ring-push (&optional pos buffer) + "Put the current position into the mark ring and rotate it. +Also push position into the Emacs mark ring. If optional +argument POS and BUFFER are not nil, mark this location instead." + (interactive) + (let ((pos (or pos (point))) + (buffer (or buffer (current-buffer)))) + (with-current-buffer buffer + (org-with-point-at pos (push-mark nil t))) + (setq org-mark-ring (nthcdr (1- org-mark-ring-length) org-mark-ring)) + (move-marker (car org-mark-ring) pos buffer)) + (message + (substitute-command-keys + "Position saved to mark ring, go back with `\\[org-mark-ring-goto]'."))) + +(defun org-mark-ring-goto (&optional n) + "Jump to the previous position in the mark ring. +With prefix arg N, jump back that many stored positions. When +called several times in succession, walk through the entire ring. +Org mode commands jumping to a different position in the current file, +or to another Org file, automatically push the old position onto the ring." + (interactive "p") + (let (p m) + (if (eq last-command this-command) + (setq p (nthcdr n (or org-mark-ring-last-goto org-mark-ring))) + (setq p org-mark-ring)) + (setq org-mark-ring-last-goto p) + (setq m (car p)) + (pop-to-buffer-same-window (marker-buffer m)) + (goto-char m) + (when (or (org-invisible-p) (org-invisible-p2)) (org-show-context 'mark-goto)))) + +;;; Following specific links + +(defvar org-agenda-buffer-tmp-name) +(defvar org-agenda-start-on-weekday) +(defun org-follow-timestamp-link () + "Open an agenda view for the time-stamp date/range at point." (cond - ((eq system-type 'darwin) - org-file-apps-defaults-macosx) - ((eq system-type 'windows-nt) - org-file-apps-defaults-windowsnt) - (t org-file-apps-defaults-gnu))) + ((org-at-date-range-p t) + (let ((org-agenda-start-on-weekday) + (t1 (match-string 1)) + (t2 (match-string 2)) tt1 tt2) + (setq tt1 (time-to-days (org-time-string-to-time t1)) + tt2 (time-to-days (org-time-string-to-time t2))) + (let ((org-agenda-buffer-tmp-name + (format "*Org Agenda(a:%s)" + (concat (substring t1 0 10) "--" (substring t2 0 10))))) + (org-agenda-list nil tt1 (1+ (- tt2 tt1)))))) + ((org-at-timestamp-p 'lax) + (let ((org-agenda-buffer-tmp-name + (format "*Org Agenda(a:%s)" (substring (match-string 1) 0 10)))) + (org-agenda-list nil (time-to-days (org-time-string-to-time + (substring (match-string 1) 0 10))) + 1))) + (t (error "This should not happen")))) -(defun org-apps-regexp-alist (list &optional add-auto-mode) - "Convert extensions to regular expressions in the cars of LIST. -Also, weed out any non-string entries, because the return value is used -only for regexp matching. -When ADD-AUTO-MODE is set, make all matches in `auto-mode-alist' -point to the symbol `emacs', indicating that the file should -be opened in Emacs." - (append - (delq nil - (mapcar (lambda (x) - (unless (not (stringp (car x))) - (if (string-match "\\W" (car x)) - x - (cons (concat "\\." (car x) "\\'") (cdr x))))) - list)) - (when add-auto-mode - (mapcar (lambda (x) (cons (car x) 'emacs)) auto-mode-alist)))) +;;; Following file links +(declare-function mailcap-parse-mailcaps "mailcap" (&optional path force)) +(declare-function mailcap-extension-to-mime "mailcap" (extn)) +(declare-function mailcap-mime-info + "mailcap" (string &optional request no-decode)) +(defvar org-wait nil) ;;;; Refiling @@ -11366,8 +9305,8 @@ prefix argument (`C-u C-u C-u C-c C-w')." (org-back-to-heading t) (setq heading-text (replace-regexp-in-string - org-bracket-link-regexp - "\\3" + org-link-bracket-re + "\\2" (or (nth 4 (org-heading-components)) "")))) (org-refile-get-location @@ -11690,6 +9629,42 @@ If COMMAND is not given, use `org-update-dblock'." (unless (re-search-forward org-dblock-end-re nil t) (error "Dynamic block not terminated")))))) +(defvar org-dynamic-block-alist nil + "Alist defining all the Org dynamic blocks. + +The key is the dynamic block type name, as a string. The value +is the function used to insert the dynamic block. + +Use `org-dynamic-block-define' to populate it.") + +(defun org-dynamic-block-function (type) + "Return function associated to a given dynamic block type. +TYPE is the dynamic block type, as a string." + (cdr (assoc type org-dynamic-block-alist))) + +(defun org-dynamic-block-types () + "List all defined dynamic block types." + (mapcar #'car org-dynamic-block-alist)) + +(defun org-dynamic-block-define (type func) + "Define dynamic block TYPE with FUNC. +TYPE is a string. FUNC is the function creating the dynamic +block of such type." + (pcase (assoc type org-dynamic-block-alist) + (`nil (push (cons type func) org-dynamic-block-alist)) + (def (setcdr def func)))) + +(defun org-dynamic-block-insert-dblock (type) + "Insert a dynamic block of type TYPE. +When used interactively, select the dynamic block types among +defined types, per `org-dynamic-block-define'." + (interactive (list (completing-read "Dynamic block: " + (org-dynamic-block-types)))) + (pcase (org-dynamic-block-function type) + (`nil (error "No such dynamic block: %S" type)) + ((and f (pred functionp)) (funcall f)) + (_ (error "Invalid function for dynamic block %S" type)))) + (defun org-dblock-update (&optional arg) "User command for updating dynamic blocks. Update the dynamic block at point. With prefix ARG, update all dynamic @@ -11902,9 +9877,9 @@ Elements of length one have a tab appended. Elements of length two are kept as is. Longer elements are truncated to length two. If an element cannot be made unique, an error is raised." - (let ((orderd-keys (cl-sort (copy-sequence keys) #'< :key #'length)) + (let ((ordered-keys (cl-sort (copy-sequence keys) #'< :key #'length)) menu-keys) - (dolist (key orderd-keys) + (dolist (key ordered-keys) (let ((potential-key (cl-case (length key) (1 (concat key "\t")) @@ -12056,15 +10031,20 @@ By default the available states are \"TODO\" and \"DONE\". So, for this example: when the item starts with TODO, it is changed to DONE. When it starts with DONE, the DONE is removed. And when neither TODO nor DONE are present, add TODO at the beginning of the heading. +You can set up single-character keys to fast-select the new state. See the +`org-todo-keywords' and `org-use-fast-todo-selection' for details. -With `\\[universal-argument]' prefix ARG, use completion to determine the new \ -state. -With numeric prefix ARG, switch to that state. +With `\\[universal-argument]' prefix ARG, force logging the state change \ +and take a +logging note. With a `\\[universal-argument] \\[universal-argument]' prefix, switch to the \ next set of TODO \ keywords (nextset). +Another way to achieve this is `S-C-'. With a `\\[universal-argument] \\[universal-argument] \\[universal-argument]' \ prefix, circumvent any state blocking. +With numeric prefix arg, switch to the Nth state. + With a numeric prefix arg of 0, inhibit note taking for the change. With a numeric prefix arg of -1, cancel repeater to allow marking as DONE. @@ -12107,6 +10087,7 @@ When called through ELisp, arg is also interpreted in the following way: (looking-at "\\(?: *\\|[ \t]*$\\)")) (let* ((match-data (match-data)) (startpos (copy-marker (line-beginning-position))) + (force-log (and (equal arg '(4)) (prog1 t (setq arg nil)))) (logging (save-match-data (org-entry-get nil "LOGGING" t t))) (org-log-done org-log-done) (org-log-repeat org-log-repeat) @@ -12126,34 +10107,19 @@ When called through ELisp, arg is also interpreted in the following way: (member (member this org-todo-keywords-1)) (tail (cdr member)) (org-state (cond - ((and org-todo-key-trigger - (or (and (equal arg '(4)) - (eq org-use-fast-todo-selection 'prefix)) - (and (not arg) org-use-fast-todo-selection - (not (eq org-use-fast-todo-selection - 'prefix))))) - ;; Use fast selection. - (org-fast-todo-selection)) - ((and (equal arg '(4)) - (or (not org-use-fast-todo-selection) - (not org-todo-key-trigger))) - ;; Read a state with completion. - (completing-read - "State: " (mapcar #'list org-todo-keywords-1) - nil t)) ((eq arg 'right) + ;; Next state (if this (if tail (car tail) nil) (car org-todo-keywords-1))) ((eq arg 'left) + ;; Previous state (unless (equal member org-todo-keywords-1) (if this (nth (- (length org-todo-keywords-1) (length tail) 2) org-todo-keywords-1) (org-last org-todo-keywords-1)))) - ((and (eq org-use-fast-todo-selection t) (equal arg '(4)) - (setq arg nil))) ;hack to fall back to cycling (arg ;; User or caller requests a specific state. (cond @@ -12172,6 +10138,9 @@ When called through ELisp, arg is also interpreted in the following way: (user-error "State `%s' not valid in this file" arg)) ((nth (1- (prefix-numeric-value arg)) org-todo-keywords-1)))) + ((and org-todo-key-trigger org-use-fast-todo-selection) + ;; Use fast selection. + (org-fast-todo-selection this)) ((null member) (or head (car org-todo-keywords-1))) ((equal this final-done-word) nil) ;-> make empty ((null tail) nil) ;-> first entry @@ -12233,11 +10202,13 @@ When called through ELisp, arg is also interpreted in the following way: (setq now-done-p (and (member org-state org-done-keywords) (not (member this org-done-keywords)))) (and logging (org-local-logging logging)) - (when (and (or org-todo-log-states org-log-done) - (not (eq org-inhibit-logging t)) - (not (memq arg '(nextset previousset)))) + (when (or (and (or org-todo-log-states org-log-done) + (not (eq org-inhibit-logging t)) + (not (memq arg '(nextset previousset)))) + force-log) ;; We need to look at recording a time and note. - (setq dolog (or (nth 1 (assoc org-state org-todo-log-states)) + (setq dolog (or (if force-log 'note) + (nth 1 (assoc org-state org-todo-log-states)) (nth 2 (assoc this org-todo-log-states)))) (when (and (eq dolog 'note) (eq org-inhibit-logging 'note)) (setq dolog 'time)) @@ -12282,7 +10253,9 @@ When called through ELisp, arg is also interpreted in the following way: (looking-at org-todo-line-regexp)) (< (point) (+ 2 (or (match-end 2) (match-end 1))))) (goto-char (or (match-end 2) (match-end 1))) - (and (looking-at " ") (just-one-space))) + (and (looking-at " ") + (not (looking-at " *:")) + (just-one-space))) (when org-trigger-hook (save-excursion (run-hook-with-args 'org-trigger-hook change-plist))) @@ -12639,25 +10612,31 @@ right sequence." (car org-todo-keywords-1)) (t (nth 2 (assoc kwd org-todo-kwd-alist)))))) -(defun org-fast-todo-selection () +(defun org-fast-todo-selection (&optional current-state) "Fast TODO keyword selection with single keys. -Returns the new TODO keyword, or nil if no state change should occur." +Returns the new TODO keyword, or nil if no state change should occur. +When CURRENT-STATE is given and selection letters are not unique globally, +prefer a state in the current sequence over on in another sequence." (let* ((fulltable org-todo-key-alist) + (head (org-get-todo-sequence-head current-state)) (done-keywords org-done-keywords) ;; needed for the faces. (maxlen (apply 'max (mapcar (lambda (x) (if (stringp (car x)) (string-width (car x)) 0)) fulltable))) - (expert nil) + (expert (equal org-use-fast-todo-selection 'expert)) + (prompt "") (fwidth (+ maxlen 3 1 3)) (ncol (/ (- (window-width) 4) fwidth)) - tg cnt e c tbl - groups ingroup) + tg cnt e c tbl subtable + groups ingroup in-current-sequence) (save-excursion (save-window-excursion (if expert (set-buffer (get-buffer-create " *Org todo*")) - (org-switch-to-buffer-other-window (get-buffer-create " *Org todo*"))) + (delete-other-windows) + (set-window-buffer (split-window-vertically) (get-buffer-create " *Org todo*")) + (org-switch-to-buffer-other-window " *Org todo*")) (erase-buffer) (setq-local org-done-keywords done-keywords) (setq tbl fulltable cnt 0) @@ -12668,9 +10647,11 @@ Returns the new TODO keyword, or nil if no state change should occur." (unless (= cnt 0) (setq cnt 0) (insert "\n")) + (setq prompt (concat prompt "{")) (insert "{ ")) ((equal e '(:endgroup)) - (setq ingroup nil cnt 0) + (setq ingroup nil cnt 0 in-current-sequence nil) + (setq prompt (concat prompt "}")) (insert "}\n")) ((equal e '(:newline)) (unless (= cnt 0) @@ -12682,10 +10663,13 @@ Returns the new TODO keyword, or nil if no state change should occur." (setq tbl (cdr tbl))))) (t (setq tg (car e) c (cdr e)) + (if (equal tg head) (setq in-current-sequence t)) (when ingroup (push tg (car groups))) + (when in-current-sequence (push e subtable)) (setq tg (org-add-props tg nil 'face (org-get-todo-face tg))) (when (and (= cnt 0) (not ingroup)) (insert " ")) + (setq prompt (concat prompt "[" (char-to-string c) "] " tg " ")) (insert "[" c "] " tg (make-string (- fwidth 4 (length tg)) ?\ )) (when (and (= (setq cnt (1+ cnt)) ncol) @@ -12697,14 +10681,17 @@ Returns the new TODO keyword, or nil if no state change should occur." (insert "\n") (goto-char (point-min)) (unless expert (org-fit-window-to-buffer)) - (message "[a-z..]:Set [SPC]:clear") + (message (concat "[a-z..]:Set [SPC]:clear" + (if expert (concat "\n" prompt) ""))) (setq c (let ((inhibit-quit t)) (read-char-exclusive))) + (setq subtable (nreverse subtable)) (cond ((or (= c ?\C-g) (and (= c ?q) (not (rassoc c fulltable)))) (setq quit-flag t)) ((= c ?\ ) nil) - ((setq e (rassoc c fulltable) tg (car e)) + ((setq e (or (rassoc c subtable) (rassoc c fulltable)) + tg (car e)) tg) (t (setq quit-flag t))))))) @@ -12905,7 +10892,7 @@ of `org-todo-keywords-1'." (interactive "P") (let ((case-fold-search nil) (kwd-re - (cond ((null arg) org-not-done-regexp) + (cond ((null arg) (concat org-not-done-regexp "\\s-")) ((equal arg '(4)) (let ((kwd (completing-read "Keyword (or KWD1|KWD2|...): " @@ -13610,7 +11597,7 @@ from the `before-change-functions' in the current buffer." When called interactively with a `\\[universal-argument]' prefix, show the priority in the minibuffer instead of changing it. -When called programatically, ACTION can be `set', `up', `down', +When called programmatically, ACTION can be `set', `up', `down', or a character." (interactive "P") (when show @@ -13714,7 +11701,7 @@ and by additional input from the age of a schedules or deadline entry." "Find priority cookie and return priority." (save-match-data (if (functionp org-get-priority-function) - (funcall org-get-priority-function) + (funcall org-get-priority-function s) (if (not (string-match org-priority-regexp s)) (* 1000 (- org-lowest-priority org-default-priority)) (* 1000 (- org-lowest-priority @@ -14308,60 +12295,66 @@ tags." When called with `\\[universal-argument]' prefix argument ARG, \ realign all tags -in the current buffer. If a region is active, set tags for -all headlines in the region. +in the current buffer. + +When called with `\\[universal-argument] \\[universal-argument]' prefix argument, \ +unconditionally do not +offer the fast tag selection interface. + +If a region is active, set tags in the region according to the +setting of `org-loop-over-headlines-in-active-region'. This function is for interactive use only; in Lisp code use `org-set-tags' instead." (interactive "P") - (cond - (arg (org-align-tags t)) - ((and (org-region-active-p) org-loop-over-headlines-in-active-region) - ;; Disable `org-loop-over-headlines-in-active-region' for - ;; successive calls. - (let (org-loop-over-headlines-in-active-region) - (org-map-entries - #'org-set-tags-command - nil - (if (eq org-loop-over-headlines-in-active-region 'start-level) - 'region-start-level - 'region) - (lambda () (when (org-invisible-p) (org-end-of-subtree nil t)))))) - (t - (save-excursion - (org-back-to-heading) - (let* ((all-tags (org-get-tags)) - (table (setq org-last-tags-completion-table - (org--tag-add-to-alist - (and org-complete-tags-always-offer-all-agenda-tags - (org-global-tags-completion-table - (org-agenda-files))) - (or org-current-tag-alist (org-get-buffer-tags))))) - (current-tags - (cl-remove-if (lambda (tag) (get-text-property 0 'inherited tag)) - all-tags)) - (inherited-tags - (cl-remove-if-not (lambda (tag) (get-text-property 0 'inherited tag)) - all-tags)) - (tags - (replace-regexp-in-string - ;; Ignore all forbidden characters in tags. - "[^[:alnum:]_@#%]+" ":" - (if (or (eq t org-use-fast-tag-selection) - (and org-use-fast-tag-selection - (delq nil (mapcar #'cdr table)))) - (org-fast-tag-selection - current-tags - inherited-tags - table - (and org-fast-tag-selection-include-todo org-todo-key-alist)) - (let ((org-add-colon-after-tag-completion (< 1 (length table)))) - (org-trim (completing-read - "Tags: " - #'org-tags-completion-function - nil nil (org-make-tag-string current-tags) - 'org-tags-history))))))) - (org-set-tags tags)))))) + (let ((org-use-fast-tag-selection + (unless (equal '(16) arg) org-use-fast-tag-selection))) + (cond + ((equal '(4) arg) (org-align-tags t)) + ((and (org-region-active-p) org-loop-over-headlines-in-active-region) + (let (org-loop-over-headlines-in-active-region) ; hint: infinite recursion. + (org-map-entries + #'org-set-tags-command + nil + (if (eq org-loop-over-headlines-in-active-region 'start-level) + 'region-start-level + 'region) + (lambda () (when (org-invisible-p) (org-end-of-subtree nil t)))))) + (t + (save-excursion + (org-back-to-heading) + (let* ((all-tags (org-get-tags)) + (table (setq org-last-tags-completion-table + (org--tag-add-to-alist + (and org-complete-tags-always-offer-all-agenda-tags + (org-global-tags-completion-table + (org-agenda-files))) + (or org-current-tag-alist (org-get-buffer-tags))))) + (current-tags + (cl-remove-if (lambda (tag) (get-text-property 0 'inherited tag)) + all-tags)) + (inherited-tags + (cl-remove-if-not (lambda (tag) (get-text-property 0 'inherited tag)) + all-tags)) + (tags + (replace-regexp-in-string + ;; Ignore all forbidden characters in tags. + "[^[:alnum:]_@#%]+" ":" + (if (or (eq t org-use-fast-tag-selection) + (and org-use-fast-tag-selection + (delq nil (mapcar #'cdr table)))) + (org-fast-tag-selection + current-tags + inherited-tags + table + (and org-fast-tag-selection-include-todo org-todo-key-alist)) + (let ((org-add-colon-after-tag-completion (< 1 (length table)))) + (org-trim (completing-read + "Tags: " + #'org-tags-completion-function + nil nil (org-make-tag-string current-tags) + 'org-tags-history))))))) + (org-set-tags tags))))))) (defun org-align-tags (&optional all) "Align tags in current entry. @@ -15037,7 +13030,7 @@ variables is set." value) (when (equal (org-get-heading t t t t) (bound-and-true-p org-clock-current-task)) - (setq org-clock-effort (org-get-at-bol 'effort)) + (setq org-clock-effort value) (org-clock-update-mode-line)) (message "%s is now %s" org-effort-property value))) @@ -15593,7 +13586,9 @@ COLUMN formats in the current buffer." (delete-dups values)))) (defun org-insert-property-drawer () - "Insert a property drawer into the current entry." + "Insert a property drawer into the current entry. +Do nothing if the drawer already exists. The newly created +drawer is immediately hidden." (org-with-wide-buffer (if (or (not (featurep 'org-inlinetask)) (org-inlinetask-in-task-p)) (org-back-to-heading t) @@ -15608,6 +13603,7 @@ COLUMN formats in the current buffer." (let ((begin (1+ (point))) (inhibit-read-only t)) (insert "\n:PROPERTIES:\n:END:") + (org-flag-drawer t nil (line-end-position 0) (point)) (when (eobp) (insert "\n")) (org-indent-region begin (point)))))) @@ -16139,78 +14135,6 @@ with the current time without prompting the user." (defvar org-read-date-analyze-futurep nil) (defvar org-read-date-analyze-forced-year nil) (defvar org-read-date-inactive) - -(defvar org-read-date-minibuffer-local-map - (let* ((map (make-sparse-keymap))) - (set-keymap-parent map minibuffer-local-map) - (org-defkey map (kbd ".") - (lambda () (interactive) - ;; Are we at the beginning of the prompt? - (if (looking-back "^[^:]+: " - (let ((inhibit-field-text-motion t)) - (line-beginning-position))) - (org-eval-in-calendar '(calendar-goto-today)) - (insert ".")))) - (org-defkey map (kbd "C-.") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-goto-today)))) - (org-defkey map (kbd "M-S-") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-backward-month 1)))) - (org-defkey map (kbd "ESC S-") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-backward-month 1)))) - (org-defkey map (kbd "M-S-") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-forward-month 1)))) - (org-defkey map (kbd "ESC S-") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-forward-month 1)))) - (org-defkey map (kbd "M-S-") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-backward-year 1)))) - (org-defkey map (kbd "ESC S-") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-backward-year 1)))) - (org-defkey map (kbd "M-S-") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-forward-year 1)))) - (org-defkey map (kbd "ESC S-") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-forward-year 1)))) - (org-defkey map (kbd "S-") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-backward-week 1)))) - (org-defkey map (kbd "S-") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-forward-week 1)))) - (org-defkey map (kbd "S-") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-backward-day 1)))) - (org-defkey map (kbd "S-") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-forward-day 1)))) - (org-defkey map (kbd "!") - (lambda () (interactive) - (org-eval-in-calendar '(diary-view-entries)) - (message ""))) - (org-defkey map (kbd ">") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-scroll-left 1)))) - (org-defkey map (kbd "<") - (lambda () (interactive) - (org-eval-in-calendar '(calendar-scroll-right 1)))) - (org-defkey map (kbd "C-v") - (lambda () (interactive) - (org-eval-in-calendar - '(calendar-scroll-left-three-months 1)))) - (org-defkey map (kbd "M-v") - (lambda () (interactive) - (org-eval-in-calendar - '(calendar-scroll-right-three-months 1)))) - map) - "Keymap for minibuffer commands when using `org-read-date'.") - (defvar org-def) (defvar org-defdecode) (defvar org-with-time) @@ -17596,12 +15520,10 @@ If there is already a time stamp at the cursor position, update it." (encode-time 0 0 0 (nth 1 cal-date) (car cal-date) (nth 2 cal-date)))))) (defcustom org-image-actual-width t - "Should we use the actual width of images when inlining them? + "When non-nil, use the actual width of images when inlining them. -When set to t, always use the image width. - -When set to a number, use imagemagick (when available) to set -the image's width to this value. +When set to a number, use imagemagick (when available) to set the +image's width to this value. When set to a number in a list, try to get the width from any #+ATTR.* keyword if it matches a width specification like @@ -17613,7 +15535,9 @@ and fall back on that number if none is found. When set to nil, try to get the width from an #+ATTR.* keyword and fall back on the original width if none is found. -This requires Emacs >= 24.1, build with imagemagick support." +When set to any other non-nil value, always use the image width. + +This requires Emacs >= 24.1, built with imagemagick support." :group 'org-appearance :version "24.4" :package-version '(Org . "8.0") @@ -18214,7 +16138,7 @@ looks only before point, not after." (org-in-regexp "\\\\[a-zA-Z]+\\*?\\(\\(\\[[^][\n{}]*\\]\\)\\|\\({[^{}\n]*}\\)\\)*"))) -(defun org--format-latex-make-overlay (beg end image &optional imagetype) +(defun org--make-preview-overlay (beg end image &optional imagetype) "Build an overlay between BEG and END using IMAGE file. Argument IMAGETYPE is the extension of the displayed image, as a string. It defaults to \"png\"." @@ -18230,88 +16154,91 @@ as a string. It defaults to \"png\"." 'display (list 'image :type imagetype :file image :ascent 'center)))) -(defun org--list-latex-overlays (&optional beg end) - "List all Org LaTeX overlays in current buffer. -Limit to overlays between BEG and END when those are provided." - (cl-remove-if-not - (lambda (o) (eq (overlay-get o 'org-overlay-type) 'org-latex-overlay)) - (overlays-in (or beg (point-min)) (or end (point-max))))) - -(defun org-remove-latex-fragment-image-overlays (&optional beg end) +(defun org-clear-latex-preview (&optional beg end) "Remove all overlays with LaTeX fragment images in current buffer. When optional arguments BEG and END are non-nil, remove all overlays between them instead. Return a non-nil value when some overlays were removed, nil otherwise." - (let ((overlays (org--list-latex-overlays beg end))) + (let ((overlays + (cl-remove-if-not + (lambda (o) (eq (overlay-get o 'org-overlay-type) 'org-latex-overlay)) + (overlays-in (or beg (point-min)) (or end (point-max)))))) (mapc #'delete-overlay overlays) overlays)) -(defun org-toggle-latex-fragment (&optional arg) - "Preview the LaTeX fragment at point, or all locally or globally. - -If the cursor is on a LaTeX fragment, create the image and overlay -it over the source code, if there is none. Remove it otherwise. -If there is no fragment at point, display all fragments in the -current section. +(defun org--latex-preview-region (beg end) + "Preview LaTeX fragments between BEG and END. +BEG and END are buffer positions." + (let ((file (buffer-file-name (buffer-base-buffer)))) + (save-excursion + (org-format-latex + (concat org-preview-latex-image-directory "org-ltximg") + beg end + ;; Emacs cannot overlay images from remote hosts. Create it in + ;; `temporary-file-directory' instead. + (if (or (not file) (file-remote-p file)) + temporary-file-directory + default-directory) + 'overlays nil 'forbuffer org-preview-latex-default-process)))) + +(defun org-latex-preview (&optional arg) + "Toggle preview of the LaTeX fragment at point. + +If the cursor is on a LaTeX fragment, create the image and +overlay it over the source code, if there is none. Remove it +otherwise. If there is no fragment at point, display images for +all fragments in the current section. + +With a `\\[universal-argument]' prefix argument ARG, clear images \ +for all fragments +in the current section. + +With a `\\[universal-argument] \\[universal-argument]' prefix \ +argument ARG, display image for all +fragments in the buffer. -With prefix ARG, preview or clear image for all fragments in the -current subtree or in the whole buffer when used before the first -headline. With a prefix ARG `\\[universal-argument] \ -\\[universal-argument]' preview or clear images -for all fragments in the buffer." +With a `\\[universal-argument] \\[universal-argument] \ +\\[universal-argument]' prefix argument ARG, clear image for all +fragments in the buffer." (interactive "P") - (when (display-graphic-p) - (catch 'exit - (save-excursion - (let (beg end msg) - (cond - ((or (equal arg '(16)) - (and (equal arg '(4)) - (org-with-limited-levels (org-before-first-heading-p)))) - (if (org-remove-latex-fragment-image-overlays) - (progn (message "LaTeX fragments images removed from buffer") - (throw 'exit nil)) - (setq msg "Creating images for buffer..."))) - ((equal arg '(4)) - (org-with-limited-levels (org-back-to-heading t)) - (setq beg (point)) - (setq end (progn (org-end-of-subtree t) (point))) - (if (org-remove-latex-fragment-image-overlays beg end) - (progn - (message "LaTeX fragment images removed from subtree") - (throw 'exit nil)) - (setq msg "Creating images for subtree..."))) - ((let ((datum (org-element-context))) - (when (memq (org-element-type datum) - '(latex-environment latex-fragment)) - (setq beg (org-element-property :begin datum)) - (setq end (org-element-property :end datum)) - (if (org-remove-latex-fragment-image-overlays beg end) - (progn (message "LaTeX fragment image removed") - (throw 'exit nil)) - (setq msg "Creating image..."))))) - (t - (org-with-limited-levels - (setq beg (if (org-at-heading-p) (line-beginning-position) - (outline-previous-heading) - (point))) - (setq end (progn (outline-next-heading) (point))) - (if (org-remove-latex-fragment-image-overlays beg end) - (progn - (message "LaTeX fragment images removed from section") - (throw 'exit nil)) - (setq msg "Creating images for section..."))))) - (let ((file (buffer-file-name (buffer-base-buffer)))) - (org-format-latex - (concat org-preview-latex-image-directory "org-ltximg") - beg end - ;; Emacs cannot overlay images from remote hosts. Create - ;; it in `temporary-file-directory' instead. - (if (or (not file) (file-remote-p file)) - temporary-file-directory - default-directory) - 'overlays msg 'forbuffer org-preview-latex-default-process)) - (message (concat msg "done"))))))) + (cond + ((not (display-graphic-p)) nil) + ;; Clear whole buffer. + ((equal arg '(64)) + (org-clear-latex-preview (point-min) (point-max)) + (message "LaTeX previews removed from buffer")) + ;; Preview whole buffer. + ((equal arg '(16)) + (message "Creating LaTeX previews in buffer...") + (org--latex-preview-region (point-min) (point-max)) + (message "Creating LaTeX previews in buffer... done.")) + ;; Clear current section. + ((equal arg '(4)) + (org-clear-latex-preview + (if (org-before-first-heading-p) (point-min) + (save-excursion + (org-with-limited-levels (org-back-to-heading t) (point)))) + (org-with-limited-levels (org-entry-end-position)))) + ;; Toggle preview on LaTeX code at point. + ((let ((datum (org-element-context))) + (and (memq (org-element-type datum) '(latex-environment latex-fragment)) + (let ((beg (org-element-property :begin datum)) + (end (org-element-property :end datum))) + (if (org-clear-latex-preview beg end) + (message "LaTeX preview removed") + (message "Creating LaTeX preview...") + (org--latex-preview-region beg end) + (message "Creating LaTeX preview... done.")) + t)))) + ;; Preview current section. + (t + (let ((beg (if (org-before-first-heading-p) (point-min) + (save-excursion + (org-with-limited-levels (org-back-to-heading t) (point))))) + (end (org-with-limited-levels (org-entry-end-position)))) + (message "Creating LaTeX previews in section...") + (org--latex-preview-region beg end) + (message "Creating LaTeX previews in section... done."))))) (defun org-format-latex (prefix &optional beg end dir overlays msg forbuffer processing-type) @@ -18412,7 +16339,7 @@ Some of the options can be changed using the variable (when (eq (overlay-get o 'org-overlay-type) 'org-latex-overlay) (delete-overlay o))) - (org--format-latex-make-overlay beg end movefile imagetype) + (org--make-preview-overlay beg end movefile imagetype) (goto-char end)) (delete-region beg end) (insert @@ -18438,7 +16365,7 @@ Some of the options can be changed using the variable (defun org-create-math-formula (latex-frag &optional mathml-file) "Convert LATEX-FRAG to MathML and store it in MATHML-FILE. Use `org-latex-to-mathml-convert-command'. If the conversion is -sucessful, return the portion between \" \" +successful, return the portion between \" \" elements otherwise return nil. When MATHML-FILE is specified, write the results in to that file. When invoked as an interactive command, prompt for LATEX-FRAG, with initial value @@ -18558,7 +16485,6 @@ a HTML file." (cdr (assq processing-type org-preview-latex-process-alist))) (programs (plist-get processing-info :programs)) (error-message (or (plist-get processing-info :message) "")) - (use-xcolor (plist-get processing-info :use-xcolor)) (image-input-type (plist-get processing-info :image-input-type)) (image-output-type (plist-get processing-info :image-output-type)) (post-clean (or (plist-get processing-info :post-clean) @@ -18589,36 +16515,27 @@ a HTML file." (resize-mini-windows nil)) ;Fix Emacs flicker when creating image. (dolist (program programs) (org-check-external-command program error-message)) - (if use-xcolor - (progn (if (eq fg 'default) - (setq fg (org-latex-color :foreground)) - (setq fg (org-latex-color-format fg))) - (if (eq bg 'default) - (setq bg (org-latex-color :background)) - (setq bg (org-latex-color-format - (if (string= bg "Transparent") "white" bg)))) - (with-temp-file texfile - (insert latex-header) - (insert "\n\\begin{document}\n" - "\\definecolor{fg}{rgb}{" fg "}\n" - "\\definecolor{bg}{rgb}{" bg "}\n" - "\n\\pagecolor{bg}\n" - "\n{\\color{fg}\n" - string - "\n}\n" - "\n\\end{document}\n"))) - (if (eq fg 'default) - (setq fg (org-dvipng-color :foreground)) - (unless (string= fg "Transparent") - (setq fg (org-dvipng-color-format fg)))) - (if (eq bg 'default) - (setq bg (org-dvipng-color :background)) - (unless (string= bg "Transparent") - (setq bg (org-dvipng-color-format bg)))) - (with-temp-file texfile - (insert latex-header) - (insert "\n\\begin{document}\n" string "\n\\end{document}\n"))) - + (if (eq fg 'default) + (setq fg (org-latex-color :foreground)) + (setq fg (org-latex-color-format fg))) + (if (eq bg 'default) + (setq bg (org-latex-color :background)) + (setq bg (org-latex-color-format + (if (string= bg "Transparent") "white" bg)))) + ;; Remove TeX \par at end of snippet to avoid trailing space. + (if (string-suffix-p string "\n") + (aset string (1- (length string)) ?%) + (setq string (concat string "%"))) + (with-temp-file texfile + (insert latex-header) + (insert "\n\\begin{document}\n" + "\\definecolor{fg}{rgb}{" fg "}%\n" + "\\definecolor{bg}{rgb}{" bg "}%\n" + "\n\\pagecolor{bg}%\n" + "\n{\\color{fg}\n" + string + "\n}\n" + "\n\\end{document}\n")) (let* ((err-msg (format "Please adjust `%s' part of \ `org-preview-latex-process-alist'." processing-type)) @@ -18628,9 +16545,7 @@ a HTML file." (image-output-file (org-compile-file image-input-file image-converter image-output-type err-msg log-buf - `((?F . ,(shell-quote-argument fg)) - (?B . ,(shell-quote-argument bg)) - (?D . ,(shell-quote-argument (format "%s" dpi))) + `((?D . ,(shell-quote-argument (format "%s" dpi))) (?S . ,(shell-quote-argument (format "%s" (/ dpi 140.0)))))))) (copy-file image-output-file tofile 'replace) (dolist (e post-clean) @@ -18766,6 +16681,8 @@ conventions: type. In this case, that link must be a well-formed plain or angle link, i.e., it must have an explicit \"file\" type. +Equip each image with the key-map `image-map'. + When optional argument INCLUDE-LINKED is non-nil, also links with a text description part will be inlined. This can be nice for a quick look at those images, but it does not reflect what @@ -18773,119 +16690,125 @@ exported files will look like. When optional argument REFRESH is non-nil, refresh existing images between BEG and END. This will create new image displays -only if necessary. BEG and END default to the buffer -boundaries." +only if necessary. + +BEG and END define the considered part. They default to the +buffer boundaries with possible narrowing." (interactive "P") (when (display-graphic-p) (unless refresh (org-remove-inline-images) (when (fboundp 'clear-image-cache) (clear-image-cache))) - (org-with-point-at (or beg 1) - (let* ((case-fold-search t) - (file-extension-re (image-file-name-regexp)) - (link-abbrevs (mapcar #'car - (append org-link-abbrev-alist-local - org-link-abbrev-alist))) - ;; Check absolute, relative file names and explicit - ;; "file:" links. Also check link abbreviations since - ;; some might expand to "file" links. - (file-types-re - (format "\\[\\[\\(?:file%s:\\|[./~]\\)\\|\\]\\[\\(") #'org-cycle) -(org-defkey org-mode-map (kbd "C-") #'org-force-cycle-archived) -(org-defkey org-mode-map (kbd "M-") #'pcomplete) -(org-defkey org-mode-map (kbd "M-TAB") #'pcomplete) -(org-defkey org-mode-map (kbd "ESC ") #'pcomplete) -(org-defkey org-mode-map (kbd "ESC TAB") #'pcomplete) - -(org-defkey org-mode-map (kbd "") #'org-shifttab) -(org-defkey org-mode-map (kbd "S-") #'org-shifttab) -(define-key org-mode-map (kbd "") #'org-shifttab) - -;;;; RET key with modifiers -(org-defkey org-mode-map (kbd "S-") #'org-table-copy-down) -(org-defkey org-mode-map (kbd "M-S-") #'org-insert-todo-heading) -(org-defkey org-mode-map (kbd "ESC S-") #'org-insert-todo-heading) -(org-defkey org-mode-map (kbd "M-RET") #'org-meta-return) -(org-defkey org-mode-map (kbd "ESC RET") #'org-meta-return) - -;;;; Cursor keys with modifiers -(org-defkey org-mode-map (kbd "M-") #'org-metaleft) -(org-defkey org-mode-map (kbd "M-") #'org-metaright) -(org-defkey org-mode-map (kbd "ESC ") #'org-metaright) -(org-defkey org-mode-map (kbd "M-") #'org-metaup) -(org-defkey org-mode-map (kbd "ESC ") #'org-metaup) -(org-defkey org-mode-map (kbd "M-") #'org-metadown) -(org-defkey org-mode-map (kbd "ESC ") #'org-metadown) - -(org-defkey org-mode-map (kbd "C-M-S-") #'org-increase-number-at-point) -(org-defkey org-mode-map (kbd "C-M-S-") #'org-decrease-number-at-point) -(org-defkey org-mode-map (kbd "M-S-") #'org-shiftmetaleft) -(org-defkey org-mode-map (kbd "ESC S-") #'org-shiftmetaleft) -(org-defkey org-mode-map (kbd "M-S-") #'org-shiftmetaright) -(org-defkey org-mode-map (kbd "ESC S-") #'org-shiftmetaright) -(org-defkey org-mode-map (kbd "M-S-") #'org-shiftmetaup) -(org-defkey org-mode-map (kbd "ESC S-") #'org-shiftmetaup) -(org-defkey org-mode-map (kbd "M-S-") #'org-shiftmetadown) -(org-defkey org-mode-map (kbd "ESC S-") #'org-shiftmetadown) - -(org-defkey org-mode-map (kbd "S-") #'org-shiftup) -(org-defkey org-mode-map (kbd "S-") #'org-shiftdown) -(org-defkey org-mode-map (kbd "S-") #'org-shiftleft) -(org-defkey org-mode-map (kbd "S-") #'org-shiftright) - -(org-defkey org-mode-map (kbd "C-S-") #'org-shiftcontrolright) -(org-defkey org-mode-map (kbd "C-S-") #'org-shiftcontrolleft) -(org-defkey org-mode-map (kbd "C-S-") #'org-shiftcontrolup) -(org-defkey org-mode-map (kbd "C-S-") #'org-shiftcontroldown) - -;;;; Babel keys -(define-key org-mode-map org-babel-key-prefix org-babel-map) -(pcase-dolist (`(,key . ,def) org-babel-key-bindings) - (define-key org-babel-map key def)) - -;;;; Extra keys for TTY access. - -;; We only set them when really needed because otherwise the -;; menus don't show the simple keys - -(when (or org-use-extra-keys (not window-system)) - (org-defkey org-mode-map (kbd "C-c C-x c") #'org-table-copy-down) - (org-defkey org-mode-map (kbd "C-c C-x m") #'org-meta-return) - (org-defkey org-mode-map (kbd "C-c C-x M") #'org-insert-todo-heading) - (org-defkey org-mode-map (kbd "C-c C-x RET") #'org-meta-return) - (org-defkey org-mode-map (kbd "ESC RET") #'org-meta-return) - (org-defkey org-mode-map (kbd "ESC ") #'org-metaleft) - (org-defkey org-mode-map (kbd "C-c C-x l") #'org-metaleft) - (org-defkey org-mode-map (kbd "ESC ") #'org-metaright) - (org-defkey org-mode-map (kbd "C-c C-x r") #'org-metaright) - (org-defkey org-mode-map (kbd "C-c C-x u") #'org-metaup) - (org-defkey org-mode-map (kbd "C-c C-x d") #'org-metadown) - (org-defkey org-mode-map (kbd "C-c C-x L") #'org-shiftmetaleft) - (org-defkey org-mode-map (kbd "C-c C-x R") #'org-shiftmetaright) - (org-defkey org-mode-map (kbd "C-c C-x U") #'org-shiftmetaup) - (org-defkey org-mode-map (kbd "C-c C-x D") #'org-shiftmetadown) - (org-defkey org-mode-map (kbd "C-c ") #'org-shiftup) - (org-defkey org-mode-map (kbd "C-c ") #'org-shiftdown) - (org-defkey org-mode-map (kbd "C-c ") #'org-shiftleft) - (org-defkey org-mode-map (kbd "C-c ") #'org-shiftright) - (org-defkey org-mode-map (kbd "C-c C-x ") #'org-shiftcontrolright) - (org-defkey org-mode-map (kbd "C-c C-x ") #'org-shiftcontrolleft)) - -;;;; Narrow map -(org-defkey narrow-map "s" #'org-narrow-to-subtree) -(org-defkey narrow-map "b" #'org-narrow-to-block) -(org-defkey narrow-map "e" #'org-narrow-to-element) - -;;;; Remap usual Emacs bindings -(org-remap org-mode-map - 'self-insert-command 'org-self-insert-command - 'delete-char 'org-delete-char - 'delete-backward-char 'org-delete-backward-char - 'kill-line 'org-kill-line - 'open-line 'org-open-line - 'yank 'org-yank - 'comment-dwim 'org-comment-dwim - 'move-beginning-of-line 'org-beginning-of-line - 'move-end-of-line 'org-end-of-line - 'forward-paragraph 'org-forward-paragraph - 'backward-paragraph 'org-backward-paragraph - 'backward-sentence 'org-backward-sentence - 'forward-sentence 'org-forward-sentence - 'fill-paragraph 'org-fill-paragraph - 'delete-indentation 'org-delete-indentation - 'transpose-words 'org-transpose-words) - -;;;; All the other keys -(org-defkey org-mode-map (kbd "|") #'org-force-self-insert) -(org-defkey org-mode-map (kbd "C-c C-r") #'org-reveal) -(org-defkey org-mode-map (kbd "C-M-t") #'org-transpose-element) -(org-defkey org-mode-map (kbd "M-}") #'org-forward-element) -(org-defkey org-mode-map (kbd "ESC }") #'org-forward-element) -(org-defkey org-mode-map (kbd "M-{") #'org-backward-element) -(org-defkey org-mode-map (kbd "ESC {") #'org-backward-element) -(org-defkey org-mode-map (kbd "C-c C-^") #'org-up-element) -(org-defkey org-mode-map (kbd "C-c C-_") #'org-down-element) -(org-defkey org-mode-map (kbd "C-c C-f") #'org-forward-heading-same-level) -(org-defkey org-mode-map (kbd "C-c C-b") #'org-backward-heading-same-level) -(org-defkey org-mode-map (kbd "C-c M-f") #'org-next-block) -(org-defkey org-mode-map (kbd "C-c M-b") #'org-previous-block) -(org-defkey org-mode-map (kbd "C-c $") #'org-archive-subtree) -(org-defkey org-mode-map (kbd "C-c C-x C-s") #'org-archive-subtree) -(org-defkey org-mode-map (kbd "C-c C-x C-a") #'org-archive-subtree-default) -(org-defkey org-mode-map (kbd "C-c C-x d") #'org-insert-drawer) -(org-defkey org-mode-map (kbd "C-c C-x a") #'org-toggle-archive-tag) -(org-defkey org-mode-map (kbd "C-c C-x A") #'org-archive-to-archive-sibling) -(org-defkey org-mode-map (kbd "C-c C-x b") #'org-tree-to-indirect-buffer) -(org-defkey org-mode-map (kbd "C-c C-x q") #'org-toggle-tags-groups) -(org-defkey org-mode-map (kbd "C-c C-j") #'org-goto) -(org-defkey org-mode-map (kbd "C-c C-t") #'org-todo) -(org-defkey org-mode-map (kbd "C-c C-q") #'org-set-tags-command) -(org-defkey org-mode-map (kbd "C-c C-s") #'org-schedule) -(org-defkey org-mode-map (kbd "C-c C-d") #'org-deadline) -(org-defkey org-mode-map (kbd "C-c ;") #'org-toggle-comment) -(org-defkey org-mode-map (kbd "C-c C-w") #'org-refile) -(org-defkey org-mode-map (kbd "C-c M-w") #'org-copy) -(org-defkey org-mode-map (kbd "C-c /") #'org-sparse-tree) ;minor-mode reserved -(org-defkey org-mode-map (kbd "C-c \\") #'org-match-sparse-tree) ;minor-mode r. -(org-defkey org-mode-map (kbd "C-c RET") #'org-ctrl-c-ret) -(org-defkey org-mode-map (kbd "C-c C-x c") #'org-clone-subtree-with-time-shift) -(org-defkey org-mode-map (kbd "C-c C-x v") #'org-copy-visible) -(org-defkey org-mode-map (kbd "C-") #'org-insert-heading-respect-content) -(org-defkey org-mode-map (kbd "C-S-") #'org-insert-todo-heading-respect-content) -(org-defkey org-mode-map (kbd "C-c C-x C-n") #'org-next-link) -(org-defkey org-mode-map (kbd "C-c C-x C-p") #'org-previous-link) -(org-defkey org-mode-map (kbd "C-c C-l") #'org-insert-link) -(org-defkey org-mode-map (kbd "C-c M-l") #'org-insert-last-stored-link) -(org-defkey org-mode-map (kbd "C-c C-M-l") #'org-insert-all-links) -(org-defkey org-mode-map (kbd "C-c C-o") #'org-open-at-point) -(org-defkey org-mode-map (kbd "C-c %") #'org-mark-ring-push) -(org-defkey org-mode-map (kbd "C-c &") #'org-mark-ring-goto) -(org-defkey org-mode-map (kbd "C-c C-z") #'org-add-note) ;alternative binding -(org-defkey org-mode-map (kbd "C-c .") #'org-time-stamp) ;minor-mode reserved -(org-defkey org-mode-map (kbd "C-c !") #'org-time-stamp-inactive) ;minor-mode r. -(org-defkey org-mode-map (kbd "C-c ,") #'org-priority) ;minor-mode reserved -(org-defkey org-mode-map (kbd "C-c C-y") #'org-evaluate-time-range) -(org-defkey org-mode-map (kbd "C-c >") #'org-goto-calendar) -(org-defkey org-mode-map (kbd "C-c <") #'org-date-from-calendar) -(org-defkey org-mode-map (kbd "C-,") #'org-cycle-agenda-files) -(org-defkey org-mode-map (kbd "C-'") #'org-cycle-agenda-files) -(org-defkey org-mode-map (kbd "C-c [") #'org-agenda-file-to-front) -(org-defkey org-mode-map (kbd "C-c ]") #'org-remove-file) -(org-defkey org-mode-map (kbd "C-c C-x <") #'org-agenda-set-restriction-lock) -(org-defkey org-mode-map (kbd "C-c C-x >") #'org-agenda-remove-restriction-lock) -(org-defkey org-mode-map (kbd "C-c -") #'org-ctrl-c-minus) -(org-defkey org-mode-map (kbd "C-c *") #'org-ctrl-c-star) -(org-defkey org-mode-map (kbd "C-c TAB") #'org-ctrl-c-tab) -(org-defkey org-mode-map (kbd "C-c ^") #'org-sort) -(org-defkey org-mode-map (kbd "C-c C-c") #'org-ctrl-c-ctrl-c) -(org-defkey org-mode-map (kbd "C-c C-k") #'org-kill-note-or-show-branches) -(org-defkey org-mode-map (kbd "C-c #") #'org-update-statistics-cookies) -(org-defkey org-mode-map (kbd "RET") #'org-return) -(org-defkey org-mode-map (kbd "C-j") #'org-return-indent) -(org-defkey org-mode-map (kbd "C-c ?") #'org-table-field-info) -(org-defkey org-mode-map (kbd "C-c SPC") #'org-table-blank-field) -(org-defkey org-mode-map (kbd "C-c +") #'org-table-sum) -(org-defkey org-mode-map (kbd "C-c =") #'org-table-eval-formula) -(org-defkey org-mode-map (kbd "C-c '") #'org-edit-special) -(org-defkey org-mode-map (kbd "C-c `") #'org-table-edit-field) -(org-defkey org-mode-map (kbd "C-c \" a") #'orgtbl-ascii-plot) -(org-defkey org-mode-map (kbd "C-c \" g") #'org-plot/gnuplot) -(org-defkey org-mode-map (kbd "C-c |") #'org-table-create-or-convert-from-region) -(org-defkey org-mode-map (kbd "C-#") #'org-table-rotate-recalc-marks) -(org-defkey org-mode-map (kbd "C-c ~") #'org-table-create-with-table.el) -(org-defkey org-mode-map (kbd "C-c C-a") #'org-attach) -(org-defkey org-mode-map (kbd "C-c }") #'org-table-toggle-coordinate-overlays) -(org-defkey org-mode-map (kbd "C-c {") #'org-table-toggle-formula-debugger) -(org-defkey org-mode-map (kbd "C-c C-e") #'org-export-dispatch) -(org-defkey org-mode-map (kbd "C-c :") #'org-toggle-fixed-width) -(org-defkey org-mode-map (kbd "C-c C-x C-f") #'org-emphasize) -(org-defkey org-mode-map (kbd "C-c C-x f") #'org-footnote-action) -(org-defkey org-mode-map (kbd "C-c @") #'org-mark-subtree) -(org-defkey org-mode-map (kbd "M-h") #'org-mark-element) -(org-defkey org-mode-map (kbd "ESC h") #'org-mark-element) -(org-defkey org-mode-map (kbd "C-c C-*") #'org-list-make-subtree) -(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 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) -(org-defkey org-mode-map (kbd "C-c C-x C-z") #'org-resolve-clocks) -(org-defkey org-mode-map (kbd "C-c C-x C-o") #'org-clock-out) -(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) -(org-defkey org-mode-map (kbd "C-c C-x C-M-v") #'org-redisplay-inline-images) -(org-defkey org-mode-map (kbd "C-c C-x \\") #'org-toggle-pretty-entities) -(org-defkey org-mode-map (kbd "C-c C-x C-b") #'org-toggle-checkbox) -(org-defkey org-mode-map (kbd "C-c C-x p") #'org-set-property) -(org-defkey org-mode-map (kbd "C-c C-x P") #'org-set-property-and-value) -(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) -(org-defkey org-mode-map (kbd "C-c C-x 0") #'org-timer-start) -(org-defkey org-mode-map (kbd "C-c C-x _") #'org-timer-stop) -(org-defkey org-mode-map (kbd "C-c C-x ;") #'org-timer-set-timer) -(org-defkey org-mode-map (kbd "C-c C-x ,") #'org-timer-pause-or-continue) -(org-defkey org-mode-map (kbd "C-c C-x C-c") #'org-columns) -(org-defkey org-mode-map (kbd "C-c C-x !") #'org-reload) -(org-defkey org-mode-map (kbd "C-c C-x g") #'org-feed-update-all) -(org-defkey org-mode-map (kbd "C-c C-x G") #'org-feed-goto-inbox) -(org-defkey org-mode-map (kbd "C-c C-x [") #'org-reftex-citation) -(org-defkey org-mode-map (kbd "C-c C-x I") #'org-info-find-node) - - -;;; Speed commands - -(defconst org-speed-commands-default - '( - ("Outline Navigation") - ("n" . (org-speed-move-safe 'org-next-visible-heading)) - ("p" . (org-speed-move-safe 'org-previous-visible-heading)) - ("f" . (org-speed-move-safe 'org-forward-heading-same-level)) - ("b" . (org-speed-move-safe 'org-backward-heading-same-level)) - ("F" . org-next-block) - ("B" . org-previous-block) - ("u" . (org-speed-move-safe 'outline-up-heading)) - ("j" . org-goto) - ("g" . (org-refile t)) - ("Outline Visibility") - ("c" . org-cycle) - ("C" . org-shifttab) - (" " . org-display-outline-path) - ("s" . org-toggle-narrow-to-subtree) - ("k" . org-cut-subtree) - ("=" . org-columns) - ("Outline Structure Editing") - ("U" . org-metaup) - ("D" . org-metadown) - ("r" . org-metaright) - ("l" . org-metaleft) - ("R" . org-shiftmetaright) - ("L" . org-shiftmetaleft) - ("i" . (progn (forward-char 1) (call-interactively - 'org-insert-heading-respect-content))) - ("^" . org-sort) - ("w" . org-refile) - ("a" . org-archive-subtree-default-with-confirmation) - ("@" . org-mark-subtree) - ("#" . org-toggle-comment) - ("Clock Commands") - ("I" . org-clock-in) - ("O" . org-clock-out) - ("Meta Data Editing") - ("t" . org-todo) - ("," . (org-priority)) - ("0" . (org-priority ?\ )) - ("1" . (org-priority ?A)) - ("2" . (org-priority ?B)) - ("3" . (org-priority ?C)) - (":" . org-set-tags-command) - ("e" . org-set-effort) - ("E" . org-inc-effort) - ("W" . (lambda(m) (interactive "sMinutes before warning: ") - (org-entry-put (point) "APPT_WARNTIME" m))) - ("Agenda Views etc") - ("v" . org-agenda) - ("/" . org-sparse-tree) - ("Misc") - ("o" . org-open-at-point) - ("?" . org-speed-command-help) - ("<" . (org-agenda-set-restriction-lock 'subtree)) - (">" . (org-agenda-remove-restriction-lock)) - ) - "The default speed commands.") - -(defun org-print-speed-command (e) - (if (> (length (car e)) 1) - (progn - (princ "\n") - (princ (car e)) - (princ "\n") - (princ (make-string (length (car e)) ?-)) - (princ "\n")) - (princ (car e)) - (princ " ") - (if (symbolp (cdr e)) - (princ (symbol-name (cdr e))) - (prin1 (cdr e))) - (princ "\n"))) - -(defun org-speed-command-help () - "Show the available speed commands." - (interactive) - (if (not org-use-speed-commands) - (user-error "Speed commands are not activated, customize `org-use-speed-commands'") - (with-output-to-temp-buffer "*Help*" - (princ "User-defined Speed commands\n===========================\n") - (mapc #'org-print-speed-command org-speed-commands-user) - (princ "\n") - (princ "Built-in Speed commands\n=======================\n") - (mapc #'org-print-speed-command org-speed-commands-default)) - (with-current-buffer "*Help*" - (setq truncate-lines t)))) - -(defun org-speed-move-safe (cmd) - "Execute CMD, but make sure that the cursor always ends up in a headline. -If not, return to the original position and throw an error." - (interactive) - (let ((pos (point))) - (call-interactively cmd) - (unless (and (bolp) (org-at-heading-p)) - (goto-char pos) - (error "Boundary reached while executing %s" cmd)))) - (defvar org-self-insert-command-undo-counter 0) - -(defvar org-table-auto-blank-field) ; defined in org-table.el (defvar org-speed-command nil) -(defun org-speed-command-activate (keys) - "Hook for activating single-letter speed commands. -`org-speed-commands-default' specifies a minimal command set. -Use `org-speed-commands-user' for further customization." - (when (or (and (bolp) (looking-at org-outline-regexp)) - (and (functionp org-use-speed-commands) - (funcall org-use-speed-commands))) - (cdr (assoc keys (append org-speed-commands-user - org-speed-commands-default))))) - -(defun org-babel-speed-command-activate (keys) - "Hook for activating single-letter code block commands." - (when (and (bolp) (looking-at org-babel-src-block-regexp)) - (cdr (assoc keys org-babel-key-bindings)))) - -(defcustom org-speed-command-hook - '(org-speed-command-activate org-babel-speed-command-activate) - "Hook for activating speed commands at strategic locations. -Hook functions are called in sequence until a valid handler is -found. - -Each hook takes a single argument, a user-pressed command key -which is also a `self-insert-command' from the global map. - -Within the hook, examine the cursor position and the command key -and return nil or a valid handler as appropriate. Handler could -be one of an interactive command, a function, or a form. - -Set `org-use-speed-commands' to non-nil value to enable this -hook. The default setting is `org-speed-command-activate'." - :group 'org-structure - :version "24.1" - :type 'hook) - (defun org-self-insert-command (N) "Like `self-insert-command', use overwrite-mode for whitespace in tables. If the cursor is in a table looking at whitespace, the whitespace is @@ -19899,9 +17419,10 @@ commands for more information." (t (org-drag-element-forward)))) (defun org-shiftup (&optional arg) - "Increase item in timestamp or increase priority of current headline. -Calls `org-timestamp-up' or `org-priority-up', or `org-previous-item', -depending on context. See the individual commands for more information." + "Act on current element according to context. +Call `org-timestamp-up' or `org-priority-up', or +`org-previous-item', or `org-table-move-cell-up'. See the +individual commands for more information." (interactive "P") (cond ((run-hook-with-args-until-success 'org-shiftup-hook)) @@ -19917,15 +17438,17 @@ depending on context. See the individual commands for more information." ((and (not org-support-shift-select) (org-at-item-p)) (call-interactively 'org-previous-item)) ((org-clocktable-try-shift 'up arg)) + ((org-at-table-p) (org-table-move-cell-up)) ((run-hook-with-args-until-success 'org-shiftup-final-hook)) (org-support-shift-select (org-call-for-shift-select 'previous-line)) (t (org-shiftselect-error)))) (defun org-shiftdown (&optional arg) - "Decrease item in timestamp or decrease priority of current headline. -Calls `org-timestamp-down' or `org-priority-down', or `org-next-item' -depending on context. See the individual commands for more information." + "Act on current element according to context. +Call `org-timestamp-down' or `org-priority-down', or +`org-next-item', or `org-table-move-cell-down'. See the +individual commands for more information." (interactive "P") (cond ((run-hook-with-args-until-success 'org-shiftdown-hook)) @@ -19941,20 +17464,22 @@ depending on context. See the individual commands for more information." ((and (not org-support-shift-select) (org-at-item-p)) (call-interactively 'org-next-item)) ((org-clocktable-try-shift 'down arg)) + ((org-at-table-p) (org-table-move-cell-down)) ((run-hook-with-args-until-success 'org-shiftdown-final-hook)) (org-support-shift-select (org-call-for-shift-select 'next-line)) (t (org-shiftselect-error)))) (defun org-shiftright (&optional arg) - "Cycle the thing at point or in the current line, depending on context. -Depending on context, this does one of the following: + "Act on the current element according to context. +This does one of the following: - switch a timestamp at point one day into the future - on a headline, switch to the next TODO keyword - on an item, switch entire list to the next bullet type - on a property line, switch to the next allowed value -- on a clocktable definition line, move time block into the future" +- on a clocktable definition line, move time block into the future +- in a table, move a single cell right" (interactive "P") (cond ((run-hook-with-args-until-success 'org-shiftright-hook)) @@ -19977,20 +17502,22 @@ Depending on context, this does one of the following: (org-at-property-p)) (call-interactively 'org-property-next-allowed-value)) ((org-clocktable-try-shift 'right arg)) + ((org-at-table-p) (org-table-move-cell-right)) ((run-hook-with-args-until-success 'org-shiftright-final-hook)) (org-support-shift-select (org-call-for-shift-select 'forward-char)) (t (org-shiftselect-error)))) (defun org-shiftleft (&optional arg) - "Cycle the thing at point or in the current line, depending on context. -Depending on context, this does one of the following: + "Act on current element according to context. +This does one of the following: - switch a timestamp at point one day into the past - on a headline, switch to the previous TODO keyword. - on an item, switch entire list to the previous bullet type - on a property line, switch to the previous allowed value -- on a clocktable definition line, move time block into the past" +- on a clocktable definition line, move time block into the past +- in a table, move a single cell left" (interactive "P") (cond ((run-hook-with-args-until-success 'org-shiftleft-hook)) @@ -20013,6 +17540,7 @@ Depending on context, this does one of the following: (org-at-property-p)) (call-interactively 'org-property-previous-allowed-value)) ((org-clocktable-try-shift 'left arg)) + ((org-at-table-p) (org-table-move-cell-left)) ((run-hook-with-args-until-success 'org-shiftleft-final-hook)) (org-support-shift-select (org-call-for-shift-select 'backward-char)) @@ -20095,17 +17623,6 @@ this numeric value." ((org-at-table-p) (call-interactively 'org-table-hline-and-move)) (t (call-interactively 'org-insert-heading)))) -(defun org-find-visible () - (let ((s (point))) - (while (and (not (= (point-max) (setq s (next-overlay-change s)))) - (get-char-property s 'invisible))) - s)) -(defun org-find-invisible () - (let ((s (point))) - (while (and (not (= (point-max) (setq s (next-overlay-change s)))) - (not (get-char-property s 'invisible)))) - s)) - (defun org-copy-visible (beg end) "Copy the visible parts of the region." (interactive "r") @@ -20187,7 +17704,7 @@ Otherwise, return a user error." (match-string 0 value))))) (when (org-file-url-p file) (user-error "Files located with a URL cannot be edited")) - (org-open-link-from-string + (org-link-open-from-string (format "[[%s]]" (expand-file-name file)))))) (`table (if (eq (org-element-property :type element) 'table.el) @@ -20219,7 +17736,6 @@ Otherwise, return a user error." (`link (call-interactively #'ffap)) (_ (user-error "No special environment to edit here")))))))) -(defvar org-table-coordinate-overlays) ; defined in org-table.el (defun org-ctrl-c-ctrl-c (&optional arg) "Set tags in headline, or update according to changed information at point. @@ -20460,18 +17976,39 @@ Use `\\[org-edit-special]' to edit table.el tables")) (org-reset-file-cache)) (message "%s restarted" major-mode)) +(defun org-flag-above-first-heading (&optional arg) + "Hide from bob up to the first heading. +Move point to the beginning of first heading or end of buffer." + (goto-char (point-min)) + (unless (org-at-heading-p) + (outline-next-heading)) + (unless (bobp) + (org-flag-region 1 (1- (point)) (not arg) 'outline))) + +(defun org-show-branches-buffer () + "Show all branches in the buffer." + (org-flag-above-first-heading) + (outline-hide-sublevels 1) + (unless (eobp) + (outline-show-branches) + (while (outline-get-next-sibling) + (outline-show-branches))) + (goto-char (point-min))) + (defun org-kill-note-or-show-branches () - "Abort storing current note, or call `outline-show-branches'." + "Abort storing current note, or show just branches." (interactive) - (if (not org-finish-function) - (save-excursion - (save-restriction - (org-narrow-to-subtree) - (org-flag-subtree t) - (call-interactively 'outline-show-branches) - (org-hide-archived-subtrees (point-min) (point-max)))) - (let ((org-note-abort t)) - (funcall org-finish-function)))) + (cond (org-finish-function + (let ((org-note-abort t)) (funcall org-finish-function))) + ((org-before-first-heading-p) + (org-show-branches-buffer) + (org-hide-archived-subtrees (point-min) (point-max))) + (t + (let ((beg (progn (org-back-to-heading) (point))) + (end (save-excursion (org-end-of-subtree t t) (point)))) + (outline-hide-subtree) + (outline-show-branches) + (org-hide-archived-subtrees beg end))))) (defun org-delete-indentation (&optional arg) "Join current line to previous and fix whitespace at join. @@ -20558,7 +18095,7 @@ object (e.g., within a comment). In these case, you need to use (> (point) origin)))) (org-in-regexp org-ts-regexp-both nil t) (org-in-regexp org-tsr-regexp-both nil t) - (org-in-regexp org-any-link-re nil t))) + (org-in-regexp org-link-any-re nil t))) (call-interactively #'org-open-at-point)) ;; Insert newline in heading, but preserve tags. ((and (not (bolp)) @@ -20605,14 +18142,20 @@ context. See the individual commands for more information." (interactive) (org-return t)) -(defun org-ctrl-c-tab (&optional _arg) +(defun org-ctrl-c-tab (&optional arg) "Toggle columns width in a table, or show children. Call `org-table-toggle-column-width' if point is in a table. -Otherwise, call `org-show-children'." +Otherwise, call `org-show-children'. ARG is the level to hide." (interactive "p") - (call-interactively - (if (org-at-table-p) #'org-table-toggle-column-width - #'org-show-children))) + (if (org-at-table-p) + (call-interactively #'org-table-toggle-column-width) + (if (org-before-first-heading-p) + (progn + (org-flag-above-first-heading) + (outline-hide-sublevels (or arg 1)) + (goto-char (point-min))) + (outline-hide-subtree) + (org-show-children arg)))) (defun org-ctrl-c-star () "Compute table, or change heading status of lines. @@ -20715,7 +18258,12 @@ number of stars to add." (min (org-list-get-bottom-point struct) (1+ end)))) (save-restriction (narrow-to-region (point) list-end) - (insert (org-list-to-subtree (org-list-to-lisp t)) "\n"))) + (insert (org-list-to-subtree + (org-list-to-lisp t) + (pcase (org-current-level) + (`nil 1) + (l (1+ (org-reduced-level l))))) + "\n"))) (setq toggled t)) (forward-line))) ;; Case 3. Started at normal text: make every line an heading, @@ -20724,10 +18272,10 @@ number of stars to add." (make-string (if (numberp nstars) nstars (or (org-current-level) 0)) ?*)) (add-stars - (cond (nstars "") ; stars from prefix only - ((equal stars "") "*") ; before first heading + (cond (nstars "") ; stars from prefix only + ((equal stars "") "*") ; before first heading (org-odd-levels-only "**") ; inside heading, odd - (t "*"))) ; inside heading, oddeven + (t "*"))) ; inside heading, oddeven (rpl (concat stars add-stars " ")) (lend (when (listp nstars) (save-excursion (end-of-line) (point))))) (while (< (point) (if (equal nstars '(4)) lend end)) @@ -21200,26 +18748,6 @@ With prefix arg UNCOMPILED, load the uncompiled versions." ;;; Generally useful functions -(defun org-link-display-format (s) - "Replace links in string S with their description. -If there is no description, use the link target." - (save-match-data - (replace-regexp-in-string - org-bracket-link-analytic-regexp - (lambda (m) - (if (match-end 5) (match-string 5 m) - (concat (match-string 1 m) (match-string 3 m)))) - s nil t))) - -(defun org-toggle-link-display () - "Toggle the literal or descriptive display of links." - (interactive) - (if org-descriptive-links - (remove-from-invisibility-spec '(org-link)) - (add-to-invisibility-spec '(org-link))) - (org-restart-font-lock) - (setq org-descriptive-links (not org-descriptive-links))) - (defun org-in-clocktable-p () "Check if the cursor is in a clocktable." (let ((pos (point)) start) @@ -21262,17 +18790,6 @@ If there is no description, use the link target." (interactive "p") (self-insert-command N)) -(defun org-fill-template (template alist) - "Find each %key of ALIST in TEMPLATE and replace it." - (let ((case-fold-search nil)) - (dolist (entry (sort (copy-sequence alist) - (lambda (a b) (< (length (car a)) (length (car b)))))) - (setq template - (replace-regexp-in-string - (concat "%" (regexp-quote (car entry))) - (or (cdr entry) "") template t t))) - template)) - (defun org-quote-vert (s) "Replace \"|\" with \"\\vert\"." (while (string-match "|" s) @@ -21317,8 +18834,6 @@ contexts are: :src-block in a source block :link on a hyperlink :keyword on a keyword: SCHEDULED, DEADLINE, CLOSE, COMMENT. -:target on a <> -:radio-target on a <<>> :latex-fragment on a LaTeX fragment :latex-preview on a LaTeX fragment with overlaid preview image @@ -21392,12 +18907,6 @@ and :keyword." (push (list :keyword (previous-single-property-change p 'face) (next-single-property-change p 'face)) clist)) - ((org-at-target-p) - (push (org-point-in-group p 0 :target) clist) - (goto-char (1- (match-beginning 0))) - (when (looking-at org-radio-target-regexp) - (push (org-point-in-group p 0 :radio-target) clist)) - (goto-char p)) ((setq o (cl-some (lambda (o) (and (eq (overlay-get o 'org-overlay-type) 'org-latex-overlay) @@ -21517,33 +19026,6 @@ Returns the number of empty lines passed." (goto-char (min (point) pos)) (count-lines (point) pos))) -(defun org-replace-escapes (string table) - "Replace %-escapes in STRING with values in TABLE. -TABLE is an association list with keys like \"%a\" and string values. -The sequences in STRING may contain normal field width and padding information, -for example \"%-5s\". Replacements happen in the sequence given by TABLE, -so values can contain further %-escapes if they are define later in TABLE." - (let ((tbl (copy-alist table)) - (case-fold-search nil) - (pchg 0) - re rpl) - (dolist (e tbl) - (setq re (concat "%-?[0-9.]*" (substring (car e) 1))) - (when (and (cdr e) (string-match re (cdr e))) - (let ((sref (substring (cdr e) (match-beginning 0) (match-end 0))) - (safe "SREF")) - (add-text-properties 0 3 (list 'sref sref) safe) - (setcdr e (replace-match safe t t (cdr e))))) - (while (string-match re string) - (setq rpl (format (concat (substring (match-string 0 string) 0 -1) "s") - (cdr e))) - (setq string (replace-match rpl t t string)))) - (while (setq pchg (next-property-change pchg string)) - (let ((sref (get-text-property pchg 'sref string))) - (when (and sref (string-match "SREF" string pchg)) - (setq string (replace-match sref t t string))))) - string)) - ;;; TODO: Only called once, from ox-odt which should probably use ;;; org-export-inline-image-p or something. (defun org-file-image-p (file) @@ -21556,7 +19038,9 @@ so values can contain further %-escapes if they are define later in TABLE." This works in the calendar and in the agenda, anywhere else it just returns the current time. If WITH-TIME is non-nil, returns the time of the event at point (in -the agenda) or the current time of the day." +the agenda) or the current time of the day; otherwise returns the +earliest time on the cursor date that Org treats as that date +(bearing in mind `org-extend-today-until')." (let (date day defd tp hod mod) (when with-time (setq tp (get-text-property (point) 'time)) @@ -21569,13 +19053,13 @@ the agenda) or the current time of the day." (cond ((eq major-mode 'calendar-mode) (setq date (calendar-cursor-to-date) - defd (encode-time 0 (or mod 0) (or hod 0) + defd (encode-time 0 (or mod 0) (or hod org-extend-today-until) (nth 1 date) (nth 0 date) (nth 2 date)))) ((eq major-mode 'org-agenda-mode) (setq day (get-text-property (point) 'day)) (when day (setq date (calendar-gregorian-from-absolute day) - defd (encode-time 0 (or mod 0) (or hod 0) + defd (encode-time 0 (or mod 0) (or hod org-extend-today-until) (nth 1 date) (nth 0 date) (nth 2 date)))))) (or defd (current-time)))) @@ -21727,10 +19211,8 @@ Indentation is done according to the following rules: definitions and inline tasks, indent like its first line. 2. If element has a parent, indent like its contents. More - precisely, if parent is an item, indent after the - description part, if any, or the bullet (see - `org-list-description-max-indent'). Else, indent like - parent's first line. + precisely, if parent is an item, indent after the bullet. + Else, indent like parent's first line. 3. Otherwise, indent relatively to current level, if `org-adapt-indentation' is non-nil, or to left margin. @@ -22008,7 +19490,6 @@ assumed to be significant there." ;; parenthesis can end up being parsed as a new list item. (looking-at-p "[ \t]*{{{n\\(?:([^\n)]*)\\)?}}}[.)]\\(?:$\\| \\)")) -(defvar orgtbl-line-start-regexp) ; From org-table.el (defun org-adaptive-fill-function () "Compute a fill prefix for the current line. Return fill prefix, as a string, or nil if current line isn't @@ -22200,20 +19681,27 @@ filling the current element." (interactive (progn (barf-if-buffer-read-only) (list (when current-prefix-arg 'full) t))) - (cond - ((and region transient-mark-mode mark-active - (not (eq (region-beginning) (region-end)))) - (let ((origin (point-marker)) - (start (region-beginning))) - (unwind-protect - (progn - (goto-char (region-end)) - (while (> (point) start) - (org-backward-paragraph) - (org-fill-element justify))) - (goto-char origin) - (set-marker origin nil)))) - (t (org-fill-element justify)))) + (let ((hash (and (not (buffer-modified-p)) + (org-buffer-hash)))) + (cond + ((and region transient-mark-mode mark-active + (not (eq (region-beginning) (region-end)))) + (let ((origin (point-marker)) + (start (region-beginning))) + (unwind-protect + (progn + (goto-char (region-end)) + (while (> (point) start) + (org-backward-paragraph) + (org-fill-element justify))) + (goto-char origin) + (set-marker origin nil)))) + (t (org-fill-element justify))) + ;; If we didn't change anything in the buffer (and the buffer was + ;; previously unmodified), then flip the modification status back + ;; to "unchanged". + (when (and hash (equal hash (org-buffer-hash))) + (set-buffer-modified-p nil)))) (defun org-auto-fill-function () "Auto-fill function." @@ -22980,7 +20468,7 @@ interactive command with similar behavior." (or (looking-at org-outline-regexp) (re-search-forward org-outline-regexp-bol end t)) (while (and (< (point) end) (looking-at org-outline-regexp)) - (outline-hide-subtree) + (org-flag-subtree t) (org-cycle-show-empty-lines 'folded) (condition-case nil (outline-forward-same-level 1) @@ -23049,20 +20537,20 @@ unless optional argument NO-INHERITANCE is non-nil." (save-excursion (and (org-up-heading-safe) (org-in-commented-heading-p)))))) (defun org-at-comment-p nil - "Is cursor in a commented line?" + "Return t if cursor is in a commented line." (save-excursion (save-match-data (beginning-of-line) (looking-at "^[ \t]*# ")))) (defun org-at-drawer-p nil - "Is cursor at a drawer keyword?" + "Return t if cursor is at a drawer keyword." (save-excursion (move-beginning-of-line 1) (looking-at org-drawer-regexp))) (defun org-at-block-p nil - "Is cursor at a block keyword?" + "Return t if cursor is at a block keyword." (save-excursion (move-beginning-of-line 1) (looking-at org-block-regexp))) @@ -23082,10 +20570,6 @@ empty." (defun org-at-heading-or-item-p () (or (org-at-heading-p) (org-at-item-p))) -(defun org-at-target-p () - (or (org-in-regexp org-radio-target-regexp) - (org-in-regexp org-target-regexp))) - (defun org-up-heading-all (arg) "Move to the heading line of which the present line is a subheading. This function considers both visible and invisible heading lines. diff --git a/elpa/org-20200127/orgcard.pdf b/elpa/org-20200127/orgcard.pdf new file mode 100644 index 0000000000000000000000000000000000000000..782e15b452b913e0b83c8d04975aff18dfb54f99 GIT binary patch literal 118282 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 literal 0 HcmV?d00001 diff --git a/elpa/org-20191028/ox-ascii.el b/elpa/org-20200127/ox-ascii.el similarity index 99% rename from elpa/org-20191028/ox-ascii.el rename to elpa/org-20200127/ox-ascii.el index 7917e3da..972b58a9 100644 --- a/elpa/org-20191028/ox-ascii.el +++ b/elpa/org-20200127/ox-ascii.el @@ -1,6 +1,6 @@ ;;; ox-ascii.el --- ASCII Back-End for Org Export Engine -*- lexical-binding: t; -*- -;; Copyright (C) 2012-2019 Free Software Foundation, Inc. +;; Copyright (C) 2012-2020 Free Software Foundation, Inc. ;; Author: Nicolas Goaziou ;; Keywords: outlines, hypermedia, calendar, wp @@ -731,7 +731,7 @@ caption keyword." (org-export-data caption info)) (org-ascii--current-text-width element info) info))))) -(defun org-ascii--build-toc (info &optional n keyword local) +(defun org-ascii--build-toc (info &optional n keyword scope) "Return a table of contents. INFO is a plist used as a communication channel. @@ -742,10 +742,10 @@ depth of the table. Optional argument KEYWORD specifies the TOC keyword, if any, from which the table of contents generation has been initiated. -When optional argument LOCAL is non-nil, build a table of -contents according to the current headline." +When optional argument SCOPE is non-nil, build a table of +contents according to the specified scope." (concat - (unless local + (unless scope (let ((title (org-ascii--translate "Table of Contents" info))) (concat title "\n" (make-string @@ -767,7 +767,7 @@ contents according to the current headline." (or (not (plist-get info :with-tags)) (eq (plist-get info :with-tags) 'not-in-toc)) 'toc)))) - (org-export-collect-headlines info n (and local keyword)) "\n")))) + (org-export-collect-headlines info n scope) "\n")))) (defun org-ascii--list-listings (keyword info) "Return a list of listings. @@ -1516,8 +1516,13 @@ information." ((string-match-p "\\" value) (let ((depth (and (string-match "\\<[0-9]+\\>" value) (string-to-number (match-string 0 value)))) - (localp (string-match-p "\\" value))) - (org-ascii--build-toc info depth keyword localp))) + (scope + (cond + ((string-match ":target +\\(\".+?\"\\|\\S-+\\)" value) ;link + (org-export-resolve-link + (org-strip-quotes (match-string 1 value)) info)) + ((string-match-p "\\" value) keyword)))) ;local + (org-ascii--build-toc info depth keyword scope))) ((string-match-p "\\" value) (org-ascii--list-tables keyword info)) ((string-match-p "\\" value) diff --git a/elpa/org-20191028/ox-beamer.el b/elpa/org-20200127/ox-beamer.el similarity index 98% rename from elpa/org-20191028/ox-beamer.el rename to elpa/org-20200127/ox-beamer.el index d9d228c9..23656db4 100644 --- a/elpa/org-20191028/ox-beamer.el +++ b/elpa/org-20200127/ox-beamer.el @@ -1,6 +1,6 @@ ;;; ox-beamer.el --- Beamer Back-End for Org Export Engine -*- lexical-binding: t; -*- -;; Copyright (C) 2007-2019 Free Software Foundation, Inc. +;; Copyright (C) 2007-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Nicolas Goaziou @@ -645,13 +645,22 @@ as a communication channel." contents)) ;; Case 4: HEADLINE is a note. ((member environment '("note" "noteNH")) - (format "\\note{%s}" - (concat (and (equal environment "note") - (concat - (org-export-data - (org-element-property :title headline) info) - "\n")) - (org-trim contents)))) + (concat "\\note" + ;; Overlay specification. + (let ((overlay (org-element-property :BEAMER_ACT headline))) + (when overlay + (org-beamer--normalize-argument + overlay + (if (string-match "\\`\\[.*\\]\\'" overlay) + 'defaction 'action)))) + (format "{%s}" + (concat (and (equal environment "note") + (concat + (org-export-data + (org-element-property :title headline) + info) + "\n")) + (org-trim contents))))) ;; Case 5: HEADLINE is a frame. ((= level frame-level) (org-beamer--format-frame headline contents info)) diff --git a/elpa/org-20191028/ox-html.el b/elpa/org-20200127/ox-html.el similarity index 97% rename from elpa/org-20191028/ox-html.el rename to elpa/org-20200127/ox-html.el index 375754f3..5c22ea7b 100644 --- a/elpa/org-20191028/ox-html.el +++ b/elpa/org-20200127/ox-html.el @@ -1,6 +1,6 @@ ;;; ox-html.el --- HTML Back-End for Org Export Engine -*- lexical-binding: t; -*- -;; Copyright (C) 2011-2019 Free Software Foundation, Inc. +;; Copyright (C) 2011-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Jambunathan K @@ -152,6 +152,7 @@ (:html-metadata-timestamp-format nil nil org-html-metadata-timestamp-format) (:html-postamble-format nil nil org-html-postamble-format) (:html-preamble-format nil nil org-html-preamble-format) + (:html-self-link-headlines nil nil org-html-self-link-headlines) (:html-table-align-individual-fields nil nil org-html-table-align-individual-fields) (:html-table-caption-above nil nil org-html-table-caption-above) @@ -171,6 +172,7 @@ (:html-table-row-open-tag nil nil org-html-table-row-open-tag) (:html-table-row-close-tag nil nil org-html-table-row-close-tag) (:html-xml-declaration nil nil org-html-xml-declaration) + (:html-wrap-src-lines nil nil org-html-wrap-src-lines) (:html-klipsify-src nil nil org-html-klipsify-src) (:html-klipse-css nil nil org-html-klipse-css) (:html-klipse-js nil nil org-html-klipse-js) @@ -234,7 +236,7 @@ property on the headline itself.") @licstart The following is the entire license notice for the JavaScript code in this tag. -Copyright (C) 2012-2019 Free Software Foundation, Inc. +Copyright (C) 2012-2020 Free Software Foundation, Inc. The JavaScript code in this tag is free software: you can redistribute it and/or modify it under the terms of the GNU @@ -537,7 +539,7 @@ means to use the maximum value consistent with other options." * @licstart The following is the entire license notice for the * JavaScript code in %SCRIPT_PATH. * - * Copyright (C) 2012-2019 Free Software Foundation, Inc. + * Copyright (C) 2012-2020 Free Software Foundation, Inc. * * * The JavaScript code in this tag is free software: you can @@ -566,7 +568,7 @@ means to use the maximum value consistent with other options." @licstart The following is the entire license notice for the JavaScript code in this tag. -Copyright (C) 2012-2019 Free Software Foundation, Inc. +Copyright (C) 2012-2020 Free Software Foundation, Inc. The JavaScript code in this tag is free software: you can redistribute it and/or modify it under the terms of the GNU @@ -802,6 +804,13 @@ but without \"name\" attribute." :package-version '(Org . "8.0") :type 'boolean) +(defcustom org-html-self-link-headlines nil + "When non-nil, the headlines contain a hyperlink to themselves." + :group 'org-export-html + :package-version '(Org . "9.3") + :type 'boolean + :safe #'booleanp) + ;;;; Inlinetasks (defcustom org-html-format-inlinetask-function @@ -876,6 +885,7 @@ link to the image." (defcustom org-html-inline-image-rules '(("file" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\)\\'") + ("attachment" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\)\\'") ("http" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\)\\'") ("https" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\)\\'")) "Rules characterizing image files that can be inlined into HTML. @@ -923,6 +933,15 @@ in all modes you want. Then, use the command :group 'org-export-html :type 'string) +(defcustom org-html-wrap-src-lines nil + "If non-nil, wrap individual lines of source blocks in \"code\" elements. +In this case, add line number in attribute \"data-ox-html-linenr\" when line +numbers are enabled." + :group 'org-export-html + :package-version '(Org . "9.3") + :type 'boolean + :safe t) + ;;;; Table (defcustom org-html-table-default-attributes @@ -1975,32 +1994,33 @@ communication channel." (creator (cdr (assq ?c spec))) (validation-link (cdr (assq ?v spec)))) (concat - (when (and (plist-get info :with-date) - (org-string-nw-p date)) - (format "

%s: %s

\n" - (org-html--translate "Date" info) - date)) - (when (and (plist-get info :with-author) - (org-string-nw-p author)) - (format "

%s: %s

\n" - (org-html--translate "Author" info) - author)) - (when (and (plist-get info :with-email) - (org-string-nw-p email)) - (format "

%s: %s

\n" - (org-html--translate "Email" info) - email)) - (when (plist-get info :time-stamp-file) - (format - "

%s: %s

\n" - (org-html--translate "Created" info) - (format-time-string - (plist-get info :html-metadata-timestamp-format)))) - (when (plist-get info :with-creator) - (format "

%s

\n" creator)) - (when (org-string-nw-p validation-link) - (format "

%s

\n" - validation-link))))) + (and (plist-get info :with-date) + (org-string-nw-p date) + (format "

%s: %s

\n" + (org-html--translate "Date" info) + date)) + (and (plist-get info :with-author) + (org-string-nw-p author) + (format "

%s: %s

\n" + (org-html--translate "Author" info) + author)) + (and (plist-get info :with-email) + (org-string-nw-p email) + (format "

%s: %s

\n" + (org-html--translate "Email" info) + email)) + (and (plist-get info :time-stamp-file) + (format + "

%s: %s

\n" + (org-html--translate "Created" info) + (format-time-string + (plist-get info :html-metadata-timestamp-format)))) + (and (plist-get info :with-creator) + (org-string-nw-p creator) + (format "

%s

\n" creator)) + (and (org-string-nw-p validation-link) + (format "

%s

\n" + validation-link))))) (t (let ((formats (plist-get info (if (eq type 'preamble) :html-preamble-format @@ -2221,14 +2241,15 @@ is the language used for CODE, as a string, or nil." (if (and beg end) (substring code beg end) code))))))))) (defun org-html-do-format-code - (code &optional lang refs retain-labels num-start) + (code &optional lang refs retain-labels num-start wrap-lines) "Format CODE string as source code. -Optional arguments LANG, REFS, RETAIN-LABELS and NUM-START are, -respectively, the language of the source code, as a string, an +Optional arguments LANG, REFS, RETAIN-LABELS, NUM-START, WRAP-LINES +are, respectively, the language of the source code, as a string, an alist between line numbers and references (as returned by `org-export-unravel-code'), a boolean specifying if labels should -appear in the source code, and the number associated to the first -line of code." +appear in the source code, the number associated to the first +line of code, and a boolean specifying if lines of code should be +wrapped in code elements." (let* ((code-lines (split-string code "\n")) (code-length (length code-lines)) (num-fmt @@ -2246,7 +2267,13 @@ line of code." (format "%s" (format num-fmt line-num))) ;; Transcoded src line. - loc + (if wrap-lines + (format "%s" + (if num-start + (format " data-ox-html-linenr=\"%s\"" line-num) + "") + loc) + loc) ;; Add label, if needed. (when (and ref retain-labels) (format " (%s)" ref)))) ;; Mark transcoded line as an anchor, if needed. @@ -2267,8 +2294,10 @@ used as a communication channel." ;; Does the source block contain labels? (retain-labels (org-element-property :retain-labels element)) ;; Does it have line numbers? - (num-start (org-export-get-loc element info))) - (org-html-do-format-code code lang refs retain-labels num-start))) + (num-start (org-export-get-loc element info)) + ;; Should lines be wrapped in code elements? + (wrap-lines (plist-get info :html-wrap-src-lines))) + (org-html-do-format-code code lang refs retain-labels num-start wrap-lines))) ;;; Tables of Contents @@ -2594,7 +2623,11 @@ holding contextual information." todo todo-type priority text tags info)) (contents (or contents "")) (id (or (org-element-property :CUSTOM_ID headline) - (org-export-get-reference headline info)))) + (org-export-get-reference headline info))) + (formatted-text + (if (plist-get info :html-self-link-headlines) + (format "%s" id full-text) + full-text))) (if (org-export-low-level-p headline info) ;; This is a deep sub-tree: export it as a list item. (let* ((html-type (if numberedp "ol" "ul"))) @@ -2605,11 +2638,14 @@ holding contextual information." (org-html-format-list-item contents (if numberedp 'ordered 'unordered) nil info nil - (concat (org-html--anchor id nil nil info) full-text)) "\n" + (concat (org-html--anchor id nil nil info) formatted-text)) "\n" (and (org-export-last-sibling-p headline info) (format "\n" html-type)))) ;; Standard headline. Export it as a section. - (let ((extra-class (org-element-property :HTML_CONTAINER_CLASS headline)) + (let ((extra-class + (org-element-property :HTML_CONTAINER_CLASS headline)) + (headline-class + (org-element-property :HTML_HEADLINE_CLASS headline)) (first-content (car (org-element-contents headline)))) (format "<%s id=\"%s\" class=\"%s\">%s%s\n" (org-html--container headline info) @@ -2618,16 +2654,18 @@ holding contextual information." (concat (format "outline-%d" level) (and extra-class " ") extra-class) - (format "\n%s\n" + (format "\n%s\n" level id + (if (not headline-class) "" + (format " class=\"%s\"" headline-class)) (concat (and numberedp (format "%s " level (mapconcat #'number-to-string numbers "."))) - full-text) + formatted-text) level) ;; When there is no section, pretend there is an ;; empty one to get the correct
" value) (let ((depth (and (string-match "\\<[0-9]+\\>" value) (string-to-number (match-string 0 value)))) - (localp (string-match-p "\\" value))) - (org-html-toc depth info (and localp keyword)))) + (scope + (cond + ((string-match ":target +\\(\".+?\"\\|\\S-+\\)" value) ;link + (org-export-resolve-link + (org-strip-quotes (match-string 1 value)) info)) + ((string-match-p "\\" value) keyword)))) ;local + (org-html-toc depth info scope))) ((string= "listings" value) (org-html-list-of-listings info)) ((string= "tables" value) (org-html-list-of-tables info)))))))) @@ -2860,6 +2903,12 @@ used as a predicate for `org-export-get-ordinal' or a value to (string-match-p org-latex-math-environments-re (org-element-property :value element))) +(defun org-html--latex-environment-numbered-p (element) + "Non-nil when ELEMENT contains a numbered LaTeX math environment. +Starred and \"displaymath\" environments are not numbered." + (not (string-match-p "\\`[ \t]*\\\\begin{\\(.*\\*\\|displaymath\\)}" + (org-element-property :value element)))) + (defun org-html--unlabel-latex-environment (latex-frag) "Change environment in LATEX-FRAG string to an unnumbered one. For instance, change an 'equation' environment to 'equation*'." @@ -2880,10 +2929,13 @@ CONTENTS is nil. INFO is a plist holding contextual information." (attributes (org-export-read-attribute :attr_html latex-environment)) (label (and (org-element-property :name latex-environment) (org-export-get-reference latex-environment info))) - (caption (number-to-string - (org-export-get-ordinal - latex-environment info nil - #'org-html--math-environment-p)))) + (caption (and (org-html--latex-environment-numbered-p latex-environment) + (number-to-string + (org-export-get-ordinal + latex-environment info nil + (lambda (l _) + (and (org-html--math-environment-p l) + (org-html--latex-environment-numbered-p l)))))))) (cond ((memq processing-type '(t mathjax)) (org-html-format-latex diff --git a/elpa/org-20191028/ox-icalendar.el b/elpa/org-20200127/ox-icalendar.el similarity index 91% rename from elpa/org-20191028/ox-icalendar.el rename to elpa/org-20200127/ox-icalendar.el index 297d624d..5968d4ee 100644 --- a/elpa/org-20191028/ox-icalendar.el +++ b/elpa/org-20200127/ox-icalendar.el @@ -1,6 +1,6 @@ ;;; ox-icalendar.el --- iCalendar Back-End for Org Export Engine -*- lexical-binding: t; -*- -;; Copyright (C) 2004-2019 Free Software Foundation, Inc. +;; Copyright (C) 2004-2020 Free Software Foundation, Inc. ;; Author: Carsten Dominik ;; Nicolas Goaziou @@ -33,7 +33,7 @@ (require 'cl-lib) (require 'ox-ascii) -(declare-function org-bbdb-anniv-export-ical "org-bbdb" nil) +(declare-function org-bbdb-anniv-export-ical "ol-bbdb" nil) @@ -87,37 +87,66 @@ keyword." This is a list with possibly several symbols in it. Valid symbols are: -`event-if-todo' Deadlines in TODO entries become calendar events. -`event-if-not-todo' Deadlines in non-TODO entries become calendar events. -`todo-due' Use deadlines in TODO entries as due-dates." +`event-if-todo' + + Deadlines in TODO entries become calendar events. + +`event-if-todo-not-done' + + Deadlines in TODO entries with not-DONE state become events. + +`event-if-not-todo' + + Deadlines in non-TODO entries become calendar events. + +`todo-due' + + Use deadlines in TODO entries as due-dates." :group 'org-export-icalendar - :type '(set :greedy t - (const :tag "Deadlines in non-TODO entries become events" - event-if-not-todo) - (const :tag "Deadline in TODO entries become events" - event-if-todo) - (const :tag "Deadlines in TODO entries become due-dates" - todo-due))) + :type + '(set :greedy t + (const :tag "DEADLINE in non-TODO entries become events" + event-if-not-todo) + (const :tag "DEADLINE in TODO entries become events" + event-if-todo) + (const :tag "DEADLINE in TODO entries with not-DONE state become events" + event-if-todo-not-done) + (const :tag "DEADLINE in TODO entries become due-dates" + todo-due))) (defcustom org-icalendar-use-scheduled '(todo-start) "Contexts where iCalendar export should use a scheduling time stamp. This is a list with possibly several symbols in it. Valid symbols are: -`event-if-todo' Scheduling time stamps in TODO entries become an event. -`event-if-not-todo' Scheduling time stamps in non-TODO entries become an event. -`todo-start' Scheduling time stamps in TODO entries become start date. - Some calendar applications show TODO entries only after - that date." +`event-if-todo' + + Scheduling time stamps in TODO entries become an event. + +`event-if-todo-not-done' + + Scheduling time stamps in TODO entries with not-DONE state + become events. + +`event-if-not-todo' + + Scheduling time stamps in non-TODO entries become an event. + +`todo-start' + + Scheduling time stamps in TODO entries become start date. Some + calendar applications show TODO entries only after that date." :group 'org-export-icalendar - :type '(set :greedy t - (const :tag - "SCHEDULED timestamps in non-TODO entries become events" - event-if-not-todo) - (const :tag "SCHEDULED timestamps in TODO entries become events" - event-if-todo) - (const :tag "SCHEDULED in TODO entries become start date" - todo-start))) + :type + '(set :greedy t + (const :tag "SCHEDULED timestamps in non-TODO entries become events" + event-if-not-todo) + (const :tag "SCHEDULED timestamps in TODO entries become events" + event-if-todo) + (const :tag "SCHEDULED in TODO entries with not-DONE state become events" + event-if-todo-not-done) + (const :tag "SCHEDULED in TODO entries become start date" + todo-start))) (defcustom org-icalendar-categories '(local-tags category) "Items that should be entered into the \"categories\" field. @@ -540,6 +569,10 @@ inlinetask within the section." (org-export-get-node-property :LOCATION entry (org-property-inherit-p "LOCATION")))) + (class (org-icalendar-cleanup-string + (org-export-get-node-property + :CLASS entry + (org-property-inherit-p "CLASS")))) ;; Build description of the entry from associated section ;; (headline) or contents (inlinetask). (desc @@ -562,20 +595,28 @@ inlinetask within the section." ;; Events: Delegate to `org-icalendar--vevent' to generate ;; "VEVENT" component from scheduled, deadline, or any ;; timestamp in the entry. - (let ((deadline (org-element-property :deadline entry))) + (let ((deadline (org-element-property :deadline entry)) + (use-deadline (plist-get info :icalendar-use-deadline))) (and deadline - (memq (if todo-type 'event-if-todo 'event-if-not-todo) - org-icalendar-use-deadline) + (pcase todo-type + (`todo (or (memq 'event-if-todo-not-done use-deadline) + (memq 'event-if-todo use-deadline))) + (`done (memq 'event-if-todo use-deadline)) + (_ (memq 'event-if-not-todo use-deadline))) (org-icalendar--vevent entry deadline (concat "DL-" uid) - (concat "DL: " summary) loc desc cat tz))) - (let ((scheduled (org-element-property :scheduled entry))) + (concat "DL: " summary) loc desc cat tz class))) + (let ((scheduled (org-element-property :scheduled entry)) + (use-scheduled (plist-get info :icalendar-use-scheduled))) (and scheduled - (memq (if todo-type 'event-if-todo 'event-if-not-todo) - org-icalendar-use-scheduled) + (pcase todo-type + (`todo (or (memq 'event-if-todo-not-done use-scheduled) + (memq 'event-if-todo use-scheduled))) + (`done (memq 'event-if-todo use-scheduled)) + (_ (memq 'event-if-not-todo use-scheduled))) (org-icalendar--vevent entry scheduled (concat "SC-" uid) - (concat "S: " summary) loc desc cat tz))) + (concat "S: " summary) loc desc cat tz class))) ;; When collecting plain timestamps from a headline and its ;; title, skip inlinetasks since collection will happen once ;; ENTRY is one of them. @@ -593,7 +634,7 @@ inlinetask within the section." ((t) t))) (let ((uid (format "TS%d-%s" (cl-incf counter) uid))) (org-icalendar--vevent - entry ts uid summary loc desc cat tz)))) + entry ts uid summary loc desc cat tz class)))) info nil (and (eq type 'headline) 'inlinetask)) "")) ;; Task: First check if it is appropriate to export it. If @@ -607,7 +648,7 @@ inlinetask within the section." (not (org-icalendar-blocked-headline-p entry info)))) ((t) (eq todo-type 'todo)))) - (org-icalendar--vtodo entry uid summary loc desc cat tz)) + (org-icalendar--vtodo entry uid summary loc desc cat tz class)) ;; Diary-sexp: Collect every diary-sexp element within ENTRY ;; and its title, and transcode them. If ENTRY is ;; a headline, skip inlinetasks: they will be handled @@ -638,7 +679,7 @@ inlinetask within the section." contents)))) (defun org-icalendar--vevent - (entry timestamp uid summary location description categories timezone) + (entry timestamp uid summary location description categories timezone class) "Create a VEVENT component. ENTRY is either a headline or an inlinetask element. TIMESTAMP @@ -648,7 +689,9 @@ summary or subject for the event. LOCATION defines the intended venue for the event. DESCRIPTION provides the complete description of the event. CATEGORIES defines the categories the event belongs to. TIMEZONE specifies a time zone for this event -only. +only. CLASS contains the visibility attribute. Three of them +(\"PUBLIC\", \"CONFIDENTIAL\", and \"PRIVATE\") are predefined, others +should be treated as \"PRIVATE\" if they are unknown to the iCalendar server. Return VEVENT component as a string." (org-icalendar-fold-string @@ -669,6 +712,7 @@ Return VEVENT component as a string." (org-element-property :repeater-value timestamp))) "SUMMARY:" summary "\n" (and (org-string-nw-p location) (format "LOCATION:%s\n" location)) + (and (org-string-nw-p class) (format "CLASS:%s\n" class)) (and (org-string-nw-p description) (format "DESCRIPTION:%s\n" description)) "CATEGORIES:" categories "\n" @@ -677,7 +721,7 @@ Return VEVENT component as a string." "END:VEVENT")))) (defun org-icalendar--vtodo - (entry uid summary location description categories timezone) + (entry uid summary location description categories timezone class) "Create a VTODO component. ENTRY is either a headline or an inlinetask element. UID is the @@ -712,6 +756,7 @@ Return VTODO component as a string." "\n")) "SUMMARY:" summary "\n" (and (org-string-nw-p location) (format "LOCATION:%s\n" location)) + (and (org-string-nw-p class) (format "CLASS:%s\n" class)) (and (org-string-nw-p description) (format "DESCRIPTION:%s\n" description)) "CATEGORIES:" categories "\n" @@ -963,7 +1008,7 @@ FILES is a list of files to build the calendar from." files "") ;; BBDB anniversaries. (when (and org-icalendar-include-bbdb-anniversaries - (require 'org-bbdb nil t)) + (require 'ol-bbdb nil t)) (with-output-to-string (org-bbdb-anniv-export-ical))))))) (run-hook-with-args 'org-icalendar-after-save-hook org-icalendar-combined-agenda-file)) diff --git a/elpa/org-20191028/ox-latex.el b/elpa/org-20200127/ox-latex.el similarity index 94% rename from elpa/org-20191028/ox-latex.el rename to elpa/org-20200127/ox-latex.el index 569a4a0a..5db1ed74 100644 --- a/elpa/org-20191028/ox-latex.el +++ b/elpa/org-20200127/ox-latex.el @@ -1,6 +1,6 @@ ;;; ox-latex.el --- LaTeX Back-End for Org Export Engine -*- lexical-binding: t; -*- -;; Copyright (C) 2011-2019 Free Software Foundation, Inc. +;; Copyright (C) 2011-2020 Free Software Foundation, Inc. ;; Author: Nicolas Goaziou ;; Keywords: outlines, hypermedia, calendar, wp @@ -127,6 +127,7 @@ (:latex-format-headline-function nil nil org-latex-format-headline-function) (:latex-format-inlinetask-function nil nil org-latex-format-inlinetask-function) (:latex-hyperref-template nil nil org-latex-hyperref-template t) + (:latex-image-default-scale nil nil org-latex-image-default-scale) (:latex-image-default-height nil nil org-latex-image-default-height) (:latex-image-default-option nil nil org-latex-image-default-option) (:latex-image-default-width nil nil org-latex-image-default-width) @@ -383,7 +384,7 @@ variable is non-nil, Org passes their value to \\label unchanged. You are responsible for ensuring that the value is a valid LaTeX \\label key, and that no other \\label commands with the same key appear elsewhere in your document. (Keys may contain letters, -numbers, and the following punctuation: '_' '.' '-' ':'.) There +numbers, and the following punctuation: `_' `.' `-' `:'.) There are no such limitations on CUSTOM_ID and NAME when this variable is nil. @@ -706,6 +707,16 @@ This value will not be used if a height is provided." :package-version '(Org . "8.0") :type 'string) +(defcustom org-latex-image-default-scale "" + "Default scale for images. +This value will not be used if a width or a scale is provided, +or if the image is wrapped within a \"wrapfigure\" environment. +Scale overrides width and height." + :group 'org-export-latex + :package-version '(Org . "9.3") + :type 'string + :safe #'stringp) + (defcustom org-latex-image-default-height "" "Default height for images. This value will not be used if a width is provided, or if the @@ -1265,17 +1276,19 @@ Eventually, if FULL is non-nil, wrap label within \"\\label{}\"." (and (or user-label force) (if (and user-label (plist-get info :latex-prefer-user-labels)) user-label - (concat (cl-case type - (headline "sec:") - (table "tab:") - (latex-environment + (concat (pcase type + (`headline "sec:") + (`table "tab:") + (`latex-environment (and (string-match-p org-latex-math-environments-re (org-element-property :value datum)) "eq:")) - (paragraph + (`latex-matrices "eq:") + (`paragraph (and (org-element-property :caption datum) - "fig:"))) + "fig:")) + (_ nil)) (org-export-get-reference datum info)))))) (cond ((not full) label) (label (format "\\label{%s}%s" @@ -1325,7 +1338,7 @@ For non-floats, see `org-latex--wrap-label'." (t (symbol-name type*))) "")) (if short (format "[%s]" (org-export-data short info)) "") - label + (org-trim label) (org-export-data main info)))))) (defun org-latex-guess-inputenc (header) @@ -2372,13 +2385,18 @@ used as a communication channel." (if (plist-member attr :center) (plist-get attr :center) (plist-get info :latex-images-centered))) (comment-include (if (plist-get attr :comment-include) "%" "")) - ;; It is possible to specify width and height in the - ;; ATTR_LATEX line, and also via default variables. - (width (cond ((plist-get attr :width)) + ;; It is possible to specify scale or width and height in + ;; the ATTR_LATEX line, and also via default variables. + (scale (cond ((eq float 'wrap) "") + ((plist-get attr :scale)) + (t (plist-get info :latex-image-default-scale)))) + (width (cond ((org-string-nw-p scale) "") + ((plist-get attr :width)) ((plist-get attr :height) "") ((eq float 'wrap) "0.48\\textwidth") (t (plist-get info :latex-image-default-width)))) - (height (cond ((plist-get attr :height)) + (height (cond ((org-string-nw-p scale) "") + ((plist-get attr :height)) ((or (plist-get attr :width) (memq float '(figure wrap))) "") (t (plist-get info :latex-image-default-height)))) @@ -2400,18 +2418,22 @@ used as a communication channel." (format "\\begin{tikzpicture}[%s]\n%s\n\\end{tikzpicture}" options image-code))) - (when (or (org-string-nw-p width) (org-string-nw-p height)) - (setq image-code (format "\\resizebox{%s}{%s}{%s}" - (if (org-string-nw-p width) width "!") - (if (org-string-nw-p height) height "!") - image-code)))) + (setq image-code + (cond ((org-string-nw-p scale) + (format "\\scalebox{%s}{%s}" scale image-code)) + ((or (org-string-nw-p width) (org-string-nw-p height)) + (format "\\resizebox{%s}{%s}{%s}" + (if (org-string-nw-p width) width "!") + (if (org-string-nw-p height) height "!") + image-code)) + (t image-code)))) ;; For other images: - ;; - add width and height to options. + ;; - add scale, or width and height to options. ;; - include the image with \includegraphics. - (when (org-string-nw-p width) - (setq options (concat options ",width=" width))) - (when (org-string-nw-p height) - (setq options (concat options ",height=" height))) + (if (org-string-nw-p scale) + (setq options (concat options ",scale=" scale)) + (when (org-string-nw-p width) (setq options (concat options ",width=" width))) + (when (org-string-nw-p height) (setq options (concat options ",height=" height)))) (let ((search-option (org-element-property :search-option link))) (when (and search-option (equal filetype "pdf") @@ -2518,9 +2540,10 @@ INFO is a plist holding contextual information. See ;; Links pointing to a headline: Find destination and build ;; appropriate referencing command. ((member type '("custom-id" "fuzzy" "id")) - (let ((destination (if (string= type "fuzzy") - (org-export-resolve-fuzzy-link link info) - (org-export-resolve-id-link link info)))) + (let ((destination + (if (string= type "fuzzy") + (org-export-resolve-fuzzy-link link info 'latex-matrices) + (org-export-resolve-id-link link info)))) (cl-case (org-element-type destination) ;; Id link points to an external file. (plain-text @@ -2713,12 +2736,18 @@ it." 'latex-matrices))) (let* ((caption (and (not (string= mode "inline-math")) (org-element-property :caption table))) + (name (and (not (string= mode "inline-math")) + (org-element-property :name table))) (matrices (list 'latex-matrices - (list :caption caption + ;; Inherit name from the first table. + (list :name name + ;; FIXME: what syntax for captions? + ;; + ;; :caption caption :markup (cond ((string= mode "inline-math") 'inline) - (caption 'equation) + ((or caption name) 'equation) (t 'math))))) (previous table) (next (org-export-get-next-element table info))) @@ -2733,6 +2762,8 @@ it." :attr_latex next :mode) (plist-get info :latex-default-table-mode)) mode)) + (org-element-put-property table :name nil) + (org-element-put-property table :caption nil) (org-element-extract-element previous) (org-element-adopt-elements matrices previous) (setq previous next)) @@ -2742,20 +2773,29 @@ it." (org-element-put-property matrices :post-blank (org-element-property :post-blank previous)) (org-element-put-property previous :post-blank 0) + (org-element-put-property table :name nil) + (org-element-put-property table :caption nil) (org-element-extract-element previous) (org-element-adopt-elements matrices previous)))))) info) data) -(defun org-latex-matrices (matrices contents _info) +(defun org-latex-matrices (matrices contents info) "Transcode a MATRICES element from Org to LaTeX. CONTENTS is a string. INFO is a plist used as a communication channel." - (format (cl-case (org-element-property :markup matrices) - (inline "\\(%s\\)") - (equation "\\begin{equation}\n%s\\end{equation}") - (t "\\[\n%s\\]")) - contents)) + (pcase (org-element-property :markup matrices) + (`inline (format "\\(%s\\)" contents)) + (`equation + (let ((caption (org-latex--caption/label-string matrices info)) + (caption-above? (org-latex--caption-above-p matrices info))) + (concat "\\begin{equation}\n" + (and caption-above? caption) + contents + (and (not caption-above?) caption) + "\\end{equation}"))) + (_ + (format "\\[\n%s\\]" contents)))) ;;;; Pseudo Object: LaTeX Math Block @@ -2918,21 +2958,23 @@ contextual information." ;; Case 3. Use minted package. ((eq listings 'minted) (let* ((caption-str (org-latex--caption/label-string src-block info)) + (placement (or (org-unbracket-string "[" "]" (plist-get attributes :placement)) + (plist-get info :latex-default-figure-position))) (float-env (cond ((string= "multicolumn" float) (format "\\begin{listing*}[%s]\n%s%%s\n%s\\end{listing*}" - (plist-get info :latex-default-figure-position) + placement (if caption-above-p caption-str "") (if caption-above-p "" caption-str))) (caption (format "\\begin{listing}[%s]\n%s%%s\n%s\\end{listing}" - (plist-get info :latex-default-figure-position) + placement (if caption-above-p caption-str "") (if caption-above-p "" caption-str))) ((string= "t" float) (concat (format "\\begin{listing}[%s]\n" - (plist-get info :latex-default-figure-position)) + placement) "%s\n\\end{listing}")) (t "%s"))) (options (plist-get info :latex-minted-options)) @@ -3140,6 +3182,56 @@ centered." info) (apply 'concat (nreverse align))))) +(defun org-latex--decorate-table (table attributes caption above? info) + "Decorate TABLE string with caption and float environment. + +ATTRIBUTES is the plist containing is LaTeX attributes. CAPTION +is its caption, as a string or nil. It is located above the +table if ABOVE? is non-nil. INFO is the plist containing current +export parameters. + +Return new environment, as a string." + (let* ((float-environment + (let ((float (plist-get attributes :float))) + (cond ((and (not float) (plist-member attributes :float)) nil) + ((member float '("sidewaystable" "sideways")) "sidewaystable") + ((equal float "multicolumn") "table*") + ((or float (org-string-nw-p caption)) "table") + (t nil)))) + (placement + (or (plist-get attributes :placement) + (format "[%s]" (plist-get info :latex-default-figure-position)))) + (center? (if (plist-member attributes :center) + (plist-get attributes :center) + (plist-get info :latex-tables-centered))) + (fontsize (let ((font (plist-get attributes :font))) + (and font (concat font "\n"))))) + (concat (cond + (float-environment + (concat (format "\\begin{%s}%s\n" float-environment placement) + (if above? caption "") + (when center? "\\centering\n") + fontsize)) + (caption + (concat (and center? "\\begin{center}\n" ) + (if above? caption "") + (cond ((and fontsize center?) fontsize) + (fontsize (concat "{" fontsize)) + (t nil)))) + (center? (concat "\\begin{center}\n" fontsize)) + (fontsize (concat "{" fontsize))) + table + (cond + (float-environment + (concat (if above? "" (concat "\n" caption)) + (format "\n\\end{%s}" float-environment))) + (caption + (concat (if above? "" (concat "\n" caption)) + (and center? "\n\\end{center}") + (and fontsize (not center?) "}"))) + (center? "\n\\end{center}") + (fontsize "}"))))) + (defun org-latex--org-table (table contents info) "Return appropriate LaTeX code for an Org table. @@ -3149,109 +3241,44 @@ channel. This function assumes TABLE has `org' as its `:type' property and `table' as its `:mode' attribute." - (let* ((caption (org-latex--caption/label-string table info)) - (attr (org-export-read-attribute :attr_latex table)) - ;; Determine alignment string. + (let* ((attr (org-export-read-attribute :attr_latex table)) (alignment (org-latex--align-string table info)) - ;; Determine environment for the table: longtable, tabular... (table-env (or (plist-get attr :environment) (plist-get info :latex-default-table-environment))) - ;; If table is a float, determine environment: table, table* - ;; or sidewaystable. - (float-env (unless (member table-env '("longtable" "longtabu")) - (let ((float (plist-get attr :float))) - (cond - ((and (not float) (plist-member attr :float)) nil) - ((or (string= float "sidewaystable") - (string= float "sideways")) "sidewaystable") - ((string= float "multicolumn") "table*") - ((or float - (org-element-property :caption table) - (org-string-nw-p (plist-get attr :caption))) - "table"))))) - ;; Extract others display options. - (fontsize (let ((font (plist-get attr :font))) - (and font (concat font "\n")))) - ;; "tabular" environment doesn't allow to define a width. - (width (and (not (equal table-env "tabular")) (plist-get attr :width))) - (spreadp (plist-get attr :spread)) - (placement - (or (plist-get attr :placement) - (format "[%s]" (plist-get info :latex-default-figure-position)))) - (centerp (if (plist-member attr :center) (plist-get attr :center) - (plist-get info :latex-tables-centered))) - (caption-above-p (org-latex--caption-above-p table info))) - ;; Prepare the final format string for the table. + (width + (let ((w (plist-get attr :width))) + (cond ((not w) "") + ((member table-env '("tabular" "longtable")) "") + ((member table-env '("tabu" "longtabu")) + (format (if (plist-get attr :spread) " spread %s " + " to %s ") + w)) + (t (format "{%s}" w))))) + (caption (org-latex--caption/label-string table info)) + (above? (org-latex--caption-above-p table info))) (cond - ;; Longtable. - ((equal "longtable" table-env) - (concat (and fontsize (concat "{" fontsize)) - (format "\\begin{longtable}{%s}\n" alignment) - (and caption-above-p - (org-string-nw-p caption) - (concat caption "\\\\\n")) - contents - (and (not caption-above-p) - (org-string-nw-p caption) - (concat caption "\\\\\n")) - "\\end{longtable}\n" - (and fontsize "}"))) - ;; Longtabu - ((equal "longtabu" table-env) - (concat (and fontsize (concat "{" fontsize)) - (format "\\begin{longtabu}%s{%s}\n" - (if width - (format " %s %s " - (if spreadp "spread" "to") width) "") - alignment) - (and caption-above-p - (org-string-nw-p caption) - (concat caption "\\\\\n")) - contents - (and (not caption-above-p) - (org-string-nw-p caption) - (concat caption "\\\\\n")) - "\\end{longtabu}\n" - (and fontsize "}"))) - ;; Others. - (t (concat (cond - (float-env - (concat (format "\\begin{%s}%s\n" float-env placement) - (if caption-above-p caption "") - (when centerp "\\centering\n") - fontsize)) - ((and (not float-env) caption) - (concat - (and centerp "\\begin{center}\n" ) - (if caption-above-p caption "") - (cond ((and fontsize centerp) fontsize) - (fontsize (concat "{" fontsize))))) - (centerp (concat "\\begin{center}\n" fontsize)) - (fontsize (concat "{" fontsize))) - (cond ((equal "tabu" table-env) - (format "\\begin{tabu}%s{%s}\n%s\\end{tabu}" - (if width (format - (if spreadp " spread %s " " to %s ") - width) "") - alignment - contents)) - (t (format "\\begin{%s}%s{%s}\n%s\\end{%s}" - table-env - (if width (format "{%s}" width) "") - alignment - contents - table-env))) - (cond - (float-env - (concat (if caption-above-p "" (concat "\n" caption)) - (format "\n\\end{%s}" float-env))) - ((and (not float-env) caption) - (concat - (if caption-above-p "" (concat "\n" caption)) - (and centerp "\n\\end{center}") - (and fontsize (not centerp) "}"))) - (centerp "\n\\end{center}") - (fontsize "}"))))))) + ((member table-env '("longtable" "longtabu")) + (let ((fontsize (let ((font (plist-get attr :font))) + (and font (concat font "\n"))))) + (concat (and fontsize (concat "{" fontsize)) + (format "\\begin{%s}%s{%s}\n" table-env width alignment) + (and above? + (org-string-nw-p caption) + (concat caption "\\\\\n")) + contents + (and (not above?) + (org-string-nw-p caption) + (concat caption "\\\\\n")) + (format "\\end{%s}" table-env) + (and fontsize "}")))) + (t + (let ((output (format "\\begin{%s}%s{%s}\n%s\\end{%s}" + table-env + width + alignment + contents + table-env))) + (org-latex--decorate-table output attr caption above? info)))))) (defun org-latex--table.el-table (table info) "Return appropriate LaTeX code for a table.el table. @@ -3265,18 +3292,20 @@ property." ;; Ensure "*org-export-table*" buffer is empty. (with-current-buffer (get-buffer-create "*org-export-table*") (erase-buffer)) - (let ((output (with-temp-buffer - (insert (org-element-property :value table)) - (goto-char 1) - (re-search-forward "^[ \t]*|[^|]" nil t) - (table-generate-source 'latex "*org-export-table*") - (with-current-buffer "*org-export-table*" - (org-trim (buffer-string)))))) + (let ((output + (replace-regexp-in-string + "^%.*\n" "" ;remove comments + (with-temp-buffer + (save-excursion (insert (org-element-property :value table))) + (re-search-forward "^[ \t]*|[^|]" nil t) + (table-generate-source 'latex "*org-export-table*") + (with-current-buffer "*org-export-table*" + (org-trim (buffer-string)))) + t t))) (kill-buffer (get-buffer "*org-export-table*")) - ;; Remove left out comments. - (while (string-match "^%.*\n" output) - (setq output (replace-match "" t t output))) - (let ((attr (org-export-read-attribute :attr_latex table))) + (let ((attr (org-export-read-attribute :attr_latex table)) + (caption (org-latex--caption/label-string table info)) + (above? (org-latex--caption-above-p table info))) (when (plist-get attr :rmlines) ;; When the "rmlines" attribute is provided, remove all hlines ;; but the one separating heading from the table body. @@ -3285,10 +3314,7 @@ property." (setq pos (string-match "^\\\\hline\n?" output pos))) (cl-incf n) (unless (= n 2) (setq output (replace-match "" nil nil output)))))) - (let ((centerp (if (plist-member attr :center) (plist-get attr :center) - (plist-get info :latex-tables-centered)))) - (if (not centerp) output - (format "\\begin{center}\n%s\n\\end{center}" output)))))) + (org-latex--decorate-table output attr caption above? info)))) (defun org-latex--math-table (table info) "Return appropriate LaTeX code for a matrix. diff --git a/elpa/org-20191028/ox-man.el b/elpa/org-20200127/ox-man.el similarity index 99% rename from elpa/org-20191028/ox-man.el rename to elpa/org-20200127/ox-man.el index 00698fc2..36822ff9 100644 --- a/elpa/org-20191028/ox-man.el +++ b/elpa/org-20200127/ox-man.el @@ -1,6 +1,6 @@ ;; ox-man.el --- Man Back-End for Org Export Engine -*- lexical-binding: t; -*- -;; Copyright (C) 2011-2019 Free Software Foundation, Inc. +;; Copyright (C) 2011-2020 Free Software Foundation, Inc. ;; Author: Nicolas Goaziou ;; Luis R Anaya diff --git a/elpa/org-20191028/ox-md.el b/elpa/org-20200127/ox-md.el similarity index 97% rename from elpa/org-20191028/ox-md.el rename to elpa/org-20200127/ox-md.el index d574e696..91d5c0ba 100644 --- a/elpa/org-20191028/ox-md.el +++ b/elpa/org-20200127/ox-md.el @@ -1,6 +1,6 @@ ;;; ox-md.el --- Markdown Back-End for Org Export Engine -*- lexical-binding: t; -*- -;; Copyright (C) 2012-2019 Free Software Foundation, Inc. +;; Copyright (C) 2012-2020 Free Software Foundation, Inc. ;; Author: Nicolas Goaziou ;; Keywords: org, wp, markdown @@ -363,9 +363,14 @@ channel." ((string-match-p "\\" value) (let ((depth (and (string-match "\\<[0-9]+\\>" value) (string-to-number (match-string 0 value)))) - (local? (string-match-p "\\" value))) + (scope + (cond + ((string-match ":target +\\(\".+?\"\\|\\S-+\\)" value) ;link + (org-export-resolve-link + (org-strip-quotes (match-string 1 value)) info)) + ((string-match-p "\\" value) keyword)))) ;local (org-remove-indentation - (org-md--build-toc info depth keyword local?))))))) + (org-md--build-toc info depth keyword scope))))))) (_ (org-export-with-backend 'html keyword contents info)))) @@ -550,7 +555,7 @@ a communication channel." ;;;; Template -(defun org-md--build-toc (info &optional n keyword local) +(defun org-md--build-toc (info &optional n _keyword scope) "Return a table of contents. INFO is a plist used as a communication channel. @@ -558,13 +563,10 @@ INFO is a plist used as a communication channel. Optional argument N, when non-nil, is an integer specifying the depth of the table. -Optional argument KEYWORD specifies the TOC keyword, if any, from -which the table of contents generation has been initiated. - -When optional argument LOCAL is non-nil, build a table of -contents according to the current headline." +When optional argument SCOPE is non-nil, build a table of +contents according to the specified element." (concat - (unless local + (unless scope (let ((style (plist-get info :md-headline-style)) (title (org-html--translate "Table of Contents" info))) (org-md--headline-title style 1 title nil))) @@ -594,7 +596,7 @@ contents according to the current headline." (org-make-tag-string (org-export-get-tags headline info))))) (concat indentation bullet title tags))) - (org-export-collect-headlines info n (and local keyword)) "\n") + (org-export-collect-headlines info n scope) "\n") "\n")) (defun org-md--footnote-formatted (footnote info) diff --git a/elpa/org-20191028/ox-odt.el b/elpa/org-20200127/ox-odt.el similarity index 99% rename from elpa/org-20191028/ox-odt.el rename to elpa/org-20200127/ox-odt.el index 8f2a1d1d..59480cd4 100644 --- a/elpa/org-20191028/ox-odt.el +++ b/elpa/org-20200127/ox-odt.el @@ -1,6 +1,6 @@ ;;; ox-odt.el --- OpenDocument Text Exporter for Org Mode -*- lexical-binding: t; -*- -;; Copyright (C) 2010-2019 Free Software Foundation, Inc. +;; Copyright (C) 2010-2020 Free Software Foundation, Inc. ;; Author: Jambunathan K ;; Keywords: outlines, hypermedia, calendar, wp @@ -148,8 +148,7 @@ Use this to infer values of `org-odt-styles-dir' and `org-odt-schema-dir'.") -(defvar org-odt-data-dir - (expand-file-name "../../etc/" org-odt-lib-dir) +(defvar org-odt-data-dir (expand-file-name "../../etc/" org-odt-lib-dir) "Data directory for ODT exporter. Use this to infer values of `org-odt-styles-dir' and `org-odt-schema-dir'.") @@ -162,25 +161,17 @@ Use this to infer values of `org-odt-styles-dir' and "Regular expressions for special string conversion.") (defconst org-odt-schema-dir-list - (list - (and org-odt-data-dir - (expand-file-name "./schema/" org-odt-data-dir)) ; bail out - (eval-when-compile - (and (boundp 'org-odt-data-dir) org-odt-data-dir ; see make install - (expand-file-name "./schema/" org-odt-data-dir)))) + (list (expand-file-name "./schema/" org-odt-data-dir)) "List of directories to search for OpenDocument schema files. -Use this list to set the default value of -`org-odt-schema-dir'. The entries in this list are -populated heuristically based on the values of `org-odt-lib-dir' -and `org-odt-data-dir'.") +Use this list to set the default value of `org-odt-schema-dir'. +The entries in this list are populated heuristically based on the +values of `org-odt-lib-dir' and `org-odt-data-dir'.") (defconst org-odt-styles-dir-list (list (and org-odt-data-dir (expand-file-name "./styles/" org-odt-data-dir)) ; bail out - (eval-when-compile - (and (boundp 'org-odt-data-dir) org-odt-data-dir ; see make install - (expand-file-name "./styles/" org-odt-data-dir))) + (expand-file-name "./styles/" org-odt-data-dir) (expand-file-name "../etc/styles/" org-odt-lib-dir) ; git (expand-file-name "./etc/styles/" org-odt-lib-dir) ; elpa (expand-file-name "./org/" data-directory) ; system @@ -823,7 +814,7 @@ form (TABLE-STYLE-NAME TABLE-TEMPLATE-NAME TABLE-CELL-OPTIONS). TABLE-STYLE-NAME is the style associated with the table through \"#+ATTR_ODT: :style TABLE-STYLE-NAME\" line. -TABLE-TEMPLATE-NAME is a set of - upto 9 - automatic +TABLE-TEMPLATE-NAME is a set of - up to 9 - automatic TABLE-CELL-STYLE-NAMEs and PARAGRAPH-STYLE-NAMEs (as defined below) that is included in `org-odt-content-template-file'. @@ -1392,6 +1383,8 @@ original parsed data. INFO is a plist holding export options." ;; create a manifest entry for styles.xml (org-odt-create-manifest-file-entry "text/xml" "styles.xml") + ;; Ensure we have write permissions to this file. + (set-file-modes (concat org-odt-zip-dir "styles.xml") #o600) ;; FIXME: Who is opening an empty styles.xml before this point? (with-current-buffer @@ -1423,7 +1416,7 @@ original parsed data. INFO is a plist holding export options." ;; the resulting odt file. (setq-local backup-inhibited t) - ;; Outline numbering is retained only upto LEVEL. + ;; Outline numbering is retained only up to LEVEL. ;; To disable outline numbering pass a LEVEL of 0. (goto-char (point-min)) @@ -1969,10 +1962,12 @@ contextual information." CONTENTS holds the contents of the item. INFO is a plist holding contextual information." (let* ((plain-list (org-export-get-parent item)) + (count (org-element-property :counter item)) (type (org-element-property :type plain-list))) (unless (memq type '(ordered unordered descriptive-1 descriptive-2)) (error "Unknown list type: %S" type)) - (format "\n\n%s\n%s" + (format "\n\n%s\n%s" + (if count (format " text:start-value=\"%s\"" count) "") contents (if (org-element-map item 'table #'identity info 'first-match) "" @@ -1998,8 +1993,13 @@ information." (let ((depth (or (and (string-match "\\<[0-9]+\\>" value) (string-to-number (match-string 0 value))) (plist-get info :headline-levels))) - (localp (string-match-p "\\" value))) - (org-odt-toc depth info (and localp keyword)))) + (scope + (cond + ((string-match ":target +\\(\".+?\"\\|\\S-+\\)" value) ;link + (org-export-resolve-link + (org-strip-quotes (match-string 1 value)) info)) + ((string-match-p "\\" value) keyword)))) ;local + (org-odt-toc depth info scope))) ((string-match-p "tables\\|figures\\|listings" value) ;; FIXME (ignore)))))))) @@ -3243,7 +3243,7 @@ styles congruent with the ODF-1.2 specification." (when style-spec ;; LibreOffice - particularly the Writer - honors neither table ;; templates nor custom table-cell styles. Inorder to retain - ;; inter-operability with LibreOffice, only automatic styles are + ;; interoperability with LibreOffice, only automatic styles are ;; used for styling of table-cells. The current implementation is ;; congruent with ODF-1.2 specification and hence is ;; future-compatible. diff --git a/elpa/org-20191028/ox-org.el b/elpa/org-20200127/ox-org.el similarity index 99% rename from elpa/org-20191028/ox-org.el rename to elpa/org-20200127/ox-org.el index 0e7f977f..97d8d0e9 100644 --- a/elpa/org-20191028/ox-org.el +++ b/elpa/org-20200127/ox-org.el @@ -1,6 +1,6 @@ ;;; ox-org.el --- Org Back-End for Org Export Engine -*- lexical-binding: t; -*- -;; Copyright (C) 2013-2019 Free Software Foundation, Inc. +;; Copyright (C) 2013-2020 Free Software Foundation, Inc. ;; Author: Nicolas Goaziou ;; Keywords: org, wp diff --git a/elpa/org-20191028/ox-publish.el b/elpa/org-20200127/ox-publish.el similarity index 99% rename from elpa/org-20191028/ox-publish.el rename to elpa/org-20200127/ox-publish.el index ca093a5b..a4767965 100644 --- a/elpa/org-20191028/ox-publish.el +++ b/elpa/org-20200127/ox-publish.el @@ -1,5 +1,5 @@ ;;; ox-publish.el --- Publish Related Org Mode Files as a Website -*- lexical-binding: t; -*- -;; Copyright (C) 2006-2019 Free Software Foundation, Inc. +;; Copyright (C) 2006-2020 Free Software Foundation, Inc. ;; Author: David O'Toole ;; Maintainer: Carsten Dominik @@ -1171,7 +1171,10 @@ references with `org-export-get-reference'." (with-current-buffer (find-file-noselect file) (org-with-point-at 1 (let ((org-link-search-must-match-exact-headline t)) - (org-link-search search nil t)) + (condition-case err + (org-link-search search nil t) + (error + (signal 'org-link-broken (cdr err))))) (and (org-at-heading-p) (org-string-nw-p (org-entry-get (point) "CUSTOM_ID")))))))) ((not org-publish-cache) @@ -1298,8 +1301,8 @@ the file including them will be republished as well." (let* ((value (org-element-property :value element)) (filename (and (string-match "\\`\\(\".+?\"\\|\\S-+\\)" value) - (let ((m (org-unbracket-string - "\"" "\"" (match-string 1 value)))) + (let ((m (org-strip-quotes + (match-string 1 value)))) ;; Ignore search suffix. (if (string-match "::.*?\\'" m) (substring m 0 (match-beginning 0)) diff --git a/elpa/org-20191028/ox-texinfo.el b/elpa/org-20200127/ox-texinfo.el similarity index 99% rename from elpa/org-20191028/ox-texinfo.el rename to elpa/org-20200127/ox-texinfo.el index 4f37a2a8..4265a85d 100644 --- a/elpa/org-20191028/ox-texinfo.el +++ b/elpa/org-20200127/ox-texinfo.el @@ -1,6 +1,6 @@ ;;; ox-texinfo.el --- Texinfo Back-End for Org Export Engine -*- lexical-binding: t; -*- -;; Copyright (C) 2012-2019 Free Software Foundation, Inc. +;; Copyright (C) 2012-2020 Free Software Foundation, Inc. ;; Author: Jonathan Leech-Pepin ;; Keywords: outlines, hypermedia, calendar, wp @@ -1253,12 +1253,14 @@ contextual information." (if (string-prefix-p "@" i) i (concat "@" i)))) (table-type (plist-get attr :table-type)) (type (org-element-property :type plain-list)) - (initial-counter - (and (eq type 'ordered) - ;; Texinfo only supports initial counters, i.e., it - ;; cannot change the numbering mid-list. - (let ((first-item (car (org-element-contents plain-list)))) - (org-element-property :counter first-item)))) + (enum + (cond ((not (eq type 'ordered)) nil) + ((plist-member attr :enum) (plist-get attr :enum)) + (t + ;; Texinfo only supports initial counters, i.e., it + ;; cannot change the numbering mid-list. + (let ((first-item (car (org-element-contents plain-list)))) + (org-element-property :counter first-item))))) (list-type (cond ((eq type 'ordered) "enumerate") ((eq type 'unordered) "itemize") @@ -1266,7 +1268,7 @@ contextual information." (t "table")))) (format "@%s\n%s@end %s" (cond ((eq type 'descriptive) (concat list-type " " indic)) - (initial-counter (format "%s %d" list-type initial-counter)) + (enum (format "%s %s" list-type enum)) (t list-type)) contents list-type))) diff --git a/elpa/org-20191028/ox.el b/elpa/org-20200127/ox.el similarity index 99% rename from elpa/org-20191028/ox.el rename to elpa/org-20200127/ox.el index c02a6c44..22cf1d53 100644 --- a/elpa/org-20191028/ox.el +++ b/elpa/org-20200127/ox.el @@ -1,6 +1,6 @@ ;;; ox.el --- Export Framework for Org Mode -*- lexical-binding: t; -*- -;; Copyright (C) 2012-2019 Free Software Foundation, Inc. +;; Copyright (C) 2012-2020 Free Software Foundation, Inc. ;; Author: Nicolas Goaziou ;; Keywords: outlines, hypermedia, calendar, wp @@ -73,6 +73,7 @@ (require 'cl-lib) (require 'ob-exp) +(require 'ol) (require 'org-element) (require 'org-macro) (require 'tabulated-list) @@ -3270,6 +3271,11 @@ storing and resolving footnotes. It is created automatically." (let* ((value (org-element-property :value element)) (ind (current-indentation)) location + (coding-system-for-read + (or (and (string-match ":coding +\\(\\S-+\\)>" value) + (prog1 (intern (match-string 1 value)) + (setq value (replace-match "" nil nil value)))) + coding-system-for-read)) (file (and (string-match "^\\(\".+?\"\\|\\S-+\\)\\(?:\\s-+\\|$\\)" value) @@ -3517,8 +3523,8 @@ is to happen." (goto-char (point-min)) (unless (eq major-mode 'org-mode) (let ((org-inhibit-startup t)) (org-mode))) ;set regexps - (let ((regexp (concat org-plain-link-re "\\|" org-angle-link-re))) - (while (re-search-forward org-any-link-re nil t) + (let ((regexp (concat org-link-plain-re "\\|" org-link-angle-re))) + (while (re-search-forward org-link-any-re nil t) (let ((link (save-excursion (forward-char -1) (save-match-data (org-element-context))))) @@ -3701,18 +3707,24 @@ will become the empty string." (cdr (nreverse (cons (funcall prepare-value s) result)))))))) (if property (plist-get attributes property) attributes))) -(defun org-export-get-caption (element &optional shortp) +(defun org-export-get-caption (element &optional short) "Return caption from ELEMENT as a secondary string. -When optional argument SHORTP is non-nil, return short caption, -as a secondary string, instead. +When optional argument SHORT is non-nil, return short caption, as +a secondary string, instead. Caption lines are separated by a white space." - (let ((full-caption (org-element-property :caption element)) caption) - (dolist (line full-caption (cdr caption)) - (let ((cap (funcall (if shortp 'cdr 'car) line))) - (when cap - (setq caption (nconc (list " ") (copy-sequence cap) caption))))))) + (let ((full-caption (org-element-property :caption element)) + (get (if short #'cdr #'car)) + caption) + (dolist (line full-caption) + (pcase (funcall get line) + (`nil nil) + (c + (setq caption + (nconc (list " ") + (copy-sequence c) caption))))) + (cdr caption))) ;;;; For Derived Back-ends @@ -4156,6 +4168,9 @@ meant to be translated with `org-export-data' or alike." ;; specified id or custom-id in parse tree, the path to the external ;; file with the id. ;; +;; `org-export-resolve-link' searches for the destination of a link +;; within the parsed tree and returns the element. +;; ;; `org-export-resolve-coderef' associates a reference to a line ;; number in the element it belongs, or returns the reference itself ;; when the element isn't numbered. @@ -4243,8 +4258,8 @@ structure of RULES. Return modified DATA." (let ((link-re (format "\\`\\(?:%s\\|%s\\)\\'" - org-plain-link-re - org-angle-link-re)) + org-link-plain-re + org-link-angle-re)) (case-fold-search t)) (org-element-map data 'link (lambda (l) @@ -4350,7 +4365,7 @@ as returned by `org-export-search-cells'." (let ((targets (org-export-search-cells datum))) (and targets (cl-some (lambda (cell) (member cell targets)) cells)))) -(defun org-export-resolve-fuzzy-link (link info) +(defun org-export-resolve-fuzzy-link (link info &rest pseudo-types) "Return LINK destination. INFO is a plist holding contextual information. @@ -4367,6 +4382,10 @@ Return value can be an object or an element: - Otherwise, throw an error. +PSEUDO-TYPES are pseudo-elements types, i.e., elements defined +specifically in an export back-end, that could have a name +affiliated keyword. + Assume LINK type is \"fuzzy\". White spaces are not significant." (let* ((search-cells (org-export-string-to-search-cell @@ -4379,7 +4398,7 @@ significant." (if (not (eq cached 'not-found)) cached (let ((matches (org-element-map (plist-get info :parse-tree) - (cons 'target org-element-all-elements) + (append pseudo-types '(target) org-element-all-elements) (lambda (datum) (and (org-export-match-search-cell-p datum search-cells) datum))))) @@ -4438,6 +4457,31 @@ has type \"radio\"." radio)) info 'first-match))) +(defun org-export-resolve-link (link info) + "Return LINK destination. + +LINK is a string or a link object. + +INFO is a plist holding contextual information. + +Return value can be an object or an element: + +- If LINK path matches an ID or a custom ID, return the headline. + +- If LINK path matches a fuzzy link, return its destination. + +- Otherwise, throw an error." + ;; Convert string links to link objects. + (when (stringp link) + (setq link (with-temp-buffer + (save-excursion + (insert (org-link-make-string link))) + (org-element-link-parser)))) + (pcase (org-element-property :type link) + ((or "custom-id" "id") (org-export-resolve-id-link link info)) + ("fuzzy" (org-export-resolve-fuzzy-link link info)) + (_ (signal 'org-link-broken (list (org-element-property :path link)))))) + (defun org-export-file-uri (filename) "Return file URI associated to FILENAME." (cond ((string-prefix-p "//" filename) (concat "file:" filename)) @@ -6885,7 +6929,7 @@ options as CDR." (org-export--dispatch-ui options first-key expertp)) ;; q key at first level aborts export. At second level, cancel ;; first key instead. - ((eq key ?q) (if (not first-key) (error "Export aborted") + ((eq key ?q) (if (not first-key) (user-error "Export aborted") (org-export--dispatch-ui options nil expertp))) ;; Help key: Switch back to standard interface if expert UI was ;; active. diff --git a/init.el b/init.el index 2030b340..3c5b2422 100644 --- a/init.el +++ b/init.el @@ -1,11 +1,11 @@ (setq load-path (append - (list (expand-file-name "~/.emacs.d/lisp") (expand-file-name "~/.emacs.d/elpa/org-20191028")) + (list (expand-file-name "~/.emacs.d/lisp") (expand-file-name "~/.emacs.d/elpa/org-20200127")) load-path)) (if (string-equal system-type "darwin") (delete ' "/Applications/Emacs.app/Contents/Resources/lisp/org" load-path)) (setq org-use-extra-keys t) -(require 'org "~/.emacs.d/elpa/org-20191028/org.el") +(require 'org "~/.emacs.d/elpa/org-20200127/org.el") (require 'ob-core) (require 'ob-tangle) (require 'ob-sql) -- 2.47.3