1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-23 07:19:15 +00:00

(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.
This commit is contained in:
Karl Heuer 1995-12-13 01:22:05 +00:00
parent b7ffee5fb7
commit bfc8e97b47

View File

@ -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 @@ actually defined as the table for the like of \\[edit-abbrevs].")
(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 @@ actually defined as the table for the like of \\[edit-abbrevs].")
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 @@ See `sh-feature'.")
"*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 @@ with your script for an edit-interpret-debug cycle."
(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