From f73d0bde9d1c9c8d7b633a11e382f9251b1646ba Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Sun, 29 Jun 2025 10:29:27 +0200 Subject: [PATCH] Drop printing.el --- lisp/printing.el | 6193 ---------------------------------------------- lisp/ps-samp.el | 268 -- 2 files changed, 6461 deletions(-) delete mode 100644 lisp/printing.el delete mode 100644 lisp/ps-samp.el diff --git a/lisp/printing.el b/lisp/printing.el deleted file mode 100644 index 99408eef6fe..00000000000 --- a/lisp/printing.el +++ /dev/null @@ -1,6193 +0,0 @@ -;;; printing.el --- printing utilities -*- lexical-binding:t -*- - -;; Copyright (C) 2000-2025 Free Software Foundation, Inc. - -;; Author: Vinicius Jose Latorre -;; Keywords: text, print, PostScript -;; Old-Version: 6.9.3 -;; URL: https://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Introduction -;; ------------ -;; -;; With `printing' you can preview or print a PostScript file. You can also -;; print a text file using PostScript, and preview or print buffers that use -;; certain special modes like mh-folder-mode, rmail-summary-mode, -;; gnus-summary-mode, etc. This package also includes a PostScript/text -;; printer database. -;; -;; There are two user interfaces: -;; -;; * Menu interface: -;; The `printing' menu replaces the usual print options in the menu bar. -;; This is the default user interface. -;; -;; * Buffer interface: -;; You can use a buffer interface instead of menus. It looks like a -;; customization buffer. Basically, it has the same options found in the -;; menu and some extra options, all this on a buffer. -;; -;; `printing' is prepared to run on GNU, Unix and NT systems. -;; On GNU or Unix system, `printing' depends on gs and gv utilities. -;; On NT system, `printing' depends on gstools (gswin32.exe and gsview32.exe). -;; To obtain ghostscript, ghostview and GSview see the URL -;; `https://www.gnu.org/software/ghostscript/ghostscript.html'. -;; -;; `printing' depends on ps-print package to generate PostScript files, to -;; spool and to despool PostScript buffer. So, `printing' provides an -;; interface to ps-print package and it also provides some extra stuff. -;; -;; `printing' was inspired by: -;; -;; print-nt.el Frederic Corne -;; Special printing functions for Windows NT -;; -;; mh-e-init.el Tom Vogels -;; PS-print for mail messages -;; -;; win32-ps-print.el Matthew O. Persico -;; PostScript printing with ghostscript -;; -;; ps-print-interface.el Volker Franz -;; Graphical front end for ps-print and previewing -;; -;; -;; Log Messages -;; ------------ -;; -;; The buffer *Printing Command Output* is where the `printing' log messages -;; are inserted. All program called by `printing' has a log entry in the -;; buffer *Printing Command Output*. A log entry has the following form: -;; -;; PROGRAM (ARG...) -;; MESSAGE -;; Exit status: CODE -;; -;; Where -;; PROGRAM is the program activated by `printing', -;; ARG is an argument passed to PROGRAM (it can have more than one argument), -;; MESSAGE is an error message returned by PROGRAM (it can have no message, if -;; PROGRAM is successful), -;; and CODE is a numeric exit status or a signal description string. -;; -;; For example, after previewing a PostScript file, *Printing Command Output* -;; will have the following entry: -;; -;; /usr/bin/gv ("/home/user/example/file.ps") -;; Exit status: 0 -;; -;; In the example above, the previewing was successful. If during previewing, -;; you quit gv execution (by typing C-g during Emacs session), the log entry -;; would be: -;; -;; /usr/bin/gv ("/home/user/example/file.ps") -;; Exit status: Quit -;; -;; So, if something goes wrong, a good place to take a look is the buffer -;; *Printing Command Output*. Don't forget to see also the buffer *Messages*, -;; it can help. -;; -;; -;; Novices (First Users) -;; --------------------- -;; -;; First of all, see printing documentation only to get an idea of what -;; `printing' is capable. -;; -;; Then try to set the variables: `pr-ps-name', `pr-ps-printer-alist', -;; `pr-txt-name', `pr-txt-printer-alist' and `pr-path-alist'. These variables -;; are the main variables for printing processing. -;; -;; Now, please, see these variables documentation deeper. You can do this by -;; typing C-h v pr-ps-name RET (for example) if you already loaded printing -;; package, or by browsing printing.el source file. -;; -;; If the documentation isn't clear or if you find a way to improve the -;; documentation, please, send an email to maintainer. All printing users -;; will thank you. -;; -;; One way to set variables is by calling `pr-customize', customize all -;; variables and save the customization by future sessions (see Options -;; section). Other way is by adding code to your init file; see below -;; for a first setting template that it should be inserted on your -;; init file: -;; -;; * Example of setting for Windows system: -;; -;; (require 'printing) ; load printing package -;; (setq pr-path-alist -;; '((windows "c:/applications/executables" PATH ghostview mpage) -;; (ghostview "c:/gs/gsview-dir") -;; (mpage "c:/mpage-dir") -;; )) -;; (setq pr-txt-name 'prt_06a) -;; (setq pr-txt-printer-alist -;; '((prt_06a "print" nil "/D:\\\\printers\\prt_06a") -;; (prt_07c nil nil "/D:\\\\printers\\prt_07c") -;; (PRN "" nil "PRN") -;; (standard "redpr.exe" nil "") -;; )) -;; (setq pr-ps-name 'lps_06b) -;; (setq pr-ps-printer-alist -;; '((lps_06a "print" nil "/D:" "\\\\printers\\lps_06a") -;; (lps_06b "print" nil nil "\\\\printers\\lps_06b") -;; (lps_07c "print" nil "" "/D:\\\\printers\\lps_07c") -;; (lps_08c nil nil nil "\\\\printers\\lps_08c") -;; (LPT1 "" nil "" "LPT1:") -;; (PRN "" nil "" "PRN") -;; (standard "redpr.exe" nil "" "") -;; )) -;; (pr-update-menus t) ; update now printer and utility menus -;; -;; * Example of setting for GNU or Unix system: -;; -;; (require 'printing) ; load printing package -;; (setq pr-path-alist -;; '((unix "." "~/bin" ghostview mpage PATH) -;; (ghostview "$HOME/bin/gsview-dir") -;; (mpage "$HOME/bin/mpage-dir") -;; )) -;; (setq pr-txt-name 'prt_06a) -;; (setq pr-txt-printer-alist -;; '((prt_06a "lpr" nil "prt_06a") -;; (prt_07c nil nil "prt_07c") -;; )) -;; (setq pr-ps-name 'lps_06b) -;; (setq pr-ps-printer-alist -;; '((lps_06b "lpr" nil "-P" "lps_06b") -;; (lps_07c "lpr" nil nil "lps_07c") -;; (lps_08c nil nil nil "lps_08c") -;; )) -;; (pr-update-menus t) ; update now printer and utility menus -;; -;; -;; NOTE 1: Don't forget to download and install ghostscript utilities (see -;; Utilities section). -;; -;; NOTE 2: The `printer-name' and `ps-printer-name' variables don't need to be -;; set, as they are implicit set by `pr-ps-printer-alist' and -;; `pr-txt-printer-alist'. -;; -;; NOTE 3: The duplex feature will only work on PostScript printers that -;; support this feature. -;; You can check if your PostScript printer supports duplex feature -;; by checking the printer manual. Or you can try these steps: -;; 1. Open a buffer (or use the *scratch* buffer). -;; 2. Type: -;; First line (on first page) -;; ^L -;; Second line (on second page) -;; 3. Print this buffer with duplex turned on. -;; If it's printed 2 (two) sheets of paper, then your PostScript -;; printer doesn't have duplex feature; otherwise, it's ok, your -;; printer does have duplex feature. -;; -;; NOTE 4: See Tips section. -;; -;; -;; Tips -;; ---- -;; -;; 1. If you have a local printer, that is, a printer which is connected -;; directly to your computer, don't forget to connect the printer to your -;; computer before printing. -;; -;; 2. If you try to print a file and it seems that the file was printed, but -;; there is no paper in the printer, then try to set `pr-delete-temp-file' -;; to nil. Probably `printing' is deleting the temporary file before your -;; local system can get it to send to the printer. -;; -;; 3. Don't try to print a dynamic buffer, that is, a buffer which is -;; modifying while `printing' tries to print. Eventually you got an error -;; message. Instead, save the dynamic buffer to a file or copy it in -;; another buffer and, then, print the file or the new static buffer. -;; An example of dynamic buffer is the *Messages* buffer. -;; -;; 4. When running Emacs on Windows (with or without cygwin), check if your -;; printer is a text printer or not by typing in a DOS window: -;; -;; print /D:\\host\printer somefile.txt -;; -;; Where, `host' is the machine where the printer is directly connected, -;; `printer' is the printer name and `somefile.txt' is a text file. -;; -;; If the printer `\\host\printer' doesn't print the content of -;; `somefile.txt' or, instead, it returns the following message: -;; -;; PostScript Error Handler -;; Offending Command = CCC -;; Stack = -;; -;; Where `CCC' is whatever is at the beginning of the text to be printed. -;; -;; Therefore, the printer `\\host\printer' is not a text printer, but a -;; PostScript printer. So, please, don't include this printer in -;; `pr-txt-printer-alist' (which see). -;; -;; 5. You can use gsprint instead of ghostscript to print monochrome PostScript -;; files in Windows. The gsprint utility documentation says that it is more -;; efficient than ghostscript to print monochrome PostScript. -;; -;; To print non-monochrome PostScript file, the efficiency of ghostscript -;; is similar to gsprint. -;; -;; Also the gsprint utility comes together with gsview distribution. -;; -;; For more information about gsprint see -;; `https://www.cs.wisc.edu/~ghost/gsview/gsprint.htm'. -;; -;; As an example of gsprint declaration: -;; -;; (setq pr-ps-printer-alist -;; '((A "gsprint" ("-all" "-twoup") "-printer " "my-b/w-printer-name") -;; (B "gsprint" ("-all" "-twoup") nil "-printer my-b/w-printer-name") -;; ;; some other printer declaration -;; )) -;; -;; The example above declares that printer A prints all pages (-all) and two -;; pages per sheet (-twoup). The printer B declaration does the same as the -;; printer A declaration, the only difference is the printer name selection. -;; -;; There are other command line options like: -;; -;; -mono Render in monochrome as 1bit/pixel (only black and white). -;; -grey Render in greyscale as 8bits/pixel. -;; -color Render in color as 24bits/pixel. -;; -;; The default is `-mono'. So, printer A and B in the example above are -;; using implicitly the `-mono' option. Note that in `-mono' no gray tone -;; or color is printed, this includes the zebra stripes, that is, in `-mono' -;; the zebra stripes are not printed. -;; -;; See also documentation for `pr-ps-printer-alist'. -;; -;; -;; Using `printing' -;; ---------------- -;; -;; To use `printing' insert in your init file: -;; -;; (require 'printing) -;; ;; ...some user settings... -;; (pr-update-menus t) -;; -;; During `pr-update-menus' evaluation: -;; * On Emacs 20: -;; it replaces the Tools/Print menu by Tools/Printing menu. -;; * On Emacs 21: -;; it replaces the File/Print* menu entries by File/Print menu. -;; Please, see section Menu Layout below for menu explanation. -;; -;; To use `printing' utilities you can use the Printing menu options, type M-x -;; followed by one of the commands below, or type a key associated with the -;; command you want (if there is a key binding). -;; -;; `printing' has the following commands: -;; -;; pr-interface -;; pr-ps-directory-preview -;; pr-ps-directory-using-ghostscript -;; pr-ps-directory-print -;; pr-ps-directory-ps-print -;; pr-ps-buffer-preview -;; pr-ps-buffer-using-ghostscript -;; pr-ps-buffer-print -;; pr-ps-buffer-ps-print -;; pr-ps-region-preview -;; pr-ps-region-using-ghostscript -;; pr-ps-region-print -;; pr-ps-region-ps-print -;; pr-ps-mode-preview -;; pr-ps-mode-using-ghostscript -;; pr-ps-mode-print -;; pr-ps-mode-ps-print -;; pr-ps-file-preview -;; pr-ps-file-up-preview -;; pr-ps-file-using-ghostscript -;; pr-ps-file-print -;; pr-ps-file-ps-print -;; pr-ps-file-up-ps-print -;; pr-ps-fast-fire -;; pr-despool-preview -;; pr-despool-using-ghostscript -;; pr-despool-print -;; pr-despool-ps-print -;; pr-printify-directory -;; pr-printify-buffer -;; pr-printify-region -;; pr-txt-directory -;; pr-txt-buffer -;; pr-txt-region -;; pr-txt-mode -;; pr-txt-fast-fire -;; pr-toggle-file-duplex -;; pr-toggle-file-tumble -;; pr-toggle-file-landscape -;; pr-toggle-ghostscript -;; pr-toggle-faces -;; pr-toggle-spool -;; pr-toggle-duplex -;; pr-toggle-tumble -;; pr-toggle-landscape -;; pr-toggle-upside-down -;; pr-toggle-line -;; pr-toggle-zebra -;; pr-toggle-header -;; pr-toggle-lock -;; pr-toggle-region -;; pr-toggle-mode -;; pr-customize -;; lpr-customize -;; pr-help -;; pr-ps-name -;; pr-txt-name -;; pr-ps-utility -;; pr-show-ps-setup -;; pr-show-pr-setup -;; pr-show-lpr-setup -;; -;; The general meanings of above commands are: -;; -;; PREFIX: -;; `pr-interface' buffer interface for printing package. -;; `pr-help' help for printing package. -;; `pr-ps-name' interactively select a PostScript printer. -;; `pr-txt-name' interactively select a text printer. -;; `pr-ps-utility' interactively select a PostScript utility. -;; `pr-show-*-setup' show current settings. -;; `pr-ps-*' deal with PostScript code generation. -;; `pr-txt-*' deal with text generation. -;; `pr-toggle-*' toggle on/off some boolean variable. -;; `pr-despool-*' despool the PostScript spooling buffer. -;; `pr-printify-*' replace nonprintable ASCII by printable ASCII -;; representation. -;; -;; SUFFIX: -;; `*-customize' customization. -;; `*-preview' preview a PostScript file. -;; `*-using-ghostscript' use ghostscript to print. -;; `*-fast-fire' fast fire command (see it for documentation). -;; `*-print' send PostScript directly to printer. -;; `*-ps-print' send PostScript directly to printer or use -;; ghostscript to print. It depends on -;; `pr-print-using-ghostscript' option. -;; -;; INFIX/SUFFIX: -;; `*-directory*' process a directory. -;; `*-buffer*' process a buffer. -;; `*-region*' process a region. -;; `*-mode*' process a major mode (see explanation below). -;; `*-file-*' process a PostScript file. -;; `*-file-up-*' process a PostScript file using a filter utility. -;; -;; Here are some examples: -;; -;; `pr-ps-buffer-using-ghostscript' -;; Use ghostscript to print a buffer. -;; -;; `pr-ps-file-print' -;; Print a PostScript file. -;; -;; `pr-toggle-spool' -;; Toggle spooling buffer. -;; -;; So you can preview through ghostview, use ghostscript to print (if you don't -;; have a PostScript printer) or send directly to printer a PostScript code -;; generated by `ps-print' package. -;; -;; Besides operating one buffer or region each time, you also can postpone -;; previewing or printing by saving the PostScript code generated in a -;; temporary Emacs buffer. This way you can save banner pages between -;; successive printing. You can toggle on/off spooling by invoking -;; `pr-toggle-spool' interactively or through menu bar. -;; -;; If you type, for example: -;; -;; C-u M-x pr-ps-buffer-print RET -;; -;; The `pr-ps-buffer-print' command prompts you for a n-up printing number and -;; a file name, and save the PostScript code generated to the file name instead -;; of sending to printer. -;; -;; This behavior is similar with the commands that deal with PostScript code -;; generation, that is, with `pr-ps-*' and `pr-despool-*' commands. If -;; spooling is on, only `pr-despool-*' commands prompt for a file name and save -;; the PostScript code spooled in this file. -;; -;; Besides the behavior described above, the `*-directory*' commands also -;; prompt for a directory and a file name regexp. So, it's possible to process -;; all or certain files on a directory at once (see also documentation for -;; `pr-list-directory'). -;; -;; `printing' has also a special way to handle some major mode through -;; `*-mode*' commands. So it's possible to customize a major mode printing, -;; it's only needed to declare the customization in `pr-mode-alist' (see -;; section Options) and invoke some of `*-mode*' commands. An example for -;; major mode usage is when you're using gnus (or mh, or rmail, etc.) and -;; you're in the *Summary* buffer, if you forget to switch to the *Article* -;; buffer before printing, you'll get a nicely formatted list of article -;; subjects shows up at the printer. With major mode printing you don't need -;; to switch from gnus *Summary* buffer first. -;; -;; Current global keyboard mapping is: -;; -;; (keymap-global-set "" 'pr-ps-fast-fire) -;; (keymap-global-set "M-" 'pr-ps-mode-using-ghostscript) -;; (keymap-global-set "S-" 'pr-ps-mode-using-ghostscript) -;; (keymap-global-set "C-" 'pr-txt-fast-fire) -;; (keymap-global-set "C-M-" 'pr-txt-fast-fire) -;; -;; As a suggestion of global keyboard mapping for some `printing' commands: -;; -;; (keymap-global-set "C-c i" 'pr-interface) -;; (keymap-global-set "C-c b p" 'pr-ps-buffer-print) -;; (keymap-global-set "C-c b x" 'pr-ps-buffer-preview) -;; (keymap-global-set "C-c b b" 'pr-ps-buffer-using-ghostscript) -;; (keymap-global-set "C-c r p" 'pr-ps-region-print) -;; (keymap-global-set "C-c r x" 'pr-ps-region-preview) -;; (keymap-global-set "C-c r r" 'pr-ps-region-using-ghostscript) -;; -;; -;; Options -;; ------- -;; -;; Below it's shown a brief description of `printing' options, please, see the -;; options declaration in the code for a long documentation. -;; -;; `pr-filename-style' Specify which filename style to use for external -;; commands. -;; -;; `pr-path-alist' Specify an alist for command paths. -;; -;; `pr-txt-name' Specify a printer for printing a text file. -;; -;; `pr-txt-printer-alist' Specify an alist of all text printers. -;; -;; `pr-ps-name' Specify a printer for printing a PostScript -;; file. -;; -;; `pr-ps-printer-alist' Specify an alist for all PostScript printers. -;; -;; `pr-temp-dir' Specify a directory for temporary files during -;; printing. -;; -;; `pr-ps-temp-file' Specify PostScript temporary file name prefix. -;; -;; `pr-file-modes' Specify the file permission bits for newly -;; created files. -;; -;; `pr-gv-command' Specify path and name of the gsview/gv -;; utility. -;; -;; `pr-gs-command' Specify path and name of the ghostscript -;; utility. -;; -;; `pr-gs-switches' Specify ghostscript switches. -;; -;; `pr-gs-device' Specify ghostscript device switch value. -;; -;; `pr-gs-resolution' Specify ghostscript resolution switch value. -;; -;; `pr-print-using-ghostscript' Non-nil means print using ghostscript. -;; -;; `pr-faces-p' Non-nil means print with face attributes. -;; -;; `pr-spool-p' Non-nil means spool printing in a buffer. -;; -;; `pr-file-landscape' Non-nil means print PostScript file in -;; landscape orientation. -;; -;; `pr-file-duplex' Non-nil means print PostScript file in duplex -;; mode. -;; -;; `pr-file-tumble' Non-nil means print PostScript file in tumble -;; mode. -;; -;; `pr-auto-region' Non-nil means region is automagically detected. -;; -;; `pr-auto-mode' Non-nil means major-mode specific printing is -;; preferred over normal printing. -;; -;; `pr-mode-alist' Specify an alist for a major-mode and printing -;; function. -;; -;; `pr-ps-utility' Specify PostScript utility processing. -;; -;; `pr-ps-utility-alist' Specify an alist for PostScript utility -;; processing. -;; -;; `pr-menu-lock' Non-nil means menu is locked while selecting -;; toggle options. -;; -;; `pr-menu-char-height' Specify menu char height in pixels. -;; -;; `pr-menu-char-width' Specify menu char width in pixels. -;; -;; `pr-setting-database' Specify an alist for settings in general. -;; -;; `pr-visible-entry-list' Specify a list of Printing menu visible -;; entries. -;; -;; `pr-delete-temp-file' Non-nil means delete temporary files. -;; -;; `pr-list-directory' Non-nil means list directory when processing a -;; directory. -;; -;; `pr-buffer-name' Specify the name of the buffer interface for -;; printing package. -;; -;; `pr-buffer-name-ignore' Specify a regexp list for buffer names to be -;; ignored in interface buffer. -;; -;; `pr-buffer-verbose' Non-nil means to be verbose when editing a -;; field in interface buffer. -;; -;; To set the above options you may: -;; -;; a) insert the code in your ~/.emacs, like: -;; -;; (setq pr-faces-p t) -;; -;; This way always keep your default settings when you enter a new Emacs -;; session. -;; -;; b) or use `set-variable' in your Emacs session, like: -;; -;; M-x set-variable RET pr-faces-p RET t RET -;; -;; This way keep your settings only during the current Emacs session. -;; -;; c) or use customization, for example: -;; click on menu-bar *Help* option, -;; then click on *Customize*, -;; then click on *Browse Customization Groups*, -;; expand *PostScript* group, -;; expand *Printing* group -;; and then customize `printing' options. -;; Through this way, you may choose if the settings are kept or not when -;; you leave out the current Emacs session. -;; -;; d) or see the option value: -;; -;; C-h v pr-faces-p RET -;; -;; and click the *customize* hypertext button. -;; Through this way, you may choose if the settings are kept or not when -;; you leave out the current Emacs session. -;; -;; e) or invoke: -;; -;; M-x pr-customize RET -;; -;; and then customize `printing' options. -;; Through this way, you may choose if the settings are kept or not when -;; you leave out the current Emacs session. -;; -;; f) or use menu bar, for example: -;; click on menu-bar *File* option, -;; then click on *Printing*, -;; then click on *Customize*, -;; then click on *printing* -;; and then customize `printing' options. -;; Through this way, you may choose if the settings are kept or not when -;; you leave out the current Emacs session. -;; -;; -;; Menu Layout -;; ----------- -;; -;; The `printing' menu (Tools/Printing or File/Print) has the following layout: -;; -;; +-----------------------------+ -;; A 0 | Printing Interface | -;; +-----------------------------+ +-A---------+ +-B------+ -;; I 1 | PostScript Preview >|-------|Directory >|-----|1-up | -;; 2 | PostScript Print >|---- A |Buffer >|-- B |2-up | -;; 3 | PostScript Printer: name >|---- C |Region >|-- B |4-up | -;; +-----------------------------+ |Mode >|-- B |Other...| -;; II 4 | Printify >|-----\ |File >|--\ +--------+ -;; 5 | Print >|---\ | |Despool... | | -;; 6 | Text Printer: name >|-\ | | +-----------+ | -;; +-----------------------------+ | | | +---------+ +------------+ -;; III 7 |[ ]Landscape | | | \-|Directory| | No Prep... | Ia -;; 8 |[ ]Print Header | | | |Buffer | +------------+ Ib -;; 9 |[ ]Print Header Frame | | | |Region | | name >|- C -;; 10 |[ ]Line Number | | | +---------+ +------------+ -;; 11 |[ ]Zebra Stripes | | | +---------+ | 1-up... | Ic -;; 12 |[ ]Duplex | | \---|Directory| | 2-up... | -;; 13 |[ ]Tumble | \--\ |Buffer | | 4-up... | -;; 14 |[ ]Upside-Down | | |Region | | Other... | -;; 15 | Print All Pages >|--\ | |Mode | +------------+ -;; +-----------------------------+ | | +---------+ |[ ]Landscape| Id -;; IV 16 |[ ]Spool Buffer | | | +-C-------+ |[ ]Duplex | Ie -;; 17 |[ ]Print with faces | | \--|( )name A| |[ ]Tumble | If -;; 18 |[ ]Print via Ghostscript | | |( )name B| +------------+ -;; +-----------------------------+ | |... | -;; V 19 |[ ]Auto Region | | |(*)name | -;; 20 |[ ]Auto Mode | | |... | -;; 21 |[ ]Menu Lock | | +---------+ +--------------+ -;; +-----------------------------+ \------------------|(*)All Pages | -;; VI 22 | Customize >|--- D +-D------+ |( )Even Pages | -;; 23 | Show Settings >|-------|printing| |( )Odd Pages | -;; 24 | Help | |ps-print| |( )Even Sheets| -;; +-----------------------------+ |lpr | |( )Odd Sheets | -;; +--------+ +--------------+ -;; -;; See `pr-visible-entry-list' for hiding some parts of the menu. -;; -;; The menu has the following sections: -;; -;; A. Interface: -;; -;; 0. You can use a buffer interface instead of menus. It looks like the -;; customization buffer. Basically, it has the same options found in the -;; menu and some extra options, all this on a buffer. -;; -;; I. PostScript printing: -;; -;; 1. You can generate a PostScript file (if you type C-u before activating -;; menu) or PostScript temporary file for a directory, a buffer, a region -;; or a major mode, choosing 1-up, 2-up, 4-up or any other n-up printing; -;; after file generation, ghostview is activated using the file generated -;; as argument. This option is disabled if spooling is on (option 16). -;; Also, if you already have a PostScript file you can preview it. -;; Instead of previewing each buffer, region or major mode at once, you -;; can save temporarily the PostScript code generated in a buffer and -;; preview it later. The option `Despool...' despools the PostScript -;; spooling buffer in a temporary file and uses ghostview to preview it. -;; If you type C-u before choosing this option, the PostScript code -;; generated is saved in a file instead of saving in a temporary file. -;; To spool the PostScript code generated you need to turn on the option -;; 16. The option `Despool...' is enabled if spooling is on (option -;; 16). -;; -;; NOTE 1: It's possible to customize a major mode printing, just declare -;; the customization in `pr-mode-alist' and invoke some of -;; `*-mode*' commands or select Mode option in Printing menu. An -;; example for major mode usage is when you're using gnus (or mh, -;; or rmail, etc.) and you're in the *Summary* buffer, if you -;; forget to switch to the *Article* buffer before printing, -;; you'll get a nicely formatted list of article subjects shows -;; up at the printer. With major mode printing you don't need to -;; switch from gnus *Summary* buffer first. -;; -;; NOTE 2: There are the following options for PostScript file -;; processing: -;; Ia. Print the file *No Preprocessing*, that is, send it -;; directly to PostScript printer. -;; Ib. PostScript utility processing selection. -;; See `pr-ps-utility-alist' and `pr-setting-database' for -;; documentation. -;; Ic. Do n-up processing before printing. -;; Id. Toggle on/off landscape for PostScript file processing. -;; Ie. Toggle on/off duplex for PostScript file processing. -;; If. Toggle on/off tumble for PostScript file processing. -;; -;; NOTE 3: Don't forget to download and install the utilities declared on -;; `pr-ps-utility-alist'. -;; -;; 2. Operate the same way as option 1, but it sends directly the PostScript -;; code (or put in a file, if you've typed C-u) or it uses ghostscript to -;; print the PostScript file generated. It depends on option 18, if it's -;; turned on, it uses ghostscript; otherwise, it sends directly to -;; printer. If spooling is on (option 16), the PostScript code is saved -;; temporarily in a buffer instead of printing it or saving it in a file. -;; Also, if you already have a PostScript file you can print it. Instead -;; of printing each buffer, region or major mode at once, you can save -;; temporarily the PostScript code generated in a buffer and print it -;; later. The option `Despool...' despools the PostScript spooling -;; buffer directly on a printer. If you type C-u before choosing this -;; option, the PostScript code generated is saved in a file instead of -;; sending to printer. To spool the PostScript code generated you need -;; to turn on the option 16. This option is enabled if spooling is on -;; (option 16). See also the NOTE 1, NOTE 2 and NOTE 3 on option 1. -;; -;; 3. You can select a new PostScript printer to send PostScript code -;; generated. For selection it's used all PostScript printers defined -;; in `pr-ps-printer-alist' variable (see it for documentation). -;; See also `pr-setting-database'. -;; -;; II. Text printing: -;; -;; 4. If you have control characters (character code from \000 to \037) in a -;; buffer and you want to print them in a text printer, select this -;; option. All control characters in your buffer or region will be -;; replaced by a printable representation. The printable representations -;; use ^ (for ASCII control characters) or hex. The characters tab, -;; linefeed, space, return and formfeed are not affected. You don't need -;; to select this option if you use any option of section I, the -;; PostScript engine treats control characters properly. -;; -;; 5. If you want to print a directory, buffer, region or major mode in a -;; text printer, select this option. See also the NOTE 1 on option 1. -;; -;; 6. You can select a new text printer to send text generated. For -;; selection it's used all text printers defined in -;; `pr-txt-printer-alist' variable (see it for documentation). -;; See also `pr-setting-database'. -;; -;; III. PostScript page toggle options: -;; -;; 7. If you want a PostScript landscape printing, turn on this option. -;; -;; 8. If you want to have a header in each page in your PostScript code, -;; turn on this option. -;; -;; 9. If you want to draw a gaudy frame around the header, turn on this -;; option. This option is enabled if print header is on (option 8). -;; -;; 10. If you want that the line number is printed in your PostScript code, -;; turn on this option. -;; -;; 11. If you want background zebra stripes in your PostScript code, turn on -;; this option. -;; -;; 12. If you want a duplex printing and your PostScript printer has this -;; feature, turn on this option. -;; -;; 13. If you turned on duplex printing, you can choose if you want to have -;; a printing suitable for binding on the left or right (tumble off), or -;; to have a printing suitable for binding at top or bottom (tumble on). -;; This option is enabled if duplex is on (option 12). -;; -;; 14. If you want a PostScript upside-down printing, turn on this option. -;; -;; 15. With this option, you can choose if you want to print all pages, odd -;; pages, even pages, odd sheets or even sheets. -;; See also `ps-even-or-odd-pages'. -;; -;; IV. PostScript processing toggle options: -;; -;; 16. If you want to spool the PostScript code generated, turn on this -;; option. To spool the PostScript code generated use option 2. You -;; can despool later by choosing option 1 or 2, sub-option `Despool...'. -;; -;; 17. If you use colors in your buffers and want to see these colors on -;; your PostScript code generated, turn on this option. If you have a -;; black/white PostScript printer, these colors are displayed in gray -;; scale by PostScript printer interpreter. -;; -;; 18. If you don't have a PostScript printer to send PostScript files, turn -;; on this option. When this option is on, the ghostscript is used to -;; print PostScript files. In GNU or Unix system, if ghostscript is set -;; as a PostScript filter, you don't need to turn on this option. -;; -;; V. Printing customization: -;; -;; 19. If you want that region is automagically detected, turn on this -;; option. Note that this will only work if you're using transient mark -;; mode. When this option is on, the `*-buffer*' commands will behave -;; like `*-region*' commands, that is, `*-buffer*' commands will print -;; only the region marked instead of all buffer. -;; -;; 20. Turn this option on if you want that when current major-mode is -;; declared in `pr-mode-alist', the `*-buffer*' and `*-region*' commands -;; behave like `*-mode*' commands. -;; -;; 21. If you want that Printing menu stays open while you are setting -;; toggle options, turn on this option. The variables -;; `pr-menu-char-height' and `pr-menu-char-width' are used to guess the -;; menu position, so don't forget to adjust these variables if menu -;; position is not ok. -;; -;; VI. Customization: -;; -;; 22. Besides all options in section III, IV and V, you can customize much -;; more PostScript options in `ps-print' option. Or you can customize -;; some `lpr' options for text printing. Or customize `printing' -;; options. -;; -;; 23. Show current settings for `printing', `ps-print' or `lpr'. -;; -;; 24. Quick help for printing menu layout. -;; -;; -;; Option Settings -;; --------------- -;; -;; Below it's shown only the main options that affect all `printing' package. -;; Check all the settings below *BEFORE* running `printing' commands. -;; -;; * Example of setting for GNU or Unix system: -;; -;; (require 'printing) -;; (setq pr-path-alist -;; '((unix "." "~/bin" ghostview mpage PATH) -;; (ghostview "$HOME/bin/gsview-dir") -;; (mpage "$HOME/bin/mpage-dir") -;; )) -;; (setq pr-txt-name 'prt_06a) -;; (setq pr-txt-printer-alist -;; '((prt_06a "lpr" nil "prt_06a") -;; (prt_07c nil nil "prt_07c") -;; )) -;; (setq pr-ps-name 'lps_06b) -;; (setq pr-ps-printer-alist -;; '((lps_06b "lpr" nil "-P" "lps_06b") -;; (lps_07c "lpr" nil nil "lps_07c") -;; (lps_08c nil nil nil "lps_08c") -;; )) -;; (setq pr-temp-dir "/tmp/") -;; (setq pr-gv-command "gv") -;; (setq pr-gs-command "gs") -;; (setq pr-gs-switches '("-q -dNOPAUSE -I/usr/share/ghostscript/5.10")) -;; (setq pr-gs-device "uniprint") -;; (setq pr-gs-resolution 300) -;; (setq pr-ps-utility 'mpage) -;; (setq pr-ps-utility-alist -;; '((mpage "mpage" nil "-b%s" "-%d" "-l" "-t" "-T" ">" nil) -;; (psnup "psnup" ("-q") "-P%s" "-%d" "-l" nil nil " " nil -;; (inherits-from: . no-duplex)) -;; )) -;; (setq pr-setting-database -;; '((no-duplex -;; nil nil nil -;; (pr-file-duplex . nil) -;; (pr-file-tumble . nil)) -;; )) -;; (pr-update-menus t) ; update now printer and utility menus -;; -;; * Example of setting for Windows system: -;; -;; (require 'printing) -;; (setq pr-path-alist -;; '((windows "c:/applications/executables" PATH ghostview mpage) -;; (ghostview "c:/gs/gsview-dir") -;; (mpage "c:/mpage-dir") -;; )) -;; (setq pr-txt-name 'prt_06a) -;; (setq pr-txt-printer-alist -;; '((prt_06a "print" nil "/D:\\\\printers\\prt_06a") -;; (prt_07c nil nil "/D:\\\\printers\\prt_07c") -;; (PRN "" nil "PRN") -;; (standard "redpr.exe" nil "") -;; )) -;; (setq pr-ps-name 'lps_06b) -;; (setq pr-ps-printer-alist -;; '((lps_06a "print" nil "/D:" "\\\\printers\\lps_06a") -;; (lps_06b "print" nil nil "\\\\printers\\lps_06b") -;; (lps_07c "print" nil "" "/D:\\\\printers\\lps_07c") -;; (lps_08c nil nil nil "\\\\printers\\lps_08c") -;; (b/w "gsprint" ("-all" "-twoup") "-printer " "b/w-pr-name") -;; (LPT1 "" nil "" "LPT1:") -;; (PRN "" nil "" "PRN") -;; (standard "redpr.exe" nil "" "") -;; )) -;; (setq pr-temp-dir "C:/WINDOWS/TEMP/") -;; (setq pr-gv-command "c:/gs/gsview/gsview32.exe") -;; (setq pr-gs-command "c:/gs/gswin32.exe") -;; (setq pr-gs-switches '("-q -dNOPAUSE -Ic:/gs/gs5.50;c:/gs/gs5.50/fonts")) -;; (setq pr-gs-device "mswinpr2") -;; (setq pr-gs-resolution 300) -;; (setq pr-ps-utility 'psnup) -;; (setq pr-ps-utility-alist -;; '((psnup "c:/psutils/psnup" ("-q") "-P%s" "-%d" "-l" nil nil " " -;; nil (inherits-from: . no-duplex)) -;; )) -;; (setq pr-setting-database -;; '((no-duplex -;; nil nil nil -;; (pr-file-duplex . nil) -;; (pr-file-tumble . nil)) -;; )) -;; (pr-update-menus t) ; update now printer and utility menus -;; -;; NOTE: Don't forget to download and install the utilities declared on -;; `pr-ps-utility-alist'. -;; -;; -;; Utilities -;; --------- -;; -;; `printing' package has the following utilities: -;; -;; `pr-setup' Return the current `printing' setup. -;; -;; `lpr-setup' Return the current `lpr' setup. -;; -;; `pr-update-menus' Update utility, PostScript and text printer menus. -;; -;; `pr-menu-bind' Install `printing' menu in the menubar. -;; -;; -;; Below are some URL where you can find good utilities. -;; -;; * For GNU or Unix system: -;; -;; gs, gv `https://www.gnu.org/software/ghostscript/ghostscript.html' -;; enscript `https://people.ssh.fi/mtr/genscript/' -;; psnup `http://www.knackered.org/angus/psutils/' -;; mpage `https://www.mesa.nl/pub/mpage/' -;; -;; * For Windows system: -;; -;; gswin32, gsview32 -;; `https://www.gnu.org/software/ghostscript/ghostscript.html' -;; gsprint `https://www.cs.wisc.edu/~ghost/gsview/gsprint.htm'. -;; enscript `https://people.ssh.fi/mtr/genscript/' -;; psnup `https://gnuwin32.sourceforge.net/packages/psutils.htm' -;; redmon `http://www.ghostgum.com.au/software/redmon.htm' -;; -;; -;; Acknowledgments -;; --------------- -;; -;; Thanks to Stefan Monnier for GNU Emacs and XEmacs -;; printing menu (in `pr-menu-spec') merging suggestion. -;; -;; Thanks to Lennart Borgman for gsprint -;; suggestion (see tip 5 in section Tips). -;; -;; Thanks to Drew Adams for suggestions: -;; - directory processing. -;; - `pr-path-alist' variable. -;; - doc fix. -;; - a lot of tests on Windows. -;; -;; Thanks to Fred Labrosse for XEmacs tests. -;; -;; Thanks to Klaus Berndl for invaluable help/debugging -;; and for suggestions: -;; - even/odd pages printing. -;; - ghostscript parameters for `pr-ps-printer-alist'. -;; - default printer name. -;; - completion functions. -;; - automagic region detection. -;; - menu entry hiding. -;; - fast fire PostScript printing command. -;; - `pr-filename-style' variable. -;; -;; Thanks to Kim F. Storm for beta-test and for suggestions: -;; - PostScript Print and PostScript Print Preview merge. -;; - Tools/Printing menu. -;; - replace *-using-preview by *-using-ghostscript. -;; - printer selection. -;; - extra parameters for `pr-ps-printer-alist'. -;; -;; Thanks to: -;; Frederic Corne print-nt.el -;; Tom Vogels mh-e-init.el -;; Matthew O. Persico win32-ps-print.el -;; Volker Franz ps-print-interface.el -;; And to all people who contributed with them. -;; -;; -;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; Code: - - -(require 'lpr) -(require 'ps-print) - -(defconst pr-cygwin-system - (and lpr-windows-system (getenv "OSTYPE") - (string-match "cygwin" (getenv "OSTYPE")))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; To avoid compilation gripes - - -;; User Interface --- declared here to avoid compiler warnings -(define-obsolete-variable-alias 'pr-path-style 'pr-filename-style "27.1") -(defvar pr-filename-style) -(defvar pr-auto-region) -(defvar pr-menu-char-height) -(defvar pr-menu-char-width) -(defvar pr-menu-lock) -(defvar pr-ps-printer-alist) -(defvar pr-txt-printer-alist) -(defvar pr-ps-utility-alist) - -;; Internal Vars --- defined here to avoid compiler warnings -(defvar pr-menu-print-item "print" - "Non-nil means that menu binding was not done. - -Used by `pr-menu-bind' and `pr-update-menus'.") - -(defvar pr-ps-printer-menu-modified t - "Non-nil means `pr-ps-printer-alist' was modified and we need to update menu.") - -(defvar pr-txt-printer-menu-modified t - "Non-nil means `pr-txt-printer-alist' was modified and we need to update menu.") - -(defvar pr-ps-utility-menu-modified t - "Non-nil means `pr-ps-utility-alist' was modified and we need to update menu.") - -(defconst pr-even-or-odd-alist - '((nil . "Print All Pages") - (even-page . "Print Even Pages") - (odd-page . "Print Odd Pages") - (even-sheet . "Print Even Sheets") - (odd-sheet . "Print Odd Sheets"))) - - -;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; GNU Emacs Definitions - -(defun pr-keep-region-active () - (setq deactivate-mark nil)) - -(defun pr-region-active-p () - (and pr-auto-region (use-region-p))) - -;; Menu binding -;; Replace existing "print" item by "Printing" item. -;; If you're changing this file, you'll load it a second, -;; third... time, but "print" item exists only in the first load. - -(defvar pr-menu-bar nil - "Specify Printing menu-bar entry.") - -(defun pr-global-menubar (menu-spec) - (let ((menu-file '("menu-bar" "file")) - (submenu-path [menu-bar file Print]) - (submenu (easy-menu-create-menu "Print" menu-spec))) - (cond (pr-menu-print-item - (easy-menu-add-item global-map menu-file submenu "Print") - (easy-menu-remove-item global-map menu-file "print") - (setq pr-menu-print-item nil - pr-menu-bar submenu-path)) - (t (easy-menu-add-item global-map menu-file submenu))))) - -(defun pr-menu-position (entry index horizontal) - (let ((pos (cdr (mouse-pixel-position)))) - (list - (list (- (or (car pos) 0) ; X - (if lpr-windows-system - 0 ;; GNU Emacs for Windows 9x/NT - (* horizontal pr-menu-char-width))) - (- (or (cdr pos) 0) ; Y - (* (pr-menu-index entry index) pr-menu-char-height))) - (selected-frame)))) ; frame - -(defvar pr-menu-position nil) -(defvar pr-menu-state nil) - -(defun pr-menu-lookup (path) - (lookup-key global-map - (if path - (vconcat pr-menu-bar - (mapcar #'easy-menu-intern - (if (listp path) - path - (list path)))) - pr-menu-bar))) - -(defun pr-menu-lock (entry index horizontal state path) - (when pr-menu-lock - (or (and pr-menu-position (eq state pr-menu-state)) - (setq pr-menu-position (pr-menu-position entry index horizontal) - pr-menu-state state)) - (let* ((menu (pr-menu-lookup path)) - (result (x-popup-menu pr-menu-position menu))) - (and result - (let ((command (lookup-key menu (vconcat result)))) - (if (fboundp command) - (funcall command) - (eval command))))) - (setq pr-menu-position nil))) - -(defun pr-do-update-menus (&optional force) - (pr-menu-alist pr-ps-printer-alist - 'pr-ps-name - #'pr-menu-set-ps-title - "PostScript Printers" - 'pr-ps-printer-menu-modified - force - "PostScript Printers" - 'postscript 2) - (pr-menu-alist pr-txt-printer-alist - 'pr-txt-name - #'pr-menu-set-txt-title - "Text Printers" - 'pr-txt-printer-menu-modified - force - "Text Printers" - 'text 2) - (defvar pr--save-var) - (let ((pr--save-var pr-ps-utility-menu-modified)) - (pr-menu-alist pr-ps-utility-alist - 'pr-ps-utility - #'pr-menu-set-utility-title - '("PostScript Print" "File" "PostScript Utility") - 'pr--save-var - force - "PostScript Utility" - nil 1)) - (pr-menu-alist pr-ps-utility-alist - 'pr-ps-utility - #'pr-menu-set-utility-title - '("PostScript Preview" "File" "PostScript Utility") - 'pr-ps-utility-menu-modified - force - "PostScript Utility" - nil 1) - (pr-even-or-odd-pages ps-even-or-odd-pages force)) - -(defun pr-menu-get-item (name-list) - ;; NAME-LIST is a string or a list of strings. - (setq name-list (ensure-list name-list)) - (and name-list - (let* ((reversed (reverse name-list)) - (name (easy-menu-intern (car reversed))) - (path (nreverse (cdr reversed))) - (menu (lookup-key - global-map - (vconcat pr-menu-bar - (mapcar #'easy-menu-intern path))))) - (assq name (nthcdr 2 menu))))) - -(defvar pr-temp-menu nil) - -(defun pr-menu-alist (alist var-sym fun menu-path modified-sym force name - entry index) - (when (and alist (or force (symbol-value modified-sym))) - (easy-menu-define pr-temp-menu nil "" - (pr-menu-create name alist var-sym fun entry index)) - (let ((item (pr-menu-get-item menu-path))) - (and item - (progn - (setf (nth 3 item) pr-temp-menu) - (funcall fun (symbol-value var-sym) item)))) - (set modified-sym nil))) - -(defun pr-menu-set-item-name (item name) - (and item - (setcar (nthcdr 2 item) name))) ; ITEM-NAME - -(defun pr-menu-set-ps-title (value &optional item entry index) - (pr-menu-set-item-name (or item - (pr-menu-get-item "PostScript Printers")) - (format "PostScript Printer: %s" value)) - (pr-ps-set-printer value) - (and index - (pr-menu-lock entry index 12 'toggle nil))) - -(defun pr-menu-set-txt-title (value &optional item entry index) - (pr-menu-set-item-name (or item - (pr-menu-get-item "Text Printers")) - (format "Text Printer: %s" value)) - (pr-txt-set-printer value) - (and index - (pr-menu-lock entry index 12 'toggle nil))) - -(defun pr-menu-set-utility-title (value &optional item entry index) - (let ((name (symbol-name value))) - (if item - (pr-menu-set-item-name item name) - (pr-menu-set-item-name - (pr-menu-get-item - '("PostScript Print" "File" "PostScript Utility")) - name) - (pr-menu-set-item-name - (pr-menu-get-item - '("PostScript Preview" "File" "PostScript Utility")) - name))) - (pr-ps-set-utility value) - (and index - (pr-menu-lock entry index 5 nil '("PostScript Print" "File")))) - -(defun pr-even-or-odd-pages (value &optional no-lock) - (pr-menu-set-item-name (pr-menu-get-item "Print All Pages") - (cdr (assq value pr-even-or-odd-alist))) - (setq ps-even-or-odd-pages value) - (or no-lock - (pr-menu-lock 'postscript-options 8 12 'toggle nil))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Internal Functions (I) - - -(defun pr-dosify-file-name (filename) - "Replace unix-style directory separator character with dos/windows one." - (if (eq pr-filename-style 'windows) - (subst-char-in-string ?/ ?\\ filename) - filename)) - -(defun pr-standard-file-name (filename) - "Ensure the proper directory separator depending on the OS. -That is, if Emacs is running on DOS/Windows, ensure dos/windows-style directory -separator; otherwise, ensure unix-style directory separator." - ;; FIXME: Why not use pr-dosify-file-name? - (if (or pr-cygwin-system lpr-windows-system) - (subst-char-in-string ?/ ?\\ filename) - filename)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Customization Functions - - -(defun pr-alist-custom-set (symbol value) - "Set the value of custom variables for printer & utility selection." - (set symbol value) - (and (featurep 'printing) ; update only after printing is loaded - (pr-update-menus t))) - - -(defun pr-ps-utility-custom-set (symbol value) - "Update utility menu entry." - (set symbol value) - (and (featurep 'printing) ; update only after printing is loaded - (pr-menu-set-utility-title value))) - - -(defun pr-ps-name-custom-set (symbol value) - "Update `PostScript Printer:' menu entry." - (set symbol value) - (and (featurep 'printing) ; update only after printing is loaded - (pr-menu-set-ps-title value))) - - -(defun pr-txt-name-custom-set (symbol value) - "Update `Text Printer:' menu entry." - (set symbol value) - (and (featurep 'printing) ; update only after printing is loaded - (pr-menu-set-txt-title value))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; User Interface - - -(defgroup printing nil - "Printing Utilities group." - :tag "Printing Utilities" - :link '(emacs-library-link :tag "Source Lisp File" "printing.el") - :prefix "pr-" - :version "22.1" - :group 'text - :group 'postscript) - - -(defcustom pr-filename-style - (if (and (not pr-cygwin-system) - lpr-windows-system) - 'windows - 'unix) - "Specify which filename style to use for external commands. - -Valid values are: - - windows Windows 9x/NT style (\\) - - unix Unix style (/)" - :type '(choice :tag "Filename style" - (const :tag "Windows 9x/NT Style (\\)" :value windows) - (const :tag "Unix Style (/)" :value unix))) - - -(defcustom pr-path-alist - '((unix PATH) - (cygwin PATH) - (windows PATH)) - "Specify an alist for command paths. - -It's used to find commands used for printing package, like gv, gs, gsview.exe, -mpage, print.exe, etc. See also `pr-command' function. - -Each element has the form: - - (ENTRY DIRECTORY...) - -Where: - -ENTRY It's a symbol, used to identify this entry. - There must exist at least one of the following entries: - - `unix' this entry is used when Emacs is running on GNU or - Unix system. - - `cygwin' this entry is used when Emacs is running on Windows - 98/NT/2000 with Cygwin. - - `windows' this entry is used when Emacs is running on Windows - 98/NT/2000. - -DIRECTORY It should be a string or a symbol. If it's a symbol, it should - exist an equal entry in `pr-path-alist'. If it's a string, - it's considered a directory specification. - - The directory specification may contain: - $var environment variable expansion - ~/ tilde expansion - ./ current directory - ../ previous directory - - For example, let's say the home directory is /home/my and the - current directory is /home/my/dir, so: - - THE ENTRY IS EXPANDED TO - ~/entry /home/my/entry - ./entry /home/my/dir/entry - ../entry /home/my/entry - $HOME/entry /home/my/entry - $HOME/~/other/../my/entry /home/my/entry - - SPECIAL SYMBOL: If the symbol `PATH' is used in the directory - list and there isn't a `PATH' entry in `pr-path-alist' or the - `PATH' entry has a null directory list, the PATH environment - variable is used. - -Examples: - -* On GNU or Unix system: - - ((unix \".\" \"~/bin\" ghostview mpage PATH) - (ghostview \"$HOME/bin/gsview-dir\") - (mpage \"$HOME/bin/mpage-dir\") - ) - -* On Windows system: - - ((windows \"c:/applications/executables\" PATH ghostview mpage) - (ghostview \"c:/gs/gsview-dir\") - (mpage \"c:/mpage-dir\") - )" - :type '(repeat - (cons :tag "" - (symbol :tag "Identifier ") - (repeat :tag "Directory List" - (choice :menu-tag "Directory" - :tag "Directory" - (string :value "") - (symbol :value symbol)))))) - - -(defcustom pr-txt-name 'default - "Specify a printer for printing a text file. - -The printer name symbol should be defined on `pr-txt-printer-alist' (see it for -documentation). - -This variable should be modified by customization engine. If this variable is -modified by other means (for example, a Lisp function), use `pr-update-menus' -function (see it for documentation) to update text printer menu." - :type 'symbol - :set 'pr-txt-name-custom-set) - - -(defcustom pr-txt-printer-alist - (list (list 'default lpr-command nil - (cond ((boundp 'printer-name) printer-name) - (lpr-windows-system "PRN") - (t nil) - ))) - ;; Examples: - ;; * On GNU or Unix system: - ;; '((prt_06a "lpr" nil "prt_06a") - ;; (prt_07c nil nil "prt_07c") - ;; ) - ;; * On Windows system: - ;; '((prt_06a "print" nil "/D:\\\\printers\\prt_06a") - ;; (prt_07c nil nil "/D:\\\\printers\\prt_07c") - ;; (PRN "" nil "PRN") - ;; (standard "redpr.exe" nil "") - ;; ) - "Specify an alist of all text printers (text printer database). - -The alist element has the form: - - (SYMBOL COMMAND SWITCHES NAME) - -Where: - -SYMBOL It's a symbol to identify a text printer. It's for - setting option `pr-txt-name' and for menu selection. - Examples: - prt_06a - my_printer - -COMMAND Name of the program for printing a text file. On MS-DOS and - MS-Windows systems, if the value is an empty string, then Emacs - will write directly to the printer port given by NAME (see text - below), that is, the NAME should be something like \"PRN\" or - \"LPT1:\". - If NAME is something like \"\\\\\\\\host\\\\share-name\" then - COMMAND shouldn't be an empty string. - The programs `print' and `nprint' (the standard print programs - on Windows NT and Novell Netware respectively) are handled - specially, using NAME as the destination for output; any other - program is treated like `lpr' except that an explicit filename - is given as the last argument. - If COMMAND is nil, it's used the default printing program: - `print' for Windows system, `lp' for lp system and `lpr' for - all other systems. See also `pr-path-alist'. - Examples: - \"print\" - \"lpr\" - \"lp\" - -SWITCHES List of sexp's to pass as extra options for text printer - program. It is recommended to set NAME (see text below) - instead of including an explicit switch on this list. - Example: - . for lpr - (\"-#3\" \"-l\") - nil - -NAME A string that specifies a text printer name. - On Unix-like systems, a string value should be a name - understood by lpr's -P option (or lp's -d option). - On MS-DOS and MS-Windows systems, it is the name of a printer - device or port. Typical non-default settings would be \"LPT1:\" - to \"LPT3:\" for parallel printers, or \"COM1\" to \"COM4\" or - \"AUX\" for serial printers, or \"\\\\\\\\hostname\\\\printer\" - (or \"/D:\\\\\\\\hostname\\\\printer\") for a shared network - printer. You can also set it to a name of a file, in which - case the output gets appended to that file. If you want to - discard the printed output, set this to \"NUL\". - Examples: - . for print.exe - \"/D:\\\\\\\\host\\\\share-name\" - \"LPT1:\" - \"PRN\" - - . for lpr or lp - \"share-name\" - -This variable should be modified by customization engine. If this variable is -modified by other means (for example, a Lisp function), use `pr-update-menus' -function (see it for documentation) to update text printer menu. - -Examples: - -* On GNU or Unix system: - - ((prt_06a \"lpr\" nil \"prt_06a\") - (prt_07c nil nil \"prt_07c\") - ) - -* On Windows system: - - ((prt_06a \"print\" nil \"/D:\\\\\\\\printers\\\\prt_06a\") - (prt_07c nil nil \"/D:\\\\\\\\printers\\\\prt_07c\") - (PRN \"\" nil \"PRN\") - (standard \"redpr.exe\" nil \"\") - ) - -Useful links: - -* Information about the print command (print.exe) - `https://www.computerhope.com/printhlp.htm' - -* RedMon - Redirection Port Monitor (redpr.exe) - `http://www.ghostgum.com.au/software/redmon.htm' - -* Redirection Port Monitor (redpr.exe on-line help) - `https://www.cs.wisc.edu/~ghost/redmon/en/redmon.htm' - -* UNIX man pages: lpr (or type `man lpr') - `https://linux.die.net/man/1/lpr-cups' - -* UNIX man pages: lp (or type `man lp') - `https://linux.die.net/man/1/lp'" - :type '(repeat - (list :tag "Text Printer" - (symbol :tag "Printer Symbol Name") - (string :tag "Printer Command") - (repeat :tag "Printer Switches" - (sexp :tag "Switch" :value "")) - (choice :menu-tag "Printer Name" - :tag "Printer Name" - (const :tag "None" nil) - string))) - :set 'pr-alist-custom-set) - - -(defcustom pr-ps-name 'default - "Specify a printer for printing a PostScript file. - -This printer name symbol should be defined on `pr-ps-printer-alist' (see it for -documentation). - -This variable should be modified by customization engine. If this variable is -modified by other means (for example, a Lisp function), use `pr-update-menus' -function (see it for documentation) to update PostScript printer menu." - :type 'symbol - :set 'pr-ps-name-custom-set) - - -(defcustom pr-ps-printer-alist - (list (list 'default lpr-command nil - (cond (lpr-windows-system nil) - (lpr-lp-system "-d") - (t "-P")) - (or (getenv "PRINTER") (getenv "LPDEST") ps-printer-name))) - ;; Examples: - ;; * On GNU or Unix system: - ;; '((lps_06b "lpr" nil "-P" "lps_06b") - ;; (lps_07c "lpr" nil nil "lps_07c") - ;; (lps_08c nil nil nil "lps_08c") - ;; ) - ;; * On Windows system: - ;; '((lps_06a "print" nil "/D:" "\\\\printers\\lps_06a") - ;; (lps_06b "print" nil nil "\\\\printers\\lps_06b") - ;; (lps_07c "print" nil "" "/D:\\\\printers\\lps_07c") - ;; (lps_08c nil nil nil "\\\\printers\\lps_08c") - ;; (b/w "gsprint" ("-all" "-twoup") "-printer " "b/w-pr-name") - ;; (LPT1 "" nil "" "LPT1:") - ;; (PRN "" nil "" "PRN") - ;; (standard "redpr.exe" nil "" "") - ;; ) - "Specify an alist for all PostScript printers (PostScript printer database). - -The alist element has the form: - - (SYMBOL COMMAND SWITCHES PRINTER-SWITCH NAME DEFAULT...) - -Where: - -SYMBOL It's a symbol to identify a PostScript printer. It's for - setting option `pr-ps-name' and for menu selection. - Examples: - prt_06a - my_printer - -COMMAND Name of the program for printing a PostScript file. On MS-DOS - and MS-Windows systems, if the value is an empty string then - Emacs will write directly to the printer port given by NAME - (see text below), that is, the NAME should be something like - \"PRN\" or \"LPT1:\". - If NAME is something like \"\\\\\\\\host\\\\share-name\" then - COMMAND shouldn't be an empty string. - The programs `print' and `nprint' (the standard print programs - on Windows NT and Novell Netware respectively) are handled - specially, using NAME as the destination for output; any other - program is treated like `lpr' except that an explicit filename - is given as the last argument. - If COMMAND is nil, it's used the default printing program: - `print' for Windows system, `lp' for lp system and `lpr' for - all other systems. See also `pr-path-alist'. - Examples: - \"print\" - \"lpr\" - \"lp\" - \"cp\" - \"gsprint\" - -SWITCHES List of sexp's to pass as extra options for PostScript printer - program. It is recommended to set NAME (see text below) - instead of including an explicit switch on this list. - Example: - . for lpr - (\"-#3\" \"-l\") - nil - - . for gsprint.exe - (\"-all\" \"-twoup\") - -PRINTER-SWITCH A string that specifies PostScript printer name switch. If - it's necessary to have a space between PRINTER-SWITCH and NAME, - it should be inserted at the end of PRINTER-SWITCH string. - If PRINTER-SWITCH is nil, it's used the default printer name - switch: `/D:' for Windows system, `-d' for lp system and `-P' - for all other systems. - Examples: - . for lpr - \"-P \" - - . for lp - \"-d \" - - . for print.exe - \"/D:\" - - . for gsprint.exe - \"-printer \" - -NAME A string that specifies a PostScript printer name. - On Unix-like systems, a string value should be a name - understood by lpr's -P option (or lp's -d option). - On MS-DOS and MS-Windows systems, it is the name of a printer - device or port. Typical non-default settings would be \"LPT1:\" - to \"LPT3:\" for parallel printers, or \"COM1\" to \"COM4\" or - \"AUX\" for serial printers, or \"\\\\\\\\hostname\\\\printer\" - (or \"/D:\\\\\\\\hostname\\\\printer\") for a shared network - printer. You can also set it to a name of a file, in which - case the output gets appended to that file. If you want to - discard the printed output, set this to \"NUL\". - Examples: - . for cp.exe - \"\\\\\\\\host\\\\share-name\" - - . for print.exe or gsprint.exe - \"/D:\\\\\\\\host\\\\share-name\" - \"\\\\\\\\host\\\\share-name\" - \"LPT1:\" - \"PRN\" - - . for lpr or lp - \"share-name\" - -DEFAULT It's a way to set default values when this entry is selected. - It's a cons like: - - (VARIABLE . VALUE) - - Which associates VARIABLE with VALUE. When this entry is - selected, it's executed the following command: - - (set VARIABLE (eval VALUE)) - - Note that VALUE can be any valid Lisp expression. So, don't - forget to quote symbols and constant lists. - If VARIABLE is the special keyword `inherits-from:', VALUE must - be a symbol name setting defined in `pr-setting-database' from - which the current setting inherits the context. Take care with - circular inheritance. - Examples: - (ps-landscape-mode . nil) - (ps-spool-duplex . t) - (pr-gs-device . (my-gs-device t)) - -This variable should be modified by customization engine. If this variable is -modified by other means (for example, a Lisp function), use `pr-update-menus' -function (see it for documentation) to update PostScript printer menu. - -Examples: - -* On GNU or Unix system: - - ((lps_06b \"lpr\" nil \"-P\" \"lps_06b\") - (lps_07c \"lpr\" nil nil \"lps_07c\") - (lps_08c nil nil nil \"lps_08c\") - ) - -* On Windows system: - - ((lps_06a \"print\" nil \"/D:\" \"\\\\\\\\printers\\\\lps_06a\") - (lps_06b \"print\" nil nil \"\\\\\\\\printers\\\\lps_06b\") - (lps_07c \"print\" nil \"\" \"/D:\\\\\\\\printers\\\\lps_07c\") - (lps_08c nil nil nil \"\\\\\\\\printers\\\\lps_08c\") - (b/w1 \"gsprint\" (\"-all\" \"-twoup\") \"-printer \" \"b/w-pr-name\") - (b/w2 \"gsprint\" (\"-all\" \"-twoup\") nil \"-printer \\\\\\\\printers\\\\lps_06a\") - (LPT1 \"\" nil \"\" \"LPT1:\") - (PRN \"\" nil \"\" \"PRN\") - (standard \"redpr.exe\" nil \"\" \"\") - ) - - -gsprint: - -You can use gsprint instead of ghostscript to print monochrome PostScript files -in Windows. The gsprint utility documentation says that it is more efficient -than ghostscript to print monochrome PostScript. - -To print non-monochrome PostScript file, the efficiency of ghostscript is -similar to gsprint. - -Also the gsprint utility comes together with gsview distribution. - -As an example of gsprint declaration: - - (setq pr-ps-printer-alist - \\='((A \"gsprint\" (\"-all\" \"-twoup\") \"-printer \" \"lps_015\") - (B \"gsprint\" (\"-all\" \"-twoup\") nil \"-printer lps_015\") - ;; some other printer declaration - )) - -The example above declares that printer A prints all pages (-all) and two pages -per sheet (-twoup). The printer B declaration does the same as the printer A -declaration, the only difference is the printer name selection. - -There are other command line options like: - - -mono Render in monochrome as 1bit/pixel (only black and white). - -grey Render in greyscale as 8bits/pixel. - -color Render in color as 24bits/pixel. - -The default is `-mono'. So, printer A and B in the example above are using -implicitly the `-mono' option. Note that in `-mono' no gray tone or color is -printed, this includes the zebra stripes, that is, in `-mono' the zebra stripes -are not printed. - - -Useful links: - -* GSPRINT - Ghostscript print to Windows printer - `https://www.cs.wisc.edu/~ghost/gsview/gsprint.htm' - -* Introduction to Ghostscript - `https://www.cs.wisc.edu/~ghost/doc/intro.htm' - -* How to use Ghostscript - `https://www.cs.wisc.edu/~ghost/doc/cvs/Use.htm' - -* Information about the print command (print.exe) - `https://www.computerhope.com/printhlp.htm' - -* RedMon - Redirection Port Monitor (redpr.exe) - `http://www.ghostgum.com.au/software/redmon.htm' - -* Redirection Port Monitor (redpr.exe on-line help) - `https://www.cs.wisc.edu/~ghost/redmon/en/redmon.htm' - -* UNIX man pages: lpr (or type `man lpr') - `https://linux.die.net/man/1/lpr-cups' - -* UNIX man pages: lp (or type `man lp') - `https://linux.die.net/man/1/lp' - -* GNU utilities for w32 (cp.exe) - `https://unxutils.sourceforge.net/'" - :type '(repeat - (list - :tag "PostScript Printer" - (symbol :tag "Printer Symbol Name") - (string :tag "Printer Command") - (repeat :tag "Printer Switches" - (sexp :tag "Switch" :value "")) - (choice :menu-tag "Printer Name Switch" - :tag "Printer Name Switch" - (const :tag "None" nil) - string) - (choice :menu-tag "Printer Name" - :tag "Printer Name" - (const :tag "None" nil) - string) - (repeat - :tag "Default Value List" - :inline t - (cons - :tag "" - (choice - :menu-tag "Variable" - :tag "Variable" - (const :tag "Landscape" ps-landscape-mode) - (const :tag "Print Header" ps-print-header) - (const :tag "Print Header Frame" ps-print-header-frame) - (const :tag "Line Number" ps-line-number) - (const :tag "Zebra Stripes" ps-zebra-stripes) - (const :tag "Duplex" ps-spool-duplex) - (const :tag "Tumble" ps-spool-tumble) - (const :tag "Upside-Down" ps-print-upside-down) - (const :tag "PS File Landscape" pr-file-landscape) - (const :tag "PS File Duplex" pr-file-duplex) - (const :tag "PS File Tumble" pr-file-tumble) - (const :tag "Auto Region" pr-auto-region) - (const :tag "Auto Mode" pr-auto-mode) - (const :tag "Ghostscript Device" pr-gs-device) - (const :tag "Ghostscript Resolution" pr-gs-resolution) - (const :tag "inherits-from:" inherits-from:) - (variable :tag "Other")) - (sexp :tag "Value"))) - )) - :set 'pr-alist-custom-set) - - -(defcustom pr-temp-dir temporary-file-directory - "Specify a directory for temporary files during printing. - -See also `pr-ps-temp-file' and `pr-file-modes'." - :type '(directory :tag "Temporary Directory")) - - -(defcustom pr-ps-temp-file "prspool-" - "Specify PostScript temporary file name prefix. - -See also `pr-temp-dir' and `pr-file-modes'." - :type '(file :tag "PostScript Temporary File Name")) - - -;; It uses 0600 as default instead of (default-file-modes). -;; So, by default, only the session owner have permission to deal with files -;; generated by `printing'. -(defcustom pr-file-modes #o600 - "Specify the file permission bits for newly created files. -This is decimal, not octal. The default is 384 (0600 in octal). -It should be an integer; only the low 9 bits are used. - -See also `pr-temp-dir' and `pr-ps-temp-file'." - :type '(integer :tag "File Permission Bits")) - - -(defcustom pr-gv-command - (if lpr-windows-system - "gsview32.exe" - "gv") - "Specify path and name of the gsview/gv utility. - -See also `pr-path-alist'. - -Useful links: - -* GNU gv manual - `https://www.gnu.org/software/gv/manual/gv.html' - -* GSview Help - `https://www.cs.wisc.edu/~ghost/gsview/gsviewen.htm' - -* GSview Help - Common Problems - `https://www.cs.wisc.edu/~ghost/gsview/gsviewen.htm#Common_Problems' - -* GSview Readme (compilation & installation) - `https://www.cs.wisc.edu/~ghost/gsview/Readme.htm' - -* GSview (main site) - `https://www.cs.wisc.edu/~ghost/gsview/index.htm' - -* Ghostscript, Ghostview and GSview - `https://www.cs.wisc.edu/~ghost/' - -* Ghostview - `https://www.cs.wisc.edu/~ghost/gv/index.htm' - -* gv 3.5, June 1997 - `http://pages.cs.wisc.edu/~ghost/gv/gv_doc/gv.html' - -* MacGSView (Mac OS) - `http://pages.cs.wisc.edu/~ghost/macos/index.htm'" - :type '(string :tag "Ghostview Utility")) - - -(defcustom pr-gs-command - (if lpr-windows-system - "gswin32.exe" - "gs") - "Specify path and name of the ghostscript utility. - -See also `pr-path-alist'. - -Useful links: - -* Ghostscript, Ghostview and GSview - `https://www.cs.wisc.edu/~ghost/' - -* Introduction to Ghostscript - `https://www.cs.wisc.edu/~ghost/doc/intro.htm' - -* How to use Ghostscript - `https://www.cs.wisc.edu/~ghost/doc/cvs/Use.htm' - -* Printer compatibility - `https://www.cs.wisc.edu/~ghost/doc/printer.htm'" - :type '(string :tag "Ghostscript Utility")) - - -(defcustom pr-gs-switches - (if lpr-windows-system - '("-q -dNOPAUSE -Ic:/gs/gs5.50;c:/gs/gs5.50/fonts") - '("-q -dNOPAUSE -I/usr/share/ghostscript/5.10")) - "Specify ghostscript switches. See the documentation on GS for more info. - -It's a list of strings, where each string is one or more ghostscript switches. - -A note on the gs switches: - --q quiet --dNOPAUSE don't wait for user intervention --Ic:/gs/gs5.50;c:/gs/gs5.50/fonts the directories needed for gs --c quit it's added at the end to terminate gs - -To see ghostscript documentation for more information: - -* On GNU or Unix system: - - for full documentation, type: man gs - - for brief documentation, type: gs -h - -* On Windows system: - - for full documentation, see in a browser the file - c:/gstools/gs5.50/index.html, that is, the file index.html which is - located in the same directory as gswin32.exe. - - for brief documentation, type: gswin32.exe -h - -Useful links: - -* Introduction to Ghostscript - `https://www.cs.wisc.edu/~ghost/doc/intro.htm' - -* How to use Ghostscript - `https://www.cs.wisc.edu/~ghost/doc/cvs/Use.htm' - -* Printer compatibility - `https://www.cs.wisc.edu/~ghost/doc/printer.htm'" - :type '(repeat (string :tag "Ghostscript Switch"))) - - -(defcustom pr-gs-device - (if lpr-windows-system - "mswinpr2" - "uniprint") - "Specify the ghostscript device switch value (-sDEVICE=). - -A note on the gs switches: - --sDEVICE=djet500 the printer - works with HP DeskJet 540 - -See `pr-gs-switches' for documentation. -See also `pr-ps-printer-alist'." - :type '(string :tag "Ghostscript Device")) - - -(defcustom pr-gs-resolution 300 - "Specify ghostscript resolution switch value (-r). - -A note on the gs switches: - --r300 resolution 300x300 - -See `pr-gs-switches' for documentation. -See also `pr-ps-printer-alist'." - :type '(integer :tag "Ghostscript Resolution")) - - -(defcustom pr-print-using-ghostscript nil - "Non-nil means print using ghostscript. - -This is useful if you don't have a PostScript printer, so you could use the -ghostscript to print a PostScript file. - -In GNU or Unix system, if ghostscript is set as a PostScript filter, this -variable should be nil." - :type 'boolean) - - -(defcustom pr-faces-p nil - "Non-nil means print with face attributes." - :type 'boolean) - - -(defcustom pr-spool-p nil - "Non-nil means spool printing in a buffer." - :type 'boolean) - - -(defcustom pr-file-landscape nil - "Non-nil means print PostScript file in landscape orientation." - :type 'boolean) - - -(defcustom pr-file-duplex nil - "Non-nil means print PostScript file in duplex mode." - :type 'boolean) - - -(defcustom pr-file-tumble nil - "Non-nil means print PostScript file in tumble mode. - -If tumble is off, produces a printing suitable for binding on the left or -right. -If tumble is on, produces a printing suitable for binding at the top or -bottom." - :type 'boolean) - - -(defcustom pr-auto-region t - "Non-nil means region is automagically detected. - -Note that this will only work if you're using transient mark mode. - -When this variable is non-nil, the `*-buffer*' commands will behave like -`*-region*' commands, that is, `*-buffer*' commands will print only the region -marked instead of all buffer." - :type 'boolean) - - -(defcustom pr-auto-mode t - "Non-nil means major-mode specific printing is preferred over normal printing. - -That is, if current major-mode is declared in `pr-mode-alist', the `*-buffer*' -and `*-region*' commands will behave like `*-mode*' commands; otherwise, -`*-buffer*' commands will print the current buffer and `*-region*' commands -will print the current region." - :type 'boolean) - - -(defcustom pr-mode-alist - '((mh-folder-mode ; mh summary buffer - pr-mh-lpr-1 pr-mh-print-1 - 2 - (ps-article-author ps-article-subject) - ("/pagenumberstring load" pr-article-date) - nil - ) - (mh-letter-mode ; mh letter buffer - pr-mh-lpr-2 pr-mh-print-2 - 2 - (ps-article-author ps-article-subject) - ("/pagenumberstring load" pr-article-date) - nil - ) - (rmail-summary-mode ; rmail summary buffer - pr-rmail-lpr pr-rmail-print - 3 - (ps-article-subject ps-article-author buffer-name) - nil - nil - ) - (rmail-mode ; rmail buffer - pr-rmail-lpr pr-rmail-print - 3 - (ps-article-subject ps-article-author buffer-name) - nil - nil - ) - (gnus-summary-mode ; gnus summary buffer - pr-gnus-lpr pr-gnus-print - 3 - (ps-article-subject ps-article-author gnus-newsgroup-name) - nil - nil - ) - (gnus-article-mode ; gnus article buffer - pr-gnus-lpr pr-gnus-print - 3 - (ps-article-subject ps-article-author gnus-newsgroup-name) - nil - nil - ) - (Info-mode ; Info buffer - pr-mode-lpr pr-mode-print - 2 - (ps-info-node ps-info-file) - nil - nil - ) - (vm-mode ; vm mode - pr-vm-lpr pr-vm-print - 3 - (ps-article-subject ps-article-author buffer-name) - nil - nil - ) - ) - "Specify an alist for a major-mode and printing functions. - -To customize a major mode printing, just declare the customization in -`pr-mode-alist' and invoke some of `*-mode*' commands. An example for major -mode usage is when you're using gnus (or mh, or rmail, etc.) and you're in the -*Summary* buffer, if you forget to switch to the *Article* buffer before -printing, you'll get a nicely formatted list of article subjects shows up at -the printer. With major mode printing you don't need to switch from gnus -*Summary* buffer first. - -The elements have the following form: - - (MAJOR-MODE - LPR-PRINT PS-PRINT - HEADER-LINES - LEFT-HEADER - RIGHT-HEADER - KILL-LOCAL-VARIABLE - DEFAULT...) - -Where: - -MAJOR-MODE It's the major mode symbol. - -LPR-PRINT It's a symbol function for text printing. It's invoked with - one argument: - (HEADER-LINES LEFT-HEADER RIGHT-HEADER DEFAULT...). - - Usually LPR-PRINT function prepares the environment or buffer - and then call the function `pr-mode-lpr' which it's used to - process the buffer and send it to text printer. - - The `pr-mode-lpr' definition is: - - (pr-mode-lpr HEADER-LIST &optional FROM TO) - - Where HEADER-LIST is like the argument passed to LPR-PRINT. - FROM and TO are the beginning and end markers, respectively, - for a region. If FROM is nil, it's used (point-min); if TO is - nil, it's used (point-max). - -PS-PRINT It's a symbol function for PostScript printing. It's invoked - with three arguments: n-up printing, file name and the list: - (HEADER-LINES LEFT-HEADER RIGHT-HEADER DEFAULT...). - - Usually PS-PRINT function prepares the environment or buffer - and then call the function `pr-mode-print' which it's used to - process the buffer and send it to PostScript printer. - - The `pr-mode-print' definition is: - - (pr-mode-print N-UP FILENAME HEADER-LIST &optional FROM TO) - - Where N-UP, FILENAME and HEADER-LIST are like the arguments - passed to PS-PRINT. FROM and TO are the beginning and end - markers, respectively, for a region. If TO is nil, it's used - (point-max). - -HEADER-LINES It's the number of header lines; if is nil, it uses - `ps-header-lines' value. - -LEFT-HEADER It's the left header part, it's a list of string, variable - symbol or function symbol (with no argument); if is nil, it - uses `ps-left-header' value. - -RIGHT-HEADER It's the right header part, it's a list of string, variable - symbol or function symbol (with no argument); if is nil, it - uses `ps-right-header' value. - -KILL-LOCAL-VARIABLE - Non-nil means to kill all buffer local variable declared in - DEFAULT (see below). - -DEFAULT It's a way to set default values when this entry is selected. - It's a cons like: - - (VARIABLE-SYM . VALUE) - - Which associates VARIABLE-SYM with VALUE. When this entry is - selected, it's executed the following command: - - (set (make-local-variable VARIABLE-SYM) (eval VALUE)) - - Note that VALUE can be any valid Lisp expression. So, don't - forget to quote symbols and constant lists. - If VARIABLE is the special keyword `inherits-from:', VALUE must - be a symbol name setting defined in `pr-setting-database' from - which the current setting inherits the context. Take care with - circular inheritance. - Examples: - (ps-landscape-mode . nil) - (ps-spool-duplex . t) - (pr-gs-device . (my-gs-device t))" - :type '(repeat - (list - :tag "" - (symbol :tag "Major Mode") - (function :tag "Text Printing Function") - (function :tag "PS Printing Function") - (choice :menu-tag "Number of Header Lines" - :tag "Number of Header Lines" - (integer :tag "Number") - (const :tag "Default Number" nil)) - (repeat :tag "Left Header List" - (choice :menu-tag "Left Header" - :tag "Left Header" - string symbol)) - (repeat :tag "Right Header List" - (choice :menu-tag "Right Header" - :tag "Right Header" - string symbol)) - (boolean :tag "Kill Local Variable At End") - (repeat - :tag "Default Value List" - :inline t - (cons - :tag "" - (choice - :menu-tag "Variable" - :tag "Variable" - (const :tag "Landscape" ps-landscape-mode) - (const :tag "Print Header" ps-print-header) - (const :tag "Print Header Frame" ps-print-header-frame) - (const :tag "Line Number" ps-line-number) - (const :tag "Zebra Stripes" ps-zebra-stripes) - (const :tag "Duplex" ps-spool-duplex) - (const :tag "Tumble" ps-spool-tumble) - (const :tag "Upside-Down" ps-print-upside-down) - (const :tag "PS File Landscape" pr-file-landscape) - (const :tag "PS File Duplex" pr-file-duplex) - (const :tag "PS File Tumble" pr-file-tumble) - (const :tag "Auto Region" pr-auto-region) - (const :tag "Auto Mode" pr-auto-mode) - (const :tag "Ghostscript Device" pr-gs-device) - (const :tag "Ghostscript Resolution" pr-gs-resolution) - (const :tag "inherits-from:" inherits-from:) - (variable :tag "Other")) - (sexp :tag "Value"))) - ))) - - -(defcustom pr-ps-utility 'mpage - "Specify PostScript utility symbol. - -This utility symbol should be defined on `pr-ps-utility-alist' (see it for -documentation). - -This variable should be modified by customization engine. If this variable is -modified by other means (for example, a Lisp function), use `pr-update-menus' -function (see it for documentation) to update PostScript utility menu. - -NOTE: Don't forget to download and install the utilities declared on - `pr-ps-utility-alist'." - :type '(symbol :tag "PS File Utility") - :set 'pr-ps-utility-custom-set) - - -(defcustom pr-ps-utility-alist - '((mpage "mpage" nil "-b%s" "-%d" "-l" "-t" "-T" ">" nil) - (psnup "psnup" ("-q") "-P%s" "-%d" "-l" nil nil " " nil - (inherits-from: . no-duplex)) - ) - ;; Examples: - ;; * On GNU or Unix system: - ;; '((mpage "mpage" nil "-b%s" "-%d" "-l" "-t" "-T" ">" nil) - ;; (psnup "psnup" ("-q") "-P%s" "-%d" "-l" nil nil " " nil - ;; (pr-file-duplex . nil) (pr-file-tumble . nil)) - ;; ) - ;; * On Windows system: - ;; '((psnup "c:/psutils/psnup" ("-q") "-P%s" "-%d" "-l" nil nil " " nil - ;; (pr-file-duplex . nil) (pr-file-tumble . nil)) - ;; ) - "Specify an alist for PostScript utility processing (PS utility database). - -The alist element has the form: - - (SYMBOL UTILITY MUST-SWITCHES PAPERSIZE N-UP LANDSCAPE DUPLEX TUMBLE OUTPUT - SWITCHES DEFAULT...) - -Where: - -SYMBOL It's a symbol to identify a PostScript utility. It's for - `pr-ps-utility' variable setting and for menu selection. - Examples: - mpage - psnup - -UTILITY Name of utility for processing a PostScript file. - See also `pr-path-alist'. - Examples: - . for GNU or Unix system: - \"mpage\" - \"psnup -q\" - - . for Windows system: - \"c:/psutils/psnup -q\" - -MUST-SWITCHES List of sexp's to pass as options to the PostScript utility - program. These options are necessary to process the utility - program and must be placed before any other switches. - Example: - . for psnup: - (\"-q\") - -PAPERSIZE It's a format string to specify paper size switch. - Example: - . for mpage - \"-b%s\" - -N-UP It's a format string to specify n-up switch. - Example: - . for psnup - \"-%d\" - -LANDSCAPE It's a string to specify landscape switch. If the utility - doesn't have landscape switch, set to nil. - Example: - . for psnup - \"-l\" - -DUPLEX It's a string to specify duplex switch. If the utility doesn't - have duplex switch, set to nil. - Example: - . for psnup - nil - -TUMBLE It's a string to specify tumble switch. If the utility doesn't - have tumble switch, set to nil. - Example: - . for psnup - nil - -OUTPUT It's a string to specify how to generate an output file. Some - utilities accept an output file option, but some others need - output redirection or some other way to specify an output file. - Example: - . for psnup - \" \" ; psnup ... input output - - . for mpage - \">\" ; mpage ... input > output - -SWITCHES List of sexp's to pass as extra options to the PostScript utility - program. - Example: - . for psnup - (\"-q\") - nil - -DEFAULT It's a way to set default values when this entry is selected. - It's a cons like: - - (VARIABLE . VALUE) - - Which associates VARIABLE with VALUE. When this entry is - selected, it's executed the following command: - - (set VARIABLE (eval VALUE)) - - Note that VALUE can be any valid Lisp expression. So, don't - forget to quote symbols and constant lists. - If VARIABLE is the special keyword `inherits-from:', VALUE must - be a symbol name setting defined in `pr-setting-database' from - which the current setting inherits the context. Take care with - circular inheritance. - Examples: - (pr-file-landscape . nil) - (pr-file-duplex . t) - (pr-gs-device . (my-gs-device t)) - -This variable should be modified by customization engine. If this variable is -modified by other means (for example, a Lisp function), use `pr-update-menus' -function (see it for documentation) to update PostScript utility menu. - -NOTE: Don't forget to download and install the utilities declared on - `pr-ps-utility-alist'. - -Examples: - -* On GNU or Unix system: - - ((mpage \"mpage\" nil \"-b%s\" \"-%d\" \"-l\" \"-t\" \"-T\" \">\" nil) - (psnup \"psnup\" (\"-q\") \"-P%s\" \"-%d\" \"-l\" nil nil \" \" nil - (pr-file-duplex . nil) (pr-file-tumble . nil)) - ) - -* On Windows system: - - ((psnup \"c:/psutils/psnup\" (\"-q\") \"-P%s\" \"-%d\" \"-l\" nil nil \" \" - nil (pr-file-duplex . nil) (pr-file-tumble . nil)) - ) - -Useful links: - -* mpage download (GNU or Unix) - `https://www.mesa.nl/pub/mpage/' - -* mpage documentation (GNU or Unix - or type `man mpage') - `https://linux.die.net/man/1/mpage' - -* psnup (Windows, GNU or Unix) - `http://www.knackered.org/angus/psutils/' - `http://gershwin.ens.fr/vdaniel/Doc-Locale/Outils-Gnu-Linux/PsUtils/' - -* psnup (PsUtils for Windows) - `https://gnuwin32.sourceforge.net/packages/psutils.htm' - -* psnup documentation (GNU or Unix - or type `man psnup') - `https://linux.die.net/man/1/psnup' - -* GNU Enscript (Windows, GNU or Unix) - `https://people.ssh.com/mtr/genscript/' - -* GNU Enscript documentation (Windows, GNU or Unix) - `https://people.ssh.com/mtr/genscript/enscript.man.html' - (on GNU or Unix, type `man enscript')" - :type '(repeat - (list :tag "PS File Utility" - (symbol :tag "Utility Symbol") - (string :tag "Utility Name") - (repeat :tag "Must Utility Switches" - (sexp :tag "Switch" :value "")) - (choice :menu-tag "Paper Size" - :tag "Paper Size" - (const :tag "No Paper Size" nil) - (string :tag "Paper Size Format")) - (choice :menu-tag "N-Up" - :tag "N-Up" - (const :tag "No N-Up" nil) - (string :tag "N-Up Format")) - (choice :menu-tag "Landscape" - :tag "Landscape" - (const :tag "No Landscape" nil) - (string :tag "Landscape Switch")) - (choice :menu-tag "Duplex" - :tag "Duplex" - (const :tag "No Duplex" nil) - (string :tag "Duplex Switch")) - (choice :menu-tag "Tumble" - :tag "Tumble" - (const :tag "No Tumble" nil) - (string :tag "Tumble Switch")) - (string :tag "Output Separator") - (repeat :tag "Utility Switches" - (sexp :tag "Switch" :value "")) - (repeat - :tag "Default Value List" - :inline t - (cons - :tag "" - (choice - :menu-tag "Variable" - :tag "Variable" - (const :tag "PS File Landscape" pr-file-landscape) - (const :tag "PS File Duplex" pr-file-duplex) - (const :tag "PS File Tumble" pr-file-tumble) - (const :tag "Ghostscript Device" pr-gs-device) - (const :tag "Ghostscript Resolution" pr-gs-resolution) - (const :tag "inherits-from:" inherits-from:) - (variable :tag "Other")) - (sexp :tag "Value"))) - )) - :set 'pr-alist-custom-set) - - -(defcustom pr-menu-lock t - "Non-nil means menu is locked while selecting toggle options. - -See also `pr-menu-char-height' and `pr-menu-char-width'." - :type 'boolean) - - -(defcustom pr-menu-char-height (frame-char-height) - "Specify menu char height in pixels. - -This variable is used to guess which vertical position should be locked the -menu, so don't forget to adjust it if menu position is not ok. - -See also `pr-menu-lock' and `pr-menu-char-width'." - :type 'integer) - - -(defcustom pr-menu-char-width (frame-char-width) - "Specify menu char width in pixels. - -This variable is used to guess which horizontal position should be locked the -menu, so don't forget to adjust it if menu position is not ok. - -See also `pr-menu-lock' and `pr-menu-char-height'." - :type 'integer) - - -(defcustom pr-setting-database - '((no-duplex ; setting symbol name - nil nil nil ; inherits local kill-local - (pr-file-duplex . nil) ; settings - (pr-file-tumble . nil)) - ) - "Specify an alist for settings in general. - -The elements have the following form: - - (SYMBOL INHERITS LOCAL KILL-LOCAL SETTING...) - -Where: - -SYMBOL It's a symbol to identify the setting group. - -INHERITS Specify the inheritance for SYMBOL group. It's a symbol name - setting from which the current setting inherits the context. - If INHERITS is nil, means that there is no inheritance. - This is a simple inheritance mechanism. - - Let's see an example to illustrate the inheritance mechanism: - - (setq pr-setting-database - \\='((no-duplex ; setting symbol name - nil ; inherits - nil nil ; local kill-local - (pr-file-duplex . nil) ; settings - (pr-file-tumble . nil) - ) - (no-duplex-and-landscape ; setting symbol name - no-duplex ; inherits - nil nil ; local kill-local - (pr-file-landscape . nil) ; settings - ))) - - The example above has two setting groups: no-duplex and - no-duplex-and-landscape. When setting no-duplex is activated - through `inherits-from:' (see option `pr-ps-utility', - `pr-mode-alist' and `pr-ps-printer-alist'), the variables - pr-file-duplex and pr-file-tumble are both set to nil. - - Now when setting no-duplex-and-landscape is activated through - `inherits-from:', the variable pr-file-landscape is set to nil - and also the settings for no-duplex are done, because - no-duplex-and-landscape inherits settings from no-duplex. - - Take care with circular inheritance. It's an error if circular - inheritance happens. - -LOCAL Non-nil means that all settings for SYMBOL group will be - declared local buffer. - -KILL-LOCAL Non-nil means that all settings for SYMBOL group will be - killed at end. It has effect only when LOCAL is non-nil. - -SETTING It's a cons like: - - (VARIABLE . VALUE) - - Which associates VARIABLE with VALUE. When this entry is - selected, it's executed the following command: - - * If LOCAL is non-nil: - (set (make-local-variable VARIABLE) (eval VALUE)) - - * If LOCAL is nil: - (set VARIABLE (eval VALUE)) - - Note that VALUE can be any valid Lisp expression. So, don't - forget to quote symbols and constant lists. - This setting is ignored if VARIABLE is equal to keyword - `inherits-from:'. - Examples: - (ps-landscape-mode . nil) - (ps-spool-duplex . t) - (pr-gs-device . (my-gs-device t))" - :type '(repeat - (list - :tag "" - (symbol :tag "Setting Name") - (choice :menu-tag "Inheritance" - :tag "Inheritance" - (const :tag "No Inheritance" nil) - (symbol :tag "Inherits From")) - (boolean :tag "Local Buffer Setting") - (boolean :tag "Kill Local Variable At End") - (repeat - :tag "Setting List" - :inline t - (cons - :tag "" - (choice - :menu-tag "Variable" - :tag "Variable" - (const :tag "Landscape" ps-landscape-mode) - (const :tag "Print Header" ps-print-header) - (const :tag "Print Header Frame" ps-print-header-frame) - (const :tag "Line Number" ps-line-number) - (const :tag "Zebra Stripes" ps-zebra-stripes) - (const :tag "Duplex" ps-spool-duplex) - (const :tag "Tumble" ps-spool-tumble) - (const :tag "Upside-Down" ps-print-upside-down) - (const :tag "PS File Landscape" pr-file-landscape) - (const :tag "PS File Duplex" pr-file-duplex) - (const :tag "PS File Tumble" pr-file-tumble) - (const :tag "Auto Region" pr-auto-region) - (const :tag "Auto Mode" pr-auto-mode) - (const :tag "Ghostscript Device" pr-gs-device) - (const :tag "Ghostscript Resolution" pr-gs-resolution) - (variable :tag "Other")) - (sexp :tag "Value"))) - ))) - - -(defcustom pr-visible-entry-list - '(postscript text postscript-options postscript-process printing help) - "Specify a list of Printing menu visible entries. - -Valid values with the corresponding menu parts are: - - +------------------------------+ - | Printing Interface | - +------------------------------+ - `postscript' | PostScript Preview >| - | PostScript Print >| - | PostScript Printer: name >| - +------------------------------+ - `text' | Printify >| - | Print >| - | Text Printer: name >| - +------------------------------+ - `postscript-options' |[ ] Landscape | - |[ ] Print Header | - |[ ] Print Header Frame | - |[ ] Line Number | - |[ ] Zebra Stripes | - |[ ] Duplex | - |[ ] Tumble | - |[ ] Upside-Down | - | Print All Pages >| - +------------------------------+ - `postscript-process' |[ ] Spool Buffer | - |[ ] Print with faces | - |[ ] Print via Ghostscript | - +------------------------------+ - `printing' |[ ] Auto Region | - |[ ] Auto Mode | - |[ ] Menu Lock | - +------------------------------+ - `help' | Customize >| - | Show Settings >| - | Help | - +------------------------------+ - -Any other value is ignored." - :type '(repeat :tag "Menu Visible Part" - (choice :menu-tag "Menu Part" - :tag "Menu Part" - (const postscript) - (const text) - (const postscript-options) - (const postscript-process) - (const printing) - (const help)))) - - -(defcustom pr-delete-temp-file t - "Non-nil means delete temporary files. - -Set `pr-delete-temp-file' to nil, if the following message (or a similar) -happens when printing: - - Error: could not open \"c:\\temp\\prspool.ps\" for reading." - :type 'boolean) - - -(defcustom pr-list-directory nil - "Non-nil means list directory when processing a directory. - -That is, any subdirectories (and the superdirectory) of the directory (given as -argument of functions below) are also printed (as `dired-mode' listings). - -It's used by `pr-ps-directory-preview', `pr-ps-directory-using-ghostscript', -`pr-ps-directory-print', `pr-ps-directory-ps-print', `pr-printify-directory' -and `pr-txt-directory'." - :type 'boolean) - - -(defcustom pr-buffer-name "*Printing Interface*" - "Specify the name of the buffer interface for printing package. - -It's used by `pr-interface'." - :type 'string) - - -(defcustom pr-buffer-name-ignore - (list (regexp-quote pr-buffer-name) ; ignore printing interface buffer - "^ .*$") ; ignore invisible buffers - "Specify a regexp list for buffer names to be ignored in interface buffer. - -NOTE: Case is important for matching, that is, `case-fold-search' is always - nil. - -It's used by `pr-interface'." - :type '(repeat (regexp :tag "Buffer Name Regexp"))) - - -(defcustom pr-buffer-verbose t - "Non-nil means to be verbose when editing a field in interface buffer. - -It's used by `pr-interface'." - :type 'boolean) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Internal Variables - - -(defvar pr-txt-command nil - "Name of program for printing a text file. -See `pr-txt-printer-alist'.") - - -(defvar pr-txt-switches nil - "List of sexp's to pass as extra options to the text printer program. -See `pr-txt-printer-alist'.") - - -(defvar pr-txt-printer nil - "Specify text printer name. -See `pr-txt-printer-alist'.") - - -(defvar pr-ps-command nil - "Name of program for printing a PostScript file. -See `pr-ps-printer-alist'.") - - -(defvar pr-ps-switches nil - "List of sexp's to pass as extra options to the PostScript printer program. -See `pr-ps-printer-alist'.") - - -(defvar pr-ps-printer-switch nil - "Specify PostScript printer name switch. -See `pr-ps-printer-alist'.") - - -(defvar pr-ps-printer nil - "Specify PostScript printer name. -See `pr-ps-printer-alist'.") - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Keys & Menus - - -(defsubst pr-visible-p (key) - (memq key pr-visible-entry-list)) - - -(defsubst pr-mode-alist-p () - (cdr (assq major-mode pr-mode-alist))) - - -(defsubst pr-auto-mode-p () - (and pr-auto-mode (pr-mode-alist-p))) - - -(defsubst pr-using-ghostscript-p () - (and pr-print-using-ghostscript (not pr-spool-p))) - - -(defconst pr-menu-spec - '( - ["Printing Interface" pr-interface - :help "Use buffer interface instead of menu interface"] - "--" - ("PostScript Preview" :included (pr-visible-p 'postscript) - :help "Preview PostScript instead of sending to printer" - ("Directory" :active (not pr-spool-p) - ["1-up" (pr-ps-directory-preview 1 nil nil t) t] - ["2-up" (pr-ps-directory-preview 2 nil nil t) t] - ["4-up" (pr-ps-directory-preview 4 nil nil t) t] - ["Other..." (pr-ps-directory-preview nil nil nil t) - :keys "\\[pr-ps-buffer-preview]"]) - ("Buffer" :active (not pr-spool-p) - ["1-up" (pr-ps-buffer-preview 1 t) t] - ["2-up" (pr-ps-buffer-preview 2 t) t] - ["4-up" (pr-ps-buffer-preview 4 t) t] - ["Other..." (pr-ps-buffer-preview nil t) - :keys "\\[pr-ps-buffer-preview]"]) - ("Region" :active (and (not pr-spool-p) mark-active) - ["1-up" (pr-ps-region-preview 1 t) t] - ["2-up" (pr-ps-region-preview 2 t) t] - ["4-up" (pr-ps-region-preview 4 t) t] - ["Other..." (pr-ps-region-preview nil t) - :keys "\\[pr-ps-region-preview]"]) - ("Mode" :active (and (not pr-spool-p) (pr-mode-alist-p)) - ["1-up" (pr-ps-mode-preview 1 t) t] - ["2-up" (pr-ps-mode-preview 2 t) t] - ["4-up" (pr-ps-mode-preview 4 t) t] - ["Other..." (pr-ps-mode-preview nil t) - :keys "\\[pr-ps-mode-preview]"]) - ("File" - ["No Preprocessing..." (call-interactively 'pr-ps-file-preview) - :keys "\\[pr-ps-file-preview]" - :help "Preview PostScript file"] - "--" - ["PostScript Utility" pr-update-menus :active pr-ps-utility-alist - :help "Select PostScript utility"] - "--" - ["1-up..." (pr-ps-file-up-preview 1 t t) pr-ps-utility-alist] - ["2-up..." (pr-ps-file-up-preview 2 t t) pr-ps-utility-alist] - ["4-up..." (pr-ps-file-up-preview 4 t t) pr-ps-utility-alist] - ["Other..." (pr-ps-file-up-preview nil t t) - :keys "\\[pr-ps-file-up-preview]" :active pr-ps-utility-alist] - "--" - ["Landscape" pr-toggle-file-landscape-menu - :style toggle :selected pr-file-landscape - :help "Toggle landscape for PostScript file" - :active pr-ps-utility-alist] - ["Duplex" pr-toggle-file-duplex-menu - :style toggle :selected pr-file-duplex - :help "Toggle duplex for PostScript file" - :active pr-ps-utility-alist] - ["Tumble" pr-toggle-file-tumble-menu - :style toggle :selected pr-file-tumble - :help "Toggle tumble for PostScript file" - :active (and pr-file-duplex pr-ps-utility-alist)]) - ["Despool..." (call-interactively 'pr-despool-preview) - :active pr-spool-p :keys "\\[pr-despool-preview]" - :help "Despool PostScript buffer to printer or file (C-u)"]) - ("PostScript Print" :included (pr-visible-p 'postscript) - :help "Send PostScript to printer or file (C-u)" - ("Directory" - ["1-up" (pr-ps-directory-ps-print 1 nil nil t) t] - ["2-up" (pr-ps-directory-ps-print 2 nil nil t) t] - ["4-up" (pr-ps-directory-ps-print 4 nil nil t) t] - ["Other..." (pr-ps-directory-ps-print nil nil nil t) - :keys "\\[pr-ps-buffer-ps-print]"]) - ("Buffer" - ["1-up" (pr-ps-buffer-ps-print 1 t) t] - ["2-up" (pr-ps-buffer-ps-print 2 t) t] - ["4-up" (pr-ps-buffer-ps-print 4 t) t] - ["Other..." (pr-ps-buffer-ps-print nil t) - :keys "\\[pr-ps-buffer-ps-print]"]) - ("Region" :active mark-active - ["1-up" (pr-ps-region-ps-print 1 t) t] - ["2-up" (pr-ps-region-ps-print 2 t) t] - ["4-up" (pr-ps-region-ps-print 4 t) t] - ["Other..." (pr-ps-region-ps-print nil t) - :keys "\\[pr-ps-region-ps-print]"]) - ("Mode" :active (pr-mode-alist-p) - ["1-up" (pr-ps-mode-ps-print 1 t) t] - ["2-up" (pr-ps-mode-ps-print 2 t) t] - ["4-up" (pr-ps-mode-ps-print 4 t) t] - ["Other..." (pr-ps-mode-ps-print nil t) - :keys "\\[pr-ps-mode-ps-print]"]) - ("File" - ["No Preprocessing..." (call-interactively 'pr-ps-file-ps-print) - :keys "\\[pr-ps-file-ps-print]" - :help "Send PostScript file to printer"] - "--" - ["PostScript Utility" pr-update-menus :active pr-ps-utility-alist - :help "Select PostScript utility"] - "--" - ["1-up..." (pr-ps-file-up-ps-print 1 t t) pr-ps-utility-alist] - ["2-up..." (pr-ps-file-up-ps-print 2 t t) pr-ps-utility-alist] - ["4-up..." (pr-ps-file-up-ps-print 4 t t) pr-ps-utility-alist] - ["Other..." (pr-ps-file-up-ps-print nil t t) - :keys "\\[pr-ps-file-up-ps-print]" :active pr-ps-utility-alist] - "--" - ["Landscape" pr-toggle-file-landscape-menu - :style toggle :selected pr-file-landscape - :help "Toggle landscape for PostScript file" - :active pr-ps-utility-alist] - ["Duplex" pr-toggle-file-duplex-menu - :style toggle :selected pr-file-duplex - :help "Toggle duplex for PostScript file" - :active pr-ps-utility-alist] - ["Tumble" pr-toggle-file-tumble-menu - :style toggle :selected pr-file-tumble - :help "Toggle tumble for PostScript file" - :active (and pr-file-duplex pr-ps-utility-alist)]) - ["Despool..." (call-interactively 'pr-despool-ps-print) - :active pr-spool-p :keys "\\[pr-despool-ps-print]" - :help "Despool PostScript buffer to printer or file (C-u)"]) - ["PostScript Printers" pr-update-menus - :active pr-ps-printer-alist :included (pr-visible-p 'postscript) - :help "Select PostScript printer"] - "--" - ("Printify" :included (pr-visible-p 'text) - :help - "Replace non-printing chars with printable representations." - ["Directory" pr-printify-directory t] - ["Buffer" pr-printify-buffer t] - ["Region" pr-printify-region mark-active]) - ("Print" :included (pr-visible-p 'text) - :help "Send text to printer" - ["Directory" pr-txt-directory t] - ["Buffer" pr-txt-buffer t] - ["Region" pr-txt-region mark-active] - ["Mode" pr-txt-mode (pr-mode-alist-p)]) - ["Text Printers" pr-update-menus - :active pr-txt-printer-alist :included (pr-visible-p 'text) - :help "Select text printer"] - "--" - ["Landscape" pr-toggle-landscape-menu - :style toggle :selected ps-landscape-mode - :included (pr-visible-p 'postscript-options)] - ["Print Header" pr-toggle-header-menu - :style toggle :selected ps-print-header - :included (pr-visible-p 'postscript-options)] - ["Print Header Frame" pr-toggle-header-frame-menu - :style toggle :selected ps-print-header-frame :active ps-print-header - :included (pr-visible-p 'postscript-options)] - ["Line Number" pr-toggle-line-menu - :style toggle :selected ps-line-number - :included (pr-visible-p 'postscript-options)] - ["Zebra Stripes" pr-toggle-zebra-menu - :style toggle :selected ps-zebra-stripes - :included (pr-visible-p 'postscript-options)] - ["Duplex" pr-toggle-duplex-menu - :style toggle :selected ps-spool-duplex - :included (pr-visible-p 'postscript-options)] - ["Tumble" pr-toggle-tumble-menu - :style toggle :selected ps-spool-tumble :active ps-spool-duplex - :included (pr-visible-p 'postscript-options)] - ["Upside-Down" pr-toggle-upside-down-menu - :style toggle :selected ps-print-upside-down - :included (pr-visible-p 'postscript-options)] - ("Print All Pages" :included (pr-visible-p 'postscript-options) - :help "Select odd/even pages/sheets to print" - ["All Pages" (pr-even-or-odd-pages nil) - :style radio :selected (eq ps-even-or-odd-pages nil)] - ["Even Pages" (pr-even-or-odd-pages 'even-page) - :style radio :selected (eq ps-even-or-odd-pages 'even-page)] - ["Odd Pages" (pr-even-or-odd-pages 'odd-page) - :style radio :selected (eq ps-even-or-odd-pages 'odd-page)] - ["Even Sheets" (pr-even-or-odd-pages 'even-sheet) - :style radio :selected (eq ps-even-or-odd-pages 'even-sheet)] - ["Odd Sheets" (pr-even-or-odd-pages 'odd-sheet) - :style radio :selected (eq ps-even-or-odd-pages 'odd-sheet)]) - "--" - ["Spool Buffer" pr-toggle-spool-menu - :style toggle :selected pr-spool-p - :included (pr-visible-p 'postscript-process) - :help "Toggle PostScript spooling"] - ["Print with faces" pr-toggle-faces-menu - :style toggle :selected pr-faces-p - :included (pr-visible-p 'postscript-process) - :help "Toggle PostScript printing with faces"] - ["Print via Ghostscript" pr-toggle-ghostscript-menu - :style toggle :selected pr-print-using-ghostscript - :included (pr-visible-p 'postscript-process) - :help "Toggle PostScript generation using ghostscript"] - "--" - ["Auto Region" pr-toggle-region-menu - :style toggle :selected pr-auto-region - :included (pr-visible-p 'printing)] - ["Auto Mode" pr-toggle-mode-menu - :style toggle :selected pr-auto-mode - :included (pr-visible-p 'printing)] - ["Menu Lock" pr-toggle-lock-menu - :style toggle :selected pr-menu-lock - :included (pr-visible-p 'printing)] - "--" - ("Customize" :included (pr-visible-p 'help) - ["printing" pr-customize t] - ["ps-print" ps-print-customize t] - ["lpr" lpr-customize t]) - ("Show Settings" :included (pr-visible-p 'help) - ["printing" pr-show-pr-setup t] - ["ps-print" pr-show-ps-setup t] - ["lpr" pr-show-lpr-setup t]) - ["Help" pr-help :active t :included (pr-visible-p 'help)] - )) - - -(defun pr-menu-bind () - "Install `printing' menu in the menubar. -This replaces the File/Print* menu entries with a File/Print sub-menu. -Calls `pr-update-menus' to adjust menus." - (interactive) - (pr-global-menubar pr-menu-spec) - (pr-update-menus t)) - - -;; Key binding -;; FIXME: These should be moved to a function so that just loading the file -;; doesn't affect the global keymap! -(global-set-key [print] 'pr-ps-fast-fire) -;; Well, M-print and S-print are used because on my keyboard S-print works -;; and M-print doesn't. But M-print can work on other keyboards. -(global-set-key [(meta print)] 'pr-ps-mode-using-ghostscript) -(global-set-key [(shift print)] 'pr-ps-mode-using-ghostscript) -;; Well, C-print and C-M-print are used because in my keyboard C-M-print works -;; and C-print doesn't. But C-print can work in other keyboard. -(global-set-key [(control print)] 'pr-txt-fast-fire) -(global-set-key [(control meta print)] 'pr-txt-fast-fire) - -;;; You can also use something like: -;;;(keymap-global-set "C-c i" 'pr-interface) -;;;(keymap-global-set "C-c b p" 'pr-ps-buffer-print) -;;;(keymap-global-set "C-c b x" 'pr-ps-buffer-preview) -;;;(keymap-global-set "C-c b b" 'pr-ps-buffer-using-ghostscript) -;;;(keymap-global-set "C-c r p" 'pr-ps-region-print) -;;;(keymap-global-set "C-c r x" 'pr-ps-region-preview) -;;;(keymap-global-set "C-c r r" 'pr-ps-region-using-ghostscript) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Help Message - - -(defconst pr-help-message - "\ -Menu Layout ------------ - -The `printing' menu (Tools/Printing or File/Print) has the following layout: - - +-----------------------------+ -A 0 | Printing Interface | - +-----------------------------+ +-A---------+ +-B------+ -I 1 | PostScript Preview >|-------|Directory >|-----|1-up | - 2 | PostScript Print >|---- A |Buffer >|-- B |2-up | - 3 | PostScript Printer: name >|---- C |Region >|-- B |4-up | - +-----------------------------+ |Mode >|-- B |Other...| -II 4 | Printify >|-----\\ |File >|--\\ +--------+ - 5 | Print >|---\\ | |Despool... | | - 6 | Text Printer: name >|-\\ | | +-----------+ | - +-----------------------------+ | | | +---------+ +------------+ -III 7 |[ ]Landscape | | | \\-|Directory| | No Prep... | Ia - 8 |[ ]Print Header | | | |Buffer | +------------+ Ib - 9 |[ ]Print Header Frame | | | |Region | | name >|- C - 10 |[ ]Line Number | | | +---------+ +------------+ - 11 |[ ]Zebra Stripes | | | +---------+ | 1-up... | Ic - 12 |[ ]Duplex | | \\---|Directory| | 2-up... | - 13 |[ ]Tumble | \\--\\ |Buffer | | 4-up... | - 14 |[ ]Upside-Down | | |Region | | Other... | - 15 | Print All Pages >|--\\ | |Mode | +------------+ - +-----------------------------+ | | +---------+ |[ ]Landscape| Id -IV 16 |[ ]Spool Buffer | | | +-C-------+ |[ ]Duplex | Ie - 17 |[ ]Print with faces | | \\--|( )name A| |[ ]Tumble | If - 18 |[ ]Print via Ghostscript | | |( )name B| +------------+ - +-----------------------------+ | |... | -V 19 |[ ]Auto Region | | |(*)name | - 20 |[ ]Auto Mode | | |... | - 21 |[ ]Menu Lock | | +---------+ +--------------+ - +-----------------------------+ \\------------------|(*)All Pages | -VI 22 | Customize >|--- D +-D------+ |( )Even Pages | - 23 | Show Settings >|-------|printing| |( )Odd Pages | - 24 | Help | |ps-print| |( )Even Sheets| - +-----------------------------+ |lpr | |( )Odd Sheets | - +--------+ +--------------+ - -See `pr-visible-entry-list' for hiding some parts of the menu. - -The menu has the following sections: - -A. Interface: - - 0. You can use a buffer interface instead of menus. It looks like the - customization buffer. Basically, it has the same options found in the - menu and some extra options, all this on a buffer. - -I. PostScript printing: - - 1. You can generate a PostScript file (if you type \\[universal-argument] before activating - menu) or PostScript temporary file for a directory, a buffer, a region - or a major mode, choosing 1-up, 2-up, 4-up or any other n-up printing; - after file generation, ghostview is activated using the file generated - as argument. This option is disabled if spooling is on (option 16). - Also, if you already have a PostScript file you can preview it. - Instead of previewing each buffer, region or major mode at once, you - can save temporarily the PostScript code generated in a buffer and - preview it later. The option `Despool...' despools the PostScript - spooling buffer in a temporary file and uses ghostview to preview it. - If you type C-u before choosing this option, the PostScript code - generated is saved in a file instead of saving in a temporary file. To - spool the PostScript code generated you need to turn on the option 16. - The option `Despool...' is enabled if spooling is on (option 16). - - NOTE 1: It's possible to customize a major mode printing, just declare - the customization in `pr-mode-alist' and invoke some of - `*-mode*' commands or select Mode option in Printing menu. An - example for major mode usage is when you're using gnus (or mh, - or rmail, etc.) and you're in the *Summary* buffer, if you - forget to switch to the *Article* buffer before printing, - you'll get a nicely formatted list of article subjects shows - up at the printer. With major mode printing you don't need to - switch from gnus *Summary* buffer first. - - NOTE 2: There are the following options for PostScript file processing: - Ia. Print the file *No Preprocessing*, that is, send it - directly to PostScript printer. - Ib. PostScript utility processing selection. - See `pr-ps-utility-alist' and `pr-setting-database' for - documentation. - Ic. Do n-up processing before printing. - Id. Toggle on/off landscape for PostScript file processing. - Ie. Toggle on/off duplex for PostScript file processing. - If. Toggle on/off tumble for PostScript file processing. - - NOTE 3: Don't forget to download and install the utilities declared on - `pr-ps-utility-alist'. - - 2. Operate the same way as option 1, but it sends directly the PostScript - code (or put in a file, if you've typed \\[universal-argument]) or it uses ghostscript to - print the PostScript file generated. It depends on option 18, if it's - turned on, it uses ghostscript; otherwise, it sends directly to - printer. If spooling is on (option 16), the PostScript code is saved - temporarily in a buffer instead of printing it or saving it in a file. - Also, if you already have a PostScript file you can print it. - Instead of printing each buffer, region or major mode at once, you can - save temporarily the PostScript code generated in a buffer and print it - later. The option `Despool...' despools the PostScript spooling buffer - directly on a printer. If you type \\[universal-argument] before choosing this option, - the PostScript code generated is saved in a file instead of sending it to - the printer. To spool the PostScript code generated you need to turn on - option 16. This option is enabled if spooling is on (option 16). - See also the NOTE 1, NOTE 2 and NOTE 3 on option 1. - - 3. You can select a new PostScript printer to send PostScript code - generated. For selection it's used all PostScript printers defined - in `pr-ps-printer-alist' variable (see it for documentation). - See also `pr-setting-database'. - -II. Text printing: - - 4. If you have control characters (character code from \\000 to \\037) in a - buffer and you want to print them in a text printer, select this - option. All control characters in your buffer or region will be - replaced by a printable representation. The printable representations - use ^ (for ASCII control characters) or hex. The characters tab, - linefeed, space, return and formfeed are not affected. - You don't need to select this option if you use any option of section - I, the PostScript engine treats control characters properly. - - 5. If you want to print a directory, buffer, region or major mode in a - text printer, select this option. See also the NOTE 1 on option 1. - - 6. You can select a new text printer to send text generated. For - selection it's used all text printers defined in `pr-txt-printer-alist' - variable (see it for documentation). - See also `pr-setting-database'. - -III. PostScript page toggle options: - - 7. If you want a PostScript landscape printing, turn on this option. - - 8. If you want to have a header in each page in your PostScript code, - turn on this option. - - 9. If you want to draw a gaudy frame around the header, turn on this - option. This option is enabled if print header is on (option 8). - - 10. If you want that the line number is printed in your PostScript code, - turn on this option. - - 11. If you want background zebra stripes in your PostScript code, turn on - this option. - - 12. If you want a duplex printing and your PostScript printer has this - feature, turn on this option. - - 13. If you turned on duplex printing, you can choose if you want to have a - printing suitable for binding on the left or right (tumble off), or to - have a printing suitable for binding at top or bottom (tumble on). - This option is enabled if duplex is on (option 12). - - 14. If you want a PostScript upside-down printing, turn on this option. - - 15. With this option, you can choose if you want to print all pages, odd - pages, even pages, odd sheets or even sheets. - See also `ps-even-or-odd-pages'. - -IV. PostScript processing toggle options: - - 16. If you want to spool the PostScript code generated, turn on this - option. To spool the PostScript code generated use option 2. You can - despool later by choosing option 1 or 2, sub-option `Despool...'. - - 17. If you use colors in your buffers and want to see these colors on your - PostScript code generated, turn on this option. If you have a - black/white PostScript printer, these colors are displayed in gray - scale by PostScript printer interpreter. - - 18. If you don't have a PostScript printer to send PostScript files, turn - on this option. When this option is on, the ghostscript is used to - print PostScript files. In GNU or Unix system, if ghostscript is set - as a PostScript filter, you don't need to turn on this option. - -V. Printing customization: - - 19. If you want that region is automagically detected, turn on this - option. Note that this will only work if you're using transient mark - mode. When this option is on, the `*-buffer*' commands will behave - like `*-region*' commands, that is, `*-buffer*' commands will print - only the region marked instead of all buffer. - - 20. Turn this option on if you want that when current major-mode is - declared in `pr-mode-alist', the `*-buffer*' and `*-region*' commands - behave like `*-mode*' commands. - - 21. If you want that Printing menu stays open while you are setting - toggle options, turn on this option. The variables - `pr-menu-char-height' and `pr-menu-char-width' are used to guess the - menu position, so don't forget to adjust these variables if menu - position is not ok. - -VI. Customization: - - 22. Besides all options in section III, IV and V, you can customize much - more PostScript options in `ps-print' option. Or you can customize - some `lpr' options for text printing. Or customize `printing' - options. - - 23. Show current settings for `printing', `ps-print' or `lpr'. - - 24. Quick help for printing menu layout. -" - "Printing help message.") - - -(defconst pr-interface-help-message - "\ -The printing interface buffer has the same functionality as the printing menu. -The major difference is that the states (like sending PostScript generated to a -file, n-up printing, etc.) are set and saved between printing buffer -activation. Also, the landscape, duplex and tumble values are the same for -PostScript file and directory/buffer/region/mode processing; using menu, there -are different value sets for PostScript file and directory/buffer/region/mode -processing. - -The printing interface buffer has the following sections: - -1. Print: - - Here you can choose to print/preview a buffer, a directory or a PostScript - file: - - 1a. Buffer: - - * Buffer List: - Select a buffer from the current buffer list. - - * Region: - If it's on, this means that the selected buffer has an active region, - so you can turn on/off, as you wish. - If it's off when a buffer is selected, this means that the selected - buffer has no active region, so it'll not be possible to turn it on. - If you want to process the region, let this option on. - If you want to process the whole buffer, let this option off. - - * Mode: - If it's on, this means that the selected buffer major mode is declared - for major mode processing, so you can turn on/off, as you wish. - If it's off when a buffer is selected, this means that the selected - buffer major mode isn't declared for major mode processing, so it'll - not be possible to turn it on. - If you want the major mode processing, let this option on. - If you don't want the major mode processing, let this option off. - - NOTE 1: It's possible to customize a major mode printing, just declare - the customization in `pr-mode-alist' and invoke some of - `*-mode*' commands or select Mode option in Printing menu. An - example for major mode usage is when you're using gnus (or mh, - or rmail, etc.) and you're in the *Summary* buffer, if you - forget to switch to the *Article* buffer before printing, - you'll get a nicely formatted list of article subjects shows - up at the printer. With major mode printing you don't need to - switch from gnus *Summary* buffer first. - - 1b. Directory: - - * Directory: - Specify a valid directory path. - - * File Regexp: - Specify a file name regexp. All file names in the directory that - match with regexp will be printed/previewed. An empty file name - regexp means to print/preview all files in the directory. - - * List Directory Entry: - If it's turned on, list directory entries besides file entries. - - 1c. PostScript file: - - * PostScript File: - Specify an existent PostScript file to print/preview. - - * PostScript Utility: - Select a PostScript utility. - See `pr-ps-utility-alist' and `pr-setting-database' for documentation. - - NOTE 2: Don't forget to download and install the utilities declared on - `pr-ps-utility-alist'. - - * No Preprocessing: - If it's turned on, don't use the PostScript utility to preprocess the - PostScript file before printing/previewing. - -2. PostScript printer: - - * PostScript Printer: - You can select a new PostScript printer to send PostScript code - generated. For selection it's used all PostScript printers defined - in `pr-ps-printer-alist' variable (see it for documentation). - See also `pr-setting-database'. - - * Despool: - If spooling is on, you can turn it on/off, as you wish. - If spooling is off, it'll not be possible to turn it on. - If it's turned on, specify to despools the PostScript spooling buffer in - a temporary file or in the selected PostScript file when - printing/previewing. - - * Preview: - Preview the PostScript generated. - - * Print: - Print the PostScript generated. - - * Quit: - Quit from printing interface buffer. - - * Send to Printer/Temporary File: - If it's turned on, the PostScript generated is sent directly to - PostScript printer or, for previewing, to a temporary file. - - * Send to File: - Specify a file name to send the PostScript generated. - - * N-Up: - Specify n-up printing. - -3. Text printer: - - * Text Printer: - Select a new text printer to send text generated. For selection it's used - all text printers defined in `pr-txt-printer-alist' variable (see it for - documentation). See also `pr-setting-database'. - - * Printify: - If you have control characters (character code from \\000 to \\037) in a - buffer and you want to print them in a text printer, select this - option. All control characters in your buffer or region will be - replaced by a printable representation. The printable representations - use ^ (for ASCII control characters) or hex. The characters tab, - linefeed, space, return and formfeed are not affected. - You don't need to select this option if you use any option of section - I, the PostScript engine treats control characters properly. - - * Print: - To print a directory, buffer, region or major mode in a - text printer, select this option. See also the NOTE 1 on section 1. - - * Quit: - Quit from printing interface buffer. - -4. Settings: - - There are 3 setting columns: - - 4a. First column (left column): - - * Landscape: - PostScript landscape printing. - - * Print Header: - To have a header in each page in your PostScript code. - - * Print Header Frame: - To draw a gaudy frame around the header. - - * Line Number: - The line number is printed in your PostScript code. - - * Zebra Stripes: - Background zebra stripes in your PostScript code. - - * Duplex: - Duplex printing (if your PostScript printer has this feature). - - * Tumble: - If duplex printing is on, you can choose if you want to have a - printing suitable for binding on the left or right (tumble off), or to - have a printing suitable for binding at top or bottom (tumble on). - - * Upside-Down: - PostScript upside-down printing. - - 4b. Second column (middle column): - - * Auto Region: - If you want that region is automagically detected, turn on this - option. Note that this will only work if you're using transient mark - mode. When this option is on, the `*-buffer*' commands will behave - like `*-region*' commands, that is, `*-buffer*' commands will print - only the region marked instead of all buffer. - - * Auto Mode: - Turn this option on if you want that when current major-mode is - declared in `pr-mode-alist', the `*-buffer*' and `*-region*' commands - behave like `*-mode*' commands. - - * Menu Lock: - If you want that Printing menu stays open while you are setting - toggle options, turn on this option. The variables - `pr-menu-char-height' and `pr-menu-char-width' are used to guess the - menu position, so don't forget to adjust these variables if menu - position is not ok. - - * Spool Buffer: - To spool the PostScript code generated. You can despool later by - setting Despool option on PostScript printer section. - - * Print with faces: - If you use colors in your buffers and want to see these colors on your - PostScript code generated, turn on this option. If you have a - black/white PostScript printer, these colors are displayed in gray - scale by PostScript printer interpreter. - - * Print via Ghostscript: - If you don't have a PostScript printer to send PostScript files, turn - on this option. When this option is on, the ghostscript is used to - print PostScript files. In GNU or Unix system, if ghostscript is set - as a PostScript filter, you don't need to turn on this option. - - * Parity Page Menu: - To print all pages, odd pages, even pages, odd sheets or even sheets. - See also `ps-even-or-odd-pages'. - - 4c. Third column (right column): - - * Verbose: - That is, to be verbose when editing a field in interface buffer. - -5. Customize: - - Besides all options in section 4, you can customize much more PostScript - options in `ps-print' option. Or you can customize some `lpr' options for - text printing. Or customize `printing' options. - -6. Show settings: - - Show current settings for `printing', `ps-print' or `lpr'. - -7. Help: - - Quick help for printing interface buffer and printing menu layout. You can - also quit the printing interface buffer or kill all printing help buffer. -" - "Printing buffer interface help message.") - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Commands - - -;;;###autoload -(defun pr-interface (&optional buffer) - "Activate the printing interface buffer. - -If BUFFER is nil, the current buffer is used for printing. - -For more information, type \\[pr-interface-help]." - (interactive) - (with-current-buffer (or buffer (current-buffer)) - (pr-create-interface))) - - -;;;###autoload -(defun pr-ps-directory-preview (n-up dir file-regexp &optional filename) - "Preview directory using ghostview. - -Interactively, the command prompts for N-UP printing number, a directory, a -file name regexp for matching and, when you use a prefix argument (\\[universal-argument]), the -command prompts the user for a file name, and saves the PostScript image in -that file instead of saving it in a temporary file. - -Noninteractively, if N-UP is nil, prompts for N-UP printing number. If DIR is -nil, prompts for DIRectory. If FILE-REGEXP is nil, prompts for -FILE(name)-REGEXP. The argument FILENAME is treated as follows: if it's nil, -save the image in a temporary file. If FILENAME is a string, save the -PostScript image in a file with that name. If FILENAME is t, prompts for a -file name. - -See also documentation for `pr-list-directory'." - (interactive (pr-interactive-ps-dir-args (pr-prompt "PS preview dir"))) - (defvar pr--n-up) (defvar pr--dir) (defvar pr--file-regexp) - (defvar pr--filename) - (let ((pr--n-up n-up) (pr--dir dir) (pr--file-regexp file-regexp) - (pr--filename filename)) - (pr-set-ps-dir-args 'pr--n-up 'pr--dir 'pr--file-regexp 'pr--filename - (pr-prompt "PS preview dir")) - (setq pr--filename (pr-ps-file pr--filename)) - (pr-ps-file-list pr--n-up pr--dir pr--file-regexp pr--filename) - (or pr-spool-p - (pr-ps-file-preview pr--filename)))) - -;;;###autoload -(defun pr-ps-directory-using-ghostscript (n-up dir file-regexp &optional filename) - "Print directory using PostScript through ghostscript. - -Interactively, the command prompts for N-UP printing number, a directory, a -file name regexp for matching and, when you use a prefix argument (\\[universal-argument]), the -command prompts the user for a file name, and saves the PostScript image in -that file instead of saving it in a temporary file. - -Noninteractively, if N-UP is nil, prompts for N-UP printing number. If DIR is -nil, prompts for DIRectory. If FILE-REGEXP is nil, prompts for -FILE(name)-REGEXP. The argument FILENAME is treated as follows: if it's nil, -save the image in a temporary file. If FILENAME is a string, save the -PostScript image in a file with that name. If FILENAME is t, prompts for a -file name. - -See also documentation for `pr-list-directory'." - (interactive (pr-interactive-ps-dir-args (pr-prompt "PS print dir GS"))) - (defvar pr--n-up) (defvar pr--dir) (defvar pr--file-regexp) - (defvar pr--filename) - (let ((pr--n-up n-up) (pr--dir dir) (pr--file-regexp file-regexp) - (pr--filename filename)) - (pr-set-ps-dir-args 'pr--n-up 'pr--dir 'pr--file-regexp 'pr--filename - (pr-prompt "PS print dir GS")) - (let ((file (pr-ps-file pr--filename))) - (pr-ps-file-list pr--n-up pr--dir pr--file-regexp file) - (pr-ps-file-using-ghostscript file) - (or pr--filename (pr-delete-file file))))) - - -;;;###autoload -(defun pr-ps-directory-print (n-up dir file-regexp &optional filename) - "Print directory using PostScript printer. - -Interactively, the command prompts for N-UP printing number, a directory, a -file name regexp for matching and, when you use a prefix argument (\\[universal-argument]), the -command prompts the user for a file name, and saves the PostScript image in -that file instead of saving it in a temporary file. - -Noninteractively, if N-UP is nil, prompts for N-UP printing number. If DIR is -nil, prompts for DIRectory. If FILE-REGEXP is nil, prompts for -FILE(name)-REGEXP. The argument FILENAME is treated as follows: if it's nil, -save the image in a temporary file. If FILENAME is a string, save the -PostScript image in a file with that name. If FILENAME is t, prompts for a -file name. - -See also documentation for `pr-list-directory'." - (interactive (pr-interactive-ps-dir-args (pr-prompt "PS print dir"))) - (defvar pr--n-up) (defvar pr--dir) (defvar pr--file-regexp) - (defvar pr--filename) - (let ((pr--n-up n-up) (pr--dir dir) (pr--file-regexp file-regexp) - (pr--filename filename)) - (pr-set-ps-dir-args 'pr--n-up 'pr--dir 'pr--file-regexp 'pr--filename - (pr-prompt "PS print dir")) - (let ((file (pr-ps-file pr--filename))) - (pr-ps-file-list pr--n-up pr--dir pr--file-regexp file) - (pr-ps-file-print file) - (or pr--filename (pr-delete-file file))))) - - -;;;###autoload -(defun pr-ps-directory-ps-print (n-up dir file-regexp &optional filename) - "Print directory using PostScript printer or through ghostscript. - -It depends on `pr-print-using-ghostscript'. - -Interactively, the command prompts for N-UP printing number, a directory, a -file name regexp for matching and, when you use a prefix argument (\\[universal-argument]), the -command prompts the user for a file name, and saves the PostScript image in -that file instead of saving it in a temporary file. - -Noninteractively, if N-UP is nil, prompts for N-UP printing number. If DIR is -nil, prompts for DIRectory. If FILE-REGEXP is nil, prompts for -FILE(name)-REGEXP. The argument FILENAME is treated as follows: if it's nil, -save the image in a temporary file. If FILENAME is a string, save the -PostScript image in a file with that name. If FILENAME is t, prompts for a -file name. - -See also documentation for `pr-list-directory'." - (interactive (pr-interactive-ps-dir-args - (pr-prompt (pr-prompt-gs "PS print dir")))) - (defvar pr--n-up) (defvar pr--dir) (defvar pr--file-regexp) - (defvar pr--filename) - (let ((pr--n-up n-up) (pr--dir dir) (pr--file-regexp file-regexp) - (pr--filename filename)) - (pr-set-ps-dir-args 'pr--n-up 'pr--dir 'pr--file-regexp 'pr--filename - (pr-prompt (pr-prompt-gs "PS print dir"))) - (funcall (if (pr-using-ghostscript-p) - #'pr-ps-directory-using-ghostscript - #'pr-ps-directory-print) - pr--n-up pr--dir pr--file-regexp pr--filename))) - - -;;;###autoload -(defun pr-ps-buffer-preview (n-up &optional filename) - "Preview buffer using ghostview. - -Interactively, the command prompts for N-UP printing number and, when you use a -prefix argument (\\[universal-argument]), the command prompts the user for a file name, and saves -the PostScript image in that file instead of saving it in a temporary file. - -Noninteractively, if N-UP is nil, prompts for N-UP printing number. The -argument FILENAME is treated as follows: if it's nil, save the image in a -temporary file. If FILENAME is a string, save the PostScript image in a file -with that name. If FILENAME is t, prompts for a file name." - (interactive (pr-interactive-n-up-file (pr-prompt "PS preview"))) - (if (pr-auto-mode-p) - (pr-ps-mode-preview n-up filename) - (pr-ps-preview (pr-region-active-symbol) n-up filename - (pr-region-active-string "PS preview")))) - - -;;;###autoload -(defun pr-ps-buffer-using-ghostscript (n-up &optional filename) - "Print buffer using PostScript through ghostscript. - -Interactively, the command prompts for N-UP printing number and, when you use a -prefix argument (\\[universal-argument]), the command prompts the user for a file name, and saves -the PostScript image in that file instead of sending it to the printer. - -Noninteractively, if N-UP is nil, prompts for N-UP printing number. The -argument FILENAME is treated as follows: if it's nil, send the image to the -printer. If FILENAME is a string, save the PostScript image in a file with -that name. If FILENAME is t, prompts for a file name." - (interactive (pr-interactive-n-up-file (pr-prompt "PS print GS"))) - (if (pr-auto-mode-p) - (pr-ps-mode-using-ghostscript n-up filename) - (pr-ps-using-ghostscript (pr-region-active-symbol) n-up filename - (pr-region-active-string "PS print GS")))) - - -;;;###autoload -(defun pr-ps-buffer-print (n-up &optional filename) - "Print buffer using PostScript printer. - -Interactively, the command prompts for N-UP printing number and, when you use a -prefix argument (\\[universal-argument]), the command prompts the user for a file name, and saves -the PostScript image in that file instead of sending it to the printer. - -Noninteractively, if N-UP is nil, prompts for N-UP printing number. The -argument FILENAME is treated as follows: if it's nil, send the image to the -printer. If FILENAME is a string, save the PostScript image in a file with -that name. If FILENAME is t, prompts for a file name." - (interactive (pr-interactive-n-up-file (pr-prompt "PS print"))) - (if (pr-auto-mode-p) - (pr-ps-mode-print n-up filename) - (pr-ps-print (pr-region-active-symbol) n-up filename - (pr-region-active-string "PS print")))) - - -;;;###autoload -(defun pr-ps-buffer-ps-print (n-up &optional filename) - "Print buffer using PostScript printer or through ghostscript. - -It depends on `pr-print-using-ghostscript'. - -Interactively, the command prompts for N-UP printing number and, when you use a -prefix argument (\\[universal-argument]), the command prompts the user for a file name, and saves -the PostScript image in that file instead of sending it to the printer. - -Noninteractively, if N-UP is nil, prompts for N-UP printing number. The -argument FILENAME is treated as follows: if it's nil, send the image to the -printer. If FILENAME is a string, save the PostScript image in a file with -that name. If FILENAME is t, prompts for a file name." - (interactive (pr-interactive-n-up-file - (pr-prompt (pr-prompt-gs "PS print")))) - (cond ((pr-auto-mode-p) - (pr-ps-mode-ps-print n-up filename)) - ((pr-using-ghostscript-p) - (pr-ps-using-ghostscript (pr-region-active-symbol) n-up filename - (pr-region-active-string "PS print GS"))) - (t - (pr-ps-print (pr-region-active-symbol) n-up filename - (pr-region-active-string "PS print"))))) - - -;;;###autoload -(defun pr-ps-region-preview (n-up &optional filename) - "Preview region using ghostview. - -See also `pr-ps-buffer-preview'." - (interactive (pr-interactive-n-up-file (pr-prompt-region "PS preview"))) - (if (pr-auto-mode-p) - (let ((pr-auto-region t)) - (pr-ps-mode-preview n-up filename)) - (pr-ps-preview 'region n-up filename "PS preview region"))) - - -;;;###autoload -(defun pr-ps-region-using-ghostscript (n-up &optional filename) - "Print region using PostScript through ghostscript. - -See also `pr-ps-buffer-using-ghostscript'." - (interactive (pr-interactive-n-up-file (pr-prompt-region "PS print GS"))) - (if (pr-auto-mode-p) - (let ((pr-auto-region t)) - (pr-ps-mode-using-ghostscript n-up filename)) - (pr-ps-using-ghostscript 'region n-up filename "PS print GS region"))) - - -;;;###autoload -(defun pr-ps-region-print (n-up &optional filename) - "Print region using PostScript printer. - -See also `pr-ps-buffer-print'." - (interactive (pr-interactive-n-up-file (pr-prompt-region "PS print"))) - (if (pr-auto-mode-p) - (let ((pr-auto-region t)) - (pr-ps-mode-print n-up filename)) - (pr-ps-print 'region n-up filename "PS print region"))) - - -;;;###autoload -(defun pr-ps-region-ps-print (n-up &optional filename) - "Print region using PostScript printer or through ghostscript. - -See also `pr-ps-buffer-ps-print'." - (interactive (pr-interactive-n-up-file - (pr-prompt-region (pr-prompt-gs "PS print")))) - (cond ((pr-auto-mode-p) - (let ((pr-auto-region t)) - (pr-ps-mode-ps-print n-up filename))) - ((pr-using-ghostscript-p) - (pr-ps-using-ghostscript 'region n-up filename "PS print GS region")) - (t - (pr-ps-print 'region n-up filename "PS print region")))) - - -;;;###autoload -(defun pr-ps-mode-preview (n-up &optional filename) - "Preview major mode using ghostview. - -See also `pr-ps-buffer-preview'." - (interactive (pr-interactive-n-up-file "PS preview mode")) - (defvar pr--n-up) (defvar pr--filename) - (let ((pr--n-up n-up) (pr--filename filename)) - (pr-set-n-up-and-filename 'pr--n-up 'pr--filename "PS preview mode") - (let ((file (pr-ps-file pr--filename))) - (and (pr-ps-mode pr--n-up file) - (not pr-spool-p) - (pr-ps-file-preview file))))) - - -;;;###autoload -(defun pr-ps-mode-using-ghostscript (n-up &optional filename) - "Print major mode using PostScript through ghostscript. - -See also `pr-ps-buffer-using-ghostscript'." - (interactive (pr-interactive-n-up-file "PS print GS mode")) - (defvar pr--n-up) (defvar pr--filename) - (let ((pr--n-up n-up) (pr--filename filename)) - (pr-set-n-up-and-filename 'pr--n-up 'pr--filename "PS print GS mode") - (let ((file (pr-ps-file pr--filename))) - (when (and (pr-ps-mode pr--n-up file) - (not pr-spool-p)) - (pr-ps-file-using-ghostscript file) - (or pr--filename (pr-delete-file file)))))) - - -;;;###autoload -(defun pr-ps-mode-print (n-up &optional filename) - "Print major mode using PostScript printer. - -See also `pr-ps-buffer-print'." - (interactive (pr-interactive-n-up-file "PS print mode")) - (defvar pr--n-up) (defvar pr--filename) - (let ((pr--n-up n-up) (pr--filename filename)) - (pr-set-n-up-and-filename 'pr--n-up 'pr--filename "PS print mode") - (pr-ps-mode pr--n-up pr--filename))) - - -;;;###autoload -(defun pr-ps-mode-ps-print (n-up &optional filename) - "Print major mode using PostScript or through ghostscript. - -See also `pr-ps-buffer-ps-print'." - (interactive (pr-interactive-n-up-file (pr-prompt-gs "PS print mode"))) - (if (pr-using-ghostscript-p) - (pr-ps-mode-using-ghostscript n-up filename) - (pr-ps-mode-print n-up filename))) - - -;;;###autoload -(defun pr-printify-directory (&optional dir file-regexp) - "Replace nonprinting characters in directory with printable representations. -The printable representations use ^ (for ASCII control characters) or hex. -The characters tab, linefeed, space, return and formfeed are not affected. - -Interactively, the command prompts for a directory and a file name regexp for -matching. - -Noninteractively, if DIR is nil, prompts for DIRectory. If FILE-REGEXP is nil, -prompts for FILE(name)-REGEXP. - -See also documentation for `pr-list-directory'." - (interactive (pr-interactive-dir-args "Printify dir")) - (defvar pr--dir) (defvar pr--file-regexp) - (let ((pr--dir dir) (pr--file-regexp file-regexp)) - (pr-set-dir-args 'pr--dir 'pr--file-regexp "Printify dir") - (pr-file-list pr--dir pr--file-regexp 'pr-printify-buffer))) - - -;;;###autoload -(defun pr-printify-buffer () - "Replace nonprinting characters in buffer with printable representations. -The printable representations use ^ (for ASCII control characters) or hex. -The characters tab, linefeed, space, return and formfeed are not affected." - (interactive "*") - (if (pr-region-active-p) - (pr-printify-region) - (printify-region (point-min) (point-max)))) - - -;;;###autoload -(defun pr-printify-region () - "Replace nonprinting characters in region with printable representations. -The printable representations use ^ (for ASCII control characters) or hex. -The characters tab, linefeed, space, return and formfeed are not affected." - (interactive "*") - (printify-region (point) (mark))) - - -;;;###autoload -(defun pr-txt-directory (&optional dir file-regexp) - "Print directory using text printer. - -Interactively, the command prompts for a directory and a file name regexp for -matching. - -Noninteractively, if DIR is nil, prompts for DIRectory. If FILE-REGEXP is nil, -prompts for FILE(name)-REGEXP. - -See also documentation for `pr-list-directory'." - (interactive (pr-interactive-dir-args "Print dir")) - (defvar pr--dir) (defvar pr--file-regexp) - (let ((pr--dir dir) (pr--file-regexp file-regexp)) - (pr-set-dir-args 'pr--dir 'pr--file-regexp "Print dir") - (pr-file-list pr--dir pr--file-regexp 'pr-txt-buffer))) - - -;;;###autoload -(defun pr-txt-buffer () - "Print buffer using text printer." - (interactive) - (cond ((pr-auto-mode-p) - (pr-txt-mode)) - ((pr-region-active-p) - (pr-txt-region)) - (t - (pr-txt-print (point-min) (point-max))))) - - -;;;###autoload -(defun pr-txt-region () - "Print region using text printer." - (interactive) - (if (pr-auto-mode-p) - (let ((pr-auto-region t)) - (pr-txt-mode)) - (pr-txt-print (point) (mark)))) - - -;;;###autoload -(defun pr-txt-mode () - "Print major mode using text printer." - (interactive) - (let ((args (pr-mode-alist-p))) - (if args - (funcall (car args) (nthcdr 2 args)) - (ding) - (message "`%s' major mode not declared." major-mode)))) - - -;;;###autoload -(defun pr-despool-preview (&optional filename) - "Preview spooled PostScript. - -Interactively, when you use a prefix argument (\\[universal-argument]), the command prompts the -user for a file name, and saves the spooled PostScript image in that file -instead of saving it in a temporary file. - -Noninteractively, the argument FILENAME is treated as follows: if it is nil, -save the image in a temporary file. If FILENAME is a string, save the -PostScript image in a file with that name." - (interactive (list (ps-print-preprint current-prefix-arg))) - (let ((file (pr-ps-file filename))) - (when (stringp file) - (pr-despool-print file) - (pr-ps-file-preview file)))) - - -;;;###autoload -(defun pr-despool-using-ghostscript (&optional filename) - "Print spooled PostScript using ghostscript. - -Interactively, when you use a prefix argument (\\[universal-argument]), the command prompts the -user for a file name, and saves the spooled PostScript image in that file -instead of sending it to the printer. - -Noninteractively, the argument FILENAME is treated as follows: if it is nil, -send the image to the printer. If FILENAME is a string, save the PostScript -image in a file with that name." - (interactive (list (ps-print-preprint current-prefix-arg))) - (let ((file (pr-ps-file filename))) - (when (stringp file) - (pr-despool-print file) - (pr-ps-file-using-ghostscript file) - (or filename (pr-delete-file file))))) - - -;;;###autoload -(defun pr-despool-print (&optional filename) - "Send the spooled PostScript to the printer. - -Interactively, when you use a prefix argument (\\[universal-argument]), the command prompts the -user for a file name, and saves the spooled PostScript image in that file -instead of sending it to the printer. - -Noninteractively, the argument FILENAME is treated as follows: if it is nil, -send the image to the printer. If FILENAME is a string, save the PostScript -image in a file with that name." - (interactive (list (ps-print-preprint current-prefix-arg))) - (with-file-modes pr-file-modes - (let ((ps-lpr-command (pr-command pr-ps-command)) - (ps-lpr-switches pr-ps-switches) - (ps-printer-name-option pr-ps-printer-switch) - (ps-printer-name pr-ps-printer)) - (ps-despool filename)))) - - -;;;###autoload -(defun pr-despool-ps-print (&optional filename) - "Send the spooled PostScript to the printer or use ghostscript to print it. - -Interactively, when you use a prefix argument (\\[universal-argument]), the command prompts the -user for a file name, and saves the spooled PostScript image in that file -instead of sending it to the printer. - -Noninteractively, the argument FILENAME is treated as follows: if it is nil, -send the image to the printer. If FILENAME is a string, save the PostScript -image in a file with that name." - (interactive (list (ps-print-preprint current-prefix-arg))) - (if pr-print-using-ghostscript - (pr-despool-using-ghostscript filename) - (pr-despool-print filename))) - - -;;;###autoload -(defun pr-ps-file-preview (filename) - "Preview PostScript file FILENAME." - (interactive (list (pr-ps-infile-preprint "Preview "))) - (and (stringp filename) (file-exists-p filename) - (pr-call-process pr-gv-command filename))) - - -;;;###autoload -(defun pr-ps-file-up-preview (n-up ifilename &optional ofilename) - "Preview PostScript file FILENAME." - (interactive (pr-interactive-n-up-inout "PS preview")) - (defvar pr--n-up) (defvar pr--ifilename) (defvar pr--ofilename) - (let ((pr--n-up n-up) (pr--ifilename ifilename) (pr--ofilename ofilename)) - (let ((outfile (pr-ps-utility-args 'pr--n-up 'pr--ifilename 'pr--ofilename - "PS preview "))) - (pr-ps-utility-process pr--n-up pr--ifilename outfile) - (pr-ps-file-preview outfile)))) - - -;;;###autoload -(defun pr-ps-file-using-ghostscript (filename) - "Print PostScript file FILENAME using ghostscript." - (interactive (list (pr-ps-infile-preprint "Print preview "))) - (and (stringp filename) (file-exists-p filename) - (let* ((file (expand-file-name filename)) - (tempfile (make-temp-file file))) - ;; gs use - (pr-call-process pr-gs-command - (format "-sDEVICE=%s" pr-gs-device) - (format "-r%d" pr-gs-resolution) - (pr-switches-string pr-gs-switches "pr-gs-switches") - (format "-sOutputFile=\"%s\"" - ;; FIXME: Do we need to dosify here really? - (pr-dosify-file-name tempfile)) - ;; FIXME: Do we need to dosify here really? - (pr-dosify-file-name file) - "-c quit") - ;; printing - (pr-ps-file-print tempfile) - ;; deleting - (pr-delete-file tempfile)))) - - -;;;###autoload -(defun pr-ps-file-print (filename) - "Print PostScript file FILENAME." - (interactive (list (pr-ps-infile-preprint "Print "))) - (and (stringp filename) (file-exists-p filename) - ;; printing - (let ((file (expand-file-name filename))) - (if (string= pr-ps-command "") - ;; default action - (let ((ps-spool-buffer (get-buffer-create ps-spool-buffer-name))) - (with-current-buffer ps-spool-buffer - (erase-buffer) - (insert-file-contents-literally file)) - (pr-despool-print)) - ;; use `pr-ps-command' to print - (apply #'pr-call-process - pr-ps-command - (pr-switches-string pr-ps-switches "pr-ps-switches") - (if (string-match "cp" pr-ps-command) - ;; for "cp" (cmd in out) - (list (pr-dosify-file-name file) - (concat pr-ps-printer-switch pr-ps-printer)) - ;; else, for others (cmd out in) - (list (concat pr-ps-printer-switch pr-ps-printer) - (pr-dosify-file-name file)))))))) - - -;;;###autoload -(defun pr-ps-file-ps-print (filename) - "Send PostScript file FILENAME to printer or use ghostscript to print it." - (interactive (list (pr-ps-infile-preprint - (if pr-print-using-ghostscript - "Print preview " - "Print ")))) - (if pr-print-using-ghostscript - (pr-ps-file-using-ghostscript filename) - (pr-ps-file-print filename))) - - -;;;###autoload -(defun pr-ps-file-up-ps-print (n-up ifilename &optional ofilename) - "Process a PostScript file IFILENAME and send it to printer. - -Interactively, the command prompts for N-UP printing number, for an input -PostScript file IFILENAME and, when you use a prefix argument (\\[universal-argument]), the -command prompts the user for an output PostScript file name OFILENAME, and -saves the PostScript image in that file instead of sending it to the printer. - -Noninteractively, if N-UP is nil, prompts for N-UP printing number. The -argument IFILENAME is treated as follows: if it's t, prompts for an input -PostScript file name; otherwise, it *must* be a string that it's an input -PostScript file name. The argument OFILENAME is treated as follows: if it's -nil, send the image to the printer. If OFILENAME is a string, save the -PostScript image in a file with that name. If OFILENAME is t, prompts for a -file name." - (interactive (pr-interactive-n-up-inout - (if pr-print-using-ghostscript - "PS print GS" - "PS print"))) - (defvar pr--n-up) (defvar pr--ifilename) (defvar pr--ofilename) - (let ((pr--n-up n-up) (pr--ifilename ifilename) (pr--ofilename ofilename)) - (let ((outfile (pr-ps-utility-args 'pr--n-up 'pr--ifilename 'pr--ofilename - (if pr-print-using-ghostscript - "PS print GS " - "PS print ")))) - (pr-ps-utility-process pr--n-up pr--ifilename outfile) - (unless pr--ofilename - (pr-ps-file-ps-print outfile) - (pr-delete-file outfile))))) - - -;;;###autoload -(defun pr-toggle-file-duplex () - "Toggle duplex for PostScript file." - (interactive) - (pr-toggle-file-duplex-menu t)) - - -;;;###autoload -(defun pr-toggle-file-tumble () - "Toggle tumble for PostScript file. - -If tumble is off, produces a printing suitable for binding on the left or -right. -If tumble is on, produces a printing suitable for binding at the top or -bottom." - (interactive) - (pr-toggle-file-tumble-menu t)) - - -;;;###autoload -(defun pr-toggle-file-landscape () - "Toggle landscape for PostScript file." - (interactive) - (pr-toggle-file-landscape-menu t)) - - -;;;###autoload -(defun pr-toggle-ghostscript () - "Toggle printing using ghostscript." - (interactive) - (pr-toggle-ghostscript-menu t)) - - -;;;###autoload -(defun pr-toggle-faces () - "Toggle printing with faces." - (interactive) - (pr-toggle-faces-menu t)) - - -;;;###autoload -(defun pr-toggle-spool () - "Toggle spooling." - (interactive) - (pr-toggle-spool-menu t)) - - -;;;###autoload -(defun pr-toggle-duplex () - "Toggle duplex." - (interactive) - (pr-toggle-duplex-menu t)) - - -;;;###autoload -(defun pr-toggle-tumble () - "Toggle tumble. - -If tumble is off, produces a printing suitable for binding on the left or -right. -If tumble is on, produces a printing suitable for binding at the top or -bottom." - (interactive) - (pr-toggle-tumble-menu t)) - - -;;;###autoload -(defun pr-toggle-landscape () - "Toggle landscape." - (interactive) - (pr-toggle-landscape-menu t)) - - -;;;###autoload -(defun pr-toggle-upside-down () - "Toggle upside-down." - (interactive) - (pr-toggle-upside-down-menu t)) - - -;;;###autoload -(defun pr-toggle-line () - "Toggle line number." - (interactive) - (pr-toggle-line-menu t)) - - -;;;###autoload -(defun pr-toggle-zebra () - "Toggle zebra stripes." - (interactive) - (pr-toggle-zebra-menu t)) - - -;;;###autoload -(defun pr-toggle-header () - "Toggle printing header." - (interactive) - (pr-toggle-header-menu t)) - - -;;;###autoload -(defun pr-toggle-header-frame () - "Toggle printing header frame." - (interactive) - (pr-toggle-header-frame-menu t)) - - -;;;###autoload -(defun pr-toggle-lock () - "Toggle menu lock." - (interactive) - (pr-toggle-lock-menu t)) - - -;;;###autoload -(defun pr-toggle-region () - "Toggle whether the region is automagically detected." - (interactive) - (pr-toggle-region-menu t)) - - -;;;###autoload -(defun pr-toggle-mode () - "Toggle auto mode." - (interactive) - (pr-toggle-mode-menu t)) - - -;;;###autoload -(defun pr-customize (&rest _ignore) - "Customization of the `printing' group." - (interactive) - (customize-group 'printing)) - - -;;;###autoload -(defun lpr-customize (&rest _ignore) - "Customization of the `lpr' group." - (interactive) - (customize-group 'lpr)) - - -;;;###autoload -(defun pr-help (&rest _ignore) - "Help for the printing package." - (interactive) - (pr-show-setup (substitute-command-keys pr-help-message) - "*Printing Help*")) - - -;;;###autoload -(defun pr-ps-name () - "Interactively select a PostScript printer." - (interactive) - (pr-menu-set-ps-title - (pr-complete-alist "PostScript printer" - pr-ps-printer-alist pr-ps-name))) - - -;;;###autoload -(defun pr-txt-name () - "Interactively select a text printer." - (interactive) - (pr-menu-set-txt-title - (pr-complete-alist "Text printer" - pr-txt-printer-alist pr-txt-name))) - - -;;;###autoload -(defun pr-ps-utility () - "Interactively select a PostScript utility." - (interactive) - (pr-menu-set-utility-title - (pr-complete-alist "PostScript utility" - pr-ps-utility-alist pr-ps-utility))) - - -;;;###autoload -(defun pr-show-ps-setup (&rest _ignore) - "Show current ps-print settings." - (interactive) - (pr-show-setup (ps-setup) "*PS Setup*")) - - -;;;###autoload -(defun pr-show-pr-setup (&rest _ignore) - "Show current printing settings." - (interactive) - (pr-show-setup (pr-setup) "*PR Setup*")) - - -;;;###autoload -(defun pr-show-lpr-setup (&rest _ignore) - "Show current lpr settings." - (interactive) - (pr-show-setup (lpr-setup) "*LPR Setup*")) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Fast Commands - - -;;;###autoload -(defun pr-ps-fast-fire (n-up &optional select) - "Fast fire function for PostScript printing. - -If a region is active, the region will be printed instead of the whole buffer. -Also if the current major-mode is defined in `pr-mode-alist', the settings in -`pr-mode-alist' will be used, that is, the current buffer or region will be -printed using `pr-ps-mode-ps-print'. - - -Interactively, you have the following situations: - - \\[pr-ps-fast-fire] - The command prompts the user for a N-UP value and printing will - immediately be done using the current active printer. - - \\[universal-argument] \\[pr-ps-fast-fire] - \\[universal-argument] 0 \\[pr-ps-fast-fire] - The command prompts the user for a N-UP value and also for a current - PostScript printer, then printing will immediately be done using the new - current active printer. - - \\[universal-argument] 1 \\[pr-ps-fast-fire] - The command prompts the user for a N-UP value and also for a file name, - and saves the PostScript image in that file instead of sending it to the - printer. - - \\[universal-argument] 2 \\[pr-ps-fast-fire] - The command prompts the user for a N-UP value, then for a current - PostScript printer and, finally, for a file name. Then change the active - printer to that chosen by user and saves the PostScript image in - that file instead of sending it to the printer. - - -Noninteractively, the argument N-UP should be a positive integer greater than -zero and the argument SELECT is treated as follows: - - If it's nil, send the image to the printer. - - If it's a list or an integer lesser or equal to zero, the command prompts - the user for a current PostScript printer, then printing will immediately - be done using the new current active printer. - - If it's an integer equal to 1, the command prompts the user for a file name - and saves the PostScript image in that file instead of sending it to the - printer. - - If it's an integer greater or equal to 2, the command prompts the user for a - current PostScript printer and for a file name. Then change the active - printer to that chosen by user and saves the PostScript image in that file - instead of sending it to the printer. - - If it's a symbol which it's defined in `pr-ps-printer-alist', it's the new - active printer and printing will immediately be done using the new active - printer. - - Otherwise, send the image to the printer. - - -Note that this command always behaves as if `pr-auto-region' and `pr-auto-mode' -are both set to t." - (interactive (list (pr-interactive-n-up (pr-prompt-gs "PS print fast")) - current-prefix-arg)) - (let ((pr-auto-region t) - (pr-auto-mode t) - filename) - (cond ((null select)) - ((listp select) - (pr-ps-name)) - ((and (symbolp select) - (assq select pr-ps-printer-alist)) - (pr-menu-set-ps-title select)) - ((integerp select) - (and (/= select 1) - (pr-ps-name)) - (and (>= select 1) (not pr-spool-p) - (setq filename (pr-ps-outfile-preprint - (if pr-print-using-ghostscript - "Fast GS " - "Fast ")))))) - (pr-ps-buffer-ps-print - (if (integerp n-up) - (min (max n-up 1) 100) - (error "n-up must be an integer greater than zero")) - filename))) - - -;;;###autoload -(defun pr-txt-fast-fire (&optional select-printer) - "Fast fire function for text printing. - -If a region is active, the region will be printed instead of the whole buffer. -Also if the current major-mode is defined in `pr-mode-alist', the settings in -`pr-mode-alist' will be used, that is, the current buffer or region will be -printed using `pr-txt-mode'. - -Interactively, when you use a prefix argument (\\[universal-argument]), the command prompts the -user for a new active text printer. - -Noninteractively, the argument SELECT-PRINTER is treated as follows: - - If it's nil, the printing is sent to the current active text printer. - - If it's a symbol which it's defined in `pr-txt-printer-alist', it's the new - active printer and printing will immediately be done using the new active - printer. - - If it's non-nil, the command prompts the user for a new active text printer. - -Note that this command always behaves as if `pr-auto-region' and `pr-auto-mode' -are both set to t." - (interactive (list current-prefix-arg)) - (cond ((null select-printer)) - ((and (symbolp select-printer) - (assq select-printer pr-txt-printer-alist)) - (pr-menu-set-txt-title select-printer)) - (t - (pr-txt-name))) - (let ((pr-auto-region t) - (pr-auto-mode t)) - (pr-txt-buffer))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Utilities - - -(defun pr-setup () - "Return the current `printing' setup. - -This is *not* an interactive command. -One way to see `printing' setup is to switch to a *Scratch* buffer and type: - - M-: (insert (pr-setup)) RET - -Or choose the menu option Printing/Show Settings/printing." - (let (ps-prefix-quote) - (mapconcat - #'ps-print-quote - (list - ";; internal vars" - (ps-comment-string "emacs-version " emacs-version) - (ps-comment-string "pr-txt-command " pr-txt-command) - (ps-comment-string "pr-txt-switches " - (pr-switches-string pr-txt-switches "pr-txt-switches")) - (ps-comment-string "pr-txt-printer " pr-txt-printer) - (ps-comment-string "pr-ps-command " pr-ps-command) - (ps-comment-string "pr-ps-switches " - (pr-switches-string pr-ps-switches "pr-ps-switches")) - (ps-comment-string "pr-ps-printer-switch" pr-ps-printer-switch) - (ps-comment-string "pr-ps-printer " pr-ps-printer) - (ps-comment-string "pr-cygwin-system " pr-cygwin-system) - (ps-comment-string "lpr-windows-system " lpr-windows-system) - (ps-comment-string "lpr-lp-system " lpr-lp-system) - nil - '(14 . pr-path-style) - '(14 . pr-path-alist) - nil - '(21 . pr-txt-name) - '(21 . pr-txt-printer-alist) - nil - '(20 . pr-ps-name) - '(20 . pr-ps-printer-alist) - nil - '(20 . pr-temp-dir) - '(20 . pr-ps-temp-file) - '(20 . pr-file-modes) - '(20 . pr-delete-temp-file) - '(20 . pr-list-directory) - nil - '(17 . pr-gv-command) - '(17 . pr-gs-command) - '(17 . pr-gs-switches) - '(17 . pr-gs-device) - '(17 . pr-gs-resolution) - nil - '(27 . pr-print-using-ghostscript) - '(27 . pr-faces-p) - '(27 . pr-spool-p) - '(27 . pr-file-landscape) - '(27 . pr-file-duplex) - '(27 . pr-file-tumble) - '(27 . pr-auto-region) - '(27 . pr-auto-mode) - nil - '(20 . pr-ps-utility) - '(20 . pr-ps-utility-alist) - nil - '(14 . pr-mode-alist) - nil - '(20 . pr-menu-lock) - '(20 . pr-menu-char-height) - '(20 . pr-menu-char-width) - nil - '(20 . pr-setting-database) - nil - '(22 . pr-visible-entry-list) - nil - '(22 . pr-buffer-verbose) - '(22 . pr-buffer-name) - '(22 . pr-buffer-name-ignore) - ")\n\n;;; printing.el - end of settings\n") - "\n"))) - - -(defun lpr-setup () - "Return the current `lpr' setup. - -This is *not* an interactive command. -One way to see `lpr' setup is to switch to a *Scratch* buffer and type: - - M-: (insert (lpr-setup)) RET - -Or choose the menu option Printing/Show Settings/lpr." - (let (ps-prefix-quote) - (mapconcat - #'ps-print-quote - (list - "\n;;; lpr.el settings\n" - (ps-comment-string "emacs-version" emacs-version) - nil - '(25 . printer-name) - '(25 . lpr-switches) - '(25 . lpr-add-switches) - '(25 . lpr-command) - '(25 . lpr-headers-switches) - '(25 . print-region-function) - '(25 . lpr-page-header-program) - '(25 . lpr-page-header-switches) - ")\n\n;;; lpr.el - end of settings\n") - "\n"))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; mh-e (adapted from mh-e-init.el -- Tom Vogels ) - -(declare-function mh-get-msg-num "mh-utils" (error-if-no-message)) -(declare-function mh-show "mh-show" (&optional message redisplay-flag)) -(declare-function mh-start-of-uncleaned-message "mh-show" ()) -(defvar mh-show-buffer) - - -(defun pr-article-date () - "Find the date of an article or mail message in current buffer. -Return only the dayname, if present, weekday, month, and year." - (save-excursion - (goto-char (point-min)) - (if (re-search-forward - "^Date:[ \t]+\\(\\([A-Za-z]+, \\)?[0-9]+ [A-Za-z]+ [0-9]+\\)" nil t) - (buffer-substring (match-beginning 1) (match-end 1)) - (format-time-string "%Y/%m/%d")))) - - -(defun pr-mh-current-message () - "Go to mh-inbox current message." - (let ((msg (or (mh-get-msg-num nil) 0))) - (mh-show) - (set-buffer mh-show-buffer) - (goto-char (point-min)) - (mh-start-of-uncleaned-message) - (message "Printing message %d" msg))) - - -(defun pr-mh-print-1 (n-up filename header-list) - "Print mh-inbox current message in PostScript." - (save-excursion - (save-window-excursion - (pr-mh-current-message) - (pr-mode-print n-up filename header-list (point))))) - - -(defun pr-mh-lpr-1 (header-list) - "Print mh-inbox current message in text printer." - (save-excursion - (save-window-excursion - (pr-mh-current-message) - (pr-mode-lpr header-list (point))))) - - -(defalias 'pr-mh-print-2 'pr-mode-print) - - -(defalias 'pr-mh-lpr-2 'pr-mode-lpr) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; rmail (hacked from ps-print.el) - - -(defun pr-rmail-lpr (header-list) - "Print RMAIL current message in text printer." - (pr-lpr-message-from-summary header-list - 'rmail-buffer 'rmail-summary-buffer)) - - -(defun pr-rmail-print (n-up filename header-list) - "Print RMAIL current message in PostScript." - (pr-ps-message-from-summary n-up filename header-list - 'rmail-buffer 'rmail-summary-buffer)) - - -(defun pr-ps-message-from-summary (n-up filename header-list - summary-buffer summary-default) - "Print current message in PostScript." - (let ((buf (or (and (boundp summary-buffer) - (symbol-value summary-buffer)) - (symbol-value summary-default)))) - (and (get-buffer buf) - (with-current-buffer buf - (pr-mode-print n-up filename header-list))))) - - -(defun pr-lpr-message-from-summary (header-list summary-buffer summary-default) - "Print current message in text printer." - (let ((buf (or (and (boundp summary-buffer) - (symbol-value summary-buffer)) - (symbol-value summary-default)))) - (and (get-buffer buf) - (with-current-buffer buf - (pr-mode-lpr header-list))))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; gnus (hacked from ps-print.el) - - -(defvar pr-gnus-article "*Article*") - - -(defun pr-gnus-print (n-up filename header-list) - "Print *Article* current message in PostScript." - (pr-ps-message-from-summary n-up filename header-list - 'gnus-article-buffer 'pr-gnus-article)) - - -(defun pr-gnus-lpr (header-list) - "Print *Article* current message in text printer." - (pr-lpr-message-from-summary header-list - 'gnus-article-buffer 'pr-gnus-article)) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; vm (hacked from ps-print.el) - - -(defvar pr-vm-summary "") - - -(defun pr-vm-print (n-up filename header-list) - "Print current vm message in PostScript." - (pr-ps-message-from-summary n-up filename header-list - 'vm-mail-buffer 'pr-vm-summary)) - - -(defun pr-vm-lpr (header-list) - "Print current vm message in text printer." - (pr-lpr-message-from-summary header-list - 'vm-mail-buffer 'pr-vm-summary)) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Mode Functions - - -(defun pr-ps-mode (n-up filename) - "If current major mode is declared, print it in PostScript." - (let ((args (pr-mode-alist-p))) - (if args - (let ((fun (cdr args))) - (funcall (car fun) n-up filename (cdr fun)) - t) - (ding) - (message "`%s' major mode not declared." major-mode) - nil))) - - -(defmacro pr-local-variable (header-list &rest body) - `(save-excursion - (let ((ps-header-lines (or (nth 0 ,header-list) ps-header-lines)) - (ps-left-header (or (nth 1 ,header-list) ps-left-header)) - (ps-right-header (or (nth 2 ,header-list) ps-right-header)) - ps-razzle-dazzle) - (let ((local-var-list (pr-eval-local-alist (nthcdr 4 ,header-list)))) - ,@body - (and (nth 3 ,header-list) - (pr-kill-local-variable local-var-list)))))) - - -(defun pr-mode-print (n-up filename header-list &optional from to) - "Print current major mode in PostScript." - (pr-local-variable - header-list - (let ((file (pr-ps-file filename)) - (start (cond (from) - ((pr-region-active-p) (region-beginning)) - (t nil) - ))) - (pr-text2ps (pr-region-active-symbol start) n-up file start - (cond (to) - ((pr-region-active-p) (region-end)) - (from (point-max)) - )) - (unless (or pr-spool-p filename) - (pr-ps-file-print file) - (pr-delete-file file))))) - - -(defun pr-mode-lpr (header-list &optional from to) - "Print current major mode in text printer." - (pr-local-variable - header-list - (pr-txt-print (cond (from) - ((pr-region-active-p) (region-beginning)) - (t (point-min))) - (cond (to) - ((pr-region-active-p) (region-end)) - (t (point-max)))))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Menu Lock - - -(defconst pr-menu-entry-alist - '((postscript . 3) - (text . 3) - (postscript-options . 9) - (postscript-process . 3) - (printing . 3) - (help . 3) - ) - "Alist that associates menu part with number of items per part. - -It's used by `pr-menu-index'. - -Each element has the form: - - (MENU-PART . NUMBER-OF-ITEMS) - -See `pr-visible-entry-list'.") - - -(defun pr-menu-index (entry index) - (let ((base-list - (cond ((eq entry 'text) - '(postscript)) - ((eq entry 'postscript-options) - '(postscript text)) - ((eq entry 'postscript-process) - '(postscript text postscript-options)) - ((eq entry 'printing) - '(postscript text postscript-options postscript-process)) - (t - nil) - )) - key) - (while base-list - (setq key (car base-list) - base-list (cdr base-list)) - (and (pr-visible-p key) - (setq index (+ index - (cdr (assq key pr-menu-entry-alist))))))) - (+ index 2)) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Printer & Utility Selection - - -(defun pr-update-var (var-sym alist) - (or (assq (symbol-value var-sym) alist) - (set var-sym (car (car alist))))) - - -(defun pr-update-menus (&optional force) - "Update utility, PostScript and text printer menus. - -If FORCE is non-nil, update menus doesn't matter if `pr-ps-printer-alist', -`pr-txt-printer-alist' or `pr-ps-utility-alist' were modified or not; -otherwise, update PostScript printer menu if `pr-ps-printer-menu-modified' is -non-nil, update text printer menu if `pr-txt-printer-menu-modified' is -non-nil, and update PostScript File menus if `pr-ps-utility-menu-modified' is -non-nil. - -If menu binding was not done, calls `pr-menu-bind'." - (interactive "P") - (if pr-menu-print-item ; since v6.8.4 - ;; There was no menu binding yet, so do it now! - ;; This is a hack to be compatible with old versions of printing. - ;; So, user does not need to change printing calling in init files. - (pr-menu-bind) - ;; Here menu binding is ok. - (pr-update-var 'pr-ps-name pr-ps-printer-alist) - (pr-update-var 'pr-txt-name pr-txt-printer-alist) - (pr-update-var 'pr-ps-utility pr-ps-utility-alist) - (pr-do-update-menus force))) - - -(defun pr-menu-create (name alist var-sym fun entry index) - (cons name - (mapcar - (lambda (elt) - (let ((sym (car elt))) - (vector - (symbol-name sym) - `(,fun ',sym nil ',entry ',index) - :style 'radio - :selected `(eq ,var-sym ',sym)))) - alist))) - - -(defun pr-ps-set-utility (value) - (let ((item (cdr (assq value pr-ps-utility-alist)))) - (or item - (error - "Invalid PostScript utility name `%s' for variable `pr-ps-utility'" - value)) - (setq pr-ps-utility value) - (pr-eval-alist (nthcdr 9 item))) - (force-mode-line-update)) - - -(defun pr-ps-set-printer (value) - (let ((ps (cdr (assq value pr-ps-printer-alist)))) - (or ps - (error - "Invalid PostScript printer name `%s' for variable `pr-ps-name'" - value)) - (setq pr-ps-name value - pr-ps-command (nth 0 ps) - pr-ps-switches (nth 1 ps) - pr-ps-printer-switch (nth 2 ps) - pr-ps-printer (nth 3 ps)) - (or (stringp pr-ps-command) - (setq pr-ps-command - (cond (lpr-windows-system "print") - (lpr-lp-system "lp") - (t "lpr") - ))) - (or (stringp pr-ps-printer-switch) - (setq pr-ps-printer-switch - (cond (lpr-windows-system "/D:") - (lpr-lp-system "-d") - (t "-P") - ))) - (pr-eval-alist (nthcdr 4 ps))) - (force-mode-line-update)) - - -(defun pr-txt-set-printer (value) - (let ((txt (cdr (assq value pr-txt-printer-alist)))) - (or txt - (error "Invalid text printer name `%s' for variable `pr-txt-name'" - value)) - (setq pr-txt-name value - pr-txt-command (nth 0 txt) - pr-txt-switches (nth 1 txt) - pr-txt-printer (nth 2 txt))) - (or (stringp pr-txt-command) - (setq pr-txt-command - (cond (lpr-windows-system "print") - (lpr-lp-system "lp") - (t "lpr") - ))) - (force-mode-line-update)) - - -(defun pr-eval-alist (alist) - (dolist (option alist) - (let ((var-sym (car option)) - (value (cdr option))) - (if (eq var-sym 'inherits-from:) - (pr-eval-setting-alist value 'global) - (set var-sym (eval value)))))) - - -(defun pr-eval-local-alist (alist) - (let (local-list) - (dolist (option alist) - (let ((var-sym (car option)) - (value (cdr option))) - (setq local-list - (if (eq var-sym 'inherits-from:) - (nconc (pr-eval-setting-alist value) local-list) - (set (make-local-variable var-sym) (eval value)) - (cons var-sym local-list))))) - local-list)) - - -(defun pr-eval-setting-alist (key &optional global old) - (let ((setting (cdr (assq key pr-setting-database)))) - (and setting - (let ((inherits (nth 0 setting)) - (local (nth 1 setting)) - (kill (nth 2 setting)) - local-list) - (and local global - (progn - (ding) - (message "There are local buffer settings for `%S'." key) - (setq global nil))) - (and inherits - (if (memq inherits old) - (error "Circular inheritance for `%S'" inherits) - (setq local-list - (pr-eval-setting-alist inherits global - (cons inherits old))))) - (mapc - (cond ((not local) ; global settings - (lambda (option) - (let ((var-sym (car option))) - (or (eq var-sym 'inherits-from:) - (set var-sym (eval (cdr option))))))) - (kill ; local settings with killing - (lambda (option) - (let ((var-sym (car option))) - (unless (eq var-sym 'inherits-from:) - (setq local-list (cons var-sym local-list)) - (set (make-local-variable var-sym) - (eval (cdr option))))))) - (t ; local settings without killing - (lambda (option) - (let ((var-sym (car option))) - (or (eq var-sym 'inherits-from:) - (set (make-local-variable var-sym) - (eval (cdr option)))))))) - (nthcdr 3 setting)) - local-list)))) - - -(defun pr-kill-local-variable (local-var-list) - (mapcar #'kill-local-variable local-var-list)) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Internal Functions (II) - - -(defun pr-toggle (var-sym mess entry index horizontal state - &optional path no-menu) - (set var-sym (not (symbol-value var-sym))) - (message "%s is %s" mess (if (symbol-value var-sym) "on" "off")) - (or no-menu - (pr-menu-lock entry index horizontal state path))) - - -(defun pr-toggle-file-duplex-menu (&optional no-menu) - "Toggle whether to print PostScript files in duplex mode." - (interactive) - (pr-toggle 'pr-file-duplex "PS file duplex" nil 7 5 nil - '("PostScript Print" "File") no-menu)) - - -(defun pr-toggle-file-tumble-menu (&optional no-menu) - "Toggle whether to print PostScript files in tumble mode." - (interactive) - (pr-toggle 'pr-file-tumble "PS file tumble" nil 8 5 nil - '("PostScript Print" "File") no-menu)) - - -(defun pr-toggle-file-landscape-menu (&optional no-menu) - "Toggle whether to print PostScript files in landscape orientation." - (interactive) - (pr-toggle 'pr-file-landscape "PS file landscape" nil 6 5 nil - '("PostScript Print" "File") no-menu)) - - -(defun pr-toggle-ghostscript-menu (&optional no-menu) - "Toggle whether to print using ghostscript." - (interactive) - (pr-toggle 'pr-print-using-ghostscript "Printing using ghostscript" - 'postscript-process 2 12 'toggle nil no-menu)) - - -(defun pr-toggle-faces-menu (&optional no-menu) - "Toggle whether to print with face attributes." - (interactive) - (pr-toggle 'pr-faces-p "Printing with faces" - 'postscript-process 1 12 'toggle nil no-menu)) - - -(defun pr-toggle-spool-menu (&optional no-menu) - "Toggle whether to spool printing in a buffer." - (interactive) - (pr-toggle 'pr-spool-p "Spooling printing" - 'postscript-process 0 12 'toggle nil no-menu)) - - -(defun pr-toggle-duplex-menu (&optional no-menu) - "Toggle whether to generate PostScript for a two-sided printer." - (interactive) - (pr-toggle 'ps-spool-duplex "Printing duplex" - 'postscript-options 5 12 'toggle nil no-menu)) - - -(defun pr-toggle-tumble-menu (&optional no-menu) - "Toggle how pages on opposite sides of a sheet are oriented." - (interactive) - (pr-toggle 'ps-spool-tumble "Tumble" - 'postscript-options 6 12 'toggle nil no-menu)) - - -(defun pr-toggle-landscape-menu (&optional no-menu) - "Toggle whether to print in landscape mode." - (interactive) - (pr-toggle 'ps-landscape-mode "Landscape" - 'postscript-options 0 12 'toggle nil no-menu)) - - -(defun pr-toggle-upside-down-menu (&optional no-menu) - "Toggle whether to print upside-down (that is, rotated by 180 degrees)." - (interactive) - (pr-toggle 'ps-print-upside-down "Upside-Down" - 'postscript-options 7 12 'toggle nil no-menu)) - - -(defun pr-toggle-line-menu (&optional no-menu) - "Toggle whether to means print line numbers." - (interactive) - (pr-toggle 'ps-line-number "Line number" - 'postscript-options 3 12 'toggle nil no-menu)) - - -(defun pr-toggle-zebra-menu (&optional no-menu) - "Toggle whether to print zebra stripes." - (interactive) - (pr-toggle 'ps-zebra-stripes "Zebra stripe" - 'postscript-options 4 12 'toggle nil no-menu)) - - -(defun pr-toggle-header-menu (&optional no-menu) - "Toggle whether to print a header at the top of each page." - (interactive) - (pr-toggle 'ps-print-header "Print header" - 'postscript-options 1 12 'toggle nil no-menu)) - - -(defun pr-toggle-header-frame-menu (&optional no-menu) - "Toggle whether to draw a gaudy frame around the header." - (interactive) - (pr-toggle 'ps-print-header-frame "Print header frame" - 'postscript-options 2 12 'toggle nil no-menu)) - - -(defun pr-toggle-lock-menu (&optional no-menu) - "Toggle whether the menu is locked while selecting toggle options." - (interactive) - (pr-toggle 'pr-menu-lock "Menu lock" - 'printing 2 12 'toggle nil no-menu)) - - -(defun pr-toggle-region-menu (&optional no-menu) - "Toggle whether the region is automagically detected." - (interactive) - (pr-toggle 'pr-auto-region "Auto region" - 'printing 0 12 'toggle nil no-menu)) - - -(defun pr-toggle-mode-menu (&optional no-menu) - "Toggle whether major-mode specific printing is preferred over normal printing." - (interactive) - (pr-toggle 'pr-auto-mode "Auto mode" - 'printing 1 12 'toggle nil no-menu)) - - -(defun pr-prompt (str) - (if (pr-auto-mode-p) - (concat str " mode") - (pr-region-active-string str))) - - -(defun pr-prompt-region (str) - (concat str (if (pr-auto-mode-p) - " mode" - " region"))) - - -(defun pr-prompt-gs (str) - (if (pr-using-ghostscript-p) - (concat str " GS") - str)) - - -(defun pr-region-active-symbol (&optional region-p) - (if (or region-p (pr-region-active-p)) - 'region - 'buffer)) - - -(defun pr-region-active-string (prefix) - (concat prefix - (if (pr-region-active-p) - " region" - " buffer"))) - - -(defun pr-show-setup (settings buffer-name) - (with-output-to-temp-buffer buffer-name - (with-current-buffer buffer-name - (insert settings)) - (help-print-return-message))) - - -(defun pr-complete-alist (prompt alist default) - (let ((collection (mapcar (lambda (elt) - (setq elt (car elt)) - (cons (symbol-name elt) elt)) - alist))) - (cdr (assoc (completing-read (concat prompt ": ") - collection nil t - (symbol-name default) nil - (symbol-name default)) - collection)))) - - -(defun pr-delete-file (file) - (and pr-delete-temp-file (file-exists-p file) - (delete-file file))) - - -(defun pr-ps-outfile-preprint (&optional mess) - (let* ((prompt (format "%soutput PostScript file name: " (or mess ""))) - (res (read-file-name prompt default-directory "" nil))) - (while (cond ((not (file-writable-p res)) - (ding) - (setq prompt "is unwritable")) - ((file-directory-p res) - (ding) - (setq prompt "is a directory")) - ((file-exists-p res) - (ding) - (setq prompt "exists") - (not (y-or-n-p (format-message - "File `%s' exists; overwrite? " res)))) - (t nil)) - (setq res (read-file-name - (format "File %s; PostScript file: " prompt) - (file-name-directory res) nil nil - (file-name-nondirectory res)))) - (expand-file-name res))) - - -(defun pr-ps-infile-preprint (&optional mess) - (let* ((prompt (format "%sinput PostScript file name: " (or mess ""))) - (res (read-file-name prompt default-directory "" nil))) - (while (cond ((not (file-exists-p res)) - (ding) - (setq prompt "doesn't exist")) - ((not (file-readable-p res)) - (ding) - (setq prompt "is unreadable")) - ((file-directory-p res) - (ding) - (setq prompt "is a directory")) - (t nil)) - (setq res (read-file-name - (format "File %s; PostScript file: " prompt) - (file-name-directory res) nil nil - (file-name-nondirectory res)))) - (expand-file-name res))) - - -(defun pr-ps-utility-args (n-up-sym infile-sym outfile-sym prompt) - ;; check arguments for PostScript file processing. - ;; n-up - (or (symbol-value n-up-sym) - (set n-up-sym (pr-interactive-n-up prompt))) - ;; input file - (and (eq (symbol-value infile-sym) t) - (set infile-sym (pr-ps-infile-preprint prompt))) - (or (symbol-value infile-sym) - (error "%s: Input PostScript file name is missing" prompt)) - ;; output file - (and (eq (symbol-value outfile-sym) t) - (set outfile-sym (and current-prefix-arg - (pr-ps-outfile-preprint prompt)))) - (pr-ps-file (symbol-value outfile-sym))) - - -(defun pr-ps-utility-process (n-up infile outfile) - ;; activate utility to process a PostScript file. - (let (item) - (and (stringp infile) (file-exists-p infile) - (setq item (cdr (assq pr-ps-utility pr-ps-utility-alist))) - (pr-call-process (nth 0 item) - (pr-switches-string (nth 1 item) - "pr-ps-utility-alist entry") - (pr-switches-string (nth 8 item) - "pr-ps-utility-alist entry") - (and (nth 2 item) - (format (nth 2 item) ps-paper-type)) - (format (nth 3 item) n-up) - (and pr-file-landscape (nth 4 item)) - (and pr-file-duplex (nth 5 item)) - (and pr-file-tumble (nth 6 item)) - (pr-dosify-file-name (expand-file-name infile)) - (nth 7 item) - (pr-dosify-file-name (expand-file-name outfile)))))) - - -(defun pr-remove-nil-from-list (lst) - (while (and lst (null (car lst))) - (setq lst (cdr lst))) - (let ((b lst) - (l (cdr lst))) - (while l - (if (car l) - (setq b l - l (cdr l)) - (setq l (cdr l)) - (setcdr b l)))) - lst) - - -(defun pr-call-process (command &rest args) - (let ((buffer (get-buffer-create "*Printing Command Output*")) - (cmd (pr-command command)) - status) - (setq args (pr-remove-nil-from-list args)) - ;; *Printing Command Output* == show command & args - (with-current-buffer buffer - (goto-char (point-max)) - (insert (format "%s %S\n" cmd args))) - ;; *Printing Command Output* == show any return message from command - (with-file-modes pr-file-modes - (setq status - (condition-case data - (apply #'call-process cmd nil buffer nil args) - ((quit error) - (error-message-string data))))) - ;; *Printing Command Output* == show exit status - (with-current-buffer buffer - (goto-char (point-max)) - (insert (format "Exit status: %s\n\n" status))) - ;; message if error status - (if (or (stringp status) - (and (integerp status) (/= status 0))) - (message - "Printing error status: %s (see *Printing Command Output* buffer)" - status)))) - - -(defun pr-txt-print (from to) - (let ((lpr-command (pr-standard-file-name (pr-command pr-txt-command))) - (lpr-switches (pr-switches pr-txt-switches "pr-txt-switches")) - (printer-name pr-txt-printer)) - (lpr-region from to))) - - -(defun pr-switches-string (switches mess) - ;; If SWITCHES is nil, return nil. - ;; Otherwise, return the list of string in a string. - (and switches - (mapconcat #'identity (pr-switches switches mess) " "))) - - -(defun pr-switches (switches mess) - (or (listp switches) - (error "%S should have a list of strings" mess)) - (flatten-tree ; dynamic evaluation - (mapcar #'lpr-eval-switch switches))) - - -(defun pr-ps-preview (kind n-up filename mess) - (defvar pr--n-up) (defvar pr--filename) - (let ((pr--n-up n-up) (pr--filename filename)) - (pr-set-n-up-and-filename 'pr--n-up 'pr--filename mess) - (let ((file (pr-ps-file pr--filename))) - (pr-text2ps kind pr--n-up file) - (or pr-spool-p (pr-ps-file-preview file))))) - - -(defun pr-ps-using-ghostscript (kind n-up filename mess) - (defvar pr--n-up) (defvar pr--filename) - (let ((pr--n-up n-up) (pr--filename filename)) - (pr-set-n-up-and-filename 'pr--n-up 'pr--filename mess) - (let ((file (pr-ps-file pr--filename))) - (pr-text2ps kind pr--n-up file) - (unless (or pr-spool-p pr--filename) - (pr-ps-file-using-ghostscript file) - (pr-delete-file file))))) - - -(defun pr-ps-print (kind n-up filename mess) - (defvar pr--n-up) (defvar pr--filename) - (let ((pr--n-up n-up) (pr--filename filename)) - (pr-set-n-up-and-filename 'pr--n-up 'pr--filename mess) - (let ((file (pr-ps-file pr--filename))) - (pr-text2ps kind pr--n-up file) - (unless (or pr-spool-p pr--filename) - (pr-ps-file-print file) - (pr-delete-file file))))) - - -(defun pr-ps-file (&optional filename) - (or filename - (make-temp-file - (convert-standard-filename - (expand-file-name pr-ps-temp-file pr-temp-dir)) - nil ".ps"))) - - -(defun pr-interactive-n-up (mess) - (unless (stringp mess) - (setq mess "*")) - (let (int) - (while (or (< (setq int (read-number (format "[%s] N-up printing:" mess) 1)) - 0) - (> int 100)) - (if (< int 0) - (message "Integer below 1") - (message "Integer above 100")) - (sit-for 1) - (ding)) - int)) - - -(defun pr-interactive-dir (mess) - (let* ((dir-name (file-name-directory (or (buffer-file-name) - default-directory))) - (fmt-prompt (concat "%s[" mess "] Directory to print: ")) - (dir (read-directory-name (format fmt-prompt "") - "" dir-name nil dir-name)) - prompt) - (while (cond ((not (file-directory-p dir)) - (ding) - (setq prompt "It's not a directory! ")) - ((not (file-readable-p dir)) - (ding) - (setq prompt "Directory is unreadable! ")) - (t nil)) - (setq dir-name (file-name-directory dir) - dir (read-directory-name (format fmt-prompt prompt) - "" dir-name nil dir-name))) - (file-name-as-directory dir))) - - -(defun pr-interactive-regexp (mess) - (read-string (format "[%s] File regexp to print: " mess))) - - -(defun pr-interactive-dir-args (mess) - (list - ;; get directory argument - (pr-interactive-dir mess) - ;; get file name regexp - (pr-interactive-regexp mess))) - - -(defun pr-interactive-ps-dir-args (mess) - (list - ;; get n-up argument - (pr-interactive-n-up mess) - ;; get directory argument - (pr-interactive-dir mess) - ;; get file name regexp - (pr-interactive-regexp mess) - ;; get output file name - (and (not pr-spool-p) - (ps-print-preprint current-prefix-arg)))) - - -(defun pr-interactive-n-up-file (mess) - (list - ;; get n-up argument - (pr-interactive-n-up mess) - ;; get output file name - (and (not pr-spool-p) - (ps-print-preprint current-prefix-arg)))) - - -(defun pr-interactive-n-up-inout (mess) - (list - ;; get n-up argument - (pr-interactive-n-up mess) - ;; get input file name - (pr-ps-infile-preprint (concat mess " ")) - ;; get output file name - (ps-print-preprint current-prefix-arg))) - - -(defun pr-set-outfilename (filename-sym) - (and (not pr-spool-p) - (eq (symbol-value filename-sym) t) - (set filename-sym (and current-prefix-arg - (ps-print-preprint current-prefix-arg))))) - - -(defun pr-set-n-up-and-filename (n-up-sym filename-sym mess) - ;; n-up - (or (symbol-value n-up-sym) - (set n-up-sym (pr-interactive-n-up mess))) - ;; output file - (pr-set-outfilename filename-sym)) - - -(defun pr-set-dir-args (dir-sym regexp-sym mess) - ;; directory - (or (symbol-value dir-sym) - (set dir-sym (pr-interactive-dir mess))) - ;; file name regexp - (or (symbol-value regexp-sym) - (set regexp-sym (pr-interactive-regexp mess)))) - - -(defun pr-set-ps-dir-args (n-up-sym dir-sym regexp-sym filename-sym mess) - ;; n-up - (or (symbol-value n-up-sym) - (set n-up-sym (pr-interactive-n-up mess))) - ;; directory & file name regexp - (pr-set-dir-args dir-sym regexp-sym mess) - ;; output file - (pr-set-outfilename filename-sym)) - - -(defun pr-find-buffer-visiting (file) - (if (not (file-directory-p file)) - (find-buffer-visiting (if lpr-windows-system - (downcase file) - file)) - (let ((truename (file-truename file)) - (blist (buffer-list)) - found) - (while (and (not found) blist) - (with-current-buffer (car blist) - (and (eq major-mode 'dired-mode) - (save-excursion - (goto-char (point-min)) - (string= (buffer-substring-no-properties - (+ (point-min) 2) - (progn - (end-of-line) - (1- (point)))) - truename)) - (setq found (car blist)))) - (setq blist (cdr blist))) - found))) - - -(defun pr-file-list (dir file-regexp fun) - (mapcar (lambda (file) - (and (or pr-list-directory - (not (file-directory-p file))) - (let ((buffer (pr-find-buffer-visiting file)) - pop-up-windows - pop-up-frames) - (and (or buffer - (file-readable-p file)) - (with-current-buffer (or buffer - (find-file-noselect file)) - (funcall fun) - (or buffer - (kill-buffer (current-buffer)))))))) - (directory-files dir t file-regexp))) - - -(defun pr-delete-file-if-exists (filename) - (and (not pr-spool-p) (stringp filename) (file-exists-p filename) - (delete-file filename))) - - -(defun pr-ps-file-list (n-up dir file-regexp filename) - (pr-delete-file-if-exists (setq filename (expand-file-name filename))) - (let ((pr-spool-p t)) - (pr-file-list dir file-regexp - (lambda () - (if (pr-auto-mode-p) - (pr-ps-mode n-up filename) - (pr-text2ps 'buffer n-up filename))))) - (or pr-spool-p - (pr-despool-print filename))) - - -(defun pr-text2ps (kind n-up filename &optional from to) - (with-file-modes pr-file-modes - (let ((ps-n-up-printing n-up) - (ps-spool-config (and (eq ps-spool-config 'setpagedevice) - 'setpagedevice))) - (pr-delete-file-if-exists filename) - (cond (pr-faces-p - (cond (pr-spool-p - ;; pr-faces-p and pr-spool-p - ;; here FILENAME arg is ignored - (cond ((eq kind 'buffer) - (ps-spool-buffer-with-faces)) - ((eq kind 'region) - (ps-spool-region-with-faces (or from (point)) - (or to (mark)))) - )) - ;; pr-faces-p and not pr-spool-p - ((eq kind 'buffer) - (ps-print-buffer-with-faces filename)) - ((eq kind 'region) - (ps-print-region-with-faces (or from (point)) - (or to (mark)) filename)) - )) - (pr-spool-p - ;; not pr-faces-p and pr-spool-p - ;; here FILENAME arg is ignored - (cond ((eq kind 'buffer) - (ps-spool-buffer)) - ((eq kind 'region) - (ps-spool-region (or from (point)) (or to (mark)))) - )) - ;; not pr-faces-p and not pr-spool-p - ((eq kind 'buffer) - (ps-print-buffer filename)) - ((eq kind 'region) - (ps-print-region (or from (point)) (or to (mark)) filename)) - )))) - - -(defun pr-command (command) - "Return absolute file name specification for COMMAND. - -If COMMAND is an empty string, return it. - -If COMMAND is already an absolute file name specification, return it. -Else it uses `pr-path-alist' to find COMMAND, if find it then return it; -otherwise, gives an error. - -When using `pr-path-alist' to find COMMAND, the entries `cygwin', `windows' and -`unix' are used (see `pr-path-alist' for documentation). - -If Emacs is running on Windows 98/NT/2000, tries to find COMMAND, -COMMAND.exe, COMMAND.bat and COMMAND.com in this order." - (if (string= command "") - command - (or (pr-find-command command) - (pr-path-command (cond (pr-cygwin-system 'cygwin) - (lpr-windows-system 'windows) - (t 'unix)) - (file-name-nondirectory command) - nil) - (error "Command not found: %s" - (file-name-nondirectory command))))) - - -(defun pr-path-command (symbol command sym-list) - (let ((lpath (cdr (assq symbol pr-path-alist))) - cmd) - ;; PATH expansion - (and (eq symbol 'PATH) (null lpath) - (setq lpath (parse-colon-path (getenv "PATH")))) - (while (and lpath - (not - (setq cmd - (let ((path (car lpath))) - (cond - ;; symbol expansion - ((symbolp path) - (and (not (memq path sym-list)) - (pr-path-command path command - (cons path sym-list)))) - ;; normal path - ((stringp path) - (pr-find-command - (expand-file-name - (substitute-in-file-name - (concat (file-name-as-directory path) - command))))) - ))))) - (setq lpath (cdr lpath))) - cmd)) - - -(defun pr-find-command (cmd) - (if lpr-windows-system - ;; windows system - (let ((ext (cons (file-name-extension cmd t) - (list ".exe" ".bat" ".com"))) - found) - (setq cmd (file-name-sans-extension cmd)) - (while (and ext - (setq found (concat cmd (car ext))) - (not (and (file-regular-p found) - (file-executable-p found)))) - (setq ext (cdr ext) - found nil)) - found) - ;; non-Windows systems - (and (file-regular-p cmd) - (file-executable-p cmd) - cmd))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Printing Interface (inspired by ps-print-interface.el) - - -(defvar pr-i-window-configuration nil) - -(defvar pr-i-buffer nil) -(defvar pr-i-region nil) -(defvar pr-i-mode nil) -(defvar pr-i-despool nil) -(defvar pr-i-ps-as-is t) -(defvar pr-i-n-up 1) -(defvar pr-i-directory "./") -(defvar pr-i-regexp "") -(defvar pr-i-ps-file "") -(defvar pr-i-out-file "") -(defvar pr-i-answer-yes nil) -(defvar pr-i-process 'buffer) -(defvar pr-i-ps-send 'printer) - - -(defvar-keymap pr-interface-map - :doc "Keymap for `pr-interface'." - :parent widget-keymap - "q" #'pr-interface-quit - "?" #'pr-interface-help) - -(defmacro pr-interface-save (&rest body) - `(with-current-buffer pr-i-buffer - ,@body)) - - -(defun pr-create-interface () - "Create the front end for printing package." - (setq pr-i-buffer (buffer-name (current-buffer)) - pr-i-region mark-active - pr-i-mode (pr-mode-alist-p) - pr-i-window-configuration (current-window-configuration)) - - (put 'pr-i-process 'pr-widget-list nil) - (put 'pr-i-ps-send 'pr-widget-list nil) - - (delete-other-windows) - (kill-buffer (get-buffer-create pr-buffer-name)) - (switch-to-buffer (get-buffer-create pr-buffer-name)) - - ;; header - (pr-insert-italic "\nCurrent Directory : " 1) - (pr-insert-italic default-directory) - - (pr-insert-section-1) ; 1. Print - (pr-insert-section-2) ; 2. PostScript Printer - (pr-insert-section-3) ; 3. Text Printer - - ;; separator - (widget-insert "\n\n " (make-string 77 ?-)) - - (pr-insert-section-4) ; 4. Settings - (pr-insert-section-5) ; 5. Customize - (pr-insert-section-6) ; 6. Show Settings - (pr-insert-section-7) ; 7. Help - - (use-local-map pr-interface-map) - (widget-setup) - (goto-char (point-min)) - - (and pr-i-region ; let region activated - (pr-keep-region-active))) - -(declare-function widget-field-action "wid-edit" (widget &optional _event)) -(declare-function widget-value-set "wid-edit" (widget value)) - -(defun pr-insert-section-1 () - ;; 1. Print: - (pr-insert-italic "\nPrint :" 1) - - ;; 1a. Buffer: - ;; 1a. Buffer: Buffer List - (pr-insert-radio-button 'pr-i-process 'buffer) - (pr-insert-menu "Buffer List" 'pr-i-buffer - (let ((blist (buffer-list)) - case-fold-search choices) - (while blist - (let ((name (buffer-name (car blist))) - (ignore pr-buffer-name-ignore) - found) - (setq blist (cdr blist)) - (while (and ignore (not found)) - (setq found (string-match (car ignore) name) - ignore (cdr ignore))) - (or found - (push (list 'choice-item - :format "%[%t%]" - name) - choices)))) - (nreverse choices)) - " Buffer : " nil - (lambda () - (pr-interface-save - (setq pr-i-region mark-active - pr-i-mode (pr-mode-alist-p))) - (pr-update-checkbox 'pr-i-region) - (pr-update-checkbox 'pr-i-mode))) - ;; 1a. Buffer: Region - (put 'pr-i-region 'pr-widget - (pr-insert-checkbox - "\n " - 'pr-i-region - (lambda (widget &rest _ignore) - (let ((region-p (pr-interface-save - mark-active))) - (cond ((null (widget-value widget)) ; widget is nil - (setq pr-i-region nil)) - (region-p ; widget is true and there is a region - (setq pr-i-region t) - (widget-value-set widget t) - (widget-setup)) ; MUST be called after widget-value-set - (t ; widget is true and there is no region - (ding) - (message "There is no region active") - (setq pr-i-region nil) - (widget-value-set widget nil) - (widget-setup))))) ; MUST be called after widget-value-set - " Region")) - ;; 1a. Buffer: Mode - (put 'pr-i-mode 'pr-widget - (pr-insert-checkbox - " " - 'pr-i-mode - (lambda (widget &rest _ignore) - (let ((mode-p (pr-interface-save - (pr-mode-alist-p)))) - (cond - ((null (widget-value widget)) ; widget is nil - (setq pr-i-mode nil)) - (mode-p ; widget is true and there is a `mode' - (setq pr-i-mode t) - (widget-value-set widget t) - (widget-setup)) ; MUST be called after widget-value-set - (t ; widget is true and there is no `mode' - (ding) - (message - "This buffer isn't in a mode that printing treats specially.") - (setq pr-i-mode nil) - (widget-value-set widget nil) - (widget-setup))))) ; MUST be called after widget-value-set - " Mode\n")) - - ;; 1b. Directory: - (pr-insert-radio-button 'pr-i-process 'directory) - (widget-create - 'directory - :size 58 - :format " Directory : %v" - :notify 'pr-interface-directory - :action (lambda (widget &optional event) - (if (pr-interface-directory widget) - (pr-widget-field-action widget event) - (ding) - (message "Please specify a readable directory"))) - pr-i-directory) - ;; 1b. Directory: File Regexp - (widget-create 'regexp - :size 58 - :format "\n File Regexp : %v\n" - :notify (lambda (widget &rest _ignore) - (setq pr-i-regexp (widget-value widget))) - pr-i-regexp) - ;; 1b. Directory: List Directory Entry - (widget-insert " ") - (pr-insert-toggle 'pr-list-directory " List Directory Entry\n") - - ;; 1c. PostScript File: - (pr-insert-radio-button 'pr-i-process 'file) - (widget-create - 'file - :size 51 - :format " PostScript File : %v" - :notify 'pr-interface-infile - :action (lambda (widget &rest event) - (if (pr-interface-infile widget) - (pr-widget-field-action widget event) - (ding) - (message "Please specify a readable PostScript file"))) - pr-i-ps-file) - ;; 1c. PostScript File: PostScript Utility - (pr-insert-menu "PostScript Utility" 'pr-ps-utility - (pr-choice-alist pr-ps-utility-alist) - "\n PostScript Utility : " - " ") - ;; 1c. PostScript File: No Preprocessing - (pr-insert-toggle 'pr-i-ps-as-is " No Preprocessing")) - - -(defun pr-insert-section-2 () - ;; 2. PostScript Printer: - ;; 2. PostScript Printer: PostScript Printer List - (pr-insert-italic "\n\nPostScript Printer : " 2 20) - (pr-insert-menu "PostScript Printer" 'pr-ps-name - (pr-choice-alist pr-ps-printer-alist)) - ;; 2. PostScript Printer: Despool - (put 'pr-i-despool 'pr-widget - (pr-insert-checkbox - " " - 'pr-i-despool - (lambda (widget &rest _ignore) - (if pr-spool-p - (setq pr-i-despool (not pr-i-despool)) - (ding) - (message "Can despool only when spooling is actually selected") - (setq pr-i-despool nil)) - (widget-value-set widget pr-i-despool) - (widget-setup)) ; MUST be called after widget-value-set - " Despool ")) - ;; 2. PostScript Printer: Preview Print Quit - (pr-insert-button 'pr-interface-preview "Preview" " ") - (pr-insert-button 'pr-interface-ps-print "Print" " ") - (pr-insert-button 'pr-interface-quit "Quit") - ;; 2. PostScript Printer: Send to Printer/Temporary File - (pr-insert-radio-button 'pr-i-ps-send 'printer) - (widget-insert " Send to Printer/Temporary File") - ;; 2. PostScript Printer: Send to File - (pr-insert-radio-button 'pr-i-ps-send 'file) - (widget-create - 'file - :size 57 - :format " Send to File : %v" - :notify 'pr-interface-outfile - :action (lambda (widget &rest event) - (if (and (pr-interface-outfile widget) - (or (not (file-exists-p pr-i-out-file)) - (setq pr-i-answer-yes - (y-or-n-p "File exists; overwrite? ")))) - (pr-widget-field-action widget event) - (ding) - (message "Please specify a writable PostScript file"))) - pr-i-out-file) - ;; 2. PostScript Printer: N-Up - (widget-create - 'integer - :size 3 - :format "\n N-Up : %v" - :notify (lambda (widget &rest _ignore) - (let ((value (if (string= (widget-apply widget :value-get) "") - 0 - (widget-value widget)))) - (if (and (integerp value) - (<= 1 value) (<= value 100)) - (progn - (message " ") - (setq pr-i-n-up value)) - (ding) - (message "Please specify an integer between 1 and 100")))) - pr-i-n-up)) - - -(defun pr-insert-section-3 () - ;; 3. Text Printer: - (pr-insert-italic "\n\nText Printer : " 2 14) - (pr-insert-menu "Text Printer" 'pr-txt-name - (pr-choice-alist pr-txt-printer-alist) - nil " ") - (pr-insert-button 'pr-interface-printify "Printify" " ") - (pr-insert-button 'pr-interface-txt-print "Print" " ") - (pr-insert-button 'pr-interface-quit "Quit")) - - -(defun pr-insert-section-4 () - ;; 4. Settings: - ;; 4. Settings: Landscape Auto Region Verbose - (pr-insert-checkbox "\n\n " 'ps-landscape-mode - (lambda (&rest _ignore) - (setq ps-landscape-mode (not ps-landscape-mode) - pr-file-landscape ps-landscape-mode)) - " Landscape ") - (pr-insert-toggle 'pr-auto-region " Auto Region ") - (pr-insert-toggle 'pr-buffer-verbose " Verbose\n ") - - ;; 4. Settings: Print Header Auto Mode - (pr-insert-toggle 'ps-print-header " Print Header ") - (pr-insert-toggle 'pr-auto-mode " Auto Mode\n ") - - ;; 4. Settings: Print Header Frame Menu Lock - (pr-insert-toggle 'ps-print-header-frame " Print Header Frame ") - (pr-insert-toggle 'pr-menu-lock " Menu Lock\n ") - - ;; 4. Settings: Line Number - (pr-insert-toggle 'ps-line-number " Line Number\n ") - - ;; 4. Settings: Zebra Stripes Spool Buffer - (pr-insert-toggle 'ps-zebra-stripes " Zebra Stripes") - (pr-insert-checkbox " " - 'pr-spool-p - (lambda (&rest _ignore) - (setq pr-spool-p (not pr-spool-p)) - (unless pr-spool-p - (setq pr-i-despool nil) - (pr-update-checkbox 'pr-i-despool))) - " Spool Buffer") - - ;; 4. Settings: Duplex Print with faces - (pr-insert-checkbox "\n " - 'ps-spool-duplex - (lambda (&rest _ignore) - (setq ps-spool-duplex (not ps-spool-duplex) - pr-file-duplex ps-spool-duplex)) - " Duplex ") - (pr-insert-toggle 'pr-faces-p " Print with faces") - - ;; 4. Settings: Tumble Print via Ghostscript - (pr-insert-checkbox "\n " - 'ps-spool-tumble - (lambda (&rest _ignore) - (setq ps-spool-tumble (not ps-spool-tumble) - pr-file-tumble ps-spool-tumble)) - " Tumble ") - (pr-insert-toggle 'pr-print-using-ghostscript " Print via Ghostscript\n ") - - ;; 4. Settings: Upside-Down Page Parity - (pr-insert-toggle 'ps-print-upside-down " Upside-Down") - (pr-insert-italic "\n\nSelect Pages : " 2 14) - (pr-insert-menu "Page Parity" 'ps-even-or-odd-pages - (mapcar (lambda (alist) - (list 'choice-item - :format "%[%t%]" - :tag (cdr alist) - :value (car alist))) - pr-even-or-odd-alist))) - - -(defun pr-insert-section-5 () - ;; 5. Customize: - (pr-insert-italic "\n\nCustomize : " 2 11) - (pr-insert-button 'pr-customize "printing" " ") - (pr-insert-button (lambda (&rest _ignore) (ps-print-customize)) - "ps-print" " ") - (pr-insert-button 'lpr-customize "lpr")) - - -(defun pr-insert-section-6 () - ;; 6. Show Settings: - (pr-insert-italic "\nShow Settings : " 1 14) - (pr-insert-button 'pr-show-pr-setup "printing" " ") - (pr-insert-button 'pr-show-ps-setup "ps-print" " ") - (pr-insert-button 'pr-show-lpr-setup "lpr")) - - -(defun pr-insert-section-7 () - ;; 7. Help: - (pr-insert-italic "\nHelp : " 1 5) - (pr-insert-button 'pr-interface-help "Interface Help" " ") - (pr-insert-button 'pr-help "Menu Help" " ") - (pr-insert-button 'pr-interface-quit "Quit" "\n ") - (pr-insert-button 'pr-kill-help "Kill All Printing Help Buffer")) - - -(defun pr-kill-help (&rest _ignore) - "Kill all printing help buffer." - (interactive) - (let ((help '("*Printing Interface Help*" "*Printing Help*" - "*LPR Setup*" "*PR Setup*" "*PS Setup*"))) - (while help - (let ((buffer (get-buffer (car help)))) - (setq help (cdr help)) - (when buffer - (delete-windows-on buffer) - (kill-buffer buffer))))) - (recenter (- (window-height) 2))) - - -(defun pr-interface-quit (&rest _ignore) - "Kill the printing buffer interface and quit." - (interactive) - (kill-buffer pr-buffer-name) - (set-window-configuration pr-i-window-configuration)) - - -(defun pr-interface-help (&rest _ignore) - "Printing buffer interface help." - (interactive) - (pr-show-setup pr-interface-help-message "*Printing Interface Help*")) - - -(defun pr-interface-txt-print (&rest _ignore) - "Print using lpr package." - (interactive) - (condition-case data - (cond - ((eq pr-i-process 'directory) - (pr-i-directory) - (pr-interface-save - (pr-txt-directory pr-i-directory pr-i-regexp))) - ((eq pr-i-process 'buffer) - (pr-interface-save - (cond (pr-i-region - (let ((pr-auto-mode pr-i-mode)) - (pr-txt-region))) - (pr-i-mode - (let (pr-auto-region) - (pr-txt-mode))) - (t - (let (pr-auto-mode pr-auto-region) - (pr-txt-buffer))) - ))) - ((eq pr-i-process 'file) - (error "Please specify a text file")) - (t - (error "Internal error: `pr-i-process' = %S" pr-i-process)) - ) - ;; handlers - ((quit error) - (ding) - (message "%s" (error-message-string data))))) - - -(defun pr-interface-printify (&rest _ignore) - "Printify a buffer." - (interactive) - (condition-case data - (cond - ((eq pr-i-process 'directory) - (pr-i-directory) - (pr-interface-save - (pr-printify-directory pr-i-directory pr-i-regexp))) - ((eq pr-i-process 'buffer) - (pr-interface-save - (if pr-i-region - (pr-printify-region) - (pr-printify-buffer)))) - ((eq pr-i-process 'file) - (error "Cannot printify a PostScript file")) - (t - (error "Internal error: `pr-i-process' = %S" pr-i-process)) - ) - ;; handlers - ((quit error) - (ding) - (message "%s" (error-message-string data))))) - - -(defun pr-interface-ps-print (&rest _ignore) - "Print using ps-print package." - (interactive) - (pr-interface-ps 'pr-despool-ps-print 'pr-ps-directory-ps-print - 'pr-ps-file-ps-print 'pr-ps-file-up-ps-print - 'pr-ps-region-ps-print 'pr-ps-mode-ps-print - 'pr-ps-buffer-ps-print)) - - -(defun pr-interface-preview (&rest _ignore) - "Preview a PostScript file." - (interactive) - (pr-interface-ps 'pr-despool-preview 'pr-ps-directory-preview - 'pr-ps-file-preview 'pr-ps-file-up-preview - 'pr-ps-region-preview 'pr-ps-mode-preview - 'pr-ps-buffer-preview)) - - -(defun pr-interface-ps (ps-despool ps-directory ps-file ps-file-up ps-region - ps-mode ps-buffer) - (condition-case data - (let ((outfile (or (and (eq pr-i-process 'file) pr-i-ps-as-is) - (pr-i-ps-send)))) - (cond - ((and pr-i-despool pr-spool-p) - (pr-interface-save - (funcall ps-despool outfile)) - (setq pr-i-despool nil) - (pr-update-checkbox 'pr-i-despool)) - ((eq pr-i-process 'directory) - (pr-i-directory) - (pr-interface-save - (funcall ps-directory - pr-i-n-up pr-i-directory pr-i-regexp outfile))) - ((eq pr-i-process 'file) - (cond ((or (file-directory-p pr-i-ps-file) - (not (file-readable-p pr-i-ps-file))) - (error "Please specify a readable PostScript file")) - (pr-i-ps-as-is - (pr-interface-save - (funcall ps-file pr-i-ps-file))) - (t - (pr-interface-save - (funcall ps-file-up pr-i-n-up pr-i-ps-file outfile))) - )) - ((eq pr-i-process 'buffer) - (pr-interface-save - (cond (pr-i-region - (let ((pr-auto-mode pr-i-mode)) - (funcall ps-region pr-i-n-up outfile))) - (pr-i-mode - (let (pr-auto-region) - (funcall ps-mode pr-i-n-up outfile))) - (t - (let (pr-auto-mode pr-auto-region) - (funcall ps-buffer pr-i-n-up outfile))) - ))) - (t - (error "Internal error: `pr-i-process' = %S" pr-i-process)) - )) - ;; handlers - ((quit error) - (ding) - (message "%s" (error-message-string data))))) - - -(defun pr-i-ps-send () - (cond ((eq pr-i-ps-send 'printer) - nil) - ((not (eq pr-i-ps-send 'file)) - (error "Internal error: `pr-i-ps-send' = %S" pr-i-ps-send)) - ((or (file-directory-p pr-i-out-file) - (not (file-writable-p pr-i-out-file))) - (error "Please specify a writable PostScript file")) - ((or (not (file-exists-p pr-i-out-file)) - pr-i-answer-yes - (setq pr-i-answer-yes - (y-or-n-p (format-message "File `%s' exists; overwrite? " - pr-i-out-file)))) - pr-i-out-file) - (t - (error "File already exists")))) - - -(defun pr-i-directory () - (or (file-accessible-directory-p pr-i-directory) - (error "Please specify be a readable directory"))) - - -(defun pr-interface-directory (widget &rest _ignore) - (and pr-buffer-verbose - (message "You can use M-TAB or ESC TAB for file completion")) - (let ((dir (widget-value widget))) - (and (file-accessible-directory-p dir) - (setq pr-i-directory dir)))) - - -(defun pr-interface-infile (widget &rest _ignore) - (and pr-buffer-verbose - (message "You can use M-TAB or ESC TAB for file completion")) - (let ((file (widget-value widget))) - (and (not (file-directory-p file)) - (file-readable-p file) - (setq pr-i-ps-file file)))) - - -(defun pr-interface-outfile (widget &rest _ignore) - (setq pr-i-answer-yes nil) - (and pr-buffer-verbose - (message "You can use M-TAB or ESC TAB for file completion")) - (let ((file (widget-value widget))) - (and (not (file-directory-p file)) - (file-writable-p file) - (setq pr-i-out-file file)))) - - -(defun pr-widget-field-action (widget event) - (and (get-buffer "*Completions*") ; clean frame window - (delete-windows-on "*Completions*")) - (message " ") ; clean echo area - (widget-field-action widget event)) - - -(defun pr-insert-italic (str &optional from to) - (let ((len (length str))) - (put-text-property (if from (max from 0) 0) - (if to (max to len) len) - 'face 'italic str) - (widget-insert str))) - - -(defun pr-insert-checkbox (before var-sym fun label) - (widget-insert before) - (prog1 - (widget-create 'checkbox - :notify fun - (symbol-value var-sym)) - (widget-insert label))) - - -(defun pr-insert-toggle (var-sym label) - (widget-create 'checkbox - :notify (lambda (&rest _ignore) - (set var-sym (not (symbol-value var-sym)))) - (symbol-value var-sym)) - (widget-insert label)) - - -(defun pr-insert-button (fun label &optional separator) - (widget-create 'push-button - :notify fun - label) - (and separator - (widget-insert separator))) - - -(defun pr-insert-menu (tag var-sym choices &optional before after body) - (and before (widget-insert before)) - (apply #'widget-create 'menu-choice - :tag tag - :format "%v" - :inline t - :value (symbol-value var-sym) - :notify (lambda (widget &rest _ignore) - (set var-sym (widget-value widget)) - (when body (funcall body))) - :void '(choice-item :format "%[%t%]" - :tag "Can not display value!") - choices) - (and after (widget-insert after))) - - -(defun pr-insert-radio-button (var-sym sym) - (widget-insert "\n") - (let ((wid-list (get var-sym 'pr-widget-list)) - (wid (widget-create - 'radio-button - :format " %[%v%]" - :value (eq (symbol-value var-sym) sym) - :notify (lambda (&rest _ignore) - (set var-sym sym) - (pr-update-radio-button var-sym))))) - (put var-sym 'pr-widget-list (cons (cons wid sym) wid-list)))) - - -(defun pr-update-radio-button (var-sym) - (let ((wid-list (get var-sym 'pr-widget-list))) - (while wid-list - (let ((wid (car (car wid-list))) - (value (cdr (car wid-list)))) - (setq wid-list (cdr wid-list)) - (widget-value-set wid (eq (symbol-value var-sym) value)))) - (widget-setup))) - - -(defun pr-update-checkbox (var-sym) - (let ((wid (get var-sym 'pr-widget))) - (when wid - (widget-value-set wid (symbol-value var-sym)) - (widget-setup)))) - - -(defun pr-choice-alist (alist) - (let ((max (apply #'max (mapcar (lambda (alist) - (length (symbol-name (car alist)))) - alist)))) - (mapcar (lambda (alist) - (let* ((sym (car alist)) - (name (symbol-name sym))) - (list - 'choice-item - :format "%[%t%]" - :tag (concat name - (make-string (- max (length name)) ?_)) - :value sym))) - alist))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defconst pr-version "6.9.3" - "printing.el, v 6.9.3 <2007/12/09 vinicius> - -Please send all bug fixes and enhancements to - bug-gnu-emacs@gnu.org and Vinicius Jose Latorre ") -(make-obsolete-variable 'pr-version 'emacs-version "29.1") - -(provide 'printing) - -;;; printing.el ends here diff --git a/lisp/ps-samp.el b/lisp/ps-samp.el deleted file mode 100644 index 03ec9497e36..00000000000 --- a/lisp/ps-samp.el +++ /dev/null @@ -1,268 +0,0 @@ -;;; ps-samp.el --- ps-print sample setup code -*- lexical-binding: t -*- - -;; Copyright (C) 2007-2025 Free Software Foundation, Inc. - -;; Author: Jim Thompson (was ) -;; Jacques Duthen (was ) -;; Vinicius Jose Latorre -;; Kenichi Handa (multi-byte characters) -;; Maintainer: Vinicius Jose Latorre -;; Keywords: text, print, PostScript -;; URL: https://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre -;; Package: ps-print - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Some example hacks for ps-print.el. -;; This stuff is for anybody that's brave enough to look this far, -;; and able to figure out how to use it. It isn't really part of -;; ps-print, but I'll leave it here in hopes it might be useful: - -;; WARNING!!! The following code is *sample* code only. -;; Don't use it unless you understand what it does! - -;;; Code: - -(require 'ps-print) - - - -;; A hook to bind to `rmail-mode-hook' to locally bind prsc and set -;; `ps-left-header' specially for mail messages. -(defun ps-rmail-mode-hook () - (local-set-key [print] 'ps-rmail-print-message-from-summary) - (setq-local ps-header-lines 3) - ;; The left header will display the message's subject, its - ;; author, and the name of the folder it was in. - (setq-local ps-left-header - '(ps-article-subject ps-article-author buffer-name))) - -;; Like `ps-gnus-print-article-from-summary', but for rmail. -(defun ps-rmail-print-message-from-summary () - (interactive) - (ps-print-message-from-summary 'rmail-summary-buffer "RMAIL")) - -;; Used in `ps-rmail-print-message-from-summary', -;; `ps-gnus-print-article-from-summary' and `ps-vm-print-message-from-summary'. -(defun ps-print-message-from-summary (summary-buffer summary-default) - (let ((ps-buf (or (and (boundp summary-buffer) - (symbol-value summary-buffer)) - summary-default))) - (and (get-buffer ps-buf) - (with-current-buffer ps-buf - (ps-spool-buffer-with-faces))))) - -;; Look in an article or mail message for the Subject: line. -(defun ps-article-subject () - (save-excursion - (save-restriction - (narrow-to-region (point-min) (progn (rfc822-goto-eoh) (point))) - (concat "Subject: " (or (mail-fetch-field "Subject") "???"))))) - -;; Look in an article or mail message for the From: line. Sorta-kinda -;; understands RFC 822 (or later) addresses and can pull the real name -;; out where it's provided. -(defun ps-article-author () - (save-excursion - (save-restriction - (narrow-to-region (point-min) (progn (rfc822-goto-eoh) (point))) - (let ((fromstring (mail-fetch-field "From"))) - (cond - ;; Try first to match addresses that look like - ;; thompson@wg2.waii.com (Jim Thompson) - ((and fromstring (string-match ".*[ \t]+(\\(.*\\))" fromstring)) - (match-string 1 fromstring)) - ;; Next try to match addresses that look like - ;; Jim Thompson or - ;; "Jim Thompson" - ((and fromstring - (string-match "\\(\"?\\)\\(.*\\)\\1[ \t]+<.*>" fromstring)) - (match-string 2 fromstring)) - ;; Couldn't find a real name -- show the address instead. - (fromstring) - (t "From ???")))))) - -;; A hook to bind to `gnus-article-prepare-hook'. This will set -;; `ps-left-header' specially for gnus articles. Unfortunately, -;; `gnus-article-mode-hook' is called only once, the first time the *Article* -;; buffer enters that mode, so it would only work for the first time -;; we ran gnus. The second time, this hook wouldn't get set up. The -;; only alternative is `gnus-article-prepare-hook'. -(defun ps-gnus-article-prepare-hook () - (setq-local ps-header-lines 3) - ;; The left headers will display the article's subject, its - ;; author, and the newsgroup it was in. - (setq-local ps-left-header - '(ps-article-subject ps-article-author gnus-newsgroup-name))) - -;; A hook to bind to `vm-mode-hook' to locally bind prsc and set -;; `ps-left-header' specially for mail messages. -(defun ps-vm-mode-hook () - (local-set-key [print] 'ps-vm-print-message-from-summary) - (setq-local ps-header-lines 3) - ;; The left headers will display the message's subject, its - ;; author, and the name of the folder it was in. - (setq-local ps-left-header - '(ps-article-subject ps-article-author buffer-name))) - -;; Every now and then I forget to switch from the *Summary* buffer to -;; the *Article* before hitting prsc, and a nicely formatted list of -;; article subjects shows up at the printer. This function, bound to -;; prsc for the gnus *Summary* buffer means I don't have to switch -;; buffers first. -(defun ps-gnus-print-article-from-summary () - (interactive) - (ps-print-message-from-summary 'gnus-article-buffer "*Article*")) - -;; Like `ps-gnus-print-article-from-summary', but for vm. -(defun ps-vm-print-message-from-summary () - (interactive) - (ps-print-message-from-summary 'vm-mail-buffer "")) - -;; A hook to bind to `gnus-summary-setup-buffer' to locally bind prsc. -(defun ps-gnus-summary-setup () - (local-set-key [print] 'ps-gnus-print-article-from-summary)) - -(defun ps-info-file () - (save-excursion - (goto-char (point-min)) - (if (re-search-forward "File:[ \t]+\\([^, \t\n]*\\)" nil t) - (match-string 1) - "File ???"))) - -(defun ps-info-node () - (save-excursion - (goto-char (point-min)) - (if (re-search-forward "Node:[ \t]+\\([^,\t\n]*\\)" nil t) - (match-string 1) - "Node ???"))) - -(defun ps-info-mode-hook () - ;; The left headers will display the node name and file name. - (setq-local ps-left-header '(ps-info-node ps-info-file))) - -;; WARNING! The following function is a *sample* only, and is *not* meant -;; to be used as a whole unless you understand what the effects will be! -(defun ps-samp-ps-setup () - (global-set-key [print] 'ps-spool-buffer-with-faces) - (global-set-key [S-print] 'ps-spool-region-with-faces) - (global-set-key [C-print] 'ps-despool) - (add-hook 'gnus-article-prepare-hook 'ps-gnus-article-prepare-hook) - (add-hook 'gnus-summary-mode-hook 'ps-gnus-summary-setup) - (add-hook 'vm-mode-hook 'ps-vm-mode-hook) - (add-hook 'vm-mode-hooks 'ps-vm-mode-hook) - (add-hook 'Info-mode-hook 'ps-info-mode-hook) - (setq ps-spool-duplex t - ps-print-color-p nil - ps-lpr-command "lpr" - ps-lpr-switches '("-Jjct,duplex_long") - ps-paper-type 'a4 - ps-landscape-mode t - ps-number-of-columns 2 - ps-left-margin (/ (* 72 1.0) 2.54) ; 1.0 cm - ps-right-margin (/ (* 72 1.0) 2.54) ; 1.0 cm - ps-inter-column (/ (* 72 1.0) 2.54) ; 1.0 cm - ps-bottom-margin (/ (* 72 1.5) 2.54) ; 1.5 cm - ps-top-margin (/ (* 72 1.5) 2.54) ; 1.5 cm - ps-header-offset (/ (* 72 1.0) 2.54) ; 1.0 cm - ps-header-line-pad .15 - ps-print-header t - ps-print-header-frame t - ps-header-lines 2 - ps-show-n-of-n t - ps-spool-duplex nil - ps-font-family 'Courier - ps-font-size 5.5 - ps-header-font-family 'Helvetica - ps-header-font-size 6 - ps-header-title-font-size 8)) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; If zeroconf is enabled, all CUPS printers can be detected. The -;; "PostScript printer" menu will be modified dynamically, as printers -;; are added or removed. - -;; Preconditions: -;; -;; * Emacs has D-Bus support enabled. That is, D-Bus is installed on -;; the system, and Emacs has been configured and built with the -;; --with-dbus option. -;; -;; * The zeroconf daemon avahi-daemon is running. -;; -;; * CUPS has enabled the option "Share published printers connected -;; to this system" (see ). - - -(require 'printing) -(require 'zeroconf) - -;; Add a PostScript printer to the "PostScript printer" menu. -(defun ps-add-printer (service) - (let ((name (zeroconf-service-name service)) - (text (zeroconf-service-txt service)) - (addr (zeroconf-service-address service)) - (port (zeroconf-service-port service)) - is-ps cups-queue) - ;; `text' is an array of key=value strings like ("Duplex=T" "Copies=T"). - (dolist (string text) - (let ((split (split-string string "=" t))) - ;; If it is a PostScript printer, there must be a string like - ;; "pdl=application/postscript,application/vnd.hp-PCL,...". - (when (and (string-equal "pdl" (car split)) - (string-match "application/postscript" (cadr split))) - (setq is-ps t)) - ;; A CUPS printer queue is coded as "rp=printers/". - (when (and (string-equal "rp" (car split)) - (string-match "printers/\\(.+\\)" (cadr split))) - (setq cups-queue (match-string 1 (cadr split)))))) - ;; Add the printer. - (when is-ps - (if cups-queue - (add-to-list - 'pr-ps-printer-alist (list (intern name) "lpr" nil "-P" cups-queue)) - ;; No CUPS printer, but a network printer. - (add-to-list - 'pr-ps-printer-alist (list (intern name) "cupsdoprint" - '("-P" "default") - "-H" (format "%s:%s" addr port)))) - (pr-update-menus t)))) - -;; Remove a printer from the "PostScript printer" menu. -(defun ps-remove-printer (service) - (setq pr-ps-printer-alist - (delete (assoc (intern (zeroconf-service-name service)) - pr-ps-printer-alist) - pr-ps-printer-alist)) - (pr-update-menus t)) - -;; Activate the functions in zeroconf. -(defun ps-make-dynamic-printer-menu () - (when (featurep 'dbusbind) - (zeroconf-init) - (zeroconf-service-add-hook "_ipp._tcp" :new 'ps-add-printer) - (zeroconf-service-add-hook "_ipp._tcp" :removed 'ps-remove-printer))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(provide 'ps-samp) - -;;; ps-samp.el ends here -- 2.39.5