org-hacks.org: fileconversion 0.8 move preprocessing
authorMichael Brand <michael.ch.brand@gmail.com>
Mon, 25 Nov 2013 18:39:04 +0000 (19:39 +0100)
committerMichael Brand <michael.ch.brand@gmail.com>
Mon, 25 Nov 2013 18:39:04 +0000 (19:39 +0100)
Move preprocessing from after (org-mode-hook) to before (defadvice
org-mode with class "before") turning on Org mode.

org-hacks.org

index c1e993a..41d8bc1 100644 (file)
@@ -3353,17 +3353,18 @@ Everything is documented [[http://tychoish.com/code/org-mail/][here]].
 #+index: Conversion!fileconversion
 
 Using hooks and on the fly
-- when writing a buffer to the file replace the leading stars from headings
-  with a file char
-- when reading a file into the buffer replace the file chars with leading
-  stars for headings
+- When writing a buffer to the file: Replace the leading stars from
+  headings with a file char.
+- When reading a file into the buffer: Replace the file chars with
+  leading stars for headings.
 
-To change to save an Org file in one of the formats or back just add or
-remove the keyword in the STARTUP line and save.
+To change the file format just add or remove the keyword in the
+=#+STARTUP:= line in the Org buffer and save.
 
-Now you can also change to Fundamental mode to see how the file looks like
-on the level of the file, go back to Org mode, reenter Org mode or change to
-any other major mode and the conversion gets done whenever necessary.
+Now you can also change to Fundamental mode to see how the file looks
+like on the level of the file, can go back to Org mode, reenter Org
+mode or change to any other major mode and the conversion gets done
+whenever necessary.
 
 *** Headings Without Leading Stars (hidestarsfile and nbspstarsfile)
     :PROPERTIES:
@@ -3374,8 +3375,9 @@ any other major mode and the conversion gets done whenever necessary.
 This is like "a cleaner outline view":
 http://orgmode.org/manual/Clean-view.html
 
-Example of the _file content_ first with leading stars as usual and below
-without leading stars through "#+STARTUP: odd hidestars hidestarsfile":
+Example of the _file content_ first with leading stars as usual and
+below without leading stars through =#+STARTUP: odd hidestars
+hidestarsfile=:
 
 #+BEGIN_EXAMPLE
   #+STARTUP: odd hidestars
@@ -3405,16 +3407,17 @@ The latter is convenient for better human readability when an Org file,
 additionally to Emacs, is read with a file viewer or, for smaller edits,
 with an editor not capable of the Org file format.
 
-hidestarsfile is a hack and can not become part of the Org core:
-- An Org file with hidestarsfile can not contain list items with a star as
-  bullet due to the syntax conflict at read time. Mark E. Shoulson suggested
-  to use the non-breaking space which is now implemented in fileconversion
-  as nbspstarsfile as an alternative for hidestarsfile. Although I don't
-  recommend it because an editor like typically e. g. Emacs may render the
-  non-breaking space differently from the space 0x20.
-- An Org file with hidestarsfile can almost not be edited with an Org mode
-  without added functionality of hidestarsfile as long as the file is not
-  converted back.
+=hidestarsfile= is a hack and can not become part of the Org core:
+- An Org file with =hidestarsfile= can not contain list items with a
+  star as bullet due to the syntax conflict at read time. Mark
+  E. Shoulson suggested to use the non-breaking space which is now
+  implemented in fileconversion as =nbspstarsfile= as an alternative
+  for =hidestarsfile=. Although I don't recommend it because an editor
+  like typically e. g. Emacs may render the non-breaking space
+  differently from the space =0x20=.
+- An Org file with =hidestarsfile= can almost not be edited with an
+  Org mode without added functionality of hidestarsfile as long as the
+  file is not converted back.
 
 *** Headings in Markdown Format (markdownstarsfile)
     :PROPERTIES:
@@ -3422,10 +3425,10 @@ hidestarsfile is a hack and can not become part of the Org core:
     :END:
 #+index: Conversion!fileconversion markdownstarsfile
 
-For "oddeven" you can use markdownstarsfile to be readable or even basically
-editable with Markdown (does not make much sense with "odd", see
-org-convert-to-odd-levels and org-convert-to-oddeven-levels for how to
-convert).
+Together with =oddeven= you can use =markdownstarsfile= to be readable
+or even basically editable with Markdown (does not make much sense
+with =odd=, see =org-convert-to-odd-levels= and
+=org-convert-to-oddeven-levels= for how to convert).
 
 Example of the _file content_:
 
@@ -3442,8 +3445,8 @@ Example of the _file content_:
        * avoid this item type to be compatible with Org hidestarsfile
 #+END_EXAMPLE
 
-An Org file with markdownstarsfile can not contain code comment lines
-prefixed with "#", even not when within source blocks.
+An Org file with =markdownstarsfile= can not contain code comment
+lines prefixed with =#=, even not when within source blocks.
 
 *** emacs-lisp code
     :PROPERTIES:
@@ -3452,10 +3455,11 @@ prefixed with "#", even not when within source blocks.
 #+index: Conversion!fileconversion emacs-lisp code
 
 #+BEGIN_SRC emacs-lisp
-  ;; - fileconversion version 0.7
+  ;; - fileconversion version 0.8
   ;; - DISCLAIMER: Make a backup of your Org files before using
-  ;;   my-org-fileconv-*.
-  ;; - supported formats: hidestarsfile, markdownstarsfile
+  ;;   f-org-fileconv-*.
+  ;; - supported #+STARTUP: formats: hidestarsfile, nbspstarsfile,
+  ;;   markdownstarsfile
 
   ;; design summary: fileconversion is a round robin of two states
   ;; linked by two actions:
@@ -3471,46 +3475,52 @@ prefixed with "#", even not when within source blocks.
 
   (defvar v-org-fileconv-level-org-p nil
     "Whether level of buffer is Org or only file.
-  nil means the level is file (encoded), non-nil means the level is Org
-  (decoded).")
+  nil means the level is file (encoded), non-nil means the level is
+  Org (decoded).")
   (make-variable-buffer-local 'v-org-fileconv-level-org-p)
   ;; survive a change of major mode that does kill-all-local-variables,
   ;; e. g. when reentering Org mode through “C-c C-c” on a STARTUP line
   (put 'v-org-fileconv-level-org-p 'permanent-local t)
 
-  (add-hook 'org-mode-hook 'f-org-fileconv-init
-            ;; _append_ to hook to have a higher chance that a message
-            ;; from this function will be visible as the last message in
-            ;; the minibuffer
-            t
-            ;; hook addition globally
-            nil)
-
-  (defun f-org-fileconv-init ()
+  (defadvice org-mode (before advice-org-mode-before)
+    (f-org-fileconv-org-mode-beg))
+  (ad-activate 'org-mode)
+  (defun f-org-fileconv-org-mode-beg ()
+    (interactive)
+    ;; only when converting really from/to an Org _file_, not e. g. for
+    ;; a temp Org buffer unrelated to a file
+    (when (buffer-file-name)
+      (message "INF: buffer %s: f-org-fileconv-org-mode-beg"
+               (buffer-name))
+      ;; f-org-fileconv-decode in org-mode-hook would be too late for
+      ;; performance reasons, see
+      ;; http://lists.gnu.org/archive/html/emacs-orgmode/2013-11/msg00920.html
+      (f-org-fileconv-decode)))
+
+  (add-hook 'org-mode-hook 'f-org-fileconv-org-mode-end
+            nil   ; _prepend_ to hook to have it first
+            nil)  ; hook addition globally
+  (defun f-org-fileconv-org-mode-end ()
     (interactive)
-    ;; instrument only when converting really from/to an Org _file_, not
-    ;; e. g. for a temp Org buffer unrelated to a file like used e. g.
-    ;; when calling the old Org exporter
+    ;; only when converting really from/to an Org _file_, not e. g. for
+    ;; a temp Org buffer unrelated to a file
     (when (buffer-file-name)
-      (message "INF: f-org-fileconv-init, buffer: %s" (buffer-name))
-      (f-org-fileconv-decode)
-      ;; the hooks are not permanent-local, this way and as needed they
-      ;; will disappear when the major mode of the buffer changes
-      (add-hook 'change-major-mode-hook 'f-org-fileconv-encode nil
-                ;; hook addition limited to buffer locally
-                t)
-      (add-hook 'before-save-hook 'f-org-fileconv-encode nil
-                ;; hook addition limited to buffer locally
-                t)
-      (add-hook 'after-save-hook 'f-org-fileconv-decode nil
-                ;; hook addition limited to buffer locally
-                t)))
+      (message "INF: buffer %s: f-org-fileconv-org-mode-end"
+               (buffer-name))
+      ;; - the hooks are not permanent-local, this way and as needed
+      ;;   they will disappear when the major mode of the buffer changes
+      ;; - adding to change-major-mode-hook in "defadvice before" would
+      ;;   be too early and already trigger during find-file
+      ;; - t at the end: hook addition limited to buffer locally
+      (add-hook 'change-major-mode-hook 'f-org-fileconv-encode nil t)
+      (add-hook 'before-save-hook       'f-org-fileconv-encode nil t)
+      (add-hook 'after-save-hook        'f-org-fileconv-decode nil t)))
 
   (defun f-org-fileconv-re ()
     "Check whether there is a STARTUP line for fileconversion.
   If found then return the expressions required for the conversion."
     (save-excursion
-      (goto-char (point-min))  ;; beginning-of-buffer not allowed
+      (goto-char (point-min))  ; beginning-of-buffer not allowed
       (let (re-list (count 0))
         (while (re-search-forward "^#\\+STARTUP:" nil t)
           ;; #+STARTUP: hidestarsfile
@@ -3552,13 +3562,13 @@ prefixed with "#", even not when within source blocks.
                (org-re    (concat "^\\*+" common-re))
                len
                (p         (point)))
-          (goto-char (point-min))  ;; beginning-of-buffer not allowed
+          (goto-char (point-min))  ; beginning-of-buffer not allowed
           ;; syntax check
           (when (re-search-forward org-re nil t)
             (goto-char (match-beginning 0))
             (org-reveal)
             (error "Org fileconversion dec: syntax conflict at point"))
-          (goto-char (point-min))  ;; beginning-of-buffer not allowed
+          (goto-char (point-min))  ; beginning-of-buffer not allowed
           ;; substitution
           (with-silent-modifications
             (while (re-search-forward file-re nil t)
@@ -3597,13 +3607,13 @@ prefixed with "#", even not when within source blocks.
                (org-re    (concat "^\\*+" common-re))
                len
                (p         (point)))
-          (goto-char (point-min))  ;; beginning-of-buffer not allowed
+          (goto-char (point-min))  ; beginning-of-buffer not allowed
           ;; syntax check
           (when (re-search-forward file-re nil t)
             (goto-char (match-beginning 0))
             (org-reveal)
             (error "Org fileconversion enc: syntax conflict at point"))
-          (goto-char (point-min))  ;; beginning-of-buffer not allowed
+          (goto-char (point-min))  ; beginning-of-buffer not allowed
           ;; substitution
           (with-silent-modifications
             (while (re-search-forward org-re nil t)
@@ -3615,7 +3625,7 @@ prefixed with "#", even not when within source blocks.
               (delete-char len)))
           (goto-char p)
           (setq v-org-fileconv-level-org-p nil))))
-    nil)  ;; for the hook
+    nil)  ; for the hook
 #+END_SRC
 
 Michael Brand