annotate lisp/skeleton.el @ 13883:a4eef7470b6b

(ls-lisp-support-shell-wildcards): New variable. (insert-directory): Convert the filename wildcard to an equivalent Emacs regexp, when `ls-lisp-support-shell-wildcards' is non-nil. Handle file patterns like "/foo*/" as if it were "/foo*", like the shell would. Print zero total for files whose total size is exactly zero (in particular, for no files at all). Say "No match" when no files match the given wildcard. (ls-lisp-format): Make directory listing format more like POSIX ls.
author Richard M. Stallman <rms@gnu.org>
date Thu, 28 Dec 1995 23:36:50 +0000
parents 333a77bb4ae8
children f448cb91a38c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
1 ;;; skeleton.el --- Lisp language extension for writing statement skeletons
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
2 ;; Copyright (C) 1993, 1994, 1995 by Free Software Foundation, Inc.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
4 ;; Author: Daniel.Pfeiffer@Informatik.START.dbp.de, fax (+49 69) 7588-2389
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5 ;; Maintainer: FSF
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
6 ;; Keywords: extensions, abbrev, languages, tools
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
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 ;; 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
11 ;; 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
12 ;; the Free Software Foundation; either version 2, or (at your option)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; any later version.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 ;; 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
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; GNU General Public License for more details.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24 ;;; Commentary:
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
26 ;; A very concise language extension for writing structured statement
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 ;; skeleton insertion commands for programming language modes. This
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 ;; originated in shell-script mode and was applied to ada-mode's
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 ;; commands which shrunk to one third. And these commands are now
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 ;; user configurable.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32 ;;; Code:
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
34 ;; page 1: statement skeleton language definition & interpreter
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35 ;; page 2: paired insertion
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 ;; page 3: mirror-mode, an example for setting up paired insertion
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 (defvar skeleton-transformation nil
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
40 "*If non-nil, function applied to literal strings before they are inserted.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 It should take strings and characters and return them transformed, or nil
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 which means no transformation.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 Typical examples might be `upcase' or `capitalize'.")
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 ; this should be a fourth argument to defvar
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 (put 'skeleton-transformation 'variable-interactive
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 "aTransformation function: ")
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50
13390
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
51 (defvar skeleton-end-hook
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
52 (lambda ()
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
53 (or (eolp) (newline-and-indent)))
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
54 "Hook called at end of skeleton but before going to point of interest.
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
55 By default this moves out anything following to next line.
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
56 The variables `v1' and `v2' are still set when calling this.")
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
57
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
58
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
59 ;;;###autoload
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
60 (defvar skeleton-filter 'identity
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
61 "Function for transforming a skeleton-proxy's aliases' variable value.")
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
62
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
63 (defvar skeleton-untabify t
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
64 "When non-`nil' untabifies when deleting backwards with element -ARG.")
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
65
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
66 (defvar skeleton-newline-indent-rigidly nil
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
67 "When non-`nil', indent rigidly under current line for element `\\n'.
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
68 Else use mode's `indent-line-function'.")
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
69
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
70 (defvar skeleton-further-elements ()
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
71 "A buffer-local varlist (see `let') of mode specific skeleton elements.
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
72 These variables are bound while interpreting a skeleton. Their value may
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
73 in turn be any valid skeleton element if they are themselves to be used as
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
74 skeleton elements.")
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
75 (make-variable-buffer-local 'skeleton-further-elements)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
76
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
77
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78 (defvar skeleton-subprompt
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79 (substitute-command-keys
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80 "RET, \\<minibuffer-local-map>\\[abort-recursive-edit] or \\[help-command]")
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
81 "*Replacement for %s in prompts of recursive subskeletons.")
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
83
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
84 (defvar skeleton-abbrev-cleanup nil)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
85
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 (defvar skeleton-debug nil
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 "*If non-nil `define-skeleton' will override previous definition.")
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
90 ;; reduce the number of compiler warnings
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
91 (defvar skeleton)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
92 (defvar skeleton-modified)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
93 (defvar skeleton-point)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
94 (defvar skeleton-regions)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 ;;;###autoload
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
97 (defmacro define-skeleton (command documentation &rest skeleton)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 "Define a user-configurable COMMAND that enters a statement skeleton.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99 DOCUMENTATION is that of the command, while the variable of the same name,
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
100 which contains the skeleton, has a documentation to that effect.
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
101 INTERACTOR and ELEMENT ... are as defined under `skeleton-insert'."
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102 (if skeleton-debug
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
103 (set command skeleton))
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
104 `(progn
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
105 (defvar ,command ',skeleton ,documentation)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
106 (defalias ',command 'skeleton-proxy)))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
110 ;; This command isn't meant to be called, only it's aliases with meaningful
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
111 ;; names are.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112 ;;;###autoload
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
113 (defun skeleton-proxy (&optional str arg)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
114 "Insert skeleton defined by variable of same name (see `skeleton-insert').
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
115 Prefix ARG allows wrapping around words or regions (see `skeleton-insert').
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
116 This command can also be an abbrev expansion (3rd and 4th columns in
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
117 \\[edit-abbrevs] buffer: \"\" command-name).
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
118
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
119 When called as a function, optional first argument STR may also be a string
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
120 which will be the value of `str' whereas the skeleton's interactor is then
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
121 ignored."
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
122 (interactive "*P\nP")
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
123 (let ((function (nth 1 (backtrace-frame 1))))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
124 (if (eq function 'nth) ; uncompiled lisp function
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
125 (setq function (nth 1 (backtrace-frame 5)))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
126 (if (eq function 'byte-code) ; tracing byte-compiled function
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
127 (setq function (nth 1 (backtrace-frame 2)))))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
128 (if (not (setq function (funcall skeleton-filter (symbol-value function))))
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
129 (if (memq this-command '(self-insert-command
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
130 skeleton-pair-insert-maybe
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
131 expand-abbrev))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
132 (setq buffer-undo-list (primitive-undo 1 buffer-undo-list)))
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
133 (skeleton-insert function
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
134 (if (setq skeleton-abbrev-cleanup
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
135 (or (eq this-command 'self-insert-command)
13390
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
136 (eq this-command
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
137 'skeleton-pair-insert-maybe)))
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
138 ()
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
139 ;; Pretend C-x a e passed its prefix arg to us
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
140 (if (or arg current-prefix-arg)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
141 (prefix-numeric-value (or arg
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
142 current-prefix-arg))))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
143 (if (stringp str)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
144 str))
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
145 (if skeleton-abbrev-cleanup
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
146 (setq deferred-action-list t
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
147 deferred-action-function 'skeleton-abbrev-cleanup
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
148 skeleton-abbrev-cleanup (point))))))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
149
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
150
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
151 (defun skeleton-abbrev-cleanup (&rest list)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
152 "Value for `post-command-hook' to remove char that expanded abbrev."
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
153 (if (integerp skeleton-abbrev-cleanup)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
154 (progn
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
155 (delete-region skeleton-abbrev-cleanup (point))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
156 (setq deferred-action-list ()
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
157 deferred-action-function nil
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
158 skeleton-abbrev-cleanup nil))))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
159
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
160
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
161 ;;;###autoload
13390
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
162 (defun skeleton-insert (skeleton &optional skeleton-regions str)
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
163 "Insert the complex statement skeleton SKELETON describes very concisely.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
165 With optional third REGIONS wrap first interesting point (`_') in skeleton
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
166 around next REGIONS words, if REGIONS is positive. If REGIONS is negative,
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
167 wrap REGIONS preceding interregions into first REGIONS interesting positions
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
168 \(successive `_'s) in skeleton. An interregion is the stretch of text between
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
169 two contiguous marked points. If you marked A B C [] (where [] is the cursor)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
170 in alphabetical order, the 3 interregions are simply the last 3 regions. But
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
171 if you marked B A [] C, the interregions are B-A, A-[], []-C.
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
172
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
173 Optional fourth STR is the value for the variable `str' within the skeleton.
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
174 When this is non-`nil' the interactor gets ignored, and this should be a valid
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
175 skeleton element.
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
176
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
177 SKELETON is made up as (INTERACTOR ELEMENT ...). INTERACTOR may be nil if
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
178 not needed, a prompt-string or an expression for complex read functions.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 If ELEMENT is a string or a character it gets inserted (see also
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 `skeleton-transformation'). Other possibilities are:
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
183 \\n go to next line and indent according to mode
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
184 _ interesting point, interregion here, point after termination
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
185 > indent line (or interregion if > _) according to major mode
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
186 & do next ELEMENT if previous moved point
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
187 | do next ELEMENT if previous didn't move point
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
188 -num delete num preceding characters (see `skeleton-untabify')
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 resume: skipped, continue here if quit is signaled
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 nil skipped
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
192 Further elements can be defined via `skeleton-further-elements'. ELEMENT may
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
193 itself be a SKELETON with an INTERACTOR. The user is prompted repeatedly for
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
194 different inputs. The SKELETON is processed as often as the user enters a
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
195 non-empty string. \\[keyboard-quit] terminates skeleton insertion, but
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
196 continues after `resume:' and positions at `_' if any. If INTERACTOR in such
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
197 a subskeleton is a prompt-string which contains a \".. %s ..\" it is
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
198 formatted with `skeleton-subprompt'. Such an INTERACTOR may also a list of
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
199 strings with the subskeleton being repeated once for each string.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
201 Quoted lisp-expressions are evaluated evaluated for their side-effect.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 Other lisp-expressions are evaluated and the value treated as above.
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
203 Note that expressions may not return `t' since this impplies an
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
204 endless loop. Modes can define other symbols by locally setting them
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
205 to any valid skeleton element. The following local variables are
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
206 available:
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
208 str first time: read a string according to INTERACTOR
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 then: insert previously read string once more
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
210 help help-form during interaction with the user or `nil'
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
211 input initial input (string or cons with index) while reading str
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
212 v1, v2 local variables for memorising anything you want
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
213
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
214 When done with skeleton, but before going back to `_'-point call
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
215 `skeleton-end-hook' if that is non-`nil'."
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
216 (and skeleton-regions
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
217 (setq skeleton-regions
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
218 (if (> skeleton-regions 0)
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
219 (list (point-marker)
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
220 (save-excursion (forward-word skeleton-regions)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
221 (point-marker)))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
222 (setq skeleton-regions (- skeleton-regions))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
223 ;; copy skeleton-regions - 1 elements from `mark-ring'
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
224 (let ((l1 (cons (mark-marker) mark-ring))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
225 (l2 (list (point-marker))))
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
226 (while (and l1 (> skeleton-regions 0))
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
227 (setq l2 (cons (car l1) l2)
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
228 skeleton-regions (1- skeleton-regions)
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
229 l1 (cdr l1)))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
230 (sort l2 '<))))
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
231 (goto-char (car skeleton-regions))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
232 (setq skeleton-regions (cdr skeleton-regions)))
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
233 (let ((beg (point))
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
234 skeleton-modified skeleton-point resume: help input v1 v2)
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
235 (unwind-protect
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
236 (eval `(let ,skeleton-further-elements
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
237 (skeleton-internal-list skeleton str)))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
238 (run-hooks 'skeleton-end-hook)
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
239 (sit-for 0)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
240 (or (pos-visible-in-window-p beg)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
241 (progn
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
242 (goto-char beg)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
243 (recenter 0)))
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
244 (if skeleton-point
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
245 (goto-char skeleton-point)))))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
247 (defun skeleton-read (str &optional initial-input recursive)
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
248 "Function for reading a string from the minibuffer within skeletons.
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
249 PROMPT may contain a `%s' which will be replaced by `skeleton-subprompt'.
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
250 If non-`nil' second arg INITIAL-INPUT or variable `input' is a string or
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
251 cons with index to insert before reading. If third arg RECURSIVE is non-`nil'
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
252 i.e. we are handling the iterator of a subskeleton, returns empty string if
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
253 user didn't modify input.
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
254 While reading, the value of `minibuffer-help-form' is variable `help' if that
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
255 is non-`nil' or a default string."
13390
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
256 (let ((minibuffer-help-form (or (if (boundp 'help) (symbol-value 'help))
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
257 (if recursive "\
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 As long as you provide input you will insert another subskeleton.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 If you enter the empty string, the loop inserting subskeletons is
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 left, and the current one is removed as far as it has been entered.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 If you quit, the current subskeleton is removed as far as it has been
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 entered. No more of the skeleton will be inserted, except maybe for a
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
265 syntactically necessary termination."
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
266 "\
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
267 You are inserting a skeleton. Standard text gets inserted into the buffer
13390
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
268 automatically, and you are prompted to fill in the variable parts.")))
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
269 (eolp (eolp)))
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
270 ;; since Emacs doesn't show main window's cursor, do something noticeable
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
271 (or eolp
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
272 (open-line 1))
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
273 (unwind-protect
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
274 (setq str (if (stringp str)
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
275 (read-string (format str skeleton-subprompt)
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
276 (setq initial-input
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
277 (or initial-input
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
278 (symbol-value 'input))))
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
279 (eval str)))
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
280 (or eolp
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
281 (delete-char 1))))
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
282 (if (and recursive
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
283 (or (null str)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
284 (string= str "")
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
285 (equal str initial-input)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
286 (equal str (car-safe initial-input))))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 (signal 'quit t)
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 str))
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
290 (defun skeleton-internal-list (skeleton &optional str recursive)
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
291 (let* ((start (save-excursion (beginning-of-line) (point)))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
292 (column (current-column))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
293 (line (buffer-substring start
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
294 (save-excursion (end-of-line) (point))))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
295 opoint)
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
296 (or str
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
297 (setq str `(setq str (skeleton-read ',(car skeleton) nil ,recursive))))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
298 (while (setq skeleton-modified (eq opoint (point))
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
299 opoint (point)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
300 skeleton (cdr skeleton))
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
301 (condition-case quit
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
302 (skeleton-internal-1 (car skeleton))
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
303 (quit
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
304 (if (eq (cdr quit) 'recursive)
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
305 (setq recursive 'quit
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
306 skeleton (memq 'resume: skeleton))
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
307 ;; remove the subskeleton as far as it has been shown
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
308 ;; the subskeleton shouldn't have deleted outside current line
13390
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
309 (end-of-line)
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
310 (delete-region start (point))
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
311 (insert line)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
312 (move-to-column column)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
313 (if (cdr quit)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
314 (setq skeleton ()
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
315 recursive nil)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
316 (signal 'quit 'recursive)))))))
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
317 ;; maybe continue loop or go on to next outer resume: section
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
318 (if (eq recursive 'quit)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
319 (signal 'quit 'recursive)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
320 recursive))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
323 (defun skeleton-internal-1 (element &optional literal)
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
324 (cond ((char-or-string-p element)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
325 (if (and (integerp element) ; -num
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
326 (< element 0))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
327 (if skeleton-untabify
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
328 (backward-delete-char-untabify (- element))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
329 (delete-backward-char (- element)))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
330 (insert-before-markers (if (and skeleton-transformation
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
331 (not literal))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
332 (funcall skeleton-transformation element)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
333 element))))
7393
e4a565cee722 (mirror-mode): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 6463
diff changeset
334 ((eq element '\n) ; actually (eq '\n 'n)
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
335 (if (and skeleton-regions
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
336 (eq (nth 1 skeleton) '_))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
337 (progn
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
338 (or (eolp)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
339 (newline))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
340 (indent-region (point) (car skeleton-regions) nil))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
341 (if skeleton-newline-indent-rigidly
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
342 (indent-to (prog1 (current-indentation)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
343 (newline)))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
344 (newline)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
345 (indent-according-to-mode))))
7393
e4a565cee722 (mirror-mode): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 6463
diff changeset
346 ((eq element '>)
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
347 (if (and skeleton-regions
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
348 (eq (nth 1 skeleton) '_))
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
349 (indent-region (point) (car skeleton-regions) nil)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
350 (indent-according-to-mode)))
7393
e4a565cee722 (mirror-mode): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 6463
diff changeset
351 ((eq element '_)
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
352 (if skeleton-regions
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
353 (progn
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
354 (goto-char (car skeleton-regions))
13390
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
355 (setq skeleton-regions (cdr skeleton-regions))
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
356 (and (<= (current-column) (current-indentation))
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
357 (eq (nth 1 skeleton) '\n)
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
358 (end-of-line 0)))
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
359 (or skeleton-point
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
360 (setq skeleton-point (point)))))
7393
e4a565cee722 (mirror-mode): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 6463
diff changeset
361 ((eq element '&)
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
362 (if skeleton-modified
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
363 (setq skeleton (cdr skeleton))))
7393
e4a565cee722 (mirror-mode): Commented out.
Richard M. Stallman <rms@gnu.org>
parents: 6463
diff changeset
364 ((eq element '|)
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
365 (or skeleton-modified
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
366 (setq skeleton (cdr skeleton))))
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
367 ((eq 'quote (car-safe element))
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
368 (eval (nth 1 element)))
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
369 ((or (stringp (car-safe element))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
370 (consp (car-safe element)))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
371 (if (symbolp (car-safe (car element)))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
372 (while (skeleton-internal-list element nil t))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
373 (setq literal (car element))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
374 (while literal
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
375 (skeleton-internal-list element (car literal))
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
376 (setq literal (cdr literal)))))
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
377 ((null element))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
378 ((skeleton-internal-1 (eval element) t))))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
379
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
380
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
381 ;; Maybe belongs into simple.el or elsewhere
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
383 (define-skeleton local-variables-section
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
384 "Insert a local variables section. Use current comment syntax if any."
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
385 ()
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
386 '(save-excursion
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
387 (if (re-search-forward page-delimiter nil t)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
388 (error "Not on last page.")))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
389 comment-start "Local Variables:" comment-end \n
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
390 comment-start "mode: "
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
391 (completing-read "Mode: " obarray
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
392 (lambda (symbol)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
393 (if (commandp symbol)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
394 (string-match "-mode$" (symbol-name symbol))))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
395 t)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
396 & -5 | '(kill-line 0) & -1 | comment-end \n
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
397 ( (completing-read (format "Variable, %s: " skeleton-subprompt)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
398 obarray
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
399 (lambda (symbol)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
400 (or (eq symbol 'eval)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
401 (user-variable-p symbol)))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
402 t)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
403 comment-start str ": "
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
404 (read-from-minibuffer "Expression: " nil read-expression-map nil
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
405 'read-expression-history) | _
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
406 comment-end \n)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
407 resume:
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
408 comment-start "End:" comment-end)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
410 ;; Variables and command for automatically inserting pairs like () or "".
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
412 (defvar skeleton-pair nil
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 "*If this is nil pairing is turned off, no matter what else is set.
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
414 Otherwise modes with `skeleton-pair-insert-maybe' on some keys
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
415 will attempt to insert pairs of matching characters.")
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
418 (defvar skeleton-pair-on-word nil
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
419 "*If this is nil, paired insertion is inhibited before or inside a word.")
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
422 (defvar skeleton-pair-filter (lambda ())
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
423 "Attempt paired insertion if this function returns nil, before inserting.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 This allows for context-sensitive checking whether pairing is appropriate.")
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
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
427 (defvar skeleton-pair-alist ()
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
428 "An override alist of pairing partners matched against `last-command-char'.
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
429 Each alist element, which looks like (ELEMENT ...), is passed to
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
430 `skeleton-insert' with no interactor. Variable `str' does nothing.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
432 Elements might be (?` ?` _ \"''\"), (?\\( ? _ \" )\") or (?{ \\n > _ \\n ?} >).")
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 ;;;###autoload
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
436 (defun skeleton-pair-insert-maybe (arg)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 "Insert the character you type ARG times.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
439 With no ARG, if `skeleton-pair' is non-nil, and if
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
440 `skeleton-pair-on-word' is non-nil or we are not before or inside a
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
441 word, and if `skeleton-pair-filter' returns nil, pairing is performed.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
443 If a match is found in `skeleton-pair-alist', that is inserted, else
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 the defaults are used. These are (), [], {}, <> and `' for the
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445 symmetrical ones, and the same character twice for the others."
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 (interactive "*P")
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447 (if (or arg
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
448 overwrite-mode
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
449 (not skeleton-pair)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
450 (if (not skeleton-pair-on-word) (looking-at "\\w"))
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
451 (funcall skeleton-pair-filter))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452 (self-insert-command (prefix-numeric-value arg))
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
453 (self-insert-command 1)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
454 (if skeleton-abbrev-cleanup
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
455 ()
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
456 ;; (preceding-char) is stripped of any Meta-stuff in last-command-char
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
457 (if (setq arg (assq (preceding-char) skeleton-pair-alist))
13390
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
458 ;; typed char is inserted (car is no real interactor)
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
459 (let (skeleton-end-hook)
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
460 (skeleton-insert arg))
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
461 (save-excursion
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
462 (insert (or (cdr (assq (preceding-char)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
463 '((?( . ?))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
464 (?[ . ?])
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
465 (?{ . ?})
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
466 (?< . ?>)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
467 (?` . ?'))))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
468 last-command-char)))))))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
471 ;;; ;; A more serious example can be found in sh-script.el
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
472 ;;; ;; The quote before (defun prevents this from being byte-compiled.
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
473 ;;;(defun mirror-mode ()
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
474 ;;; "This major mode is an amusing little example of paired insertion.
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
475 ;;;All printable characters do a paired self insert, while the other commands
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
476 ;;;work normally."
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
477 ;;; (interactive)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
478 ;;; (kill-all-local-variables)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
479 ;;; (make-local-variable 'pair)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
480 ;;; (make-local-variable 'pair-on-word)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
481 ;;; (make-local-variable 'pair-filter)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
482 ;;; (make-local-variable 'pair-alist)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
483 ;;; (setq major-mode 'mirror-mode
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
484 ;;; mode-name "Mirror"
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
485 ;;; pair-on-word t
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
486 ;;; ;; in the middle column insert one or none if odd window-width
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
487 ;;; pair-filter (lambda ()
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
488 ;;; (if (>= (current-column)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
489 ;;; (/ (window-width) 2))
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
490 ;;; ;; insert both on next line
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
491 ;;; (next-line 1)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
492 ;;; ;; insert one or both?
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
493 ;;; (= (* 2 (1+ (current-column)))
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
494 ;;; (window-width))))
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
495 ;;; ;; mirror these the other way round as well
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
496 ;;; pair-alist '((?) _ ?()
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
497 ;;; (?] _ ?[)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
498 ;;; (?} _ ?{)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
499 ;;; (?> _ ?<)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
500 ;;; (?/ _ ?\\)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
501 ;;; (?\\ _ ?/)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
502 ;;; (?` ?` _ "''")
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
503 ;;; (?' ?' _ "``"))
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
504 ;;; ;; in this mode we exceptionally ignore the user, else it's no fun
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
505 ;;; pair t)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
506 ;;; (let ((map (make-keymap))
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
507 ;;; (i ? ))
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
508 ;;; (use-local-map map)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
509 ;;; (setq map (car (cdr map)))
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
510 ;;; (while (< i ?\^?)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
511 ;;; (aset map i 'skeleton-pair-insert-maybe)
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
512 ;;; (setq i (1+ i))))
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
513 ;;; (run-hooks 'mirror-mode-hook))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 ;; skeleton.el ends here