Bugfixes in occur mode

This commit is contained in:
Marc-Oliver Ihm 2014-12-14 17:21:14 +01:00
parent aa0bfcdcdb
commit a91443e0cc
1 changed files with 77 additions and 62 deletions

View File

@ -3,7 +3,7 @@
;; Copyright (C) 2011-2014 Free Software Foundation, Inc.
;; Author: Marc Ihm <org-index@2484.de>
;; Version: 3.0.1
;; Version: 3.0.2
;; Keywords: outlines index
;; This file is not part of GNU Emacs.
@ -66,6 +66,10 @@
;;; Change Log:
;; [2014-12-14 Su] Version 3.0.2:
;; - Bugfixes in occur mode
;; - New function `org-index-copy-references-from-heading-to-property'
;;
;; [2014-12-10 We] Version 3.0.1:
;; - Bugfixes related with assistant
;; - Fix for editing of category
@ -185,7 +189,6 @@
(defvar org-index--below-cursor nil "Word below cursor.")
(defvar org-index--within-node nil "True, if we are within node of the index table.")
(defvar org-index--active-window-index nil "Active window with index table (if any).")
(defvar org-index--occur-follow-mode nil "True, if follow mode in occur-buffer is on.")
(defvar org-index--message-text nil "Text that was issued as an explanation; helpful for regression tests.")
@ -495,9 +498,9 @@ Optional argument COMMAND is a symbol naming the command to execute."
(let (link)
(if (and org-index--within-node
(org-at-table-p))
(setq link (org-index--get-field 'link))))
(setq link (org-index--get-field 'link)))
(setq message-text (org-index--do-head search-ref search-link)))
(setq message-text (org-index--do-head search-ref (or link search-link)))))
((eq command 'leave)
@ -786,9 +789,9 @@ from the result.
Example:
(plist-get (org-index-get-line 'ref \"12\") 'count)
(plist-get (org-index-get-line 'ref \"R12\") 'count)
retrieves the value of the count-column for reference 12.
retrieves the value of the count-column for reference number 12.
Argument TYPE is a symbol, either ref or link,
argument VALUE specifies the value to search for."
@ -1736,55 +1739,77 @@ specify flag TEMPORARY for th new table temporary, maybe COMPARE it with existin
"Perform command head: Find node with REF or LINK and present it; if OTHER in separate window."
(if ref (setq org-index--last-ref ref))
(let (message marker)
(let (message)
;; Use link if available
;; Prefer link if available
(if link
(setq marker (org-id-find link t))
(setq marker
(catch 'found
(message (format "Scanning headlines for '%s' ..." ref))
(org-map-entries
(lambda ()
(when (string= ref (org-entry-get (point) "org-index-ref"))
(throw 'found (point-marker))))
nil 'agenda)
nil)))
(if marker
(progn
(org-index--update-line link)
(org-id-goto link)
(org-reveal)
(setq message "Followed link"))
(message (format "Scanning headlines for '%s' ..." ref))
(org-index--update-line ref)
(let ((search (concat ".*" (org-index--make-guarded-search ref)))
(org-trust-scanner-tags t)
buffer point)
(if (catch 'found
(org-index--update-line (or link ref))
(if link
(setq message "Followed link")
(setq message (format "Found '%s'" ref)))
(if other
(progn
;; loop over all headlines, stop on first match
(org-map-entries
(lambda ()
(when (or (looking-at search)
(eq ref (org-entry-get (point) "org-index-ref")))
;; If this is not an inlinetask ...
(when (< (org-element-property :level (org-element-at-point))
org-inlinetask-min-level)
;; ... remember location and bail out
(setq buffer (current-buffer))
(setq point (point))
(throw 'found t))))
nil 'agenda)
nil))
(progn
(setq message (format "Found '%s'" (or ref link)))
(if other
(progn
(pop-to-buffer buffer)
(goto-char point)
(org-reveal t)
(recenter)
(pop-to-buffer "*org-index-occur*"))
(org-pop-to-buffer-same-window buffer)
(goto-char point)
(pop-to-buffer (marker-buffer marker))
(goto-char marker)
(org-reveal t)
(recenter)))
(setq message (format "Did not find '%s'" (or ref link))))))
(org-show-entry)
(recenter)
(pop-to-buffer "*org-index-occur*"))
(org-pop-to-buffer-same-window (marker-buffer marker))
(goto-char marker)
(org-reveal t)
(recenter)))
(if link
(setq message (format "Did not find link '%s'" link))
(setq message (format "Did not find '%s'. Note: References in headings are no longer found in recent versions of this package; simply call `org-index-copy-references-from-heading-to-property' once to fix this." ref))))
message))
(defun org-index-copy-references-from-heading-to-property ()
"Loop over all headings and copy; needs to be done only once"
(interactive)
(org-index--verify-id)
(org-index--parse-table)
(if (y-or-n-p "This function will scan all headings and copy any reference to the property. Do you want to proceed? ")
(let (results)
(message "Scanning headlines ...")
(setq results (org-map-entries
(lambda ()
(let (ref-from-head ref-from-property)
(when (looking-at (concat ".*\\("
(org-index--make-guarded-search org-index--ref-regex 'dont-quote)
"\\)"))
(setq ref-from-head (match-string 1))
(setq ref-from-property (org-entry-get (point) "org-index-ref"))
(when (and (not (string= ref-from-head ref-from-property)) ; ref from head is not in property
(< (org-element-property :level (org-element-at-point)) ; node is not an inline task
org-inlinetask-min-level)
(org-index--get-or-delete-line 'get 'ref ref-from-head)) ; ref appears in index table
(org-entry-put (point) "org-index-ref" ref-from-head)
1))))
nil 'agenda))
(message "Scanned %d entries, %d of them needed to be and were fixed." (length results) (count 1 results)))
(message "Please note, that some headings may not be found. Call this function once to fix this.")))
(defun org-index--do-occur ()
"Perform command occur."
(let ((occur-buffer-name "*org-index-occur*")
@ -1806,8 +1831,6 @@ specify flag TEMPORARY for th new table temporary, maybe COMPARE it with existin
in-c-backspace ; true while processing C-backspace
show-headings ; true, if headings should be shown
fun-on-ret ; function to be executed, if return is pressed
fun-on-s-ret ; shift
fun-on-m-ret ; shift
fun-on-tab ; function to be executed, if tab is pressed
ret from to key)
@ -1821,19 +1844,12 @@ specify flag TEMPORARY for th new table temporary, maybe COMPARE it with existin
(let ((keymap (make-sparse-keymap)))
(set-keymap-parent keymap org-mode-map)
(setq fun-on-ret (lambda () (interactive) (org-index--occur-find-heading nil)))
(setq fun-on-ret (lambda () (interactive) (org-index--occur-find-heading)))
(define-key keymap [return] fun-on-ret)
(setq fun-on-tab (lambda () (interactive)
(org-index--occur-find-heading t)
(setq org-index--occur-follow-mode (not org-index--occur-follow-mode))))
(org-index--occur-find-heading t)))
(define-key keymap [tab] fun-on-tab)
(define-key keymap [(control ?i)] fun-on-tab)
(define-key keymap [up] (lambda () (interactive)
(forward-line -1)
(if org-index--occur-follow-mode (org-index--occur-find-heading t))))
(define-key keymap [down] (lambda () (interactive)
(forward-line 1)
(if org-index--occur-follow-mode (org-index--occur-find-heading t))))
(use-local-map keymap)))
(with-current-buffer org-index--buffer
@ -2073,13 +2089,12 @@ specify flag TEMPORARY for th new table temporary, maybe COMPARE it with existin
(forward-line 1)))))
(defun org-index--occur-find-heading (x)
"Helper for keymap of occur: find heading, if X in other window."
(interactive)
(defun org-index--occur-find-heading (&optional other)
"Helper for keymap of occur: find heading, if other in other window and expand."
(save-excursion
(let ((ref (org-index--get-field 'ref))
(link (org-index--get-field 'link)))
(message (org-index--do-head ref link x)))))
(message (org-index--do-head ref link other)))))
(defun org-index--create-new-line (create-ref)