* window.c (shrink_windows): Handle special case of one window left
[bpt/emacs.git] / lisp / printing.el
CommitLineData
2c840b90
KS
1;;; printing.el --- printing utilities
2
449cba44 3;; Copyright (C) 2000, 2001, 2002, 2003, 2004
2c840b90
KS
4;; Free Software Foundation, Inc.
5
45f17557
VJL
6;; Author: Vinicius Jose Latorre <viniciusjl@ig.com.br>
7;; Maintainer: Vinicius Jose Latorre <viniciusjl@ig.com.br>
6367b616 8;; Time-stamp: <2004/11/13 21:36:38 vinicius>
2c840b90 9;; Keywords: wp, print, PostScript
6367b616 10;; Version: 6.8.3
2c840b90
KS
11;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/
12
6367b616
VJL
13(defconst pr-version "6.8.3"
14 "printing.el, v 6.8.3 <2004/11/13 vinicius>
2c840b90
KS
15
16Please send all bug fixes and enhancements to
45f17557 17 Vinicius Jose Latorre <viniciusjl@ig.com.br>
2c840b90
KS
18")
19
20;; This file is part of GNU Emacs.
21
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
25;; version.
26
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
30;; details.
31
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.
35
36;;; Commentary:
37
38;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39;;
40;; Introduction
41;; ------------
42;;
553d3334
VJL
43;; With `printing' you can preview or print a PostScript file. You can also
44;; print a text file using PostScript, and preview or print buffers that use
45;; certain special modes like mh-folder-mode, rmail-summary-mode,
46;; gnus-summary-mode, etc. This package also includes a PostScript/text
47;; printer database.
45f17557 48;;
553d3334 49;; There are two user interfaces:
45f17557 50;;
0117451d 51;; * Menu interface:
553d3334 52;; The `printing' menu replaces the usual print options in the menu bar.
45f17557
VJL
53;; This is the default user interface.
54;;
0117451d 55;; * Buffer interface:
553d3334
VJL
56;; You can use a buffer interface instead of menus. It looks like a
57;; customization buffer. Basically, it has the same options found in the
58;; menu and some extra options, all this on a buffer.
2c840b90
KS
59;;
60;; `printing' is prepared to run on GNU, Unix and NT systems.
61;; On GNU or Unix system, `printing' depends on gs and gv utilities.
62;; On NT system, `printing' depends on gstools (gswin32.exe and gsview32.exe).
63;; To obtain ghostscript, ghostview and GSview see the URL
64;; `http://www.gnu.org/software/ghostscript/ghostscript.html'.
65;;
0117451d
VJL
66;; `printing' depends on ps-print package to generate PostScript files, to
67;; spool and to despool PostScript buffer. So, `printing' provides an
68;; interface to ps-print package and it also provides some extra stuff.
69;;
2c840b90
KS
70;; To download the latest ps-print package see
71;; `http://www.cpqd.com.br/~vinicius/emacs/ps-print.tar.gz'.
72;; Please, see README file for ps-print installation instructions.
73;;
553d3334
VJL
74;; `printing' was inspired on:
75;;
76;; print-nt.el Frederic Corne <frederic.corne@erli.fr>
77;; Special printing functions for Windows NT
78;;
79;; mh-e-init.el Tom Vogels <tov@ece.cmu.edu>
80;; PS-print for mail messages
81;;
82;; win32-ps-print.el Matthew O. Persico <mpersico@erols.com>
83;; PostScript printing with ghostscript
84;;
85;; ps-print-interface.el Volker Franz <volker.franz@tuebingen.mpg.de>
86;; Graphical front end for ps-print and previewing
87;;
2c840b90 88;;
0117451d
VJL
89;; Log Messages
90;; ------------
91;;
92;; The buffer *Printing Command Output* is where the `printing' log messages
93;; are inserted. All program called by `printing' has a log entry in the
94;; buffer *Printing Command Output*. A log entry has the following form:
95;;
96;; PROGRAM (ARG...)
97;; MESSAGE
98;; Exit status: CODE
99;;
100;; Where
101;; PROGRAM is the program activated by `printing',
102;; ARG is an argument passed to PROGRAM (it can have more than one argument),
103;; MESSAGE is an error message returned by PROGRAM (it can have no message, if
104;; PROGRAM is successful),
105;; and CODE is a numeric exit status or a signal description string.
106;;
107;; For example, after previewing a PostScript file, *Printing Command Output*
108;; will have the following entry:
109;;
110;; /usr/X11R6/bin/gv ("/home/user/example/file.ps")
111;; Exit status: 0
112;;
113;; In the example above, the previewing was successful. If during previewing,
114;; you quit gv execution (by typing C-g during Emacs session), the log entry
115;; would be:
116;;
117;; /usr/X11R6/bin/gv ("/home/user/example/file.ps")
118;; Exit status: Quit
119;;
120;; So, if something goes wrong, a good place to take a look is the buffer
121;; *Printing Command Output*. Don't forget to see also the buffer *Messages*,
122;; it can help.
123;;
124;;
2c840b90
KS
125;; Novices (First Users)
126;; ---------------------
127;;
b1f6fa86
VJL
128;; First of all, see printing documentation only to get an idea of what
129;; `printing' is capable.
2c840b90
KS
130;;
131;; Then try to set the variables: `pr-ps-name', `pr-ps-printer-alist',
132;; `pr-txt-name', `pr-txt-printer-alist' and `pr-path-alist'. These variables
133;; are the main variables for printing processing.
134;;
b1f6fa86
VJL
135;; Now, please, see these variables documentation deeper. You can do this by
136;; typing C-h v pr-ps-name RET (for example) if you already loaded printing
137;; package, or by browsing printing.el source file.
2c840b90
KS
138;;
139;; If the documentation isn't clear or if you find a way to improve the
140;; documentation, please, send an email to maintainer. All printing users
141;; will thank you.
142;;
143;; One way to set variables is by calling `pr-customize', customize all
144;; variables and save the customization by future sessions (see Options
145;; section). Other way is by coding your settings on Emacs init file (that is,
146;; .emacs file), see below for a first setting template that it should be
147;; inserted on your ~/.emacs file (or c:/_emacs, if you're using Windows 9x/NT
148;; or MS-DOS):
149;;
150;; * Example of setting for Windows system:
151;;
152;; (require 'printing) ; load printing package
153;; (setq pr-path-alist
154;; '((windows "c:/applications/executables" PATH ghostview mpage)
155;; (ghostview "c:/gs/gsview-dir")
156;; (mpage "c:/mpage-dir")
157;; ))
158;; (setq pr-txt-name 'prt_06a)
159;; (setq pr-txt-printer-alist
160;; '((prt_06a "print" nil "/D:\\\\printers\\prt_06a")
161;; (prt_07c nil nil "/D:\\\\printers\\prt_07c")
162;; (PRN "" nil "PRN")
163;; (standard "redpr.exe" nil "")
164;; ))
165;; (setq pr-ps-name 'lps_06b)
166;; (setq pr-ps-printer-alist
167;; '((lps_06a "print" nil "/D:" "\\\\printers\\lps_06a")
168;; (lps_06b "print" nil nil "\\\\printers\\lps_06b")
169;; (lps_07c "print" nil "" "/D:\\\\printers\\lps_07c")
170;; (lps_08c nil nil nil "\\\\printers\\lps_08c")
171;; (LPT1 "" nil "" "LPT1:")
172;; (PRN "" nil "" "PRN")
173;; (standard "redpr.exe" nil "" "")
174;; ))
175;; (pr-update-menus t) ; update now printer and utility menus
176;;
177;; * Example of setting for GNU or Unix system:
178;;
179;; (require 'printing) ; load printing package
180;; (setq pr-path-alist
181;; '((unix "." "~/bin" ghostview mpage PATH)
182;; (ghostview "$HOME/bin/gsview-dir")
183;; (mpage "$HOME/bin/mpage-dir")
184;; ))
185;; (setq pr-txt-name 'prt_06a)
186;; (setq pr-txt-printer-alist
187;; '((prt_06a "lpr" nil "prt_06a")
188;; (prt_07c nil nil "prt_07c")
189;; ))
190;; (setq pr-ps-name 'lps_06b)
191;; (setq pr-ps-printer-alist
192;; '((lps_06b "lpr" nil "-P" "lps_06b")
193;; (lps_07c "lpr" nil nil "lps_07c")
194;; (lps_08c nil nil nil "lps_08c")
195;; ))
196;; (pr-update-menus t) ; update now printer and utility menus
197;;
198;;
199;; NOTE 1: Don't forget to download and install ghostscript utilities (see
200;; Utilities section).
201;;
202;; NOTE 2: The `printer-name' and `ps-printer-name' variables don't need to be
203;; set, as they are implicit set by `pr-ps-printer-alist' and
204;; `pr-txt-printer-alist'.
205;;
206;; NOTE 3: The duplex feature will only work on PostScript printers that
207;; support this feature.
208;; You can check if your PostScript printer supports duplex feature
209;; by checking the printer manual. Or you can try these steps:
210;; 1. Open a buffer (or use the *scratch* buffer).
211;; 2. Type:
212;; First line (on first page)
213;; ^L
214;; Second line (on second page)
215;; 3. Print this buffer with duplex turned on.
216;; If it's printed 2 (two) sheets of paper, then your PostScript
217;; printer doesn't have duplex feature; otherwise, it's ok, your
218;; printer does have duplex feature.
219;;
739ce395
VJL
220;; NOTE 4: See Tips section.
221;;
222;;
223;; Tips
224;; ----
225;;
45f17557 226;; 1. If you have a local printer, that is, a printer which is connected
739ce395
VJL
227;; directly to your computer, don't forget to connect the printer to your
228;; computer before printing.
229;;
1f5a8e4a
VJL
230;; 2. If you try to print a file and it seems that the file was printed, but
231;; there is no paper in the printer, then try to set `pr-delete-temp-file'
232;; to nil. Probably `printing' is deleting the temporary file before your
233;; local system can get it to send to the printer.
234;;
235;; 3. Don't try to print a dynamic buffer, that is, a buffer which is
236;; modifying while `printing' tries to print. Eventually you got an error
237;; message. Instead, save the dynamic buffer to a file or copy it in
238;; another buffer and, then, print the file or the new static buffer.
239;; An example of dynamic buffer is the *Messages* buffer.
240;;
45f17557
VJL
241;; 4. When running Emacs on Windows (with or without cygwin), check if your
242;; printer is a text printer or not by typing in a DOS window:
243;;
244;; print /D:\\host\printer somefile.txt
245;;
0117451d 246;; Where, `host' is the machine where the printer is directly connected,
45f17557 247;; `printer' is the printer name and `somefile.txt' is a text file.
f88aa6e5 248;;
45f17557
VJL
249;; If the printer `\\host\printer' doesn't print the content of
250;; `somefile.txt' or, instead, it returns the following message:
f88aa6e5 251;;
45f17557
VJL
252;; PostScript Error Handler
253;; Offending Command = CCC
254;; Stack =
255;;
256;; Where `CCC' is whatever is at the beginning of the text to be printed.
257;;
258;; Therefore, the printer `\\host\printer' is not a text printer, but a
259;; PostScript printer. So, please, don't include this printer in
260;; `pr-txt-printer-alist' (which see).
38253bba 261;;
082b4369
VJL
262;; 5. Use gsprint instead of ghostscript to print monochrome PostScript files
263;; in Windows. The gsprint utility is faster than ghostscript to print
264;; monochrome PostScript.
265;;
b1f6fa86
VJL
266;; To print non-monochrome PostScript file, the efficiency of ghostscript
267;; is similar to gsprint.
082b4369
VJL
268;;
269;; Also the gsprint utility comes together with gsview distribution.
270;;
271;; For more information about gsprint see
272;; `http://www.cs.wisc.edu/~ghost/gsview/gsprint.htm'.
273;;
2c840b90
KS
274;;
275;; Using `printing'
276;; ----------------
277;;
278;; To use `printing' insert in your ~/.emacs file (or c:/_emacs, if you're
279;; using Windows 9x/NT or MS-DOS):
280;;
281;; (require 'printing)
282;;
283;; When `printing' is loaded:
284;; * On Emacs 20:
285;; it replaces the Tools/Print menu by Tools/Printing menu.
286;; * On Emacs 21:
287;; it replaces the File/Print* menu entries by File/Print menu.
288;; Please, see section Menu Layout below for menu explanation.
289;;
290;; To use `printing' utilities you can use the Printing menu options, type M-x
291;; followed by one of the commands below, or type a key associated with the
292;; command you want (if there is a key binding).
293;;
294;; `printing' has the following commands:
295;;
296;; pr-interface
297;; pr-ps-directory-preview
298;; pr-ps-directory-using-ghostscript
299;; pr-ps-directory-print
300;; pr-ps-directory-ps-print
301;; pr-ps-buffer-preview
302;; pr-ps-buffer-using-ghostscript
303;; pr-ps-buffer-print
304;; pr-ps-buffer-ps-print
305;; pr-ps-region-preview
306;; pr-ps-region-using-ghostscript
307;; pr-ps-region-print
308;; pr-ps-region-ps-print
309;; pr-ps-mode-preview
310;; pr-ps-mode-using-ghostscript
311;; pr-ps-mode-print
312;; pr-ps-mode-ps-print
313;; pr-ps-file-preview
314;; pr-ps-file-up-preview
315;; pr-ps-file-using-ghostscript
316;; pr-ps-file-print
317;; pr-ps-file-ps-print
318;; pr-ps-file-up-ps-print
319;; pr-ps-fast-fire
320;; pr-despool-preview
321;; pr-despool-using-ghostscript
322;; pr-despool-print
323;; pr-despool-ps-print
324;; pr-printify-directory
325;; pr-printify-buffer
326;; pr-printify-region
327;; pr-txt-directory
328;; pr-txt-buffer
329;; pr-txt-region
330;; pr-txt-mode
331;; pr-txt-fast-fire
332;; pr-toggle-file-duplex
333;; pr-toggle-file-tumble
334;; pr-toggle-file-landscape
335;; pr-toggle-ghostscript
336;; pr-toggle-faces
337;; pr-toggle-spool
338;; pr-toggle-duplex
339;; pr-toggle-tumble
340;; pr-toggle-landscape
341;; pr-toggle-upside-down
342;; pr-toggle-line
343;; pr-toggle-zebra
344;; pr-toggle-header
345;; pr-toggle-lock
346;; pr-toggle-region
347;; pr-toggle-mode
348;; pr-customize
349;; lpr-customize
350;; pr-help
351;; pr-ps-name
352;; pr-txt-name
353;; pr-ps-utility
354;; pr-show-ps-setup
355;; pr-show-pr-setup
356;; pr-show-lpr-setup
357;;
358;; The general meanings of above commands are:
359;;
360;; PREFIX:
361;; `pr-interface' buffer interface for printing package.
362;; `pr-help' help for printing package.
449cba44
VJL
363;; `pr-ps-name' interactively select a PostScript printer.
364;; `pr-txt-name' interactively select a text printer.
365;; `pr-ps-utility' interactively select a PostScript utility.
2c840b90
KS
366;; `pr-show-*-setup' show current settings.
367;; `pr-ps-*' deal with PostScript code generation.
368;; `pr-txt-*' deal with text generation.
369;; `pr-toggle-*' toggle on/off some boolean variable.
370;; `pr-despool-*' despool the PostScript spooling buffer.
371;; `pr-printify-*' replace nonprintable ASCII by printable ASCII
372;; representation.
373;;
374;; SUFFIX:
375;; `*-customize' customization.
376;; `*-preview' preview a PostScript file.
377;; `*-using-ghostscript' use ghostscript to print.
378;; `*-fast-fire' fast fire command (see it for documentation).
379;; `*-print' send PostScript directly to printer.
380;; `*-ps-print' send PostScript directly to printer or use
381;; ghostscript to print. It depends on
382;; `pr-print-using-ghostscript' option.
383;;
384;; INFIX/SUFFIX:
385;; `*-directory*' process a directory.
386;; `*-buffer*' process a buffer.
387;; `*-region*' process a region.
388;; `*-mode*' process a major mode (see explanation below).
389;; `*-file-*' process a PostScript file.
390;; `*-file-up-*' process a PostScript file using a filter utility.
391;;
392;; Here are some examples:
393;;
394;; `pr-ps-buffer-using-ghostscript'
395;; Use ghostscript to print a buffer.
396;;
397;; `pr-ps-file-print'
398;; Print a PostScript file.
399;;
400;; `pr-toggle-spool'
401;; Toggle spooling buffer.
402;;
403;; So you can preview through ghostview, use ghostscript to print (if you don't
404;; have a PostScript printer) or send directly to printer a PostScript code
405;; generated by `ps-print' package.
406;;
407;; Besides operating one buffer or region each time, you also can postpone
408;; previewing or printing by saving the PostScript code generated in a
409;; temporary Emacs buffer. This way you can save banner pages between
410;; successive printing. You can toggle on/off spooling by invoking
411;; `pr-toggle-spool' interactively or through menu bar.
412;;
413;; If you type, for example:
414;;
415;; C-u M-x pr-ps-buffer-print RET
416;;
417;; The `pr-ps-buffer-print' command prompts you for a n-up printing number and
418;; a file name, and save the PostScript code generated to the file name instead
419;; of sending to printer.
420;;
421;; This behavior is similar with the commands that deal with PostScript code
422;; generation, that is, with `pr-ps-*' and `pr-despool-*' commands. If
423;; spooling is on, only `pr-despool-*' commands prompt for a file name and save
424;; the PostScript code spooled in this file.
425;;
426;; Besides the behavior described above, the `*-directory*' commands also
427;; prompt for a directory and a file name regexp. So, it's possible to process
428;; all or certain files on a directory at once (see also documentation for
429;; `pr-list-directory').
430;;
431;; `printing' has also a special way to handle some major mode through
432;; `*-mode*' commands. So it's possible to customize a major mode printing,
433;; it's only needed to declare the customization in `pr-mode-alist' (see
434;; section Options) and invoke some of `*-mode*' commands. An example for
435;; major mode usage is when you're using gnus (or mh, or rmail, etc.) and
436;; you're in the *Summary* buffer, if you forget to switch to the *Article*
437;; buffer before printing, you'll get a nicely formatted list of article
438;; subjects shows up at the printer. With major mode printing you don't need
439;; to switch from gnus *Summary* buffer first.
440;;
441;; Current global keyboard mapping for GNU Emacs is:
442;;
6367b616
VJL
443;; (global-set-key [print] 'pr-ps-fast-fire)
444;; (global-set-key [M-print] 'pr-ps-mode-using-ghostscript)
445;; (global-set-key [S-print] 'pr-ps-mode-using-ghostscript)
446;; (global-set-key [C-print] 'pr-txt-fast-fire)
447;; (global-set-key [C-M-print] 'pr-txt-fast-fire)
2c840b90
KS
448;;
449;; And for XEmacs is:
450;;
6367b616
VJL
451;; (global-set-key 'f22 'pr-ps-fast-fire)
452;; (global-set-key '(meta f22) 'pr-ps-mode-using-ghostscript)
453;; (global-set-key '(shift f22) 'pr-ps-mode-using-ghostscript)
454;; (global-set-key '(control f22) 'pr-txt-fast-fire)
455;; (global-set-key '(control meta f22) 'pr-txt-fast-fire)
2c840b90
KS
456;;
457;; As a suggestion of global keyboard mapping for some `printing' commands:
458;;
459;; (global-set-key "\C-ci" 'pr-interface)
460;; (global-set-key "\C-cbp" 'pr-ps-buffer-print)
461;; (global-set-key "\C-cbx" 'pr-ps-buffer-preview)
462;; (global-set-key "\C-cbb" 'pr-ps-buffer-using-ghostscript)
463;; (global-set-key "\C-crp" 'pr-ps-region-print)
464;; (global-set-key "\C-crx" 'pr-ps-region-preview)
465;; (global-set-key "\C-crr" 'pr-ps-region-using-ghostscript)
466;;
467;;
468;; Options
469;; -------
470;;
471;; Below it's shown a brief description of `printing' options, please, see the
472;; options declaration in the code for a long documentation.
473;;
474;; `pr-path-style' Specify which path style to use for external
475;; commands.
476;;
477;; `pr-path-alist' Specify an alist for command paths.
478;;
479;; `pr-txt-name' Specify a printer for printing a text file.
480;;
481;; `pr-txt-printer-alist' Specify an alist of all text printers.
482;;
483;; `pr-ps-name' Specify a printer for printing a PostScript
484;; file.
485;;
486;; `pr-ps-printer-alist' Specify an alist for all PostScript printers.
487;;
488;; `pr-temp-dir' Specify a directory for temporary files during
489;; printing.
490;;
491;; `pr-ps-temp-file' Specify PostScript temporary file name.
492;;
6367b616
VJL
493;; `pr-file-modes' Specify the file permission bits for newly
494;; created files.
495;;
449cba44
VJL
496;; `pr-gv-command' Specify path and name of the gsview/gv
497;; utility.
2c840b90 498;;
449cba44
VJL
499;; `pr-gs-command' Specify path and name of the ghostscript
500;; utility.
2c840b90
KS
501;;
502;; `pr-gs-switches' Specify ghostscript switches.
503;;
504;; `pr-gs-device' Specify ghostscript device switch value.
505;;
506;; `pr-gs-resolution' Specify ghostscript resolution switch value.
507;;
508;; `pr-print-using-ghostscript' Non-nil means print using ghostscript.
509;;
510;; `pr-faces-p' Non-nil means print with face attributes.
511;;
512;; `pr-spool-p' Non-nil means spool printing in a buffer.
513;;
514;; `pr-file-landscape' Non-nil means print PostScript file in
515;; landscape orientation.
516;;
517;; `pr-file-duplex' Non-nil means print PostScript file in duplex
518;; mode.
519;;
520;; `pr-file-tumble' Non-nil means print PostScript file in tumble
521;; mode.
522;;
523;; `pr-auto-region' Non-nil means region is automagically detected.
524;;
449cba44
VJL
525;; `pr-auto-mode' Non-nil means major-mode specific printing is
526;; prefered over normal printing.
2c840b90
KS
527;;
528;; `pr-mode-alist' Specify an alist for a major-mode and printing
529;; function.
530;;
531;; `pr-ps-utility' Specify PostScript utility processing.
532;;
533;; `pr-ps-utility-alist' Specify an alist for PostScript utility
534;; processing.
535;;
536;; `pr-menu-lock' Non-nil means menu is locked while selecting
537;; toggle options.
538;;
539;; `pr-menu-char-height' Specify menu char height in pixels.
540;;
541;; `pr-menu-char-width' Specify menu char width in pixels.
542;;
543;; `pr-setting-database' Specify an alist for settings in general.
544;;
545;; `pr-visible-entry-list' Specify a list of Printing menu visible
546;; entries.
547;;
548;; `pr-delete-temp-file' Non-nil means delete temporary files.
549;;
550;; `pr-list-directory' Non-nil means list directory when processing a
551;; directory.
552;;
553;; `pr-buffer-name' Specify the name of the buffer interface for
554;; printing package.
555;;
556;; `pr-buffer-name-ignore' Specify a regexp list for buffer names to be
557;; ignored in interface buffer.
558;;
559;; `pr-buffer-verbose' Non-nil means to be verbose when editing a
560;; field in interface buffer.
561;;
2c840b90
KS
562;; To set the above options you may:
563;;
564;; a) insert the code in your ~/.emacs, like:
565;;
566;; (setq pr-faces-p t)
567;;
568;; This way always keep your default settings when you enter a new Emacs
569;; session.
570;;
571;; b) or use `set-variable' in your Emacs session, like:
572;;
573;; M-x set-variable RET pr-faces-p RET t RET
574;;
575;; This way keep your settings only during the current Emacs session.
576;;
577;; c) or use customization, for example:
578;; click on menu-bar *Help* option,
579;; then click on *Customize*,
580;; then click on *Browse Customization Groups*,
581;; expand *PostScript* group,
582;; expand *Printing* group
583;; and then customize `printing' options.
584;; Through this way, you may choose if the settings are kept or not when
585;; you leave out the current Emacs session.
586;;
587;; d) or see the option value:
588;;
589;; C-h v pr-faces-p RET
590;;
591;; and click the *customize* hypertext button.
592;; Through this way, you may choose if the settings are kept or not when
593;; you leave out the current Emacs session.
594;;
595;; e) or invoke:
596;;
597;; M-x pr-customize RET
598;;
599;; and then customize `printing' options.
600;; Through this way, you may choose if the settings are kept or not when
601;; you leave out the current Emacs session.
602;;
603;; f) or use menu bar, for example:
604;; click on menu-bar *File* option,
605;; then click on *Printing*,
606;; then click on *Customize*,
607;; then click on *printing*
608;; and then customize `printing' options.
609;; Through this way, you may choose if the settings are kept or not when
610;; you leave out the current Emacs session.
611;;
612;;
613;; Menu Layout
614;; -----------
615;;
616;; The `printing' menu (Tools/Printing or File/Print) has the following layout:
617;;
618;; +-----------------------------+
619;; A 0 | Printing Interface |
620;; +-----------------------------+ +-A---------+ +-B------+
621;; I 1 | PostScript Preview >|-------|Directory >|-----|1-up |
622;; 2 | PostScript Print >|---- A |Buffer >|-- B |2-up |
623;; 3 | PostScript Printer: name >|---- C |Region >|-- B |4-up |
624;; +-----------------------------+ |Mode >|-- B |Other...|
625;; II 4 | Printify >|-----\ |File >|--\ +--------+
626;; 5 | Print >|---\ | |Despool... | |
627;; 6 | Text Printer: name >|-\ | | +-----------+ |
628;; +-----------------------------+ | | | +---------+ +------------+
b8d955f4 629;; III 7 |[ ]Landscape | | | \-|Directory| | No Prep... | Ia
2c840b90
KS
630;; 8 |[ ]Print Header | | | |Buffer | +------------+ Ib
631;; 9 |[ ]Print Header Frame | | | |Region | | name >|- C
632;; 10 |[ ]Line Number | | | +---------+ +------------+
633;; 11 |[ ]Zebra Stripes | | | +---------+ | 1-up... | Ic
634;; 12 |[ ]Duplex | | \---|Directory| | 2-up... |
635;; 13 |[ ]Tumble | \--\ |Buffer | | 4-up... |
636;; 14 |[ ]Upside-Down | | |Region | | Other... |
637;; 15 | Print All Pages >|--\ | |Mode | +------------+
638;; +-----------------------------+ | | +---------+ |[ ]Landscape| Id
639;; IV 16 |[ ]Spool Buffer | | | +-C-------+ |[ ]Duplex | Ie
449cba44
VJL
640;; 17 |[ ]Print with faces | | \--|( )name A| |[ ]Tumble | If
641;; 18 |[ ]Print via Ghostscript | | |( )name B| +------------+
2c840b90
KS
642;; +-----------------------------+ | |... |
643;; V 19 |[ ]Auto Region | | |(*)name |
644;; 20 |[ ]Auto Mode | | |... |
645;; 21 |[ ]Menu Lock | | +---------+ +--------------+
646;; +-----------------------------+ \------------------|(*)All Pages |
647;; VI 22 | Customize >|--- D +-D------+ |( )Even Pages |
648;; 23 | Show Settings >|-------|printing| |( )Odd Pages |
649;; 24 | Help | |ps-print| |( )Even Sheets|
650;; +-----------------------------+ |lpr | |( )Odd Sheets |
651;; +--------+ +--------------+
652;;
653;; See `pr-visible-entry-list' for hiding some parts of the menu.
654;;
655;; The menu has the following sections:
656;;
657;; A. Interface:
658;;
659;; 0. You can use a buffer interface instead of menus. It looks like the
660;; customization buffer. Basically, it has the same options found in the
661;; menu and some extra options, all this on a buffer.
662;;
663;; I. PostScript printing:
664;;
665;; 1. You can generate a PostScript file (if you type C-u before activating
666;; menu) or PostScript temporary file for a directory, a buffer, a region
667;; or a major mode, choosing 1-up, 2-up, 4-up or any other n-up printing;
668;; after file generation, ghostview is activated using the file generated
669;; as argument. This option is disabled if spooling is on (option 16).
670;; Also, if you already have a PostScript file you can preview it.
671;; Instead of previewing each buffer, region or major mode at once, you
672;; can save temporarily the PostScript code generated in a buffer and
673;; preview it later. The option `Despool...' despools the PostScript
674;; spooling buffer in a temporary file and uses ghostview to preview it.
675;; If you type C-u before choosing this option, the PostScript code
676;; generated is saved in a file instead of saving in a temporary file.
677;; To spool the PostScript code generated you need to turn on the option
678;; 16. The option `Despool...' is enabled if spooling is on (option
679;; 16).
680;;
681;; NOTE 1: It's possible to customize a major mode printing, just declare
682;; the customization in `pr-mode-alist' and invoke some of
683;; `*-mode*' commands or select Mode option in Printing menu. An
684;; example for major mode usage is when you're using gnus (or mh,
685;; or rmail, etc.) and you're in the *Summary* buffer, if you
686;; forget to switch to the *Article* buffer before printing,
687;; you'll get a nicely formatted list of article subjects shows
688;; up at the printer. With major mode printing you don't need to
689;; switch from gnus *Summary* buffer first.
690;;
691;; NOTE 2: There are the following options for PostScript file
692;; processing:
b8d955f4
VJL
693;; Ia. Print the file *No Preprocessing*, that is, send it
694;; directly to PostScript printer.
2c840b90
KS
695;; Ib. PostScript utility processing selection.
696;; See `pr-ps-utility-alist' and `pr-setting-database' for
697;; documentation.
698;; Ic. Do n-up processing before printing.
699;; Id. Toggle on/off landscape for PostScript file processing.
700;; Ie. Toggle on/off duplex for PostScript file processing.
701;; If. Toggle on/off tumble for PostScript file processing.
702;;
703;; NOTE 3: Don't forget to download and install the utilities declared on
704;; `pr-ps-utility-alist'.
705;;
706;; 2. Operate the same way as option 1, but it sends directly the PostScript
707;; code (or put in a file, if you've typed C-u) or it uses ghostscript to
708;; print the PostScript file generated. It depends on option 18, if it's
709;; turned on, it uses ghostscript; otherwise, it sends directly to
710;; printer. If spooling is on (option 16), the PostScript code is saved
711;; temporarily in a buffer instead of printing it or saving it in a file.
712;; Also, if you already have a PostScript file you can print it. Instead
713;; of printing each buffer, region or major mode at once, you can save
714;; temporarily the PostScript code generated in a buffer and print it
715;; later. The option `Despool...' despools the PostScript spooling
716;; buffer directly on a printer. If you type C-u before choosing this
717;; option, the PostScript code generated is saved in a file instead of
718;; sending to printer. To spool the PostScript code generated you need
719;; to turn on the option 16. This option is enabled if spooling is on
720;; (option 16). See also the NOTE 1, NOTE 2 and NOTE 3 on option 1.
721;;
722;; 3. You can select a new PostScript printer to send PostScript code
723;; generated. For selection it's used all PostScript printers defined
724;; in `pr-ps-printer-alist' variable (see it for documentation).
725;; See also `pr-setting-database'.
726;;
727;; II. Text printing:
728;;
729;; 4. If you have control characters (character code from \000 to \037) in a
730;; buffer and you want to print them in a text printer, select this
731;; option. All control characters in your buffer or region will be
732;; replaced by a printable representation. The printable representations
733;; use ^ (for ASCII control characters) or hex. The characters tab,
734;; linefeed, space, return and formfeed are not affected. You don't need
735;; to select this option if you use any option of section I, the
736;; PostScript engine treats control characters properly.
737;;
738;; 5. If you want to print a directory, buffer, region or major mode in a
739;; text printer, select this option. See also the NOTE 1 on option 1.
740;;
741;; 6. You can select a new text printer to send text generated. For
742;; selection it's used all text printers defined in
743;; `pr-txt-printer-alist' variable (see it for documentation).
744;; See also `pr-setting-database'.
745;;
746;; III. PostScript page toggle options:
747;;
748;; 7. If you want a PostScript landscape printing, turn on this option.
749;;
750;; 8. If you want to have a header in each page in your PostScript code,
751;; turn on this option.
752;;
753;; 9. If you want to draw a gaudy frame around the header, turn on this
754;; option. This option is enabled if print header is on (option 8).
755;;
756;; 10. If you want that the line number is printed in your PostScript code,
757;; turn on this option.
758;;
759;; 11. If you want background zebra stripes in your PostScript code, turn on
760;; this option.
761;;
762;; 12. If you want a duplex printing and your PostScript printer has this
763;; feature, turn on this option.
764;;
765;; 13. If you turned on duplex printing, you can choose if you want to have
766;; a printing suitable for binding on the left or right (tumble off), or
767;; to have a printing suitable for binding at top or bottom (tumble on).
768;; This option is enabled if duplex is on (option 12).
769;;
770;; 14. If you want a PostScript upside-down printing, turn on this option.
771;;
772;; 15. With this option, you can choose if you want to print all pages, odd
773;; pages, even pages, odd sheets or even sheets.
774;; See also `ps-even-or-odd-pages'.
775;;
776;; IV. PostScript processing toggle options:
777;;
778;; 16. If you want to spool the PostScript code generated, turn on this
779;; option. To spool the PostScript code generated use option 2. You
780;; can despool later by choosing option 1 or 2, sub-option `Despool...'.
781;;
782;; 17. If you use colors in your buffers and want to see these colors on
783;; your PostScript code generated, turn on this option. If you have a
784;; black/white PostScript printer, these colors are displayed in gray
785;; scale by PostScript printer interpreter.
786;;
787;; 18. If you don't have a PostScript printer to send PostScript files, turn
788;; on this option. When this option is on, the ghostscript is used to
789;; print PostScript files. In GNU or Unix system, if ghostscript is set
790;; as a PostScript filter, you don't need to turn on this option.
791;;
792;; V. Printing customization:
793;;
794;; 19. If you want that region is automagically detected, turn on this
795;; option. Note that this will only work if you're using transient mark
796;; mode. When this option is on, the `*-buffer*' commands will behave
797;; like `*-region*' commands, that is, `*-buffer*' commands will print
798;; only the region marked instead of all buffer.
799;;
800;; 20. Turn this option on if you want that when current major-mode is
801;; declared in `pr-mode-alist', the `*-buffer*' and `*-region*' commands
802;; behave like `*-mode*' commands.
803;;
449cba44 804;; 21. If you want that Printing menu stays open while you are setting
2c840b90
KS
805;; toggle options, turn on this option. The variables
806;; `pr-menu-char-height' and `pr-menu-char-width' are used to guess the
807;; menu position, so don't forget to adjust these variables if menu
808;; position is not ok.
809;;
810;; VI. Customization:
811;;
812;; 22. Besides all options in section III, IV and V, you can customize much
813;; more PostScript options in `ps-print' option. Or you can customize
814;; some `lpr' options for text printing. Or customize `printing'
815;; options.
816;;
817;; 23. Show current settings for `printing', `ps-print' or `lpr'.
818;;
819;; 24. Quick help for printing menu layout.
820;;
821;;
822;; Option Settings
823;; ---------------
824;;
825;; Below it's shown only the main options that affect all `printing' package.
826;; Check all the settings below *BEFORE* running `printing' commands.
827;;
828;; * Example of setting for GNU or Unix system:
829;;
830;; (require 'printing)
831;; (setq pr-path-alist
832;; '((unix "." "~/bin" ghostview mpage PATH)
833;; (ghostview "$HOME/bin/gsview-dir")
834;; (mpage "$HOME/bin/mpage-dir")
835;; ))
836;; (setq pr-txt-name 'prt_06a)
837;; (setq pr-txt-printer-alist
838;; '((prt_06a "lpr" nil "prt_06a")
839;; (prt_07c nil nil "prt_07c")
840;; ))
841;; (setq pr-ps-name 'lps_06b)
842;; (setq pr-ps-printer-alist
843;; '((lps_06b "lpr" nil "-P" "lps_06b")
844;; (lps_07c "lpr" nil nil "lps_07c")
845;; (lps_08c nil nil nil "lps_08c")
846;; ))
847;; (setq pr-temp-dir "/tmp/")
848;; (setq pr-gv-command "gv")
849;; (setq pr-gs-command "gs")
850;; (setq pr-gs-switches '("-q -dNOPAUSE -I/usr/share/ghostscript/5.10"))
851;; (setq pr-gs-device "uniprint")
852;; (setq pr-gs-resolution 300)
853;; (setq pr-ps-utility 'mpage)
854;; (setq pr-ps-utility-alist
855;; '((mpage "mpage" nil "-b%s" "-%d" "-l" "-t" "-T" ">" nil)
856;; (psnup "psnup" ("-q") "-P%s" "-%d" "-l" nil nil " " nil
857;; (inherits-from: . no-duplex))
858;; ))
859;; (setq pr-setting-database
860;; '((no-duplex
861;; nil nil nil
862;; (pr-file-duplex . nil)
863;; (pr-file-tumble . nil))
864;; ))
865;; (pr-update-menus t) ; update now printer and utility menus
866;;
867;; * Example of setting for Windows system:
868;;
869;; (require 'printing)
870;; (setq pr-path-alist
871;; '((windows "c:/applications/executables" PATH ghostview mpage)
872;; (ghostview "c:/gs/gsview-dir")
873;; (mpage "c:/mpage-dir")
874;; ))
875;; (setq pr-txt-name 'prt_06a)
876;; (setq pr-txt-printer-alist
877;; '((prt_06a "print" nil "/D:\\\\printers\\prt_06a")
878;; (prt_07c nil nil "/D:\\\\printers\\prt_07c")
879;; (PRN "" nil "PRN")
880;; (standard "redpr.exe" nil "")
881;; ))
882;; (setq pr-ps-name 'lps_06b)
883;; (setq pr-ps-printer-alist
884;; '((lps_06a "print" nil "/D:" "\\\\printers\\lps_06a")
885;; (lps_06b "print" nil nil "\\\\printers\\lps_06b")
886;; (lps_07c "print" nil "" "/D:\\\\printers\\lps_07c")
887;; (lps_08c nil nil nil "\\\\printers\\lps_08c")
888;; (LPT1 "" nil "" "LPT1:")
889;; (PRN "" nil "" "PRN")
890;; (standard "redpr.exe" nil "" "")
891;; ))
892;; (setq pr-temp-dir "C:/WINDOWS/TEMP/")
893;; (setq pr-gv-command "c:/gs/gsview/gsview32.exe")
894;; (setq pr-gs-command "c:/gs/gswin32.exe")
895;; (setq pr-gs-switches '("-q -dNOPAUSE -Ic:/gs/gs5.50;c:/gs/gs5.50/fonts"))
896;; (setq pr-gs-device "mswinpr2")
897;; (setq pr-gs-resolution 300)
898;; (setq pr-ps-utility 'psnup)
899;; (setq pr-ps-utility-alist
900;; '((psnup "c:/psutils/psnup" ("-q") "-P%s" "-%d" "-l" nil nil " "
901;; nil (inherits-from: . no-duplex))
902;; ))
903;; (setq pr-setting-database
904;; '((no-duplex
905;; nil nil nil
906;; (pr-file-duplex . nil)
907;; (pr-file-tumble . nil))
908;; ))
909;; (pr-update-menus t) ; update now printer and utility menus
910;;
911;; NOTE: Don't forget to download and install the utilities declared on
912;; `pr-ps-utility-alist'.
913;;
914;;
915;; Utilities
916;; ---------
917;;
918;; `printing' package has the following utilities:
919;;
920;; `pr-setup' Return the current `printing' setup.
921;;
922;; `lpr-setup' Return the current `lpr' setup.
923;;
924;; `pr-update-menus' Update utility, PostScript and text printer menus.
925;;
926;; Below are some URL where you can find good utilities.
927;;
928;; * For `printing' package:
929;;
930;; printing `http://www.cpqd.com.br/~vinicius/emacs/printing.el.gz'
931;; ps-print `http://www.cpqd.com.br/~vinicius/emacs/ps-print.tar.gz'
932;;
933;; * For GNU or Unix system:
934;;
935;; gs, gv `http://www.gnu.org/software/ghostscript/ghostscript.html'
936;; enscript `http://people.ssh.fi/mtr/genscript/'
937;; psnup `http://www.dcs.ed.ac.uk/home/ajcd/psutils/index.html'
938;; mpage `http://www.mesa.nl/pub/mpage/'
939;;
940;; * For Windows system:
941;;
942;; gswin32, gsview32
943;; `http://www.gnu.org/software/ghostscript/ghostscript.html'
082b4369 944;; gsprint `http://www.cs.wisc.edu/~ghost/gsview/gsprint.htm'.
2c840b90
KS
945;; enscript `http://people.ssh.fi/mtr/genscript/'
946;; psnup `http://www.dcs.ed.ac.uk/home/ajcd/psutils/index.html'
947;; redmon `http://www.cs.wisc.edu/~ghost/redmon/'
948;;
949;;
950;; Acknowledgments
951;; ---------------
952;;
6367b616
VJL
953;; Thanks to Stefan Monnier <monnier@iro.umontreal.ca> for GNU Emacs and XEmacs
954;; printing menu (in `pr-menu-spec') merging suggestion.
955;;
082b4369
VJL
956;; Thanks to Lennart Borgman <lennart.borgman.073@student.lu.se> for gsprint
957;; suggestion (see tip 5 in section Tips).
958;;
0117451d
VJL
959;; Thanks to Drew Adams <drew.adams@oracle.com> for suggestions:
960;; - directory processing.
961;; - `pr-path-alist' variable.
962;; - doc fix.
963;; - a lot of tests on Windows.
2c840b90
KS
964;;
965;; Thanks to Fred Labrosse <f.labrosse@maths.bath.ac.uk> for XEmacs tests.
966;;
967;; Thanks to Klaus Berndl <klaus.berndl@sdm.de> for invaluable help/debugging
968;; and for suggestions:
969;; - even/odd pages printing.
970;; - ghostscript parameters for `pr-ps-printer-alist'.
971;; - default printer name.
972;; - completion functions.
973;; - automagic region detection.
974;; - menu entry hiding.
975;; - fast fire PostScript printing command.
976;; - `pr-path-style' variable.
977;;
978;; Thanks to Kim F. Storm <storm@filanet.dk> for beta-test and for suggestions:
979;; - PostScript Print and PostScript Print Preview merge.
980;; - Tools/Printing menu.
981;; - replace *-using-preview by *-using-ghostscript.
982;; - printer selection.
983;; - extra parameters for `pr-ps-printer-alist'.
984;;
985;; Thanks to:
986;; Frederic Corne <frederic.corne@erli.fr> print-nt.el
987;; Tom Vogels <tov@ece.cmu.edu> mh-e-init.el
988;; Matthew O. Persico <mpersico@erols.com> win32-ps-print.el
989;; Volker Franz <volker.franz@tuebingen.mpg.de> ps-print-interface.el
990;; And to all people who contributed with them.
991;;
992;;
993;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
994
995;;; Code:
996
997
998(require 'lpr)
999(require 'ps-print)
1000
1001
45f17557 1002(and (string< ps-print-version "6.6.4")
747aa4cf 1003 (error "`printing' requires `ps-print' package version 6.6.4 or later"))
2c840b90
KS
1004
1005
1006(eval-and-compile
1007 (defconst pr-cygwin-system
1008 (and ps-windows-system (getenv "OSTYPE")
1009 (string-match "cygwin" (getenv "OSTYPE")))))
1010
1011
1012;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1013;; To avoid compilation gripes
1014
1015
1016(eval-and-compile
1017
1018 (or (fboundp 'subst-char-in-string)
1019 (defun subst-char-in-string (fromchar tochar string &optional inplace)
1020 "Replace FROMCHAR with TOCHAR in STRING each time it occurs.
1021Unless optional argument INPLACE is non-nil, return a new string."
1022 (let ((i (length string))
1023 (newstr (if inplace string (copy-sequence string))))
1024 (while (> (setq i (1- i)) 0)
1025 (if (eq (aref newstr i) fromchar)
1026 (aset newstr i tochar)))
1027 newstr)))
1028
1029 ;; GNU Emacs
1030 (defalias 'pr-e-frame-char-height 'frame-char-height)
1031 (defalias 'pr-e-frame-char-width 'frame-char-width)
1032 (defalias 'pr-e-mouse-pixel-position 'mouse-pixel-position)
1033 ;; XEmacs
1034 (defalias 'pr-x-add-submenu 'add-submenu)
1035 (defalias 'pr-x-event-function 'event-function)
1036 (defalias 'pr-x-event-object 'event-object)
1037 (defalias 'pr-x-find-menu-item 'find-menu-item)
1038 (defalias 'pr-x-font-height 'font-height)
1039 (defalias 'pr-x-font-width 'font-width)
1040 (defalias 'pr-x-get-popup-menu-response 'get-popup-menu-response)
1041 (defalias 'pr-x-make-event 'make-event)
1042 (defalias 'pr-x-misc-user-event-p 'misc-user-event-p)
1043 (defalias 'pr-x-relabel-menu-item 'relabel-menu-item)
1044 (defalias 'pr-x-event-x-pixel 'event-x-pixel)
1045 (defalias 'pr-x-event-y-pixel 'event-y-pixel)
1046
1047 (cond
1048 ((eq ps-print-emacs-type 'emacs) ; GNU Emacs
1049 (defvar deactivate-mark nil)
1050 (defalias 'pr-f-set-keymap-parents 'set-keymap-parent)
1051 (defalias 'pr-f-set-keymap-name 'ignore)
1052 (defalias 'pr-f-read-string 'read-string)
1053 (defun pr-keep-region-active ()
1054 (setq deactivate-mark nil)))
1055
1056 ((eq ps-print-emacs-type 'xemacs) ; XEmacs
1057 (defvar current-menubar nil)
1058 (defvar current-mouse-event nil)
1059 (defvar zmacs-region-stays nil)
1060 (defalias 'pr-f-set-keymap-parents 'set-keymap-parents)
1061 (defalias 'pr-f-set-keymap-name 'set-keymap-name)
1062 (defun pr-f-read-string (prompt initial history default)
1063 (let ((str (read-string prompt initial)))
1064 (if (and str (not (string= str "")))
1065 str
1066 default)))
1067 (defun pr-keep-region-active ()
1068 (setq zmacs-region-stays t)))))
1069
1070
1071;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1072;; Customization Functions
1073
1074
1075(defun pr-alist-custom-set (symbol value)
1076 "Set the value of custom variables for printer & utility selection."
1077 (set symbol value)
1078 (and (featurep 'printing) ; update only after printing is loaded
1079 (pr-update-menus t)))
1080
1081
1082(defun pr-ps-utility-custom-set (symbol value)
1083 "Update utility menu entry."
1084 (set symbol value)
1085 (and (featurep 'printing) ; update only after printing is loaded
1086 (pr-menu-set-utility-title value)))
1087
1088
1089(defun pr-ps-name-custom-set (symbol value)
1090 "Update `PostScript Printer:' menu entry."
1091 (set symbol value)
1092 (and (featurep 'printing) ; update only after printing is loaded
1093 (pr-menu-set-ps-title value)))
1094
1095
1096(defun pr-txt-name-custom-set (symbol value)
1097 "Update `Text Printer:' menu entry."
1098 (set symbol value)
1099 (and (featurep 'printing) ; update only after printing is loaded
1100 (pr-menu-set-txt-title value)))
1101
1102
1103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1104;; User Interface (I)
1105
1106
1107(defgroup printing nil
1108 "Printing Utilities group"
1109 :tag "Printing Utilities"
1110 :link '(emacs-library-link :tag "Source Lisp File" "printing.el")
1111 :prefix "pr-"
e22c7647 1112 :version "20"
2c840b90
KS
1113 :group 'wp
1114 :group 'postscript)
1115
1116
1117(defcustom pr-path-style
1118 (if (and (not pr-cygwin-system)
1119 ps-windows-system)
1120 'windows
1121 'unix)
1122 "*Specify which path style to use for external commands.
1123
1124Valid values are:
1125
1126 windows Windows 9x/NT style (\\)
1127
1128 unix Unix style (/)"
1129 :type '(choice :tag "Path style"
1130 (const :tag "Windows 9x/NT Style (\\)" :value windows)
1131 (const :tag "Unix Style (/)" :value unix))
6367b616 1132 :version "20"
2c840b90
KS
1133 :group 'printing)
1134
1135
1136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1137;; Internal Functions (I)
1138
1139
0117451d 1140(defun pr-dosify-file-name (path)
2c840b90
KS
1141 "Replace unix-style directory separator character with dos/windows one."
1142 (interactive "sPath: ")
1143 (if (eq pr-path-style 'windows)
1144 (subst-char-in-string ?/ ?\\ path)
1145 path))
1146
1147
0117451d 1148(defun pr-unixify-file-name (path)
2c840b90
KS
1149 "Replace dos/windows-style directory separator character with unix one."
1150 (interactive "sPath: ")
1151 (if (eq pr-path-style 'windows)
1152 (subst-char-in-string ?\\ ?/ path)
1153 path))
1154
1155
0117451d 1156(defun pr-standard-file-name (path)
45f17557
VJL
1157 "Ensure the proper directory separator depending on the OS.
1158That is, if Emacs is running on DOS/Windows, ensure dos/windows-style directory
1159separator; otherwise, ensure unix-style directory separator."
1160 (if (or pr-cygwin-system ps-windows-system)
1161 (subst-char-in-string ?/ ?\\ path)
1162 (subst-char-in-string ?\\ ?/ path)))
1163
1164
2c840b90
KS
1165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1166;; User Interface (II)
1167
1168
1169(defcustom pr-path-alist
1170 '((unix PATH)
1171 (cygwin PATH)
1172 (windows PATH))
1173 "*Specify an alist for command paths.
1174
1175It's used to find commands used for printing package, like gv, gs, gsview.exe,
1176mpage, print.exe, etc. See also `pr-command' function.
1177
1178Each element has the form:
1179
1180 (ENTRY DIRECTORY...)
1181
1182Where:
1183
1184ENTRY It's a symbol, used to identify this entry.
1185 There must exist at least one of the following entries:
1186
1187 unix this entry is used when Emacs is running on GNU or
1188 Unix system.
1189
1190 cygwin this entry is used when Emacs is running on Windows
1191 95/98/NT/2000 with Cygwin.
1192
1193 windows this entry is used when Emacs is running on Windows
1194 95/98/NT/2000.
1195
1196DIRECTORY It should be a string or a symbol. If it's a symbol, it should
1197 exist an equal entry in `pr-path-alist'. If it's a string,
1198 it's considered a directory specification.
1199
1200 The directory specification may contain:
1201 $var environment variable expansion
1202 ~/ tilde expansion
1203 ./ current directory
1204 ../ previous directory
1205
1206 For example, let's say the home directory is /home/my and the
1207 current directory is /home/my/dir, so:
1208
1209 THE ENTRY IS EXPANDED TO
1210 ~/entry /home/my/entry
1211 ./entry /home/my/dir/entry
1212 ../entry /home/my/entry
1213 $HOME/entry /home/my/entry
1214 $HOME/~/other/../my/entry /home/my/entry
1215
1216 SPECIAL SYMBOL: If the symbol `PATH' is used in the directory
1217 list and there isn't a `PATH' entry in `pr-path-alist' or the
1218 `PATH' entry has a null directory list, the PATH environment
1219 variable is used.
1220
1221Examples:
1222
1223* On GNU or Unix system:
1224
1225 '((unix \".\" \"~/bin\" ghostview mpage PATH)
1226 (ghostview \"$HOME/bin/gsview-dir\")
1227 (mpage \"$HOME/bin/mpage-dir\")
1228 )
1229
1230* On Windows system:
1231
1232 '((windows \"c:/applications/executables\" PATH ghostview mpage)
1233 (ghostview \"c:/gs/gsview-dir\")
1234 (mpage \"c:/mpage-dir\")
1235 )"
1236 :type '(repeat
1237 (cons :tag ""
1238 (symbol :tag "Identifier ")
1239 (repeat :tag "Directory List"
1240 (choice :menu-tag "Directory"
1241 :tag "Directory"
1242 (string :value "")
1243 (symbol :value symbol)))))
6367b616 1244 :version "20"
2c840b90
KS
1245 :group 'printing)
1246
1247
1248(defcustom pr-txt-name 'default
1249 "*Specify a printer for printing a text file.
1250
1251The printer name symbol should be defined on `pr-txt-printer-alist' (see it for
1252documentation).
1253
1254This variable should be modified by customization engine. If this variable is
1255modified by other means (for example, a lisp function), use `pr-update-menus'
1256function (see it for documentation) to update text printer menu."
1257 :type 'symbol
1258 :set 'pr-txt-name-custom-set
6367b616 1259 :version "20"
2c840b90
KS
1260 :group 'printing)
1261
1262
1263(defcustom pr-txt-printer-alist
1264 (list (list 'default lpr-command nil
1265 (cond ((boundp 'printer-name) printer-name)
1266 (ps-windows-system "PRN")
1267 (t nil)
1268 )))
1269 ;; Examples:
1270 ;; * On GNU or Unix system:
1271 ;; '((prt_06a "lpr" nil "prt_06a")
1272 ;; (prt_07c nil nil "prt_07c")
1273 ;; )
1274 ;; * On Windows system:
1275 ;; '((prt_06a "print" nil "/D:\\\\printers\\prt_06a")
1276 ;; (prt_07c nil nil "/D:\\\\printers\\prt_07c")
1277 ;; (PRN "" nil "PRN")
1278 ;; (standard "redpr.exe" nil "")
1279 ;; )
1280 "*Specify an alist of all text printers (text printer database).
1281
1282The alist element has the form:
1283
1284 (SYMBOL COMMAND SWITCHES NAME)
1285
1286Where:
1287
1288SYMBOL It's a symbol to identify a text printer. It's for
1289 `pr-txt-name' variable setting and for menu selection.
1290 Examples:
1291 'prt_06a
1292 'my_printer
1293
449cba44
VJL
1294COMMAND Name of the program for printing a text file. On MS-DOS and
1295 MS-Windows systems, if the value is an empty string, then Emacs
1296 will write directly to the printer port given by NAME (see text
2c840b90
KS
1297 below), that is, the NAME should be something like \"PRN\" or
1298 \"LPT1:\".
1299 If NAME is something like \"\\\\\\\\host\\\\share-name\" then
1300 COMMAND shouldn't be an empty string.
1301 The programs `print' and `nprint' (the standard print programs
1302 on Windows NT and Novell Netware respectively) are handled
1303 specially, using NAME as the destination for output; any other
1304 program is treated like `lpr' except that an explicit filename
1305 is given as the last argument.
1306 If COMMAND is nil, it's used the default printing program:
1307 `print' for Windows system, `lp' for lp system and `lpr' for
1308 all other systems. See also `pr-path-alist'.
1309 Examples:
1310 \"print\"
1311 \"lpr\"
1312 \"lp\"
1313
1314SWITCHES List of sexp's to pass as extra options for text printer
1315 program. It is recommended to set NAME (see text below)
1316 instead of including an explicit switch on this list.
1317 Example:
1318 . for lpr
1319 '(\"-#3\" \"-l\")
1320 nil
1321
1322NAME A string that specifies a text printer name.
1323 On Unix-like systems, a string value should be a name
1324 understood by lpr's -P option (or lp's -d option).
1325 On MS-DOS and MS-Windows systems, it is the name of a printer
1326 device or port. Typical non-default settings would be \"LPT1:\"
1327 to \"LPT3:\" for parallel printers, or \"COM1\" to \"COM4\" or
1328 \"AUX\" for serial printers, or \"\\\\\\\\hostname\\\\printer\"
1329 (or \"/D:\\\\\\\\hostname\\\\printer\") for a shared network
1330 printer. You can also set it to a name of a file, in which
1331 case the output gets appended to that file. If you want to
1332 discard the printed output, set this to \"NUL\".
1333 Examples:
1334 . for print.exe
1335 \"/D:\\\\\\\\host\\\\share-name\"
1336 \"LPT1:\"
1337 \"PRN\"
1338
1339 . for lpr or lp
1340 \"share-name\"
1341
1342This variable should be modified by customization engine. If this variable is
1343modified by other means (for example, a lisp function), use `pr-update-menus'
1344function (see it for documentation) to update text printer menu.
1345
1346Examples:
1347
1348* On GNU or Unix system:
1349
1350 '((prt_06a \"lpr\" nil \"prt_06a\")
1351 (prt_07c nil nil \"prt_07c\")
1352 )
1353
1354* On Windows system:
1355
1356 '((prt_06a \"print\" nil \"/D:\\\\\\\\printers\\\\prt_06a\")
1357 (prt_07c nil nil \"/D:\\\\\\\\printers\\\\prt_07c\")
1358 (PRN \"\" nil \"PRN\")
1359 (standard \"redpr.exe\" nil \"\")
1360 )"
1361 :type '(repeat
1362 (list :tag "Text Printer"
1363 (symbol :tag "Printer Symbol Name")
1364 (string :tag "Printer Command")
1365 (repeat :tag "Printer Switches"
1366 (sexp :tag "Switch" :value ""))
1367 (choice :menu-tag "Printer Name"
1368 :tag "Printer Name"
1369 (const :tag "None" nil)
1370 string)))
1371 :set 'pr-alist-custom-set
6367b616 1372 :version "20"
2c840b90
KS
1373 :group 'printing)
1374
1375
1376(defcustom pr-ps-name 'default
1377 "*Specify a printer for printing a PostScript file.
1378
1379This printer name symbol should be defined on `pr-ps-printer-alist' (see it for
1380documentation).
1381
1382This variable should be modified by customization engine. If this variable is
1383modified by other means (for example, a lisp function), use `pr-update-menus'
1384function (see it for documentation) to update PostScript printer menu."
1385 :type 'symbol
1386 :set 'pr-ps-name-custom-set
6367b616 1387 :version "20"
2c840b90
KS
1388 :group 'printing)
1389
1390
1391(defcustom pr-ps-printer-alist
1392 (list (list 'default lpr-command nil
1393 (cond (ps-windows-system nil)
1394 (ps-lp-system "-d")
1395 (t "-P"))
1396 (or (getenv "PRINTER") (getenv "LPDEST") ps-printer-name)))
1397 ;; Examples:
1398 ;; * On GNU or Unix system:
1399 ;; '((lps_06b "lpr" nil "-P" "lps_06b")
1400 ;; (lps_07c "lpr" nil nil "lps_07c")
1401 ;; (lps_08c nil nil nil "lps_08c")
1402 ;; )
1403 ;; * On Windows system:
1404 ;; '((lps_06a "print" nil "/D:" "\\\\printers\\lps_06a")
1405 ;; (lps_06b "print" nil nil "\\\\printers\\lps_06b")
1406 ;; (lps_07c "print" nil "" "/D:\\\\printers\\lps_07c")
1407 ;; (lps_08c nil nil nil "\\\\printers\\lps_08c")
1408 ;; (LPT1 "" nil "" "LPT1:")
1409 ;; (PRN "" nil "" "PRN")
1410 ;; (standard "redpr.exe" nil "" "")
1411 ;; )
1412 "*Specify an alist for all PostScript printers (PostScript printer database).
1413
1414The alist element has the form:
1415
1416 (SYMBOL COMMAND SWITCHES PRINTER-SWITCH NAME DEFAULT...)
1417
1418Where:
1419
1420SYMBOL It's a symbol to identify a PostScript printer. It's for
1421 `pr-ps-name' variable setting and for menu selection.
1422 Examples:
1423 'prt_06a
1424 'my_printer
1425
449cba44
VJL
1426COMMAND Name of the program for printing a PostScript file. On MS-DOS
1427 and MS-Windows systems, if the value is an empty string then
1428 Emacs will write directly to the printer port given by NAME
1429 (see text below), that is, the NAME should be something like
1430 \"PRN\" or \"LPT1:\".
2c840b90
KS
1431 If NAME is something like \"\\\\\\\\host\\\\share-name\" then
1432 COMMAND shouldn't be an empty string.
1433 The programs `print' and `nprint' (the standard print programs
1434 on Windows NT and Novell Netware respectively) are handled
1435 specially, using NAME as the destination for output; any other
1436 program is treated like `lpr' except that an explicit filename
1437 is given as the last argument.
1438 If COMMAND is nil, it's used the default printing program:
1439 `print' for Windows system, `lp' for lp system and `lpr' for
1440 all other systems. See also `pr-path-alist'.
1441 Examples:
1442 \"print\"
1443 \"lpr\"
1444 \"lp\"
1445 \"cp\"
1446
1447SWITCHES List of sexp's to pass as extra options for PostScript printer
1448 program. It is recommended to set NAME (see text below)
1449 instead of including an explicit switch on this list.
1450 Example:
1451 . for lpr
1452 '(\"-#3\" \"-l\")
1453 nil
1454
1455PRINTER-SWITCH A string that specifies PostScript printer name switch. If
1456 it's necessary to have a space between PRINTER-SWITCH and NAME,
1457 it should be inserted at the end of PRINTER-SWITCH string.
1458 If PRINTER-SWITCH is nil, it's used the default printer name
1459 switch: `/D:' for Windows system, `-d' for lp system and `-P'
1460 for all other systems.
1461 Examples:
1462 . for lpr
1463 \"-P \"
1464
1465 . for lp
1466 \"-d \"
1467
1468 . for print.exe
1469 \"/D:\"
1470
1471NAME A string that specifies a PostScript printer name.
1472 On Unix-like systems, a string value should be a name
1473 understood by lpr's -P option (or lp's -d option).
1474 On MS-DOS and MS-Windows systems, it is the name of a printer
1475 device or port. Typical non-default settings would be \"LPT1:\"
1476 to \"LPT3:\" for parallel printers, or \"COM1\" to \"COM4\" or
1477 \"AUX\" for serial printers, or \"\\\\\\\\hostname\\\\printer\"
1478 (or \"/D:\\\\\\\\hostname\\\\printer\") for a shared network
1479 printer. You can also set it to a name of a file, in which
1480 case the output gets appended to that file. If you want to
1481 discard the printed output, set this to \"NUL\".
1482 Examples:
1483 . for cp.exe
1484 \"\\\\\\\\host\\\\share-name\"
1485
1486 . for print.exe
1487 \"/D:\\\\\\\\host\\\\share-name\"
1488 \"\\\\\\\\host\\\\share-name\"
1489 \"LPT1:\"
1490 \"PRN\"
1491
1492 . for lpr or lp
1493 \"share-name\"
1494
1495DEFAULT It's a way to set default values when this entry is selected.
1496 It's a cons like:
1497
1498 (VARIABLE . VALUE)
1499
1500 That associates VARIABLE with VALUE. when this entry is
1501 selected, it's executed the following command:
1502
1503 (set VARIABLE (eval VALUE))
1504
1505 Note that VALUE can be any valid lisp expression. So, don't
1506 forget to quote symbols and constant lists.
1507 If VARIABLE is the special keyword `inherits-from:', VALUE must
1508 be a symbol name setting defined in `pr-setting-database' from
1509 which the current setting inherits the context. Take care with
1510 circular inheritance.
1511 Examples:
1512 '(ps-landscape-mode . nil)
1513 '(ps-spool-duplex . t)
1514 '(pr-gs-device . (my-gs-device t))
1515
1516This variable should be modified by customization engine. If this variable is
1517modified by other means (for example, a lisp function), use `pr-update-menus'
1518function (see it for documentation) to update PostScript printer menu.
1519
1520Examples:
1521
1522* On GNU or Unix system:
1523
1524 '((lps_06b \"lpr\" nil \"-P\" \"lps_06b\")
1525 (lps_07c \"lpr\" nil nil \"lps_07c\")
1526 (lps_08c nil nil nil \"lps_08c\")
1527 )
1528
1529* On Windows system:
1530
1531 '((lps_06a \"print\" nil \"/D:\" \"\\\\\\\\printers\\\\lps_06a\")
1532 (lps_06b \"print\" nil nil \"\\\\\\\\printers\\\\lps_06b\")
1533 (lps_07c \"print\" nil \"\" \"/D:\\\\\\\\printers\\\\lps_07c\")
1534 (lps_08c nil nil nil \"\\\\\\\\printers\\\\lps_08c\")
1535 (LPT1 \"\" nil \"\" \"LPT1:\")
1536 (PRN \"\" nil \"\" \"PRN\")
1537 (standard \"redpr.exe\" nil \"\" \"\")
1538 )"
1539 :type '(repeat
1540 (list
1541 :tag "PostScript Printer"
1542 (symbol :tag "Printer Symbol Name")
1543 (string :tag "Printer Command")
1544 (repeat :tag "Printer Switches"
1545 (sexp :tag "Switch" :value ""))
1546 (choice :menu-tag "Printer Name Switch"
1547 :tag "Printer Name Switch"
1548 (const :tag "None" nil)
1549 string)
1550 (choice :menu-tag "Printer Name"
1551 :tag "Printer Name"
1552 (const :tag "None" nil)
1553 string)
1554 (repeat
1555 :tag "Default Value List"
1556 :inline t
1557 (cons
1558 :tag ""
1559 (choice
1560 :menu-tag "Variable"
1561 :tag "Variable"
1562 (const :tag "Landscape" ps-landscape-mode)
1563 (const :tag "Print Header" ps-print-header)
1564 (const :tag "Print Header Frame" ps-print-header-frame)
1565 (const :tag "Line Number" ps-line-number)
1566 (const :tag "Zebra Stripes" ps-zebra-stripes)
1567 (const :tag "Duplex" ps-spool-duplex)
1568 (const :tag "Tumble" ps-spool-tumble)
1569 (const :tag "Upside-Down" ps-print-upside-down)
1570 (const :tag "PS File Landscape" pr-file-landscape)
1571 (const :tag "PS File Duplex" pr-file-duplex)
1572 (const :tag "PS File Tumble" pr-file-tumble)
1573 (const :tag "Auto Region" pr-auto-region)
1574 (const :tag "Auto Mode" pr-auto-mode)
1575 (const :tag "Ghostscript Device" pr-gs-device)
1576 (const :tag "Ghostscript Resolution" pr-gs-resolution)
1577 (const :tag "inherits-from:" inherits-from:)
1578 (variable :tag "Other"))
1579 (sexp :tag "Value")))
1580 ))
1581 :set 'pr-alist-custom-set
6367b616 1582 :version "20"
2c840b90
KS
1583 :group 'printing)
1584
1585
1586(defcustom pr-temp-dir
0117451d 1587 (pr-dosify-file-name
2c840b90
KS
1588 (if (boundp 'temporary-file-directory)
1589 (symbol-value 'temporary-file-directory)
1590 ;; hacked from `temporary-file-directory' variable in files.el
1591 (file-name-as-directory
1592 (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP")
1593 (cond (ps-windows-system "c:/temp")
1594 ((memq system-type '(vax-vms axp-vms)) "SYS$SCRATCH:")
1595 (t "/tmp")
1596 )))))
6367b616
VJL
1597 "*Specify a directory for temporary files during printing.
1598
1599See also `pr-ps-temp-file' and `pr-file-modes'."
2c840b90 1600 :type '(directory :tag "Temporary Directory")
6367b616 1601 :version "20"
2c840b90
KS
1602 :group 'printing)
1603
1604
1605(defcustom pr-ps-temp-file "prspool.ps"
6367b616
VJL
1606 "*Specify PostScript temporary file name.
1607
1608See also `pr-temp-dir' and `pr-file-modes'."
2c840b90 1609 :type '(file :tag "PostScript Temporary File Name")
6367b616
VJL
1610 :version "20"
1611 :group 'printing)
1612
1613
1614;; It uses 0600 as default instead of (default-file-modes).
1615;; So, by default, only the session owner have permission to deal with files
1616;; generated by `printing'.
1617(defcustom pr-file-modes ?\600
1618 "*Specify the file permission bits for newly created files.
1619
1620It should be an integer; only the low 9 bits are used.
1621
1622See also `pr-temp-dir' and `pr-ps-temp-file'."
1623 :type '(integer :tag "File Permission Bits")
1624 :version "21.3"
2c840b90
KS
1625 :group 'printing)
1626
1627
1628(defcustom pr-gv-command
1629 (if ps-windows-system
1630 "gsview32.exe"
1631 "gv")
449cba44 1632 "*Specify path and name of the gsview/gv utility.
2c840b90
KS
1633
1634See also `pr-path-alist'."
449cba44 1635 :type '(string :tag "Ghostview Utility")
6367b616 1636 :version "20"
2c840b90
KS
1637 :group 'printing)
1638
1639
1640(defcustom pr-gs-command
1641 (if ps-windows-system
1642 "gswin32.exe"
1643 "gs")
449cba44 1644 "*Specify path and name of the ghostscript utility.
2c840b90
KS
1645
1646See also `pr-path-alist'."
449cba44 1647 :type '(string :tag "Ghostscript Utility")
6367b616 1648 :version "20"
2c840b90
KS
1649 :group 'printing)
1650
1651
1652(defcustom pr-gs-switches
1653 (if ps-windows-system
1654 '("-q -dNOPAUSE -Ic:/gs/gs5.50;c:/gs/gs5.50/fonts")
1655 '("-q -dNOPAUSE -I/usr/share/ghostscript/5.10"))
1656 "*Specify ghostscript switches. See the documentation on GS for more info.
1657
1658It's a list of strings, where each string is one or more ghostscript switches.
1659
1660A note on the gs switches:
1661
1662-q quiet
1663-dNOPAUSE don't wait for user intervention
1664-Ic:/gs/gs5.50;c:/gs/gs5.50/fonts the directories needed for gs
1665-c quit it's added at the end to terminate gs
1666
1667To see ghostscript documentation for more information:
1668
1669* On GNU or Unix system:
1670 - for full documentation, type: man gs
1671 - for brief documentation, type: gs -h
1672
1673* On Windows system:
1674 - for full documentation, see in a browser the file
1675 c:/gstools/gs5.50/index.html, that is, the file index.html which is
1676 located in the same directory as gswin32.exe.
1677 - for brief documentation, type: gswin32.exe -h"
1678 :type '(repeat (string :tag "Ghostscript Switch"))
6367b616 1679 :version "20"
2c840b90
KS
1680 :group 'printing)
1681
1682
1683(defcustom pr-gs-device
1684 (if ps-windows-system
1685 "mswinpr2"
1686 "uniprint")
449cba44 1687 "*Specify the ghostscript device switch value (-sDEVICE=).
2c840b90
KS
1688
1689A note on the gs switches:
1690
1691-sDEVICE=djet500 the printer - works with HP DeskJet 540
1692
1693See `pr-gs-switches' for documentation.
1694See also `pr-ps-printer-alist'."
1695 :type '(string :tag "Ghostscript Device")
6367b616 1696 :version "20"
2c840b90
KS
1697 :group 'printing)
1698
1699
1700(defcustom pr-gs-resolution 300
1701 "*Specify ghostscript resolution switch value (-r).
1702
1703A note on the gs switches:
1704
1705-r300 resolution 300x300
1706
1707See `pr-gs-switches' for documentation.
1708See also `pr-ps-printer-alist'."
1709 :type '(integer :tag "Ghostscript Resolution")
6367b616 1710 :version "20"
2c840b90
KS
1711 :group 'printing)
1712
1713
1714(defcustom pr-print-using-ghostscript nil
1715 "*Non-nil means print using ghostscript.
1716
1717This is useful if you don't have a PostScript printer, so you could use the
1718ghostscript to print a PostScript file.
1719
1720In GNU or Unix system, if ghostscript is set as a PostScript filter, this
1721variable should be nil."
1722 :type 'boolean
6367b616 1723 :version "20"
2c840b90
KS
1724 :group 'printing)
1725
1726
1727(defcustom pr-faces-p nil
1728 "*Non-nil means print with face attributes."
1729 :type 'boolean
6367b616 1730 :version "20"
2c840b90
KS
1731 :group 'printing)
1732
1733
1734(defcustom pr-spool-p nil
1735 "*Non-nil means spool printing in a buffer."
1736 :type 'boolean
6367b616 1737 :version "20"
2c840b90
KS
1738 :group 'printing)
1739
1740
1741(defcustom pr-file-landscape nil
1742 "*Non-nil means print PostScript file in landscape orientation."
1743 :type 'boolean
6367b616 1744 :version "20"
2c840b90
KS
1745 :group 'printing)
1746
1747
1748(defcustom pr-file-duplex nil
1749 "*Non-nil means print PostScript file in duplex mode."
1750 :type 'boolean
6367b616 1751 :version "20"
2c840b90
KS
1752 :group 'printing)
1753
1754
1755(defcustom pr-file-tumble nil
1756 "*Non-nil means print PostScript file in tumble mode.
1757
1758If tumble is off, produces a printing suitable for binding on the left or
1759right.
1760If tumble is on, produces a printing suitable for binding at the top or
1761bottom."
1762 :type 'boolean
6367b616 1763 :version "20"
2c840b90
KS
1764 :group 'printing)
1765
1766
1767(defcustom pr-auto-region t
1768 "*Non-nil means region is automagically detected.
1769
1770Note that this will only work if you're using transient mark mode.
1771
1772When this variable is non-nil, the `*-buffer*' commands will behave like
1773`*-region*' commands, that is, `*-buffer*' commands will print only the region
1774marked instead of all buffer."
1775 :type 'boolean
6367b616 1776 :version "20"
2c840b90
KS
1777 :group 'printing)
1778
1779
1780(defcustom pr-auto-mode t
449cba44 1781 "*Non-nil means major-mode specific printing is prefered over normal printing.
2c840b90
KS
1782
1783That is, if current major-mode is declared in `pr-mode-alist', the `*-buffer*'
1784and `*-region*' commands will behave like `*-mode*' commands; otherwise,
1785`*-buffer*' commands will print the current buffer and `*-region*' commands
1786will print the current region."
1787 :type 'boolean
6367b616 1788 :version "20"
2c840b90
KS
1789 :group 'printing)
1790
1791
1792(defcustom pr-mode-alist
1793 '((mh-folder-mode ; mh summary buffer
1794 pr-mh-lpr-1 pr-mh-print-1
1795 2
1796 (ps-article-author ps-article-subject)
1797 ("/pagenumberstring load" pr-article-date)
1798 nil
1799 )
1800 (mh-letter-mode ; mh letter buffer
1801 pr-mh-lpr-2 pr-mh-print-2
1802 2
1803 (ps-article-author ps-article-subject)
1804 ("/pagenumberstring load" pr-article-date)
1805 nil
1806 )
1807 (rmail-summary-mode ; rmail summary buffer
1808 pr-rmail-lpr pr-rmail-print
1809 3
1810 (ps-article-subject ps-article-author buffer-name)
1811 nil
1812 nil
1813 )
1814 (rmail-mode ; rmail buffer
1815 pr-rmail-lpr pr-rmail-print
1816 3
1817 (ps-article-subject ps-article-author buffer-name)
1818 nil
1819 nil
1820 )
1821 (gnus-summary-mode ; gnus summary buffer
1822 pr-gnus-lpr pr-gnus-print
1823 3
1824 (ps-article-subject ps-article-author gnus-newsgroup-name)
1825 nil
1826 nil
1827 )
1828 (gnus-article-mode ; gnus article buffer
1829 pr-gnus-lpr pr-gnus-print
1830 3
1831 (ps-article-subject ps-article-author gnus-newsgroup-name)
1832 nil
1833 nil
1834 )
1835 (Info-mode ; Info buffer
1836 pr-mode-lpr pr-mode-print
1837 2
1838 (ps-info-node ps-info-file)
1839 nil
1840 nil
1841 )
1842 (vm-mode ; vm mode
1843 pr-vm-lpr pr-vm-print
1844 3
1845 (ps-article-subject ps-article-author buffer-name)
1846 nil
1847 nil
1848 )
1849 )
1850 "*Specify an alist for a major-mode and printing functions.
1851
1852To customize a major mode printing, just declare the customization in
1853`pr-mode-alist' and invoke some of `*-mode*' commands. An example for major
1854mode usage is when you're using gnus (or mh, or rmail, etc.) and you're in the
1855*Summary* buffer, if you forget to switch to the *Article* buffer before
1856printing, you'll get a nicely formatted list of article subjects shows up at
1857the printer. With major mode printing you don't need to switch from gnus
1858*Summary* buffer first.
1859
1860The elements have the following form:
1861
1862 (MAJOR-MODE
1863 LPR-PRINT PS-PRINT
1864 HEADER-LINES
1865 LEFT-HEADER
1866 RIGHT-HEADER
1867 KILL-LOCAL-VARIABLE
1868 DEFAULT...)
1869
1870Where:
1871
1872MAJOR-MODE It's the major mode symbol.
1873
1874LPR-PRINT It's a symbol function for text printing. It's invoked with
1875 one argument:
1876 (HEADER-LINES LEFT-HEADER RIGHT-HEADER DEFAULT...).
1877
1878 Usually LPR-PRINT function prepares the environment or buffer
1879 and then call the function `pr-mode-lpr' which it's used to
1880 process the buffer and send it to text printer.
1881
1882 The `pr-mode-lpr' definition is:
1883
1884 (pr-mode-lpr HEADER-LIST &optional FROM TO)
1885
1886 Where HEADER-LIST is like the argument passed to LPR-PRINT.
1887 FROM and TO are the beginning and end markers, respectively,
1888 for a region. If FROM is nil, it's used (point-min); if TO is
1889 nil, it's used (point-max).
1890
1891PS-PRINT It's a symbol function for PostScript printing. It's invoked
1892 with 3 arguments: n-up printing, file name and the list:
1893 (HEADER-LINES LEFT-HEADER RIGHT-HEADER DEFAULT...).
1894
1895 Usually PS-PRINT function prepares the environment or buffer
1896 and then call the function `pr-mode-print' which it's used to
1897 process the buffer and send it to PostScript printer.
1898
1899 The `pr-mode-print' definition is:
1900
1901 (pr-mode-print N-UP FILENAME HEADER-LIST &optional FROM TO)
1902
1903 Where N-UP, FILENAME and HEADER-LIST are like the arguments
1904 passed to PS-PRINT. FROM and TO are the beginning and end
1905 markers, respectively, for a region. If TO is nil, it's used
1906 (point-max).
1907
1908HEADER-LINES It's the number of header lines; if is nil, it uses
1909 `ps-header-lines' value.
1910
1911LEFT-HEADER It's the left header part, it's a list of string, variable
1912 symbol or function symbol (with no argument); if is nil, it
1913 uses `ps-left-header' value.
1914
1915RIGHT-HEADER It's the right header part, it's a list of string, variable
1916 symbol or function symbol (with no argument); if is nil, it
1917 uses `ps-right-header' value.
1918
1919KILL-LOCAL-VARIABLE
1920 Non-nil means to kill all buffer local variable declared in
1921 DEFAULT (see below).
1922
1923DEFAULT It's a way to set default values when this entry is selected.
1924 It's a cons like:
1925
1926 (VARIABLE-SYM . VALUE)
1927
1928 That associates VARIABLE-SYM with VALUE. when this entry is
1929 selected, it's executed the following command:
1930
1931 (set (make-local-variable VARIABLE-SYM) (eval VALUE))
1932
1933 Note that VALUE can be any valid lisp expression. So, don't
1934 forget to quote symbols and constant lists.
1935 If VARIABLE is the special keyword `inherits-from:', VALUE must
1936 be a symbol name setting defined in `pr-setting-database' from
1937 which the current setting inherits the context. Take care with
1938 circular inheritance.
1939 Examples:
1940 '(ps-landscape-mode . nil)
1941 '(ps-spool-duplex . t)
1942 '(pr-gs-device . (my-gs-device t))"
1943 :type '(repeat
1944 (list
1945 :tag ""
1946 (symbol :tag "Major Mode")
1947 (function :tag "Text Printing Function")
1948 (function :tag "PS Printing Function")
1949 (choice :menu-tag "Number of Header Lines"
1950 :tag "Number of Header Lines"
1951 (integer :tag "Number")
1952 (const :tag "Default Number" nil))
1953 (repeat :tag "Left Header List"
1954 (choice :menu-tag "Left Header"
1955 :tag "Left Header"
1956 string symbol))
1957 (repeat :tag "Right Header List"
1958 (choice :menu-tag "Right Header"
1959 :tag "Right Header"
1960 string symbol))
1961 (boolean :tag "Kill Local Variable At End")
1962 (repeat
1963 :tag "Default Value List"
1964 :inline t
1965 (cons
1966 :tag ""
1967 (choice
1968 :menu-tag "Variable"
1969 :tag "Variable"
1970 (const :tag "Landscape" ps-landscape-mode)
1971 (const :tag "Print Header" ps-print-header)
1972 (const :tag "Print Header Frame" ps-print-header-frame)
1973 (const :tag "Line Number" ps-line-number)
1974 (const :tag "Zebra Stripes" ps-zebra-stripes)
1975 (const :tag "Duplex" ps-spool-duplex)
1976 (const :tag "Tumble" ps-spool-tumble)
1977 (const :tag "Upside-Down" ps-print-upside-down)
1978 (const :tag "PS File Landscape" pr-file-landscape)
1979 (const :tag "PS File Duplex" pr-file-duplex)
1980 (const :tag "PS File Tumble" pr-file-tumble)
1981 (const :tag "Auto Region" pr-auto-region)
1982 (const :tag "Auto Mode" pr-auto-mode)
1983 (const :tag "Ghostscript Device" pr-gs-device)
1984 (const :tag "Ghostscript Resolution" pr-gs-resolution)
1985 (const :tag "inherits-from:" inherits-from:)
1986 (variable :tag "Other"))
1987 (sexp :tag "Value")))
1988 ))
6367b616 1989 :version "20"
2c840b90
KS
1990 :group 'printing)
1991
1992
1993(defcustom pr-ps-utility 'mpage
1994 "*Specify PostScript utility symbol.
1995
1996This utility symbol should be defined on `pr-ps-utility-alist' (see it for
1997documentation).
1998
1999This variable should be modified by customization engine. If this variable is
2000modified by other means (for example, a lisp function), use `pr-update-menus'
2001function (see it for documentation) to update PostScript utility menu.
2002
2003NOTE: Don't forget to download and install the utilities declared on
2004 `pr-ps-utility-alist'."
2005 :type '(symbol :tag "PS File Utility")
2006 :set 'pr-ps-utility-custom-set
6367b616 2007 :version "20"
2c840b90
KS
2008 :group 'printing)
2009
2010
2011(defcustom pr-ps-utility-alist
2012 '((mpage "mpage" nil "-b%s" "-%d" "-l" "-t" "-T" ">" nil)
2013 (psnup "psnup" ("-q") "-P%s" "-%d" "-l" nil nil " " nil
2014 (inherits-from: . no-duplex))
2015 )
2016 ;; Examples:
2017 ;; * On GNU or Unix system:
2018 ;; '((mpage "mpage" nil "-b%s" "-%d" "-l" "-t" "-T" ">" nil)
2019 ;; (psnup "psnup" ("-q") "-P%s" "-%d" "-l" nil nil " " nil
2020 ;; (pr-file-duplex . nil) (pr-file-tumble . nil))
2021 ;; )
2022 ;; * On Windows system:
2023 ;; '((psnup "c:/psutils/psnup" ("-q") "-P%s" "-%d" "-l" nil nil " " nil
2024 ;; (pr-file-duplex . nil) (pr-file-tumble . nil))
2025 ;; )
2026 "*Specify an alist for PostScript utility processing (PS utility database).
2027
2028The alist element has the form:
2029
2030 (SYMBOL UTILITY MUST-SWITCHES PAPERSIZE N-UP LANDSCAPE DUPLEX TUMBLE OUTPUT
2031 SWITCHES DEFAULT...)
2032
2033Where:
2034
2035SYMBOL It's a symbol to identify a PostScript utility. It's for
2036 `pr-ps-utility' variable setting and for menu selection.
2037 Examples:
2038 'mpage
2039 'psnup
2040
2041UTILITY Name of utility for processing a PostScript file.
2042 See also `pr-path-alist'.
2043 Examples:
2044 . for GNU or Unix system:
2045 \"mpage\"
2046 \"psnup -q\"
2047
2048 . for Windows system:
2049 \"c:/psutils/psnup -q\"
2050
449cba44 2051MUST-SWITCHES List of sexp's to pass as options to the PostScript utility
2c840b90 2052 program. These options are necessary to process the utility
449cba44 2053 program and must be placed before any other switches.
2c840b90
KS
2054 Example:
2055 . for psnup:
2056 '(\"-q\")
2057
2058PAPERSIZE It's a format string to specify paper size switch.
2059 Example:
2060 . for mpage
2061 \"-b%s\"
2062
2063N-UP It's a format string to specify n-up switch.
2064 Example:
2065 . for psnup
2066 \"-%d\"
2067
2068LANDSCAPE It's a string to specify landscape switch. If the utility
2069 doesn't have landscape switch, set to nil.
2070 Example:
2071 . for psnup
2072 \"-l\"
2073
2074DUPLEX It's a string to specify duplex switch. If the utility doesn't
2075 have duplex switch, set to nil.
2076 Example:
2077 . for psnup
2078 nil
2079
2080TUMBLE It's a string to specify tumble switch. If the utility doesn't
2081 have tumble switch, set to nil.
2082 Example:
2083 . for psnup
2084 nil
2085
2086OUTPUT It's a string to specify how to generate an output file. Some
2087 utilities accept an output file option, but some others need
2088 output redirection or some other way to specify an output file.
2089 Example:
2090 . for psnup
2091 \" \" ; psnup ... input output
2092
2093 . for mpage
2094 \">\" ; mpage ... input > output
2095
449cba44 2096SWITCHES List of sexp's to pass as extra options to the PostScript utility
2c840b90
KS
2097 program.
2098 Example:
2099 . for psnup
2100 '(\"-q\")
2101 nil
2102
2103DEFAULT It's a way to set default values when this entry is selected.
2104 It's a cons like:
2105
2106 (VARIABLE . VALUE)
2107
2108 That associates VARIABLE with VALUE. when this entry is
2109 selected, it's executed the following command:
2110
2111 (set VARIABLE (eval VALUE))
2112
2113 Note that VALUE can be any valid lisp expression. So, don't
2114 forget to quote symbols and constant lists.
2115 If VARIABLE is the special keyword `inherits-from:', VALUE must
2116 be a symbol name setting defined in `pr-setting-database' from
2117 which the current setting inherits the context. Take care with
2118 circular inheritance.
2119 Examples:
2120 '(pr-file-landscape . nil)
2121 '(pr-file-duplex . t)
2122 '(pr-gs-device . (my-gs-device t))
2123
2124This variable should be modified by customization engine. If this variable is
2125modified by other means (for example, a lisp function), use `pr-update-menus'
2126function (see it for documentation) to update PostScript utility menu.
2127
2128NOTE: Don't forget to download and install the utilities declared on
2129 `pr-ps-utility-alist'.
2130
2131Examples:
2132
2133* On GNU or Unix system:
2134
2135 '((mpage \"mpage\" nil \"-b%s\" \"-%d\" \"-l\" \"-t\" \"-T\" \">\" nil)
2136 (psnup \"psnup\" (\"-q\") \"-P%s\" \"-%d\" \"-l\" nil nil \" \" nil
2137 (pr-file-duplex . nil) (pr-file-tumble . nil))
2138 )
2139
2140* On Windows system:
2141
2142 '((psnup \"c:/psutils/psnup\" (\"-q\") \"-P%s\" \"-%d\" \"-l\" nil nil \" \"
2143 nil (pr-file-duplex . nil) (pr-file-tumble . nil))
2144 )"
2145 :type '(repeat
2146 (list :tag "PS File Utility"
2147 (symbol :tag "Utility Symbol")
2148 (string :tag "Utility Name")
2149 (repeat :tag "Must Utility Switches"
2150 (sexp :tag "Switch" :value ""))
2151 (choice :menu-tag "Paper Size"
2152 :tag "Paper Size"
2153 (const :tag "No Paper Size" nil)
2154 (string :tag "Paper Size Format"))
2155 (choice :menu-tag "N-Up"
2156 :tag "N-Up"
2157 (const :tag "No N-Up" nil)
2158 (string :tag "N-Up Format"))
2159 (choice :menu-tag "Landscape"
2160 :tag "Landscape"
2161 (const :tag "No Landscape" nil)
2162 (string :tag "Landscape Switch"))
2163 (choice :menu-tag "Duplex"
2164 :tag "Duplex"
2165 (const :tag "No Duplex" nil)
2166 (string :tag "Duplex Switch"))
2167 (choice :menu-tag "Tumble"
2168 :tag "Tumble"
2169 (const :tag "No Tumble" nil)
2170 (string :tag "Tumble Switch"))
2171 (string :tag "Output Separator")
2172 (repeat :tag "Utility Switches"
2173 (sexp :tag "Switch" :value ""))
2174 (repeat
2175 :tag "Default Value List"
2176 :inline t
2177 (cons
2178 :tag ""
2179 (choice
2180 :menu-tag "Variable"
2181 :tag "Variable"
2182 (const :tag "PS File Landscape" pr-file-landscape)
2183 (const :tag "PS File Duplex" pr-file-duplex)
2184 (const :tag "PS File Tumble" pr-file-tumble)
2185 (const :tag "Ghostscript Device" pr-gs-device)
2186 (const :tag "Ghostscript Resolution" pr-gs-resolution)
2187 (const :tag "inherits-from:" inherits-from:)
2188 (variable :tag "Other"))
2189 (sexp :tag "Value")))
2190 ))
2191 :set 'pr-alist-custom-set
6367b616 2192 :version "20"
2c840b90
KS
2193 :group 'printing)
2194
2195
2196(defcustom pr-menu-lock t
2197 "*Non-nil means menu is locked while selecting toggle options.
2198
2199See also `pr-menu-char-height' and `pr-menu-char-width'."
2200 :type 'boolean
6367b616 2201 :version "20"
2c840b90
KS
2202 :group 'printing)
2203
2204
2205(defcustom pr-menu-char-height
2206 (cond ((eq ps-print-emacs-type 'emacs) ; GNU Emacs
2207 (pr-e-frame-char-height))
2208 ((eq ps-print-emacs-type 'xemacs) ; XEmacs
2209 (pr-x-font-height (face-font 'default))))
2210 "*Specify menu char height in pixels.
2211
2212This variable is used to guess which vertical position should be locked the
2213menu, so don't forget to adjust it if menu position is not ok.
2214
2215See also `pr-menu-lock' and `pr-menu-char-width'."
2216 :type 'integer
6367b616 2217 :version "20"
2c840b90
KS
2218 :group 'printing)
2219
2220
2221(defcustom pr-menu-char-width
2222 (cond ((eq ps-print-emacs-type 'emacs) ; GNU Emacs
2223 (pr-e-frame-char-width))
2224 ((eq ps-print-emacs-type 'xemacs) ; XEmacs
2225 (pr-x-font-width (face-font 'default))))
2226 "*Specify menu char width in pixels.
2227
2228This variable is used to guess which horizontal position should be locked the
2229menu, so don't forget to adjust it if menu position is not ok.
2230
2231See also `pr-menu-lock' and `pr-menu-char-height'."
2232 :type 'integer
6367b616 2233 :version "20"
2c840b90
KS
2234 :group 'printing)
2235
2236
2237(defcustom pr-setting-database
2238 '((no-duplex ; setting symbol name
2239 nil nil nil ; inherits local kill-local
2240 (pr-file-duplex . nil) ; settings
2241 (pr-file-tumble . nil))
2242 )
2243 "*Specify an alist for settings in general.
2244
2245The elements have the following form:
2246
2247 (SYMBOL INHERITS LOCAL KILL-LOCAL SETTING...)
2248
2249Where:
2250
2251SYMBOL It's a symbol to identify the setting group.
2252
2253INHERITS Specify the inheritance for SYMBOL group. It's a symbol name
2254 setting from which the current setting inherits the context.
2255 If INHERITS is nil, means that there is no inheritance.
2256 This is a simple inheritance mechanism.
2257
2258 Let's see an example to illustrate the inheritance mechanism:
2259
2260 (setq pr-setting-database
2261 '((no-duplex ; setting symbol name
2262 nil ; inherits
2263 nil nil ; local kill-local
2264 (pr-file-duplex . nil) ; settings
2265 (pr-file-tumble . nil)
2266 )
2267 (no-duplex-and-landscape ; setting symbol name
2268 no-duplex ; inherits
2269 nil nil ; local kill-local
2270 (pr-file-landscape . nil) ; settings
2271 )))
2272
2273 The example above has two setting groups: no-duplex and
2274 no-duplex-and-landscape. When setting no-duplex is activated
2275 through `inherits-from:' (see `pr-ps-utility', `pr-mode-alist'
2276 and `pr-ps-printer-alist'), the variables pr-file-duplex and
2277 pr-file-tumble are both set to nil.
2278
2279 Now when setting no-duplex-and-landscape is activated through
2280 `inherits-from:', the variable pr-file-landscape is set to nil
2281 and also the settings for no-duplex are done, because
2282 no-duplex-and-landscape inherits settings from no-duplex.
2283
2284 Take care with circular inheritance. It's an error if circular
2285 inheritance happens.
2286
2287LOCAL Non-nil means that all settings for SYMBOL group will be
2288 declared local buffer.
2289
2290KILL-LOCAL Non-nil means that all settings for SYMBOL group will be
2291 killed at end. It has effect only when LOCAL is non-nil.
2292
2293SETTING It's a cons like:
2294
2295 (VARIABLE . VALUE)
2296
2297 That associates VARIABLE with VALUE. when this entry is
2298 selected, it's executed the following command:
2299
2300 * If LOCAL is non-nil:
2301 (set (make-local-variable VARIABLE) (eval VALUE))
2302
2303 * If LOCAL is nil:
2304 (set VARIABLE (eval VALUE))
2305
2306 Note that VALUE can be any valid lisp expression. So, don't
2307 forget to quote symbols and constant lists.
2308 This setting is ignored if VARIABLE is equal to keyword
2309 `inherits-from:'.
2310 Examples:
2311 '(ps-landscape-mode . nil)
2312 '(ps-spool-duplex . t)
2313 '(pr-gs-device . (my-gs-device t))"
2314 :type '(repeat
2315 (list
2316 :tag ""
2317 (symbol :tag "Setting Name")
2318 (choice :menu-tag "Inheritance"
2319 :tag "Inheritance"
2320 (const :tag "No Inheritance" nil)
2321 (symbol :tag "Inherits From"))
2322 (boolean :tag "Local Buffer Setting")
2323 (boolean :tag "Kill Local Variable At End")
2324 (repeat
2325 :tag "Setting List"
2326 :inline t
2327 (cons
2328 :tag ""
2329 (choice
2330 :menu-tag "Variable"
2331 :tag "Variable"
2332 (const :tag "Landscape" ps-landscape-mode)
2333 (const :tag "Print Header" ps-print-header)
2334 (const :tag "Print Header Frame" ps-print-header-frame)
2335 (const :tag "Line Number" ps-line-number)
2336 (const :tag "Zebra Stripes" ps-zebra-stripes)
2337 (const :tag "Duplex" ps-spool-duplex)
2338 (const :tag "Tumble" ps-spool-tumble)
2339 (const :tag "Upside-Down" ps-print-upside-down)
2340 (const :tag "PS File Landscape" pr-file-landscape)
2341 (const :tag "PS File Duplex" pr-file-duplex)
2342 (const :tag "PS File Tumble" pr-file-tumble)
2343 (const :tag "Auto Region" pr-auto-region)
2344 (const :tag "Auto Mode" pr-auto-mode)
2345 (const :tag "Ghostscript Device" pr-gs-device)
2346 (const :tag "Ghostscript Resolution" pr-gs-resolution)
2347 (variable :tag "Other"))
2348 (sexp :tag "Value")))
2349 ))
6367b616 2350 :version "20"
2c840b90
KS
2351 :group 'printing)
2352
2353
2354(defcustom pr-visible-entry-list
2355 '(postscript text postscript-options postscript-process printing help)
2356 "*Specify a list of Printing menu visible entries.
2357
2358Valid values with the corresponding menu parts are:
2359
2360 +------------------------------+
2361 | Printing Interface |
2362 +------------------------------+
2363 `postscript' | PostScript Preview >|
2364 | PostScript Print >|
2365 | PostScript Printer: name >|
2366 +------------------------------+
2367 `text' | Printify >|
2368 | Print >|
2369 | Text Printer: name >|
2370 +------------------------------+
2371 `postscript-options' |[ ] Landscape |
2372 |[ ] Print Header |
2373 |[ ] Print Header Frame |
2374 |[ ] Line Number |
2375 |[ ] Zebra Stripes |
2376 |[ ] Duplex |
2377 |[ ] Tumble |
2378 |[ ] Upside-Down |
2379 | Print All Pages >|
2380 +------------------------------+
2381 `postscript-process' |[ ] Spool Buffer |
449cba44
VJL
2382 |[ ] Print with faces |
2383 |[ ] Print via Ghostscript |
2c840b90
KS
2384 +------------------------------+
2385 `printing' |[ ] Auto Region |
2386 |[ ] Auto Mode |
2387 |[ ] Menu Lock |
2388 +------------------------------+
2389 `help' | Customize >|
2390 | Show Settings >|
2391 | Help |
2392 +------------------------------+
2393
2394Any other value is ignored."
2395 :type '(repeat :tag "Menu Visible Part"
2396 (choice :menu-tag "Menu Part"
2397 :tag "Menu Part"
2398 (const postscript)
2399 (const text)
2400 (const postscript-options)
2401 (const postscript-process)
2402 (const printing)
2403 (const help)))
6367b616 2404 :version "20"
2c840b90
KS
2405 :group 'printing)
2406
2407
2408(defcustom pr-delete-temp-file t
2409 "*Non-nil means delete temporary files.
2410
2411Set `pr-delete-temp-file' to nil, if the following message (or a similar)
2412happens when printing:
2413
2414 Error: could not open \"c:\\temp\\prspool.ps\" for reading."
2415 :type 'boolean
6367b616 2416 :version "20"
2c840b90
KS
2417 :group 'printing)
2418
2419
2420(defcustom pr-list-directory nil
2421 "*Non-nil means list directory when processing a directory.
2422
2423That is, any subdirectories (and the superdirectory) of the directory (given as
2424argument of functions below) are also printed (as dired-mode listings).
2425
2426It's used by `pr-ps-directory-preview', `pr-ps-directory-using-ghostscript',
2427`pr-ps-directory-print', `pr-ps-directory-ps-print', `pr-printify-directory'
2428and `pr-txt-directory'."
2429 :type 'boolean
6367b616 2430 :version "20"
2c840b90
KS
2431 :group 'printing)
2432
2433
2434(defcustom pr-buffer-name "*Printing Interface*"
2435 "*Specify the name of the buffer interface for printing package.
2436
2437It's used by `pr-interface'."
2438 :type 'string
6367b616 2439 :version "20"
2c840b90
KS
2440 :group 'printing)
2441
2442
2443(defcustom pr-buffer-name-ignore
2444 (list (regexp-quote pr-buffer-name) ; ignore printing interface buffer
2445 "^ .*$") ; ignore invisible buffers
2446 "*Specify a regexp list for buffer names to be ignored in interface buffer.
2447
2448NOTE: Case is important for matching, that is, `case-fold-search' is always
2449 nil.
2450
2451It's used by `pr-interface'."
2452 :type '(repeat (regexp :tag "Buffer Name Regexp"))
6367b616 2453 :version "20"
2c840b90
KS
2454 :group 'printing)
2455
2456
2457(defcustom pr-buffer-verbose t
2458 "*Non-nil means to be verbose when editing a field in interface buffer.
2459
2460It's used by `pr-interface'."
2461 :type 'boolean
6367b616 2462 :version "20"
2c840b90
KS
2463 :group 'printing)
2464
2465
2c840b90
KS
2466;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2467;; Internal Variables
2468
2469
2470(defvar pr-txt-command nil
2471 "Name of program for printing a text file.
2472See `pr-txt-printer-alist'.")
2473
2474
2475(defvar pr-txt-switches nil
449cba44 2476 "List of sexp's to pass as extra options to the text printer program.
2c840b90
KS
2477See `pr-txt-printer-alist'.")
2478
2479
2480(defvar pr-txt-printer nil
2481 "Specify text printer name.
2482See `pr-txt-printer-alist'.")
2483
2484
2485(defvar pr-ps-command nil
2486 "Name of program for printing a PostScript file.
2487See `pr-ps-printer-alist'.")
2488
2489
2490(defvar pr-ps-switches nil
449cba44 2491 "List of sexp's to pass as extra options to the PostScript printer program.
2c840b90
KS
2492See `pr-ps-printer-alist'.")
2493
2494
2495(defvar pr-ps-printer-switch nil
2496 "Specify PostScript printer name switch.
2497See `pr-ps-printer-alist'.")
2498
2499
2500(defvar pr-ps-printer nil
2501 "Specify PostScript printer name.
2502See `pr-ps-printer-alist'.")
2503
2504
2505(defvar pr-menu-bar nil
2506 "Specify Printing menu-bar entry.")
2507
2508
6367b616
VJL
2509;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2510;; Macros
2511
2512
2513(defvar pr-interactive-p nil
2514 "Save the `interactive-p' result value.
2515
2516It's used by `pr-save-interactive' (which see).")
2517
2518
2519(defmacro pr-save-interactive (&rest body)
2520 "Save the `interactive-p' result value using `let'.
2521
2522It uses `pr-interactive-p' var (which see)."
2523 `(let ((pr-interactive-p (or pr-interactive-p (interactive-p))))
2524 ,@body))
2525
2526
2527(defmacro pr-save-file-modes (&rest body)
2528 "Set temporally file modes to `pr-file-modes'."
2529 `(let ((pr--default-file-modes (default-file-modes))) ; save default
2530 (set-default-file-modes pr-file-modes)
2531 ,@body
2532 (set-default-file-modes pr--default-file-modes))) ; restore default
2533
2534
2c840b90
KS
2535;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2536;; Keys & Menus
2537
2538
2539(defmacro pr-xemacs-global-menubar (&rest body)
2540 `(save-excursion
2541 (let ((temp (get-buffer-create (make-temp-name " *Temp"))))
2542 ;; be sure to access global menubar
2543 (set-buffer temp)
2544 ,@body
2545 (kill-buffer temp))))
2546
2c840b90
KS
2547
2548(defsubst pr-visible-p (key)
2549 (memq key pr-visible-entry-list))
2550
2551
2552(defsubst pr-mode-alist-p ()
2553 (cdr (assq major-mode pr-mode-alist)))
2554
2555
2556(defsubst pr-auto-mode-p ()
2557 (and pr-auto-mode (pr-mode-alist-p)))
2558
2559
2560(defsubst pr-using-ghostscript-p ()
2561 (and pr-print-using-ghostscript (not pr-spool-p)))
2562
2563
2564(eval-and-compile
526335b4 2565 (defun pr-get-symbol (name)
e22c7647 2566 (easy-menu-intern name))
526335b4 2567
2c840b90
KS
2568 (cond
2569 ((eq ps-print-emacs-type 'emacs) ; GNU Emacs
e22c7647 2570 (defun pr-region-active-p ()
2c840b90
KS
2571 (and pr-auto-region transient-mark-mode mark-active)))
2572
2573 ((eq ps-print-emacs-type 'xemacs) ; XEmacs
45f17557 2574 (defvar zmacs-region-stays nil) ; to avoid compilation gripes
e22c7647 2575 (defun pr-region-active-p ()
2c840b90
KS
2576 (and pr-auto-region (not zmacs-region-stays) (ps-mark-active-p)))))
2577
2578
2579 (defconst pr-menu-spec
6367b616
VJL
2580 ;; Menu mapping:
2581 ;; unfortunately XEmacs doesn't support :active or :visible
2582 ;; for submenus, only for items.
2583 ;; It uses :included instead of :active or :visible.
2584 ;; Also, XEmacs doesn't support :help tag.
2585 (let ((pr-:active (if (eq ps-print-emacs-type 'emacs)
2586 :active ; GNU Emacs
2587 :included)) ; XEmacs
2588 (pr-:visible (if (eq ps-print-emacs-type 'emacs)
2589 :visible ; GNU Emacs
2590 :included)) ; XEmacs
2591 pr-:help)
2592 (if (eq ps-print-emacs-type 'emacs)
2593 (defalias 'pr-:help #'(lambda (text) (list :help text))) ; GNU Emacs
2594 (defalias 'pr-:help 'ignore)) ; XEmacs
2595 `(
2c840b90 2596 ["Printing Interface" pr-interface
6367b616 2597 ,@(pr-:help "Use buffer interface instead of menu interface")]
2c840b90 2598 "--"
6367b616
VJL
2599 ("PostScript Preview" ,pr-:visible (pr-visible-p 'postscript)
2600 ,@(pr-:help "Preview PostScript instead of sending to printer")
2601 ("Directory" ,pr-:active (not pr-spool-p)
2c840b90
KS
2602 ["1-up" (pr-ps-directory-preview 1 nil nil t) t]
2603 ["2-up" (pr-ps-directory-preview 2 nil nil t) t]
2604 ["4-up" (pr-ps-directory-preview 4 nil nil t) t]
2605 ["Other..." (pr-ps-directory-preview nil nil nil t)
2606 :keys "\\[pr-ps-buffer-preview]"])
6367b616 2607 ("Buffer" ,pr-:active (not pr-spool-p)
2c840b90
KS
2608 ["1-up" (pr-ps-buffer-preview 1 t) t]
2609 ["2-up" (pr-ps-buffer-preview 2 t) t]
2610 ["4-up" (pr-ps-buffer-preview 4 t) t]
2611 ["Other..." (pr-ps-buffer-preview nil t)
2612 :keys "\\[pr-ps-buffer-preview]"])
6367b616 2613 ("Region" ,pr-:active (and (not pr-spool-p) (ps-mark-active-p))
2c840b90
KS
2614 ["1-up" (pr-ps-region-preview 1 t) t]
2615 ["2-up" (pr-ps-region-preview 2 t) t]
2616 ["4-up" (pr-ps-region-preview 4 t) t]
2617 ["Other..." (pr-ps-region-preview nil t)
2618 :keys "\\[pr-ps-region-preview]"])
6367b616 2619 ("Mode" ,pr-:active (and (not pr-spool-p) (pr-mode-alist-p))
2c840b90
KS
2620 ["1-up" (pr-ps-mode-preview 1 t) t]
2621 ["2-up" (pr-ps-mode-preview 2 t) t]
2622 ["4-up" (pr-ps-mode-preview 4 t) t]
2623 ["Other..." (pr-ps-mode-preview nil t)
2624 :keys "\\[pr-ps-mode-preview]"])
2625 ("File"
b8d955f4 2626 ["No Preprocessing..." (call-interactively 'pr-ps-file-preview)
2c840b90 2627 :keys "\\[pr-ps-file-preview]"
6367b616 2628 ,@(pr-:help "Preview PostScript file")]
2c840b90
KS
2629 "--"
2630 ["PostScript Utility" pr-update-menus :active pr-ps-utility-alist
6367b616 2631 ,@(pr-:help "Select PostScript utility")]
2c840b90
KS
2632 "--"
2633 ["1-up..." (pr-ps-file-up-preview 1 t t) pr-ps-utility-alist]
2634 ["2-up..." (pr-ps-file-up-preview 2 t t) pr-ps-utility-alist]
2635 ["4-up..." (pr-ps-file-up-preview 4 t t) pr-ps-utility-alist]
2636 ["Other..." (pr-ps-file-up-preview nil t t)
2637 :keys "\\[pr-ps-file-up-preview]" :active pr-ps-utility-alist]
2638 "--"
2639 ["Landscape" pr-toggle-file-landscape
2640 :style toggle :selected pr-file-landscape
6367b616 2641 ,@(pr-:help "Toggle landscape for PostScript file")
2c840b90
KS
2642 :active pr-ps-utility-alist]
2643 ["Duplex" pr-toggle-file-duplex
2644 :style toggle :selected pr-file-duplex
6367b616 2645 ,@(pr-:help "Toggle duplex for PostScript file")
2c840b90
KS
2646 :active pr-ps-utility-alist]
2647 ["Tumble" pr-toggle-file-tumble
2648 :style toggle :selected pr-file-tumble
6367b616 2649 ,@(pr-:help "Toggle tumble for PostScript file")
2c840b90
KS
2650 :active (and pr-file-duplex pr-ps-utility-alist)])
2651 ["Despool..." (call-interactively 'pr-despool-preview)
2652 :active pr-spool-p :keys "\\[pr-despool-preview]"
6367b616
VJL
2653 ,@(pr-:help "Despool PostScript buffer to printer or file (C-u)")])
2654 ("PostScript Print" ,pr-:visible (pr-visible-p 'postscript)
2655 ,@(pr-:help "Send PostScript to printer or file (C-u)")
2c840b90
KS
2656 ("Directory"
2657 ["1-up" (pr-ps-directory-ps-print 1 nil nil t) t]
2658 ["2-up" (pr-ps-directory-ps-print 2 nil nil t) t]
2659 ["4-up" (pr-ps-directory-ps-print 4 nil nil t) t]
2660 ["Other..." (pr-ps-directory-ps-print nil nil nil t)
2661 :keys "\\[pr-ps-buffer-ps-print]"])
2662 ("Buffer"
2663 ["1-up" (pr-ps-buffer-ps-print 1 t) t]
2664 ["2-up" (pr-ps-buffer-ps-print 2 t) t]
2665 ["4-up" (pr-ps-buffer-ps-print 4 t) t]
2666 ["Other..." (pr-ps-buffer-ps-print nil t)
2667 :keys "\\[pr-ps-buffer-ps-print]"])
6367b616 2668 ("Region" ,pr-:active (ps-mark-active-p)
2c840b90
KS
2669 ["1-up" (pr-ps-region-ps-print 1 t) t]
2670 ["2-up" (pr-ps-region-ps-print 2 t) t]
2671 ["4-up" (pr-ps-region-ps-print 4 t) t]
2672 ["Other..." (pr-ps-region-ps-print nil t)
2673 :keys "\\[pr-ps-region-ps-print]"])
6367b616 2674 ("Mode" ,pr-:active (pr-mode-alist-p)
2c840b90
KS
2675 ["1-up" (pr-ps-mode-ps-print 1 t) t]
2676 ["2-up" (pr-ps-mode-ps-print 2 t) t]
2677 ["4-up" (pr-ps-mode-ps-print 4 t) t]
2678 ["Other..." (pr-ps-mode-ps-print nil t)
2679 :keys "\\[pr-ps-mode-ps-print]"])
2680 ("File"
b8d955f4 2681 ["No Preprocessing..." (call-interactively 'pr-ps-file-ps-print)
2c840b90 2682 :keys "\\[pr-ps-file-ps-print]"
6367b616 2683 ,@(pr-:help "Send PostScript file to printer")]
2c840b90
KS
2684 "--"
2685 ["PostScript Utility" pr-update-menus :active pr-ps-utility-alist
6367b616 2686 ,@(pr-:help "Select PostScript utility")]
2c840b90
KS
2687 "--"
2688 ["1-up..." (pr-ps-file-up-ps-print 1 t t) pr-ps-utility-alist]
2689 ["2-up..." (pr-ps-file-up-ps-print 2 t t) pr-ps-utility-alist]
2690 ["4-up..." (pr-ps-file-up-ps-print 4 t t) pr-ps-utility-alist]
2691 ["Other..." (pr-ps-file-up-ps-print nil t t)
2692 :keys "\\[pr-ps-file-up-ps-print]" :active pr-ps-utility-alist]
2693 "--"
2694 ["Landscape" pr-toggle-file-landscape
2695 :style toggle :selected pr-file-landscape
6367b616 2696 ,@(pr-:help "Toggle landscape for PostScript file")
2c840b90
KS
2697 :active pr-ps-utility-alist]
2698 ["Duplex" pr-toggle-file-duplex
2699 :style toggle :selected pr-file-duplex
6367b616 2700 ,@(pr-:help "Toggle duplex for PostScript file")
2c840b90
KS
2701 :active pr-ps-utility-alist]
2702 ["Tumble" pr-toggle-file-tumble
2703 :style toggle :selected pr-file-tumble
6367b616 2704 ,@(pr-:help "Toggle tumble for PostScript file")
2c840b90
KS
2705 :active (and pr-file-duplex pr-ps-utility-alist)])
2706 ["Despool..." (call-interactively 'pr-despool-ps-print)
2707 :active pr-spool-p :keys "\\[pr-despool-ps-print]"
6367b616 2708 ,@(pr-:help "Despool PostScript buffer to printer or file (C-u)")])
2c840b90
KS
2709 ["PostScript Printers" pr-update-menus
2710 :active pr-ps-printer-alist :included (pr-visible-p 'postscript)
6367b616 2711 ,@(pr-:help "Select PostScript printer")]
2c840b90 2712 "--"
6367b616
VJL
2713 ("Printify" ,pr-:visible (pr-visible-p 'text)
2714 ,@(pr-:help
2715 "Replace non-printing chars with printable representations.")
2c840b90
KS
2716 ["Directory" pr-printify-directory t]
2717 ["Buffer" pr-printify-buffer t]
2718 ["Region" pr-printify-region (ps-mark-active-p)])
6367b616
VJL
2719 ("Print" ,pr-:visible (pr-visible-p 'text)
2720 ,@(pr-:help "Send text to printer")
2c840b90
KS
2721 ["Directory" pr-txt-directory t]
2722 ["Buffer" pr-txt-buffer t]
2723 ["Region" pr-txt-region (ps-mark-active-p)]
2724 ["Mode" pr-txt-mode (pr-mode-alist-p)])
2725 ["Text Printers" pr-update-menus
2726 :active pr-txt-printer-alist :included (pr-visible-p 'text)
6367b616 2727 ,@(pr-:help "Select text printer")]
2c840b90
KS
2728 "--"
2729 ["Landscape" pr-toggle-landscape
2730 :style toggle :selected ps-landscape-mode
2731 :included (pr-visible-p 'postscript-options)]
2732 ["Print Header" pr-toggle-header
2733 :style toggle :selected ps-print-header
2734 :included (pr-visible-p 'postscript-options)]
2735 ["Print Header Frame" pr-toggle-header-frame
2736 :style toggle :selected ps-print-header-frame :active ps-print-header
2737 :included (pr-visible-p 'postscript-options)]
2738 ["Line Number" pr-toggle-line
2739 :style toggle :selected ps-line-number
2740 :included (pr-visible-p 'postscript-options)]
2741 ["Zebra Stripes" pr-toggle-zebra
2742 :style toggle :selected ps-zebra-stripes
2743 :included (pr-visible-p 'postscript-options)]
2744 ["Duplex" pr-toggle-duplex
2745 :style toggle :selected ps-spool-duplex
2746 :included (pr-visible-p 'postscript-options)]
2747 ["Tumble" pr-toggle-tumble
2748 :style toggle :selected ps-spool-tumble :active ps-spool-duplex
2749 :included (pr-visible-p 'postscript-options)]
2750 ["Upside-Down" pr-toggle-upside-down
2751 :style toggle :selected ps-print-upside-down
2752 :included (pr-visible-p 'postscript-options)]
6367b616
VJL
2753 ("Print All Pages" ,pr-:visible (pr-visible-p 'postscript-options)
2754 ,@(pr-:help "Select odd/even pages/sheets to print")
2c840b90
KS
2755 ["All Pages" (pr-even-or-odd-pages nil)
2756 :style radio :selected (eq ps-even-or-odd-pages nil)]
2757 ["Even Pages" (pr-even-or-odd-pages 'even-page)
2758 :style radio :selected (eq ps-even-or-odd-pages 'even-page)]
2759 ["Odd Pages" (pr-even-or-odd-pages 'odd-page)
2760 :style radio :selected (eq ps-even-or-odd-pages 'odd-page)]
2761 ["Even Sheets" (pr-even-or-odd-pages 'even-sheet)
2762 :style radio :selected (eq ps-even-or-odd-pages 'even-sheet)]
2763 ["Odd Sheets" (pr-even-or-odd-pages 'odd-sheet)
2764 :style radio :selected (eq ps-even-or-odd-pages 'odd-sheet)])
2765 "--"
2766 ["Spool Buffer" pr-toggle-spool
2767 :style toggle :selected pr-spool-p
2768 :included (pr-visible-p 'postscript-process)
6367b616 2769 ,@(pr-:help "Toggle PostScript spooling")]
449cba44 2770 ["Print with faces" pr-toggle-faces
2c840b90
KS
2771 :style toggle :selected pr-faces-p
2772 :included (pr-visible-p 'postscript-process)
6367b616 2773 ,@(pr-:help "Toggle PostScript printing with faces")]
449cba44 2774 ["Print via Ghostscript" pr-toggle-ghostscript
2c840b90
KS
2775 :style toggle :selected pr-print-using-ghostscript
2776 :included (pr-visible-p 'postscript-process)
6367b616 2777 ,@(pr-:help "Toggle PostScript generation using ghostscript")]
2c840b90
KS
2778 "--"
2779 ["Auto Region" pr-toggle-region
2780 :style toggle :selected pr-auto-region
2781 :included (pr-visible-p 'printing)]
2782 ["Auto Mode" pr-toggle-mode
2783 :style toggle :selected pr-auto-mode
2784 :included (pr-visible-p 'printing)]
2785 ["Menu Lock" pr-toggle-lock
2786 :style toggle :selected pr-menu-lock
2787 :included (pr-visible-p 'printing)]
2788 "--"
6367b616 2789 ("Customize" ,pr-:visible (pr-visible-p 'help)
2c840b90
KS
2790 ["printing" pr-customize t]
2791 ["ps-print" ps-print-customize t]
2792 ["lpr" lpr-customize t])
6367b616 2793 ("Show Settings" ,pr-:visible (pr-visible-p 'help)
2c840b90
KS
2794 ["printing" pr-show-pr-setup t]
2795 ["ps-print" pr-show-ps-setup t]
2796 ["lpr" pr-show-lpr-setup t])
2797 ["Help" pr-help :active t :included (pr-visible-p 'help)]
6367b616 2798 )))
2c840b90
KS
2799
2800
2801 (cond
2802 ((eq ps-print-emacs-type 'emacs) ; GNU Emacs
2803 ;; Menu binding
2804 (require 'easymenu)
2805 ;; Replace existing "print" item by "Printing" item.
2806 ;; If you're changing this file, you'll load it a second,
2807 ;; third... time, but "print" item exists only in the first load.
2808 (defvar pr-menu-print-item "print")
2809 (cond
2810 ;; Emacs 20
2811 ((string< emacs-version "21.")
2812 (easy-menu-change '("tools") "Printing" pr-menu-spec pr-menu-print-item)
2813 (when pr-menu-print-item
2814 (easy-menu-remove-item nil '("tools") pr-menu-print-item)
2815 (setq pr-menu-print-item nil
2816 pr-menu-bar (vector 'menu-bar 'tools
2817 (pr-get-symbol "Printing")))))
2818 ;; Emacs 21
2819 (pr-menu-print-item
e22c7647 2820 (easy-menu-change '("file") "Print" pr-menu-spec "print-buffer")
2c840b90
KS
2821 (let ((items '("print-buffer" "print-region"
2822 "ps-print-buffer-faces" "ps-print-region-faces"
2823 "ps-print-buffer" "ps-print-region")))
2824 (while items
e22c7647 2825 (easy-menu-remove-item nil '("file") (car items))
2c840b90
KS
2826 (setq items (cdr items)))
2827 (setq pr-menu-print-item nil
e22c7647 2828 pr-menu-bar (vector 'menu-bar 'file
2c840b90
KS
2829 (pr-get-symbol "Print")))))
2830 (t
6367b616 2831 (easy-menu-change '("file") "Print" pr-menu-spec))))
2c840b90
KS
2832
2833
2834 ((eq ps-print-emacs-type 'xemacs) ; XEmacs
2835 ;; Menu binding
2836 (pr-xemacs-global-menubar
6367b616
VJL
2837 (pr-x-add-submenu nil (cons "Printing" pr-menu-spec) "Apps"))))
2838
2839
2840 ;; Key binding
2841 (let ((pr-print-key (if (eq ps-print-emacs-type 'emacs)
2842 'print ; GNU Emacs
2843 'f22))) ; XEmacs
2844 (global-set-key `[,pr-print-key] 'pr-ps-fast-fire)
2845 ;; Well, M-print and S-print are used because in my keyboard S-print works
2846 ;; and M-print doesn't. But M-print can work in other keyboard.
2847 (global-set-key `[(meta ,pr-print-key)] 'pr-ps-mode-using-ghostscript)
2848 (global-set-key `[(shift ,pr-print-key)] 'pr-ps-mode-using-ghostscript)
2849 ;; Well, C-print and C-M-print are used because in my keyboard C-M-print works
2850 ;; and C-print doesn't. But C-print can work in other keyboard.
2851 (global-set-key `[(control ,pr-print-key)] 'pr-txt-fast-fire)
2852 (global-set-key `[(control meta ,pr-print-key)] 'pr-txt-fast-fire)
2853 ))
2c840b90
KS
2854
2855
2856;;; You can also use something like:
2857;;;(global-set-key "\C-ci" 'pr-interface)
2858;;;(global-set-key "\C-cbp" 'pr-ps-buffer-print)
2859;;;(global-set-key "\C-cbx" 'pr-ps-buffer-preview)
2860;;;(global-set-key "\C-cbb" 'pr-ps-buffer-using-ghostscript)
2861;;;(global-set-key "\C-crp" 'pr-ps-region-print)
2862;;;(global-set-key "\C-crx" 'pr-ps-region-preview)
2863;;;(global-set-key "\C-crr" 'pr-ps-region-using-ghostscript)
2864
2865
2866;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2867;; Help Message
2868
2869
2870(defconst pr-help-message
2871 (concat "printing.el version " pr-version
2872 " ps-print.el version " ps-print-version
2873 "\n\n
2874Menu Layout
2875-----------
2876
2877The `printing' menu (Tools/Printing or File/Print) has the following layout:
2878
2879 +-----------------------------+
2880A 0 | Printing Interface |
2881 +-----------------------------+ +-A---------+ +-B------+
2882I 1 | PostScript Preview >|-------|Directory >|-----|1-up |
2883 2 | PostScript Print >|---- A |Buffer >|-- B |2-up |
2884 3 | PostScript Printer: name >|---- C |Region >|-- B |4-up |
2885 +-----------------------------+ |Mode >|-- B |Other...|
2886II 4 | Printify >|-----\\ |File >|--\\ +--------+
2887 5 | Print >|---\\ | |Despool... | |
2888 6 | Text Printer: name >|-\\ | | +-----------+ |
2889 +-----------------------------+ | | | +---------+ +------------+
b8d955f4 2890III 7 |[ ]Landscape | | | \\-|Directory| | No Prep... | Ia
2c840b90
KS
2891 8 |[ ]Print Header | | | |Buffer | +------------+ Ib
2892 9 |[ ]Print Header Frame | | | |Region | | name >|- C
2893 10 |[ ]Line Number | | | +---------+ +------------+
2894 11 |[ ]Zebra Stripes | | | +---------+ | 1-up... | Ic
2895 12 |[ ]Duplex | | \\---|Directory| | 2-up... |
2896 13 |[ ]Tumble | \\--\\ |Buffer | | 4-up... |
2897 14 |[ ]Upside-Down | | |Region | | Other... |
2898 15 | Print All Pages >|--\\ | |Mode | +------------+
2899 +-----------------------------+ | | +---------+ |[ ]Landscape| Id
2900IV 16 |[ ]Spool Buffer | | | +-C-------+ |[ ]Duplex | Ie
449cba44
VJL
2901 17 |[ ]Print with faces | | \\--|( )name A| |[ ]Tumble | If
2902 18 |[ ]Print via Ghostscript | | |( )name B| +------------+
2c840b90
KS
2903 +-----------------------------+ | |... |
2904V 19 |[ ]Auto Region | | |(*)name |
2905 20 |[ ]Auto Mode | | |... |
2906 21 |[ ]Menu Lock | | +---------+ +--------------+
2907 +-----------------------------+ \\------------------|(*)All Pages |
2908VI 22 | Customize >|--- D +-D------+ |( )Even Pages |
2909 23 | Show Settings >|-------|printing| |( )Odd Pages |
2910 24 | Help | |ps-print| |( )Even Sheets|
2911 +-----------------------------+ |lpr | |( )Odd Sheets |
2912 +--------+ +--------------+
2913
2914See `pr-visible-entry-list' for hiding some parts of the menu.
2915
2916The menu has the following sections:
2917
2918A. Interface:
2919
2920 0. You can use a buffer interface instead of menus. It looks like the
2921 customization buffer. Basically, it has the same options found in the
2922 menu and some extra options, all this on a buffer.
2923
2924I. PostScript printing:
2925
2926 1. You can generate a PostScript file (if you type C-u before activating
2927 menu) or PostScript temporary file for a directory, a buffer, a region
2928 or a major mode, choosing 1-up, 2-up, 4-up or any other n-up printing;
2929 after file generation, ghostview is activated using the file generated
2930 as argument. This option is disabled if spooling is on (option 16).
2931 Also, if you already have a PostScript file you can preview it.
2932 Instead of previewing each buffer, region or major mode at once, you
2933 can save temporarily the PostScript code generated in a buffer and
2934 preview it later. The option `Despool...' despools the PostScript
2935 spooling buffer in a temporary file and uses ghostview to preview it.
2936 If you type C-u before choosing this option, the PostScript code
2937 generated is saved in a file instead of saving in a temporary file. To
2938 spool the PostScript code generated you need to turn on the option 16.
2939 The option `Despool...' is enabled if spooling is on (option 16).
2940
2941 NOTE 1: It's possible to customize a major mode printing, just declare
2942 the customization in `pr-mode-alist' and invoke some of
2943 `*-mode*' commands or select Mode option in Printing menu. An
2944 example for major mode usage is when you're using gnus (or mh,
2945 or rmail, etc.) and you're in the *Summary* buffer, if you
2946 forget to switch to the *Article* buffer before printing,
2947 you'll get a nicely formatted list of article subjects shows
2948 up at the printer. With major mode printing you don't need to
2949 switch from gnus *Summary* buffer first.
2950
2951 NOTE 2: There are the following options for PostScript file processing:
b8d955f4
VJL
2952 Ia. Print the file *No Preprocessing*, that is, send it
2953 directly to PostScript printer.
2c840b90
KS
2954 Ib. PostScript utility processing selection.
2955 See `pr-ps-utility-alist' and `pr-setting-database' for
2956 documentation.
2957 Ic. Do n-up processing before printing.
2958 Id. Toggle on/off landscape for PostScript file processing.
2959 Ie. Toggle on/off duplex for PostScript file processing.
2960 If. Toggle on/off tumble for PostScript file processing.
2961
2962 NOTE 3: Don't forget to download and install the utilities declared on
2963 `pr-ps-utility-alist'.
2964
2965 2. Operate the same way as option 1, but it sends directly the PostScript
2966 code (or put in a file, if you've typed C-u) or it uses ghostscript to
2967 print the PostScript file generated. It depends on option 18, if it's
2968 turned on, it uses ghostscript; otherwise, it sends directly to
2969 printer. If spooling is on (option 16), the PostScript code is saved
2970 temporarily in a buffer instead of printing it or saving it in a file.
2971 Also, if you already have a PostScript file you can print it.
2972 Instead of printing each buffer, region or major mode at once, you can
2973 save temporarily the PostScript code generated in a buffer and print it
2974 later. The option `Despool...' despools the PostScript spooling buffer
2975 directly on a printer. If you type C-u before choosing this option,
449cba44
VJL
2976 the PostScript code generated is saved in a file instead of sending it to
2977 the printer. To spool the PostScript code generated you need to turn on
2978 option 16. This option is enabled if spooling is on (option 16).
2c840b90
KS
2979 See also the NOTE 1, NOTE 2 and NOTE 3 on option 1.
2980
2981 3. You can select a new PostScript printer to send PostScript code
2982 generated. For selection it's used all PostScript printers defined
2983 in `pr-ps-printer-alist' variable (see it for documentation).
2984 See also `pr-setting-database'.
2985
2986II. Text printing:
2987
2988 4. If you have control characters (character code from \\000 to \\037) in a
2989 buffer and you want to print them in a text printer, select this
2990 option. All control characters in your buffer or region will be
2991 replaced by a printable representation. The printable representations
2992 use ^ (for ASCII control characters) or hex. The characters tab,
2993 linefeed, space, return and formfeed are not affected.
2994 You don't need to select this option if you use any option of section
2995 I, the PostScript engine treats control characters properly.
2996
2997 5. If you want to print a directory, buffer, region or major mode in a
2998 text printer, select this option. See also the NOTE 1 on option 1.
2999
3000 6. You can select a new text printer to send text generated. For
3001 selection it's used all text printers defined in `pr-txt-printer-alist'
3002 variable (see it for documentation).
3003 See also `pr-setting-database'.
3004
3005III. PostScript page toggle options:
3006
3007 7. If you want a PostScript landscape printing, turn on this option.
3008
3009 8. If you want to have a header in each page in your PostScript code,
3010 turn on this option.
3011
3012 9. If you want to draw a gaudy frame around the header, turn on this
3013 option. This option is enabled if print header is on (option 8).
3014
3015 10. If you want that the line number is printed in your PostScript code,
3016 turn on this option.
3017
3018 11. If you want background zebra stripes in your PostScript code, turn on
3019 this option.
3020
3021 12. If you want a duplex printing and your PostScript printer has this
3022 feature, turn on this option.
3023
3024 13. If you turned on duplex printing, you can choose if you want to have a
3025 printing suitable for binding on the left or right (tumble off), or to
3026 have a printing suitable for binding at top or bottom (tumble on).
3027 This option is enabled if duplex is on (option 12).
3028
3029 14. If you want a PostScript upside-down printing, turn on this option.
3030
3031 15. With this option, you can choose if you want to print all pages, odd
3032 pages, even pages, odd sheets or even sheets.
3033 See also `ps-even-or-odd-pages'.
3034
3035IV. PostScript processing toggle options:
3036
3037 16. If you want to spool the PostScript code generated, turn on this
3038 option. To spool the PostScript code generated use option 2. You can
3039 despool later by choosing option 1 or 2, sub-option `Despool...'.
3040
3041 17. If you use colors in your buffers and want to see these colors on your
3042 PostScript code generated, turn on this option. If you have a
3043 black/white PostScript printer, these colors are displayed in gray
3044 scale by PostScript printer interpreter.
3045
3046 18. If you don't have a PostScript printer to send PostScript files, turn
3047 on this option. When this option is on, the ghostscript is used to
3048 print PostScript files. In GNU or Unix system, if ghostscript is set
3049 as a PostScript filter, you don't need to turn on this option.
3050
3051V. Printing customization:
3052
3053 19. If you want that region is automagically detected, turn on this
3054 option. Note that this will only work if you're using transient mark
3055 mode. When this option is on, the `*-buffer*' commands will behave
3056 like `*-region*' commands, that is, `*-buffer*' commands will print
3057 only the region marked instead of all buffer.
3058
3059 20. Turn this option on if you want that when current major-mode is
3060 declared in `pr-mode-alist', the `*-buffer*' and `*-region*' commands
3061 behave like `*-mode*' commands.
3062
449cba44 3063 21. If you want that Printing menu stays open while you are setting
2c840b90
KS
3064 toggle options, turn on this option. The variables
3065 `pr-menu-char-height' and `pr-menu-char-width' are used to guess the
3066 menu position, so don't forget to adjust these variables if menu
3067 position is not ok.
3068
3069VI. Customization:
3070
3071 22. Besides all options in section III, IV and V, you can customize much
3072 more PostScript options in `ps-print' option. Or you can customize
3073 some `lpr' options for text printing. Or customize `printing'
3074 options.
3075
3076 23. Show current settings for `printing', `ps-print' or `lpr'.
3077
3078 24. Quick help for printing menu layout.
3079")
3080 "Printing help message.")
3081
3082
3083(defconst pr-interface-help-message
3084 (concat "printing.el version " pr-version
3085 " ps-print.el version " ps-print-version
3086 "\n\n
3087The printing interface buffer has the same functionality as the printing menu.
3088The major difference is that the states (like sending PostScript generated to a
3089file, n-up printing, etc.) are set and saved between priting buffer
3090activation. Also, the landscape, duplex and tumble values are the same for
3091PostScript file and directory/buffer/region/mode processing; using menu, there
3092are different value sets for PostScript file and directory/buffer/region/mode
3093processing.
3094
3095The printing interface buffer has the following sections:
3096
30971. Print:
3098
3099 Here you can choose to print/preview a buffer, a directory or a PostScript
3100 file:
3101
3102 1a. Buffer:
3103
3104 * Buffer List:
3105 Select a buffer from the current buffer list.
3106
3107 * Region:
3108 If it's on, this means that the selected buffer has an active region,
3109 so you can turn on/off, as you wish.
3110 If it's off when a buffer is selected, this means that the selected
3111 buffer has no active region, so it'll not be possible to turn it on.
3112 If you want to process the region, let this option on.
3113 If you want to process the whole buffer, let this option off.
3114
3115 * Mode:
3116 If it's on, this means that the selected buffer major mode is declared
3117 for major mode processing, so you can turn on/off, as you wish.
3118 If it's off when a buffer is selected, this means that the selected
3119 buffer major mode isn't declared for major mode processing, so it'll
3120 not be possible to turn it on.
3121 If you want the major mode processing, let this option on.
3122 If you don't want the major mode processing, let this option off.
3123
3124 NOTE 1: It's possible to customize a major mode printing, just declare
3125 the customization in `pr-mode-alist' and invoke some of
3126 `*-mode*' commands or select Mode option in Printing menu. An
3127 example for major mode usage is when you're using gnus (or mh,
3128 or rmail, etc.) and you're in the *Summary* buffer, if you
3129 forget to switch to the *Article* buffer before printing,
3130 you'll get a nicely formatted list of article subjects shows
3131 up at the printer. With major mode printing you don't need to
3132 switch from gnus *Summary* buffer first.
3133
3134 1b. Directory:
3135
3136 * Directory:
3137 Specify a valid directory path.
3138
3139 * File Regexp:
3140 Specify a file name regexp. All file names in the directory that
3141 match with regexp will be printed/previewed. An empty file name
3142 regexp means to print/preview all files in the directory.
3143
3144 * List Directory Entry:
3145 If it's turned on, list directory entries besides file entries.
3146
3147 1c. PostScript file:
3148
3149 * PostScript File:
3150 Specify an existent PostScript file to print/preview.
3151
3152 * PostScript Utility:
3153 Select a PostScript utility.
3154 See `pr-ps-utility-alist' and `pr-setting-database' for documentation.
3155
3156 NOTE 2: Don't forget to download and install the utilities declared on
3157 `pr-ps-utility-alist'.
3158
b8d955f4 3159 * No Preprocessing:
2c840b90
KS
3160 If it's turned on, don't use the PostScript utility to preprocess the
3161 PostScript file before printing/previewing.
3162
31632. PostScript printer:
3164
3165 * PostScript Printer:
3166 You can select a new PostScript printer to send PostScript code
3167 generated. For selection it's used all PostScript printers defined
3168 in `pr-ps-printer-alist' variable (see it for documentation).
3169 See also `pr-setting-database'.
3170
3171 * Despool:
3172 If spooling is on, you can turn it on/off, as you wish.
3173 If spooling is off, it'll not be possible to turn it on.
3174 If it's turned on, specify to despools the PostScript spooling buffer in
3175 a temporary file or in the selected PostScript file when
3176 printing/previewing.
3177
3178 * Preview:
3179 Preview the PostScript generated.
3180
3181 * Print:
3182 Print the PostScript generated.
3183
3184 * Quit:
3185 Quit from printing interface buffer.
3186
3187 * Send to Printer/Temporary File:
3188 If it's turned on, the PostScript generated is sent directly to
3189 PostScript printer or, for previewing, to a temporary file.
3190
3191 * Send to File:
3192 Specify a file name to send the PostScript generated.
3193
3194 * N-Up:
3195 Specify n-up printing.
3196
31973. Text printer:
3198
3199 * Text Printer:
3200 Select a new text printer to send text generated. For selection it's used
3201 all text printers defined in `pr-txt-printer-alist' variable (see it for
3202 documentation). See also `pr-setting-database'.
3203
3204 * Printify:
3205 If you have control characters (character code from \\000 to \\037) in a
3206 buffer and you want to print them in a text printer, select this
3207 option. All control characters in your buffer or region will be
3208 replaced by a printable representation. The printable representations
3209 use ^ (for ASCII control characters) or hex. The characters tab,
3210 linefeed, space, return and formfeed are not affected.
3211 You don't need to select this option if you use any option of section
3212 I, the PostScript engine treats control characters properly.
3213
3214 * Print:
3215 To print a directory, buffer, region or major mode in a
3216 text printer, select this option. See also the NOTE 1 on section 1.
3217
3218 * Quit:
3219 Quit from printing interface buffer.
3220
32214. Settings:
3222
3223 There are 3 setting columns:
3224
3225 4a. First column (left column):
3226
3227 * Landscape:
3228 PostScript landscape printing.
3229
3230 * Print Header:
3231 To have a header in each page in your PostScript code.
3232
3233 * Print Header Frame:
3234 To draw a gaudy frame around the header.
3235
3236 * Line Number:
3237 The line number is printed in your PostScript code.
3238
3239 * Zebra Stripes:
3240 Background zebra stripes in your PostScript code.
3241
3242 * Duplex:
3243 Duplex printing (if your PostScript printer has this feature).
3244
3245 * Tumble:
3246 If duplex printing is on, you can choose if you want to have a
3247 printing suitable for binding on the left or right (tumble off), or to
3248 have a printing suitable for binding at top or bottom (tumble on).
3249
3250 * Upside-Down:
3251 PostScript upside-down printing.
3252
3253 4b. Second column (middle column):
3254
3255 * Auto Region:
3256 If you want that region is automagically detected, turn on this
3257 option. Note that this will only work if you're using transient mark
3258 mode. When this option is on, the `*-buffer*' commands will behave
3259 like `*-region*' commands, that is, `*-buffer*' commands will print
3260 only the region marked instead of all buffer.
3261
3262 * Auto Mode:
3263 Turn this option on if you want that when current major-mode is
3264 declared in `pr-mode-alist', the `*-buffer*' and `*-region*' commands
3265 behave like `*-mode*' commands.
3266
3267 * Menu Lock:
449cba44 3268 If you want that Printing menu stays open while you are setting
2c840b90
KS
3269 toggle options, turn on this option. The variables
3270 `pr-menu-char-height' and `pr-menu-char-width' are used to guess the
3271 menu position, so don't forget to adjust these variables if menu
3272 position is not ok.
3273
3274 * Spool Buffer:
3275 To spool the PostScript code generated. You can despool later by
3276 setting Despool option on PostScript printer section.
3277
449cba44 3278 * Print with faces:
2c840b90
KS
3279 If you use colors in your buffers and want to see these colors on your
3280 PostScript code generated, turn on this option. If you have a
3281 black/white PostScript printer, these colors are displayed in gray
3282 scale by PostScript printer interpreter.
3283
449cba44 3284 * Print via Ghostscript:
2c840b90
KS
3285 If you don't have a PostScript printer to send PostScript files, turn
3286 on this option. When this option is on, the ghostscript is used to
3287 print PostScript files. In GNU or Unix system, if ghostscript is set
3288 as a PostScript filter, you don't need to turn on this option.
3289
3290 * Parity Page Menu:
3291 To print all pages, odd pages, even pages, odd sheets or even sheets.
3292 See also `ps-even-or-odd-pages'.
3293
3294 4c. Third column (right column):
3295
3296 * Verbose:
3297 That is, to be verbose when editing a field in interface buffer.
3298
32995. Customize:
3300
3301 Besides all options in section 4, you can customize much more PostScript
3302 options in `ps-print' option. Or you can customize some `lpr' options for
3303 text printing. Or customize `printing' options.
3304
33056. Show settings:
3306
3307 Show current settings for `printing', `ps-print' or `lpr'.
3308
33097. Help:
3310
3311 Quick help for printing interface buffer and printing menu layout. You can
3312 also quit the printing interface buffer or kill all printing help buffer.
3313")
3314 "Printing buffer interface help message.")
3315
3316
3317;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3318;; Commands
3319
3320
3321;;;###autoload
3322(defun pr-interface (&optional buffer)
3323 "Activate the printing interface buffer.
3324
449cba44 3325If BUFFER is nil, the current buffer is used for printing.
2c840b90 3326
449cba44 3327For more information, type \\[pr-interface-help]."
2c840b90 3328 (interactive)
6367b616
VJL
3329 (pr-save-interactive
3330 (save-excursion
3331 (set-buffer (or buffer (current-buffer)))
3332 (pr-create-interface))))
2c840b90
KS
3333
3334
3335;;;###autoload
3336(defun pr-ps-directory-preview (n-up dir file-regexp &optional filename)
3337 "Preview directory using ghostview.
3338
3339Interactively, the command prompts for N-UP printing number, a directory, a
3340file name regexp for matching and, when you use a prefix argument (C-u), the
3341command prompts the user for a file name, and saves the PostScript image in
3342that file instead of saving it in a temporary file.
3343
3344Noninteractively, if N-UP is nil, prompts for N-UP printing number. If DIR is
3345nil, prompts for DIRectory. If FILE-REGEXP is nil, prompts for
3346FILE(name)-REGEXP. The argument FILENAME is treated as follows: if it's nil,
3347save the image in a temporary file. If FILENAME is a string, save the
3348PostScript image in a file with that name. If FILENAME is t, prompts for a
3349file name.
3350
3351See also documentation for `pr-list-directory'."
3352 (interactive (pr-interactive-ps-dir-args (pr-prompt "PS preview dir")))
6367b616
VJL
3353 (pr-save-interactive
3354 (pr-set-ps-dir-args 'n-up 'dir 'file-regexp 'filename
3355 (pr-prompt "PS preview dir"))
3356 (setq filename (pr-ps-file filename))
3357 (pr-ps-file-list n-up dir file-regexp filename)
3358 (or pr-spool-p
3359 (pr-ps-file-preview filename))))
2c840b90
KS
3360
3361
3362;;;###autoload
3363(defun pr-ps-directory-using-ghostscript (n-up dir file-regexp &optional filename)
3364 "Print directory using PostScript through ghostscript.
3365
3366Interactively, the command prompts for N-UP printing number, a directory, a
3367file name regexp for matching and, when you use a prefix argument (C-u), the
3368command prompts the user for a file name, and saves the PostScript image in
3369that file instead of saving it in a temporary file.
3370
3371Noninteractively, if N-UP is nil, prompts for N-UP printing number. If DIR is
3372nil, prompts for DIRectory. If FILE-REGEXP is nil, prompts for
3373FILE(name)-REGEXP. The argument FILENAME is treated as follows: if it's nil,
3374save the image in a temporary file. If FILENAME is a string, save the
3375PostScript image in a file with that name. If FILENAME is t, prompts for a
3376file name.
3377
3378See also documentation for `pr-list-directory'."
3379 (interactive (pr-interactive-ps-dir-args (pr-prompt "PS print dir GS")))
6367b616
VJL
3380 (pr-save-interactive
3381 (pr-set-ps-dir-args 'n-up 'dir 'file-regexp 'filename
3382 (pr-prompt "PS print dir GS"))
3383 (let ((file (pr-ps-file filename)))
3384 (pr-ps-file-list n-up dir file-regexp file)
3385 (pr-ps-file-using-ghostscript file)
3386 (or filename (pr-delete-file file)))))
2c840b90
KS
3387
3388
3389;;;###autoload
3390(defun pr-ps-directory-print (n-up dir file-regexp &optional filename)
3391 "Print directory using PostScript printer.
3392
3393Interactively, the command prompts for N-UP printing number, a directory, a
3394file name regexp for matching and, when you use a prefix argument (C-u), the
3395command prompts the user for a file name, and saves the PostScript image in
3396that file instead of saving it in a temporary file.
3397
3398Noninteractively, if N-UP is nil, prompts for N-UP printing number. If DIR is
3399nil, prompts for DIRectory. If FILE-REGEXP is nil, prompts for
3400FILE(name)-REGEXP. The argument FILENAME is treated as follows: if it's nil,
3401save the image in a temporary file. If FILENAME is a string, save the
3402PostScript image in a file with that name. If FILENAME is t, prompts for a
3403file name.
3404
3405See also documentation for `pr-list-directory'."
3406 (interactive (pr-interactive-ps-dir-args (pr-prompt "PS print dir")))
6367b616
VJL
3407 (pr-save-interactive
3408 (pr-set-ps-dir-args 'n-up 'dir 'file-regexp 'filename
3409 (pr-prompt "PS print dir"))
3410 (let ((file (pr-ps-file filename)))
3411 (pr-ps-file-list n-up dir file-regexp file)
3412 (pr-ps-file-print file)
3413 (or filename (pr-delete-file file)))))
2c840b90
KS
3414
3415
3416;;;###autoload
3417(defun pr-ps-directory-ps-print (n-up dir file-regexp &optional filename)
3418 "Print directory using PostScript printer or through ghostscript.
3419
3420It depends on `pr-print-using-ghostscript'.
3421
3422Interactively, the command prompts for N-UP printing number, a directory, a
3423file name regexp for matching and, when you use a prefix argument (C-u), the
3424command prompts the user for a file name, and saves the PostScript image in
3425that file instead of saving it in a temporary file.
3426
3427Noninteractively, if N-UP is nil, prompts for N-UP printing number. If DIR is
3428nil, prompts for DIRectory. If FILE-REGEXP is nil, prompts for
3429FILE(name)-REGEXP. The argument FILENAME is treated as follows: if it's nil,
3430save the image in a temporary file. If FILENAME is a string, save the
3431PostScript image in a file with that name. If FILENAME is t, prompts for a
3432file name.
3433
3434See also documentation for `pr-list-directory'."
3435 (interactive (pr-interactive-ps-dir-args
3436 (pr-prompt (pr-prompt-gs "PS print dir"))))
6367b616
VJL
3437 (pr-save-interactive
3438 (pr-set-ps-dir-args 'n-up 'dir 'file-regexp 'filename
3439 (pr-prompt (pr-prompt-gs "PS print dir")))
3440 (if (pr-using-ghostscript-p)
3441 (pr-ps-directory-using-ghostscript n-up dir file-regexp filename)
3442 (pr-ps-directory-print n-up dir file-regexp filename))))
2c840b90
KS
3443
3444
3445;;;###autoload
3446(defun pr-ps-buffer-preview (n-up &optional filename)
3447 "Preview buffer using ghostview.
3448
3449Interactively, the command prompts for N-UP printing number and, when you use a
3450prefix argument (C-u), the command prompts the user for a file name, and saves
3451the PostScript image in that file instead of saving it in a temporary file.
3452
3453Noninteractively, if N-UP is nil, prompts for N-UP printing number. The
3454argument FILENAME is treated as follows: if it's nil, save the image in a
3455temporary file. If FILENAME is a string, save the PostScript image in a file
3456with that name. If FILENAME is t, prompts for a file name."
3457 (interactive (pr-interactive-n-up-file (pr-prompt "PS preview")))
6367b616
VJL
3458 (pr-save-interactive
3459 (if (pr-auto-mode-p)
3460 (pr-ps-mode-preview n-up filename)
3461 (pr-ps-preview (pr-region-active-symbol) n-up filename
3462 (pr-region-active-string "PS preview")))))
2c840b90
KS
3463
3464
3465;;;###autoload
3466(defun pr-ps-buffer-using-ghostscript (n-up &optional filename)
3467 "Print buffer using PostScript through ghostscript.
3468
3469Interactively, the command prompts for N-UP printing number and, when you use a
3470prefix argument (C-u), the command prompts the user for a file name, and saves
3471the PostScript image in that file instead of sending it to the printer.
3472
3473Noninteractively, if N-UP is nil, prompts for N-UP printing number. The
3474argument FILENAME is treated as follows: if it's nil, send the image to the
3475printer. If FILENAME is a string, save the PostScript image in a file with
3476that name. If FILENAME is t, prompts for a file name."
3477 (interactive (pr-interactive-n-up-file (pr-prompt "PS print GS")))
6367b616
VJL
3478 (pr-save-interactive
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")))))
2c840b90
KS
3483
3484
3485;;;###autoload
3486(defun pr-ps-buffer-print (n-up &optional filename)
3487 "Print buffer using PostScript printer.
3488
3489Interactively, the command prompts for N-UP printing number and, when you use a
3490prefix argument (C-u), the command prompts the user for a file name, and saves
3491the PostScript image in that file instead of sending it to the printer.
3492
3493Noninteractively, if N-UP is nil, prompts for N-UP printing number. The
3494argument FILENAME is treated as follows: if it's nil, send the image to the
3495printer. If FILENAME is a string, save the PostScript image in a file with
3496that name. If FILENAME is t, prompts for a file name."
3497 (interactive (pr-interactive-n-up-file (pr-prompt "PS print")))
6367b616
VJL
3498 (pr-save-interactive
3499 (if (pr-auto-mode-p)
3500 (pr-ps-mode-print n-up filename)
3501 (pr-ps-print (pr-region-active-symbol) n-up filename
3502 (pr-region-active-string "PS print")))))
2c840b90
KS
3503
3504
3505;;;###autoload
3506(defun pr-ps-buffer-ps-print (n-up &optional filename)
3507 "Print buffer using PostScript printer or through ghostscript.
3508
3509It depends on `pr-print-using-ghostscript'.
3510
3511Interactively, the command prompts for N-UP printing number and, when you use a
3512prefix argument (C-u), the command prompts the user for a file name, and saves
3513the PostScript image in that file instead of sending it to the printer.
3514
3515Noninteractively, if N-UP is nil, prompts for N-UP printing number. The
3516argument FILENAME is treated as follows: if it's nil, send the image to the
3517printer. If FILENAME is a string, save the PostScript image in a file with
3518that name. If FILENAME is t, prompts for a file name."
3519 (interactive (pr-interactive-n-up-file
3520 (pr-prompt (pr-prompt-gs "PS print"))))
6367b616
VJL
3521 (pr-save-interactive
3522 (cond ((pr-auto-mode-p)
3523 (pr-ps-mode-ps-print n-up filename))
3524 ((pr-using-ghostscript-p)
3525 (pr-ps-using-ghostscript (pr-region-active-symbol) n-up filename
3526 (pr-region-active-string "PS print GS")))
3527 (t
3528 (pr-ps-print (pr-region-active-symbol) n-up filename
3529 (pr-region-active-string "PS print"))))))
2c840b90
KS
3530
3531
3532;;;###autoload
3533(defun pr-ps-region-preview (n-up &optional filename)
3534 "Preview region using ghostview.
3535
3536See also `pr-ps-buffer-preview'."
3537 (interactive (pr-interactive-n-up-file (pr-prompt-region "PS preview")))
6367b616
VJL
3538 (pr-save-interactive
3539 (if (pr-auto-mode-p)
3540 (let ((pr-auto-region t))
3541 (pr-ps-mode-preview n-up filename))
3542 (pr-ps-preview 'region n-up filename "PS preview region"))))
2c840b90
KS
3543
3544
3545;;;###autoload
3546(defun pr-ps-region-using-ghostscript (n-up &optional filename)
3547 "Print region using PostScript through ghostscript.
3548
3549See also `pr-ps-buffer-using-ghostscript'."
3550 (interactive (pr-interactive-n-up-file (pr-prompt-region "PS print GS")))
6367b616
VJL
3551 (pr-save-interactive
3552 (if (pr-auto-mode-p)
3553 (let ((pr-auto-region t))
3554 (pr-ps-mode-using-ghostscript n-up filename))
3555 (pr-ps-using-ghostscript 'region n-up filename "PS print GS region"))))
2c840b90
KS
3556
3557
3558;;;###autoload
3559(defun pr-ps-region-print (n-up &optional filename)
3560 "Print region using PostScript printer.
3561
3562See also `pr-ps-buffer-print'."
3563 (interactive (pr-interactive-n-up-file (pr-prompt-region "PS print")))
6367b616
VJL
3564 (pr-save-interactive
3565 (if (pr-auto-mode-p)
3566 (let ((pr-auto-region t))
3567 (pr-ps-mode-print n-up filename))
3568 (pr-ps-print 'region n-up filename "PS print region"))))
2c840b90
KS
3569
3570
3571;;;###autoload
3572(defun pr-ps-region-ps-print (n-up &optional filename)
3573 "Print region using PostScript printer or through ghostscript.
3574
3575See also `pr-ps-buffer-ps-print'."
3576 (interactive (pr-interactive-n-up-file
3577 (pr-prompt-region (pr-prompt-gs "PS print"))))
6367b616
VJL
3578 (pr-save-interactive
3579 (cond ((pr-auto-mode-p)
3580 (let ((pr-auto-region t))
3581 (pr-ps-mode-ps-print n-up filename)))
3582 ((pr-using-ghostscript-p)
3583 (pr-ps-using-ghostscript 'region n-up filename "PS print GS region"))
3584 (t
3585 (pr-ps-print 'region n-up filename "PS print region")))))
2c840b90
KS
3586
3587
3588;;;###autoload
3589(defun pr-ps-mode-preview (n-up &optional filename)
3590 "Preview major mode using ghostview.
3591
3592See also `pr-ps-buffer-preview'."
3593 (interactive (pr-interactive-n-up-file "PS preview mode"))
6367b616
VJL
3594 (pr-save-interactive
3595 (pr-set-n-up-and-filename 'n-up 'filename "PS preview mode")
3596 (let ((file (pr-ps-file filename)))
3597 (and (pr-ps-mode n-up file)
3598 (not pr-spool-p)
3599 (pr-ps-file-preview file)))))
2c840b90
KS
3600
3601
3602;;;###autoload
3603(defun pr-ps-mode-using-ghostscript (n-up &optional filename)
3604 "Print major mode using PostScript through ghostscript.
3605
3606See also `pr-ps-buffer-using-ghostscript'."
3607 (interactive (pr-interactive-n-up-file "PS print GS mode"))
6367b616
VJL
3608 (pr-save-interactive
3609 (pr-set-n-up-and-filename 'n-up 'filename "PS print GS mode")
3610 (let ((file (pr-ps-file filename)))
3611 (when (and (pr-ps-mode n-up file)
3612 (not pr-spool-p))
3613 (pr-ps-file-using-ghostscript file)
3614 (or filename (pr-delete-file file))))))
2c840b90
KS
3615
3616
3617;;;###autoload
3618(defun pr-ps-mode-print (n-up &optional filename)
3619 "Print major mode using PostScript printer.
3620
3621See also `pr-ps-buffer-print'."
3622 (interactive (pr-interactive-n-up-file "PS print mode"))
6367b616
VJL
3623 (pr-save-interactive
3624 (pr-set-n-up-and-filename 'n-up 'filename "PS print mode")
3625 (pr-ps-mode n-up filename)))
2c840b90
KS
3626
3627
3628;;;###autoload
3629(defun pr-ps-mode-ps-print (n-up &optional filename)
3630 "Print major mode using PostScript or through ghostscript.
3631
3632See also `pr-ps-buffer-ps-print'."
3633 (interactive (pr-interactive-n-up-file (pr-prompt-gs "PS print mode")))
6367b616
VJL
3634 (pr-save-interactive
3635 (if (pr-using-ghostscript-p)
3636 (pr-ps-mode-using-ghostscript n-up filename)
3637 (pr-ps-mode-print n-up filename))))
2c840b90
KS
3638
3639
3640;;;###autoload
3641(defun pr-printify-directory (&optional dir file-regexp)
3642 "Replace nonprinting characters in directory with printable representations.
3643The printable representations use ^ (for ASCII control characters) or hex.
3644The characters tab, linefeed, space, return and formfeed are not affected.
3645
3646Interactively, the command prompts for a directory and a file name regexp for
3647matching.
3648
3649Noninteractively, if DIR is nil, prompts for DIRectory. If FILE-REGEXP is nil,
3650prompts for FILE(name)-REGEXP.
3651
3652See also documentation for `pr-list-directory'."
3653 (interactive (pr-interactive-dir-args "Printify dir"))
6367b616
VJL
3654 (pr-save-interactive
3655 (pr-set-dir-args 'dir 'file-regexp "Printify dir")
3656 (pr-file-list dir file-regexp 'pr-printify-buffer)))
2c840b90
KS
3657
3658
3659;;;###autoload
3660(defun pr-printify-buffer ()
3661 "Replace nonprinting characters in buffer with printable representations.
3662The printable representations use ^ (for ASCII control characters) or hex.
3663The characters tab, linefeed, space, return and formfeed are not affected."
3664 (interactive "*")
3665 (if (pr-region-active-p)
3666 (pr-printify-region)
3667 (printify-region (point-min) (point-max))))
3668
3669
3670;;;###autoload
3671(defun pr-printify-region ()
3672 "Replace nonprinting characters in region with printable representations.
3673The printable representations use ^ (for ASCII control characters) or hex.
3674The characters tab, linefeed, space, return and formfeed are not affected."
3675 (interactive "*")
3676 (printify-region (point) (mark)))
3677
3678
3679;;;###autoload
3680(defun pr-txt-directory (&optional dir file-regexp)
3681 "Print directory using text printer.
3682
3683Interactively, the command prompts for a directory and a file name regexp for
3684matching.
3685
3686Noninteractively, if DIR is nil, prompts for DIRectory. If FILE-REGEXP is nil,
3687prompts for FILE(name)-REGEXP.
3688
3689See also documentation for `pr-list-directory'."
3690 (interactive (pr-interactive-dir-args "Print dir"))
6367b616
VJL
3691 (pr-save-interactive
3692 (pr-set-dir-args 'dir 'file-regexp "Print dir")
3693 (pr-file-list dir file-regexp 'pr-txt-buffer)))
2c840b90
KS
3694
3695
3696;;;###autoload
3697(defun pr-txt-buffer ()
3698 "Print buffer using text printer."
3699 (interactive)
3700 (cond ((pr-auto-mode-p)
3701 (pr-txt-mode))
3702 ((pr-region-active-p)
3703 (pr-txt-region))
3704 (t
3705 (pr-txt-print (point-min) (point-max)))))
3706
3707
3708;;;###autoload
3709(defun pr-txt-region ()
3710 "Print region using text printer."
3711 (interactive)
3712 (if (pr-auto-mode-p)
3713 (let ((pr-auto-region t))
3714 (pr-txt-mode))
3715 (pr-txt-print (point) (mark))))
3716
3717
3718;;;###autoload
3719(defun pr-txt-mode ()
3720 "Print major mode using text printer."
3721 (interactive)
3722 (let ((args (pr-mode-alist-p)))
3723 (if args
3724 (funcall (car args) (nthcdr 2 args))
3725 (ding)
3726 (message "`%s' major mode not declared." major-mode))))
3727
3728
3729;;;###autoload
3730(defun pr-despool-preview (&optional filename)
3731 "Preview spooled PostScript.
3732
3733Interactively, when you use a prefix argument (C-u), the command prompts the
3734user for a file name, and saves the spooled PostScript image in that file
3735instead of saving it in a temporary file.
3736
3737Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3738save the image in a temporary file. If FILENAME is a string, save the
3739PostScript image in a file with that name."
3740 (interactive (list (ps-print-preprint current-prefix-arg)))
6367b616
VJL
3741 (pr-save-interactive
3742 (let ((file (pr-ps-file filename)))
3743 (when (stringp file)
3744 (pr-despool-print file)
3745 (pr-ps-file-preview file)))))
2c840b90
KS
3746
3747
3748;;;###autoload
3749(defun pr-despool-using-ghostscript (&optional filename)
3750 "Print spooled PostScript using ghostscript.
3751
3752Interactively, when you use a prefix argument (C-u), the command prompts the
3753user for a file name, and saves the spooled PostScript image in that file
3754instead of sending it to the printer.
3755
3756Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3757send the image to the printer. If FILENAME is a string, save the PostScript
3758image in a file with that name."
3759 (interactive (list (ps-print-preprint current-prefix-arg)))
6367b616
VJL
3760 (pr-save-interactive
3761 (let ((file (pr-ps-file filename)))
3762 (when (stringp file)
3763 (pr-despool-print file)
3764 (pr-ps-file-using-ghostscript file)
3765 (or filename (pr-delete-file file))))))
2c840b90
KS
3766
3767
3768;;;###autoload
3769(defun pr-despool-print (&optional filename)
3770 "Send the spooled PostScript to the printer.
3771
3772Interactively, when you use a prefix argument (C-u), the command prompts the
3773user for a file name, and saves the spooled PostScript image in that file
3774instead of sending it to the printer.
3775
3776Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3777send the image to the printer. If FILENAME is a string, save the PostScript
3778image in a file with that name."
3779 (interactive (list (ps-print-preprint current-prefix-arg)))
6367b616
VJL
3780 (pr-save-interactive
3781 (pr-save-file-modes
3782 (let ((ps-lpr-command (pr-command pr-ps-command))
3783 (ps-lpr-switches pr-ps-switches)
3784 (ps-printer-name-option pr-ps-printer-switch)
3785 (ps-printer-name pr-ps-printer))
3786 (ps-despool filename)))))
2c840b90
KS
3787
3788
3789;;;###autoload
3790(defun pr-despool-ps-print (&optional filename)
3791 "Send the spooled PostScript to the printer or use ghostscript to print it.
3792
3793Interactively, when you use a prefix argument (C-u), the command prompts the
3794user for a file name, and saves the spooled PostScript image in that file
3795instead of sending it to the printer.
3796
3797Noninteractively, the argument FILENAME is treated as follows: if it is nil,
3798send the image to the printer. If FILENAME is a string, save the PostScript
3799image in a file with that name."
3800 (interactive (list (ps-print-preprint current-prefix-arg)))
6367b616
VJL
3801 (pr-save-interactive
3802 (if pr-print-using-ghostscript
3803 (pr-despool-using-ghostscript filename)
3804 (pr-despool-print filename))))
2c840b90
KS
3805
3806
3807;;;###autoload
3808(defun pr-ps-file-preview (filename)
3809 "Preview PostScript file FILENAME."
3810 (interactive (list (pr-ps-infile-preprint "Preview ")))
3811 (and (stringp filename) (file-exists-p filename)
45f17557 3812 (pr-call-process pr-gv-command filename)))
2c840b90
KS
3813
3814
3815;;;###autoload
3816(defun pr-ps-file-up-preview (n-up ifilename &optional ofilename)
3817 "Preview PostScript file FILENAME."
3818 (interactive (pr-interactive-n-up-inout "PS preview"))
6367b616
VJL
3819 (pr-save-interactive
3820 (let ((outfile (pr-ps-utility-args 'n-up 'ifilename 'ofilename
3821 "PS preview ")))
3822 (pr-ps-utility-process n-up ifilename outfile)
3823 (pr-ps-file-preview outfile))))
2c840b90
KS
3824
3825
3826;;;###autoload
3827(defun pr-ps-file-using-ghostscript (filename)
3828 "Print PostScript file FILENAME using ghostscript."
3829 (interactive (list (pr-ps-infile-preprint "Print preview ")))
3830 (and (stringp filename) (file-exists-p filename)
6367b616
VJL
3831 (pr-save-interactive
3832 (let* ((file (pr-expand-file-name filename))
3833 (tempfile (pr-dosify-file-name (make-temp-file file))))
3834 ;; gs use
3835 (pr-call-process pr-gs-command
3836 (format "-sDEVICE=%s" pr-gs-device)
3837 (format "-r%d" pr-gs-resolution)
3838 (pr-switches-string pr-gs-switches "pr-gs-switches")
3839 (format "-sOutputFile=\"%s\"" tempfile)
3840 file
3841 "-c quit")
3842 ;; printing
3843 (pr-ps-file-print tempfile)
3844 ;; deleting
3845 (pr-delete-file tempfile)))))
2c840b90
KS
3846
3847
3848;;;###autoload
3849(defun pr-ps-file-print (filename)
3850 "Print PostScript file FILENAME."
3851 (interactive (list (pr-ps-infile-preprint "Print ")))
3852 (and (stringp filename) (file-exists-p filename)
3853 ;; printing
3854 (let ((file (pr-expand-file-name filename)))
449cba44 3855 (if (string= pr-ps-command "")
6367b616 3856 ;; default action
2c840b90
KS
3857 (let ((ps-spool-buffer (get-buffer-create ps-spool-buffer-name)))
3858 (save-excursion
3859 (set-buffer ps-spool-buffer)
3860 (erase-buffer)
3861 (insert-file-contents-literally file))
3862 (pr-despool-print))
6367b616 3863 ;; use `pr-ps-command' to print
45f17557
VJL
3864 (apply 'pr-call-process
3865 pr-ps-command
3866 (pr-switches-string pr-ps-switches "pr-gs-switches")
3867 (if (string-match "cp" pr-ps-command)
3868 ;; for "cp" (cmd in out)
3869 (list file
3870 (concat pr-ps-printer-switch pr-ps-printer))
3871 ;; else, for others (cmd out in)
3872 (list (concat pr-ps-printer-switch pr-ps-printer)
3873 file)))))))
2c840b90
KS
3874
3875
3876;;;###autoload
3877(defun pr-ps-file-ps-print (filename)
3878 "Send PostScript file FILENAME to printer or use ghostscript to print it."
3879 (interactive (list (pr-ps-infile-preprint
3880 (if pr-print-using-ghostscript
3881 "Print preview "
3882 "Print "))))
3883 (if pr-print-using-ghostscript
3884 (pr-ps-file-using-ghostscript filename)
3885 (pr-ps-file-print filename)))
3886
3887
3888;;;###autoload
3889(defun pr-ps-file-up-ps-print (n-up ifilename &optional ofilename)
3890 "Process a PostScript file IFILENAME and send it to printer.
3891
3892Interactively, the command prompts for N-UP printing number, for an input
3893PostScript file IFILENAME and, when you use a prefix argument (C-u), the
3894command prompts the user for an output PostScript file name OFILENAME, and
3895saves the PostScript image in that file instead of sending it to the printer.
3896
3897Noninteractively, if N-UP is nil, prompts for N-UP printing number. The
3898argument IFILENAME is treated as follows: if it's t, prompts for an input
3899PostScript file name; otherwise, it *must* be a string that it's an input
3900PostScript file name. The argument OFILENAME is treated as follows: if it's
3901nil, send the image to the printer. If OFILENAME is a string, save the
3902PostScript image in a file with that name. If OFILENAME is t, prompts for a
3903file name."
3904 (interactive (pr-interactive-n-up-inout
3905 (if pr-print-using-ghostscript
3906 "PS print GS"
3907 "PS print")))
6367b616
VJL
3908 (pr-save-interactive
3909 (let ((outfile (pr-ps-utility-args 'n-up 'ifilename 'ofilename
3910 (if pr-print-using-ghostscript
3911 "PS print GS "
3912 "PS print "))))
3913 (pr-ps-utility-process n-up ifilename outfile)
3914 (unless ofilename
3915 (pr-ps-file-ps-print outfile)
3916 (pr-delete-file outfile)))))
2c840b90
KS
3917
3918
3919;;;###autoload
3920(defun pr-toggle-file-duplex ()
3921 "Toggle duplex for PostScript file."
3922 (interactive)
6367b616
VJL
3923 (pr-save-interactive
3924 (pr-toggle 'pr-file-duplex "PS file duplex" nil 7 5 nil
3925 '("PostScript Print" "File"))))
2c840b90
KS
3926
3927
3928;;;###autoload
3929(defun pr-toggle-file-tumble ()
3930 "Toggle tumble for PostScript file.
3931
3932If tumble is off, produces a printing suitable for binding on the left or
3933right.
3934If tumble is on, produces a printing suitable for binding at the top or
3935bottom."
3936 (interactive)
6367b616
VJL
3937 (pr-save-interactive
3938 (pr-toggle 'pr-file-tumble "PS file tumble" nil 8 5 nil
3939 '("PostScript Print" "File"))))
2c840b90
KS
3940
3941
3942;;;###autoload
3943(defun pr-toggle-file-landscape ()
3944 "Toggle landscape for PostScript file."
3945 (interactive)
6367b616
VJL
3946 (pr-save-interactive
3947 (pr-toggle 'pr-file-landscape "PS file landscape" nil 6 5 nil
3948 '("PostScript Print" "File"))))
2c840b90
KS
3949
3950
3951;;;###autoload
3952(defun pr-toggle-ghostscript ()
3953 "Toggle printing using ghostscript."
3954 (interactive)
6367b616
VJL
3955 (pr-save-interactive
3956 (pr-toggle 'pr-print-using-ghostscript "Printing using ghostscript"
3957 'postscript-process 2 12 'toggle)))
2c840b90
KS
3958
3959
3960;;;###autoload
3961(defun pr-toggle-faces ()
3962 "Toggle printing with faces."
3963 (interactive)
6367b616
VJL
3964 (pr-save-interactive
3965 (pr-toggle 'pr-faces-p "Printing with faces"
3966 'postscript-process 1 12 'toggle)))
2c840b90
KS
3967
3968
3969;;;###autoload
3970(defun pr-toggle-spool ()
3971 "Toggle spooling."
3972 (interactive)
6367b616
VJL
3973 (pr-save-interactive
3974 (pr-toggle 'pr-spool-p "Spooling printing"
3975 'postscript-process 0 12 'toggle)))
2c840b90
KS
3976
3977
3978;;;###autoload
3979(defun pr-toggle-duplex ()
3980 "Toggle duplex."
3981 (interactive)
6367b616
VJL
3982 (pr-save-interactive
3983 (pr-toggle 'ps-spool-duplex "Printing duplex"
3984 'postcsript-options 5 12 'toggle)))
2c840b90
KS
3985
3986
3987;;;###autoload
3988(defun pr-toggle-tumble ()
3989 "Toggle tumble.
3990
3991If tumble is off, produces a printing suitable for binding on the left or
3992right.
3993If tumble is on, produces a printing suitable for binding at the top or
3994bottom."
3995 (interactive)
6367b616
VJL
3996 (pr-save-interactive
3997 (pr-toggle 'ps-spool-tumble "Tumble"
3998 'postscript-options 6 12 'toggle)))
2c840b90
KS
3999
4000
4001;;;###autoload
4002(defun pr-toggle-landscape ()
4003 "Toggle landscape."
4004 (interactive)
6367b616
VJL
4005 (pr-save-interactive
4006 (pr-toggle 'ps-landscape-mode "Landscape"
4007 'postscript-options 0 12 'toggle)))
2c840b90
KS
4008
4009
4010;;;###autoload
4011(defun pr-toggle-upside-down ()
4012 "Toggle upside-down."
4013 (interactive)
6367b616
VJL
4014 (pr-save-interactive
4015 (pr-toggle 'ps-print-upside-down "Upside-Down"
4016 'postscript-options 7 12 'toggle)))
2c840b90
KS
4017
4018
4019;;;###autoload
4020(defun pr-toggle-line ()
4021 "Toggle line number."
4022 (interactive)
6367b616
VJL
4023 (pr-save-interactive
4024 (pr-toggle 'ps-line-number "Line number"
4025 'postscript-options 3 12 'toggle)))
2c840b90
KS
4026
4027
4028;;;###autoload
4029(defun pr-toggle-zebra ()
4030 "Toggle zebra stripes."
4031 (interactive)
6367b616
VJL
4032 (pr-save-interactive
4033 (pr-toggle 'ps-zebra-stripes "Zebra stripe"
4034 'postscript-options 4 12 'toggle)))
2c840b90
KS
4035
4036
4037;;;###autoload
4038(defun pr-toggle-header ()
4039 "Toggle printing header."
4040 (interactive)
6367b616
VJL
4041 (pr-save-interactive
4042 (pr-toggle 'ps-print-header "Print header"
4043 'postscript-options 1 12 'toggle)))
2c840b90
KS
4044
4045
4046;;;###autoload
4047(defun pr-toggle-header-frame ()
4048 "Toggle printing header frame."
4049 (interactive)
6367b616
VJL
4050 (pr-save-interactive
4051 (pr-toggle 'ps-print-header-frame "Print header frame"
4052 'postscript-options 2 12 'toggle)))
2c840b90
KS
4053
4054
4055;;;###autoload
4056(defun pr-toggle-lock ()
4057 "Toggle menu lock."
4058 (interactive)
6367b616
VJL
4059 (pr-save-interactive
4060 (pr-toggle 'pr-menu-lock "Menu lock"
4061 'printing 2 12 'toggle)))
2c840b90
KS
4062
4063
4064;;;###autoload
4065(defun pr-toggle-region ()
4066 "Toggle auto region."
4067 (interactive)
6367b616
VJL
4068 (pr-save-interactive
4069 (pr-toggle 'pr-auto-region "Auto region"
4070 'printing 0 12 'toggle)))
2c840b90
KS
4071
4072
4073;;;###autoload
4074(defun pr-toggle-mode ()
4075 "Toggle auto mode."
4076 (interactive)
6367b616
VJL
4077 (pr-save-interactive
4078 (pr-toggle 'pr-auto-mode "Auto mode"
4079 'printing 1 12 'toggle)))
2c840b90
KS
4080
4081
4082;;;###autoload
4083(defun pr-customize (&rest ignore)
449cba44 4084 "Customization of the `printing' group."
2c840b90
KS
4085 (interactive)
4086 (customize-group 'printing))
4087
4088
4089;;;###autoload
4090(defun lpr-customize (&rest ignore)
449cba44 4091 "Customization of the `lpr' group."
2c840b90
KS
4092 (interactive)
4093 (customize-group 'lpr))
4094
4095
4096;;;###autoload
4097(defun pr-help (&rest ignore)
449cba44 4098 "Help for the printing package."
2c840b90
KS
4099 (interactive)
4100 (pr-show-setup pr-help-message "*Printing Help*"))
4101
4102
4103;;;###autoload
4104(defun pr-ps-name ()
449cba44 4105 "Interactively select a PostScript printer."
2c840b90 4106 (interactive)
6367b616
VJL
4107 (pr-save-interactive
4108 (pr-menu-set-ps-title
4109 (pr-complete-alist "PostScript printer"
4110 pr-ps-printer-alist pr-ps-name))))
2c840b90
KS
4111
4112
4113;;;###autoload
4114(defun pr-txt-name ()
449cba44 4115 "Interactively select a text printer."
2c840b90 4116 (interactive)
6367b616
VJL
4117 (pr-save-interactive
4118 (pr-menu-set-txt-title
4119 (pr-complete-alist "Text printer"
4120 pr-txt-printer-alist pr-txt-name))))
2c840b90
KS
4121
4122
4123;;;###autoload
4124(defun pr-ps-utility ()
449cba44 4125 "Interactively select a PostScript utility."
2c840b90 4126 (interactive)
6367b616
VJL
4127 (pr-save-interactive
4128 (pr-menu-set-utility-title
4129 (pr-complete-alist "Postscript utility"
4130 pr-ps-utility-alist pr-ps-utility))))
2c840b90
KS
4131
4132
4133;;;###autoload
4134(defun pr-show-ps-setup (&rest ignore)
4135 "Show current ps-print settings."
4136 (interactive)
4137 (pr-show-setup (ps-setup) "*PS Setup*"))
4138
4139
4140;;;###autoload
4141(defun pr-show-pr-setup (&rest ignore)
4142 "Show current printing settings."
4143 (interactive)
4144 (pr-show-setup (pr-setup) "*PR Setup*"))
4145
4146
4147;;;###autoload
4148(defun pr-show-lpr-setup (&rest ignore)
4149 "Show current lpr settings."
4150 (interactive)
4151 (pr-show-setup (lpr-setup) "*LPR Setup*"))
4152
4153
4154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4155;; Fast Commands
4156
4157
4158;;;###autoload
4159(defun pr-ps-fast-fire (n-up &optional select)
4160 "Fast fire function for PostScript printing.
4161
4162If a region is active, the region will be printed instead of the whole buffer.
4163Also if the current major-mode is defined in `pr-mode-alist', the settings in
4164`pr-mode-alist' will be used, that is, the current buffer or region will be
4165printed using `pr-ps-mode-ps-print'.
4166
4167
4168Interactively, you have the following situations:
4169
4170 M-x pr-ps-fast-fire RET
4171 The command prompts the user for a N-UP value and printing will
4172 immediatelly be done using the current active printer.
4173
4174 C-u M-x pr-ps-fast-fire RET
4175 C-u 0 M-x pr-ps-fast-fire RET
4176 The command prompts the user for a N-UP value and also for a current
4177 PostScript printer, then printing will immediatelly be done using the new
4178 current active printer.
4179
4180 C-u 1 M-x pr-ps-fast-fire RET
4181 The command prompts the user for a N-UP value and also for a file name,
4182 and saves the PostScript image in that file instead of sending it to the
4183 printer.
4184
4185 C-u 2 M-x pr-ps-fast-fire RET
4186 The command prompts the user for a N-UP value, then for a current
4187 PostScript printer and, finally, for a file name. Then change the active
4188 printer to that choosen by user and saves the PostScript image in
4189 that file instead of sending it to the printer.
4190
4191
4192Noninteractively, the argument N-UP should be a positive integer greater than
4193zero and the argument SELECT is treated as follows:
4194
4195 If it's nil, send the image to the printer.
4196
4197 If it's a list or an integer lesser or equal to zero, the command prompts
4198 the user for a current PostScript printer, then printing will immediatelly
4199 be done using the new current active printer.
4200
4201 If it's an integer equal to 1, the command prompts the user for a file name
4202 and saves the PostScript image in that file instead of sending it to the
4203 printer.
4204
4205 If it's an integer greater or equal to 2, the command prompts the user for a
4206 current PostScript printer and for a file name. Then change the active
4207 printer to that choosen by user and saves the PostScript image in that file
4208 instead of sending it to the printer.
4209
4210 If it's a symbol which it's defined in `pr-ps-printer-alist', it's the new
4211 active printer and printing will immediatelly be done using the new active
4212 printer.
4213
4214 Otherwise, send the image to the printer.
4215
4216
4217Note that this command always behaves as if `pr-auto-region' and `pr-auto-mode'
4218are both set to t."
4219 (interactive (list (pr-interactive-n-up (pr-prompt-gs "PS print fast"))
4220 current-prefix-arg))
6367b616
VJL
4221 (pr-save-interactive
4222 (let ((pr-auto-region t)
4223 (pr-auto-mode t)
4224 filename)
4225 (cond ((null select))
4226 ((listp select)
4227 (pr-ps-name))
4228 ((and (symbolp select)
4229 (assq select pr-ps-printer-alist))
4230 (pr-menu-set-ps-title select))
4231 ((integerp select)
4232 (and (/= select 1)
4233 (pr-ps-name))
4234 (and (>= select 1) (not pr-spool-p)
4235 (setq filename (pr-ps-outfile-preprint
4236 (if pr-print-using-ghostscript
4237 "Fast GS "
4238 "Fast "))))))
4239 (pr-ps-buffer-ps-print
4240 (if (integerp n-up)
4241 (min (max n-up 1) 100)
4242 (error "n-up must be an integer greater than zero"))
4243 filename))))
2c840b90
KS
4244
4245
4246;;;###autoload
4247(defun pr-txt-fast-fire (&optional select-printer)
4248 "Fast fire function for text printing.
4249
4250If a region is active, the region will be printed instead of the whole buffer.
4251Also if the current major-mode is defined in `pr-mode-alist', the settings in
4252`pr-mode-alist' will be used, that is, the current buffer or region will be
4253printed using `pr-txt-mode'.
4254
4255Interactively, when you use a prefix argument (C-u), the command prompts the
4256user for a new active text printer.
4257
4258Noninteractively, the argument SELECT-PRINTER is treated as follows:
4259
4260 If it's nil, the printing is sent to the current active text printer.
4261
4262 If it's a symbol which it's defined in `pr-txt-printer-alist', it's the new
4263 active printer and printing will immediatelly be done using the new active
4264 printer.
4265
4266 If it's non-nil, the command prompts the user for a new active text printer.
4267
4268Note that this command always behaves as if `pr-auto-region' and `pr-auto-mode'
4269are both set to t."
4270 (interactive (list current-prefix-arg))
6367b616
VJL
4271 (pr-save-interactive
4272 (cond ((null select-printer))
4273 ((and (symbolp select-printer)
4274 (assq select-printer pr-txt-printer-alist))
4275 (pr-menu-set-txt-title select-printer))
4276 (t
4277 (pr-txt-name)))
4278 (let ((pr-auto-region t)
4279 (pr-auto-mode t))
4280 (pr-txt-buffer))))
2c840b90
KS
4281
4282
4283;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4284;; Utilities
4285
4286
4287(defun pr-setup ()
4288 "Return the current `printing' setup.
4289
4290This is *not* an interactive command.
4291One way to see `printing' setup is to switch to a *Scratch* buffer and type:
4292
4293 M-: (insert (pr-setup)) RET
4294
4295Or choose the menu option Printing/Show Settings/printing."
4296 (let (ps-prefix-quote)
4297 (mapconcat
4298 #'ps-print-quote
4299 (list
4300 (concat "\n;;; printing.el version " pr-version "\n")
45f17557
VJL
4301 ";; internal vars"
4302 (ps-comment-string "pr-txt-command " pr-txt-command)
4303 (ps-comment-string "pr-txt-switches "
4304 (pr-switches-string pr-txt-switches "pr-txt-switches"))
4305 (ps-comment-string "pr-txt-printer " pr-txt-printer)
4306 (ps-comment-string "pr-ps-command " pr-ps-command)
4307 (ps-comment-string "pr-ps-switches "
4308 (pr-switches-string pr-ps-switches "pr-ps-switches"))
4309 (ps-comment-string "pr-ps-printer-switch" pr-ps-printer-switch)
4310 (ps-comment-string "pr-ps-printer " pr-ps-printer)
4311 (ps-comment-string "pr-cygwin-system " pr-cygwin-system)
4312 (ps-comment-string "ps-windows-system " ps-windows-system)
4313 (ps-comment-string "ps-lp-system " ps-lp-system)
4314 nil
4315 '(14 . pr-path-style)
4316 '(14 . pr-path-alist)
2c840b90
KS
4317 nil
4318 '(21 . pr-txt-name)
4319 '(21 . pr-txt-printer-alist)
4320 nil
4321 '(20 . pr-ps-name)
4322 '(20 . pr-ps-printer-alist)
4323 nil
4324 '(20 . pr-temp-dir)
4325 '(20 . pr-ps-temp-file)
6367b616 4326 '(20 . pr-file-modes)
2c840b90
KS
4327 '(20 . pr-delete-temp-file)
4328 '(20 . pr-list-directory)
4329 nil
4330 '(17 . pr-gv-command)
4331 '(17 . pr-gs-command)
4332 '(17 . pr-gs-switches)
4333 '(17 . pr-gs-device)
4334 '(17 . pr-gs-resolution)
4335 nil
4336 '(27 . pr-print-using-ghostscript)
4337 '(27 . pr-faces-p)
4338 '(27 . pr-spool-p)
4339 '(27 . pr-file-landscape)
4340 '(27 . pr-file-duplex)
4341 '(27 . pr-file-tumble)
4342 '(27 . pr-auto-region)
4343 '(27 . pr-auto-mode)
4344 nil
4345 '(20 . pr-ps-utility)
4346 '(20 . pr-ps-utility-alist)
4347 nil
4348 '(14 . pr-mode-alist)
4349 nil
4350 '(20 . pr-menu-lock)
4351 '(20 . pr-menu-char-height)
4352 '(20 . pr-menu-char-width)
4353 nil
4354 '(20 . pr-setting-database)
4355 nil
4356 '(22 . pr-visible-entry-list)
4357 nil
4358 '(22 . pr-buffer-verbose)
4359 '(22 . pr-buffer-name)
4360 '(22 . pr-buffer-name-ignore)
4361 ")\n\n;;; printing.el - end of settings\n")
4362 "\n")))
4363
4364
4365(defun lpr-setup ()
4366 "Return the current `lpr' setup.
4367
4368This is *not* an interactive command.
4369One way to see `lpr' setup is to switch to a *Scratch* buffer and type:
4370
4371 M-: (insert (lpr-setup)) RET
4372
4373Or choose the menu option Printing/Show Settings/lpr."
4374 (let (ps-prefix-quote)
4375 (mapconcat
4376 #'ps-print-quote
4377 '("\n;;; lpr.el settings\n"
4378 (25 . printer-name)
4379 (25 . lpr-switches)
4380 (25 . lpr-add-switches)
4381 (25 . lpr-command)
4382 (25 . lpr-headers-switches)
4383 (25 . print-region-function)
4384 (25 . lpr-page-header-program)
4385 (25 . lpr-page-header-switches)
4386 ")\n\n;;; lpr.el - end of settings\n")
4387 "\n")))
4388
4389
4390;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4391;; mh-e (adapted from mh-e-init.el -- Tom Vogels <tov@ece.cmu.edu>)
4392
4393
4394(defalias 'pr-mh-get-msg-num 'mh-get-msg-num)
4395(defalias 'pr-mh-show 'mh-show)
4396(defalias 'pr-mh-start-of-uncleaned-message 'mh-start-of-uncleaned-message)
4397(defvar mh-show-buffer nil)
4398
4399
4400(defun pr-article-date ()
4401 "Find the date of an article or mail message in current buffer.
4402Return only the dayname, if present, weekday, month, and year."
4403 (save-excursion
4404 (goto-char (point-min))
4405 (if (re-search-forward
4406 "^Date:[ \t]+\\(\\([A-Za-z]+, \\)?[0-9]+ [A-Za-z]+ [0-9]+\\)" nil t)
4407 (buffer-substring (match-beginning 1) (match-end 1))
4408 (format-time-string "%Y/%m/%d"))))
4409
4410
4411(defun pr-mh-current-message ()
4412 "Go to mh-inbox current message."
4413 (let ((msg (or (pr-mh-get-msg-num nil) 0)))
4414 (pr-mh-show)
4415 (set-buffer mh-show-buffer)
4416 (goto-char (point-min))
4417 (pr-mh-start-of-uncleaned-message)
4418 (message "Printing message %d" msg)))
4419
4420
4421(defun pr-mh-print-1 (n-up filename header-list)
4422 "Print mh-inbox current message in PostScript."
4423 (save-excursion
4424 (save-window-excursion
4425 (pr-mh-current-message)
4426 (pr-mode-print n-up filename header-list (point)))))
4427
4428
4429(defun pr-mh-lpr-1 (header-list)
4430 "Print mh-inbox current message in text printer."
4431 (save-excursion
4432 (save-window-excursion
4433 (pr-mh-current-message)
4434 (pr-mode-lpr header-list (point)))))
4435
4436
4437(defalias 'pr-mh-print-2 'pr-mode-print)
4438
4439
4440(defalias 'pr-mh-lpr-2 'pr-mode-lpr)
4441
4442
4443;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4444;; rmail (hacked from ps-print.el)
4445
4446
4447(defun pr-rmail-lpr (header-list)
4448 "Print RMAIL current message in text printer."
4449 (pr-lpr-message-from-summary header-list
4450 'rmail-buffer 'rmail-summary-buffer))
4451
4452
4453(defun pr-rmail-print (n-up filename header-list)
4454 "Print RMAIL current message in PostScript."
4455 (pr-ps-message-from-summary n-up filename header-list
4456 'rmail-buffer 'rmail-summary-buffer))
4457
4458
4459(defun pr-ps-message-from-summary (n-up filename header-list
4460 summary-buffer summary-default)
4461 "Print current message in PostScript."
4462 (let ((buf (or (and (boundp summary-buffer)
4463 (symbol-value summary-buffer))
4464 (symbol-value summary-default))))
4465 (and (get-buffer buf)
4466 (save-excursion
4467 (set-buffer buf)
4468 (pr-mode-print n-up filename header-list)))))
4469
4470
4471(defun pr-lpr-message-from-summary (header-list summary-buffer summary-default)
4472 "Print current message in text printer."
4473 (let ((buf (or (and (boundp summary-buffer)
4474 (symbol-value summary-buffer))
4475 (symbol-value summary-default))))
4476 (and (get-buffer buf)
4477 (save-excursion
4478 (set-buffer buf)
4479 (pr-mode-lpr header-list)))))
4480
4481
4482;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4483;; gnus (hacked from ps-print.el)
4484
4485
4486(defvar pr-gnus-article "*Article*")
4487
4488
4489(defun pr-gnus-print (n-up filename header-list)
4490 "Print *Article* current message in PostScript."
4491 (pr-ps-message-from-summary n-up filename header-list
4492 'gnus-article-buffer 'pr-gnus-article))
4493
4494
4495(defun pr-gnus-lpr (header-list)
4496 "Print *Article* current message in text printer."
4497 (pr-lpr-message-from-summary header-list
4498 'gnus-article-buffer 'pr-gnus-article))
4499
4500
4501;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4502;; vm (hacked from ps-print.el)
4503
4504
4505(defvar pr-vm-summary "")
4506
4507
4508(defun pr-vm-print (n-up filename header-list)
4509 "Print current vm message in PostScript."
4510 (pr-ps-message-from-summary n-up filename header-list
4511 'vm-mail-buffer 'pr-vm-summary))
4512
4513
4514(defun pr-vm-lpr (header-list)
4515 "Print current vm message in text printer."
4516 (pr-lpr-message-from-summary header-list
4517 'vm-mail-buffer 'pr-vm-summary))
4518
4519
4520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4521;; Mode Functions
4522
4523
4524(defun pr-ps-mode (n-up filename)
4525 "If current major mode is declared, print it in PostScript."
4526 (let ((args (pr-mode-alist-p)))
4527 (if args
4528 (let ((fun (cdr args)))
4529 (funcall (car fun) n-up filename (cdr fun))
4530 t)
4531 (ding)
4532 (message "`%s' major mode not declared." major-mode)
4533 nil)))
4534
4535
4536(defmacro pr-local-variable (header-list &rest body)
4537 `(save-excursion
4538 (let ((ps-header-lines (or (nth 0 ,header-list) ps-header-lines))
4539 (ps-left-header (or (nth 1 ,header-list) ps-left-header))
4540 (ps-right-header (or (nth 2 ,header-list) ps-right-header))
4541 ps-razzle-dazzle)
4542 (let ((local-var-list (pr-eval-local-alist (nthcdr 4 ,header-list))))
4543 ,@body
4544 (and (nth 3 ,header-list)
4545 (pr-kill-local-variable local-var-list))))))
4546
4547
4548(defun pr-mode-print (n-up filename header-list &optional from to)
4549 "Print current major mode in PostScript."
4550 (pr-local-variable
4551 header-list
4552 (let ((file (pr-ps-file filename))
4553 (start (cond (from)
4554 ((pr-region-active-p) (region-beginning))
4555 (t nil)
4556 )))
4557 (pr-text2ps (pr-region-active-symbol start) n-up file start
4558 (cond (to)
4559 ((pr-region-active-p) (region-end))
4560 (from (point-max))
4561 ))
4562 (unless (or pr-spool-p filename)
4563 (pr-ps-file-print file)
4564 (pr-delete-file file)))))
4565
4566
4567(defun pr-mode-lpr (header-list &optional from to)
4568 "Print current major mode in text printer."
4569 (pr-local-variable
4570 header-list
4571 (pr-txt-print (cond (from)
4572 ((pr-region-active-p) (region-beginning))
4573 (t (point-min)))
4574 (cond (to)
4575 ((pr-region-active-p) (region-end))
4576 (t (point-max))))))
4577
4578
4579;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4580;; Menu Lock
4581
4582
4583(defconst pr-menu-entry-alist
4584 '((postscript . 3)
4585 (text . 3)
4586 (postscript-options . 9)
4587 (postscript-process . 3)
4588 (printing . 3)
4589 (help . 3)
4590 )
4591 "Alist that associates menu part with number of items per part.
4592
4593It's used by `pr-menu-index'.
4594
4595Each element has the form:
4596
4597 (MENU-PART . NUMBER-OF-ITEMS)
4598
4599See `pr-visible-entry-alist'.")
4600
4601
4602(defun pr-menu-index (entry index)
4603 (let ((base-list
4604 (cond ((eq entry 'text)
4605 '(postscript))
4606 ((eq entry 'postscript-options)
4607 '(postscript text))
4608 ((eq entry 'postscript-process)
4609 '(postscript text postscript-options))
4610 ((eq entry 'printing)
4611 '(postscript text postscript-options postscript-process))
4612 (t
4613 nil)
4614 ))
4615 key)
4616 (while base-list
4617 (setq key (car base-list)
4618 base-list (cdr base-list))
4619 (and (pr-visible-p key)
4620 (setq index (+ index
4621 (cdr (assq key pr-menu-entry-alist)))))))
4622 (+ index 2))
4623
4624
449cba44
VJL
4625(defvar pr-menu-position nil)
4626(defvar pr-menu-state nil)
4627
4628
2c840b90
KS
4629(eval-and-compile
4630 (cond
4631 ((eq ps-print-emacs-type 'xemacs)
4632 ;; XEmacs
45f17557 4633 (defvar current-mouse-event nil) ; to avoid compilation gripes
2c840b90
KS
4634 (defun pr-menu-position (entry index horizontal)
4635 (pr-x-make-event
4636 'button-release
4637 (list 'button 1
4638 'x (- (pr-x-event-x-pixel current-mouse-event) ; X
4639 (* horizontal pr-menu-char-width))
4640 'y (- (pr-x-event-y-pixel current-mouse-event) ; Y
4641 (* (pr-menu-index entry index) pr-menu-char-height)))))
4642 )
4643 (ps-windows-system
4644 ;; GNU Emacs for Windows 9x/NT
4645 (defun pr-menu-position (entry index horizontal)
4646 (let ((pos (cdr (pr-e-mouse-pixel-position))))
4647 (list
034cb096
VJL
4648 (list (or (car pos) 0) ; X
4649 (- (or (cdr pos) 0) ; Y
2c840b90
KS
4650 (* (pr-menu-index entry index) pr-menu-char-height)))
4651 (selected-frame)))) ; frame
4652 )
4653 (t
4654 ;; GNU Emacs
4655 (defun pr-menu-position (entry index horizontal)
4656 (let ((pos (cdr (pr-e-mouse-pixel-position))))
4657 (list
034cb096 4658 (list (- (or (car pos) 0) ; X
2c840b90 4659 (* horizontal pr-menu-char-width))
034cb096 4660 (- (or (cdr pos) 0) ; Y
2c840b90
KS
4661 (* (pr-menu-index entry index) pr-menu-char-height)))
4662 (selected-frame)))) ; frame
449cba44 4663 ))
2c840b90 4664
449cba44
VJL
4665 (cond
4666 ((eq ps-print-emacs-type 'emacs)
4667 ;; GNU Emacs
4668 (defun pr-menu-lookup (path)
4669 (let ((ipath pr-menu-bar))
4670 (lookup-key global-map
4671 (if path
4672 (vconcat ipath
4673 (mapcar 'pr-get-symbol
4674 (if (listp path)
4675 path
4676 (list path))))
4677 ipath))))
2c840b90 4678
449cba44
VJL
4679 ;; GNU Emacs
4680 (defun pr-menu-lock (entry index horizontal state path)
6367b616 4681 (when (and (not pr-interactive-p) pr-menu-lock)
449cba44
VJL
4682 (or (and pr-menu-position (eq state pr-menu-state))
4683 (setq pr-menu-position (pr-menu-position entry index horizontal)
4684 pr-menu-state state))
4685 (let* ((menu (pr-menu-lookup path))
4686 (result (x-popup-menu pr-menu-position menu)))
4687 (and result
4688 (let ((command (lookup-key menu (vconcat result))))
4689 (if (fboundp command)
4690 (funcall command)
4691 (eval command)))))
4692 (setq pr-menu-position nil))))
2c840b90 4693
2c840b90 4694
449cba44
VJL
4695 ((eq ps-print-emacs-type 'xemacs)
4696 ;; XEmacs
45f17557 4697 (defvar current-menubar nil) ; to avoid compilation gripes
449cba44
VJL
4698 (defun pr-menu-lookup (path)
4699 (car (pr-x-find-menu-item current-menubar (cons "Printing" path))))
2c840b90 4700
449cba44
VJL
4701 ;; XEmacs
4702 (defun pr-menu-lock (entry index horizontal state path)
6367b616 4703 (when (and (not pr-interactive-p) pr-menu-lock)
449cba44
VJL
4704 (or (and pr-menu-position (eq state pr-menu-state))
4705 (setq pr-menu-position (pr-menu-position entry index horizontal)
4706 pr-menu-state state))
4707 (let* ((menu (pr-menu-lookup path))
4708 (result (pr-x-get-popup-menu-response menu pr-menu-position)))
4709 (and (pr-x-misc-user-event-p result)
4710 (funcall (pr-x-event-function result)
4711 (pr-x-event-object result))))
4712 (setq pr-menu-position nil))))))
2c840b90
KS
4713
4714
4715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4716;; Printer & Utility Selection
4717
4718
4719(defun pr-update-var (var-sym alist)
4720 (or (assq (symbol-value var-sym) alist)
4721 (set var-sym (car (car alist)))))
4722
4723
4724(defun pr-update-menus (&optional force)
4725 "Update utility, PostScript and text printer menus.
4726
4727If FORCE is non-nil, update menus doesn't matter if `pr-ps-printer-alist',
4728`pr-txt-printer-alist' or `pr-ps-utility-alist' were modified or not;
4729otherwise, update PostScript printer menu iff `pr-ps-printer-menu-modified' is
4730non-nil, update text printer menu iff `pr-txt-printer-menu-modified' is
4731non-nil, and update PostScript File menus iff `pr-ps-utility-menu-modified' is
4732non-nil."
757caf1c 4733 (interactive "P")
6367b616
VJL
4734 (pr-save-interactive
4735 (pr-update-var 'pr-ps-name pr-ps-printer-alist)
4736 (pr-update-var 'pr-txt-name pr-txt-printer-alist)
4737 (pr-update-var 'pr-ps-utility pr-ps-utility-alist)
4738 (pr-do-update-menus force)))
2c840b90
KS
4739
4740
4741(defvar pr-ps-printer-menu-modified t
449cba44 4742 "Non-nil means `pr-ps-printer-alist' was modified and we need to update menu.")
2c840b90 4743(defvar pr-txt-printer-menu-modified t
449cba44 4744 "Non-nil means `pr-txt-printer-alist' was modified and we need to update menu.")
2c840b90 4745(defvar pr-ps-utility-menu-modified t
449cba44 4746 "Non-nil means `pr-ps-utility-alist' was modified and we need to update menu.")
2c840b90
KS
4747
4748
4749(defconst pr-even-or-odd-alist
449cba44
VJL
4750 '((nil . "Print All Pages")
4751 (even-page . "Print Even Pages")
4752 (odd-page . "Print Odd Pages")
2c840b90 4753 (even-sheet . "Print Even Sheets")
449cba44 4754 (odd-sheet . "Print Odd Sheets")))
2c840b90
KS
4755
4756
4757(defun pr-menu-create (name alist var-sym fun entry index)
4758 (cons name
4759 (mapcar
4760 #'(lambda (elt)
4761 (let ((sym (car elt)))
4762 (vector
4763 (symbol-name sym)
4764 (list fun (list 'quote sym) nil (list 'quote entry) index)
4765 :style 'radio
4766 :selected (list 'eq var-sym (list 'quote sym)))))
4767 alist)))
4768
4769
4770(eval-and-compile
4771 (cond
4772 ((eq ps-print-emacs-type 'emacs)
4773 ;; GNU Emacs
4774 (defalias 'pr-update-mode-line 'force-mode-line-update)
4775
4776 ;; GNU Emacs
4777 (defun pr-do-update-menus (&optional force)
4778 (pr-menu-alist pr-ps-printer-alist
4779 'pr-ps-name
4780 'pr-menu-set-ps-title
4781 "PostScript Printers"
4782 'pr-ps-printer-menu-modified
4783 force
4784 "PostScript Printers"
4785 'postscript 2)
4786 (pr-menu-alist pr-txt-printer-alist
4787 'pr-txt-name
4788 'pr-menu-set-txt-title
4789 "Text Printers"
4790 'pr-txt-printer-menu-modified
4791 force
4792 "Text Printers"
4793 'text 2)
4794 (let ((save-var pr-ps-utility-menu-modified))
4795 (pr-menu-alist pr-ps-utility-alist
4796 'pr-ps-utility
4797 'pr-menu-set-utility-title
4798 '("PostScript Print" "File" "PostScript Utility")
4799 'save-var
4800 force
4801 "PostScript Utility"
4802 nil 1))
4803 (pr-menu-alist pr-ps-utility-alist
4804 'pr-ps-utility
4805 'pr-menu-set-utility-title
4806 '("PostScript Preview" "File" "PostScript Utility")
4807 'pr-ps-utility-menu-modified
4808 force
4809 "PostScript Utility"
4810 nil 1)
4811 (pr-even-or-odd-pages ps-even-or-odd-pages force))
4812
4813 ;; GNU Emacs
4814 (defvar pr-temp-menu nil)
4815
4816 ;; GNU Emacs
4817 (defun pr-menu-alist (alist var-sym fun menu-path modified-sym force name
4818 entry index)
4819 (when (and alist (or force (symbol-value modified-sym)))
4820 (easy-menu-define pr-temp-menu nil ""
4821 (pr-menu-create name alist var-sym fun entry index))
4822 (let ((item (pr-menu-get-item menu-path)))
4823 (and item
4824 (let* ((binding (nthcdr 3 item))
4825 (key-binding (cdr binding)))
4826 (setcar binding pr-temp-menu)
4827 (and key-binding (listp (car key-binding))
4828 (setcdr binding (cdr key-binding))) ; skip KEY-BINDING
4829 (funcall fun (symbol-value var-sym) item))))
4830 (set modified-sym nil)))
4831
4832 ;; GNU Emacs
4833 (defun pr-menu-set-ps-title (value &optional item entry index)
4834 (pr-menu-set-item-name (or item
4835 (pr-menu-get-item "PostScript Printers"))
4836 (format "PostScript Printer: %s" value))
4837 (pr-ps-set-printer value)
4838 (and index
4839 (pr-menu-lock entry index 12 'toggle nil)))
4840
4841 ;; GNU Emacs
4842 (defun pr-menu-set-txt-title (value &optional item entry index)
4843 (pr-menu-set-item-name (or item
4844 (pr-menu-get-item "Text Printers"))
4845 (format "Text Printer: %s" value))
4846 (pr-txt-set-printer value)
4847 (and index
4848 (pr-menu-lock entry index 12 'toggle nil)))
4849
4850 ;; GNU Emacs
4851 (defun pr-menu-set-utility-title (value &optional item entry index)
4852 (let ((name (symbol-name value)))
4853 (if item
4854 (pr-menu-set-item-name item name)
4855 (pr-menu-set-item-name
4856 (pr-menu-get-item
4857 '("PostScript Print" "File" "PostScript Utility"))
4858 name)
4859 (pr-menu-set-item-name
4860 (pr-menu-get-item
4861 '("PostScript Preview" "File" "PostScript Utility"))
4862 name)))
4863 (pr-ps-set-utility value)
4864 (and index
4865 (pr-menu-lock entry index 5 nil '("PostScript Print" "File"))))
4866
4867 ;; GNU Emacs
4868 (defun pr-even-or-odd-pages (value &optional no-lock)
4869 (pr-menu-set-item-name (pr-menu-get-item "Print All Pages")
4870 (cdr (assq value pr-even-or-odd-alist)))
4871 (setq ps-even-or-odd-pages value)
4872 (or no-lock
4873 (pr-menu-lock 'postscript-options 8 12 'toggle nil))))
4874
4875
4876 ((eq ps-print-emacs-type 'xemacs)
4877 ;; XEmacs
4878 (defalias 'pr-update-mode-line 'set-menubar-dirty-flag)
4879
4880 ;; XEmacs
4881 (defvar pr-ps-name-old "PostScript Printers")
4882 (defvar pr-txt-name-old "Text Printers")
4883 (defvar pr-ps-utility-old "PostScript Utility")
4884 (defvar pr-even-or-odd-old "Print All Pages")
4885
4886 ;; XEmacs
4887 (defun pr-do-update-menus (&optional force)
4888 (pr-menu-alist pr-ps-printer-alist
4889 'pr-ps-name
4890 'pr-menu-set-ps-title
4891 '("Printing")
4892 'pr-ps-printer-menu-modified
4893 force
4894 pr-ps-name-old
4895 'postscript 2)
4896 (pr-menu-alist pr-txt-printer-alist
4897 'pr-txt-name
4898 'pr-menu-set-txt-title
4899 '("Printing")
4900 'pr-txt-printer-menu-modified
4901 force
4902 pr-txt-name-old
4903 'text 2)
4904 (let ((save-var pr-ps-utility-menu-modified))
4905 (pr-menu-alist pr-ps-utility-alist
4906 'pr-ps-utility
4907 'pr-menu-set-utility-title
4908 '("Printing" "PostScript Print" "File")
4909 'save-var
4910 force
4911 pr-ps-utility-old
4912 nil 1))
4913 (pr-menu-alist pr-ps-utility-alist
4914 'pr-ps-utility
4915 'pr-menu-set-utility-title
4916 '("Printing" "PostScript Preview" "File")
4917 'pr-ps-utility-menu-modified
4918 force
4919 pr-ps-utility-old
4920 nil 1)
4921 (pr-even-or-odd-pages ps-even-or-odd-pages force))
4922
4923 ;; XEmacs
4924 (defun pr-menu-alist (alist var-sym fun menu-path modified-sym force name
4925 entry index)
4926 (when (and alist (or force (symbol-value modified-sym)))
4927 (pr-xemacs-global-menubar
4928 (pr-x-add-submenu menu-path
4929 (pr-menu-create name alist var-sym
4930 fun entry index)))
4931 (funcall fun (symbol-value var-sym))
4932 (set modified-sym nil)))
4933
4934 ;; XEmacs
4935 (defun pr-menu-set-ps-title (value &optional item entry index)
4936 (pr-relabel-menu-item (format "PostScript Printer: %s" value)
4937 'pr-ps-name-old)
4938 (pr-ps-set-printer value)
4939 (and index
4940 (pr-menu-lock entry index 12 'toggle nil)))
4941
4942 ;; XEmacs
4943 (defun pr-menu-set-txt-title (value &optional item entry index)
4944 (pr-relabel-menu-item (format "Text Printer: %s" value)
4945 'pr-txt-name-old)
4946 (pr-txt-set-printer value)
4947 (and index
4948 (pr-menu-lock entry index 12 'toggle nil)))
4949
4950 ;; XEmacs
4951 (defun pr-menu-set-utility-title (value &optional item entry index)
4952 (pr-xemacs-global-menubar
4953 (let ((newname (format "%s" value)))
4954 (pr-x-relabel-menu-item
4955 (list "Printing" "PostScript Print" "File" pr-ps-utility-old)
4956 newname)
4957 (pr-x-relabel-menu-item
4958 (list "Printing" "PostScript Preview" "File" pr-ps-utility-old)
4959 newname)
4960 (setq pr-ps-utility-old newname)))
4961 (pr-ps-set-utility value)
4962 (and index
4963 (pr-menu-lock entry index 5 nil '("PostScript Print" "File"))))
4964
4965 ;; XEmacs
4966 (defun pr-even-or-odd-pages (value &optional no-lock)
4967 (pr-relabel-menu-item (cdr (assq value pr-even-or-odd-alist))
4968 'pr-even-or-odd-old)
4969 (setq ps-even-or-odd-pages value)
4970 (or no-lock
4971 (pr-menu-lock 'postscript-options 8 12 'toggle nil))))))
4972
4973;; XEmacs
4974(defun pr-relabel-menu-item (newname var-sym)
4975 (pr-xemacs-global-menubar
4976 (pr-x-relabel-menu-item
4977 (list "Printing" (symbol-value var-sym))
4978 newname)
4979 (set var-sym newname)))
4980
449cba44 4981;; GNU Emacs
2c840b90
KS
4982(defun pr-menu-set-item-name (item name)
4983 (and item
4984 (setcar (nthcdr 2 item) name))) ; ITEM-NAME
4985
449cba44 4986;; GNU Emacs
2c840b90
KS
4987(defun pr-menu-get-item (name-list)
4988 ;; NAME-LIST is a string or a list of strings.
4989 (let ((ipath pr-menu-bar)
4990 (len (and (listp name-list) (length name-list))))
4991 (and len (= len 1)
4992 (setq name-list (car name-list)))
4993 (cond
4994 ((null name-list)
4995 ;; nil
4996 nil)
4997 ((listp name-list)
4998 ;; list and (length list) > 1
4999 (let* ((copy (copy-sequence name-list))
5000 (name (pr-get-symbol (nth (1- len) copy)))
5001 (path (progn
5002 (setcdr (nthcdr (- len 2) copy) nil)
5003 copy))
5004 (menu (lookup-key
5005 global-map
5006 (if path
5007 (vconcat ipath
5008 (mapcar 'pr-get-symbol path))
5009 ipath))))
5010 (assq name (nthcdr 2 menu))))
5011 (t
5012 ;; string
5013 (let ((name (pr-get-symbol name-list))
5014 (menu (lookup-key global-map ipath)))
5015 (assq name (nthcdr 2 menu)))))))
5016
5017
5018(defun pr-ps-set-utility (value)
5019 (let ((item (cdr (assq value pr-ps-utility-alist))))
5020 (or item
5021 (error
747aa4cf 5022 "Invalid PostScript utility name `%s' for variable `pr-ps-utility'"
2c840b90
KS
5023 value))
5024 (setq pr-ps-utility value)
5025 (pr-eval-alist (nthcdr 9 item)))
5026 (pr-update-mode-line))
5027
5028
5029(defun pr-ps-set-printer (value)
5030 (let ((ps (cdr (assq value pr-ps-printer-alist))))
5031 (or ps
5032 (error
747aa4cf 5033 "Invalid PostScript printer name `%s' for variable `pr-ps-name'"
2c840b90
KS
5034 value))
5035 (setq pr-ps-name value
0117451d 5036 pr-ps-command (pr-dosify-file-name (nth 0 ps))
2c840b90
KS
5037 pr-ps-switches (nth 1 ps)
5038 pr-ps-printer-switch (nth 2 ps)
45f17557 5039 pr-ps-printer (nth 3 ps))
2c840b90
KS
5040 (or (stringp pr-ps-command)
5041 (setq pr-ps-command
5042 (cond (ps-windows-system "print")
5043 (ps-lp-system "lp")
5044 (t "lpr")
5045 )))
5046 (or (stringp pr-ps-printer-switch)
5047 (setq pr-ps-printer-switch
5048 (cond (ps-windows-system "/D:")
5049 (ps-lp-system "-d")
5050 (t "-P")
5051 )))
5052 (pr-eval-alist (nthcdr 4 ps)))
5053 (pr-update-mode-line))
5054
5055
5056(defun pr-txt-set-printer (value)
5057 (let ((txt (cdr (assq value pr-txt-printer-alist))))
5058 (or txt
747aa4cf 5059 (error "Invalid text printer name `%s' for variable `pr-txt-name'"
2c840b90
KS
5060 value))
5061 (setq pr-txt-name value
0117451d 5062 pr-txt-command (pr-dosify-file-name (nth 0 txt))
2c840b90 5063 pr-txt-switches (nth 1 txt)
45f17557 5064 pr-txt-printer (nth 2 txt)))
2c840b90
KS
5065 (or (stringp pr-txt-command)
5066 (setq pr-txt-command
5067 (cond (ps-windows-system "print")
5068 (ps-lp-system "lp")
5069 (t "lpr")
5070 )))
5071 (pr-update-mode-line))
5072
5073
5074(defun pr-eval-alist (alist)
5075 (mapcar #'(lambda (option)
5076 (let ((var-sym (car option))
5077 (value (cdr option)))
5078 (if (eq var-sym 'inherits-from:)
5079 (pr-eval-setting-alist value 'global)
5080 (set var-sym (eval value)))))
5081 alist))
5082
5083
5084(defun pr-eval-local-alist (alist)
5085 (let (local-list)
5086 (mapcar #'(lambda (option)
5087 (let ((var-sym (car option))
5088 (value (cdr option)))
5089 (setq local-list
5090 (if (eq var-sym 'inherits-from:)
5091 (nconc (pr-eval-setting-alist value) local-list)
5092 (set (make-local-variable var-sym) (eval value))
5093 (cons var-sym local-list)))))
5094 alist)
5095 local-list))
5096
5097
5098(defun pr-eval-setting-alist (key &optional global old)
5099 (let ((setting (cdr (assq key pr-setting-database))))
5100 (and setting
5101 (let ((inherits (nth 0 setting))
5102 (local (nth 1 setting))
5103 (kill (nth 2 setting))
5104 local-list)
5105 (and local global
5106 (progn
5107 (ding)
5108 (message "There are local buffer settings for `%S'." key)
5109 (setq global nil)))
5110 (and inherits
5111 (if (memq inherits old)
747aa4cf 5112 (error "Circular inheritance for `%S'" inherits)
2c840b90
KS
5113 (setq local-list
5114 (pr-eval-setting-alist inherits global
5115 (cons inherits old)))))
5116 (mapcar
5117 (cond ((not local) ; global settings
5118 #'(lambda (option)
5119 (let ((var-sym (car option)))
5120 (or (eq var-sym 'inherits-from:)
5121 (set var-sym (eval (cdr option)))))))
5122 (kill ; local settings with killing
5123 #'(lambda (option)
5124 (let ((var-sym (car option)))
5125 (unless (eq var-sym 'inherits-from:)
5126 (setq local-list (cons var-sym local-list))
5127 (set (make-local-variable var-sym)
5128 (eval (cdr option)))))))
5129 (t ; local settings without killing
5130 #'(lambda (option)
5131 (let ((var-sym (car option)))
5132 (or (eq var-sym 'inherits-from:)
5133 (set (make-local-variable var-sym)
5134 (eval (cdr option))))))))
5135 (nthcdr 3 setting))
5136 local-list))))
5137
5138
5139(defun pr-kill-local-variable (local-var-list)
5140 (mapcar 'kill-local-variable local-var-list))
5141
5142
5143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5144;; Internal Functions (II)
5145
5146
5147(defun pr-prompt (str)
5148 (if (pr-auto-mode-p)
5149 (concat str " mode")
5150 (pr-region-active-string str)))
5151
5152
5153(defun pr-prompt-region (str)
5154 (concat str (if (pr-auto-mode-p)
5155 " mode"
5156 " region")))
5157
5158
5159(defun pr-prompt-gs (str)
5160 (if (pr-using-ghostscript-p)
5161 (concat str " GS")
5162 str))
5163
5164
5165(defun pr-region-active-symbol (&optional region-p)
5166 (if (or region-p (pr-region-active-p))
5167 'region
5168 'buffer))
5169
5170
5171(defun pr-region-active-string (prefix)
5172 (concat prefix
5173 (if (pr-region-active-p)
5174 " region"
5175 " buffer")))
5176
5177
5178(defun pr-show-setup (settings buffer-name)
5179 (with-output-to-temp-buffer buffer-name
5180 (princ settings)
5181 (print-help-return-message)))
5182
5183
5184(defun pr-complete-alist (prompt alist default)
5185 (let ((collection (mapcar #'(lambda (elt)
5186 (setq elt (car elt))
5187 (cons (symbol-name elt) elt))
5188 alist)))
5189 (cdr (assoc (completing-read (concat prompt ": ")
5190 collection nil t
5191 (symbol-name default) nil
5192 (symbol-name default))
5193 collection))))
5194
5195
5196(defun pr-delete-file (file)
b1f6fa86
VJL
5197 (and pr-delete-temp-file (file-exists-p file)
5198 (delete-file file)))
2c840b90
KS
5199
5200
5201(defun pr-expand-file-name (filename)
0117451d 5202 (pr-dosify-file-name (expand-file-name filename)))
2c840b90
KS
5203
5204
5205(defun pr-ps-outfile-preprint (&optional mess)
5206 (let* ((prompt (format "%soutput PostScript file name: " (or mess "")))
5207 (res (read-file-name prompt default-directory "" nil)))
5208 (while (cond ((not (file-writable-p res))
5209 (ding)
5210 (setq prompt "is unwritable"))
5211 ((file-directory-p res)
5212 (ding)
5213 (setq prompt "is a directory"))
5214 ((file-exists-p res)
5215 (ding)
5216 (setq prompt "exists")
5217 (not (y-or-n-p (format "File `%s' exists; overwrite? "
5218 res))))
5219 (t nil))
5220 (setq res (read-file-name
5221 (format "File %s; PostScript file: " prompt)
5222 (file-name-directory res) nil nil
5223 (file-name-nondirectory res))))
5224 (pr-expand-file-name res)))
5225
5226
5227(defun pr-ps-infile-preprint (&optional mess)
5228 (let* ((prompt (format "%sinput PostScript file name: " (or mess "")))
5229 (res (read-file-name prompt default-directory "" nil)))
5230 (while (cond ((not (file-exists-p res))
5231 (ding)
5232 (setq prompt "doesn't exist"))
5233 ((not (file-readable-p res))
5234 (ding)
5235 (setq prompt "is unreadable"))
5236 ((file-directory-p res)
5237 (ding)
5238 (setq prompt "is a directory"))
5239 (t nil))
5240 (setq res (read-file-name
5241 (format "File %s; PostScript file: " prompt)
5242 (file-name-directory res) nil nil
5243 (file-name-nondirectory res))))
5244 (pr-expand-file-name res)))
5245
5246
5247(defun pr-toggle (var-sym mess entry index horizontal state &optional path)
5248 (set var-sym (not (symbol-value var-sym)))
5249 (message "%s is %s" mess (if (symbol-value var-sym) "on" "off"))
5250 (pr-menu-lock entry index horizontal state path))
5251
5252
5253(defun pr-ps-utility-args (n-up-sym infile-sym outfile-sym prompt)
5254 ;; n-up
5255 (or (symbol-value n-up-sym)
5256 (set n-up-sym (pr-interactive-n-up prompt)))
5257 (and (eq (symbol-value infile-sym) t)
6367b616 5258 (set infile-sym (and (not pr-interactive-p)
2c840b90
KS
5259 (pr-ps-infile-preprint prompt))))
5260 ;; input file
5261 (or (symbol-value infile-sym)
5262 (error "%s: input PostScript file name is missing" prompt))
0117451d 5263 (set infile-sym (pr-dosify-file-name (symbol-value infile-sym)))
2c840b90
KS
5264 ;; output file
5265 (and (eq (symbol-value outfile-sym) t)
6367b616 5266 (set outfile-sym (and (not pr-interactive-p)
2c840b90
KS
5267 current-prefix-arg
5268 (pr-ps-outfile-preprint prompt))))
5269 (and (symbol-value outfile-sym)
0117451d 5270 (set outfile-sym (pr-dosify-file-name (symbol-value outfile-sym))))
2c840b90
KS
5271 (pr-ps-file (symbol-value outfile-sym)))
5272
5273
5274(defun pr-ps-utility-process (n-up infile outfile)
5275 (let (item)
5276 (and (stringp infile) (file-exists-p infile)
5277 (setq item (cdr (assq pr-ps-utility pr-ps-utility-alist)))
45f17557
VJL
5278 (pr-call-process (nth 0 item)
5279 (pr-switches-string (nth 1 item)
5280 "pr-ps-utility-alist entry")
5281 (pr-switches-string (nth 8 item)
5282 "pr-ps-utility-alist entry")
5283 (and (nth 2 item)
5284 (format (nth 2 item) ps-paper-type))
5285 (format (nth 3 item) n-up)
5286 (and pr-file-landscape (nth 4 item))
5287 (and pr-file-duplex (nth 5 item))
5288 (and pr-file-tumble (nth 6 item))
5289 (pr-expand-file-name infile)
5290 (nth 7 item)
5291 (pr-expand-file-name outfile)))))
5292
5293
5294(defun pr-remove-nil-from-list (lst)
5295 (while (and lst (null (car lst)))
5296 (setq lst (cdr lst)))
5297 (let ((b lst)
5298 (l (cdr lst)))
5299 (while l
5300 (if (car l)
5301 (setq b l
5302 l (cdr l))
5303 (setq l (cdr l))
5304 (setcdr b l))))
5305 lst)
5306
5307
5308(defun pr-call-process (command &rest args)
6367b616
VJL
5309 (pr-save-file-modes
5310 (let ((buffer (get-buffer-create "*Printing Command Output*"))
5311 (cmd (pr-command command))
5312 status)
5313 (setq args (pr-remove-nil-from-list args))
5314 (save-excursion
5315 (set-buffer buffer)
5316 (goto-char (point-max))
5317 (insert (format "%s %S\n" cmd args)))
5318 (setq status
5319 (condition-case data
5320 (apply 'call-process cmd nil buffer nil args)
5321 ((quit error)
5322 (error-message-string data))))
5323 (save-excursion
5324 (set-buffer buffer)
5325 (goto-char (point-max))
5326 (insert (format "Exit status: %s\n" status))))))
2c840b90
KS
5327
5328
5329(defun pr-txt-print (from to)
0117451d 5330 (let ((lpr-command (pr-standard-file-name (pr-command pr-txt-command)))
2c840b90
KS
5331 (lpr-switches (pr-switches pr-txt-switches "pr-txt-switches"))
5332 (printer-name pr-txt-printer))
5333 (lpr-region from to)))
5334
5335
5336(defun pr-switches-string (switches mess)
5337 (mapconcat 'identity (pr-switches switches mess) " "))
5338
5339
5340(defun pr-switches (switches mess)
5341 (or (listp switches)
747aa4cf 5342 (error "%S should have a list of strings" mess))
2c840b90
KS
5343 (ps-flatten-list ; dynamic evaluation
5344 (mapcar 'ps-eval-switch switches)))
5345
5346
5347(defun pr-ps-preview (kind n-up filename mess)
5348 (pr-set-n-up-and-filename 'n-up 'filename mess)
5349 (let ((file (pr-ps-file filename)))
5350 (pr-text2ps kind n-up file)
5351 (or pr-spool-p (pr-ps-file-preview file))))
5352
5353
5354(defun pr-ps-using-ghostscript (kind n-up filename mess)
5355 (pr-set-n-up-and-filename 'n-up 'filename mess)
5356 (let ((file (pr-ps-file filename)))
5357 (pr-text2ps kind n-up file)
5358 (unless (or pr-spool-p filename)
5359 (pr-ps-file-using-ghostscript file)
5360 (pr-delete-file file))))
5361
5362
5363(defun pr-ps-print (kind n-up filename mess)
5364 (pr-set-n-up-and-filename 'n-up 'filename mess)
5365 (let ((file (pr-ps-file filename)))
5366 (pr-text2ps kind n-up file)
5367 (unless (or pr-spool-p filename)
5368 (pr-ps-file-print file)
5369 (pr-delete-file file))))
5370
5371
5372(defun pr-ps-file (&optional filename)
0117451d
VJL
5373 (pr-dosify-file-name (or filename
5374 (convert-standard-filename
5375 (expand-file-name pr-ps-temp-file pr-temp-dir)))))
2c840b90
KS
5376
5377
5378(defun pr-interactive-n-up (mess)
5379 (or (stringp mess) (setq mess "*"))
5380 (save-match-data
5381 (let* ((fmt-prompt "%s[%s] N-up printing: (default 1) ")
5382 (prompt "")
5383 (str (pr-f-read-string (format fmt-prompt prompt mess) "1" nil "1"))
5384 int)
5385 (while (if (string-match "^\\s *[0-9]+$" str)
5386 (setq int (string-to-int str)
5387 prompt (cond ((< int 1) "Integer below 1; ")
5388 ((> int 100) "Integer above 100; ")
5389 (t nil)))
5390 (setq prompt "Invalid integer syntax; "))
5391 (ding)
5392 (setq str
5393 (pr-f-read-string (format fmt-prompt prompt mess) str nil "1")))
5394 int)))
5395
5396
5397(defun pr-interactive-dir (mess)
5398 (let* ((dir-name (file-name-directory (or (buffer-file-name)
5399 default-directory)))
5400 (fmt-prompt (concat "%s[" mess "] Directory to print: "))
5401 (dir (read-file-name (format fmt-prompt "")
5402 "" dir-name nil dir-name))
5403 prompt)
5404 (while (cond ((not (file-directory-p dir))
5405 (ding)
5406 (setq prompt "It's not a directory! "))
5407 ((not (file-readable-p dir))
5408 (ding)
5409 (setq prompt "Directory is unreadable! "))
5410 (t nil))
5411 (setq dir-name (file-name-directory dir)
5412 dir (read-file-name (format fmt-prompt prompt)
5413 "" dir-name nil dir-name)))
5414 (file-name-as-directory dir)))
5415
5416
5417(defun pr-interactive-regexp (mess)
5418 (pr-f-read-string (format "[%s] File regexp to print: " mess) "" nil ""))
5419
5420
5421(defun pr-interactive-dir-args (mess)
5422 (list
5423 ;; get directory argument
5424 (pr-interactive-dir mess)
5425 ;; get file name regexp
5426 (pr-interactive-regexp mess)))
5427
5428
5429(defun pr-interactive-ps-dir-args (mess)
5430 (list
5431 ;; get n-up argument
5432 (pr-interactive-n-up mess)
5433 ;; get directory argument
5434 (pr-interactive-dir mess)
5435 ;; get file name regexp
5436 (pr-interactive-regexp mess)
5437 ;; get output file name
5438 (and (not pr-spool-p)
5439 (ps-print-preprint current-prefix-arg))))
5440
5441
5442(defun pr-interactive-n-up-file (mess)
5443 (list
5444 ;; get n-up argument
5445 (pr-interactive-n-up mess)
5446 ;; get output file name
5447 (and (not pr-spool-p)
5448 (ps-print-preprint current-prefix-arg))))
5449
5450
5451(defun pr-interactive-n-up-inout (mess)
5452 (list
5453 ;; get n-up argument
5454 (pr-interactive-n-up mess)
5455 ;; get input file name
5456 (pr-ps-infile-preprint (concat mess " "))
5457 ;; get output file name
5458 (ps-print-preprint current-prefix-arg)))
5459
5460
5461(defun pr-set-outfilename (filename-sym)
5462 (and (not pr-spool-p)
5463 (eq (symbol-value filename-sym) t)
6367b616 5464 (set filename-sym (and (not pr-interactive-p)
2c840b90
KS
5465 current-prefix-arg
5466 (ps-print-preprint current-prefix-arg))))
5467 (and (symbol-value filename-sym)
0117451d 5468 (set filename-sym (pr-dosify-file-name (symbol-value filename-sym)))))
2c840b90
KS
5469
5470
5471(defun pr-set-n-up-and-filename (n-up-sym filename-sym mess)
5472 ;; n-up
5473 (or (symbol-value n-up-sym)
5474 (set n-up-sym (pr-interactive-n-up mess)))
5475 ;; output file
5476 (pr-set-outfilename filename-sym))
5477
5478
5479(defun pr-set-dir-args (dir-sym regexp-sym mess)
5480 ;; directory
5481 (or (symbol-value dir-sym)
5482 (set dir-sym (pr-interactive-dir mess)))
5483 ;; file name regexp
5484 (or (symbol-value regexp-sym)
5485 (set regexp-sym (pr-interactive-regexp mess))))
5486
5487
5488(defun pr-set-ps-dir-args (n-up-sym dir-sym regexp-sym filename-sym mess)
5489 ;; n-up
5490 (or (symbol-value n-up-sym)
5491 (set n-up-sym (pr-interactive-n-up mess)))
5492 ;; directory & file name regexp
5493 (pr-set-dir-args dir-sym regexp-sym mess)
5494 ;; output file
5495 (pr-set-outfilename filename-sym))
5496
5497
5498(defun pr-find-buffer-visiting (file)
5499 (if (not (file-directory-p file))
5500 (find-buffer-visiting (if ps-windows-system
5501 (downcase file)
5502 file))
5503 (let ((truename (file-truename file))
5504 (blist (buffer-list))
5505 found)
5506 (while (and (not found) blist)
5507 (save-excursion
5508 (set-buffer (car blist))
5509 (and (eq major-mode 'dired-mode)
5510 (save-excursion
5511 (goto-char (point-min))
5512 (string= (buffer-substring-no-properties
5513 (+ (point-min) 2)
5514 (progn
5515 (end-of-line)
5516 (1- (point))))
5517 truename))
5518 (setq found (car blist))))
5519 (setq blist (cdr blist)))
5520 found)))
5521
5522
5523(defun pr-file-list (dir file-regexp fun)
5524 (mapcar #'(lambda (file)
5525 (and (or pr-list-directory
5526 (not (file-directory-p file)))
5527 (let ((buffer (pr-find-buffer-visiting file))
5528 pop-up-windows
5529 pop-up-frames)
5530 (and (or buffer
5531 (file-readable-p file))
5532 (save-excursion
5533 (set-buffer (or buffer
5534 (find-file-noselect file)))
5535 (funcall fun)
5536 (or buffer
5537 (kill-buffer (current-buffer))))))))
5538 (directory-files dir t file-regexp)))
5539
5540
5541(defun pr-delete-file-if-exists (filename)
5542 (and (not pr-spool-p) (stringp filename) (file-exists-p filename)
5543 (delete-file filename)))
5544
5545
5546(defun pr-ps-file-list (n-up dir file-regexp filename)
5547 (pr-delete-file-if-exists (setq filename (pr-expand-file-name filename)))
5548 (let ((pr-spool-p t))
5549 (pr-file-list dir file-regexp
5550 #'(lambda ()
5551 (if (pr-auto-mode-p)
5552 (pr-ps-mode n-up filename)
5553 (pr-text2ps 'buffer n-up filename)))))
5554 (or pr-spool-p
5555 (pr-despool-print filename)))
5556
5557
5558(defun pr-text2ps (kind n-up filename &optional from to)
6367b616
VJL
5559 (pr-save-file-modes
5560 (let ((ps-n-up-printing n-up)
5561 (ps-spool-config (and (eq ps-spool-config 'setpagedevice)
5562 'setpagedevice)))
5563 (pr-delete-file-if-exists filename)
5564 (cond (pr-faces-p
5565 (cond (pr-spool-p
5566 ;; pr-faces-p and pr-spool-p
5567 ;; here FILENAME arg is ignored
5568 (cond ((eq kind 'buffer)
5569 (ps-spool-buffer-with-faces))
5570 ((eq kind 'region)
5571 (ps-spool-region-with-faces (or from (point))
5572 (or to (mark))))
5573 ))
2c840b90 5574 ;; pr-faces-p and not pr-spool-p
6367b616
VJL
5575 ((eq kind 'buffer)
5576 (ps-print-buffer-with-faces filename))
5577 ((eq kind 'region)
5578 (ps-print-region-with-faces (or from (point))
5579 (or to (mark)) filename))
5580 ))
5581 (pr-spool-p
5582 ;; not pr-faces-p and pr-spool-p
5583 ;; here FILENAME arg is ignored
5584 (cond ((eq kind 'buffer)
5585 (ps-spool-buffer))
5586 ((eq kind 'region)
5587 (ps-spool-region (or from (point)) (or to (mark))))
5588 ))
5589 ;; not pr-faces-p and not pr-spool-p
5590 ((eq kind 'buffer)
5591 (ps-print-buffer filename))
5592 ((eq kind 'region)
5593 (ps-print-region (or from (point)) (or to (mark)) filename))
5594 ))))
2c840b90
KS
5595
5596
5597(defun pr-command (command)
5598 "Return absolute file name specification for COMMAND.
5599
449cba44
VJL
5600If COMMAND is an empty string, return it.
5601
2c840b90
KS
5602If COMMAND is already an absolute file name specification, return it.
5603Else it uses `pr-path-alist' to find COMMAND, if find it then return it;
5604otherwise, gives an error.
5605
5606When using `pr-path-alist' to find COMMAND, the entries `cygwin', `windows' and
5607`unix' are used (see `pr-path-alist' for documentation).
5608
5609If Emacs is running on Windows 95/98/NT/2000, tries to find COMMAND,
5610COMMAND.exe, COMMAND.bat and COMMAND.com in this order."
449cba44
VJL
5611 (if (string= command "")
5612 command
0117451d 5613 (pr-dosify-file-name
449cba44
VJL
5614 (or (pr-find-command command)
5615 (pr-path-command (cond (pr-cygwin-system 'cygwin)
5616 (ps-windows-system 'windows)
5617 (t 'unix))
5618 (file-name-nondirectory command)
5619 nil)
5620 (error "Command not found: %s"
5621 (file-name-nondirectory command))))))
2c840b90
KS
5622
5623
5624(defun pr-path-command (symbol command sym-list)
5625 (let ((lpath (cdr (assq symbol pr-path-alist)))
5626 cmd)
5627 ;; PATH expansion
5628 (and (eq symbol 'PATH) (null lpath)
5629 (setq lpath (parse-colon-path (getenv "PATH"))))
5630 (while (and lpath
5631 (not
5632 (setq cmd
5633 (let ((path (car lpath)))
5634 (cond
5635 ;; symbol expansion
5636 ((symbolp path)
5637 (and (not (memq path sym-list))
5638 (pr-path-command path command
5639 (cons path sym-list))))
5640 ;; normal path
5641 ((stringp path)
5642 (pr-find-command
5643 (expand-file-name
5644 (substitute-in-file-name
5645 (concat (file-name-as-directory path)
5646 command)))))
5647 )))))
5648 (setq lpath (cdr lpath)))
5649 cmd))
5650
5651
5652(defun pr-find-command (cmd)
5653 (if ps-windows-system
5654 ;; windows system
5655 (let ((ext (cons (file-name-extension cmd t)
5656 (list ".exe" ".bat" ".com")))
5657 found)
5658 (setq cmd (file-name-sans-extension cmd))
5659 (while (and ext
5660 (setq found (concat cmd (car ext)))
5661 (not (and (file-regular-p found)
5662 (file-executable-p found))))
5663 (setq ext (cdr ext)
5664 found nil))
5665 found)
5666 ;; non-windows systems
5667 (and (file-regular-p cmd)
5668 (file-executable-p cmd)
5669 cmd)))
5670
5671
5672;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5673;; Printing Interface (inspired on ps-print-interface.el)
5674
5675
5676(require 'widget)
5677(require 'wid-edit)
5678(require 'cus-edit)
5679
5680
5681(defvar pr-i-window-configuration nil)
5682
5683(defvar pr-i-buffer nil)
5684(defvar pr-i-region nil)
5685(defvar pr-i-mode nil)
5686(defvar pr-i-despool nil)
5687(defvar pr-i-ps-as-is t)
5688(defvar pr-i-n-up 1)
5689(defvar pr-i-directory "./")
5690(defvar pr-i-regexp "")
5691(defvar pr-i-ps-file "")
5692(defvar pr-i-out-file "")
5693(defvar pr-i-answer-yes nil)
5694(defvar pr-i-process 'buffer)
5695(defvar pr-i-ps-send 'printer)
5696
5697
5698(defvar pr-interface-map nil
5699 "Keymap for pr-interface.")
5700
5701(if pr-interface-map
5702 nil
5703 (setq pr-interface-map (make-sparse-keymap))
5704 (cond ((eq ps-print-emacs-type 'xemacs) ; XEmacs
5705 (pr-f-set-keymap-parents pr-interface-map (list widget-keymap))
5706 (pr-f-set-keymap-name pr-interface-map 'pr-interface-map))
5707 ((eq ps-print-emacs-type 'emacs) ; GNU Emacs
5708 (pr-f-set-keymap-parents pr-interface-map widget-keymap)))
5709 (define-key pr-interface-map "q" 'pr-interface-quit)
5710 (define-key pr-interface-map "?" 'pr-interface-help))
5711
5712
5713(defmacro pr-interface-save (&rest body)
5714 `(save-excursion
5715 (set-buffer pr-i-buffer)
5716 ,@body))
5717
5718
5719(defun pr-create-interface ()
5720 "Create the front end for printing package."
5721 (setq pr-i-buffer (buffer-name (current-buffer))
5722 pr-i-region (ps-mark-active-p)
5723 pr-i-mode (pr-mode-alist-p)
5724 pr-i-window-configuration (current-window-configuration))
5725
5726 (put 'pr-i-process 'pr-widget-list nil)
5727 (put 'pr-i-ps-send 'pr-widget-list nil)
5728
5729 (delete-other-windows)
5730 (kill-buffer (get-buffer-create pr-buffer-name))
5731 (switch-to-buffer (get-buffer-create pr-buffer-name))
5732
5733 ;; header
5734 (let ((versions (concat "printing v" pr-version
5735 " ps-print v" ps-print-version)))
5736 (widget-insert (make-string (- 79 (length versions)) ?\ ) versions))
5737 (pr-insert-italic "\nCurrent Directory : " 1)
5738 (pr-insert-italic default-directory)
5739
5740 (pr-insert-section-1) ; 1. Print
5741 (pr-insert-section-2) ; 2. PostScript Printer
5742 (pr-insert-section-3) ; 3. Text Printer
5743
5744 ;; separator
5745 (widget-insert "\n\n " (make-string 77 ?-))
5746
5747 (pr-insert-section-4) ; 4. Settings
5748 (pr-insert-section-5) ; 5. Customize
5749 (pr-insert-section-6) ; 6. Show Settings
5750 (pr-insert-section-7) ; 7. Help
5751
5752 (use-local-map pr-interface-map)
5753 (widget-setup)
5754 (goto-char (point-min))
5755
5756 (and pr-i-region ; let region activated
5757 (pr-keep-region-active)))
5758
5759
5760(defun pr-insert-section-1 ()
5761 ;; 1. Print:
5762 (pr-insert-italic "\nPrint :" 1)
5763
5764 ;; 1a. Buffer:
5765 ;; 1a. Buffer: Buffer List
5766 (pr-insert-radio-button 'pr-i-process 'buffer)
5767 (pr-insert-menu "Buffer List" 'pr-i-buffer
5768 (let ((blist (buffer-list))
5769 case-fold-search choices)
5770 (while blist
5771 (let ((name (buffer-name (car blist)))
5772 (ignore pr-buffer-name-ignore)
5773 found)
5774 (setq blist (cdr blist))
5775 (while (and ignore (not found))
5776 (setq found (string-match (car ignore) name)
5777 ignore (cdr ignore)))
5778 (or found
5779 (setq choices
5780 (cons (list 'quote
5781 (list 'choice-item
5782 :format "%[%t%]"
5783 name))
5784 choices)))))
5785 (nreverse choices))
5786 " Buffer : " nil
5787 '(progn
5788 (pr-interface-save
5789 (setq pr-i-region (ps-mark-active-p)
5790 pr-i-mode (pr-mode-alist-p)))
5791 (pr-update-checkbox 'pr-i-region)
5792 (pr-update-checkbox 'pr-i-mode)))
5793 ;; 1a. Buffer: Region
5794 (put 'pr-i-region 'pr-widget
5795 (pr-insert-checkbox
5796 "\n "
5797 'pr-i-region
5798 #'(lambda (widget &rest ignore)
5799 (let ((region-p (pr-interface-save
5800 (ps-mark-active-p))))
5801 (cond ((null (widget-value widget)) ; widget is nil
5802 (setq pr-i-region nil))
5803 (region-p ; widget is true and there is a region
5804 (setq pr-i-region t)
5805 (widget-value-set widget t)
5806 (widget-setup)) ; MUST be called after widget-value-set
5807 (t ; widget is true and there is no region
5808 (ding)
5809 (message "There is no region active")
5810 (setq pr-i-region nil)
5811 (widget-value-set widget nil)
5812 (widget-setup))))) ; MUST be called after widget-value-set
5813 " Region"))
5814 ;; 1a. Buffer: Mode
5815 (put 'pr-i-mode 'pr-widget
5816 (pr-insert-checkbox
5817 " "
5818 'pr-i-mode
5819 #'(lambda (widget &rest ignore)
5820 (let ((mode-p (pr-interface-save
5821 (pr-mode-alist-p))))
5822 (cond
5823 ((null (widget-value widget)) ; widget is nil
5824 (setq pr-i-mode nil))
5825 (mode-p ; widget is true and there is a `mode'
5826 (setq pr-i-mode t)
5827 (widget-value-set widget t)
5828 (widget-setup)) ; MUST be called after widget-value-set
5829 (t ; widget is true and there is no `mode'
5830 (ding)
5831 (message
5832 "This buffer isn't in a mode that printing treats specially.")
5833 (setq pr-i-mode nil)
5834 (widget-value-set widget nil)
5835 (widget-setup))))) ; MUST be called after widget-value-set
5836 " Mode\n"))
5837
5838 ;; 1b. Directory:
5839 (pr-insert-radio-button 'pr-i-process 'directory)
5840 (widget-create
5841 'directory
5842 :size 58
5843 :format " Directory : %v"
5844 :notify 'pr-interface-directory
5845 :action (lambda (widget &optional event)
5846 (if (pr-interface-directory widget)
5847 (pr-widget-field-action widget event)
5848 (ding)
449cba44 5849 (message "Please specify a readable directory")))
2c840b90
KS
5850 pr-i-directory)
5851 ;; 1b. Directory: File Regexp
5852 (widget-create 'regexp
5853 :size 58
5854 :format "\n File Regexp : %v\n"
5855 :notify (lambda (widget &rest ignore)
5856 (setq pr-i-regexp (widget-value widget)))
5857 pr-i-regexp)
5858 ;; 1b. Directory: List Directory Entry
5859 (widget-insert " ")
5860 (pr-insert-toggle 'pr-list-directory " List Directory Entry\n")
5861
5862 ;; 1c. PostScript File:
5863 (pr-insert-radio-button 'pr-i-process 'file)
5864 (widget-create
5865 'file
5866 :size 51
5867 :format " PostScript File : %v"
5868 :notify 'pr-interface-infile
5869 :action (lambda (widget &rest event)
5870 (if (pr-interface-infile widget)
5871 (pr-widget-field-action widget event)
5872 (ding)
449cba44 5873 (message "Please specify a readable PostScript file")))
2c840b90
KS
5874 pr-i-ps-file)
5875 ;; 1c. PostScript File: PostScript Utility
5876 (pr-insert-menu "PostScript Utility" 'pr-ps-utility
5877 (pr-choice-alist pr-ps-utility-alist)
5878 "\n PostScript Utility : "
5879 " ")
b8d955f4
VJL
5880 ;; 1c. PostScript File: No Preprocessing
5881 (pr-insert-toggle 'pr-i-ps-as-is " No Preprocessing"))
2c840b90
KS
5882
5883
5884(defun pr-insert-section-2 ()
5885 ;; 2. PostScript Printer:
5886 ;; 2. PostScript Printer: PostScript Printer List
5887 (pr-insert-italic "\n\nPostScript Printer : " 2 20)
5888 (pr-insert-menu "PostScript Printer" 'pr-ps-name
5889 (pr-choice-alist pr-ps-printer-alist))
5890 ;; 2. PostScript Printer: Despool
5891 (put 'pr-i-despool 'pr-widget
5892 (pr-insert-checkbox
5893 " "
5894 'pr-i-despool
5895 #'(lambda (widget &rest ignore)
5896 (if pr-spool-p
5897 (setq pr-i-despool (not pr-i-despool))
5898 (ding)
449cba44 5899 (message "Can despool only when spooling is actually selected")
2c840b90
KS
5900 (setq pr-i-despool nil))
5901 (widget-value-set widget pr-i-despool)
5902 (widget-setup)) ; MUST be called after widget-value-set
5903 " Despool "))
5904 ;; 2. PostScript Printer: Preview Print Quit
5905 (pr-insert-button 'pr-interface-preview "Preview" " ")
5906 (pr-insert-button 'pr-interface-ps-print "Print" " ")
5907 (pr-insert-button 'pr-interface-quit "Quit")
5908 ;; 2. PostScript Printer: Send to Printer/Temporary File
5909 (pr-insert-radio-button 'pr-i-ps-send 'printer)
5910 (widget-insert " Send to Printer/Temporary File")
5911 ;; 2. PostScript Printer: Send to File
5912 (pr-insert-radio-button 'pr-i-ps-send 'file)
5913 (widget-create
5914 'file
5915 :size 57
5916 :format " Send to File : %v"
5917 :notify 'pr-interface-outfile
5918 :action (lambda (widget &rest event)
5919 (if (and (pr-interface-outfile widget)
5920 (or (not (file-exists-p pr-i-out-file))
5921 (setq pr-i-answer-yes
5922 (y-or-n-p "File exists; overwrite? "))))
5923 (pr-widget-field-action widget event)
5924 (ding)
449cba44 5925 (message "Please specify a writable PostScript file")))
2c840b90
KS
5926 pr-i-out-file)
5927 ;; 2. PostScript Printer: N-Up
5928 (widget-create
5929 'integer
5930 :size 3
5931 :format "\n N-Up : %v"
5932 :notify (lambda (widget &rest ignore)
5933 (let ((value (if (string= (widget-apply widget :value-get) "")
5934 0
5935 (widget-value widget))))
5936 (if (and (integerp value)
5937 (<= 1 value) (<= value 100))
5938 (progn
5939 (message " ")
5940 (setq pr-i-n-up value))
5941 (ding)
449cba44 5942 (message "Please specify an integer between 1 and 100"))))
2c840b90
KS
5943 pr-i-n-up))
5944
5945
5946(defun pr-insert-section-3 ()
5947 ;; 3. Text Printer:
5948 (pr-insert-italic "\n\nText Printer : " 2 14)
5949 (pr-insert-menu "Text Printer" 'pr-txt-name
5950 (pr-choice-alist pr-txt-printer-alist)
5951 nil " ")
5952 (pr-insert-button 'pr-interface-printify "Printify" " ")
5953 (pr-insert-button 'pr-interface-txt-print "Print" " ")
5954 (pr-insert-button 'pr-interface-quit "Quit"))
5955
5956
5957(defun pr-insert-section-4 ()
5958 ;; 4. Settings:
5959 ;; 4. Settings: Landscape Auto Region Verbose
5960 (pr-insert-checkbox "\n\n " 'ps-landscape-mode
5961 #'(lambda (&rest ignore)
5962 (setq ps-landscape-mode (not ps-landscape-mode)
5963 pr-file-landscape ps-landscape-mode))
5964 " Landscape ")
5965 (pr-insert-toggle 'pr-auto-region " Auto Region ")
5966 (pr-insert-toggle 'pr-buffer-verbose " Verbose\n ")
5967
5968 ;; 4. Settings: Print Header Auto Mode
5969 (pr-insert-toggle 'ps-print-header " Print Header ")
5970 (pr-insert-toggle 'pr-auto-mode " Auto Mode\n ")
5971
5972 ;; 4. Settings: Print Header Frame Menu Lock
5973 (pr-insert-toggle 'ps-print-header-frame " Print Header Frame ")
5974 (pr-insert-toggle 'pr-menu-lock " Menu Lock\n ")
5975
5976 ;; 4. Settings: Line Number
5977 (pr-insert-toggle 'ps-line-number " Line Number\n ")
5978
5979 ;; 4. Settings: Zebra Stripes Spool Buffer
5980 (pr-insert-toggle 'ps-zebra-stripes " Zebra Stripes")
5981 (pr-insert-checkbox " "
5982 'pr-spool-p
5983 #'(lambda (&rest ignore)
5984 (setq pr-spool-p (not pr-spool-p))
5985 (unless pr-spool-p
5986 (setq pr-i-despool nil)
5987 (pr-update-checkbox 'pr-i-despool)))
5988 " Spool Buffer")
5989
449cba44 5990 ;; 4. Settings: Duplex Print with faces
2c840b90
KS
5991 (pr-insert-checkbox "\n "
5992 'ps-spool-duplex
5993 #'(lambda (&rest ignore)
5994 (setq ps-spool-duplex (not ps-spool-duplex)
5995 pr-file-duplex ps-spool-duplex))
5996 " Duplex ")
449cba44 5997 (pr-insert-toggle 'pr-faces-p " Print with faces")
2c840b90 5998
449cba44 5999 ;; 4. Settings: Tumble Print via Ghostscript
2c840b90
KS
6000 (pr-insert-checkbox "\n "
6001 'ps-spool-tumble
6002 #'(lambda (&rest ignore)
6003 (setq ps-spool-tumble (not ps-spool-tumble)
6004 pr-file-tumble ps-spool-tumble))
6005 " Tumble ")
449cba44 6006 (pr-insert-toggle 'pr-print-using-ghostscript " Print via Ghostscript\n ")
2c840b90
KS
6007
6008 ;; 4. Settings: Upside-Down Page Parity
acc037ba
VJL
6009 (pr-insert-toggle 'ps-print-upside-down " Upside-Down")
6010 (pr-insert-italic "\n\nSelect Pages : " 2 14)
2c840b90
KS
6011 (pr-insert-menu "Page Parity" 'ps-even-or-odd-pages
6012 (mapcar #'(lambda (alist)
6013 (list 'quote
6014 (list 'choice-item
6015 :format "%[%t%]"
6016 :tag (cdr alist)
6017 :value (car alist))))
6018 pr-even-or-odd-alist)))
6019
6020
6021(defun pr-insert-section-5 ()
6022 ;; 5. Customize:
6023 (pr-insert-italic "\n\nCustomize : " 2 11)
6024 (pr-insert-button 'pr-customize "printing" " ")
6025 (pr-insert-button #'(lambda (&rest ignore) (ps-print-customize))
6026 "ps-print" " ")
6027 (pr-insert-button 'lpr-customize "lpr"))
6028
6029
6030(defun pr-insert-section-6 ()
6031 ;; 6. Show Settings:
6032 (pr-insert-italic "\nShow Settings : " 1 14)
6033 (pr-insert-button 'pr-show-pr-setup "printing" " ")
6034 (pr-insert-button 'pr-show-ps-setup "ps-print" " ")
6035 (pr-insert-button 'pr-show-lpr-setup "lpr"))
6036
6037
6038(defun pr-insert-section-7 ()
6039 ;; 7. Help:
6040 (pr-insert-italic "\nHelp : " 1 5)
6041 (pr-insert-button 'pr-interface-help "Interface Help" " ")
6042 (pr-insert-button 'pr-help "Menu Help" " ")
6043 (pr-insert-button 'pr-interface-quit "Quit" "\n ")
6044 (pr-insert-button 'pr-kill-help "Kill All Printing Help Buffer"))
6045
6046
6047(defun pr-kill-help (&rest ignore)
6048 "Kill all printing help buffer."
6049 (interactive)
6050 (let ((help '("*Printing Interface Help*" "*Printing Help*"
6051 "*LPR Setup*" "*PR Setup*" "*PS Setup*")))
6052 (while help
6053 (let ((buffer (get-buffer (car help))))
6054 (setq help (cdr help))
6055 (when buffer
6056 (delete-windows-on buffer)
6057 (kill-buffer buffer)))))
6058 (recenter (- (window-height) 2)))
6059
6060
6061(defun pr-interface-quit (&rest ignore)
6062 "Kill the printing buffer interface and quit."
6063 (interactive)
6064 (kill-buffer pr-buffer-name)
6065 (set-window-configuration pr-i-window-configuration))
6066
6067
6068(defun pr-interface-help (&rest ignore)
6069 "printing buffer interface help."
6070 (interactive)
6071 (pr-show-setup pr-interface-help-message "*Printing Interface Help*"))
6072
6073
6074(defun pr-interface-txt-print (&rest ignore)
6075 "Print using lpr package."
6076 (interactive)
6077 (condition-case data
6078 (cond
6079 ((eq pr-i-process 'directory)
6080 (pr-i-directory)
6081 (pr-interface-save
6082 (pr-txt-directory pr-i-directory pr-i-regexp)))
6083 ((eq pr-i-process 'buffer)
6084 (pr-interface-save
6085 (cond (pr-i-region
6086 (let ((pr-auto-mode pr-i-mode))
6087 (pr-txt-region)))
6088 (pr-i-mode
6089 (let (pr-auto-region)
6090 (pr-txt-mode)))
6091 (t
6092 (let (pr-auto-mode pr-auto-region)
6093 (pr-txt-buffer)))
6094 )))
6095 ((eq pr-i-process 'file)
449cba44 6096 (error "Please specify a text file"))
2c840b90
KS
6097 (t
6098 (error "Internal error: `pr-i-process' = %S" pr-i-process))
6099 )
6100 ;; handlers
6101 ((quit error)
6102 (ding)
6103 (message (error-message-string data)))))
6104
6105
6106(defun pr-interface-printify (&rest ignore)
6107 "Printify a buffer."
6108 (interactive)
6109 (condition-case data
6110 (cond
6111 ((eq pr-i-process 'directory)
6112 (pr-i-directory)
6113 (pr-interface-save
6114 (pr-printify-directory pr-i-directory pr-i-regexp)))
6115 ((eq pr-i-process 'buffer)
6116 (pr-interface-save
6117 (if pr-i-region
6118 (pr-printify-region)
6119 (pr-printify-buffer))))
6120 ((eq pr-i-process 'file)
449cba44 6121 (error "Cannot printify a PostScript file"))
2c840b90
KS
6122 (t
6123 (error "Internal error: `pr-i-process' = %S" pr-i-process))
6124 )
6125 ;; handlers
6126 ((quit error)
6127 (ding)
6128 (message (error-message-string data)))))
6129
6130
6131(defun pr-interface-ps-print (&rest ignore)
6132 "Print using ps-print package."
6133 (interactive)
6367b616
VJL
6134 (pr-save-interactive
6135 (pr-interface-ps 'pr-despool-ps-print 'pr-ps-directory-ps-print
6136 'pr-ps-file-ps-print 'pr-ps-file-up-ps-print
6137 'pr-ps-region-ps-print 'pr-ps-mode-ps-print
6138 'pr-ps-buffer-ps-print)))
2c840b90
KS
6139
6140
6141(defun pr-interface-preview (&rest ignore)
6142 "Preview a PostScript file."
6143 (interactive)
6367b616
VJL
6144 (pr-save-interactive
6145 (pr-interface-ps 'pr-despool-preview 'pr-ps-directory-preview
6146 'pr-ps-file-preview 'pr-ps-file-up-preview
6147 'pr-ps-region-preview 'pr-ps-mode-preview
6148 'pr-ps-buffer-preview)))
2c840b90
KS
6149
6150
6151(defun pr-interface-ps (ps-despool ps-directory ps-file ps-file-up ps-region
6152 ps-mode ps-buffer)
6153 (condition-case data
6154 (let ((outfile (or (and (eq pr-i-process 'file) pr-i-ps-as-is)
6155 (pr-i-ps-send))))
6156 (cond
6157 ((and pr-i-despool pr-spool-p)
6158 (pr-interface-save
6159 (funcall ps-despool outfile))
6160 (setq pr-i-despool nil)
6161 (pr-update-checkbox 'pr-i-despool))
6162 ((eq pr-i-process 'directory)
6163 (pr-i-directory)
6164 (pr-interface-save
6165 (funcall ps-directory
6166 pr-i-n-up pr-i-directory pr-i-regexp outfile)))
6167 ((eq pr-i-process 'file)
6168 (cond ((or (file-directory-p pr-i-ps-file)
6169 (not (file-readable-p pr-i-ps-file)))
449cba44 6170 (error "Please specify a readable PostScript file"))
2c840b90
KS
6171 (pr-i-ps-as-is
6172 (pr-interface-save
6173 (funcall ps-file pr-i-ps-file)))
6174 (t
6175 (pr-interface-save
6176 (funcall ps-file-up pr-i-n-up pr-i-ps-file outfile)))
6177 ))
6178 ((eq pr-i-process 'buffer)
6179 (pr-interface-save
6180 (cond (pr-i-region
6181 (let ((pr-auto-mode pr-i-mode))
6182 (funcall ps-region pr-i-n-up outfile)))
6183 (pr-i-mode
6184 (let (pr-auto-region)
6185 (funcall ps-mode pr-i-n-up outfile)))
6186 (t
6187 (let (pr-auto-mode pr-auto-region)
6188 (funcall ps-buffer pr-i-n-up outfile)))
6189 )))
6190 (t
6191 (error "Internal error: `pr-i-process' = %S" pr-i-process))
6192 ))
6193 ;; handlers
6194 ((quit error)
6195 (ding)
6196 (message (error-message-string data)))))
6197
6198
6199(defun pr-i-ps-send ()
6200 (cond ((eq pr-i-ps-send 'printer)
6201 nil)
6202 ((not (eq pr-i-ps-send 'file))
6203 (error "Internal error: `pr-i-ps-send' = %S" pr-i-ps-send))
6204 ((or (file-directory-p pr-i-out-file)
6205 (not (file-writable-p pr-i-out-file)))
449cba44 6206 (error "Please specify a writable PostScript file"))
2c840b90
KS
6207 ((or (not (file-exists-p pr-i-out-file))
6208 pr-i-answer-yes
6209 (setq pr-i-answer-yes
6210 (y-or-n-p (format "File `%s' exists; overwrite? "
6211 pr-i-out-file))))
6212 pr-i-out-file)
6213 (t
6214 (error "File already exists"))))
6215
6216
6217(defun pr-i-directory ()
6218 (or (and (file-directory-p pr-i-directory)
6219 (file-readable-p pr-i-directory))
449cba44 6220 (error "Please specify be a readable directory")))
2c840b90
KS
6221
6222
6223(defun pr-interface-directory (widget &rest ignore)
6224 (and pr-buffer-verbose
449cba44 6225 (message "You can use M-TAB or ESC TAB for file completion"))
2c840b90
KS
6226 (let ((dir (widget-value widget)))
6227 (and (file-directory-p dir)
6228 (file-readable-p dir)
6229 (setq pr-i-directory dir))))
6230
6231
6232(defun pr-interface-infile (widget &rest ignore)
6233 (and pr-buffer-verbose
449cba44 6234 (message "You can use M-TAB or ESC TAB for file completion"))
2c840b90
KS
6235 (let ((file (widget-value widget)))
6236 (and (not (file-directory-p file))
6237 (file-readable-p file)
6238 (setq pr-i-ps-file file))))
6239
6240
6241(defun pr-interface-outfile (widget &rest ignore)
6242 (setq pr-i-answer-yes nil)
6243 (and pr-buffer-verbose
449cba44 6244 (message "You can use M-TAB or ESC TAB for file completion"))
2c840b90
KS
6245 (let ((file (widget-value widget)))
6246 (and (not (file-directory-p file))
6247 (file-writable-p file)
6248 (setq pr-i-out-file file))))
6249
6250
6251(defun pr-widget-field-action (widget event)
6252 (and (get-buffer "*Completions*") ; clean frame window
6253 (delete-windows-on "*Completions*"))
6254 (message " ") ; clean echo area
6255 (widget-field-action widget event))
6256
6257
6258(defun pr-insert-italic (str &optional from to)
6259 (let ((len (length str)))
6260 (put-text-property (if from (max from 0) 0)
6261 (if to (max to len) len)
6262 'face 'italic str)
6263 (widget-insert str)))
6264
6265
6266(defun pr-insert-checkbox (before var-sym fun label)
6267 (widget-insert before)
6268 (prog1
6269 (widget-create 'checkbox
6270 :notify fun
6271 (symbol-value var-sym))
6272 (widget-insert label)))
6273
6274
6275(defun pr-insert-toggle (var-sym label)
6276 (widget-create 'checkbox
6277 :notify `(lambda (&rest ignore)
6278 (setq ,var-sym (not ,var-sym)))
6279 (symbol-value var-sym))
6280 (widget-insert label))
6281
6282
6283(defun pr-insert-button (fun label &optional separator)
6284 (widget-create 'push-button
6285 :notify fun
6286 label)
6287 (and separator
6288 (widget-insert separator)))
6289
6290
6291(defun pr-insert-menu (tag var-sym choices &optional before after &rest body)
6292 (and before (widget-insert before))
6293 (eval `(widget-create 'menu-choice
6294 :tag ,tag
6295 :format "%v"
6296 :inline t
6297 :value ,var-sym
6298 :notify (lambda (widget &rest ignore)
6299 (setq ,var-sym (widget-value widget))
6300 ,@body)
6301 :void '(choice-item :format "%[%t%]"
6302 :tag "Can not display value!")
6303 ,@choices))
6304 (and after (widget-insert after)))
6305
6306
6307(defun pr-insert-radio-button (var-sym sym)
6308 (widget-insert "\n")
6309 (let ((wid-list (get var-sym 'pr-widget-list))
6310 (wid (eval `(widget-create
6311 'radio-button
6312 :format " %[%v%]"
6313 :value (eq ,var-sym (quote ,sym))
6314 :notify (lambda (&rest ignore)
6315 (setq ,var-sym (quote ,sym))
6316 (pr-update-radio-button (quote ,var-sym)))))))
6317 (put var-sym 'pr-widget-list (cons (cons wid sym) wid-list))))
6318
6319
6320(defun pr-update-radio-button (var-sym)
6321 (let ((wid-list (get var-sym 'pr-widget-list)))
6322 (while wid-list
6323 (let ((wid (car (car wid-list)))
6324 (value (cdr (car wid-list))))
6325 (setq wid-list (cdr wid-list))
6326 (widget-value-set wid (eq (symbol-value var-sym) value))))
6327 (widget-setup)))
6328
6329
6330(defun pr-update-checkbox (var-sym)
6331 (let ((wid (get var-sym 'pr-widget)))
6332 (when wid
6333 (widget-value-set wid (symbol-value var-sym))
6334 (widget-setup))))
6335
6336
6337(defun pr-choice-alist (alist)
6338 (let ((max (apply 'max (mapcar #'(lambda (alist)
6339 (length (symbol-name (car alist))))
6340 alist))))
6341 (mapcar #'(lambda (alist)
6342 (let* ((sym (car alist))
6343 (name (symbol-name sym)))
6344 (list
6345 'quote
6346 (list
6347 'choice-item
6348 :format "%[%t%]"
6349 :tag (concat name
6350 (make-string (- max (length name)) ?_))
6351 :value sym))))
6352 alist)))
6353
6354
6355;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6356
6357
6358(pr-update-menus t)
6359
6360
6361(provide 'printing)
6362
6363
3a502e66 6364;; arch-tag: 9ce9ac3f-0f60-4370-900b-1943215d9d18
2c840b90 6365;;; printing.el ends here