annotate lisp/utils/id-select.el @ 26:441bb1e64a06 r19-15b96

Import from CVS: tag r19-15b96
author cvs
date Mon, 13 Aug 2007 08:51:32 +0200
parents b82b59fe008d
children 9b50b4588a93
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1 ;;!emacs
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
2 ;;
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
3 ;; LCD-ENTRY: id-select.el|InfoDock Associates|elisp@infodock.com|Syntactical region selecting|02/28/97|1.4.5|
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
4 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
5 ;; FILE: id-select.el
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
6 ;; SUMMARY: Select larger and larger syntax-driven regions in a buffer.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
7 ;; USAGE: XEmacs and Emacs Lisp Library
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
8 ;; KEYWORDS: matching, mouse
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
9 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
10 ;; AUTHOR: Bob Weiner
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
11 ;;
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
12 ;; ORG: InfoDock Associates. We sell corporate support and
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
13 ;; development contracts for InfoDock, Emacs and XEmacs.
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
14 ;; E-mail: <info@infodock.com> Web: http://www.infodock.com
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
15 ;; Tel: +1 408-243-3300
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
16 ;;
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
17 ;;
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
18 ;; ORIG-DATE: 19-Oct-96 at 02:25:27
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
19 ;; LAST-MOD: 28-Feb-97 at 15:36:39 by Bob Weiner
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
20 ;;
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
21 ;; Copyright (C) 1996, 1997 InfoDock Associates
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
22 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
23 ;; This file is part of InfoDock.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
24 ;; It is available for use and distribution under the terms of the GNU Public
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
25 ;; License.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
26 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
27 ;; DESCRIPTION:
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
28 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
29 ;; This is a radically cool, drop in mouse and keyboard-based library for
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
30 ;; selecting successively bigger syntactical regions within a buffer.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
31 ;; Simply load this library and you are ready to try it out by
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
32 ;; double-clicking on various kinds of characters in different buffer major
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
33 ;; modes. You'll quickly get the hang of it. (It also provides a command
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
34 ;; to jump between beginning and end tags within HTML and SGML buffers.)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
35 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
36 ;; A great deal of smarts are built-in so that it does the right thing
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
37 ;; almost all of the time; many other attempts at similar behavior such as
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
38 ;; thing.el fail to deal with many file format complexities.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
39 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
40 ;; Double clicks of the Selection Key (left mouse key) at the same point
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
41 ;; will select bigger and bigger regions with each successive use. The
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
42 ;; first double click selects a region based upon the character at the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
43 ;; point of the click. For example, with the point over an opening or
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
44 ;; closing grouping character, such as { or }, the whole grouping is
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
45 ;; selected, e.g. a C function. When on an _ or - within a programming
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
46 ;; language variable name, the whole name is selected. The type of
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
47 ;; selection is displayed in the minibuffer as feedback. When using a
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
48 ;; language based mainly on indenting, like Bourne shell, a double click on
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
49 ;; the first alpha character of a line, such as an if statement, selects
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
50 ;; the whole statement.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
51 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
52 ;; ---------------
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
53 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
54 ;; This whole package is driven by a single function, available in mouse
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
55 ;; and keyboard forms, that first marks a region based on the syntax
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
56 ;; category of the character following point. Successive invocations mark
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
57 ;; larger and larger regions until the whole buffer is marked. See the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
58 ;; documentation for the function, id-select-syntactical-region, for the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
59 ;; kinds of syntax categories handled.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
60 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
61 ;; Loading this package automatically installs its functionalty on
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
62 ;; double-clicks (or higher) of the left mouse key. (See the documentation
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
63 ;; for the variable, mouse-track-click-hook, for how this is done.) A
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
64 ;; single click of the left button will remove the region and reset point.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
65 ;;
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
66 ;; The function, id-select-thing, may be bound to a key to provide the same
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
67 ;; syntax-driven region selection functionality. {C-c C-m} is a
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
68 ;; reasonable site-wide choice since this key is seldom used and it
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
69 ;; mnemonically indicates marking something. {C-c s} may be preferred as a
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
70 ;; personal binding.
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
71 ;;
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
72 ;; Use {C-g} to unmark the region when done. Use,
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
73 ;; id-select-thing-with-mouse, if you want to bind this to a mouse key and
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
74 ;; thereby use single clicks instead of double clicks.
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
75 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
76 ;; Three other commands are also provided:
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
77 ;; id-select-and-copy-thing - mark and copy the syntactical unit to the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
78 ;; kill ring
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
79 ;; id-select-and-kill-thing - kill the syntactical unit at point
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
80 ;; id-select-goto-matching-tag - In HTML and SGML modes (actually any
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
81 ;; listed in the variable, `id-select-markup-modes'), moves point to the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
82 ;; start of the tag paired with the closest tag that point is within or
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
83 ;; which it precedes, so you can quickly jump back and forth between
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
84 ;; open and close tags.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
85 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
86 ;; ---------------
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
87 ;; SETUP:
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
88 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
89 ;; To autoload this package under XEmacs or InfoDock via mouse usage, add
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
90 ;; the following line to one of your initialization files. (Don't do this
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
91 ;; for GNU Emacs.)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
92 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
93 ;; (add-hook 'mouse-track-click-hook 'id-select-double-click-hook)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
94 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
95 ;; For any version of Emacs you should add the following autoload entries
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
96 ;; at your site:
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
97 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
98 ;; (autoload 'id-select-and-kill-thing
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
99 ;; "id-select" "Kill syntactical region selection" t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
100 ;; (autoload 'id-select-and-copy-thing
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
101 ;; "id-select" "Select and copy syntactical region" t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
102 ;; (autoload 'id-select-double-click-hook
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
103 ;; "id-select" "Double mouse click syntactical region selection" nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
104 ;; (autoload 'id-select-thing
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
105 ;; "id-select" "Keyboard-driven syntactical region selection" t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
106 ;; (autoload 'id-select-thing-with-mouse
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
107 ;; "id-select" "Single mouse click syntactical region selection" t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
108 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
109 ;; If you want to be able to select C++ and Java methods and classes by
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
110 ;; double-clicking on the first character of a definition or on its opening
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
111 ;; or closing brace, you may need the following setting (all
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
112 ;; because Sun programmers can't put their opening braces in the first
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
113 ;; column):
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
114 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
115 ;; (add-hook 'java-mode-hook
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
116 ;; (function
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
117 ;; (lambda ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
118 ;; (setq defun-prompt-regexp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
119 ;; "^[ \t]*\\(\\(\\(public\\|protected\\|private\\|const\\|abstract\\|synchronized\\|final\\|static\\|threadsafe\\|transient\\|native\\|volatile\\)\\s-+\\)*\\(\\(\\([[a-zA-Z][][_$.a-zA-Z0-9]*[][_$.a-zA-Z0-9]+\\|[[a-zA-Z]\\)\\s-*\\)\\s-+\\)\\)?\\(\\([[a-zA-Z][][_$.a-zA-Z0-9]*\\s-+\\)\\s-*\\)?\\([_a-zA-Z][^][ \t:;.,{}()=]*\\|\\([_$a-zA-Z][_$.a-zA-Z0-9]*\\)\\)\\s-*\\(([^);{}]*)\\)?\\([] \t]*\\)\\(\\s-*\\<throws\\>\\s-*\\(\\([_$a-zA-Z][_$.a-zA-Z0-9]*\\)[, \t\n\r\f]*\\)+\\)?\\s-*"))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
120 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
121 ;; (add-hook 'c++-mode-hook
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
122 ;; (function
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
123 ;; (lambda ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
124 ;; (setq defun-prompt-regexp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
125 ;; "^[ \t]*\\(template[ \t\n\r]*<[^>;.{}]+>[ \t\n\r]*\\)?\\(\\(\\(auto\\|const\\|explicit\\|extern[ \t\n\r]+\"[^\"]+\"\\|extern\\|friend\\|inline\\|mutable\\|overload\\|register\\|static\\|typedef\\|virtual\\)[ \t\n\r]+\\)*\\(\\([[<a-zA-Z][]_a-zA-Z0-9]*\\(::[]_a-zA-Z0-9]+\\)?[ \t\n\r]*<[_<>a-zA-Z0-9 ,]+>[ \t\n\r]*[*&]*\\|[[<a-zA-Z][]_<>a-zA-Z0-9]*\\(::[[<a-zA-Z][]_<>a-zA-Z0-9]+\\)?[ \t\n\r]*[*&]*\\)[*& \t\n\r]+\\)\\)?\\(\\(::\\|[[<a-zA-Z][]_a-zA-Z0-9]*[ \t\n\r]*<[^>;{}]+>[ \t\n\r]*[*&]*::\\|[[<a-zA-Z][]_~<>a-zA-Z0-9]*[ \t\n\r]*[*&]*::\\)[ \t\n\r]*\\)?\\(operator[ \t\n\r]*[^ \t\n\r:;.,?~{}]+\\([ \t\n\r]*\\[\\]\\)?\\|[_~<a-zA-Z][^][ \t:;.,~{}()]*\\|[*&]?\\([_~<a-zA-Z][_a-zA-Z0-9]*[ \t\n\r]*<[^>;{}]+[ \t\n\r>]*>\\|[_~<a-zA-Z][_~<>a-zA-Z0-9]*\\)\\)[ \t\n\r]*\\(([^{;]*)\\(\\([ \t\n\r]+const\\|[ \t\n\r]+mutable\\)?\\([ \t\n\r]*[=:][^;{]+\\)?\\)?\\)\\s-*"))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
126 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
127 ;; If you want tags, comments, sentences and text blocks to be selectable
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
128 ;; in HTML mode, you need to add the following to your personal
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
129 ;; initializations (You would do something similar for SGML mode.):
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
130 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
131 ;; ;; Make tag begin and end delimiters act like grouping characters,
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
132 ;; ;; for easy syntactical selection of tags.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
133 ;; (add-hook 'html-mode-hook
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
134 ;; (function
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
135 ;; (lambda ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
136 ;; (modify-syntax-entry ?< "(>" html-mode-syntax-table)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
137 ;; (modify-syntax-entry ?> ")<" html-mode-syntax-table)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
138 ;; (modify-syntax-entry ?\" "\"" html-mode-syntax-table)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
139 ;; (modify-syntax-entry ?= "." html-mode-syntax-table)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
140 ;; (make-local-variable 'comment-start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
141 ;; (make-local-variable 'comment-end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
142 ;; (setq comment-start "<!--" comment-end "-->")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
143 ;; (make-local-variable 'sentence-end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
144 ;; (setq sentence-end "\\([^ \t\n\r>]<\\|>\\(<[^>]*>\\)*\\|[.?!][]\"')}]*\\($\\| $\\|\t\\| \\)\\)[ \t\n]*")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
145 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
146 ;; (define-key html-mode-map "\C-c." 'id-select-goto-matching-tag)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
147 ;; )))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
148 ;;
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
149 ;; If you are incredibly academic and you use the Miranda programming
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
150 ;; language with a literate programming style (where code is preceded by a
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
151 ;; > character in the first column, you'll want to change the line in
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
152 ;; mira.el that reads:
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
153 ;; (modify-syntax-entry ?> ".")
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
154 ;; to:
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
155 ;; (modify-syntax-entry ?> " ")
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
156 ;;
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
157 ;; in order to make this package recognize the indented expressions of the
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
158 ;; language. If you don't use the literate style, no changes should be
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
159 ;; necessary.
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
160 ;;
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
161 ;; DESCRIP-END.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
162
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
163 ;;; ************************************************************************
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
164 ;;; Public variables
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
165 ;;; ************************************************************************
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
166
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
167 (defvar id-select-brace-modes
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
168 '(c++-mode c-mode java-mode objc-mode perl-mode tcl-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
169 "*List of language major modes which define things with brace delimiters.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
170
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
171 (defvar id-select-markup-modes
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
172 '(html-mode sgml-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
173 "*List of markup language modes that use SGML-style <tag> </tag> pairs.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
174
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
175 (defvar id-select-text-modes
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
176 '(fundamental-mode kotl-mode indented-text-mode Info-mode outline-mode text-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
177 "*List of textual modes where paragraphs may be outdented or indented.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
178
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
179 (defvar id-select-indent-modes
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
180 (append '(asm-mode csh-mode eiffel-mode ksh-mode miranda-mode python-mode
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
181 pascal-mode sather-mode)
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
182 id-select-text-modes)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
183 "*List of language major modes which use mostly indentation to define syntactic structure.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
184
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
185 (defvar id-select-indent-non-end-regexp-alist
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
186 '((csh-mode "\\(\\|then\\|elsif\\|else\\)[ \t]*$")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
187 (eiffel-mode "\\(\\|then\\|else if\\|else\\)[ \t]*$")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
188 (ksh-mode "\\(\\|then\\|elif\\|else\\)[ \t]*$")
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
189 (miranda-mode "[ \t>]*$")
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
190 (pascal-mode "\\(\\|then\\|else\\)[ \t]*$")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
191 (python-mode "[ \t]*$")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
192 (sather-mode "\\(\\|then\\|else if\\|else\\)[ \t]*$")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
193 ;;
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
194 (fundamental-mode "[^ \t\n*]")
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
195 (kotl-mode "[^ \t\n*]")
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
196 (indented-text-mode "[^ \t\n*]")
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
197 (Info-mode "[^ \t\n]")
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
198 (outline-mode "[^*]")
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
199 (text-mode "[^ \t\n*]")
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
200 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
201 "List of (major-mode . non-terminator-line-regexp) elements used to avoid early dropoff when marking indented code.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
202
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
203 (defvar id-select-indent-end-regexp-alist
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
204 '((csh-mode "end\\|while")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
205 (eiffel-mode "end")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
206 (ksh-mode "\\(fi\\|esac\\|until\\|done\\)[ \t\n]")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
207 (pascal-mode "end")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
208 (sather-mode "end")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
209 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
210 (fundamental-mode "[ \t]*$")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
211 (indented-text-mode "[ \t]*$")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
212 (Info-mode "[ \t]*$")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
213 (text-mode "[ \t]*$")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
214 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
215 "List of (major-mode . terminator-line-regexp) elements used to include a final line when marking indented code.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
216
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
217 (defvar id-select-char-p t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
218 "*If t, return single character boundaries when all else fails.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
219
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
220 (defvar id-select-display-type t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
221 "*If t, display the thing selected with each mouse click.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
222
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
223 (defvar id-select-whitespace t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
224 "*If t, groups of whitespace are considered as things.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
225
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
226 (if (string-match "XEmacs" emacs-version)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
227 (add-hook 'mouse-track-click-hook 'id-select-double-click-hook)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
228 (if (string-match "^19\\." emacs-version)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
229 (progn (transient-mark-mode 1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
230 (global-set-key [mouse-1] 'mouse-set-point)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
231 (global-set-key [double-mouse-1] 'id-select-thing-with-mouse)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
232 (global-set-key [triple-mouse-1] 'id-select-thing-with-mouse))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
233
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
234 ;;; ************************************************************************
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
235 ;;; Public functions
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
236 ;;; ************************************************************************
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
237
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
238 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
239 ;; Commands
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
240 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
241
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
242 ;;;###autoload
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
243 (defun id-select-thing ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
244 "Mark the region selected by the syntax of the thing at point.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
245 If invoked repeatedly, selects bigger and bigger things.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
246 If `id-select-display-type' is non-nil, the type of selection is displayed in
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
247 the minibuffer."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
248 (interactive
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
249 (cond ((and (fboundp 'region-active-p) (region-active-p))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
250 nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
251 ((and (boundp 'transient-mark-mode) transient-mark-mode mark-active)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
252 nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
253 (t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
254 ;; Reset selection based on the syntax of character at point.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
255 (id-select-reset)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
256 nil)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
257 (let ((region (id-select-boundaries (point))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
258 (if region
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
259 (progn (goto-char (car region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
260 (set-mark (cdr region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
261 (if (fboundp 'activate-region) (activate-region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
262 (if (and (boundp 'transient-mark-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
263 transient-mark-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
264 (setq mark-active t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
265 (and (interactive-p) id-select-display-type
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
266 (message "%s" id-select-previous))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
267 (run-hooks 'id-select-thing-hook)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
268 t))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
269
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
270 ;;;###autoload
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
271 (defun id-select-thing-with-mouse (event)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
272 "Select a region based on the syntax of the character from a mouse click.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
273 If the click occurs at the same point as the last click, select
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
274 the next larger syntactic structure. If `id-select-display-type' is non-nil,
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
275 the type of selection is displayed in the minibuffer."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
276 (interactive "@e")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
277 (cond ((and (eq id-select-prior-point (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
278 (eq id-select-prior-buffer (current-buffer)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
279 ;; Prior click was at the same point as before, so enlarge
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
280 ;; selection to the next bigger item.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
281 (if (and (id-select-bigger-thing) id-select-display-type)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
282 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
283 ;; Conditionally, save selected region for pasting.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
284 (cond
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
285 ;; XEmacs
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
286 ((fboundp 'x-store-cutbuffer)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
287 (x-store-cutbuffer (buffer-substring (point) (mark))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
288 ;; Emacs 19
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
289 ((and (boundp 'interprogram-cut-function)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
290 interprogram-cut-function)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
291 (x-set-selection 'PRIMARY (buffer-substring (point) (mark)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
292 (message "%s" id-select-previous)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
293 t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
294 (t (setq this-command 'mouse-start-selection)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
295 (id-select-reset)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
296 (id-select-thing-with-mouse event))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
297
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
298 ;;;###autoload
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
299 (defun id-select-goto-matching-tag ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
300 "If in a major mode listed in `id-select-markup-modes,' moves point to the start of the tag paired with the closest tag that point is within or precedes.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
301 Returns t if point is moved, else nil.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
302 Signals an error if no tag is found following point or if the closing tag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
303 does not have a `>' terminator character."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
304 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
305 (if (not (memq major-mode id-select-markup-modes))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
306 nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
307 (let ((result)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
308 ;; Assume case of tag names is irrelevant.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
309 (case-fold-search t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
310 (opoint (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
311 (tag)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
312 end-point
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
313 start-regexp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
314 end-regexp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
315
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
316 ;; Leave point at the start of the tag that point is within or that
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
317 ;; follows point.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
318 (cond
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
319 ;; Point is at the start of a tag.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
320 ((looking-at "<[^<> \t\n\r]"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
321 ;; Point was within a tag.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
322 ((and (re-search-backward "[<>]" nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
323 (looking-at "<[^<> \t\n\r]")))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
324 ;; Move to following tag.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
325 ((and (re-search-forward "<" nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
326 (progn (backward-char 1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
327 (looking-at "<[^<> \t\n\r]"))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
328 ;; No tag follows point.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
329 (t (error "(id-select-goto-matching-tag): No tag found after point.")))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
330
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
331 (if (catch 'done
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
332 (cond
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
333 ;; Beginning of a tag pair
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
334 ((looking-at "<[^/][^<> \t\n\r]*")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
335 (setq tag (buffer-substring (match-beginning 0) (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
336 start-regexp (regexp-quote tag)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
337 end-regexp (concat "</" (substring start-regexp 1)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
338 ;; Skip over nested tags.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
339 (let ((count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
340 (regexp (concat start-regexp "\\|" end-regexp))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
341 match-point)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
342 (while (and (>= count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
343 (re-search-forward regexp nil t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
344 (setq match-point (match-beginning 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
345 (if (/= (char-after (1+ (match-beginning 0))) ?/)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
346 ;; Start tag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
347 (setq count (1+ count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
348 ;; End tag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
349 (setq end-point (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
350 (if (or (not (re-search-forward "[<>]" nil t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
351 (= (preceding-char) ?<))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
352 ;; No terminator character `>' for end tag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
353 (progn (setq result end-point)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
354 (throw 'done nil)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
355 (setq count (1- count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
356 (if (= count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
357 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
358 (goto-char match-point)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
359 (setq result t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
360 (throw 'done result)))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
361 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
362 ;; End of a tag pair
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
363 ((or (looking-at "</[^> \t\n\r]+")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
364 (and (skip-chars-backward "<")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
365 (looking-at "</[^> \t\n\r]+")))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
366 (goto-char (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
367 (setq tag (buffer-substring (match-beginning 0) (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
368 end-regexp (regexp-quote tag)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
369 start-regexp (concat "<" (substring end-regexp 2)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
370 (setq end-point (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
371 (if (or (not (re-search-forward "[<>]" nil t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
372 (= (preceding-char) ?<))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
373 ;; No terminator character `>' for end tag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
374 (progn (setq result end-point)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
375 (throw 'done nil)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
376 ;; Skip over nested tags.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
377 (let ((count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
378 (regexp (concat start-regexp "\\|" end-regexp)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
379 (while (and (>= count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
380 (re-search-backward regexp nil t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
381 (if (= (char-after (1+ (point))) ?/)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
382 ;; End tag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
383 (setq count (1+ count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
384 ;; Start tag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
385 (setq count (1- count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
386 (if (= count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
387 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
388 (setq result t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
389 (throw 'done t)))))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
390 nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
391 ;; Didn't find matching tag.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
392 (goto-char opoint))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
393
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
394 (cond ((integerp result)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
395 (goto-char result)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
396 (error "(id-select-goto-matching-tag): Add a terminator character for this end <tag>"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
397 ((null tag)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
398 (error "(id-select-goto-matching-tag): No <tag> following point"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
399 ((null result)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
400 (if (interactive-p)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
401 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
402 (beep)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
403 (message "(id-select-goto-matching-tag): No matching tag for %s>"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
404 tag)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
405 result)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
406 (t result)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
407
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
408 ;;;###autoload
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
409 (defun id-select-and-copy-thing ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
410 "Copy the region surrounding the syntactical unit at point."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
411 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
412 (let ((bounds (id-select-boundaries (point))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
413 (if bounds (copy-region-as-kill (car bounds) (cdr bounds)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
414
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
415 ;;;###autoload
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
416 (defun id-select-and-kill-thing ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
417 "Kill the region surrounding the syntactical unit at point."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
418 (interactive "*")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
419 (let ((bounds (id-select-boundaries (point))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
420 (if bounds (kill-region (car bounds) (cdr bounds)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
421
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
422
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
423 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
424 ;; Functions
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
425 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
426
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
427 (defun id-select-boundaries (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
428 "Return the (start . end) of a syntactically defined region based upon the last region selected or on position POS.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
429 The character at POS is selected if no other thing is matched."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
430 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
431 (setq zmacs-region-stays t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
432 (setcar id-select-old-region (car id-select-region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
433 (setcdr id-select-old-region (cdr id-select-region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
434 (let ((prior-type id-select-previous))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
435 (cond
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
436 ((eq id-select-previous 'char)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
437 (id-select-syntactical-region pos))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
438 ((and (car id-select-old-region)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
439 (memq id-select-previous
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
440 '(sexp sexp-start sexp-end sexp-up))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
441 (id-select-sexp-up pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
442 (id-select-region-bigger-p id-select-old-region id-select-region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
443 id-select-region)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
444 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
445 ;; In the general case, we can't know ahead of time what the next
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
446 ;; biggest type of thing to select is, so we test them all and choose
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
447 ;; the best fit. This means that dynamically, the order of type
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
448 ;; selection will change based on the buffer context.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
449 (t (let ((min-region (1+ (- (point-max) (point-min))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
450 (result)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
451 region region-size)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
452 (mapcar
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
453 (function
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
454 (lambda (sym-func)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
455 (setq region
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
456 (if (car (cdr sym-func))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
457 (funcall (car (cdr sym-func)) pos)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
458 (if (and region (car region)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
459 (id-select-region-bigger-p
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
460 id-select-old-region region)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
461 (setq region-size
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
462 (- (cdr region) (car region)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
463 (< region-size min-region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
464 (setq min-region region-size
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
465 result
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
466 (list;; The actual selection type is
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
467 ;; sometimes different than the one we
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
468 ;; originally tried, so recompute it here.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
469 (car (assq id-select-previous
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
470 id-select-bigger-alist))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
471 (car region) (cdr region))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
472 id-select-bigger-alist)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
473 (if result
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
474 ;; Returns id-select-region
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
475 (progn (setq id-select-previous (car result))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
476 (id-select-set-region (nth 1 result) (nth 2 result)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
477 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
478 ;; Restore prior selection type since we failed to find a
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
479 ;; new one.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
480 (setq id-select-previous prior-type)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
481 (beep)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
482 (message
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
483 "(id-select-boundaries): `%s' is the largest selectable region"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
484 id-select-previous)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
485 nil))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
486
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
487 ;;;###autoload
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
488 (defun id-select-double-click-hook (event click-count)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
489 "Select a region based on the syntax of the character wherever the mouse is double-clicked.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
490 If the double-click occurs at the same point as the last double-click, select
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
491 the next larger syntactic structure. If `id-select-display-type' is non-nil,
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
492 the type of selection is displayed in the minibuffer."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
493 (cond ((/= click-count 2)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
494 ;; Return nil so any other hooks are performed.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
495 nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
496 (t (id-select-thing-with-mouse event))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
497
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
498 (defun id-select-syntactical-region (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
499 "Return the (start . end) of a syntactically defined region based upon the buffer position POS.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
500 Uses `id-select-syntax-alist' and the current buffer's syntax table to
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
501 determine syntax groups.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
502
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
503 Typically:
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
504 Open or close grouping character syntax marks an s-expression.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
505 Double quotes mark strings.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
506 The end of a line marks the line, including its trailing newline.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
507 Word syntax marks the current word.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
508 Symbol syntax (such as _) marks a symbol.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
509 Whitespace marks a span of whitespace.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
510 Comment start or end syntax marks the comment.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
511 Punctuation syntax marks the words on both sides of the punctuation.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
512 The fallback default is to mark the character at POS.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
513
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
514 If an error occurs during syntax scanning, it returns nil."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
515 (interactive "d")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
516 (setq id-select-previous 'char)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
517 (if (save-excursion (goto-char pos) (eolp))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
518 (id-select-line pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
519 (let* ((syntax (char-syntax (if (eobp) (preceding-char) (char-after pos))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
520 (pair (assq syntax id-select-syntax-alist)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
521 (cond ((and pair
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
522 (or id-select-whitespace
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
523 (not (eq (car (cdr pair)) 'thing-whitespace))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
524 (funcall (car (cdr pair)) pos))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
525 (id-select-char-p
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
526 (setq id-select-previous 'char)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
527 (id-select-set-region pos (1+ pos)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
528 (t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
529 nil)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
530
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
531 ;;; ************************************************************************
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
532 ;;; Private functions
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
533 ;;; ************************************************************************
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
534
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
535 (defun id-select-at-blank-line-or-comment ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
536 "Return non-nil if on a blank line or a comment start or end line.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
537 Assumes point is befor any non-whitespace character on the line."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
538 (let ((comment-end-p (and (stringp comment-end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
539 (not (string-equal comment-end "")))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
540 (if (looking-at
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
541 (concat "\\s-*$\\|\\s-*\\(//\\|/\\*\\|.*\\*/"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
542 (if comment-start
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
543 (concat
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
544 "\\|" (regexp-quote comment-start)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
545 (if comment-end-p
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
546 (concat
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
547 "\\|.*" (regexp-quote comment-end)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
548 "\\)"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
549 (or (not (and comment-start comment-end-p))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
550 ;; Ignore start and end of comments that
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
551 ;; follow non-commented text.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
552 (not (looking-at
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
553 (format ".*\\S-.*%s.*%s"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
554 (regexp-quote comment-start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
555 (regexp-quote comment-end))))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
556
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
557 (defun id-select-back-to-indentation ()
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
558 "Move point to the first non-whitespace character on this line and return point.
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
559 This respects the current syntax table definition of whitespace, whereas
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
560 `back-to-indentation' does not. This is relevant in literate programming and
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
561 mail and news reply modes."
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
562 (goto-char (min (progn (end-of-line) (point))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
563 (progn (beginning-of-line)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
564 (skip-syntax-forward " ")
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
565 (point)))))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
566
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
567 (defun id-select-bigger-thing ()
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
568 "Select a bigger object where point is."
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
569 (prog1
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
570 (id-select-thing)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
571 (setq this-command 'select-thing)))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
572
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
573 (defun id-select-region-bigger-p (old-region new-region)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
574 "Return t if OLD-REGION is smaller than NEW-REGION and NEW-REGION partially overlaps OLD-REGION, or if OLD-REGION is uninitialized."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
575 (if (null (car old-region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
576 t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
577 (and (> (abs (- (cdr new-region) (car new-region)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
578 (abs (- (cdr old-region) (car old-region))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
579 ;; Ensure the two regions intersect.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
580 (or (and (<= (min (cdr new-region) (car new-region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
581 (min (cdr old-region) (car old-region)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
582 (> (max (cdr new-region) (car new-region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
583 (min (cdr old-region) (car old-region))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
584 (and (> (min (cdr new-region) (car new-region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
585 (min (cdr old-region) (car old-region)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
586 (<= (min (cdr new-region) (car new-region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
587 (max (cdr old-region) (car old-region))))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
588
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
589 (defun id-select-reset ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
590 ;; Reset syntactic selection.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
591 (setq id-select-prior-point (point)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
592 id-select-prior-buffer (current-buffer)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
593 id-select-previous 'char)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
594 (id-select-set-region nil nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
595
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
596 (defun id-select-set-region (beginning end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
597 "Set the cons cell held by the variable `id-select-region' to (BEGINNING . END).
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
598 Return the updated cons cell."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
599 (setcar id-select-region beginning)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
600 (setcdr id-select-region end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
601 (if (and (null beginning) (null end))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
602 (progn (setcar id-select-old-region nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
603 (setcdr id-select-old-region nil)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
604 (if (and (not (eq id-select-previous 'buffer))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
605 (integerp beginning) (integerp end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
606 (= beginning (point-min)) (= end (point-max)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
607 ;; If we selected the whole buffer, make sure that 'thing' type is 'buffer'.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
608 nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
609 id-select-region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
610
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
611 (defun id-select-string-p (&optional start-delim end-delim)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
612 "Returns (start . end) of string whose first line point is within or immediately before.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
613 Positions include delimiters. String is delimited by double quotes unless
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
614 optional START-DELIM and END-DELIM (strings) are given.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
615 Returns nil if not within a string."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
616 (let ((opoint (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
617 (count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
618 bol start delim-regexp start-regexp end-regexp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
619 (or start-delim (setq start-delim "\""))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
620 (or end-delim (setq end-delim "\""))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
621 ;; Special case for the empty string.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
622 (if (looking-at (concat (regexp-quote start-delim)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
623 (regexp-quote end-delim)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
624 (id-select-set-region (point) (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
625 (setq start-regexp (concat "\\(^\\|[^\\]\\)\\("
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
626 (regexp-quote start-delim) "\\)")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
627 end-regexp (concat "[^\\]\\(" (regexp-quote end-delim) "\\)")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
628 delim-regexp (concat start-regexp "\\|" end-regexp))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
629 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
630 (beginning-of-line)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
631 (setq bol (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
632 (while (re-search-forward delim-regexp opoint t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
633 (setq count (1+ count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
634 ;; This is so we don't miss the closing delimiter of an empty
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
635 ;; string.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
636 (if (and (= (point) (1+ bol))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
637 (looking-at (regexp-quote end-delim)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
638 (setq count (1+ count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
639 (if (bobp) nil (backward-char 1))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
640 (goto-char opoint)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
641 ;; If found an even # of starting and ending delimiters before
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
642 ;; opoint, then opoint is at the start of a string, where we want it.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
643 (if (zerop (mod count 2))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
644 (if (bobp) nil (backward-char 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
645 (re-search-backward start-regexp nil t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
646 ;; Point is now before the start of the string.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
647 (if (re-search-forward start-regexp nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
648 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
649 (setq start (match-beginning 2))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
650 (if (re-search-forward end-regexp nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
651 (id-select-set-region start (point)))))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
652
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
653 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
654 ;;; Code selections
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
655 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
656
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
657 (defun id-select-brace-def-or-declaration (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
658 "If POS is at the first character, opening brace or closing brace of a brace delimited language definition, return (start . end) region, else nil.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
659 The major mode for each supported brace language must be included in the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
660 list, id-select-brace-modes."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
661 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
662 (if (not (and (featurep 'cc-mode) (memq major-mode id-select-brace-modes)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
663 nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
664 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
665 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
666 (let ((at-def-brace
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
667 (or (looking-at "^{") (looking-at "^}")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
668 ;; Handle stupid old C-style and new Java
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
669 ;; style of putting braces at the end of
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
670 ;; lines.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
671 (and (= (following-char) ?{)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
672 (stringp defun-prompt-regexp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
673 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
674 (beginning-of-line)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
675 (looking-at defun-prompt-regexp)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
676 (and (= (following-char) ?})
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
677 (stringp defun-prompt-regexp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
678 (condition-case ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
679 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
680 ;; Leave point at opening brace.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
681 (goto-char
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
682 (scan-sexps (1+ (point)) -1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
683 ;; Test if these are defun braces.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
684 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
685 (beginning-of-line)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
686 (looking-at defun-prompt-regexp)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
687 (error nil)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
688 eod)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
689 (if (or at-def-brace
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
690 ;; At the start of a definition:
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
691 ;; Must be at the first non-whitespace character in the line.
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
692 (and (= (point) (save-excursion (id-select-back-to-indentation)))
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
693 ;; Must be on an alpha or symbol-constituent character.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
694 ;; Also allow ~ for C++ destructors.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
695 (looking-at "[a-zA-z~]\\|\\s_")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
696 ;; Previous line, if any, must be blank or a comment
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
697 ;; start or end or `defun-prompt-regexp' must be defined
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
698 ;; for this mode.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
699 (or (stringp defun-prompt-regexp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
700 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
701 (if (/= (forward-line -1) 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
702 t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
703 (id-select-at-blank-line-or-comment))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
704 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
705 (setq id-select-previous 'brace-def-or-declaration)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
706 ;; Handle declarations and definitions embedded within classes.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
707 (if (and (= (following-char) ?{)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
708 (/= (point) (save-excursion
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
709 (id-select-back-to-indentation))))
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
710 (setq at-def-brace nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
711 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
712 (if at-def-brace nil (beginning-of-line))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
713 (if (and (not at-def-brace)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
714 (stringp defun-prompt-regexp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
715 (looking-at defun-prompt-regexp))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
716 ;; Mark the declaration or definition
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
717 (id-select-set-region
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
718 (point)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
719 (progn (goto-char (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
720 (if (= (following-char) ?{)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
721 (forward-list 1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
722 (search-forward ";" nil t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
723 (skip-chars-forward " \t")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
724 (skip-chars-forward "\n")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
725 (if (looking-at "^\\s-*$")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
726 (forward-line 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
727 (point)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
728 ;; Mark function definitions only
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
729 (setq eod (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
730 (condition-case ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
731 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
732 (end-of-defun)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
733 (if (looking-at "^\\s-*$")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
734 (forward-line 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
735 (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
736 (error (point-max)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
737 (if (= (following-char) ?})
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
738 ;; Leave point at opening brace.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
739 (goto-char (scan-sexps (1+ (point)) -1)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
740 (if (= (following-char) ?{)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
741 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
742 (while (and (zerop (forward-line -1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
743 (not (id-select-at-blank-line-or-comment))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
744 (if (id-select-at-blank-line-or-comment)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
745 (forward-line 1))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
746 ;; Mark the whole definition
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
747 (setq id-select-previous 'brace-def-or-declaration)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
748 (id-select-set-region (point) eod))))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
749
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
750 (defun id-select-indent-def (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
751 "If POS is at the first alpha character on a line, return (start . end) region,
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
752
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
753 The major mode for each supported indented language must be included in the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
754 list, id-select-indent-modes."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
755 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
756 (if (not (memq major-mode id-select-indent-modes))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
757 nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
758 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
759 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
760 (if (and
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
761 ;; Use this function only if point is on the first non-blank
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
762 ;; character of a block, whatever a block is for the current
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
763 ;; mode.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
764 (cond ((eq major-mode 'kotl-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
765 (and (looking-at "[1-9*]") (not (kview:valid-position-p))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
766 ((or (eq major-mode 'outline-mode) selective-display)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
767 (save-excursion (beginning-of-line)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
768 (looking-at outline-regexp)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
769 ;; After indent in any other mode, must be on an alpha
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
770 ;; or symbol-constituent character.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
771 (t (looking-at "[a-zA-z]\\|\\s_")))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
772 ;; Must be at the first non-whitespace character in the line.
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
773 (= (point) (save-excursion (id-select-back-to-indentation))))
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
774 (let* ((start-col (current-column))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
775 (opoint (if (eq major-mode 'kotl-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
776 (progn (kotl-mode:to-valid-position) (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
777 (beginning-of-line) (point))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
778 (while
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
779 (and (zerop (forward-line 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
780 (bolp)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
781 (or (progn (id-select-back-to-indentation)
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
782 (> (current-column) start-col))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
783 ;; If in a text mode, allow outdenting, otherwise
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
784 ;; only include special lines here indented to the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
785 ;; same point as the original line.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
786 (and (or (memq major-mode id-select-text-modes)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
787 (= (current-column) start-col))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
788 (looking-at
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
789 (or (car (cdr
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
790 (assq
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
791 major-mode
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
792 id-select-indent-non-end-regexp-alist)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
793 "\\'"))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
794 (if (and (looking-at
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
795 (or (car (cdr (assq major-mode
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
796 id-select-indent-end-regexp-alist)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
797 "\\'"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
798 (or (memq major-mode id-select-text-modes)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
799 (= (current-column) start-col)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
800 (forward-line 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
801 (beginning-of-line)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
802 ;; Mark the whole definition
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
803 (setq id-select-previous 'indent-def)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
804 (id-select-set-region opoint (point)))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
805
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
806 (defun id-select-symbol (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
807 "Return (start . end) of a symbol at POS."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
808 (or (id-select-markup-pair pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
809 ;; Test for indented def here since might be on an '*' representing
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
810 ;; an outline entry, in which case we mark entries as indented blocks.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
811 (id-select-indent-def pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
812 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
813 (if (memq (char-syntax (if (eobp) (preceding-char) (char-after pos)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
814 '(?w ?_))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
815 (progn (setq id-select-previous 'symbol)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
816 (condition-case ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
817 (let ((end (scan-sexps pos 1)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
818 (id-select-set-region
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
819 (min pos (scan-sexps end -1)) end))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
820 (error nil)))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
821
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
822 (defun id-select-sexp-start (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
823 "Return (start . end) of sexp starting at POS."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
824 (or (id-select-markup-pair pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
825 (id-select-brace-def-or-declaration pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
826 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
827 (setq id-select-previous 'sexp-start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
828 (condition-case ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
829 (id-select-set-region pos (scan-sexps pos 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
830 (error nil)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
831
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
832 (defun id-select-sexp-end (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
833 "Return (start . end) of sexp ending at POS."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
834 (or (id-select-brace-def-or-declaration pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
835 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
836 (setq id-select-previous 'sexp-end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
837 (condition-case ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
838 (id-select-set-region (scan-sexps (1+ pos) -1) (1+ pos))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
839 (error nil)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
840
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
841 (defun id-select-sexp (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
842 "Return (start . end) of the sexp that POS is within."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
843 (setq id-select-previous 'sexp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
844 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
845 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
846 (condition-case ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
847 (id-select-set-region (progn (backward-up-list 1) (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
848 (progn (forward-list 1) (point)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
849 (error nil))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
850
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
851 (defun id-select-sexp-up (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
852 "Return (start . end) of the sexp enclosing the selected area or nil."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
853 (setq id-select-previous 'sexp-up)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
854 ;; Keep going up and backward in sexps. This means that id-select-sexp-up
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
855 ;; can only be called after id-select-sexp or after itself.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
856 (setq pos (or (car id-select-region) pos))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
857 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
858 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
859 (condition-case ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
860 (id-select-set-region (progn (backward-up-list 1) (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
861 (progn (forward-list 1) (point)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
862 (error nil))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
863
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
864 (defun id-select-preprocessor-def (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
865 "Return (start . end) of a preprocessor #definition starting at POS, if any.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
866 The major mode for each language that uses # preprocessor notation must be
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
867 included in the list, id-select-brace-modes."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
868 ;; Only applies in brace modes (strictly, this should apply in a subset
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
869 ;; of brace modes, but doing it this way permits for configurability. In
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
870 ;; other modes, one doesn't have to use the function on a # symbol.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
871 (if (not (memq major-mode id-select-brace-modes))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
872 nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
873 (setq id-select-previous 'preprocessor-def)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
874 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
875 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
876 (if (and (= (following-char) ?#)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
877 ;; Must be at the first non-whitespace character in the line.
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
878 (= (point) (save-excursion (id-select-back-to-indentation))))
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
879 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
880 ;; Skip past continuation lines that end with a backslash.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
881 (while (and (looking-at ".*\\\\\\s-*$")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
882 (zerop (forward-line 1))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
883 (forward-line 1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
884 ;; Include one trailing blank line, if any.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
885 (if (looking-at "^[ \t\n\r]*$") (forward-line 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
886 (id-select-set-region pos (point)))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
887
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
888 ;; Allow punctuation marks not followed by white-space to include
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
889 ;; the previous and subsequent sexpression. Useful in contexts such as
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
890 ;; 'foo.bar'.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
891 (defun id-select-punctuation (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
892 "Return (start . end) region including sexpressions before and after POS, when at a punctuation character."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
893 (or (id-select-comment pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
894 (id-select-preprocessor-def pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
895 (id-select-brace-def-or-declaration pos) ;; Might be on a C++ ;; destructor ~.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
896 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
897 (setq id-select-previous 'punctuation)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
898 (goto-char (min (1+ pos) (point-max)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
899 (if (= (char-syntax (if (eobp) (preceding-char) (char-after (point))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
900 ?\ )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
901 (id-select-set-region pos (1+ pos))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
902 (goto-char pos)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
903 (condition-case ()
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
904 (id-select-set-region
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
905 (save-excursion (backward-sexp) (point))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
906 (progn (forward-sexp) (point)))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 4
diff changeset
907 (error nil))))))
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
908
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
909 (defun id-select-comment (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
910 "Return rest of line from POS to newline."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
911 (setq id-select-previous 'comment)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
912 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
913 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
914 (let ((start-regexp (if (stringp comment-start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
915 (regexp-quote comment-start)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
916 (end-regexp (if (stringp comment-end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
917 (regexp-quote comment-end)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
918 bolp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
919 (cond
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
920 ;; Beginning of a comment
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
921 ((and (stringp comment-start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
922 (or (looking-at start-regexp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
923 (and (skip-chars-backward comment-start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
924 (looking-at start-regexp))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
925 (skip-chars-backward " \t")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
926 (setq bolp (bolp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
927 pos (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
928 (if (equal comment-end "")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
929 (progn (end-of-line)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
930 (id-select-set-region pos (point)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
931 (if (stringp comment-end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
932 ;; Skip over nested comments.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
933 (let ((count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
934 (regexp (concat start-regexp "\\|" end-regexp)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
935 (catch 'done
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
936 (while (re-search-forward regexp nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
937 (if (string-equal
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
938 (buffer-substring (match-beginning 0) (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
939 comment-start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
940 (setq count (1+ count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
941 ;; End comment
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
942 (setq count (1- count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
943 (if (= count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
944 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
945 (if (looking-at "[ \t]*[\n\r]")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
946 ;; Don't include final newline unless the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
947 ;; comment is first thing on its line.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
948 (goto-char (if bolp (match-end 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
949 (1- (match-end 0)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
950 (throw 'done (id-select-set-region
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
951 pos (point))))))))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
952 ;; End of a comment
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
953 ((and (stringp comment-end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
954 (not (string-equal comment-end ""))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
955 (or (looking-at end-regexp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
956 (and (skip-chars-backward comment-end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
957 (looking-at end-regexp))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
958 (goto-char (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
959 (if (looking-at "[ \t]*[\n\r]")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
960 (goto-char (match-end 0)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
961 (setq pos (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
962 (skip-chars-forward " \t")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
963 ;; Skip over nested comments.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
964 (let ((count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
965 (regexp (concat start-regexp "\\|" end-regexp)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
966 (catch 'done
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
967 (while (re-search-backward regexp nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
968 (if (string-equal
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
969 (buffer-substring (match-beginning 0) (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
970 comment-end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
971 (setq count (1+ count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
972 ;; Begin comment
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
973 (setq count (1- count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
974 (if (= count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
975 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
976 (skip-chars-backward " \t")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
977 ;; Don't include final newline unless the comment is
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
978 ;; first thing on its line.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
979 (if (bolp) nil (setq pos (1- pos)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
980 (throw 'done (id-select-set-region
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
981 (point) pos)))))))))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
982
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
983 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
984 ;;; Textual selections
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
985 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
986
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
987 (defun id-select-word (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
988 "Return (start . end) of word at POS."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
989 (or (id-select-brace-def-or-declaration pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
990 (id-select-indent-def pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
991 (progn (setq id-select-previous 'word)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
992 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
993 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
994 (forward-word 1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
995 (let ((end (point)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
996 (forward-word -1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
997 (id-select-set-region (point) end))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
998
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
999 (defun id-select-string (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1000 "Returns (start . end) of string at POS or nil. Pos include delimiters.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1001 Delimiters may be single, double or open and close quotes."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1002 (setq id-select-previous 'string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1003 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1004 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1005 (if (and (memq major-mode id-select-markup-modes)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1006 (/= (following-char) ?\")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1007 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1008 (and (re-search-backward "[<>]" nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1009 (= (following-char) ?>))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1010 (progn (setq id-select-previous 'text)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1011 (search-backward ">" nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1012 (id-select-set-region
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1013 (1+ (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1014 (progn (if (search-forward "<" nil 'end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1015 (1- (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1016 (point)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1017 (or (id-select-string-p) (id-select-string-p "'" "'")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1018 (id-select-string-p "`" "'")))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1019
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1020 (defun id-select-sentence (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1021 "Return (start . end) of the sentence at POS."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1022 (setq id-select-previous 'sentence)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1023 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1024 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1025 (condition-case ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1026 (id-select-set-region (progn (backward-sentence) (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1027 (progn (forward-sentence) (point)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1028 (error nil))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1029
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1030 (defun id-select-whitespace (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1031 "Return (start . end) of all but one char of whitespace POS, unless
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1032 there is only one character of whitespace or this is leading whitespace on
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1033 the line. Then return all of it."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1034 (setq id-select-previous 'whitespace)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1035 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1036 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1037 (if (= (following-char) ?\^L)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1038 (id-select-page pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1039 (let ((end (progn (skip-chars-forward " \t") (point)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1040 (start (progn (skip-chars-backward " \t") (point))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1041 (if (looking-at "[ \t]")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1042 (if (or (bolp) (= (1+ start) end))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1043 (id-select-set-region start end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1044 (id-select-set-region (1+ start) end)))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1045
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1046 (defun id-select-markup-pair (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1047 "Return (start . end) of region between the opening and closing of an HTML or SGML tag pair, one of which is at POS.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1048 The major mode for each language that uses such tags must be included in the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1049 list, id-select-markup-modes."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1050 (if (not (memq major-mode id-select-markup-modes))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1051 nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1052 (setq id-select-previous 'markup-pair)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1053 (let ((pos-with-space)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1054 ;; Assume case of tag names is irrelevant.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1055 (case-fold-search t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1056 (result)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1057 start-regexp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1058 end-regexp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1059 bolp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1060 opoint)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1061 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1062 (catch 'done
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1063 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1064 (cond
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1065 ;; Beginning of a tag pair
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1066 ((looking-at "<[^/][^<> \t\n\r]*")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1067 (setq start-regexp (regexp-quote (buffer-substring
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1068 (match-beginning 0) (match-end 0)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1069 end-regexp (concat "</" (substring start-regexp 1)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1070 (setq pos (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1071 (skip-chars-backward " \t")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1072 (setq bolp (bolp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1073 pos-with-space (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1074 ;; Skip over nested tags.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1075 (let ((count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1076 (regexp (concat start-regexp "\\|" end-regexp)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1077 (while (and (>= count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1078 (re-search-forward regexp nil t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1079 (if (/= (char-after (1+ (match-beginning 0))) ?/)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1080 ;; Start tag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1081 (setq count (1+ count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1082 ;; Move past end tag terminator
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1083 (setq opoint (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1084 (if (or (not (re-search-forward "[<>]" nil t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1085 (= (preceding-char) ?<))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1086 (progn (setq result opoint)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1087 (throw 'done nil)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1088 (setq count (1- count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1089 (if (= count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1090 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1091 (if (looking-at "[ \t]*[\n\r]")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1092 ;; Don't include final newline unless the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1093 ;; start tag was the first thing on its line.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1094 (if bolp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1095 (progn (goto-char (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1096 ;; Include leading space since the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1097 ;; start and end tags begin and end
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1098 ;; lines.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1099 (setq pos pos-with-space))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1100 (goto-char (1- (match-end 0)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1101 (setq result (id-select-set-region pos (point)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1102 (throw 'done nil)))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1103 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1104 ;; End of a tag pair
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1105 ((or (looking-at "</[^> \t\n\r]+")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1106 (and (skip-chars-backward "<")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1107 (looking-at "</[^> \t\n\r]+")))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1108 (goto-char (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1109 (setq end-regexp (regexp-quote (buffer-substring
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1110 (match-beginning 0) (match-end 0)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1111 start-regexp (concat "<" (substring end-regexp 2)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1112 (setq opoint (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1113 (if (or (not (re-search-forward "[<>]" nil t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1114 (= (preceding-char) ?<))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1115 (progn (setq result opoint)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1116 (throw 'done nil)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1117 (setq pos (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1118 (if (looking-at "[ \t]*[\n\r]")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1119 (setq pos-with-space (match-end 0)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1120 ;; Skip over nested tags.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1121 (let ((count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1122 (regexp (concat start-regexp "\\|" end-regexp)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1123 (while (and (>= count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1124 (re-search-backward regexp nil t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1125 (if (= (char-after (1+ (point))) ?/)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1126 ;; End tag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1127 (setq count (1+ count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1128 ;; Start tag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1129 (setq count (1- count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1130 (if (= count 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1131 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1132 (if pos-with-space
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1133 ;; Newline found after original end tag.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1134 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1135 (skip-chars-backward " \t")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1136 (if (bolp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1137 ;; Don't include final newline unless the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1138 ;; start tag is the first thing on its line.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1139 (setq pos pos-with-space)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1140 (setq pos (1- pos-with-space))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1141 ;; Don't include non-leading space.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1142 (skip-chars-forward " \t"))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1143 (setq result (id-select-set-region (point) pos))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1144 (throw 'done nil))))))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1145 (if (integerp result)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1146 (progn (goto-char result)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1147 (error "(id-select-markup-pair): Add a terminator character for this end tag"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1148 result))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1149
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1150 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1151 ;;; Document selections
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1152 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1153
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1154 (defun id-select-line (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1155 "Return (start . end) of the whole line POS is in, with newline unless at end of buffer."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1156 (setq id-select-previous 'line)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1157 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1158 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1159 (let* ((start (progn (beginning-of-line 1) (point)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1160 (end (progn (forward-line 1) (point))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1161 (id-select-set-region start end))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1162
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1163 (defun id-select-paragraph (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1164 "Return (start . end) of the paragraph at POS."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1165 (setq id-select-previous 'paragraph)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1166 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1167 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1168 (id-select-set-region (progn (backward-paragraph) (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1169 (progn (forward-paragraph) (point)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1170
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1171 (defun id-select-page (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1172 "Return (start . end) of the page preceding POS."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1173 (setq id-select-previous 'page)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1174 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1175 (goto-char pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1176 (id-select-set-region (progn (backward-page) (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1177 (progn (forward-page) (point)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1178
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1179 (defun id-select-buffer (pos)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1180 "Return (start . end) of the buffer at POS."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1181 (setq id-select-previous 'buffer)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1182 (id-select-set-region (point-min) (point-max)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1183
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1184 ;;; ************************************************************************
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1185 ;;; Private variables
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1186 ;;; ************************************************************************
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1187
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1188 (defvar id-select-bigger-alist
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1189 '((char nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1190 (whitespace id-select-whitespace)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1191 (word id-select-word)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1192 (symbol id-select-symbol)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1193 (punctuation nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1194 (string id-select-string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1195 (text nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1196 (comment id-select-comment)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1197 (markup-pair nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1198 (preprocessor-def nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1199 (sexp id-select-sexp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1200 (sexp-start nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1201 (sexp-end nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1202 (sexp-up id-select-sexp-up)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1203 (line id-select-line)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1204 (sentence id-select-sentence)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1205 (brace-def-or-declaration id-select-brace-def-or-declaration)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1206 (indent-def id-select-indent-def)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1207 (paragraph id-select-paragraph)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1208 (page id-select-page)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1209 (buffer id-select-buffer)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1210 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1211 "List of (REGION-TYPE-SYMBOL REGION-SELECTION-FUNCTION) pairs.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1212 Used to go from one thing to a bigger thing. See id-select-bigger-thing.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1213 Nil value for REGION-SELECTION-FUNCTION means that region type is skipped
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1214 over when trying to grow the region and is only used when a selection is made
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1215 with point on a character that triggers that type of selection. Ordering of
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1216 entries is largely irrelevant to any code that uses this list.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1217
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1218
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1219 (defvar id-select-prior-buffer nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1220 (defvar id-select-prior-point nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1221
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1222 (defvar id-select-previous 'char
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1223 "Most recent type of selection. Must be set by all id-select functions.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1224
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1225 (defvar id-select-region (cons 'nil 'nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1226 "Cons cell that contains a region (<beginning> . <end>).
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1227 The function `id-select-set-region' updates and returns it.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1228
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1229 (defvar id-select-old-region (cons 'nil 'nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1230 "Cons cell that contains a region (<beginning> . <end>).")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1231
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1232 (defvar id-select-syntax-alist
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1233 '((?w id-select-word)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1234 (?_ id-select-symbol)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1235 (?\" id-select-string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1236 (?\( id-select-sexp-start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1237 (?\$ id-select-sexp-start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1238 (?' id-select-sexp-start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1239 (?\) id-select-sexp-end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1240 (? id-select-whitespace)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1241 (?< id-select-comment)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1242 (?. id-select-punctuation))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1243 "*List of pairs of the form (SYNTAX-CHAR FUNCTION) used by the function `id-select-syntactical-region'.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1244 Each FUNCTION takes a single position argument and returns a region
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1245 (start . end) delineating the boundaries of the thing at that position.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1246 Ordering of entries is largely irrelevant to any code that uses this list.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1247
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1248
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1249 (provide 'id-select)