emacsweblogs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacsweblogs] weblogger & major mode


From: Mark A. Hershberger
Subject: [Emacsweblogs] weblogger & major mode
Date: Thu, 17 Sep 2009 23:29:03 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (gnu/linux)

Based on David Abrahams' and Andrea Crotti's feedback, I've put together
a quick hack to toggle the weblogger-entry buffer between the major mode
of your choice.

I'd like to see what you guys think before committing this, so I've made
my changes available at <http://winkyfrown.com/weblogger.el>.

Some notes on the use of this:

   * There are three new customizations:

     + weblogger-edit-mode - The major mode to switch to for editing the
       content.
     + weblogger-edit-mode-toggle-hook - hook to run when switching to
       the above mode.
     + weblogger-weblogger-mode-toggle-hook - hook to run when switching
       back to weblogger-entry-mode

   * In the weblogger-entry-mode, I've added a keybinding (C-c C-e) to
     switch to editting the body in the major-mode you put in
     weblogger-edit-mode (defaults to nxml-mode, but I'm open to
     suggestions for a better mode).

     When you switch major modes this way, the header is removed, the
     hooks are run and you can edit the body using whatever you're used
     to.

   * When you want to switch back to edit the meta-data and/or submit
     the entry, you would do “M-x weblogger-toggle-edit-body RET” and
     the headers will be inserted back into the buffer and the buffer
     will be switched back to weblogger-entry-mode.

Let me know what you think!

Mark.

-- 
http://hexmode.com/

Every day, mindful practice.  When the mind is disciplined, then the
Way can work for us.  Otherwise, all we do is talk of the Way; everything
is just words; and the world will know us as its one great fool.

=== modified file 'lisp/weblogger.el'
--- lisp/weblogger.el   2009-09-13 06:15:53 +0000
+++ lisp/weblogger.el   2009-09-18 02:26:58 +0000
@@ -242,6 +242,21 @@
   :group 'weblogger
   :type 'hook)
 
+(defcustom weblogger-edit-mode 'nxml-mode
+  "Major mode to use for editing weblog entries"
+  :group 'weblogger
+  :type 'function)
+
+(defcustom weblogger-edit-mode-toggle-hook nil
+  "Hook to call when switching to edit mode"
+  :group 'weblogger
+  :type 'hook)
+
+(defcustom weblogger-weblogger-mode-toggle-hook nil
+  "Hook to call when switching back to weblogger mode"
+  :group 'weblogger
+  :type 'hook)
+
 (defvar weblogger-entry-list nil
   "List of weblog entries that we know about. Chronological
 order, with newest first.")
@@ -305,6 +320,9 @@
 
 (defvar menu-bar-weblogger-menu nil)
 
+(defvar weblogger-header nil
+  "Holds the weblog header")
+
 (defconst weblogger-blogger-app-key
   "07C72E6970E0FBA5DE21BA9F4800C44534C19870"
   "OBSOLETE. The appkey to send to weblog server.  Generally this
@@ -400,6 +418,7 @@
           (define-key map "\C-c\C-o" 'weblogger-change-server)
           (define-key map "\C-c\C-w" 'weblogger-change-weblog)
           (define-key map "\C-c\C-u" 'weblogger-change-user)
+          (define-key map "\C-c\C-e" 'weblogger-toggle-edit-body)
           map)))
 
 (unless weblogger-template-mode-map
@@ -514,17 +533,14 @@
                                 (weblogger-select-texttype))))
     (goto-char point-save)))
 
-(defun weblogger-entry-mode ()
+(define-derived-mode weblogger-entry-mode message-mode "Weblog"
   "Major mode for editing text for Weblogger.  Based on message-mode."
-  (interactive)
-  (message-mode)
-  (message-disassociate-draft)
-  (use-local-map weblogger-entry-mode-map)
-  (setq mode-name "weblogger-entry")
-  (setq major-mode 'weblogger-entry-mode)
+  ;; (interactive)
+  ;; (message-mode)
+  ;; (message-disassociate-draft)
+  ;; (use-local-map weblogger-entry-mode-map)
   (unless weblogger-entry-ring
-    (setq weblogger-entry-ring (make-ring weblogger-max-entries-in-ring)))
-  (run-hooks 'weblogger-entry-mode-hook))
+    (setq weblogger-entry-ring (make-ring weblogger-max-entries-in-ring))))
 
 (defun weblogger-template-mode ()
   "Major mode for editing templates for Weblogger. Based on text-mode."
@@ -1329,6 +1345,24 @@
                      (buffer-substring-no-properties
                       (point) (point-max)))))))))
 
+(defun weblogger-toggle-edit-body ()
+  "Toggle between editting the body and editting the headers"
+  (interactive)
+  (if (string= mode-name "Weblog")
+      (progn
+        (message-goto-body)
+        (setq weblogger-header (buffer-substring (point-min) (point)))
+        (delete-region (point-min) (point))
+        (run-hooks 'weblogger-edit-mode-toggle-hook)
+        (funcall weblogger-edit-mode)
+        (make-local-variable 'weblogger-header))
+    (if (not (assoc 'weblogger-header (buffer-local-variables)))
+        (error "You didn't come here from a weblogger buffer, so we can switch 
back")
+      (goto-char (point-min))
+      (insert weblogger-header)
+      (run-hooks 'weblogger-weblogger-mode-toggle-hook)
+      (weblogger-entry-mode))))
+
 ;; TODO -- Support for toolbar
 ;; (eval-when-compile (defvar tool-bar-map))
 ;; (if (featurep 'xemacs)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]