| 1 | ;; dos-w32.el --- Functions shared among MS-DOS and W32 (NT/95) platforms |
| 2 | |
| 3 | ;; Copyright (C) 1996, 2001-2012 Free Software Foundation, Inc. |
| 4 | |
| 5 | ;; Maintainer: Geoff Voelker <voelker@cs.washington.edu> |
| 6 | ;; Keywords: internal |
| 7 | ;; Package: emacs |
| 8 | |
| 9 | ;; This file is part of GNU Emacs. |
| 10 | |
| 11 | ;; GNU Emacs 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 3 of the License, or |
| 14 | ;; (at your option) any later version. |
| 15 | |
| 16 | ;; GNU Emacs 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. If not, see <http://www.gnu.org/licenses/>. |
| 23 | |
| 24 | ;;; Commentary: |
| 25 | |
| 26 | ;; Parts of this code are duplicated functions taken from dos-fns.el |
| 27 | ;; and winnt.el. |
| 28 | |
| 29 | ;;; Code: |
| 30 | |
| 31 | ;; Use ";" instead of ":" as a path separator (from files.el). |
| 32 | (setq path-separator ";") |
| 33 | |
| 34 | (setq minibuffer-history-case-insensitive-variables |
| 35 | (cons 'file-name-history minibuffer-history-case-insensitive-variables)) |
| 36 | |
| 37 | ;; Set the null device (for compile.el). |
| 38 | (setq null-device "NUL") |
| 39 | |
| 40 | ;; For distinguishing file types based upon suffixes. |
| 41 | (defvar file-name-buffer-file-type-alist |
| 42 | '( |
| 43 | ("[:/].*config.sys$" . nil) ; config.sys text |
| 44 | ("\\.\\(obj\\|exe\\|com\\|lib\\|sys\\|bin\\|ico\\|pif\\|class\\)$" . t) |
| 45 | ; MS-Dos stuff |
| 46 | ("\\.\\(dll\\|drv\\|386\\|vxd\\|fon\\|fnt\\|fot\\|ttf\\|grp\\)$" . t) |
| 47 | ; Windows stuff |
| 48 | ("\\.\\(bmp\\|wav\\|avi\\|mpg\\|jpg\\|tif\\|mov\\|au\\)$" . t) |
| 49 | ; known binary data files |
| 50 | ("\\.\\(arc\\|zip\\|pak\\|lzh\\|zoo\\)$" . t) |
| 51 | ; Packers |
| 52 | ("\\.\\(a\\|o\\|tar\\|z\\|gz\\|taz\\|jar\\)$" . t) |
| 53 | ; Unix stuff |
| 54 | ("\\.sx[dmicw]$" . t) ; OpenOffice.org |
| 55 | ("\\.tp[ulpw]$" . t) ; borland Pascal stuff |
| 56 | ("[:/]tags$" . nil) ; emacs TAGS file |
| 57 | ) |
| 58 | "*Alist for distinguishing text files from binary files. |
| 59 | Each element has the form (REGEXP . TYPE), where REGEXP is matched |
| 60 | against the file name, and TYPE is nil for text, t for binary.") |
| 61 | |
| 62 | ;; Return the pair matching filename on file-name-buffer-file-type-alist, |
| 63 | ;; or nil otherwise. |
| 64 | (defun find-buffer-file-type-match (filename) |
| 65 | (let ((alist file-name-buffer-file-type-alist) |
| 66 | (found nil)) |
| 67 | (let ((case-fold-search t)) |
| 68 | (setq filename (file-name-sans-versions filename)) |
| 69 | (while (and (not found) alist) |
| 70 | (if (string-match (car (car alist)) filename) |
| 71 | (setq found (car alist))) |
| 72 | (setq alist (cdr alist))) |
| 73 | found))) |
| 74 | |
| 75 | ;; Don't check for untranslated file systems here. |
| 76 | (defun find-buffer-file-type (filename) |
| 77 | (let ((match (find-buffer-file-type-match filename)) |
| 78 | (code)) |
| 79 | (if (not match) |
| 80 | (default-value 'buffer-file-type) |
| 81 | (setq code (cdr match)) |
| 82 | (cond ((memq code '(nil t)) code) |
| 83 | ((and (symbolp code) (fboundp code)) |
| 84 | (funcall code filename)))))) |
| 85 | |
| 86 | (setq-default buffer-file-coding-system 'undecided-dos) |
| 87 | |
| 88 | (defun find-buffer-file-type-coding-system (command) |
| 89 | "Choose a coding system for a file operation in COMMAND. |
| 90 | COMMAND is a list that specifies the operation, an I/O primitive, as its |
| 91 | CAR, and the arguments that might be given to that operation as its CDR. |
| 92 | If operation is `insert-file-contents', the coding system is chosen based |
| 93 | upon the filename (the CAR of the arguments beyond the operation), the contents |
| 94 | of `untranslated-filesystem-list' and `file-name-buffer-file-type-alist', |
| 95 | and whether the file exists: |
| 96 | |
| 97 | If it matches in `untranslated-filesystem-list': |
| 98 | If the file exists: `undecided' |
| 99 | If the file does not exist: `undecided-unix' |
| 100 | If it matches in `file-name-buffer-file-type-alist': |
| 101 | If the match is t (for binary): `no-conversion' |
| 102 | If the match is nil (for dos-text): `undecided-dos' |
| 103 | Otherwise: |
| 104 | If the file exists: `undecided' |
| 105 | If the file does not exist default value of `buffer-file-coding-system' |
| 106 | |
| 107 | Note that the CAR of arguments to `insert-file-contents' operation could |
| 108 | be a cons cell of the form \(FILENAME . BUFFER\), where BUFFER is a buffer |
| 109 | into which the file's contents were already read, but not yet decoded. |
| 110 | |
| 111 | If operation is `write-region', the coding system is chosen based upon |
| 112 | the value of `buffer-file-coding-system' and `buffer-file-type'. If |
| 113 | `buffer-file-coding-system' is non-nil, its value is used. If it is |
| 114 | nil and `buffer-file-type' is t, the coding system is `no-conversion'. |
| 115 | Otherwise, it is `undecided-dos'. |
| 116 | |
| 117 | The two most common situations are when DOS and Unix files are read |
| 118 | and written, and their names do not match in |
| 119 | `untranslated-filesystem-list' and `file-name-buffer-file-type-alist'. |
| 120 | In these cases, the coding system initially will be `undecided'. As |
| 121 | the file is read in the DOS case, the coding system will be changed to |
| 122 | `undecided-dos' as CR/LFs are detected. As the file is read in the |
| 123 | Unix case, the coding system will be changed to `undecided-unix' as |
| 124 | LFs are detected. In both cases, `buffer-file-coding-system' will be |
| 125 | set to the appropriate coding system, and the value of |
| 126 | `buffer-file-coding-system' will be used when writing the file." |
| 127 | |
| 128 | (let ((op (nth 0 command)) |
| 129 | (binary nil) (text nil) |
| 130 | (undecided nil) (undecided-unix nil) |
| 131 | target target-buf) |
| 132 | (cond ((eq op 'insert-file-contents) |
| 133 | (setq target (nth 1 command)) |
| 134 | ;; If TARGET is a cons cell, it has the form (FILENAME . BUFFER), |
| 135 | ;; where BUFFER is a buffer into which the file was already read, |
| 136 | ;; but its contents were not yet decoded. (This form of the |
| 137 | ;; arguments is used, e.g., in arc-mode.el.) This function |
| 138 | ;; doesn't care about the contents, it only looks at the file's |
| 139 | ;; name, which is the CAR of the cons cell. |
| 140 | (when (consp target) |
| 141 | (setq target-buf |
| 142 | (and (bufferp (cdr target)) |
| 143 | (buffer-name (cdr target)))) |
| 144 | (setq target (car target))) |
| 145 | ;; First check for a file name that indicates |
| 146 | ;; it is truly binary. |
| 147 | (setq binary (find-buffer-file-type target)) |
| 148 | (cond (binary) |
| 149 | ;; Next check for files that MUST use DOS eol conversion. |
| 150 | ((find-buffer-file-type-match target) |
| 151 | (setq text t)) |
| 152 | ;; For any other existing file, decide based on contents. |
| 153 | ((or |
| 154 | (file-exists-p target) |
| 155 | ;; If TARGET does not exist as a file, replace its |
| 156 | ;; base name with TARGET-BUF and try again. This |
| 157 | ;; is for jka-compr's sake, which strips the |
| 158 | ;; compression (.gz etc.) extension from the |
| 159 | ;; FILENAME, but leaves it in the BUFFER's name. |
| 160 | (and (stringp target-buf) |
| 161 | (file-exists-p |
| 162 | (expand-file-name target-buf |
| 163 | (file-name-directory target))))) |
| 164 | (setq undecided t)) |
| 165 | ;; Next check for a non-DOS file system. |
| 166 | ((untranslated-file-p target) |
| 167 | (setq undecided-unix t))) |
| 168 | (cond (binary '(no-conversion . no-conversion)) |
| 169 | (text '(undecided-dos . undecided-dos)) |
| 170 | (undecided-unix '(undecided-unix . undecided-unix)) |
| 171 | (undecided '(undecided . undecided)) |
| 172 | (t (cons (default-value 'buffer-file-coding-system) |
| 173 | (default-value 'buffer-file-coding-system))))) |
| 174 | ((eq op 'write-region) |
| 175 | (if buffer-file-coding-system |
| 176 | (cons buffer-file-coding-system |
| 177 | buffer-file-coding-system) |
| 178 | ;; Normally this is used only in a non-file-visiting |
| 179 | ;; buffer, because normally buffer-file-coding-system is non-nil |
| 180 | ;; in a file-visiting buffer. |
| 181 | (if buffer-file-type |
| 182 | '(no-conversion . no-conversion) |
| 183 | '(undecided-dos . undecided-dos))))))) |
| 184 | |
| 185 | (modify-coding-system-alist 'file "" 'find-buffer-file-type-coding-system) |
| 186 | |
| 187 | (defun find-file-binary (filename) |
| 188 | "Visit file FILENAME and treat it as binary." |
| 189 | (interactive "FFind file binary: ") |
| 190 | (let ((file-name-buffer-file-type-alist '(("" . t)))) |
| 191 | (find-file filename))) |
| 192 | |
| 193 | (defun find-file-text (filename) |
| 194 | "Visit file FILENAME and treat it as a text file." |
| 195 | (interactive "FFind file text: ") |
| 196 | (let ((file-name-buffer-file-type-alist '(("" . nil)))) |
| 197 | (find-file filename))) |
| 198 | |
| 199 | (defun find-file-not-found-set-buffer-file-coding-system () |
| 200 | (with-current-buffer (current-buffer) |
| 201 | (let ((coding buffer-file-coding-system)) |
| 202 | ;; buffer-file-coding-system is already set by |
| 203 | ;; find-operation-coding-system, which was called from |
| 204 | ;; insert-file-contents. All that's left is to change |
| 205 | ;; the EOL conversion, if required by the user. |
| 206 | (when (and (null coding-system-for-read) |
| 207 | (or inhibit-eol-conversion |
| 208 | (untranslated-file-p (buffer-file-name)))) |
| 209 | (setq coding (coding-system-change-eol-conversion coding 0)) |
| 210 | (setq buffer-file-coding-system coding)) |
| 211 | (setq buffer-file-type (eq buffer-file-coding-system 'no-conversion))))) |
| 212 | |
| 213 | ;;; To set the default coding system on new files. |
| 214 | (add-hook 'find-file-not-found-functions |
| 215 | 'find-file-not-found-set-buffer-file-coding-system) |
| 216 | |
| 217 | ;;; To accommodate filesystems that do not require CR/LF translation. |
| 218 | (defvar untranslated-filesystem-list nil |
| 219 | "List of filesystems that require no CR/LF translation when reading |
| 220 | and writing files. Each filesystem in the list is a string naming |
| 221 | the directory prefix corresponding to the filesystem.") |
| 222 | |
| 223 | (defun untranslated-canonical-name (filename) |
| 224 | "Return FILENAME in a canonicalized form for use with the functions |
| 225 | dealing with untranslated filesystems." |
| 226 | (if (memq system-type '(ms-dos windows-nt cygwin)) |
| 227 | ;; The canonical form for DOS/W32 is with A-Z downcased and all |
| 228 | ;; directory separators changed to directory-sep-char. |
| 229 | (let ((name nil)) |
| 230 | (setq name (mapconcat |
| 231 | (lambda (char) |
| 232 | (if (and (<= ?A char) (<= char ?Z)) |
| 233 | (char-to-string (+ (- char ?A) ?a)) |
| 234 | (char-to-string char))) |
| 235 | filename nil)) |
| 236 | ;; Use expand-file-name to canonicalize directory separators, except |
| 237 | ;; with bare drive letters (which would have the cwd appended). |
| 238 | ;; Avoid expanding names that could trigger ange-ftp to prompt |
| 239 | ;; for passwords, though. |
| 240 | (if (or (string-match "^.:$" name) |
| 241 | (string-match "^/[^/:]+:" name)) |
| 242 | name |
| 243 | (expand-file-name name))) |
| 244 | filename)) |
| 245 | |
| 246 | (defun untranslated-file-p (filename) |
| 247 | "Return t if FILENAME is on a filesystem that does not require |
| 248 | CR/LF translation, and nil otherwise." |
| 249 | (let ((fs (untranslated-canonical-name filename)) |
| 250 | (ufs-list untranslated-filesystem-list) |
| 251 | (found nil)) |
| 252 | (while (and (not found) ufs-list) |
| 253 | (if (string-match (concat "^" (car ufs-list)) fs) |
| 254 | (setq found t) |
| 255 | (setq ufs-list (cdr ufs-list)))) |
| 256 | found)) |
| 257 | |
| 258 | (defun add-untranslated-filesystem (filesystem) |
| 259 | "Add FILESYSTEM to the list of filesystems that do not require |
| 260 | CR/LF translation. FILESYSTEM is a string containing the directory |
| 261 | prefix corresponding to the filesystem. For example, for a Unix |
| 262 | filesystem mounted on drive Z:, FILESYSTEM could be \"Z:\"." |
| 263 | ;; We use "D", not "f", to avoid confusing the user: "f" prompts |
| 264 | ;; with a directory, but RET returns the current buffer's file, not |
| 265 | ;; its directory. |
| 266 | (interactive "DUntranslated file system: ") |
| 267 | (let ((fs (untranslated-canonical-name filesystem))) |
| 268 | (if (member fs untranslated-filesystem-list) |
| 269 | untranslated-filesystem-list |
| 270 | (setq untranslated-filesystem-list |
| 271 | (cons fs untranslated-filesystem-list))))) |
| 272 | |
| 273 | (defun remove-untranslated-filesystem (filesystem) |
| 274 | "Remove FILESYSTEM from the list of filesystems that do not require |
| 275 | CR/LF translation. FILESYSTEM is a string containing the directory |
| 276 | prefix corresponding to the filesystem. For example, for a Unix |
| 277 | filesystem mounted on drive Z:, FILESYSTEM could be \"Z:\"." |
| 278 | (interactive "fUntranslated file system: ") |
| 279 | (setq untranslated-filesystem-list |
| 280 | (delete (untranslated-canonical-name filesystem) |
| 281 | untranslated-filesystem-list))) |
| 282 | |
| 283 | ;;; Support for printing under DOS/Windows, see lpr.el and ps-print.el. |
| 284 | |
| 285 | (defvar direct-print-region-use-command-dot-com t |
| 286 | "*Control whether command.com is used to print on Windows 9x.") |
| 287 | |
| 288 | ;; Function to actually send data to the printer port. |
| 289 | ;; Supports writing directly, and using various programs. |
| 290 | (defun direct-print-region-helper (printer |
| 291 | start end |
| 292 | lpr-prog |
| 293 | _delete-text _buf _display |
| 294 | rest) |
| 295 | (let* (;; Ignore case when matching known external program names. |
| 296 | (case-fold-search t) |
| 297 | ;; Convert / to \ in printer name, for sake of external programs. |
| 298 | (printer |
| 299 | (if (stringp printer) |
| 300 | (subst-char-in-string ?/ ?\\ printer) |
| 301 | printer)) |
| 302 | ;; Find a directory that is local, to work-around Windows bug. |
| 303 | (safe-dir |
| 304 | (let ((safe-dirs (list "c:/" (getenv "windir") (getenv "TMPDIR")))) |
| 305 | (while (not (file-attributes (car safe-dirs))) |
| 306 | (setq safe-dirs (cdr safe-dirs))) |
| 307 | (car safe-dirs))) |
| 308 | (tempfile |
| 309 | (subst-char-in-string |
| 310 | ?/ ?\\ |
| 311 | (make-temp-name |
| 312 | (expand-file-name "EP" temporary-file-directory)))) |
| 313 | ;; capture output for diagnosis |
| 314 | (errbuf (list (get-buffer-create " *print-region-helper*") t))) |
| 315 | ;; It seems that we must be careful about the directory name that |
| 316 | ;; gets added to the printer port name by write-region when using |
| 317 | ;; the standard "PRN" or "LPTx" ports, because the write can fail if |
| 318 | ;; the directory is on a network drive. The same is true when |
| 319 | ;; asking command.com to copy the file. |
| 320 | ;; No action is needed for UNC printer names, which is just as well |
| 321 | ;; because `expand-file-name' doesn't support UNC names on MS-DOS. |
| 322 | (if (and (stringp printer) (not (string-match "^\\\\" printer))) |
| 323 | (setq printer |
| 324 | (subst-char-in-string ?/ ?\\ (expand-file-name printer safe-dir)))) |
| 325 | ;; Handle known programs specially where necessary. |
| 326 | (unwind-protect |
| 327 | (cond |
| 328 | ;; nprint.exe is the standard print command on Netware |
| 329 | ((string-match "^nprint\\(\\.exe\\)?$" (file-name-nondirectory lpr-prog)) |
| 330 | (write-region start end tempfile nil 0) |
| 331 | (call-process lpr-prog nil errbuf nil |
| 332 | tempfile (concat "P=" printer))) |
| 333 | ;; print.exe is a standard command on NT |
| 334 | ((string-match "^print\\(\\.exe\\)?$" (file-name-nondirectory lpr-prog)) |
| 335 | ;; Be careful not to invoke print.exe on MS-DOS or Windows 9x |
| 336 | ;; though, because it is a TSR program there (hangs Emacs). |
| 337 | (or (and (eq system-type 'windows-nt) |
| 338 | (null (getenv "winbootdir"))) |
| 339 | (error "Printing via print.exe is not supported on MS-DOS or Windows 9x")) |
| 340 | ;; It seems that print.exe always appends a form-feed so we |
| 341 | ;; should make sure to omit the last FF in the data. |
| 342 | (if (and (> end start) |
| 343 | (char-equal (char-before end) ?\C-l)) |
| 344 | (setq end (1- end))) |
| 345 | ;; cancel out annotate function for non-PS case |
| 346 | (let ((write-region-annotate-functions nil)) |
| 347 | (write-region start end tempfile nil 0)) |
| 348 | (call-process lpr-prog nil errbuf nil |
| 349 | (concat "/D:" printer) tempfile)) |
| 350 | ;; support lpr and similar programs for convenience, but |
| 351 | ;; supply an explicit filename because the NT version of lpr |
| 352 | ;; can't read from stdin. |
| 353 | ((> (length lpr-prog) 0) |
| 354 | (write-region start end tempfile nil 0) |
| 355 | (setq rest (append rest (list tempfile))) |
| 356 | (apply 'call-process lpr-prog nil errbuf nil rest)) |
| 357 | ;; Run command.com to access printer port on Windows 9x, unless |
| 358 | ;; we are supposed to append to an existing (non-empty) file, |
| 359 | ;; to work around a bug in Windows 9x that prevents Win32 |
| 360 | ;; programs from accessing LPT ports reliably. |
| 361 | ((and (eq system-type 'windows-nt) |
| 362 | (getenv "winbootdir") |
| 363 | ;; Allow cop-out so command.com isn't invoked |
| 364 | direct-print-region-use-command-dot-com |
| 365 | ;; file-attributes fails on LPT ports on Windows 9x but |
| 366 | ;; not on NT, so handle both cases for safety. |
| 367 | (eq (or (nth 7 (file-attributes printer)) 0) 0)) |
| 368 | (write-region start end tempfile nil 0) |
| 369 | (let ((w32-quote-process-args nil)) |
| 370 | (call-process "command.com" nil errbuf nil "/c" |
| 371 | (format "copy /b %s %s" tempfile printer)))) |
| 372 | ;; write directly to the printer port |
| 373 | (t |
| 374 | (write-region start end printer t 0))) |
| 375 | ;; ensure we remove the tempfile if created |
| 376 | (if (file-exists-p tempfile) |
| 377 | (delete-file tempfile))))) |
| 378 | |
| 379 | (defvar printer-name) |
| 380 | |
| 381 | (declare-function default-printer-name "w32fns.c") |
| 382 | |
| 383 | (defun direct-print-region-function (start end |
| 384 | &optional lpr-prog |
| 385 | delete-text buf display |
| 386 | &rest rest) |
| 387 | "DOS/Windows-specific function to print the region on a printer. |
| 388 | Writes the region to the device or file which is a value of |
| 389 | `printer-name' \(which see\), unless the value of `lpr-command' |
| 390 | indicates a specific program should be invoked." |
| 391 | |
| 392 | ;; DOS printers need the lines to end with CR-LF pairs, so make |
| 393 | ;; sure it always happens that way, unless the buffer is binary. |
| 394 | (let* ((coding coding-system-for-write) |
| 395 | (coding-base |
| 396 | (if (null coding) 'undecided (coding-system-base coding))) |
| 397 | (eol-type (coding-system-eol-type coding-base)) |
| 398 | ;; Make each print-out eject the final page, but don't waste |
| 399 | ;; paper if the file ends with a form-feed already. |
| 400 | (write-region-annotate-functions |
| 401 | (cons |
| 402 | (lambda (_start end) |
| 403 | (if (not (char-equal (char-before end) ?\C-l)) |
| 404 | `((,end . "\f")))) |
| 405 | write-region-annotate-functions)) |
| 406 | (printer (or (and (boundp 'dos-printer) |
| 407 | (stringp (symbol-value 'dos-printer)) |
| 408 | (symbol-value 'dos-printer)) |
| 409 | printer-name |
| 410 | (default-printer-name)))) |
| 411 | (or (eq coding-system-for-write 'no-conversion) |
| 412 | (setq coding-system-for-write |
| 413 | (aref eol-type 1))) ; force conversion to DOS EOLs |
| 414 | (direct-print-region-helper printer start end lpr-prog |
| 415 | delete-text buf display rest))) |
| 416 | |
| 417 | (defvar print-region-function) |
| 418 | (defvar lpr-headers-switches) |
| 419 | (setq print-region-function 'direct-print-region-function) |
| 420 | |
| 421 | ;; Set this to nil if you have a port of the `pr' program |
| 422 | ;; (e.g., from GNU Textutils), or if you have an `lpr' |
| 423 | ;; program (see above) that can print page headers. |
| 424 | ;; If `lpr-headers-switches' is non-nil (the default) and |
| 425 | ;; `print-region-function' is set to `dos-print-region-function', |
| 426 | ;; then requests to print page headers will be silently |
| 427 | ;; ignored, and `print-buffer' and `print-region' produce |
| 428 | ;; the same output as `lpr-buffer' and `lpr-region', accordingly. |
| 429 | (setq lpr-headers-switches "(page headers are not supported)") |
| 430 | |
| 431 | (defvar ps-printer-name) |
| 432 | |
| 433 | (defun direct-ps-print-region-function (start end |
| 434 | &optional lpr-prog |
| 435 | delete-text buf display |
| 436 | &rest rest) |
| 437 | "DOS/Windows-specific function to print the region on a PostScript printer. |
| 438 | Writes the region to the device or file which is a value of |
| 439 | `ps-printer-name' \(which see\), unless the value of `ps-lpr-command' |
| 440 | indicates a specific program should be invoked." |
| 441 | |
| 442 | (let ((printer (or (and (boundp 'dos-ps-printer) |
| 443 | (stringp (symbol-value 'dos-ps-printer)) |
| 444 | (symbol-value 'dos-ps-printer)) |
| 445 | ps-printer-name |
| 446 | (default-printer-name)))) |
| 447 | (direct-print-region-helper printer start end lpr-prog |
| 448 | delete-text buf display rest))) |
| 449 | |
| 450 | (defvar ps-print-region-function) |
| 451 | (setq ps-print-region-function 'direct-ps-print-region-function) |
| 452 | |
| 453 | ;(setq ps-lpr-command "gs") |
| 454 | |
| 455 | ;(setq ps-lpr-switches '("-q" "-dNOPAUSE" "-sDEVICE=epson" "-r240x60" |
| 456 | ; "-sOutputFile=LPT1")) |
| 457 | |
| 458 | (provide 'dos-w32) |
| 459 | |
| 460 | ;;; dos-w32.el ends here |