(defvar me-italics-toggle nil "*me-mode italics toggle")
(defvar me-quotes-toggle nil "*me-mode quotes toggle")
(defvar me-bold-toggle nil "*me-mode bold toggle")
(defvar me-courier-toggle nil "*me-mode courier toggle")
(defvar me-ref-toggle nil "*me-mode ref toggle")
(defvar me-subscript-toggle nil "*me-mode subscript toggle")
(defvar me-alltt-toggle nil "*me-mode alltt toggle")

(defvar enum-item-spacing "\n" "*")
(defvar enuming nil "*Are we enuming or listing?")
(defvar in-me-list-toggle nil "*")
(defvar in-me-enum-toggle nil "*")

(defun 
    begin/end-me-italics () (interactive)
	(if (toggle-var 'me-italics-toggle)
	    (insert-string (concat "\\fI"))
	    (insert-string (concat "\\fP"))
	)
)

(defun 
    begin/end-me-quotes () (interactive)
	(if (toggle-var 'me-quotes-toggle)
	    (insert-string "``")
	    (insert-string "''")
	)
)

(defun
    begin/end-me-bold () (interactive)
	(if (toggle-var 'me-bold-toggle)
	    (insert-string "\\fB")
	    (insert-string "\\fP")
	)
)

(defun
    begin/end-me-courier () (interactive)
	(if (toggle-var 'me-courier-toggle)
	    (insert-string "\\fC")
	    (insert-string "\\fP")
	)
)

(defun
    begin/end-me-ref () (interactive)
	(if (toggle-var 'me-ref-toggle)
	    (insert-string ".[ [\n")
	    (insert-string ".]]\n")
	)
)

(defun 
    begin/end-me-subscript () (interactive)
	(if (toggle-var 'me-subscript-toggle)
	    (insert-string "\\*<")
	    (insert-string "\\*>")
	)
)

(defun
    insert-bullet-item  () (interactive)
	(insert-string
	    (concat (int-to-string enum-item-spacing)
		    "\\.ee\n"
	    )
	)
	(previous-line 1)
)

;(defun 
;    check-match-of-me-font-changes
;	(while 1
;	       (if (error-occured
;		       (re-search-forward "\\fB\\|\\fI"))
;		   (progn   
;		       (beginning-of-buffer)
;		       (error "Font changes match OK")
;		   )
;	       )
;	       (search-forward "\\f")
;	       (if (/= (following-char) 'P')
;		   (error "Font change mismatch")
;	       )
;	)
;)

(defvar list-item-spacing 3 "*")
(defvar enum-item-spacing 3 "*")
(defvar list-item ".sp .3v\n.le\n" "*")
(defvar enum-item ".sp .3v\n.ee\n" "*")

(defun set-list-item-spacing (a1)
        (interactive "slist item spacing: ")
	(setq list-item-spacing a1)
	(setq enum-item-spacing list-item-spacing)
	(setq list-item (concat ".sp ." (int-to-string list-item-spacing)
				"v\n.le\n"))
	(setq enum-item (concat ".sp ." (int-to-string enum-item-spacing)
				"v\n.ee\n"))
)

(defun 
    insert-list-item (sp) (interactive "P")
        (if (not (null sp))
	    (set-list-item-spacing sp)
	)
	(insert-string
	    (if enuming
		enum-item
		list-item
	    )
	)
)

	    

(defun 
    Es (sp) (interactive "P")
       (setq enuming t)
       (if (not (null sp))
	   (set-list-item-spacing sp)
       )
       (insert-string
	   (concat ".(l F\n.(E\n"
		   enum-item
	   )
       )
)
(defun 
    Ee () (interactive)
       (insert-string (concat \ "EndEnum\n"))
       (local-unset-ket "")
)

(defun 
    Ls (sp) (interactive "P")
       (setq enuming nil)			;i.e., we're listing now
       (if (not (null sp))
	   (set-list-item-spacing sp)
       ) 
       (insert-string
	   (concat ".(l F\n.(L 1\n"
		   list-item
	   )
       )
)
(defun 
    Le () (interactive)
       (insert-string ".)L 1\n.)l F\n")
)

(defun 
    begin/end-me-list () (interactive)
	(if (toggle-var 'in-me-list-toggle)
	    (Ls)
	    (Le)
	)
)

(defun 
    begin/end-me-enum () (interactive)
	(if (toggle-var "in-me-enum-toggle")
	    (Es)
	    (Ee)
	)
)

(defun
  insert-me-list-template (sp)
  (interactive "P")
	(setq enuming nil)			;i.e., we`re listing now
	(if (null sp)
	  (insert-me-list-template-1 "1")
	   (progn
	     (set-list-item-spacing sp)
	     (call-interactively 'insert-me-list-template-1)
           )
	)
)
(defun
    insert-me-list-template-1 (af)
    (interactive "sType of list (I, A, 1, a, i): ")
        (if (string= af "") (setq af 1))
	(insert-string 
	    ".(L " af "\n"
	    list-item
	    "\n"
	    ".)L " af "\n"
	)
	(previous-line 2)
)

;The following doesnt work currently due to some misunderstanding of and/or
;bug in gosmacs lisp parm passing.
;(defun 
;    (insert-indented-me-list-template-bogus af
;	(insert-string ".(l F\n")
;	(if prefix-argument-provided
;	    (provide-prefix-argument prefix-argument
;		(insert-me-list-template af))
;	    (insert-me-list-template af)
;	)
;	(next-line) (next-line)
;	(insert-string ".)l F\n")
;	(previous-line) (previous-line) (previous-line)
;    )
;)

(defun 
    insert-indented-me-list-template () (interactive)
	(insert-string ".(l F\n")
	(call-interactively 'insert-me-list-template)
	(next-line 2)
	(insert-string ".)l F\n")
	(previous-line 3)
)


(defun 
    insert-me-enum-template () (interactive)
	(setq enuming t)
	(insert-string 
	    ".(E\n"
	    enum-item
	    "\n"
	    ".)E\n"
	)
	(previous-line 2)
)

(defun 
    insert-indented-me-enum-template () (interactive)
	(insert-string ".(l F\n")
	(insert-me-enum-template)
	(next-line 2)
	(insert-string ".)l F\n")
	(previous-line 3)
)

(defun 
    insert-me-alltt-template () (interactive)
	(insert-string 
	    ".(l F\n"
	    "\n"
	    ".)l F\n"
	)
	(previous-line 2)
)

(defun 
    insert-me-section (s)
      (interactive "NSection depth: ")
	(if (= s 1)
	    (insert-string ".sh 1 \"\"")
	    (if (= s 2)
		(insert-string ".sh 2 \"\"")
		(if (= s 3)
		    (insert-string ".sh 3 \"\"")
		    (if (= s 4)
			(insert-string ".sh 4 \"\"")
		        (error "Section depth must be between 1 and 5")
		    )
		)
	    )
	)
;	(insert-string "\\indent")
	(backward-char 1)
)

(defun 
    insert-me-center-template () (interactive)
	(insert-string 
	    ".ce 100\n"
	    "\n"
	    ".ce 0\n"
	)
	(previous-line 2)
)

(defun 
    insert-me-verbatim-template () (interactive)
	(insert-string 
	    ".nf\n.na\n"
	    "\n"
	    ".fi\n.ad\n"
	)
	(previous-line 3)
)

(defun my-nroff-mode ()
    (interactive)
    (read-abbrev-file "~gfisher/emacs/lib/text-mode-abbrev-table")
    (setq nroff-mode-abbrev-table text-mode-abbrev-table)
    (nroff-mode)
    (abbrev-mode 1)
    ;Remove some of gnu's funky nroff-mode bindings:
    (local-unset-key "p")
    (local-unset-key "n")
    (local-unset-key "s")

    ;My bindings:
	(local-set-key "'" 'begin/end-me-italics)
	(local-set-key "\"" 'begin/end-me-quotes)
	(local-set-key "_" 'begin/end-me-bold)
	(local-set-key ";" 'begin/end-me-courier)
	(local-set-key "[" 'begin/end-me-ref)
	(local-set-key ";" 'begin/end-me-subscript)
	(local-set-key "i" 'insert-list-item)
	(local-set-key " " 'set-list-item-spacing)
	;(local-set-key "begin/end-me-list" "\^xL")
	;(local-set-key "begin/end-me-enum" "\^xE")
	(local-set-key "L" 'insert-me-list-template)
	(local-set-key "E" 'insert-me-enum-template)
	(local-set-key "I" 'insert-indented-me-enum-template)
	(local-set-key "K" 'insert-indented-me-list-template)
	(local-set-key "A" 'insert-me-alltt-template)
	(local-set-key "S" 'insert-me-section)
	(local-set-key "C" 'insert-me-center-template)
	(local-set-key "V" 'insert-me-verbatim-template)
;	(Remove-local-binding "\e/")
 	(setq fill-prefix nil)
	(setq fill-column 79)
	(auto-fill-mode 1)
	(setq case-fold-search nil)
	(setq truncate-lines nil)
	(setq mode-name "my-nroff-me")
)