new version 1.5 or org-refer-by-number.el
authorMarc-Oliver Ihm <ihm@think.(none)>
Thu, 27 Sep 2012 19:24:48 +0000 (21:24 +0200)
committerMarc-Oliver Ihm <ihm@think.(none)>
Thu, 27 Sep 2012 19:24:48 +0000 (21:24 +0200)
code/elisp/org-refer-by-number.el

index 1aa499e..a4ee8a4 100644 (file)
@@ -6,7 +6,7 @@
 ;; Keywords: hypermedia, matching\r
 ;; Requires: org\r
 ;; Download: http://orgmode.org/worg/code/elisp/org-refer-by-number.el\r
-;; Version: 1.4.0\r
+;; Version: 1.5.0\r
 \r
 ;;; License:\r
 \r
 \r
 ;;; Change Log:\r
 \r
+;;   [2012-09-22 Sa] Version 1.5.0:\r
+;;   - New operation "sort" to sort a buffer or region by reference number\r
+;;   - New operations "highlight" and "unhighlight" to mark references\r
+\r
 ;;   [2012-07-13 Fr] Version 1.4.0:\r
-;;   - New operation heading\r
+;;   - New operation "head" to find a headline with a reference number\r
 \r
 ;;   [2012-04-28 Sa] Version 1.3.0:\r
 ;;   - New operations occur and multi-occur\r
@@ -204,7 +208,7 @@ function of this package and its sole entry point; it offers seven
 different operations (short names in parens):\r
 \r
 - Add a new row with a new reference number and the\r
-  date of creation (\"add\"):\r
+  date of creation (\"add\").\r
 \r
 - Search for an existing reference number within your reference\r
   table (\"search\").\r
@@ -226,6 +230,12 @@ different operations (short names in parens):
   window configuration, back to the state before entering\r
   it (\"leave\").\r
 \r
+- Sort lines in current buffer or active region by the first\r
+  reference number, they contain, if any (\"sort\").\r
+\r
+- Highlight or unhighlight all occurences of reference number\r
+  within current buffer (\"highlight\" or \"unhighlight\").\r
\r
 The most straightforward way to select between these operations\r
 is to supply a negative or a a double prefix argument:\r
 \r
@@ -233,7 +243,9 @@ is to supply a negative or a a double prefix argument:
 \r
 You will then be prompted to type a single letter (\"a\", \"s\",\r
 \"o\", \"m\", \"h\", \"e\" or \"l\") to invoke the respective\r
-operation from the list above.\r
+operation from the list above. If your type \"+\" you will be\r
+prompted a second time to choose among some of the less common\r
+operations (e.g. \"sort\").\r
 \r
 \r
 Some of the operations above can be invoked with less keystrokes. In that\r
@@ -248,7 +260,7 @@ case the precise operation invoked depends on two things:
 The following cases explain, which of the seven\r
 operations (\"add\", \"search\", \"occur\", \"multi-occur\",\r
 \"heading\", \"enter\" and \"leave\") is actually invoked\r
-dependng on the conditions above:\r
+depending on the conditions above:\r
 \r
 \r
   If no prefix argument is given (`\\[org-refer-by-number]') and\r
@@ -301,6 +313,7 @@ and complete the necessary setup decribed there.
         head               ; Any header before number (e.g. "R")\r
         last-number        ; Last number used in reference table (e.g. "153")\r
         tail               ; Tail after number (e.g. "}" or "")\r
+        ref-regex          ; Regular expression to match a reference\r
         columns            ; Number of columns in reference table\r
         kill-new-text      ; Text that will be appended to kill ring\r
         message-text       ; Text that will be issued as an explanation,\r
@@ -340,14 +353,18 @@ and complete the necessary setup decribed there.
              (while \r
                  (progn \r
                    (setq key (read-char-exclusive \r
-                              "Please choose: e=enter l=leave s=search a=add o=occur m=multi-occur h=heading"))\r
+                              "Please choose: e=enter l=leave s=search a=add o=occur m=multi-occur h=heading +=more choices"))\r
                    (not \r
                     (setq what (case key\r
                                  (?l 'leave) (?e 'enter) (?a 'add) \r
-                                 (?s 'search) (?o 'occur) (?m 'multi-occur) (?h 'heading)))))\r
+                                 (?s 'search) (?o 'occur) (?m 'multi-occur) (?h 'heading) (?+ 'more)))))\r
                (message "Invalid key '%c'" key)\r
                (sleep-for 1))\r
-           (setq what-explicit t))))\r
+             (if (eq what 'more)\r
+                 (setq what (cdr (assoc \r
+                                  (org-icompleting-read "Please choose: " '("sort" "highlight" "unhighlight") nil t)\r
+                                  '(("sort" . sort)("highlight" . highlight)("unhighlight" . unhighlight))))))\r
+             (setq what-explicit t))))\r
 \r
     ;; Get decoration and number of last row from reference table\r
     (let ((m (org-id-find org-refer-by-number-id 'marker)))\r
@@ -364,8 +381,9 @@ and complete the necessary setup decribed there.
       (setq head (nth 0 parts))\r
       (setq last-number (nth 1 parts))\r
       (setq tail (nth 2 parts))\r
-      (setq columns (nth 3 parts)))\r
-    \r
+      (setq columns (nth 3 parts))\r
+      (setq ref-regex (concat (regexp-quote head) "\\([0-9]+\\)" (regexp-quote tail))))\r
+      \r
 \r
     ;; These actions need a search string:\r
     (when (memq what '(search occur multi-occur heading))\r
@@ -381,7 +399,7 @@ and complete the necessary setup decribed there.
       ;; From string below cursor\r
       (when (and (not within-node)\r
                  below-cursor\r
-                 (string-match (concat "\\(" (regexp-quote head) "[0-9]+" (regexp-quote tail) "\\)") \r
+                 (string-match (concat "\\(" ref-regex "\\)") \r
                                below-cursor))\r
         (setq search-from-cursor (match-string 1 below-cursor)))\r
       \r
@@ -423,8 +441,7 @@ and complete the necessary setup decribed there.
           (setq what-adjusted t))\r
            \r
       ;; Check for invalid combinations of arguments; try to be helpful\r
-      (if (string-match (concat (regexp-quote head) "[0-9]+" (regexp-quote tail) )\r
-                        search)\r
+      (if (string-match ref-regex search)\r
           (if (eq what 'occur) \r
               (error "Can do 'occur' only for text, try 'search', 'multi-occur' or 'heading' for a number"))\r
         (if (memq what '(search multi-occur heading))\r
@@ -625,6 +642,53 @@ and complete the necessary setup decribed there.
         (setq message-text "At reference table")))\r
      \r
 \r
+     ((eq what 'sort)\r
+      (let (begin end where)\r
+        (if (if (and transient-mark-mode\r
+                     mark-active)\r
+                (progn\r
+                  (setq begin (region-beginning))\r
+                  (setq end (region-end))\r
+                  (setq where "region")\r
+                  t)\r
+              (setq begin (point-min))\r
+              (setq end (point-max))\r
+              (setq where "whole buffer")\r
+              (y-or-n-p "Sort whole buffer ")\r
+              )\r
+            (save-excursion\r
+              (save-restriction\r
+                (beginning-of-buffer)\r
+                (narrow-to-region begin end)\r
+                (sort-subr nil 'forward-line 'end-of-line \r
+                           (lambda ()\r
+                             (if (looking-at (concat "^.*\\b" ref-regex "\\b"))\r
+                                 (string-to-number (match-string 1))\r
+                               0))))\r
+              (highlight-regexp ref-regex)\r
+              (setq message-text (format "Sorted %s from character %d to %d, %d lines" \r
+                                         where begin end\r
+                                         (count-lines begin end))))\r
+          (setq message-text "Sort aborted"))))\r
+      \r
+\r
+     ((memq what '(highlight unhighlight))\r
+      (let ((where "buffer"))\r
+        (save-excursion\r
+          (save-restriction\r
+            (when (and transient-mark-mode\r
+                     mark-active)\r
+                (narrow-to-region (region-beginning) (region-end))\r
+                (setq where "region")\r
+              )\r
+          (if (eq what 'highlight)\r
+              (progn\r
+                (highlight-regexp ref-regex)\r
+                (setq message-text (format "Highlighted references in %s" where)))\r
+            (unhighlight-regexp ref-regex)\r
+            (setq message-text (format "Removed highlights for references in %s" where)))))))\r
+     \r
+\r
      (t (error "This is a bug: Unmatched condition '%s'" what)))\r
 \r
     \r