annotate lisp/progmodes/delphi.el @ 29499:a293ec8516e0

Update whitespace.el - comment out the :version string, since it seems to have trouble with XEmacs 20.4 (user reported bug). Xemacs doesn't create group if this is present. Bug verified. Not yet determined the problem.
author Rajesh Vaidheeswarran <rv@gnu.org>
date Wed, 07 Jun 2000 19:04:57 +0000
parents c8d739c1aaf0
children 6878c61d1877
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1 ;; delphi.el --- Major mode for editing Delphi source (Object Pascal) in Emacs
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3 ;; Copyright (C) 1998, 1999 Free Software Foundation, Inc.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
5 ;; Author: Ray Blaak <blaak@infomatch.com>
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6 ;; Keywords: languages
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
9
25161
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify it under
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
11 ;; the terms of the GNU General Public License as published by the Free
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
12 ;; Software Foundation; either version 2, or (at your option) any later
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
13 ;; version.
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
14
25161
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
16 ;; WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
17 ;; FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
18 ;; details.
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
19
25161
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
20 ;; You should have received a copy of the GNU General Public License along with
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
21 ;; GNU Emacs; see the file COPYING. If not, write to the Free Software
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
22 ;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
23
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
24 ;;; Commentary:
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
25
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
26 ;; To enter Delphi mode when you find a Delphi source file, one must override
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
27 ;; the auto-mode-alist to associate Delphi with .pas (and .dpr and .dpk)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
28 ;; files. Emacs, by default, will otherwise enter Pascal mode. E.g.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
29 ;;
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
30 ;; (autoload 'delphi-mode "delphi")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
31 ;; (setq auto-mode-alist
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
32 ;; (cons '("\\.\\(pas\\|dpr\\|dpk\\)$" . delphi-mode) auto-mode-alist))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
33
25161
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
34 ;; To get keyword, comment, and string literal coloring, be sure that font-lock
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
35 ;; is running. One can manually do M-x font-lock-mode in a Delphi buffer, or
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
36 ;; one can put in .emacs:
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
37 ;;
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
38 ;; (add-hook 'delphi-mode-hook 'turn-on-font-lock)
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
39
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
40 ;; If font-lock is not loaded by default, you might have to do:
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
41 ;;
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
42 ;; (autoload 'font-lock-mode "font-lock")
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
43 ;; (autoload 'turn-on-font-lock "font-lock")
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
44 ;; (setq font-lock-support-mode 'lazy-lock-mode)
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
45 ;;
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
46 ;; Lazy lock is very necessary for faster screen updates.
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
47
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
48 ;; For good performance, be sure to byte-compile delphi.el, e.g.
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
49 ;;
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
50 ;; M-x byte-compile-file <give the path to delphi.el when prompted>
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
51
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
52 ;; This will generate delphi.elc, which will be loaded instead of delphi.el
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
53 ;; when delphi-mode is autoloaded.
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
54
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
55 ;; When you have entered Delphi mode, you may get more info by pressing
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
56 ;; C-h m.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
57
25161
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
58 ;; This delphi mode implementation is fairly tolerant of syntax errors, relying
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
59 ;; as much as possible on the indentation of the previous statement. This also
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
60 ;; makes it faster and simpler, since there is less searching for properly
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
61 ;; constructed beginnings.
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
62
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
63 ;;; Code:
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
64
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
65 (provide 'delphi)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
66
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
67 (defconst delphi-version
27647
c8d739c1aaf0 Make resourcestring a declaration region, like const and var.
Ray Blaak <blaak@infomatch.com>
parents: 27551
diff changeset
68 (let ((revision "$Revision: 3.3 $"))
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
69 (string-match ": \\([^ ]+\\)" revision)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
70 (match-string 1 revision))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
71 "Version of this delphi mode.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
72 ;;; $Log: delphi.el,v $
27647
c8d739c1aaf0 Make resourcestring a declaration region, like const and var.
Ray Blaak <blaak@infomatch.com>
parents: 27551
diff changeset
73 ;;; Revision 3.3 2000/02/01 14:32:21 fx
c8d739c1aaf0 Make resourcestring a declaration region, like const and var.
Ray Blaak <blaak@infomatch.com>
parents: 27551
diff changeset
74 ;;; (delphi): Add :version to defgroup.
c8d739c1aaf0 Make resourcestring a declaration region, like const and var.
Ray Blaak <blaak@infomatch.com>
parents: 27551
diff changeset
75 ;;;
27551
2dd8115a9f72 (delphi): Add :version to defgroup.
Dave Love <fx@gnu.org>
parents: 25317
diff changeset
76 ;;; Revision 3.2 1999/08/18 05:08:39 blaak
2dd8115a9f72 (delphi): Add :version to defgroup.
Dave Love <fx@gnu.org>
parents: 25317
diff changeset
77 ;;; checked in with -k by blaak at 1999/08/18 05:08:39
2dd8115a9f72 (delphi): Add :version to defgroup.
Dave Love <fx@gnu.org>
parents: 25317
diff changeset
78 ;;;
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
79 ;;; Revision 3.2 1999/08/04 05:09:19 blaak
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
80 ;;; Consider assembly sections as blocks, to indent them better.
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
81 ;;;
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
82 ;;; Revision 3.1 1999/08/04 04:45:47 blaak
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
83 ;;; Make auto-indent on newline optional
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
84 ;;;
25161
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
85 ;;; Revision 3.0 1999/08/03 04:59:02 blaak
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
86 ;;; Re-release as an official Emacs language mode
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
87 ;;;
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
88
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
89 (eval-and-compile
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
90 ;; Allow execution on pre Emacs 20 versions.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
91 (or (fboundp 'when)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
92 (defmacro when (test &rest body)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
93 `(if ,test (progn ,@body))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
94 (or (fboundp 'unless)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
95 (defmacro unless (test &rest body)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
96 `(if (not ,test) (progn ,@body))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
97 (or (fboundp 'defgroup)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
98 (defmacro defgroup (group val docs &rest group-attributes)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
99 `(defvar ,group ,val ,docs)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
100 (or (fboundp 'defcustom)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
101 (defmacro defcustom (val-name val docs &rest custom-attributes)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
102 `(defvar ,val-name ,val ,docs)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
103 (or (fboundp 'cadr)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
104 (defmacro cadr (list) `(car (cdr ,list))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
105 (or (fboundp 'cddr)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
106 (defmacro cddr (list) `(cdr (cdr ,list))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
107 (or (fboundp 'with-current-buffer)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
108 (defmacro with-current-buffer (buf &rest forms)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
109 `(save-excursion (set-buffer ,buf) ,@forms)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
110 )
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
111
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
112 (defgroup delphi nil
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
113 "Major mode for editing Delphi source in Emacs"
27551
2dd8115a9f72 (delphi): Add :version to defgroup.
Dave Love <fx@gnu.org>
parents: 25317
diff changeset
114 :version "21.1"
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
115 :group 'languages)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
116
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
117 (defconst delphi-debug nil
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
118 "True if in debug mode.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
119
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
120 (defcustom delphi-search-path "."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
121 "*Directories to search when finding external units. It is a list of
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
122 directory strings. If only a single directory, it can be a single
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
123 string instead of a list. If a directory ends in \"...\" then that
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
124 directory is recursively searched."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
125 :type 'string
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
126 :group 'delphi)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
127
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
128 (defcustom delphi-indent-level 3
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
129 "*Indentation of Delphi statements with respect to containing block. E.g.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
130
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
131 begin
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
132 // This is an indent of 3.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
133 end;"
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
134 :type 'integer
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
135 :group 'delphi)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
136
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
137 (defcustom delphi-compound-block-indent 0
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
138 "*Extra indentation for blocks in compound statements. E.g.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
139
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
140 // block indent = 0 vs // block indent = 2
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
141 if b then if b then
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
142 begin begin
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
143 end else begin end
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
144 end; else
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
145 begin
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
146 end;"
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
147 :type 'integer
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
148 :group 'delphi)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
149
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
150 (defcustom delphi-case-label-indent delphi-indent-level
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
151 "*Extra indentation for case statement labels. E.g.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
152
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
153 // case indent = 0 vs // case indent = 3
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
154 case value of case value of
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
155 v1: process_v1; v1: process_v1;
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
156 v2: process_v2; v2: process_v2;
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
157 else else
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
158 process_else; process_else;
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
159 end; end;"
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
160 :type 'integer
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
161 :group 'delphi)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
162
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
163 (defcustom delphi-verbose t ; nil
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
164 "*If true then delphi token processing progress is reported to the user."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
165 :type 'boolean
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
166 :group 'delphi)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
167
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
168 (defcustom delphi-tab-always-indents t
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
169 "*Non-nil means TAB in Delphi mode should always reindent the current line,
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
170 regardless of where in the line point is when the TAB command is used."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
171 :type 'boolean
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
172 :group 'delphi)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
173
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
174 (defcustom delphi-newline-always-indents t
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
175 "*Non-nil means NEWLINE in Delphi mode should always reindent the current
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
176 line, insert a blank line and move to the default indent column of the blank
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
177 line. If nil, then no indentation occurs, and NEWLINE does the usual
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
178 behaviour. This is useful when one needs to do customized indentation that
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
179 differs from the default."
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
180 :type 'boolean
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
181 :group 'delphi)
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
182
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
183 (defcustom delphi-comment-face 'font-lock-comment-face
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
184 "*Face used to color delphi comments."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
185 :type 'facep
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
186 :group 'delphi)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
187
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
188 (defcustom delphi-string-face 'font-lock-string-face
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
189 "*Face used to color delphi strings."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
190 :type 'facep
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
191 :group 'delphi)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
192
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
193 (defcustom delphi-keyword-face 'font-lock-keyword-face
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
194 "*Face used to color delphi keywords."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
195 :type 'facep
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
196 :group 'delphi)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
197
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
198 (defcustom delphi-other-face nil
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
199 "*Face used to color everything else."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
200 :type 'facep
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
201 :group 'delphi)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
202
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
203 (defconst delphi-directives
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
204 '(absolute abstract assembler automated cdecl default dispid dynamic
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
205 export external far forward index inline message name near nodefault
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
206 overload override pascal private protected public published read readonly
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
207 register reintroduce resident resourcestring safecall stdcall stored
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
208 virtual write writeonly)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
209 "Delphi4 directives.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
210
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
211 (defconst delphi-keywords
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
212 (append
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
213 '(;; Keywords.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
214 and array as asm at begin case class const constructor contains
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
215 destructor dispinterface div do downto else end except exports
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
216 file finalization finally for function goto if implementation implements
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
217 in inherited initialization interface is label library mod nil not
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
218 of object on or out package packed procedure program property
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
219 raise record repeat requires result self set shl shr then threadvar
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
220 to try type unit uses until var while with xor
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
221
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
222 ;; These routines should be keywords, if Borland had the balls.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
223 break exit)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
224
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
225 ;; We want directives to look like keywords.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
226 delphi-directives)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
227 "Delphi4 keywords.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
228
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
229 (defconst delphi-previous-terminators `(semicolon comma)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
230 "Expression/statement terminators that denote a previous expression.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
231
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
232 (defconst delphi-comments
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
233 '(comment-single-line comment-multi-line-1 comment-multi-line-2)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
234 "Tokens that represent comments.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
235
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
236 (defconst delphi-strings
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
237 '(string double-quoted-string)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
238 "Tokens that represent string literals.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
239
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
240 (defconst delphi-whitespace `(space newline ,@delphi-comments)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
241 "Tokens that are considered whitespace.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
242
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
243 (defconst delphi-routine-statements
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
244 '(procedure function constructor destructor property)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
245 "Marks the start of a routine, or routine-ish looking expression.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
246
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
247 (defconst delphi-body-expr-statements '(if while for on)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
248 "Statements that have either a single statement or a block as a body and also
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
249 are followed by an expression.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
250
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
251 (defconst delphi-expr-statements `(case ,@delphi-body-expr-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
252 "Expression statements contain expressions after their keyword.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
253
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
254 (defconst delphi-body-statements `(else ,@delphi-body-expr-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
255 "Statements that have either a single statement or a block as a body.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
256
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
257 (defconst delphi-expr-delimiters '(then do of)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
258 "Expression delimiter tokens.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
259
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
260 (defconst delphi-binary-ops
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
261 '(plus minus equals not-equals times divides div mod and or xor)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
262 "Delphi binary operations.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
263
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
264 (defconst delphi-visibilities '(public private protected published automated)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
265 "Class visibilities.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
266
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
267 (defconst delphi-block-statements
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
268 '(begin try case repeat initialization finalization asm)
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
269 "Statements that contain multiple substatements.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
270
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
271 (defconst delphi-mid-block-statements
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
272 `(except finally ,@delphi-visibilities)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
273 "Statements that mark mid sections of the enclosing block.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
274
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
275 (defconst delphi-end-block-statements `(end until)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
276 "Statements that end block sections.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
277
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
278 (defconst delphi-match-block-statements
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
279 `(,@delphi-end-block-statements ,@delphi-mid-block-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
280 "Statements that match the indentation of the parent block.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
281
27647
c8d739c1aaf0 Make resourcestring a declaration region, like const and var.
Ray Blaak <blaak@infomatch.com>
parents: 27551
diff changeset
282 (defconst delphi-decl-sections '(type const var label resourcestring)
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
283 "Denotes the start of a declaration section.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
284
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
285 (defconst delphi-class-types '(class object)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
286 "Class types.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
287
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
288 (defconst delphi-composite-types `(,@delphi-class-types record)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
289 "Types that contain declarations within them.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
290
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
291 (defconst delphi-unit-sections
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
292 '(interface implementation program library package)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
293 "Unit sections within which the indent is 0.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
294
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
295 (defconst delphi-use-clauses `(uses requires exports contains)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
296 "Statements that refer to foreign symbols.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
297
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
298 (defconst delphi-unit-statements
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
299 `(,@delphi-use-clauses ,@delphi-unit-sections initialization finalization)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
300 "Statements indented at level 0.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
301
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
302 (defconst delphi-decl-delimiters
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
303 `(,@delphi-decl-sections ,@delphi-unit-statements
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
304 ,@delphi-routine-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
305 "Statements that a declaration statement should align with.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
306
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
307 (defconst delphi-decl-matchers
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
308 `(begin ,@delphi-decl-sections)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
309 "Statements that should match to declaration statement indentation.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
310
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
311 (defconst delphi-enclosing-statements
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
312 `(,@delphi-block-statements ,@delphi-mid-block-statements
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
313 ,@delphi-decl-sections ,@delphi-use-clauses ,@delphi-routine-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
314 "Delimits an enclosing statement.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
315
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
316 (defconst delphi-previous-statements
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
317 `(,@delphi-unit-statements ,@delphi-routine-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
318 "Delimits a previous statement.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
319
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
320 (defconst delphi-previous-enclosing-statements
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
321 `(,@delphi-block-statements ,@delphi-mid-block-statements
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
322 ,@delphi-decl-sections)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
323 "Delimits a previous enclosing statement.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
324
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
325 (defconst delphi-begin-enclosing-tokens
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
326 `(,@delphi-block-statements ,@delphi-mid-block-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
327 "Tokens that a begin token indents from.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
328
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
329 (defconst delphi-begin-previous-tokens
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
330 `(,@delphi-decl-sections ,@delphi-routine-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
331 "Tokens that a begin token aligns with, but only if not part of a nested
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
332 routine.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
333
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
334 (defconst delphi-space-chars "\000-\011\013- ") ; all except \n
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
335 (defconst delphi-non-space-chars (concat "^" delphi-space-chars))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
336 (defconst delphi-spaces-re (concat "[" delphi-space-chars "]*"))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
337 (defconst delphi-leading-spaces-re (concat "^" delphi-spaces-re))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
338 (defconst delphi-word-chars "a-zA-Z0-9_")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
339
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
340 (defmacro delphi-save-match-data (&rest forms)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
341 ;; Executes the forms such that the current match data is preserved, so as
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
342 ;; not to disturb any existing search results.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
343 `(let ((data (match-data)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
344 (unwind-protect
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
345 (progn ,@forms)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
346 (set-match-data data))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
347
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
348 (defmacro delphi-save-excursion (&rest forms)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
349 ;; Executes the forms such that any movements have no effect, including
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
350 ;; searches.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
351 `(save-excursion
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
352 (delphi-save-match-data
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
353 (let ((inhibit-point-motion-hooks t)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
354 (deactivate-mark nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
355 (progn ,@forms)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
356
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
357 (defmacro delphi-save-state (&rest forms)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
358 ;; Executes the forms such that any buffer modifications do not have any side
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
359 ;; effects beyond the buffer's actual content changes.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
360 `(let ((delphi-ignore-changes t)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
361 (old-supersession-threat
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
362 (symbol-function 'ask-user-about-supersession-threat))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
363 (buffer-read-only nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
364 (inhibit-read-only t)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
365 (buffer-undo-list t)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
366 (before-change-functions nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
367 (after-change-functions nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
368 (modified (buffer-modified-p)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
369 ;; Disable any queries about editing obsolete files.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
370 (fset 'ask-user-about-supersession-threat (lambda (fn)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
371 (unwind-protect
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
372 (progn ,@forms)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
373 (set-buffer-modified-p modified)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
374 (fset 'ask-user-about-supersession-threat old-supersession-threat))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
375
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
376 (defsubst delphi-is (element in-set)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
377 ;; If the element is in the set, the element cdr is returned, otherwise nil.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
378 (memq element in-set))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
379
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
380 (defun delphi-string-of (start end)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
381 ;; Returns the buffer string from start to end.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
382 (buffer-substring-no-properties start end))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
383
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
384 (defun delphi-looking-at-string (p s)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
385 ;; True if point p marks the start of string s. s is not a regular
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
386 ;; expression.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
387 (let ((limit (+ p (length s))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
388 (and (<= limit (point-max))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
389 (string= s (delphi-string-of p limit)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
390
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
391 (defun delphi-token-of (kind start end)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
392 ;; Constructs a token from a kind symbol and its start/end points.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
393 `[,kind ,start ,end])
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
394
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
395 (defsubst delphi-token-kind (token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
396 ;; Returns the kind symbol of the token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
397 (if token (aref token 0) nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
398
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
399 (defun delphi-set-token-kind (token to-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
400 ;; Sets the kind symbol of the token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
401 (if token (aset token 0 to-kind)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
402
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
403 (defsubst delphi-token-start (token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
404 ;; Returns the start point of the token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
405 (if token (aref token 1) (point-min)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
406
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
407 (defsubst delphi-token-end (token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
408 ;; Returns the end point of the token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
409 (if token (aref token 2) (point-min)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
410
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
411 (defun delphi-set-token-start (token start)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
412 ;; Sets the start point of the token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
413 (if token (aset token 1 start)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
414
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
415 (defun delphi-set-token-end (token end)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
416 ;; Sets the end point of the token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
417 (if token (aset token 2 end)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
418
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
419 (defun delphi-token-string (token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
420 ;; Returns the string image of the token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
421 (if token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
422 (delphi-string-of (delphi-token-start token) (delphi-token-end token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
423 ""))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
424
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
425 (defun delphi-in-token (p token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
426 ;; Returns true if the point p is within the token's start/end points.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
427 (and (<= (delphi-token-start token) p) (< p (delphi-token-end token))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
428
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
429 (defun delphi-column-of (p)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
430 ;; Returns the column of the point p.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
431 (save-excursion (goto-char p) (current-column)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
432
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
433 (defun delphi-face-of (token-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
434 ;; Returns the face property appropriate for the token kind.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
435 (cond ((delphi-is token-kind delphi-comments) delphi-comment-face)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
436 ((delphi-is token-kind delphi-strings) delphi-string-face)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
437 ((delphi-is token-kind delphi-keywords) delphi-keyword-face)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
438 (delphi-other-face)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
439
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
440 (defvar delphi-progress-last-reported-point nil
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
441 "The last point at which progress was reported.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
442
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
443 (defconst delphi-parsing-progress-step 16384
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
444 "Number of chars to process before the next parsing progress report.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
445 (defconst delphi-scanning-progress-step 2048
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
446 "Number of chars to process before the next scanning progress report.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
447 (defconst delphi-fontifying-progress-step delphi-scanning-progress-step
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
448 "Number of chars to process before the next fontification progress report.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
449
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
450 (defun delphi-progress-start ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
451 ;; Initializes progress reporting.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
452 (setq delphi-progress-last-reported-point nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
453
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
454 (defun delphi-progress-done (&rest msgs)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
455 ;; Finalizes progress reporting.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
456 (setq delphi-progress-last-reported-point nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
457 (when delphi-verbose
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
458 (if (null msgs)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
459 (message "")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
460 (apply #'message msgs))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
461
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
462 (defun delphi-step-progress (p desc step-size)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
463 ;; If enough distance has elapsed since the last reported point, then report
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
464 ;; the current progress to the user.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
465 (cond ((null delphi-progress-last-reported-point)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
466 ;; This is the first progress step.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
467 (setq delphi-progress-last-reported-point p))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
468
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
469 ((and delphi-verbose
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
470 (>= (abs (- p delphi-progress-last-reported-point)) step-size))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
471 ;; Report the percentage complete.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
472 (setq delphi-progress-last-reported-point p)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
473 (message "%s %s ... %d%%"
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
474 desc (buffer-name) (/ (* 100 p) (point-max))))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
475
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
476 (defun delphi-next-line-start (&optional from-point)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
477 ;; Returns the first point of the next line.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
478 (let ((curr-point (point))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
479 (next nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
480 (if from-point (goto-char from-point))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
481 (end-of-line)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
482 (setq next (min (1+ (point)) (point-max)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
483 (goto-char curr-point)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
484 next))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
485
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
486 (defun delphi-set-text-properties (from to properties)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
487 ;; Like `set-text-properties', except we do not consider this to be a buffer
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
488 ;; modification.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
489 (delphi-save-state
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
490 (set-text-properties from to properties)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
491
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
492 (defun delphi-literal-kind (p)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
493 ;; Returns the literal kind the point p is in (or nil if not in a literal).
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
494 (if (and (<= (point-min) p) (<= p (point-max)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
495 (get-text-property p 'token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
496
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
497 (defun delphi-literal-start-pattern (literal-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
498 ;; Returns the start pattern of the literal kind.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
499 (cdr (assoc literal-kind
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
500 '((comment-single-line . "//")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
501 (comment-multi-line-1 . "{")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
502 (comment-multi-line-2 . "(*")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
503 (string . "'")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
504 (double-quoted-string . "\"")))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
505
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
506 (defun delphi-literal-end-pattern (literal-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
507 ;; Returns the end pattern of the literal kind.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
508 (cdr (assoc literal-kind
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
509 '((comment-single-line . "\n")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
510 (comment-multi-line-1 . "}")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
511 (comment-multi-line-2 . "*)")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
512 (string . "'")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
513 (double-quoted-string . "\"")))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
514
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
515 (defun delphi-literal-stop-pattern (literal-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
516 ;; Returns the pattern that delimits end of the search for the literal kind.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
517 ;; These are regular expressions.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
518 (cdr (assoc literal-kind
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
519 '((comment-single-line . "\n")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
520 (comment-multi-line-1 . "}")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
521 (comment-multi-line-2 . "\\*)")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
522 ;; Strings cannot span lines.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
523 (string . "['\n]")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
524 (double-quoted-string . "[\"\n]")))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
525
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
526 (defun delphi-is-literal-start (p)
25161
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
527 ;; True if the point p is at the start point of a (completed) literal.
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
528 (let* ((kind (delphi-literal-kind p))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
529 (pattern (delphi-literal-start-pattern kind)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
530 (or (null kind) ; Non-literals are considered as start points.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
531 (delphi-looking-at-string p pattern))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
532
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
533 (defun delphi-is-literal-end (p)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
534 ;; True if the point p is at the end point of a (completed) literal.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
535 (let* ((kind (delphi-literal-kind (1- p)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
536 (pattern (delphi-literal-end-pattern kind)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
537 (or (null kind) ; Non-literals are considered as end points.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
538
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
539 (and (delphi-looking-at-string (- p (length pattern)) pattern)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
540 (or (not (delphi-is kind delphi-strings))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
541 ;; Special case: string delimiters are start/end ambiguous.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
542 ;; We have an end only if there is some string content (at
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
543 ;; least a starting delimiter).
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
544 (not (delphi-is-literal-end (1- p)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
545
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
546 ;; Special case: strings cannot span lines.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
547 (and (delphi-is kind delphi-strings) (eq ?\n (char-after (1- p)))))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
548
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
549 (defun delphi-is-stable-literal (p)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
550 ;; True if the point p marks a stable point. That is, a point outside of a
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
551 ;; literal region, inside of a literal region, or adjacent to completed
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
552 ;; literal regions.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
553 (let ((at-start (delphi-is-literal-start p))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
554 (at-end (delphi-is-literal-end p)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
555 (or (>= p (point-max))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
556 (and at-start at-end)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
557 (and (not at-start) (not at-end)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
558 (eq (delphi-literal-kind (1- p)) (delphi-literal-kind p))))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
559
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
560 (defun delphi-complete-literal (literal-kind limit)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
561 ;; Continues the search for a literal's true end point and returns the
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
562 ;; point past the end pattern (if found) or the limit (if not found).
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
563 (let ((pattern (delphi-literal-stop-pattern literal-kind)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
564 (if (not (stringp pattern))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
565 (error "Invalid literal kind %S" literal-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
566 ;; Search up to the limit.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
567 (re-search-forward pattern limit 'goto-limit-on-fail)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
568 (point))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
569
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
570 (defun delphi-literal-text-properties (kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
571 ;; Creates a list of text properties for the literal kind.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
572 (if (and (boundp 'font-lock-mode)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
573 font-lock-mode)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
574 (list 'token kind 'face (delphi-face-of kind) 'lazy-lock t)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
575 (list 'token kind)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
576
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
577 (defun delphi-parse-next-literal (limit)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
578 ;; Searches for the next literal region (i.e. comment or string) and sets the
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
579 ;; the point to its end (or the limit, if not found). The literal region is
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
580 ;; marked as such with a text property, to speed up tokenizing during face
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
581 ;; coloring and indentation scanning.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
582 (let ((search-start (point)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
583 (cond ((not (delphi-is-literal-end search-start))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
584 ;; We are completing an incomplete literal.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
585 (let ((kind (delphi-literal-kind (1- search-start))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
586 (delphi-complete-literal kind limit)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
587 (delphi-set-text-properties
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
588 search-start (point) (delphi-literal-text-properties kind))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
589
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
590 ((re-search-forward
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
591 "\\(//\\)\\|\\({\\)\\|\\((\\*\\)\\|\\('\\)\\|\\(\"\\)"
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
592 limit 'goto-limit-on-fail)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
593 ;; We found the start of a new literal. Find its end and mark it.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
594 (let ((kind (cond ((match-beginning 1) 'comment-single-line)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
595 ((match-beginning 2) 'comment-multi-line-1)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
596 ((match-beginning 3) 'comment-multi-line-2)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
597 ((match-beginning 4) 'string)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
598 ((match-beginning 5) 'double-quoted-string)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
599 (start (match-beginning 0)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
600 (delphi-set-text-properties search-start start nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
601 (delphi-complete-literal kind limit)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
602 (delphi-set-text-properties
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
603 start (point) (delphi-literal-text-properties kind))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
604
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
605 ;; Nothing found. Mark it as a non-literal.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
606 ((delphi-set-text-properties search-start limit nil)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
607 (delphi-step-progress (point) "Parsing" delphi-parsing-progress-step)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
608
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
609 (defun delphi-literal-token-at (p)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
610 ;; Returns the literal token surrounding the point p, or nil if none.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
611 (let ((kind (delphi-literal-kind p)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
612 (when kind
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
613 (let ((start (previous-single-property-change (1+ p) 'token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
614 (end (next-single-property-change p 'token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
615 (delphi-token-of kind (or start (point-min)) (or end (point-max)))))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
616
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
617 (defun delphi-point-token-at (p kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
618 ;; Returns the single character token at the point p.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
619 (delphi-token-of kind p (1+ p)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
620
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
621 (defsubst delphi-char-token-at (p char kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
622 ;; Returns the token at the point p that describes the specified character.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
623 ;; If not actually over such a character, nil is returned.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
624 (when (eq char (char-after p))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
625 (delphi-token-of kind p (1+ p))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
626
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
627 (defun delphi-charset-token-at (p charset kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
628 ;; Returns the token surrounding point p that contains only members of the
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
629 ;; character set.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
630 (let ((currp (point))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
631 (end nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
632 (start nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
633 (token nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
634 (goto-char p)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
635 (when (> (skip-chars-forward charset) 0)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
636 (setq end (point))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
637 (goto-char (1+ p))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
638 (skip-chars-backward charset)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
639 (setq token (delphi-token-of kind (point) end)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
640 (goto-char currp)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
641 token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
642
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
643 (defun delphi-space-token-at (p)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
644 ;; If point p is surrounded by space characters, then return the token of the
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
645 ;; contiguous spaces.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
646 (delphi-charset-token-at p delphi-space-chars 'space))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
647
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
648 (defun delphi-word-token-at (p)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
649 ;; If point p is over a word (i.e. identifier characters), then return a word
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
650 ;; token. If the word is actually a keyword, then return the keyword token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
651 (let ((word (delphi-charset-token-at p delphi-word-chars 'word)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
652 (when word
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
653 (let* ((word-image (downcase (delphi-token-string word)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
654 (keyword (intern-soft word-image)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
655 (when (and (or keyword (string= "nil" word-image))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
656 (delphi-is keyword delphi-keywords))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
657 (delphi-set-token-kind word keyword))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
658 word))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
659
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
660 (defun delphi-explicit-token-at (p token-string kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
661 ;; If point p is anywhere in the token string then returns the resulting
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
662 ;; token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
663 (let ((token (delphi-charset-token-at p token-string kind)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
664 (when (and token (string= token-string (delphi-token-string token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
665 token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
666
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
667 (defun delphi-token-at (p)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
668 ;; Returns the token from parsing text at point p.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
669 (when (and (<= (point-min) p) (<= p (point-max)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
670 (cond ((delphi-literal-token-at p))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
671
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
672 ((delphi-space-token-at p))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
673
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
674 ((delphi-word-token-at p))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
675
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
676 ((delphi-char-token-at p ?\( 'open-group))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
677 ((delphi-char-token-at p ?\) 'close-group))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
678 ((delphi-char-token-at p ?\[ 'open-group))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
679 ((delphi-char-token-at p ?\] 'close-group))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
680 ((delphi-char-token-at p ?\n 'newline))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
681 ((delphi-char-token-at p ?\; 'semicolon))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
682 ((delphi-char-token-at p ?. 'dot))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
683 ((delphi-char-token-at p ?, 'comma))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
684 ((delphi-char-token-at p ?= 'equals))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
685 ((delphi-char-token-at p ?+ 'plus))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
686 ((delphi-char-token-at p ?- 'minus))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
687 ((delphi-char-token-at p ?* 'times))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
688 ((delphi-char-token-at p ?/ 'divides))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
689 ((delphi-char-token-at p ?: 'colon))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
690
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
691 ((delphi-explicit-token-at p "<>" 'not-equals))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
692
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
693 ((delphi-point-token-at p 'punctuation)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
694
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
695 (defun delphi-current-token ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
696 ;; Returns the delphi source token under the current point.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
697 (delphi-token-at (point)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
698
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
699 (defun delphi-next-token (token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
700 ;; Returns the token after the specified token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
701 (when token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
702 (let ((next (delphi-token-at (delphi-token-end token))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
703 (if next
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
704 (delphi-step-progress (delphi-token-start next) "Scanning"
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
705 delphi-scanning-progress-step))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
706 next)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
707
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
708 (defun delphi-previous-token (token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
709 ;; Returns the token before the specified token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
710 (when token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
711 (let ((previous (delphi-token-at (1- (delphi-token-start token)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
712 (if previous
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
713 (delphi-step-progress (delphi-token-start previous) "Scanning"
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
714 delphi-scanning-progress-step))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
715 previous)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
716
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
717 (defun delphi-next-visible-token (token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
718 ;; Returns the first non-space token after the specified token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
719 (let (next-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
720 (while (progn
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
721 (setq next-token (delphi-next-token token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
722 (delphi-is (delphi-token-kind next-token) '(space newline))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
723 next-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
724
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
725 (defun delphi-parse-region (from to)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
726 ;; Parses the literal tokens in the region. The point is set to "to".
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
727 (save-restriction
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
728 (widen)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
729 (goto-char from)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
730 (while (< (point) to)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
731 (delphi-parse-next-literal to))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
732
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
733 (defun delphi-parse-region-until-stable (from to)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
734 ;; Parses at least the literal tokens in the region. After that, parsing
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
735 ;; continues as long as obsolete literal regions are encountered. The point
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
736 ;; is set to the encountered stable point.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
737 (save-restriction
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
738 (widen)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
739 (delphi-parse-region from to)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
740 (while (not (delphi-is-stable-literal (point)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
741 (delphi-parse-next-literal (point-max)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
742
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
743 (defun delphi-fontify-region (from to &optional verbose)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
744 ;; Colors the text in the region according to Delphi rules.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
745 (delphi-save-excursion
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
746 (delphi-save-state
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
747 (let ((p from)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
748 (delphi-verbose verbose)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
749 (token nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
750 (delphi-progress-start)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
751 (while (< p to)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
752 ;; Color the token and move past it.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
753 (setq token (delphi-token-at p))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
754 (add-text-properties
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
755 (delphi-token-start token) (delphi-token-end token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
756 (list 'face (delphi-face-of (delphi-token-kind token)) 'lazy-lock t))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
757 (setq p (delphi-token-end token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
758 (delphi-step-progress p "Fontifying" delphi-fontifying-progress-step))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
759 (delphi-progress-done)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
760
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
761 (defconst delphi-ignore-changes t
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
762 "Internal flag to control if the delphi-mode responds to buffer changes.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
763 Defaults to t in case the delphi-after-change function is called on a
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
764 non-delphi buffer. Set to nil in a delphi buffer. To override, just do:
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
765 (let ((delphi-ignore-changes t)) ...)")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
766
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
767 (defun delphi-after-change (change-start change-end old-length)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
768 ;; Called when the buffer has changed. Reparses the changed region.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
769 (unless delphi-ignore-changes
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
770 (let ((delphi-ignore-changes t)) ; Prevent recursive calls.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
771 (delphi-save-excursion
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
772 (delphi-progress-start)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
773 ;; Reparse at least from the token previous to the change to the end of
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
774 ;; line after the change.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
775 (delphi-parse-region-until-stable
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
776 (delphi-token-start (delphi-token-at (1- change-start)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
777 (progn (goto-char change-end) (end-of-line) (point)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
778 (delphi-progress-done)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
779
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
780 (defun delphi-group-start (from-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
781 ;; Returns the token that denotes the start of the ()/[] group.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
782 (let ((token (delphi-previous-token from-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
783 (token-kind nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
784 (catch 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
785 (while token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
786 (setq token-kind (delphi-token-kind token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
787 (cond
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
788 ;; Skip over nested groups.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
789 ((eq 'close-group token-kind) (setq token (delphi-group-start token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
790 ((eq 'open-group token-kind) (throw 'done token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
791 (setq token (delphi-previous-token token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
792 ;; Start not found.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
793 nil)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
794
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
795 (defun delphi-group-end (from-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
796 ;; Returns the token that denotes the end of the ()/[] group.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
797 (let ((token (delphi-next-token from-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
798 (token-kind nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
799 (catch 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
800 (while token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
801 (setq token-kind (delphi-token-kind token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
802 (cond
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
803 ;; Skip over nested groups.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
804 ((eq 'open-group token-kind) (setq token (delphi-group-end token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
805 ((eq 'close-group token-kind) (throw 'done token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
806 (setq token (delphi-next-token token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
807 ;; end not found.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
808 nil)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
809
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
810 (defun delphi-indent-of (token &optional offset)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
811 ;; Returns the start column of the token, plus any offset.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
812 (let ((indent (+ (delphi-column-of (delphi-token-start token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
813 (if offset offset 0))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
814 (when delphi-debug
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
815 (delphi-debug-log
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
816 (concat "\n Indent of: %S %S"
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
817 "\n column: %d indent: %d offset: %d")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
818 token (delphi-token-string token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
819 (delphi-column-of (delphi-token-start token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
820 indent (if offset offset 0)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
821 indent))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
822
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
823 (defun delphi-line-indent-of (from-token &optional offset &rest terminators)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
824 ;; Returns the column of first non-space character on the token's line, plus
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
825 ;; any offset. We also stop if one of the terminators or an open ( or [ is
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
826 ;; encountered.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
827 (let ((token (delphi-previous-token from-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
828 (last-token from-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
829 (kind nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
830 (catch 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
831 (while token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
832 (setq kind (delphi-token-kind token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
833 (cond
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
834 ;; Skip over ()/[] groups.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
835 ((eq 'close-group kind) (setq token (delphi-group-start token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
836
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
837 ;; Stop at the beginning of the line or an open group.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
838 ((delphi-is kind '(newline open-group)) (throw 'done nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
839
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
840 ;; Stop at one of the specified terminators.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
841 ((delphi-is kind terminators) (throw 'done nil)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
842 (unless (delphi-is kind delphi-whitespace) (setq last-token token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
843 (setq token (delphi-previous-token token))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
844 (delphi-indent-of last-token offset)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
845
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
846 (defun delphi-stmt-line-indent-of (from-token &optional offset)
25161
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
847 ;; Like `delphi-line-indent-of' except is also stops on a use clause, and
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
848 ;; colons that precede statements (i.e. case labels).
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
849 (let ((token (delphi-previous-token from-token))
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
850 (last-token from-token)
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
851 (kind nil))
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
852 (catch 'done
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
853 (while token
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
854 (setq kind (delphi-token-kind token))
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
855 (cond
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
856 ((and (eq 'colon kind)
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
857 (delphi-is (delphi-token-kind last-token)
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
858 `(,@delphi-block-statements
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
859 ,@delphi-expr-statements)))
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
860 ;; We hit a label followed by a statement. Indent to the statement.
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
861 (throw 'done nil))
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
862
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
863 ;; Skip over ()/[] groups.
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
864 ((eq 'close-group kind) (setq token (delphi-group-start token)))
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
865
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
866 ((delphi-is kind `(newline open-group ,@delphi-use-clauses))
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
867 ;; Stop at the beginning of the line, an open group, or a use clause
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
868 (throw 'done nil)))
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
869 (unless (delphi-is kind delphi-whitespace) (setq last-token token))
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
870 (setq token (delphi-previous-token token))))
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
871 (delphi-indent-of last-token offset)))
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
872
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
873 (defun delphi-open-group-indent (token last-token &optional offset)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
874 ;; Returns the indent relative to an unmatched ( or [.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
875 (when (eq 'open-group (delphi-token-kind token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
876 (if last-token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
877 (delphi-indent-of last-token offset)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
878 ;; There is nothing following the ( or [. Indent from its line.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
879 (delphi-stmt-line-indent-of token delphi-indent-level))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
880
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
881 (defun delphi-composite-type-start (token last-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
882 ;; Returns true (actually the last-token) if the pair equals (= class) or (=
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
883 ;; record), and nil otherwise.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
884 (if (and (eq 'equals (delphi-token-kind token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
885 (delphi-is (delphi-token-kind last-token) delphi-composite-types))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
886 last-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
887
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
888 (defun delphi-is-simple-class-type (at-token limit-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
889 ;; True if at-token is the start of a simple class type. E.g.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
890 ;; class of TClass;
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
891 ;; class (TBaseClass);
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
892 ;; class;
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
893 (when (delphi-is (delphi-token-kind at-token) delphi-class-types)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
894 (catch 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
895 ;; Scan until the semi colon.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
896 (let ((token (delphi-next-token at-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
897 (token-kind nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
898 (limit (delphi-token-start limit-token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
899 (while (and token (<= (delphi-token-start token) limit))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
900 (setq token-kind (delphi-token-kind token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
901 (cond
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
902 ;; A semicolon delimits the search.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
903 ((eq 'semicolon token-kind) (throw 'done token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
904
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
905 ;; Skip over the inheritance list.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
906 ((eq 'open-group token-kind) (setq token (delphi-group-end token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
907
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
908 ;; Only allow "of" and whitespace, and an identifier
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
909 ((delphi-is token-kind `(of word ,@delphi-whitespace)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
910
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
911 ;; Otherwise we are not in a simple class declaration.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
912 ((throw 'done nil)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
913 (setq token (delphi-next-token token)))))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
914
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
915 (defun delphi-block-start (from-token &optional stop-on-class)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
916 ;; Returns the token that denotes the start of the block.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
917 (let ((token (delphi-previous-token from-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
918 (last-token nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
919 (token-kind nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
920 (catch 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
921 (while token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
922 (setq token-kind (delphi-token-kind token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
923 (cond
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
924 ;; Skip over nested blocks.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
925 ((delphi-is token-kind delphi-end-block-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
926 (setq token (delphi-block-start token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
927
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
928 ;; Regular block start found.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
929 ((delphi-is token-kind delphi-block-statements) (throw 'done token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
930
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
931 ;; A class/record start also begins a block.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
932 ((delphi-composite-type-start token last-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
933 (throw 'done (if stop-on-class last-token token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
934 )
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
935 (unless (delphi-is token-kind delphi-whitespace)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
936 (setq last-token token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
937 (setq token (delphi-previous-token token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
938 ;; Start not found.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
939 nil)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
940
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
941 (defun delphi-else-start (from-else)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
942 ;; Returns the token of the if or case statement.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
943 (let ((token (delphi-previous-token from-else))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
944 (token-kind nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
945 (semicolon-count 0)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
946 (if-count 0))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
947 (catch 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
948 (while token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
949 (setq token-kind (delphi-token-kind token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
950 (cond
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
951 ;; Skip over nested groups.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
952 ((eq 'close-group token-kind) (setq token (delphi-group-start token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
953
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
954 ;; Skip over any nested blocks.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
955 ((delphi-is token-kind delphi-end-block-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
956 (setq token (delphi-block-start token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
957
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
958 ((eq 'semicolon token-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
959 ;; Semicolon means we are looking for an enclosing if, unless we
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
960 ;; are in a case statement. Keep counts of the semicolons and decide
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
961 ;; later.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
962 (setq semicolon-count (1+ semicolon-count)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
963
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
964 ((and (eq 'if token-kind) (= semicolon-count 0))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
965 ;; We only can match an if when there have been no intervening
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
966 ;; semicolons.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
967 (throw 'done token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
968
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
969 ((eq 'case token-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
970 ;; We have hit a case statement start.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
971 (throw 'done token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
972 (setq token (delphi-previous-token token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
973 ;; No if or case statement found.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
974 nil)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
975
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
976 (defun delphi-comment-content-start (comment)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
977 ;; Returns the point of the first non-space character in the comment.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
978 (let ((kind (delphi-token-kind comment)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
979 (when (delphi-is kind delphi-comments)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
980 (delphi-save-excursion
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
981 (goto-char (+ (delphi-token-start comment)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
982 (length (delphi-literal-start-pattern kind))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
983 (skip-chars-forward delphi-space-chars)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
984 (point)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
985
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
986 (defun delphi-comment-block-start (comment)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
987 ;; Returns the starting comment token of a contiguous // comment block. If
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
988 ;; the comment is multiline (i.e. {...} or (*...*)), the original comment is
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
989 ;; returned.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
990 (if (not (eq 'comment-single-line (delphi-token-kind comment)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
991 comment
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
992 ;; Scan until we run out of // comments.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
993 (let ((prev-comment comment)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
994 (start-comment comment)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
995 (kind nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
996 (while (let ((kind (delphi-token-kind prev-comment)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
997 (cond ((eq kind 'space))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
998 ((eq kind 'comment-single-line)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
999 (setq start-comment prev-comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1000 (t nil)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1001 (setq prev-comment (delphi-previous-token prev-comment)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1002 start-comment)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1003
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1004 (defun delphi-comment-block-end (comment)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1005 ;; Returns the end comment token of a contiguous // comment block. If the
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1006 ;; comment is multiline (i.e. {...} or (*...*)), the original comment is
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1007 ;; returned.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1008 (if (not (eq 'comment-single-line (delphi-token-kind comment)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1009 comment
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1010 ;; Scan until we run out of // comments.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1011 (let ((next-comment comment)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1012 (end-comment comment)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1013 (kind nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1014 (while (let ((kind (delphi-token-kind next-comment)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1015 (cond ((eq kind 'space))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1016 ((eq kind 'comment-single-line)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1017 (setq end-comment next-comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1018 (t nil)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1019 (setq next-comment (delphi-next-token next-comment)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1020 end-comment)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1021
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1022 (defun delphi-on-first-comment-line (comment)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1023 ;; Returns true if the current point is on the first line of the comment.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1024 (save-excursion
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1025 (let ((comment-start (delphi-token-start comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1026 (current-point (point)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1027 (goto-char comment-start)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1028 (end-of-line)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1029 (and (<= comment-start current-point) (<= current-point (point))))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1030
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1031 (defun delphi-comment-indent-of (comment)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1032 ;; Returns the correct indentation for the comment.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1033 (let ((start-comment (delphi-comment-block-start comment)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1034 (if (and (eq start-comment comment)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1035 (delphi-on-first-comment-line comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1036 ;; Indent as a statement.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1037 (delphi-enclosing-indent-of comment)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1038 (save-excursion
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1039 (let ((kind (delphi-token-kind comment)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1040 (beginning-of-line)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1041 (cond ((eq 'comment-single-line kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1042 ;; Indent to the first comment in the // block.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1043 (delphi-indent-of start-comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1044
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1045 ((looking-at (concat delphi-leading-spaces-re
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1046 (delphi-literal-stop-pattern kind)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1047 ;; Indent multi-line comment terminators to the comment start.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1048 (delphi-indent-of comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1049
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1050 ;; Indent according to the comment's content start.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1051 ((delphi-column-of (delphi-comment-content-start comment)))))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1052 ))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1053
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1054 (defun delphi-is-use-clause-end (at-token last-token last-colon from-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1055 ;; True if we are after the end of a uses type clause.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1056 (when (and last-token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1057 (not last-colon)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1058 (eq 'comma (delphi-token-kind at-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1059 (eq 'semicolon from-kind))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1060 ;; Scan for the uses statement, just to be sure.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1061 (let ((token (delphi-previous-token at-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1062 (token-kind nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1063 (catch 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1064 (while token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1065 (setq token-kind (delphi-token-kind token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1066 (cond ((delphi-is token-kind delphi-use-clauses)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1067 (throw 'done t))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1068
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1069 ;; Whitespace, identifiers, strings, "in" keyword, and commas
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1070 ;; are allowed in use clauses.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1071 ((or (delphi-is token-kind '(word comma in newline))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1072 (delphi-is token-kind delphi-whitespace)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1073 (delphi-is token-kind delphi-strings)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1074
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1075 ;; Nothing else is.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1076 ((throw 'done nil)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1077 (setq token (delphi-previous-token token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1078 nil))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1079
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1080 (defun delphi-is-block-after-expr-statement (token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1081 ;; Returns true if we have a block token trailing an expression delimiter (of
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1082 ;; presumably an expression statement).
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1083 (when (delphi-is (delphi-token-kind token) delphi-block-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1084 (let ((previous (delphi-previous-token token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1085 (previous-kind nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1086 (while (progn
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1087 (setq previous-kind (delphi-token-kind previous))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1088 (eq previous-kind 'space))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1089 (setq previous (delphi-previous-token previous)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1090 (or (delphi-is previous-kind delphi-expr-delimiters)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1091 (eq previous-kind 'else)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1092
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1093 (defun delphi-previous-indent-of (from-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1094 ;; Returns the indentation of the previous statement of the token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1095 (let ((token (delphi-previous-token from-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1096 (token-kind nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1097 (from-kind (delphi-token-kind from-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1098 (last-colon nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1099 (last-token nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1100 (catch 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1101 (while token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1102 (setq token-kind (delphi-token-kind token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1103 (cond
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1104 ;; An open ( or [ always is an indent point.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1105 ((eq 'open-group token-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1106 (throw 'done (delphi-open-group-indent token last-token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1107
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1108 ;; Skip over any ()/[] groups.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1109 ((eq 'close-group token-kind) (setq token (delphi-group-start token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1110
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1111 ((delphi-is token-kind delphi-end-block-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1112 (if (eq 'newline (delphi-token-kind (delphi-previous-token token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1113 ;; We can stop at an end token that is right up against the
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1114 ;; margin.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1115 (throw 'done 0)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1116 ;; Otherwise, skip over any nested blocks.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1117 (setq token (delphi-block-start token))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1118
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1119 ;; Special case: if we encounter a ", word;" then we assume that we
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1120 ;; are in some kind of uses clause, and thus indent to column 0. This
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1121 ;; works because no other constructs are known to have that form.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1122 ;; This fixes the irritating case of having indents after a uses
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1123 ;; clause look like:
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1124 ;; uses
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1125 ;; someUnit,
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1126 ;; someOtherUnit;
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1127 ;; // this should be at column 0!
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1128 ((delphi-is-use-clause-end token last-token last-colon from-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1129 (throw 'done 0))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1130
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1131 ;; A previous terminator means we can stop. If we are on a directive,
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1132 ;; however, then we are not actually encountering a new statement.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1133 ((and last-token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1134 (delphi-is token-kind delphi-previous-terminators)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1135 (not (delphi-is (delphi-token-kind last-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1136 delphi-directives)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1137 (throw 'done (delphi-stmt-line-indent-of last-token 0)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1138
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1139 ;; Ignore whitespace.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1140 ((delphi-is token-kind delphi-whitespace))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1141
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1142 ;; Remember any ':' we encounter, since that affects how we indent to
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1143 ;; a case statement.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1144 ((eq 'colon token-kind) (setq last-colon token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1145
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1146 ;; A case statement delimits a previous statement. We indent labels
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1147 ;; specially.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1148 ((eq 'case token-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1149 (throw 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1150 (if last-colon (delphi-line-indent-of last-colon)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1151 (delphi-line-indent-of token delphi-case-label-indent))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1152
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1153 ;; If we are in a use clause then commas mark an enclosing rather than
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1154 ;; a previous statement.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1155 ((delphi-is token-kind delphi-use-clauses)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1156 (throw 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1157 (if (eq 'comma from-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1158 (if last-token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1159 ;; Indent to first unit in use clause.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1160 (delphi-indent-of last-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1161 ;; Indent from use clause keyword.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1162 (delphi-line-indent-of token delphi-indent-level))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1163 ;; Indent to use clause keyword.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1164 (delphi-line-indent-of token))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1165
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1166 ;; Assembly sections always indent in from the asm keyword.
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1167 ((eq token-kind 'asm)
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1168 (throw 'done (delphi-stmt-line-indent-of token delphi-indent-level)))
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1169
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1170 ;; An enclosing statement delimits a previous statement.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1171 ;; We try to use the existing indent of the previous statement,
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1172 ;; otherwise we calculate from the enclosing statement.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1173 ((delphi-is token-kind delphi-previous-enclosing-statements)
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1174 (throw 'done (if last-token
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1175 ;; Otherwise indent to the last token
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1176 (delphi-line-indent-of last-token)
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1177 ;; Just indent from the enclosing keyword
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1178 (delphi-line-indent-of token delphi-indent-level))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1179
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1180 ;; A class or record declaration also delimits a previous statement.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1181 ((delphi-composite-type-start token last-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1182 (throw
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1183 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1184 (if (delphi-is-simple-class-type last-token from-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1185 ;; c = class; or c = class of T; are previous statements.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1186 (delphi-line-indent-of token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1187 ;; Otherwise c = class ... or r = record ... are enclosing
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1188 ;; statements.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1189 (delphi-line-indent-of last-token delphi-indent-level))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1190
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1191 ;; We have a definite previous statement delimiter.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1192 ((delphi-is token-kind delphi-previous-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1193 (throw 'done (delphi-stmt-line-indent-of token 0)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1194 )
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1195 (unless (delphi-is token-kind delphi-whitespace)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1196 (setq last-token token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1197 (setq token (delphi-previous-token token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1198 ;; We ran out of tokens. Indent to column 0.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1199 0)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1200
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1201 (defun delphi-section-indent-of (section-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1202 ;; Returns the indentation appropriate for begin/var/const/type/label
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1203 ;; tokens.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1204 (let* ((token (delphi-previous-token section-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1205 (token-kind nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1206 (last-token nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1207 (nested-block-count 0)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1208 (expr-delimited nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1209 (last-terminator nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1210 (catch 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1211 (while token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1212 (setq token-kind (delphi-token-kind token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1213 (cond
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1214 ;; Always stop at unmatched ( or [.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1215 ((eq token-kind 'open-group)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1216 (throw 'done (delphi-open-group-indent token last-token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1217
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1218 ;; Skip over any ()/[] groups.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1219 ((eq 'close-group token-kind) (setq token (delphi-group-start token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1220
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1221 ((delphi-is token-kind delphi-end-block-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1222 (if (eq 'newline (delphi-token-kind (delphi-previous-token token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1223 ;; We can stop at an end token that is right up against the
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1224 ;; margin.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1225 (throw 'done 0)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1226 ;; Otherwise, skip over any nested blocks.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1227 (setq token (delphi-block-start token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1228 nested-block-count (1+ nested-block-count))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1229
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1230 ;; Remember if we have encountered any forward routine declarations.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1231 ((eq 'forward token-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1232 (setq nested-block-count (1+ nested-block-count)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1233
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1234 ;; Mark the completion of a nested routine traversal.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1235 ((and (delphi-is token-kind delphi-routine-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1236 (> nested-block-count 0))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1237 (setq nested-block-count (1- nested-block-count)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1238
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1239 ;; Remember if we have encountered any statement terminators.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1240 ((eq 'semicolon token-kind) (setq last-terminator token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1241
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1242 ;; Remember if we have encountered any expression delimiters.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1243 ((delphi-is token-kind delphi-expr-delimiters)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1244 (setq expr-delimited token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1245
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1246 ;; Enclosing body statements are delimiting. We indent the compound
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1247 ;; bodies specially.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1248 ((and (not last-terminator)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1249 (delphi-is token-kind delphi-body-statements))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1250 (throw 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1251 (delphi-stmt-line-indent-of token delphi-compound-block-indent)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1252
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1253 ;; An enclosing ":" means a label.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1254 ((and (eq 'colon token-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1255 (delphi-is (delphi-token-kind section-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1256 delphi-block-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1257 (not last-terminator)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1258 (not expr-delimited)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1259 (not (eq 'equals (delphi-token-kind last-token))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1260 (throw 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1261 (delphi-stmt-line-indent-of token delphi-indent-level)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1262
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1263 ;; Block and mid block tokens are always enclosing
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1264 ((delphi-is token-kind delphi-begin-enclosing-tokens)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1265 (throw 'done
25161
ae69eef1b98b checked in with -k by blaak at 1999/08/03 06:17:58
Ray Blaak <blaak@infomatch.com>
parents: 25072
diff changeset
1266 (delphi-stmt-line-indent-of token delphi-indent-level)))
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1267
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1268 ;; Declaration sections and routines are delimiters, unless they
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1269 ;; are part of a nested routine.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1270 ((and (delphi-is token-kind delphi-decl-delimiters)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1271 (= 0 nested-block-count))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1272 (throw 'done (delphi-line-indent-of token 0)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1273
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1274 ;; Unit statements mean we indent right to the left.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1275 ((delphi-is token-kind delphi-unit-statements) (throw 'done 0))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1276 )
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1277 (unless (delphi-is token-kind delphi-whitespace)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1278 (setq last-token token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1279 (setq token (delphi-previous-token token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1280 ;; We ran out of tokens. Indent to column 0.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1281 0)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1282
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1283 (defun delphi-enclosing-indent-of (from-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1284 ;; Returns the indentation offset from the enclosing statement of the token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1285 (let ((token (delphi-previous-token from-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1286 (from-kind (delphi-token-kind from-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1287 (token-kind nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1288 (stmt-start nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1289 (last-token nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1290 (equals-encountered nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1291 (before-equals nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1292 (expr-delimited nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1293 (catch 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1294 (while token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1295 (setq token-kind (delphi-token-kind token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1296 (cond
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1297 ;; An open ( or [ always is an indent point.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1298 ((eq 'open-group token-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1299 (throw 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1300 (delphi-open-group-indent
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1301 token last-token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1302 (if (delphi-is from-kind delphi-binary-ops)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1303 ;; Keep binary operations aligned with the open group.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1304 0
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1305 delphi-indent-level))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1306
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1307 ;; Skip over any ()/[] groups.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1308 ((eq 'close-group token-kind) (setq token (delphi-group-start token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1309
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1310 ;; Skip over any nested blocks.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1311 ((delphi-is token-kind delphi-end-block-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1312 (setq token (delphi-block-start token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1313
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1314 ;; An expression delimiter affects indentation depending on whether
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1315 ;; the point is before or after it. Remember that we encountered one.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1316 ;; Also remember the last encountered token, since if it exists it
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1317 ;; should be the actual indent point.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1318 ((delphi-is token-kind delphi-expr-delimiters)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1319 (setq expr-delimited token stmt-start last-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1320
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1321 ;; With a non-delimited expression statement we indent after the
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1322 ;; statement's keyword, unless we are on the delimiter itself.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1323 ((and (not expr-delimited)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1324 (delphi-is token-kind delphi-expr-statements))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1325 (throw 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1326 (cond ((delphi-is from-kind delphi-expr-delimiters)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1327 ;; We are indenting a delimiter. Indent to the statement.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1328 (delphi-stmt-line-indent-of token 0))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1329
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1330 ((and last-token (delphi-is from-kind delphi-binary-ops))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1331 ;; Align binary ops with the expression.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1332 (delphi-indent-of last-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1333
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1334 (last-token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1335 ;; Indent in from the expression.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1336 (delphi-indent-of last-token delphi-indent-level))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1337
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1338 ;; Indent in from the statement's keyword.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1339 ((delphi-indent-of token delphi-indent-level)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1340
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1341 ;; A delimited case statement indents the label according to
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1342 ;; a special rule.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1343 ((eq 'case token-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1344 (throw 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1345 (if stmt-start
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1346 ;; We are not actually indenting to the case statement,
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1347 ;; but are within a label expression.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1348 (delphi-stmt-line-indent-of
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1349 stmt-start delphi-indent-level)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1350 ;; Indent from the case keyword.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1351 (delphi-stmt-line-indent-of
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1352 token delphi-case-label-indent))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1353
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1354 ;; Body expression statements are enclosing. Indent from the
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1355 ;; statement's keyword, unless we have a non-block statement following
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1356 ;; it.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1357 ((delphi-is token-kind delphi-body-expr-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1358 (throw 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1359 (delphi-stmt-line-indent-of
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1360 (or stmt-start token) delphi-indent-level)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1361
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1362 ;; An else statement is enclosing, but it doesn't have an expression.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1363 ;; Thus we take into account last-token instead of stmt-start.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1364 ((eq 'else token-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1365 (throw 'done (delphi-stmt-line-indent-of
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1366 (or last-token token) delphi-indent-level)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1367
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1368 ;; We indent relative to an enclosing declaration section.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1369 ((delphi-is token-kind delphi-decl-sections)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1370 (throw 'done (delphi-indent-of (if last-token last-token token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1371 delphi-indent-level)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1372
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1373 ;; In unit sections we indent right to the left.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1374 ((delphi-is token-kind delphi-unit-sections) (throw 'done 0))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1375
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1376 ;; A previous terminator means we can stop.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1377 ((delphi-is token-kind delphi-previous-terminators)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1378 (throw 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1379 (cond ((and last-token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1380 (eq 'comma token-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1381 (delphi-is from-kind delphi-binary-ops))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1382 ;; Align binary ops with the expression.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1383 (delphi-indent-of last-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1384
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1385 (last-token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1386 ;; Indent in from the expression.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1387 (delphi-indent-of last-token delphi-indent-level))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1388
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1389 ;; No enclosing expression; use the previous statment's
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1390 ;; indent.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1391 ((delphi-previous-indent-of token)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1392
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1393 ;; A block statement after an expression delimiter has its start
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1394 ;; column as the expression statement. E.g.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1395 ;; if (a = b)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1396 ;; and (a != c) then begin
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1397 ;; //...
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1398 ;; end;
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1399 ;; Remember it for when we encounter the expression statement start.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1400 ((delphi-is-block-after-expr-statement token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1401 (throw 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1402 (cond (last-token (delphi-indent-of last-token delphi-indent-level))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1403
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1404 ((+ (delphi-section-indent-of token) delphi-indent-level)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1405
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1406 ;; Assembly sections always indent in from the asm keyword.
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1407 ((eq token-kind 'asm)
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1408 (throw 'done (delphi-stmt-line-indent-of token delphi-indent-level)))
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1409
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1410 ;; Stop at an enclosing statement and indent from it.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1411 ((delphi-is token-kind delphi-enclosing-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1412 (throw 'done (delphi-stmt-line-indent-of
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1413 (or last-token token) delphi-indent-level)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1414
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1415 ;; A class/record declaration is also enclosing.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1416 ((delphi-composite-type-start token last-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1417 (throw 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1418 (delphi-line-indent-of last-token delphi-indent-level)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1419
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1420 ;; A ":" we indent relative to its line beginning. If we are in a
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1421 ;; parameter list, then stop also if we hit a ";".
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1422 ((and (eq token-kind 'colon)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1423 (not expr-delimited)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1424 (not (delphi-is from-kind delphi-expr-delimiters))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1425 (not equals-encountered)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1426 (not (eq from-kind 'equals)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1427 (throw 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1428 (if last-token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1429 (delphi-indent-of last-token delphi-indent-level)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1430 (delphi-line-indent-of token delphi-indent-level 'semicolon))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1431
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1432 ;; If the ":" was not processed above and we have token after the "=",
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1433 ;; then indent from the "=". Ignore :=, however.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1434 ((and (eq token-kind 'colon) equals-encountered before-equals)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1435 (cond
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1436 ;; Ignore binary ops for now. It would do, for example:
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1437 ;; val := 1 + 2
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1438 ;; + 3;
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1439 ;; which is good, but also
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1440 ;; val := Foo
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1441 ;; (foo, args)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1442 ;; + 2;
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1443 ;; which doesn't look right.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1444 ;;;; Align binary ops with the before token.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1445 ;;((delphi-is from-kind delphi-binary-ops)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1446 ;;(throw 'done (delphi-indent-of before-equals 0)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1447
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1448 ;; Assignments (:=) we skip over to get a normal indent.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1449 ((eq (delphi-token-kind last-token) 'equals))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1450
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1451 ;; Otherwise indent in from the equals.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1452 ((throw 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1453 (delphi-indent-of before-equals delphi-indent-level)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1454
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1455 ;; Remember any "=" we encounter if it has not already been processed.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1456 ((eq token-kind 'equals)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1457 (setq equals-encountered token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1458 before-equals last-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1459 )
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1460 (unless (delphi-is token-kind delphi-whitespace)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1461 (setq last-token token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1462 (setq token (delphi-previous-token token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1463 ;; We ran out of tokens. Indent to column 0.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1464 0)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1465
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1466 (defun delphi-corrected-indentation ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1467 ;; Returns the corrected indentation for the current line.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1468 (delphi-save-excursion
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1469 (delphi-progress-start)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1470 ;; Move to the first token on the line.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1471 (beginning-of-line)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1472 (skip-chars-forward delphi-space-chars)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1473 (let* ((token (delphi-current-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1474 (token-kind (delphi-token-kind token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1475 (indent
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1476 (cond ((eq 'close-group token-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1477 ;; Indent to the matching start ( or [.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1478 (delphi-indent-of (delphi-group-start token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1479
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1480 ((delphi-is token-kind delphi-unit-statements) 0)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1481
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1482 ((delphi-is token-kind delphi-comments)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1483 ;; In a comment.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1484 (delphi-comment-indent-of token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1485
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1486 ((delphi-is token-kind delphi-decl-matchers)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1487 ;; Use a previous section/routine's indent.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1488 (delphi-section-indent-of token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1489
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1490 ((delphi-is token-kind delphi-match-block-statements)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1491 ;; Use the block's indentation.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1492 (let ((block-start
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1493 (delphi-block-start token 'stop-on-class)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1494 (cond
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1495 ;; When trailing a body statement, indent to
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1496 ;; the statement's keyword.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1497 ((delphi-is-block-after-expr-statement block-start)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1498 (delphi-section-indent-of block-start))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1499
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1500 ;; Otherwise just indent to the block start.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1501 ((delphi-stmt-line-indent-of block-start 0)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1502
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1503 ((eq 'else token-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1504 ;; Find the start of the if or case statement.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1505 (delphi-stmt-line-indent-of (delphi-else-start token) 0))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1506
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1507 ;; Otherwise indent in from enclosing statement.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1508 ((delphi-enclosing-indent-of
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1509 (if token token (delphi-token-at (1- (point)))))))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1510 (delphi-progress-done)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1511 indent)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1512
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1513 (defun delphi-indent-line ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1514 "Indent the current line according to the current language construct. If
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1515 before the indent, the point is moved to the indent."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1516 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1517 (delphi-save-match-data
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1518 (let ((marked-point (point-marker)) ; Maintain our position reliably.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1519 (new-point nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1520 (line-start nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1521 (old-indent 0)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1522 (new-indent 0))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1523 (beginning-of-line)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1524 (setq line-start (point))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1525 (skip-chars-forward delphi-space-chars)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1526 (setq old-indent (current-column))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1527 (setq new-indent (delphi-corrected-indentation))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1528 (if (< marked-point (point))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1529 ;; If before the indent column, then move to it.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1530 (set-marker marked-point (point)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1531 ;; Advance our marked point after inserted spaces.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1532 (set-marker-insertion-type marked-point t)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1533 (when (/= old-indent new-indent)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1534 (delete-region line-start (point))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1535 (insert (make-string new-indent ?\ )))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1536 (goto-char marked-point)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1537 (set-marker marked-point nil))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1538
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1539 (defvar delphi-mode-abbrev-table nil
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1540 "Abbrev table in use in delphi-mode buffers.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1541 (define-abbrev-table 'delphi-mode-abbrev-table ())
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1542
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1543 (defmacro delphi-ensure-buffer (buffer-var buffer-name)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1544 ;; Ensures there exists a buffer of the specified name in the specified
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1545 ;; variable.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1546 `(when (not (buffer-live-p ,buffer-var))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1547 (setq ,buffer-var (get-buffer-create ,buffer-name))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1548
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1549 (defun delphi-log-msg (to-buffer the-msg)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1550 ;; Writes a message to the end of the specified buffer.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1551 (with-current-buffer to-buffer
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1552 (save-selected-window
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1553 (switch-to-buffer-other-window to-buffer)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1554 (goto-char (point-max))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1555 (set-window-dot (get-buffer-window to-buffer) (point))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1556 (insert the-msg))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1557
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1558 ;; Debugging helpers:
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1559
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1560 (defvar delphi-debug-buffer nil
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1561 "Buffer to write delphi-mode debug messages to. Created on demand.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1562
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1563 (defun delphi-debug-log (format-string &rest args)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1564 ;; Writes a message to the log buffer.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1565 (when delphi-debug
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1566 (delphi-ensure-buffer delphi-debug-buffer "*Delphi Debug Log*")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1567 (delphi-log-msg delphi-debug-buffer
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1568 (concat (format-time-string "%H:%M:%S " (current-time))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1569 (apply #'format (cons format-string args))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1570 "\n"))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1571
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1572 (defun delphi-debug-token-string (token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1573 (let* ((image (delphi-token-string token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1574 (has-newline (string-match "^\\([^\n]*\\)\n\\(.+\\)?$" image)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1575 (when has-newline
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1576 (setq image (concat (match-string 1 image)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1577 (if (match-beginning 2) "..."))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1578 image))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1579
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1580 (defun delphi-debug-show-current-token ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1581 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1582 (let ((token (delphi-current-token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1583 (delphi-debug-log "Token: %S %S" token (delphi-debug-token-string token))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1584
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1585 (defun delphi-debug-goto-point (p)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1586 (interactive "NGoto char: ")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1587 (goto-char p))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1588
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1589 (defun delphi-debug-goto-next-token ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1590 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1591 (goto-char (delphi-token-start (delphi-next-token (delphi-current-token)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1592
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1593 (defun delphi-debug-goto-previous-token ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1594 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1595 (goto-char
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1596 (delphi-token-start (delphi-previous-token (delphi-current-token)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1597
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1598 (defun delphi-debug-show-current-string (from to)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1599 (interactive "r")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1600 (delphi-debug-log "String: %S" (buffer-substring from to)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1601
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1602 (defun delphi-debug-show-is-stable ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1603 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1604 (delphi-debug-log "stable: %S prev: %S next: %S"
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1605 (delphi-is-stable-literal (point))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1606 (delphi-literal-kind (1- (point)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1607 (delphi-literal-kind (point))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1608
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1609 (defun delphi-debug-unparse-buffer ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1610 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1611 (delphi-set-text-properties (point-min) (point-max) nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1612
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1613 (defun delphi-debug-parse-region (from to)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1614 (interactive "r")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1615 (let ((delphi-verbose t))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1616 (delphi-save-excursion
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1617 (delphi-progress-start)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1618 (delphi-parse-region from to)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1619 (delphi-progress-done "Parsing done"))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1620
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1621 (defun delphi-debug-parse-window ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1622 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1623 (delphi-debug-parse-region (window-start) (window-end)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1624
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1625 (defun delphi-debug-parse-buffer ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1626 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1627 (delphi-debug-parse-region (point-min) (point-max)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1628
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1629 (defun delphi-debug-fontify-window ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1630 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1631 (delphi-fontify-region (window-start) (window-end) t))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1632
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1633 (defun delphi-debug-fontify-buffer ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1634 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1635 (delphi-fontify-region (point-min) (point-max) t))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1636
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1637 (defun delphi-debug-tokenize-region (from to)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1638 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1639 (delphi-save-excursion
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1640 (delphi-progress-start)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1641 (goto-char from)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1642 (while (< (point) to)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1643 (goto-char (delphi-token-end (delphi-current-token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1644 (delphi-step-progress (point) "Tokenizing" delphi-scanning-progress-step))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1645 (delphi-progress-done "Tokenizing done")))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1646
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1647 (defun delphi-debug-tokenize-buffer ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1648 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1649 (delphi-debug-tokenize-region (point-min) (point-max)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1650
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1651 (defun delphi-debug-tokenize-window ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1652 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1653 (delphi-debug-tokenize-region (window-start) (window-end)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1654
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1655 (defun delphi-newline ()
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1656 "Terminate the current line with a newline and indent the next, unless
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1657 `delphi-newline-always-indents' is nil, in which case no reindenting occurs."
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1658 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1659 ;; Remove trailing spaces
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1660 (delete-horizontal-space)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1661 (newline)
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1662 (when delphi-newline-always-indents
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1663 ;; Indent both the (now) previous and current line first.
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1664 (save-excursion
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1665 (previous-line 1)
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1666 (delphi-indent-line))
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1667 (delphi-indent-line)))
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1668
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1669
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1670 (defun delphi-tab ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1671 "Indent the current line or insert a TAB, depending on the value of
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1672 `delphi-tab-always-indents' and the current line position."
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1673 (interactive)
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1674 (if (or delphi-tab-always-indents ; We are always indenting
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1675 ;; Or we are before the first non-space character on the line.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1676 (save-excursion (skip-chars-backward delphi-space-chars) (bolp)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1677 (delphi-indent-line)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1678 (insert "\t")))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1679
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1680
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1681 (defun delphi-is-directory (path)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1682 ;; True if the specified path is an existing directory.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1683 (let ((attributes (file-attributes path)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1684 (and attributes (car attributes))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1685
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1686 (defun delphi-is-file (path)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1687 ;; True if the specified file exists as a file.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1688 (let ((attributes (file-attributes path)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1689 (and attributes (null (car attributes)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1690
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1691 (defun delphi-search-directory (unit dir &optional recurse)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1692 ;; Searches for the unit in the specified directory. If recurse is true, then
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1693 ;; the directory is recursively searched. File name comparison is done in a
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1694 ;; case insensitive manner.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1695 (when (delphi-is-directory dir)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1696 (let ((files (directory-files dir))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1697 (unit-file (downcase unit)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1698 (catch 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1699 ;; Search for the file.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1700 (mapcar #'(lambda (file)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1701 (let ((path (concat dir "/" file)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1702 (if (and (string= unit-file (downcase file))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1703 (delphi-is-file path))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1704 (throw 'done path))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1705 files)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1706
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1707 ;; Not found. Search subdirectories.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1708 (when recurse
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1709 (mapcar #'(lambda (subdir)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1710 (unless (member subdir '("." ".."))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1711 (let ((path (delphi-search-directory
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1712 unit (concat dir "/" subdir) recurse)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1713 (if path (throw 'done path)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1714 files))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1715
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1716 ;; Not found.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1717 nil))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1718
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1719
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1720 (defun delphi-find-unit-in-directory (unit dir)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1721 ;; Searches for the unit in the specified directory. If the directory ends
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1722 ;; in \"...\", then it is recursively searched.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1723 (let ((dir-name dir)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1724 (recurse nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1725 ;; Check if we need to recursively search the directory.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1726 (if (string-match "^\\(.+\\)\\.\\.\\.$" dir-name)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1727 (setq dir-name (match-string 1 dir-name)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1728 recurse t))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1729 ;; Ensure the trailing slash is removed.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1730 (if (string-match "^\\(.+\\)[\\\\/]$" dir-name)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1731 (setq dir-name (match-string 1 dir-name)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1732 (delphi-search-directory unit dir-name recurse)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1733
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1734 (defun delphi-find-unit-file (unit)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1735 ;; Finds the specified delphi source file according to `delphi-search-path'.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1736 ;; If found, the full path is returned, otherwise nil is returned.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1737 (catch 'done
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1738 (cond ((null delphi-search-path)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1739 (delphi-find-unit-in-directory unit "."))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1740
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1741 ((stringp delphi-search-path)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1742 (delphi-find-unit-in-directory unit delphi-search-path))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1743
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1744 ((mapcar
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1745 #'(lambda (dir)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1746 (let ((file (delphi-find-unit-in-directory unit dir)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1747 (if file (throw 'done file))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1748 delphi-search-path)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1749 nil))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1750
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1751 (defun delphi-find-unit (unit)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1752 "Finds the specified delphi source file according to `delphi-search-path'.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1753 If no extension is specified, .pas is assumed. Creates a buffer for the unit."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1754 (interactive "sDelphi unit name: ")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1755 (let* ((unit-file (if (string-match "^\\(.*\\)\\.[a-z]+$" unit)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1756 unit
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1757 (concat unit ".pas")))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1758 (file (delphi-find-unit-file unit-file)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1759 (if (null file)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1760 (error "unit not found: %s" unit-file)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1761 (find-file file)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1762 (if (not (eq major-mode 'delphi-mode))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1763 (delphi-mode)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1764 file))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1765
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1766 (defun delphi-find-current-def ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1767 "Find the definition of the identifier under the current point."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1768 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1769 (error "delphi-find-current-def: not implemented yet"))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1770
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1771 (defun delphi-find-current-xdef ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1772 "Find the definition of the identifier under the current point, searching
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1773 in external units if necessary (as listed in the current unit's use clause).
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1774 The set of directories to search for a unit is specified by the global variable
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1775 delphi-search-path."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1776 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1777 (error "delphi-find-current-xdef: not implemented yet"))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1778
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1779 (defun delphi-find-current-body ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1780 "Find the body of the identifier under the current point, assuming
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1781 it is a routine."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1782 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1783 (error "delphi-find-current-body: not implemented yet"))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1784
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1785 (defun delphi-fill-comment ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1786 "Fills the text of the current comment, according to `fill-column'.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1787 An error is raised if not in a comment."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1788 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1789 (save-excursion
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1790 (let* ((comment (delphi-current-token))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1791 (comment-kind (delphi-token-kind comment)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1792 (if (not (delphi-is comment-kind delphi-comments))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1793 (error "Not in a comment")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1794 (let* ((start-comment (delphi-comment-block-start comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1795 (end-comment (delphi-comment-block-end comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1796 (comment-start (delphi-token-start start-comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1797 (comment-end (delphi-token-end end-comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1798 (content-start (delphi-comment-content-start start-comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1799 (content-indent (delphi-column-of content-start))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1800 (content-prefix (make-string content-indent ?\ ))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1801 (content-prefix-re delphi-leading-spaces-re)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1802 (p nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1803 (marked-point (point-marker))) ; Maintain our position reliably.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1804 (when (eq 'comment-single-line comment-kind)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1805 ;; // style comments need more work.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1806 (setq content-prefix
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1807 (let ((comment-indent (delphi-column-of comment-start)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1808 (concat (make-string comment-indent ?\ ) "//"
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1809 (make-string (- content-indent comment-indent 2)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1810 ?\ )))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1811 content-prefix-re (concat delphi-leading-spaces-re
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1812 "//"
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1813 delphi-spaces-re)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1814 comment-end (if (delphi-is-literal-end comment-end)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1815 ;; Don't include the trailing newline.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1816 (1- comment-end)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1817 comment-end)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1818
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1819 ;; Advance our marked point after inserted spaces.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1820 (set-marker-insertion-type marked-point t)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1821
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1822 ;; Ensure we can modify the buffer
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1823 (goto-char content-start)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1824 (insert " ")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1825 (delete-char -1)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1826
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1827 (narrow-to-region content-start comment-end)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1828
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1829 ;; Strip off the comment prefixes
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1830 (setq p (point-min))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1831 (while (when (< p (point-max))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1832 (goto-char p)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1833 (re-search-forward content-prefix-re nil t))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1834 (replace-match "" nil nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1835 (setq p (1+ (point))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1836
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1837 ;; add an extra line to prevent the fill from doing it for us.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1838 (goto-char (point-max))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1839 (insert "\n")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1840
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1841 ;; Fill the comment contents.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1842 (let ((fill-column (- fill-column content-indent)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1843 (fill-region (point-min) (point-max)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1844
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1845 (goto-char (point-max))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1846 (delete-char -1)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1847
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1848 ;; Restore comment prefixes.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1849 (goto-char (point-min))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1850 (end-of-line) ; Don't reset the first line.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1851 (setq p (point))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1852 (while (when (< p (point-max))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1853 (goto-char p)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1854 (re-search-forward "^" nil t))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1855 (replace-match content-prefix nil nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1856 (setq p (1+ (point))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1857
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1858 (setq comment-end (point-max))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1859 (widen)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1860
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1861 ;; Restore our position
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1862 (goto-char marked-point)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1863 (set-marker marked-point nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1864
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1865 ;; React to the entire fill change as a whole.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1866 (delphi-progress-start)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1867 (delphi-parse-region comment-start comment-end)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1868 (delphi-progress-done))))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1869
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1870 (defun delphi-new-comment-line ()
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1871 "If in a // comment, does a newline, indented such that one is still in the
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1872 comment block. If not in a // comment, just does a normal newline."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1873 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1874 (let ((comment (delphi-current-token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1875 (if (not (eq 'comment-single-line (delphi-token-kind comment)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1876 ;; Not in a // comment. Just do the normal newline.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1877 (delphi-newline)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1878 (let* ((start-comment (delphi-comment-block-start comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1879 (comment-start (delphi-token-start start-comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1880 (content-start (delphi-comment-content-start start-comment))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1881 (prefix
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1882 (concat (make-string (delphi-column-of comment-start) ?\ ) "//"
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1883 (make-string (- content-start comment-start 2) ?\ ))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1884 (delete-horizontal-space)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1885 (newline)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1886 (insert prefix)))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1887
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1888 (defun delphi-match-token (token limit)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1889 ;; Sets the match region used by (match-string 0) and friends to the token's
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1890 ;; region. Sets the current point to the end of the token (or limit).
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1891 (set-match-data nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1892 (if token
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1893 (let ((end (min (delphi-token-end token) limit)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1894 (set-match-data (list (delphi-token-start token) end))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1895 (goto-char end)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1896 token)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1897
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1898 (defconst delphi-font-lock-defaults
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1899 '(nil ; We have our own fontify routine, so keywords don't apply.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1900 t ; Syntactic fontification doesn't apply.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1901 nil ; Don't care about case since we don't use regexps to find tokens.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1902 nil ; Syntax alists don't apply.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1903 nil ; Syntax begin movement doesn't apply
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1904 (font-lock-fontify-region-function . delphi-fontify-region)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1905 (font-lock-verbose . delphi-fontifying-progress-step))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1906 "Delphi mode font-lock defaults. Syntactic fontification is ignored.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1907
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1908 (defvar delphi-debug-mode-map
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1909 (let ((kmap (make-sparse-keymap)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1910 (mapcar #'(lambda (binding) (define-key kmap (car binding) (cadr binding)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1911 '(("n" delphi-debug-goto-next-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1912 ("p" delphi-debug-goto-previous-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1913 ("t" delphi-debug-show-current-token)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1914 ("T" delphi-debug-tokenize-buffer)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1915 ("W" delphi-debug-tokenize-window)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1916 ("g" delphi-debug-goto-point)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1917 ("s" delphi-debug-show-current-string)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1918 ("a" delphi-debug-parse-buffer)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1919 ("w" delphi-debug-parse-window)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1920 ("f" delphi-debug-fontify-window)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1921 ("F" delphi-debug-fontify-buffer)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1922 ("r" delphi-debug-parse-region)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1923 ("c" delphi-debug-unparse-buffer)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1924 ("x" delphi-debug-show-is-stable)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1925 ))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1926 kmap)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1927 "Keystrokes for delphi-mode debug commands.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1928
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1929 (defvar delphi-mode-map
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1930 (let ((kmap (make-sparse-keymap)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1931 (mapcar #'(lambda (binding) (define-key kmap (car binding) (cadr binding)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1932 (list '("\r" delphi-newline)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1933 '("\t" delphi-tab)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1934 '("\177" backward-delete-char-untabify)
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1935 ;; '("\C-cd" delphi-find-current-def)
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1936 ;; '("\C-cx" delphi-find-current-xdef)
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1937 ;; '("\C-cb" delphi-find-current-body)
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1938 '("\C-cu" delphi-find-unit)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1939 '("\M-q" delphi-fill-comment)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1940 '("\M-j" delphi-new-comment-line)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1941 ;; Debug bindings:
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1942 (list "\C-c\C-d" delphi-debug-mode-map)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1943 kmap)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1944 "Keymap used in Delphi mode.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1945
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1946 (defconst delphi-mode-syntax-table (make-syntax-table)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1947 "Delphi mode's syntax table. It is just a standard syntax table.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1948 This is ok since we do our own keyword/comment/string face coloring.")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1949
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1950 ;;;###autoload
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1951 (defun delphi-mode (&optional skip-initial-parsing)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1952 "Major mode for editing Delphi code. \\<delphi-mode-map>
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1953 \\[delphi-tab]\t- Indents the current line for Delphi code.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1954 \\[delphi-find-unit]\t- Search for a Delphi source file.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1955 \\[delphi-fill-comment]\t- Fill the current comment.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1956 \\[delphi-new-comment-line]\t- If in a // comment, do a new comment line.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1957
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1958 M-x indent-region also works for indenting a whole region.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1959
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1960 Customization:
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1961
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1962 `delphi-indent-level' (default 3)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1963 Indentation of Delphi statements with respect to containing block.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1964 `delphi-compound-block-indent' (default 0)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1965 Extra indentation for blocks in compound statements.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1966 `delphi-case-label-indent' (default 0)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1967 Extra indentation for case statement labels.
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1968 `delphi-tab-always-indents' (default t)
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1969 Non-nil means TAB in Delphi mode should always reindent the current line,
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1970 regardless of where in the line point is when the TAB command is used.
25317
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1971 `delphi-newline-always-indents' (default t)
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1972 Non-nil means NEWLINE in Delphi mode should always reindent the current
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1973 line, insert a blank line and move to the default indent column of the
06136c6979f1 checked in with -k by blaak at 1999/08/18 05:08:39
Ray Blaak <blaak@infomatch.com>
parents: 25161
diff changeset
1974 blank line.
25072
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1975 `delphi-search-path' (default .)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1976 Directories to search when finding external units.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1977 `delphi-verbose' (default nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1978 If true then delphi token processing progress is reported to the user.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1979
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1980 Coloring:
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1981
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1982 `delphi-comment-face' (default font-lock-comment-face)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1983 Face used to color delphi comments.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1984 `delphi-string-face' (default font-lock-string-face)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1985 Face used to color delphi strings.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1986 `delphi-keyword-face' (default font-lock-keyword-face)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1987 Face used to color delphi keywords.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1988 `delphi-other-face' (default nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1989 Face used to color everything else.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1990
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1991 Turning on Delphi mode calls the value of the variable delphi-mode-hook with
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1992 no args, if that value is non-nil."
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1993 (interactive)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1994 (kill-all-local-variables)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1995 (use-local-map delphi-mode-map)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1996 (setq major-mode 'delphi-mode)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1997 (setq mode-name "Delphi")
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1998
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1999 (setq local-abbrev-table delphi-mode-abbrev-table)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2000 (set-syntax-table delphi-mode-syntax-table)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2001
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2002 ;; Buffer locals:
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2003 (mapcar #'(lambda (var)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2004 (let ((var-symb (car var))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2005 (var-val (cadr var)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2006 (make-local-variable var-symb)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2007 (set var-symb var-val)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2008 (list '(indent-line-function delphi-indent-line)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2009 '(comment-indent-function delphi-indent-line)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2010 '(case-fold-search t)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2011 '(delphi-progress-last-reported-point nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2012 '(delphi-ignore-changes nil)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2013 (list 'font-lock-defaults delphi-font-lock-defaults)))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2014
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2015 ;; We need to keep track of changes to the buffer to determine if we need
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2016 ;; to retokenize changed text.
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2017 (make-local-hook 'after-change-functions)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2018 (add-hook 'after-change-functions 'delphi-after-change nil t)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2019
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2020 (widen)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2021 (unless skip-initial-parsing
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2022 (delphi-save-excursion
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2023 (let ((delphi-verbose t))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2024 (delphi-progress-start)
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2025 (delphi-parse-region (point-min) (point-max))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2026 (delphi-progress-done))))
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2027
29873c097b15 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2028 (run-hooks 'delphi-mode-hook))