;;; lines-mode.el --- LifeLines code editing commands for Emacs ;; Copyright (C) 1996, Marc Nozell ;; ;; Marc Nozell V0.01 18-Nov-1996 ;; ;; Maintainer: Marc Nozell ;; Keywords: unix, genealogy, lifelies, languages ;;; Todo: ;;; * Optimize the regexp for keywords ;;; * Handle colorizing C-style comments. (borrow from c-mode.el) ;;; * Convince ^I to properly indent (borrow from c-mode.el?) ;;; ;;; Code: ;; To enter lines-mode automatically, add (autoload 'lines-mode "lines-mode") ;; to your .emacs file and change the first line of your lines script to: ;; /* -*-lines-*- */ ;; ;; To handle files included with do 'filename.ll';, add something like ;; (setq auto-mode-alist (append (list (cons "\\.ll\\'" 'lines-mode)) ;; auto-mode-alist)) ;; to your .emacs file ;;; Code: (defvar lines-mode-abbrev-table nil "Abbrev table in use in lines-mode buffers.") (define-abbrev-table 'lines-mode-abbrev-table ()) (defvar lines-mode-map () "Keymap used in Lines mode.") (if lines-mode-map () (setq lines-mode-map (make-sparse-keymap)) (set-keymap-name lines-mode-map 'lines-mode-map) ;; (define-key lines-mode-map "{" 'electric-lines-terminator) ;; (define-key lines-mode-map "}" 'electric-lines-terminator) ;; (define-key lines-mode-map ";" 'electric-lines-terminator) ) (defvar lines-mode-syntax-table nil "Syntax table in use in lines-mode buffers.") (if lines-mode-syntax-table () (setq lines-mode-syntax-table (make-syntax-table (standard-syntax-table))) (modify-syntax-entry ?\n ">" lines-mode-syntax-table) ) ;;; ;;; This needs to be optimized... ;;; (defvar lines-font-lock-keywords (purecopy (list (concat "\\<\\(" "continue\\|e\\(ls\\(e\\|if\\)\\|x\\(ec\\|it\\)\\)\\|" "for\\(\\|each\\)\\|goto\\|if\\|l\\(ast\\|ocal\\)\\|global\\|" "proc\\|call\\|getstrmsg\\|set\\|nl\\|newfile\\|call\\|copyfile\\|" "save\\|gettoday\\|year\\|concat\\|" "return\\|while\\|" "add\\|" "addnode\\|" "addtoset\\|" ;; "add\\(toset\\)\\|\\(node\\)" "alpha\\|" "ancestorset\\|" "and\\|" "atoi\\|" "baptism\\|" "birth\\|" "burial\\|" "capitalize\\|" "card\\|" "child\\|" "childset\\|" ;; "choosechild\\|" ;; "choosefam\\|" ;; "chooseindi\\|" ;; "choosespouse\\|" ;; "choosesubset\\|" "choose\\(child\\)\\|\\(fam\\)\\|\\(indi\\)\\|\\(spouse\\)\\|\\(subset\\)\\|" "col\\|" "concat\\|" "copyfile\\|" "createnode\\|" "d\\|" "database\\|" "date\\|" "dateformat\\|" "dayformat\\|" "death\\|" "decr\\|" ;; "deletefromset\\|" ;; "deletenode\\|" "delete\\(fromset\\)\\|\\(node\\)\\|" "dequeue\\|" "dereference\\|" ;; "descendantset\\|" ;; "descendentset\\|" "descend\\[ae\\]ntset\\|" "difference\\|" "div\\|" "empty\\|" "enqueue\\|" "eq\\|" "eqstr\\|" "exp\\|" ;; "extractdate\\|" ;; "extractnames\\|" ;; "extractplaces\\|" ;; "extracttokens\\|" "extract\\(date\\)\\|\\(names\\)\\|\\(places\\)\\|\\(tokens\\)\\|" "fam\\|" "father\\|" "female\\|" ;; "firstchild\\|" ;; "firstfam\\|" ;; "firstindi\\|" "first\\(child\\)\\|\\(fam\\)\\|\\(indi\\)\\|" "fnode\\|" "fullname\\|" "ge\\|" "gengedcom\\|" "genindiset\\|" ;; "getel\\|" ;; "getfam\\|" ;; "getindi\\|" ;; "getindimsg\\|" ;; "getindiset\\|" ;; "getint\\|" ;; "getintmsg\\|" ;; "getrecord\\|" ;; "getstr\\|" ;; "getstrmsg\\|" ;; "gettoday\\|" "get\\(el\\)\\|\\(fam\\)\\|\\(indi\\)\\|\\(indimsg\\)\\|\\(indiset\\)\\|\\(int\\)\\|\\(intmsg\\)\\|\\(record\\)\\|\\(str\\)\\|\\(strmsg\\)\\|\\(today\\)\\|" "givens\\|" "gt\\|" "husband\\|" "incr\\|" "index\\|" "indi\\|" "indiset\\|" "inode\\|" "insert\\|" "intersect\\|" "key\\|" "keysort\\|" "lastchild\\|" "le\\|" "length\\|" "lengthset\\|" "linemode\\|" "list\\|" "lock\\|" "long\\|" "lookup\\|" "lower\\|" "lt\\|" "male\\|" "marriage\\|" "menuchoose\\|" "mod\\|" "monthformat\\|" "mother\\|" "mul\\|" "name\\|" "namesort\\|" "nchildren\\|" "ne\\|" "neg\\|" "nestr\\|" "newfile\\|" ;; "nextfam\\|" ;; "nextindi\\|" ;; "nextsib\\|" "next\\(fam\\)\\|\\(indi\\)\\|\\(sib\\)\\|" "nfamilies\\|" "nl\\|" "not\\|" "nspouses\\|" "or\\|" "ord\\|" "outfile\\|" "pagemode\\|" "pageout\\|" "parent\\|" "parents\\|" "parentset\\|" "place\\|" "pn\\|" "pop\\|" "pos\\|" "prevfam\\|" "previndi\\|" "prevsib\\|" "print\\|" "push\\|" "qt\\|" "reference\\|" "requeue\\|" "rjustify\\|" "roman\\|" "root\\|" "row\\|" "save\\|" "savenode\\|" "set\\|" "setel\\|" "sex\\|" "short\\|" "sibling\\|" "siblingset\\|" "soundex\\|" "sp\\|" "spouseset\\|" "stddate\\|" "strcmp\\|" "strconcat\\|" "strlen\\|" "strsave\\|" "strsoundex\\|" "strtoint\\|" "sub\\|" "substring\\|" "surname\\|" "system\\|" "table\\|" "tag\\|" "title\\|" "trim\\|" "trimname\\|" "union\\|" "uniqueset\\|" "unlock\\|" "upper\\|" "value\\|" "valuesort\\|" "version\\|" "wife\\|" "xref\\|" "year\\|" "\\)\\>") '("^[ \n\t]*sub[ \t]+\\([^ \t{]+\\)[ \t]*[{]" 1 font-lock-function-name-face) '("[ \n\t{]*\\(eval\\)[ \n\t(;]" 1 font-lock-function-name-face) '("\\(--- .* ---\\|=== .* ===\\)" . font-lock-string-face) )) "Additional expressions to highlight in Lines mode.") (put 'lines-mode 'font-lock-defaults '(lines-font-lock-keywords)) (defvar lines-mode-hook nil "Invoked on entry to lines-mode.") ;;;###autoload (defun lines-mode () "Major mode for editing Lines code. Turning on Lines mode runs the normal hook `lines-mode-hook'." (interactive) (kill-all-local-variables) (use-local-map lines-mode-map) (setq major-mode 'lines-mode) (setq mode-name "Lines") (setq local-abbrev-table lines-mode-abbrev-table) (set-syntax-table lines-mode-syntax-table) (make-local-variable 'comment-start) (setq comment-start "/* ") (make-local-variable 'comment-end) (setq comment-end " */") (make-local-variable 'comment-column) (setq comment-column 32) (make-local-variable 'comment-start-skip) (setq comment-start-skip "\\(^\\|\\s-\\);?#+ *") )