~nxhtml/nxhtml/main

323.1.1 by Lennart Borgman
beta 2.04
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;; iss-mode.el --- Mode for InnoSetup install scripts
3
4
;; Copyright (C) 2000-2007 by Stefan Reichoer
5
6
;; Emacs Lisp Archive Entry
7
;; Filename: iss-mode.el
8
;; Author: Stefan Reichoer, <stefan@xsteve.at>
9
;; Version: 1.1d
10
11
;; iss-mode.el is free software; you can redistribute it and/or modify
12
;; it under the terms of the GNU General Public License as published by
13
;; the Free Software Foundation; either version 2, or (at your option)
14
;; any later version.
15
16
;; iss-mode.el is distributed in the hope that it will be useful,
17
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
;; GNU General Public License for more details.
20
21
;; You should have received a copy of the GNU General Public License
22
;; along with GNU Emacs; see the file COPYING.  If not, write to
23
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24
;; Boston, MA 02111-1307, USA.
25
26
;;; Commentary
27
28
;; InnoSetup is an Application Installer for Windows
29
;; See: http://www.jrsoftware.org/isinfo.php
30
;; This version of iss-mode.el is tested with InnoSetup v5.0
31
32
;; iss-mode provides the following features:
33
;; * Syntax coloring for InnoSetup scripts
34
;; * Integration of the InnoSetup commandline compiler iscc.exe
35
;;   - Compilation via M-x iss-compile
36
;;   - Jump to compilation error via M-x next-error
37
;; * Start Innosetup help via M-x iss-compiler-help
38
;; * Test the installation via M-x iss-run-installer
39
40
;; Of course you can bind this commands to keys (e.g. in the iss-mode-hook)
41
42
;; My initialization for InnoSetup looks like this:
43
;; (autoload 'iss-mode "iss-mode" "Innosetup Script Mode" t)
44
;; (setq auto-mode-alist (append '(("\\.iss$"  . iss-mode)) auto-mode-alist))
45
;; (setq iss-compiler-path "c:/Programme/Inno Setup 5/")
46
;; (add-hook 'iss-mode-hook 'xsteve-iss-mode-init)
47
;; (defun xsteve-iss-mode-init ()
48
;;	 (interactive)
49
;;	 (define-key iss-mode-map [f6] 'iss-compile)
50
;;	 (define-key iss-mode-map [(meta f6)] 'iss-run-installer)))
51
52
;; The latest version of iss-mode.el can be found at:
53
;;   http://www.xsteve.at/prg/emacs/iss-mode.el
54
55
;; Comments / suggestions welcome!
56
57
;;; Change log:
58
;;
59
;; Version 1.1e:
60
;;
61
;; - Add some new flags to keywords
62
63
;;; Code:
64
337.1.1 by Lennart Borgman
beta 2.06
65
(eval-and-compile (require 'compile))
66
323.1.1 by Lennart Borgman
beta 2.04
67
(defvar iss-compiler-path nil "Path to the iss compiler")
68
69
;;; End of user settings
70
557.1.1 by Lennart Borgman
beta 2.07
71
(defvar iss-mode-syntax-table
72
  (let ((table (make-syntax-table)))
73
    ;; ";" starts a comment
74
    ;;(modify-syntax-entry ?\; "<" iss-mode-syntax-table)
75
    (modify-syntax-entry ?\; ". 12" table)
76
    ;; and \n and \^M end a comment
77
    (modify-syntax-entry ?\n ">"    table)
78
    (modify-syntax-entry ?\^M ">"   table)
79
80
    (modify-syntax-entry ?\" "."    table)
81
82
    (modify-syntax-entry ?_ "w"     table)
83
    table)
323.1.1 by Lennart Borgman
beta 2.04
84
  "Syntax table in use in iss-mode buffers.")
85
557.1.1 by Lennart Borgman
beta 2.07
86
87
(defvar iss-font-lock-keywords
323.1.1 by Lennart Borgman
beta 2.04
88
  (list
89
   (cons (concat "^;\.*")
90
	 'font-lock-comment-face)
91
   (cons (concat "\\sw+: ")
92
	 'font-lock-keyword-face)
93
   (cons "^[ \t]*\\[\.+\\]" 'font-lock-function-name-face) ;font-lock-constant-face)
94
   (cons "^[ \t]*#include[ \t]*\".+\"" 'font-lock-preprocessor-face)
95
   (cons (concat "^[ \t]*\\<\\(appname\\|appvername\\|appversion\\|appcopyright\\|appid\\|"
96
                 "appmutex\\|beveledlabel\\|defaultdirname\\|versioninfoversion"
97
                 "\\|defaultgroupname\\|minversion\\|outputdir\\|outputbasefilename\\|"
98
                 "allownoicons\\|uninstallfilesdir\\|"
99
                 "sourcedir\\|disableprogramgrouppage\\|alwayscreateuninstallicon\\)\\>")
100
	 'font-lock-type-face)
101
   (cons (concat "\\<\\(alwaysskipifsameorolder\\|uninsneveruninstall\\|"
102
                 "comparetimestampalso\\|restartreplace\\|isreadme\\|"
103
                 "unchecked\\|nowait\\|postinstall\\|skipifsilent\\|ignoreversion\\|"
104
                 "uninsdeletekeyifempty\\|uninsdeletekey\\|"
105
                 "runasoriginaluser\\|runascurrentuser"
106
                 "\\)\\>")
107
	 'font-lock-variable-name-face)
108
   (cons (concat "\\<\\(HKCU\\|HKLM\\|dirifempty\\|files\\|filesandordirs\\)\\>")
557.1.1 by Lennart Borgman
beta 2.07
109
	 'font-lock-constant-face)
110
   (list 'iss-fontify-options '(1 'font-lock-variable-name-face) '(2 'font-lock-keyword-face))
111
   )
112
  "Expressions to highlight in iss mode.")
113
114
(defun iss-fontify-options (bound)
115
  (message "iss-fontify-options %s" bound)
116
  (when (re-search-forward "^[ \t]*\\([^=]+\\)[ \t]*\\(=\\)" bound t)
117
    (match-data)))
118
119
(defvar iss-mode-map (make-sparse-keymap)
120
  "Keymap used in iss-mode buffers.")
323.1.1 by Lennart Borgman
beta 2.04
121
122
(easy-menu-define
123
 iss-menu
124
 iss-mode-map
125
 "InnoSetup script menu"
126
 (list
127
  "ISS"
128
  ["Compile"         (iss-compile)  t]
129
  ["Run Installer"   (iss-run-installer)  t]
130
  ["InnoSetup Help"  (iss-compiler-help)  t]
131
  ))
132
(easy-menu-add iss-menu)
133
337.1.1 by Lennart Borgman
beta 2.06
134
(defvar compilation-file-regexp-alist) ;; silence compiler, don't know the var.
135
323.1.1 by Lennart Borgman
beta 2.04
136
;;;###autoload
137
(defun iss-mode ()
138
  "Major mode for editing InnoSetup script files. Upon startup iss-mode-hook is run."
139
  (interactive)
140
  (kill-all-local-variables)
141
  (use-local-map iss-mode-map)
142
  (setq major-mode 'iss-mode)
143
  (setq mode-name "iss")
144
  (set-syntax-table iss-mode-syntax-table)
145
  (set (make-local-variable 'comment-start) ";")
146
  (set (make-local-variable 'comment-end) "")
147
  (set (make-local-variable 'comment-multi-line) nil)
148
149
  (set (make-local-variable 'compilation-error-regexp-alist)
150
        '(("\\(Error on line\\) \\([0-9]+\\):" nil 2)))
151
  (set (make-local-variable 'compilation-file-regexp-alist)
152
          '(("iscc \\(.*\\)$" 1)))
153
154
  ;; Font lock support
155
  (make-local-variable 'font-lock-defaults)
156
  (setq font-lock-defaults '(iss-font-lock-keywords nil t))
157
  (run-hooks 'iss-mode-hook))
158
159
(defun iss-compiler-help ()
160
  "Start the online documentation for the InnoSetup compiler"
161
  (interactive)
162
  (let ((default-directory (or iss-compiler-path default-directory)))
163
    (w32-shell-execute 1 "ISetup.chm")))
164
165
(defun iss-compile ()
166
  "Compile the actual file with the InnoSetup compiler"
167
  (interactive)
168
  (let ((default-directory (or iss-compiler-path default-directory))
169
        (compilation-process-setup-function 'iss-process-setup))
170
    (compile (concat "iscc " (buffer-file-name)))))
171
172
(defun iss-process-setup ()
173
  "Set up `compilation-exit-message-function' for `iss-compile'."
174
  (set (make-local-variable 'compilation-exit-message-function)
175
       'iss-compilation-exit-message-function))
176
177
(defun iss-compilation-exit-message-function (process-status exit-status msg)
178
  (interactive)
179
  (save-excursion
180
    (let ((buffer-read-only nil))
181
      (goto-char (point-min))
182
      ;;scroll down one line, so that the compile command is parsed to:
183
      ;; -> get the filename of the compiled file
184
      (insert "\n")))
185
  (cons msg exit-status))
186
187
(defun iss-find-option (option)
188
  (let ((search-regexp
189
         (concat option "[ \t]*=[ \t]*\\(.*\\)$")))
190
    (save-excursion
191
      (goto-char (point-min))
192
      (when (search-forward-regexp search-regexp nil t)
193
            (buffer-substring-no-properties (match-beginning 1) (match-end 1))))))
194
195
(defun iss-run-installer ()
196
  (interactive)
197
  (let ((executable
198
         (concat (or (iss-find-option "outputdir") "Output\\")
199
                 (or (iss-find-option "outputbasefilename") "setup")
200
                 ".exe")))
201
    (w32-shell-execute 1 executable)))
202
203
(provide 'iss-mode)
204
205
;; arch-tag: b07b7119-d591-465e-927f-d0be0bcf7cab