> > There are further changes I would like to make to pir-mode.el, mostly > > simple bug-fixes and clean-ups. > > Then, send the whole patch and I'll apply it for you.
Here you go: --- pir-mode.el 17 Aug 2004 15:59:49 +0100 1.2 +++ pir-mode.el 03 Oct 2004 15:03:28 +0100 @@ -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 @@ -27,7 +42,36 @@ "*The default comment column for PIR code." :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,127 +217,96 @@ (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 - '("method" "non_prototyped" "prototyped" "@LOAD" "@MAIN")) +(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 - '(".local" ".sym" ".param")) +(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.") - -(defvar pir-block-offset-alist) -(setq pir-block-offset-alist - (mapcan (lambda (blockspec) - (let ((offset (caddr blockspec))) - `((,(car blockspec) . ,offset) - (,(cadr blockspec) . ,offset)))) - pir-block-match-alist)) + (".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 + (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 - (regexp-opt pir-begin-keywords 'paren)) -(defvar pir-block-end-regexp) -(setq pir-block-end-regexp - (regexp-opt pir-end-keywords 'paren)) -(defvar pir-block-begin-or-end-regexp) -(setq 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-font-lock-keywords) -(setq pir-font-lock-keywords - `((,(concat "^\\s *\\(.sub\\)\\s +\\(\\sw+\\)" - "\\(\\s +" (regexp-opt pir-directives 'paren) "\\)?") - (1 font-lock-keyword-face) - (2 font-lock-function-name-face t t) - (4 font-lock-keyword-face t t)) - (,(concat "\\s-*" (regexp-opt pir-variable-declarations 'paren) - "\\(?:\\s +" (regexp-opt pir-type-keywords 'paren) - "\\(?:\\s +\\(\\sw+\\)\\)?\\)?") - (1 font-lock-keyword-face) - (2 font-lock-type-face nil t) - (3 font-lock-variable-name-face nil t)) - (,(concat "^\\s *\\(.const\\)\\s +" - (regexp-opt pir-type-keywords 'paren) - "\\(\\s +\\(\\sw+\\)\\)?") - (1 font-lock-keyword-face) - (2 font-lock-type-face nil t) - (4 font-lock-constant-face nil t)) - (,pir-block-begin-or-end-regexp . font-lock-keyword-face) - - (,pir-dollar-register-regexp . font-lock-variable-name-face) - (,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) +(defvar pir-block-begin-regexp + (regexp-opt pir-begin-keywords 'paren)) -(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) +(defvar pir-block-end-regexp + (regexp-opt pir-end-keywords 'paren)) -(defcustom pir-basic-indent 8 - "*Extra indentation applied to statements in PIR block structures." - :type 'integer - :group 'pir) +(defvar pir-block-begin-or-end-regexp + (concat "\\(?:" pir-block-begin-regexp "\\|" + pir-block-end-regexp "\\)")) + +(defvar pir-function-header-regexp "\\.\\(.sub\\)\\s-+\\(\\sw+\\)" + "Regexp to match a PIR function header.") + +(defvar pir-font-lock-keywords + `((,(concat "^\\s *\\(.sub\\)\\s +\\(\\sw+\\)" + "\\(\\s +" (regexp-opt pir-directives 'paren) "\\)?") + (1 font-lock-keyword-face) + (2 font-lock-function-name-face t t) + (4 font-lock-keyword-face t t)) + (,(concat "\\s-*" (regexp-opt pir-variable-declarations 'paren) + "\\(?:\\s +" (regexp-opt pir-type-keywords 'paren) + "\\(?:\\s +\\(\\sw+\\)\\)?\\)?") + (1 font-lock-keyword-face) + (2 font-lock-type-face nil t) + (3 font-lock-variable-name-face nil t)) + (,(concat "^\\s *\\(.const\\)\\s +" + (regexp-opt pir-type-keywords 'paren) + "\\(\\s +\\(\\sw+\\)\\)?") + (1 font-lock-keyword-face) + (2 font-lock-type-face nil t) + (4 font-lock-constant-face nil t)) + (,pir-block-begin-or-end-regexp . font-lock-keyword-face) + + (,pir-dollar-register-regexp . font-lock-variable-name-face) + (,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))) + "Expressions to highlight in PIR mode.") (defvar pir-imenu-generic-expression (list (list nil pir-function-header-regexp 2)) "Imenu expression for PIR mode. See `imenu-generic-expression'.") - + (defun pir-comment () "Convert an empty comment to a `larger' kind, or start a new one. These are the known comment classes: @@ -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]" @@ -409,14 +419,14 @@ (use-local-map pir-mode-map) (setq major-mode 'pir-mode) (setq mode-name "PIR") - + (set-syntax-table pir-mode-syntax-table) - + (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 "# ") (setlocalq comment-end "") (setlocalq comment-column pir-comment-column) @@ -430,8 +440,6 @@ (setlocalq fill-paragraph-function 'pir-fill-paragraph) (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) @@ -440,7 +448,7 @@ (pir-initialize-completions) (pir-add-pir-menu) - + (run-hooks 'pir-mode-hook)) (defun pir-describe-major-mode () @@ -508,8 +516,8 @@ (defun pir-uncomment-region (beg end &optional arg) "Uncomment each line in the region as PIR code." (interactive "r\nP") - (or arg (setq arg1)) - (octave-comment-region beg end (- arg))) + (or arg (setq arg 1)) + (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