Use GFM, as git.korewanetadesu.com now supports it.
[pelican-mode.git] / pelican-mode.el
index 5fa2179..1b608be 100644 (file)
@@ -3,8 +3,9 @@
 ;; Copyright 2013-2017 Joe Wreschnig
 ;;
 ;; Author: Joe Wreschnig <joe.wreschnig@gmail.com>
 ;; Copyright 2013-2017 Joe Wreschnig
 ;;
 ;; Author: Joe Wreschnig <joe.wreschnig@gmail.com>
-;; Package-Version: 20170730
+;; Package-Version: 20170808
 ;; Package-Requires: ((emacs "25"))
 ;; Package-Requires: ((emacs "25"))
+;; URL: https://git.korewanetadesu.com/pelican-mode.git
 ;; Keywords: convenience, editing
 ;;
 ;; This program is free software; you can redistribute it and/or modify
 ;; Keywords: convenience, editing
 ;;
 ;; This program is free software; you can redistribute it and/or modify
@@ -24,8 +25,8 @@
 
 ;;; Commentary:
 ;;
 
 ;;; Commentary:
 ;;
-;; pelican-mode is an Emacs minor mode for editing pages and posts in
-;; Pelican sites.  Pelican is a static site generator which can
+;; pelican-mode is an Emacs minor mode for editing articles and pages
+;; in Pelican sites.  Pelican is a static site generator which can
 ;; process a variety of text file formats.  For more information, see
 ;; URL https://blog.getpelican.com/.
 ;;
 ;; process a variety of text file formats.  For more information, see
 ;; URL https://blog.getpelican.com/.
 ;;
 ;;     (require 'pelican-mode)
 ;;     (pelican-global-mode)
 ;;
 ;;     (require 'pelican-mode)
 ;;     (pelican-global-mode)
 ;;
+;; Or with ``use-package'' and deferred loading:
+;;
+;;     (use-package pelican-mode
+;;       :after (:any org rst markdown-mode adoc-mode)
+;;       :config
+;;       (pelican-global-mode))
+;;
 ;; Or, register `pelican-mode' or `pelican-mode-enable-if-site'
 ;; as hook functions for more direct control.
 
 ;; Or, register `pelican-mode' or `pelican-mode-enable-if-site'
 ;; as hook functions for more direct control.
 
 (require 'seq)
 (require 'subr-x)
 
 (require 'seq)
 (require 'subr-x)
 
-;; Mode Definition
-
-;;;###autoload
-(define-minor-mode pelican-mode
-  "Toggle Pelican mode.
-With a prefix argument ARG, enable Pelican mode if ARG is
-positive, and disable it otherwise.  If called from Lisp, enable
-the mode if ARG is omitted or nil.
-
-Pelican is a static site generator which can process a variety of
-text file formats.  For more information, see URL
-https://blog.getpelican.com/.
-
-Rather than manually enabling this mode, you may wish to use
-`pelican-global-mode' or `pelican-mode-enable-if-site'.
-
-When Pelican mode is enabled, additional commands are available
-for editing articles or pages:
-
-\\{pelican-mode-map}"
-  :lighter " Pelican"
-  :keymap `((,(kbd "C-c P d") . pelican-mode-update-date)
-            (,(kbd "C-c P f") . pelican-set-field)
-            (,(kbd "C-c P h") . pelican-make-html)
-            (,(kbd "C-c P n") . pelican-mode-insert-header)
-            (,(kbd "C-c P p") . pelican-mode-publish)
-            (,(kbd "C-c P u") . pelican-make-rsync-upload)))
-
-;;;###autoload
-(define-minor-mode pelican-global-mode
-  "Toggle Pelican global mode.
-With a prefix argument ARG, enable Pelican global mode if ARG is
-positive, and disable it otherwise.  If called from Lisp, enable
-the mode if ARG is omitted or nil.
-
-Pelican is a static site generator which can process a variety of
-text file formats.  For more information, see URL
-https://blog.getpelican.com/.
-
-When Pelican global mode is enabled, text files which seem to
-be part of a Pelican site will have `pelican-mode' automatically
-enabled.
-
-If you disable this, you may still enable `pelican-mode' manually
-or add `pelican-mode-enable-if-site' to more specific mode
-hooks."
-  :global t
-  :group 'pelican-mode
-  (if pelican-global-mode
-      (add-hook 'text-mode-hook #'pelican-mode-enable-if-site)
-    (remove-hook 'text-mode-hook #'pelican-mode-enable-if-site)))
-
-;;;###autoload
-(defun pelican-mode-enable-if-site ()
-  "Enable `pelican-mode' if this buffer is part of a Pelican site.
-
-Pelican sites are detected by looking for a file named `pelicanconf.py'
-in an ancestor directory."
-  (when (pelican-mode-find-root)
-    (pelican-mode)))
-
-\f
-
 ;; Customizations
 
 ;; Customizations
 
-(defgroup pelican-mode nil
+(defgroup pelican nil
   "Support for Pelican articles and pages.
 
 For more information about Pelican see URL https://blog.getpelican.com/."
   :group 'convenience)
 
   "Support for Pelican articles and pages.
 
 For more information about Pelican see URL https://blog.getpelican.com/."
   :group 'convenience)
 
+(defcustom pelican-mode-keymap-prefix (kbd "C-c P")
+  "Pelican mode keymap prefix."
+  :group 'pelican
+  :type 'string)
+
 (defcustom pelican-mode-default-page-fields
   '(:slug slug)
   "Fields to include when creating a new page.
 
 See the documentation for `pelican-mode-set-field' for more information
 about metadata fields and special values."
 (defcustom pelican-mode-default-page-fields
   '(:slug slug)
   "Fields to include when creating a new page.
 
 See the documentation for `pelican-mode-set-field' for more information
 about metadata fields and special values."
-  :group 'pelican-mode
+  :group 'pelican
   :type '(plist))
 
 (defcustom pelican-mode-default-article-fields
   :type '(plist))
 
 (defcustom pelican-mode-default-article-fields
@@ -143,7 +93,7 @@ about metadata fields and special values."
 
 See the documentation for `pelican-mode-set-field' for more information
 about metadata fields and special values."
 
 See the documentation for `pelican-mode-set-field' for more information
 about metadata fields and special values."
-  :group 'pelican-mode
+  :group 'pelican
   :type '(plist))
 
 (defcustom pelican-mode-formats
   :type '(plist))
 
 (defcustom pelican-mode-formats
@@ -155,11 +105,73 @@ about metadata fields and special values."
 
 This association list maps modes to functions that take two
 arguments, field and value strings."
 
 This association list maps modes to functions that take two
 arguments, field and value strings."
-  :group 'pelican-mode
+  :group 'pelican
   :type '(alist :key-type function :value-type function))
 
 \f
 
   :type '(alist :key-type function :value-type function))
 
 \f
 
+;; Mode Definition
+
+(defvar pelican-mode-command-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "d") #'pelican-mode-update-date)
+    (define-key map (kbd "f") #'pelican-mode-set-field)
+    (define-key map (kbd "h") #'pelican-make-html)
+    (define-key map (kbd "n") #'pelican-mode-insert-header)
+    (define-key map (kbd "p") #'pelican-mode-publish)
+    (define-key map (kbd "u") #'pelican-make-rsync-upload)
+    map)
+  "Keymap for Pelican commands after `pelican-mode-keymap-prefix'.")
+(fset 'pelican-mode-command-map pelican-mode-command-map)
+
+(defvar pelican-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map pelican-mode-keymap-prefix
+      'pelican-mode-command-map)
+    map)
+  "Keymap for Pelican mode.")
+
+;;;###autoload
+(define-minor-mode pelican-mode
+  "Toggle Pelican mode.
+With a prefix argument ARG, enable Pelican mode if ARG is
+positive, and disable it otherwise.  If called from Lisp, enable
+the mode if ARG is omitted or nil.
+
+Pelican is a static site generator which can process a variety of
+text file formats.  For more information, see URL
+https://blog.getpelican.com/.
+
+Rather than manually enabling this mode, you may wish to use
+`pelican-global-mode' or `pelican-mode-enable-if-site'.
+
+When Pelican mode is enabled, additional commands are available
+for editing articles or pages:
+
+\\{pelican-mode-map}"
+  :group 'pelican
+  :keymap pelican-mode-map
+  :lighter " Pelican")
+
+;;;###autoload
+(define-globalized-minor-mode pelican-global-mode pelican-mode
+  (lambda ()
+    (when (derived-mode-p #'text-mode)
+      (pelican-mode-enable-if-site)))
+  :group 'pelican
+  :require 'pelican-mode)
+
+;;;###autoload
+(defun pelican-mode-enable-if-site ()
+  "Enable `pelican-mode' if this buffer is part of a Pelican site.
+
+Pelican sites are detected by looking for a file named `pelicanconf.py'
+in an ancestor directory."
+  (when (pelican-mode-find-root)
+    (pelican-mode)))
+
+\f
+
 ;; User Commands
 
 (defun pelican-mode-set-field (field value)
 ;; User Commands
 
 (defun pelican-mode-set-field (field value)