diff options
author | mattkae <mattkae@protonmail.com> | 2022-06-07 08:23:47 -0400 |
---|---|---|
committer | mattkae <mattkae@protonmail.com> | 2022-06-07 08:23:47 -0400 |
commit | bd18a38c2898548a3664a9ddab9f79c84f2caf4a (patch) | |
tree | 95b9933376770381bd8859782ae763be81c2d72b /elpa/org-9.5.2/org-indent.el | |
parent | b07628dddf418d4f47b858e6c35fd3520fbaeed2 (diff) | |
parent | ef160dea332af4b4fe5e2717b962936c67e5fe9e (diff) |
Merge conflict
Diffstat (limited to 'elpa/org-9.5.2/org-indent.el')
-rw-r--r-- | elpa/org-9.5.2/org-indent.el | 428 |
1 files changed, 0 insertions, 428 deletions
diff --git a/elpa/org-9.5.2/org-indent.el b/elpa/org-9.5.2/org-indent.el deleted file mode 100644 index e0cb697..0000000 --- a/elpa/org-9.5.2/org-indent.el +++ /dev/null @@ -1,428 +0,0 @@ -;;; org-indent.el --- Dynamic indentation for Org -*- lexical-binding: t; -*- - -;; Copyright (C) 2009-2021 Free Software Foundation, Inc. -;; -;; Author: Carsten Dominik <carsten.dominik@gmail.com> -;; Keywords: outlines, hypermedia, calendar, wp -;; 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 <https://www.gnu.org/licenses/>. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Commentary: - -;; This is an implementation of dynamic virtual indentation. It works -;; by adding text properties to a buffer to make sure lines are -;; indented according to outline structure. -;; -;; The process is synchronous, toggled at every buffer modification. -;; Though, the initialization (indentation of text already in the -;; buffer), which can take a few seconds in large buffers, happens on -;; idle time. -;; -;;; Code: - -(require 'org-macs) -(require 'org-compat) -(require 'org) - -(require 'cl-lib) - -(declare-function org-inlinetask-get-task-level "org-inlinetask" ()) -(declare-function org-inlinetask-in-task-p "org-inlinetask" ()) -(declare-function org-list-item-body-column "org-list" (item)) -(defvar org-inlinetask-show-first-star) - -(defgroup org-indent nil - "Options concerning dynamic virtual outline indentation." - :tag "Org Indent" - :group 'org) - -(defvar org-indent-inlinetask-first-star (org-add-props "*" '(face org-warning)) - "First star of inline tasks, with correct face.") -(defvar org-indent-agent-timer nil - "Timer running the initialize agent.") -(defvar org-indent-agentized-buffers nil - "List of buffers watched by the initialize agent.") -(defvar org-indent-agent-resume-timer nil - "Timer to reschedule agent after switching to other idle processes.") -(defvar org-indent-agent-active-delay '(0 2 0) - "Time to run agent before switching to other idle processes. -Delay used when the buffer to initialize is current.") -(defvar org-indent-agent-passive-delay '(0 0 400000) - "Time to run agent before switching to other idle processes. -Delay used when the buffer to initialize isn't current.") -(defvar org-indent-agent-resume-delay '(0 0 100000) - "Minimal time for other idle processes before switching back to agent.") -(defvar org-indent--initial-marker nil - "Position of initialization before interrupt. -This is used locally in each buffer being initialized.") -(defvar org-indent-modified-headline-flag nil - "Non-nil means the last deletion operated on a headline. -It is modified by `org-indent-notify-modified-headline'.") - - -(defcustom org-indent-boundary-char ?\s - "The end of the virtual indentation strings, a single-character string. -The default is just a space, but if you wish, you can use \"|\" or so. -This can be useful on a terminal window - under a windowing system, -it may be prettier to customize the `org-indent' face." - :group 'org-indent - :type 'character) - -(defcustom org-indent-mode-turns-off-org-adapt-indentation t - "Non-nil means setting `org-indent-mode' will turn off indentation adaptation. -For details see the variable `org-adapt-indentation'." - :group 'org-indent - :type 'boolean) - -(defcustom org-indent-mode-turns-on-hiding-stars t - "Non-nil means setting `org-indent-mode' will turn on `org-hide-leading-stars'." - :group 'org-indent - :type 'boolean) - -(defcustom org-indent-indentation-per-level 2 - "Indentation per level in number of characters." - :group 'org-indent - :type 'integer) - -(defface org-indent '((t (:inherit org-hide))) - "Face for outline indentation. -The default is to make it look like whitespace. But you may find it -useful to make it ever so slightly different." - :group 'org-faces) - -(defvar org-indent--text-line-prefixes nil - "Vector containing line prefixes strings for regular text.") - -(defvar org-indent--heading-line-prefixes nil - "Vector containing line prefix strings for headlines.") - -(defvar org-indent--inlinetask-line-prefixes nil - "Vector containing line prefix strings for inline tasks.") - -(defconst org-indent--deepest-level 50 - "Maximum theoretical headline depth.") - -(defun org-indent--compute-prefixes () - "Compute prefix strings for regular text and headlines." - (setq org-indent--heading-line-prefixes - (make-vector org-indent--deepest-level nil)) - (setq org-indent--inlinetask-line-prefixes - (make-vector org-indent--deepest-level nil)) - (setq org-indent--text-line-prefixes - (make-vector org-indent--deepest-level nil)) - (when (> org-indent-indentation-per-level 0) - (dotimes (n org-indent--deepest-level) - (let ((indentation (if (<= n 1) 0 - (* (1- org-indent-indentation-per-level) - (1- n))))) - ;; Headlines line prefixes. - (let ((heading-prefix (make-string indentation ?*))) - (aset org-indent--heading-line-prefixes - n - (org-add-props heading-prefix nil 'face 'org-indent)) - ;; Inline tasks line prefixes - (aset org-indent--inlinetask-line-prefixes - n - (cond ((<= n 1) "") - ((bound-and-true-p org-inlinetask-show-first-star) - (concat org-indent-inlinetask-first-star - (substring heading-prefix 1))) - (t (org-add-props heading-prefix nil 'face 'org-indent))))) - ;; Text line prefixes. - (aset org-indent--text-line-prefixes - n - (org-add-props - (concat (make-string (+ n indentation) ?\s) - (and (> n 0) - (char-to-string org-indent-boundary-char))) - nil 'face 'org-indent)))))) - -(defsubst org-indent-remove-properties (beg end) - "Remove indentations between BEG and END." - (with-silent-modifications - (remove-text-properties beg end '(line-prefix nil wrap-prefix nil)))) - -;;;###autoload -(define-minor-mode org-indent-mode - "When active, indent text according to outline structure. - -Internally this works by adding `line-prefix' and `wrap-prefix' -properties, after each buffer modification, on the modified zone. - -The process is synchronous. Though, initial indentation of -buffer, which can take a few seconds on large buffers, is done -during idle time." - :lighter " Ind" - (cond - (org-indent-mode - ;; mode was turned on. - (setq-local indent-tabs-mode nil) - (setq-local org-indent--initial-marker (copy-marker 1)) - (when org-indent-mode-turns-off-org-adapt-indentation - ;; Don't turn off `org-adapt-indentation' when its value is - ;; 'headline-data, just indent headline data specially. - (or (eq org-adapt-indentation 'headline-data) - (setq-local org-adapt-indentation nil))) - (when org-indent-mode-turns-on-hiding-stars - (setq-local org-hide-leading-stars t)) - (org-indent--compute-prefixes) - (if (boundp 'filter-buffer-substring-functions) - (add-hook 'filter-buffer-substring-functions - (lambda (fun start end delete) - (org-indent-remove-properties-from-string - (funcall fun start end delete))) - nil t) - ;; Emacs >= 24.4. - (add-function :filter-return (local 'filter-buffer-substring-function) - #'org-indent-remove-properties-from-string)) - (add-hook 'after-change-functions 'org-indent-refresh-maybe nil 'local) - (add-hook 'before-change-functions - 'org-indent-notify-modified-headline nil 'local) - (and font-lock-mode (org-restart-font-lock)) - (org-indent-remove-properties (point-min) (point-max)) - ;; Submit current buffer to initialize agent. If it's the first - ;; buffer submitted, also start the agent. Current buffer is - ;; pushed in both cases to avoid a race condition. - (if org-indent-agentized-buffers - (push (current-buffer) org-indent-agentized-buffers) - (push (current-buffer) org-indent-agentized-buffers) - (setq org-indent-agent-timer - (run-with-idle-timer 0.2 t #'org-indent-initialize-agent)))) - (t - ;; Mode was turned off (or we refused to turn it on) - (kill-local-variable 'org-adapt-indentation) - (setq org-indent-agentized-buffers - (delq (current-buffer) org-indent-agentized-buffers)) - (when (markerp org-indent--initial-marker) - (set-marker org-indent--initial-marker nil)) - (when (local-variable-p 'org-hide-leading-stars) - (kill-local-variable 'org-hide-leading-stars)) - (if (boundp 'filter-buffer-substring-functions) - (remove-hook 'filter-buffer-substring-functions - (lambda (fun start end delete) - (org-indent-remove-properties-from-string - (funcall fun start end delete)))) - (remove-function (local 'filter-buffer-substring-function) - #'org-indent-remove-properties-from-string)) - (remove-hook 'after-change-functions 'org-indent-refresh-maybe 'local) - (remove-hook 'before-change-functions - 'org-indent-notify-modified-headline 'local) - (org-with-wide-buffer - (org-indent-remove-properties (point-min) (point-max))) - (and font-lock-mode (org-restart-font-lock)) - (redraw-display)))) - -(defun org-indent-indent-buffer () - "Add indentation properties to the accessible part of the buffer." - (interactive) - (if (not (derived-mode-p 'org-mode)) - (error "Not in Org mode") - (message "Setting buffer indentation. It may take a few seconds...") - (org-indent-remove-properties (point-min) (point-max)) - (org-indent-add-properties (point-min) (point-max)) - (message "Indentation of buffer set."))) - -(defun org-indent-remove-properties-from-string (string) - "Remove indentation properties from STRING." - (remove-text-properties 0 (length string) - '(line-prefix nil wrap-prefix nil) string) - string) - -(defun org-indent-initialize-agent () - "Start or resume current buffer initialization. -Only buffers in `org-indent-agentized-buffers' trigger an action. -When no more buffer is being watched, the agent suppress itself." - (when org-indent-agent-resume-timer - (cancel-timer org-indent-agent-resume-timer)) - (setq org-indent-agentized-buffers - (cl-remove-if-not #'buffer-live-p org-indent-agentized-buffers)) - (cond - ;; Job done: kill agent. - ((not org-indent-agentized-buffers) (cancel-timer org-indent-agent-timer)) - ;; Current buffer is agentized: start/resume initialization - ;; somewhat aggressively. - ((memq (current-buffer) org-indent-agentized-buffers) - (org-indent-initialize-buffer (current-buffer) - org-indent-agent-active-delay)) - ;; Else, start/resume initialization of the last agentized buffer, - ;; softly. - (t (org-indent-initialize-buffer (car org-indent-agentized-buffers) - org-indent-agent-passive-delay)))) - -(defun org-indent-initialize-buffer (buffer delay) - "Set virtual indentation for the buffer BUFFER, asynchronously. -Give hand to other idle processes if it takes longer than DELAY, -a time value." - (with-current-buffer buffer - (when org-indent-mode - (org-with-wide-buffer - (let ((interruptp - ;; Always nil unless interrupted. - (catch 'interrupt - (and org-indent--initial-marker - (marker-position org-indent--initial-marker) - (equal (marker-buffer org-indent--initial-marker) - buffer) - (org-indent-add-properties org-indent--initial-marker - (point-max) - delay) - nil)))) - (move-marker org-indent--initial-marker interruptp) - ;; Job is complete: un-agentize buffer. - (unless interruptp - (setq org-indent-agentized-buffers - (delq buffer org-indent-agentized-buffers)))))))) - -(defun org-indent-set-line-properties (level indentation &optional heading) - "Set prefix properties on current line an move to next one. - -LEVEL is the current level of heading. INDENTATION is the -expected indentation when wrapping line. - -When optional argument HEADING is non-nil, assume line is at -a heading. Moreover, if it is `inlinetask', the first star will -have `org-warning' face." - (let* ((line (aref (pcase heading - (`nil org-indent--text-line-prefixes) - (`inlinetask org-indent--inlinetask-line-prefixes) - (_ org-indent--heading-line-prefixes)) - level)) - (wrap - (org-add-props - (concat line - (if heading (concat (make-string level ?*) " ") - (make-string indentation ?\s))) - nil 'face 'org-indent))) - ;; Add properties down to the next line to indent empty lines. - (add-text-properties (line-beginning-position) (line-beginning-position 2) - `(line-prefix ,line wrap-prefix ,wrap))) - (forward-line)) - -(defun org-indent-add-properties (beg end &optional delay) - "Add indentation properties between BEG and END. - -When DELAY is non-nil, it must be a time value. In that case, -the process is asynchronous and can be interrupted, either by -user request, or after DELAY. This is done by throwing the -`interrupt' tag along with the buffer position where the process -stopped." - (save-match-data - (org-with-wide-buffer - (goto-char beg) - (beginning-of-line) - ;; Initialize prefix at BEG, according to current entry's level. - (let* ((case-fold-search t) - (limited-re (org-get-limited-outline-regexp)) - (level (or (org-current-level) 0)) - (time-limit (and delay (org-time-add nil delay)))) - ;; For each line, set `line-prefix' and `wrap-prefix' - ;; properties depending on the type of line (headline, inline - ;; task, item or other). - (with-silent-modifications - (while (and (<= (point) end) (not (eobp))) - (cond - ;; When in asynchronous mode, check if interrupt is - ;; required. - ((and delay (input-pending-p)) (throw 'interrupt (point))) - ;; In asynchronous mode, take a break of - ;; `org-indent-agent-resume-delay' every DELAY to avoid - ;; blocking any other idle timer or process output. - ((and delay (org-time-less-p time-limit nil)) - (setq org-indent-agent-resume-timer - (run-with-idle-timer - (time-add (current-idle-time) org-indent-agent-resume-delay) - nil #'org-indent-initialize-agent)) - (throw 'interrupt (point))) - ;; Headline or inline task. - ((looking-at org-outline-regexp) - (let* ((nstars (- (match-end 0) (match-beginning 0) 1)) - (type (or (looking-at-p limited-re) 'inlinetask))) - (org-indent-set-line-properties nstars 0 type) - ;; At an headline, define new value for LEVEL. - (unless (eq type 'inlinetask) (setq level nstars)))) - ;; List item: `wrap-prefix' is set where body starts. - ((org-at-item-p) - (org-indent-set-line-properties - level (org-list-item-body-column (point)))) - ;; Regular line. - (t - (org-indent-set-line-properties - level - (current-indentation) - ;; When adapt indentation is 'headline-data, use - ;; `org-indent--heading-line-prefixes' for setting - ;; headline data indentation. - (and (eq org-adapt-indentation 'headline-data) - (or (org-at-planning-p) - (org-at-clock-log-p) - (looking-at-p org-property-start-re) - (looking-at-p org-property-end-re) - (looking-at-p org-property-re)))))))))))) - -(defun org-indent-notify-modified-headline (beg end) - "Set `org-indent-modified-headline-flag' depending on context. - -BEG and END are the positions of the beginning and end of the -range of deleted text. - -This function is meant to be called by `before-change-functions'. -Flag will be non-nil if command is going to modify or delete an -headline." - (when org-indent-mode - (setq org-indent-modified-headline-flag - (org-with-wide-buffer - (goto-char beg) - (save-match-data - (or (and (org-at-heading-p) (< beg (match-end 0))) - (re-search-forward - (org-with-limited-levels org-outline-regexp-bol) end t))))))) - -(defun org-indent-refresh-maybe (beg end _) - "Refresh indentation properties in an adequate portion of buffer. -BEG and END are the positions of the beginning and end of the -range of inserted text. DUMMY is an unused argument. - -This function is meant to be called by `after-change-functions'." - (when org-indent-mode - (save-match-data - ;; If a headline was modified or inserted, set properties until - ;; next headline. - (org-with-wide-buffer - (if (or org-indent-modified-headline-flag - (save-excursion - (goto-char beg) - (beginning-of-line) - (re-search-forward - (org-with-limited-levels org-outline-regexp-bol) end t))) - (let ((end (save-excursion - (goto-char end) - (org-with-limited-levels (outline-next-heading)) - (point)))) - (setq org-indent-modified-headline-flag nil) - (org-indent-add-properties beg end)) - ;; Otherwise, only set properties on modified area. - (org-indent-add-properties beg end)))))) - -(provide 'org-indent) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; org-indent.el ends here |