summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorU-IHM-NOTEBOOK\Olli <marc@ihm.name>2017-10-29 15:31:45 +0100
committerU-IHM-NOTEBOOK\Olli <marc@ihm.name>2017-10-29 15:31:45 +0100
commite440c51b5f025e35b610dda9b19848b0109b7e6b (patch)
treef0f58e78c42aecc50e65b5bf28b7f6415c7c2083
parentf474c7149be1eab4e20cd508bcbb1857841a0be6 (diff)
downloadorg-mode-e440c51b5f025e35b610dda9b19848b0109b7e6b.tar.gz
Version 5.7.1 of org-index
-rw-r--r--contrib/lisp/org-index.el105
1 files changed, 69 insertions, 36 deletions
diff --git a/contrib/lisp/org-index.el b/contrib/lisp/org-index.el
index 1d37060..538e3bc 100644
--- a/contrib/lisp/org-index.el
+++ b/contrib/lisp/org-index.el
@@ -3,7 +3,7 @@
;; Copyright (C) 2011-2017 Free Software Foundation, Inc.
;; Author: Marc Ihm <org-index@2484.de>
-;; Version: 5.6.2
+;; Version: 5.7.1
;; Keywords: outlines index
;; This file is not part of GNU Emacs.
@@ -96,7 +96,7 @@
(require 'widget)
;; Version of this package
-(defvar org-index-version "5.6.2" "Version of `org-index', format is major.minor.bugfix, where \"major\" are incompatible changes and \"minor\" are new features.")
+(defvar org-index-version "5.7.1" "Version of `org-index', format is major.minor.bugfix, where \"major\" are incompatible changes and \"minor\" are new features.")
;; customizable options
(defgroup org-index nil
@@ -207,7 +207,12 @@ those pieces."
(const keywords))))
(defcustom org-index-clock-into-focus nil
- "Clock into focused node."
+ "Clock into focused node ?"
+ :group 'org-index
+ :type 'boolean)
+
+(defcustom org-index-goto-bottom-after-focus nil
+ "After visiting a focused nodes; position cursor at bottom of node (as opposed to heading) ?"
:group 'org-index
:type 'boolean)
@@ -225,6 +230,7 @@ those pieces."
(defvar org-index--headings nil "Headlines of index-table as a string.")
(defvar org-index--headings-visible nil "Visible part of headlines of index-table as a string.")
(defvar org-index--ids-focused-nodes nil "Ids of focused node (if any).")
+(defvar org-index--ids-focused-nodes-saved nil "Backup for ‘org-index--ids-focused-nodes’.")
(defvar org-index--id-last-goto-focus nil "Id of last node, that has been focused to.")
;; Variables to hold context and state
@@ -314,7 +320,7 @@ for its index table.
To start building up your index, use subcommands 'add', 'ref' and
'yank' to create entries and use 'occur' to find them.
-This is version 5.6.2 of org-index.el.
+This is version 5.7.1 of org-index.el.
The function `org-index' is the only interactive function of this
@@ -578,10 +584,8 @@ interactive calls."
(string-match "\\([0-9]+\\.[0-9]+\\)\\." org-index-version)
(match-string 1 org-index-version))))
(insert "
- - Quick repeat with delete-option for goto-focus
- - Moved Changelog to its own file
- - New command 'news'
- - Bugfixes
+ - New option org-index-goto-bottom-after-focus for position after jumping to a focused node
+ - New focus-command 'r' to revert last change to list of focused nodes
")
(insert "\nSee https://github.com/marcIhm/org-index/ChangeLog.org for older news.\n")
(org-mode))
@@ -1027,29 +1031,37 @@ Optional argument KEYS-VALUES specifies content of new line."
(defun org-index--goto-focus ()
"Goto focus node, one after the other."
(if org-index--ids-focused-nodes
- (let (this-id target-id following-id last-id again explain marker (repeat-clause ""))
+ (let (target-id following-id last-id again explain marker
+ (repeat-clause "") (bottom-clause "") (heading-is-clause ""))
(setq again (and (eq this-command last-command)
(eq org-index--this-command org-index--last-command)))
(setq last-id (or org-index--id-last-goto-focus
(car (last org-index--ids-focused-nodes))))
- (setq this-id (org-id-get))
(setq following-id (car (or (cdr-safe (member last-id
(append org-index--ids-focused-nodes
org-index--ids-focused-nodes)))
org-index--ids-focused-nodes)))
- (if again
- (progn
- (setq target-id following-id)
- (setq explain "Jumped to next"))
- (setq target-id last-id)
- (setq explain "Jumped back to current"))
+ (setq target-id (if again following-id last-id))
+
(set-transient-map (let ((map (make-sparse-keymap)))
(define-key map (vector ?f)
(lambda () (interactive)
(setq this-command last-command)
(setq org-index--this-command org-index--last-command)
- (message (concat (org-index--goto-focus) "."))))
+ (message (concat (org-index--goto-focus) " (again)."))))
+ (define-key map (vector ?h)
+ (lambda () (interactive)
+ (org-back-to-heading)
+ (recenter 1)
+ (message "On heading.")))
+ (define-key map (vector ?b)
+ (lambda () (interactive)
+ (or (and (org-goto-first-child)
+ (forward-line -1))
+ (org-end-of-subtree))
+ (recenter -1)
+ (message "At bottom.")))
(define-key map (vector ?d)
(lambda () (interactive)
(setq this-command last-command)
@@ -1057,7 +1069,7 @@ Optional argument KEYS-VALUES specifies content of new line."
(org-index--persist-focused-nodes)
(message (concat "Current node has been removed from list of focused nodes, " (org-index--goto-focus) "."))))
map) t)
- (setq repeat-clause "; type 'f' to repeat or 'd' to delete this node from list")
+ (setq repeat-clause "; type 'f' to repeat or 'd' to delete this node from list, 'h' goes to heading, 'b' to bottom of node")
(if (member target-id (org-index--ids-up-to-top))
(setq explain "Staying below current")
@@ -1067,8 +1079,19 @@ Optional argument KEYS-VALUES specifies content of new line."
(pop-to-buffer-same-window (marker-buffer marker))
(goto-char (marker-position marker))
- (org-index--unfold-buffer)
- (move-marker marker nil))
+ (move-marker marker nil)
+ (when org-index-goto-bottom-after-focus
+ (setq bottom-clause "bottom of ")
+ (setq heading-is-clause (format ", heading is '%s'" (propertize (org-get-heading t t t t) 'face 'org-todo)))
+ (or (and (org-goto-first-child)
+ (forward-line -1))
+ (org-end-of-subtree)))
+ (org-index--unfold-buffer)
+ (if org-index-goto-bottom-after-focus (recenter -1)))
+
+ (if again
+ (setq explain (format "Jumped to %snext" bottom-clause))
+ (setq explain (format "Jumped back to %scurrent" bottom-clause)))
(when org-index-clock-into-focus
(if org-index--after-focus-timer (cancel-timer org-index--after-focus-timer))
@@ -1087,10 +1110,11 @@ Optional argument KEYS-VALUES specifies content of new line."
(setq org-index--id-last-goto-focus target-id)
(concat
(if (cdr org-index--ids-focused-nodes)
- (format "%s focus node (out of %d)"
+ (format "%s focus node (out of %d)%s"
explain
- (length org-index--ids-focused-nodes))
- "Jumped to single focus-node")
+ (length org-index--ids-focused-nodes)
+ heading-is-clause)
+ (format "Jumped to %ssingle focus-node%s" bottom-clause heading-is-clause))
repeat-clause))
"No nodes in focus, use set-focus"))
@@ -1099,25 +1123,28 @@ Optional argument KEYS-VALUES specifies content of new line."
"More commands for handling focused nodes."
(let (id text more-text char prompt ids-up-to-top)
- (setq prompt (format "Please specify action on the list of %s focused nodes: set, append, delete (s,a,d or ? for short help) - "
+ (setq prompt (format "Please specify action on the list of %s focused nodes: set, append, delete, restore (s,a,d,r or ? for short help) - "
(length org-index--ids-focused-nodes)))
- (while (not (memq char (list ?s ?a ?d)))
+ (while (not (memq char (list ?s ?a ?d ?r)))
(setq char (read-char prompt))
- (setq prompt "Actions on list of focused nodes: s)et single focus on this node, a)ppend this node to list, d)elete this node from list. Please choose - "))
+ (setq prompt "Actions on list of focused nodes: s)et single focus on this node, a)ppend this node to list, d)elete this node from list, r)estore previous list of focused nodes. Please choose - "))
(setq text
(cond
((eq char ?s)
(setq id (org-id-get-create))
+ (setq org-index--ids-focused-nodes-saved org-index--ids-focused-nodes)
(setq org-index--ids-focused-nodes (list id))
(setq org-index--id-last-goto-focus id)
+ (org-index--update-line id t)
(if org-index-clock-into-focus (org-clock-in))
- "Focus has been set on current node%s (1 node in focus)")
+ "Focus has been set on current node (1 node in focus)")
((eq char ?a)
(setq id (org-id-get-create))
(unless (member id org-index--ids-focused-nodes)
;; remove any children, that are already in list of focused nodes
+ (setq org-index--ids-focused-nodes-saved org-index--ids-focused-nodes)
(setq org-index--ids-focused-nodes
(delete nil (mapcar (lambda (x)
(if (member id (org-with-point-at (org-id-find x t)
@@ -1127,6 +1154,7 @@ Optional argument KEYS-VALUES specifies content of new line."
nil)
x))
org-index--ids-focused-nodes)))
+ (setq org-index--ids-focused-nodes-saved org-index--ids-focused-nodes)
;; remove parent, if already in list of focused nodes
(setq ids-up-to-top (org-index--ids-up-to-top))
(when (seq-intersection ids-up-to-top org-index--ids-focused-nodes)
@@ -1134,12 +1162,20 @@ Optional argument KEYS-VALUES specifies content of new line."
(setq more-text (concat more-text ", replacing its parent")))
(setq org-index--ids-focused-nodes (cons id org-index--ids-focused-nodes)))
(setq org-index--id-last-goto-focus id)
- (setq org-index--id-last-goto-focus id)
+ (org-index--update-line id t)
(if org-index-clock-into-focus (org-clock-in))
"Current node has been appended to list of focused nodes%s (%d node%s in focus)")
((eq char ?d)
- (org-index--delete-from-focus))))
+ (org-index--delete-from-focus))
+
+ ((eq char ?r)
+ (if org-index--ids-focused-nodes-saved
+ (let (txt)
+ (setq txt (format "Discarded current list of focused %d focused node%s and restored previous list; now %%s%%d node%%s in focus" (length org-index--ids-focused-nodes-saved) (if (cdr org-index--ids-focused-nodes-saved) "s" "")))
+ (setq org-index--ids-focused-nodes org-index--ids-focused-nodes-saved)
+ txt)
+ "No saved list of focused nodes to restore, nothing to do"))))
(org-index--persist-focused-nodes)
@@ -1162,6 +1198,7 @@ Optional argument KEYS-VALUES specifies content of new line."
(or (car-safe (cdr-safe (member id (reverse (append org-index--ids-focused-nodes
org-index--ids-focused-nodes)))))
org-index--id-last-goto-focus))
+ (setq org-index--ids-focused-nodes-saved org-index--ids-focused-nodes)
(setq org-index--ids-focused-nodes (delete id org-index--ids-focused-nodes))
(setq org-index--id-last-goto-focus nil)
"Current node has been removed from list of focused nodes%s (%d node%s in focus)")
@@ -1629,7 +1666,7 @@ Optional argument CHECK-SORT-MIXED triggers resorting if mixed and stale."
"One-time migration: No property; need to go through whole table once to find max."
(org-index--go-below-hline)
(let ((max-ref-num 0)
- ref-field ref-num ref)
+ ref-field ref-num)
(message "One-time migration to set index-property maxref...")
(while (org-at-table-p)
(setq ref-field (org-index--get-or-set-field 'ref))
@@ -2053,13 +2090,9 @@ specify flag TEMPORARY for th new table temporary, maybe COMPARE it with existin
(defun org-index--unfold-buffer ()
"Helper function to unfold buffer."
- (org-show-context)
+ (org-show-context 'ancestors)
(org-show-subtree)
- (recenter 1)
- (save-excursion
- (org-back-to-heading)
- (forward-line) ;; on property drawer
- (org-cycle)))
+ (recenter 1))
(defun org-index--update-line (&optional id-or-pos no-error)