mirror of
https://git.savannah.gnu.org/git/emacs/org-mode.git
synced 2024-08-26 15:32:51 +00:00
Implement TODO-only search and bettwe ord boundaries.
This commit is contained in:
parent
4d589476db
commit
469caa5ff6
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
|||
2008-03-13 Carsten Dominik <dominik@science.uva.nl>
|
||||
|
||||
* org.el (org-search-view): Add more text properties.
|
||||
(org-agenda-schedule, org-agenda-deadline): Allow also in
|
||||
search-type agendas.
|
||||
(org-search-view): Order of arguments has been changed.
|
||||
Interpret prefix-arg as TODO-ONLY.
|
||||
(org-agenda, org-run-agenda-series, org-agenda-manipulate-query):
|
||||
Take new argument order of `org-search-view' into account.
|
||||
(org-todo-only): New variable.
|
||||
(org-search-syntax-table): New variable and function.
|
||||
(org-search-view): Do the search with the special syntax table.
|
||||
|
||||
2008-03-13 Phil Jackson <phil@shellarchive.co.uk>
|
||||
|
||||
* org-irc.el: New function to ensure port number is always
|
||||
|
|
|
@ -9,6 +9,16 @@
|
|||
|
||||
** Details
|
||||
|
||||
*** Improvements in Search View
|
||||
|
||||
- Calling search view with a C-u prefix will makt it match
|
||||
only in TODO entries.
|
||||
|
||||
- The single quote is no longer considered a word character
|
||||
durin search, so that searching for the word "Nasim" will
|
||||
also match in "Nasim's".
|
||||
|
||||
*** Misc
|
||||
- When an entry already has a scheduling or deadline time
|
||||
stamp, calling `C-c C-s' or `C-c C-d', respectively, will no
|
||||
use that old date as the default, and you can can use the
|
||||
|
|
155
org.el
155
org.el
|
@ -20012,7 +20012,7 @@ Pressing `<' twice means to restrict to the current subtree or region
|
|||
((eq type 'alltodo)
|
||||
(org-let lprops '(org-todo-list current-prefix-arg)))
|
||||
((eq type 'search)
|
||||
(org-let lprops '(org-search-view current-prefix-arg match)))
|
||||
(org-let lprops '(org-search-view current-prefix-arg match nil)))
|
||||
((eq type 'stuck)
|
||||
(org-let lprops '(org-agenda-list-stuck-projects
|
||||
current-prefix-arg)))
|
||||
|
@ -20240,7 +20240,7 @@ s Search for keywords C Configure custom agenda commands
|
|||
'(call-interactively 'org-todo-list)))
|
||||
((eq type 'search)
|
||||
(org-let2 gprops lprops
|
||||
'(org-search-view current-prefix-arg match)))
|
||||
'(org-search-view current-prefix-arg match nil)))
|
||||
((eq type 'stuck)
|
||||
(org-let2 gprops lprops
|
||||
'(call-interactively 'org-agenda-list-stuck-projects)))
|
||||
|
@ -21193,13 +21193,32 @@ given in `org-agenda-start-on-weekday'."
|
|||
;;; Agenda word search
|
||||
|
||||
(defvar org-agenda-search-history nil)
|
||||
(defvar org-todo-only nil)
|
||||
|
||||
(defvar org-search-syntax-table nil
|
||||
"Special syntax table for org-mode search.
|
||||
In this table, we have single quotes not as word constituents, to
|
||||
that when \"+Ameli\" is searchd as a work, it will also match \"Ameli's\"")
|
||||
|
||||
(defun org-search-syntax-table ()
|
||||
(unless org-search-syntax-table
|
||||
(setq org-search-syntax-table (copy-syntax-table org-mode-syntax-table))
|
||||
(modify-syntax-entry ?' "." org-search-syntax-table)
|
||||
(modify-syntax-entry ?` "." org-search-syntax-table))
|
||||
org-search-syntax-table)
|
||||
|
||||
;;;###autoload
|
||||
(defun org-search-view (&optional arg string)
|
||||
(defun org-search-view (&optional todo-only string edit-at)
|
||||
"Show all entries that contain words or regular expressions.
|
||||
If the first character of the search string is an asterisks,
|
||||
search only the headlines.
|
||||
|
||||
With optional prefix argument TODO-ONLY, only consider entries that are
|
||||
TODO entries. The argument STRING can be used to pass a default search
|
||||
string into this function. If EDIT-AT is non-nil, it means that the
|
||||
user should get a chance to edit this string, with cursor at position
|
||||
EDIT-AT.
|
||||
|
||||
The search string is broken into \"words\" by splitting at whitespace.
|
||||
The individual words are then interpreted as a boolean expression with
|
||||
logical AND. Words prefixed with a minus must not occur in the entry.
|
||||
|
@ -21209,6 +21228,11 @@ Matching is case-insensitive and the words are enclosed by word delimiters.
|
|||
Words enclosed by curly braces are interpreted as regular expressions
|
||||
that must or must not match in the entry.
|
||||
|
||||
If the search string starts with an asterisk, search only in headlines.
|
||||
If (possibly after the leading star) the search string starts with an
|
||||
exclamation mark, this also means to look at TODO entries only, an effect
|
||||
that can also be achieved with a prefix argument.
|
||||
|
||||
This command searches the agenda files, and in addition the files listed
|
||||
in `org-agenda-text-search-extra-files'."
|
||||
(interactive "P")
|
||||
|
@ -21225,22 +21249,27 @@ in `org-agenda-text-search-extra-files'."
|
|||
regexp rtn rtnall files file pos
|
||||
marker priority category tags c neg re
|
||||
ee txt beg end words regexps+ regexps- hdl-only buffer beg1 str)
|
||||
(unless (and (not arg)
|
||||
(unless (and (not edit-at)
|
||||
(stringp string)
|
||||
(string-match "\\S-" string))
|
||||
(setq string (read-string "[+-]Word/{Regexp} ...: "
|
||||
(cond
|
||||
((integerp arg) (cons string arg))
|
||||
(arg string))
|
||||
((integerp edit-at) (cons string edit-at))
|
||||
(edit-at string))
|
||||
'org-agenda-search-history)))
|
||||
(org-set-local 'org-todo-only todo-only)
|
||||
(setq org-agenda-redo-command
|
||||
(list 'org-search-view 'current-prefix-arg string))
|
||||
(list 'org-search-view (if todo-only t nil) string
|
||||
'(if current-prefix-arg 1 nil)))
|
||||
(setq org-agenda-query-string string)
|
||||
|
||||
(if (equal (string-to-char string) ?*)
|
||||
(setq hdl-only t
|
||||
words (substring string 1))
|
||||
(setq words string))
|
||||
(when (equal (string-to-char words) ?!)
|
||||
(setq todo-only t
|
||||
words (substring words 1)))
|
||||
(setq words (org-split-string words))
|
||||
(mapc (lambda (w)
|
||||
(setq c (string-to-char w))
|
||||
|
@ -21274,55 +21303,60 @@ in `org-agenda-text-search-extra-files'."
|
|||
(setq rtn (list (format "ORG-AGENDA-ERROR: No such org-file %s"
|
||||
file))))
|
||||
(with-current-buffer buffer
|
||||
(unless (org-mode-p)
|
||||
(error "Agenda file %s is not in `org-mode'" file))
|
||||
(let ((case-fold-search t))
|
||||
(save-excursion
|
||||
(save-restriction
|
||||
(if org-agenda-restrict
|
||||
(narrow-to-region org-agenda-restrict-begin
|
||||
org-agenda-restrict-end)
|
||||
(widen))
|
||||
(goto-char (point-min))
|
||||
(unless (or (org-on-heading-p)
|
||||
(outline-next-heading))
|
||||
(throw 'nextfile t))
|
||||
(goto-char (max (point-min) (1- (point))))
|
||||
(while (re-search-forward regexp nil t)
|
||||
(org-back-to-heading t)
|
||||
(skip-chars-forward "* ")
|
||||
(setq beg (point-at-bol)
|
||||
beg1 (point)
|
||||
end (progn (outline-next-heading) (point)))
|
||||
(catch :skip
|
||||
(goto-char beg)
|
||||
(org-agenda-skip)
|
||||
(setq str (buffer-substring-no-properties
|
||||
(point-at-bol)
|
||||
(if hdl-only (point-at-eol) end)))
|
||||
(mapc (lambda (wr) (when (string-match wr str)
|
||||
(goto-char (1- end))
|
||||
(throw :skip t)))
|
||||
regexps-)
|
||||
(mapc (lambda (wr) (unless (string-match wr str)
|
||||
(goto-char (1- end))
|
||||
(throw :skip t)))
|
||||
regexps+)
|
||||
(goto-char beg)
|
||||
(setq marker (org-agenda-new-marker (point))
|
||||
category (org-get-category)
|
||||
tags (org-get-tags-at (point))
|
||||
txt (org-format-agenda-item
|
||||
""
|
||||
(buffer-substring-no-properties
|
||||
beg1 (point-at-eol))
|
||||
category tags))
|
||||
(org-add-props txt props
|
||||
'org-marker marker 'org-hd-marker marker
|
||||
'priority 1000 'org-category category
|
||||
'type "search")
|
||||
(push txt ee)
|
||||
(goto-char (1- end)))))))))
|
||||
(with-syntax-table (org-search-syntax-table)
|
||||
(unless (org-mode-p)
|
||||
(error "Agenda file %s is not in `org-mode'" file))
|
||||
(let ((case-fold-search t))
|
||||
(save-excursion
|
||||
(save-restriction
|
||||
(if org-agenda-restrict
|
||||
(narrow-to-region org-agenda-restrict-begin
|
||||
org-agenda-restrict-end)
|
||||
(widen))
|
||||
(goto-char (point-min))
|
||||
(unless (or (org-on-heading-p)
|
||||
(outline-next-heading))
|
||||
(throw 'nextfile t))
|
||||
(goto-char (max (point-min) (1- (point))))
|
||||
(while (re-search-forward regexp nil t)
|
||||
(org-back-to-heading t)
|
||||
(skip-chars-forward "* ")
|
||||
(setq beg (point-at-bol)
|
||||
beg1 (point)
|
||||
end (progn (outline-next-heading) (point)))
|
||||
(catch :skip
|
||||
(goto-char beg)
|
||||
(org-agenda-skip)
|
||||
(setq str (buffer-substring-no-properties
|
||||
(point-at-bol)
|
||||
(if hdl-only (point-at-eol) end)))
|
||||
(mapc (lambda (wr) (when (string-match wr str)
|
||||
(goto-char (1- end))
|
||||
(throw :skip t)))
|
||||
regexps-)
|
||||
(mapc (lambda (wr) (unless (string-match wr str)
|
||||
(goto-char (1- end))
|
||||
(throw :skip t)))
|
||||
(if todo-only
|
||||
(cons (concat "^\*+[ \t]+" org-not-done-regexp)
|
||||
regexps+)
|
||||
regexps+))
|
||||
(goto-char beg)
|
||||
(setq marker (org-agenda-new-marker (point))
|
||||
category (org-get-category)
|
||||
tags (org-get-tags-at (point))
|
||||
txt (org-format-agenda-item
|
||||
""
|
||||
(buffer-substring-no-properties
|
||||
beg1 (point-at-eol))
|
||||
category tags))
|
||||
(org-add-props txt props
|
||||
'org-marker marker 'org-hd-marker marker
|
||||
'org-todo-regexp org-todo-regexp
|
||||
'priority 1000 'org-category category
|
||||
'type "search")
|
||||
(push txt ee)
|
||||
(goto-char (1- end))))))))))
|
||||
(setq rtn (nreverse ee))
|
||||
(setq rtnall (append rtnall rtn)))
|
||||
(if org-agenda-overriding-header
|
||||
|
@ -22823,9 +22857,10 @@ Negative selection means, regexp must not match for selection of an entry."
|
|||
(?\{ . " +{}") (?\} . " -{}")))))
|
||||
(setq org-agenda-redo-command
|
||||
(list 'org-search-view
|
||||
org-todo-only
|
||||
org-agenda-query-string
|
||||
(+ (length org-agenda-query-string)
|
||||
(if (member char '(?\{ ?\})) 0 1))
|
||||
org-agenda-query-string))
|
||||
(if (member char '(?\{ ?\})) 0 1))))
|
||||
(set-register org-agenda-query-register org-agenda-query-string)
|
||||
(org-agenda-redo))
|
||||
(t (error "Canot manipulate query for %s-type agenda buffers"
|
||||
|
@ -23575,7 +23610,7 @@ be used to request time specification in the time stamp."
|
|||
(defun org-agenda-schedule (arg)
|
||||
"Schedule the item at point."
|
||||
(interactive "P")
|
||||
(org-agenda-check-type t 'agenda 'timeline 'todo 'tags)
|
||||
(org-agenda-check-type t 'agenda 'timeline 'todo 'tags 'search)
|
||||
(org-agenda-check-no-diary)
|
||||
(let* ((marker (or (get-text-property (point) 'org-marker)
|
||||
(org-agenda-error)))
|
||||
|
@ -23597,7 +23632,7 @@ be used to request time specification in the time stamp."
|
|||
(defun org-agenda-deadline (arg)
|
||||
"Schedule the item at point."
|
||||
(interactive "P")
|
||||
(org-agenda-check-type t 'agenda 'timeline 'todo 'tags)
|
||||
(org-agenda-check-type t 'agenda 'timeline 'todo 'tags 'search)
|
||||
(org-agenda-check-no-diary)
|
||||
(let* ((marker (or (get-text-property (point) 'org-marker)
|
||||
(org-agenda-error)))
|
||||
|
|
Loading…
Reference in a new issue