1 ;;; printing.el --- printing utilities
3 ;; Copyright (C) 2000, 2001, 2002, 2003, 2004
4 ;; Free Software Foundation, Inc.
6 ;; Author: Vinicius Jose Latorre <vinicius@cpqd.com.br>
7 ;; Maintainer: Vinicius Jose Latorre <vinicius@cpqd.com.br>
8 ;; Time-stamp: <2004/04/05 23:41:49 vinicius>
9 ;; Keywords: wp, print, PostScript
11 ;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/
13 (defconst pr-version
"6.7.4"
14 "printing.el, v 6.7.4 <2004/03/31 vinicius>
16 Please send all bug fixes and enhancements to
17 Vinicius Jose Latorre <vinicius@cpqd.com.br>
20 ;; This file is part of GNU Emacs.
22 ;; GNU Emacs is free software; you can redistribute it and/or modify it under
23 ;; the terms of the GNU General Public License as published by the Free
24 ;; Software Foundation; either version 2, or (at your option) any later
27 ;; GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY
28 ;; WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
29 ;; FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
32 ;; You should have received a copy of the GNU General Public License along with
33 ;; GNU Emacs; see the file COPYING. If not, write to the Free Software
34 ;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
38 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
43 ;; This package provides some printing utilities that includes
44 ;; previewing/printing a PostScript file, printing a text file and
45 ;; previewing/printing some major modes (like mh-folder-mode,
46 ;; rmail-summary-mode, gnus-summary-mode, etc).
48 ;; `printing' was inspired on:
50 ;; print-nt.el Frederic Corne <frederic.corne@erli.fr>
51 ;; Special printing functions for Windows NT
53 ;; mh-e-init.el Tom Vogels <tov@ece.cmu.edu>
54 ;; PS-print for mail messages
56 ;; win32-ps-print.el Matthew O. Persico <mpersico@erols.com>
57 ;; PostScript printing with ghostscript
59 ;; ps-print-interface.el Volker Franz <volker.franz@tuebingen.mpg.de>
60 ;; Graphical front end for ps-print and previewing
62 ;; `printing' is prepared to run on GNU, Unix and NT systems.
63 ;; On GNU or Unix system, `printing' depends on gs and gv utilities.
64 ;; On NT system, `printing' depends on gstools (gswin32.exe and gsview32.exe).
65 ;; To obtain ghostscript, ghostview and GSview see the URL
66 ;; `http://www.gnu.org/software/ghostscript/ghostscript.html'.
68 ;; `printing' also depends on ps-print and lpr GNU Emacs packages.
69 ;; To download the latest ps-print package see
70 ;; `http://www.cpqd.com.br/~vinicius/emacs/ps-print.tar.gz'.
71 ;; Please, see README file for ps-print installation instructions.
74 ;; Novices (First Users)
75 ;; ---------------------
77 ;; First of all, take a glance of printing documentation only to have an idea
78 ;; of what `printing' is capable.
80 ;; Then try to set the variables: `pr-ps-name', `pr-ps-printer-alist',
81 ;; `pr-txt-name', `pr-txt-printer-alist' and `pr-path-alist'. These variables
82 ;; are the main variables for printing processing.
84 ;; Now, please, see these variables documentation more in deep. You can do
85 ;; this by typing C-h v pr-ps-name RET (for example) if you already loaded
86 ;; printing package, or by browsing printing.el source file.
88 ;; If the documentation isn't clear or if you find a way to improve the
89 ;; documentation, please, send an email to maintainer. All printing users
92 ;; One way to set variables is by calling `pr-customize', customize all
93 ;; variables and save the customization by future sessions (see Options
94 ;; section). Other way is by coding your settings on Emacs init file (that is,
95 ;; .emacs file), see below for a first setting template that it should be
96 ;; inserted on your ~/.emacs file (or c:/_emacs, if you're using Windows 9x/NT
99 ;; * Example of setting for Windows system:
101 ;; (require 'printing) ; load printing package
102 ;; (setq pr-path-alist
103 ;; '((windows "c:/applications/executables" PATH ghostview mpage)
104 ;; (ghostview "c:/gs/gsview-dir")
105 ;; (mpage "c:/mpage-dir")
107 ;; (setq pr-txt-name 'prt_06a)
108 ;; (setq pr-txt-printer-alist
109 ;; '((prt_06a "print" nil "/D:\\\\printers\\prt_06a")
110 ;; (prt_07c nil nil "/D:\\\\printers\\prt_07c")
111 ;; (PRN "" nil "PRN")
112 ;; (standard "redpr.exe" nil "")
114 ;; (setq pr-ps-name 'lps_06b)
115 ;; (setq pr-ps-printer-alist
116 ;; '((lps_06a "print" nil "/D:" "\\\\printers\\lps_06a")
117 ;; (lps_06b "print" nil nil "\\\\printers\\lps_06b")
118 ;; (lps_07c "print" nil "" "/D:\\\\printers\\lps_07c")
119 ;; (lps_08c nil nil nil "\\\\printers\\lps_08c")
120 ;; (LPT1 "" nil "" "LPT1:")
121 ;; (PRN "" nil "" "PRN")
122 ;; (standard "redpr.exe" nil "" "")
124 ;; (pr-update-menus t) ; update now printer and utility menus
126 ;; * Example of setting for GNU or Unix system:
128 ;; (require 'printing) ; load printing package
129 ;; (setq pr-path-alist
130 ;; '((unix "." "~/bin" ghostview mpage PATH)
131 ;; (ghostview "$HOME/bin/gsview-dir")
132 ;; (mpage "$HOME/bin/mpage-dir")
134 ;; (setq pr-txt-name 'prt_06a)
135 ;; (setq pr-txt-printer-alist
136 ;; '((prt_06a "lpr" nil "prt_06a")
137 ;; (prt_07c nil nil "prt_07c")
139 ;; (setq pr-ps-name 'lps_06b)
140 ;; (setq pr-ps-printer-alist
141 ;; '((lps_06b "lpr" nil "-P" "lps_06b")
142 ;; (lps_07c "lpr" nil nil "lps_07c")
143 ;; (lps_08c nil nil nil "lps_08c")
145 ;; (pr-update-menus t) ; update now printer and utility menus
148 ;; NOTE 1: Don't forget to download and install ghostscript utilities (see
149 ;; Utilities section).
151 ;; NOTE 2: The `printer-name' and `ps-printer-name' variables don't need to be
152 ;; set, as they are implicit set by `pr-ps-printer-alist' and
153 ;; `pr-txt-printer-alist'.
155 ;; NOTE 3: The duplex feature will only work on PostScript printers that
156 ;; support this feature.
157 ;; You can check if your PostScript printer supports duplex feature
158 ;; by checking the printer manual. Or you can try these steps:
159 ;; 1. Open a buffer (or use the *scratch* buffer).
161 ;; First line (on first page)
163 ;; Second line (on second page)
164 ;; 3. Print this buffer with duplex turned on.
165 ;; If it's printed 2 (two) sheets of paper, then your PostScript
166 ;; printer doesn't have duplex feature; otherwise, it's ok, your
167 ;; printer does have duplex feature.
169 ;; NOTE 4: See Tips section.
175 ;; 1. If your have a local printer, that is, a printer which is connected
176 ;; directly to your computer, don't forget to connect the printer to your
177 ;; computer before printing.
179 ;; 2. If you try to print a file and it seems that the file was printed, but
180 ;; there is no paper in the printer, then try to set `pr-delete-temp-file'
181 ;; to nil. Probably `printing' is deleting the temporary file before your
182 ;; local system can get it to send to the printer.
184 ;; 3. Don't try to print a dynamic buffer, that is, a buffer which is
185 ;; modifying while `printing' tries to print. Eventually you got an error
186 ;; message. Instead, save the dynamic buffer to a file or copy it in
187 ;; another buffer and, then, print the file or the new static buffer.
188 ;; An example of dynamic buffer is the *Messages* buffer.
190 ;; 4. When running Emacs on Windows with cygwin, check if the
191 ;; `pr-shell-file-name' variable is set to the proper shell. This shell
192 ;; will execute the commands to preview/print the buffer, file or directory.
193 ;; Also check the setting of `pr-path-style' variable.
194 ;; Probably, you should use:
196 ;; (setq pr-shell-file-name "bash")
197 ;; (setq pr-path-style 'unix)
199 ;; And use / instead of \ when specifying a directory.
205 ;; To use `printing' insert in your ~/.emacs file (or c:/_emacs, if you're
206 ;; using Windows 9x/NT or MS-DOS):
208 ;; (require 'printing)
210 ;; When `printing' is loaded:
212 ;; it replaces the Tools/Print menu by Tools/Printing menu.
214 ;; it replaces the File/Print* menu entries by File/Print menu.
215 ;; Please, see section Menu Layout below for menu explanation.
217 ;; To use `printing' utilities you can use the Printing menu options, type M-x
218 ;; followed by one of the commands below, or type a key associated with the
219 ;; command you want (if there is a key binding).
221 ;; `printing' has the following commands:
224 ;; pr-ps-directory-preview
225 ;; pr-ps-directory-using-ghostscript
226 ;; pr-ps-directory-print
227 ;; pr-ps-directory-ps-print
228 ;; pr-ps-buffer-preview
229 ;; pr-ps-buffer-using-ghostscript
230 ;; pr-ps-buffer-print
231 ;; pr-ps-buffer-ps-print
232 ;; pr-ps-region-preview
233 ;; pr-ps-region-using-ghostscript
234 ;; pr-ps-region-print
235 ;; pr-ps-region-ps-print
236 ;; pr-ps-mode-preview
237 ;; pr-ps-mode-using-ghostscript
239 ;; pr-ps-mode-ps-print
240 ;; pr-ps-file-preview
241 ;; pr-ps-file-up-preview
242 ;; pr-ps-file-using-ghostscript
244 ;; pr-ps-file-ps-print
245 ;; pr-ps-file-up-ps-print
247 ;; pr-despool-preview
248 ;; pr-despool-using-ghostscript
250 ;; pr-despool-ps-print
251 ;; pr-printify-directory
252 ;; pr-printify-buffer
253 ;; pr-printify-region
259 ;; pr-toggle-file-duplex
260 ;; pr-toggle-file-tumble
261 ;; pr-toggle-file-landscape
262 ;; pr-toggle-ghostscript
267 ;; pr-toggle-landscape
268 ;; pr-toggle-upside-down
285 ;; The general meanings of above commands are:
288 ;; `pr-interface' buffer interface for printing package.
289 ;; `pr-help' help for printing package.
290 ;; `pr-ps-name' interactively select a PostScript printer.
291 ;; `pr-txt-name' interactively select a text printer.
292 ;; `pr-ps-utility' interactively select a PostScript utility.
293 ;; `pr-show-*-setup' show current settings.
294 ;; `pr-ps-*' deal with PostScript code generation.
295 ;; `pr-txt-*' deal with text generation.
296 ;; `pr-toggle-*' toggle on/off some boolean variable.
297 ;; `pr-despool-*' despool the PostScript spooling buffer.
298 ;; `pr-printify-*' replace nonprintable ASCII by printable ASCII
302 ;; `*-customize' customization.
303 ;; `*-preview' preview a PostScript file.
304 ;; `*-using-ghostscript' use ghostscript to print.
305 ;; `*-fast-fire' fast fire command (see it for documentation).
306 ;; `*-print' send PostScript directly to printer.
307 ;; `*-ps-print' send PostScript directly to printer or use
308 ;; ghostscript to print. It depends on
309 ;; `pr-print-using-ghostscript' option.
312 ;; `*-directory*' process a directory.
313 ;; `*-buffer*' process a buffer.
314 ;; `*-region*' process a region.
315 ;; `*-mode*' process a major mode (see explanation below).
316 ;; `*-file-*' process a PostScript file.
317 ;; `*-file-up-*' process a PostScript file using a filter utility.
319 ;; Here are some examples:
321 ;; `pr-ps-buffer-using-ghostscript'
322 ;; Use ghostscript to print a buffer.
324 ;; `pr-ps-file-print'
325 ;; Print a PostScript file.
328 ;; Toggle spooling buffer.
330 ;; So you can preview through ghostview, use ghostscript to print (if you don't
331 ;; have a PostScript printer) or send directly to printer a PostScript code
332 ;; generated by `ps-print' package.
334 ;; Besides operating one buffer or region each time, you also can postpone
335 ;; previewing or printing by saving the PostScript code generated in a
336 ;; temporary Emacs buffer. This way you can save banner pages between
337 ;; successive printing. You can toggle on/off spooling by invoking
338 ;; `pr-toggle-spool' interactively or through menu bar.
340 ;; If you type, for example:
342 ;; C-u M-x pr-ps-buffer-print RET
344 ;; The `pr-ps-buffer-print' command prompts you for a n-up printing number and
345 ;; a file name, and save the PostScript code generated to the file name instead
346 ;; of sending to printer.
348 ;; This behavior is similar with the commands that deal with PostScript code
349 ;; generation, that is, with `pr-ps-*' and `pr-despool-*' commands. If
350 ;; spooling is on, only `pr-despool-*' commands prompt for a file name and save
351 ;; the PostScript code spooled in this file.
353 ;; Besides the behavior described above, the `*-directory*' commands also
354 ;; prompt for a directory and a file name regexp. So, it's possible to process
355 ;; all or certain files on a directory at once (see also documentation for
356 ;; `pr-list-directory').
358 ;; `printing' has also a special way to handle some major mode through
359 ;; `*-mode*' commands. So it's possible to customize a major mode printing,
360 ;; it's only needed to declare the customization in `pr-mode-alist' (see
361 ;; section Options) and invoke some of `*-mode*' commands. An example for
362 ;; major mode usage is when you're using gnus (or mh, or rmail, etc.) and
363 ;; you're in the *Summary* buffer, if you forget to switch to the *Article*
364 ;; buffer before printing, you'll get a nicely formatted list of article
365 ;; subjects shows up at the printer. With major mode printing you don't need
366 ;; to switch from gnus *Summary* buffer first.
368 ;; Current global keyboard mapping for GNU Emacs is:
370 ;; (global-set-key [print] 'pr-ps-fast-fire)
371 ;; (global-set-key [M-print] 'pr-ps-mode-using-ghostscript)
372 ;; (global-set-key [C-print] 'pr-txt-fast-fire)
374 ;; And for XEmacs is:
376 ;; (global-set-key 'f22 'pr-ps-fast-fire)
377 ;; (global-set-key '(meta f22) 'pr-ps-mode-using-ghostscript)
378 ;; (global-set-key '(control f22) 'pr-txt-fast-fire)
380 ;; As a suggestion of global keyboard mapping for some `printing' commands:
382 ;; (global-set-key "\C-ci" 'pr-interface)
383 ;; (global-set-key "\C-cbp" 'pr-ps-buffer-print)
384 ;; (global-set-key "\C-cbx" 'pr-ps-buffer-preview)
385 ;; (global-set-key "\C-cbb" 'pr-ps-buffer-using-ghostscript)
386 ;; (global-set-key "\C-crp" 'pr-ps-region-print)
387 ;; (global-set-key "\C-crx" 'pr-ps-region-preview)
388 ;; (global-set-key "\C-crr" 'pr-ps-region-using-ghostscript)
394 ;; Below it's shown a brief description of `printing' options, please, see the
395 ;; options declaration in the code for a long documentation.
397 ;; `pr-path-style' Specify which path style to use for external
400 ;; `pr-path-alist' Specify an alist for command paths.
402 ;; `pr-txt-name' Specify a printer for printing a text file.
404 ;; `pr-txt-printer-alist' Specify an alist of all text printers.
406 ;; `pr-ps-name' Specify a printer for printing a PostScript
409 ;; `pr-ps-printer-alist' Specify an alist for all PostScript printers.
411 ;; `pr-temp-dir' Specify a directory for temporary files during
414 ;; `pr-ps-temp-file' Specify PostScript temporary file name.
416 ;; `pr-gv-command' Specify path and name of the gsview/gv
419 ;; `pr-gs-command' Specify path and name of the ghostscript
422 ;; `pr-gs-switches' Specify ghostscript switches.
424 ;; `pr-gs-device' Specify ghostscript device switch value.
426 ;; `pr-gs-resolution' Specify ghostscript resolution switch value.
428 ;; `pr-print-using-ghostscript' Non-nil means print using ghostscript.
430 ;; `pr-faces-p' Non-nil means print with face attributes.
432 ;; `pr-spool-p' Non-nil means spool printing in a buffer.
434 ;; `pr-file-landscape' Non-nil means print PostScript file in
435 ;; landscape orientation.
437 ;; `pr-file-duplex' Non-nil means print PostScript file in duplex
440 ;; `pr-file-tumble' Non-nil means print PostScript file in tumble
443 ;; `pr-auto-region' Non-nil means region is automagically detected.
445 ;; `pr-auto-mode' Non-nil means major-mode specific printing is
446 ;; prefered over normal printing.
448 ;; `pr-mode-alist' Specify an alist for a major-mode and printing
451 ;; `pr-ps-utility' Specify PostScript utility processing.
453 ;; `pr-ps-utility-alist' Specify an alist for PostScript utility
456 ;; `pr-menu-lock' Non-nil means menu is locked while selecting
459 ;; `pr-menu-char-height' Specify menu char height in pixels.
461 ;; `pr-menu-char-width' Specify menu char width in pixels.
463 ;; `pr-setting-database' Specify an alist for settings in general.
465 ;; `pr-visible-entry-list' Specify a list of Printing menu visible
468 ;; `pr-delete-temp-file' Non-nil means delete temporary files.
470 ;; `pr-list-directory' Non-nil means list directory when processing a
473 ;; `pr-buffer-name' Specify the name of the buffer interface for
476 ;; `pr-buffer-name-ignore' Specify a regexp list for buffer names to be
477 ;; ignored in interface buffer.
479 ;; `pr-buffer-verbose' Non-nil means to be verbose when editing a
480 ;; field in interface buffer.
482 ;; `pr-shell-file-name' Specify file name to load inferior shells
485 ;; To set the above options you may:
487 ;; a) insert the code in your ~/.emacs, like:
489 ;; (setq pr-faces-p t)
491 ;; This way always keep your default settings when you enter a new Emacs
494 ;; b) or use `set-variable' in your Emacs session, like:
496 ;; M-x set-variable RET pr-faces-p RET t RET
498 ;; This way keep your settings only during the current Emacs session.
500 ;; c) or use customization, for example:
501 ;; click on menu-bar *Help* option,
502 ;; then click on *Customize*,
503 ;; then click on *Browse Customization Groups*,
504 ;; expand *PostScript* group,
505 ;; expand *Printing* group
506 ;; and then customize `printing' options.
507 ;; Through this way, you may choose if the settings are kept or not when
508 ;; you leave out the current Emacs session.
510 ;; d) or see the option value:
512 ;; C-h v pr-faces-p RET
514 ;; and click the *customize* hypertext button.
515 ;; Through this way, you may choose if the settings are kept or not when
516 ;; you leave out the current Emacs session.
520 ;; M-x pr-customize RET
522 ;; and then customize `printing' options.
523 ;; Through this way, you may choose if the settings are kept or not when
524 ;; you leave out the current Emacs session.
526 ;; f) or use menu bar, for example:
527 ;; click on menu-bar *File* option,
528 ;; then click on *Printing*,
529 ;; then click on *Customize*,
530 ;; then click on *printing*
531 ;; and then customize `printing' options.
532 ;; Through this way, you may choose if the settings are kept or not when
533 ;; you leave out the current Emacs session.
539 ;; The `printing' menu (Tools/Printing or File/Print) has the following layout:
541 ;; +-----------------------------+
542 ;; A 0 | Printing Interface |
543 ;; +-----------------------------+ +-A---------+ +-B------+
544 ;; I 1 | PostScript Preview >|-------|Directory >|-----|1-up |
545 ;; 2 | PostScript Print >|---- A |Buffer >|-- B |2-up |
546 ;; 3 | PostScript Printer: name >|---- C |Region >|-- B |4-up |
547 ;; +-----------------------------+ |Mode >|-- B |Other...|
548 ;; II 4 | Printify >|-----\ |File >|--\ +--------+
549 ;; 5 | Print >|---\ | |Despool... | |
550 ;; 6 | Text Printer: name >|-\ | | +-----------+ |
551 ;; +-----------------------------+ | | | +---------+ +------------+
552 ;; III 7 |[ ]Landscape | | | \-|Directory| | No Prep... | Ia
553 ;; 8 |[ ]Print Header | | | |Buffer | +------------+ Ib
554 ;; 9 |[ ]Print Header Frame | | | |Region | | name >|- C
555 ;; 10 |[ ]Line Number | | | +---------+ +------------+
556 ;; 11 |[ ]Zebra Stripes | | | +---------+ | 1-up... | Ic
557 ;; 12 |[ ]Duplex | | \---|Directory| | 2-up... |
558 ;; 13 |[ ]Tumble | \--\ |Buffer | | 4-up... |
559 ;; 14 |[ ]Upside-Down | | |Region | | Other... |
560 ;; 15 | Print All Pages >|--\ | |Mode | +------------+
561 ;; +-----------------------------+ | | +---------+ |[ ]Landscape| Id
562 ;; IV 16 |[ ]Spool Buffer | | | +-C-------+ |[ ]Duplex | Ie
563 ;; 17 |[ ]Print with faces | | \--|( )name A| |[ ]Tumble | If
564 ;; 18 |[ ]Print via Ghostscript | | |( )name B| +------------+
565 ;; +-----------------------------+ | |... |
566 ;; V 19 |[ ]Auto Region | | |(*)name |
567 ;; 20 |[ ]Auto Mode | | |... |
568 ;; 21 |[ ]Menu Lock | | +---------+ +--------------+
569 ;; +-----------------------------+ \------------------|(*)All Pages |
570 ;; VI 22 | Customize >|--- D +-D------+ |( )Even Pages |
571 ;; 23 | Show Settings >|-------|printing| |( )Odd Pages |
572 ;; 24 | Help | |ps-print| |( )Even Sheets|
573 ;; +-----------------------------+ |lpr | |( )Odd Sheets |
574 ;; +--------+ +--------------+
576 ;; See `pr-visible-entry-list' for hiding some parts of the menu.
578 ;; The menu has the following sections:
582 ;; 0. You can use a buffer interface instead of menus. It looks like the
583 ;; customization buffer. Basically, it has the same options found in the
584 ;; menu and some extra options, all this on a buffer.
586 ;; I. PostScript printing:
588 ;; 1. You can generate a PostScript file (if you type C-u before activating
589 ;; menu) or PostScript temporary file for a directory, a buffer, a region
590 ;; or a major mode, choosing 1-up, 2-up, 4-up or any other n-up printing;
591 ;; after file generation, ghostview is activated using the file generated
592 ;; as argument. This option is disabled if spooling is on (option 16).
593 ;; Also, if you already have a PostScript file you can preview it.
594 ;; Instead of previewing each buffer, region or major mode at once, you
595 ;; can save temporarily the PostScript code generated in a buffer and
596 ;; preview it later. The option `Despool...' despools the PostScript
597 ;; spooling buffer in a temporary file and uses ghostview to preview it.
598 ;; If you type C-u before choosing this option, the PostScript code
599 ;; generated is saved in a file instead of saving in a temporary file.
600 ;; To spool the PostScript code generated you need to turn on the option
601 ;; 16. The option `Despool...' is enabled if spooling is on (option
604 ;; NOTE 1: It's possible to customize a major mode printing, just declare
605 ;; the customization in `pr-mode-alist' and invoke some of
606 ;; `*-mode*' commands or select Mode option in Printing menu. An
607 ;; example for major mode usage is when you're using gnus (or mh,
608 ;; or rmail, etc.) and you're in the *Summary* buffer, if you
609 ;; forget to switch to the *Article* buffer before printing,
610 ;; you'll get a nicely formatted list of article subjects shows
611 ;; up at the printer. With major mode printing you don't need to
612 ;; switch from gnus *Summary* buffer first.
614 ;; NOTE 2: There are the following options for PostScript file
616 ;; Ia. Print the file *No Preprocessing*, that is, send it
617 ;; directly to PostScript printer.
618 ;; Ib. PostScript utility processing selection.
619 ;; See `pr-ps-utility-alist' and `pr-setting-database' for
621 ;; Ic. Do n-up processing before printing.
622 ;; Id. Toggle on/off landscape for PostScript file processing.
623 ;; Ie. Toggle on/off duplex for PostScript file processing.
624 ;; If. Toggle on/off tumble for PostScript file processing.
626 ;; NOTE 3: Don't forget to download and install the utilities declared on
627 ;; `pr-ps-utility-alist'.
629 ;; 2. Operate the same way as option 1, but it sends directly the PostScript
630 ;; code (or put in a file, if you've typed C-u) or it uses ghostscript to
631 ;; print the PostScript file generated. It depends on option 18, if it's
632 ;; turned on, it uses ghostscript; otherwise, it sends directly to
633 ;; printer. If spooling is on (option 16), the PostScript code is saved
634 ;; temporarily in a buffer instead of printing it or saving it in a file.
635 ;; Also, if you already have a PostScript file you can print it. Instead
636 ;; of printing each buffer, region or major mode at once, you can save
637 ;; temporarily the PostScript code generated in a buffer and print it
638 ;; later. The option `Despool...' despools the PostScript spooling
639 ;; buffer directly on a printer. If you type C-u before choosing this
640 ;; option, the PostScript code generated is saved in a file instead of
641 ;; sending to printer. To spool the PostScript code generated you need
642 ;; to turn on the option 16. This option is enabled if spooling is on
643 ;; (option 16). See also the NOTE 1, NOTE 2 and NOTE 3 on option 1.
645 ;; 3. You can select a new PostScript printer to send PostScript code
646 ;; generated. For selection it's used all PostScript printers defined
647 ;; in `pr-ps-printer-alist' variable (see it for documentation).
648 ;; See also `pr-setting-database'.
650 ;; II. Text printing:
652 ;; 4. If you have control characters (character code from \000 to \037) in a
653 ;; buffer and you want to print them in a text printer, select this
654 ;; option. All control characters in your buffer or region will be
655 ;; replaced by a printable representation. The printable representations
656 ;; use ^ (for ASCII control characters) or hex. The characters tab,
657 ;; linefeed, space, return and formfeed are not affected. You don't need
658 ;; to select this option if you use any option of section I, the
659 ;; PostScript engine treats control characters properly.
661 ;; 5. If you want to print a directory, buffer, region or major mode in a
662 ;; text printer, select this option. See also the NOTE 1 on option 1.
664 ;; 6. You can select a new text printer to send text generated. For
665 ;; selection it's used all text printers defined in
666 ;; `pr-txt-printer-alist' variable (see it for documentation).
667 ;; See also `pr-setting-database'.
669 ;; III. PostScript page toggle options:
671 ;; 7. If you want a PostScript landscape printing, turn on this option.
673 ;; 8. If you want to have a header in each page in your PostScript code,
674 ;; turn on this option.
676 ;; 9. If you want to draw a gaudy frame around the header, turn on this
677 ;; option. This option is enabled if print header is on (option 8).
679 ;; 10. If you want that the line number is printed in your PostScript code,
680 ;; turn on this option.
682 ;; 11. If you want background zebra stripes in your PostScript code, turn on
685 ;; 12. If you want a duplex printing and your PostScript printer has this
686 ;; feature, turn on this option.
688 ;; 13. If you turned on duplex printing, you can choose if you want to have
689 ;; a printing suitable for binding on the left or right (tumble off), or
690 ;; to have a printing suitable for binding at top or bottom (tumble on).
691 ;; This option is enabled if duplex is on (option 12).
693 ;; 14. If you want a PostScript upside-down printing, turn on this option.
695 ;; 15. With this option, you can choose if you want to print all pages, odd
696 ;; pages, even pages, odd sheets or even sheets.
697 ;; See also `ps-even-or-odd-pages'.
699 ;; IV. PostScript processing toggle options:
701 ;; 16. If you want to spool the PostScript code generated, turn on this
702 ;; option. To spool the PostScript code generated use option 2. You
703 ;; can despool later by choosing option 1 or 2, sub-option `Despool...'.
705 ;; 17. If you use colors in your buffers and want to see these colors on
706 ;; your PostScript code generated, turn on this option. If you have a
707 ;; black/white PostScript printer, these colors are displayed in gray
708 ;; scale by PostScript printer interpreter.
710 ;; 18. If you don't have a PostScript printer to send PostScript files, turn
711 ;; on this option. When this option is on, the ghostscript is used to
712 ;; print PostScript files. In GNU or Unix system, if ghostscript is set
713 ;; as a PostScript filter, you don't need to turn on this option.
715 ;; V. Printing customization:
717 ;; 19. If you want that region is automagically detected, turn on this
718 ;; option. Note that this will only work if you're using transient mark
719 ;; mode. When this option is on, the `*-buffer*' commands will behave
720 ;; like `*-region*' commands, that is, `*-buffer*' commands will print
721 ;; only the region marked instead of all buffer.
723 ;; 20. Turn this option on if you want that when current major-mode is
724 ;; declared in `pr-mode-alist', the `*-buffer*' and `*-region*' commands
725 ;; behave like `*-mode*' commands.
727 ;; 21. If you want that Printing menu stays open while you are setting
728 ;; toggle options, turn on this option. The variables
729 ;; `pr-menu-char-height' and `pr-menu-char-width' are used to guess the
730 ;; menu position, so don't forget to adjust these variables if menu
731 ;; position is not ok.
733 ;; VI. Customization:
735 ;; 22. Besides all options in section III, IV and V, you can customize much
736 ;; more PostScript options in `ps-print' option. Or you can customize
737 ;; some `lpr' options for text printing. Or customize `printing'
740 ;; 23. Show current settings for `printing', `ps-print' or `lpr'.
742 ;; 24. Quick help for printing menu layout.
748 ;; Below it's shown only the main options that affect all `printing' package.
749 ;; Check all the settings below *BEFORE* running `printing' commands.
751 ;; * Example of setting for GNU or Unix system:
753 ;; (require 'printing)
754 ;; (setq pr-path-alist
755 ;; '((unix "." "~/bin" ghostview mpage PATH)
756 ;; (ghostview "$HOME/bin/gsview-dir")
757 ;; (mpage "$HOME/bin/mpage-dir")
759 ;; (setq pr-txt-name 'prt_06a)
760 ;; (setq pr-txt-printer-alist
761 ;; '((prt_06a "lpr" nil "prt_06a")
762 ;; (prt_07c nil nil "prt_07c")
764 ;; (setq pr-ps-name 'lps_06b)
765 ;; (setq pr-ps-printer-alist
766 ;; '((lps_06b "lpr" nil "-P" "lps_06b")
767 ;; (lps_07c "lpr" nil nil "lps_07c")
768 ;; (lps_08c nil nil nil "lps_08c")
770 ;; (setq pr-temp-dir "/tmp/")
771 ;; (setq pr-gv-command "gv")
772 ;; (setq pr-gs-command "gs")
773 ;; (setq pr-gs-switches '("-q -dNOPAUSE -I/usr/share/ghostscript/5.10"))
774 ;; (setq pr-gs-device "uniprint")
775 ;; (setq pr-gs-resolution 300)
776 ;; (setq pr-ps-utility 'mpage)
777 ;; (setq pr-ps-utility-alist
778 ;; '((mpage "mpage" nil "-b%s" "-%d" "-l" "-t" "-T" ">" nil)
779 ;; (psnup "psnup" ("-q") "-P%s" "-%d" "-l" nil nil " " nil
780 ;; (inherits-from: . no-duplex))
782 ;; (setq pr-setting-database
785 ;; (pr-file-duplex . nil)
786 ;; (pr-file-tumble . nil))
788 ;; (pr-update-menus t) ; update now printer and utility menus
790 ;; * Example of setting for Windows system:
792 ;; (require 'printing)
793 ;; (setq pr-path-alist
794 ;; '((windows "c:/applications/executables" PATH ghostview mpage)
795 ;; (ghostview "c:/gs/gsview-dir")
796 ;; (mpage "c:/mpage-dir")
798 ;; (setq pr-txt-name 'prt_06a)
799 ;; (setq pr-txt-printer-alist
800 ;; '((prt_06a "print" nil "/D:\\\\printers\\prt_06a")
801 ;; (prt_07c nil nil "/D:\\\\printers\\prt_07c")
802 ;; (PRN "" nil "PRN")
803 ;; (standard "redpr.exe" nil "")
805 ;; (setq pr-ps-name 'lps_06b)
806 ;; (setq pr-ps-printer-alist
807 ;; '((lps_06a "print" nil "/D:" "\\\\printers\\lps_06a")
808 ;; (lps_06b "print" nil nil "\\\\printers\\lps_06b")
809 ;; (lps_07c "print" nil "" "/D:\\\\printers\\lps_07c")
810 ;; (lps_08c nil nil nil "\\\\printers\\lps_08c")
811 ;; (LPT1 "" nil "" "LPT1:")
812 ;; (PRN "" nil "" "PRN")
813 ;; (standard "redpr.exe" nil "" "")
815 ;; (setq pr-temp-dir "C:/WINDOWS/TEMP/")
816 ;; (setq pr-gv-command "c:/gs/gsview/gsview32.exe")
817 ;; (setq pr-gs-command "c:/gs/gswin32.exe")
818 ;; (setq pr-gs-switches '("-q -dNOPAUSE -Ic:/gs/gs5.50;c:/gs/gs5.50/fonts"))
819 ;; (setq pr-gs-device "mswinpr2")
820 ;; (setq pr-gs-resolution 300)
821 ;; (setq pr-ps-utility 'psnup)
822 ;; (setq pr-ps-utility-alist
823 ;; '((psnup "c:/psutils/psnup" ("-q") "-P%s" "-%d" "-l" nil nil " "
824 ;; nil (inherits-from: . no-duplex))
826 ;; (setq pr-setting-database
829 ;; (pr-file-duplex . nil)
830 ;; (pr-file-tumble . nil))
832 ;; (pr-update-menus t) ; update now printer and utility menus
834 ;; NOTE: Don't forget to download and install the utilities declared on
835 ;; `pr-ps-utility-alist'.
841 ;; `printing' package has the following utilities:
843 ;; `pr-setup' Return the current `printing' setup.
845 ;; `lpr-setup' Return the current `lpr' setup.
847 ;; `pr-update-menus' Update utility, PostScript and text printer menus.
849 ;; Below are some URL where you can find good utilities.
851 ;; * For `printing' package:
853 ;; printing `http://www.cpqd.com.br/~vinicius/emacs/printing.el.gz'
854 ;; ps-print `http://www.cpqd.com.br/~vinicius/emacs/ps-print.tar.gz'
856 ;; * For GNU or Unix system:
858 ;; gs, gv `http://www.gnu.org/software/ghostscript/ghostscript.html'
859 ;; enscript `http://people.ssh.fi/mtr/genscript/'
860 ;; psnup `http://www.dcs.ed.ac.uk/home/ajcd/psutils/index.html'
861 ;; mpage `http://www.mesa.nl/pub/mpage/'
863 ;; * For Windows system:
866 ;; `http://www.gnu.org/software/ghostscript/ghostscript.html'
867 ;; enscript `http://people.ssh.fi/mtr/genscript/'
868 ;; psnup `http://www.dcs.ed.ac.uk/home/ajcd/psutils/index.html'
869 ;; redmon `http://www.cs.wisc.edu/~ghost/redmon/'
875 ;; Thanks to Drew Adams <drew.adams@oracle.com> for directory processing and
876 ;; `pr-path-alist' suggestions.
878 ;; Thanks to Fred Labrosse <f.labrosse@maths.bath.ac.uk> for XEmacs tests.
880 ;; Thanks to Klaus Berndl <klaus.berndl@sdm.de> for invaluable help/debugging
881 ;; and for suggestions:
882 ;; - even/odd pages printing.
883 ;; - ghostscript parameters for `pr-ps-printer-alist'.
884 ;; - default printer name.
885 ;; - completion functions.
886 ;; - automagic region detection.
887 ;; - menu entry hiding.
888 ;; - fast fire PostScript printing command.
889 ;; - `pr-path-style' variable.
891 ;; Thanks to Kim F. Storm <storm@filanet.dk> for beta-test and for suggestions:
892 ;; - PostScript Print and PostScript Print Preview merge.
893 ;; - Tools/Printing menu.
894 ;; - replace *-using-preview by *-using-ghostscript.
895 ;; - printer selection.
896 ;; - extra parameters for `pr-ps-printer-alist'.
899 ;; Frederic Corne <frederic.corne@erli.fr> print-nt.el
900 ;; Tom Vogels <tov@ece.cmu.edu> mh-e-init.el
901 ;; Matthew O. Persico <mpersico@erols.com> win32-ps-print.el
902 ;; Volker Franz <volker.franz@tuebingen.mpg.de> ps-print-interface.el
903 ;; And to all people who contributed with them.
906 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
915 (and (string< ps-print-version
"6.5.7")
916 (error "`printing' requires `ps-print' package version 6.5.7 or later."))
920 (defconst pr-cygwin-system
921 (and ps-windows-system
(getenv "OSTYPE")
922 (string-match "cygwin" (getenv "OSTYPE")))))
925 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
926 ;; To avoid compilation gripes
931 (or (fboundp 'subst-char-in-string
)
932 (defun subst-char-in-string (fromchar tochar string
&optional inplace
)
933 "Replace FROMCHAR with TOCHAR in STRING each time it occurs.
934 Unless optional argument INPLACE is non-nil, return a new string."
935 (let ((i (length string
))
936 (newstr (if inplace string
(copy-sequence string
))))
937 (while (> (setq i
(1- i
)) 0)
938 (if (eq (aref newstr i
) fromchar
)
939 (aset newstr i tochar
)))
943 (defalias 'pr-e-frame-char-height
'frame-char-height
)
944 (defalias 'pr-e-frame-char-width
'frame-char-width
)
945 (defalias 'pr-e-mouse-pixel-position
'mouse-pixel-position
)
947 (defalias 'pr-x-add-submenu
'add-submenu
)
948 (defalias 'pr-x-event-function
'event-function
)
949 (defalias 'pr-x-event-object
'event-object
)
950 (defalias 'pr-x-find-menu-item
'find-menu-item
)
951 (defalias 'pr-x-font-height
'font-height
)
952 (defalias 'pr-x-font-width
'font-width
)
953 (defalias 'pr-x-get-popup-menu-response
'get-popup-menu-response
)
954 (defalias 'pr-x-make-event
'make-event
)
955 (defalias 'pr-x-misc-user-event-p
'misc-user-event-p
)
956 (defalias 'pr-x-relabel-menu-item
'relabel-menu-item
)
957 (defalias 'pr-x-event-x-pixel
'event-x-pixel
)
958 (defalias 'pr-x-event-y-pixel
'event-y-pixel
)
961 ((eq ps-print-emacs-type
'emacs
) ; GNU Emacs
962 (defvar deactivate-mark nil
)
963 (defalias 'pr-f-set-keymap-parents
'set-keymap-parent
)
964 (defalias 'pr-f-set-keymap-name
'ignore
)
965 (defalias 'pr-f-read-string
'read-string
)
966 (defun pr-keep-region-active ()
967 (setq deactivate-mark nil
)))
969 ((eq ps-print-emacs-type
'xemacs
) ; XEmacs
970 (defvar current-menubar nil
)
971 (defvar current-mouse-event nil
)
972 (defvar zmacs-region-stays nil
)
973 (defalias 'pr-f-set-keymap-parents
'set-keymap-parents
)
974 (defalias 'pr-f-set-keymap-name
'set-keymap-name
)
975 (defun pr-f-read-string (prompt initial history default
)
976 (let ((str (read-string prompt initial
)))
977 (if (and str
(not (string= str
"")))
980 (defun pr-keep-region-active ()
981 (setq zmacs-region-stays t
)))))
984 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
985 ;; Customization Functions
988 (defun pr-alist-custom-set (symbol value
)
989 "Set the value of custom variables for printer & utility selection."
991 (and (featurep 'printing
) ; update only after printing is loaded
992 (pr-update-menus t
)))
995 (defun pr-ps-utility-custom-set (symbol value
)
996 "Update utility menu entry."
998 (and (featurep 'printing
) ; update only after printing is loaded
999 (pr-menu-set-utility-title value
)))
1002 (defun pr-ps-name-custom-set (symbol value
)
1003 "Update `PostScript Printer:' menu entry."
1005 (and (featurep 'printing
) ; update only after printing is loaded
1006 (pr-menu-set-ps-title value
)))
1009 (defun pr-txt-name-custom-set (symbol value
)
1010 "Update `Text Printer:' menu entry."
1012 (and (featurep 'printing
) ; update only after printing is loaded
1013 (pr-menu-set-txt-title value
)))
1016 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1017 ;; User Interface (I)
1020 (defgroup printing nil
1021 "Printing Utilities group"
1022 :tag
"Printing Utilities"
1023 :link
'(emacs-library-link :tag
"Source Lisp File" "printing.el")
1029 (defcustom pr-path-style
1030 (if (and (not pr-cygwin-system
)
1034 "*Specify which path style to use for external commands.
1038 windows Windows 9x/NT style (\\)
1040 unix Unix style (/)"
1041 :type
'(choice :tag
"Path style"
1042 (const :tag
"Windows 9x/NT Style (\\)" :value windows
)
1043 (const :tag
"Unix Style (/)" :value unix
))
1047 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1048 ;; Internal Functions (I)
1051 (defun pr-dosify-path (path)
1052 "Replace unix-style directory separator character with dos/windows one."
1053 (interactive "sPath: ")
1054 (if (eq pr-path-style
'windows
)
1055 (subst-char-in-string ?
/ ?
\\ path
)
1059 (defun pr-unixify-path (path)
1060 "Replace dos/windows-style directory separator character with unix one."
1061 (interactive "sPath: ")
1062 (if (eq pr-path-style
'windows
)
1063 (subst-char-in-string ?
\\ ?
/ path
)
1067 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1068 ;; User Interface (II)
1071 (defcustom pr-path-alist
1075 "*Specify an alist for command paths.
1077 It's used to find commands used for printing package, like gv, gs, gsview.exe,
1078 mpage, print.exe, etc. See also `pr-command' function.
1080 Each element has the form:
1082 (ENTRY DIRECTORY...)
1086 ENTRY It's a symbol, used to identify this entry.
1087 There must exist at least one of the following entries:
1089 unix this entry is used when Emacs is running on GNU or
1092 cygwin this entry is used when Emacs is running on Windows
1093 95/98/NT/2000 with Cygwin.
1095 windows this entry is used when Emacs is running on Windows
1098 DIRECTORY It should be a string or a symbol. If it's a symbol, it should
1099 exist an equal entry in `pr-path-alist'. If it's a string,
1100 it's considered a directory specification.
1102 The directory specification may contain:
1103 $var environment variable expansion
1105 ./ current directory
1106 ../ previous directory
1108 For example, let's say the home directory is /home/my and the
1109 current directory is /home/my/dir, so:
1111 THE ENTRY IS EXPANDED TO
1112 ~/entry /home/my/entry
1113 ./entry /home/my/dir/entry
1114 ../entry /home/my/entry
1115 $HOME/entry /home/my/entry
1116 $HOME/~/other/../my/entry /home/my/entry
1118 SPECIAL SYMBOL: If the symbol `PATH' is used in the directory
1119 list and there isn't a `PATH' entry in `pr-path-alist' or the
1120 `PATH' entry has a null directory list, the PATH environment
1125 * On GNU or Unix system:
1127 '((unix \".\" \"~/bin\" ghostview mpage PATH)
1128 (ghostview \"$HOME/bin/gsview-dir\")
1129 (mpage \"$HOME/bin/mpage-dir\")
1132 * On Windows system:
1134 '((windows \"c:/applications/executables\" PATH ghostview mpage)
1135 (ghostview \"c:/gs/gsview-dir\")
1136 (mpage \"c:/mpage-dir\")
1140 (symbol :tag
"Identifier ")
1141 (repeat :tag
"Directory List"
1142 (choice :menu-tag
"Directory"
1145 (symbol :value symbol
)))))
1149 (defcustom pr-txt-name
'default
1150 "*Specify a printer for printing a text file.
1152 The printer name symbol should be defined on `pr-txt-printer-alist' (see it for
1155 This variable should be modified by customization engine. If this variable is
1156 modified by other means (for example, a lisp function), use `pr-update-menus'
1157 function (see it for documentation) to update text printer menu."
1159 :set
'pr-txt-name-custom-set
1163 (defcustom pr-txt-printer-alist
1164 (list (list 'default lpr-command nil
1165 (cond ((boundp 'printer-name
) printer-name
)
1166 (ps-windows-system "PRN")
1170 ;; * On GNU or Unix system:
1171 ;; '((prt_06a "lpr" nil "prt_06a")
1172 ;; (prt_07c nil nil "prt_07c")
1174 ;; * On Windows system:
1175 ;; '((prt_06a "print" nil "/D:\\\\printers\\prt_06a")
1176 ;; (prt_07c nil nil "/D:\\\\printers\\prt_07c")
1177 ;; (PRN "" nil "PRN")
1178 ;; (standard "redpr.exe" nil "")
1180 "*Specify an alist of all text printers (text printer database).
1182 The alist element has the form:
1184 (SYMBOL COMMAND SWITCHES NAME)
1188 SYMBOL It's a symbol to identify a text printer. It's for
1189 `pr-txt-name' variable setting and for menu selection.
1194 COMMAND Name of the program for printing a text file. On MS-DOS and
1195 MS-Windows systems, if the value is an empty string, then Emacs
1196 will write directly to the printer port given by NAME (see text
1197 below), that is, the NAME should be something like \"PRN\" or
1199 If NAME is something like \"\\\\\\\\host\\\\share-name\" then
1200 COMMAND shouldn't be an empty string.
1201 The programs `print' and `nprint' (the standard print programs
1202 on Windows NT and Novell Netware respectively) are handled
1203 specially, using NAME as the destination for output; any other
1204 program is treated like `lpr' except that an explicit filename
1205 is given as the last argument.
1206 If COMMAND is nil, it's used the default printing program:
1207 `print' for Windows system, `lp' for lp system and `lpr' for
1208 all other systems. See also `pr-path-alist'.
1214 SWITCHES List of sexp's to pass as extra options for text printer
1215 program. It is recommended to set NAME (see text below)
1216 instead of including an explicit switch on this list.
1222 NAME A string that specifies a text printer name.
1223 On Unix-like systems, a string value should be a name
1224 understood by lpr's -P option (or lp's -d option).
1225 On MS-DOS and MS-Windows systems, it is the name of a printer
1226 device or port. Typical non-default settings would be \"LPT1:\"
1227 to \"LPT3:\" for parallel printers, or \"COM1\" to \"COM4\" or
1228 \"AUX\" for serial printers, or \"\\\\\\\\hostname\\\\printer\"
1229 (or \"/D:\\\\\\\\hostname\\\\printer\") for a shared network
1230 printer. You can also set it to a name of a file, in which
1231 case the output gets appended to that file. If you want to
1232 discard the printed output, set this to \"NUL\".
1235 \"/D:\\\\\\\\host\\\\share-name\"
1242 This variable should be modified by customization engine. If this variable is
1243 modified by other means (for example, a lisp function), use `pr-update-menus'
1244 function (see it for documentation) to update text printer menu.
1248 * On GNU or Unix system:
1250 '((prt_06a \"lpr\" nil \"prt_06a\")
1251 (prt_07c nil nil \"prt_07c\")
1254 * On Windows system:
1256 '((prt_06a \"print\" nil \"/D:\\\\\\\\printers\\\\prt_06a\")
1257 (prt_07c nil nil \"/D:\\\\\\\\printers\\\\prt_07c\")
1258 (PRN \"\" nil \"PRN\")
1259 (standard \"redpr.exe\" nil \"\")
1262 (list :tag
"Text Printer"
1263 (symbol :tag
"Printer Symbol Name")
1264 (string :tag
"Printer Command")
1265 (repeat :tag
"Printer Switches"
1266 (sexp :tag
"Switch" :value
""))
1267 (choice :menu-tag
"Printer Name"
1269 (const :tag
"None" nil
)
1271 :set
'pr-alist-custom-set
1275 (defcustom pr-ps-name
'default
1276 "*Specify a printer for printing a PostScript file.
1278 This printer name symbol should be defined on `pr-ps-printer-alist' (see it for
1281 This variable should be modified by customization engine. If this variable is
1282 modified by other means (for example, a lisp function), use `pr-update-menus'
1283 function (see it for documentation) to update PostScript printer menu."
1285 :set
'pr-ps-name-custom-set
1289 (defcustom pr-ps-printer-alist
1290 (list (list 'default lpr-command nil
1291 (cond (ps-windows-system nil
)
1294 (or (getenv "PRINTER") (getenv "LPDEST") ps-printer-name
)))
1296 ;; * On GNU or Unix system:
1297 ;; '((lps_06b "lpr" nil "-P" "lps_06b")
1298 ;; (lps_07c "lpr" nil nil "lps_07c")
1299 ;; (lps_08c nil nil nil "lps_08c")
1301 ;; * On Windows system:
1302 ;; '((lps_06a "print" nil "/D:" "\\\\printers\\lps_06a")
1303 ;; (lps_06b "print" nil nil "\\\\printers\\lps_06b")
1304 ;; (lps_07c "print" nil "" "/D:\\\\printers\\lps_07c")
1305 ;; (lps_08c nil nil nil "\\\\printers\\lps_08c")
1306 ;; (LPT1 "" nil "" "LPT1:")
1307 ;; (PRN "" nil "" "PRN")
1308 ;; (standard "redpr.exe" nil "" "")
1310 "*Specify an alist for all PostScript printers (PostScript printer database).
1312 The alist element has the form:
1314 (SYMBOL COMMAND SWITCHES PRINTER-SWITCH NAME DEFAULT...)
1318 SYMBOL It's a symbol to identify a PostScript printer. It's for
1319 `pr-ps-name' variable setting and for menu selection.
1324 COMMAND Name of the program for printing a PostScript file. On MS-DOS
1325 and MS-Windows systems, if the value is an empty string then
1326 Emacs will write directly to the printer port given by NAME
1327 (see text below), that is, the NAME should be something like
1328 \"PRN\" or \"LPT1:\".
1329 If NAME is something like \"\\\\\\\\host\\\\share-name\" then
1330 COMMAND shouldn't be an empty string.
1331 The programs `print' and `nprint' (the standard print programs
1332 on Windows NT and Novell Netware respectively) are handled
1333 specially, using NAME as the destination for output; any other
1334 program is treated like `lpr' except that an explicit filename
1335 is given as the last argument.
1336 If COMMAND is nil, it's used the default printing program:
1337 `print' for Windows system, `lp' for lp system and `lpr' for
1338 all other systems. See also `pr-path-alist'.
1345 SWITCHES List of sexp's to pass as extra options for PostScript printer
1346 program. It is recommended to set NAME (see text below)
1347 instead of including an explicit switch on this list.
1353 PRINTER-SWITCH A string that specifies PostScript printer name switch. If
1354 it's necessary to have a space between PRINTER-SWITCH and NAME,
1355 it should be inserted at the end of PRINTER-SWITCH string.
1356 If PRINTER-SWITCH is nil, it's used the default printer name
1357 switch: `/D:' for Windows system, `-d' for lp system and `-P'
1358 for all other systems.
1369 NAME A string that specifies a PostScript printer name.
1370 On Unix-like systems, a string value should be a name
1371 understood by lpr's -P option (or lp's -d option).
1372 On MS-DOS and MS-Windows systems, it is the name of a printer
1373 device or port. Typical non-default settings would be \"LPT1:\"
1374 to \"LPT3:\" for parallel printers, or \"COM1\" to \"COM4\" or
1375 \"AUX\" for serial printers, or \"\\\\\\\\hostname\\\\printer\"
1376 (or \"/D:\\\\\\\\hostname\\\\printer\") for a shared network
1377 printer. You can also set it to a name of a file, in which
1378 case the output gets appended to that file. If you want to
1379 discard the printed output, set this to \"NUL\".
1382 \"\\\\\\\\host\\\\share-name\"
1385 \"/D:\\\\\\\\host\\\\share-name\"
1386 \"\\\\\\\\host\\\\share-name\"
1393 DEFAULT It's a way to set default values when this entry is selected.
1398 That associates VARIABLE with VALUE. when this entry is
1399 selected, it's executed the following command:
1401 (set VARIABLE (eval VALUE))
1403 Note that VALUE can be any valid lisp expression. So, don't
1404 forget to quote symbols and constant lists.
1405 If VARIABLE is the special keyword `inherits-from:', VALUE must
1406 be a symbol name setting defined in `pr-setting-database' from
1407 which the current setting inherits the context. Take care with
1408 circular inheritance.
1410 '(ps-landscape-mode . nil)
1411 '(ps-spool-duplex . t)
1412 '(pr-gs-device . (my-gs-device t))
1414 This variable should be modified by customization engine. If this variable is
1415 modified by other means (for example, a lisp function), use `pr-update-menus'
1416 function (see it for documentation) to update PostScript printer menu.
1420 * On GNU or Unix system:
1422 '((lps_06b \"lpr\" nil \"-P\" \"lps_06b\")
1423 (lps_07c \"lpr\" nil nil \"lps_07c\")
1424 (lps_08c nil nil nil \"lps_08c\")
1427 * On Windows system:
1429 '((lps_06a \"print\" nil \"/D:\" \"\\\\\\\\printers\\\\lps_06a\")
1430 (lps_06b \"print\" nil nil \"\\\\\\\\printers\\\\lps_06b\")
1431 (lps_07c \"print\" nil \"\" \"/D:\\\\\\\\printers\\\\lps_07c\")
1432 (lps_08c nil nil nil \"\\\\\\\\printers\\\\lps_08c\")
1433 (LPT1 \"\" nil \"\" \"LPT1:\")
1434 (PRN \"\" nil \"\" \"PRN\")
1435 (standard \"redpr.exe\" nil \"\" \"\")
1439 :tag
"PostScript Printer"
1440 (symbol :tag
"Printer Symbol Name")
1441 (string :tag
"Printer Command")
1442 (repeat :tag
"Printer Switches"
1443 (sexp :tag
"Switch" :value
""))
1444 (choice :menu-tag
"Printer Name Switch"
1445 :tag
"Printer Name Switch"
1446 (const :tag
"None" nil
)
1448 (choice :menu-tag
"Printer Name"
1450 (const :tag
"None" nil
)
1453 :tag
"Default Value List"
1458 :menu-tag
"Variable"
1460 (const :tag
"Landscape" ps-landscape-mode
)
1461 (const :tag
"Print Header" ps-print-header
)
1462 (const :tag
"Print Header Frame" ps-print-header-frame
)
1463 (const :tag
"Line Number" ps-line-number
)
1464 (const :tag
"Zebra Stripes" ps-zebra-stripes
)
1465 (const :tag
"Duplex" ps-spool-duplex
)
1466 (const :tag
"Tumble" ps-spool-tumble
)
1467 (const :tag
"Upside-Down" ps-print-upside-down
)
1468 (const :tag
"PS File Landscape" pr-file-landscape
)
1469 (const :tag
"PS File Duplex" pr-file-duplex
)
1470 (const :tag
"PS File Tumble" pr-file-tumble
)
1471 (const :tag
"Auto Region" pr-auto-region
)
1472 (const :tag
"Auto Mode" pr-auto-mode
)
1473 (const :tag
"Ghostscript Device" pr-gs-device
)
1474 (const :tag
"Ghostscript Resolution" pr-gs-resolution
)
1475 (const :tag
"inherits-from:" inherits-from
:)
1476 (variable :tag
"Other"))
1477 (sexp :tag
"Value")))
1479 :set
'pr-alist-custom-set
1483 (defcustom pr-temp-dir
1485 (if (boundp 'temporary-file-directory
)
1486 (symbol-value 'temporary-file-directory
)
1487 ;; hacked from `temporary-file-directory' variable in files.el
1488 (file-name-as-directory
1489 (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP")
1490 (cond (ps-windows-system "c:/temp")
1491 ((memq system-type
'(vax-vms axp-vms
)) "SYS$SCRATCH:")
1494 "*Specify a directory for temporary files during printing."
1495 :type
'(directory :tag
"Temporary Directory")
1499 (defcustom pr-ps-temp-file
"prspool.ps"
1500 "*Specify PostScript temporary file name."
1501 :type
'(file :tag
"PostScript Temporary File Name")
1505 (defcustom pr-gv-command
1506 (if ps-windows-system
1509 "*Specify path and name of the gsview/gv utility.
1511 See also `pr-path-alist'."
1512 :type
'(string :tag
"Ghostview Utility")
1516 (defcustom pr-gs-command
1517 (if ps-windows-system
1520 "*Specify path and name of the ghostscript utility.
1522 See also `pr-path-alist'."
1523 :type
'(string :tag
"Ghostscript Utility")
1527 (defcustom pr-gs-switches
1528 (if ps-windows-system
1529 '("-q -dNOPAUSE -Ic:/gs/gs5.50;c:/gs/gs5.50/fonts")
1530 '("-q -dNOPAUSE -I/usr/share/ghostscript/5.10"))
1531 "*Specify ghostscript switches. See the documentation on GS for more info.
1533 It's a list of strings, where each string is one or more ghostscript switches.
1535 A note on the gs switches:
1538 -dNOPAUSE don't wait for user intervention
1539 -Ic:/gs/gs5.50;c:/gs/gs5.50/fonts the directories needed for gs
1540 -c quit it's added at the end to terminate gs
1542 To see ghostscript documentation for more information:
1544 * On GNU or Unix system:
1545 - for full documentation, type: man gs
1546 - for brief documentation, type: gs -h
1548 * On Windows system:
1549 - for full documentation, see in a browser the file
1550 c:/gstools/gs5.50/index.html, that is, the file index.html which is
1551 located in the same directory as gswin32.exe.
1552 - for brief documentation, type: gswin32.exe -h"
1553 :type
'(repeat (string :tag
"Ghostscript Switch"))
1557 (defcustom pr-gs-device
1558 (if ps-windows-system
1561 "*Specify the ghostscript device switch value (-sDEVICE=).
1563 A note on the gs switches:
1565 -sDEVICE=djet500 the printer - works with HP DeskJet 540
1567 See `pr-gs-switches' for documentation.
1568 See also `pr-ps-printer-alist'."
1569 :type
'(string :tag
"Ghostscript Device")
1573 (defcustom pr-gs-resolution
300
1574 "*Specify ghostscript resolution switch value (-r).
1576 A note on the gs switches:
1578 -r300 resolution 300x300
1580 See `pr-gs-switches' for documentation.
1581 See also `pr-ps-printer-alist'."
1582 :type
'(integer :tag
"Ghostscript Resolution")
1586 (defcustom pr-print-using-ghostscript nil
1587 "*Non-nil means print using ghostscript.
1589 This is useful if you don't have a PostScript printer, so you could use the
1590 ghostscript to print a PostScript file.
1592 In GNU or Unix system, if ghostscript is set as a PostScript filter, this
1593 variable should be nil."
1598 (defcustom pr-faces-p nil
1599 "*Non-nil means print with face attributes."
1604 (defcustom pr-spool-p nil
1605 "*Non-nil means spool printing in a buffer."
1610 (defcustom pr-file-landscape nil
1611 "*Non-nil means print PostScript file in landscape orientation."
1616 (defcustom pr-file-duplex nil
1617 "*Non-nil means print PostScript file in duplex mode."
1622 (defcustom pr-file-tumble nil
1623 "*Non-nil means print PostScript file in tumble mode.
1625 If tumble is off, produces a printing suitable for binding on the left or
1627 If tumble is on, produces a printing suitable for binding at the top or
1633 (defcustom pr-auto-region t
1634 "*Non-nil means region is automagically detected.
1636 Note that this will only work if you're using transient mark mode.
1638 When this variable is non-nil, the `*-buffer*' commands will behave like
1639 `*-region*' commands, that is, `*-buffer*' commands will print only the region
1640 marked instead of all buffer."
1645 (defcustom pr-auto-mode t
1646 "*Non-nil means major-mode specific printing is prefered over normal printing.
1648 That is, if current major-mode is declared in `pr-mode-alist', the `*-buffer*'
1649 and `*-region*' commands will behave like `*-mode*' commands; otherwise,
1650 `*-buffer*' commands will print the current buffer and `*-region*' commands
1651 will print the current region."
1656 (defcustom pr-mode-alist
1657 '((mh-folder-mode ; mh summary buffer
1658 pr-mh-lpr-1 pr-mh-print-1
1660 (ps-article-author ps-article-subject
)
1661 ("/pagenumberstring load" pr-article-date
)
1664 (mh-letter-mode ; mh letter buffer
1665 pr-mh-lpr-2 pr-mh-print-2
1667 (ps-article-author ps-article-subject
)
1668 ("/pagenumberstring load" pr-article-date
)
1671 (rmail-summary-mode ; rmail summary buffer
1672 pr-rmail-lpr pr-rmail-print
1674 (ps-article-subject ps-article-author buffer-name
)
1678 (rmail-mode ; rmail buffer
1679 pr-rmail-lpr pr-rmail-print
1681 (ps-article-subject ps-article-author buffer-name
)
1685 (gnus-summary-mode ; gnus summary buffer
1686 pr-gnus-lpr pr-gnus-print
1688 (ps-article-subject ps-article-author gnus-newsgroup-name
)
1692 (gnus-article-mode ; gnus article buffer
1693 pr-gnus-lpr pr-gnus-print
1695 (ps-article-subject ps-article-author gnus-newsgroup-name
)
1699 (Info-mode ; Info buffer
1700 pr-mode-lpr pr-mode-print
1702 (ps-info-node ps-info-file
)
1707 pr-vm-lpr pr-vm-print
1709 (ps-article-subject ps-article-author buffer-name
)
1714 "*Specify an alist for a major-mode and printing functions.
1716 To customize a major mode printing, just declare the customization in
1717 `pr-mode-alist' and invoke some of `*-mode*' commands. An example for major
1718 mode usage is when you're using gnus (or mh, or rmail, etc.) and you're in the
1719 *Summary* buffer, if you forget to switch to the *Article* buffer before
1720 printing, you'll get a nicely formatted list of article subjects shows up at
1721 the printer. With major mode printing you don't need to switch from gnus
1722 *Summary* buffer first.
1724 The elements have the following form:
1736 MAJOR-MODE It's the major mode symbol.
1738 LPR-PRINT It's a symbol function for text printing. It's invoked with
1740 (HEADER-LINES LEFT-HEADER RIGHT-HEADER DEFAULT...).
1742 Usually LPR-PRINT function prepares the environment or buffer
1743 and then call the function `pr-mode-lpr' which it's used to
1744 process the buffer and send it to text printer.
1746 The `pr-mode-lpr' definition is:
1748 (pr-mode-lpr HEADER-LIST &optional FROM TO)
1750 Where HEADER-LIST is like the argument passed to LPR-PRINT.
1751 FROM and TO are the beginning and end markers, respectively,
1752 for a region. If FROM is nil, it's used (point-min); if TO is
1753 nil, it's used (point-max).
1755 PS-PRINT It's a symbol function for PostScript printing. It's invoked
1756 with 3 arguments: n-up printing, file name and the list:
1757 (HEADER-LINES LEFT-HEADER RIGHT-HEADER DEFAULT...).
1759 Usually PS-PRINT function prepares the environment or buffer
1760 and then call the function `pr-mode-print' which it's used to
1761 process the buffer and send it to PostScript printer.
1763 The `pr-mode-print' definition is:
1765 (pr-mode-print N-UP FILENAME HEADER-LIST &optional FROM TO)
1767 Where N-UP, FILENAME and HEADER-LIST are like the arguments
1768 passed to PS-PRINT. FROM and TO are the beginning and end
1769 markers, respectively, for a region. If TO is nil, it's used
1772 HEADER-LINES It's the number of header lines; if is nil, it uses
1773 `ps-header-lines' value.
1775 LEFT-HEADER It's the left header part, it's a list of string, variable
1776 symbol or function symbol (with no argument); if is nil, it
1777 uses `ps-left-header' value.
1779 RIGHT-HEADER It's the right header part, it's a list of string, variable
1780 symbol or function symbol (with no argument); if is nil, it
1781 uses `ps-right-header' value.
1784 Non-nil means to kill all buffer local variable declared in
1785 DEFAULT (see below).
1787 DEFAULT It's a way to set default values when this entry is selected.
1790 (VARIABLE-SYM . VALUE)
1792 That associates VARIABLE-SYM with VALUE. when this entry is
1793 selected, it's executed the following command:
1795 (set (make-local-variable VARIABLE-SYM) (eval VALUE))
1797 Note that VALUE can be any valid lisp expression. So, don't
1798 forget to quote symbols and constant lists.
1799 If VARIABLE is the special keyword `inherits-from:', VALUE must
1800 be a symbol name setting defined in `pr-setting-database' from
1801 which the current setting inherits the context. Take care with
1802 circular inheritance.
1804 '(ps-landscape-mode . nil)
1805 '(ps-spool-duplex . t)
1806 '(pr-gs-device . (my-gs-device t))"
1810 (symbol :tag
"Major Mode")
1811 (function :tag
"Text Printing Function")
1812 (function :tag
"PS Printing Function")
1813 (choice :menu-tag
"Number of Header Lines"
1814 :tag
"Number of Header Lines"
1815 (integer :tag
"Number")
1816 (const :tag
"Default Number" nil
))
1817 (repeat :tag
"Left Header List"
1818 (choice :menu-tag
"Left Header"
1821 (repeat :tag
"Right Header List"
1822 (choice :menu-tag
"Right Header"
1825 (boolean :tag
"Kill Local Variable At End")
1827 :tag
"Default Value List"
1832 :menu-tag
"Variable"
1834 (const :tag
"Landscape" ps-landscape-mode
)
1835 (const :tag
"Print Header" ps-print-header
)
1836 (const :tag
"Print Header Frame" ps-print-header-frame
)
1837 (const :tag
"Line Number" ps-line-number
)
1838 (const :tag
"Zebra Stripes" ps-zebra-stripes
)
1839 (const :tag
"Duplex" ps-spool-duplex
)
1840 (const :tag
"Tumble" ps-spool-tumble
)
1841 (const :tag
"Upside-Down" ps-print-upside-down
)
1842 (const :tag
"PS File Landscape" pr-file-landscape
)
1843 (const :tag
"PS File Duplex" pr-file-duplex
)
1844 (const :tag
"PS File Tumble" pr-file-tumble
)
1845 (const :tag
"Auto Region" pr-auto-region
)
1846 (const :tag
"Auto Mode" pr-auto-mode
)
1847 (const :tag
"Ghostscript Device" pr-gs-device
)
1848 (const :tag
"Ghostscript Resolution" pr-gs-resolution
)
1849 (const :tag
"inherits-from:" inherits-from
:)
1850 (variable :tag
"Other"))
1851 (sexp :tag
"Value")))
1856 (defcustom pr-ps-utility
'mpage
1857 "*Specify PostScript utility symbol.
1859 This utility symbol should be defined on `pr-ps-utility-alist' (see it for
1862 This variable should be modified by customization engine. If this variable is
1863 modified by other means (for example, a lisp function), use `pr-update-menus'
1864 function (see it for documentation) to update PostScript utility menu.
1866 NOTE: Don't forget to download and install the utilities declared on
1867 `pr-ps-utility-alist'."
1868 :type
'(symbol :tag
"PS File Utility")
1869 :set
'pr-ps-utility-custom-set
1873 (defcustom pr-ps-utility-alist
1874 '((mpage "mpage" nil
"-b%s" "-%d" "-l" "-t" "-T" ">" nil
)
1875 (psnup "psnup" ("-q") "-P%s" "-%d" "-l" nil nil
" " nil
1876 (inherits-from: . no-duplex
))
1879 ;; * On GNU or Unix system:
1880 ;; '((mpage "mpage" nil "-b%s" "-%d" "-l" "-t" "-T" ">" nil)
1881 ;; (psnup "psnup" ("-q") "-P%s" "-%d" "-l" nil nil " " nil
1882 ;; (pr-file-duplex . nil) (pr-file-tumble . nil))
1884 ;; * On Windows system:
1885 ;; '((psnup "c:/psutils/psnup" ("-q") "-P%s" "-%d" "-l" nil nil " " nil
1886 ;; (pr-file-duplex . nil) (pr-file-tumble . nil))
1888 "*Specify an alist for PostScript utility processing (PS utility database).
1890 The alist element has the form:
1892 (SYMBOL UTILITY MUST-SWITCHES PAPERSIZE N-UP LANDSCAPE DUPLEX TUMBLE OUTPUT
1893 SWITCHES DEFAULT...)
1897 SYMBOL It's a symbol to identify a PostScript utility. It's for
1898 `pr-ps-utility' variable setting and for menu selection.
1903 UTILITY Name of utility for processing a PostScript file.
1904 See also `pr-path-alist'.
1906 . for GNU or Unix system:
1910 . for Windows system:
1911 \"c:/psutils/psnup -q\"
1913 MUST-SWITCHES List of sexp's to pass as options to the PostScript utility
1914 program. These options are necessary to process the utility
1915 program and must be placed before any other switches.
1920 PAPERSIZE It's a format string to specify paper size switch.
1925 N-UP It's a format string to specify n-up switch.
1930 LANDSCAPE It's a string to specify landscape switch. If the utility
1931 doesn't have landscape switch, set to nil.
1936 DUPLEX It's a string to specify duplex switch. If the utility doesn't
1937 have duplex switch, set to nil.
1942 TUMBLE It's a string to specify tumble switch. If the utility doesn't
1943 have tumble switch, set to nil.
1948 OUTPUT It's a string to specify how to generate an output file. Some
1949 utilities accept an output file option, but some others need
1950 output redirection or some other way to specify an output file.
1953 \" \" ; psnup ... input output
1956 \">\" ; mpage ... input > output
1958 SWITCHES List of sexp's to pass as extra options to the PostScript utility
1965 DEFAULT It's a way to set default values when this entry is selected.
1970 That associates VARIABLE with VALUE. when this entry is
1971 selected, it's executed the following command:
1973 (set VARIABLE (eval VALUE))
1975 Note that VALUE can be any valid lisp expression. So, don't
1976 forget to quote symbols and constant lists.
1977 If VARIABLE is the special keyword `inherits-from:', VALUE must
1978 be a symbol name setting defined in `pr-setting-database' from
1979 which the current setting inherits the context. Take care with
1980 circular inheritance.
1982 '(pr-file-landscape . nil)
1983 '(pr-file-duplex . t)
1984 '(pr-gs-device . (my-gs-device t))
1986 This variable should be modified by customization engine. If this variable is
1987 modified by other means (for example, a lisp function), use `pr-update-menus'
1988 function (see it for documentation) to update PostScript utility menu.
1990 NOTE: Don't forget to download and install the utilities declared on
1991 `pr-ps-utility-alist'.
1995 * On GNU or Unix system:
1997 '((mpage \"mpage\" nil \"-b%s\" \"-%d\" \"-l\" \"-t\" \"-T\" \">\" nil)
1998 (psnup \"psnup\" (\"-q\") \"-P%s\" \"-%d\" \"-l\" nil nil \" \" nil
1999 (pr-file-duplex . nil) (pr-file-tumble . nil))
2002 * On Windows system:
2004 '((psnup \"c:/psutils/psnup\" (\"-q\") \"-P%s\" \"-%d\" \"-l\" nil nil \" \"
2005 nil (pr-file-duplex . nil) (pr-file-tumble . nil))
2008 (list :tag
"PS File Utility"
2009 (symbol :tag
"Utility Symbol")
2010 (string :tag
"Utility Name")
2011 (repeat :tag
"Must Utility Switches"
2012 (sexp :tag
"Switch" :value
""))
2013 (choice :menu-tag
"Paper Size"
2015 (const :tag
"No Paper Size" nil
)
2016 (string :tag
"Paper Size Format"))
2017 (choice :menu-tag
"N-Up"
2019 (const :tag
"No N-Up" nil
)
2020 (string :tag
"N-Up Format"))
2021 (choice :menu-tag
"Landscape"
2023 (const :tag
"No Landscape" nil
)
2024 (string :tag
"Landscape Switch"))
2025 (choice :menu-tag
"Duplex"
2027 (const :tag
"No Duplex" nil
)
2028 (string :tag
"Duplex Switch"))
2029 (choice :menu-tag
"Tumble"
2031 (const :tag
"No Tumble" nil
)
2032 (string :tag
"Tumble Switch"))
2033 (string :tag
"Output Separator")
2034 (repeat :tag
"Utility Switches"
2035 (sexp :tag
"Switch" :value
""))
2037 :tag
"Default Value List"
2042 :menu-tag
"Variable"
2044 (const :tag
"PS File Landscape" pr-file-landscape
)
2045 (const :tag
"PS File Duplex" pr-file-duplex
)
2046 (const :tag
"PS File Tumble" pr-file-tumble
)
2047 (const :tag
"Ghostscript Device" pr-gs-device
)
2048 (const :tag
"Ghostscript Resolution" pr-gs-resolution
)
2049 (const :tag
"inherits-from:" inherits-from
:)
2050 (variable :tag
"Other"))
2051 (sexp :tag
"Value")))
2053 :set
'pr-alist-custom-set
2057 (defcustom pr-menu-lock t
2058 "*Non-nil means menu is locked while selecting toggle options.
2060 See also `pr-menu-char-height' and `pr-menu-char-width'."
2065 (defcustom pr-menu-char-height
2066 (cond ((eq ps-print-emacs-type
'emacs
) ; GNU Emacs
2067 (pr-e-frame-char-height))
2068 ((eq ps-print-emacs-type
'xemacs
) ; XEmacs
2069 (pr-x-font-height (face-font 'default
))))
2070 "*Specify menu char height in pixels.
2072 This variable is used to guess which vertical position should be locked the
2073 menu, so don't forget to adjust it if menu position is not ok.
2075 See also `pr-menu-lock' and `pr-menu-char-width'."
2080 (defcustom pr-menu-char-width
2081 (cond ((eq ps-print-emacs-type
'emacs
) ; GNU Emacs
2082 (pr-e-frame-char-width))
2083 ((eq ps-print-emacs-type
'xemacs
) ; XEmacs
2084 (pr-x-font-width (face-font 'default
))))
2085 "*Specify menu char width in pixels.
2087 This variable is used to guess which horizontal position should be locked the
2088 menu, so don't forget to adjust it if menu position is not ok.
2090 See also `pr-menu-lock' and `pr-menu-char-height'."
2095 (defcustom pr-setting-database
2096 '((no-duplex ; setting symbol name
2097 nil nil nil
; inherits local kill-local
2098 (pr-file-duplex . nil
) ; settings
2099 (pr-file-tumble . nil
))
2101 "*Specify an alist for settings in general.
2103 The elements have the following form:
2105 (SYMBOL INHERITS LOCAL KILL-LOCAL SETTING...)
2109 SYMBOL It's a symbol to identify the setting group.
2111 INHERITS Specify the inheritance for SYMBOL group. It's a symbol name
2112 setting from which the current setting inherits the context.
2113 If INHERITS is nil, means that there is no inheritance.
2114 This is a simple inheritance mechanism.
2116 Let's see an example to illustrate the inheritance mechanism:
2118 (setq pr-setting-database
2119 '((no-duplex ; setting symbol name
2121 nil nil ; local kill-local
2122 (pr-file-duplex . nil) ; settings
2123 (pr-file-tumble . nil)
2125 (no-duplex-and-landscape ; setting symbol name
2126 no-duplex ; inherits
2127 nil nil ; local kill-local
2128 (pr-file-landscape . nil) ; settings
2131 The example above has two setting groups: no-duplex and
2132 no-duplex-and-landscape. When setting no-duplex is activated
2133 through `inherits-from:' (see `pr-ps-utility', `pr-mode-alist'
2134 and `pr-ps-printer-alist'), the variables pr-file-duplex and
2135 pr-file-tumble are both set to nil.
2137 Now when setting no-duplex-and-landscape is activated through
2138 `inherits-from:', the variable pr-file-landscape is set to nil
2139 and also the settings for no-duplex are done, because
2140 no-duplex-and-landscape inherits settings from no-duplex.
2142 Take care with circular inheritance. It's an error if circular
2143 inheritance happens.
2145 LOCAL Non-nil means that all settings for SYMBOL group will be
2146 declared local buffer.
2148 KILL-LOCAL Non-nil means that all settings for SYMBOL group will be
2149 killed at end. It has effect only when LOCAL is non-nil.
2151 SETTING It's a cons like:
2155 That associates VARIABLE with VALUE. when this entry is
2156 selected, it's executed the following command:
2158 * If LOCAL is non-nil:
2159 (set (make-local-variable VARIABLE) (eval VALUE))
2162 (set VARIABLE (eval VALUE))
2164 Note that VALUE can be any valid lisp expression. So, don't
2165 forget to quote symbols and constant lists.
2166 This setting is ignored if VARIABLE is equal to keyword
2169 '(ps-landscape-mode . nil)
2170 '(ps-spool-duplex . t)
2171 '(pr-gs-device . (my-gs-device t))"
2175 (symbol :tag
"Setting Name")
2176 (choice :menu-tag
"Inheritance"
2178 (const :tag
"No Inheritance" nil
)
2179 (symbol :tag
"Inherits From"))
2180 (boolean :tag
"Local Buffer Setting")
2181 (boolean :tag
"Kill Local Variable At End")
2188 :menu-tag
"Variable"
2190 (const :tag
"Landscape" ps-landscape-mode
)
2191 (const :tag
"Print Header" ps-print-header
)
2192 (const :tag
"Print Header Frame" ps-print-header-frame
)
2193 (const :tag
"Line Number" ps-line-number
)
2194 (const :tag
"Zebra Stripes" ps-zebra-stripes
)
2195 (const :tag
"Duplex" ps-spool-duplex
)
2196 (const :tag
"Tumble" ps-spool-tumble
)
2197 (const :tag
"Upside-Down" ps-print-upside-down
)
2198 (const :tag
"PS File Landscape" pr-file-landscape
)
2199 (const :tag
"PS File Duplex" pr-file-duplex
)
2200 (const :tag
"PS File Tumble" pr-file-tumble
)
2201 (const :tag
"Auto Region" pr-auto-region
)
2202 (const :tag
"Auto Mode" pr-auto-mode
)
2203 (const :tag
"Ghostscript Device" pr-gs-device
)
2204 (const :tag
"Ghostscript Resolution" pr-gs-resolution
)
2205 (variable :tag
"Other"))
2206 (sexp :tag
"Value")))
2211 (defcustom pr-visible-entry-list
2212 '(postscript text postscript-options postscript-process printing help
)
2213 "*Specify a list of Printing menu visible entries.
2215 Valid values with the corresponding menu parts are:
2217 +------------------------------+
2218 | Printing Interface |
2219 +------------------------------+
2220 `postscript' | PostScript Preview >|
2221 | PostScript Print >|
2222 | PostScript Printer: name >|
2223 +------------------------------+
2224 `text' | Printify >|
2226 | Text Printer: name >|
2227 +------------------------------+
2228 `postscript-options' |[ ] Landscape |
2230 |[ ] Print Header Frame |
2232 |[ ] Zebra Stripes |
2236 | Print All Pages >|
2237 +------------------------------+
2238 `postscript-process' |[ ] Spool Buffer |
2239 |[ ] Print with faces |
2240 |[ ] Print via Ghostscript |
2241 +------------------------------+
2242 `printing' |[ ] Auto Region |
2245 +------------------------------+
2246 `help' | Customize >|
2249 +------------------------------+
2251 Any other value is ignored."
2252 :type
'(repeat :tag
"Menu Visible Part"
2253 (choice :menu-tag
"Menu Part"
2257 (const postscript-options
)
2258 (const postscript-process
)
2264 (defcustom pr-delete-temp-file t
2265 "*Non-nil means delete temporary files.
2267 Set `pr-delete-temp-file' to nil, if the following message (or a similar)
2268 happens when printing:
2270 Error: could not open \"c:\\temp\\prspool.ps\" for reading."
2275 (defcustom pr-list-directory nil
2276 "*Non-nil means list directory when processing a directory.
2278 That is, any subdirectories (and the superdirectory) of the directory (given as
2279 argument of functions below) are also printed (as dired-mode listings).
2281 It's used by `pr-ps-directory-preview', `pr-ps-directory-using-ghostscript',
2282 `pr-ps-directory-print', `pr-ps-directory-ps-print', `pr-printify-directory'
2283 and `pr-txt-directory'."
2288 (defcustom pr-buffer-name
"*Printing Interface*"
2289 "*Specify the name of the buffer interface for printing package.
2291 It's used by `pr-interface'."
2296 (defcustom pr-buffer-name-ignore
2297 (list (regexp-quote pr-buffer-name
) ; ignore printing interface buffer
2298 "^ .*$") ; ignore invisible buffers
2299 "*Specify a regexp list for buffer names to be ignored in interface buffer.
2301 NOTE: Case is important for matching, that is, `case-fold-search' is always
2304 It's used by `pr-interface'."
2305 :type
'(repeat (regexp :tag
"Buffer Name Regexp"))
2309 (defcustom pr-buffer-verbose t
2310 "*Non-nil means to be verbose when editing a field in interface buffer.
2312 It's used by `pr-interface'."
2317 (defcustom pr-shell-file-name
2318 (if (and (not pr-cygwin-system
)
2322 "*Specify file name to load inferior shells from."
2327 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2328 ;; Internal Variables
2331 (defvar pr-txt-command nil
2332 "Name of program for printing a text file.
2333 See `pr-txt-printer-alist'.")
2336 (defvar pr-txt-switches nil
2337 "List of sexp's to pass as extra options to the text printer program.
2338 See `pr-txt-printer-alist'.")
2341 (defvar pr-txt-printer nil
2342 "Specify text printer name.
2343 See `pr-txt-printer-alist'.")
2346 (defvar pr-ps-command nil
2347 "Name of program for printing a PostScript file.
2348 See `pr-ps-printer-alist'.")
2351 (defvar pr-ps-switches nil
2352 "List of sexp's to pass as extra options to the PostScript printer program.
2353 See `pr-ps-printer-alist'.")
2356 (defvar pr-ps-printer-switch nil
2357 "Specify PostScript printer name switch.
2358 See `pr-ps-printer-alist'.")
2361 (defvar pr-ps-printer nil
2362 "Specify PostScript printer name.
2363 See `pr-ps-printer-alist'.")
2366 (defvar pr-menu-bar nil
2367 "Specify Printing menu-bar entry.")
2370 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2374 (defmacro pr-xemacs-global-menubar
(&rest body
)
2376 (let ((temp (get-buffer-create (make-temp-name " *Temp"))))
2377 ;; be sure to access global menubar
2380 (kill-buffer temp
))))
2383 (defsubst pr-visible-p
(key)
2384 (memq key pr-visible-entry-list
))
2387 (defsubst pr-mode-alist-p
()
2388 (cdr (assq major-mode pr-mode-alist
)))
2391 (defsubst pr-auto-mode-p
()
2392 (and pr-auto-mode
(pr-mode-alist-p)))
2395 (defsubst pr-using-ghostscript-p
()
2396 (and pr-print-using-ghostscript
(not pr-spool-p
)))
2400 (defun pr-get-symbol (name)
2401 ;; Recent versions of easy-menu downcase names before interning them.
2402 (and (fboundp 'easy-menu-name-match
)
2403 (setq name
(downcase name
)))
2404 (or (intern-soft name
)
2405 (make-symbol name
)))
2408 ((eq ps-print-emacs-type
'emacs
) ; GNU Emacs
2409 (defsubst pr-region-active-p
()
2410 (and pr-auto-region transient-mark-mode mark-active
)))
2412 ((eq ps-print-emacs-type
'xemacs
) ; XEmacs
2413 (defsubst pr-region-active-p
()
2414 (and pr-auto-region
(not zmacs-region-stays
) (ps-mark-active-p)))))
2417 (defconst pr-menu-spec
2419 ((eq ps-print-emacs-type
'emacs
) ; GNU Emacs
2421 ["Printing Interface" pr-interface
2422 :help
"Use buffer interface instead of menu interface"]
2424 ("PostScript Preview" :visible
(pr-visible-p 'postscript
)
2425 :help
"Preview PostScript instead of sending to printer"
2426 ("Directory" :active
(not pr-spool-p
)
2427 ["1-up" (pr-ps-directory-preview 1 nil nil t
) t
]
2428 ["2-up" (pr-ps-directory-preview 2 nil nil t
) t
]
2429 ["4-up" (pr-ps-directory-preview 4 nil nil t
) t
]
2430 ["Other..." (pr-ps-directory-preview nil nil nil t
)
2431 :keys
"\\[pr-ps-buffer-preview]"])
2432 ("Buffer" :active
(not pr-spool-p
)
2433 ["1-up" (pr-ps-buffer-preview 1 t
) t
]
2434 ["2-up" (pr-ps-buffer-preview 2 t
) t
]
2435 ["4-up" (pr-ps-buffer-preview 4 t
) t
]
2436 ["Other..." (pr-ps-buffer-preview nil t
)
2437 :keys
"\\[pr-ps-buffer-preview]"])
2438 ("Region" :active
(and (not pr-spool-p
) (ps-mark-active-p))
2439 ["1-up" (pr-ps-region-preview 1 t
) t
]
2440 ["2-up" (pr-ps-region-preview 2 t
) t
]
2441 ["4-up" (pr-ps-region-preview 4 t
) t
]
2442 ["Other..." (pr-ps-region-preview nil t
)
2443 :keys
"\\[pr-ps-region-preview]"])
2444 ("Mode" :active
(and (not pr-spool-p
) (pr-mode-alist-p))
2445 ["1-up" (pr-ps-mode-preview 1 t
) t
]
2446 ["2-up" (pr-ps-mode-preview 2 t
) t
]
2447 ["4-up" (pr-ps-mode-preview 4 t
) t
]
2448 ["Other..." (pr-ps-mode-preview nil t
)
2449 :keys
"\\[pr-ps-mode-preview]"])
2451 ["No Preprocessing..." (call-interactively 'pr-ps-file-preview
)
2452 :keys
"\\[pr-ps-file-preview]"
2453 :help
"Preview PostScript file"]
2455 ["PostScript Utility" pr-update-menus
:active pr-ps-utility-alist
2456 :help
"Select PostScript utility"]
2458 ["1-up..." (pr-ps-file-up-preview 1 t t
) pr-ps-utility-alist
]
2459 ["2-up..." (pr-ps-file-up-preview 2 t t
) pr-ps-utility-alist
]
2460 ["4-up..." (pr-ps-file-up-preview 4 t t
) pr-ps-utility-alist
]
2461 ["Other..." (pr-ps-file-up-preview nil t t
)
2462 :keys
"\\[pr-ps-file-up-preview]" :active pr-ps-utility-alist
]
2464 ["Landscape" pr-toggle-file-landscape
2465 :style toggle
:selected pr-file-landscape
2466 :help
"Toggle landscape for PostScript file"
2467 :active pr-ps-utility-alist
]
2468 ["Duplex" pr-toggle-file-duplex
2469 :style toggle
:selected pr-file-duplex
2470 :help
"Toggle duplex for PostScript file"
2471 :active pr-ps-utility-alist
]
2472 ["Tumble" pr-toggle-file-tumble
2473 :style toggle
:selected pr-file-tumble
2474 :help
"Toggle tumble for PostScript file"
2475 :active
(and pr-file-duplex pr-ps-utility-alist
)])
2476 ["Despool..." (call-interactively 'pr-despool-preview
)
2477 :active pr-spool-p
:keys
"\\[pr-despool-preview]"
2478 :help
"Despool PostScript buffer to printer or file (C-u)"])
2479 ("PostScript Print" :visible
(pr-visible-p 'postscript
)
2480 :help
"Send PostScript to printer or file (C-u)"
2482 ["1-up" (pr-ps-directory-ps-print 1 nil nil t
) t
]
2483 ["2-up" (pr-ps-directory-ps-print 2 nil nil t
) t
]
2484 ["4-up" (pr-ps-directory-ps-print 4 nil nil t
) t
]
2485 ["Other..." (pr-ps-directory-ps-print nil nil nil t
)
2486 :keys
"\\[pr-ps-buffer-ps-print]"])
2488 ["1-up" (pr-ps-buffer-ps-print 1 t
) t
]
2489 ["2-up" (pr-ps-buffer-ps-print 2 t
) t
]
2490 ["4-up" (pr-ps-buffer-ps-print 4 t
) t
]
2491 ["Other..." (pr-ps-buffer-ps-print nil t
)
2492 :keys
"\\[pr-ps-buffer-ps-print]"])
2493 ("Region" :active
(ps-mark-active-p)
2494 ["1-up" (pr-ps-region-ps-print 1 t
) t
]
2495 ["2-up" (pr-ps-region-ps-print 2 t
) t
]
2496 ["4-up" (pr-ps-region-ps-print 4 t
) t
]
2497 ["Other..." (pr-ps-region-ps-print nil t
)
2498 :keys
"\\[pr-ps-region-ps-print]"])
2499 ("Mode" :active
(pr-mode-alist-p)
2500 ["1-up" (pr-ps-mode-ps-print 1 t
) t
]
2501 ["2-up" (pr-ps-mode-ps-print 2 t
) t
]
2502 ["4-up" (pr-ps-mode-ps-print 4 t
) t
]
2503 ["Other..." (pr-ps-mode-ps-print nil t
)
2504 :keys
"\\[pr-ps-mode-ps-print]"])
2506 ["No Preprocessing..." (call-interactively 'pr-ps-file-ps-print
)
2507 :keys
"\\[pr-ps-file-ps-print]"
2508 :help
"Send PostScript file to printer"]
2510 ["PostScript Utility" pr-update-menus
:active pr-ps-utility-alist
2511 :help
"Select PostScript utility"]
2513 ["1-up..." (pr-ps-file-up-ps-print 1 t t
) pr-ps-utility-alist
]
2514 ["2-up..." (pr-ps-file-up-ps-print 2 t t
) pr-ps-utility-alist
]
2515 ["4-up..." (pr-ps-file-up-ps-print 4 t t
) pr-ps-utility-alist
]
2516 ["Other..." (pr-ps-file-up-ps-print nil t t
)
2517 :keys
"\\[pr-ps-file-up-ps-print]" :active pr-ps-utility-alist
]
2519 ["Landscape" pr-toggle-file-landscape
2520 :style toggle
:selected pr-file-landscape
2521 :help
"Toggle landscape for PostScript file"
2522 :active pr-ps-utility-alist
]
2523 ["Duplex" pr-toggle-file-duplex
2524 :style toggle
:selected pr-file-duplex
2525 :help
"Toggle duplex for PostScript file"
2526 :active pr-ps-utility-alist
]
2527 ["Tumble" pr-toggle-file-tumble
2528 :style toggle
:selected pr-file-tumble
2529 :help
"Toggle tumble for PostScript file"
2530 :active
(and pr-file-duplex pr-ps-utility-alist
)])
2531 ["Despool..." (call-interactively 'pr-despool-ps-print
)
2532 :active pr-spool-p
:keys
"\\[pr-despool-ps-print]"
2533 :help
"Despool PostScript buffer to printer or file (C-u)"])
2534 ["PostScript Printers" pr-update-menus
2535 :active pr-ps-printer-alist
:included
(pr-visible-p 'postscript
)
2536 :help
"Select PostScript printer"]
2538 ("Printify" :visible
(pr-visible-p 'text
)
2539 :help
"Replace non-printing chars with printable representations."
2540 ["Directory" pr-printify-directory t
]
2541 ["Buffer" pr-printify-buffer t
]
2542 ["Region" pr-printify-region
(ps-mark-active-p)])
2543 ("Print" :visible
(pr-visible-p 'text
)
2544 :help
"Send text to printer"
2545 ["Directory" pr-txt-directory t
]
2546 ["Buffer" pr-txt-buffer t
]
2547 ["Region" pr-txt-region
(ps-mark-active-p)]
2548 ["Mode" pr-txt-mode
(pr-mode-alist-p)])
2549 ["Text Printers" pr-update-menus
2550 :active pr-txt-printer-alist
:included
(pr-visible-p 'text
)
2551 :help
"Select text printer"]
2553 ["Landscape" pr-toggle-landscape
2554 :style toggle
:selected ps-landscape-mode
2555 :included
(pr-visible-p 'postscript-options
)]
2556 ["Print Header" pr-toggle-header
2557 :style toggle
:selected ps-print-header
2558 :included
(pr-visible-p 'postscript-options
)]
2559 ["Print Header Frame" pr-toggle-header-frame
2560 :style toggle
:selected ps-print-header-frame
:active ps-print-header
2561 :included
(pr-visible-p 'postscript-options
)]
2562 ["Line Number" pr-toggle-line
2563 :style toggle
:selected ps-line-number
2564 :included
(pr-visible-p 'postscript-options
)]
2565 ["Zebra Stripes" pr-toggle-zebra
2566 :style toggle
:selected ps-zebra-stripes
2567 :included
(pr-visible-p 'postscript-options
)]
2568 ["Duplex" pr-toggle-duplex
2569 :style toggle
:selected ps-spool-duplex
2570 :included
(pr-visible-p 'postscript-options
)]
2571 ["Tumble" pr-toggle-tumble
2572 :style toggle
:selected ps-spool-tumble
:active ps-spool-duplex
2573 :included
(pr-visible-p 'postscript-options
)]
2574 ["Upside-Down" pr-toggle-upside-down
2575 :style toggle
:selected ps-print-upside-down
2576 :included
(pr-visible-p 'postscript-options
)]
2577 ("Print All Pages" :visible
(pr-visible-p 'postscript-options
)
2578 :help
"Select odd/even pages/sheets to print"
2579 ["All Pages" (pr-even-or-odd-pages nil
)
2580 :style radio
:selected
(eq ps-even-or-odd-pages nil
)]
2581 ["Even Pages" (pr-even-or-odd-pages 'even-page
)
2582 :style radio
:selected
(eq ps-even-or-odd-pages
'even-page
)]
2583 ["Odd Pages" (pr-even-or-odd-pages 'odd-page
)
2584 :style radio
:selected
(eq ps-even-or-odd-pages
'odd-page
)]
2585 ["Even Sheets" (pr-even-or-odd-pages 'even-sheet
)
2586 :style radio
:selected
(eq ps-even-or-odd-pages
'even-sheet
)]
2587 ["Odd Sheets" (pr-even-or-odd-pages 'odd-sheet
)
2588 :style radio
:selected
(eq ps-even-or-odd-pages
'odd-sheet
)])
2590 ["Spool Buffer" pr-toggle-spool
2591 :style toggle
:selected pr-spool-p
2592 :included
(pr-visible-p 'postscript-process
)
2593 :help
"Toggle PostScript spooling"]
2594 ["Print with faces" pr-toggle-faces
2595 :style toggle
:selected pr-faces-p
2596 :included
(pr-visible-p 'postscript-process
)
2597 :help
"Toggle PostScript printing with faces"]
2598 ["Print via Ghostscript" pr-toggle-ghostscript
2599 :style toggle
:selected pr-print-using-ghostscript
2600 :included
(pr-visible-p 'postscript-process
)
2601 :help
"Toggle PostScript generation using ghostscript"]
2603 ["Auto Region" pr-toggle-region
2604 :style toggle
:selected pr-auto-region
2605 :included
(pr-visible-p 'printing
)]
2606 ["Auto Mode" pr-toggle-mode
2607 :style toggle
:selected pr-auto-mode
2608 :included
(pr-visible-p 'printing
)]
2609 ["Menu Lock" pr-toggle-lock
2610 :style toggle
:selected pr-menu-lock
2611 :included
(pr-visible-p 'printing
)]
2613 ("Customize" :visible
(pr-visible-p 'help
)
2614 ["printing" pr-customize t
]
2615 ["ps-print" ps-print-customize t
]
2616 ["lpr" lpr-customize t
])
2617 ("Show Settings" :visible
(pr-visible-p 'help
)
2618 ["printing" pr-show-pr-setup t
]
2619 ["ps-print" pr-show-ps-setup t
]
2620 ["lpr" pr-show-lpr-setup t
])
2621 ["Help" pr-help
:active t
:included
(pr-visible-p 'help
)]
2625 ((eq ps-print-emacs-type
'xemacs
) ; XEmacs
2627 ;; unfortunately XEmacs doesn't support :active or :visible
2628 ;; for submenus, only for items.
2629 ;; It uses :included instead of :active or :visible.
2630 ;; Also, XEmacs doesn't support :help tag.
2632 ["Printing Interface" pr-interface
]
2634 ("PostScript Preview" :included
(pr-visible-p 'postscript
)
2635 ("Directory" :included
(not pr-spool-p
)
2636 ["1-up" (pr-ps-directory-preview 1 nil nil t
) t
]
2637 ["2-up" (pr-ps-directory-preview 2 nil nil t
) t
]
2638 ["4-up" (pr-ps-directory-preview 4 nil nil t
) t
]
2639 ["Other..." (pr-ps-directory-preview nil nil nil t
)
2640 :keys
"\\[pr-ps-buffer-preview]"])
2641 ("Buffer" :included
(not pr-spool-p
)
2642 ["1-up" (pr-ps-buffer-preview 1 t
) t
]
2643 ["2-up" (pr-ps-buffer-preview 2 t
) t
]
2644 ["4-up" (pr-ps-buffer-preview 4 t
) t
]
2645 ["Other..." (pr-ps-buffer-preview nil t
)
2646 :keys
"\\[pr-ps-buffer-preview]"])
2647 ("Region" :included
(and (not pr-spool-p
) (ps-mark-active-p))
2648 ["1-up" (pr-ps-region-preview 1 t
) t
]
2649 ["2-up" (pr-ps-region-preview 2 t
) t
]
2650 ["4-up" (pr-ps-region-preview 4 t
) t
]
2651 ["Other..." (pr-ps-region-preview nil t
)
2652 :keys
"\\[pr-ps-region-preview]"])
2653 ("Mode" :included
(and (not pr-spool-p
) (pr-mode-alist-p))
2654 ["1-up" (pr-ps-mode-preview 1 t
) t
]
2655 ["2-up" (pr-ps-mode-preview 2 t
) t
]
2656 ["4-up" (pr-ps-mode-preview 4 t
) t
]
2657 ["Other..." (pr-ps-mode-preview nil t
)
2658 :keys
"\\[pr-ps-mode-preview]"])
2660 ["No Preprocessing..." (call-interactively 'pr-ps-file-preview
)
2661 :keys
"\\[pr-ps-file-preview]"]
2663 ["PostScript Utility" pr-update-menus
:active pr-ps-utility-alist
]
2665 ["1-up..." (pr-ps-file-up-preview 1 t t
) pr-ps-utility-alist
]
2666 ["2-up..." (pr-ps-file-up-preview 2 t t
) pr-ps-utility-alist
]
2667 ["4-up..." (pr-ps-file-up-preview 4 t t
) pr-ps-utility-alist
]
2668 ["Other..." (pr-ps-file-up-preview nil t t
)
2669 :keys
"\\[pr-ps-file-up-preview]" :active pr-ps-utility-alist
]
2671 ["Landscape" pr-toggle-file-landscape
2672 :style toggle
:selected pr-file-landscape
2673 :active pr-ps-utility-alist
]
2674 ["Duplex" pr-toggle-file-duplex
2675 :style toggle
:selected pr-file-duplex
2676 :active pr-ps-utility-alist
]
2677 ["Tumble" pr-toggle-file-tumble
2678 :style toggle
:selected pr-file-tumble
2679 :active
(and pr-file-duplex pr-ps-utility-alist
)])
2680 ["Despool..." (call-interactively 'pr-despool-preview
)
2681 :active pr-spool-p
:keys
"\\[pr-despool-preview]"])
2682 ("PostScript Print" :included
(pr-visible-p 'postscript
)
2684 ["1-up" (pr-ps-directory-ps-print 1 nil nil t
) t
]
2685 ["2-up" (pr-ps-directory-ps-print 2 nil nil t
) t
]
2686 ["4-up" (pr-ps-directory-ps-print 4 nil nil t
) t
]
2687 ["Other..." (pr-ps-directory-ps-print nil nil nil t
)
2688 :keys
"\\[pr-ps-buffer-ps-print]"])
2690 ["1-up" (pr-ps-buffer-ps-print 1 t
) t
]
2691 ["2-up" (pr-ps-buffer-ps-print 2 t
) t
]
2692 ["4-up" (pr-ps-buffer-ps-print 4 t
) t
]
2693 ["Other..." (pr-ps-buffer-ps-print nil t
)
2694 :keys
"\\[pr-ps-buffer-ps-print]"])
2695 ("Region" :included
(ps-mark-active-p)
2696 ["1-up" (pr-ps-region-ps-print 1 t
) t
]
2697 ["2-up" (pr-ps-region-ps-print 2 t
) t
]
2698 ["4-up" (pr-ps-region-ps-print 4 t
) t
]
2699 ["Other..." (pr-ps-region-ps-print nil t
)
2700 :keys
"\\[pr-ps-region-ps-print]"])
2701 ("Mode" :included
(pr-mode-alist-p)
2702 ["1-up" (pr-ps-mode-ps-print 1 t
) t
]
2703 ["2-up" (pr-ps-mode-ps-print 2 t
) t
]
2704 ["4-up" (pr-ps-mode-ps-print 4 t
) t
]
2705 ["Other..." (pr-ps-mode-ps-print nil t
)
2706 :keys
"\\[pr-ps-mode-ps-print]"])
2708 ["No Preprocessing..." (call-interactively 'pr-ps-file-ps-print
)
2709 :keys
"\\[pr-ps-file-ps-print]"]
2711 ["PostScript Utility" pr-update-menus
:active pr-ps-utility-alist
]
2713 ["1-up..." (pr-ps-file-up-ps-print 1 t t
) pr-ps-utility-alist
]
2714 ["2-up..." (pr-ps-file-up-ps-print 2 t t
) pr-ps-utility-alist
]
2715 ["4-up..." (pr-ps-file-up-ps-print 4 t t
) pr-ps-utility-alist
]
2716 ["Other..." (pr-ps-file-up-ps-print nil t t
)
2717 :keys
"\\[pr-ps-file-up-ps-print]" :active pr-ps-utility-alist
]
2719 ["Landscape" pr-toggle-file-landscape
2720 :style toggle
:selected pr-file-landscape
2721 :active pr-ps-utility-alist
]
2722 ["Duplex" pr-toggle-file-duplex
2723 :style toggle
:selected pr-file-duplex
2724 :active pr-ps-utility-alist
]
2725 ["Tumble" pr-toggle-file-tumble
2726 :style toggle
:selected pr-file-tumble
2727 :active
(and pr-file-duplex pr-ps-utility-alist
)])
2728 ["Despool..." (call-interactively 'pr-despool-ps-print
)
2729 :active pr-spool-p
:keys
"\\[pr-despool-ps-print]"])
2730 ["PostScript Printers" pr-update-menus
2731 :active pr-ps-printer-alist
:included
(pr-visible-p 'postscript
)]
2733 ("Printify" :included
(pr-visible-p 'text
)
2734 ["Directory" pr-printify-directory t
]
2735 ["Buffer" pr-printify-buffer t
]
2736 ["Region" pr-printify-region
(ps-mark-active-p)])
2737 ("Print" :included
(pr-visible-p 'text
)
2738 ["Directory" pr-txt-directory t
]
2739 ["Buffer" pr-txt-buffer t
]
2740 ["Region" pr-txt-region
(ps-mark-active-p)]
2741 ["Mode" pr-txt-mode
(pr-mode-alist-p)])
2742 ["Text Printers" pr-update-menus
2743 :active pr-txt-printer-alist
:included
(pr-visible-p 'text
)]
2745 ["Landscape" pr-toggle-landscape
2746 :style toggle
:selected ps-landscape-mode
2747 :included
(pr-visible-p 'postscript-options
)]
2748 ["Print Header" pr-toggle-header
2749 :style toggle
:selected ps-print-header
2750 :included
(pr-visible-p 'postscript-options
)]
2751 ["Print Header Frame" pr-toggle-header-frame
2752 :style toggle
:selected ps-print-header-frame
:active ps-print-header
2753 :included
(pr-visible-p 'postscript-options
)]
2754 ["Line Number" pr-toggle-line
2755 :style toggle
:selected ps-line-number
2756 :included
(pr-visible-p 'postscript-options
)]
2757 ["Zebra Stripes" pr-toggle-zebra
2758 :style toggle
:selected ps-zebra-stripes
2759 :included
(pr-visible-p 'postscript-options
)]
2760 ["Duplex" pr-toggle-duplex
2761 :style toggle
:selected ps-spool-duplex
2762 :included
(pr-visible-p 'postscript-options
)]
2763 ["Tumble" pr-toggle-tumble
2764 :style toggle
:selected ps-spool-tumble
:active ps-spool-duplex
2765 :included
(pr-visible-p 'postscript-options
)]
2766 ["Upside-Down" pr-toggle-upside-down
2767 :style toggle
:selected ps-print-upside-down
2768 :included
(pr-visible-p 'postscript-options
)]
2769 ("Print All Pages" :included
(pr-visible-p 'postscript-options
)
2770 ["All Pages" (pr-even-or-odd-pages nil
)
2771 :style radio
:selected
(eq ps-even-or-odd-pages nil
)]
2772 ["Even Pages" (pr-even-or-odd-pages 'even-page
)
2773 :style radio
:selected
(eq ps-even-or-odd-pages
'even-page
)]
2774 ["Odd Pages" (pr-even-or-odd-pages 'odd-page
)
2775 :style radio
:selected
(eq ps-even-or-odd-pages
'odd-page
)]
2776 ["Even Sheets" (pr-even-or-odd-pages 'even-sheet
)
2777 :style radio
:selected
(eq ps-even-or-odd-pages
'even-sheet
)]
2778 ["Odd Sheets" (pr-even-or-odd-pages 'odd-sheet
)
2779 :style radio
:selected
(eq ps-even-or-odd-pages
'odd-sheet
)])
2781 ["Spool Buffer" pr-toggle-spool
2782 :style toggle
:selected pr-spool-p
2783 :included
(pr-visible-p 'postscript-process
)]
2784 ["Print with faces" pr-toggle-faces
2785 :style toggle
:selected pr-faces-p
2786 :included
(pr-visible-p 'postscript-process
)]
2787 ["Print via Ghostscript" pr-toggle-ghostscript
2788 :style toggle
:selected pr-print-using-ghostscript
2789 :included
(pr-visible-p 'postscript-process
)]
2791 ["Auto Region" pr-toggle-region
2792 :style toggle
:selected pr-auto-region
2793 :included
(pr-visible-p 'printing
)]
2794 ["Auto Mode" pr-toggle-mode
2795 :style toggle
:selected pr-auto-mode
2796 :included
(pr-visible-p 'printing
)]
2797 ["Menu Lock" pr-toggle-lock
2798 :style toggle
:selected pr-menu-lock
2799 :included
(pr-visible-p 'printing
)]
2801 ("Customize" :included
(pr-visible-p 'help
)
2802 ["printing" pr-customize t
]
2803 ["ps-print" ps-print-customize t
]
2804 ["lpr" lpr-customize t
])
2805 ("Show Settings" :included
(pr-visible-p 'help
)
2806 ["printing" pr-show-pr-setup t
]
2807 ["ps-print" pr-show-ps-setup t
]
2808 ["lpr" pr-show-lpr-setup t
])
2809 ["Help" pr-help
:active t
:included
(pr-visible-p 'help
)]
2815 ((eq ps-print-emacs-type
'emacs
) ; GNU Emacs
2818 ;; Replace existing "print" item by "Printing" item.
2819 ;; If you're changing this file, you'll load it a second,
2820 ;; third... time, but "print" item exists only in the first load.
2821 (defvar pr-menu-print-item
"print")
2824 ((string< emacs-version
"21.")
2825 (easy-menu-change '("tools") "Printing" pr-menu-spec pr-menu-print-item
)
2826 (when pr-menu-print-item
2827 (easy-menu-remove-item nil
'("tools") pr-menu-print-item
)
2828 (setq pr-menu-print-item nil
2829 pr-menu-bar
(vector 'menu-bar
'tools
2830 (pr-get-symbol "Printing")))))
2833 (easy-menu-change '("files") "Print" pr-menu-spec
"print-buffer")
2834 (let ((items '("print-buffer" "print-region"
2835 "ps-print-buffer-faces" "ps-print-region-faces"
2836 "ps-print-buffer" "ps-print-region")))
2838 (easy-menu-remove-item nil
'("files") (car items
))
2839 (setq items
(cdr items
)))
2840 (setq pr-menu-print-item nil
2841 pr-menu-bar
(vector 'menu-bar
'files
2842 (pr-get-symbol "Print")))))
2844 (easy-menu-change '("files") "Print" pr-menu-spec
)))
2847 (global-set-key [print] 'pr-ps-fast-fire)
2848 (global-set-key [M-print] 'pr-ps-mode-using-ghostscript)
2849 (global-set-key [C-print] 'pr-txt-fast-fire))
2852 ((eq ps-print-emacs-type 'xemacs) ; XEmacs
2854 (pr-xemacs-global-menubar
2855 (pr-x-add-submenu nil (cons "Printing" pr-menu-spec) "Apps"))
2858 (global-set-key 'f22 'pr-ps-fast-fire)
2859 (global-set-key '(meta f22) 'pr-ps-mode-using-ghostscript)
2860 (global-set-key '(control f22) 'pr-txt-fast-fire))))
2863 ;;; You can also use something like:
2864 ;;;(global-set-key "\C-ci" 'pr-interface)
2865 ;;;(global-set-key "\C-cbp" 'pr-ps-buffer-print)
2866 ;;;(global-set-key "\C-cbx" 'pr-ps-buffer-preview)
2867 ;;;(global-set-key "\C-cbb" 'pr-ps-buffer-using-ghostscript)
2868 ;;;(global-set-key "\C-crp" 'pr-ps-region-print)
2869 ;;;(global-set-key "\C-crx" 'pr-ps-region-preview)
2870 ;;;(global-set-key "\C-crr" 'pr-ps-region-using-ghostscript)
2873 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2877 (defconst pr-help-message
2878 (concat "printing.el version " pr-version
2879 " ps-print.el version " ps-print-version
2884 The `printing' menu (Tools/Printing or File/Print) has the following layout:
2886 +-----------------------------+
2887 A 0 | Printing Interface |
2888 +-----------------------------+ +-A---------+ +-B------+
2889 I 1 | PostScript Preview >|-------|Directory >|-----|1-up |
2890 2 | PostScript Print >|---- A |Buffer >|-- B |2-up |
2891 3 | PostScript Printer: name >|---- C |Region >|-- B |4-up |
2892 +-----------------------------+ |Mode >|-- B |Other...|
2893 II 4 | Printify >|-----\\ |File >|--\\ +--------+
2894 5 | Print >|---\\ | |Despool... | |
2895 6 | Text Printer: name >|-\\ | | +-----------+ |
2896 +-----------------------------+ | | | +---------+ +------------+
2897 III 7 |[ ]Landscape | | | \\-|Directory| | No Prep... | Ia
2898 8 |[ ]Print Header | | | |Buffer | +------------+ Ib
2899 9 |[ ]Print Header Frame | | | |Region | | name >|- C
2900 10 |[ ]Line Number | | | +---------+ +------------+
2901 11 |[ ]Zebra Stripes | | | +---------+ | 1-up... | Ic
2902 12 |[ ]Duplex | | \\---|Directory| | 2-up... |
2903 13 |[ ]Tumble | \\--\\ |Buffer | | 4-up... |
2904 14 |[ ]Upside-Down | | |Region | | Other... |
2905 15 | Print All Pages >|--\\ | |Mode | +------------+
2906 +-----------------------------+ | | +---------+ |[ ]Landscape| Id
2907 IV 16 |[ ]Spool Buffer | | | +-C-------+ |[ ]Duplex | Ie
2908 17 |[ ]Print with faces | | \\--|( )name A| |[ ]Tumble | If
2909 18 |[ ]Print via Ghostscript | | |( )name B| +------------+
2910 +-----------------------------+ | |... |
2911 V 19 |[ ]Auto Region | | |(*)name |
2912 20 |[ ]Auto Mode | | |... |
2913 21 |[ ]Menu Lock | | +---------+ +--------------+
2914 +-----------------------------+ \\------------------|(*)All Pages |
2915 VI 22 | Customize >|--- D +-D------+ |( )Even Pages |
2916 23 | Show Settings >|-------|printing| |( )Odd Pages |
2917 24 | Help | |ps-print| |( )Even Sheets|
2918 +-----------------------------+ |lpr | |( )Odd Sheets |
2919 +--------+ +--------------+
2921 See `pr-visible-entry-list' for hiding some parts of the menu.
2923 The menu has the following sections:
2927 0. You can use a buffer interface instead of menus. It looks like the
2928 customization buffer. Basically, it has the same options found in the
2929 menu and some extra options, all this on a buffer.
2931 I. PostScript printing:
2933 1. You can generate a PostScript file (if you type C-u before activating
2934 menu) or PostScript temporary file for a directory, a buffer, a region
2935 or a major mode, choosing 1-up, 2-up, 4-up or any other n-up printing;
2936 after file generation, ghostview is activated using the file generated
2937 as argument. This option is disabled if spooling is on (option 16).
2938 Also, if you already have a PostScript file you can preview it.
2939 Instead of previewing each buffer, region or major mode at once, you
2940 can save temporarily the PostScript code generated in a buffer and
2941 preview it later. The option `Despool...' despools the PostScript
2942 spooling buffer in a temporary file and uses ghostview to preview it.
2943 If you type C-u before choosing this option, the PostScript code
2944 generated is saved in a file instead of saving in a temporary file. To
2945 spool the PostScript code generated you need to turn on the option 16.
2946 The option `Despool...' is enabled if spooling is on (option 16).
2948 NOTE 1: It's possible to customize a major mode printing, just declare
2949 the customization in `pr-mode-alist' and invoke some of
2950 `*-mode*' commands or select Mode option in Printing menu. An
2951 example for major mode usage is when you're using gnus (or mh,
2952 or rmail, etc.) and you're in the *Summary* buffer, if you
2953 forget to switch to the *Article* buffer before printing,
2954 you'll get a nicely formatted list of article subjects shows
2955 up at the printer. With major mode printing you don't need to
2956 switch from gnus *Summary* buffer first.
2958 NOTE 2: There are the following options for PostScript file processing:
2959 Ia. Print the file *No Preprocessing*, that is, send it
2960 directly to PostScript printer.
2961 Ib. PostScript utility processing selection.
2962 See `pr-ps-utility-alist' and `pr-setting-database' for
2964 Ic. Do n-up processing before printing.
2965 Id. Toggle on/off landscape for PostScript file processing.
2966 Ie. Toggle on/off duplex for PostScript file processing.
2967 If. Toggle on/off tumble for PostScript file processing.
2969 NOTE 3: Don't forget to download and install the utilities declared on
2970 `pr-ps-utility-alist'.
2972 2. Operate the same way as option 1, but it sends directly the PostScript
2973 code (or put in a file, if you've typed C-u) or it uses ghostscript to
2974 print the PostScript file generated. It depends on option 18, if it's
2975 turned on, it uses ghostscript; otherwise, it sends directly to
2976 printer. If spooling is on (option 16), the PostScript code is saved
2977 temporarily in a buffer instead of printing it or saving it in a file.
2978 Also, if you already have a PostScript file you can print it.
2979 Instead of printing each buffer, region or major mode at once, you can
2980 save temporarily the PostScript code generated in a buffer and print it
2981 later. The option `Despool...' despools the PostScript spooling buffer
2982 directly on a printer. If you type C-u before choosing this option,
2983 the PostScript code generated is saved in a file instead of sending it to
2984 the printer. To spool the PostScript code generated you need to turn on
2985 option 16. This option is enabled if spooling is on (option 16).
2986 See also the NOTE 1, NOTE 2 and NOTE 3 on option 1.
2988 3. You can select a new PostScript printer to send PostScript code
2989 generated. For selection it's used all PostScript printers defined
2990 in `pr-ps-printer-alist' variable (see it for documentation).
2991 See also `pr-setting-database'.
2995 4. If you have control characters (character code from \\000 to \\037) in a
2996 buffer and you want to print them in a text printer, select this
2997 option. All control characters in your buffer or region will be
2998 replaced by a printable representation. The printable representations
2999 use ^ (for ASCII control characters) or hex. The characters tab,
3000 linefeed, space, return and formfeed are not affected.
3001 You don't need to select this option if you use any option of section
3002 I, the PostScript engine treats control characters properly.
3004 5. If you want to print a directory, buffer, region or major mode in a
3005 text printer, select this option. See also the NOTE 1 on option 1.
3007 6. You can select a new text printer to send text generated. For
3008 selection it's used all text printers defined in `pr-txt-printer-alist'
3009 variable (see it for documentation).
3010 See also `pr-setting-database'.
3012 III. PostScript page toggle options:
3014 7. If you want a PostScript landscape printing, turn on this option.
3016 8. If you want to have a header in each page in your PostScript code,
3017 turn on this option.
3019 9. If you want to draw a gaudy frame around the header, turn on this
3020 option. This option is enabled if print header is on (option 8).
3022 10. If you want that the line number is printed in your PostScript code,
3023 turn on this option.
3025 11. If you want background zebra stripes in your PostScript code, turn on
3028 12. If you want a duplex printing and your PostScript printer has this
3029 feature, turn on this option.
3031 13. If you turned on duplex printing, you can choose if you want to have a
3032 printing suitable for binding on the left or right (tumble off), or to
3033 have a printing suitable for binding at top or bottom (tumble on).
3034 This option is enabled if duplex is on (option 12).
3036 14. If you want a PostScript upside-down printing, turn on this option.
3038 15. With this option, you can choose if you want to print all pages, odd
3039 pages, even pages, odd sheets or even sheets.
3040 See also `ps-even-or-odd-pages'.
3042 IV. PostScript processing toggle options:
3044 16. If you want to spool the PostScript code generated, turn on this
3045 option. To spool the PostScript code generated use option 2. You can
3046 despool later by choosing option 1 or 2, sub-option `Despool...'.
3048 17. If you use colors in your buffers and want to see these colors on your
3049 PostScript code generated, turn on this option. If you have a
3050 black/white PostScript printer, these colors are displayed in gray
3051 scale by PostScript printer interpreter.
3053 18. If you don't have a PostScript printer to send PostScript files, turn
3054 on this option. When this option is on, the ghostscript is used to
3055 print PostScript files. In GNU or Unix system, if ghostscript is set
3056 as a PostScript filter, you don't need to turn on this option.
3058 V. Printing customization:
3060 19. If you want that region is automagically detected, turn on this
3061 option. Note that this will only work if you're using transient mark
3062 mode. When this option is on, the `*-buffer*' commands will behave
3063 like `*-region*' commands, that is, `*-buffer*' commands will print
3064 only the region marked instead of all buffer.
3066 20. Turn this option on if you want that when current major-mode is
3067 declared in `pr-mode-alist', the `*-buffer*' and `*-region*' commands
3068 behave like `*-mode*' commands.
3070 21. If you want that Printing menu stays open while you are setting
3071 toggle options, turn on this option. The variables
3072 `pr-menu-char-height' and `pr-menu-char-width' are used to guess the
3073 menu position, so don't forget to adjust these variables if menu
3078 22. Besides all options in section III, IV and V, you can customize much
3079 more PostScript options in `ps-print' option. Or you can customize
3080 some `lpr' options for text printing. Or customize `printing'
3083 23. Show current settings for `printing', `ps-print' or `lpr'.
3085 24. Quick help for printing menu layout.
3087 "Printing help message.")
3090 (defconst pr-interface-help-message
3091 (concat "printing.el version " pr-version
3092 " ps-print.el version " ps-print-version
3094 The printing interface buffer has the same functionality as the printing menu.
3095 The major difference is that the states (like sending PostScript generated to a
3096 file, n-up printing, etc.) are set and saved between priting buffer
3097 activation. Also, the landscape, duplex and tumble values are the same for
3098 PostScript file and directory/buffer/region/mode processing; using menu, there
3099 are different value sets for PostScript file and directory/buffer/region/mode
3102 The printing interface buffer has the following sections:
3106 Here you can choose to print/preview a buffer, a directory or a PostScript
3112 Select a buffer from the current buffer list.
3115 If it's on, this means that the selected buffer has an active region,
3116 so you can turn on/off, as you wish.
3117 If it's off when a buffer is selected, this means that the selected
3118 buffer has no active region, so it'll not be possible to turn it on.
3119 If you want to process the region, let this option on.
3120 If you want to process the whole buffer, let this option off.
3123 If it's on, this means that the selected buffer major mode is declared
3124 for major mode processing, so you can turn on/off, as you wish.
3125 If it's off when a buffer is selected, this means that the selected
3126 buffer major mode isn't declared for major mode processing, so it'll
3127 not be possible to turn it on.
3128 If you want the major mode processing, let this option on.
3129 If you don't want the major mode processing, let this option off.
3131 NOTE 1: It's possible to customize a major mode printing, just declare
3132 the customization in `pr-mode-alist' and invoke some of
3133 `*-mode*' commands or select Mode option in Printing menu. An
3134 example for major mode usage is when you're using gnus (or mh,
3135 or rmail, etc.) and you're in the *Summary* buffer, if you
3136 forget to switch to the *Article* buffer before printing,
3137 you'll get a nicely formatted list of article subjects shows
3138 up at the printer. With major mode printing you don't need to
3139 switch from gnus *Summary* buffer first.
3144 Specify a valid directory path.
3147 Specify a file name regexp. All file names in the directory that
3148 match with regexp will be printed/previewed. An empty file name
3149 regexp means to print/preview all files in the directory.
3151 * List Directory Entry:
3152 If it's turned on, list directory entries besides file entries.
3154 1c. PostScript file:
3157 Specify an existent PostScript file to print/preview.
3159 * PostScript Utility:
3160 Select a PostScript utility.
3161 See `pr-ps-utility-alist' and `pr-setting-database' for documentation.
3163 NOTE 2: Don't forget to download and install the utilities declared on
3164 `pr-ps-utility-alist'.
3167 If it's turned on, don't use the PostScript utility to preprocess the
3168 PostScript file before printing/previewing.
3170 2. PostScript printer:
3172 * PostScript Printer:
3173 You can select a new PostScript printer to send PostScript code
3174 generated. For selection it's used all PostScript printers defined
3175 in `pr-ps-printer-alist' variable (see it for documentation).
3176 See also `pr-setting-database'.
3179 If spooling is on, you can turn it on/off, as you wish.
3180 If spooling is off, it'll not be possible to turn it on.
3181 If it's turned on, specify to despools the PostScript spooling buffer in
3182 a temporary file or in the selected PostScript file when
3183 printing/previewing.
3186 Preview the PostScript generated.
3189 Print the PostScript generated.
3192 Quit from printing interface buffer.
3194 * Send to Printer/Temporary File:
3195 If it's turned on, the PostScript generated is sent directly to
3196 PostScript printer or, for previewing, to a temporary file.
3199 Specify a file name to send the PostScript generated.
3202 Specify n-up printing.
3207 Select a new text printer to send text generated. For selection it's used
3208 all text printers defined in `pr-txt-printer-alist' variable (see it for
3209 documentation). See also `pr-setting-database'.
3212 If you have control characters (character code from \\000 to \\037) in a
3213 buffer and you want to print them in a text printer, select this
3214 option. All control characters in your buffer or region will be
3215 replaced by a printable representation. The printable representations
3216 use ^ (for ASCII control characters) or hex. The characters tab,
3217 linefeed, space, return and formfeed are not affected.
3218 You don't need to select this option if you use any option of section
3219 I, the PostScript engine treats control characters properly.
3222 To print a directory, buffer, region or major mode in a
3223 text printer, select this option. See also the NOTE 1 on section 1.
3226 Quit from printing interface buffer.
3230 There are 3 setting columns:
3232 4a. First column (left column):
3235 PostScript landscape printing.
3238 To have a header in each page in your PostScript code.
3240 * Print Header Frame:
3241 To draw a gaudy frame around the header.
3244 The line number is printed in your PostScript code.
3247 Background zebra stripes in your PostScript code.
3250 Duplex printing (if your PostScript printer has this feature).
3253 If duplex printing is on, you can choose if you want to have a
3254 printing suitable for binding on the left or right (tumble off), or to
3255 have a printing suitable for binding at top or bottom (tumble on).
3258 PostScript upside-down printing.
3260 4b. Second column (middle column):
3263 If you want that region is automagically detected, turn on this
3264 option. Note that this will only work if you're using transient mark
3265 mode. When this option is on, the `*-buffer*' commands will behave
3266 like `*-region*' commands, that is, `*-buffer*' commands will print
3267 only the region marked instead of all buffer.
3270 Turn this option on if you want that when current major-mode is
3271 declared in `pr-mode-alist', the `*-buffer*' and `*-region*' commands
3272 behave like `*-mode*' commands.
3275 If you want that Printing menu stays open while you are setting
3276 toggle options, turn on this option. The variables
3277 `pr-menu-char-height' and `pr-menu-char-width' are used to guess the
3278 menu position, so don't forget to adjust these variables if menu
3282 To spool the PostScript code generated. You can despool later by
3283 setting Despool option on PostScript printer section.
3286 If you use colors in your buffers and want to see these colors on your
3287 PostScript code generated, turn on this option. If you have a
3288 black/white PostScript printer, these colors are displayed in gray
3289 scale by PostScript printer interpreter.
3291 * Print via Ghostscript:
3292 If you don't have a PostScript printer to send PostScript files, turn
3293 on this option. When this option is on, the ghostscript is used to
3294 print PostScript files. In GNU or Unix system, if ghostscript is set
3295 as a PostScript filter, you don't need to turn on this option.
3298 To print all pages, odd pages, even pages, odd sheets or even sheets.
3299 See also `ps-even-or-odd-pages'.
3301 4c. Third column (right column):
3304 That is, to be verbose when editing a field in interface buffer.
3308 Besides all options in section 4, you can customize much more PostScript
3309 options in `ps-print' option. Or you can customize some `lpr' options for
3310 text printing. Or customize `printing' options.
3314 Show current settings for `printing', `ps-print' or `lpr'.
3318 Quick help for printing interface buffer and printing menu layout. You can
3319 also quit the printing interface buffer or kill all printing help buffer.
3321 "Printing buffer interface help message.")
3324 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3329 (defun pr-interface (&optional buffer)
3330 "Activate the printing interface buffer.
3332 If BUFFER is nil, the current buffer is used for printing.
3334 For more information, type \\[pr-interface-help]."
3337 (set-buffer (or buffer (current-buffer)))
3338 (pr-create-interface)))
3342 (defun pr-ps-directory-preview (n-up dir file-regexp &optional filename)
3343 "Preview directory using ghostview.
3345 Interactively, the command prompts for N-UP printing number, a directory, a
3346 file name regexp for matching and, when you use a prefix argument (C-u), the
3347 command prompts the user for a file name, and saves the PostScript image in
3348 that file instead of saving it in a temporary file.
3350 Noninteractively, if N-UP is nil, prompts for N-UP printing number. If DIR is
3351 nil, prompts for DIRectory. If FILE-REGEXP is nil, prompts for
3352 FILE(name)-REGEXP. The argument FILENAME is treated as follows: if it's nil,
3353 save the image in a temporary file. If FILENAME is a string, save the
3354 PostScript image in a file with that name. If FILENAME is t, prompts for a
3357 See also documentation for `pr-list-directory'."
3358 (interactive (pr-interactive-ps-dir-args (pr-prompt "PS preview dir")))
3359 (pr-set-ps-dir-args 'n-up 'dir 'file-regexp 'filename
3360 (pr-prompt "PS preview dir"))
3361 (setq filename (pr-ps-file filename))
3362 (pr-ps-file-list n-up dir file-regexp filename)
3364 (pr-ps-file-preview filename)))
3368 (defun pr-ps-directory-using-ghostscript (n-up dir file-regexp &optional filename)
3369 "Print directory using PostScript through ghostscript.
3371 Interactively, the command prompts for N-UP printing number, a directory, a
3372 file name regexp for matching and, when you use a prefix argument (C-u), the
3373 command prompts the user for a file name, and saves the PostScript image in
3374 that file instead of saving it in a temporary file.
3376 Noninteractively, if N-UP is nil, prompts for N-UP printing number. If DIR is
3377 nil, prompts for DIRectory. If FILE-REGEXP is nil, prompts for
3378 FILE(name)-REGEXP. The argument FILENAME is treated as follows: if it's nil,
3379 save the image in a temporary file. If FILENAME is a string, save the
3380 PostScript image in a file with that name. If FILENAME is t, prompts for a
3383 See also documentation for `pr-list-directory'."
3384 (interactive (pr-interactive-ps-dir-args (pr-prompt "PS print dir GS")))
3385 (pr-set-ps-dir-args 'n-up 'dir 'file-regexp 'filename
3386 (pr-prompt "PS print dir GS"))
3387 (let ((file (pr-ps-file filename)))
3388 (pr-ps-file-list n-up dir file-regexp file)
3389 (pr-ps-file-using-ghostscript file)
3390 (or filename (pr-delete-file file))))
3394 (defun pr-ps-directory-print (n-up dir file-regexp &optional filename)
3395 "Print directory using PostScript printer.
3397 Interactively, the command prompts for N-UP printing number, a directory, a
3398 file name regexp for matching and, when you use a prefix argument (C-u), the
3399 command prompts the user for a file name, and saves the PostScript image in
3400 that file instead of saving it in a temporary file.
3402 Noninteractively, if N-UP is nil, prompts for N-UP printing number. If DIR is
3403 nil, prompts for DIRectory. If FILE-REGEXP is nil, prompts for
3404 FILE(name)-REGEXP. The argument FILENAME is treated as follows: if it's nil,
3405 save the image in a temporary file. If FILENAME is a string, save the
3406 PostScript image in a file with that name. If FILENAME is t, prompts for a
3409 See also documentation for `pr-list-directory'."
3410 (interactive (pr-interactive-ps-dir-args (pr-prompt "PS print dir")))
3411 (pr-set-ps-dir-args 'n-up 'dir 'file-regexp 'filename
3412 (pr-prompt "PS print dir"))
3413 (let ((file (pr-ps-file filename)))
3414 (pr-ps-file-list n-up dir file-regexp file)
3415 (pr-ps-file-print file)
3416 (or filename (pr-delete-file file))))
3420 (defun pr-ps-directory-ps-print (n-up dir file-regexp &optional filename)
3421 "Print directory using PostScript printer or through ghostscript.
3423 It depends on `pr-print-using-ghostscript'.
3425 Interactively, the command prompts for N-UP printing number, a directory, a
3426 file name regexp for matching and, when you use a prefix argument (C-u), the
3427 command prompts the user for a file name, and saves the PostScript image in
3428 that file instead of saving it in a temporary file.
3430 Noninteractively, if N-UP is nil, prompts for N-UP printing number. If DIR is
3431 nil, prompts for DIRectory. If FILE-REGEXP is nil, prompts for
3432 FILE(name)-REGEXP. The argument FILENAME is treated as follows: if it's nil,
3433 save the image in a temporary file. If FILENAME is a string, save the
3434 PostScript image in a file with that name. If FILENAME is t, prompts for a
3437 See also documentation for `pr-list-directory'."
3438 (interactive (pr-interactive-ps-dir-args
3439 (pr-prompt (pr-prompt-gs "PS print dir"))))
3440 (pr-set-ps-dir-args 'n-up 'dir 'file-regexp 'filename
3441 (pr-prompt (pr-prompt-gs "PS print dir")))
3442 (if (pr-using-ghostscript-p)
3443 (pr-ps-directory-using-ghostscript n-up dir file-regexp filename)
3444 (pr-ps-directory-print n-up dir file-regexp filename)))
3448 (defun pr-ps-buffer-preview (n-up &optional filename)
3449 "Preview buffer using ghostview.
3451 Interactively, the command prompts for N-UP printing number and, when you use a
3452 prefix argument (C-u), the command prompts the user for a file name, and saves
3453 the PostScript image in that file instead of saving it in a temporary file.
3455 Noninteractively, if N-UP is nil, prompts for N-UP printing number. The
3456 argument FILENAME is treated as follows: if it's nil, save the image in a
3457 temporary file. If FILENAME is a string, save the PostScript image in a file
3458 with that name. If FILENAME is t, prompts for a file name."
3459 (interactive (pr-interactive-n-up-file (pr-prompt "PS preview")))
3460 (if (pr-auto-mode-p)
3461 (pr-ps-mode-preview n-up filename)
3462 (pr-ps-preview (pr-region-active-symbol) n-up filename
3463 (pr-region-active-string "PS preview"))))
3467 (defun pr-ps-buffer-using-ghostscript (n-up &optional filename)
3468 "Print buffer using PostScript through ghostscript.
3470 Interactively, the command prompts for N-UP printing number and, when you use a
3471 prefix argument (C-u), the command prompts the user for a file name, and saves
3472 the PostScript image in that file instead of sending it to the printer.
3474 Noninteractively, if N-UP is nil, prompts for N-UP printing number. The
3475 argument FILENAME is treated as follows: if it's nil, send the image to the
3476 printer. If FILENAME is a string, save the PostScript image in a file with
3477 that name. If FILENAME is t, prompts for a file name."
3478 (interactive (pr-interactive-n-up-file (pr-prompt "PS print GS")))
3479 (if (pr-auto-mode-p)
3480 (pr-ps-mode-using-ghostscript n-up filename)
3481 (pr-ps-using-ghostscript (pr-region-active-symbol) n-up filename
3482 (pr-region-active-string "PS print GS"))))
3486 (defun pr-ps-buffer-print (n-up &optional filename)
3487 "Print buffer using PostScript printer.
3489 Interactively, the command prompts for N-UP printing number and, when you use a
3490 prefix argument (C-u), the command prompts the user for a file name, and saves
3491 the PostScript image in that file instead of sending it to the printer.
3493 Noninteractively, if N-UP is nil, prompts for N-UP printing number. The
3494 argument FILENAME is treated as follows: if it's nil, send the image to the
3495 printer. If FILENAME is a string, save the PostScript image in a file with
3496 that name. If FILENAME is t, prompts for a file name."
3497 (interactive (pr-interactive-n-up-file (pr-prompt "PS print")))
3498 (if (pr-auto-mode-p)
3499 (pr-ps-mode-print n-up filename)
3500 (pr-ps-print (pr-region-active-symbol) n-up filename
3501 (pr-region-active-string "PS print"))))
3505 (defun pr-ps-buffer-ps-print (n-up &optional filename)
3506 "Print buffer using PostScript printer or through ghostscript.
3508 It depends on `pr-print-using-ghostscript'.
3510 Interactively, the command prompts for N-UP printing number and, when you use a
3511 prefix argument (C-u), the command prompts the user for a file name, and saves
3512 the PostScript image in that file instead of sending it to the printer.
3514 Noninteractively, if N-UP is nil, prompts for N-UP printing number. The
3515 argument FILENAME is treated as follows: if it's nil, send the image to the
3516 printer. If FILENAME is a string, save the PostScript image in a file with
3517 that name. If FILENAME is t, prompts for a file name."
3518 (interactive (pr-interactive-n-up-file
3519 (pr-prompt (pr-prompt-gs "PS print"))))
3520 (cond ((pr-auto-mode-p)
3521 (pr-ps-mode-ps-print n-up filename))
3522 ((pr-using-ghostscript-p)
3523 (pr-ps-using-ghostscript (pr-region-active-symbol) n-up filename
3524 (pr-region-active-string "PS print GS")))
3526 (pr-ps-print (pr-region-active-symbol) n-up filename
3527 (pr-region-active-string "PS print")))))
3531 (defun pr-ps-region-preview (n-up &optional filename)
3532 "Preview region using ghostview.
3534 See also `pr-ps-buffer-preview'."
3535 (interactive (pr-interactive-n-up-file (pr-prompt-region "PS preview")))
3536 (if (pr-auto-mode-p)
3537 (let ((pr-auto-region t))
3538 (pr-ps-mode-preview n-up filename))
3539 (pr-ps-preview 'region n-up filename "PS preview region")))
3543 (defun pr-ps-region-using-ghostscript (n-up &optional filename)
3544 "Print region using PostScript through ghostscript.
3546 See also `pr-ps-buffer-using-ghostscript'."
3547 (interactive (pr-interactive-n-up-file (pr-prompt-region "PS print GS")))
3548 (if (pr-auto-mode-p)
3549 (let ((pr-auto-region t))
3550 (pr-ps-mode-using-ghostscript n-up filename))
3551 (pr-ps-using-ghostscript 'region n-up filename "PS print GS region")))
3555 (defun pr-ps-region-print (n-up &optional filename)
3556 "Print region using PostScript printer.
3558 See also `pr-ps-buffer-print'."
3559 (interactive (pr-interactive-n-up-file (pr-prompt-region "PS print")))
3560 (if (pr-auto-mode-p)
3561 (let ((pr-auto-region t))
3562 (pr-ps-mode-print n-up filename))
3563 (pr-ps-print 'region n-up filename "PS print region")))
3567 (defun pr-ps-region-ps-print (n-up &optional filename)
3568 "Print region using PostScript printer or through ghostscript.
3570 See also `pr-ps-buffer-ps-print'."
3571 (interactive (pr-interactive-n-up-file
3572 (pr-prompt-region (pr-prompt-gs "PS print"))))
3573 (cond ((pr-auto-mode-p)
3574 (let ((pr-auto-region t))
3575 (pr-ps-mode-ps-print n-up filename)))
3576 ((pr-using-ghostscript-p)
3577 (pr-ps-using-ghostscript 'region n-up filename "PS print GS region"))
3579 (pr-ps-print 'region n-up filename "PS print region"))))
3583 (defun pr-ps-mode-preview (n-up &optional filename)
3584 "Preview major mode using ghostview.
3586 See also `pr-ps-buffer-preview'."
3587 (interactive (pr-interactive-n-up-file "PS preview mode"))
3588 (pr-set-n-up-and-filename 'n-up 'filename "PS preview mode")
3589 (let ((file (pr-ps-file filename)))
3590 (and (pr-ps-mode n-up file)
3592 (pr-ps-file-preview file))))
3596 (defun pr-ps-mode-using-ghostscript (n-up &optional filename)
3597 "Print major mode using PostScript through ghostscript.
3599 See also `pr-ps-buffer-using-ghostscript'."
3600 (interactive (pr-interactive-n-up-file "PS print GS mode"))
3601 (pr-set-n-up-and-filename 'n-up 'filename "PS print GS mode")
3602 (let ((file (pr-ps-file filename)))
3603 (when (and (pr-ps-mode n-up file)
3605 (pr-ps-file-using-ghostscript file)
3606 (or filename (pr-delete-file file)))))
3610 (defun pr-ps-mode-print (n-up &optional filename)
3611 "Print major mode using PostScript printer.
3613 See also `pr-ps-buffer-print'."
3614 (interactive (pr-interactive-n-up-file "PS print mode"))
3615 (pr-set-n-up-and-filename 'n-up 'filename "PS print mode")
3616 (pr-ps-mode n-up filename))
3620 (defun pr-ps-mode-ps-print (n-up &optional filename)
3621 "Print major mode using PostScript or through ghostscript.
3623 See also `pr-ps-buffer-ps-print'."
3624 (interactive (pr-interactive-n-up-file (pr-prompt-gs "PS print mode")))
3625 (if (pr-using-ghostscript-p)
3626 (pr-ps-mode-using-ghostscript n-up filename)
3627 (pr-ps-mode-print n-up filename)))
3631 (defun pr-printify-directory (&optional dir file-regexp)
3632 "Replace nonprinting characters in directory with printable representations.
3633 The printable representations use ^ (for ASCII control characters) or hex.
3634 The characters tab, linefeed, space, return and formfeed are not affected.
3636 Interactively, the command prompts for a directory and a file name regexp for
3639 Noninteractively, if DIR is nil, prompts for DIRectory. If FILE-REGEXP is nil,
3640 prompts for FILE(name)-REGEXP.
3642 See also documentation for `pr-list-directory'."
3643 (interactive (pr-interactive-dir-args "Printify dir"))
3644 (pr-set-dir-args 'dir 'file-regexp "Printify dir")
3645 (pr-file-list dir file-regexp 'pr-printify-buffer))
3649 (defun pr-printify-buffer ()
3650 "Replace nonprinting characters in buffer with printable representations.
3651 The printable representations use ^ (for ASCII control characters) or hex.
3652 The characters tab, linefeed, space, return and formfeed are not affected."
3654 (if (pr-region-active-p)
3655 (pr-printify-region)
3656 (printify-region (point-min) (point-max))))
3660 (defun pr-printify-region ()
3661 "Replace nonprinting characters in region with printable representations.
3662 The printable representations use ^ (for ASCII control characters) or hex.
3663 The characters tab, linefeed, space, return and formfeed are not affected."
3665 (printify-region (point) (mark)))
3669 (defun pr-txt-directory (&optional dir file-regexp)
3670 "Print directory using text printer.
3672 Interactively, the command prompts for a directory and a file name regexp for
3675 Noninteractively, if DIR is nil, prompts for DIRectory. If FILE-REGEXP is nil,
3676 prompts for FILE(name)-REGEXP.
3678 See also documentation for `pr-list-directory'."
3679 (interactive (pr-interactive-dir-args "Print dir"))
3680 (pr-set-dir-args 'dir 'file-regexp "Print dir")
3681 (pr-file-list dir file-regexp 'pr-txt-buffer))
3685 (defun pr-txt-buffer ()
3686 "Print buffer using text printer."
3688 (cond ((pr-auto-mode-p)
3690 ((pr-region-active-p)
3693 (pr-txt-print (point-min) (point-max)))))
3697 (defun pr-txt-region ()
3698 "Print region using text printer."
3700 (if (pr-auto-mode-p)
3701 (let ((pr-auto-region t))
3703 (pr-txt-print (point) (mark))))
3707 (defun pr-txt-mode ()
3708 "Print major mode using text printer."
3710 (let ((args (pr-mode-alist-p)))
3712 (funcall (car args) (nthcdr 2 args))
3714 (message "`%s' major mode not declared." major-mode))))
3718 (defun pr-despool-preview (&optional filename)
3719 "Preview spooled PostScript.
3721 Interactively, when you use a prefix argument (C-u), the command prompts the
3722 user for a file name, and saves the spooled PostScript image in that file
3723 instead of saving it in a temporary file.
3725 Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3726 save the image in a temporary file. If FILENAME is a string, save the
3727 PostScript image in a file with that name."
3728 (interactive (list (ps-print-preprint current-prefix-arg)))
3729 (let ((file (pr-ps-file filename)))
3730 (when (stringp file)
3731 (pr-despool-print file)
3732 (pr-ps-file-preview file))))
3736 (defun pr-despool-using-ghostscript (&optional filename)
3737 "Print spooled PostScript using ghostscript.
3739 Interactively, when you use a prefix argument (C-u), the command prompts the
3740 user for a file name, and saves the spooled PostScript image in that file
3741 instead of sending it to the printer.
3743 Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3744 send the image to the printer. If FILENAME is a string, save the PostScript
3745 image in a file with that name."
3746 (interactive (list (ps-print-preprint current-prefix-arg)))
3747 (let ((file (pr-ps-file filename)))
3748 (when (stringp file)
3749 (pr-despool-print file)
3750 (pr-ps-file-using-ghostscript file)
3751 (or filename (pr-delete-file file)))))
3755 (defun pr-despool-print (&optional filename)
3756 "Send the spooled PostScript to the printer.
3758 Interactively, when you use a prefix argument (C-u), the command prompts the
3759 user for a file name, and saves the spooled PostScript image in that file
3760 instead of sending it to the printer.
3762 Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3763 send the image to the printer. If FILENAME is a string, save the PostScript
3764 image in a file with that name."
3765 (interactive (list (ps-print-preprint current-prefix-arg)))
3766 (let ((ps-lpr-command (pr-command pr-ps-command))
3767 (ps-lpr-switches pr-ps-switches)
3768 (ps-printer-name-option pr-ps-printer-switch)
3769 (ps-printer-name pr-ps-printer))
3770 (ps-despool filename)))
3774 (defun pr-despool-ps-print (&optional filename)
3775 "Send the spooled PostScript to the printer or use ghostscript to print it.
3777 Interactively, when you use a prefix argument (C-u), the command prompts the
3778 user for a file name, and saves the spooled PostScript image in that file
3779 instead of sending it to the printer.
3781 Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3782 send the image to the printer. If FILENAME is a string, save the PostScript
3783 image in a file with that name."
3784 (interactive (list (ps-print-preprint current-prefix-arg)))
3785 (if pr-print-using-ghostscript
3786 (pr-despool-using-ghostscript filename)
3787 (pr-despool-print filename)))
3791 (defun pr-ps-file-preview (filename)
3792 "Preview PostScript file FILENAME."
3793 (interactive (list (pr-ps-infile-preprint "Preview ")))
3794 (and (stringp filename) (file-exists-p filename)
3795 (let ((shell-file-name pr-shell-file-name))
3796 (start-process-shell-command "PREVIEW" "*Messages*"
3797 (pr-command pr-gv-command) filename))))
3801 (defun pr-ps-file-up-preview (n-up ifilename &optional ofilename)
3802 "Preview PostScript file FILENAME."
3803 (interactive (pr-interactive-n-up-inout "PS preview"))
3804 (let ((outfile (pr-ps-utility-args 'n-up 'ifilename 'ofilename
3806 (pr-ps-utility-process n-up ifilename outfile)
3807 (pr-ps-file-preview outfile)))
3811 (defun pr-ps-file-using-ghostscript (filename)
3812 "Print PostScript file FILENAME using ghostscript."
3813 (interactive (list (pr-ps-infile-preprint "Print preview ")))
3814 (and (stringp filename) (file-exists-p filename)
3815 (let* ((file (pr-expand-file-name filename))
3816 (tempfile (pr-dosify-path (make-temp-name file))))
3819 (concat (pr-command pr-gs-command)
3820 " -sDEVICE=" pr-gs-device
3821 " -r" (int-to-string pr-gs-resolution)
3822 " " (pr-switches-string pr-gs-switches "pr-gs-switches")
3823 " -sOutputFile=" tempfile " " file " -c quit"))
3825 (pr-ps-file-print tempfile)
3827 (pr-delete-file tempfile))))
3831 (defun pr-ps-file-print (filename)
3832 "Print PostScript file FILENAME."
3833 (interactive (list (pr-ps-infile-preprint "Print ")))
3834 (and (stringp filename) (file-exists-p filename)
3836 (let ((file (pr-expand-file-name filename)))
3837 (if (string= pr-ps-command "")
3838 (let ((ps-spool-buffer (get-buffer-create ps-spool-buffer-name)))
3840 (set-buffer ps-spool-buffer)
3842 (insert-file-contents-literally file))
3845 (concat (pr-command pr-ps-command) " "
3846 (pr-switches-string pr-ps-switches "pr-gs-switches") " "
3847 (if (string-match "cp" pr-ps-command)
3848 ;; for "cp" (cmd in out)
3849 (concat "\"" file "\" "
3850 pr-ps-printer-switch pr-ps-printer)
3851 ;; else, for others (cmd out in)
3852 (concat pr-ps-printer-switch pr-ps-printer
3853 " \"" file "\""))))))))
3857 (defun pr-ps-file-ps-print (filename)
3858 "Send PostScript file FILENAME to printer or use ghostscript to print it."
3859 (interactive (list (pr-ps-infile-preprint
3860 (if pr-print-using-ghostscript
3863 (if pr-print-using-ghostscript
3864 (pr-ps-file-using-ghostscript filename)
3865 (pr-ps-file-print filename)))
3869 (defun pr-ps-file-up-ps-print (n-up ifilename &optional ofilename)
3870 "Process a PostScript file IFILENAME and send it to printer.
3872 Interactively, the command prompts for N-UP printing number, for an input
3873 PostScript file IFILENAME and, when you use a prefix argument (C-u), the
3874 command prompts the user for an output PostScript file name OFILENAME, and
3875 saves the PostScript image in that file instead of sending it to the printer.
3877 Noninteractively, if N-UP is nil, prompts for N-UP printing number. The
3878 argument IFILENAME is treated as follows: if it's t, prompts for an input
3879 PostScript file name; otherwise, it *must* be a string that it's an input
3880 PostScript file name. The argument OFILENAME is treated as follows: if it's
3881 nil, send the image to the printer. If OFILENAME is a string, save the
3882 PostScript image in a file with that name. If OFILENAME is t, prompts for a
3884 (interactive (pr-interactive-n-up-inout
3885 (if pr-print-using-ghostscript
3888 (let ((outfile (pr-ps-utility-args 'n-up 'ifilename 'ofilename
3889 (if pr-print-using-ghostscript
3892 (pr-ps-utility-process n-up ifilename outfile)
3894 (pr-ps-file-ps-print outfile)
3895 (pr-delete-file outfile))))
3899 (defun pr-toggle-file-duplex ()
3900 "Toggle duplex for PostScript file."
3902 (pr-toggle 'pr-file-duplex "PS file duplex" nil 7 5 nil
3903 '("PostScript Print" "File")))
3907 (defun pr-toggle-file-tumble ()
3908 "Toggle tumble for PostScript file.
3910 If tumble is off, produces a printing suitable for binding on the left or
3912 If tumble is on, produces a printing suitable for binding at the top or
3915 (pr-toggle 'pr-file-tumble "PS file tumble" nil 8 5 nil
3916 '("PostScript Print" "File")))
3920 (defun pr-toggle-file-landscape ()
3921 "Toggle landscape for PostScript file."
3923 (pr-toggle 'pr-file-landscape "PS file landscape" nil 6 5 nil
3924 '("PostScript Print" "File")))
3928 (defun pr-toggle-ghostscript ()
3929 "Toggle printing using ghostscript."
3931 (pr-toggle 'pr-print-using-ghostscript "Printing using ghostscript"
3932 'postscript-process 2 12 'toggle))
3936 (defun pr-toggle-faces ()
3937 "Toggle printing with faces."
3939 (pr-toggle 'pr-faces-p "Printing with faces"
3940 'postscript-process 1 12 'toggle))
3944 (defun pr-toggle-spool ()
3947 (pr-toggle 'pr-spool-p "Spooling printing"
3948 'postscript-process 0 12 'toggle))
3952 (defun pr-toggle-duplex ()
3955 (pr-toggle 'ps-spool-duplex "Printing duplex"
3956 'postcsript-options 5 12 'toggle))
3960 (defun pr-toggle-tumble ()
3963 If tumble is off, produces a printing suitable for binding on the left or
3965 If tumble is on, produces a printing suitable for binding at the top or
3968 (pr-toggle 'ps-spool-tumble "Tumble"
3969 'postscript-options 6 12 'toggle))
3973 (defun pr-toggle-landscape ()
3976 (pr-toggle 'ps-landscape-mode "Landscape"
3977 'postscript-options 0 12 'toggle))
3981 (defun pr-toggle-upside-down ()
3982 "Toggle upside-down."
3984 (pr-toggle 'ps-print-upside-down "Upside-Down"
3985 'postscript-options 7 12 'toggle))
3989 (defun pr-toggle-line ()
3990 "Toggle line number."
3992 (pr-toggle 'ps-line-number "Line number"
3993 'postscript-options 3 12 'toggle))
3997 (defun pr-toggle-zebra ()
3998 "Toggle zebra stripes."
4000 (pr-toggle 'ps-zebra-stripes "Zebra stripe"
4001 'postscript-options 4 12 'toggle))
4005 (defun pr-toggle-header ()
4006 "Toggle printing header."
4008 (pr-toggle 'ps-print-header "Print header"
4009 'postscript-options 1 12 'toggle))
4013 (defun pr-toggle-header-frame ()
4014 "Toggle printing header frame."
4016 (pr-toggle 'ps-print-header-frame "Print header frame"
4017 'postscript-options 2 12 'toggle))
4021 (defun pr-toggle-lock ()
4024 (pr-toggle 'pr-menu-lock "Menu lock"
4025 'printing 2 12 'toggle))
4029 (defun pr-toggle-region ()
4030 "Toggle auto region."
4032 (pr-toggle 'pr-auto-region "Auto region"
4033 'printing 0 12 'toggle))
4037 (defun pr-toggle-mode ()
4040 (pr-toggle 'pr-auto-mode "Auto mode"
4041 'printing 1 12 'toggle))
4045 (defun pr-customize (&rest ignore)
4046 "Customization of the `printing' group."
4048 (customize-group 'printing))
4052 (defun lpr-customize (&rest ignore)
4053 "Customization of the `lpr' group."
4055 (customize-group 'lpr))
4059 (defun pr-help (&rest ignore)
4060 "Help for the printing package."
4062 (pr-show-setup pr-help-message "*Printing Help*"))
4066 (defun pr-ps-name ()
4067 "Interactively select a PostScript printer."
4069 (pr-menu-set-ps-title
4070 (pr-complete-alist "PostScript printer" pr-ps-printer-alist pr-ps-name)))
4074 (defun pr-txt-name ()
4075 "Interactively select a text printer."
4077 (pr-menu-set-txt-title
4078 (pr-complete-alist "Text printer" pr-txt-printer-alist pr-txt-name)))
4082 (defun pr-ps-utility ()
4083 "Interactively select a PostScript utility."
4085 (pr-menu-set-utility-title
4086 (pr-complete-alist "Postscript utility" pr-ps-utility-alist pr-ps-utility)))
4090 (defun pr-show-ps-setup (&rest ignore)
4091 "Show current ps-print settings."
4093 (pr-show-setup (ps-setup) "*PS Setup*"))
4097 (defun pr-show-pr-setup (&rest ignore)
4098 "Show current printing settings."
4100 (pr-show-setup (pr-setup) "*PR Setup*"))
4104 (defun pr-show-lpr-setup (&rest ignore)
4105 "Show current lpr settings."
4107 (pr-show-setup (lpr-setup) "*LPR Setup*"))
4110 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4115 (defun pr-ps-fast-fire (n-up &optional select)
4116 "Fast fire function for PostScript printing.
4118 If a region is active, the region will be printed instead of the whole buffer.
4119 Also if the current major-mode is defined in `pr-mode-alist', the settings in
4120 `pr-mode-alist' will be used, that is, the current buffer or region will be
4121 printed using `pr-ps-mode-ps-print'.
4124 Interactively, you have the following situations:
4126 M-x pr-ps-fast-fire RET
4127 The command prompts the user for a N-UP value and printing will
4128 immediatelly be done using the current active printer.
4130 C-u M-x pr-ps-fast-fire RET
4131 C-u 0 M-x pr-ps-fast-fire RET
4132 The command prompts the user for a N-UP value and also for a current
4133 PostScript printer, then printing will immediatelly be done using the new
4134 current active printer.
4136 C-u 1 M-x pr-ps-fast-fire RET
4137 The command prompts the user for a N-UP value and also for a file name,
4138 and saves the PostScript image in that file instead of sending it to the
4141 C-u 2 M-x pr-ps-fast-fire RET
4142 The command prompts the user for a N-UP value, then for a current
4143 PostScript printer and, finally, for a file name. Then change the active
4144 printer to that choosen by user and saves the PostScript image in
4145 that file instead of sending it to the printer.
4148 Noninteractively, the argument N-UP should be a positive integer greater than
4149 zero and the argument SELECT is treated as follows:
4151 If it's nil, send the image to the printer.
4153 If it's a list or an integer lesser or equal to zero, the command prompts
4154 the user for a current PostScript printer, then printing will immediatelly
4155 be done using the new current active printer.
4157 If it's an integer equal to 1, the command prompts the user for a file name
4158 and saves the PostScript image in that file instead of sending it to the
4161 If it's an integer greater or equal to 2, the command prompts the user for a
4162 current PostScript printer and for a file name. Then change the active
4163 printer to that choosen by user and saves the PostScript image in that file
4164 instead of sending it to the printer.
4166 If it's a symbol which it's defined in `pr-ps-printer-alist', it's the new
4167 active printer and printing will immediatelly be done using the new active
4170 Otherwise, send the image to the printer.
4173 Note that this command always behaves as if `pr-auto-region' and `pr-auto-mode'
4175 (interactive (list (pr-interactive-n-up (pr-prompt-gs "PS print fast"))
4176 current-prefix-arg))
4177 (let ((pr-auto-region t)
4180 (cond ((null select))
4183 ((and (symbolp select)
4184 (assq select pr-ps-printer-alist))
4185 (pr-menu-set-ps-title select))
4189 (and (>= select 1) (not pr-spool-p)
4190 (setq filename (pr-ps-outfile-preprint
4191 (if pr-print-using-ghostscript
4194 (pr-ps-buffer-ps-print
4196 (min (max n-up 1) 100)
4197 (error "n-up must be an integer greater than zero."))
4202 (defun pr-txt-fast-fire (&optional select-printer)
4203 "Fast fire function for text printing.
4205 If a region is active, the region will be printed instead of the whole buffer.
4206 Also if the current major-mode is defined in `pr-mode-alist', the settings in
4207 `pr-mode-alist' will be used, that is, the current buffer or region will be
4208 printed using `pr-txt-mode'.
4210 Interactively, when you use a prefix argument (C-u), the command prompts the
4211 user for a new active text printer.
4213 Noninteractively, the argument SELECT-PRINTER is treated as follows:
4215 If it's nil, the printing is sent to the current active text printer.
4217 If it's a symbol which it's defined in `pr-txt-printer-alist', it's the new
4218 active printer and printing will immediatelly be done using the new active
4221 If it's non-nil, the command prompts the user for a new active text printer.
4223 Note that this command always behaves as if `pr-auto-region' and `pr-auto-mode'
4225 (interactive (list current-prefix-arg))
4226 (cond ((null select-printer))
4227 ((and (symbolp select-printer)
4228 (assq select-printer pr-txt-printer-alist))
4229 (pr-menu-set-txt-title select-printer))
4232 (let ((pr-auto-region t)
4237 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4242 "Return the current `printing' setup.
4244 This is *not* an interactive command.
4245 One way to see `printing' setup is to switch to a *Scratch* buffer and type:
4247 M-: (insert (pr-setup)) RET
4249 Or choose the menu option Printing/Show Settings/printing."
4250 (let (ps-prefix-quote)
4254 (concat "\n;;; printing.el version " pr-version "\n")
4255 '(19 . pr-shell-file-name)
4256 '(19 . pr-path-style)
4257 '(19 . pr-path-alist)
4260 '(21 . pr-txt-printer-alist)
4263 '(20 . pr-ps-printer-alist)
4266 '(20 . pr-ps-temp-file)
4267 '(20 . pr-delete-temp-file)
4268 '(20 . pr-list-directory)
4270 '(17 . pr-gv-command)
4271 '(17 . pr-gs-command)
4272 '(17 . pr-gs-switches)
4273 '(17 . pr-gs-device)
4274 '(17 . pr-gs-resolution)
4276 '(27 . pr-print-using-ghostscript)
4279 '(27 . pr-file-landscape)
4280 '(27 . pr-file-duplex)
4281 '(27 . pr-file-tumble)
4282 '(27 . pr-auto-region)
4283 '(27 . pr-auto-mode)
4285 '(20 . pr-ps-utility)
4286 '(20 . pr-ps-utility-alist)
4288 '(14 . pr-mode-alist)
4290 '(20 . pr-menu-lock)
4291 '(20 . pr-menu-char-height)
4292 '(20 . pr-menu-char-width)
4294 '(20 . pr-setting-database)
4296 '(22 . pr-visible-entry-list)
4298 '(22 . pr-buffer-verbose)
4299 '(22 . pr-buffer-name)
4300 '(22 . pr-buffer-name-ignore)
4301 ")\n\n;;; printing.el - end of settings\n")
4306 "Return the current `lpr' setup.
4308 This is *not* an interactive command.
4309 One way to see `lpr' setup is to switch to a *Scratch* buffer and type:
4311 M-: (insert (lpr-setup)) RET
4313 Or choose the menu option Printing/Show Settings/lpr."
4314 (let (ps-prefix-quote)
4317 '("\n;;; lpr.el settings\n"
4320 (25 . lpr-add-switches)
4322 (25 . lpr-headers-switches)
4323 (25 . print-region-function)
4324 (25 . lpr-page-header-program)
4325 (25 . lpr-page-header-switches)
4326 ")\n\n;;; lpr.el - end of settings\n")
4330 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4331 ;; mh-e (adapted from mh-e-init.el -- Tom Vogels <tov@ece.cmu.edu>)
4334 (defalias 'pr-mh-get-msg-num 'mh-get-msg-num)
4335 (defalias 'pr-mh-show 'mh-show)
4336 (defalias 'pr-mh-start-of-uncleaned-message 'mh-start-of-uncleaned-message)
4337 (defvar mh-show-buffer nil)
4340 (defun pr-article-date ()
4341 "Find the date of an article or mail message in current buffer.
4342 Return only the dayname, if present, weekday, month, and year."
4344 (goto-char (point-min))
4345 (if (re-search-forward
4346 "^Date:[ \t]+\\(\\([A-Za-z]+, \\)?[0-9]+ [A-Za-z]+ [0-9]+\\)" nil t)
4347 (buffer-substring (match-beginning 1) (match-end 1))
4348 (format-time-string "%Y/%m/%d"))))
4351 (defun pr-mh-current-message ()
4352 "Go to mh-inbox current message."
4353 (let ((msg (or (pr-mh-get-msg-num nil) 0)))
4355 (set-buffer mh-show-buffer)
4356 (goto-char (point-min))
4357 (pr-mh-start-of-uncleaned-message)
4358 (message "Printing message %d" msg)))
4361 (defun pr-mh-print-1 (n-up filename header-list)
4362 "Print mh-inbox current message in PostScript."
4364 (save-window-excursion
4365 (pr-mh-current-message)
4366 (pr-mode-print n-up filename header-list (point)))))
4369 (defun pr-mh-lpr-1 (header-list)
4370 "Print mh-inbox current message in text printer."
4372 (save-window-excursion
4373 (pr-mh-current-message)
4374 (pr-mode-lpr header-list (point)))))
4377 (defalias 'pr-mh-print-2 'pr-mode-print)
4380 (defalias 'pr-mh-lpr-2 'pr-mode-lpr)
4383 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4384 ;; rmail (hacked from ps-print.el)
4387 (defun pr-rmail-lpr (header-list)
4388 "Print RMAIL current message in text printer."
4389 (pr-lpr-message-from-summary header-list
4390 'rmail-buffer 'rmail-summary-buffer))
4393 (defun pr-rmail-print (n-up filename header-list)
4394 "Print RMAIL current message in PostScript."
4395 (pr-ps-message-from-summary n-up filename header-list
4396 'rmail-buffer 'rmail-summary-buffer))
4399 (defun pr-ps-message-from-summary (n-up filename header-list
4400 summary-buffer summary-default)
4401 "Print current message in PostScript."
4402 (let ((buf (or (and (boundp summary-buffer)
4403 (symbol-value summary-buffer))
4404 (symbol-value summary-default))))
4405 (and (get-buffer buf)
4408 (pr-mode-print n-up filename header-list)))))
4411 (defun pr-lpr-message-from-summary (header-list summary-buffer summary-default)
4412 "Print current message in text printer."
4413 (let ((buf (or (and (boundp summary-buffer)
4414 (symbol-value summary-buffer))
4415 (symbol-value summary-default))))
4416 (and (get-buffer buf)
4419 (pr-mode-lpr header-list)))))
4422 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4423 ;; gnus (hacked from ps-print.el)
4426 (defvar pr-gnus-article "*Article*")
4429 (defun pr-gnus-print (n-up filename header-list)
4430 "Print *Article* current message in PostScript."
4431 (pr-ps-message-from-summary n-up filename header-list
4432 'gnus-article-buffer 'pr-gnus-article))
4435 (defun pr-gnus-lpr (header-list)
4436 "Print *Article* current message in text printer."
4437 (pr-lpr-message-from-summary header-list
4438 'gnus-article-buffer 'pr-gnus-article))
4441 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4442 ;; vm (hacked from ps-print.el)
4445 (defvar pr-vm-summary "")
4448 (defun pr-vm-print (n-up filename header-list)
4449 "Print current vm message in PostScript."
4450 (pr-ps-message-from-summary n-up filename header-list
4451 'vm-mail-buffer 'pr-vm-summary))
4454 (defun pr-vm-lpr (header-list)
4455 "Print current vm message in text printer."
4456 (pr-lpr-message-from-summary header-list
4457 'vm-mail-buffer 'pr-vm-summary))
4460 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4464 (defun pr-ps-mode (n-up filename)
4465 "If current major mode is declared, print it in PostScript."
4466 (let ((args (pr-mode-alist-p)))
4468 (let ((fun (cdr args)))
4469 (funcall (car fun) n-up filename (cdr fun))
4472 (message "`%s' major mode not declared." major-mode)
4476 (defmacro pr-local-variable (header-list &rest body)
4478 (let ((ps-header-lines (or (nth 0 ,header-list) ps-header-lines))
4479 (ps-left-header (or (nth 1 ,header-list) ps-left-header))
4480 (ps-right-header (or (nth 2 ,header-list) ps-right-header))
4482 (let ((local-var-list (pr-eval-local-alist (nthcdr 4 ,header-list))))
4484 (and (nth 3 ,header-list)
4485 (pr-kill-local-variable local-var-list))))))
4488 (defun pr-mode-print (n-up filename header-list &optional from to)
4489 "Print current major mode in PostScript."
4492 (let ((file (pr-ps-file filename))
4494 ((pr-region-active-p) (region-beginning))
4497 (pr-text2ps (pr-region-active-symbol start) n-up file start
4499 ((pr-region-active-p) (region-end))
4502 (unless (or pr-spool-p filename)
4503 (pr-ps-file-print file)
4504 (pr-delete-file file)))))
4507 (defun pr-mode-lpr (header-list &optional from to)
4508 "Print current major mode in text printer."
4511 (pr-txt-print (cond (from)
4512 ((pr-region-active-p) (region-beginning))
4515 ((pr-region-active-p) (region-end))
4519 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4523 (defconst pr-menu-entry-alist
4526 (postscript-options . 9)
4527 (postscript-process . 3)
4531 "Alist that associates menu part with number of items per part.
4533 It's used by `pr-menu-index'.
4535 Each element has the form:
4537 (MENU-PART . NUMBER-OF-ITEMS)
4539 See `pr-visible-entry-alist'.")
4542 (defun pr-menu-index (entry index)
4544 (cond ((eq entry 'text)
4546 ((eq entry 'postscript-options)
4548 ((eq entry 'postscript-process)
4549 '(postscript text postscript-options))
4550 ((eq entry 'printing)
4551 '(postscript text postscript-options postscript-process))
4557 (setq key (car base-list)
4558 base-list (cdr base-list))
4559 (and (pr-visible-p key)
4560 (setq index (+ index
4561 (cdr (assq key pr-menu-entry-alist)))))))
4565 (defvar pr-menu-position nil)
4566 (defvar pr-menu-state nil)
4571 ((eq ps-print-emacs-type 'xemacs)
4573 (defun pr-menu-position (entry index horizontal)
4577 'x (- (pr-x-event-x-pixel current-mouse-event) ; X
4578 (* horizontal pr-menu-char-width))
4579 'y (- (pr-x-event-y-pixel current-mouse-event) ; Y
4580 (* (pr-menu-index entry index) pr-menu-char-height)))))
4583 ;; GNU Emacs for Windows 9x/NT
4584 (defun pr-menu-position (entry index horizontal)
4585 (let ((pos (cdr (pr-e-mouse-pixel-position))))
4587 (list (or (car pos) 0) ; X
4588 (- (or (cdr pos) 0) ; Y
4589 (* (pr-menu-index entry index) pr-menu-char-height)))
4590 (selected-frame)))) ; frame
4594 (defun pr-menu-position (entry index horizontal)
4595 (let ((pos (cdr (pr-e-mouse-pixel-position))))
4597 (list (- (or (car pos) 0) ; X
4598 (* horizontal pr-menu-char-width))
4599 (- (or (cdr pos) 0) ; Y
4600 (* (pr-menu-index entry index) pr-menu-char-height)))
4601 (selected-frame)))) ; frame
4605 ((eq ps-print-emacs-type 'emacs)
4607 (defun pr-menu-lookup (path)
4608 (let ((ipath pr-menu-bar))
4609 (lookup-key global-map
4612 (mapcar 'pr-get-symbol
4619 (defun pr-menu-lock (entry index horizontal state path)
4620 (when (and (not (interactive-p)) pr-menu-lock)
4621 (or (and pr-menu-position (eq state pr-menu-state))
4622 (setq pr-menu-position (pr-menu-position entry index horizontal)
4623 pr-menu-state state))
4624 (let* ((menu (pr-menu-lookup path))
4625 (result (x-popup-menu pr-menu-position menu)))
4627 (let ((command (lookup-key menu (vconcat result))))
4628 (if (fboundp command)
4631 (setq pr-menu-position nil))))
4634 ((eq ps-print-emacs-type 'xemacs)
4636 (defun pr-menu-lookup (path)
4637 (car (pr-x-find-menu-item current-menubar (cons "Printing" path))))
4640 (defun pr-menu-lock (entry index horizontal state path)
4641 (when (and (not (interactive-p)) pr-menu-lock)
4642 (or (and pr-menu-position (eq state pr-menu-state))
4643 (setq pr-menu-position (pr-menu-position entry index horizontal)
4644 pr-menu-state state))
4645 (let* ((menu (pr-menu-lookup path))
4646 (result (pr-x-get-popup-menu-response menu pr-menu-position)))
4647 (and (pr-x-misc-user-event-p result)
4648 (funcall (pr-x-event-function result)
4649 (pr-x-event-object result))))
4650 (setq pr-menu-position nil))))))
4653 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4654 ;; Printer & Utility Selection
4657 (defun pr-update-var (var-sym alist)
4658 (or (assq (symbol-value var-sym) alist)
4659 (set var-sym (car (car alist)))))
4662 (defun pr-update-menus (&optional force)
4663 "Update utility, PostScript and text printer menus.
4665 If FORCE is non-nil, update menus doesn't matter if `pr-ps-printer-alist',
4666 `pr-txt-printer-alist' or `pr-ps-utility-alist' were modified or not;
4667 otherwise, update PostScript printer menu iff `pr-ps-printer-menu-modified' is
4668 non-nil, update text printer menu iff `pr-txt-printer-menu-modified' is
4669 non-nil, and update PostScript File menus iff `pr-ps-utility-menu-modified' is
4672 (pr-update-var 'pr-ps-name pr-ps-printer-alist)
4673 (pr-update-var 'pr-txt-name pr-txt-printer-alist)
4674 (pr-update-var 'pr-ps-utility pr-ps-utility-alist)
4675 (pr-do-update-menus force))
4678 (defvar pr-ps-printer-menu-modified t
4679 "Non-nil means `pr-ps-printer-alist' was modified and we need to update menu.")
4680 (defvar pr-txt-printer-menu-modified t
4681 "Non-nil means `pr-txt-printer-alist' was modified and we need to update menu.")
4682 (defvar pr-ps-utility-menu-modified t
4683 "Non-nil means `pr-ps-utility-alist' was modified and we need to update menu.")
4686 (defconst pr-even-or-odd-alist
4687 '((nil . "Print All Pages")
4688 (even-page . "Print Even Pages")
4689 (odd-page . "Print Odd Pages")
4690 (even-sheet . "Print Even Sheets")
4691 (odd-sheet . "Print Odd Sheets")))
4694 (defun pr-menu-create (name alist var-sym fun entry index)
4698 (let ((sym (car elt)))
4701 (list fun (list 'quote sym) nil (list 'quote entry) index)
4703 :selected (list 'eq var-sym (list 'quote sym)))))
4709 ((eq ps-print-emacs-type 'emacs)
4711 (defalias 'pr-update-mode-line 'force-mode-line-update)
4714 (defun pr-do-update-menus (&optional force)
4715 (pr-menu-alist pr-ps-printer-alist
4717 'pr-menu-set-ps-title
4718 "PostScript Printers"
4719 'pr-ps-printer-menu-modified
4721 "PostScript Printers"
4723 (pr-menu-alist pr-txt-printer-alist
4725 'pr-menu-set-txt-title
4727 'pr-txt-printer-menu-modified
4731 (let ((save-var pr-ps-utility-menu-modified))
4732 (pr-menu-alist pr-ps-utility-alist
4734 'pr-menu-set-utility-title
4735 '("PostScript Print" "File" "PostScript Utility")
4738 "PostScript Utility"
4740 (pr-menu-alist pr-ps-utility-alist
4742 'pr-menu-set-utility-title
4743 '("PostScript Preview" "File" "PostScript Utility")
4744 'pr-ps-utility-menu-modified
4746 "PostScript Utility"
4748 (pr-even-or-odd-pages ps-even-or-odd-pages force))
4751 (defvar pr-temp-menu nil)
4754 (defun pr-menu-alist (alist var-sym fun menu-path modified-sym force name
4756 (when (and alist (or force (symbol-value modified-sym)))
4757 (easy-menu-define pr-temp-menu nil ""
4758 (pr-menu-create name alist var-sym fun entry index))
4759 (let ((item (pr-menu-get-item menu-path)))
4761 (let* ((binding (nthcdr 3 item))
4762 (key-binding (cdr binding)))
4763 (setcar binding pr-temp-menu)
4764 (and key-binding (listp (car key-binding))
4765 (setcdr binding (cdr key-binding))) ; skip KEY-BINDING
4766 (funcall fun (symbol-value var-sym) item))))
4767 (set modified-sym nil)))
4770 (defun pr-menu-set-ps-title (value &optional item entry index)
4771 (pr-menu-set-item-name (or item
4772 (pr-menu-get-item "PostScript Printers"))
4773 (format "PostScript Printer: %s" value))
4774 (pr-ps-set-printer value)
4776 (pr-menu-lock entry index 12 'toggle nil)))
4779 (defun pr-menu-set-txt-title (value &optional item entry index)
4780 (pr-menu-set-item-name (or item
4781 (pr-menu-get-item "Text Printers"))
4782 (format "Text Printer: %s" value))
4783 (pr-txt-set-printer value)
4785 (pr-menu-lock entry index 12 'toggle nil)))
4788 (defun pr-menu-set-utility-title (value &optional item entry index)
4789 (let ((name (symbol-name value)))
4791 (pr-menu-set-item-name item name)
4792 (pr-menu-set-item-name
4794 '("PostScript Print" "File" "PostScript Utility"))
4796 (pr-menu-set-item-name
4798 '("PostScript Preview" "File" "PostScript Utility"))
4800 (pr-ps-set-utility value)
4802 (pr-menu-lock entry index 5 nil '("PostScript Print" "File"))))
4805 (defun pr-even-or-odd-pages (value &optional no-lock)
4806 (pr-menu-set-item-name (pr-menu-get-item "Print All Pages")
4807 (cdr (assq value pr-even-or-odd-alist)))
4808 (setq ps-even-or-odd-pages value)
4810 (pr-menu-lock 'postscript-options 8 12 'toggle nil))))
4813 ((eq ps-print-emacs-type 'xemacs)
4815 (defalias 'pr-update-mode-line 'set-menubar-dirty-flag)
4818 (defvar pr-ps-name-old "PostScript Printers")
4819 (defvar pr-txt-name-old "Text Printers")
4820 (defvar pr-ps-utility-old "PostScript Utility")
4821 (defvar pr-even-or-odd-old "Print All Pages")
4824 (defun pr-do-update-menus (&optional force)
4825 (pr-menu-alist pr-ps-printer-alist
4827 'pr-menu-set-ps-title
4829 'pr-ps-printer-menu-modified
4833 (pr-menu-alist pr-txt-printer-alist
4835 'pr-menu-set-txt-title
4837 'pr-txt-printer-menu-modified
4841 (let ((save-var pr-ps-utility-menu-modified))
4842 (pr-menu-alist pr-ps-utility-alist
4844 'pr-menu-set-utility-title
4845 '("Printing" "PostScript Print" "File")
4850 (pr-menu-alist pr-ps-utility-alist
4852 'pr-menu-set-utility-title
4853 '("Printing" "PostScript Preview" "File")
4854 'pr-ps-utility-menu-modified
4858 (pr-even-or-odd-pages ps-even-or-odd-pages force))
4861 (defun pr-menu-alist (alist var-sym fun menu-path modified-sym force name
4863 (when (and alist (or force (symbol-value modified-sym)))
4864 (pr-xemacs-global-menubar
4865 (pr-x-add-submenu menu-path
4866 (pr-menu-create name alist var-sym
4868 (funcall fun (symbol-value var-sym))
4869 (set modified-sym nil)))
4872 (defun pr-menu-set-ps-title (value &optional item entry index)
4873 (pr-relabel-menu-item (format "PostScript Printer: %s" value)
4875 (pr-ps-set-printer value)
4877 (pr-menu-lock entry index 12 'toggle nil)))
4880 (defun pr-menu-set-txt-title (value &optional item entry index)
4881 (pr-relabel-menu-item (format "Text Printer: %s" value)
4883 (pr-txt-set-printer value)
4885 (pr-menu-lock entry index 12 'toggle nil)))
4888 (defun pr-menu-set-utility-title (value &optional item entry index)
4889 (pr-xemacs-global-menubar
4890 (let ((newname (format "%s" value)))
4891 (pr-x-relabel-menu-item
4892 (list "Printing" "PostScript Print" "File" pr-ps-utility-old)
4894 (pr-x-relabel-menu-item
4895 (list "Printing" "PostScript Preview" "File" pr-ps-utility-old)
4897 (setq pr-ps-utility-old newname)))
4898 (pr-ps-set-utility value)
4900 (pr-menu-lock entry index 5 nil '("PostScript Print" "File"))))
4903 (defun pr-even-or-odd-pages (value &optional no-lock)
4904 (pr-relabel-menu-item (cdr (assq value pr-even-or-odd-alist))
4905 'pr-even-or-odd-old)
4906 (setq ps-even-or-odd-pages value)
4908 (pr-menu-lock 'postscript-options 8 12 'toggle nil))))))
4911 (defun pr-relabel-menu-item (newname var-sym)
4912 (pr-xemacs-global-menubar
4913 (pr-x-relabel-menu-item
4914 (list "Printing" (symbol-value var-sym))
4916 (set var-sym newname)))
4919 (defun pr-menu-set-item-name (item name)
4921 (setcar (nthcdr 2 item) name))) ; ITEM-NAME
4924 (defun pr-menu-get-item (name-list)
4925 ;; NAME-LIST is a string or a list of strings.
4926 (let ((ipath pr-menu-bar)
4927 (len (and (listp name-list) (length name-list))))
4929 (setq name-list (car name-list)))
4935 ;; list and (length list) > 1
4936 (let* ((copy (copy-sequence name-list))
4937 (name (pr-get-symbol (nth (1- len) copy)))
4939 (setcdr (nthcdr (- len 2) copy) nil)
4945 (mapcar 'pr-get-symbol path))
4947 (assq name (nthcdr 2 menu))))
4950 (let ((name (pr-get-symbol name-list))
4951 (menu (lookup-key global-map ipath)))
4952 (assq name (nthcdr 2 menu)))))))
4955 (defun pr-ps-set-utility (value)
4956 (let ((item (cdr (assq value pr-ps-utility-alist))))
4959 "Invalid PostScript utility name `%s' for variable `pr-ps-utility'."
4961 (setq pr-ps-utility value)
4962 (pr-eval-alist (nthcdr 9 item)))
4963 (pr-update-mode-line))
4966 (defun pr-ps-set-printer (value)
4967 (let ((ps (cdr (assq value pr-ps-printer-alist))))
4970 "Invalid PostScript printer name `%s' for variable `pr-ps-name'."
4972 (setq pr-ps-name value
4973 pr-ps-command (pr-dosify-path (nth 0 ps))
4974 pr-ps-switches (nth 1 ps)
4975 pr-ps-printer-switch (nth 2 ps)
4976 pr-ps-printer (pr-dosify-path (nth 3 ps)))
4977 (or (stringp pr-ps-command)
4979 (cond (ps-windows-system "print")
4983 (or (stringp pr-ps-printer-switch)
4984 (setq pr-ps-printer-switch
4985 (cond (ps-windows-system "/D:")
4989 (pr-eval-alist (nthcdr 4 ps)))
4990 (pr-update-mode-line))
4993 (defun pr-txt-set-printer (value)
4994 (let ((txt (cdr (assq value pr-txt-printer-alist))))
4996 (error "Invalid text printer name `%s' for variable `pr-txt-name'."
4998 (setq pr-txt-name value
4999 pr-txt-command (pr-dosify-path (nth 0 txt))
5000 pr-txt-switches (nth 1 txt)
5001 pr-txt-printer (pr-dosify-path (nth 2 txt))))
5002 (or (stringp pr-txt-command)
5003 (setq pr-txt-command
5004 (cond (ps-windows-system "print")
5008 (pr-update-mode-line))
5011 (defun pr-eval-alist (alist)
5012 (mapcar #'(lambda (option)
5013 (let ((var-sym (car option))
5014 (value (cdr option)))
5015 (if (eq var-sym 'inherits-from:)
5016 (pr-eval-setting-alist value 'global)
5017 (set var-sym (eval value)))))
5021 (defun pr-eval-local-alist (alist)
5023 (mapcar #'(lambda (option)
5024 (let ((var-sym (car option))
5025 (value (cdr option)))
5027 (if (eq var-sym 'inherits-from:)
5028 (nconc (pr-eval-setting-alist value) local-list)
5029 (set (make-local-variable var-sym) (eval value))
5030 (cons var-sym local-list)))))
5035 (defun pr-eval-setting-alist (key &optional global old)
5036 (let ((setting (cdr (assq key pr-setting-database))))
5038 (let ((inherits (nth 0 setting))
5039 (local (nth 1 setting))
5040 (kill (nth 2 setting))
5045 (message "There are local buffer settings for `%S'." key)
5048 (if (memq inherits old)
5049 (error "Circular inheritance for `%S'." inherits)
5051 (pr-eval-setting-alist inherits global
5052 (cons inherits old)))))
5054 (cond ((not local) ; global settings
5056 (let ((var-sym (car option)))
5057 (or (eq var-sym 'inherits-from:)
5058 (set var-sym (eval (cdr option)))))))
5059 (kill ; local settings with killing
5061 (let ((var-sym (car option)))
5062 (unless (eq var-sym 'inherits-from:)
5063 (setq local-list (cons var-sym local-list))
5064 (set (make-local-variable var-sym)
5065 (eval (cdr option)))))))
5066 (t ; local settings without killing
5068 (let ((var-sym (car option)))
5069 (or (eq var-sym 'inherits-from:)
5070 (set (make-local-variable var-sym)
5071 (eval (cdr option))))))))
5076 (defun pr-kill-local-variable (local-var-list)
5077 (mapcar 'kill-local-variable local-var-list))
5080 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5081 ;; Internal Functions (II)
5084 (defun pr-prompt (str)
5085 (if (pr-auto-mode-p)
5086 (concat str " mode")
5087 (pr-region-active-string str)))
5090 (defun pr-prompt-region (str)
5091 (concat str (if (pr-auto-mode-p)
5096 (defun pr-prompt-gs (str)
5097 (if (pr-using-ghostscript-p)
5102 (defun pr-region-active-symbol (&optional region-p)
5103 (if (or region-p (pr-region-active-p))
5108 (defun pr-region-active-string (prefix)
5110 (if (pr-region-active-p)
5115 (defun pr-show-setup (settings buffer-name)
5116 (with-output-to-temp-buffer buffer-name
5118 (print-help-return-message)))
5121 (defun pr-complete-alist (prompt alist default)
5122 (let ((collection (mapcar #'(lambda (elt)
5123 (setq elt (car elt))
5124 (cons (symbol-name elt) elt))
5126 (cdr (assoc (completing-read (concat prompt ": ")
5128 (symbol-name default) nil
5129 (symbol-name default))
5133 (defun pr-delete-file (file)
5134 (and pr-delete-temp-file (delete-file file)))
5137 (defun pr-expand-file-name (filename)
5138 (pr-dosify-path (expand-file-name filename)))
5141 (defun pr-ps-outfile-preprint (&optional mess)
5142 (let* ((prompt (format "%soutput PostScript file name: " (or mess "")))
5143 (res (read-file-name prompt default-directory "" nil)))
5144 (while (cond ((not (file-writable-p res))
5146 (setq prompt "is unwritable"))
5147 ((file-directory-p res)
5149 (setq prompt "is a directory"))
5150 ((file-exists-p res)
5152 (setq prompt "exists")
5153 (not (y-or-n-p (format "File `%s' exists; overwrite? "
5156 (setq res (read-file-name
5157 (format "File %s; PostScript file: " prompt)
5158 (file-name-directory res) nil nil
5159 (file-name-nondirectory res))))
5160 (pr-expand-file-name res)))
5163 (defun pr-ps-infile-preprint (&optional mess)
5164 (let* ((prompt (format "%sinput PostScript file name: " (or mess "")))
5165 (res (read-file-name prompt default-directory "" nil)))
5166 (while (cond ((not (file-exists-p res))
5168 (setq prompt "doesn't exist"))
5169 ((not (file-readable-p res))
5171 (setq prompt "is unreadable"))
5172 ((file-directory-p res)
5174 (setq prompt "is a directory"))
5176 (setq res (read-file-name
5177 (format "File %s; PostScript file: " prompt)
5178 (file-name-directory res) nil nil
5179 (file-name-nondirectory res))))
5180 (pr-expand-file-name res)))
5183 (defun pr-toggle (var-sym mess entry index horizontal state &optional path)
5184 (set var-sym (not (symbol-value var-sym)))
5185 (message "%s is %s" mess (if (symbol-value var-sym) "on" "off"))
5186 (pr-menu-lock entry index horizontal state path))
5189 (defun pr-ps-utility-args (n-up-sym infile-sym outfile-sym prompt)
5191 (or (symbol-value n-up-sym)
5192 (set n-up-sym (pr-interactive-n-up prompt)))
5193 (and (eq (symbol-value infile-sym) t)
5194 (set infile-sym (and (not (interactive-p))
5195 (pr-ps-infile-preprint prompt))))
5197 (or (symbol-value infile-sym)
5198 (error "%s: input PostScript file name is missing" prompt))
5199 (set infile-sym (pr-dosify-path (symbol-value infile-sym)))
5201 (and (eq (symbol-value outfile-sym) t)
5202 (set outfile-sym (and (not (interactive-p))
5204 (pr-ps-outfile-preprint prompt))))
5205 (and (symbol-value outfile-sym)
5206 (set outfile-sym (pr-dosify-path (symbol-value outfile-sym))))
5207 (pr-ps-file (symbol-value outfile-sym)))
5210 (defun pr-ps-utility-process (n-up infile outfile)
5212 (and (stringp infile) (file-exists-p infile)
5213 (setq item (cdr (assq pr-ps-utility pr-ps-utility-alist)))
5215 (concat (pr-command (nth 0 item)) " "
5216 (pr-switches-string (nth 1 item)
5217 "pr-ps-utility-alist entry")
5219 (pr-switches-string (nth 8 item)
5220 "pr-ps-utility-alist entry")
5223 (format (nth 2 item) ps-paper-type))
5224 " " (format (nth 3 item) n-up) " "
5225 (and pr-file-landscape (nth 4 item)) " "
5226 (and pr-file-duplex (nth 5 item)) " "
5227 (and pr-file-tumble (nth 6 item))
5228 " \"" (pr-expand-file-name infile) "\" "
5230 " \"" (pr-expand-file-name outfile) "\"")))))
5233 (defun pr-shell-command (command)
5234 (let ((shell-file-name pr-shell-file-name))
5235 (shell-command command)))
5238 (defun pr-txt-print (from to)
5239 (let ((lpr-command (pr-command pr-txt-command))
5240 (lpr-switches (pr-switches pr-txt-switches "pr-txt-switches"))
5241 (printer-name pr-txt-printer))
5242 (lpr-region from to)))
5245 (defun pr-switches-string (switches mess)
5246 (mapconcat 'identity (pr-switches switches mess) " "))
5249 (defun pr-switches (switches mess)
5250 (or (listp switches)
5251 (error "%S should have a list of strings." mess))
5252 (ps-flatten-list ; dynamic evaluation
5253 (mapcar 'ps-eval-switch switches)))
5256 (defun pr-ps-preview (kind n-up filename mess)
5257 (pr-set-n-up-and-filename 'n-up 'filename mess)
5258 (let ((file (pr-ps-file filename)))
5259 (pr-text2ps kind n-up file)
5260 (or pr-spool-p (pr-ps-file-preview file))))
5263 (defun pr-ps-using-ghostscript (kind n-up filename mess)
5264 (pr-set-n-up-and-filename 'n-up 'filename mess)
5265 (let ((file (pr-ps-file filename)))
5266 (pr-text2ps kind n-up file)
5267 (unless (or pr-spool-p filename)
5268 (pr-ps-file-using-ghostscript file)
5269 (pr-delete-file file))))
5272 (defun pr-ps-print (kind n-up filename mess)
5273 (pr-set-n-up-and-filename 'n-up 'filename mess)
5274 (let ((file (pr-ps-file filename)))
5275 (pr-text2ps kind n-up file)
5276 (unless (or pr-spool-p filename)
5277 (pr-ps-file-print file)
5278 (pr-delete-file file))))
5281 (defun pr-ps-file (&optional filename)
5282 (pr-dosify-path (or filename
5283 (convert-standard-filename
5284 (expand-file-name pr-ps-temp-file pr-temp-dir)))))
5287 (defun pr-interactive-n-up (mess)
5288 (or (stringp mess) (setq mess "*"))
5290 (let* ((fmt-prompt "%s[%s] N-up printing: (default 1) ")
5292 (str (pr-f-read-string (format fmt-prompt prompt mess) "1" nil "1"))
5294 (while (if (string-match "^\\s *[0-9]+$" str)
5295 (setq int (string-to-int str)
5296 prompt (cond ((< int 1) "Integer below 1; ")
5297 ((> int 100) "Integer above 100; ")
5299 (setq prompt "Invalid integer syntax; "))
5302 (pr-f-read-string (format fmt-prompt prompt mess) str nil "1")))
5306 (defun pr-interactive-dir (mess)
5307 (let* ((dir-name (file-name-directory (or (buffer-file-name)
5308 default-directory)))
5309 (fmt-prompt (concat "%s[" mess "] Directory to print: "))
5310 (dir (read-file-name (format fmt-prompt "")
5311 "" dir-name nil dir-name))
5313 (while (cond ((not (file-directory-p dir))
5315 (setq prompt "It's not a directory! "))
5316 ((not (file-readable-p dir))
5318 (setq prompt "Directory is unreadable! "))
5320 (setq dir-name (file-name-directory dir)
5321 dir (read-file-name (format fmt-prompt prompt)
5322 "" dir-name nil dir-name)))
5323 (file-name-as-directory dir)))
5326 (defun pr-interactive-regexp (mess)
5327 (pr-f-read-string (format "[%s] File regexp to print: " mess) "" nil ""))
5330 (defun pr-interactive-dir-args (mess)
5332 ;; get directory argument
5333 (pr-interactive-dir mess)
5334 ;; get file name regexp
5335 (pr-interactive-regexp mess)))
5338 (defun pr-interactive-ps-dir-args (mess)
5340 ;; get n-up argument
5341 (pr-interactive-n-up mess)
5342 ;; get directory argument
5343 (pr-interactive-dir mess)
5344 ;; get file name regexp
5345 (pr-interactive-regexp mess)
5346 ;; get output file name
5347 (and (not pr-spool-p)
5348 (ps-print-preprint current-prefix-arg))))
5351 (defun pr-interactive-n-up-file (mess)
5353 ;; get n-up argument
5354 (pr-interactive-n-up mess)
5355 ;; get output file name
5356 (and (not pr-spool-p)
5357 (ps-print-preprint current-prefix-arg))))
5360 (defun pr-interactive-n-up-inout (mess)
5362 ;; get n-up argument
5363 (pr-interactive-n-up mess)
5364 ;; get input file name
5365 (pr-ps-infile-preprint (concat mess " "))
5366 ;; get output file name
5367 (ps-print-preprint current-prefix-arg)))
5370 (defun pr-set-outfilename (filename-sym)
5371 (and (not pr-spool-p)
5372 (eq (symbol-value filename-sym) t)
5373 (set filename-sym (and (not (interactive-p))
5375 (ps-print-preprint current-prefix-arg))))
5376 (and (symbol-value filename-sym)
5377 (set filename-sym (pr-dosify-path (symbol-value filename-sym)))))
5380 (defun pr-set-n-up-and-filename (n-up-sym filename-sym mess)
5382 (or (symbol-value n-up-sym)
5383 (set n-up-sym (pr-interactive-n-up mess)))
5385 (pr-set-outfilename filename-sym))
5388 (defun pr-set-dir-args (dir-sym regexp-sym mess)
5390 (or (symbol-value dir-sym)
5391 (set dir-sym (pr-interactive-dir mess)))
5393 (or (symbol-value regexp-sym)
5394 (set regexp-sym (pr-interactive-regexp mess))))
5397 (defun pr-set-ps-dir-args (n-up-sym dir-sym regexp-sym filename-sym mess)
5399 (or (symbol-value n-up-sym)
5400 (set n-up-sym (pr-interactive-n-up mess)))
5401 ;; directory & file name regexp
5402 (pr-set-dir-args dir-sym regexp-sym mess)
5404 (pr-set-outfilename filename-sym))
5407 (defun pr-find-buffer-visiting (file)
5408 (if (not (file-directory-p file))
5409 (find-buffer-visiting (if ps-windows-system
5412 (let ((truename (file-truename file))
5413 (blist (buffer-list))
5415 (while (and (not found) blist)
5417 (set-buffer (car blist))
5418 (and (eq major-mode 'dired-mode)
5420 (goto-char (point-min))
5421 (string= (buffer-substring-no-properties
5427 (setq found (car blist))))
5428 (setq blist (cdr blist)))
5432 (defun pr-file-list (dir file-regexp fun)
5433 (mapcar #'(lambda (file)
5434 (and (or pr-list-directory
5435 (not (file-directory-p file)))
5436 (let ((buffer (pr-find-buffer-visiting file))
5440 (file-readable-p file))
5442 (set-buffer (or buffer
5443 (find-file-noselect file)))
5446 (kill-buffer (current-buffer))))))))
5447 (directory-files dir t file-regexp)))
5450 (defun pr-delete-file-if-exists (filename)
5451 (and (not pr-spool-p) (stringp filename) (file-exists-p filename)
5452 (delete-file filename)))
5455 (defun pr-ps-file-list (n-up dir file-regexp filename)
5456 (pr-delete-file-if-exists (setq filename (pr-expand-file-name filename)))
5457 (let ((pr-spool-p t))
5458 (pr-file-list dir file-regexp
5460 (if (pr-auto-mode-p)
5461 (pr-ps-mode n-up filename)
5462 (pr-text2ps 'buffer n-up filename)))))
5464 (pr-despool-print filename)))
5467 (defun pr-text2ps (kind n-up filename &optional from to)
5468 (let ((ps-n-up-printing n-up)
5469 (ps-spool-config (and (eq ps-spool-config 'setpagedevice)
5471 (pr-delete-file-if-exists filename)
5474 ;; pr-faces-p and pr-spool-p
5475 ;; here FILENAME arg is ignored
5476 (cond ((eq kind 'buffer)
5477 (ps-spool-buffer-with-faces))
5479 (ps-spool-region-with-faces (or from (point))
5482 ;; pr-faces-p and not pr-spool-p
5484 (ps-print-buffer-with-faces filename))
5486 (ps-print-region-with-faces (or from (point))
5487 (or to (mark)) filename))
5490 ;; not pr-faces-p and pr-spool-p
5491 ;; here FILENAME arg is ignored
5492 (cond ((eq kind 'buffer)
5495 (ps-spool-region (or from (point)) (or to (mark))))
5497 ;; not pr-faces-p and not pr-spool-p
5499 (ps-print-buffer filename))
5501 (ps-print-region (or from (point)) (or to (mark)) filename))
5505 (defun pr-command (command)
5506 "Return absolute file name specification for COMMAND.
5508 If COMMAND is an empty string, return it.
5510 If COMMAND is already an absolute file name specification, return it.
5511 Else it uses `pr-path-alist' to find COMMAND, if find it then return it;
5512 otherwise, gives an error.
5514 When using `pr-path-alist' to find COMMAND, the entries `cygwin', `windows' and
5515 `unix' are used (see `pr-path-alist' for documentation).
5517 If Emacs is running on Windows 95/98/NT/2000, tries to find COMMAND,
5518 COMMAND.exe, COMMAND.bat and COMMAND.com in this order."
5519 (if (string= command "")
5522 (or (pr-find-command command)
5523 (pr-path-command (cond (pr-cygwin-system 'cygwin)
5524 (ps-windows-system 'windows)
5526 (file-name-nondirectory command)
5528 (error "Command not found: %s"
5529 (file-name-nondirectory command))))))
5532 (defun pr-path-command (symbol command sym-list)
5533 (let ((lpath (cdr (assq symbol pr-path-alist)))
5536 (and (eq symbol 'PATH) (null lpath)
5537 (setq lpath (parse-colon-path (getenv "PATH"))))
5541 (let ((path (car lpath)))
5545 (and (not (memq path sym-list))
5546 (pr-path-command path command
5547 (cons path sym-list))))
5552 (substitute-in-file-name
5553 (concat (file-name-as-directory path)
5556 (setq lpath (cdr lpath)))
5560 (defun pr-find-command (cmd)
5561 (if ps-windows-system
5563 (let ((ext (cons (file-name-extension cmd t)
5564 (list ".exe" ".bat" ".com")))
5566 (setq cmd (file-name-sans-extension cmd))
5568 (setq found (concat cmd (car ext)))
5569 (not (and (file-regular-p found)
5570 (file-executable-p found))))
5574 ;; non-windows systems
5575 (and (file-regular-p cmd)
5576 (file-executable-p cmd)
5580 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5581 ;; Printing Interface (inspired on ps-print-interface.el)
5589 (defvar pr-i-window-configuration nil)
5591 (defvar pr-i-buffer nil)
5592 (defvar pr-i-region nil)
5593 (defvar pr-i-mode nil)
5594 (defvar pr-i-despool nil)
5595 (defvar pr-i-ps-as-is t)
5596 (defvar pr-i-n-up 1)
5597 (defvar pr-i-directory "./")
5598 (defvar pr-i-regexp "")
5599 (defvar pr-i-ps-file "")
5600 (defvar pr-i-out-file "")
5601 (defvar pr-i-answer-yes nil)
5602 (defvar pr-i-process 'buffer)
5603 (defvar pr-i-ps-send 'printer)
5606 (defvar pr-interface-map nil
5607 "Keymap for pr-interface.")
5609 (if pr-interface-map
5611 (setq pr-interface-map (make-sparse-keymap))
5612 (cond ((eq ps-print-emacs-type 'xemacs) ; XEmacs
5613 (pr-f-set-keymap-parents pr-interface-map (list widget-keymap))
5614 (pr-f-set-keymap-name pr-interface-map 'pr-interface-map))
5615 ((eq ps-print-emacs-type 'emacs) ; GNU Emacs
5616 (pr-f-set-keymap-parents pr-interface-map widget-keymap)))
5617 (define-key pr-interface-map "q" 'pr-interface-quit)
5618 (define-key pr-interface-map "?" 'pr-interface-help))
5621 (defmacro pr-interface-save (&rest body)
5623 (set-buffer pr-i-buffer)
5627 (defun pr-create-interface ()
5628 "Create the front end for printing package."
5629 (setq pr-i-buffer (buffer-name (current-buffer))
5630 pr-i-region (ps-mark-active-p)
5631 pr-i-mode (pr-mode-alist-p)
5632 pr-i-window-configuration (current-window-configuration))
5634 (put 'pr-i-process 'pr-widget-list nil)
5635 (put 'pr-i-ps-send 'pr-widget-list nil)
5637 (delete-other-windows)
5638 (kill-buffer (get-buffer-create pr-buffer-name))
5639 (switch-to-buffer (get-buffer-create pr-buffer-name))
5642 (let ((versions (concat "printing v" pr-version
5643 " ps-print v" ps-print-version)))
5644 (widget-insert (make-string (- 79 (length versions)) ?\ ) versions))
5645 (pr-insert-italic "\nCurrent Directory : " 1)
5646 (pr-insert-italic default-directory)
5648 (pr-insert-section-1) ; 1. Print
5649 (pr-insert-section-2) ; 2. PostScript Printer
5650 (pr-insert-section-3) ; 3. Text Printer
5653 (widget-insert "\n\n " (make-string 77 ?-))
5655 (pr-insert-section-4) ; 4. Settings
5656 (pr-insert-section-5) ; 5. Customize
5657 (pr-insert-section-6) ; 6. Show Settings
5658 (pr-insert-section-7) ; 7. Help
5660 (use-local-map pr-interface-map)
5662 (goto-char (point-min))
5664 (and pr-i-region ; let region activated
5665 (pr-keep-region-active)))
5668 (defun pr-insert-section-1 ()
5670 (pr-insert-italic "\nPrint :" 1)
5673 ;; 1a. Buffer: Buffer List
5674 (pr-insert-radio-button 'pr-i-process 'buffer)
5675 (pr-insert-menu "Buffer List" 'pr-i-buffer
5676 (let ((blist (buffer-list))
5677 case-fold-search choices)
5679 (let ((name (buffer-name (car blist)))
5680 (ignore pr-buffer-name-ignore)
5682 (setq blist (cdr blist))
5683 (while (and ignore (not found))
5684 (setq found (string-match (car ignore) name)
5685 ignore (cdr ignore)))
5697 (setq pr-i-region (ps-mark-active-p)
5698 pr-i-mode (pr-mode-alist-p)))
5699 (pr-update-checkbox 'pr-i-region)
5700 (pr-update-checkbox 'pr-i-mode)))
5701 ;; 1a. Buffer: Region
5702 (put 'pr-i-region 'pr-widget
5706 #'(lambda (widget &rest ignore)
5707 (let ((region-p (pr-interface-save
5708 (ps-mark-active-p))))
5709 (cond ((null (widget-value widget)) ; widget is nil
5710 (setq pr-i-region nil))
5711 (region-p ; widget is true and there is a region
5712 (setq pr-i-region t)
5713 (widget-value-set widget t)
5714 (widget-setup)) ; MUST be called after widget-value-set
5715 (t ; widget is true and there is no region
5717 (message "There is no region active")
5718 (setq pr-i-region nil)
5719 (widget-value-set widget nil)
5720 (widget-setup))))) ; MUST be called after widget-value-set
5723 (put 'pr-i-mode 'pr-widget
5727 #'(lambda (widget &rest ignore)
5728 (let ((mode-p (pr-interface-save
5729 (pr-mode-alist-p))))
5731 ((null (widget-value widget)) ; widget is nil
5732 (setq pr-i-mode nil))
5733 (mode-p ; widget is true and there is a `mode'
5735 (widget-value-set widget t)
5736 (widget-setup)) ; MUST be called after widget-value-set
5737 (t ; widget is true and there is no `mode'
5740 "This buffer isn't in a mode that printing treats specially.")
5741 (setq pr-i-mode nil)
5742 (widget-value-set widget nil)
5743 (widget-setup))))) ; MUST be called after widget-value-set
5747 (pr-insert-radio-button 'pr-i-process 'directory)
5751 :format " Directory : %v"
5752 :notify 'pr-interface-directory
5753 :action (lambda (widget &optional event)
5754 (if (pr-interface-directory widget)
5755 (pr-widget-field-action widget event)
5757 (message "Please specify a readable directory")))
5759 ;; 1b. Directory: File Regexp
5760 (widget-create 'regexp
5762 :format "\n File Regexp : %v\n"
5763 :notify (lambda (widget &rest ignore)
5764 (setq pr-i-regexp (widget-value widget)))
5766 ;; 1b. Directory: List Directory Entry
5768 (pr-insert-toggle 'pr-list-directory " List Directory Entry\n")
5770 ;; 1c. PostScript File:
5771 (pr-insert-radio-button 'pr-i-process 'file)
5775 :format " PostScript File : %v"
5776 :notify 'pr-interface-infile
5777 :action (lambda (widget &rest event)
5778 (if (pr-interface-infile widget)
5779 (pr-widget-field-action widget event)
5781 (message "Please specify a readable PostScript file")))
5783 ;; 1c. PostScript File: PostScript Utility
5784 (pr-insert-menu "PostScript Utility" 'pr-ps-utility
5785 (pr-choice-alist pr-ps-utility-alist)
5786 "\n PostScript Utility : "
5788 ;; 1c. PostScript File: No Preprocessing
5789 (pr-insert-toggle 'pr-i-ps-as-is " No Preprocessing"))
5792 (defun pr-insert-section-2 ()
5793 ;; 2. PostScript Printer:
5794 ;; 2. PostScript Printer: PostScript Printer List
5795 (pr-insert-italic "\n\nPostScript Printer : " 2 20)
5796 (pr-insert-menu "PostScript Printer" 'pr-ps-name
5797 (pr-choice-alist pr-ps-printer-alist))
5798 ;; 2. PostScript Printer: Despool
5799 (put 'pr-i-despool 'pr-widget
5803 #'(lambda (widget &rest ignore)
5805 (setq pr-i-despool (not pr-i-despool))
5807 (message "Can despool only when spooling is actually selected")
5808 (setq pr-i-despool nil))
5809 (widget-value-set widget pr-i-despool)
5810 (widget-setup)) ; MUST be called after widget-value-set
5812 ;; 2. PostScript Printer: Preview Print Quit
5813 (pr-insert-button 'pr-interface-preview "Preview" " ")
5814 (pr-insert-button 'pr-interface-ps-print "Print" " ")
5815 (pr-insert-button 'pr-interface-quit "Quit")
5816 ;; 2. PostScript Printer: Send to Printer/Temporary File
5817 (pr-insert-radio-button 'pr-i-ps-send 'printer)
5818 (widget-insert " Send to Printer/Temporary File")
5819 ;; 2. PostScript Printer: Send to File
5820 (pr-insert-radio-button 'pr-i-ps-send 'file)
5824 :format " Send to File : %v"
5825 :notify 'pr-interface-outfile
5826 :action (lambda (widget &rest event)
5827 (if (and (pr-interface-outfile widget)
5828 (or (not (file-exists-p pr-i-out-file))
5829 (setq pr-i-answer-yes
5830 (y-or-n-p "File exists; overwrite? "))))
5831 (pr-widget-field-action widget event)
5833 (message "Please specify a writable PostScript file")))
5835 ;; 2. PostScript Printer: N-Up
5839 :format "\n N-Up : %v"
5840 :notify (lambda (widget &rest ignore)
5841 (let ((value (if (string= (widget-apply widget :value-get) "")
5843 (widget-value widget))))
5844 (if (and (integerp value)
5845 (<= 1 value) (<= value 100))
5848 (setq pr-i-n-up value))
5850 (message "Please specify an integer between 1 and 100"))))
5854 (defun pr-insert-section-3 ()
5856 (pr-insert-italic "\n\nText Printer : " 2 14)
5857 (pr-insert-menu "Text Printer" 'pr-txt-name
5858 (pr-choice-alist pr-txt-printer-alist)
5860 (pr-insert-button 'pr-interface-printify "Printify" " ")
5861 (pr-insert-button 'pr-interface-txt-print "Print" " ")
5862 (pr-insert-button 'pr-interface-quit "Quit"))
5865 (defun pr-insert-section-4 ()
5867 ;; 4. Settings: Landscape Auto Region Verbose
5868 (pr-insert-checkbox "\n\n " 'ps-landscape-mode
5869 #'(lambda (&rest ignore)
5870 (setq ps-landscape-mode (not ps-landscape-mode)
5871 pr-file-landscape ps-landscape-mode))
5873 (pr-insert-toggle 'pr-auto-region " Auto Region ")
5874 (pr-insert-toggle 'pr-buffer-verbose " Verbose\n ")
5876 ;; 4. Settings: Print Header Auto Mode
5877 (pr-insert-toggle 'ps-print-header " Print Header ")
5878 (pr-insert-toggle 'pr-auto-mode " Auto Mode\n ")
5880 ;; 4. Settings: Print Header Frame Menu Lock
5881 (pr-insert-toggle 'ps-print-header-frame " Print Header Frame ")
5882 (pr-insert-toggle 'pr-menu-lock " Menu Lock\n ")
5884 ;; 4. Settings: Line Number
5885 (pr-insert-toggle 'ps-line-number " Line Number\n ")
5887 ;; 4. Settings: Zebra Stripes Spool Buffer
5888 (pr-insert-toggle 'ps-zebra-stripes " Zebra Stripes")
5889 (pr-insert-checkbox " "
5891 #'(lambda (&rest ignore)
5892 (setq pr-spool-p (not pr-spool-p))
5894 (setq pr-i-despool nil)
5895 (pr-update-checkbox 'pr-i-despool)))
5898 ;; 4. Settings: Duplex Print with faces
5899 (pr-insert-checkbox "\n "
5901 #'(lambda (&rest ignore)
5902 (setq ps-spool-duplex (not ps-spool-duplex)
5903 pr-file-duplex ps-spool-duplex))
5905 (pr-insert-toggle 'pr-faces-p " Print with faces")
5907 ;; 4. Settings: Tumble Print via Ghostscript
5908 (pr-insert-checkbox "\n "
5910 #'(lambda (&rest ignore)
5911 (setq ps-spool-tumble (not ps-spool-tumble)
5912 pr-file-tumble ps-spool-tumble))
5914 (pr-insert-toggle 'pr-print-using-ghostscript " Print via Ghostscript\n ")
5916 ;; 4. Settings: Upside-Down Page Parity
5917 (pr-insert-toggle 'ps-print-upside-down " Upside-Down")
5918 (pr-insert-italic "\n\nSelect Pages : " 2 14)
5919 (pr-insert-menu "Page Parity" 'ps-even-or-odd-pages
5920 (mapcar #'(lambda (alist)
5925 :value (car alist))))
5926 pr-even-or-odd-alist)))
5929 (defun pr-insert-section-5 ()
5931 (pr-insert-italic "\n\nCustomize : " 2 11)
5932 (pr-insert-button 'pr-customize "printing" " ")
5933 (pr-insert-button #'(lambda (&rest ignore) (ps-print-customize))
5935 (pr-insert-button 'lpr-customize "lpr"))
5938 (defun pr-insert-section-6 ()
5939 ;; 6. Show Settings:
5940 (pr-insert-italic "\nShow Settings : " 1 14)
5941 (pr-insert-button 'pr-show-pr-setup "printing" " ")
5942 (pr-insert-button 'pr-show-ps-setup "ps-print" " ")
5943 (pr-insert-button 'pr-show-lpr-setup "lpr"))
5946 (defun pr-insert-section-7 ()
5948 (pr-insert-italic "\nHelp : " 1 5)
5949 (pr-insert-button 'pr-interface-help "Interface Help" " ")
5950 (pr-insert-button 'pr-help "Menu Help" " ")
5951 (pr-insert-button 'pr-interface-quit "Quit" "\n ")
5952 (pr-insert-button 'pr-kill-help "Kill All Printing Help Buffer"))
5955 (defun pr-kill-help (&rest ignore)
5956 "Kill all printing help buffer."
5958 (let ((help '("*Printing Interface Help*" "*Printing Help*"
5959 "*LPR Setup*" "*PR Setup*" "*PS Setup*")))
5961 (let ((buffer (get-buffer (car help))))
5962 (setq help (cdr help))
5964 (delete-windows-on buffer)
5965 (kill-buffer buffer)))))
5966 (recenter (- (window-height) 2)))
5969 (defun pr-interface-quit (&rest ignore)
5970 "Kill the printing buffer interface and quit."
5972 (kill-buffer pr-buffer-name)
5973 (set-window-configuration pr-i-window-configuration))
5976 (defun pr-interface-help (&rest ignore)
5977 "printing buffer interface help."
5979 (pr-show-setup pr-interface-help-message "*Printing Interface Help*"))
5982 (defun pr-interface-txt-print (&rest ignore)
5983 "Print using lpr package."
5985 (condition-case data
5987 ((eq pr-i-process 'directory)
5990 (pr-txt-directory pr-i-directory pr-i-regexp)))
5991 ((eq pr-i-process 'buffer)
5994 (let ((pr-auto-mode pr-i-mode))
5997 (let (pr-auto-region)
6000 (let (pr-auto-mode pr-auto-region)
6003 ((eq pr-i-process 'file)
6004 (error "Please specify a text file"))
6006 (error "Internal error: `pr-i-process' = %S" pr-i-process))
6011 (message (error-message-string data)))))
6014 (defun pr-interface-printify (&rest ignore)
6015 "Printify a buffer."
6017 (condition-case data
6019 ((eq pr-i-process 'directory)
6022 (pr-printify-directory pr-i-directory pr-i-regexp)))
6023 ((eq pr-i-process 'buffer)
6026 (pr-printify-region)
6027 (pr-printify-buffer))))
6028 ((eq pr-i-process 'file)
6029 (error "Cannot printify a PostScript file"))
6031 (error "Internal error: `pr-i-process' = %S" pr-i-process))
6036 (message (error-message-string data)))))
6039 (defun pr-interface-ps-print (&rest ignore)
6040 "Print using ps-print package."
6042 (pr-interface-ps 'pr-despool-ps-print 'pr-ps-directory-ps-print
6043 'pr-ps-file-ps-print 'pr-ps-file-up-ps-print
6044 'pr-ps-region-ps-print 'pr-ps-mode-ps-print
6045 'pr-ps-buffer-ps-print))
6048 (defun pr-interface-preview (&rest ignore)
6049 "Preview a PostScript file."
6051 (pr-interface-ps 'pr-despool-preview 'pr-ps-directory-preview
6052 'pr-ps-file-preview 'pr-ps-file-up-preview
6053 'pr-ps-region-preview 'pr-ps-mode-preview
6054 'pr-ps-buffer-preview))
6057 (defun pr-interface-ps (ps-despool ps-directory ps-file ps-file-up ps-region
6059 (condition-case data
6060 (let ((outfile (or (and (eq pr-i-process 'file) pr-i-ps-as-is)
6063 ((and pr-i-despool pr-spool-p)
6065 (funcall ps-despool outfile))
6066 (setq pr-i-despool nil)
6067 (pr-update-checkbox 'pr-i-despool))
6068 ((eq pr-i-process 'directory)
6071 (funcall ps-directory
6072 pr-i-n-up pr-i-directory pr-i-regexp outfile)))
6073 ((eq pr-i-process 'file)
6074 (cond ((or (file-directory-p pr-i-ps-file)
6075 (not (file-readable-p pr-i-ps-file)))
6076 (error "Please specify a readable PostScript file"))
6079 (funcall ps-file pr-i-ps-file)))
6082 (funcall ps-file-up pr-i-n-up pr-i-ps-file outfile)))
6084 ((eq pr-i-process 'buffer)
6087 (let ((pr-auto-mode pr-i-mode))
6088 (funcall ps-region pr-i-n-up outfile)))
6090 (let (pr-auto-region)
6091 (funcall ps-mode pr-i-n-up outfile)))
6093 (let (pr-auto-mode pr-auto-region)
6094 (funcall ps-buffer pr-i-n-up outfile)))
6097 (error "Internal error: `pr-i-process' = %S" pr-i-process))
6102 (message (error-message-string data)))))
6105 (defun pr-i-ps-send ()
6106 (cond ((eq pr-i-ps-send 'printer)
6108 ((not (eq pr-i-ps-send 'file))
6109 (error "Internal error: `pr-i-ps-send' = %S" pr-i-ps-send))
6110 ((or (file-directory-p pr-i-out-file)
6111 (not (file-writable-p pr-i-out-file)))
6112 (error "Please specify a writable PostScript file"))
6113 ((or (not (file-exists-p pr-i-out-file))
6115 (setq pr-i-answer-yes
6116 (y-or-n-p (format "File `%s' exists; overwrite? "
6120 (error "File already exists"))))
6123 (defun pr-i-directory ()
6124 (or (and (file-directory-p pr-i-directory)
6125 (file-readable-p pr-i-directory))
6126 (error "Please specify be a readable directory")))
6129 (defun pr-interface-directory (widget &rest ignore)
6130 (and pr-buffer-verbose
6131 (message "You can use M-TAB or ESC TAB for file completion"))
6132 (let ((dir (widget-value widget)))
6133 (and (file-directory-p dir)
6134 (file-readable-p dir)
6135 (setq pr-i-directory dir))))
6138 (defun pr-interface-infile (widget &rest ignore)
6139 (and pr-buffer-verbose
6140 (message "You can use M-TAB or ESC TAB for file completion"))
6141 (let ((file (widget-value widget)))
6142 (and (not (file-directory-p file))
6143 (file-readable-p file)
6144 (setq pr-i-ps-file file))))
6147 (defun pr-interface-outfile (widget &rest ignore)
6148 (setq pr-i-answer-yes nil)
6149 (and pr-buffer-verbose
6150 (message "You can use M-TAB or ESC TAB for file completion"))
6151 (let ((file (widget-value widget)))
6152 (and (not (file-directory-p file))
6153 (file-writable-p file)
6154 (setq pr-i-out-file file))))
6157 (defun pr-widget-field-action (widget event)
6158 (and (get-buffer "*Completions*") ; clean frame window
6159 (delete-windows-on "*Completions*"))
6160 (message " ") ; clean echo area
6161 (widget-field-action widget event))
6164 (defun pr-insert-italic (str &optional from to)
6165 (let ((len (length str)))
6166 (put-text-property (if from (max from 0) 0)
6167 (if to (max to len) len)
6169 (widget-insert str)))
6172 (defun pr-insert-checkbox (before var-sym fun label)
6173 (widget-insert before)
6175 (widget-create 'checkbox
6177 (symbol-value var-sym))
6178 (widget-insert label)))
6181 (defun pr-insert-toggle (var-sym label)
6182 (widget-create 'checkbox
6183 :notify `(lambda (&rest ignore)
6184 (setq ,var-sym (not ,var-sym)))
6185 (symbol-value var-sym))
6186 (widget-insert label))
6189 (defun pr-insert-button (fun label &optional separator)
6190 (widget-create 'push-button
6194 (widget-insert separator)))
6197 (defun pr-insert-menu (tag var-sym choices &optional before after &rest body)
6198 (and before (widget-insert before))
6199 (eval `(widget-create 'menu-choice
6204 :notify (lambda (widget &rest ignore)
6205 (setq ,var-sym (widget-value widget))
6207 :void '(choice-item :format "%[%t%]"
6208 :tag "Can not display value!")
6210 (and after (widget-insert after)))
6213 (defun pr-insert-radio-button (var-sym sym)
6214 (widget-insert "\n")
6215 (let ((wid-list (get var-sym 'pr-widget-list))
6216 (wid (eval `(widget-create
6219 :value (eq ,var-sym (quote ,sym))
6220 :notify (lambda (&rest ignore)
6221 (setq ,var-sym (quote ,sym))
6222 (pr-update-radio-button (quote ,var-sym)))))))
6223 (put var-sym 'pr-widget-list (cons (cons wid sym) wid-list))))
6226 (defun pr-update-radio-button (var-sym)
6227 (let ((wid-list (get var-sym 'pr-widget-list)))
6229 (let ((wid (car (car wid-list)))
6230 (value (cdr (car wid-list))))
6231 (setq wid-list (cdr wid-list))
6232 (widget-value-set wid (eq (symbol-value var-sym) value))))
6236 (defun pr-update-checkbox (var-sym)
6237 (let ((wid (get var-sym 'pr-widget)))
6239 (widget-value-set wid (symbol-value var-sym))
6243 (defun pr-choice-alist (alist)
6244 (let ((max (apply 'max (mapcar #'(lambda (alist)
6245 (length (symbol-name (car alist))))
6247 (mapcar #'(lambda (alist)
6248 (let* ((sym (car alist))
6249 (name (symbol-name sym)))
6256 (make-string (- max (length name)) ?_))
6261 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6270 ;;; arch-tag: 9ce9ac3f-0f60-4370-900b-1943215d9d18
6271 ;;; printing.el ends here