annotate lisp/progmodes/sh-script.el @ 30748:13c7c5e6cc36

Include coding.h. (XTread_socket): Work around a bug of XmbLookupString. If the input is from XIM, decode it according to the current locale. In that case, generate multibyte_char_keystroke events.
author Kenichi Handa <handa@m17n.org>
date Fri, 11 Aug 2000 00:49:39 +0000
parents 093c79809c9e
children 4c05432300f8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 ;;; sh-script.el --- shell-script editing commands for Emacs
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14148
diff changeset
2
25554
e52ba2d9f6d7 (sh-tmp-file): Use $TMPDIR, if defined, for sh.
Eli Zaretskii <eliz@gnu.org>
parents: 24906
diff changeset
3 ;; Copyright (C) 1993, 94, 95, 96, 97, 1999 by Free Software Foundation, Inc.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4
23869
8d2bb5d1416a Update comment.
Karl Heuer <kwzh@gnu.org>
parents: 23589
diff changeset
5 ;; Author: Daniel Pfeiffer <occitan@esperanto.org>
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
6 ;; Version: 2.0f
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 ;; Maintainer: FSF
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
8 ;; Keywords: languages, unix
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 ;; any later version.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; GNU General Public License for more details.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14148
diff changeset
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14148
diff changeset
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14148
diff changeset
25 ;; Boston, MA 02111-1307, USA.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 ;;; Commentary:
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
29 ;; Major mode for editing shell scripts. Bourne, C and rc shells as well
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
30 ;; as various derivatives are supported and easily derived from. Structured
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
31 ;; statements can be inserted with one command or abbrev. Completion is
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
32 ;; available for filenames, variables known from the script, the shell and
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
33 ;; the environment as well as commands.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
34
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
35 ;;; Known Bugs:
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36
13705
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
37 ;; - In Bourne the keyword `in' is not anchored to case, for, select ...
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
38 ;; - Variables in `"' strings aren't fontified because there's no way of
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
39 ;; syntactically distinguishing those from `'' strings.
8257
bbf6304598d9 "Comment out" autoload cookies.
Richard M. Stallman <rms@gnu.org>
parents: 8121
diff changeset
40
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
41 ;; Indentation
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
42 ;; ===========
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
43 ;; Indentation for rc and es modes is very limited, but for Bourne shells
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
44 ;; and its derivatives it is quite customizable.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
45 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
46 ;; The following description applies to sh and derived shells (bash,
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
47 ;; zsh, ...).
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
48 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
49 ;; There are various customization variables which allow tailoring to
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
50 ;; a wide variety of styles. Most of these variables are named
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
51 ;; sh-indent-for-XXX and sh-indent-after-XXX. For example.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
52 ;; sh-indent-after-if controls the indenting of a line following
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
53 ;; an if statement, and sh-indent-for-fi controls the indentation
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
54 ;; of the line containing the fi.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
55 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
56 ;; You can set each to a numeric value, but it is often more convenient
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
57 ;; to a symbol such as `+' which uses the value of variable `sh-basic-offset'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
58 ;; By changing this one variable you can increase or decrease how much
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
59 ;; indentation there is. Valid symbols:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
60 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
61 ;; + Indent right by sh-basic-offset
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
62 ;; - Indent left by sh-basic-offset
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
63 ;; ++ Indent right twice sh-basic-offset
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
64 ;; -- Indent left twice sh-basic-offset
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
65 ;; * Indent right half sh-basic-offset
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
66 ;; / Indent left half sh-basic-offset.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
67 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
68 ;; There are 4 commands to help set the indentation variables:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
69 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
70 ;; `sh-show-indent'
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
71 ;; This shows what variable controls the indentation of the current
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
72 ;; line and its value.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
73 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
74 ;; `sh-set-indent'
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
75 ;; This allows you to set the value of the variable controlling the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
76 ;; current line's indentation. You can enter a number or one of a
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
77 ;; number of special symbols to denote the value of sh-basic-offset,
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
78 ;; or its negative, or half it, or twice it, etc. If you've used
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
79 ;; cc-mode this should be familiar. If you forget which symbols are
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
80 ;; valid simply press C-h at the prompt.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
81 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
82 ;; `sh-learn-line-indent'
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
83 ;; Simply make the line look the way you want it, then invoke this
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
84 ;; command. It will set the variable to the value that makes the line
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
85 ;; indent like that. If called with a prefix argument then it will set
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
86 ;; the value to one of the symbols if applicable.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
87 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
88 ;; `sh-learn-buffer-indent'
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
89 ;; This is the deluxe function! It "learns" the whole buffer (use
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
90 ;; narrowing if you want it to process only part). It outputs to a
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
91 ;; buffer *indent* any conflicts it finds, and all the variables it has
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
92 ;; learned. This buffer is a sort of Occur mode buffer, allowing you to
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
93 ;; easily find where something was set. It is popped to automatically
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
94 ;; if there are any conflicts found or if `sh-popup-occur-buffer' is
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
95 ;; non-nil.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
96 ;; `sh-indent-comment' will be set if all comments follow the same
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
97 ;; pattern; if they don't it will be set to nil.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
98 ;; Whether `sh-basic-offset' is set is determined by variable
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
99 ;; `sh-learn-basic-offset'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
100 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
101 ;; Unfortunately, `sh-learn-buffer-indent' can take a long time to run
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
102 ;; (e.g. if there are large case statements). Perhaps it does not make
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
103 ;; sense to run it on large buffers: if lots of lines have different
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
104 ;; indentation styles it will produce a lot of diagnostics in the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
105 ;; *indent* buffer; if there is a consistent style then running
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
106 ;; `sh-learn-buffer-indent' on a small region of the buffer should
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
107 ;; suffice.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
108 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
109 ;; Saving indentation values
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
110 ;; -------------------------
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
111 ;; After you've learned the values in a buffer, how to you remember
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
112 ;; them? Originally I had hoped that `sh-learn-buffer-indent'
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
113 ;; would make this unnecessary; simply learn the values when you visit
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
114 ;; the buffer.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
115 ;; You can do this automatically like this:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
116 ; (add-hook 'sh-set-shell-hook 'sh-learn-buffer-indent)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
117 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
118 ;; However... `sh-learn-buffer-indent' is extremely slow,
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
119 ;; especially on large-ish buffer. Also, if there are conflicts the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
120 ;; "last one wins" which may not produce the desired setting.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
121 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
122 ;; So...There is a minimal way of being able to save indentation values and
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
123 ;; to reload them in another buffer or at another point in time.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
124 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
125 ;; Use `sh-name-style' to give a name to the indentation settings of
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
126 ;; the current buffer.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
127 ;; Use `sh-load-style' to load indentation settings for the current
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
128 ;; buffer from a specific style.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
129 ;; Use `sh-save-styles-to-buffer' to write all the styles to a buffer
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
130 ;; in lisp code. You can then store it in a file and later use
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
131 ;; `load-file' to load it.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
132 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
133 ;; Indentation variables - buffer local or global?
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
134 ;; ----------------------------------------------
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
135 ;; I think that often having them buffer-local makes sense,
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
136 ;; especially if one is using `sh-learn-buffer-indent'. However, if
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
137 ;; a user sets values using customization, these changes won't appear
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
138 ;; to work if the variables are already local!
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
139 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
140 ;; To get round this, there is a variable `sh-make-vars-local' and 2
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
141 ;; functions: `sh-make-vars-local' and `sh-reset-indent-vars-to-global-values'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
142 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
143 ;; If `sh-make-vars-local' is non-nil, then these variables become
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
144 ;; buffer local when the mode is established.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
145 ;; If this is nil, then the variables are global. At any time you
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
146 ;; can make them local with the command `sh-make-vars-local'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
147 ;; Conversely, to update with the global values you can use the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
148 ;; command `sh-reset-indent-vars-to-global-values'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
149 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
150 ;; This may be awkward, but the intent is to cover all cases.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
151 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
152 ;; Awkward things, pitfalls
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
153 ;; ------------------------
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
154 ;; Indentation for a sh script is complicated for a number of reasons:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
155 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
156 ;; 1. You can't format by simply looking at symbols, you need to look
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
157 ;; at keywords. [This is not the case for rc and es shells.]
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
158 ;; 2. The character ")" is used both as a matched pair "(" ... ")" and
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
159 ;; as a stand-alone symbol (in a case alternative). This makes
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
160 ;; things quite tricky!
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
161 ;; 3. Here-documents in a script should be treated "as is", and when
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
162 ;; they terminate we want to revert to the indentation of the line
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
163 ;; containing the "<<" symbol.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
164 ;; 4. A line may be continued using the "\".
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
165 ;; 5. The character "#" (outside a string) normally starts a comment,
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
166 ;; but it doesn't in the sequence "$#"!
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
167 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
168 ;; To try and address points 2 3 and 5 I used a feature that cperl mode
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
169 ;; uses, that of a text's syntax property. This, however, has 2
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
170 ;; disadvantages:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
171 ;; 1. We need to scan the buffer to find which ")" symbols belong to a
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
172 ;; case alternative, to find any here documents, and handle "$#".
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
173 ;; 2. Setting the text property makes the buffer modified. If the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
174 ;; buffer is read-only buffer we have to cheat and bypass the read-only
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
175 ;; status. This is for cases where the buffer started read-only buffer
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
176 ;; but the user issued `toggle-read-only'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
177 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
178 ;; Bugs
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
179 ;; ----
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
180 ;; - Here-documents are marked with text properties face and syntax
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
181 ;; table. This serves 2 purposes: stopping indentation while inside
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
182 ;; them, and moving over them when finding the previous line to
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
183 ;; indent to. However, if font-lock mode is active when there is
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
184 ;; any change inside the here-document font-lock clears that
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
185 ;; property. This causes several problems: lines after the here-doc
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
186 ;; will not be re-indentation properly, words in the here-doc region
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
187 ;; may be fontified, and indentation may occur within the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
188 ;; here-document.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
189 ;; I'm not sure how to fix this, perhaps using the point-entered
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
190 ;; property. Anyway, if you use font lock and change a
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
191 ;; here-document, I recommend using M-x sh-rescan-buffer after the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
192 ;; changes are made. Similarly, when using higlight-changes-mode,
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
193 ;; changes inside a here-document may confuse shell indenting, but again
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
194 ;; using `sh-rescan-buffer' should fix them.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
195 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
196 ;; - Indenting many lines is slow. It currently does each line
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
197 ;; independently, rather than saving state information.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
198 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
199 ;; - `sh-learn-buffer-indent' is extremely slow.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
200 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
201 ;; Richard Sharman <rsharman@pobox.com> June 1999.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
202
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 ;;; Code:
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 ;; page 1: variables and settings
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
206 ;; page 2: indentation stuff
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
207 ;; page 3: mode-command and utility functions
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
208 ;; page 4: statement syntax-commands for various shells
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
209 ;; page 5: various other commands
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
211 (require 'executable)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
213
17068
d1391b21626f (sh-mode-hook, sh-set-shell-hook): Add defvars.
Karl Heuer <kwzh@gnu.org>
parents: 16839
diff changeset
214
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
215 (defgroup sh nil
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
216 "Shell programming utilities"
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
217 :group 'unix
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
218 :group 'languages)
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
219
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
220 (defgroup sh-script nil
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
221 "Shell script mode"
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
222 :group 'sh
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
223 :prefix "sh-")
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
224
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
225
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
226 (defcustom sh-ancestor-alist
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
227 '((ash . sh)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
228 (bash . jsh)
29109
0e45e6e90467 (sh-ancestor-alist): Add `bash2'.
Gerd Moellmann <gerd@gnu.org>
parents: 28923
diff changeset
229 (bash2 . jsh)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
230 (dtksh . ksh)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
231 (es . rc)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
232 (itcsh . tcsh)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
233 (jcsh . csh)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
234 (jsh . sh)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
235 (ksh . ksh88)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
236 (ksh88 . jsh)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
237 (oash . sh)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
238 (pdksh . ksh88)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
239 (posix . sh)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
240 (tcsh . csh)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
241 (wksh . ksh88)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
242 (wsh . sh)
23501
f12ae4499ae0 (sh-mode): Handle .spec and .mspec files.
Richard M. Stallman <rms@gnu.org>
parents: 23341
diff changeset
243 (zsh . ksh88)
f12ae4499ae0 (sh-mode): Handle .spec and .mspec files.
Richard M. Stallman <rms@gnu.org>
parents: 23341
diff changeset
244 (rpm . sh))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
245 "*Alist showing the direct ancestor of various shells.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
246 This is the basis for `sh-feature'. See also `sh-alias-alist'.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
247 By default we have the following three hierarchies:
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
248
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
249 csh C Shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
250 jcsh C Shell with Job Control
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
251 tcsh Toronto C Shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
252 itcsh ? Toronto C Shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
253 rc Plan 9 Shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
254 es Extensible Shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
255 sh Bourne Shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
256 ash ? Shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
257 jsh Bourne Shell with Job Control
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
258 bash GNU Bourne Again Shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
259 ksh88 Korn Shell '88
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
260 ksh Korn Shell '93
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
261 dtksh CDE Desktop Korn Shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
262 pdksh Public Domain Korn Shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
263 wksh Window Korn Shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
264 zsh Z Shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
265 oash SCO OA (curses) Shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
266 posix IEEE 1003.2 Shell Standard
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
267 wsh ? Shell"
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
268 :type '(repeat (cons symbol symbol))
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
269 :group 'sh-script)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
270
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
271
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
272 (defcustom sh-alias-alist
15950
c4ae4ea7fa7a (sh-alias-alist): Use gnu/linux, not lignux.
Richard M. Stallman <rms@gnu.org>
parents: 15677
diff changeset
273 (nconc (if (eq system-type 'gnu/linux)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
274 '((csh . tcsh)
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
275 (ksh . pdksh)))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
276 ;; for the time being
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
277 '((ksh . ksh88)
29109
0e45e6e90467 (sh-ancestor-alist): Add `bash2'.
Gerd Moellmann <gerd@gnu.org>
parents: 28923
diff changeset
278 (bash2 . bash)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
279 (sh5 . sh)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
280 "*Alist for transforming shell names to what they really are.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
281 Use this where the name of the executable doesn't correspond to the type of
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
282 shell it really is."
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
283 :type '(repeat (cons symbol symbol))
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
284 :group 'sh-script)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
285
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
286
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
287 (defcustom sh-shell-file
16810
20dc495230a0 (sh-shell-file): On MSDOS, collapse $SHELL to lower
Richard M. Stallman <rms@gnu.org>
parents: 16552
diff changeset
288 (or
16839
daaa2c5bb40a (sh-shell-file): Downcase and remove extension on shells in NT.
Richard M. Stallman <rms@gnu.org>
parents: 16810
diff changeset
289 ;; On MSDOS and Windows, collapse $SHELL to lower-case and remove
daaa2c5bb40a (sh-shell-file): Downcase and remove extension on shells in NT.
Richard M. Stallman <rms@gnu.org>
parents: 16810
diff changeset
290 ;; the executable extension, so comparisons with the list of
16810
20dc495230a0 (sh-shell-file): On MSDOS, collapse $SHELL to lower
Richard M. Stallman <rms@gnu.org>
parents: 16552
diff changeset
291 ;; known shells work.
16839
daaa2c5bb40a (sh-shell-file): Downcase and remove extension on shells in NT.
Richard M. Stallman <rms@gnu.org>
parents: 16810
diff changeset
292 (and (memq system-type '(ms-dos windows-nt))
21925
3e498c36ccce (sh-shell-file): If $SHELL evaluates to
Eli Zaretskii <eliz@gnu.org>
parents: 21669
diff changeset
293 (let* ((shell (getenv "SHELL"))
3e498c36ccce (sh-shell-file): If $SHELL evaluates to
Eli Zaretskii <eliz@gnu.org>
parents: 21669
diff changeset
294 (shell-base
3e498c36ccce (sh-shell-file): If $SHELL evaluates to
Eli Zaretskii <eliz@gnu.org>
parents: 21669
diff changeset
295 (and shell (file-name-nondirectory shell))))
3e498c36ccce (sh-shell-file): If $SHELL evaluates to
Eli Zaretskii <eliz@gnu.org>
parents: 21669
diff changeset
296 ;; shell-script mode doesn't support DOS/Windows shells,
3e498c36ccce (sh-shell-file): If $SHELL evaluates to
Eli Zaretskii <eliz@gnu.org>
parents: 21669
diff changeset
297 ;; so use the default instead.
3e498c36ccce (sh-shell-file): If $SHELL evaluates to
Eli Zaretskii <eliz@gnu.org>
parents: 21669
diff changeset
298 (if (or (null shell)
3e498c36ccce (sh-shell-file): If $SHELL evaluates to
Eli Zaretskii <eliz@gnu.org>
parents: 21669
diff changeset
299 (member (downcase shell-base)
21980
e73c0672d7b3 (sh-shell-file): Add cmdproxy to MS shells.
Richard M. Stallman <rms@gnu.org>
parents: 21925
diff changeset
300 '("command.com" "cmd.exe" "4dos.com" "ndos.com"
e73c0672d7b3 (sh-shell-file): Add cmdproxy to MS shells.
Richard M. Stallman <rms@gnu.org>
parents: 21925
diff changeset
301 "cmdproxy.exe")))
21925
3e498c36ccce (sh-shell-file): If $SHELL evaluates to
Eli Zaretskii <eliz@gnu.org>
parents: 21669
diff changeset
302 "/bin/sh"
3e498c36ccce (sh-shell-file): If $SHELL evaluates to
Eli Zaretskii <eliz@gnu.org>
parents: 21669
diff changeset
303 (file-name-sans-extension (downcase shell)))))
16810
20dc495230a0 (sh-shell-file): On MSDOS, collapse $SHELL to lower
Richard M. Stallman <rms@gnu.org>
parents: 16552
diff changeset
304 (getenv "SHELL")
20dc495230a0 (sh-shell-file): On MSDOS, collapse $SHELL to lower
Richard M. Stallman <rms@gnu.org>
parents: 16552
diff changeset
305 "/bin/sh")
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
306 "*The executable file name for the shell being programmed."
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
307 :type 'string
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
308 :group 'sh-script)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
309
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
310
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
311 (defcustom sh-shell-arg
14886
96423e733197 (sh-shell-arg): Add no options for bash, ksh, or wksh.
Richard M. Stallman <rms@gnu.org>
parents: 14876
diff changeset
312 ;; bash does not need any options when run in a shell script,
14876
b39dde411ac8 (sh-shell-arg): Don't add any options for bash, ksh.
Richard M. Stallman <rms@gnu.org>
parents: 14849
diff changeset
313 '((bash)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
314 (csh . "-f")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
315 (pdksh)
14886
96423e733197 (sh-shell-arg): Add no options for bash, ksh, or wksh.
Richard M. Stallman <rms@gnu.org>
parents: 14876
diff changeset
316 ;; Bill_Mann@praxisint.com says -p with ksh can do harm.
14876
b39dde411ac8 (sh-shell-arg): Don't add any options for bash, ksh.
Richard M. Stallman <rms@gnu.org>
parents: 14849
diff changeset
317 (ksh88)
14886
96423e733197 (sh-shell-arg): Add no options for bash, ksh, or wksh.
Richard M. Stallman <rms@gnu.org>
parents: 14876
diff changeset
318 ;; -p means don't initialize functions from the environment.
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
319 (rc . "-p")
14886
96423e733197 (sh-shell-arg): Add no options for bash, ksh, or wksh.
Richard M. Stallman <rms@gnu.org>
parents: 14876
diff changeset
320 ;; Someone proposed -motif, but we don't want to encourage
96423e733197 (sh-shell-arg): Add no options for bash, ksh, or wksh.
Richard M. Stallman <rms@gnu.org>
parents: 14876
diff changeset
321 ;; use of a non-free widget set.
96423e733197 (sh-shell-arg): Add no options for bash, ksh, or wksh.
Richard M. Stallman <rms@gnu.org>
parents: 14876
diff changeset
322 (wksh)
96423e733197 (sh-shell-arg): Add no options for bash, ksh, or wksh.
Richard M. Stallman <rms@gnu.org>
parents: 14876
diff changeset
323 ;; -f means don't run .zshrc.
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
324 (zsh . "-f"))
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
325 "*Single argument string for the magic number. See `sh-feature'."
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
326 :type '(repeat (cons (symbol :tag "Shell")
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
327 (choice (const :tag "No Arguments" nil)
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
328 (string :tag "Arguments")
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
329 (cons :format "Evaluate: %v"
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
330 (const :format "" eval)
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
331 sexp))))
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
332 :group 'sh-script)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
333
20395
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
334 (defcustom sh-imenu-generic-expression
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
335 (list
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
336 (cons 'sh
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
337 (concat
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
338 "\\(^\\s-*function\\s-+[A-Za-z_][A-Za-z_0-9]*\\)"
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
339 "\\|"
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
340 "\\(^\\s-*[A-Za-z_][A-Za-z_0-9]*\\s-*()\\)")))
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
341 "*Regular expression for recognizing shell function definitions.
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
342 See `sh-feature'."
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
343 :type '(repeat (cons (symbol :tag "Shell")
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
344 regexp))
21669
9861518505cb *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 20900
diff changeset
345 :group 'sh-script
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
346 :version "20.4")
20395
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
347
14195
df3c52ae5b14 (sh-shell-variables): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
348 (defvar sh-shell-variables nil
df3c52ae5b14 (sh-shell-variables): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
349 "Alist of shell variable names that should be included in completion.
df3c52ae5b14 (sh-shell-variables): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
350 These are used for completion in addition to all the variables named
df3c52ae5b14 (sh-shell-variables): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
351 in `process-environment'. Each element looks like (VAR . VAR), where
df3c52ae5b14 (sh-shell-variables): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
352 the car and cdr are the same symbol.")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
353
14418
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
354 (defvar sh-shell-variables-initialized nil
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
355 "Non-nil if `sh-shell-variables' is initialized.")
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
356
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
357 (defun sh-canonicalize-shell (shell)
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
358 "Convert a shell name SHELL to the one we should handle it as."
23589
660727693bf6 (sh-canonicalize-shell): Fix regexp.
Andreas Schwab <schwab@suse.de>
parents: 23511
diff changeset
359 (if (string-match "\\.exe\\'" shell)
23341
d29b6b51866f (sh-set-shell): Remove .exe suffix from shell name.
Richard M. Stallman <rms@gnu.org>
parents: 22783
diff changeset
360 (setq shell (substring shell 0 (match-beginning 0))))
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
361 (or (symbolp shell)
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
362 (setq shell (intern shell)))
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
363 (or (cdr (assq shell sh-alias-alist))
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
364 shell))
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
365
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
366 (defvar sh-shell (sh-canonicalize-shell (file-name-nondirectory sh-shell-file))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
367 "The shell being programmed. This is set by \\[sh-set-shell].")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
368
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
369 ;;; I turned off this feature because it doesn't permit typing commands
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
370 ;;; in the usual way without help.
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
371 ;;;(defvar sh-abbrevs
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
372 ;;; '((csh eval sh-abbrevs shell
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
373 ;;; "switch" 'sh-case
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
374 ;;; "getopts" 'sh-while-getopts)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
375
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
376 ;;; (es eval sh-abbrevs shell
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
377 ;;; "function" 'sh-function)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
378
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
379 ;;; (ksh88 eval sh-abbrevs sh
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
380 ;;; "select" 'sh-select)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
381
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
382 ;;; (rc eval sh-abbrevs shell
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
383 ;;; "case" 'sh-case
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
384 ;;; "function" 'sh-function)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
385
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
386 ;;; (sh eval sh-abbrevs shell
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
387 ;;; "case" 'sh-case
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
388 ;;; "function" 'sh-function
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
389 ;;; "until" 'sh-until
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
390 ;;; "getopts" 'sh-while-getopts)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
391
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
392 ;;; ;; The next entry is only used for defining the others
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
393 ;;; (shell "for" sh-for
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
394 ;;; "loop" sh-indexed-loop
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
395 ;;; "if" sh-if
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
396 ;;; "tmpfile" sh-tmp-file
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
397 ;;; "while" sh-while)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
398
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
399 ;;; (zsh eval sh-abbrevs ksh88
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
400 ;;; "repeat" 'sh-repeat))
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
401 ;;; "Abbrev-table used in Shell-Script mode. See `sh-feature'.
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
402 ;;;Due to the internal workings of abbrev tables, the shell name symbol is
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
403 ;;;actually defined as the table for the like of \\[edit-abbrevs].")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
404
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 (defvar sh-mode-syntax-table
16535
d5eeca7cdaf2 (sh-mode-syntax-table): Turn on comment syntax for #,
Richard M. Stallman <rms@gnu.org>
parents: 16533
diff changeset
408 '((sh eval sh-mode-syntax-table ()
d5eeca7cdaf2 (sh-mode-syntax-table): Turn on comment syntax for #,
Richard M. Stallman <rms@gnu.org>
parents: 16533
diff changeset
409 ?\# "<"
d5eeca7cdaf2 (sh-mode-syntax-table): Turn on comment syntax for #,
Richard M. Stallman <rms@gnu.org>
parents: 16533
diff changeset
410 ?\^l ">#"
d5eeca7cdaf2 (sh-mode-syntax-table): Turn on comment syntax for #,
Richard M. Stallman <rms@gnu.org>
parents: 16533
diff changeset
411 ?\n ">#"
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
412 ?\" "\"\""
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
413 ?\' "\"'"
16535
d5eeca7cdaf2 (sh-mode-syntax-table): Turn on comment syntax for #,
Richard M. Stallman <rms@gnu.org>
parents: 16533
diff changeset
414 ?\` "\"`"
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
415 ?! "_"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
416 ?% "_"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
417 ?: "_"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
418 ?. "_"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
419 ?^ "_"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
420 ?~ "_")
16535
d5eeca7cdaf2 (sh-mode-syntax-table): Turn on comment syntax for #,
Richard M. Stallman <rms@gnu.org>
parents: 16533
diff changeset
421 (csh eval identity sh)
d5eeca7cdaf2 (sh-mode-syntax-table): Turn on comment syntax for #,
Richard M. Stallman <rms@gnu.org>
parents: 16533
diff changeset
422 (rc eval identity sh))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
423 "Syntax-table used in Shell-Script mode. See `sh-feature'.")
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 (defvar sh-mode-map
13705
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
428 (let ((map (make-sparse-keymap))
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
429 (menu-map (make-sparse-keymap "Insert")))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430 (define-key map "\C-c(" 'sh-function)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 (define-key map "\C-c\C-w" 'sh-while)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432 (define-key map "\C-c\C-u" 'sh-until)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
433 (define-key map "\C-c\C-t" 'sh-tmp-file)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 (define-key map "\C-c\C-s" 'sh-select)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
435 (define-key map "\C-c\C-r" 'sh-repeat)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
436 (define-key map "\C-c\C-o" 'sh-while-getopts)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 (define-key map "\C-c\C-l" 'sh-indexed-loop)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 (define-key map "\C-c\C-i" 'sh-if)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 (define-key map "\C-c\C-f" 'sh-for)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 (define-key map "\C-c\C-c" 'sh-case)
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
441 (define-key map "\C-c?" 'sh-show-indent)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
442 (define-key map "\C-c=" 'sh-set-indent)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
443 (define-key map "\C-c<" 'sh-learn-line-indent)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
444 (define-key map "\C-c>" 'sh-learn-buffer-indent)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
445
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 (define-key map "=" 'sh-assignment)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447 (define-key map "\C-c+" 'sh-add)
13469
5bda9e4d85eb (sh-mode-map): Put sh-execute-region on C-M-x.
Richard M. Stallman <rms@gnu.org>
parents: 13391
diff changeset
448 (define-key map "\C-\M-x" 'sh-execute-region)
5bda9e4d85eb (sh-mode-map): Put sh-execute-region on C-M-x.
Richard M. Stallman <rms@gnu.org>
parents: 13391
diff changeset
449 (define-key map "\C-c\C-x" 'executable-interpret)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
450 (define-key map "<" 'sh-maybe-here-document)
12864
3b9dcd964c66 (sh-mode-map): Use new name skeleton-pair-insert-maybe.
Karl Heuer <kwzh@gnu.org>
parents: 12863
diff changeset
451 (define-key map "(" 'skeleton-pair-insert-maybe)
3b9dcd964c66 (sh-mode-map): Use new name skeleton-pair-insert-maybe.
Karl Heuer <kwzh@gnu.org>
parents: 12863
diff changeset
452 (define-key map "{" 'skeleton-pair-insert-maybe)
3b9dcd964c66 (sh-mode-map): Use new name skeleton-pair-insert-maybe.
Karl Heuer <kwzh@gnu.org>
parents: 12863
diff changeset
453 (define-key map "[" 'skeleton-pair-insert-maybe)
3b9dcd964c66 (sh-mode-map): Use new name skeleton-pair-insert-maybe.
Karl Heuer <kwzh@gnu.org>
parents: 12863
diff changeset
454 (define-key map "'" 'skeleton-pair-insert-maybe)
3b9dcd964c66 (sh-mode-map): Use new name skeleton-pair-insert-maybe.
Karl Heuer <kwzh@gnu.org>
parents: 12863
diff changeset
455 (define-key map "`" 'skeleton-pair-insert-maybe)
3b9dcd964c66 (sh-mode-map): Use new name skeleton-pair-insert-maybe.
Karl Heuer <kwzh@gnu.org>
parents: 12863
diff changeset
456 (define-key map "\"" 'skeleton-pair-insert-maybe)
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
457 (define-key map ")" 'sh-electric-rparen)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
458 (define-key map "<" 'sh-electric-less)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
459 (define-key map "#" 'sh-electric-hash)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
460
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
461 (substitute-key-definition 'complete-tag 'comint-dynamic-complete
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 map (current-global-map))
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
463 (substitute-key-definition 'newline-and-indent 'sh-newline-and-indent
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
464 map (current-global-map))
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465 (substitute-key-definition 'delete-backward-char
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466 'backward-delete-char-untabify
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467 map (current-global-map))
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468 (define-key map "\C-c:" 'sh-set-shell)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469 (substitute-key-definition 'beginning-of-defun
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470 'sh-beginning-of-compound-command
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471 map (current-global-map))
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 (substitute-key-definition 'backward-sentence 'sh-beginning-of-command
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 map (current-global-map))
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 (substitute-key-definition 'forward-sentence 'sh-end-of-command
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 map (current-global-map))
13705
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
476 (define-key map [menu-bar insert] (cons "Insert" menu-map))
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
477 (define-key menu-map [sh-while] '("While Loop" . sh-while))
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
478 (define-key menu-map [sh-until] '("Until Loop" . sh-until))
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
479 (define-key menu-map [sh-tmp-file] '("Temporary File" . sh-tmp-file))
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
480 (define-key menu-map [sh-select] '("Select Statement" . sh-select))
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
481 (define-key menu-map [sh-repeat] '("Repeat Loop" . sh-repeat))
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
482 (define-key menu-map [sh-while-getopts]
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
483 '("Options Loop" . sh-while-getopts))
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
484 (define-key menu-map [sh-indexed-loop]
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
485 '("Indexed Loop" . sh-indexed-loop))
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
486 (define-key menu-map [sh-if] '("If Statement" . sh-if))
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
487 (define-key menu-map [sh-for] '("For Loop" . sh-for))
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
488 (define-key menu-map [sh-case] '("Case Statement" . sh-case))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
489 map)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
490 "Keymap used in Shell-Script mode.")
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
491
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
492
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
494 (defcustom sh-dynamic-complete-functions
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
495 '(shell-dynamic-complete-environment-variable
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
496 shell-dynamic-complete-command
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
497 comint-dynamic-complete-filename)
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
498 "*Functions for doing TAB dynamic completion."
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
499 :type '(repeat function)
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
500 :group 'sh-script)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
503 (defcustom sh-require-final-newline
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
504 '((csh . t)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
505 (pdksh . t)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
506 (rc eval . require-final-newline)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
507 (sh eval . require-final-newline))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
508 "*Value of `require-final-newline' in Shell-Script mode buffers.
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
509 See `sh-feature'."
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
510 :type '(repeat (cons (symbol :tag "Shell")
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
511 (choice (const :tag "require" t)
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
512 (cons :format "Evaluate: %v"
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
513 (const :format "" eval)
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
514 sexp))))
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
515 :group 'sh-script)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517
17531
b891e41b4011 (sh-case): Make this a simple define-skeleton
Richard M. Stallman <rms@gnu.org>
parents: 17501
diff changeset
518 (defcustom sh-assignment-regexp
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
519 '((csh . "\\<\\([a-zA-Z0-9_]+\\)\\(\\[.+\\]\\)?[ \t]*[-+*/%^]?=")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
520 ;; actually spaces are only supported in let/(( ... ))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
521 (ksh88 . "\\<\\([a-zA-Z0-9_]+\\)\\(\\[.+\\]\\)?[ \t]*\\([-+*/%&|~^]\\|<<\\|>>\\)?=")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
522 (rc . "\\<\\([a-zA-Z0-9_*]+\\)[ \t]*=")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
523 (sh . "\\<\\([a-zA-Z0-9_]+\\)="))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
524 "*Regexp for the variable name and what may follow in an assignment.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
525 First grouping matches the variable name. This is upto and including the `='
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
526 sign. See `sh-feature'."
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
527 :type '(repeat (cons (symbol :tag "Shell")
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
528 (choice regexp
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
529 (cons :format "Evaluate: %v"
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
530 (const :format "" eval)
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
531 sexp))))
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
532 :group 'sh-script)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
533
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
534
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
535 (defcustom sh-indentation 4
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
536 "The width for further indentation in Shell-Script mode."
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
537 :type 'integer
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
538 :group 'sh-script)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
539
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
540
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
541 (defcustom sh-remember-variable-min 3
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
542 "*Don't remember variables less than this length for completing reads."
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
543 :type 'integer
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
544 :group 'sh-script)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
545
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
546
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
547 (defvar sh-header-marker nil
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
548 "When non-nil is the end of header for prepending by \\[sh-execute-region].
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
549 That command is also used for setting this variable.")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
550
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
551
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
552 (defcustom sh-beginning-of-command
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
553 "\\([;({`|&]\\|\\`\\|[^\\]\n\\)[ \t]*\\([/~a-zA-Z0-9:]\\)"
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
554 "*Regexp to determine the beginning of a shell command.
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
555 The actual command starts at the beginning of the second \\(grouping\\)."
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
556 :type 'regexp
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
557 :group 'sh-script)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
558
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
559
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
560 (defcustom sh-end-of-command
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
561 "\\([/~a-zA-Z0-9:]\\)[ \t]*\\([;#)}`|&]\\|$\\)"
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 "*Regexp to determine the end of a shell command.
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
563 The actual command ends at the end of the first \\(grouping\\)."
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
564 :type 'regexp
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
565 :group 'sh-script)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
566
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
567
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
568
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
569 (defvar sh-here-document-word "EOF"
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
570 "Word to delimit here documents.")
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
571
12863
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
572 (defvar sh-test
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
573 '((sh "[ ]" . 3)
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
574 (ksh88 "[[ ]]" . 4))
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
575 "Initial input in Bourne if, while and until skeletons. See `sh-feature'.")
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
576
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
577
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
578 ;; customized this out of sheer bravado. not for the faint of heart.
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
579 ;; but it *did* have an asterisk in the docstring!
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
580 (defcustom sh-builtins
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
581 '((bash eval sh-append posix
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
582 "alias" "bg" "bind" "builtin" "declare" "dirs" "enable" "fc" "fg"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
583 "help" "history" "jobs" "kill" "let" "local" "popd" "pushd" "source"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
584 "suspend" "typeset" "unalias")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
585
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
586 ;; The next entry is only used for defining the others
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
587 (bourne eval sh-append shell
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
588 "eval" "export" "getopts" "newgrp" "pwd" "read" "readonly"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
589 "times" "ulimit")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
590
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
591 (csh eval sh-append shell
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
592 "alias" "chdir" "glob" "history" "limit" "nice" "nohup" "rehash"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
593 "setenv" "source" "time" "unalias" "unhash")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
594
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
595 (dtksh eval identity wksh)
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
596
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
597 (es "access" "apids" "cd" "echo" "eval" "false" "let" "limit" "local"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
598 "newpgrp" "result" "time" "umask" "var" "vars" "wait" "whatis")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
599
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
600 (jsh eval sh-append sh
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
601 "bg" "fg" "jobs" "kill" "stop" "suspend")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
602
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
603 (jcsh eval sh-append csh
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
604 "bg" "fg" "jobs" "kill" "notify" "stop" "suspend")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
605
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
606 (ksh88 eval sh-append bourne
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
607 "alias" "bg" "false" "fc" "fg" "jobs" "kill" "let" "print" "time"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
608 "typeset" "unalias" "whence")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
609
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
610 (oash eval sh-append sh
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
611 "checkwin" "dateline" "error" "form" "menu" "newwin" "oadeinit"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
612 "oaed" "oahelp" "oainit" "pp" "ppfile" "scan" "scrollok" "wattr"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
613 "wclear" "werase" "win" "wmclose" "wmmessage" "wmopen" "wmove"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
614 "wmtitle" "wrefresh")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
615
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
616 (pdksh eval sh-append ksh88
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
617 "bind")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
618
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
619 (posix eval sh-append sh
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
620 "command")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
621
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
622 (rc "builtin" "cd" "echo" "eval" "limit" "newpgrp" "shift" "umask" "wait"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
623 "whatis")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
624
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
625 (sh eval sh-append bourne
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
626 "hash" "test" "type")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
627
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
628 ;; The next entry is only used for defining the others
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
629 (shell "cd" "echo" "eval" "set" "shift" "umask" "unset" "wait")
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
630
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
631 (wksh eval sh-append ksh88
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
632 "Xt[A-Z][A-Za-z]*")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
633
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
634 (zsh eval sh-append ksh88
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
635 "autoload" "bindkey" "builtin" "chdir" "compctl" "declare" "dirs"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
636 "disable" "disown" "echotc" "enable" "functions" "getln" "hash"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
637 "history" "integer" "limit" "local" "log" "popd" "pushd" "r"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
638 "readonly" "rehash" "sched" "setopt" "source" "suspend" "true"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
639 "ttyctl" "type" "unfunction" "unhash" "unlimit" "unsetopt" "vared"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
640 "which"))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
641 "*List of all shell builtins for completing read and fontification.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
642 Note that on some systems not all builtins are available or some are
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
643 implemented as aliases. See `sh-feature'."
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
644 :type '(repeat (cons (symbol :tag "Shell")
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
645 (choice (repeat string)
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
646 (cons :format "Evaluate: %v"
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
647 (const :format "" eval)
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
648 sexp))))
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
649 :group 'sh-script)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
650
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
651
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
652
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
653 (defcustom sh-leading-keywords
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
654 '((csh "else")
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
655
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
656 (es "true" "unwind-protect" "whatis")
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
657
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
658 (rc "else")
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
659
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
660 (sh "do" "elif" "else" "if" "then" "trap" "type" "until" "while"))
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
661 "*List of keywords that may be immediately followed by a builtin or keyword.
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
662 Given some confusion between keywords and builtins depending on shell and
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
663 system, the distinction here has been based on whether they influence the
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
664 flow of control or syntax. See `sh-feature'."
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
665 :type '(repeat (cons (symbol :tag "Shell")
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
666 (choice (repeat string)
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
667 (cons :format "Evaluate: %v"
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
668 (const :format "" eval)
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
669 sexp))))
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
670 :group 'sh-script)
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
671
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
672
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
673 (defcustom sh-other-keywords
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
674 '((bash eval sh-append bourne
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
675 "bye" "logout")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
676
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
677 ;; The next entry is only used for defining the others
16810
20dc495230a0 (sh-shell-file): On MSDOS, collapse $SHELL to lower
Richard M. Stallman <rms@gnu.org>
parents: 16552
diff changeset
678 (bourne eval sh-append sh
20dc495230a0 (sh-shell-file): On MSDOS, collapse $SHELL to lower
Richard M. Stallman <rms@gnu.org>
parents: 16552
diff changeset
679 "function")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
680
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
681 (csh eval sh-append shell
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
682 "breaksw" "default" "end" "endif" "endsw" "foreach" "goto"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
683 "if" "logout" "onintr" "repeat" "switch" "then" "while")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
684
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
685 (es "break" "catch" "exec" "exit" "fn" "for" "forever" "fork" "if"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
686 "return" "throw" "while")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
687
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
688 (ksh88 eval sh-append bourne
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
689 "select")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
690
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
691 (rc "break" "case" "exec" "exit" "fn" "for" "if" "in" "return" "switch"
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
692 "while")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
693
16810
20dc495230a0 (sh-shell-file): On MSDOS, collapse $SHELL to lower
Richard M. Stallman <rms@gnu.org>
parents: 16552
diff changeset
694 (sh eval sh-append shell
20dc495230a0 (sh-shell-file): On MSDOS, collapse $SHELL to lower
Richard M. Stallman <rms@gnu.org>
parents: 16552
diff changeset
695 "done" "esac" "fi" "for" "in" "return")
20dc495230a0 (sh-shell-file): On MSDOS, collapse $SHELL to lower
Richard M. Stallman <rms@gnu.org>
parents: 16552
diff changeset
696
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
697 ;; The next entry is only used for defining the others
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
698 (shell "break" "case" "continue" "exec" "exit")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
699
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
700 (zsh eval sh-append bash
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
701 "select"))
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
702 "*List of keywords not in `sh-leading-keywords'.
17407
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
703 See `sh-feature'."
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
704 :type '(repeat (cons (symbol :tag "Shell")
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
705 (choice (repeat string)
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
706 (cons :format "Evaluate: %v"
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
707 (const :format "" eval)
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
708 sexp))))
ae0ba78d6c07 Add defgroup's; change use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17356
diff changeset
709 :group 'sh-script)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
710
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
711
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
712
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
713 (defvar sh-variables
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
714 '((bash eval sh-append sh
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
715 "allow_null_glob_expansion" "auto_resume" "BASH" "BASH_VERSION"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
716 "cdable_vars" "ENV" "EUID" "FCEDIT" "FIGNORE" "glob_dot_filenames"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
717 "histchars" "HISTFILE" "HISTFILESIZE" "history_control" "HISTSIZE"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
718 "hostname_completion_file" "HOSTTYPE" "IGNOREEOF" "ignoreeof"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
719 "LINENO" "MAIL_WARNING" "noclobber" "nolinks" "notify"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
720 "no_exit_on_failed_exec" "NO_PROMPT_VARS" "OLDPWD" "OPTERR" "PPID"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
721 "PROMPT_COMMAND" "PS4" "pushd_silent" "PWD" "RANDOM" "REPLY"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
722 "SECONDS" "SHLVL" "TMOUT" "UID")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
723
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
724 (csh eval sh-append shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
725 "argv" "cdpath" "child" "echo" "histchars" "history" "home"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
726 "ignoreeof" "mail" "noclobber" "noglob" "nonomatch" "path" "prompt"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
727 "shell" "status" "time" "verbose")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
728
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
729 (es eval sh-append shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
730 "apid" "cdpath" "CDPATH" "history" "home" "ifs" "noexport" "path"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
731 "pid" "prompt" "signals")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
732
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
733 (jcsh eval sh-append csh
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
734 "notify")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
735
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
736 (ksh88 eval sh-append sh
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
737 "ENV" "ERRNO" "FCEDIT" "FPATH" "HISTFILE" "HISTSIZE" "LINENO"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
738 "OLDPWD" "PPID" "PS3" "PS4" "PWD" "RANDOM" "REPLY" "SECONDS"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
739 "TMOUT")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
740
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
741 (oash eval sh-append sh
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
742 "FIELD" "FIELD_MAX" "LAST_KEY" "OALIB" "PP_ITEM" "PP_NUM")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
743
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
744 (rc eval sh-append shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
745 "apid" "apids" "cdpath" "CDPATH" "history" "home" "ifs" "path" "pid"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
746 "prompt" "status")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
747
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
748 (sh eval sh-append shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
749 "CDPATH" "IFS" "OPTARG" "OPTIND" "PS1" "PS2")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
750
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
751 ;; The next entry is only used for defining the others
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
752 (shell "COLUMNS" "EDITOR" "HOME" "HUSHLOGIN" "LANG" "LC_COLLATE"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
753 "LC_CTYPE" "LC_MESSAGES" "LC_MONETARY" "LC_NUMERIC" "LC_TIME"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
754 "LINES" "LOGNAME" "MAIL" "MAILCHECK" "MAILPATH" "PAGER" "PATH"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
755 "SHELL" "TERM" "TERMCAP" "TERMINFO" "VISUAL")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
756
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
757 (tcsh eval sh-append csh
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
758 "addsuffix" "ampm" "autocorrect" "autoexpand" "autolist"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
759 "autologout" "chase_symlinks" "correct" "dextract" "edit" "el"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
760 "fignore" "gid" "histlit" "HOST" "HOSTTYPE" "HPATH"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
761 "ignore_symlinks" "listjobs" "listlinks" "listmax" "matchbeep"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
762 "nobeep" "NOREBIND" "oid" "printexitvalue" "prompt2" "prompt3"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
763 "pushdsilent" "pushdtohome" "recexact" "recognize_only_executables"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
764 "rmstar" "savehist" "SHLVL" "showdots" "sl" "SYSTYPE" "tcsh" "term"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
765 "tperiod" "tty" "uid" "version" "visiblebell" "watch" "who"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
766 "wordchars")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
767
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
768 (zsh eval sh-append ksh88
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
769 "BAUD" "bindcmds" "cdpath" "DIRSTACKSIZE" "fignore" "FIGNORE" "fpath"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
770 "HISTCHARS" "hostcmds" "hosts" "HOSTS" "LISTMAX" "LITHISTSIZE"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
771 "LOGCHECK" "mailpath" "manpath" "NULLCMD" "optcmds" "path" "POSTEDIT"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
772 "prompt" "PROMPT" "PROMPT2" "PROMPT3" "PROMPT4" "psvar" "PSVAR"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
773 "READNULLCMD" "REPORTTIME" "RPROMPT" "RPS1" "SAVEHIST" "SPROMPT"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
774 "STTY" "TIMEFMT" "TMOUT" "TMPPREFIX" "varcmds" "watch" "WATCH"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
775 "WATCHFMT" "WORDCHARS" "ZDOTDIR"))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
776 "List of all shell variables available for completing read.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
777 See `sh-feature'.")
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
778
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
779
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
780
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
781 (defvar sh-font-lock-keywords
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
782 '((csh eval sh-append shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
783 '("\\${?[#?]?\\([A-Za-z_][A-Za-z0-9_]*\\|0\\)" 1
12863
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
784 font-lock-variable-name-face))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
785
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
786 (es eval sh-append executable-font-lock-keywords
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
787 '("\\$#?\\([A-Za-z_][A-Za-z0-9_]*\\|[0-9]+\\)" 1
12863
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
788 font-lock-variable-name-face))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
789
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
790 (rc eval identity es)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
791
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
792 (sh eval sh-append shell
20900
bab0b53038ee (sh-font-lock-keywords): Fontify sh-style function names in declarations.
Richard M. Stallman <rms@gnu.org>
parents: 20886
diff changeset
793 ;; Variable names.
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
794 '("\\$\\({#?\\)?\\([A-Za-z_][A-Za-z0-9_]*\\|[-#?@!]\\)" 2
20900
bab0b53038ee (sh-font-lock-keywords): Fontify sh-style function names in declarations.
Richard M. Stallman <rms@gnu.org>
parents: 20886
diff changeset
795 font-lock-variable-name-face)
bab0b53038ee (sh-font-lock-keywords): Fontify sh-style function names in declarations.
Richard M. Stallman <rms@gnu.org>
parents: 20886
diff changeset
796 ;; Function names.
bab0b53038ee (sh-font-lock-keywords): Fontify sh-style function names in declarations.
Richard M. Stallman <rms@gnu.org>
parents: 20886
diff changeset
797 '("^\\(\\sw+\\)[ \t]*(" 1 font-lock-function-name-face)
bab0b53038ee (sh-font-lock-keywords): Fontify sh-style function names in declarations.
Richard M. Stallman <rms@gnu.org>
parents: 20886
diff changeset
798 '("\\<\\(function\\)\\>[ \t]*\\(\\sw+\\)?"
bab0b53038ee (sh-font-lock-keywords): Fontify sh-style function names in declarations.
Richard M. Stallman <rms@gnu.org>
parents: 20886
diff changeset
799 (1 font-lock-keyword-face) (2 font-lock-function-name-face nil t)))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
800
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
801 ;; The next entry is only used for defining the others
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
802 (shell eval sh-append executable-font-lock-keywords
14849
e36c046e28b1 (sh-font-lock-keywords): Highlight \ only with non-alphanumeric char.
Richard M. Stallman <rms@gnu.org>
parents: 14418
diff changeset
803 '("\\\\[^A-Za-z0-9]" 0 font-lock-string-face)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
804 '("\\${?\\([A-Za-z_][A-Za-z0-9_]*\\|[0-9]+\\|[$*_]\\)" 1
23501
f12ae4499ae0 (sh-mode): Handle .spec and .mspec files.
Richard M. Stallman <rms@gnu.org>
parents: 23341
diff changeset
805 font-lock-variable-name-face))
f12ae4499ae0 (sh-mode): Handle .spec and .mspec files.
Richard M. Stallman <rms@gnu.org>
parents: 23341
diff changeset
806 (rpm eval sh-append rpm2
f12ae4499ae0 (sh-mode): Handle .spec and .mspec files.
Richard M. Stallman <rms@gnu.org>
parents: 23341
diff changeset
807 '("%{?\\(\\sw+\\)" 1 font-lock-keyword-face))
f12ae4499ae0 (sh-mode): Handle .spec and .mspec files.
Richard M. Stallman <rms@gnu.org>
parents: 23341
diff changeset
808 (rpm2 eval sh-append shell
f12ae4499ae0 (sh-mode): Handle .spec and .mspec files.
Richard M. Stallman <rms@gnu.org>
parents: 23341
diff changeset
809 '("^\\(\\sw+\\):" 1 font-lock-variable-name-face)))
18024
58afe194f1bd Update for syntax-table text properties.
Simon Marshall <simon@gnu.org>
parents: 17531
diff changeset
810 "Default expressions to highlight in Shell Script modes. See `sh-feature'.")
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
811
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
812 (defvar sh-font-lock-keywords-1
13705
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
813 '((sh "[ \t]in\\>"))
18024
58afe194f1bd Update for syntax-table text properties.
Simon Marshall <simon@gnu.org>
parents: 17531
diff changeset
814 "Subdued level highlighting for Shell Script modes.")
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
815
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
816 (defvar sh-font-lock-keywords-2 ()
18024
58afe194f1bd Update for syntax-table text properties.
Simon Marshall <simon@gnu.org>
parents: 17531
diff changeset
817 "Gaudy level highlighting for Shell Script modes.")
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
818
18024
58afe194f1bd Update for syntax-table text properties.
Simon Marshall <simon@gnu.org>
parents: 17531
diff changeset
819 (defconst sh-font-lock-syntactic-keywords
58afe194f1bd Update for syntax-table text properties.
Simon Marshall <simon@gnu.org>
parents: 17531
diff changeset
820 ;; Mark a `#' character as having punctuation syntax in a variable reference.
20420
6cb3b9732db5 Deal with `#'s in variable references.
Simon Marshall <simon@gnu.org>
parents: 20395
diff changeset
821 ;; Really we should do this properly. From Chet Ramey and Brian Fox:
6cb3b9732db5 Deal with `#'s in variable references.
Simon Marshall <simon@gnu.org>
parents: 20395
diff changeset
822 ;; "A `#' begins a comment when it is unquoted and at the beginning of a
6cb3b9732db5 Deal with `#'s in variable references.
Simon Marshall <simon@gnu.org>
parents: 20395
diff changeset
823 ;; word. In the shell, words are separated by metacharacters."
6cb3b9732db5 Deal with `#'s in variable references.
Simon Marshall <simon@gnu.org>
parents: 20395
diff changeset
824 ;; To do this in a regexp would be slow as it would be anchored to the right.
6cb3b9732db5 Deal with `#'s in variable references.
Simon Marshall <simon@gnu.org>
parents: 20395
diff changeset
825 ;; But I can't be bothered to write a function to do it properly and
6cb3b9732db5 Deal with `#'s in variable references.
Simon Marshall <simon@gnu.org>
parents: 20395
diff changeset
826 ;; efficiently. So we only do it properly for `#' in variable references and
6cb3b9732db5 Deal with `#'s in variable references.
Simon Marshall <simon@gnu.org>
parents: 20395
diff changeset
827 ;; do it efficiently by anchoring the regexp to the left.
6cb3b9732db5 Deal with `#'s in variable references.
Simon Marshall <simon@gnu.org>
parents: 20395
diff changeset
828 '(("\\${?[^}#\n\t ]*\\(##?\\)" 1 (1 . nil))))
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
829
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
830 (defgroup sh-indentation nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
831 "Variables controlling indentation in shell scripts.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
832
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
833 Note: customizing these variables will not affect existing buffers if
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
834 `sh-make-vars-local' is no-nil. See the documentation for
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
835 variable `sh-make-vars-local', command `sh-make-vars-local'
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
836 and command `sh-reset-indent-vars-to-global-values'."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
837 :group 'sh-script)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
838
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
839
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
840 (defcustom sh-set-shell-hook nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
841 "*Hook run by `sh-set-shell'."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
842 :type 'hook
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
843 :group 'sh-script)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
844
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
845 (defcustom sh-mode-hook nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
846 "*Hook run by `sh-mode'."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
847 :type 'hook
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
848 :group 'sh-script)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
849
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
850 (defcustom sh-learn-basic-offset nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
851 "*When `sh-guess-basic-offset' should learn `sh-basic-offset'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
852
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
853 nil mean: never.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
854 t means: only if there seems to be an obvious value.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
855 Anything else means: whenever we have a \"good guess\" as to the value."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
856 :type '(choice
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
857 (const :tag "Never" nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
858 (const :tag "Only if sure" t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
859 (const :tag "If have a good guess" usually)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
860 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
861 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
862
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
863 (defcustom sh-popup-occur-buffer nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
864 "*Controls when `sh-learn-buffer-indent' poos the *indent* buffer.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
865 If t it is always shown. If nil, it is shown only when there
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
866 are conflicts."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
867 :type '(choice
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
868 (const :tag "Only when there are conflicts." nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
869 (const :tag "Always" t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
870 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
871 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
872
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
873 (defcustom sh-blink t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
874 "*If non-nil, `sh-show-indent' shows the line indentation is relative to.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
875 The position on the line is not necessarily meaningful.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
876 In some cases the line will be the matching keyword, but this is not
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
877 always the case."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
878 :type 'boolean
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
879 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
880
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
881 (defcustom sh-first-lines-indent 0
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
882 "*The indentation of the first non-blank non-comment line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
883 Usually 0 meaning first column.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
884 Can be set to a number, or to nil which means leave it as is."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
885 :type '(choice
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
886 (const :tag "Leave as is" nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
887 (integer :tag "Column number"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
888 :menu-tag "Indent to this col (0 means first col)" )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
889 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
890 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
891
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
892
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
893 (defcustom sh-basic-offset 4
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
894 "*The default indentation incrementation.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
895 This value is used for the + and - symbols in an indentation variable."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
896 :type 'integer
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
897 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
898
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
899 (defcustom sh-indent-comment nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
900 "*How a comment line is to be indented.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
901 nil means leave it as it is;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
902 t means indent it as a normal line, aligning it to previous non-blank
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
903 non-comment line;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
904 a number means align to that column, e.g. 0 means fist column."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
905 :type '(choice
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
906 (const :tag "Leave as is." nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
907 (const :tag "Indent as a normal line." t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
908 (integer :menu-tag "Indent to this col (0 means first col)."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
909 :tag "Indent to column number.") )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
910 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
911
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
912
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
913 (defvar sh-debug nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
914 "Enable lots of debug messages - if function `sh-debug' is enabled.")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
915
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
916
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
917 ;; Uncomment this defun and comment the defmacro for debugging.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
918 ;; (defun sh-debug (&rest args)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
919 ;; "For debugging: display message ARGS if variable SH-DEBUG is non-nil."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
920 ;; (if sh-debug
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
921 ;; (apply 'message args)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
922 (defmacro sh-debug (&rest args))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
923
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
924 (defconst sh-symbol-list
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
925 '((const :tag "+ " :value +
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
926 :menu-tag "+ Indent right by sh-basic-offset")
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
927 (const :tag "- " :value -
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
928 :menu-tag "- Indent left by sh-basic-offset")
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
929 (const :tag "++" :value ++
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
930 :menu-tag "++ Indent right twice sh-basic-offset")
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
931 (const :tag "--" :value --
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
932 :menu-tag "-- Indent left twice sh-basic-offset")
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
933 (const :tag "* " :value *
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
934 :menu-tag "* Indent right half sh-basic-offset")
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
935 (const :tag "/ " :value /
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
936 :menu-tag "/ Indent left half sh-basic-offset")))
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
937
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
938 (defcustom sh-indent-for-else 0
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
939 "*How much to indent an else relative to an if. Usually 0."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
940 :type `(choice
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
941 (integer :menu-tag "A number (positive=>indent right)"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
942 :tag "A number")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
943 (const :tag "--") ;; separator!
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
944 ,@ sh-symbol-list
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
945 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
946 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
947
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
948 (defconst sh-number-or-symbol-list
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
949 (append (list '(integer :menu-tag "A number (positive=>indent right)"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
950 :tag "A number")
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
951 '(const :tag "--")) ; separator
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
952 sh-symbol-list))
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
953
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
954 (defcustom sh-indent-for-fi 0
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
955 "*How much to indent a fi relative to an if. Usually 0."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
956 :type `(choice ,@ sh-number-or-symbol-list )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
957 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
958
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
959 (defcustom sh-indent-for-done '0
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
960 "*How much to indent a done relative to its matching stmt. Usually 0."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
961 :type `(choice ,@ sh-number-or-symbol-list )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
962 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
963
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
964 (defcustom sh-indent-after-else '+
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
965 "*How much to indent a statement after an else statement."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
966 :type `(choice ,@ sh-number-or-symbol-list )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
967 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
968
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
969 (defcustom sh-indent-after-if '+
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
970 "*How much to indent a statement after an if statement.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
971 This includes lines after else and elif statements, too, but
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
972 does not affect then else elif or fi statements themselves."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
973 :type `(choice ,@ sh-number-or-symbol-list )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
974 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
975
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
976 (defcustom sh-indent-for-then '+
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
977 "*How much to indent an then relative to an if."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
978 :type `(choice ,@ sh-number-or-symbol-list )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
979 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
980
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
981 (defcustom sh-indent-for-do '*
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
982 "*How much to indent a do statement.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
983 This is relative to the statement before the do, i.e. the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
984 while until or for statement."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
985 :type `(choice ,@ sh-number-or-symbol-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
986 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
987
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
988 (defcustom sh-indent-after-do '*
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
989 "*How much to indent a line after a do statement.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
990 This is used when the do is the first word of the line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
991 This is relative to the statement before the do, e.g. a
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
992 while for repeat or select statement."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
993 :type `(choice ,@ sh-number-or-symbol-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
994 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
995
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
996 (defcustom sh-indent-after-loop-construct '+
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
997 "*How much to indent a statement after a loop construct.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
998
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
999 This variable is used when the keyword \"do\" is on the same line as the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1000 loop statement (e.g. \"until\", \"while\" or \"for\").
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1001 If the do is on a line by itself, then `sh-indent-after-do' is used instead."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1002 :type `(choice ,@ sh-number-or-symbol-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1003 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1004
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1005
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1006 (defcustom sh-indent-after-done 0
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1007 "*How much to indent a statement after a \"done\" keyword.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1008 Normally this is 0, which aligns the \"done\" to the matching
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1009 looping construct line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1010 Setting it non-zero allows you to have the \"do\" statement on a line
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1011 by itself and align the done under to do."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1012 :type `(choice ,@ sh-number-or-symbol-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1013 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1014
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1015 (defcustom sh-indent-for-case-label '+
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1016 "*How much to indent a case label statement.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1017 This is relative to the line containing the case statement."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1018 :type `(choice ,@ sh-number-or-symbol-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1019 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1020
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1021 (defcustom sh-indent-for-case-alt '++
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1022 "*How much to indent statements after the case label.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1023 This is relative to the line containing the case statement."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1024 :type `(choice ,@ sh-number-or-symbol-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1025 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1026
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1027
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1028 (defcustom sh-indent-for-continuation '+
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1029 "*How much to indent for a continuation statement."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1030 :type `(choice ,@ sh-number-or-symbol-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1031 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1032
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1033 (defcustom sh-indent-after-open '+
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1034 "*How much to indent after a line with an opening parenthesis or brace.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1035 For an open paren after a function `sh-indent-after-function' is used."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1036 :type `(choice ,@ sh-number-or-symbol-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1037 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1038
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1039 (defcustom sh-indent-after-function '+
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1040 "*How much to indent after a function line."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1041 :type `(choice ,@ sh-number-or-symbol-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1042 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1043
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1044 ;; These 2 are for the rc shell:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1045
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1046 (defcustom sh-indent-after-switch '+
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1047 "*How much to indent a case statement relative to the switch statement.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1048 This is for the rc shell."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1049 :type `(choice ,@ sh-number-or-symbol-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1050 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1051
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1052 (defcustom sh-indent-after-case '+
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1053 "*How much to indent a statement relative to the case statement.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1054 This is for the rc shell."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1055 :type `(choice ,@ sh-number-or-symbol-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1056 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1057
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1058 (defface sh-heredoc-face
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1059 '((((class color)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1060 (background dark))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1061 (:foreground "yellow" :bold t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1062 (((class color)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1063 (background light))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1064 (:foreground "tan" ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1065 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1066 (:bold t)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1067 "Face to show a here-document"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1068 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1069
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1070 (defface sh-st-face
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1071 '((((class color)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1072 (background dark))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1073 (:foreground "yellow" :bold t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1074 (((class color)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1075 (background light))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1076 (:foreground "tan" ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1077 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1078 (:bold t)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1079 "Face to show characters with special syntax properties."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1080 :group 'sh-indentation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1081
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1082
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1083 ;; Internal use - not designed to be changed by the user:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1084
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1085 ;; These are used for the syntax table stuff (derived from cperl-mode).
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1086 ;; Note: parse-sexp-lookup-properties must be set to t for it to work.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1087 (defconst sh-here-doc-syntax '(15)) ;; generic string
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1088 (defconst sh-st-punc '(1))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1089 (defconst sh-special-syntax sh-st-punc)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1090
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1091 (defun sh-mkword-regexpr (word)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1092 "Make a regexp which matches WORD as a word.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1093 This specifically excludes an occurance of WORD followed by
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1094 punctuation characters like '-'."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1095 (concat word "\\([^-a-z0-9_]\\|$\\)"))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1096
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1097 (defun sh-mkword-regexp (word)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1098 "Make a regexp which matches WORD as a word.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1099 This specifically excludes an occurance of WORD followed by
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1100 or preceded by punctuation characters like '-'."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1101 (concat "\\(^\\|[^-a-z0-9_]\\)" word "\\([^-a-z0-9_]\\|$\\)"))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1102
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1103 (defconst sh-re-done (sh-mkword-regexpr "done"))
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1104
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1105
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1106 (defconst sh-kws-for-done
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1107 '((sh . ( "while" "until" "for" ) )
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1108 (bash . ( "while" "until" "for" "select" ) )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1109 (ksh88 . ( "while" "until" "for" "select" ) )
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1110 (zsh . ( "while" "until" "for" "repeat" "select" ) ) )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1111 "Which keywords can match the word `done' in this shell.")
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1112
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1113
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1114 (defconst sh-indent-supported
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1115 '((sh . t)
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1116 (csh . nil)
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1117 (rc . t))
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1118 "Shell types that shell indenting can do something with.")
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1119
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1120 (defvar sh-indent-supported-here nil
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1121 "Non-nil if we support indentation for the current buffer's shell type.")
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1122
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1123 (defconst sh-electric-rparen-needed
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1124 '((sh . t))
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1125 "Non-nil if the shell type needs an electric handling of case alternatives.")
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1126
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1127 (defvar sh-electric-rparen-needed-here nil
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1128 "Non-nil if the buffer needs an electric handling of case alternatives.")
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1129
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1130 (defconst sh-var-list
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1131 '(
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1132 sh-basic-offset sh-first-lines-indent sh-indent-after-case
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1133 sh-indent-after-do sh-indent-after-done
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1134 sh-indent-after-else
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1135 sh-indent-after-if
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1136 sh-indent-after-loop-construct
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1137 sh-indent-after-open
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1138 sh-indent-comment
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1139 sh-indent-for-case-alt
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1140 sh-indent-for-case-label
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1141 sh-indent-for-continuation
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1142 sh-indent-for-do
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1143 sh-indent-for-done
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1144 sh-indent-for-else
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1145 sh-indent-for-fi
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1146 sh-indent-for-then
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1147 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1148 "A list of variables used by script mode to control indentation.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1149 This list is used when switching between buffer-local and global
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1150 values of variables, and for the commands using indenation styles.")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1151
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1152 (defvar sh-make-vars-local t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1153 "*Controls whether indentation variables are local to the buffer.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1154 If non-nil, indentation variables are made local initially.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1155 If nil, you can later make the variables local by invoking
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1156 command `sh-make-vars-local'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1157 The default is t because I assume that in one Emacs session one is
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1158 frequently editing existing scripts with different styles.")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1159
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1160
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1161 ;; mode-command and utility functions
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1162
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1163 ;;;###autoload
14195
df3c52ae5b14 (sh-shell-variables): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1164 (put 'sh-mode 'mode-class 'special)
14221
cd28284abca4 (sh-mode): Add autoload cookie.
Erik Naggum <erik@naggum.no>
parents: 14211
diff changeset
1165
cd28284abca4 (sh-mode): Add autoload cookie.
Erik Naggum <erik@naggum.no>
parents: 14211
diff changeset
1166 ;;;###autoload
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1167 (defun sh-mode ()
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1168 "Major mode for editing shell scripts.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1169 This mode works for many shells, since they all have roughly the same syntax,
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1170 as far as commands, arguments, variables, pipes, comments etc. are concerned.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1171 Unless the file's magic number indicates the shell, your usual shell is
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1172 assumed. Since filenames rarely give a clue, they are not further analyzed.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1173
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1174 This mode adapts to the variations between shells (see `sh-set-shell') by
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1175 means of an inheritance based feature lookup (see `sh-feature'). This
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1176 mechanism applies to all variables (including skeletons) that pertain to
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1177 shell-specific features.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1178
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1179 The default style of this mode is that of Rosenblatt's Korn shell book.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1180 The syntax of the statements varies with the shell being used. The
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1181 following commands are available, based on the current shell's syntax:
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1182
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1183 \\[sh-case] case statement
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1184 \\[sh-for] for loop
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1185 \\[sh-function] function definition
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1186 \\[sh-if] if statement
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1187 \\[sh-indexed-loop] indexed loop from 1 to n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1188 \\[sh-while-getopts] while getopts loop
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1189 \\[sh-repeat] repeat loop
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1190 \\[sh-select] select loop
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1191 \\[sh-until] until loop
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1192 \\[sh-while] while loop
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1193
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1194 For sh and rc shells indentation commands are:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1195 \\[sh-show-indent] Show the variable controlling this line's indentation.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1196 \\[sh-set-indent] Set then variable controlling this line's indentation.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1197 \\[sh-learn-line-indent] Change the indentation variable so this line
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1198 would indent to the way it currently is.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1199 \\[sh-learn-buffer-indent] Set the indentation variables so the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1200 buffer indents as it currently is indendeted.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1201
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1202
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1203 \\[backward-delete-char-untabify] Delete backward one position, even if it was a tab.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1204 \\[sh-newline-and-indent] Delete unquoted space and indent new line same as this one.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1205 \\[sh-end-of-command] Go to end of successive commands.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1206 \\[sh-beginning-of-command] Go to beginning of successive commands.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1207 \\[sh-set-shell] Set this buffer's shell, and maybe its magic number.
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1208 \\[sh-execute-region] Have optional header and region be executed in a subshell.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1209
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1210 \\[sh-maybe-here-document] Without prefix, following an unquoted < inserts here document.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1211 {, (, [, ', \", `
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1212 Unless quoted with \\, insert the pairs {}, (), [], or '', \"\", ``.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1213
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1214 If you generally program a shell different from your login shell you can
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1215 set `sh-shell-file' accordingly. If your shell's file name doesn't correctly
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1216 indicate what shell it is use `sh-alias-alist' to translate.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1217
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1218 If your shell gives error messages with line numbers, you can use \\[executable-interpret]
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1219 with your script for an edit-interpret-debug cycle."
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1220 (interactive)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1221 (kill-all-local-variables)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1222 (use-local-map sh-mode-map)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1223 (make-local-variable 'indent-line-function)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1224 (make-local-variable 'indent-region-function)
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1225 (make-local-variable 'skeleton-end-hook)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1226 (make-local-variable 'paragraph-start)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1227 (make-local-variable 'paragraph-separate)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1228 (make-local-variable 'comment-start)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1229 (make-local-variable 'comment-start-skip)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1230 (make-local-variable 'require-final-newline)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1231 (make-local-variable 'sh-header-marker)
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1232 (make-local-variable 'sh-shell-file)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1233 (make-local-variable 'sh-shell)
12864
3b9dcd964c66 (sh-mode-map): Use new name skeleton-pair-insert-maybe.
Karl Heuer <kwzh@gnu.org>
parents: 12863
diff changeset
1234 (make-local-variable 'skeleton-pair-alist)
3b9dcd964c66 (sh-mode-map): Use new name skeleton-pair-insert-maybe.
Karl Heuer <kwzh@gnu.org>
parents: 12863
diff changeset
1235 (make-local-variable 'skeleton-pair-filter)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1236 (make-local-variable 'comint-dynamic-complete-functions)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1237 (make-local-variable 'comint-prompt-regexp)
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1238 (make-local-variable 'font-lock-defaults)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1239 (make-local-variable 'skeleton-filter)
12887
cbed067bf52d (sh-newline-and-indent): Don't interpret prefix arg
Karl Heuer <kwzh@gnu.org>
parents: 12864
diff changeset
1240 (make-local-variable 'skeleton-newline-indent-rigidly)
14418
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
1241 (make-local-variable 'sh-shell-variables)
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
1242 (make-local-variable 'sh-shell-variables-initialized)
20395
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
1243 (make-local-variable 'imenu-generic-expression)
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1244 (make-local-variable 'sh-electric-rparen-needed-here)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1245 (make-local-variable 'sh-indent-supported-here)
26813
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
1246 (make-local-variable 'font-lock-unfontify-region-function)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1247 (setq major-mode 'sh-mode
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1248 mode-name "Shell-script"
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1249 ;; not very clever, but enables wrapping skeletons around regions
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1250 indent-region-function (lambda (b e)
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1251 (save-excursion
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1252 (goto-char b)
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1253 (skip-syntax-backward "-")
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1254 (setq b (point))
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1255 (goto-char e)
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1256 (skip-syntax-backward "-")
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1257 (indent-rigidly b (point) sh-indentation)))
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1258 skeleton-end-hook (lambda ()
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1259 (or (eolp) (newline) (indent-relative)))
13705
4111cc3136d1 (sh-mode-map): Make the code more legible.
Karl Heuer <kwzh@gnu.org>
parents: 13510
diff changeset
1260 paragraph-start (concat page-delimiter "\\|$")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1261 paragraph-separate paragraph-start
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1262 comment-start "# "
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1263 comint-dynamic-complete-functions sh-dynamic-complete-functions
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1264 ;; we can't look if previous line ended with `\'
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1265 comint-prompt-regexp "^[ \t]*"
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1266 font-lock-defaults
18024
58afe194f1bd Update for syntax-table text properties.
Simon Marshall <simon@gnu.org>
parents: 17531
diff changeset
1267 '((sh-font-lock-keywords
58afe194f1bd Update for syntax-table text properties.
Simon Marshall <simon@gnu.org>
parents: 17531
diff changeset
1268 sh-font-lock-keywords-1 sh-font-lock-keywords-2)
58afe194f1bd Update for syntax-table text properties.
Simon Marshall <simon@gnu.org>
parents: 17531
diff changeset
1269 nil nil
58afe194f1bd Update for syntax-table text properties.
Simon Marshall <simon@gnu.org>
parents: 17531
diff changeset
1270 ((?/ . "w") (?~ . "w") (?. . "w") (?- . "w") (?_ . "w")) nil
58afe194f1bd Update for syntax-table text properties.
Simon Marshall <simon@gnu.org>
parents: 17531
diff changeset
1271 (font-lock-syntactic-keywords . sh-font-lock-syntactic-keywords))
26813
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
1272 font-lock-unfontify-region-function
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
1273 'sh-font-lock-unfontify-region-function
12864
3b9dcd964c66 (sh-mode-map): Use new name skeleton-pair-insert-maybe.
Karl Heuer <kwzh@gnu.org>
parents: 12863
diff changeset
1274 skeleton-pair-alist '((?` _ ?`))
3b9dcd964c66 (sh-mode-map): Use new name skeleton-pair-insert-maybe.
Karl Heuer <kwzh@gnu.org>
parents: 12863
diff changeset
1275 skeleton-pair-filter 'sh-quoted-p
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1276 skeleton-further-elements '((< '(- (min sh-indentation
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1277 (current-column)))))
12887
cbed067bf52d (sh-newline-and-indent): Don't interpret prefix arg
Karl Heuer <kwzh@gnu.org>
parents: 12864
diff changeset
1278 skeleton-filter 'sh-feature
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1279 skeleton-newline-indent-rigidly t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1280 sh-electric-rparen-needed-here nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1281 sh-indent-supported-here nil)
22783
1fb9133a2851 (sh-mode): parse-sexp-ignore-comments = t.
Richard M. Stallman <rms@gnu.org>
parents: 21980
diff changeset
1282 (make-local-variable 'parse-sexp-ignore-comments)
1fb9133a2851 (sh-mode): parse-sexp-ignore-comments = t.
Richard M. Stallman <rms@gnu.org>
parents: 21980
diff changeset
1283 (setq parse-sexp-ignore-comments t)
16552
fe3d32bca2c5 (sh-set-shell): Pass args no-query-flag
Richard M. Stallman <rms@gnu.org>
parents: 16535
diff changeset
1284 ;; Parse or insert magic number for exec, and set all variables depending
fe3d32bca2c5 (sh-set-shell): Pass args no-query-flag
Richard M. Stallman <rms@gnu.org>
parents: 16535
diff changeset
1285 ;; on the shell thus determined.
fe3d32bca2c5 (sh-set-shell): Pass args no-query-flag
Richard M. Stallman <rms@gnu.org>
parents: 16535
diff changeset
1286 (let ((interpreter
fe3d32bca2c5 (sh-set-shell): Pass args no-query-flag
Richard M. Stallman <rms@gnu.org>
parents: 16535
diff changeset
1287 (save-excursion
fe3d32bca2c5 (sh-set-shell): Pass args no-query-flag
Richard M. Stallman <rms@gnu.org>
parents: 16535
diff changeset
1288 (goto-char (point-min))
23501
f12ae4499ae0 (sh-mode): Handle .spec and .mspec files.
Richard M. Stallman <rms@gnu.org>
parents: 23341
diff changeset
1289 (cond ((looking-at "#![ \t]?\\([^ \t\n]*/bin/env[ \t]\\)?\\([^ \t\n]+\\)")
24730
e1cb8de8ffb2 (sh-mode): Do not fail if buffer has no
Karl Heuer <kwzh@gnu.org>
parents: 23869
diff changeset
1290 (match-string 2))
e1cb8de8ffb2 (sh-mode): Do not fail if buffer has no
Karl Heuer <kwzh@gnu.org>
parents: 23869
diff changeset
1291 ((and buffer-file-name
e1cb8de8ffb2 (sh-mode): Do not fail if buffer has no
Karl Heuer <kwzh@gnu.org>
parents: 23869
diff changeset
1292 (string-match "\\.m?spec$" buffer-file-name))
23501
f12ae4499ae0 (sh-mode): Handle .spec and .mspec files.
Richard M. Stallman <rms@gnu.org>
parents: 23341
diff changeset
1293 "rpm")))))
16552
fe3d32bca2c5 (sh-set-shell): Pass args no-query-flag
Richard M. Stallman <rms@gnu.org>
parents: 16535
diff changeset
1294 (if interpreter
17260
e32d514a22cc (sh-set-shell): If file has no #! line,
Richard M. Stallman <rms@gnu.org>
parents: 17213
diff changeset
1295 (sh-set-shell interpreter nil nil)
26967
746b8b172e55 (sh-mode): Don't call sh-set-shell
Gerd Moellmann <gerd@gnu.org>
parents: 26918
diff changeset
1296 (sh-set-shell sh-shell-file nil nil))
26918
e1c54e3a7a61 Fix typo.
Gerd Moellmann <gerd@gnu.org>
parents: 26917
diff changeset
1297 (run-hooks 'sh-mode-hook)))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1298 ;;;###autoload
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1299 (defalias 'shell-script-mode 'sh-mode)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1300
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1301
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1302 (defun sh-font-lock-keywords (&optional keywords)
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1303 "Function to get simple fontification based on `sh-font-lock-keywords'.
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1304 This adds rules for comments and assignments."
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1305 (sh-feature sh-font-lock-keywords
23511
8b4cdcbaf071 (sh-font-lock-keywords): Don't crash for an unrecognized shell.
Richard M. Stallman <rms@gnu.org>
parents: 23501
diff changeset
1306 (when (stringp (sh-feature sh-assignment-regexp))
8b4cdcbaf071 (sh-font-lock-keywords): Don't crash for an unrecognized shell.
Richard M. Stallman <rms@gnu.org>
parents: 23501
diff changeset
1307 (lambda (list)
8b4cdcbaf071 (sh-font-lock-keywords): Don't crash for an unrecognized shell.
Richard M. Stallman <rms@gnu.org>
parents: 23501
diff changeset
1308 `((,(sh-feature sh-assignment-regexp)
8b4cdcbaf071 (sh-font-lock-keywords): Don't crash for an unrecognized shell.
Richard M. Stallman <rms@gnu.org>
parents: 23501
diff changeset
1309 1 font-lock-variable-name-face)
8b4cdcbaf071 (sh-font-lock-keywords): Don't crash for an unrecognized shell.
Richard M. Stallman <rms@gnu.org>
parents: 23501
diff changeset
1310 ,@keywords
8b4cdcbaf071 (sh-font-lock-keywords): Don't crash for an unrecognized shell.
Richard M. Stallman <rms@gnu.org>
parents: 23501
diff changeset
1311 ,@list)))))
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1312
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1313 (defun sh-font-lock-keywords-1 (&optional builtins)
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1314 "Function to get better fontification including keywords."
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1315 (let ((keywords (concat "\\([;(){}`|&]\\|^\\)[ \t]*\\(\\(\\("
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1316 (mapconcat 'identity
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1317 (sh-feature sh-leading-keywords)
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1318 "\\|")
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1319 "\\)[ \t]+\\)?\\("
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1320 (mapconcat 'identity
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1321 (append (sh-feature sh-leading-keywords)
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1322 (sh-feature sh-other-keywords))
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1323 "\\|")
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1324 "\\)")))
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1325 (sh-font-lock-keywords
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1326 `(,@(if builtins
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1327 `((,(concat keywords "[ \t]+\\)?\\("
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1328 (mapconcat 'identity (sh-feature sh-builtins) "\\|")
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1329 "\\)\\>")
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1330 (2 font-lock-keyword-face nil t)
16478
fb944e4dc708 Use new face.
Simon Marshall <simon@gnu.org>
parents: 16468
diff changeset
1331 (6 font-lock-builtin-face))
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1332 ,@(sh-feature sh-font-lock-keywords-2)))
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1333 (,(concat keywords "\\)\\>")
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1334 2 font-lock-keyword-face)
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1335 ,@(sh-feature sh-font-lock-keywords-1)))))
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1336
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1337 (defun sh-font-lock-keywords-2 ()
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1338 "Function to get better fontification including keywords and builtins."
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1339 (sh-font-lock-keywords-1 t))
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1340
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1341
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1342 (defvar sh-regexp-for-done nil
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1343 "A buffer-local regexp to match opening keyword for done.")
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1344
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1345 (defvar sh-kw-alist nil
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1346 "A buffer-local, since it is shell-type dependent, list of keywords.")
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1347
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1348 ;; ( key-word first-on-this on-prev-line )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1349 ;; This is used to set `sh-kw-alist' which is a list of sublists each
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1350 ;; having 3 elements:
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1351 ;; a keyword
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1352 ;; a rule to check when the keyword apepars on "this" line
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1353 ;; a rule to check when the keyword apepars on "the previous" line
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1354 ;; The keyword is usually a string and is the first word on a line.
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1355 ;; If this keyword appears on the line whose indenation is to be
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1356 ;; calculated, the rule in element 2 is called. If this returns
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1357 ;; non-zero, the resulting point (which may be changed by the rule)
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1358 ;; is used as the default indentation.
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1359 ;; If it returned false or the keyword was not found in the table,
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1360 ;; then the keyword from the previous line is looked up and the rule
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1361 ;; in element 3 is called. In this case, however,
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1362 ;; `sh-get-indent-info' does not stop but may keepp going and test
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1363 ;; other keywords against rules in element 3. This is because the
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1364 ;; precending line could have, for example, an opening "if" and an
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1365 ;; opening "while" keyword and we need to add the indentation offsets
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1366 ;; for both.
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1367 ;;
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1368 (defconst sh-kw
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1369 '(
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1370 (sh
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1371 ( "if"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1372 nil
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1373 sh-handle-prev-if )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1374 ( "elif"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1375 sh-handle-this-else
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1376 sh-handle-prev-else )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1377 ( "else"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1378 sh-handle-this-else
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1379 sh-handle-prev-else )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1380 ( "fi"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1381 sh-handle-this-fi
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1382 sh-handle-prev-fi )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1383 ( "then"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1384 sh-handle-this-then
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1385 sh-handle-prev-then )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1386 ( "("
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1387 nil
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1388 sh-handle-prev-open )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1389 ( "{"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1390 nil
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1391 sh-handle-prev-open )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1392 ( "["
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1393 nil
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1394 sh-handle-prev-open )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1395 ( "}"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1396 sh-handle-this-close
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1397 nil )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1398 ( ")"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1399 sh-handle-this-close
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1400 nil )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1401 ( "]"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1402 sh-handle-this-close
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1403 nil )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1404 ( "case"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1405 nil
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1406 sh-handle-prev-case )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1407 ( "esac"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1408 sh-handle-this-esac
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1409 sh-handle-prev-esac )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1410 ( case-label
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1411 nil ;; ???
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1412 sh-handle-after-case-label )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1413 ( ";;"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1414 nil ;; ???
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1415 sh-handle-prev-case-alt-end ;; ??
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1416 )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1417 ( "done"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1418 sh-handle-this-done
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1419 sh-handle-prev-done )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1420 ( "do"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1421 sh-handle-this-do
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1422 sh-handle-prev-do )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1423 ) ;; end of sh
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1424
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1425 ;; Note: we don't need specific stuff for bash and zsh shells;
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1426 ;; the regexp `sh-regexp-for-done' handles the extra keywords
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1427 ;; these shells use.
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1428 (rc
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1429 ( "{"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1430 nil
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1431 sh-handle-prev-open )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1432 ( "}"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1433 sh-handle-this-close
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1434 nil )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1435 ( "case"
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1436 sh-handle-this-rc-case
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1437 sh-handle-prev-rc-case )
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1438 ) ;; end of rc
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1439 ))
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1440
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1441
14148
fa30f7528502 (sh-mode): Don't move point.
Richard M. Stallman <rms@gnu.org>
parents: 14119
diff changeset
1442 (defun sh-set-shell (shell &optional no-query-flag insert-flag)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1443 "Set this buffer's shell to SHELL (a string).
16552
fe3d32bca2c5 (sh-set-shell): Pass args no-query-flag
Richard M. Stallman <rms@gnu.org>
parents: 16535
diff changeset
1444 Makes this script executable via `executable-set-magic', and sets up the
fe3d32bca2c5 (sh-set-shell): Pass args no-query-flag
Richard M. Stallman <rms@gnu.org>
parents: 16535
diff changeset
1445 proper starting #!-line, if INSERT-FLAG is non-nil.
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1446 Calls the value of `sh-set-shell-hook' if set."
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1447 (interactive (list (completing-read "Name or path of shell: "
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
1448 interpreter-mode-alist
14148
fa30f7528502 (sh-mode): Don't move point.
Richard M. Stallman <rms@gnu.org>
parents: 14119
diff changeset
1449 (lambda (x) (eq (cdr x) 'sh-mode)))
fa30f7528502 (sh-mode): Don't move point.
Richard M. Stallman <rms@gnu.org>
parents: 14119
diff changeset
1450 (eq executable-query 'function)
fa30f7528502 (sh-mode): Don't move point.
Richard M. Stallman <rms@gnu.org>
parents: 14119
diff changeset
1451 t))
23589
660727693bf6 (sh-canonicalize-shell): Fix regexp.
Andreas Schwab <schwab@suse.de>
parents: 23511
diff changeset
1452 (if (string-match "\\.exe\\'" shell)
23341
d29b6b51866f (sh-set-shell): Remove .exe suffix from shell name.
Richard M. Stallman <rms@gnu.org>
parents: 22783
diff changeset
1453 (setq shell (substring shell 0 (match-beginning 0))))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1454 (setq sh-shell (intern (file-name-nondirectory shell))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1455 sh-shell (or (cdr (assq sh-shell sh-alias-alist))
14148
fa30f7528502 (sh-mode): Don't move point.
Richard M. Stallman <rms@gnu.org>
parents: 14119
diff changeset
1456 sh-shell))
16552
fe3d32bca2c5 (sh-set-shell): Pass args no-query-flag
Richard M. Stallman <rms@gnu.org>
parents: 16535
diff changeset
1457 (if insert-flag
fe3d32bca2c5 (sh-set-shell): Pass args no-query-flag
Richard M. Stallman <rms@gnu.org>
parents: 16535
diff changeset
1458 (setq sh-shell-file
fe3d32bca2c5 (sh-set-shell): Pass args no-query-flag
Richard M. Stallman <rms@gnu.org>
parents: 16535
diff changeset
1459 (executable-set-magic shell (sh-feature sh-shell-arg)
fe3d32bca2c5 (sh-set-shell): Pass args no-query-flag
Richard M. Stallman <rms@gnu.org>
parents: 16535
diff changeset
1460 no-query-flag insert-flag)))
14148
fa30f7528502 (sh-mode): Don't move point.
Richard M. Stallman <rms@gnu.org>
parents: 14119
diff changeset
1461 (setq require-final-newline (sh-feature sh-require-final-newline)
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1462 ;;; local-abbrev-table (sh-feature sh-abbrevs)
17356
9f345ed0683e (sh-mode): Set font-lock-comment-start-regexp via font-lock-defaults.
Richard M. Stallman <rms@gnu.org>
parents: 17260
diff changeset
1463 ;; Packages should not need to set these variables directly. sm.
9f345ed0683e (sh-mode): Set font-lock-comment-start-regexp via font-lock-defaults.
Richard M. Stallman <rms@gnu.org>
parents: 17260
diff changeset
1464 ; font-lock-keywords nil ; force resetting
9f345ed0683e (sh-mode): Set font-lock-comment-start-regexp via font-lock-defaults.
Richard M. Stallman <rms@gnu.org>
parents: 17260
diff changeset
1465 ; font-lock-syntax-table nil
16535
d5eeca7cdaf2 (sh-mode-syntax-table): Turn on comment syntax for #,
Richard M. Stallman <rms@gnu.org>
parents: 16533
diff changeset
1466 comment-start-skip "#+[\t ]*"
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1467 mode-line-process (format "[%s]" sh-shell)
14195
df3c52ae5b14 (sh-shell-variables): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1468 sh-shell-variables nil
14418
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
1469 sh-shell-variables-initialized nil
20395
2bd6621697d5 (sh-imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 20385
diff changeset
1470 imenu-generic-expression (sh-feature sh-imenu-generic-expression)
23341
d29b6b51866f (sh-set-shell): Remove .exe suffix from shell name.
Richard M. Stallman <rms@gnu.org>
parents: 22783
diff changeset
1471 imenu-case-fold-search nil)
20886
7aa1fdcd551a (sh-set-shell): Use standard-syntax-table if none other is specified.
Richard M. Stallman <rms@gnu.org>
parents: 20771
diff changeset
1472 (set-syntax-table (or (sh-feature sh-mode-syntax-table)
7aa1fdcd551a (sh-set-shell): Use standard-syntax-table if none other is specified.
Richard M. Stallman <rms@gnu.org>
parents: 20771
diff changeset
1473 (standard-syntax-table)))
23341
d29b6b51866f (sh-set-shell): Remove .exe suffix from shell name.
Richard M. Stallman <rms@gnu.org>
parents: 22783
diff changeset
1474 (let ((vars (sh-feature sh-variables)))
d29b6b51866f (sh-set-shell): Remove .exe suffix from shell name.
Richard M. Stallman <rms@gnu.org>
parents: 22783
diff changeset
1475 (while vars
d29b6b51866f (sh-set-shell): Remove .exe suffix from shell name.
Richard M. Stallman <rms@gnu.org>
parents: 22783
diff changeset
1476 (sh-remember-variable (car vars))
d29b6b51866f (sh-set-shell): Remove .exe suffix from shell name.
Richard M. Stallman <rms@gnu.org>
parents: 22783
diff changeset
1477 (setq vars (cdr vars))))
17356
9f345ed0683e (sh-mode): Set font-lock-comment-start-regexp via font-lock-defaults.
Richard M. Stallman <rms@gnu.org>
parents: 17260
diff changeset
1478 ;; Packages should not need to toggle Font Lock mode. sm.
9f345ed0683e (sh-mode): Set font-lock-comment-start-regexp via font-lock-defaults.
Richard M. Stallman <rms@gnu.org>
parents: 17260
diff changeset
1479 ; (and (boundp 'font-lock-mode)
9f345ed0683e (sh-mode): Set font-lock-comment-start-regexp via font-lock-defaults.
Richard M. Stallman <rms@gnu.org>
parents: 17260
diff changeset
1480 ; font-lock-mode
9f345ed0683e (sh-mode): Set font-lock-comment-start-regexp via font-lock-defaults.
Richard M. Stallman <rms@gnu.org>
parents: 17260
diff changeset
1481 ; (font-lock-mode (font-lock-mode 0)))
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1482 (if (setq sh-indent-supported-here (sh-feature sh-indent-supported))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1483 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1484 (message "Setting up indent for shell type %s" sh-shell)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1485 (make-local-variable 'sh-kw-alist)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1486 (make-local-variable 'sh-regexp-for-done)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1487 (make-local-variable 'parse-sexp-lookup-properties)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1488 (setq sh-electric-rparen-needed-here
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1489 (sh-feature sh-electric-rparen-needed))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1490 (setq parse-sexp-lookup-properties t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1491 (sh-scan-buffer)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1492 (setq sh-kw-alist (sh-feature sh-kw))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1493 (let ((regexp (sh-feature sh-kws-for-done)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1494 (if regexp
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1495 (setq sh-regexp-for-done
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1496 (sh-mkword-regexpr (regexp-opt regexp t)))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1497 (message "setting up indent stuff")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1498 ;; sh-mode has already made indent-line-function local
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1499 ;; but do it in case this is called before that.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1500 (make-local-variable 'indent-line-function)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1501 (setq indent-line-function 'sh-indent-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1502 ;; This is very inefficient, but this at least makes indent-region work:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1503 (make-local-variable 'indent-region-function)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1504 (setq indent-region-function nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1505 (if sh-make-vars-local
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1506 (sh-make-vars-local))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1507 (message "Indentation setup for shell type %s" sh-shell))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1508 (message "No indentation for this shell type.")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1509 (setq indent-line-function 'sh-basic-indent-line))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1510 (run-hooks 'sh-set-shell-hook))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1511
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1512
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1513
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1514 (defun sh-feature (list &optional function)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1515 "Index ALIST by the current shell.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1516 If ALIST isn't a list where every element is a cons, it is returned as is.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1517 Else indexing follows an inheritance logic which works in two ways:
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1518
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1519 - Fall back on successive ancestors (see `sh-ancestor-alist') as long as
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1520 the alist contains no value for the current shell.
24906
01882044b37a (sh-feature): If nothing is known about the given shell, use the
Richard M. Stallman <rms@gnu.org>
parents: 24899
diff changeset
1521 The ultimate default is always `sh'.
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1522
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1523 - If the value thus looked up is a list starting with `eval' its `cdr' is
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1524 first evaluated. If that is also a list and the first argument is a
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1525 symbol in ALIST it is not evaluated, but rather recursively looked up in
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1526 ALIST to allow the function called to define the value for one shell to be
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1527 derived from another shell. While calling the function, is the car of the
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1528 alist element is the current shell.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1529 The value thus determined is physically replaced into the alist.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1530
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1531 Optional FUNCTION is applied to the determined value and the result is cached
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1532 in ALIST."
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1533 (or (if (consp list)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1534 (let ((l list))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1535 (while (and l (consp (car l)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1536 (setq l (cdr l)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1537 (if l list)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1538 (if function
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1539 (cdr (assoc (setq function (cons sh-shell function)) list)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1540 (let ((sh-shell sh-shell)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1541 elt val)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1542 (while (and sh-shell
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1543 (not (setq elt (assq sh-shell list))))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1544 (setq sh-shell (cdr (assq sh-shell sh-ancestor-alist))))
24906
01882044b37a (sh-feature): If nothing is known about the given shell, use the
Richard M. Stallman <rms@gnu.org>
parents: 24899
diff changeset
1545 ;; If the shell is not known, treat it as sh.
01882044b37a (sh-feature): If nothing is known about the given shell, use the
Richard M. Stallman <rms@gnu.org>
parents: 24899
diff changeset
1546 (unless elt
01882044b37a (sh-feature): If nothing is known about the given shell, use the
Richard M. Stallman <rms@gnu.org>
parents: 24899
diff changeset
1547 (setq elt (assq 'sh list)))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1548 (if (and (consp (setq val (cdr elt)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1549 (eq (car val) 'eval))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1550 (setcdr elt
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1551 (setq val
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1552 (eval (if (consp (setq val (cdr val)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1553 (let ((sh-shell (car (cdr val)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1554 function)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1555 (if (assq sh-shell list)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1556 (setcar (cdr val)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1557 (list 'quote
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1558 (sh-feature list))))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1559 val)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1560 val)))))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1561 (if function
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1562 (nconc list
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1563 (list (cons function
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1564 (setq sh-shell (car function)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1565 val (funcall (cdr function) val))))))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1566 val)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1567
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1568
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1569
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1570 ;;; I commented this out because nobody calls it -- rms.
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1571 ;;;(defun sh-abbrevs (ancestor &rest list)
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1572 ;;; "Iff it isn't, define the current shell as abbrev table and fill that.
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1573 ;;;Abbrev table will inherit all abbrevs from ANCESTOR, which is either an abbrev
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1574 ;;;table or a list of (NAME1 EXPANSION1 ...). In addition it will define abbrevs
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1575 ;;;according to the remaining arguments NAMEi EXPANSIONi ...
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1576 ;;;EXPANSION may be either a string or a skeleton command."
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1577 ;;; (or (if (boundp sh-shell)
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1578 ;;; (symbol-value sh-shell))
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1579 ;;; (progn
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1580 ;;; (if (listp ancestor)
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1581 ;;; (nconc list ancestor))
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1582 ;;; (define-abbrev-table sh-shell ())
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1583 ;;; (if (vectorp ancestor)
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1584 ;;; (mapatoms (lambda (atom)
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1585 ;;; (or (eq atom 0)
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1586 ;;; (define-abbrev (symbol-value sh-shell)
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1587 ;;; (symbol-name atom)
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1588 ;;; (symbol-value atom)
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1589 ;;; (symbol-function atom))))
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1590 ;;; ancestor))
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1591 ;;; (while list
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1592 ;;; (define-abbrev (symbol-value sh-shell)
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1593 ;;; (car list)
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1594 ;;; (if (stringp (car (cdr list)))
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1595 ;;; (car (cdr list))
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1596 ;;; "")
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1597 ;;; (if (symbolp (car (cdr list)))
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1598 ;;; (car (cdr list))))
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1599 ;;; (setq list (cdr (cdr list)))))
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1600 ;;; (symbol-value sh-shell)))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1601
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1602
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1603 (defun sh-mode-syntax-table (table &rest list)
14005
dd4a20edf654 (sh-mode-syntax-table): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 13707
diff changeset
1604 "Copy TABLE and set syntax for successive CHARs according to strings S."
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1605 (setq table (copy-syntax-table table))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1606 (while list
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1607 (modify-syntax-entry (car list) (car (cdr list)) table)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1608 (setq list (cdr (cdr list))))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1609 table)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1610
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1611
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1612 (defun sh-append (ancestor &rest list)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1613 "Return list composed of first argument (a list) physically appended to rest."
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1614 (nconc list ancestor))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1615
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1616
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1617 (defun sh-modify (skeleton &rest list)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1618 "Modify a copy of SKELETON by replacing I1 with REPL1, I2 with REPL2 ..."
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1619 (setq skeleton (copy-sequence skeleton))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1620 (while list
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1621 (setcar (or (nthcdr (car list) skeleton)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1622 (error "Index %d out of bounds" (car list)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1623 (car (cdr list)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1624 (setq list (nthcdr 2 list)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1625 skeleton)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1626
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1627
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1628 (defun sh-basic-indent-line ()
19480
7f11f103a0ca (sh-indent-line): Avoid infinite loop
Richard M. Stallman <rms@gnu.org>
parents: 18382
diff changeset
1629 "Indent a line for Sh mode (shell script mode).
7f11f103a0ca (sh-indent-line): Avoid infinite loop
Richard M. Stallman <rms@gnu.org>
parents: 18382
diff changeset
1630 Indent as far as preceding non-empty line, then by steps of `sh-indentation'.
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1631 Lines containing only comments are considered empty."
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1632 (interactive)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1633 (let ((previous (save-excursion
19480
7f11f103a0ca (sh-indent-line): Avoid infinite loop
Richard M. Stallman <rms@gnu.org>
parents: 18382
diff changeset
1634 (while (and (progn (beginning-of-line)
7f11f103a0ca (sh-indent-line): Avoid infinite loop
Richard M. Stallman <rms@gnu.org>
parents: 18382
diff changeset
1635 (not (bobp)))
14211
949aa01aca87 (sh-indent-line): Cope if no previous noncomment line.
Richard M. Stallman <rms@gnu.org>
parents: 14195
diff changeset
1636 (progn
949aa01aca87 (sh-indent-line): Cope if no previous noncomment line.
Richard M. Stallman <rms@gnu.org>
parents: 14195
diff changeset
1637 (forward-line -1)
949aa01aca87 (sh-indent-line): Cope if no previous noncomment line.
Richard M. Stallman <rms@gnu.org>
parents: 14195
diff changeset
1638 (back-to-indentation)
949aa01aca87 (sh-indent-line): Cope if no previous noncomment line.
Richard M. Stallman <rms@gnu.org>
parents: 14195
diff changeset
1639 (or (eolp)
949aa01aca87 (sh-indent-line): Cope if no previous noncomment line.
Richard M. Stallman <rms@gnu.org>
parents: 14195
diff changeset
1640 (eq (following-char) ?#)))))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1641 (current-column)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1642 current)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1643 (save-excursion
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1644 (indent-to (if (eq this-command 'newline-and-indent)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1645 previous
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1646 (if (< (current-column)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1647 (setq current (progn (back-to-indentation)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1648 (current-column))))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1649 (if (eolp) previous 0)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1650 (delete-region (point)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1651 (progn (beginning-of-line) (point)))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1652 (if (eolp)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1653 (max previous (* (1+ (/ current sh-indentation))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1654 sh-indentation))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1655 (* (1+ (/ current sh-indentation)) sh-indentation))))))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1656 (if (< (current-column) (current-indentation))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1657 (skip-chars-forward " \t"))))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1658
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1659
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1660 (defun sh-execute-region (start end &optional flag)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1661 "Pass optional header and region to a subshell for noninteractive execution.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1662 The working directory is that of the buffer, and only environment variables
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1663 are already set which is why you can mark a header within the script.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1664
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1665 With a positive prefix ARG, instead of sending region, define header from
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1666 beginning of buffer to point. With a negative prefix ARG, instead of sending
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1667 region, clear header."
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1668 (interactive "r\nP")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1669 (if flag
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1670 (setq sh-header-marker (if (> (prefix-numeric-value flag) 0)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1671 (point-marker)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1672 (if sh-header-marker
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1673 (save-excursion
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1674 (let (buffer-undo-list)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1675 (goto-char sh-header-marker)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1676 (append-to-buffer (current-buffer) start end)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1677 (shell-command-on-region (point-min)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1678 (setq end (+ sh-header-marker
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1679 (- end start)))
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1680 sh-shell-file)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1681 (delete-region sh-header-marker end)))
14119
2a05fc406f3a (sh-alias-alist): Don't map sh to bash.
Karl Heuer <kwzh@gnu.org>
parents: 14026
diff changeset
1682 (shell-command-on-region start end (concat sh-shell-file " -")))))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1683
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1684
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1685 (defun sh-remember-variable (var)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1686 "Make VARIABLE available for future completing reads in this buffer."
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1687 (or (< (length var) sh-remember-variable-min)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1688 (getenv var)
14195
df3c52ae5b14 (sh-shell-variables): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1689 (assoc var sh-shell-variables)
df3c52ae5b14 (sh-shell-variables): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1690 (setq sh-shell-variables (cons (cons var var) sh-shell-variables)))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1691 var)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1692
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1693
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1694
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1695 (defun sh-quoted-p ()
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1696 "Is point preceded by an odd number of backslashes?"
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
1697 (eq -1 (% (save-excursion (skip-chars-backward "\\\\")) 2)))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1698
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1699 ;; Indentation stuff.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1700 (defun sh-must-be-shell-mode ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1701 "Signal an error if not in Shell-script mode."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1702 (unless (eq major-mode 'sh-mode)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1703 (error "This buffer is not in Shell-script mode")))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1704
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1705 (defun sh-must-support-indent ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1706 "*Signal an error if the shell type for this buffer is not supported.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1707 Also, the buffer must be in Shell-script mode."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1708 (sh-must-be-shell-mode)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1709 (unless sh-indent-supported-here
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1710 (error "This buffer's shell type is not supported for this command")))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1711
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1712 (defun sh-make-vars-local ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1713 "Make the indentation variables local to this buffer.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1714 Normally they already are local. This command is provided in case
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1715 variable `sh-make-vars-local' has been set to nil.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1716
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1717 To revert all these variables to the global values, use
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1718 command `sh-reset-indent-vars-to-global-values'."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1719 (interactive)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1720 (sh-must-be-shell-mode)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1721 (mapcar 'make-local-variable sh-var-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1722 (message "Indentation variable are now local."))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1723
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1724 (defun sh-reset-indent-vars-to-global-values ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1725 "Reset local indenatation variables to the global values.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1726 Then, if variable `sh-make-vars-local' is non-nil, make them local."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1727 (interactive)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1728 (sh-must-be-shell-mode)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1729 (mapcar 'kill-local-variable sh-var-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1730 (if sh-make-vars-local
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1731 (mapcar 'make-local-variable sh-var-list)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1732
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1733
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1734 ;; Theoretically these are only needed in shell and derived modes.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1735 ;; However, the routines which use them are only called in those modes.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1736 (defconst sh-special-keywords "then\\|do")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1737
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1738 (defun sh-help-string-for-variable (var)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1739 "Construct a string for `sh-read-variable' when changing variable VAR ."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1740 (let ((msg (documentation-property var 'variable-documentation))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1741 (msg2 ""))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1742 (unless (or
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1743 (eq var 'sh-first-lines-indent)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1744 (eq var 'sh-indent-comment))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1745 (setq msg2
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1746 (format "\n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1747 You can enter a number (positive to increase indentenation,
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1748 negative to decrease indentation, zero for no change to indentnation).
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1749
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1750 Or, you can enter one of the following symbols which are relative to
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1751 the value of variable `sh-basic-offset'
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1752 which in this buffer is currently %s.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1753
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1754 \t%s."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1755 sh-basic-offset
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
1756 (mapconcat (lambda (x)
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1757 (nth (1- (length x)) x) )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1758 sh-symbol-list "\n\t")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1759 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1760
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1761 (concat
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1762 ;; The following shows the global not the local value!
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1763 ;; (format "Current value of %s is %s\n\n" var (symbol-value var))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1764 msg msg2)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1765
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1766 (defun sh-read-variable (var)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1767 "Read a new value for indentation variable VAR."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1768 (interactive "*variable? ") ;; to test
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1769 (let ((minibuffer-help-form `(sh-help-string-for-variable
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1770 (quote ,var)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1771 val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1772 (setq val (read-from-minibuffer
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1773 (format "New value for %s (press %s for help): "
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1774 var (single-key-description help-char))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1775 (format "%s" (symbol-value var))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1776 nil t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1777 val))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1778
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1779
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1780
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1781 (defun sh-in-comment-or-string (start)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1782 "Return non-nil if START is in a comment or string."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1783 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1784 (let (state)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1785 (beginning-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1786 (setq state (parse-partial-sexp (point) start nil nil nil t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1787 (or (nth 3 state)(nth 4 state)))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1788
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1789 (defun sh-goto-matching-if ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1790 "Go to the matching if for a fi.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1791 This handles nested if..fi pairs."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1792 (let ((found (sh-find-prev-matching "\\bif\\b" "\\bfi\\b" 1)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1793 (if found
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1794 (goto-char found))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1795
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1796
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1797 ;; Functions named sh-handle-this-XXX are called when the keyword on the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1798 ;; line whose indentation is being handled contain XXX;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1799 ;; those named sh-handle-prev-XXX are when XXX appears on the prevoius line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1800
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1801 (defun sh-handle-prev-if ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1802 (list '(+ sh-indent-after-if)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1803
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1804 (defun sh-handle-this-else ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1805 (if (sh-goto-matching-if)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1806 ;; (list "aligned to if")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1807 (list "aligned to if" '(+ sh-indent-for-else))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1808 nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1809 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1810
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1811 (defun sh-handle-prev-else ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1812 (if (sh-goto-matching-if)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1813 (list '(+ sh-indent-after-if))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1814 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1815
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1816 (defun sh-handle-this-fi ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1817 (if (sh-goto-matching-if)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1818 (list "aligned to if" '(+ sh-indent-for-fi))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1819 nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1820 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1821
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1822 (defun sh-handle-prev-fi ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1823 ;; Why do we have this rule? Because we must go back to the if
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1824 ;; to get its indent. We may continue back from there.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1825 ;; We return nil because we don't have anything to add to result,
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1826 ;; the side affect of setting align-point is all that matters.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1827 ;; we could return a comment (a string) but I can't think of a good one...
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1828 (sh-goto-matching-if)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1829 nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1830
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1831 (defun sh-handle-this-then ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1832 (let ((p (sh-goto-matching-if)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1833 (if p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1834 (list '(+ sh-indent-for-then))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1835 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1836
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1837 (defun sh-handle-prev-then ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1838 (let ((p (sh-goto-matching-if)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1839 (if p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1840 (list '(+ sh-indent-after-if))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1841 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1842
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1843 (defun sh-handle-prev-open ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1844 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1845 (let ((x (sh-prev-stmt)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1846 (if (and x
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1847 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1848 (goto-char x)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1849 (or
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1850 (looking-at "function\\b")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1851 (looking-at "\\s-*\\S-+\\s-*()")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1852 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1853 (list '(+ sh-indent-after-function))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1854 (list '(+ sh-indent-after-open)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1855 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1856
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1857 (defun sh-handle-this-close ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1858 (forward-char 1) ;; move over ")"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1859 (let ((p (sh-safe-backward-sexp)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1860 (if p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1861 (list "aligned to opening paren")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1862 nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1863 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1864
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1865 (defun sh-goto-matching-case ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1866 (let ((found (sh-find-prev-matching "\\bcase\\b" "\\besac\\b" 1)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1867 (if found
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1868 (goto-char found))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1869
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1870 (defun sh-handle-prev-case ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1871 ;; This is typically called when point is on same line as a case
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1872 ;; we shouldn't -- and can't find prev-case
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1873 (if (looking-at ".*\\bcase\\b")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1874 (list '(+ sh-indent-for-case-label))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1875 (error "We don't see to be on a line with a case") ;; debug
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1876 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1877
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1878 (defun sh-handle-this-esac ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1879 (let ((p (sh-goto-matching-case)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1880 (if p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1881 (list "aligned to matching case")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1882 nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1883 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1884
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1885
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1886 (defun sh-handle-prev-esac ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1887 (let ((p (sh-goto-matching-case)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1888 (if p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1889 (list "matching case")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1890 nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1891 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1892
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1893 (defun sh-handle-after-case-label ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1894 (let ((p (sh-goto-matching-case)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1895 (if p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1896 (list '( + sh-indent-for-case-alt ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1897 nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1898 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1899
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1900 (defun sh-handle-prev-case-alt-end ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1901 (let ((p (sh-goto-matching-case)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1902 (if p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1903 (list '( + sh-indent-for-case-label ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1904 nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1905 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1906
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1907 (defun sh-safe-backward-sexp ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1908 "Try and do a `backward-sexp', but do not error.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1909 Return new point if successful, nil if an error occurred."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1910 (condition-case nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1911 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1912 (backward-sexp 1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1913 (point) ;; return point if successful
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1914 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1915 (error
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1916 (sh-debug "oops!(0) %d" (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1917 nil ;; return nil if fail
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1918 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1919
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1920 (defun sh-safe-forward-sexp ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1921 "Try and do a `forward-sexp', but do not error.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1922 Return new point if successful, nil if an error occurred."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1923 (condition-case nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1924 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1925 (forward-sexp 1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1926 (point) ;; return point if successful
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1927 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1928 (error
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1929 (sh-debug "oops!(1) %d" (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1930 nil ;; return nil if fail
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1931 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1932
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1933 (defun sh-goto-match-for-done ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1934 (let ((found (sh-find-prev-matching sh-regexp-for-done sh-re-done 1)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1935 (if found
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1936 (goto-char found))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1937
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1938 (defun sh-handle-this-done ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1939 (if (sh-goto-match-for-done)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1940 (list "aligned to do stmt" '(+ sh-indent-for-done))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1941 nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1942 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1943
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1944 (defun sh-handle-prev-done ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1945 (if (sh-goto-match-for-done)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1946 (list "previous done")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1947 nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1948 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1949
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1950 (defun sh-handle-this-do ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1951 (let ( (p (sh-goto-match-for-done)) )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1952 (if p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1953 (list '(+ sh-indent-for-do))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1954 nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1955 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1956
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1957 (defun sh-handle-prev-do ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1958 (let ( (p) )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1959 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1960 ((save-restriction
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1961 (narrow-to-region
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1962 (point)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1963 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1964 (beginning-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1965 (point)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1966 (sh-goto-match-for-done))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1967 (sh-debug "match for done found on THIS line")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1968 (list '(+ sh-indent-after-loop-construct)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1969 ((sh-goto-match-for-done)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1970 (sh-debug "match for done found on PREV line")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1971 (list '(+ sh-indent-after-do)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1972 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1973 (message "match for done NOT found")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1974 nil))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1975
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1976 ;; for rc:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1977 (defun sh-find-prev-switch ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1978 "Find the line for the switch keyword matching this line's case keyword."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1979 (re-search-backward "\\bswitch\\b" nil t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1980
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1981 (defun sh-handle-this-rc-case ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1982 (if (sh-find-prev-switch)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1983 (list '(+ sh-indent-after-switch))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1984 ;; (list '(+ sh-indent-for-case-label))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1985 nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1987 (defun sh-handle-prev-rc-case ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1988 (list '(+ sh-indent-after-case)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1989
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1990 (defun sh-check-rule (n thing)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1991 (let ((rule (nth n (assoc thing sh-kw-alist)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1992 (val nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1993 (if rule
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1994 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1995 (setq val (funcall rule))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1996 (sh-debug "rule (%d) for %s at %d is %s\n-> returned %s"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1997 n thing (point) rule val)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1998 val))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
1999
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2000
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2001 (defun sh-get-indent-info ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2002 "Return indent-info for this line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2003 This is a list. nil means the line is to be left as is.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2004 Otherwise it contains one or more of the following sublists:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2005 \(t NUMBER\) NUMBER is the base location in the buffer that indendation is
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2006 relative to. If present, this is always the first of the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2007 sublists. The indentation of the line in question is
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2008 derived from the indentation of this point, possibly
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2009 modified by subsequent sublists.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2010 \(+ VAR\)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2011 \(- VAR\) Get the value of variable VAR and add to or subtract from
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2012 the indentation calculated so far.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2013 \(= VAR\) Get the value of variable VAR and *replace* the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2014 indentation with itss value. This only occurs for
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2015 special variables such as `sh-indent-comment'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2016 STRING This is ignored for the purposes of calculating
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2017 indentation, it is printed in certain cases to help show
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2018 what the indentation is based on."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2019 ;; See comments before `sh-kw'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2020 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2021 (let ((prev-kw nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2022 (prev-stmt nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2023 (have-result nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2024 depth-bol depth-eol
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2025 this-kw
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2026 (state nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2027 state-bol
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2028 (depth-prev-bol nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2029 start
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2030 func val
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2031 (result nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2032 prev-lines-indent
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2033 (prev-list nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2034 (this-list nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2035 (align-point nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2036 prev-line-end x)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2037 (beginning-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2038 ;; Note: setting result to t means we are done and will return nil.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2039 ;;( This function never returns just t.)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2040 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2041 ((equal (get-text-property (point) 'syntax-table) sh-here-doc-syntax)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2042 (setq result t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2043 (setq have-result t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2044 ((looking-at "\\s-*#") ; was (equal this-kw "#")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2045 (if (bobp)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2046 (setq result t);; return nil if 1st line!
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2047 (setq result (list '(= sh-indent-comment)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2048 ;; we still need to get previous line in case
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2049 ;; sh-indent-comnent is t (indent as normal)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2050 (setq align-point (sh-prev-line nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2051 (setq have-result nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2052 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2053 );; cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2054
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2055 (unless have-result
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2056 ;; Continuation lines are handled specially
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2057 (if (sh-this-is-a-continuation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2058 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2059 ;; We assume the line being continued is already
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2060 ;; properly indented...
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2061 ;; (setq prev-line-end (sh-prev-line))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2062 (setq align-point (sh-prev-line nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2063 (setq result (list '(+ sh-indent-for-continuation)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2064 (setq have-result t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2065 (beginning-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2066 (skip-chars-forward " \t")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2067 (setq this-kw (sh-get-kw)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2068
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2069 ;; Handle "this" keyword: first word on the line we're
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2070 ;; calculating indentation info for.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2071 (if this-kw
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2072 (if (setq val (sh-check-rule 1 this-kw))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2073 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2074 (setq align-point (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2075 (sh-debug
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2076 "this - setting align-point to %d" align-point)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2077 (setq result (append result val))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2078 (setq have-result t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2079 ;; set prev-line to continue processing remainder
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2080 ;; of this line as a previous l ine
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2081 (setq prev-line-end (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2082 ))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2083
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2084 (unless have-result
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2085 (setq prev-line-end (sh-prev-line 'end)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2086
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2087 (if prev-line-end
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2088 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2089 ;; We start off at beginning of this line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2090 ;; Scan previous statements while this is <=
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2091 ;; start of previous line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2092 (setq start (point));; for debug only
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2093 (goto-char prev-line-end)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2094 (setq x t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2095 (while (and x (setq x (sh-prev-thing)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2096 (sh-debug "at %d x is: %s result is: %s" (point) x result)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2097 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2098 ((and (equal x ")")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2099 (equal (get-text-property (1- (point)) 'syntax-table)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2100 sh-special-syntax))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2101 (sh-debug "Case label) here")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2102 (setq x 'case-label)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2103 (if (setq val (sh-check-rule 2 x))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2104 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2105 (setq result (append result val))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2106 (setq align-point (point))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2107 (forward-char -1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2108 (skip-chars-forward "[a-z0-9]*?")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2109 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2110 ((string-match "[])}]" x)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2111 (setq x (sh-safe-backward-sexp))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2112 (if x
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2113 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2114 (setq align-point (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2115 (setq result (append result
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2116 (list "aligned to opening paren")))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2117 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2118 ((string-match "[[({]" x)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2119 (sh-debug "Checking special thing: %s" x)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2120 (if (setq val (sh-check-rule 2 x))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2121 (setq result (append result val)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2122 (forward-char -1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2123 (setq align-point (point)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2124 ((string-match "[\"'`]" x)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2125 (sh-debug "Skipping back for %s" x)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2126 ;; this was oops-2
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2127 (setq x (sh-safe-backward-sexp)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2128 ((stringp x)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2129 (sh-debug "Checking string %s at %s" x (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2130 (if (setq val (sh-check-rule 2 x))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2131 ;; (or (eq t (car val))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2132 ;; (eq t (car (car val))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2133 (setq result (append result val)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2134 ;; not sure about this test Wed Jan 27 23:48:35 1999
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2135 (setq align-point (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2136 (unless (bolp)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2137 (forward-char -1)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2138 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2139 (error "Don't know what to do with %s" x))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2140 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2141 );; while
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2142 (sh-debug "result is %s" result)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2143 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2144 (sh-debug "No prev line!")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2145 (sh-debug "result: %s align-point: %s" result align-point)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2146 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2147
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2148 (if align-point
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2149 ;; was: (setq result (append result (list (list t align-point))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2150 (setq result (append (list (list t align-point)) result))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2151 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2152 (sh-debug "result is now: %s" result)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2153
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2154 (or result
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2155 (if prev-line-end
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2156 (setq result (list (list t prev-line-end)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2157 (setq result (list (list '= 'sh-first-lines-indent)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2158 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2159
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2160 (if (eq result t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2161 (setq result nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2162 (sh-debug "result is: %s" result)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2163 result
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2164 );; let
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2165 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2166
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2167
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2168 (defun sh-get-indent-var-for-line (&optional info)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2169 "Return the variable controlling indentation for this line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2170 If there is not [just] one such variable, return a string
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2171 indicating the problem.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2172 If INFO is supplied it is used, else it is calculated."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2173 (let ((var nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2174 (result nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2175 (reason nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2176 sym elt)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2177 (or info
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2178 (setq info (sh-get-indent-info)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2179 (if (null info)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2180 (setq result "this line to be left as is")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2181 (while (and info (null result))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2182 (setq elt (car info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2183 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2184 ((stringp elt)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2185 (setq reason elt)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2186 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2187 ((not (listp elt))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2188 (error "sh-get-indent-var-for-line invalid elt: %s" elt))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2189 ;; so it is a list
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2190 ((eq t (car elt))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2191 );; nothing
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2192 ((symbolp (setq sym (nth 1 elt)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2193 ;; A bit of a kludge - when we see the sh-indent-comment
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2194 ;; ignore other variables. Otherwise it is tricky to
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2195 ;; "learn" the comment indentation.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2196 (if (eq var 'sh-indent-comment)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2197 (setq result var)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2198 (if var
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2199 (setq result
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2200 "this line is controlled by more than 1 variable.")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2201 (setq var sym))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2202 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2203 (error "sh-get-indent-var-for-line invalid list elt: %s" elt)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2204 (setq info (cdr info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2205 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2206 (or result
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2207 (setq result var))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2208 (or result
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2209 (setq result reason))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2210 (if (null result)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2211 ;; e.g. just had (t POS)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2212 (setq result "line has default indentation"))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2213 result))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2214
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2215
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2216
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2217 ;; Finding the previous line isn't trivial.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2218 ;; We must *always* go back one more and see if that is a continuation
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2219 ;; line -- it is the PREVIOUS line which is continued, not the one
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2220 ;; we are going to!
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2221 ;; Also, we want to treat a whole "here document" as one big line,
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2222 ;; because we may want to a align to the beginning of it.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2223 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2224 ;; What we do:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2225 ;; - go back a line, if empty repeat
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2226 ;; - (we are now at a previous non empty line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2227 ;; - save this
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2228 ;; - if this is in a here-document, go to the beginning of it
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2229 ;; and save that
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2230 ;; - go back one more physcial line and see if it is a continuation line
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2231 ;; - if yes, save it and repeat
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2232 ;; - if no, go back to where we last saved.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2233 (defun sh-prev-line (&optional end)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2234 "Back to end of previous non-comment non-empty line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2235 Go to beginning of logical line unless END is non-nil, in which case
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2236 we go to the end of the previous line and do not check for continuations."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2237 (sh-must-be-shell-mode)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2238 (let ((going t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2239 (last-contin-line nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2240 (result nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2241 bol eol state)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2242 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2243 (beginning-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2244 (while (and going
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2245 (not (bobp))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2246 (>= 0 (forward-line -1))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2247 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2248 (setq bol (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2249 (end-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2250 (setq eol (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2251 (save-restriction
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2252 (setq state (parse-partial-sexp bol eol nil nil nil t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2253 (if (nth 4 state)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2254 (setq eol (nth 8 state)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2255 (narrow-to-region bol eol)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2256 (goto-char bol)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2257 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2258 ((looking-at "\\s-*$"))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2259 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2260 (if end
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2261 (setq result eol)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2262 (setq result bol))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2263 (setq going nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2264 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2265 (if (and result
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2266 (equal (get-text-property (1- result) 'syntax-table)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2267 sh-here-doc-syntax))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2268 (let ((p1 (previous-single-property-change
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2269 (1- result) 'syntax-table)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2270 (if p1
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2271 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2272 (goto-char p1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2273 (forward-line -1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2274 (if end
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2275 (end-of-line))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2276 (setq result (point)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2277 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2278 (unless end
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2279 ;; we must check previous lines to see if they are continuation lines
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2280 ;; if so, we must return position of first of them
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2281 (while (and (sh-this-is-a-continuation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2282 (>= 0 (forward-line -1)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2283 (setq result (point)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2284 (if result
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2285 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2286 (goto-char result)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2287 (beginning-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2288 (skip-chars-forward " \t")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2289 (setq result (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2290 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2291 ) ;; save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2292 result
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2293 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2294
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2295
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2296 (defun sh-prev-stmt ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2297 "Return the address of the previous stmt or nil."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2298 ;; This is used when we are trying to find a matching keyword.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2299 ;; Searching backward for the keyword would certainly be quicker, but
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2300 ;; it is hard to remove "false matches" -- such as if the keyword
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2301 ;; appears in a string or quote. This way is slower, but (I think) safer.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2302 (interactive)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2303 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2304 (let ((going t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2305 (start (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2306 (found nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2307 (prev nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2308 (skip-chars-backward " \t;|&({[")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2309 (while (and (not found)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2310 (not (bobp))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2311 going)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2312 ;; Do a backward-sexp if possible, else backup bit by bit...
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2313 (if (sh-safe-backward-sexp)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2314 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2315 (if (looking-at sh-special-keywords)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2316 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2317 (setq found prev))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2318 (setq prev (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2319 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2320 ;; backward-sexp failed
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2321 (if (zerop (skip-chars-backward " \t()[\]{};`'"))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2322 (forward-char -1))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2323 (if (bolp)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2324 (let ((back (sh-prev-line nil)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2325 (if back
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2326 (goto-char back)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2327 (setq going nil)))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2328 (unless found
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2329 (skip-chars-backward " \t")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2330 (if (or (and (bolp) (not (sh-this-is-a-continuation)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2331 (eq (char-before) ?\;)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2332 (looking-at "\\s-*[|&]"))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2333 (setq found (point)))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2334 (if found
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2335 (goto-char found))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2336 (if found
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2337 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2338 (skip-chars-forward " \t|&({[")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2339 (setq found (point))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2340 (if (>= (point) start)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2341 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2342 (debug "We didn't move!")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2343 (setq found nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2344 (or found
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2345 (sh-debug "Did not find prev stmt.")))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2346 found
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2347 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2348
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2349
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2350 (defun sh-get-word ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2351 "Get a shell word skipping whitespace from point."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2352 (interactive)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2353 (skip-chars-forward "\t ")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2354 (let ((start (point)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2355 (while
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2356 (if (looking-at "[\"'`]")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2357 (sh-safe-forward-sexp)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2358 ;; (> (skip-chars-forward "^ \t\n\"'`") 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2359 (> (skip-chars-forward "-_a-zA-Z\$0-9") 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2360 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2361 (buffer-substring start (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2362 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2363
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2364 (defun sh-prev-thing ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2365 "Return the previous thing this logical line."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2366 ;; This is called when `sh-get-indent-info' is working backwards on
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2367 ;; the previous line(s) finding what keywords may be relevant for
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2368 ;; indenting. It moves over sexps if possible, and will stop
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2369 ;; on a ; and at the beginning of a line if it is not a continuation
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2370 ;; line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2371 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2372 ;; Added a kludge for ";;"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2373 ;; Possible return values:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2374 ;; nil - nothing
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2375 ;; a string - possibly a keyword
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2376 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2377 (if (bolp)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2378 nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2379 (let ((going t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2380 c n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2381 min-point
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2382 (start (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2383 (found nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2384 (save-restriction
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2385 (narrow-to-region
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2386 (if (sh-this-is-a-continuation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2387 (setq min-point (sh-prev-line nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2388 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2389 (beginning-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2390 (setq min-point (point))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2391 (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2392 (skip-chars-backward " \t;")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2393 (unless (looking-at "\\s-*;;")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2394 (skip-chars-backward "^)}];\"'`({[")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2395 (setq c (char-before))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2396 (sh-debug "stopping at %d c is %s start=%d min-point=%d"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2397 (point) c start min-point)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2398 (if (< (point) min-point)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2399 (error "point %d < min-point %d" (point) min-point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2400 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2401 ((looking-at "\\s-*;;")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2402 ;; (message "Found ;; !")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2403 ";;")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2404 ((or (eq c ?\n)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2405 (eq c nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2406 (eq c ?\;))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2407 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2408 ;; skip forward over white space newline and \ at eol
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2409 (skip-chars-forward " \t\n\\\\")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2410 (sh-debug "Now at %d start=%d" (point) start)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2411 (if (>= (point) start)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2412 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2413 (sh-debug "point: %d >= start: %d" (point) start)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2414 nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2415 (sh-get-word))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2416 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2417 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2418 ;; c -- return a string
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2419 (char-to-string c)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2420 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2421 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2422
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2423
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2424 (defun sh-this-is-a-continuation ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2425 "Return non-nil if current line is a continuation of previous line."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2426 (let ((result nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2427 bol eol state)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2428 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2429 (if (and (zerop (forward-line -1))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2430 (looking-at ".*\\\\$"))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2431 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2432 (setq bol (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2433 (end-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2434 (setq eol (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2435 (setq state (parse-partial-sexp bol eol nil nil nil t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2436 (unless (nth 4 state)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2437 (setq result t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2438 )))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2439
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2440 (defun sh-get-kw (&optional where and-move)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2441 "Return first word of line from WHERE.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2442 If AND-MOVE is non-nil then move to end of word."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2443 (let ((start (point)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2444 (if where
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2445 (goto-char where))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2446 (prog1
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2447 (buffer-substring (point)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2448 (progn (skip-chars-forward "^ \t\n;")(point)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2449 (unless and-move
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2450 (goto-char start)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2451 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2452
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2453 (defun sh-find-prev-matching (open close &optional depth)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2454 "Find a matching token for a set of opening and closing keywords.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2455 This takes into account that there may be nested open..close pairings.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2456 OPEN and CLOSE are regexps denoting the tokens to be matched.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2457 Optional parameter DEPTH (usually 1) says how many to look for."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2458 (let ((parse-sexp-ignore-comments t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2459 prev)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2460 (setq depth (or depth 1))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2461 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2462 (condition-case nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2463 (while (and
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2464 (/= 0 depth)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2465 (not (bobp))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2466 (setq prev (sh-prev-stmt)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2467 (goto-char prev)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2468 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2469 (if (looking-at "\\\\\n")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2470 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2471 (forward-char 2)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2472 (skip-chars-forward " \t")))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2473 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2474 ((looking-at open)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2475 (setq depth (1- depth))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2476 (sh-debug "found open at %d - depth = %d" (point) depth))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2477 ((looking-at close)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2478 (setq depth (1+ depth))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2479 (sh-debug "found close - depth = %d" depth))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2480 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2481 ))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2482 (error nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2483 (if (eq depth 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2484 prev ;; (point)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2485 nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2486 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2487
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2488
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2489 (defun sh-var-value (var &optional ignore-error)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2490 "Return the value of variable VAR, interpreting symbols.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2491 It can also return t or nil.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2492 If an illegal value is found, throw an error unless Optional argument
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2493 IGNORE-ERROR is non-nil."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2494 (let ((val (symbol-value var)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2495 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2496 ((numberp val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2497 val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2498 ((eq val t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2499 val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2500 ((null val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2501 val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2502 ((eq val '+)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2503 sh-basic-offset)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2504 ((eq val '-)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2505 (- sh-basic-offset))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2506 ((eq val '++)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2507 (* 2 sh-basic-offset))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2508 ((eq val '--)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2509 (* 2 (- sh-basic-offset)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2510 ((eq val '*)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2511 (/ sh-basic-offset 2))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2512 ((eq val '/)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2513 (/ (- sh-basic-offset) 2))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2514 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2515 (if ignore-error
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2516 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2517 (message "Don't konw how to handle %s's value of %s" var val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2518 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2519 (error "Don't know how to handle %s's value of %s" var val))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2520 ))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2521
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2522 (defun sh-set-var-value (var value &optional no-symbol)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2523 "Set variable VAR to VALUE.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2524 Unless optional argument NO-SYMBOL is non-nil, then if VALUE is
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2525 can be represented by a symbol then do so."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2526 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2527 (no-symbol
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2528 (set var value))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2529 ((= value sh-basic-offset)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2530 (set var '+))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2531 ((= value (- sh-basic-offset))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2532 (set var '-))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2533 ((eq value (* 2 sh-basic-offset))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2534 (set var '++))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2535 ((eq value (* 2 (- sh-basic-offset)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2536 (set var '--))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2537 ((eq value (/ sh-basic-offset 2))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2538 (set var '*))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2539 ((eq value (/ (- sh-basic-offset) 2))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2540 (set var '/))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2541 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2542 (set var value)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2543 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2544
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2545
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2546 (defun sh-calculate-indent (&optional info)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2547 "Return the indentation for the current line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2548 If INFO is supplied it is used, else it is calculated from current line."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2549 (let (
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2550 (ofs 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2551 (base-value 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2552 elt a b var val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2553 (or info
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2554 (setq info (sh-get-indent-info)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2555 (if (null info)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2556 nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2557 (while info
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2558 (sh-debug "info: %s ofs=%s" info ofs)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2559 (setq elt (car info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2560 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2561 ((stringp elt)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2562 ;; do nothing?
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2563 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2564 ((listp elt)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2565 (setq a (car (car info)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2566 (setq b (nth 1 (car info)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2567 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2568 ((eq a t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2569 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2570 (goto-char b)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2571 (setq val (current-indentation)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2572 (setq base-value val))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2573 ((symbolp b)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2574 (setq val (sh-var-value b))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2575 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2576 ((eq a '=)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2577 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2578 ((null val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2579 ;; no indentation
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2580 ;; set info to nil so we stop immediately
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2581 (setq base-value nil ofs nil info nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2582 ((eq val t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2583 ;; indent as normal line
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2584 (setq ofs 0))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2585 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2586 ;; The following assume the (t POS) come first!
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2587 (setq ofs val base-value 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2588 (setq info nil) ;; ? stop now
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2589 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2590 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2591 ((eq a '+)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2592 (setq ofs (+ ofs val)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2593 ((eq a '-)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2594 (setq ofs (- ofs val)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2595 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2596 (error "sh-calculate-indent invalid a a=%s b=%s" a b))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2597 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2598 (error "sh-calculate-indent invalid elt: a=%s b=%s" a b)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2599 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2600 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2601 (error "sh-calculate-indent invalid elt %s" elt))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2602 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2603 (sh-debug "a=%s b=%s val=%s base-value=%s ofs=%s"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2604 a b val base-value ofs)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2605 (setq info (cdr info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2606 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2607 ;; return value:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2608 (sh-debug "at end: base-value: %s ofs: %s" base-value ofs)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2609
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2610 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2611 ((or (null base-value)(null ofs))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2612 nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2613 ((and (numberp base-value)(numberp ofs))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2614 (sh-debug "base (%d) + ofs (%d) = %d"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2615 base-value ofs (+ base-value ofs))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2616 (+ base-value ofs)) ;; return value
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2617 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2618 (error "sh-calculate-indent: Help. base-value=%s ofs=%s"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2619 base-value ofs)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2620 nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2621 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2622
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2623
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2624 (defun sh-indent-line ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2625 "Indent the current line."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2626 (interactive)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2627 (sh-must-be-shell-mode)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2628 (let ((indent (sh-calculate-indent)) shift-amt beg end
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2629 (pos (- (point-max) (point))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2630 (if indent
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2631 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2632 (beginning-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2633 (setq beg (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2634 (skip-chars-forward " \t")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2635 (setq shift-amt (- indent (current-column)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2636 (if (zerop shift-amt)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2637 nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2638 (delete-region beg (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2639 (indent-to indent))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2640 ;; If initial point was within line's indentation,
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2641 ;; position after the indentation. Else stay at same point in text.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2642 (if (> (- (point-max) pos) (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2643 (goto-char (- (point-max) pos)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2644 ))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2645
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2646
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2647 (defun sh-blink (blinkpos &optional msg)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2648 "Move cursor momentarily to BLINKPOS and display MSG."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2649 ;; We can get here without it being a number on first line
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2650 (if (numberp blinkpos)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2651 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2652 (goto-char blinkpos)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2653 (message msg)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2654 (sit-for blink-matching-delay))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2655 (message msg)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2656 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2657
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2658 (defun sh-show-indent (arg)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2659 "Show the how the currently line would be indented.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2660 This tells you which variable, if any, controls the indentation of
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2661 this line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2662 If optional arg ARG is non-null (called interactively with a prefix),
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2663 a pop up window describes this variable.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2664 If variable `sh-blink' is non-nil then momentarily go to the line
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2665 we are indenting relative to, if applicable."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2666 (interactive "P")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2667 (sh-must-support-indent)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2668 (let* ((info (sh-get-indent-info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2669 (var (sh-get-indent-var-for-line info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2670 val msg
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2671 (curr-indent (current-indentation))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2672 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2673 (if (stringp var)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2674 (message (setq msg var))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2675 (setq val (sh-calculate-indent info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2676
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2677 (if (eq curr-indent val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2678 (setq msg (format "%s is %s" var (symbol-value var)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2679 (setq msg
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2680 (if val
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2681 (format "%s (%s) would change indent from %d to: %d"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2682 var (symbol-value var) curr-indent val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2683 (format "%s (%s) would leave line as is"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2684 var (symbol-value var)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2685 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2686 (if (and arg var)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2687 (describe-variable var)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2688 (if sh-blink
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2689 (let ((info (sh-get-indent-info)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2690 (if (and info (listp (car info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2691 (eq (car (car info)) t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2692 (sh-blink (nth 1 (car info)) msg)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2693 (message msg)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2694 (message msg))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2695 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2696
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2697 (defun sh-set-indent ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2698 "Set the indentation for the current line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2699 If the current line is controlled by an indentation variable, prompt
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2700 for a new value for it."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2701 (interactive)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2702 (sh-must-support-indent)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2703 (let* ((info (sh-get-indent-info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2704 (var (sh-get-indent-var-for-line info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2705 val val0 new-val old-val indent-val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2706 (if (stringp var)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2707 (message (format "Cannot set indent - %s" var))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2708 (setq old-val (symbol-value var))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2709 (setq val (sh-read-variable var))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2710 (condition-case nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2711 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2712 (set var val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2713 (setq indent-val (sh-calculate-indent info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2714 (if indent-val
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2715 (message "Variable: %s Value: %s would indent to: %d"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2716 var (symbol-value var) indent-val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2717 (message "Variable: %s Value: %s would leave line as is."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2718 var (symbol-value var)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2719 ;; I'm not sure about this, indenting it now?
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2720 ;; No. Because it would give the impression that an undo would
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2721 ;; restore thing, but the value has been altered.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2722 ;; (sh-indent-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2723 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2724 (error
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2725 (set var old-val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2726 (message "Bad value for %s, restoring to previous value %s"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2727 var old-val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2728 (sit-for 1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2729 nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2730 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2731
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2732
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2733 (defun sh-learn-line-indent (arg)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2734 "Learn how to indent a line as it currently is indented.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2735
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2736 If there is an indentation variable which controls this line's indentation,
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2737 then set it to a value which would indent the line the way it
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2738 presently is.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2739
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2740 If the value can be represented by one of the symbols then do so
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2741 unless optional argument ARG (the prefix when interactive) is non-nil."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2742 (interactive "*P")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2743 (sh-must-support-indent)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2744 ;; I'm not sure if we show allow learning on an empty line.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2745 ;; Though it might occasionally be useful I think it usually
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2746 ;; would just be confusing.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2747 (if (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2748 (beginning-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2749 (looking-at "\\s-*$"))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2750 (message "sh-learn-line-indent ignores empty lines.")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2751 (let* ((info (sh-get-indent-info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2752 (var (sh-get-indent-var-for-line info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2753 ival sval diff new-val
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2754 (no-symbol arg)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2755 (curr-indent (current-indentation)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2756 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2757 ((stringp var)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2758 (message (format "Cannot learn line - %s" var)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2759 ((eq var 'sh-indent-comment)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2760 ;; This is arbitrary...
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2761 ;; - if curr-indent is 0, set to curr-indent
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2762 ;; - else if it has the indentation of a "normal" line,
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2763 ;; then set to t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2764 ;; - else set to curr-indent.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2765 (setq sh-indent-comment
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2766 (if (= curr-indent 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2767 0
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2768 (let* ((sh-indent-comment t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2769 (val2 (sh-calculate-indent info)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2770 (if (= val2 curr-indent)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2771 t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2772 curr-indent))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2773 (message "%s set to %s" var (symbol-value var))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2774 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2775 ((numberp (setq sval (sh-var-value var)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2776 (setq ival (sh-calculate-indent info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2777 (setq diff (- curr-indent ival))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2778
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2779 (sh-debug "curr-indent: %d ival: %d diff: %d var:%s sval %s"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2780 curr-indent ival diff var sval)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2781 (setq new-val (+ sval diff))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2782 ;;; I commented out this because someone might want to replace
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2783 ;;; a value of `+' with the current value of sh-basic-offset
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2784 ;;; or vice-versa.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2785 ;;; (if (= 0 diff)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2786 ;;; (message "No change needed!")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2787 (sh-set-var-value var new-val no-symbol)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2788 (message "%s set to %s" var (symbol-value var))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2789 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2790 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2791 (debug)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2792 (message "Cannot change %s" var))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2793 ))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2794
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2795
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2796
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2797 (defun sh-mark-init (buffer)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2798 "Initialize a BUFFER to be used by `sh-mark-line'."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2799 (let ((main-buffer (current-buffer)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2800 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2801 (set-buffer (get-buffer-create buffer))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2802 (erase-buffer)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2803 (occur-mode)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2804 (setq occur-buffer main-buffer)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2805 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2806
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2807
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2808 (defun sh-mark-line (message point buffer &optional add-linenum occur-point)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2809 "Insert MESSAGE referring to location POINT in current buffer into BUFFER.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2810 Buffer BUFFER is in `occur-mode'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2811 If ADD-LINENUM is non-nil the message is preceded by the line number.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2812 If OCCUR-POINT is non-nil then the line is marked as a new occurence
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2813 so that `occur-next' and `occur-prev' will work."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2814 (let ((m1 (make-marker))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2815 (main-buffer (current-buffer))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2816 start
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2817 (line "") )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2818 (if point
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2819 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2820 (set-marker m1 point (current-buffer))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2821 (if add-linenum
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2822 (setq line (format "%d: " (1+ (count-lines 1 point)))))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2823 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2824 (if (get-buffer buffer)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2825 (set-buffer (get-buffer buffer))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2826 (set-buffer (get-buffer-create buffer))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2827 (occur-mode)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2828 (setq occur-buffer main-buffer)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2829 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2830 (goto-char (point-max))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2831 (setq start (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2832 (insert line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2833 (if occur-point
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2834 (setq occur-point (point)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2835 (insert message)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2836 (if point
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2837 (put-text-property start (point) 'mouse-face 'highlight))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2838 (insert "\n")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2839 (if point
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2840 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2841 (put-text-property start (point) 'occur m1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2842 (if occur-point
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2843 (put-text-property occur-point (1+ occur-point)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2844 'occur-point t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2845 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2846 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2847
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2848
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2849
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2850 ;; Is this really worth having?
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2851 (defvar sh-learned-buffer-hook nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2852 "*An abnormal hook, called with an alist of leared variables.")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2853 ;;; Example of how to use sh-learned-buffer-hook
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2854 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2855 ;; (defun what-i-learned (list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2856 ;; (let ((p list))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2857 ;; (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2858 ;; (set-buffer "*scratch*")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2859 ;; (goto-char (point-max))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2860 ;; (insert "(setq\n")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2861 ;; (while p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2862 ;; (insert (format " %s %s \n"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2863 ;; (nth 0 (car p)) (nth 1 (car p))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2864 ;; (setq p (cdr p)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2865 ;; (insert ")\n")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2866 ;; )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2867 ;;
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2868 ;; (add-hook 'sh-learned-buffer-hook 'what-i-learned)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2869
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2870
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2871 ;; Originally this was sh-learn-region-indent (beg end)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2872 ;; However, in practise this was awkward so I changed it to
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2873 ;; use the whole buffer. Use narrowing if needbe.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2874 (defun sh-learn-buffer-indent (&optional arg)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2875 "Learn how to indent the buffer the way it currently is.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2876
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2877 Output in buffer \"*indent*\" shows any lines which have conflicting
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2878 values of a variable, and the final value of all variables learnt.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2879 This buffer is popped to automatically if there are any discrepencies.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2880
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2881 If no prefix ARG is given, then variables are set to numbers.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2882 If a prefix arg is given, then variables are set to symbols when
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2883 applicable -- e.g. to symbol `+' if the value is that of the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2884 basic indent.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2885 If a positive numerical prefix is given, then `sh-basic-offset'
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2886 is set to the prefix's numerical value.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2887 Otherwise, sh-basic-offset may or may not be changed, according
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2888 to the value of variable `sh-learn-basic-offset'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2889
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2890 Abnormal hook `sh-learned-buffer-hook' if non-nil is called when the
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2891 function completes. The function is abnormal because it is called
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2892 with an alist of variables learnt. This feature may be changed or
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2893 removed in the future.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2894
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2895 This command can often take a long time to run."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2896 (interactive "P")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2897 (sh-must-support-indent)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2898 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2899 (goto-char (point-min))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2900 (let ((learned-var-list nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2901 (out-buffer "*indent*")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2902 (num-diffs 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2903 last-pos
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2904 previous-set-info
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2905 (max 17)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2906 vec
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2907 msg
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2908 (comment-col nil) ;; number if all same, t if seen diff values
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2909 (comments-always-default t) ;; nil if we see one not default
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2910 initial-msg
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2911 (specified-basic-offset (and arg (numberp arg)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2912 (> arg 0)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2913 (linenum 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2914 suggested)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2915 (setq vec (make-vector max 0))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2916 (sh-mark-init out-buffer)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2917
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2918 (if specified-basic-offset
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2919 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2920 (setq sh-basic-offset arg)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2921 (setq initial-msg
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2922 (format "Using specified sh-basic-offset of %d"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2923 sh-basic-offset)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2924 (setq initial-msg
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2925 (format "Initial value of sh-basic-offset: %s"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2926 sh-basic-offset)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2927
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2928 (while (< (point) (point-max))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2929 (setq linenum (1+ linenum))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2930 ;; (if (zerop (% linenum 10))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2931 (message "line %d" linenum)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2932 ;; )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2933 (unless (looking-at "\\s-*$") ;; ignore empty lines!
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2934 (let* ((sh-indent-comment t) ;; info must return default indent
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2935 (info (sh-get-indent-info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2936 (var (sh-get-indent-var-for-line info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2937 sval ival diff new-val
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2938 (curr-indent (current-indentation)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2939 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2940 ((null var)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2941 nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2942 ((stringp var)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2943 nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2944 ((numberp (setq sval (sh-var-value var 'no-error)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2945 ;; the numberp excludes comments since sval will be t.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2946 (setq ival (sh-calculate-indent))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2947 (setq diff (- curr-indent ival))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2948 (setq new-val (+ sval diff))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2949 (sh-set-var-value var new-val 'no-symbol)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2950 (unless (looking-at "\\s-*#");; don't learn from comments
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2951 (if (setq previous-set-info (assoc var learned-var-list))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2952 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2953 ;; it was already there, is it same value ?
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2954 (unless (eq (symbol-value var)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2955 (nth 1 previous-set-info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2956 (sh-mark-line
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2957 (format "Variable %s was set to %s"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2958 var (symbol-value var))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2959 (point) out-buffer t t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2960 (sh-mark-line
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2961 (format " but was previously set to %s"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2962 (nth 1 previous-set-info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2963 (nth 2 previous-set-info) out-buffer t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2964 (setq num-diffs (1+ num-diffs))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2965 ;; (delete previous-set-info learned-var-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2966 (setcdr previous-set-info
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2967 (list (symbol-value var) (point)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2968 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2969 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2970 (setq learned-var-list
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2971 (append (list (list var (symbol-value var)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2972 (point)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2973 learned-var-list)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2974 (if (numberp new-val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2975 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2976 (sh-debug
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2977 "This line's indent value: %d" new-val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2978 (if (< new-val 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2979 (setq new-val (- new-val)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2980 (if (< new-val max)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2981 (aset vec new-val (1+ (aref vec new-val))))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2982 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2983 ((eq var 'sh-indent-comment)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2984 (unless (= curr-indent (sh-calculate-indent info))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2985 ;; this is not the default indentation
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2986 (setq comments-always-default nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2987 (if comment-col;; then we have see one before
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2988 (or (eq comment-col curr-indent)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2989 (setq comment-col t));; seen a different one
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2990 (setq comment-col curr-indent))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2991 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2992 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2993 (sh-debug "Cannot learn this line!!!")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2994 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2995 (sh-debug
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2996 "at %s learned-var-list is %s" (point) learned-var-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2997 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2998 (forward-line 1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
2999 ) ;; while
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3000 (if sh-debug
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3001 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3002 (setq msg (format
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3003 "comment-col = %s comments-always-default = %s"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3004 comment-col comments-always-default))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3005 ;; (message msg)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3006 (sh-mark-line msg nil out-buffer)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3007 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3008 ((eq comment-col 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3009 (setq msg "\nComments are all in 1st column.\n"))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3010 (comments-always-default
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3011 (setq msg "\nComments follow default indentation.\n")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3012 (setq comment-col t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3013 ((numberp comment-col)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3014 (setq msg (format "\nComments are in col %d." comment-col)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3015 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3016 (setq msg "\nComments seem to be mixed, leaving them as is.\n")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3017 (setq comment-col nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3018 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3019 (sh-debug msg)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3020 (sh-mark-line msg nil out-buffer)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3021
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3022 (sh-mark-line initial-msg nil out-buffer t t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3023
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3024 (setq suggested (sh-guess-basic-offset vec))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3025
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3026 (if (and suggested (not specified-basic-offset))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3027 (let ((new-value
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3028 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3029 ;; t => set it if we have a single value as a number
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3030 ((and (eq sh-learn-basic-offset t) (numberp suggested))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3031 suggested)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3032 ;; other non-nil => set it if only one value was found
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3033 (sh-learn-basic-offset
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3034 (if (numberp suggested)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3035 suggested
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3036 (if (= (length suggested) 1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3037 (car suggested))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3038 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3039 nil))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3040 (if new-value
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3041 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3042 (setq learned-var-list
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3043 (append (list (list 'sh-basic-offset
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3044 (setq sh-basic-offset new-value)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3045 (point-max)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3046 learned-var-list))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3047 ;; Not sure if we need to put this line in, since
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3048 ;; it will appear in the "Learned variable settings".
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3049 (sh-mark-line
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3050 (format "Changed sh-basic-offset to: %d" sh-basic-offset)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3051 nil out-buffer))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3052 (sh-mark-line
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3053 (if (listp suggested)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3054 (format "Possible value(s) for sh-basic-offset: %s"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3055 (mapconcat 'int-to-string suggested " "))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3056 (format "Suggested sh-basic-offset: %d" suggested))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3057 nil out-buffer))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3058
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3059
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3060 (setq learned-var-list
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3061 (append (list (list 'sh-indent-comment comment-col (point-max)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3062 learned-var-list))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3063 (setq sh-indent-comment comment-col)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3064 (let ((name (buffer-name))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3065 (lines (if (and (eq (point-min) 1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3066 (eq (point-max) (1+ (buffer-size))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3067 ""
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3068 (format "lines %d to %d of "
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3069 (1+ (count-lines 1 (point-min)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3070 (1+ (count-lines 1 (point-max))))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3071 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3072 (sh-mark-line "\nLearned variable settings:" nil out-buffer)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3073 (if arg
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3074 ;; Set learned variables to symbolic rather than numeric
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3075 ;; values where possible.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3076 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3077 (let ((p (reverse learned-var-list))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3078 var val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3079 (while p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3080 (setq var (car (car p)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3081 (setq val (nth 1 (car p)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3082 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3083 ((eq var 'sh-basic-offset)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3084 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3085 ((numberp val)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3086 (sh-set-var-value var val))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3087 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3088 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3089 (setq p (cdr p))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3090 ))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3091 (let ((p (reverse learned-var-list))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3092 var)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3093 (while p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3094 (setq var (car (car p)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3095 (sh-mark-line (format " %s %s" var (symbol-value var))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3096 (nth 2 (car p)) out-buffer)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3097 (setq p (cdr p))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3098 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3099 (set-buffer out-buffer)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3100 (goto-char (point-min))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3101 (insert
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3102 (format "Indentation values for buffer %s.\n" name)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3103 (format "%d indentation variable%s different values%s\n\n"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3104 num-diffs
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3105 (if (= num-diffs 1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3106 " has" "s have")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3107 (if (zerop num-diffs)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3108 "." ":"))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3109 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3110 ;; Are abnormal hooks considered bad form?
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3111 (run-hook-with-args 'sh-learned-buffer-hook learned-var-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3112 (if (or sh-popup-occur-buffer (> num-diffs 0))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3113 (pop-to-buffer out-buffer))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3114 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3115
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3116 (defun sh-guess-basic-offset (vec)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3117 "See if we can determine a reasonbable value for `sh-basic-offset'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3118 This is experimental, heuristic and arbitrary!
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3119 Argument VEC is a vector of information collected by
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3120 `sh-learn-buffer-indent'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3121 Return values:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3122 number - there appears to be a good single value
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3123 list of numbers - no obvious one, here is a list of one or more
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3124 reasonable choices
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3125 nil - we couldn't find a reasonable one."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3126 (let* ((max (1- (length vec)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3127 (i 1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3128 (totals (make-vector max 0))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3129 (return nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3130 j)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3131 (while (< i max)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3132 (aset totals i (+ (aref totals i) (* 4 (aref vec i))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3133 (setq j (/ i 2))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3134 (if (zerop (% i 2))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3135 (aset totals i (+ (aref totals i) (aref vec (/ i 2)))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3136 (if (< (* i 2) max)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3137 (aset totals i (+ (aref totals i) (aref vec (* i 2)))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3138 (setq i (1+ i))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3139 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3140 (let ((x nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3141 (result nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3142 tot sum p)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3143 (setq i 1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3144 (while (< i max)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3145 (if (/= (aref totals i) 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3146 (setq x (append x (list (cons i (aref totals i))))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3147 (setq i (1+ i)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3148
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
3149 (setq x (sort x (lambda (a b)
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3150 (> (cdr a)(cdr b)))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3151 (setq tot (apply '+ (append totals nil)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3152 (sh-debug (format "vec: %s\ntotals: %s\ntot: %d"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3153 vec totals tot))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3154 (cond
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3155 ((zerop (length x))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3156 (message "no values!")) ;; we return nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3157 ((= (length x) 1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3158 (message "only value is %d" (car (car x)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3159 (setq result (car (car x)))) ;; return single value
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3160 ((> (cdr (car x)) (/ tot 2))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3161 ;; 1st is > 50%
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3162 (message "basic-offset is probably %d" (car (car x)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3163 (setq result (car (car x)))) ;; again, return a single value
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3164 ((>= (cdr (car x)) (* 2 (cdr (car (cdr x)))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3165 ;; 1st is >= 2 * 2nd
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3166 (message "basic-offset could be %d" (car (car x)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3167 (setq result (car (car x))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3168 ((>= (+ (cdr (car x))(cdr (car (cdr x)))) (/ tot 2))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3169 ;; 1st & 2nd together >= 50% - return a list
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3170 (setq p x sum 0 result nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3171 (while (and p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3172 (<= (setq sum (+ sum (cdr (car p)))) (/ tot 2)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3173 (setq result (append result (list (car (car p)))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3174 (setq p (cdr p)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3175 (message "Possible choices for sh-basic-offset: %s"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3176 (mapconcat 'int-to-string result " ")))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3177 (t
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3178 (message "No obvious value for sh-basic-offset. Perhaps %d"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3179 (car (car x)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3180 ;; result is nil here
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3181 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3182 result
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3183 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3184
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3185
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3186 (defun sh-do-nothing (a b c)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3187 ;; checkdoc-params: (a b c)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3188 "A dummy function to prevent font-lock from re-fontifying a change.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3189 Otherwise, we fontify something and font-lock overwrites it."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3190 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3191
26813
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
3192 ;; The default font-lock-unfontify-region-function removes
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
3193 ;; syntax-table properties, and so removes our information.
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
3194 (defun sh-font-lock-unfontify-region-function (beg end)
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
3195 (let* ((modified (buffer-modified-p)) (buffer-undo-list t)
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
3196 (inhibit-read-only t) (inhibit-point-motion-hooks t)
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
3197 before-change-functions after-change-functions
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
3198 deactivate-mark buffer-file-name buffer-file-truename)
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
3199 (remove-text-properties beg end '(face nil))
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
3200 (when (and (not modified) (buffer-modified-p))
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
3201 (set-buffer-modified-p nil))))
da094b0ffe3c Fix for when font-lock mode is active.
Gerd Moellmann <gerd@gnu.org>
parents: 25986
diff changeset
3202
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3203 (defun sh-set-char-syntax (where new-prop)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3204 "Set the character's syntax table property at WHERE to be NEW-PROP."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3205 (or where
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3206 (setq where (point)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3207 (let ((font-lock-fontify-region-function 'sh-do-nothing))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3208 (put-text-property where (1+ where) 'syntax-table new-prop)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3209 (add-text-properties where (1+ where)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3210 '(face sh-st-face rear-nonsticky t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3211 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3212
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3213
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3214 (defun sh-check-paren-in-case ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3215 "Make syntax class of case label's right parenthesis not close parenthesis.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3216 If this parenthesis is a case alternative, set its syntax class to a word."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3217 (let ((start (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3218 state prev-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3219 ;; First test if this is a possible candidate, the first "(" or ")"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3220 ;; on the line; then, if go, check prev line is ;; or case.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3221 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3222 (beginning-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3223 ;; stop at comment or when depth becomes -1
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3224 (setq state (parse-partial-sexp (point) start -1 nil nil t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3225 (if (and
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3226 (= (car state) -1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3227 (= (point) start)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3228 (setq prev-line (sh-prev-line nil)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3229 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3230 (goto-char prev-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3231 (beginning-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3232 ;; (setq case-stmt-start (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3233 ;; (if (looking-at "\\(^\\s-*case[^-a-z0-9_]\\|[^#]*;;\\s-*$\\)")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3234 (if (sh-search-word "\\(case\\|;;\\)" start)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3235 (sh-set-char-syntax (1- start) sh-special-syntax)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3236 ))))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3237
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3238 (defun sh-electric-rparen ()
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
3239 "Insert a right parenthesis and check if it is a case alternative.
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
3240 If so, its syntax class is set to word, and its text property
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3241 is set to have face `sh-st-face'."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3242 (interactive)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3243 (insert ")")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3244 (if sh-electric-rparen-needed-here
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3245 (sh-check-paren-in-case)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3246
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3247 (defun sh-electric-hash ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3248 "Insert a hash, but check it is preceded by \"$\".
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3249 If so, it is given a syntax type of comment.
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
3250 Its text property has face `sh-st-face'."
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3251 (interactive)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3252 (let ((pos (point)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3253 (insert "#")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3254 (if (eq (char-before pos) ?$)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3255 (sh-set-char-syntax pos sh-st-punc))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3256
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3257 (defun sh-electric-less (arg)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3258 "Insert a \"<\" and see if this is the start of a here-document.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3259 If so, the syntax class is set so that it will not be automatically
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3260 reindented.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3261 Argument ARG if non-nil disables this test."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3262 (interactive "*P")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3263 (let ((p1 (point)) p2 p3)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3264 (sh-maybe-here-document arg) ;; call the original fn in sh-script.el.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3265 (setq p2 (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3266 (if (/= (+ p1 (prefix-numeric-value arg)) p2)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3267 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3268 (forward-line 1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3269 (end-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3270 (setq p3 (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3271 (sh-set-here-doc-region p2 p3))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3272 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3273
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3274 (defun sh-set-here-doc-region (start end)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3275 "Mark a here-document from START to END so that it will not be reindented."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3276 (interactive "r")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3277 ;; Make the whole thing have syntax type word...
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3278 ;; That way sexp movement doens't worry about any parentheses.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3279 ;; A disadvantage of this is we can't use forward-word within a
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3280 ;; here-doc, which is annoying.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3281 (let ((font-lock-fontify-region-function 'sh-do-nothing))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3282 (put-text-property start end 'syntax-table sh-here-doc-syntax)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3283 (put-text-property start end 'face 'sh-heredoc-face)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3284 (put-text-property (1- end) end 'rear-nonsticky t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3285 (put-text-property start (1+ start) 'front-sticky t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3286 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3287
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3288 (defun sh-remove-our-text-properties ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3289 "Remove text properties relating to right parentheses and here documents."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3290 (interactive)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3291 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3292 (goto-char (point-min))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3293 (while (not (eobp))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3294 (let ((plist (text-properties-at (point)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3295 (next-change
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3296 (or (next-single-property-change (point) 'syntax-table
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3297 (current-buffer) )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3298 (point-max))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3299 ;; Process text from point to NEXT-CHANGE...
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3300 (if (get-text-property (point) 'syntax-table)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3301 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3302 (sh-debug "-- removing props from %d to %d --"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3303 (point) next-change)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3304 (remove-text-properties (point) next-change
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3305 '(syntax-table nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3306 (remove-text-properties (point) next-change '(face nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3307 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3308 (goto-char next-change)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3309 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3310
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3311 (defun sh-search-word (word &optional limit)
29422
be5a54fc840d (sh-symbol-list, sh-number-or-symbol-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29109
diff changeset
3312 "Search forward for regexp WORD occurring as a word not in string nor comment.
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3313 If found, returns non nil with the match available in \(match-string 2\).
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3314 Yes 2, not 1, since we build a regexp to guard against false matches
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3315 such as matching \"a-case\" when we are searching for \"case\".
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3316 If not found, it returns nil.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3317 The search maybe limited by optional argument LIMIT."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3318 (interactive "sSearch for: ")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3319 (let ((found nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3320 ;; Cannot use \\b here since it matches "-" and "_"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3321 (regexp (sh-mkword-regexp word))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3322 start state where)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3323 (setq start (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3324 (while (and (setq start (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3325 (not found)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3326 (re-search-forward regexp limit t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3327 ;; Found str; check it is not in a comment or string.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3328 (setq state
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3329 ;; Stop on comment:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3330 (parse-partial-sexp start (point) nil nil nil 'syntax_table))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3331 (if (setq where (nth 8 state))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3332 ;; in comment or string
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3333 (if (= where -1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3334 (setq found (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3335 (if (eq (char-after where) ?#)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3336 (end-of-line)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3337 (goto-char where)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3338 (unless (sh-safe-forward-sexp)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3339 ;; If the above fails we must either give up or
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3340 ;; move forward and try again.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3341 (forward-line 1))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3342 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3343 ;; not in comment or string, so accept it
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3344 (setq found (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3345 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3346 found
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3347 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3348
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3349 (defun sh-scan-case ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3350 "Scan a case statement for right parens belonging to case alternatives.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3351 Mark each as having syntax `sh-special-syntax'.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3352 Called from scan-buff. If ok, return non-nil."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3353 (let (end
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3354 state
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3355 (depth 1) ;; we are called at a "case"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3356 (start (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3357 (return t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3358 ;; We enter here at a case statement
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3359 ;; First, find limits of the case.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3360 (while (and (> depth 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3361 (sh-search-word "\\(case\\|esac\\)"))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3362 (if (equal (match-string 2) "case")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3363 (setq depth (1+ depth))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3364 (setq depth (1- depth))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3365 ;; (message "end of search for esac at %d depth=%d" (point) depth)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3366 (setq end (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3367 (goto-char start)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3368 ;; if we found the esac, then fix all appropriate ')'s in the region
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3369 (if (zerop depth)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3370 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3371 (while (< (point) end)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3372 ;; search for targetdepth of -1 meaning extra right paren
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3373 (setq state (parse-partial-sexp (point) end -1 nil nil nil))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3374 (if (and (= (car state) -1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3375 (= (char-before) ?\)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3376 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3377 ;; (message "At %d state is %s" (point) state)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3378 ;; (message "Fixing %d" (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3379 (sh-set-char-syntax (1- (point)) sh-special-syntax)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3380 ;; we could advance to the next ";;" perhaps
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3381 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3382 ;; (message "? Not found at %d" (point)) ; ok, could be "]"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3383 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3384 (goto-char end))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3385 (message "No matching esac for case at %d" start)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3386 (setq return nil)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3387 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3388 return
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3389 ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3390
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3391
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3392 (defun sh-scan-buffer ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3393 "Scan a sh buffer for case statements and here-documents.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3394
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3395 For each case alternative found, mark its \")\" with a text property
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3396 so that its syntax class is no longer a close parenthesis character.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3397
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3398 Each here-document is also marked so that it is effectively immune
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3399 from indenation changes."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3400 ;; Do not call this interactively, call `sh-rescan-buffer' instead.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3401 (sh-must-be-shell-mode)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3402 (let ((n 0)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3403 (initial-buffer-modified-p (buffer-modified-p))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3404 start end where label ws)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3405 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3406 (goto-char (point-min))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3407 ;; 1. Scan for ")" in case statements.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3408 (while (and ;; (re-search-forward "^[^#]*\\bcase\\b" nil t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3409 (sh-search-word "\\(case\\|esac\\)")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3410 ;; (progn (message "Found a case at %d" (point)) t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3411 (sh-scan-case)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3412 ;; 2. Scan for here docs
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3413 (goto-char (point-min))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3414 ;; while (re-search-forward "<<\\(-?\\)\\(\\s-*\\)\\(.*\\)$" nil t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3415 (while (re-search-forward "<<\\(-?\\)" nil t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3416 (unless (sh-in-comment-or-string (match-beginning 0))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3417 ;; (setq label (match-string 3))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3418 (setq label (sh-get-word))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3419 (if (string= (match-string 1) "-")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3420 ;; if <<- then we allow whitespace
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3421 (setq ws "\\s-*")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3422 ;; otherwise we don't
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3423 (setq ws ""))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3424 (while (string-match "['\"\\]" label)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3425 (setq label (replace-match "" nil nil label)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3426 (if (setq n (string-match "\\s-+$" label))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3427 (setq label (substring label 0 n)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3428 (forward-line 1)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3429 ;; the line containing the << could be continued...
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3430 (while (sh-this-is-a-continuation)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3431 (forward-line 1))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3432 (setq start (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3433 (if (re-search-forward (concat "^" ws (regexp-quote label)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3434 "\\s-*$")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3435 nil t)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3436 (sh-set-here-doc-region start (point))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3437 (sh-debug "missing here-doc delimiter `%s'" label))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3438 ;; 3. Scan for $# -- make the "#" a punctuation not a comment
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3439 (goto-char (point-min))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3440 (let (state)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3441 (while (and (not (eobp))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3442 (setq state (parse-partial-sexp
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3443 (1+ (point))(point-max) nil nil nil t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3444 (nth 4 state))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3445 (goto-char (nth 8 state))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3446 (sh-debug "At %d %s" (point) (eq (char-before) ?$))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3447 (if (eq (char-before) ?$)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3448 (sh-set-char-syntax (point) sh-st-punc) ;; not a comment!
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3449 (end-of-line) ;; if this *was* a comment, ignore rest of line!
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3450 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3451 ;; 4. Hide these changes from making a previously unmodified
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3452 ;; buffer into a modified buffer.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3453 (if sh-debug
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3454 (if initial-buffer-modified-p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3455 (message "buffer was initially modified")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3456 (message
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3457 "buffer not initially modified - so clearing modified flag")))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3458 (set-buffer-modified-p initial-buffer-modified-p)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3459 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3460
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3461 (defun sh-rescan-buffer ()
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3462 "Rescan the buffer for case alternative parentheses and here documents."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3463 (interactive)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3464 (if (eq major-mode 'sh-mode)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3465 (let ((inhibit-read-only t))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3466 (sh-remove-our-text-properties)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3467 (message "Re-scanning buffer...")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3468 (sh-scan-buffer)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3469 (message "Re-scanning buffer...done")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3470 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3471
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3472 ;; ========================================================================
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3473
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3474 ;; Styles -- a quick and dirty way of saving the indenation settings.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3475
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3476 (defvar sh-styles-alist nil
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3477 "A list of all known shell indentation styles.")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3478
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3479 (defun sh-name-style (name &optional confirm-overwrite)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3480 "Name the current indentation settings as a style called NAME.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3481 If this name exists, the command will prompt whether it should be
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3482 overwritten if
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3483 - - it was called interactively with a prefix argument, or
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3484 - - called non-interactively with optional CONFIRM-OVERWRITE non-nil."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3485 ;; (interactive "sName for this style: ")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3486 (interactive
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3487 (list
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3488 (read-from-minibuffer "Name for this style? " )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3489 (not current-prefix-arg)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3490 (let ((slist (list name))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3491 (p sh-var-list)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3492 var style)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3493 (while p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3494 (setq var (car p))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3495 (setq slist (append slist (list (cons var (symbol-value var)))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3496 (setq p (cdr p)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3497 (if (setq style (assoc name sh-styles-alist))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3498 (if (or (not confirm-overwrite)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3499 (y-or-n-p "This style exists. Overwrite it? "))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3500 (progn
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3501 (message "Updating style %s" name)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3502 (setcdr style (cdr slist)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3503 (message "Not changing style %s" name))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3504 (message "Creating new style %s" name)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3505 (setq sh-styles-alist (append sh-styles-alist
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3506 (list slist)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3507 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3508
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3509 (defun sh-load-style (name)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3510 "Set shell indentation values for this buffer from those in style NAME."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3511 (interactive (list (completing-read
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3512 "Which style to use for this buffer? "
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3513 sh-styles-alist nil t)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3514 (let ((sl (assoc name sh-styles-alist)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3515 (if (null sl)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3516 (error "sh-load-style - style %s not known" name)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3517 (setq sl (cdr sl))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3518 (while sl
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3519 (set (car (car sl)) (cdr (car sl)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3520 (setq sl (cdr sl))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3521 ))))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3522
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3523 (defun sh-save-styles-to-buffer (buff)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3524 "Save all current styles in elisp to buffer BUFF.
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3525 This is always added to the end of the buffer."
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3526 (interactive (list
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3527 (read-from-minibuffer "Buffer to save styles in? " "*scratch*")))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3528 ;; This is an attempt to sort of pretty print it...
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3529 (save-excursion
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3530 (set-buffer (get-buffer-create buff))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3531 (goto-char (point-max))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3532 (insert "\n")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3533 (let ((p sh-styles-alist) q)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3534 (insert "(setq sh-styles-alist '(\n")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3535 (while p
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3536 (setq q (car p))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3537 (insert " ( " (prin1-to-string (car q)) "\n")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3538 (setq q (cdr q))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3539 (while q
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3540 (insert " "(prin1-to-string (car q)) "\n")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3541 (setq q (cdr q)))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3542 (insert " )\n")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3543 (setq p (cdr p))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3544 )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3545 (insert "))\n")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3546 )))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3547
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3548
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3549
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3550
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3551 ;; statement syntax-commands for various shells
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3552
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3553 ;; You are welcome to add the syntax or even completely new statements as
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3554 ;; appropriate for your favorite shell.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3555
17531
b891e41b4011 (sh-case): Make this a simple define-skeleton
Richard M. Stallman <rms@gnu.org>
parents: 17501
diff changeset
3556 (define-skeleton sh-case
b891e41b4011 (sh-case): Make this a simple define-skeleton
Richard M. Stallman <rms@gnu.org>
parents: 17501
diff changeset
3557 "Insert a case/switch statement. See `sh-feature'."
20771
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3558 (csh "expression: "
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3559 "switch( " str " )" \n
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3560 > "case " (read-string "pattern: ") ?: \n
17531
b891e41b4011 (sh-case): Make this a simple define-skeleton
Richard M. Stallman <rms@gnu.org>
parents: 17501
diff changeset
3561 > _ \n
20771
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3562 "breaksw" \n
17531
b891e41b4011 (sh-case): Make this a simple define-skeleton
Richard M. Stallman <rms@gnu.org>
parents: 17501
diff changeset
3563 ( "other pattern, %s: "
20771
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3564 < "case " str ?: \n
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3565 > _ \n
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3566 "breaksw" \n)
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3567 < "default:" \n
17531
b891e41b4011 (sh-case): Make this a simple define-skeleton
Richard M. Stallman <rms@gnu.org>
parents: 17501
diff changeset
3568 > _ \n
b891e41b4011 (sh-case): Make this a simple define-skeleton
Richard M. Stallman <rms@gnu.org>
parents: 17501
diff changeset
3569 resume:
20771
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3570 < < "endsw")
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3571 (es)
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3572 (rc "expression: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3573 > "switch( " str " ) {" \n
20771
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3574 > "case " (read-string "pattern: ") \n
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3575 > _ \n
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3576 ( "other pattern, %s: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3577 "case " str > \n
20771
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3578 > _ \n)
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3579 "case *" > \n
20771
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3580 > _ \n
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3581 resume:
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3582 ?} > )
20771
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3583 (sh "expression: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3584 > "case " str " in" \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3585 > (read-string "pattern: ")
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3586 '(sh-electric-rparen)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3587 \n
20771
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3588 > _ \n
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3589 ";;" \n
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3590 ( "other pattern, %s: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3591 > str '(sh-electric-rparen) \n
20771
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3592 > _ \n
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3593 ";;" \n)
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3594 > "*" '(sh-electric-rparen) \n
20771
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3595 > _ \n
c6d9f48bd2f8 (sh-case): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents: 20459
diff changeset
3596 resume:
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3597 "esac" > ))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3598
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3599 (define-skeleton sh-for
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3600 "Insert a for loop. See `sh-feature'."
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3601 (csh eval sh-modify sh
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3602 1 ""
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3603 2 "foreach "
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3604 4 " ( "
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3605 6 " )"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3606 15 '<
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3607 16 "end"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3608 )
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3609 (es eval sh-modify rc
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3610 4 " = ")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3611 (rc eval sh-modify sh
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3612 2 "for( "
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3613 6 " ) {"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3614 15 ?} )
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3615 (sh "Index variable: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3616 > "for " str " in " _ "; do" \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3617 > _ | ?$ & (sh-remember-variable str) \n
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3618 "done" > ))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3619
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3620
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3621
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3622 (define-skeleton sh-indexed-loop
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3623 "Insert an indexed loop from 1 to n. See `sh-feature'."
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3624 (bash eval identity posix)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3625 (csh "Index variable: "
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3626 "@ " str " = 1" \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3627 "while( $" str " <= " (read-string "upper limit: ") " )" \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3628 > _ ?$ str \n
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3629 "@ " str "++" \n
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3630 < "end")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3631 (es eval sh-modify rc
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3632 4 " =")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3633 (ksh88 "Index variable: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3634 > "integer " str "=0" \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3635 > "while (( ( " str " += 1 ) <= "
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3636 (read-string "upper limit: ")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3637 " )); do" \n
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3638 > _ ?$ (sh-remember-variable str) > \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3639 "done" > )
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3640 (posix "Index variable: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3641 > str "=1" \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3642 "while [ $" str " -le "
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3643 (read-string "upper limit: ")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3644 " ]; do" \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3645 > _ ?$ str \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3646 str ?= (sh-add (sh-remember-variable str) 1) \n
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3647 "done" > )
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3648 (rc "Index variable: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3649 > "for( " str " in" " `{awk 'BEGIN { for( i=1; i<="
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3650 (read-string "upper limit: ")
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3651 "; i++ ) print i }'`}) {" \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3652 > _ ?$ (sh-remember-variable str) \n
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3653 ?} >)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3654 (sh "Index variable: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3655 > "for " str " in `awk 'BEGIN { for( i=1; i<="
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3656 (read-string "upper limit: ")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3657 "; i++ ) print i }'`; do" \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3658 > _ ?$ (sh-remember-variable str) \n
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3659 "done" > ))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3660
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3661
14418
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3662 (defun sh-shell-initialize-variables ()
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3663 "Scan the buffer for variable assignments.
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3664 Add these variables to `sh-shell-variables'."
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3665 (message "Scanning buffer `%s' for variable assignments..." (buffer-name))
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3666 (save-excursion
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3667 (goto-char (point-min))
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3668 (setq sh-shell-variables-initialized t)
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3669 (while (search-forward "=" nil t)
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3670 (sh-assignment 0)))
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3671 (message "Scanning buffer `%s' for variable assignments...done"
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3672 (buffer-name)))
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3673
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3674 (defvar sh-add-buffer)
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3675
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3676 (defun sh-add-completer (string predicate code)
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3677 "Do completion using `sh-shell-variables', but initialize it first.
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3678 This function is designed for use as the \"completion table\",
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3679 so it takes three arguments:
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3680 STRING, the current buffer contents;
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3681 PREDICATE, the predicate for filtering possible matches;
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3682 CODE, which says what kind of things to do.
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3683 CODE can be nil, t or `lambda'.
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3684 nil means to return the best completion of STRING, or nil if there is none.
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3685 t means to return a list of all possible completions of STRING.
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3686 `lambda' means to return t if STRING is a valid completion as it stands."
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3687 (let ((sh-shell-variables
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3688 (save-excursion
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3689 (set-buffer sh-add-buffer)
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3690 (or sh-shell-variables-initialized
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3691 (sh-shell-initialize-variables))
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3692 (nconc (mapcar (lambda (var)
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3693 (let ((name
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3694 (substring var 0 (string-match "=" var))))
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3695 (cons name name)))
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3696 process-environment)
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3697 sh-shell-variables))))
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3698 (cond ((null code)
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3699 (try-completion string sh-shell-variables predicate))
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3700 ((eq code t)
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3701 (all-completions string sh-shell-variables predicate))
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3702 ((eq code 'lambda)
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3703 (assoc string sh-shell-variables)))))
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3704
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3705 (defun sh-add (var delta)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3706 "Insert an addition of VAR and prefix DELTA for Bourne (type) shell."
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3707 (interactive
14418
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3708 (let ((sh-add-buffer (current-buffer)))
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3709 (list (completing-read "Variable: " 'sh-add-completer)
7f58ca0014ef (sh-shell-variables-initialized): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14221
diff changeset
3710 (prefix-numeric-value current-prefix-arg))))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3711 (insert (sh-feature '((bash . "$[ ")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3712 (ksh88 . "$(( ")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3713 (posix . "$(( ")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3714 (rc . "`{expr $")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3715 (sh . "`expr $")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3716 (zsh . "$[ ")))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3717 (sh-remember-variable var)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3718 (if (< delta 0) " - " " + ")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3719 (number-to-string (abs delta))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3720 (sh-feature '((bash . " ]")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3721 (ksh88 . " ))")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3722 (posix . " ))")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3723 (rc . "}")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3724 (sh . "`")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3725 (zsh . " ]")))))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3726
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3727
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3728
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3729 (define-skeleton sh-function
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3730 "Insert a function definition. See `sh-feature'."
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3731 (bash eval sh-modify ksh88
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3732 3 "() {")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3733 (ksh88 "name: "
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3734 "function " str " {" \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3735 > _ \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3736 < "}")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3737 (rc eval sh-modify ksh88
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3738 1 "fn ")
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3739 (sh ()
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3740 "() {" \n
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3741 > _ \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3742 < "}"))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3743
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3744
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3745
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3746 (define-skeleton sh-if
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3747 "Insert an if statement. See `sh-feature'."
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3748 (csh "condition: "
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3749 "if( " str " ) then" \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3750 > _ \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3751 ( "other condition, %s: "
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3752 < "else if( " str " ) then" \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3753 > _ \n)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3754 < "else" \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3755 > _ \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3756 resume:
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3757 < "endif")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3758 (es "condition: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3759 > "if { " str " } {" \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3760 > _ \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3761 ( "other condition, %s: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3762 "} { " str " } {" > \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3763 > _ \n)
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3764 "} {" > \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3765 > _ \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3766 resume:
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3767 ?} > )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3768 (rc "condition: "
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3769 > "if( " str " ) {" \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3770 > _ \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3771 ( "other condition, %s: "
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3772 "} else if( " str " ) {" > \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3773 > _ \n)
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3774 "} else {" > \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3775 > _ \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3776 resume:
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3777 ?} >
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3778 )
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3779 (sh "condition: "
12863
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3780 '(setq input (sh-feature sh-test))
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3781 > "if " str "; then" \n
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3782 > _ \n
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3783 ( "other condition, %s: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3784 > "elif " str "; then" > \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3785 > \n)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3786 "else" > \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3787 > \n
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3788 resume:
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3789 "fi" > ))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3790
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3791
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3792
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3793 (define-skeleton sh-repeat
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3794 "Insert a repeat loop definition. See `sh-feature'."
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3795 (es nil
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3796 > "forever {" \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3797 > _ \n
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3798 ?} > )
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3799 (zsh "factor: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3800 > "repeat " str "; do" > \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3801 > \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3802 "done" > ))
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3803
17501
478f9bb8575c Remove all menu-enable properties except for sh-case.
Richard M. Stallman <rms@gnu.org>
parents: 17480
diff changeset
3804 ;;;(put 'sh-repeat 'menu-enable '(sh-feature sh-repeat))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3805
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3806
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3807
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3808 (define-skeleton sh-select
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3809 "Insert a select statement. See `sh-feature'."
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3810 (ksh88 "Index variable: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3811 > "select " str " in " _ "; do" \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3812 > ?$ str \n
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3813 "done" > )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3814 (bash eval sh-append ksh88)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3815 )
17501
478f9bb8575c Remove all menu-enable properties except for sh-case.
Richard M. Stallman <rms@gnu.org>
parents: 17480
diff changeset
3816 ;;;(put 'sh-select 'menu-enable '(sh-feature sh-select))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3817
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3818
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3819
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3820 (define-skeleton sh-tmp-file
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3821 "Insert code to setup temporary file handling. See `sh-feature'."
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3822 (bash eval identity ksh88)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3823 (csh (file-name-nondirectory (buffer-file-name))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3824 "set tmp = /tmp/" str ".$$" \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3825 "onintr exit" \n _
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3826 (and (goto-char (point-max))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3827 (not (bolp))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3828 ?\n)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3829 "exit:\n"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3830 "rm $tmp* >&/dev/null" >)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3831 (es (file-name-nondirectory (buffer-file-name))
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3832 > "local( signals = $signals sighup sigint; tmp = /tmp/" str
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3833 ".$pid ) {" \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3834 > "catch @ e {" \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3835 > "rm $tmp^* >[2]/dev/null" \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3836 "throw $e" \n
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3837 "} {" > \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3838 _ \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3839 ?} > \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3840 ?} > )
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3841 (ksh88 eval sh-modify sh
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3842 7 "EXIT")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3843 (rc (file-name-nondirectory (buffer-file-name))
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3844 > "tmp = /tmp/" str ".$pid" \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3845 "fn sigexit { rm $tmp^* >[2]/dev/null }")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3846 (sh (file-name-nondirectory (buffer-file-name))
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3847 > "TMP=${TMPDIR:-/tmp}/" str ".$$" \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3848 "trap \"rm $TMP* 2>/dev/null\" " ?0))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3849
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3850
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3851
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3852 (define-skeleton sh-until
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3853 "Insert an until loop. See `sh-feature'."
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3854 (sh "condition: "
12863
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3855 '(setq input (sh-feature sh-test))
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3856 > "until " str "; do" \n
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3857 > _ \n
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3858 "done" > ))
17501
478f9bb8575c Remove all menu-enable properties except for sh-case.
Richard M. Stallman <rms@gnu.org>
parents: 17480
diff changeset
3859 ;;;(put 'sh-until 'menu-enable '(sh-feature sh-until))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3860
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3861
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3862
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3863 (define-skeleton sh-while
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3864 "Insert a while loop. See `sh-feature'."
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3865 (csh eval sh-modify sh
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3866 2 ""
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3867 3 "while( "
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3868 5 " )"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3869 10 '<
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3870 11 "end" )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3871 (es eval sh-modify sh
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3872 3 "while { "
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3873 5 " } {"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3874 10 ?} )
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3875 (rc eval sh-modify sh
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3876 3 "while( "
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3877 5 " ) {"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3878 10 ?} )
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3879 (sh "condition: "
12863
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3880 '(setq input (sh-feature sh-test))
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3881 > "while " str "; do" \n
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3882 > _ \n
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3883 "done" > ))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3884
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3885
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3886
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3887 (define-skeleton sh-while-getopts
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3888 "Insert a while getopts loop. See `sh-feature'.
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3889 Prompts for an options string which consists of letters for each recognized
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3890 option followed by a colon `:' if the option accepts an argument."
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3891 (bash eval sh-modify sh
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3892 18 "${0##*/}")
12863
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3893 (csh nil
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3894 "while( 1 )" \n
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3895 > "switch( \"$1\" )" \n
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3896 '(setq input '("- x" . 2))
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3897 > >
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3898 ( "option, %s: "
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3899 < "case " '(eval str)
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3900 '(if (string-match " +" str)
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3901 (setq v1 (substring str (match-end 0))
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3902 str (substring str 0 (match-beginning 0)))
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3903 (setq v1 nil))
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3904 str ?: \n
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3905 > "set " v1 & " = $2" | -4 & _ \n
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3906 (if v1 "shift") & \n
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3907 "breaksw" \n)
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3908 < "case --:" \n
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3909 > "shift" \n
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3910 < "default:" \n
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3911 > "break" \n
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3912 resume:
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3913 < < "endsw" \n
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3914 "shift" \n
bcf5d042f057 (sh-test): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12812
diff changeset
3915 < "end")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3916 (ksh88 eval sh-modify sh
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3917 16 "print"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3918 18 "${0##*/}"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3919 36 "OPTIND-1")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3920 (posix eval sh-modify sh
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3921 18 "$(basename $0)")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3922 (sh "optstring: "
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3923 > "while getopts :" str " OPT; do" \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3924 > "case $OPT in" \n
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3925 '(setq v1 (append (vconcat str) nil))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3926 ( (prog1 (if v1 (char-to-string (car v1)))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3927 (if (eq (nth 1 v1) ?:)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3928 (setq v1 (nthcdr 2 v1)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3929 v2 "\"$OPTARG\"")
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3930 (setq v1 (cdr v1)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3931 v2 nil)))
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3932 > str "|+" str '(sh-electric-rparen) \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3933 > _ v2 \n
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3934 > ";;" \n)
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3935 > "*" '(sh-electric-rparen) \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3936 > "echo" " \"usage: " "`basename $0`"
15027
30c4f64f3579 (sh-while-getopts): Punctuate help message better.
Richard M. Stallman <rms@gnu.org>
parents: 14892
diff changeset
3937 " [+-" '(setq v1 (point)) str
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3938 '(save-excursion
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3939 (while (search-backward ":" v1 t)
15027
30c4f64f3579 (sh-while-getopts): Punctuate help message better.
Richard M. Stallman <rms@gnu.org>
parents: 14892
diff changeset
3940 (replace-match " ARG] [+-" t t)))
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3941 (if (eq (preceding-char) ?-) -5)
29844
093c79809c9e (sh-while-getopts): Fix handling of
Gerd Moellmann <gerd@gnu.org>
parents: 29422
diff changeset
3942 (if (and (sequencep v1) (length v1)) "] " "} ")
28923
dcafe3c9cd6c (sh-while-getopts) <sh>: Handle case that
Gerd Moellmann <gerd@gnu.org>
parents: 26967
diff changeset
3943 "[--] ARGS...\"" \n
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3944 "exit 2" > \n
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3945 "esac" >
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3946 \n "done"
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
3947 > \n
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3948 "shift " (sh-add "OPTIND" -1)))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3949
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3950
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3951
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3952 (defun sh-assignment (arg)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3953 "Remember preceding identifier for future completion and do self-insert."
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3954 (interactive "p")
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3955 (self-insert-command arg)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3956 (if (<= arg 1)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3957 (sh-remember-variable
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3958 (save-excursion
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3959 (if (re-search-forward (sh-feature sh-assignment-regexp)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3960 (prog1 (point)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3961 (beginning-of-line 1))
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3962 t)
13391
550ecb2269b0 (sh-shells): Eliminated variable redundant with
Karl Heuer <kwzh@gnu.org>
parents: 13389
diff changeset
3963 (match-string 1))))))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3964
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3965
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3966
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3967 (defun sh-maybe-here-document (arg)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3968 "Inserts self. Without prefix, following unquoted `<' inserts here document.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3969 The document is bounded by `sh-here-document-word'."
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3970 (interactive "*P")
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3971 (self-insert-command (prefix-numeric-value arg))
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3972 (or arg
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3973 (not (eq (char-after (- (point) 2)) last-command-char))
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3974 (save-excursion
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3975 (backward-char 2)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3976 (sh-quoted-p))
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3977 (progn
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3978 (insert sh-here-document-word)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3979 (or (eolp) (looking-at "[ \t]") (insert ? ))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3980 (end-of-line 1)
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3981 (while
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3982 (sh-quoted-p)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3983 (end-of-line 2))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3984 (newline)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3985 (save-excursion (insert ?\n sh-here-document-word)))))
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3986
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3987
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3988 ;; various other commands
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3989
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3990 (autoload 'comint-dynamic-complete "comint"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3991 "Dynamically perform completion at point." t)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3992
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3993 (autoload 'shell-dynamic-complete-command "shell"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3994 "Dynamically complete the command at point." t)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3995
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3996 (autoload 'comint-dynamic-complete-filename "comint"
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3997 "Dynamically complete the filename at point." t)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3998
12505
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
3999 (autoload 'shell-dynamic-complete-environment-variable "shell"
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
4000 "Dynamically complete the environment variable at point." t)
0f970ed476cb restructured, largely rewritten without the bugs and
Karl Heuer <kwzh@gnu.org>
parents: 12034
diff changeset
4001
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4002
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4003
12887
cbed067bf52d (sh-newline-and-indent): Don't interpret prefix arg
Karl Heuer <kwzh@gnu.org>
parents: 12864
diff changeset
4004 (defun sh-newline-and-indent ()
cbed067bf52d (sh-newline-and-indent): Don't interpret prefix arg
Karl Heuer <kwzh@gnu.org>
parents: 12864
diff changeset
4005 "Strip unquoted whitespace, insert newline, and indent like current line."
cbed067bf52d (sh-newline-and-indent): Don't interpret prefix arg
Karl Heuer <kwzh@gnu.org>
parents: 12864
diff changeset
4006 (interactive "*")
cbed067bf52d (sh-newline-and-indent): Don't interpret prefix arg
Karl Heuer <kwzh@gnu.org>
parents: 12864
diff changeset
4007 (indent-to (prog1 (current-indentation)
cbed067bf52d (sh-newline-and-indent): Don't interpret prefix arg
Karl Heuer <kwzh@gnu.org>
parents: 12864
diff changeset
4008 (delete-region (point)
cbed067bf52d (sh-newline-and-indent): Don't interpret prefix arg
Karl Heuer <kwzh@gnu.org>
parents: 12864
diff changeset
4009 (progn
cbed067bf52d (sh-newline-and-indent): Don't interpret prefix arg
Karl Heuer <kwzh@gnu.org>
parents: 12864
diff changeset
4010 (or (zerop (skip-chars-backward " \t"))
cbed067bf52d (sh-newline-and-indent): Don't interpret prefix arg
Karl Heuer <kwzh@gnu.org>
parents: 12864
diff changeset
4011 (if (sh-quoted-p)
cbed067bf52d (sh-newline-and-indent): Don't interpret prefix arg
Karl Heuer <kwzh@gnu.org>
parents: 12864
diff changeset
4012 (forward-char)))
cbed067bf52d (sh-newline-and-indent): Don't interpret prefix arg
Karl Heuer <kwzh@gnu.org>
parents: 12864
diff changeset
4013 (point)))
cbed067bf52d (sh-newline-and-indent): Don't interpret prefix arg
Karl Heuer <kwzh@gnu.org>
parents: 12864
diff changeset
4014 (newline))))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4015
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4016 (defun sh-beginning-of-command ()
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4017 "Move point to successive beginnings of commands."
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4018 (interactive)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4019 (if (re-search-backward sh-beginning-of-command nil t)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4020 (goto-char (match-beginning 2))))
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4021
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4022 (defun sh-end-of-command ()
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4023 "Move point to successive ends of commands."
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4024 (interactive)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4025 (if (re-search-forward sh-end-of-command nil t)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4026 (goto-char (match-end 1))))
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4027
13707
9356c7d7dcd6 Provide sh-script.
Karl Heuer <kwzh@gnu.org>
parents: 13705
diff changeset
4028 (provide 'sh-script)
18382
0e4943a370e2 Whitespace change.
Richard M. Stallman <rms@gnu.org>
parents: 18024
diff changeset
4029
25986
29aeb35781cd Added support for indenting existing scripts.
Gerd Moellmann <gerd@gnu.org>
parents: 25554
diff changeset
4030 ;;; sh-script.el ends here