Source

prog-modes / javascript-mode.el

Diff from to

javascript-mode.el

 ;;; javascript-mode.el --- major mode for editing JavaScript code
 
-;; Copyright (C) 1997 Steven Champeon
+;; Copyright (C) 1997-2001 Steven Champeon
+;;               2002      Ville Skyttä
 
-;; Author:     1997-2001 Steven Champeon <schampeo@hesketh.com>
-;;             2002      Ville Skyttä    <ville.skytta@xemacs.org>
+;; Author:     1997 Steven Champeon <schampeo@hesketh.com>
 ;; Maintainer: Ville Skyttä <ville.skytta@xemacs.org>
 ;; Keywords:   languages javascript
 
-;; This program 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
-;; of the License, or (at your option) any later version.
+;; This file is part of XEmacs.
 
-;; This program 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.
+;; 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 this program; if not, write to the Free Software
-;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+;; along with XEmacs; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;; Synched up with: not in GNU Emacs.
 
 ;;; Commentary:
 
-;; javascript-mode was originally derived from java-cust.el (by Jonathan Payne)
-;; by Steven Champeon. It has been updated and cleaned up by Ville Skyttä.
+;; javascript-mode was originally derived from java-cust.el
+;; (by Jonathan Payne) by Steven Champeon. It has been modified
+;; a lot afterwards by Ville Skyttä.
 
 ;; Contributors:
 ;;   Sreng Truong (bug fix for 21.1)
 
+;; TODO:
+;; - Multiple font-lock/highlight levels.
+;; - Investigate if Semantic Bovinator should be used.
+;; - Check syntax-table stuff.
+
 ;;; Code:
 
 (require 'cc-mode)
+(require 'comint)
+
 (eval-when-compile
   (require 'regexp-opt)
   (require 'font-lock)
+  (require 'speedbar)
   )
 
-(defconst javascript-mode-version "1.3" "Version of `javascript-mode'.")
+;; ------------------------------------------------------------------------ ;;
 
-;; Abbrev
+(defconst javascript-mode-version "1.4" "Version of `javascript-mode'.")
+
+;; ------------------------------------------------------------------------ ;;
+
+(defgroup javascript nil
+  "Major mode for editing JavaScript code."
+  :group 'languages
+  :prefix "javascript-")
+
+(defcustom javascript-mode-hook nil
+  "Hook for customizing `javascript-mode'."
+  :group 'javascript
+  :type 'hook)
+
+(defgroup javascript-shell nil
+  "JavaScript shell options."
+  :group 'javascript
+  :prefix "javascript-shell-")
+
+(defcustom javascript-shell-command "jsshell"
+  "*Command for starting `javascript-shell'.
+Set arguments for this command in `javascript-shell-command-args'."
+  :type 'string
+  :group 'javascript-shell)
+
+(defcustom javascript-shell-command-args '()
+  "*Command line arguments for `javascript-shell-command'."
+  :type '(repeat (string :tag "Argument"))
+  :group 'javascript-shell)
+
+(defcustom javascript-shell-prompt-pattern "^js> *"
+  "*JavaScript shell prompt pattern."
+  :type 'regexp
+  :group 'javascript-shell)
+
+(defcustom javascript-shell-mode-hook nil
+  "Hook for customizing `javascript-shell-mode'."
+  :type 'hook
+  :group 'javascript-shell)
+
+;; ------------------------------------------------------------------------ ;;
+
 (defvar javascript-mode-abbrev-table nil
   "Abbrev table in use in `javascript-mode' buffers.")
 (define-abbrev-table 'javascript-mode-abbrev-table ())
 
+;; ------------------------------------------------------------------------ ;;
+
 (defvar javascript-mode-map nil
   "Keymap used in `javascript-mode' buffers.")
 (if javascript-mode-map
   (define-key javascript-mode-map '(meta control h) 'backward-kill-word)
   )
 
+;; ------------------------------------------------------------------------ ;;
+
 ;; Reserved words in JavaScript.
 (defconst javascript-reserved-words
   (eval-when-compile
        "while"
        "with"
        ) t))
-  "Expression for matching reserved words in `javascript-mode' buffers.\n
+  "Expression for matching reserved words in `javascript-mode' buffers.
+
 From Core JavaScript Reference 1.5, Appendix A (Reserved Words):
 <http://developer.netscape.com/docs/manuals/js/core/jsref15/keywords.html>")
 
+
 ;; JavaScript identifiers
 ;; This one is intentionally not too strict...
 (defconst javascript-identifier
   "[a-zA-Z_\\$][a-zA-Z0-9_\\$]*"
-  "Expression for matching identifiers in `javascript-mode' buffers.\n
+  "Expression for matching identifiers in `javascript-mode' buffers.
+
 From Core JavaScript Guide 1.5, Chapter 2 (Values, Variables and Literals):
 <http://developer.netscape.com/docs/manuals/js/core/jsguide15/ident.html>")
 
+;; ------------------------------------------------------------------------ ;;
+
 ;; Font lock keywords
 (defconst javascript-font-lock-keywords
   (list
 
-   ; reserved words
+   ;; Reserved words.
    (list (concat
           "\\(^\\|[ \t;{]\\)\\("
           javascript-reserved-words
          2
          'font-lock-keyword-face)
 
-   ; function declarations
+   ;; Function declarations.
    (list (concat
           "\\(^\\|[ \t;{]\\)function[ \t]+\\("
           javascript-identifier
           )
          2
          'font-lock-function-name-face)
-   ; this would catch both declarations and calls
+   ; This would catch both declarations and calls.
    ;(list (concat
    ;       "\\(^\\|[ \t.;{(]\\)\\("
    ;       javascript-identifier
    ;      2
    ;      'font-lock-function-name-face)
 
-   ; variables
+   ;; Variables and constants.
    (list (concat
-          "\\(^\\|[ \t;{(]\\)var[ \t]+\\("
+          "\\(^\\|[ \t;{(]\\)\\(const\\|var\\)[ \t]+\\("
           javascript-identifier
           "\\)"
           )
-         2
+         3
          'font-lock-variable-name-face)
-   ; this would catch more of them and properties as well
+   ; This would catch more of them and properties as well.
    ;(list (concat
    ;       "\\(^\\|[ \t(\\[\\.{;]\\)\\("
    ;       javascript-identifier
    )
   "Highlighting rules for `javascript-mode' buffers.")
 
+;; ------------------------------------------------------------------------ ;;
+
 ;;;###autoload
 (defun javascript-mode ()
   "Major mode for editing JavaScript code.
+
 See the documentation for `c++-mode': JavaScript mode is an extension of it.
 Use the hook `javascript-mode-hook' to execute custom code when entering
 JavaScript mode.
     (run-hooks 'javascript-mode-hook)
     ))
 
+;; ------------------------------------------------------------------------ ;;
+
+;;;###autoload
+(defun javascript-shell ()
+  "Run a JavaScript shell as an inferior process.
+
+Use the `javascript-shell-command' variable to set the command and
+`javascript-shell-command-args' for its arguments to specify the
+command line that invokes your preferred JavaScript shell.
+
+Free JavaScript shell implementations are available for example from
+<http://www.mozilla.org/js/>.
+
+Usage examples:        command    arguments
+ Mozilla SpiderMonkey  jsshell
+ Mozilla Rhino         java       -jar /path/to/js.jar"
+
+  (interactive)
+
+  (unless (comint-check-proc "*JavaScript*")
+    (set-buffer
+     (apply 'make-comint "JavaScript"
+            javascript-shell-command nil javascript-shell-command-args))
+    (javascript-shell-mode)
+    )
+
+  (pop-to-buffer "*JavaScript*")
+  )
+
+
+(defun javascript-shell-mode ()
+  "Major mode for interacting with a JavaScript shell."
+  (comint-mode)
+  (setq comint-prompt-regexp javascript-shell-prompt-pattern)
+  (setq mode-name 'javascript-shell-mode)
+  (setq mode-name "JavaScript Shell")
+  (setq mode-line-process '(":%s"))
+  (run-hooks 'javascript-shell-mode-hook)
+  )
+
+;; ------------------------------------------------------------------------ ;;
+
 ;;;###autoload
 (add-to-list 'auto-mode-alist '("\\.js$" . javascript-mode))
 
+;; Speedbar handling
+(if (fboundp 'speedbar-add-supported-extension)
+    (speedbar-add-supported-extension ".js"))
+
+;; ------------------------------------------------------------------------ ;;
+
 (provide 'javascript-mode)
 
 ;;; javascript-mode.el ends here