# HG changeset patch # User Geoff Voelker # Date 873244447 0 # Node ID 4b8ff0021dcbb4287ccd99a2e06362f058510f8e # Parent a96c6fa10e923dfab37dff3d70cbffcaf8c7837e Don't unset C-mouse-down bindings. Ignore "Windows" keys by default. Move keypad key definitions from term/w32-win.el. (convert-standard-file-name): New function. (make-auto-save-file-name): Use convert-standard-file-name. Update doc strings. (w32-startup): Deleted function. (w32-check-shell-configuration, w32-init-info): New functions. (w32-system-shell-p): Renamed from w32-using-system-shell-p. Added shell name argument. diff -r a96c6fa10e92 -r 4b8ff0021dcb lisp/w32-fns.el --- a/lisp/w32-fns.el Tue Sep 02 23:53:22 1997 +0000 +++ b/lisp/w32-fns.el Tue Sep 02 23:54:07 1997 +0000 @@ -42,48 +42,98 @@ ;; Ignore case on file-name completion (setq completion-ignore-case t) +;; Map all versions of a filename (8.3, longname, mixed case) to the +;; same buffer. +(setq find-file-visit-truename t) + (defvar w32-system-shells '("cmd" "cmd.exe" "command" "command.com") - "List of strings recognized as Windows NT/95 system shells.") + "List of strings recognized as Windows NT/9X system shells.") (defun w32-using-nt () - "Return t if running on Windows NT (as oppposed to, e.g., Windows 95)." + "Return t if literally running on Windows NT (i.e., not Windows 9X)." (and (eq system-type 'windows-nt) (getenv "SystemRoot"))) (defun w32-shell-name () - "Return the name of the shell being used on Windows NT/95." + "Return the name of the shell being used." (or (and (boundp 'explicit-shell-file-name) explicit-shell-file-name) (getenv "ESHELL") (getenv "SHELL") (and (w32-using-nt) "cmd.exe") "command.com")) -(defun w32-using-system-shell-p () - "Return t if using a Windows NT/95 system shell (cmd.exe or command.com)." - (member (downcase (file-name-nondirectory (w32-shell-name))) - w32-system-shells)) +(defun w32-system-shell-p (shell-name) + (and shell-name + (member (downcase (file-name-nondirectory shell-name)) + w32-system-shells))) -(defun w32-startup () - "Configure Emacs during startup for running on Windows NT/95. +(defun w32-check-shell-configuration () + "Check the configuration of shell variables on Windows NT/9X. This function is invoked after loading the init files and processing -the command line, and is intended to initialize anything important -not initialized by the user or site." - ;; Configure shell mode if using a system shell. - (cond ((w32-using-system-shell-p) - (let ((shell (file-name-nondirectory (w32-shell-name)))) - ;; "/c" is used for executing command line arguments. - (setq shell-command-switch "/c") - ;; Complete directories using a backslash. - (setq comint-completion-addsuffix '("\\" . " ")) - ;; Initialize the explicit-"shell"-args variable. - (cond ((member (downcase shell) '("cmd" "cmd.exe")) - (let* ((args-sym-name (format "explicit-%s-args" shell)) - (args-sym (intern-soft args-sym-name))) - (cond ((not args-sym) - (setq args-sym (intern args-sym-name)) - ;; The "/q" prevents cmd.exe from echoing commands. - (set args-sym '("/q"))))))))))) +the command line arguments. It issues a warning if the user or site +has configured the shell with inappropriate settings." + (let ((prev-buffer (current-buffer)) + (buffer (get-buffer-create "*Shell Configuration*")) + (system-shell)) + (set-buffer buffer) + (erase-buffer) + (if (w32-system-shell-p (getenv "ESHELL")) + (insert (format "Warning! The ESHELL environment variable uses %s. +You probably want to change it so that it uses cmdproxy.exe instead.\n\n" + (getenv "ESHELL")))) + (if (w32-system-shell-p (getenv "SHELL")) + (insert (format "Warning! The SHELL environment variable uses %s. +You probably want to change it so that it uses cmdproxy.exe instead.\n\n" + (getenv "SHELL")))) + (if (w32-system-shell-p shell-file-name) + (insert (format "Warning! shell-file-name uses %s. +You probably want to change it so that it uses cmdproxy.exe instead.\n\n" + shell-file-name))) + (if (and (boundp 'explicit-shell-file-name) + (w32-system-shell-p explicit-shell-file-name)) + (insert (format "Warning! explicit-shell-file-name uses %s. +You probably want to change it so that it uses cmdproxy.exe instead.\n\n" + explicit-shell-file-name))) + (setq system-shell (> (buffer-size) 0)) + (cond (system-shell + ;; System shells. + (if (string-equal "-c" shell-command-switch) + (insert "Warning! shell-command-switch is \"-c\". +You should set this to \"/c\" when using a system shell.\n\n")) + (if w32-quote-process-args + (insert "Warning! w32-quote-process-args is t. +You should set this to nil when using a system shell.\n\n"))) + ;; Non-system shells. + (t + (if (string-equal "/c" shell-command-switch) + (insert "Warning! shell-command-switch is \"/c\". +You should set this to \"-c\" when using a non-system shell.\n\n")) + (if (not w32-quote-process-args) + (insert "Warning! w32-quote-process-args is nil. +You should set this to t when using a non-system shell.\n\n")))) + (if (> (buffer-size) 0) + (display-buffer buffer) + (kill-buffer buffer)) + (set-buffer prev-buffer))) -(add-hook 'emacs-startup-hook 'w32-startup) +(add-hook 'after-init-hook 'w32-check-shell-configuration) + +;;; Setup Info-default-directory-list to include the info directory +;;; near where Emacs executable was installed. We used to set INFOPATH, +;;; but when this is set Info-default-directory-list is ignored. We +;;; also cannot rely upon what is set in paths.el because they assume +;;; that configuration during build time is correct for runtime. +(defun w32-init-info () + (let* ((instdir (file-name-directory invocation-directory)) + (dir1 (expand-file-name "info/" instdir)) + (dir2 (expand-file-name "../../../info/" instdir))) + (if (file-exists-p dir1) + (setq Info-default-directory-list + (append Info-default-directory-list (list dir1))) + (if (file-exists-p dir2) + (setq Info-default-directory-list + (append Info-default-directory-list (list dir2))))))) + +(add-hook 'before-init-hook 'w32-init-info) ;; Avoid creating auto-save file names containing invalid characters. (fset 'original-make-auto-save-file-name @@ -94,15 +144,22 @@ Does not consider `auto-save-visited-file-name' as that variable is checked before calling this function. You can redefine this for customization. See also `auto-save-file-name-p'." - (let ((name (original-make-auto-save-file-name)) + (convert-standard-filename (original-make-auto-save-file-name))) + +(defun convert-standard-filename (filename) + "Convert a standard file's name to something suitable for the current OS. +This function's standard definition is trivial; it just returns the argument. +However, on some systems, the function is redefined +with a definition that really does change some file names." + (let ((name (copy-sequence filename)) (start 0)) - ;; Skip drive letter if present. - (if (string-match "^[\/]?[a-zA-`]:" name) - (setq start (- (match-end 0) (match-beginning 0)))) - ;; Destructively replace occurrences of *?"<>|: with $ - (while (string-match "[?*\"<>|:]" name start) - (aset name (match-beginning 0) ?$) - (setq start (1+ (match-end 0)))) + ;; leave ':' if part of drive specifier + (if (eq (aref name 1) ?:) + (setq start 2)) + ;; destructively replace invalid filename characters with ! + (while (string-match "[?*:<>|\"\000-\037]" name start) + (aset name (match-beginning 0) ?!) + (setq start (match-end 0))) name)) ;;; Fix interface to (X-specific) mouse.el @@ -114,12 +171,42 @@ (or type (setq type 'PRIMARY)) (get 'x-selections type)) -(fmakunbound 'font-menu-add-default) -(global-unset-key [C-down-mouse-1]) -(global-unset-key [C-down-mouse-2]) -(global-unset-key [C-down-mouse-3]) - ;;; Set to a system sound if you want a fancy bell. (set-message-beep nil) +;;; The "Windows" keys on newer keyboards bring up the Start menu +;;; whether you want it or not - make Emacs ignore these keystrokes +;;; rather than beep. +(global-set-key [lwindow] 'ignore) +(global-set-key [rwindow] 'ignore) + +;; Map certain keypad keys into ASCII characters +;; that people usually expect. +(define-key function-key-map [tab] [?\t]) +(define-key function-key-map [linefeed] [?\n]) +(define-key function-key-map [clear] [11]) +(define-key function-key-map [return] [13]) +(define-key function-key-map [escape] [?\e]) +(define-key function-key-map [M-tab] [?\M-\t]) +(define-key function-key-map [M-linefeed] [?\M-\n]) +(define-key function-key-map [M-clear] [?\M-\013]) +(define-key function-key-map [M-return] [?\M-\015]) +(define-key function-key-map [M-escape] [?\M-\e]) + +;; These don't do the right thing (voelker) +;(define-key function-key-map [backspace] [127]) +;(define-key function-key-map [delete] [127]) +;(define-key function-key-map [M-backspace] [?\M-\d]) +;(define-key function-key-map [M-delete] [?\M-\d]) + +;; These tell read-char how to convert +;; these special chars to ASCII. +(put 'tab 'ascii-character ?\t) +(put 'linefeed 'ascii-character ?\n) +(put 'clear 'ascii-character 12) +(put 'return 'ascii-character 13) +(put 'escape 'ascii-character ?\e) +(put 'backspace 'ascii-character 127) +(put 'delete 'ascii-character 127) + ;;; w32-fns.el ends here