annotate lisp/skeleton.el @ 110410:f2e111723c3a

Merge changes made in Gnus trunk. Reimplement nnimap, and do tweaks to the rest of the code to support that. * gnus-int.el (gnus-finish-retrieve-group-infos) (gnus-retrieve-group-data-early): New functions. * gnus-range.el (gnus-range-nconcat): New function. * gnus-start.el (gnus-get-unread-articles): Support early retrieval of data. (gnus-read-active-for-groups): Support finishing the early retrieval of data. * gnus-sum.el (gnus-summary-move-article): Pass the move-to group name if the move is internal, so that nnimap can do fast internal moves. * gnus.el (gnus-article-special-mark-lists): Add uid/active tuples, for nnimap usage. * nnimap.el: Rewritten. * nnmail.el (nnmail-inhibit-default-split-group): New internal variable to allow the mail splitting to not return a default group. This is useful for nnimap, which will leave unmatched mail in the inbox. * utf7.el (utf7-encode): Autoload. Implement shell connection. * nnimap.el (nnimap-open-shell-stream): New function. (nnimap-open-connection): Use it. Get the number of lines by using BODYSTRUCTURE. (nnimap-transform-headers): Get the number of lines in each message. (nnimap-retrieve-headers): Query for BODYSTRUCTURE so that we get the number of lines. Not all servers return UIDNEXT. Work past this problem. Remove junk from end of file. Fix typo in "bogus" section. Make capabilties be case-insensitive. Require cl when compiling. Don't bug out if the LIST command doesn't have any parameters. 2010-09-17 Knut Anders Hatlen <kahatlen@gmail.com> (tiny change) * nnimap.el (nnimap-get-groups): Don't bug out if the LIST command doesn't have any parameters. (mm-text-html-renderer): Document gnus-article-html. 2010-09-17 Julien Danjou <julien@danjou.info> (tiny fix) * mm-decode.el (mm-text-html-renderer): Document gnus-article-html. * dgnushack.el: Define netrc-credentials. If the user doesn't have a /etc/services, supply some sensible port defaults. Have `unseen-or-unread' select an unread unseen article first. (nntp-open-server): Return whether the open was successful or not. Throughout all files, replace (save-excursion (set-buffer ...)) with (with-current-buffer ... ). Save result so that it doesn't say "failed" all the time. Add ~/.authinfo to the default, since that's probably most useful for users. Don't use the "finish" method when we're reading from the agent. Add some more nnimap-relevant agent stuff to nnagent.el. * nnimap.el (nnimap-with-process-buffer): Removed. Revert one line that was changed by mistake in the last checkin. (nnimap-open-connection): Don't error out when we can't make a connection nnimap-related changes to avoid bugging out if we can't contact a server. * gnus-start.el (gnus-get-unread-articles): Don't try to scan groups from methods that are denied. * nnimap.el (nnimap-possibly-change-group): Return nil if we can't log in. (nnimap-finish-retrieve-group-infos): Make sure we're not waiting for nothing. * gnus-sum.el (gnus-select-newsgroup): Indent.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Sat, 18 Sep 2010 10:02:19 +0000
parents d835100c3e8b
children 249a1455856a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
94138
b6c3fde83add Set coding-tag.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 93975
diff changeset
1 ;;; skeleton.el --- Lisp language extension for writing statement skeletons -*- coding: utf-8 -*-
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14006
diff changeset
2
74442
b2e5081b9320 Update copyright years.
Glenn Morris <rgm@gnu.org>
parents: 70821
diff changeset
3 ;; Copyright (C) 1993, 1994, 1995, 1996, 2001, 2002, 2003,
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 101010
diff changeset
4 ;; 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5
23869
8d2bb5d1416a Update comment.
Karl Heuer <kwzh@gnu.org>
parents: 17552
diff changeset
6 ;; Author: Daniel Pfeiffer <occitan@esperanto.org>
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 ;; Maintainer: FSF
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
8 ;; Keywords: extensions, abbrev, languages, tools
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
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94138
diff changeset
12 ;; GNU Emacs is free software: you can redistribute it and/or modify
6463
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
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94138
diff changeset
14 ;; the Free Software Foundation, either version 3 of the License, or
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94138
diff changeset
15 ;; (at your option) any later version.
6463
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
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94138
diff changeset
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 ;;; Commentary:
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
27 ;; A very concise language extension for writing structured statement
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 ;; skeleton insertion commands for programming language modes. This
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 ;; 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
30 ;; commands which shrunk to one third. And these commands are now
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 ;; user configurable.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 ;;; Code:
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
35 ;; page 1: statement skeleton language definition & interpreter
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 ;; page 2: paired insertion
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 ;; page 3: mirror-mode, an example for setting up paired insertion
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
70821
fb7431719e32 (skeleton-transformation, skeleton-filter, skeleton-pair-filter):
Roland Winkler <Roland.Winkler@physik.uni-erlangen.de>
parents: 68651
diff changeset
40 (defvar skeleton-transformation-function 'identity
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
41 "*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
42 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
43 which means no transformation.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 Typical examples might be `upcase' or `capitalize'.")
70821
fb7431719e32 (skeleton-transformation, skeleton-filter, skeleton-pair-filter):
Roland Winkler <Roland.Winkler@physik.uni-erlangen.de>
parents: 68651
diff changeset
45 (defvaralias 'skeleton-transformation 'skeleton-transformation-function)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 ; this should be a fourth argument to defvar
70821
fb7431719e32 (skeleton-transformation, skeleton-filter, skeleton-pair-filter):
Roland Winkler <Roland.Winkler@physik.uni-erlangen.de>
parents: 68651
diff changeset
48 (put 'skeleton-transformation-function 'variable-interactive
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 "aTransformation function: ")
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51
15489
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
52 (defvar skeleton-autowrap t
63257
cacd1f888146 (skeleton-autowrap): Fix spellings in docstrings.
Juanma Barranquero <lekktu@gmail.com>
parents: 62740
diff changeset
53 "Controls wrapping behavior of functions created with `define-skeleton'.
15489
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
54 When the region is visible (due to `transient-mark-mode' or marking a region
50869
7d308602f619 (skeleton-autowrap, skeleton-untabify, skeleton-newline-indent-rigidly)
Juanma Barranquero <lekktu@gmail.com>
parents: 49299
diff changeset
55 with the mouse) and this is non-nil and the function was called without an
15489
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
56 explicit ARG, then the ARG defaults to -1, i.e. wrapping around the visible
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
57 region.
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
58
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
59 We will probably delete this variable in a future Emacs version
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
60 unless we get a substantial number of complaints about the auto-wrap
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
61 feature.")
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62
34838
10b89a04d05d (skeleton-internal-1): Really make sure the first line of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34836
diff changeset
63 (defvar skeleton-end-newline t
10b89a04d05d (skeleton-internal-1): Really make sure the first line of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34836
diff changeset
64 "If non-nil, make sure that the skeleton inserted ends with a newline.
10b89a04d05d (skeleton-internal-1): Really make sure the first line of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34836
diff changeset
65 This just influences the way the default `skeleton-end-hook' behaves.")
10b89a04d05d (skeleton-internal-1): Really make sure the first line of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34836
diff changeset
66
13390
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
67 (defvar skeleton-end-hook
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
68 (lambda ()
34838
10b89a04d05d (skeleton-internal-1): Really make sure the first line of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34836
diff changeset
69 (or (eolp) (not skeleton-end-newline) (newline-and-indent)))
13390
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
70 "Hook called at end of skeleton but before going to point of interest.
34838
10b89a04d05d (skeleton-internal-1): Really make sure the first line of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34836
diff changeset
71 By default this moves out anything following to next line,
10b89a04d05d (skeleton-internal-1): Really make sure the first line of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34836
diff changeset
72 unless `skeleton-end-newline' is set to nil.
13390
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
73 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
74
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
75
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
76 ;;;###autoload
70821
fb7431719e32 (skeleton-transformation, skeleton-filter, skeleton-pair-filter):
Roland Winkler <Roland.Winkler@physik.uni-erlangen.de>
parents: 68651
diff changeset
77 (defvar skeleton-filter-function 'identity
15489
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
78 "Function for transforming a skeleton proxy's aliases' variable value.")
70821
fb7431719e32 (skeleton-transformation, skeleton-filter, skeleton-pair-filter):
Roland Winkler <Roland.Winkler@physik.uni-erlangen.de>
parents: 68651
diff changeset
79 (defvaralias 'skeleton-filter 'skeleton-filter-function)
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
80
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
81 (defvar skeleton-untabify t
50869
7d308602f619 (skeleton-autowrap, skeleton-untabify, skeleton-newline-indent-rigidly)
Juanma Barranquero <lekktu@gmail.com>
parents: 49299
diff changeset
82 "When non-nil untabifies when deleting backwards with element -ARG.")
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
83
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
84 (defvar skeleton-newline-indent-rigidly nil
50869
7d308602f619 (skeleton-autowrap, skeleton-untabify, skeleton-newline-indent-rigidly)
Juanma Barranquero <lekktu@gmail.com>
parents: 49299
diff changeset
85 "When non-nil, indent rigidly under current line for element `\\n'.
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
86 Else use mode's `indent-line-function'.")
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
87
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
88 (defvar skeleton-further-elements ()
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
89 "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
90 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
91 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
92 skeleton elements.")
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
93 (make-variable-buffer-local 'skeleton-further-elements)
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
94
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
95
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 (defvar skeleton-subprompt
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 (substitute-command-keys
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 "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
99 "*Replacement for %s in prompts of recursive subskeletons.")
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102 (defvar skeleton-debug nil
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 "*If non-nil `define-skeleton' will override previous definition.")
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104
16768
5ff0874f1309 (skeleton-positions): Renamed from skeleton-marks.
Richard M. Stallman <rms@gnu.org>
parents: 16767
diff changeset
105 (defvar skeleton-positions nil
5ff0874f1309 (skeleton-positions): Renamed from skeleton-marks.
Richard M. Stallman <rms@gnu.org>
parents: 16767
diff changeset
106 "List of positions marked with @, after skeleton insertion.
5ff0874f1309 (skeleton-positions): Renamed from skeleton-marks.
Richard M. Stallman <rms@gnu.org>
parents: 16767
diff changeset
107 The list describes the most recent skeleton insertion, and its elements
5ff0874f1309 (skeleton-positions): Renamed from skeleton-marks.
Richard M. Stallman <rms@gnu.org>
parents: 16767
diff changeset
108 are integer buffer positions in the reverse order of the insertion order.")
16767
6d837bb21c55 (skeleton-marks): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 16427
diff changeset
109
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
110 ;; reduce the number of compiler warnings
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
111 (defvar skeleton)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
112 (defvar skeleton-modified)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
113 (defvar skeleton-point)
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
114 (defvar skeleton-regions)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115
51303
cbe53c66e890 (skeleton-edebug-spec): First cut of an edebug spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51244
diff changeset
116 (def-edebug-spec skeleton-edebug-spec
cbe53c66e890 (skeleton-edebug-spec): First cut of an edebug spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51244
diff changeset
117 ([&or null stringp (stringp &rest stringp) [[&not atom] def-form]]
cbe53c66e890 (skeleton-edebug-spec): First cut of an edebug spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51244
diff changeset
118 &rest &or "n" "_" "-" ">" "@" "&" "!" "resume:"
cbe53c66e890 (skeleton-edebug-spec): First cut of an edebug spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51244
diff changeset
119 ("quote" def-form) skeleton-edebug-spec def-form))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 ;;;###autoload
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
121 (defmacro define-skeleton (command documentation &rest skeleton)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 "Define a user-configurable COMMAND that enters a statement skeleton.
51153
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
123 DOCUMENTATION is that of the command.
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
124 SKELETON is as defined under `skeleton-insert'."
51303
cbe53c66e890 (skeleton-edebug-spec): First cut of an edebug spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51244
diff changeset
125 (declare (debug (&define name stringp skeleton-edebug-spec)))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 (if skeleton-debug
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
127 (set command skeleton))
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
128 `(progn
51153
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
129 ;; Tell self-insert-command that this function, if called by an
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
130 ;; abbrev, should cause the self-insert to be skipped.
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
131 (put ',command 'no-self-insert t)
15544
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
132 (defun ,command (&optional str arg)
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
133 ,(concat documentation
51153
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
134 (if (string-match "\n\\'" documentation)
15544
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
135 "" "\n")
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
136 "\n"
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
137 "This is a skeleton command (see `skeleton-insert').
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
138 Normally the skeleton text is inserted at point, with nothing \"inside\".
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
139 If there is a highlighted region, the skeleton text is wrapped
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
140 around the region text.
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
141
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
142 A prefix argument ARG says to wrap the skeleton around the next ARG words.
17544
9ba1f7641826 (define-skeleton): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 17515
diff changeset
143 A prefix argument of -1 says to wrap around region, even if not highlighted.
15544
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
144 A prefix argument of zero says to wrap around zero words---that is, nothing.
17544
9ba1f7641826 (define-skeleton): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 17515
diff changeset
145 This is a way of overriding the use of a highlighted region.")
15544
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
146 (interactive "*P\nP")
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
147 (skeleton-proxy-new ',skeleton str arg))))
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
148
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
149 ;;;###autoload
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
150 (defun skeleton-proxy-new (skeleton &optional str arg)
51153
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
151 "Insert SKELETON.
15544
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
152 Prefix ARG allows wrapping around words or regions (see `skeleton-insert').
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
153 If no ARG was given, but the region is visible, ARG defaults to -1 depending
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
154 on `skeleton-autowrap'. An ARG of M-0 will prevent this just for once.
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
155 This command can also be an abbrev expansion (3rd and 4th columns in
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
156 \\[edit-abbrevs] buffer: \"\" command-name).
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157
64550
5347bf5bf3f9 (skeleton-proxy-new): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
158 Optional second argument STR may also be a string which will be the value
51153
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
159 of `str' whereas the skeleton's interactor is then ignored."
70821
fb7431719e32 (skeleton-transformation, skeleton-filter, skeleton-pair-filter):
Roland Winkler <Roland.Winkler@physik.uni-erlangen.de>
parents: 68651
diff changeset
160 (skeleton-insert (funcall skeleton-filter-function skeleton)
51153
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
161 ;; Pretend C-x a e passed its prefix arg to us
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
162 (if (or arg current-prefix-arg)
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
163 (prefix-numeric-value (or arg
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
164 current-prefix-arg))
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
165 (and skeleton-autowrap
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
166 (or (eq last-command 'mouse-drag-region)
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
167 (and transient-mark-mode mark-active))
51526
6445bf9b37f8 (skeleton-proxy-new): Consume the mark-active state.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51303
diff changeset
168 ;; Deactivate the mark, in case one of the
6445bf9b37f8 (skeleton-proxy-new): Consume the mark-active state.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51303
diff changeset
169 ;; elements of the skeleton is sensitive
6445bf9b37f8 (skeleton-proxy-new): Consume the mark-active state.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51303
diff changeset
170 ;; to such situations (e.g. it is itself a
6445bf9b37f8 (skeleton-proxy-new): Consume the mark-active state.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51303
diff changeset
171 ;; skeleton).
6445bf9b37f8 (skeleton-proxy-new): Consume the mark-active state.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51303
diff changeset
172 (progn (deactivate-mark)
6445bf9b37f8 (skeleton-proxy-new): Consume the mark-active state.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51303
diff changeset
173 -1)))
51153
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
174 (if (stringp str)
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
175 str))
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
176 ;; Return non-nil to tell expand-abbrev that expansion has happened.
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
177 ;; Otherwise the no-self-insert is ignored.
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
178 t)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
180 ;;;###autoload
17490
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
181 (defun skeleton-insert (skeleton &optional regions str)
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
182 "Insert the complex statement skeleton SKELETON describes very concisely.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183
17490
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
184 With optional second argument REGIONS, wrap first interesting point
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
185 \(`_') in skeleton around next REGIONS words, if REGIONS is positive.
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
186 If REGIONS is negative, wrap REGIONS preceding interregions into first
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
187 REGIONS interesting positions \(successive `_'s) in skeleton.
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
188
17490
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
189 An interregion is the stretch of text between two contiguous marked
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
190 points. If you marked A B C [] (where [] is the cursor) in
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
191 alphabetical order, the 3 interregions are simply the last 3 regions.
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
192 But if you marked B A [] C, the interregions are B-A, A-[], []-C.
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
193
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
194 The optional third argument STR, if specified, is the value for the
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
195 variable `str' within the skeleton. When this is non-nil, the
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
196 interactor gets ignored, and this should be a valid skeleton element.
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
197
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
198 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
199 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
200
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 If ELEMENT is a string or a character it gets inserted (see also
70821
fb7431719e32 (skeleton-transformation, skeleton-filter, skeleton-pair-filter):
Roland Winkler <Roland.Winkler@physik.uni-erlangen.de>
parents: 68651
diff changeset
202 `skeleton-transformation-function'). Other possibilities are:
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
204 \\n go to next line and indent according to mode
35879
1b871d9c3be4 Docstring fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35877
diff changeset
205 _ interesting point, interregion here
51087
49b8ab00fab0 (skeleton-internal-1): Allow - as alternate interesting point marker and revert
Juanma Barranquero <lekktu@gmail.com>
parents: 50869
diff changeset
206 - interesting point, no interregion interaction, overrides
49b8ab00fab0 (skeleton-internal-1): Allow - as alternate interesting point marker and revert
Juanma Barranquero <lekktu@gmail.com>
parents: 50869
diff changeset
207 interesting point set by _
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
208 > indent line (or interregion if > _) according to major mode
16768
5ff0874f1309 (skeleton-positions): Renamed from skeleton-marks.
Richard M. Stallman <rms@gnu.org>
parents: 16767
diff changeset
209 @ add position to `skeleton-positions'
78492
7c8949dbfa0d Replace `iff' in doc-strings and comments.
Glenn Morris <rgm@gnu.org>
parents: 78236
diff changeset
210 & do next ELEMENT if previous moved point
7c8949dbfa0d Replace `iff' in doc-strings and comments.
Glenn Morris <rgm@gnu.org>
parents: 78236
diff changeset
211 | do next ELEMENT if previous didn't move point
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
212 -num delete num preceding characters (see `skeleton-untabify')
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 resume: skipped, continue here if quit is signaled
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 nil skipped
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215
51087
49b8ab00fab0 (skeleton-internal-1): Allow - as alternate interesting point marker and revert
Juanma Barranquero <lekktu@gmail.com>
parents: 50869
diff changeset
216 After termination, point will be positioned at the last occurrence of -
49b8ab00fab0 (skeleton-internal-1): Allow - as alternate interesting point marker and revert
Juanma Barranquero <lekktu@gmail.com>
parents: 50869
diff changeset
217 or at the first occurrence of _ or at the end of the inserted text.
35879
1b871d9c3be4 Docstring fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35877
diff changeset
218
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
219 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
220 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
221 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
222 non-empty string. \\[keyboard-quit] terminates skeleton insertion, but
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
223 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
224 a subskeleton is a prompt-string which contains a \".. %s ..\" it is
17490
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
225 formatted with `skeleton-subprompt'. Such an INTERACTOR may also be a list of
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
226 strings with the subskeleton being repeated once for each string.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227
17490
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
228 Quoted Lisp expressions are evaluated for their side-effects.
15489
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
229 Other Lisp expressions are evaluated and the value treated as above.
50869
7d308602f619 (skeleton-autowrap, skeleton-untabify, skeleton-newline-indent-rigidly)
Juanma Barranquero <lekktu@gmail.com>
parents: 49299
diff changeset
230 Note that expressions may not return t since this implies an
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
231 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
232 to any valid skeleton element. The following local variables are
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
233 available:
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
235 str first time: read a string according to INTERACTOR
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 then: insert previously read string once more
50869
7d308602f619 (skeleton-autowrap, skeleton-untabify, skeleton-newline-indent-rigidly)
Juanma Barranquero <lekktu@gmail.com>
parents: 49299
diff changeset
237 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
238 input initial input (string or cons with index) while reading str
15489
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
239 v1, v2 local variables for memorizing anything you want
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
240
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
241 When done with skeleton, but before going back to `_'-point call
50869
7d308602f619 (skeleton-autowrap, skeleton-untabify, skeleton-newline-indent-rigidly)
Juanma Barranquero <lekktu@gmail.com>
parents: 49299
diff changeset
242 `skeleton-end-hook' if that is non-nil."
17490
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
243 (let ((skeleton-regions regions))
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
244 (and skeleton-regions
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
245 (setq skeleton-regions
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
246 (if (> skeleton-regions 0)
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
247 (list (copy-marker (point) t)
17490
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
248 (save-excursion (forward-word skeleton-regions)
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
249 (point-marker)))
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
250 (setq skeleton-regions (- skeleton-regions))
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
251 ;; copy skeleton-regions - 1 elements from `mark-ring'
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
252 (let ((l1 (cons (mark-marker) mark-ring))
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
253 (l2 (list (copy-marker (point) t))))
17490
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
254 (while (and l1 (> skeleton-regions 0))
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
255 (push (copy-marker (pop l1) t) l2)
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
256 (setq skeleton-regions (1- skeleton-regions)))
17490
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
257 (sort l2 '<))))
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
258 (goto-char (car skeleton-regions))
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
259 (setq skeleton-regions (cdr skeleton-regions)))
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
260 (let ((beg (point))
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
261 skeleton-modified skeleton-point resume: help input v1 v2)
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
262 (setq skeleton-positions nil)
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
263 (unwind-protect
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
264 (eval `(let ,skeleton-further-elements
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
265 (skeleton-internal-list skeleton str)))
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
266 (run-hooks 'skeleton-end-hook)
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
267 (sit-for 0)
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
268 (or (pos-visible-in-window-p beg)
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
269 (progn
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
270 (goto-char beg)
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
271 (recenter 0)))
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
272 (if skeleton-point
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
273 (goto-char skeleton-point))))))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274
17515
62b47fab94fd (skeleton-read): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 17490
diff changeset
275 (defun skeleton-read (prompt &optional initial-input recursive)
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
276 "Function for reading a string from the minibuffer within skeletons.
17552
605bd9c63821 (skeleton-read): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 17544
diff changeset
277
605bd9c63821 (skeleton-read): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 17544
diff changeset
278 PROMPT must be a string or a form that evaluates to a string.
605bd9c63821 (skeleton-read): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 17544
diff changeset
279 It may contain a `%s' which will be replaced by `skeleton-subprompt'.
50869
7d308602f619 (skeleton-autowrap, skeleton-untabify, skeleton-newline-indent-rigidly)
Juanma Barranquero <lekktu@gmail.com>
parents: 49299
diff changeset
280 If non-nil second arg INITIAL-INPUT or variable `input' is a string or
7d308602f619 (skeleton-autowrap, skeleton-untabify, skeleton-newline-indent-rigidly)
Juanma Barranquero <lekktu@gmail.com>
parents: 49299
diff changeset
281 cons with index to insert before reading. If third arg RECURSIVE is non-nil
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
282 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
283 user didn't modify input.
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
284 While reading, the value of `minibuffer-help-form' is variable `help' if that
17490
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
285 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
286 (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
287 (if recursive "\
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 As long as you provide input you will insert another subskeleton.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 If you enter the empty string, the loop inserting subskeletons is
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 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
292
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 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
294 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
295 syntactically necessary termination."
17490
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
296 "\
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
297 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
298 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
299 (eolp (eolp)))
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
300 ;; 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
301 (or eolp
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
302 (open-line 1))
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
303 (unwind-protect
17490
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
304 (setq prompt (if (stringp prompt)
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
305 (read-string (format prompt skeleton-subprompt)
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
306 (setq initial-input
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
307 (or initial-input
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
308 (symbol-value 'input))))
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
309 (eval prompt)))
13390
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
310 (or eolp
333a77bb4ae8 (skeleton-end-hook): Now defvared and responsible for
Karl Heuer <kwzh@gnu.org>
parents: 12886
diff changeset
311 (delete-char 1))))
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
312 (if (and recursive
17490
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
313 (or (null prompt)
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
314 (string= prompt "")
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
315 (equal prompt initial-input)
f0fc645756a3 (skeleton-insert): Rename the function's argument
Richard M. Stallman <rms@gnu.org>
parents: 16768
diff changeset
316 (equal prompt (car-safe initial-input))))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 (signal 'quit t)
17515
62b47fab94fd (skeleton-read): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 17490
diff changeset
318 prompt))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
320 (defun skeleton-internal-list (skeleton &optional str recursive)
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
321 (let* ((start (save-excursion (beginning-of-line) (point)))
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
322 (column (current-column))
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
323 (line (buffer-substring start (line-end-position)))
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
324 opoint)
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
325 (or str
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
326 (setq str `(setq str (skeleton-read ',(car skeleton) nil ,recursive))))
49299
c7f492d5cd47 (skeleton-internal-list, skeleton-internal-1):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45288
diff changeset
327 (when (and (eq (cadr skeleton) '\n) (not recursive)
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
328 (save-excursion (skip-chars-backward " \t") (bolp)))
36967
cebc3019a629 (skeleton-internal-list): Fix bogus logic.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35879
diff changeset
329 (setq skeleton (cons nil (cons '> (cddr skeleton)))))
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
330 (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
331 opoint (point)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
332 skeleton (cdr skeleton))
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
333 (condition-case quit
51153
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
334 (skeleton-internal-1 (car skeleton) nil recursive)
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
335 (quit
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
336 (if (eq (cdr quit) 'recursive)
12886
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
337 (setq recursive 'quit
4029ded28f9d (skeleton-newline-indent-rigidly): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 12862
diff changeset
338 skeleton (memq 'resume: skeleton))
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
339 ;; Remove the subskeleton as far as it has been shown
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
340 ;; 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
341 (end-of-line)
12862
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
342 (delete-region start (point))
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
343 (insert line)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
344 (move-to-column column)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
345 (if (cdr quit)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
346 (setq skeleton ()
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
347 recursive nil)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
348 (signal 'quit 'recursive)))))))
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
349 ;; 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
350 (if (eq recursive 'quit)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
351 (signal 'quit 'recursive)
9d994b0faaa3 (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
Karl Heuer <kwzh@gnu.org>
parents: 12619
diff changeset
352 recursive))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353
51153
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
354 (defun skeleton-internal-1 (element &optional literal recursive)
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
355 (cond
91018
4dfd0563b711 (skeleton-internal-1): Use integerp and stringp
Kenichi Handa <handa@m17n.org>
parents: 91005
diff changeset
356 ((or (integerp element) (stringp element))
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
357 (if (and (integerp element) ; -num
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
358 (< element 0))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
359 (if skeleton-untabify
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
360 (backward-delete-char-untabify (- element))
108765
d835100c3e8b Replace Lisp calls to delete-backward-char by delete-char.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 106815
diff changeset
361 (delete-char element))
51153
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
362 (insert (if (not literal)
70821
fb7431719e32 (skeleton-transformation, skeleton-filter, skeleton-pair-filter):
Roland Winkler <Roland.Winkler@physik.uni-erlangen.de>
parents: 68651
diff changeset
363 (funcall skeleton-transformation-function element)
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
364 element))))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
365 ((or (eq element '\n) ; actually (eq '\n 'n)
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
366 ;; The sequence `> \n' is handled specially so as to indent the first
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
367 ;; line after inserting the newline (to get the proper indentation).
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
368 (and (eq element '>) (eq (nth 1 skeleton) '\n) (pop skeleton)))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
369 (let ((pos (if (eq element '>) (point))))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
370 (cond
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
371 ((and skeleton-regions (eq (nth 1 skeleton) '_))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
372 (or (eolp) (newline))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
373 (if pos (save-excursion (goto-char pos) (indent-according-to-mode)))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
374 (indent-region (line-beginning-position)
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
375 (car skeleton-regions) nil))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
376 ;; \n as last element only inserts \n if not at eol.
49299
c7f492d5cd47 (skeleton-internal-list, skeleton-internal-1):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45288
diff changeset
377 ((and (null (cdr skeleton)) (not recursive) (eolp))
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
378 (if pos (indent-according-to-mode)))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
379 (skeleton-newline-indent-rigidly
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
380 (let ((pt (point)))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
381 (newline)
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
382 (indent-to (save-excursion
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
383 (goto-char pt)
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
384 (if pos (indent-according-to-mode))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
385 (current-indentation)))))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
386 (t (if pos (reindent-then-newline-and-indent)
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
387 (newline)
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
388 (indent-according-to-mode))))))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
389 ((eq element '>)
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
390 (if (and skeleton-regions (eq (nth 1 skeleton) '_))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
391 (indent-region (line-beginning-position)
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
392 (car skeleton-regions) nil)
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
393 (indent-according-to-mode)))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
394 ((eq element '_)
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
395 (if skeleton-regions
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
396 (progn
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
397 (goto-char (pop skeleton-regions))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
398 (and (<= (current-column) (current-indentation))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
399 (eq (nth 1 skeleton) '\n)
51153
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
400 (end-of-line 0)))
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
401 (or skeleton-point
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
402 (setq skeleton-point (point)))))
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
403 ((eq element '-)
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
404 (setq skeleton-point (point)))
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
405 ((eq element '&)
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
406 (when skeleton-modified (pop skeleton)))
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
407 ((eq element '|)
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
408 (unless skeleton-modified (pop skeleton)))
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
409 ((eq element '@)
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
410 (push (point) skeleton-positions))
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
411 ((eq 'quote (car-safe element))
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
412 (eval (nth 1 element)))
51244
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
413 ((and (consp element)
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
414 (or (stringp (car element)) (listp (car element))))
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
415 ;; Don't forget: `symbolp' is also true for nil.
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
416 (if (symbolp (car-safe (car element)))
51244
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
417 (while (and (skeleton-internal-list element nil t)
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
418 ;; If the interactor is nil, don't infinite loop.
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
419 (car element)))
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
420 (setq literal (car element))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
421 (while literal
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
422 (skeleton-internal-list element (car literal))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
423 (setq literal (cdr literal)))))
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
424 ((null element))
51153
13c3a6c789ba (define-skeleton): Use the `no-self-insert' property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51087
diff changeset
425 (t (skeleton-internal-1 (eval element) t recursive))))
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
426
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
427 ;; Maybe belongs into simple.el or elsewhere
45288
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
428 ;; ;;;###autoload
984caedead68 (skeleton-transformation): Default to `identity'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38409
diff changeset
429 ;; (define-skeleton local-variables-section
15506
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
430 ;; "Insert a local variables section. Use current comment syntax if any."
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
431 ;; (completing-read "Mode: " obarray
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
432 ;; (lambda (symbol)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
433 ;; (if (commandp symbol)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
434 ;; (string-match "-mode$" (symbol-name symbol))))
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
435 ;; t)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
436 ;; '(save-excursion
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
437 ;; (if (re-search-forward page-delimiter nil t)
38409
153f1b1f2efd Emacs lisp coding convention fixes.
Pavel Janík <Pavel@Janik.cz>
parents: 36967
diff changeset
438 ;; (error "Not on last page")))
15506
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
439 ;; comment-start "Local Variables:" comment-end \n
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
440 ;; comment-start "mode: " str
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
441 ;; & -5 | '(kill-line 0) & -1 | comment-end \n
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
442 ;; ( (completing-read (format "Variable, %s: " skeleton-subprompt)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
443 ;; obarray
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
444 ;; (lambda (symbol)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
445 ;; (or (eq symbol 'eval)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
446 ;; (user-variable-p symbol)))
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
447 ;; t)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
448 ;; comment-start str ": "
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
449 ;; (read-from-minibuffer "Expression: " nil read-expression-map nil
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
450 ;; 'read-expression-history) | _
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
451 ;; comment-end \n)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
452 ;; resume:
15544
ef2b47c6c225 (skeleton-proxy-new): New function.
Richard M. Stallman <rms@gnu.org>
parents: 15506
diff changeset
453 ;; comment-start "End:" comment-end \n)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
455 ;; Variables and command for automatically inserting pairs like () or "".
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
457 (defvar skeleton-pair nil
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 "*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
459 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
460 will attempt to insert pairs of matching characters.")
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
461
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
463 (defvar skeleton-pair-on-word nil
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
464 "*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
465
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466
70821
fb7431719e32 (skeleton-transformation, skeleton-filter, skeleton-pair-filter):
Roland Winkler <Roland.Winkler@physik.uni-erlangen.de>
parents: 68651
diff changeset
467 (defvar skeleton-pair-filter-function (lambda () nil)
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
468 "Attempt paired insertion if this function returns nil, before inserting.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469 This allows for context-sensitive checking whether pairing is appropriate.")
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
472 (defvar skeleton-pair-alist ()
101010
4efc7ca085ce Replace last-command-char with last-command-event.
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
473 "An override alist of pairing partners matched against `last-command-event'.
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
474 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
475 `skeleton-insert' with no interactor. Variable `str' does nothing.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476
12501
6c57be2d372f partly rewritten and extended.
Karl Heuer <kwzh@gnu.org>
parents: 7394
diff changeset
477 Elements might be (?` ?` _ \"''\"), (?\\( ? _ \" )\") or (?{ \\n > _ \\n ?} >).")
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478
51244
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
479 (defvar skeleton-pair-default-alist '((?( _ ?)) (?\))
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
480 (?[ _ ?]) (?\])
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
481 (?{ _ ?}) (?\})
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
482 (?< _ ?>) (?\>)
94138
b6c3fde83add Set coding-tag.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 93975
diff changeset
483 (?« _ ?») (?\»)
51244
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
484 (?` _ ?')))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
486 ;;;###autoload
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
487 (defun skeleton-pair-insert-maybe (arg)
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
488 "Insert the character you type ARG times.
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
489
15506
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
490 With no ARG, if `skeleton-pair' is non-nil, pairing can occur. If the region
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
491 is visible the pair is wrapped around it depending on `skeleton-autowrap'.
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
492 Else, if `skeleton-pair-on-word' is non-nil or we are not before or inside a
70821
fb7431719e32 (skeleton-transformation, skeleton-filter, skeleton-pair-filter):
Roland Winkler <Roland.Winkler@physik.uni-erlangen.de>
parents: 68651
diff changeset
493 word, and if `skeleton-pair-filter-function' returns nil, pairing is performed.
36967
cebc3019a629 (skeleton-internal-list): Fix bogus logic.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35879
diff changeset
494 Pairing is also prohibited if we are right after a quoting character
cebc3019a629 (skeleton-internal-list): Fix bogus logic.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35879
diff changeset
495 such as backslash.
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496
12619
9d4a4e914215 (local-variables-section): Delete autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents: 12501
diff changeset
497 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
498 the defaults are used. These are (), [], {}, <> and `' for the
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 symmetrical ones, and the same character twice for the others."
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 (interactive "*P")
51244
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
501 (if (or arg (not skeleton-pair))
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
502 (self-insert-command (prefix-numeric-value arg))
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
503 (let* ((mark (and skeleton-autowrap
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
504 (or (eq last-command 'mouse-drag-region)
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
505 (and transient-mark-mode mark-active))))
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
506 (skeleton-end-hook)
101010
4efc7ca085ce Replace last-command-char with last-command-event.
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
507 (char last-command-event)
51244
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
508 (skeleton (or (assq char skeleton-pair-alist)
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
509 (assq char skeleton-pair-default-alist)
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
510 `(,char _ ,char))))
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
511 (if (or (memq (char-syntax (preceding-char)) '(?\\ ?/))
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
512 (and (not mark)
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
513 (or overwrite-mode
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
514 (if (not skeleton-pair-on-word) (looking-at "\\w"))
70821
fb7431719e32 (skeleton-transformation, skeleton-filter, skeleton-pair-filter):
Roland Winkler <Roland.Winkler@physik.uni-erlangen.de>
parents: 68651
diff changeset
515 (funcall skeleton-pair-filter-function))))
51244
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
516 (self-insert-command (prefix-numeric-value arg))
18df58e3c486 (skeleton-internal-1): Don't loop if interactor of subskeleton is nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51218
diff changeset
517 (skeleton-insert (cons nil skeleton) (if mark -1))))))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
519
15506
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
520 ;; A more serious example can be found in sh-script.el
94138
b6c3fde83add Set coding-tag.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 93975
diff changeset
521 ;; (defun mirror-mode ()
15489
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
522 ;; "This major mode is an amusing little example of paired insertion.
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
523 ;;All printable characters do a paired self insert, while the other commands
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
524 ;;work normally."
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
525 ;; (interactive)
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
526 ;; (kill-all-local-variables)
15506
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
527 ;; (make-local-variable 'skeleton-pair)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
528 ;; (make-local-variable 'skeleton-pair-on-word)
70821
fb7431719e32 (skeleton-transformation, skeleton-filter, skeleton-pair-filter):
Roland Winkler <Roland.Winkler@physik.uni-erlangen.de>
parents: 68651
diff changeset
529 ;; (make-local-variable 'skeleton-pair-filter-function)
15506
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
530 ;; (make-local-variable 'skeleton-pair-alist)
15489
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
531 ;; (setq major-mode 'mirror-mode
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
532 ;; mode-name "Mirror"
15506
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
533 ;; skeleton-pair-on-word t
15489
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
534 ;; ;; in the middle column insert one or none if odd window-width
70821
fb7431719e32 (skeleton-transformation, skeleton-filter, skeleton-pair-filter):
Roland Winkler <Roland.Winkler@physik.uni-erlangen.de>
parents: 68651
diff changeset
535 ;; skeleton-pair-filter-function (lambda ()
15506
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
536 ;; (if (>= (current-column)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
537 ;; (/ (window-width) 2))
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
538 ;; ;; insert both on next line
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
539 ;; (next-line 1)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
540 ;; ;; insert one or both?
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
541 ;; (= (* 2 (1+ (current-column)))
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
542 ;; (window-width))))
15489
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
543 ;; ;; mirror these the other way round as well
15506
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
544 ;; skeleton-pair-alist '((?) _ ?()
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
545 ;; (?] _ ?[)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
546 ;; (?} _ ?{)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
547 ;; (?> _ ?<)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
548 ;; (?/ _ ?\\)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
549 ;; (?\\ _ ?/)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
550 ;; (?` ?` _ "''")
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
551 ;; (?' ?' _ "``"))
15489
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
552 ;; ;; in this mode we exceptionally ignore the user, else it's no fun
15506
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
553 ;; skeleton-pair t)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
554 ;; (let ((map (make-vector 256 'skeleton-pair-insert-maybe))
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
555 ;; (i 0))
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
556 ;; (use-local-map `(keymap ,map))
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
557 ;; (while (< i ? )
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
558 ;; (aset map i nil)
1a66dbb1a470 (local-variables-section): Adapted comment to outline minor mode.
Richard M. Stallman <rms@gnu.org>
parents: 15489
diff changeset
559 ;; (aset map (+ i 128) nil)
15489
5393431269db (skeleton-autowrap): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 15441
diff changeset
560 ;; (setq i (1+ i))))
62740
073c3cc1d1d5 Use run-mode-hooks in example.
Lute Kamstra <lute@gnu.org>
parents: 52401
diff changeset
561 ;; (run-mode-hooks 'mirror-mode-hook))
6463
380e8fcde9a2 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562
14724
4a757fa8b402 Add provide call.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
563 (provide 'skeleton)
4a757fa8b402 Add provide call.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
564
93975
1e3a407766b9 Fix up comment convention on the arch-tag lines.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91327
diff changeset
565 ;; arch-tag: ccad7bd5-eb5d-40de-9ded-900197215c3e
38409
153f1b1f2efd Emacs lisp coding convention fixes.
Pavel Janík <Pavel@Janik.cz>
parents: 36967
diff changeset
566 ;;; skeleton.el ends here