]> git.eshelyaron.com Git - emacs.git/commitdiff
(sh-font-lock-keywords-var): Variable renamed from sh-font-lock-keywords.
authorRichard M. Stallman <rms@gnu.org>
Mon, 15 Aug 2005 02:01:38 +0000 (02:01 +0000)
committerRichard M. Stallman <rms@gnu.org>
Mon, 15 Aug 2005 02:01:38 +0000 (02:01 +0000)
In the `shell' entry, don't try to refer to executable-font-lock-keywords.
(sh-font-lock-keywords-var-1): Renamed from sh-font-lock-keywords-1.
(sh-font-lock-keywords-var-2): Renamed from sh-font-lock-keywords-2.
(sh-font-lock-keywords): Append executable-font-lock-keywords here.
(sh-mode): Set comment-start-skip, local-abbrev-table, imenu-case-fold-search.
(sh-set-shell): Don't set them here.
(sh-feature): Simplify.  Get rid of the eval-a-variable feature.
Don't cache the results in the original alist; don't ever modify that alist.

lisp/progmodes/sh-script.el

index 99e367a863368591bb0e44382b90115a91371b50..ab23b31a963899e52b779b2528c26fb8ee092a2c 100644 (file)
@@ -815,7 +815,7 @@ See `sh-feature'.")
   :group 'sh-script
   :version "22.1")
 
-(defvar sh-font-lock-keywords
+(defvar sh-font-lock-keywords-var
   '((csh sh-append shell
         ("\\${?[#?]?\\([A-Za-z_][A-Za-z0-9_]*\\|0\\)" 1
           font-lock-variable-name-face))
@@ -838,7 +838,7 @@ See `sh-feature'.")
         1 font-lock-negation-char-face))
 
     ;; The next entry is only used for defining the others
-    (shell sh-append executable-font-lock-keywords
+    (shell
            ;; Using font-lock-string-face here confuses sh-get-indent-info.
            ("\\(^\\|[^\\]\\)\\(\\\\\\\\\\)*\\(\\\\\\)$" 3 'sh-escaped-newline)
           ("\\\\[^A-Za-z0-9]" 0 font-lock-string-face)
@@ -850,11 +850,11 @@ See `sh-feature'.")
          ("^\\(\\sw+\\):"  1 font-lock-variable-name-face)))
   "Default expressions to highlight in Shell Script modes.  See `sh-feature'.")
 
-(defvar sh-font-lock-keywords-1
+(defvar sh-font-lock-keywords-var-1
   '((sh "[ \t]in\\>"))
   "Subdued level highlighting for Shell Script modes.")
 
-(defvar sh-font-lock-keywords-2 ()
+(defvar sh-font-lock-keywords-var-2 ()
   "Gaudy level highlighting for Shell Script modes.")
 
 ;; These are used for the syntax table stuff (derived from cperl-mode).
@@ -1364,9 +1364,12 @@ with your script for an edit-interpret-debug cycle."
        paragraph-start (concat page-delimiter "\\|$")
        paragraph-separate paragraph-start
        comment-start "# "
+       comment-start-skip "#+[\t ]*"
+       local-abbrev-table sh-mode-abbrev-table
        comint-dynamic-complete-functions sh-dynamic-complete-functions
        ;; we can't look if previous line ended with `\'
        comint-prompt-regexp "^[ \t]*"
+       imenu-case-fold-search nil
        font-lock-defaults
        `((sh-font-lock-keywords
           sh-font-lock-keywords-1 sh-font-lock-keywords-2)
@@ -1403,13 +1406,14 @@ with your script for an edit-interpret-debug cycle."
 (defun sh-font-lock-keywords (&optional keywords)
   "Function to get simple fontification based on `sh-font-lock-keywords'.
 This adds rules for comments and assignments."
-  (sh-feature sh-font-lock-keywords
+  (sh-feature sh-font-lock-keywords-var
              (when (stringp (sh-feature sh-assignment-regexp))
                (lambda (list)
                  `((,(sh-feature sh-assignment-regexp)
                     1 font-lock-variable-name-face)
                    ,@keywords
-                   ,@list)))))
+                   ,@list
+                   ,@executable-font-lock-keywords)))))
 
 (defun sh-font-lock-keywords-1 (&optional builtins)
   "Function to get better fontification including keywords."
@@ -1426,10 +1430,10 @@ This adds rules for comments and assignments."
                         "\\>")
                (2 font-lock-keyword-face nil t)
                (6 font-lock-builtin-face))
-              ,@(sh-feature sh-font-lock-keywords-2)))
+              ,@(sh-feature sh-font-lock-keywords-var-2)))
         (,(concat keywords "\\)\\>")
          2 font-lock-keyword-face)
-        ,@(sh-feature sh-font-lock-keywords-1)))))
+        ,@(sh-feature sh-font-lock-keywords-var-1)))))
 
 (defun sh-font-lock-keywords-2 ()
   "Function to get better fontification including keywords and builtins."
@@ -1491,6 +1495,7 @@ This adds rules for comments and assignments."
      ("case" sh-handle-this-rc-case sh-handle-prev-rc-case))))
 
 
+
 (defun sh-set-shell (shell &optional no-query-flag insert-flag)
   "Set this buffer's shell to SHELL (a string).
 When used interactively, insert the proper starting #!-line,
@@ -1523,13 +1528,10 @@ Calls the value of `sh-set-shell-hook' if set."
     (if (eq tem t)
        (setq require-final-newline mode-require-final-newline)))
   (setq
-       comment-start-skip "#+[\t ]*"
-       local-abbrev-table sh-mode-abbrev-table
        mode-line-process (format "[%s]" sh-shell)
        sh-shell-variables nil
        sh-shell-variables-initialized nil
-       imenu-generic-expression (sh-feature sh-imenu-generic-expression)
-       imenu-case-fold-search nil)
+       imenu-generic-expression (sh-feature sh-imenu-generic-expression))
   (make-local-variable 'sh-mode-syntax-table)
   (let ((tem (sh-feature sh-mode-syntax-table-input)))
     (setq sh-mode-syntax-table
@@ -1557,10 +1559,13 @@ Calls the value of `sh-set-shell-hook' if set."
        (message "Indentation setup for shell type %s" sh-shell))
     (message "No indentation for this shell type.")
     (setq indent-line-function 'sh-basic-indent-line))
+  (when font-lock-mode
+    (setq font-lock-set-defaults nil)
+    (font-lock-set-defaults)
+    (font-lock-fontify-buffer))
   (run-hooks 'sh-set-shell-hook))
 
 
-
 (defun sh-feature (alist &optional function)
   "Index ALIST by the current shell.
 If ALIST isn't a list where every element is a cons, it is returned as is.
@@ -1578,39 +1583,38 @@ Else indexing follows an inheritance logic which works in two ways:
     one shell to be derived from another shell.
     The value thus determined is physically replaced into the alist.
 
-Optional FUNCTION is applied to the determined value and the result is cached
-in ALIST."
+If FUNCTION is non-nil, it is called with one argument,
+the value thus obtained, and the result is used instead."
   (or (if (consp alist)
+         ;; Check for something that isn't a valid alist.
          (let ((l alist))
            (while (and l (consp (car l)))
              (setq l (cdr l)))
            (if l alist)))
-      (if function
-         (cdr (assoc (setq function (cons sh-shell function)) alist)))
-      (let ((sh-shell sh-shell)
-           elt val)
-       (while (and sh-shell
-                   (not (setq elt (assq sh-shell alist))))
-         (setq sh-shell (cdr (assq sh-shell sh-ancestor-alist))))
-       ;; If the shell is not known, treat it as sh.
-       (unless elt
-         (setq elt (assq 'sh alist)))
-       (if (and (consp (setq val (cdr elt)))
-                (memq (car val) '(sh-append sh-modify)))
-           (setcdr elt
-                   (setq val
-                         (apply (car val)
-                                (let ((sh-shell (car (cdr val))))
-                                   (if (assq sh-shell alist)
-                                       (sh-feature alist)
-                                     (eval sh-shell)))
-                                (cddr val)))))
-       (if function
-           (nconc alist
-                  (list (cons function
-                              (setq sh-shell (car function)
-                                    val (funcall (cdr function) val))))))
-       val)))
+
+      (let ((orig-sh-shell sh-shell))
+       (let ((sh-shell sh-shell)
+             elt val)
+         (while (and sh-shell
+                     (not (setq elt (assq sh-shell alist))))
+           (setq sh-shell (cdr (assq sh-shell sh-ancestor-alist))))
+         ;; If the shell is not known, treat it as sh.
+         (unless elt
+           (setq elt (assq 'sh alist)))
+         (setq val (cdr elt))
+         (if (and (consp val)
+                  (memq (car val) '(sh-append sh-modify)))
+             (setq val
+                   (apply (car val)
+                          ;; Refer to the value for a different shell,
+                          ;; as a kind of inheritance.
+                          (let ((sh-shell (car (cdr val))))
+                            (sh-feature alist))
+                          (cddr val))))
+         (if function
+             (setq sh-shell orig-sh-shell
+                   val (funcall function val)))
+         val))))