(motion_event_is_in_menu): Make x and y signed.
[bpt/emacs.git] / lisp / startup.el
CommitLineData
c88ab9ce
ER
1;;; startup.el --- process Emacs shell arguments
2
d3cf8dc3 3;; Copyright (C) 1985, 1986, 1992, 1994, 1995 Free Software Foundation, Inc.
eea8d4ef 4
630cc463 5;; Maintainer: FSF
d7b4d18f 6;; Keywords: internal
630cc463 7
a726e0d1
JB
8;; This file is part of GNU Emacs.
9
10;; GNU Emacs is free software; you can redistribute it and/or modify
11;; it under the terms of the GNU General Public License as published by
4746118a 12;; the Free Software Foundation; either version 2, or (at your option)
a726e0d1
JB
13;; any later version.
14
15;; GNU Emacs is distributed in the hope that it will be useful,
16;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18;; GNU General Public License for more details.
19
20;; You should have received a copy of the GNU General Public License
b578f267
EN
21;; along with GNU Emacs; see the file COPYING. If not, write to the
22;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23;; Boston, MA 02111-1307, USA.
a726e0d1 24
630cc463 25;;; Commentary:
a726e0d1 26
ab30fc8a
RS
27;; This file parses the command line and gets Emacs running. Options on
28;; the command line are handled in precedence order. The order is the
29;; one in the list below; first described means first handled. Options
30;; within each category (delimited by a bar) are handled in the order
31;; encountered on the command line.
32
33;; -------------------------
34;; -version Print Emacs version to stderr, then exit
35;; --version successfully right away.
36;; This option is handled by emacs.c
37;; -------------------------
38;; -help Print a short usage description and exit
39;; --help successfully right away.
40;; This option is handled by emacs.c
41;; -------------------------
42;; -nl Do not use shared memory (for systems that
43;; -no-shared-memory support this) for the dumped Emacs data.
44;; This option is handled by emacs.c
45;;
46;; -map For VMS.
47;; --map-data This option is handled by emacs.c
48;; -------------------------
49;; -t FILE Use FILE as the name of the terminal.
50;; --terminal FILE Using this implies "-nw" also.
51;; This option is handled by emacs.c
52;; -------------------------
53;; -d DISPNAME Use DISPNAME as the name of the X-windows
54;; -display DISPNAME display for the initial frame.
55;; --display DISPNAME This option is handled by emacs.c
56;; -------------------------
57;; -nw Do not use a windows system (but use the
58;; --no-windows terminal instead.)
59;; This option is handled by emacs.c
60;; -------------------------
61;; -batch Execute noninteractively (messages go to stdout,
62;; --batch variable noninteractive set to t)
63;; This option is handled by emacs.c
64;; -------------------------
65;; -q Do not load user's init file and do not load
66;; -no-init-file "default.el". Regardless of this switch,
6f9340dd 67;; --no-init-file "site-start" is still loaded.
ab30fc8a 68;; -------------------------
6f9340dd 69;; -no-site-file Do not load "site-start.el". (This is the ONLY
ab30fc8a
RS
70;; --no-site-file way to prevent loading that file.)
71;; -------------------------
72;; -u USER Load USER's init file instead of the init
73;; -user USER file belonging to the user starting Emacs.
74;; --user USER
75;; -------------------------
76;; -debug-init Don't catch errors in init files; let the
77;; --debug-init debugger run.
78;; -------------------------
79;; -i ICONTYPE Set type of icon using when Emacs is
80;; -itype ICONTYPE iconified under X-windows.
81;; --icon-type ICONTYPE This option is passed on to term/x-win.el
82;;
83;; -iconic Start Emacs iconified under X-windows.
84;; --iconic This option is passed on to term/x-win.el
85;; -------------------------
86;; Various X-windows options for colors/fonts/geometry/title etc.
87;; These options are passed on to term/x-win.el which see. Certain
88;; of these are also found in term/pc-win.el
89;; -------------------------
90;; FILE Visit FILE.
91;;
92;; -L DIRNAME Add DIRNAME to load-path
93;; -directory DIRNAME
94;; --directory DIRNAME
95;;
96;; -l FILE Load and execute the Emacs lisp code
97;; -load FILE in FILE.
98;; --load FILE
99;;
100;; -f FUNC Execute Emacs lisp function FUNC with
101;; -funcall FUNC no arguments. The "-e" form is outdated
102;; --funcall FUNC and should not be used. (It's a typo
103;; -e FUNC promoted to a feature.)
104;;
955093c9
EN
105;; -eval FORM Execute Emacs lisp form FORM.
106;; --eval FORM
e6b75e30 107;;
ab30fc8a
RS
108;; -insert FILE Insert the contents of FILE into buffer.
109;; --insert FILE
110;; -------------------------
111;; -kill Kill (exit) Emacs right away.
112;; --kill
113;; -------------------------
a726e0d1 114
630cc463
ER
115;;; Code:
116
a726e0d1
JB
117(setq top-level '(normal-top-level))
118
119(defvar command-line-processed nil "t once command line has been processed")
120
121(defconst inhibit-startup-message nil
1d7da582 122 "*Non-nil inhibits the initial startup message.
a726e0d1
JB
123This is for use in your personal init file, once you are familiar
124with the contents of the startup message.")
125
1d7da582
RS
126(defconst inhibit-startup-echo-area-message nil
127 "*Non-nil inhibits the initial startup echo area message.
128Inhibition takes effect only if your `.emacs' file contains
e5575c06 129a line of this form:
54a003f7 130 (setq inhibit-startup-echo-area-message \"YOUR-USER-NAME\")
e5575c06
RS
131If your `.emacs' file is byte-compiled, use the following form instead:
132 (eval '(setq inhibit-startup-echo-area-message \"YOUR-USER-NAME\"))
1d7da582
RS
133Thus, someone else using a copy of your `.emacs' file will see
134the startup message unless he personally acts to inhibit it.")
135
a726e0d1
JB
136(defconst inhibit-default-init nil
137 "*Non-nil inhibits loading the `default' library.")
138
139(defconst command-switch-alist nil
140 "Alist of command-line switches.
141Elements look like (SWITCH-STRING . HANDLER-FUNCTION).
142HANDLER-FUNCTION receives switch name as sole arg;
143remaining command-line args are in the variable `command-line-args-left'.")
144
860befc8
RS
145(defvar command-line-args-left nil
146 "List of command-line args not yet processed.")
147
a726e0d1
JB
148(defvar command-line-functions nil ;; lrs 7/31/89
149 "List of functions to process unrecognized command-line arguments.
150Each function should access the dynamically bound variables
b4484ea8 151`argi' (the current argument) and `command-line-args-left' (the remaining
a726e0d1 152arguments). The function should return non-nil only if it recognizes and
b4484ea8
RS
153processes `argi'. If it does so, it may consume successive arguments by
154altering `command-line-args-left' to remove them.")
a726e0d1 155
09a1077c
RS
156(defvar command-line-default-directory nil
157 "Default directory to use for command line arguments.
158This is normally copied from `default-directory' when Emacs starts.")
159
b3afdeb8
RS
160;;; This is here, rather than in x-win.el, so that we can ignore these
161;;; options when we are not using X.
162(defvar command-line-x-option-alist
163 '(("-bw" 1 x-handle-numeric-switch border-width)
164 ("-d" 1 x-handle-display)
165 ("-display" 1 x-handle-display)
166 ("-name" 1 x-handle-name-rn-switch)
167 ("-rn" 1 x-handle-name-rn-switch)
168 ("-T" 1 x-handle-switch name)
169 ("-r" 0 x-handle-switch reverse t)
170 ("-rv" 0 x-handle-switch reverse t)
171 ("-reverse" 0 x-handle-switch reverse t)
172 ("-reverse-video" 0 x-handle-switch reverse t)
173 ("-fn" 1 x-handle-switch font)
174 ("-font" 1 x-handle-switch font)
175 ("-ib" 1 x-handle-numeric-switch internal-border-width)
1f7f78f1
RS
176 ("-g" 1 x-handle-geometry)
177 ("-geometry" 1 x-handle-geometry)
b3afdeb8
RS
178 ("-fg" 1 x-handle-switch foreground-color)
179 ("-foreground" 1 x-handle-switch foreground-color)
180 ("-bg" 1 x-handle-switch background-color)
181 ("-background" 1 x-handle-switch background-color)
182 ("-ms" 1 x-handle-switch mouse-color)
183 ("-itype" 0 x-handle-switch icon-type t)
184 ("-i" 0 x-handle-switch icon-type t)
185 ("-iconic" 0 x-handle-iconic)
186 ("-xrm" 1 x-handle-xrm-switch)
187 ("-cr" 1 x-handle-switch cursor-color)
188 ("-vb" 0 x-handle-switch vertical-scroll-bars t)
189 ("-hb" 0 x-handle-switch horizontal-scroll-bars t)
190 ("-bd" 1 x-handle-switch)
191 ("--border-width" 1 x-handle-numeric-switch border-width)
192 ("--display" 1 x-handle-display)
193 ("--name" 1 x-handle-name-rn-switch)
194 ("--title" 1 x-handle-name-rn-switch)
195 ("--reverse-video" 0 x-handle-switch reverse t)
196 ("--font" 1 x-handle-switch font)
197 ("--internal-border" 1 x-handle-numeric-switch internal-border-width)
1f7f78f1 198 ("--geometry" 1 x-handle-geometry)
b3afdeb8
RS
199 ("--foreground-color" 1 x-handle-switch foreground-color)
200 ("--background-color" 1 x-handle-switch background-color)
201 ("--mouse-color" 1 x-handle-switch mouse-color)
202 ("--icon-type" 0 x-handle-switch icon-type t)
203 ("--iconic" 0 x-handle-iconic)
204 ("--xrm" 1 x-handle-xrm-switch)
205 ("--cursor-color" 1 x-handle-switch cursor-color)
206 ("--vertical-scroll-bars" 0 x-handle-switch vertical-scroll-bars t)
207 ("--border-color" 1 x-handle-switch border-width))
208 "Alist of X Windows options.
209Each element has the form
210 (NAME NUMARGS HANDLER FRAME-PARAM VALUE)
211where NAME is the option name string, NUMARGS is the number of arguments
212that the option accepts, HANDLER is a function to call to handle the option.
213FRAME-PARAM (optional) is the frame parameter this option specifies,
214and VALUE is the value which is given to that frame parameter
215\(most options use the argument for this, so VALUE is not present).")
216
e3bd99f5 217(defvar before-init-hook nil
db3f571a 218 "Normal hook run after handling urgent options but before loading init files.")
3fc958a4 219
e3bd99f5 220(defvar after-init-hook nil
db3f571a
KH
221 "Normal hook run after loading the init files, `~/.emacs' and `default.el'.
222There is no `condition-case' around the running of these functions;
223therefore, if you set `debug-on-error' non-nil in `.emacs',
224an error in one of these functions will invoke the debugger.")
225
226(defvar emacs-startup-hook nil
227 "Normal hook run after loading init files and handling the command line.")
e3bd99f5 228
a726e0d1 229(defvar term-setup-hook nil
db3f571a
KH
230 "Normal hook run after loading terminal-specific Lisp code.
231It also follows `emacs-startup-hook'. This hook exists for users to set,
a726e0d1
JB
232so as to override the definitions made by the terminal-specific file.
233Emacs never sets this variable itself.")
234
235(defvar keyboard-type nil
b4484ea8
RS
236 "The brand of keyboard you are using.
237This variable is used to define
a726e0d1
JB
238the proper function and keypad keys for use under X. It is used in a
239fashion analogous to the environment value TERM.")
240
241(defvar window-setup-hook nil
b4484ea8
RS
242 "Normal hook run to initialize window system display.
243Emacs runs this hook after processing the command line arguments and loading
244the user's init file.")
a726e0d1
JB
245
246(defconst initial-major-mode 'lisp-interaction-mode
247 "Major mode command symbol to use for the initial *scratch* buffer.")
248
249(defvar init-file-user nil
250 "Identity of user whose `.emacs' file is or was read.
2bdfaa42
KH
251The value is nil if no init file is being used; otherwise, it may be either
252the null string, meaning that the init file was taken from the user that
253originally logged in, or it may be a string containing a user's name.
a726e0d1 254
2bdfaa42
KH
255In either of the latter cases, `(concat \"~\" init-file-user \"/\")'
256evaluates to the name of the directory where the `.emacs' file was
13fce4e6
RS
257looked for.
258
259Setting `init-file-user' does not prevent Emacs from loading
260`site-start.el'. The only way to do that is to use `--no-site-file'.")
a726e0d1 261
b7444d31
RS
262(defvar site-run-file "site-start"
263 "File containing site-wide run-time initializations.
264This file is loaded at run-time before `~/.emacs'. It contains inits
265that need to be in place for the entire site, but which, due to their
266higher incidence of change, don't make sense to load into emacs'
267dumped image. Thus, the run-time load order is: 1. file described in
13fce4e6
RS
268this variable, if non-nil; 2. `~/.emacs'; 3. `default.el'.
269
270Don't use the `site-start.el' file for things some users may not like.
271Put them in `default.el' instead, so that users can more easily
272override them. Users can prevent loading `default.el' with the `-q'
273option or by setting `inhibit-default-init' in their own init files,
274but inhibiting `site-start.el' requires `--no-site-file', which
275is less convenient.")
b7444d31 276
30dc01ea
RS
277(defconst iso-8859-1-locale-regexp "8859[-_]?1"
278 "Regexp that specifies when to enable the ISO 8859-1 character set.
279We do that if this regexp matches the locale name
280specified by the LC_ALL, LC_CTYPE and LANG environment variables.")
281
c13fbb62
RS
282(defvar mail-host-address nil
283 "*Name of this machine, for purposes of naming users.")
284
c10d1f06 285(defvar user-mail-address nil
452e9090
RS
286 "*Full mailing address of this user.
287This is initialized based on `mail-host-address',
288after your init file is read, in case it sets `mail-host-address'.")
c10d1f06 289
1f7f78f1
RS
290(defvar auto-save-list-file-prefix
291 (if (eq system-type 'ms-dos)
292 "~/_s" ; MS-DOS cannot have initial dot, and allows only 8.3 names
293 "~/.saves-")
cdee38c3
KH
294 "Prefix for generating `auto-save-list-file-name'.
295This is used after reading your `.emacs' file to initialize
296`auto-save-list-file-name', by appending Emacs's pid and the system name,
297if you have not already set `auto-save-list-file-name' yourself.
298Set this to nil if you want to prevent `auto-save-list-file-name'
299from being initialized.")
2e05d063 300
a726e0d1
JB
301(defvar init-file-debug nil)
302
52320897
RS
303(defvar init-file-had-error nil)
304
e87a7309
RS
305;; This function is called from the subdirs.el file.
306(defun normal-top-level-add-to-load-path (dirs)
307 (let ((tail (member default-directory load-path)))
308 (setcdr tail (append (mapcar 'expand-file-name dirs) (cdr tail)))))
309
a726e0d1
JB
310(defun normal-top-level ()
311 (if command-line-processed
312 (message "Back to top level.")
313 (setq command-line-processed t)
8d4c2221
RS
314 ;; Give *Messages* the same default-directory as *scratch*,
315 ;; just to keep things predictable.
316 (let ((dir default-directory))
317 (save-excursion
318 (set-buffer (get-buffer "*Messages*"))
319 (setq default-directory dir)))
e87a7309
RS
320 ;; Look in each dir in load-path for a subdirs.el file.
321 ;; If we find one, load it, which will add the appropriate subdirs
322 ;; of that dir into load-path,
323 (let ((tail load-path)
324 new)
325 (while tail
326 (setq new (cons (car tail) new))
327 (let ((default-directory (car tail)))
328 (load (expand-file-name "subdirs.el" (car tail)) t t t))
329 (setq tail (cdr tail))))
ffd56f97 330 (if (not (eq system-type 'vax-vms))
a4b33896
JB
331 (progn
332 ;; If the PWD environment variable isn't accurate, delete it.
333 (let ((pwd (getenv "PWD")))
334 (and (stringp pwd)
335 ;; Use FOO/., so that if FOO is a symlink, file-attributes
336 ;; describes the directory linked to, not FOO itself.
337 (or (equal (file-attributes
338 (concat (file-name-as-directory pwd) "."))
339 (file-attributes
340 (concat (file-name-as-directory default-directory)
341 ".")))
342 (setq process-environment
343 (delete (concat "PWD=" pwd)
344 process-environment)))))))
492878e4 345 (setq default-directory (abbreviate-file-name default-directory))
6f2c86fa
KH
346 (let ((menubar-bindings-done nil))
347 (unwind-protect
348 (command-line)
349 ;; Do this again, in case .emacs defined more abbreviations.
350 (setq default-directory (abbreviate-file-name default-directory))
b3c7c12c
RS
351 ;; Specify the file for recording all the auto save files of this session.
352 ;; This is used by recover-session.
cdee38c3
KH
353 (or auto-save-list-file-name
354 (and auto-save-list-file-prefix
355 (setq auto-save-list-file-name
1f7f78f1
RS
356 ;; Under MS-DOS our PID is almost always reused between
357 ;; Emacs invocations. We need something more unique.
358 (if (eq system-type 'ms-dos)
2c42ec0b
RS
359 (concat
360 (make-temp-name
361 (expand-file-name auto-save-list-file-prefix))
362 "~")
363
364 (expand-file-name (format "%s%d-%s~"
1f7f78f1
RS
365 auto-save-list-file-prefix
366 (emacs-pid)
367 (system-name)))))))
6f2c86fa
KH
368 (run-hooks 'emacs-startup-hook)
369 (and term-setup-hook
370 (run-hooks 'term-setup-hook))
371 ;; Modify the initial frame based on what .emacs puts into
372 ;; ...-frame-alist.
373 (if (fboundp 'frame-notice-user-settings)
374 (frame-notice-user-settings))
375 ;; Now we know the user's default font, so add it to the menu.
376 (if (fboundp 'font-menu-add-default)
377 (font-menu-add-default))
378 (and window-setup-hook
379 (run-hooks 'window-setup-hook))
380 (or menubar-bindings-done
39d6d6be 381 (if (or (eq window-system 'x) (eq window-system 'win32))
365636dc 382 (precompute-menubar-bindings)))))))
6f2c86fa
KH
383
384;; Precompute the keyboard equivalents in the menu bar items.
385(defun precompute-menubar-bindings ()
365636dc
RS
386 (let ((submap (lookup-key global-map [menu-bar])))
387 (while submap
388 (and (consp (car submap))
389 (symbolp (car (car submap)))
390 (stringp (car-safe (cdr (car submap))))
391 (keymapp (cdr (cdr (car submap))))
a18042d7
RS
392 (progn
393 (x-popup-menu nil (cdr (cdr (car submap))))
394 (if purify-flag
395 (garbage-collect))))
365636dc
RS
396 (setq submap (cdr submap))))
397 (setq define-key-rebound-commands t))
a726e0d1
JB
398
399(defun command-line ()
09a1077c
RS
400 (setq command-line-default-directory default-directory)
401
74f2ab06 402 ;; See if we should import version-control from the environment variable.
a726e0d1
JB
403 (let ((vc (getenv "VERSION_CONTROL")))
404 (cond ((eq vc nil)) ;don't do anything if not set
405 ((or (string= vc "t")
406 (string= vc "numbered"))
407 (setq version-control t))
408 ((or (string= vc "nil")
409 (string= vc "existing"))
410 (setq version-control nil))
411 ((or (string= vc "never")
412 (string= vc "simple"))
413 (setq version-control 'never))))
414
30dc01ea
RS
415 (if (let ((ctype
416 ;; Use the first of these three envvars that has a nonempty value.
417 (or (let ((string (getenv "LC_ALL")))
418 (and (not (equal string "")) string))
419 (let ((string (getenv "LC_CTYPE")))
420 (and (not (equal string "")) string))
421 (let ((string (getenv "LANG")))
422 (and (not (equal string "")) string)))))
423 (and ctype
424 (string-match iso-8859-1-locale-regexp ctype)))
e9d8e8c7 425 (progn
62bb5440 426 (require 'disp-table)
e9d8e8c7
RS
427 (standard-display-european t)
428 (require 'iso-syntax)))
429
79058860
JB
430 ;;! This has been commented out; I currently find the behavior when
431 ;;! split-window-keep-point is nil disturbing, but if I can get used
432 ;;! to it, then it would be better to eliminate the option.
433 ;;! ;; Choose a good default value for split-window-keep-point.
434 ;;! (setq split-window-keep-point (> baud-rate 2400))
f35fe3c6 435
a726e0d1 436 ;; Read window system's init file if using a window system.
1ed14cfd
RS
437 (condition-case error
438 (if (and window-system (not noninteractive))
439 (load (concat term-file-prefix
440 (symbol-name window-system)
441 "-win")
442 ;; Every window system should have a startup file;
443 ;; barf if we can't find it.
444 nil t))
445 ;; If we can't read it, print the error message and exit.
446 (error
2677ad61
RS
447 (princ
448 (if (eq (car error) 'error)
449 (apply 'concat (cdr error))
450 (if (memq 'file-error (get (car error) 'error-conditions))
451 (format "%s: %s"
452 (nth 1 error)
453 (mapconcat '(lambda (obj) (prin1-to-string obj t))
454 (cdr (cdr error)) ", "))
455 (format "%s: %s"
456 (get (car error) 'error-message)
457 (mapconcat '(lambda (obj) (prin1-to-string obj t))
458 (cdr error) ", "))))
459 'external-debugging-output)
460 (setq window-system nil)
1ed14cfd 461 (kill-emacs)))
a726e0d1 462
03e3c30a
JB
463 (let ((done nil)
464 (args (cdr command-line-args)))
465
a726e0d1
JB
466 ;; Figure out which user's init file to load,
467 ;; either from the environment or from the options.
468 (setq init-file-user (if noninteractive nil (user-login-name)))
469 ;; If user has not done su, use current $HOME to find .emacs.
470 (and init-file-user (string= init-file-user (user-real-login-name))
471 (setq init-file-user ""))
03e3c30a
JB
472
473 ;; Process the command-line args, and delete the arguments
474 ;; processed. This is consistent with the way main in emacs.c
475 ;; does things.
a726e0d1 476 (while (and (not done) args)
096b7031 477 (let ((longopts '(("--no-init-file") ("--no-site-file") ("--user")
a360cae9 478 ("--debug-init") ("--iconic") ("--icon-type")))
096b7031
KH
479 (argi (car args))
480 (argval nil))
452e9090
RS
481 ;; Handle --OPTION=VALUE format.
482 (if (and (string-match "\\`--" argi)
483 (string-match "=" argi))
a981e7ff
KH
484 (setq argval (substring argi (match-end 0))
485 argi (substring argi 0 (match-beginning 0))))
096b7031
KH
486 (let ((completion (try-completion argi longopts)))
487 (if (eq completion t)
488 (setq argi (substring argi 1))
489 (if (stringp completion)
490 (let ((elt (assoc completion longopts)))
491 (or elt
492 (error "Option `%s' is ambiguous" argi))
3f53ddd0
RS
493 (setq argi (substring (car elt) 1)))
494 (setq argval nil))))
a726e0d1
JB
495 (cond
496 ((or (string-equal argi "-q")
497 (string-equal argi "-no-init-file"))
498 (setq init-file-user nil
499 args (cdr args)))
500 ((or (string-equal argi "-u")
501 (string-equal argi "-user"))
096b7031 502 (or argval
d3bea05f
RS
503 (setq args (cdr args)
504 argval (car args)))
096b7031
KH
505 (setq init-file-user argval
506 argval nil
a726e0d1 507 args (cdr args)))
b7444d31
RS
508 ((string-equal argi "-no-site-file")
509 (setq site-run-file nil
510 args (cdr args)))
a726e0d1
JB
511 ((string-equal argi "-debug-init")
512 (setq init-file-debug t
513 args (cdr args)))
a360cae9
RS
514 ((string-equal argi "-iconic")
515 (setq initial-frame-alist
516 (cons '(visibility . icon) initial-frame-alist))
517 (setq args (cdr args)))
518 ((or (string-equal argi "-icon-type")
519 (string-equal argi "-i")
520 (string-equal argi "-itype"))
521 (setq default-frame-alist
522 (cons '(icon-type . t) default-frame-alist))
523 (setq args (cdr args)))
096b7031
KH
524 (t (setq done t)))
525 ;; Was argval set but not used?
526 (and argval
527 (error "Option `%s' doesn't allow an argument" argi))))
528
03e3c30a 529 ;; Re-attach the program name to the front of the arg list.
4048e56d 530 (and command-line-args (setcdr command-line-args args)))
a726e0d1 531
c722566c 532 ;; Under X Windows, this creates the X frame and deletes the terminal frame.
4e1b1e72
JB
533 (if (fboundp 'face-initialize)
534 (face-initialize))
853ccbd5
RS
535 (if (fboundp 'frame-initialize)
536 (frame-initialize))
1fe0333f 537 ;; If frame was created with a menu bar, set menu-bar-mode on.
39d6d6be 538 (if (or (not (or (eq window-system 'x) (eq window-system 'win32)))
3ede3ece 539 (> (cdr (assq 'menu-bar-lines (frame-parameters))) 0))
1fe0333f 540 (menu-bar-mode t))
c722566c 541
e3bd99f5 542 (run-hooks 'before-init-hook)
3fc958a4 543
09973c54
RM
544 ;; Run the site-start library if it exists. The point of this file is
545 ;; that it is run before .emacs. There is no point in doing this after
546 ;; .emacs; that is useless.
b7444d31
RS
547 (if site-run-file
548 (load site-run-file t t))
09973c54 549
8a988f45
RS
550 ;; Sites should not disable this. Only individuals should disable
551 ;; the startup message.
552 (setq inhibit-startup-message nil)
553
a726e0d1 554 ;; Load that user's init file, or the default one, or none.
3d1b78f0
RS
555 (let (debug-on-error-from-init-file
556 debug-on-error-should-be-set
557 (debug-on-error-initial
558 (if (eq init-file-debug t) 'startup init-file-debug)))
559 (let ((debug-on-error debug-on-error-initial)
560 ;; This function actually reads the init files.
561 (inner
562 (function
563 (lambda ()
564 (if init-file-user
a4c5c705
RS
565 (progn
566 (setq user-init-file
567 (cond
568 ((eq system-type 'ms-dos)
569 (concat "~" init-file-user "/_emacs"))
7d1aa45d 570 ((eq system-type 'windows-nt)
521736d1
RS
571 (if (file-exists-p "~/.emacs")
572 "~/.emacs"
573 "~/_emacs"))
a4c5c705
RS
574 ((eq system-type 'vax-vms)
575 "sys$login:.emacs")
576 (t
577 (concat "~" init-file-user "/.emacs"))))
578 (load user-init-file t t t)
579 (or inhibit-default-init
580 (let ((inhibit-startup-message nil))
581 ;; Users are supposed to be told their rights.
582 ;; (Plus how to get help and how to undo.)
583 ;; Don't you dare turn this off for anyone
584 ;; except yourself.
585 (load "default" t t)))))))))
3d1b78f0
RS
586 (if init-file-debug
587 ;; Do this without a condition-case if the user wants to debug.
588 (funcall inner)
589 (condition-case error
590 (progn
591 (funcall inner)
592 (setq init-file-had-error nil))
593 (error (message "Error in init file: %s%s%s"
594 (get (car error) 'error-message)
ad2aeb8d 595 (if (cdr error) ": " "")
3d1b78f0
RS
596 (mapconcat 'prin1-to-string (cdr error) ", "))
597 (setq init-file-had-error t))))
ad2aeb8d 598 ;; If we can tell that the init file altered debug-on-error,
3d1b78f0
RS
599 ;; arrange to preserve the value that it set up.
600 (or (eq debug-on-error debug-on-error-initial)
601 (setq debug-on-error-should-be-set t
602 debug-on-error-from-init-file debug-on-error)))
603 (if debug-on-error-should-be-set
604 (setq debug-on-error debug-on-error-from-init-file)))
3fc958a4 605
556f7d77
RS
606 ;; Do this here in case the init file sets mail-host-address.
607 (or user-mail-address
608 (setq user-mail-address (concat (user-login-name) "@"
609 (or mail-host-address
610 (system-name)))))
611
e3bd99f5
RM
612 (run-hooks 'after-init-hook)
613
a726e0d1
JB
614 ;; If *scratch* exists and init file didn't change its mode, initialize it.
615 (if (get-buffer "*scratch*")
616 (save-excursion
617 (set-buffer "*scratch*")
618 (if (eq major-mode 'fundamental-mode)
619 (funcall initial-major-mode))))
620 ;; Load library for our terminal type.
621 ;; User init file can set term-file-prefix to nil to prevent this.
622 (and term-file-prefix (not noninteractive) (not window-system)
623 (let ((term (getenv "TERM"))
624 hyphend)
625 (while (and term
626 (not (load (concat term-file-prefix term) t t)))
627 ;; Strip off last hyphen and what follows, then try again
628 (if (setq hyphend (string-match "[-_][^-_]+$" term))
629 (setq term (substring term 0 hyphend))
630 (setq term nil)))))
631
03e3c30a 632 ;; Process the remaining args.
a726e0d1
JB
633 (command-line-1 (cdr command-line-args))
634
635 ;; If -batch, terminate after processing the command options.
636 (if noninteractive (kill-emacs t)))
637
638(defun command-line-1 (command-line-args-left)
52320897 639 (or noninteractive (input-pending-p) init-file-had-error
1d7da582
RS
640 (and inhibit-startup-echo-area-message
641 (let ((buffer (get-buffer-create " *temp*")))
642 (prog1
643 (condition-case nil
644 (save-excursion
645 (set-buffer buffer)
646 (insert-file-contents user-init-file)
647 (re-search-forward
648 (concat
d9a71a8f
RS
649 "([ \t\n]*setq[ \t\n]+"
650 "inhibit-startup-echo-area-message[ \t\n]+"
651 (regexp-quote
652 (prin1-to-string
653 (if (string= init-file-user "")
654 (user-login-name)
655 init-file-user)))
656 "[ \t\n]*)")
1d7da582
RS
657 nil t))
658 (error nil))
659 (kill-buffer buffer))))
660 (message (if (eq (key-binding "\C-h\C-p") 'describe-project)
661 "For information about the GNU Project and its goals, type C-h C-p."
662 (substitute-command-keys
663 "For information about the GNU Project and its goals, type \\[describe-project]."))))
a726e0d1
JB
664 (if (null command-line-args-left)
665 (cond ((and (not inhibit-startup-message) (not noninteractive)
666 ;; Don't clobber a non-scratch buffer if init file
667 ;; has selected it.
668 (string= (buffer-name) "*scratch*")
669 (not (input-pending-p)))
670 ;; If there are no switches to process, we might as well
671 ;; run this hook now, and there may be some need to do it
672 ;; before doing any output.
673 (and term-setup-hook
674 (run-hooks 'term-setup-hook))
675 ;; Don't let the hook be run twice.
676 (setq term-setup-hook nil)
4e1b1e72
JB
677
678 ;; It's important to notice the user settings before we
679 ;; display the startup message; otherwise, the settings
680 ;; won't take effect until the user gives the first
681 ;; keystroke, and that's distracting.
682 (if (fboundp 'frame-notice-user-settings)
683 (frame-notice-user-settings))
684
a726e0d1
JB
685 (and window-setup-hook
686 (run-hooks 'window-setup-hook))
687 (setq window-setup-hook nil)
fd11871a
RS
688 ;; Do this now to avoid an annoying delay if the user
689 ;; clicks the menu bar during the sit-for.
39d6d6be 690 (if (or (eq window-system 'x) (eq window-system 'win32))
365636dc 691 (precompute-menubar-bindings))
fd11871a 692 (setq menubar-bindings-done t)
a726e0d1
JB
693 (unwind-protect
694 (progn
6695496f
RS
695 ;; The convention for this piece of code is that
696 ;; each piece of output starts with one or two newlines
697 ;; and does not end with any newlines.
a726e0d1
JB
698 (insert (emacs-version)
699 "
40e23599 700Copyright (C) 1996 Free Software Foundation, Inc.")
a726e0d1
JB
701 ;; If keys have their default meanings,
702 ;; use precomputed string to save lots of time.
703 (if (and (eq (key-binding "\C-h") 'help-command)
704 (eq (key-binding "\C-xu") 'advertised-undo)
705 (eq (key-binding "\C-x\C-c") 'save-buffers-kill-emacs)
e65a6404
RS
706 (eq (key-binding "\C-ht") 'help-with-tutorial)
707 (eq (key-binding "\C-hi") 'info))
6695496f
RS
708 (insert "\n
709Type C-h for help; C-x u to undo changes. (`C-' means use CTRL key.)
a726e0d1
JB
710To kill the Emacs job, type C-x C-c.
711Type C-h t for a tutorial on using Emacs.
e65a6404
RS
712Type C-h i to enter Info, which you can use to read GNU documentation.")
713 (insert (substitute-command-keys
6695496f
RS
714 (format "\n
715Type %s for help; \\[advertised-undo] to undo changes. (`C-' means use CTRL key.)
e65a6404
RS
716To kill the Emacs job, type \\[save-buffers-kill-emacs].
717Type \\[help-with-tutorial] for a tutorial on using Emacs.
718Type \\[info] to enter Info, which you can use to read GNU documentation."
719 (let ((where (where-is-internal
720 'help-command nil t)))
721 (if where
722 (key-description where)
723 "M-x help"))))))
3ede3ece
RS
724 ;; Say how to use the menu bar
725 ;; if that is not with the mouse.
726 (if (not (assq 'display (frame-parameters)))
727 (if (eq (key-binding "\M-`") 'tmm-menubar)
325cbd32 728 (insert "\n\nType F10, ESC ` or Meta-` to use the menu bar.")
3ede3ece
RS
729 (insert (substitute-command-keys
730 "\n\nType \\[tmm-menubar] to use the menu bar."))))
e65a6404
RS
731
732 ;; Windows and MSDOS (currently) do not count as
733 ;; window systems, but do have mouse support.
1f7f78f1 734 (if window-system
6695496f 735 (insert "\n
e65a6404 736C-mouse-3 (third mouse button, with Control) gets a mode-specific menu."))
95127745
KH
737 (and auto-save-list-file-prefix
738 (directory-files
739 (file-name-directory auto-save-list-file-prefix)
740 nil
741 (concat "\\`"
742 (regexp-quote (file-name-nondirectory
743 auto-save-list-file-prefix)))
744 t)
745 (insert "\n\nIf an Emacs session crashed recently,\n"
746 "type M-x recover-session RET to recover"
747 " the files you were editing."))
6695496f 748
e65a6404
RS
749 (if (and (eq (key-binding "\C-h\C-c") 'describe-copying)
750 (eq (key-binding "\C-h\C-d") 'describe-distribution)
751 (eq (key-binding "\C-h\C-w") 'describe-no-warranty))
752 (insert
6695496f 753 "\n
a726e0d1
JB
754GNU Emacs comes with ABSOLUTELY NO WARRANTY; type C-h C-w for full details.
755You may give out copies of Emacs; type C-h C-c to see the conditions.
756Type C-h C-d for information on getting the latest version.")
757 (insert (substitute-command-keys
6695496f 758 "\n
a726e0d1
JB
759GNU Emacs comes with ABSOLUTELY NO WARRANTY; type \\[describe-no-warranty] for full details.
760You may give out copies of Emacs; type \\[describe-copying] to see the conditions.
761Type \\[describe-distribution] for information on getting the latest version.")))
fb3afe87 762
a726e0d1
JB
763 (set-buffer-modified-p nil)
764 (sit-for 120))
765 (save-excursion
766 ;; In case the Emacs server has already selected
767 ;; another buffer, erase the one our message is in.
768 (set-buffer (get-buffer "*scratch*"))
769 (erase-buffer)
770 (set-buffer-modified-p nil)))))
eca1cf26
RS
771 ;; Delay 2 seconds after the init file error message
772 ;; was displayed, so user can read it.
773 (if init-file-had-error
774 (sit-for 2))
09a1077c 775 (let ((dir command-line-default-directory)
a726e0d1
JB
776 (file-count 0)
777 first-file-buffer
778 (line 0))
779 (while command-line-args-left
3f53ddd0
RS
780 (let* ((argi (car command-line-args-left))
781 (orig-argi argi)
782 ;; This includes our standard options' long versions
783 ;; and long versions of what's on command-switch-alist.
784 (longopts
aba66e2a 785 (append '(("--funcall") ("--load") ("--insert") ("--kill")
e6b75e30 786 ("--directory") ("--eval"))
3f53ddd0
RS
787 (mapcar '(lambda (elt)
788 (list (concat "-" (car elt))))
789 command-switch-alist)))
aba66e2a
RS
790 tem argval completion
791 ;; List of directories specified in -L/--directory,
792 ;; in reverse of the order specified.
793 extra-load-path
794 (initial-load-path load-path))
a726e0d1 795 (setq command-line-args-left (cdr command-line-args-left))
3f53ddd0 796
b3afdeb8
RS
797 ;; Add the long X options to longopts.
798 (setq tem command-line-x-option-alist)
799 (while tem
800 (if (string-match "^--" (car (car tem)))
801 (setq longopts (cons (list (car (car tem))) longopts)))
802 (setq tem (cdr tem)))
803
3f53ddd0
RS
804 ;; Convert long options to ordinary options
805 ;; and separate out an attached option argument into argval.
806 (if (string-match "^--[^=]*=" argi)
807 (setq argval (substring argi (match-end 0))
808 argi (substring argi 0 (1- (match-end 0)))))
809 (setq completion (try-completion argi longopts))
810 (if (eq completion t)
811 (setq argi (substring argi 1))
812 (if (stringp completion)
813 (let ((elt (assoc completion longopts)))
814 (or elt
815 (error "Option `%s' is ambiguous" argi))
816 (setq argi (substring (car elt) 1)))
817 (setq argval nil argi orig-argi)))
818
819 ;; Execute the option.
a726e0d1 820 (cond ((setq tem (assoc argi command-switch-alist))
3f53ddd0
RS
821 (if argval
822 (let ((command-line-args-left
823 (cons argval command-line-args-left)))
824 (funcall (cdr tem) argi))
825 (funcall (cdr tem) argi)))
a726e0d1
JB
826 ((or (string-equal argi "-f") ;what the manual claims
827 (string-equal argi "-funcall")
828 (string-equal argi "-e")) ; what the source used to say
3f53ddd0
RS
829 (if argval
830 (setq tem (intern argval))
831 (setq tem (intern (car command-line-args-left)))
832 (setq command-line-args-left (cdr command-line-args-left)))
1908c565
RS
833 (if (arrayp (symbol-function tem))
834 (command-execute tem)
835 (funcall tem)))
e6b75e30
RS
836 ((string-equal argi "-eval")
837 (if argval
838 (setq tem argval)
839 (setq tem (car command-line-args-left))
840 (setq command-line-args-left (cdr command-line-args-left)))
955093c9 841 (eval (read tem)))
aba66e2a
RS
842 ;; Set the default directory as specified in -L.
843 ((or (string-equal argi "-L")
844 (string-equal argi "-directory"))
845 (if argval
846 (setq tem argval)
847 (setq tem (car command-line-args-left)
848 command-line-args-left (cdr command-line-args-left)))
47c7adae 849 (setq tem (command-line-normalize-file-name tem))
aba66e2a
RS
850 (setq extra-load-path
851 (cons (expand-file-name tem) extra-load-path))
852 (setq load-path (append (nreverse extra-load-path)
853 initial-load-path)))
a726e0d1
JB
854 ((or (string-equal argi "-l")
855 (string-equal argi "-load"))
3f53ddd0
RS
856 (if argval
857 (setq tem argval)
858 (setq tem (car command-line-args-left)
859 command-line-args-left (cdr command-line-args-left)))
47c7adae 860 (let ((file (command-line-normalize-file-name tem)))
a726e0d1
JB
861 ;; Take file from default dir if it exists there;
862 ;; otherwise let `load' search for it.
863 (if (file-exists-p (expand-file-name file))
864 (setq file (expand-file-name file)))
3f53ddd0 865 (load file nil t)))
fbce8654 866 ((string-equal argi "-insert")
3f53ddd0
RS
867 (if argval
868 (setq tem argval)
869 (setq tem (car command-line-args-left)
870 command-line-args-left (cdr command-line-args-left)))
2d2aae54
EN
871 (or (stringp tem)
872 (error "File name omitted from `-insert' option"))
47c7adae 873 (insert-file-contents (command-line-normalize-file-name tem)))
a726e0d1
JB
874 ((string-equal argi "-kill")
875 (kill-emacs t))
876 ((string-match "^\\+[0-9]+\\'" argi)
877 (setq line (string-to-int argi)))
b3afdeb8
RS
878 ((setq tem (assoc argi command-line-x-option-alist))
879 ;; Ignore X-windows options and their args if not using X.
880 (setq command-line-args-left
881 (nthcdr (nth 1 tem) command-line-args-left)))
a726e0d1
JB
882 (t
883 ;; We have almost exhausted our options. See if the
884 ;; user has made any other command-line options available
885 (let ((hooks command-line-functions);; lrs 7/31/89
886 (did-hook nil))
887 (while (and hooks
888 (not (setq did-hook (funcall (car hooks)))))
889 (setq hooks (cdr hooks)))
890 (if (not did-hook)
891 ;; Ok, presume that the argument is a file name
892 (progn
7a79b90c
RS
893 (if (string-match "\\`-" argi)
894 (error "Unknown option `%s'" argi))
a726e0d1 895 (setq file-count (1+ file-count))
47c7adae 896 (setq argi (command-line-normalize-file-name argi))
a726e0d1
JB
897 (cond ((= file-count 1)
898 (setq first-file-buffer
899 (find-file (expand-file-name argi dir))))
900 (t
901 (find-file-other-window (expand-file-name argi dir))))
902 (or (zerop line)
903 (goto-line line))
904 (setq line 0))))))))
905 ;; If 3 or more files visited, and not all visible,
906 ;; show user what they all are.
907 (if (> file-count 2)
908 (or (get-buffer-window first-file-buffer)
7e0795a4 909 (progn (other-window 1)
e8997612 910 (buffer-menu)))))))
c88ab9ce 911
47c7adae
RS
912(defun command-line-normalize-file-name (file)
913 "Collapse multiple slashes to one, to handle non-Emacs file names."
aeab376f
RS
914 ;; Use arg 1 so that we don't collapse // at the start of the file name.
915 ;; That is significant on some systems.
dcccc832
RS
916 ;; However, /// at the beginning is supposed to mean just /, not //.
917 (if (string-match "^///+" file)
918 (setq file (replace-match "/" t t file)))
aeab376f 919 (while (string-match "//+" file 1)
47c7adae
RS
920 (setq file (replace-match "/" t t file)))
921 file)
922
c88ab9ce 923;;; startup.el ends here