Mercurial > hg > xemacs-beta
diff lisp/modes/rexx-mode.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 0293115a14e9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/modes/rexx-mode.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,599 @@ +;;; rexx-mode.el --- major mode for editing REXX program files +;; Keywords: languages + +;; Copyright (C) 1993 by Anders Lindgren. + +;; This file is part of XEmacs. + +;; XEmacs 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, or (at your option) +;; any later version. + +;; XEmacs 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 XEmacs; see the file COPYING. If not, write to the Free +;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Synched up with: Not in FSF. + +;;; AUTHOR +;;; Anders Lindgren, d91ali@csd.uu.se +;;; +;;; Abbrevationtable due to: +;;; Johan Bergkvist, nv91-jbe@nada.kth.se +;;; +;;; USAGE +;;; This file contains code for a GNU Emacs major mode for +;;; editing REXX program files. +;;; +;;; Type C-h m in Emacs for information on how to configurate +;;; the rexx-mode, or see rexx-mode.doc. +;;; +;;; Put the following lines into your .emacs and rexx-mode +;;; will be automatically loaded when editing a REXX program. +;;; If rexx-mode shall be used for files with other extensions +;;; you can create more (cons ...) lines with these extensions. +;;; +;;; (autoload 'rexx-mode "rexx-mode" "REXX mode" nil t) +;;; (setq auto-mode-alist +;;; (append +;;; (list (cons "\\.rexx$" 'rexx-mode) +;;; (cons "\\.elx$" 'rexx-mode) +;;; (cons "\\.ncomm$" 'rexx-mode) +;;; (cons "\\.cpr$" 'rexx-mode) +;;; ) +;;; auto-mode-alist)) +;;; +;;; HISTORY +;;; 93-01-07 V0.1 ALi Works for the first time. +;;; 92-01-11 V0.2 ALi rexx-calc-indent totally rewritten. +;;; 93-03-08 V0.3 JB rexx-indent-and-newline-and-indent added. +;;; Abbrev-table containing 173 entries created. +;;; rexx-check-expansion added. +;;; rexx-mode enables use of abbrev-table. +;;; 93-03-15 V0.4 ALi abbrev-mode removed, better to call +;;; (abbrev-mode 1) from the hook. +;;; case-fold-search set to t to recognize capital +;;; letters in keywords. +;;; Old (setq case-fold-search nil) removed which +;;; prevented the recognition of END. +;;; rexx-indent-and-newline-and-indent renamed to +;;; rexx-indent-newline-indent. +;;; rexx-i-n-i now only expands abbrevs when +;;; buffer is in abbrev-mode. +;;; New rexx-newline-and-indent added. +;;; 93-03-20 ALi A serious bug in the routine for checking +;;; strings and comments found and fixed. +;;; V1.0 Relesed! +;;; + + +(provide 'rexx-mode) + +(defconst rexx-indent 8 + "*This variable contains the indentation in rexx-mode.") + +(defconst rexx-end-indent 0 + "*This variable indicates the relative position of the \"end\" in REXX mode.") + +(defconst rexx-cont-indent 8 + "*This variable indicates how far a continued line shall be intended.") + +(defconst rexx-comment-col 32 + "*This variable gives the desired comment column +for comments to the right of text.") + +(defconst rexx-tab-always-indent t + "*Non-nil means TAB in REXX mode should always reindent the current line, +regardless of where in the line point is when the TAB command is used.") + +(defconst rexx-special-regexp + ".*\\(,\\|then\\|else\\)[ \t]*\\(/\\*.*\\*/\\)?[ \t]*$" + "*Regular expression for parsing lines which shall be followed by +a extra indention") + +(defconst rexx-font-lock-keywords + (purecopy + (list + (cons (concat "\\<\\(" + (mapconcat 'identity + '("address" "arg" "break" "call" "do" "drop" "echo" "else" "end" + "exit" "if" "interpret" "iterate" "leave" "nop" "numeric" + "options" "otherwise" "parse" "procedure" "pull" "push" "queue" + "return" "say" "select" "shell" "signal" "then" "trace" "upper" + "when" "value" "to" "by" "for" "forever" "while" "until" "form" + "digits" "fuzz" "scientific" "engineering" "failat" "prompt" + "results" "upper" "external" "source" "with" "command" + "function" "var" "version" "expose" "on" "off") + "\\|") "\\)\\>") 'font-lock-keyword-face) + '("\\(\\sw+\\):" 1 font-lock-function-name-face))) + "Additional expressions to highlight in Rexx mode.") +(put 'rexx-mode 'font-lock-defaults '(rexx-font-lock-keywords)) + +(defvar rexx-mode-map nil + "Keymap for rexx-mode.") +(if rexx-mode-map + nil + (setq rexx-mode-map (make-sparse-keymap)) + (define-key rexx-mode-map "\t" 'rexx-indent-command) + (define-key rexx-mode-map "\C-m" 'rexx-indent-and-newline) + (define-key rexx-mode-map 'backspace 'backward-delete-char-untabify) + (define-key rexx-mode-map "\C-c\C-p" 'rexx-find-matching-do) + (define-key rexx-mode-map "\C-c\C-c" 'rexx-debug) + ) + +(defvar rexx-mode-syntax-table nil + "Syntax table in use in REXX-mode buffers.") + +(if rexx-mode-syntax-table + () + (setq rexx-mode-syntax-table (make-syntax-table)) + (modify-syntax-entry ?\\ "\\" rexx-mode-syntax-table) + (modify-syntax-entry ?/ ". 14" rexx-mode-syntax-table) + (modify-syntax-entry ?* ". 23" rexx-mode-syntax-table) + (modify-syntax-entry ?+ "." rexx-mode-syntax-table) + (modify-syntax-entry ?- "." rexx-mode-syntax-table) + (modify-syntax-entry ?= "." rexx-mode-syntax-table) + (modify-syntax-entry ?% "." rexx-mode-syntax-table) + (modify-syntax-entry ?< "." rexx-mode-syntax-table) + (modify-syntax-entry ?> "." rexx-mode-syntax-table) + (modify-syntax-entry ?& "." rexx-mode-syntax-table) + (modify-syntax-entry ?| "." rexx-mode-syntax-table) + (modify-syntax-entry ?. "_" rexx-mode-syntax-table) + (modify-syntax-entry ?\' "\"" rexx-mode-syntax-table)) + +(defvar rexx-mode-abbrev-table nil + "*Abbrev table in use in rexx-mode buffers.") + +(if rexx-mode-abbrev-table + nil + (define-abbrev-table 'rexx-mode-abbrev-table '( + ("address" "ADDRESS" rexx-check-expansion 0) + ("arg" "ARG" rexx-check-expansion 0) + ("break" "BREAK" rexx-check-expansion 0) + ("call" "CALL" rexx-check-expansion 0) + ("do" "DO" rexx-check-expansion 0) + ("drop" "DROP" rexx-check-expansion 0) + ("echo" "ECHO" rexx-check-expansion 0) + ("else" "ELSE" rexx-check-expansion 0) + ("end" "END" rexx-check-expansion 0) + ("exit" "EXIT" rexx-check-expansion 0) + ("if" "IF" rexx-check-expansion 0) + ("interpret" "INTERPRET" rexx-check-expansion 0) + ("iterate" "ITERATE" rexx-check-expansion 0) + ("leave" "LEAVE" rexx-check-expansion 0) + ("nop" "NOP" rexx-check-expansion 0) + ("numeric" "NUMERIC" rexx-check-expansion 0) + ("options" "OPTIONS" rexx-check-expansion 0) + ("otherwise" "OTHERWISE" rexx-check-expansion 0) + ("parse" "PARSE" rexx-check-expansion 0) + ("procedure" "PROCEDURE" rexx-check-expansion 0) + ("pull" "PULL" rexx-check-expansion 0) + ("push" "PUSH" rexx-check-expansion 0) + ("queue" "QUEUE" rexx-check-expansion 0) + ("return" "RETURN" rexx-check-expansion 0) + ("say" "SAY" rexx-check-expansion 0) + ("select" "SELECT" rexx-check-expansion 0) + ("shell" "SHELL" rexx-check-expansion 0) + ("signal" "SIGNAL" rexx-check-expansion 0) + ("then" "THEN" rexx-check-expansion 0) + ("trace" "TRACE" rexx-check-expansion 0) + ("upper" "UPPER" rexx-check-expansion 0) + ("when" "WHEN" rexx-check-expansion 0) + ("value" "VALUE" rexx-check-expansion 0) + ("to" "TO" rexx-check-expansion 0) + ("by" "BY" rexx-check-expansion 0) + ("for" "FOR" rexx-check-expansion 0) + ("forever" "FOREVER" rexx-check-expansion 0) + ("while" "WHILE" rexx-check-expansion 0) + ("until" "UNTIL" rexx-check-expansion 0) + ("form" "FORM" rexx-check-expansion 0) + ("digits" "DIGITS" rexx-check-expansion 0) + ("fuzz" "FUZZ" rexx-check-expansion 0) + ("scientific" "SCIENTIFIC" rexx-check-expansion 0) + ("engineering" "ENGINEERING" rexx-check-expansion 0) + ("failat" "FAILAT" rexx-check-expansion 0) + ("prompt" "PROMPT" rexx-check-expansion 0) + ("results" "RESULTS" rexx-check-expansion 0) + ("upper" "UPPER" rexx-check-expansion 0) + ("external" "EXTERNAL" rexx-check-expansion 0) + ("source" "SOURCE" rexx-check-expansion 0) + ("with" "WITH" rexx-check-expansion 0) + ("command" "COMMAND" rexx-check-expansion 0) + ("function" "FUNCTION" rexx-check-expansion 0) + ("var" "VAR" rexx-check-expansion 0) + ("version" "VERSION" rexx-check-expansion 0) + ("expose" "EXPOSE" rexx-check-expansion 0) + ("on" "ON" rexx-check-expansion 0) + ("off" "OFF" rexx-check-expansion 0) + ("abbrev" "ABBREV" rexx-check-expansion 0) + ("abs" "ABS" rexx-check-expansion 0) + ("addlib" "ADDLIB" rexx-check-expansion 0) + ("b2c" "B2C" rexx-check-expansion 0) + ("bitand" "BITAND" rexx-check-expansion 0) + ("bitchg" "BITCHG" rexx-check-expansion 0) + ("bitclr" "BITCLR" rexx-check-expansion 0) + ("bitcomp" "BITCOMP" rexx-check-expansion 0) + ("bitor" "BITOR" rexx-check-expansion 0) + ("bittst" "BITTST" rexx-check-expansion 0) + ("bitset" "BITSET" rexx-check-expansion 0) + ("c2b" "C2B" rexx-check-expansion 0) + ("c2d" "C2D" rexx-check-expansion 0) + ("c2x" "C2X" rexx-check-expansion 0) + ("center" "CENTER" rexx-check-expansion 0) + ("centre" "CENTRE" rexx-check-expansion 0) + ("close" "CLOSE" rexx-check-expansion 0) + ("compress" "COMPRESS" rexx-check-expansion 0) + ("compare" "COMPARE" rexx-check-expansion 0) + ("copies" "COPIES" rexx-check-expansion 0) + ("d2c" "D2C" rexx-check-expansion 0) + ("datatype" "DATATYPE" rexx-check-expansion 0) + ("delstr" "DELSTR" rexx-check-expansion 0) + ("delword" "DELWORD" rexx-check-expansion 0) + ("eof" "EOF" rexx-check-expansion 0) + ("errortext" "ERRORTEXT" rexx-check-expansion 0) + ("exists" "EXISTS" rexx-check-expansion 0) + ("export" "EXPORT" rexx-check-expansion 0) + ("freespace" "FREESPACE" rexx-check-expansion 0) + ("getclip" "GETCLIP" rexx-check-expansion 0) + ("getspace" "GETSPACE" rexx-check-expansion 0) + ("hash" "HASH" rexx-check-expansion 0) + ("import" "IMPORT" rexx-check-expansion 0) + ("index" "INDEX" rexx-check-expansion 0) + ("insert" "INSERT" rexx-check-expansion 0) + ("lastpos" "LASTPOS" rexx-check-expansion 0) + ("left" "LEFT" rexx-check-expansion 0) + ("length" "LENGTH" rexx-check-expansion 0) + ("max" "MAX" rexx-check-expansion 0) + ("min" "MIN" rexx-check-expansion 0) + ("open" "OPEN" rexx-check-expansion 0) + ("overlay" "OVERLAY" rexx-check-expansion 0) + ("pos" "POS" rexx-check-expansion 0) + ("pragma" "PRAGMA" rexx-check-expansion 0) + ("random" "RANDOM" rexx-check-expansion 0) + ("randu" "RANDU" rexx-check-expansion 0) + ("readch" "READCH" rexx-check-expansion 0) + ("readln" "READLN" rexx-check-expansion 0) + ("remlib" "REMLIB" rexx-check-expansion 0) + ("reverse" "REVERSE" rexx-check-expansion 0) + ("right" "RIGHT" rexx-check-expansion 0) + ("seek" "SEEK" rexx-check-expansion 0) + ("setclip" "SETCLIP" rexx-check-expansion 0) + ("show" "SHOW" rexx-check-expansion 0) + ("sign" "SIGN" rexx-check-expansion 0) + ("space" "SPACE" rexx-check-expansion 0) + ("storage" "STORAGE" rexx-check-expansion 0) + ("strip" "STRIP" rexx-check-expansion 0) + ("substr" "SUBSTR" rexx-check-expansion 0) + ("subword" "SUBWORD" rexx-check-expansion 0) + ("symbol" "SYMBOL" rexx-check-expansion 0) + ("time" "TIME" rexx-check-expansion 0) + ("trace" "TRACE" rexx-check-expansion 0) + ("translate" "TRANSLATE" rexx-check-expansion 0) + ("trim" "TRIM" rexx-check-expansion 0) + ("verify" "VERIFY" rexx-check-expansion 0) + ("word" "WORD" rexx-check-expansion 0) + ("wordindex" "WORDINDEX" rexx-check-expansion 0) + ("wordlength" "WORDLENGTH" rexx-check-expansion 0) + ("words" "WORDS" rexx-check-expansion 0) + ("writech" "WRITECH" rexx-check-expansion 0) + ("writeln" "WRITELN" rexx-check-expansion 0) + ("x2c" "X2C" rexx-check-expansion 0) + ("xrange" "XRANGE" rexx-check-expansion 0) + ("allocmem" "ALLOCMEM" rexx-check-expansion 0) + ("baddr" "BADDR" rexx-check-expansion 0) + ("bitxor" "BITXOR" rexx-check-expansion 0) + ("break_c" "BREAK_C" rexx-check-expansion 0) + ("break_d" "BREAK_D" rexx-check-expansion 0) + ("break_e" "BREAK_E" rexx-check-expansion 0) + ("break_f" "BREAK_F" rexx-check-expansion 0) + ("cache" "CACHE" rexx-check-expansion 0) + ("closeport" "CLOSEPORT" rexx-check-expansion 0) + ("d2x" "D2X" rexx-check-expansion 0) + ("date" "DATA" rexx-check-expansion 0) + ("delay" "DELAY" rexx-check-expansion 0) + ("delete" "DELETE" rexx-check-expansion 0) + ("error" "ERROR" rexx-check-expansion 0) + ("failure" "FAILURE" rexx-check-expansion 0) + ("find" "FIND" rexx-check-expansion 0) + ("forbid" "FORBID" rexx-check-expansion 0) + ("freemem" "FREEMEM" rexx-check-expansion 0) + ("getarg" "GETARG" rexx-check-expansion 0) + ("getpkt" "GETPKT" rexx-check-expansion 0) + ("halt" "HALT" rexx-check-expansion 0) + ("ioerr" "IOERR" rexx-check-expansion 0) + ("lines" "LINES" rexx-check-expansion 0) + ("makedir" "MAKEDIR" rexx-check-expansion 0) + ("next" "NEXT" rexx-check-expansion 0) + ("novalue" "NOVALUE" rexx-check-expansion 0) + ("null" "NULL" rexx-check-expansion 0) + ("offset" "OFFSET" rexx-check-expansion 0) + ("openport" "OPENPORT" rexx-check-expansion 0) + ("permit" "PERMIT" rexx-check-expansion 0) + ("rename" "RENAME" rexx-check-expansion 0) + ("reply" "REPLY" rexx-check-expansion 0) + ("showdir" "SHOWDIR" rexx-check-expansion 0) + ("showlist" "SHOWLIST" rexx-check-expansion 0) + ("sourceline" "SOURCELINE" rexx-check-expansion 0) + ("statef" "STATEF" rexx-check-expansion 0) + ("syntax" "SYNTAX" rexx-check-expansion 0) + ("trunc" "TRUNC" rexx-check-expansion 0) + ("typepkt" "TYPEPKT" rexx-check-expansion 0) + ("waitpkt" "WAITPKT" rexx-check-expansion 0) + ("x2d" "X2D" rexx-check-expansion 0)))) + +;;;###autoload +(defun rexx-mode () +"Major mode for editing REXX code. +\\{rexx-mode-map} + +Variables controlling indentation style: + rexx-indent + The basic indentation for do-blocks. + rexx-end-indent + The relative offset of the \"end\" statement. 0 places it in the + same column as the statements of the block. Setting it to the same + value as rexx-indent places the \"end\" under the do-line. + rexx-cont-indent + The indention for lines following \"then\", \"else\" and \",\" + (continued) lines. + rexx-tab-always-indent + Non-nil means TAB in REXX mode should always reindent the current + line, regardless of where in the line the point is when the TAB + command is used. + +If you have set rexx-end-indent to a nonzero value, you probably want to +remap RETURN to rexx-indent-newline-indent. It makes sure that lines +indents correctly when you press RETURN. + +An extensive abbrevation table consisting of all the keywords of REXX are +supplied. Expanded keywords are converted into upper case making it +easier to distinguish them. To use this feature the buffer must be in +abbrev-mode. (See example below.) + +Turning on REXX mode calls the value of the variable rexx-mode-hook with +no args, if that value is non-nil. + +For example: +(setq rexx-mode-hook '(lambda () + (setq rexx-indent 4) + (setq rexx-end-indent 4) + (setq rexx-cont-indent 4) + (local-set-key \"\\C-m\" 'rexx-indent-newline-indent) + (abbrev-mode 1) + )) + +will make the END aligned with the DO/SELECT. It will indent blocks and +IF-statenents four steps and make sure that the END jumps into the +correct position when RETURN is pressed. Finaly it will use the abbrev +table to convert all REXX keywords into upper case." + (interactive) + (kill-all-local-variables) + (use-local-map rexx-mode-map) + (set-syntax-table rexx-mode-syntax-table) + (setq major-mode 'rexx-mode) + (setq mode-name "REXX") + (setq local-abbrev-table rexx-mode-abbrev-table) + (make-local-variable 'case-fold-search) + (setq case-fold-search t) + (make-local-variable 'paragraph-start) + (setq paragraph-start (concat "^$\\|" page-delimiter)) + (make-local-variable 'paragraph-separate) + (setq paragraph-separate paragraph-start) + (make-local-variable 'paragraph-ignore-fill-prefix) + (setq paragraph-ignore-fill-prefix t) + (make-local-variable 'indent-line-function) + (setq indent-line-function 'rexx-indent-command) + (make-local-variable 'parse-sexp-ignore-comments) + (setq parse-sexp-ignore-comments t) + (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 "/\\*+ *") + (make-local-variable 'comment-indent-hook) + (setq comment-indent-hook 'rexx-comment-indent) + (run-hooks 'rexx-mode-hook)) + + +(defun rexx-indent-command (&optional whole-exp) + "Indent the current line as REXX code." + (interactive "P") + (if whole-exp + (let ((shift-amt (rexx-indent-line)) + beg + end) + (save-excursion + (if rexx-tab-always-indent + (beginning-of-line)) + (setq beg (point)) + (forward-sexp 1) + (setq end (point)) + (goto-char beg) + (forward-line 1) + (setq beg (point))) + (if (> end beg) + (indent-code-rigidly beg end shift-amt))) + (if (and (not rexx-tab-always-indent) + (save-excursion + (skip-chars-backward " \t") + (not (bolp)))) + (insert-tab) + (rexx-indent-line)))) + +(defun rexx-indent-line () + "Indent the current line as REXX code. +Return the amount the indentation changed by." + (let ((indent (rexx-calc-indent)) + beg + shift-amt + (pos (- (point-max) (point)))) + (beginning-of-line) + (setq beg (point)) + (cond ((eq indent nil) (setq indent (current-indentation))) + ((eq indent t) (setq indent (rexx-calculate-indent-within-comment))) + ((looking-at "[ \t]*#") (setq indent 0)) + (t (skip-chars-forward " \t") + (if (listp indent) (setq indent (car indent))) + ;; /* Sprekspecifik kod! */ + (if (looking-at "end") (setq indent (- indent rexx-end-indent))))) + (skip-chars-forward " \t") + (setq shift-amt (- indent (current-column))) + (if (zerop shift-amt) + (if (> (- (point-max) pos) (point)) + (goto-char (- (point-max) pos))) + (delete-region beg (point)) + (indent-to indent) + (if (> (- (point-max) pos) (point)) + (goto-char (- (point-max) pos)))) + shift-amt)) + +(defun rexx-calc-indent () + "Return the appropriate indentation for this line as an int." + (save-excursion + (beginning-of-line) + (let ((block (rexx-find-environment)) + beg + state + indent) + (save-excursion (setq state (rexx-inside-comment-or-string))) + (cond ((or (nth 3 state) (nth 4 state)) + (nth 4 state)) ;; Inside a comment or string + (t + ;; Find line to indent current line after. + (rexx-backup-to-noncomment 1) + (beginning-of-line) + (setq beg (rexx-find-environment)) + (while (> beg block) + (goto-char beg) + (beginning-of-line) + (setq beg (rexx-find-environment))) + + (if (> (point) block) + ;; Check to see if we shall make a special indention + (if (looking-at rexx-special-regexp) + (+ (current-indentation) rexx-cont-indent) + ;; If not, find the basic indention by stepping + ;; by all special indented lines. + (progn + (setq indent (current-indentation)) + (rexx-backup-to-noncomment 1) + (beginning-of-line) + (while (looking-at rexx-special-regexp) + (setq indent (current-indentation)) + (rexx-backup-to-noncomment 1) + (beginning-of-line)) + indent)) + (if (= 1 block) + 0 + ;; Indent after the do-line. + (progn + (goto-char block) + (+ (current-indentation) rexx-indent))))))))) + +(defun rexx-backup-to-noncomment (lim) + "Backup the point to the previous noncomment REXX line." + (let (stop) + (while (not stop) + (skip-chars-backward " \t\n\f" lim) + (if (and (>= (point) (+ 2 lim)) + (save-excursion + (forward-char -2) + (looking-at "\\*/"))) + (search-backward "/*" lim 'move) + (setq stop t))) + (>= (point) lim))) + +(defun rexx-find-environment () + "Return the position of the corresponding \"do\" or \"select\". +If none found, return the beginning of buffer." + (save-excursion + (let ((do-level 1) + (cont t) + state) + (while (and cont (not (zerop do-level))) + (setq cont (re-search-backward "\\b\\(do\\|select\\|end\\)\\b" 1 t)) + (save-excursion (setq state (rexx-inside-comment-or-string))) + (setq do-level (+ do-level + (cond ((or (nth 3 state) (nth 4 state)) 0) + ((looking-at "do") -1) + ((looking-at "select") -1) + ((looking-at "end") +1) + (t 0))))) + + (if cont (point) 1)))) + +(defun rexx-calculate-indent-within-comment () + "Return the indentation amount for line, assuming that +the current line is to be regarded as part of a block comment." + (let (end star-start) + (save-excursion + (beginning-of-line) + (skip-chars-forward " \t") + (setq star-start (= (following-char) ?\*)) + (skip-chars-backward " \t\n") + (setq end (point)) + (beginning-of-line) + (skip-chars-forward " \t") + (and (re-search-forward "/\\*[ \t]*" end t) + star-start + (goto-char (1+ (match-beginning 0)))) + (current-column)))) + +(defun rexx-comment-indent () + (if (looking-at "^/\\*") + 0 ;Existing comment at bol stays there. + (save-excursion + (skip-chars-backward " \t") + (max (1+ (current-column)) ;Else indent at comment column + comment-column)))) ; except leave at least one space. + +(defun rexx-find-matching-do () + "Set mark, look for the \"do\" or \"select\" for the present block." + (interactive) + (set-mark-command nil) + (beginning-of-line) + (goto-char (rexx-find-environment))) + +(defun rexx-check-expansion () + "If abbrev was made within a comment or a string, de-abbrev!" + (let ((state (rexx-inside-comment-or-string))) + (if (or (nth 3 state) (nth 4 state)) + (unexpand-abbrev)))) + +(defun rexx-inside-comment-or-string () + "Check if the point is inside a comment or a string. +It returns the state from parse-partial-sexp for the search that +terminated on the points position" + (let ((origpoint (point)) + state) + (save-excursion + (goto-char 1) + (while (> origpoint (point)) + (setq state (parse-partial-sexp (point) origpoint 0)))) + state)) + +(defun rexx-indent-and-newline () + "New newline-and-indent which expands abbrevs before running +a regular newline-and-indent." + (interactive) + (if abbrev-mode + (expand-abbrev)) + (newline-and-indent)) + +(defun rexx-indent-newline-indent () + "New newline-and-indent which expands abbrevs and indent the line +before running a regular newline-and-indent." + (interactive) + (rexx-indent-command) + (if abbrev-mode + (expand-abbrev)) + (newline-and-indent))