summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorU-IHM-NOTEBOOK\Olli <marc@ihm.name>2017-02-20 19:38:29 (GMT)
committer U-IHM-NOTEBOOK\Olli <marc@ihm.name>2017-02-20 19:38:29 (GMT)
commitf5722944575dc83b1e12c730b2887c584fd523d7 (patch)
tree6836d3b500126a922fcf6ee4ce286b86ecf5e8fe
parentd1577d1e1bc78c5b0d6c9911fd7a8c89526d0d16 (diff)
downloadorg-mode-master.zip
org-mode-master.tar.gz
new version 5.2.3 with more performance and customizationsHEADmaster
-rw-r--r--contrib/lisp/org-index.el249
1 files changed, 137 insertions, 112 deletions
diff --git a/contrib/lisp/org-index.el b/contrib/lisp/org-index.el
index a8d7bec..878e83f 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.2.1
+;; Version: 5.2.3
;; Keywords: outlines index
;; This file is not part of GNU Emacs.
@@ -49,22 +49,20 @@
;;
;; Setup:
;;
-;; - Place this file in a directory from your load-path,
+;; - Place this file in a directory of your load-path,
;; e.g. org-mode/contrib/lisp.
;;
;; - Add these lines to your .emacs:
;;
;; (require 'org-index)
-;; (global-set-key (kbd "C-c i") 'org-index-dispatch) ; this is optional but recommended
-;; (org-index-prepare-when-idle) ; this is optional, not needed initially; see its description
;;
-;; - Restart your Emacs to make these lines effective.
+;; - Restart your Emacs to make this effective.
;;
;; - Invoke `org-index'; on first run it will assist in creating your
;; index table.
;;
-;; - Optionally invoke `M-x org-customize' to tune some settings (choose
-;; group org-index).
+;; - Optionally invoke `M-x org-customize', group 'Org Index', to tune
+;; some settings, e.g. the global prefix key 'C-c i'.
;;
;;
;; Further information:
@@ -87,11 +85,13 @@
;;; Change Log:
-;; [2017-01-29 Su] Version 5.2.1
+;; [2017-02-18 Sa] Version 5.2.3
;; - New command 'focus'
-;; - Improved on speed by using the stored property "max-ref"
+;; - Speeded up org-index--parse-table with the stored property "max-ref"
+;; - Speeded up org-index--on with search
;; - Added org-index-prepare-when-idle
;; - Fixed compatibility issue with emacs 24 (font-lock-ensure)
+;; - Added more customizations
;; - Bugfixes
;;
;; [2016-10-19 We] Version 5.1.4
@@ -179,7 +179,7 @@
(require 'widget)
;; Version of this package
-(defvar org-index-version "5.2.0" "Version of `org-index', format is major.minor.bugfix, where \"major\" are incompatible changes and \"minor\" are new features.")
+(defvar org-index-version "5.2.3" "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
@@ -214,6 +214,33 @@ mixed First, show all index entries, which have been
(const count)
(const mixed)))
+(defcustom org-index-dispatch-key "i"
+ "Key to invoke ‘org-index-dispatch’, which is the central entry function for ‘org-index’."
+ :group 'org-index
+ :initialize 'custom-initialize-set
+ :set (lambda (var val)
+ (set-default var val)
+ (global-set-key org-index-dispatch-key 'org-index-dispatch))
+ :type 'key-sequence)
+
+(defcustom org-index-idle-delay 68
+ "Delay in seconds after which buffer will sorted or fontified when emacs is idle."
+ :group 'org-index
+ :type 'integer)
+
+(defcustom org-index-prepare-when-idle nil
+ "Optionally fontify and sort index-table when idle, so that first interactive call is faster.
+You only need this if your index has grown so large, that first invocation of org-index needs
+a noticable amount of time."
+ :group 'org-index
+ :initialize 'custom-initialize-set
+ :set (lambda (var val)
+ (set-default var val)
+ (when val
+ (setq org-index--align-interactive 200)
+ (run-with-idle-timer org-index-idle-delay nil 'org-index--idle-prepare)))
+ :type 'boolean)
+
(defcustom org-index-yank-after-add 'ref
"Specifies which column should be yanked after adding a new index row.
Valid values are some columns of index table."
@@ -223,14 +250,6 @@ Valid values are some columns of index table."
(const category)
(const keywords)))
-(defcustom org-index-point-on-add 'keywords
- "Specifies in which column point will land when adding a new index row.
-Valid values are some columns of index table."
- :group 'org-index
- :type '(choice
- (const category)
- (const keywords)))
-
(defcustom org-index-copy-heading-to-keywords t
"When adding a new node to index: Copy heading to keywords-column ?"
:group 'org-index
@@ -284,7 +303,7 @@ those pieces."
(defvar org-index--saved-positions nil "Saved positions within current buffer and index buffer; filled by ‘org-index--save-positions’.")
(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--id-focused-node nil "Id of focused node (if any)")
+(defvar org-index--id-focused-node nil "Id of focused node (if any).")
;; Variables to hold context and state
(defvar org-index--last-fingerprint nil "Fingerprint of last line created.")
@@ -301,7 +320,8 @@ those pieces."
(defvar org-index--occur-lines-collected 0 "Number of lines collected in occur buffer; helpful for tests.")
(defvar org-index--last-sort-assumed nil "Last column, the index has been sorted after (best guess).")
(defvar org-index--sort-timer nil "Timer to sort index in correct order.")
-(defvar org-index--aligned nil "Remember for this Emacs session, if table has been aligned at least once.")
+(defvar org-index--aligned 0 "For this Emacs session: remember number of table lines aligned.")
+(defvar org-index--align-interactive most-positive-fixnum "Number of rows to align in ‘org-index--parse-table’.")
(defvar org-index--edit-widgets nil "List of widgets used to edit.")
(defvar org-index--context-index nil "Position and line used for index in edit buffer.")
(defvar org-index--context-occur nil "Position and line used for occur in edit buffer.")
@@ -316,7 +336,6 @@ those pieces."
(defconst org-index--valid-headings '(ref id created last-accessed count keywords category level yank tags) "All valid headings.")
(defconst org-index--occur-buffer-name "*org-index-occur*" "Name of occur buffer.")
(defconst org-index--edit-buffer-name "*org-index-edit*" "Name of edit buffer.")
-(defconst org-index--idle-delay 68 "Delay in seconds after which buffer will sorted or fontified.")
(defvar org-index--short-help-text nil "Cache for result of `org-index--get-short-help-text.")
(defvar org-index--shortcut-chars nil "Cache for result of `org-index--get-shortcut-chars.")
@@ -365,7 +384,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.2.0 of org-index.el.
+This is version 5.2.3 of org-index.el.
The function `org-index' is the only interactive function of this
@@ -476,7 +495,7 @@ interactive calls."
(org-index--verify-id)
;; Get configuration of index table
- (org-index--parse-table)
+ (org-index--parse-table org-index--align-interactive t)
;; store context information
(org-index--retrieve-context)
@@ -491,7 +510,7 @@ interactive calls."
;; rearrange for index beeing sorted into default sort order after 300 secs of idle time
(unless org-index--sort-timer
(setq org-index--sort-timer
- (run-with-idle-timer org-index--idle-delay t 'org-index--sort-silent)))
+ (run-with-idle-timer org-index-idle-delay t 'org-index--sort-silent)))
;;
@@ -815,7 +834,7 @@ interactive calls."
""))
(symbol-name sort)
org-index-sort-by
- org-index--idle-delay
+ org-index-idle-delay
(second groups-and-counts)
(symbol-name sort)
(third groups-and-counts))))
@@ -859,8 +878,7 @@ interactive calls."
((eq command 'set-focus)
(let ((focus-id (org-id-get-create)))
- (save-excursion
- (set-buffer org-index--buffer)
+ (with-current-buffer org-index--buffer
(org-entry-put org-index--point "id-focused-node" focus-id)
(setq org-index--id-focused-node focus-id)
(setq message-text "Focus has been set on current node"))))
@@ -933,7 +951,7 @@ Optional argument KEYS-VALUES specifies content of new line."
(let ((ref (plist-get keys-values 'ref)))
(org-index--verify-id)
- (org-index--parse-table t)
+ (org-index--parse-table)
(if (not (memq ref '(t nil)))
(error "Column 'ref' accepts only 't' or 'nil'"))
(when ref
@@ -1000,12 +1018,12 @@ Optional argument WITH-SHORT-HELP displays help screen upfront."
(setq height-after (window-height win))
(goto-char (point-min))
(end-of-line)
- (insert
+ (insert
(if (> height-before height-after)
"."
(concat ", "
(substitute-command-keys "\\[scroll-other-window]")
- " to scroll:")))
+ " to scroll:")))
(goto-char (point-min)))))
@@ -1124,7 +1142,7 @@ Optional argument WITH-SHORT-HELP displays help screen upfront."
(defun org-index--edit-c-c-c-c ()
- "Function to invoked on C-c C-c in Edit buffer."
+ "Function to invoke on C-c C-c in Edit buffer."
(interactive)
(let ((obuf (get-buffer org-index--occur-buffer-name))
@@ -1267,7 +1285,7 @@ argument VALUE specifies the value to search for."
(error "Need a value to search for"))
(org-index--verify-id)
- (org-index--parse-table t)
+ (org-index--parse-table)
(org-index--get-line column value))
@@ -1371,8 +1389,10 @@ Argument COLUMN and VALUE specify line to get."
(setq org-index--within-occur (string= (buffer-name) org-index--occur-buffer-name)))
-(defun org-index--parse-table (&optional no-reformat)
- "Parse content of index table."
+(defun org-index--parse-table (&optional num-lines-to-format check-sort-mixed)
+ "Parse content of index table.
+Optional argument NUM-LINES-TO-FORMAT limits formatting effort and duration.
+Optional argument CHECK-SORT-MIXED triggers resorting if mixed and stale."
(let (ref-field
ref-num
@@ -1380,33 +1400,56 @@ Argument COLUMN and VALUE specify line to get."
end-of-headings
start-of-headings)
+ (unless num-lines-to-format (setq num-lines-to-format 0))
+
(with-current-buffer org-index--buffer
(setq initial-point (point))
(org-index--go-below-hline)
- (unless no-reformat (org-reveal))
+ (org-reveal)
+
+ ;; if table is sorted mixed and it was sorted correctly yesterday, it could still be wrong today; so check
+ (when (and check-sort-mixed (eq org-index-sort-by 'mixed))
+ (goto-char org-index--below-hline)
+ (let (count-first-line count-second-line)
+ (setq count-first-line (string-to-number (concat (org-index--get-or-set-field 'count) " 0")))
+ (forward-line)
+ (setq count-second-line (string-to-number (concat (org-index--get-or-set-field 'count) " 0")))
+ (forward-line -1)
+ (if (and (string< (org-index--get-or-set-field 'last-accessed)
+ (org-index--get-mixed-time))
+ (< count-first-line count-second-line))
+ (org-index--do-sort-index org-index-sort-by)))
+ (org-index--go-below-hline))
;; align and fontify table once for this emacs session
- (unless (or org-index--aligned no-reformat)
- (message "Aligning and fontifying index table (once per emacs session)...")
- (org-table-align) ; needs to happen before fontification to be effective ?
- (let ((is-modified (buffer-modified-p))
- (below (point)))
- (while (org-at-table-p)
- (forward-line))
- (font-lock-fontify-region below (point))
- (org-index--go-below-hline)
- (setq org-index--aligned t)
- (set-buffer-modified-p is-modified)))
+ (when (> num-lines-to-format org-index--aligned)
+ (org-index--go-below-hline)
+ (message "Aligning and fontifying %s lines of index table (once per emacs session)..."
+ (if (= num-lines-to-format most-positive-fixnum) "all" (format "%d" num-lines-to-format)))
+ (save-restriction
+ (let (from to)
+ (forward-line -3)
+ (setq from (point))
+ (setq to (org-table-end))
+ (when (< num-lines-to-format most-positive-fixnum)
+ (forward-line (+ 3 num-lines-to-format))
+ (narrow-to-region from (point))
+ (setq to (min (point) to)))
+ (goto-char org-index--below-hline)
+ (org-table-align)
+ (setq to (min (point-max) to))
+ (font-lock-fontify-region from to)))
+ (setq org-index--aligned num-lines-to-format)
+ (org-index--go-below-hline)
+ (message "Done."))
- (org-index--go-below-hline)
(beginning-of-line)
;; get headings to display during occur
(setq end-of-headings (point))
- (while (org-at-table-p) (forward-line -1))
- (forward-line)
+ (goto-char (org-table-begin))
(setq start-of-headings (point))
(setq org-index--headings-visible (substring-no-properties (org-index--copy-visible start-of-headings end-of-headings)))
(setq org-index--headings (buffer-substring start-of-headings end-of-headings))
@@ -1416,9 +1459,7 @@ Argument COLUMN and VALUE specify line to get."
(setq org-index--numcols (- (org-table-current-column) 1))
;; go to top of table
- (while (org-at-table-p)
- (forward-line -1))
- (forward-line)
+ (goto-char (org-table-begin))
;; parse line of headings
(org-index--parse-headings)
@@ -1434,20 +1475,6 @@ Argument COLUMN and VALUE specify line to get."
;; Get id of focused node (if any)
(setq org-index--id-focused-node (org-entry-get nil "id-focused-node"))
- ;; check, if the table still seems to be sorted mixed
- (unless no-reformat
- (goto-char org-index--below-hline)
- (when (eq org-index-sort-by 'mixed)
- (let (count-first-line count-second-line)
- (setq count-first-line (string-to-number (concat (org-index--get-or-set-field 'count) " 0")))
- (forward-line)
- (setq count-second-line (string-to-number (concat (org-index--get-or-set-field 'count) " 0")))
- (forward-line -1)
- (if (and (string< (org-index--get-or-set-field 'last-accessed)
- (org-index--get-mixed-time))
- (< count-first-line count-second-line))
- (org-index--do-sort-index org-index-sort-by)))))
-
;; save position below hline
(org-index--go-below-hline)
;; go back to initial position
@@ -1455,10 +1482,11 @@ Argument COLUMN and VALUE specify line to get."
(defun org-index--get-decoration-from-ref-field (ref-field)
+ "Extract decoration from a REF-FIELD."
(unless (string-match "^\\([^0-9]*\\)\\([0-9]+\\)\\([^0-9]*\\)$" ref-field)
(org-index--report-index-error
"Reference in index table ('%s') does not contain a number" ref-field))
-
+
;; These are the decorations used within the first ref of index
(setq org-index--head (match-string 1 ref-field))
(setq org-index--tail (match-string 3 ref-field))
@@ -1469,6 +1497,7 @@ Argument COLUMN and VALUE specify line to get."
(defun org-index--extract-refnum (ref-field)
+ "Extract the number from a complete reference REF-FIELD like 'R102'."
(unless (string-match org-index--ref-regex ref-field)
(org-index--report-index-error
"Reference '%s' is not formatted properly (does not match '%s')" ref-field org-index--ref-regex))
@@ -1476,9 +1505,9 @@ Argument COLUMN and VALUE specify line to get."
(defun org-index--migrate-maxref-to-property ()
- "One-time migration: No property; need to go through whole table once to find max"
+ "One-time migration: No property; need to go through whole table once to find max."
(org-index--go-below-hline)
- (let (ref-field ref)
+ (let (ref-field ref-num ref)
(message "One-time migration to set index-property maxref...")
(unless org-index--maxrefnum (setq org-index--maxrefnum 0))
(while (org-at-table-p)
@@ -1489,20 +1518,20 @@ Argument COLUMN and VALUE specify line to get."
(if (> ref-num org-index--maxrefnum) (setq org-index--maxrefnum ref-num)))
(forward-line))
(unless org-index--maxrefnum
- (org-index--report-index-error "No reference found in property max-ref and none in index."))
+ (org-index--report-index-error "No reference found in property max-ref and none in index"))
(setq ref (org-index--get-save-maxref t))
(org-index--go-below-hline)
(message "Done.")
- ref))
+ ref))
(defun org-index--get-save-maxref (&optional no-inc)
- "Get next reference, increment number and store it in index"
+ "Get next reference, increment number and store it in index.
+Optional argument NO-INC skips automatic increment on maxref."
(let (ref)
(unless no-inc (setq org-index--maxrefnum (1+ org-index--maxrefnum)))
(setq ref (format org-index--ref-format org-index--maxrefnum))
- (save-excursion
- (set-buffer org-index--buffer)
+ (with-current-buffer org-index--buffer
(org-entry-put org-index--point "max-ref" ref))
ref))
@@ -1580,7 +1609,7 @@ Argument COLUMN and VALUE specify line to get."
(org-index--go-below-hline)
(forward-line 0)
(setq top (point))
- (while (org-at-table-p) (forward-line))
+ (goto-char (org-table-end))
;; kill all empty rows at bottom
(while (progn
@@ -1610,8 +1639,7 @@ Argument COLUMN and VALUE specify line to get."
;; restore modification state
(set-buffer-modified-p is-modified)))
- (setq org-index--last-sort-assumed sort)
- (setq org-index--last-sort-actual sort))))
+ (setq org-index--last-sort-assumed sort))))
(defun org-index--do-sort-lines (what)
@@ -2521,7 +2549,7 @@ Optional argument DEFAULTS gives default values."
(org-set-tags-to new-tags)))
-(defun org-index--go (&optional column value)
+(defun org-index--go (column value)
"Position cursor on index line where COLUMN equals VALUE.
Return t or nil, leave point on line or at top of table, needs to be in buffer initially."
(let (found)
@@ -2529,17 +2557,23 @@ Return t or nil, leave point on line or at top of table, needs to be in buffer i
(unless (eq (current-buffer) org-index--buffer)
(error "This is a bug: Not in index buffer"))
- ;; loop over lines
- (goto-char org-index--below-hline)
- (if column
- (progn
- (forward-line -1)
- (while (and (not found)
- (forward-line)
- (org-at-table-p))
- (setq found (string= value (org-index--get-or-set-field column)))))
- (setq found t))
+ (unless value
+ (error "Cannot search for nil"))
+
+ (if (string= value "")
+ (error "Cannot search for empty string"))
+
+ (if (<= (length value) 2)
+ (warn "Searching for short string '%s' will be slow" value))
+ (goto-char org-index--below-hline)
+ (forward-line 0)
+ (save-restriction
+ (narrow-to-region (point) (org-table-end))
+ (while (and (not found)
+ (search-forward value nil t))
+ (setq found (string= value (org-index--get-or-set-field column)))))
+
;; return value
(if found
t
@@ -2584,7 +2618,6 @@ If OTHER in separate window."
words ; list words that should match
occur-buffer
begin ; position of first line
- narrow ; start of narrowed buffer
help-text ; cons with help text short and long
search-text ; description of text to search for
done ; true, if loop is done
@@ -2619,11 +2652,7 @@ If OTHER in separate window."
(forward-line 0)
(setq begin (point))
(forward-line -1)
- (setq narrow (point))
- (while (org-at-table-p)
- (forward-line))
- (narrow-to-region narrow (point))
- (goto-char (point-min))
+ (narrow-to-region (point) (org-table-end))
(forward-line)
;; initialize help text
@@ -2650,7 +2679,6 @@ If OTHER in separate window."
(if in-c-backspace
(setq key "<backspace>")
(setq search-text (mapconcat 'identity (reverse (cons word words)) ","))
- (message "foo")
;; read key, if selected frame has not changed
(if (eq initial-frame (selected-frame))
@@ -2752,7 +2780,7 @@ If OTHER in separate window."
(line-move -1 t)
(line-move 1 t))
- ;; anything else terminates loop
+ ;; anything else terminates input loop
(t (setq done t))))
;; put back input event, that caused the loop to end
@@ -2944,7 +2972,11 @@ If OTHER in separate window."
(setq yank (replace-regexp-in-string (regexp-quote "\\vert") "|" yank nil 'literal))
(kill-new yank)
(org-mark-ring-goto)
- (format "Copied '%s' (no node is associated)" yank))
+ (if (s-starts-with-p "http" yank)
+ (progn
+ (browse-url yank)
+ (format "Opened '%s' in browser (and copied it too)" yank))
+ (format "Copied '%s' (no node is associated)" yank)))
(error "Internal error, this line contains neither id, nor reference, nor text to yank")))))
(message "Not at table")))
@@ -3031,8 +3063,7 @@ If OTHER in separate window."
(goto-char org-index--below-hline)
(if (eq org-index-sort-by 'count)
(progn
- (while (org-at-table-p)
- (forward-line))
+ (goto-char (org-table-end))
(forward-line -1)
(org-table-insert-row t))
(org-table-insert-row))
@@ -3048,24 +3079,18 @@ If OTHER in separate window."
"Sort index for default column to remove any effects of temporary sorting."
(save-excursion
(org-index--verify-id)
- (org-index--parse-table t)
- (org-index--on nil nil
- (org-index--do-sort-index org-index-sort-by)
- (org-table-align)
- (remove-hook 'before-save-hook 'org-index--sort-silent))))
+ (org-index--parse-table)
+ (with-current-buffer org-index--buffer
+ (save-excursion
+ (goto-char org-index--below-hline)
+ (org-index--do-sort-index org-index-sort-by)
+ (remove-hook 'before-save-hook 'org-index--sort-silent)))))
(defun org-index--idle-prepare ()
"For parsing table when idle."
(org-index--verify-id)
- (org-index--parse-table))
-
-
-(defun org-index-prepare-when-idle ()
- "Optionally fontify and sort index-table when idle, so that first interactive call is faster.
-You only need this if your index has grown so large, that first invocation of org-index needs
-a noticable amount of time."
- (run-with-idle-timer org-index--idle-delay nil 'org-index--idle-prepare))
+ (org-index--parse-table most-positive-fixnum t))
(defun org-index--copy-visible (beg end)