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