Browse Source

Version 5.7.1 of org-index

U-IHM-NOTEBOOK\Olli 7 years ago
parent
commit
e440c51b5f
1 changed files with 69 additions and 36 deletions
  1. 69 36
      contrib/lisp/org-index.el

+ 69 - 36
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)