cvsuser 04/10/03 07:52:41
Modified: editor pir-mode.el
Log:
- courtesy of John Paul Wallington <[EMAIL PROTECTED]>
- fix pir-mode for xemacs
- various bugfixes and cleanups
Revision Changes Path
1.3 +122 -116 parrot/editor/pir-mode.el
Index: pir-mode.el
===================================================================
RCS file: /cvs/public/parrot/editor/pir-mode.el,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -w -r1.2 -r1.3
--- pir-mode.el 17 Aug 2004 14:59:49 -0000 1.2
+++ pir-mode.el 3 Oct 2004 14:52:40 -0000 1.3
@@ -5,19 +5,34 @@
;; This package provides Emacs support for PIR.
;; It defines PIR mode, a major mode for editing PIR code.
-;; See the documentation of `octave-mode' and `octave-help' for further
-;; information.
+;; To begin using this mode for all `.imc' files that you edit,
+;; put this file in your `load-path' and add the following lines
+;; to your `.emacs' file:
+
+;; (autoload 'pir-mode \"pir-mode\" nil t)
+;; (add-to-list 'auto-mode-alist '("\\.imc\\'" . pir-mode))
+
+;; If you have any problems with this, you're on your own,
+;; You could always try asking on [EMAIL PROTECTED]
-(require 'regexp-opt)
;;; Code:
-(add-to-list 'auto-mode-alist '("\\.imc\\'" . pir-mode))
+(require 'regexp-opt)
+(require 'cl)
-(defvar pir-mode-hook nil)
+(unless (fboundp 'line-beginning-position)
+ (defalias 'line-beginning-position 'point-at-bol))
+(unless (fboundp 'line-end-position)
+ (defalias 'line-end-position 'point-at-eol))
(defgroup pir nil
"Mode for editing PIR code."
:group 'languages)
+(defcustom pir-mode-hook nil
+ "*Hook run when entering PIR mode."
+ :type 'hook
+ :group 'pir)
+
(defcustom pir-comment-char ?#
"*The `comment-start' character assumed by PIR mode."
:type 'character
@@ -28,6 +43,35 @@
:type 'integer
:group 'pir)
+(defcustom pir-block-comment-start
+ (concat (make-string 2 pir-comment-char) " ")
+ "String to insert to start a new PIR comment on an empty line."
+ :type 'string
+ :group 'pir)
+
+(defcustom pir-auto-indent-flag nil
+ "*Non-nil means indent line after a semicolon or space in PIR mode."
+ :type 'boolean
+ :group 'pir)
+
+(defcustom pir-auto-newline nil
+ "*Non-nil means automatically newline after a semicolon in PIR mode."
+ :type 'boolean
+ :group 'pir)
+
+(defcustom pir-blink-matching-block t
+ "*Control the blinkin of matching PIR block keywords.
+Non-nil means show matching begin of block when inserting a space,
+newline or semicolon after an end keyword."
+ :type 'boolean
+ :group 'pir)
+
+(defcustom pir-basic-indent 8
+ "*Extra indentation applied to statements in PIR block structures."
+ :type 'integer
+ :group 'pir)
+
+
(defvar pir-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "\C-c;" 'pir-comment-region)
@@ -53,7 +97,6 @@
(define-key map "\C-c\M-\C-h" 'pir-mark-block)
(define-key map "\C-c]" 'pir-close-block)
(define-key map "\C-c\C-f" 'pir-insert-defun)
-
map)
"Keymap for PIR major mode.")
@@ -88,9 +131,7 @@
"Menu for PIR mode.")
-(defvar pir-mode-syntax-table nil
- "Syntax table for PIR major mode.")
-(setq pir-mode-syntax-table
+(defvar pir-mode-syntax-table
(let ((st (make-syntax-table)))
(modify-syntax-entry ?_ "w" st)
(modify-syntax-entry ?\\ "\\" st)
@@ -99,7 +140,8 @@
(modify-syntax-entry ?$ "'" st)
(modify-syntax-entry ?, "." st)
(modify-syntax-entry ?. ". p" st)
- st))
+ st)
+ "Syntax table for PIR major mode.")
(defvar pir-PMC-keyword-symbols
'("Array" "Boolean" "Compiler" "Continuation" "Coroutine" "CSub"
@@ -175,78 +217,64 @@
(defvar pir-register-regexp "[INPS]\\([12][0-9]\\|3[01]\\|[0-9]\\)")
(defvar pir-dollar-register-regexp "\\$[INPS][0-9]+")
-(defvar pir-directives)
-(setq pir-directives
+(defvar pir-directives
'("method" "non_prototyped" "prototyped" "@LOAD" "@MAIN"))
-(defvar pir-dotted-directives)
-(setq pir-dotted-directives
+(defvar pir-dotted-directives
'(".sub" ".pcc_sub" ".end" ".emit" ".eom" ".const" ".namespace"
".endnamespace" ".result" ".arg" ".return" ".include"
".pcc_begin" ".pcc_end" ".pcc_begin_return" ".pcc_end_return"
".pcc_begin_yield" ".pcc_end_yield"))
-(defvar pir-variable-declarations)
-(setq pir-variable-declarations
+(defvar pir-variable-declarations
'(".local" ".sym" ".param"))
-(defvar pir-begin-keywords)
-(setq pir-begin-keywords
+(defvar pir-begin-keywords
'(".sub" ".emit" ".pcc_begin_yield" ".pcc_begin_return"
".pcc_begin" ".namespace"))
-(defvar pir-end-keywords)
-(setq pir-end-keywords
+(defvar pir-end-keywords
'(".end" ".eom" ".pcc_end_yield" ".pcc_end_return"
".pcc_end" ".endnamespace"))
-(defvar pir-block-match-alist)
-(setq pir-block-match-alist
+(defvar pir-block-match-alist
'((".sub" ".end" 1)
(".emit" ".eom" 1)
(".pcc_begin_yield" ".pcc_end_yield" 0)
(".pcc_begin_return" ".pcc_end_return" 0)
(".pcc_begin" ".pcc_end" 0)
- (".namespace" ".endnamespace" 0)))
-; "Alist with IMCC's matching block keywords.
-;Has IMCC's begin keywords as keys and a list of the matching end keywords as
-;associated values.")
+ (".namespace" ".endnamespace" 0))
+ "Alist of IMCC's matching block keywords.
+Has IMCC's begin keywords as keys and a list of the matching end keywords as
+associated values.")
-(defvar pir-block-offset-alist)
-(setq pir-block-offset-alist
+(defvar pir-block-offset-alist
(mapcan (lambda (blockspec)
(let ((offset (caddr blockspec)))
`((,(car blockspec) . ,offset)
(,(cadr blockspec) . ,offset))))
pir-block-match-alist))
-(defvar pir-open-directives)
-(setq pir-open-directives
+(defvar pir-open-directives
(mapcar #'car pir-block-match-alist))
-(defvar pir-close-directives)
-(setq pir-close-directives
+(defvar pir-close-directives
(mapcar #'cadr pir-block-match-alist))
-(defvar pir-block-begin-regexp)
-(setq pir-block-begin-regexp
+(defvar pir-block-begin-regexp
(regexp-opt pir-begin-keywords 'paren))
-(defvar pir-block-end-regexp)
-(setq pir-block-end-regexp
+
+(defvar pir-block-end-regexp
(regexp-opt pir-end-keywords 'paren))
-(defvar pir-block-begin-or-end-regexp)
-(setq pir-block-begin-or-end-regexp
+
+(defvar pir-block-begin-or-end-regexp
(concat "\\(?:"pir-block-begin-regexp "\\|"
pir-block-end-regexp "\\)"))
-(defvar pir-function-header-regexp)
-(setq pir-function-header-regexp
- "\\.\\(.sub\\)\\s-+\\(\\sw+\\)")
-; "Regexp to match a PIR function header.")
-
+(defvar pir-function-header-regexp "\\.\\(.sub\\)\\s-+\\(\\sw+\\)"
+ "Regexp to match a PIR function header.")
-(defvar pir-font-lock-keywords)
-(setq pir-font-lock-keywords
+(defvar pir-font-lock-keywords
`((,(concat "^\\s *\\(.sub\\)\\s +\\(\\sw+\\)"
"\\(\\s +" (regexp-opt pir-directives 'paren) "\\)?")
(1 font-lock-keyword-face)
@@ -270,26 +298,9 @@
(,pir-register-regexp . font-lock-variable-name-face)
(,(regexp-opt pir-dotted-directives 'paren) . font-lock-keyword-face)
(,(regexp-opt pir-ops 'words) . font-lock-keyword-face)
- ("\\s-*\\(\\sw+\\)\\s=*"
- (1 font-lock-variable-name-face))
- ))
-
-(defcustom pir-auto-indent-flag nil
- "*Non-nil means indent line after a semicolon or space in PIR mode."
- :type 'boolean
- :group 'pir)
-
-(defcustom pir-blink-matching-block t
- "*Control the blinkin of matching PIR block keywords.
-Non-nil means show matching begin of block when inserting a space,
-newline or semicolon after an end keyword."
- :type 'boolean
- :group 'pir)
-
-(defcustom pir-basic-indent 8
- "*Extra indentation applied to statements in PIR block structures."
- :type 'integer
- :group 'pir)
+ ("\\s-*\\(\\sw+\\)\\s-*"
+ (1 font-lock-variable-name-face)))
+ "Expressions to highlight in PIR mode.")
(defvar pir-imenu-generic-expression
(list
@@ -377,7 +388,7 @@
Keybindings
===========
-\\{octave-mode-map}
+\\{pir-mode-map}
Variables you can use to customize PIR mode
===========================================
@@ -399,8 +410,7 @@
following lines to your `.emacs' file:
(autoload 'pir-mode \"pir-mode\" nil t)
- (setq auto-mode-alist
- (cons '(\"\\\\.imc$\" . pir-mode) auto-mode-alist))
+ (add-to-list 'auto-mode-alist '(\"\\\\.imc\\\\'\" . pir-mode))
If you have any problems with this, you're on your own. You could always
try asking on [EMAIL PROTECTED]"
@@ -414,7 +424,7 @@
(setlocalq font-lock-defaults '(pir-font-lock-keywords))
(setlocalq indent-line-function 'pir-indent-line)
- (setlocalq pir-mode-basic-indent 'pir-mode-basic-indent)
+ (setlocalq pir-basic-indent pir-basic-indent)
(setlocalq require-final-newline t)
(setlocalq comment-start "# ")
@@ -431,8 +441,6 @@
(setlocalq adaptive-fill-regexp nil)
(setlocalq fill-column 72)
- (setlocalq font-lock-defaults '(pir-font-lock-keywords))
-
(setlocalq imenu-generic-expression pir-imenu-generic-expression)
(setq imenu-case-fold-search nil)
@@ -509,7 +517,7 @@
"Uncomment each line in the region as PIR code."
(interactive "r\nP")
(or arg (setq arg1))
- (octave-comment-region beg end (- arg)))
+ (pir-comment-region beg end (- arg)))
;;; Indentation
@@ -1163,8 +1171,6 @@
(easy-menu-add pir-mode-menu-map pir-mode-map))
-
-(provide 'pir-mode)
(provide 'pir-mode)
;;; pir-mode.el ends here