I've fixed up a couple of bugs in the font-locking mechanism, now the
delta faces (they colour the ++7 type numbers) work properly. (amazing
how much you learn when you cosy up with the reference manuals for a
few hours!) So now I'm happy with the syntax colouring for numbers.

I'm chasing up the xemacs problem, trying to understand how to make it
compatible. I tried putting in the (eval-when-compile (require 'cl)) as
maybe it is the :keywords that are like common-lisp. Let me know if that
works, but I really feel on looking at other modules that work with
both emacs and xemacs that there is something much more complex going
on. Anyway I commented it out, but uncomment it to see if it works for
you.

Does putting (add-hook 'remind-conf-mode-hook 'turn-on-font-lock)
in your dotemacs work? Or is that just something that everybody who uses
Xemacs does?

 And I hope to reach a state of elisp font-lock mastery so that I can
have the keywords colour up in only the first part of the line before
the MSG keyword and not afterward. But who knows when?

Sorry for not sending just a diff, but I really don't feel confident of
my diff skills.

So attached is remind-conf-mode.el

Shelagh



-- 

----------------------------------------------------------------
Jabber: [EMAIL PROTECTED]
----------------------------------------------------------------
;;; remind-conf-mode.el --- A mode to help configure remind.

;; Copyright (C) 2008  Shelagh Manton <[EMAIL PROTECTED]>

;; Author: Shelagh Manton <[EMAIL PROTECTED]> with help from
;; David F. Skoll
;; Keywords: remind configure mode
;; Version: .04

;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License
;; as published by the Free Software Foundation; either version 2
;; of the License, or (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
;; 02111-1307, USA.

;;; Commentary:

;; Use this mode to help with the configuration of remind configuration files.
;; Put (require 'remind-conf-mode) in your .emacs file
;; or (autoload 'remind-conf-mode "remind-conf-mode" "Mode to help with remind files" t)
;; also put (add-to-list 'auto-mode-alist '("\\.rem\\'" . remind-conf-mode)) and
;; (setq auto-mode-alist
;;     (cons '(".reminders$" . remind-conf-mode) auto-mode-alist))
;; want to have the mode work automatically when you open a remind configuration file.


;;; History:
;; Thu, Feb 14, 2008
;; Based mode on wpld-mode tutorial and sample-mode on emacs wiki.
;; Ideas from mupad.el for font-lock styles.

;;; Code:


(require 'font-lock); this goes in the define-derived-mode part.
;(eval-when-compile (require 'cl))

(defgroup remind-conf nil
"Options for remind-conf-mode."
:group 'remind-conf
:prefix "remind-conf-")


 ;; (defvar remind-conf-font-lock-keywords remind-conf-font-lock-keywords-3
 ;; "Default highlighting for `remind-conf-mode'.")


(defvar remind-conf-mode-hook nil
  "Hook to run in `remind-conf-mode'.")


;; keymap

(defvar remind-conf-mode-map
  (let ((remind-conf-mode-map (make-sparse-keymap)))
        remind-conf-mode-map)
  "Keymap for `remind-conf-mode'.")

(define-key remind-conf-mode-map "\C-cr" 'rem-skel)
(define-key remind-conf-mode-map "\C-ct" 'rem-today)
(define-key remind-conf-mode-map "\C-cd" 'rem-today-skel)
(define-key remind-conf-mode-map "\C-cw" 'rem-week-away)
(define-key remind-conf-mode-map "\C-cx" 'rem-tomorrow)
(define-key remind-conf-mode-map "\C-ca" 'rem-days-away)

;; syntax-table

(defvar remind-conf-syntax-table
  (let ((remind-conf-syntax-table (make-syntax-table text-mode-syntax-table)))
    ;Comments are the same as Lisp
    (modify-syntax-entry ?\; ". 1b" remind-conf-syntax-table)
    (modify-syntax-entry ?\# ". 1b" remind-conf-syntax-table)
    (modify-syntax-entry ?\n "> b" remind-conf-syntax-table)
    ;Names with _ are still one word.
    (modify-syntax-entry ?_ "w" remind-conf-syntax-table)
    (modify-syntax-entry ?. "w" remind-conf-syntax-table)
    (modify-syntax-entry ?\( "()"  remind-conf-syntax-table)
    (modify-syntax-entry ?\) ")(" remind-conf-syntax-table)
    (modify-syntax-entry ?\[ "(]"  remind-conf-syntax-table)
    (modify-syntax-entry ?\] ")[" remind-conf-syntax-table)
    remind-conf-syntax-table)
  "Syntax table for `remind-conf-mode'.")

;; faces
;;example of setting up special faces for a mode.

(defvar remind-conf-command-face 'remind-conf-command-face
  "Remind commands.")
(defface remind-conf-command-face
  '((t :foreground "SeaGreen4" :bold t))
  "Font Lock mode face used to highlight commands."
  :group 'remind-conf)

(defvar remind-conf-keyword-face 'remind-conf-keyword-face
      "Remind keywords.")
(defface remind-conf-keyword-face
  '((t :foreground "blue violet"))
  "Font Lock mode face used to highlight keywords."
  :group 'remind-conf)

(defvar remind-conf-substitutes-face 'remind-conf-substitutes-face
      "Remind substitutes.")
(defface remind-conf-substitutes-face
  '((t :foreground "blue2"))
  "Font Lock mode face used to highlight substitutes."
  :group 'remind-conf)

(defvar remind-conf-endline-face 'remind-conf-endline-face
  "Remind endline.")
(defface remind-conf-endline-face
  '((t :foreground "goldenrod2" :bold t))
  "Font Lock mode face used to highlight commands."
  :group 'remind-conf)

(defvar remind-conf-variable-face 'remind-conf-variable-face
  "Remind variable.")
(defface remind-conf-variable-face
  '((t :foreground "DeepPink2" :bold t))
  "Font Lock mode face used to highlight commands."
  :group 'remind-conf)

(defvar remind-conf-color-face 'remind-conf-color-face
  "Remind color variables.")
(defface remind-conf-color-face
  '((t :foreground "gold" :bold t))
  "Font Lock mode face used to highlight color changes."
  :group 'remind-conf)

(defvar remind-conf-delta-face 'remind-conf-delta-face
  "Remind deltas.")
(defface remind-conf-delta-face
  '((t :foreground "sandy brown" :bold t))
  "Font Lock mode face used to highlight deltas."
  :group 'remind-conf)

(defvar remind-comment-face 'remind-comment-face
  "Remind comments.")
(defface remind-comment-face
  '((t :foreground "brown"))
  "Font-lock face for highlighting comments."
  :group 'remind-conf)

(defvar remind-string-face 'remind-string-face
  "Remind strings.")
(defface remind-string-face
  '((t :foreground "salmon"))
  "Font lock mode face used to highlight strings."
  :group 'remind-conf)

(defvar remind-time-face 'remind-time-face
  "Remind time words.")
(defface remind-time-face
  '((t :foreground "LightSeaGreen" :bold t))
  "Font lock mode face to highlight time phrases."
  :group 'remind-conf)

;; keywords

(defconst remind-conf-font-lock-keywords-1
  (list
   '("^[\;\#]\\s-+.*$" . remind-comment-face)
   '("\\<\\(CAL\\|FSET\\|MS[FG]\\|OMIT\\|PS\\(?:FILE\\)?\\|R\\(?:EM\\|UN\\)\\|S\\(?:ATISFY\\|ET\\|HADE\\|PECIAL\\)\\|TRIGGER\\)\\>" . remind-conf-keyword-face)
   '("%[\"_]" . font-lock-warning-face)
   '("\\(%[a-mops-w]\\)" . remind-conf-substitutes-face)
   '("\"[^\"]*\"" . remind-string-face))
  "Minimal font-locking for `remind-conf-mode'.")

(defconst remind-conf-font-lock-keywords-2
  (append remind-conf-font-lock-keywords-1
   (list
    '("\\<\\(A\\(?:PR\\(?:IL\\)?\\|UG\\(?:UST\\)?\\)\\|DEC\\(?:EMBER\\)?\\|FEB\\(?:RUARY\\)?\\|J\\(?:AN\\(?:UARY\\)?\\|U\\(?:LY\\|NE\\|[LN]\\)\\)\\|MA\\(?:RCH\\|[RY]\\)\\|NOV\\(?:EMBER\\)?\\|OCT\\(?:OBER\\)?\\|SEP\\(?:T\\(?:EMBER\\)?\\)?\\)\\>" . remind-time-face)

    '("^SET\\s-+\\<\\(A\\(?:PR\\(?:IL\\)?\\|UG\\(?:UST\\)?\\)\\|DEC\\(?:EMBER\\)?\\|FEB\\(?:RUARY\\)?\\|J\\(?:AN\\(?:UARY\\)?\\|U\\(?:LY\\|NE\\|[LN]\\)\\)\\|MA\\(?:RCH\\|[RY]\\)\\|NOV\\(?:EMBER\\)?\\|OCT\\(?:OBER\\)?\\|SEP\\(?:T\\(?:EMBER\\)?\\)?\\)\\>" 1 remind-time-face)

    '("^\\(FRI\\(?:DAY\\)?\\|MON\\(?:DAY\\)?\\|S\\(?:AT\\(?:URDAY\\)?\\|UN\\(?:DAY\\)?\\)\\|T\\(?:HU\\(?:R\\(?:S\\(?:DAY\\)?\\)?\\)?\\|UE\\(?:S\\(?:DAY\\)?\\)?\\)\\|WED\\(?:NESDAY\\)?\\)\\>" . remind-time-face)

    '("\\<\\(FRI\\(?:DAY\\)?\\|MON\\(?:DAY\\)?\\|S\\(?:AT\\(?:URDAY\\)?\\|UN\\(?:DAY\\)?\\)\\|T\\(?:HU\\(?:R\\(?:S\\(?:DAY\\)?\\)?\\)?\\|UE\\(?:S\\(?:DAY\\)?\\)?\\)\\|WED\\(?:NESDAY\\)?\\)\\>" . remind-time-face)

    '("^SET\\s-+\\<\\(FRI\\(?:DAY\\)?\\|MON\\(?:DAY\\)?\\|S\\(?:AT\\(?:URDAY\\)?\\|UN\\(?:DAY\\)?\\)\\|T\\(?:HU\\(?:R\\(?:S\\(?:DAY\\)?\\)?\\)?\\|UE\\(?:S\\(?:DAY\\)?\\)?\\)\\|WED\\(?:NESDAY\\)?\\)\\>" 1 remind-time-face)

    '("\\<\\(A\\(?:FTER\\|T\\)\\|B\\(?:ANNER\\|EFORE\\)\\|DURATION\\|INCLUDE\\|ONCE\\|P\\(?:RIORITY\\|USH_OMIT_CONTEXT\\)\\|S\\(?:C\\(?:ANFROM\\|HED\\)\\|KIP\\)\\|TAG\\|UN\\(?:SET\\|TIL\\)\\|WARN\\)\\>" . remind-conf-command-face)
    '("%$" . remind-conf-endline-face)))
  "Additional commands to highlight in `remind-conf-mode'.")

(defconst remind-conf-font-lock-keywords-3
(append remind-conf-font-lock-keywords-2
(list
 '("\\<\\(INT\\|STRING\\|TIME\\|DATE\\)\\>" . remind-conf-type-face )
 '("\[[a-zA-Z]\\{3,6\\}\]" . remind-conf-color-face)
 '("\\s-+\\([12][0-9]\\|3[01]\\|0?[0-9]\\)\\s-+" . remind-time-face);better date regexp
 '("\\s-+\\(\\(?:20\\|19\\)[0-9][0-9]\\)\\s-+" . remind-time-face);years
 '("\\s-+\\(2[0-4]\\|[01]?[0-9][.:][0-5][0-9]\\)\\s-+" . remind-time-face);24hour clock, more precise
 '("\\s-+\\([+-][+-]?[1-9][0-9]*\\)\\s-+" 1 remind-conf-delta-face prepend)
 '("\\<\$[A-Za-z]+\\>" . remind-conf-variable-face)))
"The ultimate in highlighting experiences for `remind-conf-mode'.")
	
(defcustom remind-conf-font-lock-keywords 'remind-conf-font-lock-keywords-3
"Font-lock highlighting level for `remind-conf-mode'."
:group 'remind-conf
:type '(choice (const :tag "Barest minimum of highlighting." remind-conf-font-lock-keywords-1)
	       (const :tag "Medium highlighting." remind-conf-font-lock-keywords-2)
	       (const :tag "Highlighting deluxe." remind-conf-font-lock-keywords-3)))


;; thank goodness we don't have to worry about indentation.

;; however I can do a couple of skeletons for convenience of new users.

(define-skeleton rem-skel
  "Skeleton to insert a rem line in a remind configuration file."
  nil
  "REM "(skeleton-read "Date? " )
  ("Optional: How many days ahead? " " +" str )
resume:
  ("Optional: At what time? Format eg 13:00. " " AT " str)
resume:
  ("Optional: How many minutes ahead? " " +" str )
resume:
  ("Optional: At what priority? eg 0-9999" " PRIORITY " str )
resume:
  " MSG %\"" (skeleton-read "Your message? " )"%b%\"%" \n
  )

(define-skeleton rem-today-skel
  "Skeleton to insert a line for today's date."
  nil
  "REM " (format-time-string "%d %b %Y")
  ("Optional: At what time? Format eg 13:20. " " AT " str)
resume:
  ("Optional: How many minutes ahead? " " +" str )
resume:
  ("Optional: At what priority? eg 0-9999" " PRIORITY " str )
resume:
  " MSG " (skeleton-read "Your message? " )"%b.%" \n
  )

(defun rem-today ()
  "Insert the date for today in a remind friendly style."
(interactive)
  (insert (format-time-string "%e %b %Y")))

(defun rem-tomorrow ()
  "Insert tomorrow's date in a remind friendly style."
(interactive)
(insert (format-time-string "%e %b %Y" (time-add (current-time) (days-to-time 1)))))

(defun rem-days-away (arg)
  "Insert a day N number of days in the future.
Takes a prefix argument, but defaults to 4."
(interactive "nHow many Days?: ")
(insert (format-time-string "%e %b %Y" (time-add (current-time) (days-to-time arg)))))

(defun rem-week-away ()
"Insert a day 7 days in the future."
(interactive)
(insert (format-time-string "%e %b %Y" (time-add (current-time) (days-to-time 7)))))

(setq skeleton-end-hook nil)

;; finally the derived mode.

;;;###autoload
(define-derived-mode remind-conf-mode text-mode "remind-conf-mode"
  "Major mode for editing remind calendar configuration files."
  :syntax-table remind-conf-syntax-table
  (set (make-local-variable 'font-lock-defaults) '(remind-conf-font-lock-keywords))
  (set (make-local-variable 'font-lock-keywords-case-fold-search) 't)
  (set (make-local-variable 'comment-start) ";")
  (set (make-local-variable 'comment-start) "#")
  (set (make-local-variable 'comment-end) "\n")
  (set (make-local-variable 'fill-column) '100);cause I was having problems with autofill.
  (set (make-local-variable 'auto-fill-mode) -1); I did this as I was having trouble with autofill. YMMV.
  (use-local-map remind-conf-mode-map)
  )

(provide 'remind-conf-mode)
;;; remind-conf-mode.el ends here


_______________________________________________
Remind-fans mailing list
[email protected]
http://lists.whatexit.org/mailman/listinfo/remind-fans

Reply via email to