changeset 64971:7fb2b79e33d0

(sh-font-lock-keywords-var): Variable renamed from sh-font-lock-keywords. 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.
author Richard M. Stallman <rms@gnu.org>
date Mon, 15 Aug 2005 02:01:38 +0000
parents 877705ac17d3
children d10e1f63c588
files lisp/progmodes/sh-script.el
diffstat 1 files changed, 45 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/progmodes/sh-script.el	Mon Aug 15 01:49:51 2005 +0000
+++ b/lisp/progmodes/sh-script.el	Mon Aug 15 02:01:38 2005 +0000
@@ -815,7 +815,7 @@
   :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 @@
 	 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 @@
 	  ("^\\(\\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 @@
 	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 @@
 (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 @@
 			 "\\>")
 		(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 @@
      ("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 @@
     (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 @@
 	(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 @@
     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))))