Browse Source

org-agenda.el: (org-agenda-bulk-toggle-all): New command

* org-agenda.el (org-agenda-bulk-toggle): Fix docstring.
(org-agenda-bulk-toggle-all): New command.
(org-agenda-mode-map): Bind `org-agenda-bulk-toggle' to `M-m'
and `org-agenda-bulk-toggle-all' to `M-*'.
(org-agenda-menu): Add `org-agenda-bulk-toggle' and
`org-agenda-bulk-toggle-all'.
(org-agenda-bulk-mark, org-agenda-bulk-unmark): Jump to the
next headline, not the next line.
Bastien Guerry 7 years ago
parent
commit
4e62936ae5
1 changed files with 28 additions and 8 deletions
  1. 28 8
      lisp/org-agenda.el

+ 28 - 8
lisp/org-agenda.el

@@ -2183,7 +2183,9 @@ The following commands are available:
 (org-defkey org-agenda-mode-map "\C-k"     'org-agenda-kill)
 (org-defkey org-agenda-mode-map "\C-c\C-w" 'org-agenda-refile)
 (org-defkey org-agenda-mode-map "m"        'org-agenda-bulk-mark)
+(org-defkey org-agenda-mode-map "\M-m"     'org-agenda-bulk-toggle)
 (org-defkey org-agenda-mode-map "*"        'org-agenda-bulk-mark-all)
+(org-defkey org-agenda-mode-map "\M-*"     'org-agenda-bulk-toggle-all)
 (org-defkey org-agenda-mode-map "#"        'org-agenda-dim-blocked-tasks)
 (org-defkey org-agenda-mode-map "%"        'org-agenda-bulk-mark-regexp)
 (org-defkey org-agenda-mode-map "u"        'org-agenda-bulk-unmark)
@@ -2399,9 +2401,11 @@ The following commands are available:
     ("Bulk action"
      ["Mark entry" org-agenda-bulk-mark t]
      ["Mark all" org-agenda-bulk-mark-all t]
-     ["Mark matching regexp" org-agenda-bulk-mark-regexp t]
      ["Unmark entry" org-agenda-bulk-unmark t]
-     ["Unmark all entries" org-agenda-bulk-unmark-all :active t :keys "U"])
+     ["Unmark all" org-agenda-bulk-unmark-all :active t :keys "U"]
+     ["Toggle mark" org-agenda-bulk-toggle t]
+     ["Toggle all" org-agenda-bulk-toggle-all t]
+     ["Mark regexp" org-agenda-bulk-mark-regexp t])
     ["Act on all marked" org-agenda-bulk-action t]
     "--"
     ("Tags and Properties"
@@ -9606,7 +9610,10 @@ This is a command that has to be installed in `calendar-mode-map'."
 			       (org-get-todo-face "TODO")
 			       'evaporate)
 	  (overlay-put ov 'type 'org-marked-entry-overlay))
-	(beginning-of-line 2)
+	(end-of-line 1)
+	(or (ignore-errors
+	      (goto-char (next-single-property-change (point) 'txt)))
+	    (beginning-of-line 2))
 	(while (and (get-char-property (point) 'invisible) (not (eobp)))
 	  (beginning-of-line 2))
 	(message "%d entries marked for bulk action"
@@ -9620,12 +9627,13 @@ This is a command that has to be installed in `calendar-mode-map'."
 (defun org-agenda-bulk-mark-regexp (regexp)
   "Mark entries matching REGEXP for future agenda bulk action."
   (interactive "sMark entries matching regexp: ")
-  (let ((entries-marked 0))
+  (let ((entries-marked 0) txt-at-point)
     (save-excursion
       (goto-char (point-min))
       (goto-char (next-single-property-change (point) 'txt))
-      (while (re-search-forward regexp nil t)
-	(when (string-match regexp (get-text-property (point) 'txt))
+      (while (and (re-search-forward regexp nil t)
+		  (setq txt-at-point (get-text-property (point) 'txt)))
+	(when (string-match regexp txt-at-point)
 	  (setq entries-marked (1+ entries-marked))
 	  (call-interactively 'org-agenda-bulk-mark))))
     (if (not entries-marked)
@@ -9642,15 +9650,27 @@ This is a command that has to be installed in `calendar-mode-map'."
 	   (setq org-agenda-bulk-marked-entries
 		 (delete (org-get-at-bol 'org-hd-marker)
 			 org-agenda-bulk-marked-entries))
-	   (beginning-of-line 2)
+	   (end-of-line 1)
+	   (or (ignore-errors
+		 (goto-char (next-single-property-change (point) 'txt)))
+	       (beginning-of-line 2))
 	   (while (and (get-char-property (point) 'invisible) (not (eobp)))
 	     (beginning-of-line 2))
 	   (message "%d entries left marked for bulk action"
 		    (length org-agenda-bulk-marked-entries)))
 	  (t (message "No entry to unmark here")))))
 
+(defun org-agenda-bulk-toggle-all ()
+  "Toggle all marks for bulk action."
+  (interactive)
+  (save-excursion
+    (goto-char (point-min))
+    (while (ignore-errors
+	     (goto-char (next-single-property-change (point) 'txt)))
+      (org-agenda-bulk-toggle))))
+
 (defun org-agenda-bulk-toggle ()
-  "Toggle marking the entry at point for bulk action."
+  "Toggle the mark at point for bulk action."
   (interactive)
   (if (org-agenda-bulk-marked-p)
       (org-agenda-bulk-unmark)