# HG changeset patch # User Karl Heuer # Date 818817725 0 # Node ID 4111cc3136d1a12662d5d74b23e6114774ea27b8 # Parent 3dcaddea344a9cbb6205b5d372710c227e2d1378 (sh-mode-map): Make the code more legible. (sh-font-lock-keywords-1): Allow keyword `in' at eol too. (sh-font-lock-keywords-only): New variable to prevent an apostrophe in comment from misfontifying buffer, but to allow users who don't have such to get strings fontified. (sh-mode): Use it. diff -r 3dcaddea344a -r 4111cc3136d1 lisp/progmodes/sh-script.el --- a/lisp/progmodes/sh-script.el Tue Dec 12 08:20:37 1995 +0000 +++ b/lisp/progmodes/sh-script.el Wed Dec 13 01:22:05 1995 +0000 @@ -2,7 +2,7 @@ ;; Copyright (C) 1993, 1994, 1995 by Free Software Foundation, Inc. ;; Author: Daniel.Pfeiffer@Informatik.START.dbp.de, fax (+49 69) 7588-2389 -;; Version: 2.0d +;; Version: 2.0e ;; Maintainer: FSF ;; Keywords: languages, unix @@ -32,12 +32,7 @@ ;;; Known Bugs: -;; - Since GNU Emacs' syntax can't handle the context-sensitive meanings of -;; the variable/number base/comment symbol `#', that has to be fontified by -;; regexp. This alas means that a quote `'' or `"' in a comment will -;; fontify VERY badly. The alternative is to have these frequent constructs -;; with `#' fontify as comments. Or maybe we intoduce a 'syntax text- -;; property? +;; - In Bourne the keyword `in' is not anchored to case, for, select ... ;; - Variables in `"' strings aren't fontified because there's no way of ;; syntactically distinguishing those from `'' strings. @@ -222,7 +217,8 @@ (defvar sh-mode-map - (let ((map (make-sparse-keymap))) + (let ((map (make-sparse-keymap)) + (menu-map (make-sparse-keymap "Insert"))) (define-key map "\C-c(" 'sh-function) (define-key map "\C-c\C-w" 'sh-while) (define-key map "\C-c\C-u" 'sh-until) @@ -263,28 +259,19 @@ map (current-global-map)) (substitute-key-definition 'forward-sentence 'sh-end-of-command map (current-global-map)) - (define-key map [menu-bar insert] - (cons "Insert" (make-sparse-keymap "Insert"))) - (define-key map [menu-bar insert sh-while] - '("While loop" . sh-while)) - (define-key map [menu-bar insert sh-until] - '("Until loop" . sh-until)) - (define-key map [menu-bar insert sh-tmp-file] - '("Temporary file" . sh-tmp-file)) - (define-key map [menu-bar insert sh-select] - '("Select statement" . sh-select)) - (define-key map [menu-bar insert sh-repeat] - '("Repeat loop" . sh-repeat)) - (define-key map [menu-bar insert sh-while-getopts] - '("Options loop" . sh-while-getopts)) - (define-key map [menu-bar insert sh-indexed-loop] - '("Indexed loop" . sh-indexed-loop)) - (define-key map [menu-bar insert sh-if] - '("If statement" . sh-if)) - (define-key map [menu-bar insert sh-for] - '("For loop" . sh-for)) - (define-key map [menu-bar insert sh-case] - '("Case statement" . sh-case)) + (define-key map [menu-bar insert] (cons "Insert" menu-map)) + (define-key menu-map [sh-while] '("While Loop" . sh-while)) + (define-key menu-map [sh-until] '("Until Loop" . sh-until)) + (define-key menu-map [sh-tmp-file] '("Temporary File" . sh-tmp-file)) + (define-key menu-map [sh-select] '("Select Statement" . sh-select)) + (define-key menu-map [sh-repeat] '("Repeat Loop" . sh-repeat)) + (define-key menu-map [sh-while-getopts] + '("Options Loop" . sh-while-getopts)) + (define-key menu-map [sh-indexed-loop] + '("Indexed Loop" . sh-indexed-loop)) + (define-key menu-map [sh-if] '("If Statement" . sh-if)) + (define-key menu-map [sh-for] '("For Loop" . sh-for)) + (define-key menu-map [sh-case] '("Case Statement" . sh-case)) map) "Keymap used in Shell-Script mode.") @@ -565,12 +552,18 @@ "*Rules for highlighting shell scripts. See `sh-feature'.") (defvar sh-font-lock-keywords-1 - '((sh "[ \t]in[ \t]")) + '((sh "[ \t]in\\>")) "*Additional rules for highlighting shell scripts. See `sh-feature'.") (defvar sh-font-lock-keywords-2 () "*Yet more rules for highlighting shell scripts. See `sh-feature'.") +(defvar sh-font-lock-keywords-only t + "*Value of `font-lock-keywords-only' for highlighting shell scripts. +Default value is `t' because Emacs' syntax is not expressive enough to +detect that $# does not start a comment. Thus comments are fontified by +regexp which means that a single apostrophe in a comment turns everything +upto the next one or end of buffer into a string.") ;; mode-command and utility functions @@ -656,17 +649,18 @@ (indent-rigidly b (point) sh-indentation))) skeleton-end-hook (lambda () (or (eolp) (newline) (indent-relative))) - paragraph-start (concat page-delimiter "\\|$") + paragraph-start (concat page-delimiter "\\|$") paragraph-separate paragraph-start comment-start "# " comint-dynamic-complete-functions sh-dynamic-complete-functions ;; we can't look if previous line ended with `\' comint-prompt-regexp "^[ \t]*" font-lock-defaults - '((sh-font-lock-keywords + `((sh-font-lock-keywords sh-font-lock-keywords-1 sh-font-lock-keywords-2) - nil nil + ,sh-font-lock-keywords-only + nil ((?/ . "w") (?~ . "w") (?. . "w") (?- . "w") (?_ . "w"))) skeleton-pair-alist '((?` _ ?`)) skeleton-pair-filter 'sh-quoted-p