annotate lisp/woman.el @ 29005:b396df3a5181

(ONE_MORE_BYTE, TWO_MORE_BYTES): Set coding->resutl to CODING_FINISH_INSUFFICIENT_SRC if there's not enough source. (ONE_MORE_CHAR, EMIT_CHAR, EMIT_ONE_BYTE, EMIT_TWO_BYTE, EMIT_BYTES): New macros. (THREE_MORE_BYTES, DECODE_CHARACTER_ASCII, DECODE_CHARACTER_DIMENSION1, DECODE_CHARACTER_DIMENSION2): These macros deleted. (CHECK_CODE_RANGE_A0_FF): This macro deleted. (detect_coding_emacs_mule): Use UNIBYTE_STR_AS_MULTIBYTE_P to check the validity of multibyte sequence. (decode_coding_emacs_mule): New function. (encode_coding_emacs_mule): New macro. (detect_coding_iso2022): Use ONE_MORE_BYTE to fetch a byte from the source. (DECODE_ISO_CHARACTER): Just return a character code. (DECODE_COMPOSITION_START): Set coding->result instead of result. (decode_coding_iso2022, decode_coding_sjis_big5, decode_eol): Use EMIT_CHAR to produced decoded characters. Exit the loop only by macros ONE_MORE_BYTE or EMIT_CHAR. Don't handle the case of last block here. (ENCODE_ISO_CHARACTER): Don't translate character here. Produce only position codes for an invalid character. (encode_designation_at_bol): Return new destination pointer. 5th arg DSTP is changed to DST. (encode_coding_iso2022, decode_coding_sjis_big5): Get a character from the source by ONE_MORE_CHAR. Don't handle the case of last block here. (DECODE_SJIS_BIG5_CHARACTER, ENCODE_SJIS_BIG5_CHARACTER): These macros deleted. (detect_coding_sjis, detect_coding_big5, detect_coding_utf_8, detect_coding_utf_16, detect_coding_ccl): Use ONE_MORE_BYTE and TWO_MORE_BYTES to fetch a byte from the source. (encode_eol): Pay attention to coding->src_multibyte. (detect_coding, detect_eol): Preserve members src_multibyte and dst_multibyte. (DECODING_BUFFER_MAG): Return 2 even for coding_type_raw_text. (encoding_buffer_size): Set magnification to 3 for all coding systems that require encoding. (ccl_coding_driver): For decoding, be sure that the result is valid multibyte sequence. (decode_coding): Initialize coding->errors and coding->result. For emacs-mule, call decode_coding_emacs_mule. For no-conversion and raw-text, always call decode_eol. Handle the case of last block here. If not coding->dst_multibyte, convert the resulting sequence to unibyte. (encode_coding): Initialize coding->errors and coding->result. For emacs-mule, call encode_coding_emacs_mule. For no-conversion and raw-text, always call encode_eol. Handle the case of last block here. (shrink_decoding_region, shrink_encoding_region): Detect cases that we can't skip data more rigidly. (code_convert_region): Setup src_multibyte and dst_multibyte members of coding. For decoding, if the buffer is multibyte, convert the source sequence to unibyte in advance. For encoding, if the buffer is multibyte, convert the resulting sequence to multibyte afterward. (run_pre_post_conversion_on_str): New function. (code_convert_string): Deleted and divided into the following two. (decode_coding_string, encode_coding_string): New functions. (code_convert_string1, code_convert_string_norecord): Call one of above. (Fdecode_sjis_char, Fdecode_big5_char): Use MAKE_CHAR instead of MAKE_NON_ASCII_CHAR. (Fset_terminal_coding_system_internal, Fset_safe_terminal_coding_system_internal): Setup src_multibyte and dst_multibyte members. (init_coding_once): Initialize iso_code_class with new enum ISO_control_0 and ISO_control_1.
author Kenichi Handa <handa@m17n.org>
date Fri, 19 May 2000 23:54:56 +0000
parents eb06b6bb8aa8
children 3b4c3f9b9c66
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28832
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1 ;;; woman.el --- browse UN*X manual pages `wo (without) man'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3 ;; Copyright (C) 2000 Free Software Foundation, Inc.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
5 ;; Author: Francis J. Wright <F.J.Wright@Maths.QMW.ac.uk>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
6 ;; Maintainer: Francis J. Wright <F.J.Wright@Maths.QMW.ac.uk>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
7 ;; Keywords: help, man, UN*X, manual
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
8 ;; Adapted-By: Eli Zaretskii <eliz@is.elta.co.il>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
9 ;; Version: see `woman-version'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
10
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
11 ;; This file is part of GNU Emacs.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
12
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
13 ;; GNU Emacs is free software; you can redistribute it and/or modify
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
14 ;; it under the terms of the GNU General Public License as published by
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
15 ;; the Free Software Foundation; either version 2, or (at your option)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
16 ;; any later version.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
17
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
18 ;; GNU Emacs is distributed in the hope that it will be useful,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
21 ;; GNU General Public License for more details.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
22
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
23 ;; You should have received a copy of the GNU General Public License
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
24 ;; along with GNU Emacs; see the file COPYING. If not, write to the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
25 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
26 ;; Boston, MA 02111-1307, USA.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
27
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
28 ;;; Commentary:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
29
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
30 ;; WoMan implements a subset of the formatting performed by the Emacs
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
31 ;; `man' (or `manual-entry') command to format a UN*X manual `page'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
32 ;; for display, but without calling any external programs. It is
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
33 ;; intended to emulate the whole of the -man macro package, plus those
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
34 ;; ?roff requests that are most commonly used in man pages. However,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
35 ;; the emulation is modified to include the reformatting done by the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
36 ;; Emacs `man' command. No hyphenation is performed.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
37
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
38 ;; Advantages
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
39
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
40 ;; Much more direct, does not require any external programs.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
41 ;; Supports completion on man page names.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
42
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
43 ;; Disadvantages
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
44
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
45 ;; Not a complete emulation. Currently no support for eqn or tbl.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
46 ;; Slightly slower for large man pages (but usually faster for
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
47 ;; small- and medium-size pages).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
48
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
49 ;; This browser works quite well on simple well-written man files. It
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
50 ;; works less well on idiosyncratic files that `break the rules' or
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
51 ;; use the more obscure ?roff requests directly. Current test results
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
52 ;; are available in the file woman.status.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
53
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
54 ;; WoMan supports the use of compressed man files via
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
55 ;; `auto-compression-mode' by turning it on if necessary. But you may
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
56 ;; need to adjust the user option `woman-file-compression-regexp'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
57
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
58 ;; Read on for (currently) the only documentation for WoMan!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
59
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
60 ;; See also the documentation for the WoMan interactive commands and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
61 ;; user option variables, all of which begin with the prefix `woman-'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
62 ;; This can be done most easily by loading WoMan and then running the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
63 ;; command `woman-mini-help', or selecting the WoMan menu option `Mini
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
64 ;; Help' when WoMan is running.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
65
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
66 ;; WoMan is still under development! Please let me know what doesn't
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
67 ;; work -- I am adding and improving functionality as testing shows
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
68 ;; that it is necessary. See below for guidance on reporting bugs.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
69
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
70 ;; The latest versions of this (and related) files are available from
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
71 ;; the URL
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
72
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
73 ;; http://centaur.maths.qmw.ac.uk/Emacs/
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
74
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
75 ;; Recommended use
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
76 ;; ===============
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
77
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
78 ;; Put this in your .emacs:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
79 ;; (autoload 'woman "woman"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
80 ;; "Decode and browse a UN*X man page." t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
81 ;; (autoload 'woman-find-file "woman"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
82 ;; "Find, decode and browse a specific UN*X man-page file." t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
83
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
84 ;; Then either (1 -- *RECOMMENDED*): If the `MANPATH' environment
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
85 ;; variable is set then WoMan will use it; otherwise you may need to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
86 ;; reset the Lisp variable `woman-manpath', and you may also want to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
87 ;; set the Lisp variable `woman-path'. Please see the online
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
88 ;; documentation for these variables. Now you can execute the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
89 ;; extended command `woman', enter or select a manual entry topic,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
90 ;; using completion, and if necessary select a filename, using
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
91 ;; completion. By default, WoMan suggests the word nearest to the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
92 ;; cursor in the current buffer as the topic.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
93
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
94 ;; Or (2): Execute the extended command `woman-find-file' and enter a
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
95 ;; filename, using completion. This mode of execution may be useful
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
96 ;; for temporary files outside the standard UN*X manual directory
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
97 ;; structure.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
98
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
99 ;; Or (3): Put the next two sexpr's in your .emacs:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
100 ;; (autoload 'woman-dired-find-file "woman"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
101 ;; "In dired, run the WoMan man-page browser on this file." t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
102 ;; (add-hook 'dired-mode-hook
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
103 ;; #'(lambda ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
104 ;; (define-key dired-mode-map "W" 'woman-dired-find-file)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
105 ;; and open the directory containing the man page file using dired,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
106 ;; put the cursor on the file, and press `W'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
107
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
108 ;; In each case, the result should (!) be a buffer in Man mode showing
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
109 ;; a formatted manual entry. When called from WoMan, Man mode should
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
110 ;; work as advertised, but modified where necessary in the context of
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
111 ;; WoMan. (However, `Man' will still invoke the standard Emacs
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
112 ;; manual-browsing facility rather than `WoMan' -- this is
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
113 ;; intentional!)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
114
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
115 ;; (By default, WoMan will automatically define the dired keys "W" and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
116 ;; "w" when it loads, but only if they are not already defined. This
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
117 ;; behaviour is controlled by the user option `woman-dired-keys'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
118 ;; Note that the `dired-x' (dired extra) package binds
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
119 ;; `dired-copy-filename-as-kill' to the key "w" (as pointed out by Jim
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
120 ;; Davidson), although "W" appears to be really unused. The `dired-x'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
121 ;; package will over-write the WoMan binding to "w", whereas (by
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
122 ;; default) WoMan will not overwrite the `dired-x' binding.)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
123
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
124 ;; The following is based on suggestions by Guy Gascoigne-Piggford and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
125 ;; Juanma Barranquero. If you really want to square the man-woman
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
126 ;; circle then you might care to define the following bash function in
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
127 ;; .bashrc:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
128
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
129 ;; man() { gnudoit -q '(raise-frame (selected-frame)) (woman' \"$1\" ')' ; }
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
130
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
131 ;; If you use Microsoft COMMAND.COM then you can create a file called
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
132 ;; man.bat somewhere in your path containing the two lines:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
133
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
134 ;; @echo off
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
135 ;; gnudoit -q (raise-frame (selected-frame)) (woman \"%1\")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
136
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
137 ;; and then (e.g. from a command prompt or the Run... option in the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
138 ;; Start menu) just execute
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
139
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
140 ;; man man_page_name
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
141
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
142
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
143 ;; Using the `word at point' as a topic suggestion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
144 ;; ===============================================
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
145
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
146 ;; By default, the `woman' command uses the word nearest to point in
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
147 ;; the current buffer as a suggestion for the topic to look up. The
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
148 ;; topic must be confirmed or edited in the minibuffer. This
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
149 ;; suggestion can be turned off, or `woman' can use the suggested
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
150 ;; topic without confirmation* if possible, by setting the user-option
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
151 ;; `woman-topic-at-point' to nil or t respectively. (Its default
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
152 ;; value is neither nil nor t, meaning ask for confirmation.)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
153
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
154 ;; [* Thanks to Benjamin Riefenstahl for suggesting this
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
155 ;; functionality.]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
156
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
157 ;; The variable `woman-topic-at-point' can be rebound locally, which
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
158 ;; may be useful to provide special private key bindings, e.g.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
159
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
160 ;; (global-set-key "\C-cw"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
161 ;; #'(lambda ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
162 ;; (interactive)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
163 ;; (let ((woman-topic-at-point t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
164 ;; (woman)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
165
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
166
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
167 ;; Customization, Hooks and Imenu
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
168 ;; ==============================
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
169
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
170 ;; WoMan supports the GNU Emacs 20+ customization facility, and puts
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
171 ;; a customization group called `WoMan' in the `Help' group under the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
172 ;; top-level `Emacs' group. In order to be able to customize WoMan
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
173 ;; without first loading it, add the following sexp to your .emacs:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
174
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
175 ;; (defgroup woman nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
176 ;; "Browse UNIX manual pages `wo (without) man'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
177 ;; :tag "WoMan" :group 'help :load "woman")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
178
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
179
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
180 ;; WoMan currently runs two hooks: `woman-pre-format-hook' immediately
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
181 ;; before formatting a buffer and `woman-post-format-hook' immediately
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
182 ;; after formatting a buffer. These hooks can be used for special
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
183 ;; customizations that require code to be executed, etc., although
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
184 ;; most customization should be possible by setting WoMan user option
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
185 ;; variables, e.g. in `.emacs' and should NOT require the use of the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
186 ;; hooks. `woman-pre-format-hook' might be appropriate for face
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
187 ;; customization, whereas `woman-post-format-hook' might be
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
188 ;; appropriate for installing a dynamic menu using `imenu' (although
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
189 ;; it is better to use the built-in WoMan imenu support).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
190
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
191 ;; The WoMan menu provides an option to make a contents menu for the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
192 ;; current man page (using imenu). Alternatively, if you set the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
193 ;; variable `woman-imenu' to `t' then WoMan will do it automatically
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
194 ;; for every man page. The menu title is the value of the variable
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
195 ;; `woman-imenu-title', which is "CONTENTS" by default. By default,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
196 ;; the menu shows manual sections and subsections, but you can change
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
197 ;; this by changing the value of `woman-imenu-generic-expression'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
198 ;; This facility is not yet widely tested and may be fooled by obscure
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
199 ;; man pages that `break the rules'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
200
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
201 ;; WoMan is configured not to replace spaces in an imenu *Completion*
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
202 ;; buffer. For further documentation of the use of imenu, such as
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
203 ;; menu sorting, see the source file imenu.el, which is distributed
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
204 ;; with GNU Emacs.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
205
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
206 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
207
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
208 ;; Howard Melman made (essentially) the following suggestions, which
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
209 ;; are slightly different from the expression that I currently use.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
210 ;; You may prefer one of Howard's suggestions, which I think assume
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
211 ;; that `case-fold-search' is `t' (which it is by default):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
212
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
213 ;; (setq woman-imenu-generic-expression
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
214 ;; '((nil "^\\( \\)?\\([A-Z][A-Z ]+[A-Z]\\)[ \t]*$" 2)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
215
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
216 ;; will give support for .SH and .SS, though it won't show the heading
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
217 ;; name hierarchy. If you just want .SH in the imenu then use:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
218
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
219 ;; (setq woman-imenu-generic-expression
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
220 ;; '((nil "^\\([A-Z][A-Z ]+[A-Z]\\)[ \t]*$" 1)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
221
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
222 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
223
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
224
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
225 ;; Vertical spacing and blank lines
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
226 ;; ================================
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
227
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
228 ;; The number of consecutive blank lines in the formatted buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
229 ;; should be either 0 or 1. A blank line should leave a space like
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
230 ;; .sp 1 (p. 14). Current policy is to output vertical space only
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
231 ;; immediately before text is output.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
232
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
233
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
234 ;; Horizontal and vertical spacing and resolution
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
235 ;; ==============================================
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
236
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
237 ;; WoMan currently assumes 10 characters per inch horizontally, hence
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
238 ;; a horizontal resolution of 24 basic units, and 5 lines per inch
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
239 ;; vertically, hence a vertical resolution of 48 basic units. (nroff
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
240 ;; uses 240 per inch).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
241
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
242
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
243 ;; The *WoMan-Log* buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
244 ;; ======================
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
245
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
246 ;; This is modelled on the byte-compiler. It logs all files formatted
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
247 ;; by WoMan, and if WoMan finds anything that it cannot handle then it
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
248 ;; writes a warning to this buffer. If the variable `woman-show-log'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
249 ;; is non-nil (by default it is `nil') then WoMan automatically
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
250 ;; displays this buffer. Many WoMan warnings can be completely
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
251 ;; ignored, because they are reporting the fact that WoMan has ignored
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
252 ;; requests that it is correct to ignore. In some future version this
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
253 ;; level of paranoia will be reduced, but not until WoMan is more
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
254 ;; reliable. At present, all warnings should be treated with some
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
255 ;; suspicion. Uninterpreted escape sequences are also logged (in some
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
256 ;; cases).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
257
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
258 ;; Uninterpreted ?roff requests can optionally be left in the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
259 ;; formatted buffer to indicate precisely where they occur by
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
260 ;; resetting the variable `woman-ignore' to `nil' (by default it is
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
261 ;; `t').
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
262
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
263 ;; Automatic initiation of woman decoding
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
264
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
265 ;; (Probably not a good idea. If you use it, be careful!)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
266
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
267 ;; Put something like this in your .emacs. The call to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
268 ;; set-visited-file-name is to avoid font-locking triggered by
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
269 ;; automatic major mode selection.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
270
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
271 ;; (autoload 'woman-decode-region "woman")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
272
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
273 ;; (setq format-alist
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
274 ;; (cons
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
275 ;; '(man "UN*X man-page source format" "\\.\\(TH\\|ig\\) "
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
276 ;; woman-decode-region nil nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
277 ;; #'(lambda (arg)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
278 ;; (set-visited-file-name
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
279 ;; (file-name-sans-extension buffer-file-name)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
280 ;; format-alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
281
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
282
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
283 ;; Reporting Bugs
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
284 ;; ==============
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
285
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
286 ;; If WoMan fails completely, or formats a file incorrectly
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
287 ;; (i.e. obviously wrongly or significantly differently from man) or
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
288 ;; inelegantly, then please
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
289
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
290 ;; (a) check that you are running the latest version of woman.el
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
291 ;; available from my web site (see above),
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
292
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
293 ;; (b) check that the problem is not already described in the file
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
294 ;; woman.status, also available from my web site.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
295
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
296 ;; If both of the above are true then please email me the entry from
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
297 ;; the *WoMan-Log* buffer relating to the problem file, together with
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
298 ;; a brief description of the problem. Please indicate where you got
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
299 ;; the source file from, but do not send it to me unless I ask you to!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
300 ;; Thanks. (There is at present no automated bug-reporting facility
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
301 ;; for WoMan.)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
302
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
303 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
304
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
305 ;; NOTE:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
306
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
307 ;; CASE-DEPENDENCE OF FILENAMES. By default, WoMan ignores case in
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
308 ;; file pathnames only when it seems appropriate. MS-Windows users
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
309 ;; who want complete case independence should set the NTEmacs variable
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
310 ;; `w32-downcase-file-names' to `t' and use all lower case when
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
311 ;; setting WoMan file paths.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
312
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
313 ;; (1) INCOMPATIBLE CHANGE! WoMan no longer uses a persistent topic
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
314 ;; cache by default. (It caused too much confusion!) Explicitly set
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
315 ;; the variable `woman-cache-filename' to save the cache between Emacs
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
316 ;; sessions. This is recommended only if the command `woman' is too
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
317 ;; slow the first time that it is run in an Emacs session, while it
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
318 ;; builds its cache in main memory, which MAY be VERY slow.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
319
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
320 ;; (2) The user option `woman-cache-level' controls the amount of
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
321 ;; information cached (in main memory and, optionally, saved to disc).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
322
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
323 ;; (3) UPDATING THE CACHE. A prefix argument always causes the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
324 ;; `woman' command (only) to rebuild its topic cache, and to re-save
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
325 ;; it to `woman-cache-filename' if this variable has a non-nil value.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
326 ;; This is necessary if the NAMES (not contents) of any of the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
327 ;; directories or files in the paths specified by `woman-manpath' or
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
328 ;; `woman-path' change. If WoMan user options that affect the cache
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
329 ;; are changed then WoMan will automatically update its cache file on
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
330 ;; disc (if one is in use) the next time it is run in a new Emacs
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
331 ;; session.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
332
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
333 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
334
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
335
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
336 ;; TO DO
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
337 ;; =====
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
338
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
339 ;; MUST PROCESS .if, .nr IN ORDER ENCOUNTERED IN FILE! (rcsfile, mf).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
340 ;; Allow general delimiter in `\v', cf. `\h'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
341 ;; Improve major-mode documentation.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
342 ;; Pre-process conditionals in macro bodies if possible for speed?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
343 ;; Emulate some preprocessor support for tbl (.TS/.TE) and eqn (.EQ/.EN)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
344 ;; Re-write filling and adjusting code!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
345 ;; Allow word wrap at comma (for long option lists)?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
346 ;; Buffer list handling not quite right.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
347 ;; Make 10 or 12 pitch (cpi) optional -- 12 => ll = 78
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
348 ;; Use unpaddable space for tabbing?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
349 ;; Tidy up handling of fonts when filling and adjusting
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
350 ;; -- see text/text properties?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
351 ;; Improve speed
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
352 ;; Add font-lock support (for quoted strings, etc.)?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
353 ;; Optionally save large files in enriched format?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
354 ;; Add apropos facility by searching NAME (?) entry in man files?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
355 ;; Documentation -- optional auto-display of formatted WoMan man page?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
356 ;; Implement a bug reporter?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
357 ;; Support diversion and traps (to some extent) - for Tcl/tk pages?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
358 ;; Add a menu of WoMan buffers?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
359
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
360
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
361 ;; Implementation strategy [this description is now well out of date!]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
362 ;; -- three main passes, each to process respectively:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
363
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
364 ;; 1) non-breaking `.' requests including font macros
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
365 ;; 2) \ escape sequences, mainly special characters and font changes
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
366 ;; 3) breaking `.' requests, mainly filling and justification
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
367
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
368 ;; For each pass, a control function finds and pre-processes the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
369 ;; escape or request and then calls the appropriate function to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
370 ;; perform the required formatting. Based originally on enriched.el
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
371 ;; and format.el.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
372
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
373 ;; See also /usr/local/share/groff/tmac/tmac.an
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
374
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
375
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
376 ;; Acknowledgements
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
377 ;; ================
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
378
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
379 ;; For Heather, Kathryn and Madelyn, the women in my life
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
380 ;; (although they will probably never use it)!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
381
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
382 ;; I also thank the following for helpful suggestions, bug reports,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
383 ;; code fragments, general interest, etc.:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
384 ;; Jari Aalto <jari.aalto@cs.tpu.fi>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
385 ;; Dean Andrews <dean@dra.com>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
386 ;; Juanma Barranquero <barranquero@laley-actualidad.es>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
387 ;; Karl Berry <kb@cs.umb.edu>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
388 ;; Jim Chapman <jchapman@netcomuk.co.uk>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
389 ;; Frederic Corne <frederic.corne@erli.fr>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
390 ;; Peter Craft <craft@alacritech.com>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
391 ;; Charles Curley <ccurley@trib.com>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
392 ;; Jim Davidson <jdavidso@teknowledge.com>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
393 ;; Kevin D'Elia <Kevin.DElia@mci.com>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
394 ;; John Fitch <jpff@maths.bath.ac.uk>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
395 ;; Hans Frosch <jwfrosch@rish.b17c.ingr.com>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
396 ;; Guy Gascoigne-Piggford <ggp@informix.com>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
397 ;; Brian Gorka <gorkab@sanchez.com>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
398 ;; Nicolai Henriksen <nhe@lyngso-industri.dk>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
399 ;; Thomas Herchenroeder <the@software-ag.de>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
400 ;; Alexander Hinds <ahinds@thegrid.net>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
401 ;; Stefan Hornburg <sth@hacon.de>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
402 ;; Theodore Jump <tjump@cais.com>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
403 ;; Paul Kinnucan <paulk@mathworks.com>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
404 ;; Jonas Linde <jonas@init.se>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
405 ;; Andrew McRae <andrewm@optimation.co.nz>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
406 ;; Howard Melman <howard@silverstream.com>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
407 ;; Dennis Pixton <dennis@math.binghamton.edu>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
408 ;; T. V. Raman <raman@Adobe.COM>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
409 ;; Bruce Ravel <bruce.ravel@nist.gov>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
410 ;; Benjamin Riefenstahl <benny@crocodial.de>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
411 ;; Kevin Ruland <kruland@seistl.com>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
412 ;; Tom Schutter <tom@platte.com>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
413 ;; Wei-Xue Shi <wxshi@ma.neweb.ne.jp>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
414 ;; Fabio Somenzi <fabio@joplin.colorado.edu>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
415 ;; Karel Sprenger <ks@ic.uva.nl>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
416 ;; Chris Szurgot <szurgot@itribe.net>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
417 ;; Paul A. Thompson <pat@po.cwru.edu>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
418 ;; Geoff Voelker <voelker@cs.washington.edu>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
419
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
420 (defconst woman-version "0.52 (beta), Time-stamp: <09 January 2000>"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
421 "WoMan version information.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
422
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
423 ;; $Id: woman.el,v 1.26 2000-01-09 09:44:25+00 fjw Rel $
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
424
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
425 ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
426 ;; Changes in version 0.52 ([*] => user interface change)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
427 ;; Speeded up handling of underlined faces (mainly for "italics").
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
428 ;; [*] WoMan formatting time display and log added. Emacs `man'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
429 ;; formatting time display advice added. (This suggests that
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
430 ;; WoMan formatting is faster than Emacs `man' *formatting*,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
431 ;; i.e. when man is not using `catman' caching. E.g. `woman
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
432 ;; bash' takes 27s whereas `man bash' takes 35s and for smaller
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
433 ;; files `woman' can be relatively much faster than `man'.)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
434 ;; [*] Experimental support for non-ASCII characters from the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
435 ;; default and symbol fonts added, initially only for MS-Windows.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
436 ;; NOTE: It is off by default, mainly because it may increase the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
437 ;; line spacing; customize `woman-use-symbols' to `on' to use it.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
438 ;; Pad character handling for .fc fixed.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
439 ;; Tested: see `woman.status'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
440
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
441 ;; Changes in version 0.51 ([*] => user interface change)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
442 ;; [*] Improved handling of underlined faces (mainly for "italics").
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
443 ;; [*] Allow environment variables in directory path elements.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
444 ;; Display of pre-formatted files improved.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
445 ;; [*] Unintentional interaction with standard Man mode reduced.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
446 ;; [*] bzip2 decompression support added. All decompression now
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
447 ;; works by turning on `auto-compression-mode' to decompress the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
448 ;; file if necessary, rather than decompressing explicitly.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
449 ;; Filename and compression regexps are now customizable user
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
450 ;; options.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
451
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
452 ;; Changes in version 0.50 ([*] => user interface change)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
453 ;; [*] Requires GNU Emacs 20.3+.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
454 ;; [*] `defface' used to define faces.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
455 ;; [*] Follow `see also' references with mouse-2 click.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
456 ;; Number register increment support added (woman-registers).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
457 ;; .j must be a NUMBER acceptable by .ad request.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
458 ;; Very crude field support added.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
459 ;; Vertical unit specifier `v' added to register handling.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
460 ;; Improvement to local horizontal motion processing.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
461 ;; Minor fix to handle negative numeric arguments.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
462 ;; Handle horizontal motion escapes `\h' better.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
463 ;; Allow arbitrary delimiters in `.if', inc. special character escapes.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
464 ;; Allow `\n' within `.if' string comparisons.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
465 ;; Allow arbitrary delimiters in `\w', inc. special character escapes.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
466 ;; Processing of `\h' moved much later -- after indenting etc!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
467 ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
468
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
469
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
470 ;;; Code:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
471
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
472 (require 'man)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
473 (eval-when-compile ; to avoid compiler warnings
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
474 (require 'dired)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
475 (require 'apropos))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
476
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
477 (defun woman-parse-colon-path (cd-path)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
478 "Explode a search path CD-PATH into a list of directory names.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
479 If the platform is MS-DOS/MS-Windows and any path begins with `//',
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
480 assume a Cygwin-style colon-separated search path and convert any
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
481 leading drive specifier `//X/' to `X:', otherwise assume paths
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
482 separated by `path-separator'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
483 ;; Based on a suggestion by Jari Aalto.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
484 (if (and (memq system-type '(ms-dos windows-nt))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
485 (or (string-match "://" cd-path)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
486 (and (not (string-match ":" cd-path))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
487 (string-match "\\`//" cd-path))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
488 (let ((path-separator ":"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
489 (mapcar
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
490 (function
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
491 (lambda (path) ; //a/b -> a:/b
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
492 (cond ((string-match "\\`//" path)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
493 (setq path (substring path 1)) ; //a/b -> /a/b
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
494 (aset path 0 (aref path 1)) ; /a/b -> aa/b
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
495 (aset path 1 ?:) ; aa/b -> a:/b
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
496 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
497 path))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
498 (parse-colon-path cd-path)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
499 (parse-colon-path cd-path)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
500
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
501
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
502 ;;; User options:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
503
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
504 ;; NB: Group identifiers must be lowercase!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
505
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
506 (defgroup woman nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
507 "Browse UNIX manual pages `wo (without) man'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
508 :tag "WoMan"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
509 :group 'help)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
510
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
511 (defcustom woman-show-log nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
512 "*If non-nil then show the *WoMan-Log* buffer if appropriate.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
513 I.e. if any warning messages are written to it. Default is nil."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
514 :type 'boolean
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
515 :group 'woman)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
516
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
517 (defcustom woman-pre-format-hook nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
518 "*Hook run by WoMan immediately before formatting a buffer.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
519 Change only via `Customization' or the function `add-hook'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
520 :type 'hook
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
521 :group 'woman)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
522
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
523 (defcustom woman-post-format-hook nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
524 "*Hook run by WoMan immediately after formatting a buffer.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
525 Change only via `Customization' or the function `add-hook'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
526 :type 'hook
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
527 :group 'woman)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
528
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
529
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
530 ;; Interface options
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
531
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
532 (defgroup woman-interface nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
533 "Interface options for browsing UNIX manual pages `wo (without) man'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
534 :tag "WoMan Interface"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
535 :group 'woman)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
536
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
537 (defcustom woman-manpath
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
538 (let ((manpath (getenv "MANPATH")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
539 (if manpath
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
540 (woman-parse-colon-path manpath)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
541 ;; NB: `parse-colon-path' creates null elements for redundant
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
542 ;; (semi-)colons and trailing `/'s!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
543 '("/usr/man" "/usr/local/man")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
544 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
545 "*List of DIRECTORY TREES to search for UN*X manual files.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
546 Each element should be the name of a directory that contains
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
547 subdirectories of the form `man?', or more precisely subdirectories
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
548 selected by the value of `woman-manpath-man-regexp'. Non-directory
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
549 and unreadable files are ignored. The default value of this variable
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
550 is based on the UN*X MANPATH environment variable if set, otherwise
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
551
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
552 (\"/usr/man\" \"/usr/local/man\").
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
553
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
554 Any environment variables (which must have the UN*X-style form $NAME,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
555 e.g. $HOME, $EMACSDATA, $EMACS_DIR) are evaluated first but each
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
556 element must evaluate to a SINGLE directory name. Trailing `/'s are
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
557 ignored. (Specific directories in `woman-path' are also searched.)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
558
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
559 Microsoft platforms:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
560 I recommend including drive letters explicitly, e.g.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
561
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
562 (\"C:/Cygnus/cygwin-b20/man\" \"C:/usr/man\" \"C:/usr/local/man\").
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
563
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
564 The MANPATH environment variable may be set using DOS semi-colon-
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
565 separated or UN*X / Cygwin colon-separated syntax (but not mixed)."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
566 :type '(repeat string)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
567 :group 'woman-interface)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
568
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
569 (defcustom woman-manpath-man-regexp "[Mm][Aa][Nn]"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
570 "Regexp to match man directories UNDER `woman-manpath' directories.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
571 These normally have names of the form `man?'. Its default value is
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
572 \"[Mm][Aa][Nn]\", which is case-insensitive mainly for the benefit of
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
573 Microsoft platforms. Its purpose is to avoid `cat?', `.', `..', etc."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
574 ;; Based on a suggestion by Wei-Xue Shi.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
575 :type 'string
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
576 :group 'woman-interface)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
577
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
578 (defcustom woman-path
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
579 (if (eq system-type 'ms-dos) '("$DJDIR/info" "$DJDIR/man/cat[1-9onlp]"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
580 "*List of SPECIFIC DIRECTORIES to search for UN*X manual files.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
581 For example
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
582
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
583 (\"/emacs/etc\").
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
584
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
585 These directories are searched in addition to the directory trees
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
586 specified in `woman-manpath'. Each element should be a directory
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
587 string or nil, which represents the current directory when the path is
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
588 expanded and cached. However, the last component (only) of each
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
589 directory string is treated as a regexp \(Emacs, not shell) and the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
590 string is expanded into a list of matching directories. Non-directory
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
591 and unreadable files are ignored. The default value is nil.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
592
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
593 Any environment variables (which must have the UN*X-style form $NAME,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
594 e.g. $HOME, $EMACSDATA, $EMACS_DIR) are evaluated first but each
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
595 element must evaluate to a SINGLE directory name (regexp, see above).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
596 For example
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
597
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
598 (\"$EMACSDATA\") [or equivalently (\"$EMACS_DIR/etc\")].
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
599
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
600 Trailing `/'s are discarded. (The directory trees in `woman-manpath'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
601 are also searched.) On Microsoft platforms I recommend including
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
602 drive letters explicitly."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
603 :type '(repeat (choice string (const nil)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
604 :group 'woman-interface)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
605
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
606 (defcustom woman-cache-level 2
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
607 "*The level of topic caching.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
608 1 - cache only the topic and directory lists
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
609 (the only level before version 0.34 - only for compatibility);
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
610 2 - cache also the directories for each topic
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
611 (faster, without using much more memory);
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
612 3 - cache also the actual filenames for each topic
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
613 (fastest, but uses twice as much memory).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
614 The default value is currently 2, a good general compromise.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
615 If the `woman' command is slow to find files then try 3, which may be
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
616 particularly beneficial with large remote-mounted man directories.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
617 Run the `woman' command with a prefix argument or delete the cache
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
618 file `woman-cache-filename' for a change to take effect.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
619 \(Values < 1 behave like 1; values > 3 behave like 3.)"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
620 :type '(choice (const :tag "Minimal" 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
621 (const :tag "Default" 2)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
622 (const :tag "Maximal" 3))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
623 :group 'woman-interface)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
624
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
625 (defcustom woman-cache-filename nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
626 "*The full pathname of the WoMan directory and topic cache file.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
627 It is used to save and restore the cache between sessions. This is
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
628 especially useful with remote-mounted man page files! The default
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
629 value of nil suppresses this action. The `standard' non-nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
630 filename is \"~/.wmncach.el\". Remember that a prefix argument forces
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
631 the `woman' command to update and re-write the cache."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
632 :type '(choice (const :tag "None" nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
633 (const :tag "~/.wmncach.el" "~/.wmncach.el")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
634 file)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
635 :group 'woman-interface)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
636
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
637 (defcustom woman-dired-keys t
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
638 "*List of `dired' mode keys to define to run WoMan on current file.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
639 E.g. '(\"w\" \"W\"), or any non-null atom to automatically define
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
640 \"w\" and \"W\" if they are unbound, or nil to do nothing.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
641 Default is t."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
642 :type '(choice (const :tag "None" nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
643 (repeat string)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
644 (other :tag "Auto" t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
645 :group 'woman-interface)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
646
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
647 (defcustom woman-imenu-generic-expression
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
648 '((nil "\n\\([A-Z].*\\)" 1) ; SECTION, but not TITLE
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
649 ("*Subsections*" "^ \\([A-Z].*\\)" 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
650 "*Imenu support for Sections and Subsections.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
651 An alist with elements of the form (MENU-TITLE REGEXP INDEX) --
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
652 see the documentation for `imenu-generic-expression'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
653 :type 'sexp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
654 :group 'woman-interface)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
655
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
656 (defcustom woman-imenu nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
657 "*If non-nil, WoMan adds a Contents menu to the menubar.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
658 WoMan adds the Contents menu by calling `imenu-add-to-menubar'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
659 Default is nil."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
660 :type 'boolean
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
661 :group 'woman-interface)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
662
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
663 (defcustom woman-imenu-title "CONTENTS"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
664 "*The title to use if WoMan adds a Contents menu to the menubar.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
665 Default is \"CONTENTS\"."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
666 :type 'string
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
667 :group 'woman-interface)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
668
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
669 (defcustom woman-topic-at-point-default 'confirm
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
670 ;; `woman-topic-at-point' may be let-bound when woman is loaded, in
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
671 ;; which case its global value does not get defined.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
672 ;; `woman-file-name' sets it to this value if it is unbound.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
673 "*Default value for `woman-topic-at-point'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
674 :type '(choice (const :tag "Yes" t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
675 (const :tag "No" nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
676 (other :tag "Confirm" confirm))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
677 :group 'woman-interface)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
678
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
679 (defcustom woman-topic-at-point woman-topic-at-point-default
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
680 "*Controls use by `woman' of `word at point' as a topic suggestion.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
681 If non-nil then the `woman' command uses the word at point as an
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
682 initial topic suggestion when it reads a topic from the minibuffer; if
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
683 t then the `woman' command uses the word at point WITHOUT
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
684 INTERACTIVE CONFIRMATION if it exists as a topic. The default value
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
685 is `confirm', meaning suggest a topic and ask for confirmation."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
686 :type '(choice (const :tag "Yes" t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
687 (const :tag "No" nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
688 (other :tag "Confirm" confirm))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
689 :group 'woman-interface)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
690
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
691 (defvar woman-file-regexp nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
692 "Regexp used to select (possibly compressed) man source files, e.g.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
693 \"\\.\\([0-9lmnt]\\w*\\)\\(\\.\\(g?z\\|bz2\\)\\)?\\'\".
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
694 Built automatically from the customizable user options
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
695 `woman-uncompressed-file-regexp' and `woman-file-compression-regexp'.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
696
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
697 (defvar woman-uncompressed-file-regexp) ; for the compiler
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
698 (defvar woman-file-compression-regexp) ; for the compiler
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
699
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
700 (defun set-woman-file-regexp (symbol value)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
701 "Bind SYMBOL to VALUE and set `woman-file-regexp' as per user customizations.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
702 Used as :set cookie by Customize when user customized the user options
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
703 `woman-uncompressed-file-regexp' and `woman-file-compression-regexp'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
704 (set-default symbol value)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
705 (and (boundp 'woman-uncompressed-file-regexp)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
706 (boundp 'woman-file-compression-regexp)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
707 (setq woman-file-regexp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
708 (concat woman-uncompressed-file-regexp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
709 "\\("
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
710 (substring woman-file-compression-regexp 0 -2)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
711 "\\)?\\'"))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
712
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
713 (defcustom woman-uncompressed-file-regexp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
714 "\\.\\([0-9lmnt]\\w*\\)" ; disallow no extension
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
715 "*Do not change this unless you are sure you know what you are doing!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
716 Regexp used to select man source files (ignoring any compression extension).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
717
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
718 The SysV standard man pages use two character suffixes, and this is
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
719 becoming more common in the GNU world. For example, the man pages
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
720 in the ncurses package include `toe.1m', `form.3x', etc.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
721
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
722 Note: an optional compression regexp will be appended, so this regexp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
723 MUST NOT end with any kind of string terminator such as $ or \\'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
724 :type 'regexp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
725 :set 'set-woman-file-regexp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
726 :group 'woman-interface)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
727
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
728 (defcustom woman-file-compression-regexp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
729 "\\.\\(g?z\\|bz2\\)\\'"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
730 "*Do not change this unless you are sure you know what you are doing!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
731 Regexp used to match compressed man file extensions for which
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
732 decompressors are available and handled by function `auto-compression-mode',
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
733 e.g. \"\\\\.\\\\(g?z\\\\|bz2\\\\)\\\\'\" for `gzip' or `bzip2'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
734 Should begin with \\. and end with \\' and MUST NOT be optional."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
735 :type 'regexp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
736 :set 'set-woman-file-regexp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
737 :group 'woman-interface)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
738
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
739
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
740 ;; Formatting options
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
741
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
742 (defgroup woman-formatting nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
743 "Formatting options for browsing UNIX manual pages `wo (without) man'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
744 :tag "WoMan Formatting"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
745 :group 'woman)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
746
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
747 (defcustom woman-fill-column 65
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
748 "*Right margin for formatted text -- default is 65."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
749 :type 'integer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
750 :group 'woman-formatting)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
751
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
752 (defcustom woman-fill-frame nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
753 ;; Based loosely on a suggestion by Theodore Jump:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
754 "*If non-nil then most of the frame width is used."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
755 :type 'boolean
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
756 :group 'woman-formatting)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
757
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
758 (defcustom woman-default-indent 5
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
759 "*Default prevailing indent set by -man macros -- default is 5.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
760 Set this variable to 7 to emulate Linux man formatting."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
761 :type 'integer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
762 :group 'woman-formatting)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
763
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
764 (defcustom woman-bold-headings t
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
765 "*If non-nil then embolden section and subsection headings. Default is t.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
766 Heading emboldening is NOT standard `man' behaviour."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
767 :type 'boolean
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
768 :group 'woman-formatting)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
769
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
770 (defcustom woman-ignore t
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
771 "*If non-nil then unrecognised requests are ignored. Default is t.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
772 This gives the standard ?roff behaviour. If nil then they are left in
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
773 the buffer, which may aid debugging."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
774 :type 'boolean
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
775 :group 'woman-formatting)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
776
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
777 (defcustom woman-preserve-ascii nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
778 "*If non-nil then preserve ASCII characters in the WoMan buffer.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
779 Otherwise, non-ASCII characters (that display as ASCII) may remain.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
780 This is irrelevant unless the buffer is to be saved to a file."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
781 :type 'boolean
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
782 :group 'woman-formatting)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
783
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
784
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
785 ;; Faces:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
786
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
787 (defgroup woman-faces nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
788 "Face options for browsing UNIX manual pages `wo (without) man'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
789 :tag "WoMan Faces"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
790 :group 'woman
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
791 :group 'faces)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
792
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
793 (defcustom woman-fontify
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
794 (or (and (fboundp 'display-color-p) (display-color-p))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
795 (and (fboundp 'display-graphic-p) (display-graphic-p))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
796 (x-display-color-p))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
797 "*If non-nil then WoMan assumes that face support is available.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
798 It defaults to a non-nil value if the display supports either colors
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
799 or different fonts."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
800 :type 'boolean
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
801 :group 'woman-faces)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
802
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
803 (defface woman-italic-face
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
804 `((t (:italic t :underline t :foreground "red")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
805 "Face for italic font in man pages.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
806 Default: italic, underlined, foreground red.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
807 This is overkill! Troff uses just italic\; Nroff uses just underline.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
808 You should probably select either italic or underline as you prefer,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
809 but not both, although italic and underline work together perfectly well!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
810 :group 'woman-faces)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
811
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
812 (defface woman-bold-face
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
813 '((t (:bold t :foreground "blue")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
814 "Face for bold font in man pages.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
815 Default: bold, foreground blue."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
816 :group 'woman-faces)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
817
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
818 (defface woman-unknown-face
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
819 '((t (:foreground "brown")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
820 "Face for all unknown fonts in man pages.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
821 Default: foreground brown.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
822 Brown is a good compromise: it is distinguishable from the default but
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
823 not enough so to make font errors look terrible. (Files that use
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
824 non-standard fonts seem to do so badly or in idiosyncratic ways!)"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
825 :group 'woman-faces)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
826
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
827 (defface woman-addition-face
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
828 '((t (:foreground "orange")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
829 "Face for all additions made by WoMan to man pages.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
830 Default: foreground orange."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
831 :group 'woman-faces)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
832
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
833 (defun woman-colour-faces ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
834 "Set foreground colours of italic and bold faces to red and blue."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
835 (interactive)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
836 (set-face-foreground 'woman-italic-face "Red")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
837 (set-face-foreground 'woman-bold-face "Blue"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
838
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
839 (defun woman-black-faces ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
840 "Set foreground colours of italic and bold faces both to black."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
841 (interactive)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
842 (set-face-foreground 'woman-italic-face "Black")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
843 (set-face-foreground 'woman-bold-face "Black"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
844
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
845 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
846 ;; Experimental symbol font support, initially only for MS-Windows.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
847 (eval-when-compile
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
848 (defvar woman-symbol-font)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
849 (defvar woman-use-symbols))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
850
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
851 (when (and window-system (eq system-type 'windows-nt))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
852 (make-face 'woman-symbol-face)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
853
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
854 ;; Set up the symbol font only if `woman-use-symbols' is true, to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
855 ;; avoid unnecessarily upsetting the line spacing in NTEmacs 20.5!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
856
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
857 (defcustom woman-use-symbols nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
858 "*If non-nil then may use symbol font and non-ASCII characters
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
859 from the default font for special characters. It is off by default,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
860 mainly because it may increase the line spacing in NTEmacs 20.5."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
861 :type 'boolean
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
862 :set #'(lambda (symbol value)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
863 (set-default symbol value)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
864 (if (and (boundp 'woman-symbol-font)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
865 (stringp woman-symbol-font))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
866 (set-face-font 'woman-symbol-face woman-symbol-font)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
867 :group 'woman-faces)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
868
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
869 (defconst woman-symbol-font-list
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
870 (let ((fonts (x-list-fonts "*" 'default))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
871 symbol-fonts)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
872 ;; With NTEmacs 20.5, the PATTERN option to `x-list-fonts' does
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
873 ;; not seem to work and fonts may be repeated, so ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
874 (while fonts
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
875 (and (string-match "-Symbol-" (car fonts))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
876 (not (member (car fonts) symbol-fonts))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
877 (setq symbol-fonts (cons (car fonts) symbol-fonts)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
878 (setq fonts (cdr fonts)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
879 symbol-fonts)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
880 "Symbol fonts in the same size as the default font when WoMan was loaded.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
881
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
882 (defcustom woman-symbol-font (car woman-symbol-font-list)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
883 "*A string describing the symbol font to use for special characters.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
884 It should be compatible with, and the same size as, the default text font.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
885 Under MS-Windows, the default is
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
886 \"-*-Symbol-normal-r-*-*-*-*-96-96-p-*-ms-symbol\"."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
887 :type `(choice
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
888 ,@(mapcar #'(lambda (x) (list 'const x))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
889 woman-symbol-font-list)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
890 string)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
891 :set #'(lambda (symbol value)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
892 (set-default symbol value)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
893 (if woman-use-symbols
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
894 (set-face-font 'woman-symbol-face value)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
895 :group 'woman-faces)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
896
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
897 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
898
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
899 (defvar woman-use-symbols nil) ; for non windows-nt
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
900 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
901
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
902
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
903 ;;; Internal variables:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
904
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
905 (defconst woman-justify-list
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
906 '(left right center full)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
907 "Justify styles for `fill-region-as-paragraph'.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
908 (defconst woman-adjust-left 0 ; == adjust off, noadjust
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
909 "Adjustment indicator `l' -- adjust left margin only.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
910 (defconst woman-adjust-right 1
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
911 "Adjustment indicator `r' -- adjust right margin only.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
912 (defconst woman-adjust-center 2
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
913 "Adjustment indicator `c' -- center.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
914 (defconst woman-adjust-both 3 ; default -- adj,both
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
915 "Adjustment indicator `b' or `n' -- adjust both margins.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
916
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
917 (defvar woman-adjust woman-adjust-both
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
918 "Current adjustment number-register value.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
919 (defvar woman-adjust-previous woman-adjust
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
920 "Previous adjustment number-register value.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
921 (defvar woman-justify
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
922 (nth woman-adjust woman-justify-list) ; use vector?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
923 "Current justification style for `fill-region-as-paragraph'.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
924 (defvar woman-justify-previous woman-justify
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
925 "Previous justification style for `fill-region-as-paragraph'.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
926
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
927 (defvar woman-left-margin woman-default-indent
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
928 "Current left margin.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
929 (defvar woman-prevailing-indent woman-default-indent
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
930 "Current prevailing indent.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
931 (defvar woman-interparagraph-distance 1
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
932 "Interparagraph distance in lines.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
933 Set by .PD; used by .SH, .SS, .TP, .LP, .PP, .P, .IP, .HP.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
934 (defvar woman-leave-blank-lines nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
935 "Blank lines to leave as vertical space.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
936 (defconst woman-tab-width 5
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
937 "Default tab width set by -man macros.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
938 (defvar woman-nofill nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
939 "Current fill mode: nil for filling.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
940 (defvar woman-RS-left-margin nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
941 "Left margin stack for nested use of `.RS/.RE'.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
942 (defvar woman-RS-prevailing-indent nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
943 "Prevailing indent stack for nested use of `.RS/.RE'.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
944 (defvar woman-nospace nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
945 "Current no-space mode: nil for normal spacing.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
946 Set by `.ns' request; reset by any output or `.rs' request")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
947
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
948 (defsubst woman-reset-nospace ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
949 "Make woman-nospace be nil."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
950 (setq woman-nospace nil))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
951
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
952 (defconst woman-mode-line-format
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
953 ;; This is essentially the Man-mode format with page numbers removed
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
954 ;; and line numbers added. (Online documents do not have pages, but
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
955 ;; they do have lines!)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
956 '("-" mode-line-mule-info mode-line-modified
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
957 mode-line-frame-identification mode-line-buffer-identification
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
958 " " global-mode-string
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
959 " %[(WoMan" mode-line-process minor-mode-alist ")%]--"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
960 (line-number-mode "L%l--")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
961 (-3 . "%p") "-%-")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
962 "Mode line format for WoMan buffer.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
963
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
964 (defconst woman-request-regexp "^[.'][ \t]*\\(\\S +\\) *"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
965 ;; Was "^\\.[ \t]*\\([a-z0-9]+\\) *" but cvs.1 uses a macro named
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
966 ;; "`" and CGI.man uses a macro named "''"!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
967 ;; CGI.man uses ' as control character in places -- it *should*
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
968 ;; suppress breaks!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
969 ;; Could end with "\\( +\\|$\\)" instead of " *"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
970 "Regexp to match a ?roff request plus trailing white space.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
971
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
972 (defvar woman-imenu-done nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
973 "Buffer-local: set to true if `woman-imenu' has been called.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
974 (make-variable-buffer-local 'woman-imenu-done)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
975
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
976 ;; From imenu.el -- needed when reformatting a file in its old buffer.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
977 ;; The latest buffer index used to update the menu bar menu.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
978 (eval-when-compile
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
979 (require 'imenu))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
980 (make-variable-buffer-local 'imenu--last-menubar-index-alist)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
981
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
982 (defvar woman-buffer-alist nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
983 "An alist of WoMan buffers that are already decoded.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
984 Each element is of the form (FILE-NAME BUFFER-NAME).")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
985
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
986 (defvar woman-buffer-number 0
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
987 "Ordinal number of current buffer entry in `woman-buffer-alist'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
988 The ordinal numbers start from 0.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
989
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
990
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
991 ;;; Specialized utility functions:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
992
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
993 ;;; Fast deletion without saving on the kill ring (cf. simple.el):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
994
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
995 (defun woman-delete-line (&optional arg)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
996 "Delete the rest of the current line; if all-blank line, delete thru newline.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
997 With a numeric argument ARG, delete that many lines from point.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
998 Negative arguments delete lines backward."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
999 ;; This is a non-interactive version of kill-line in simple.el that
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1000 ;; deletes instead of killing and assumes kill-whole-line is nil,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1001 ;; which is essential!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1002 (delete-region (point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1003 (progn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1004 (if arg
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1005 (forward-line arg)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1006 (if (eobp)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1007 (signal 'end-of-buffer nil))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1008 (if (looking-at "[ \t]*$")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1009 (forward-line 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1010 (end-of-line)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1011 (point))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1012
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1013 (defsubst woman-delete-whole-line ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1014 "Delete current line from beginning including eol."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1015 (beginning-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1016 (woman-delete-line 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1017
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1018 (defsubst woman-delete-following-space ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1019 "Delete all spaces and tabs FOLLOWING point (cf. `delete-horizontal-space')."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1020 ;; cf. delete-horizontal-space in simple.el:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1021 (delete-region (point) (progn (skip-chars-forward " \t") (point))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1022
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1023 (defsubst woman-delete-match (subexp)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1024 "Delete subexpression SUBEXP of buffer text matched by last search."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1025 (delete-region (match-beginning subexp) (match-end subexp)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1026
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1027 ;; delete-char does not kill by default
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1028 ;; delete-backward-char does not kill by default
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1029 ;; delete-horizontal-space does not kill
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1030 ;; delete-blank-lines does not kill
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1031
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1032
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1033 ;;; File handling:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1034
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1035 (defvar woman-expanded-directory-path nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1036 "Expanded directory list cache. Resetting to nil forces update.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1037
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1038 (defvar woman-topic-all-completions nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1039 "Expanded topic alist cache. Resetting to nil forces update.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1040
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1041 ;;;###autoload
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1042 (defun woman (&optional topic re-cache)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1043 "Browse a UN*X man page for TOPIC WithOut using a `man' program.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1044 The major browsing mode used is essentially the standard Man mode.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1045 Choose the filename for the man page using completion, based on the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1046 topic selected from the directories specified in `woman-manpath' and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1047 `woman-path'. The directory expansions and topics are cached for
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1048 speed, but a non-nil interactive argument forces the caches to be
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1049 updated (e.g. to re-interpret the current directory).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1050
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1051 Used non-interactively, arguments are optional: if they are given then
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1052 the argument TOPIC should be a topic string and the RE-CACHE may be
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1053 non-nil to force re-caching."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1054 (interactive (list nil current-prefix-arg))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1055 ;; The following test is for non-interactive calls via gnudoit etc.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1056 (if (or (interactive-p) (not (stringp topic)) (string-match "\\S " topic))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1057 (let ((file-name (woman-file-name topic re-cache)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1058 (if file-name
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1059 (woman-find-file file-name)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1060 (message
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1061 "WoMan Error: No matching manual files found in search path")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1062 (ding))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1063 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1064 (message "WoMan Error: No topic specified in non-interactive call")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1065 (ding))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1066 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1067
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1068 ;; The following allows to call WoMan via the standard Help menu
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1069 ;; without the need to call it first via the keyboard:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1070
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1071 ;; Repeated calls of `define-key-after' do not seem to matter!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1072 (define-key-after menu-bar-manuals-menu [woman]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1073 '(menu-item "Read Man Page (WoMan)..." woman
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1074 :help "Man-page documentation Without Man") t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1075
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1076 (defvar woman-cached-data nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1077 "A list of cached data used to determine cache validity.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1078 Set from the cache by `woman-read-directory-cache'.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1079
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1080 (defun woman-cached-data ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1081 "Generate a list of data used to determine cache validity.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1082 Called both to generate and to check the cache!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1083 ;; Must use substituted paths because values of env vars may change!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1084 (list woman-cache-level
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1085 (mapcar 'substitute-in-file-name woman-manpath)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1086 (mapcar 'substitute-in-file-name woman-path)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1087
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1088 (defun woman-read-directory-cache ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1089 "Load the directory and topic cache.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1090 The cache is loaded from the file named precisely as specified by the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1091 variable `woman-cache-filename'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1092 Value is t if the file exists, nil otherwise."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1093 (and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1094 woman-cache-filename
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1095 (load woman-cache-filename t nil t) ; file exists
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1096 (equal woman-cached-data (woman-cached-data)))) ; cache valid
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1097
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1098 (defun woman-write-directory-cache ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1099 "Save the directory and topic cache.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1100 The directory and topic cache is written to the file named precisely as
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1101 specified by the variable `woman-cache-filename'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1102 (if woman-cache-filename
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1103 (save-excursion ; to restore current buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1104 ;; Make a temporary buffer; name starting with space "hides" it.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1105 (let ((standard-output
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1106 (set-buffer (generate-new-buffer "WoMan tmp buffer")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1107 (backup-inhibited t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1108 ;; (switch-to-buffer standard-output t) ; only for debugging
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1109 (buffer-disable-undo standard-output)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1110 (princ
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1111 ";;; WoMan directory and topic cache -- generated automatically\n")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1112 (print
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1113 ;; For data validity check:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1114 `(setq woman-cached-data ',(woman-cached-data)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1115 (print
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1116 `(setq woman-expanded-directory-path
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1117 ',woman-expanded-directory-path))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1118 (print
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1119 `(setq woman-topic-all-completions
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1120 ',woman-topic-all-completions))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1121 (write-file woman-cache-filename) ; write CURRENT buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1122 (kill-buffer standard-output)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1123 ))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1124
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1125 (defvar woman-topic-history nil "Topic read history.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1126 (defvar woman-file-history nil "File-name read history.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1127
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1128 (defun woman-file-name (topic &optional re-cache)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1129 "Get the name of the UN*X man-page file describing a chosen TOPIC.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1130 When called interactively, the word at point may be used as the topic
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1131 or initial topic suggestion, subject to the value of the user option
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1132 `woman-topic-at-point'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1133 Optional argument RE-CACHE, if non-nil, forces the cache to be re-read.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1134 Value is nil if no file can be found."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1135 ;; Handle the caching of the directory and topic lists:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1136 (if (and (not re-cache)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1137 (or
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1138 (and woman-expanded-directory-path woman-topic-all-completions)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1139 (woman-read-directory-cache)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1140 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1141 (message "Building list of manual directory expansions...")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1142 (setq woman-expanded-directory-path
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1143 (woman-expand-directory-path woman-manpath woman-path))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1144 (message "Building completion list of all manual topics...")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1145 (setq woman-topic-all-completions
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1146 (woman-topic-all-completions woman-expanded-directory-path))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1147 (woman-write-directory-cache))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1148 ;; There is a problem in that I want to offer case-insensitive
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1149 ;; completions, but to return only a case-sensitive match. This
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1150 ;; does not seem to work properly by default, so I re-do the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1151 ;; completion if necessary.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1152 (let (files)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1153 (or (stringp topic)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1154 (and (eq t
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1155 (if (boundp 'woman-topic-at-point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1156 woman-topic-at-point
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1157 ;; Was let-bound when file loaded, so ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1158 (setq woman-topic-at-point woman-topic-at-point-default)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1159 (setq topic
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1160 (current-word t)) ; only within or adjacent to word
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1161 (assoc topic woman-topic-all-completions))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1162 (setq topic
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1163 (completing-read
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1164 "Manual entry: "
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1165 woman-topic-all-completions nil 1
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1166 ;; Initial input suggestion (was nil), with
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1167 ;; cursor at left ready to kill suggestion!:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1168 (and woman-topic-at-point
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1169 (cons (current-word) 0)) ; nearest word
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1170 'woman-topic-history)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1171 ;; Note that completing-read always returns a string.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1172 (if (= (length topic) 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1173 nil ; no topic, so no file!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1174 (cond
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1175 ((setq files (woman-file-name-all-completions topic)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1176 ;; Complete topic more carefully, i.e. use the completion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1177 ;; rather than the string entered by the user:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1178 ((setq files (all-completions topic woman-topic-all-completions))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1179 (while (/= (length topic) (length (car files)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1180 (setq files (cdr files)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1181 (setq files (woman-file-name-all-completions (car files)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1182 (cond
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1183 ((null files) nil) ; no file found for topic.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1184 ((null (cdr files)) (car (car files))) ; only 1 file for topic.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1185 (t
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1186 ;; Multiple files for topic, so must select 1.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1187 ;; Unread the command event (TAB = ?\t = 9) that runs the command
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1188 ;; `minibuffer-complete' in order to automatically complete the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1189 ;; minibuffer contents as far as possible.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1190 (setq unread-command-events '(9)) ; and delete any type-ahead!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1191 (completing-read "Manual file: " files nil 1
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1192 (try-completion "" files) 'woman-file-history)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1193 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1194
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1195 (defun woman-select (predicate list)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1196 "Select unique elements for which PREDICATE is true in LIST.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1197 \(Note that this function changes the value of LIST.)"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1198 ;; Intended to be fast by avoiding recursion and list copying.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1199 (while (and list
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1200 (or
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1201 (member (car list) (cdr list))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1202 (not (funcall predicate (car list)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1203 (setq list (cdr list)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1204 (if list
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1205 (let ((newlist list) cdr_list)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1206 (while (setq cdr_list (cdr list))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1207 (if (and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1208 (not (member (car cdr_list) (cdr cdr_list)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1209 (funcall predicate (car cdr_list)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1210 (setq list cdr_list)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1211 (setcdr list (cdr cdr_list)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1212 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1213 newlist)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1214
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1215 (defun woman-file-readable-p (dir)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1216 "Return t if DIR is readable, otherwise log a warning."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1217 (or (file-readable-p dir)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1218 (WoMan-warn "Ignoring unreadable `manpath' directory tree `%s'!" dir)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1219
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1220 (defun woman-directory-files (head dir)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1221 "Return a sorted list of files in directory HEAD matching the regexp in DIR.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1222 Value is a sorted list of the absolute pathnames of all the files in
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1223 directory HEAD, or the current directory if HEAD is nil, that match the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1224 regexp that is the final component of DIR. Log a warning if list is empty."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1225 (or (directory-files
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1226 (or head (directory-file-name default-directory)) ; was "."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1227 t
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1228 (file-name-nondirectory dir))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1229 (WoMan-warn "No directories match `woman-path' entry `%s'!" dir)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1230
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1231 (defun woman-file-accessible-directory-p (dir)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1232 "Return t if DIR is accessible, otherwise log a warning."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1233 (or (file-accessible-directory-p dir)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1234 (WoMan-warn "Ignoring inaccessible `man-page' directory `%s'!" dir)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1235
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1236 (defun woman-expand-directory-path (woman-manpath woman-path)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1237 "Expand manual directories in WOMAN-MANPATH and WOMAN-PATH.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1238 WOMAN-MANPATH should be the list of the general manual directories, while
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1239 WOMAN-PATH should be the list of specific manual directory regexps.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1240 Ignore any paths that are unreadable or not directories."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1241 ;; Allow each path to be a single string or a list of strings:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1242 (if (not (listp woman-manpath)) (setq woman-manpath (list woman-manpath)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1243 (if (not (listp woman-path)) (setq woman-path (list woman-path)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1244 (let (dir head dirs)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1245 (while woman-manpath
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1246 (setq dir (car woman-manpath)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1247 woman-manpath (cdr woman-manpath))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1248 (if (and dir (woman-file-readable-p dir))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1249 ;; NB: `parse-colon-path' creates null elements for
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1250 ;; redundant (semi-)colons and trailing `/'s!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1251 ;; If does not actually matter here if dir ends with `/'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1252 ;; Need regexp "man" here to avoid "cat?", `.', `..', etc.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1253 (setq dir (woman-canonicalize-dir dir)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1254 dirs (nconc dirs (directory-files
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1255 dir t woman-manpath-man-regexp)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1256 (while woman-path
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1257 (setq dir (car woman-path)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1258 woman-path (cdr woman-path))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1259 (if (or (null dir)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1260 (null (setq dir (woman-canonicalize-dir dir)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1261 head (file-name-directory dir)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1262 (woman-file-readable-p head))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1263 (setq dirs
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1264 (if dir
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1265 (nconc dirs (woman-directory-files head dir))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1266 (cons (directory-file-name default-directory) dirs))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1267 ;; was "." -- at head of list for later filtering
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1268 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1269 (woman-select 'woman-file-accessible-directory-p dirs)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1270
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1271 (defun woman-canonicalize-dir (dir)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1272 "Canonicalize a directory name DIR.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1273 Any UN*X-style environment variables are evaluated first."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1274 (setq dir (expand-file-name (substitute-in-file-name dir)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1275 ;; A path that ends with / matches all directories in it,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1276 ;; including `.' and `..', so remove any trailing / !!!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1277 (if (string= (substring dir -1) "/")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1278 (setq dir (substring dir 0 -1)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1279 (if (memq system-type '(windows-nt ms-dos)) ; what else?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1280 ;; Match capitalization used by `file-name-directory':
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1281 (setq dir (concat (file-name-directory dir)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1282 (file-name-nondirectory dir))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1283 dir)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1284
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1285 (defsubst woman-not-member (dir path)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1286 "Return true if DIR is not a member of the list PATH.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1287 If DIR is `.' it is first replaced by the current directory."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1288 (not (member dir path)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1289
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1290 (defun woman-topic-all-completions (path)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1291 "Return an alist of the man files in all man directories in the list PATH.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1292 The cdr of each alist element is the path-index / filename."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1293 ;; Support 3 levels of caching: each element of the alist `files'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1294 ;; will be a list of the first `woman-cache-level' elements of the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1295 ;; following list: (topic path-index filename). This alist `files'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1296 ;; is re-processed by `woman-topic-all-completions-merge'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1297 (let (dir files (path-index 0)) ; indexing starts at zero
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1298 (while path
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1299 (setq dir (car path)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1300 path (cdr path))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1301 (if (woman-not-member dir path) ; use each directory only once!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1302 (setq files
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1303 (nconc files
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1304 (woman-topic-all-completions-1 dir path-index))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1305 (setq path-index (1+ path-index)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1306 ;; Uniquefy topics:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1307 (woman-topic-all-completions-merge files)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1308
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1309 (defsubst woman-list-n (n &rest args)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1310 "Return a list of at most the first N of the arguments ARGS.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1311 Treats N < 1 as if N = 1."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1312 (if (< n (length args))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1313 (setcdr (nthcdr (1- n) args) nil))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1314 args)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1315
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1316 (defun woman-topic-all-completions-1 (dir path-index)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1317 "Return an alist of the man files in directory DIR with index PATH-INDEX.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1318 The cdr of each alist element is the path-index / filename."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1319 (let ((old (directory-files dir nil woman-file-regexp))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1320 new file)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1321 ;; Convert list to alist of non-directory files:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1322 (while old
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1323 (setq file (car old)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1324 old (cdr old))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1325 (if (file-directory-p file)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1326 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1327 (setq new (cons
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1328 (woman-list-n
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1329 woman-cache-level
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1330 (file-name-sans-extension
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1331 (if (string-match woman-file-compression-regexp file)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1332 (file-name-sans-extension file)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1333 file))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1334 path-index
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1335 file)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1336 new))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1337 new))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1338
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1339 (defun woman-topic-all-completions-merge (alist)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1340 "Merge the alist ALIST so that the keys are unique.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1341 Also, make each path-info component into a list.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1342 \(Note that this function changes the value of ALIST.)"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1343 ;; Intended to be fast by avoiding recursion and list copying.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1344 (if (> woman-cache-level 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1345 (let ((newalist alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1346 (while newalist
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1347 (let ((tail newalist) (topic (car (car newalist))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1348 ;; Make the path-info into a list:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1349 (setcdr (car newalist) (list (cdr (car newalist))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1350 (while tail
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1351 (while (and tail (not (string= topic (car (car (cdr tail))))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1352 (setq tail (cdr tail)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1353 (if tail ; merge path-info into (car newalist)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1354 (let ((path-info (cdr (car (cdr tail)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1355 (if (member path-info (cdr (car newalist)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1356 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1357 ;; Make the path-info into a list:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1358 (nconc (car newalist) (list path-info)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1359 (setcdr tail (cdr (cdr tail))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1360 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1361 (setq newalist (cdr newalist))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1362 alist)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1363 ;; woman-cache-level = 1 => elements are single-element lists ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1364 (while (and alist (member (car alist) (cdr alist)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1365 (setq alist (cdr alist)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1366 (if alist
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1367 (let ((newalist alist) cdr_alist)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1368 (while (setq cdr_alist (cdr alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1369 (if (not (member (car cdr_alist) (cdr cdr_alist)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1370 (setq alist cdr_alist)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1371 (setcdr alist (cdr cdr_alist)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1372 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1373 newalist))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1374
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1375 (defun woman-file-name-all-completions (topic)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1376 "Return an alist of the files in all man directories that match TOPIC."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1377 ;; Support 3 levels of caching: each element of
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1378 ;; woman-topic-all-completions is a list of one of the forms:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1379 ;; (topic)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1380 ;; (topic (path-index) (path-index) ... )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1381 ;; (topic (path-index filename) (path-index filename) ... )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1382 ;; where the are no duplicates in the value lists.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1383 ;; Topic must match first `word' of filename, so ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1384 (let ((topic-regexp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1385 (concat
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1386 "\\`" (regexp-quote topic) ; first `word'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1387 "\\(\\..+\\)*" ; optional subsequent `words'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1388 woman-file-regexp)) ; extension
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1389 (topics woman-topic-all-completions)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1390 (path woman-expanded-directory-path)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1391 dir files)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1392 (if (cdr (car topics))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1393 ;; Use cached path-info to locate files for each topic:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1394 (let ((path-info (cdr (assoc topic topics)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1395 filename)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1396 (while path-info
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1397 (setq dir (nth (car (car path-info)) path)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1398 filename (car (cdr (car path-info)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1399 path-info (cdr path-info)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1400 files (nconc files
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1401 ;; Find the actual file name:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1402 (if filename
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1403 (list (concat dir "/" filename))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1404 (directory-files dir t topic-regexp)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1405 )))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1406 ;; Search path for the files for each topic:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1407 (while path
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1408 (setq dir (car path)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1409 path (cdr path))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1410 (if (woman-not-member dir path) ; use each directory only once!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1411 (setq files (nconc files
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1412 (directory-files dir t topic-regexp))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1413 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1414 (mapcar 'list files)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1415 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1416
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1417
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1418 ;;; dired support
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1419
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1420 (defun woman-dired-define-key (key)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1421 "Bind the argument KEY to the command `woman-dired-find-file'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1422 (define-key dired-mode-map key 'woman-dired-find-file))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1423
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1424 (defsubst woman-dired-define-key-maybe (key)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1425 "If KEY is undefined in Dired, bind it to command `woman-dired-find-file'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1426 (if (eq (lookup-key dired-mode-map key) 'undefined)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1427 (woman-dired-define-key key)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1428
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1429 (defun woman-dired-define-keys ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1430 "Define dired keys to run WoMan according to `woman-dired-keys'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1431 (if woman-dired-keys
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1432 (if (listp woman-dired-keys)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1433 (mapcar 'woman-dired-define-key woman-dired-keys)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1434 (woman-dired-define-key-maybe "w")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1435 (woman-dired-define-key-maybe "W")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1436 (define-key-after (lookup-key dired-mode-map [menu-bar immediate])
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1437 [woman] '("Read Man Page (WoMan)" . woman-dired-find-file) 'view))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1438
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1439 (if (featurep 'dired)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1440 (woman-dired-define-keys)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1441 (add-hook 'dired-mode-hook 'woman-dired-define-keys))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1442
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1443 ;;;###autoload
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1444 (defun woman-dired-find-file ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1445 "In dired, run the WoMan man-page browser on this file."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1446 (interactive)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1447 ;; dired-get-filename is defined in dired.el
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1448 (woman-find-file (dired-get-filename)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1449
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1450
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1451 ;;; tar-mode support
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1452
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1453 (defun woman-tar-extract-file ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1454 "In tar mode, run the WoMan man-page browser on this file."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1455 (interactive)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1456 (or (eq major-mode 'tar-mode)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1457 (error "`woman-tar-extract-file' can be used only in `tar-mode'"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1458 (buffer-disable-undo)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1459 (let (global-font-lock-mode)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1460 (funcall (symbol-function 'tar-extract)) ; defined in tar-mode
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1461 (let ((WoMan-current-file buffer-file-name)) ; used for message logging
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1462 (rename-buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1463 (woman-make-bufname (file-name-nondirectory buffer-file-name)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1464 (woman-process-buffer)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1465 (goto-char (point-min)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1466
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1467 ;; There is currently no `tar-mode-hook' so use ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1468 (eval-after-load "tar-mode"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1469 '(progn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1470 (define-key tar-mode-map "w" 'woman-tar-extract-file)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1471 (define-key-after (lookup-key tar-mode-map [menu-bar immediate])
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1472 [woman] '("Read Man Page (WoMan)" . woman-tar-extract-file) 'view)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1473
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1474
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1475 (defvar woman-last-file-name nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1476 "The full pathname of the last file formatted by WoMan.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1477
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1478 (defun woman-reformat-last-file ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1479 "Reformat last file, e.g. after changing fill column."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1480 (interactive)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1481 (if woman-last-file-name
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1482 (woman-find-file woman-last-file-name t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1483 (call-interactively 'woman-find-file)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1484
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1485 ;;;###autoload
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1486 (defun woman-find-file (file-name &optional reformat)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1487 "Find, decode and browse a specific UN*X man-page source file FILE-NAME.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1488 Use existing buffer if possible; reformat only if prefix arg given.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1489 When called interactively, optional argument REFORMAT forces reformatting
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1490 of existing WoMan buffers formatted earlier.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1491 No external programs are used, except that `gunzip' will be used to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1492 decompress the file if appropriate. See the documentation for the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1493 `woman' command for further details."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1494 (interactive "fBrowse UN*X manual file: \nP")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1495 (setq woman-last-file-name
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1496 (setq file-name (expand-file-name file-name))) ; to canonicalize
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1497 (let ((alist-tail woman-buffer-alist) exists)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1498 (setq woman-buffer-number 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1499 (while (and alist-tail (not (string= file-name (car (car alist-tail)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1500 (setq alist-tail (cdr alist-tail)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1501 woman-buffer-number (1+ woman-buffer-number)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1502 (or (and (setq exists
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1503 (and alist-tail (WoMan-find-buffer))) ; buffer exists
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1504 (not reformat))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1505 ;; Format new buffer or reformat current buffer:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1506 (let* ((bufname (file-name-nondirectory file-name))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1507 (case-fold-search t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1508 (compressed
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1509 (not (not (string-match woman-file-compression-regexp bufname)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1510 (if compressed
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1511 (setq bufname (file-name-sans-extension bufname)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1512 (setq bufname (if exists
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1513 (buffer-name)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1514 (woman-make-bufname bufname)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1515 (woman-really-find-file file-name compressed bufname)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1516 (or exists
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1517 (setq woman-buffer-alist
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1518 (cons (cons file-name bufname) woman-buffer-alist)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1519 woman-buffer-number 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1520 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1521 (Man-build-section-alist)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1522 (Man-build-references-alist)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1523 (goto-char (point-min)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1524
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1525 (defun woman-make-bufname (bufname)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1526 "Create an unambiguous buffer name from BUFNAME."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1527 (let ((dot (string-match "\\." bufname)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1528 (if dot (setq bufname (concat
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1529 (substring bufname (1+ dot)) " "
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1530 (substring bufname 0 dot))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1531 (generate-new-buffer-name ; ensure uniqueness
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1532 (concat "*WoMan " bufname "*"))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1533
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1534 (defun woman-really-find-file (filename compressed bufname)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1535 "Find, decompress, and decode a UN*X man page FILENAME.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1536 If COMPRESSED is non-nil, turn on `auto-compression-mode' to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1537 decompress the file if necessary. Set buffer name and major mode.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1538 Do not call directly!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1539 (let ((WoMan-current-file filename)) ; used for message logging
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1540 (switch-to-buffer (get-buffer-create bufname))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1541 (buffer-disable-undo)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1542 (setq buffer-read-only nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1543 (erase-buffer) ; NEEDED for reformat
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1544 (woman-insert-file-contents filename compressed)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1545 ;; Set buffer's default directory to that of the file.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1546 (setq default-directory (file-name-directory filename))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1547 (set (make-local-variable 'backup-inhibited) t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1548 (set-visited-file-name "")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1549 (woman-process-buffer)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1550
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1551 (defun woman-process-buffer ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1552 "The second half of `woman-really-find-file'!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1553 (interactive)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1554 ;; Check (crudely) that this really is likely to be in UN*X
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1555 ;; man-page source format, assuming we are at point-min:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1556 (goto-char (point-min))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1557 (if (re-search-forward "^[.']" 1000 t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1558 (woman-decode-buffer)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1559 (message
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1560 "File appears to be pre-formatted -- using source file may be better.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1561 (woman-man-buffer))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1562 (woman-mode))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1563
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1564 (defun woman-man-buffer ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1565 "Post-process an nroff-preformatted man buffer."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1566 ;; Kill all leading whitespace:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1567 (if (looking-at "\\s-+") (woman-delete-match 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1568 ;; Delete all page footer/header pairs:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1569 (re-search-forward ".*") ; match header
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1570 ;; Footer conventionally has page number at right, so ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1571 (let ((regex (concat
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1572 "^.*[0-9]\n\\s-*" ; footer and following blank lines
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1573 (regexp-quote (match-string 0)) ; header
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1574 "\\s-*\n"))) ; following blank lines
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1575 (while (re-search-forward regex nil 1) ; finish at eob
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1576 (woman-delete-match 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1577 ;; Delete last text line (footer) and all following blank lines:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1578 (re-search-backward "\\S-")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1579 (beginning-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1580 (if (looking-at ".*[0-9]$")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1581 (delete-region (point) (point-max)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1582
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1583 ;; Squeeze multiple blank lines:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1584 (goto-char (point-min))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1585 (while (re-search-forward "^[ \t]*\n\\([ \t]*\n\\)+" nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1586 (replace-match "\n" t t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1587
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1588 ;; Interpret overprinting to indicate bold face:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1589 (goto-char (point-min))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1590 (while (re-search-forward "\\(.\\)\\(\\(\\1\\)+\\)" nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1591 (woman-delete-match 2)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1592 (woman-set-face (1- (point)) (point) 'woman-bold-face))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1593
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1594 ;; Interpret underlining to indicate italic face:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1595 ;; (Must be AFTER emboldening to interpret bold _ correctly!)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1596 (goto-char (point-min))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1597 (while (search-forward "_" nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1598 (delete-char -2)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1599 (woman-set-face (point) (1+ (point)) 'woman-italic-face))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1600
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1601 ;; Leave any other uninterpreted ^H's in the buffer for now! (They
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1602 ;; might indicate composite special characters, which could be
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1603 ;; interpreted if I knew what to expect.)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1604
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1605 ;; Optionally embolden section and subsection headings
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1606 ;; (cf. `woman-imenu-generic-expression'):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1607 (cond
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1608 (woman-bold-headings
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1609 (goto-char (point-min))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1610 (forward-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1611 (while (re-search-forward "^\\( \\)?\\([A-Z].*\\)" nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1612 (woman-set-face (match-beginning 2) (match-end 2) 'woman-bold-face))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1613 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1614
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1615 (defun woman-insert-file-contents (filename compressed)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1616 "Insert file FILENAME into the current buffer.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1617 If COMPRESSED is t, or is non-nil and the filename implies compression,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1618 turn on `auto-compression-mode' to decompress the file.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1619 Leave point at end of new text. Return length of inserted text."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1620 ;; Leaves point at end of inserted text in GNU Emacs 20.3, but at
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1621 ;; start in 19.34!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1622 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1623 (let ((case-fold-search t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1624 ;; Co-operate with auto-compression mode:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1625 (if (and compressed
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1626 (or (eq compressed t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1627 (string-match woman-file-compression-regexp filename))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1628 ;; (not auto-compression-mode)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1629 (not (rassq 'jka-compr-handler file-name-handler-alist)) )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1630 ;; (error "Compressed file requires Auto File Decompression turned on")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1631 (auto-compression-mode 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1632 (nth 1
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1633 (condition-case ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1634 (insert-file-contents filename nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1635 (file-error
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1636 ;; Run find-file-not-found-hooks until one returns non-nil.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1637 ;; (run-hook-with-args-until-success 'find-file-not-found-hooks)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1638 (insert "\n***** File " filename " not found! *****\n\n")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1639 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1640 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1641
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1642
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1643 ;;; Major mode (Man) interface:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1644
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1645 (defvar woman-mode-map nil "Keymap for woman mode.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1646
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1647 (if woman-mode-map
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1648 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1649 ;; Set up the keymap, mostly inherited from Man-mode-map:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1650 (setq woman-mode-map (make-sparse-keymap))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1651 (set-keymap-parent woman-mode-map Man-mode-map)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1652 ;; Above two lines were
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1653 ;; (setq woman-mode-map (cons 'keymap Man-mode-map))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1654 (define-key woman-mode-map "R" 'woman-reformat-last-file)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1655 (define-key woman-mode-map "w" 'woman)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1656 (define-key woman-mode-map "\en" 'WoMan-next-manpage)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1657 (define-key woman-mode-map "\ep" 'WoMan-previous-manpage)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1658 (define-key woman-mode-map [mouse-2] 'woman-mouse-2)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1659 (define-key woman-mode-map [M-mouse-2] 'woman-mouse-2))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1660
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1661 (defun woman-mouse-2 (event)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1662 "Run WoMan with word under mouse as topic.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1663 Require it to be mouse-highlighted unless Meta key used.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1664 Argument EVENT is the invoking mouse event."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1665 (interactive "e") ; mouse event
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1666 (let ((pos (cadr (cadr event)))) ; extract buffer position
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1667 (when (or (eq (car event) 'M-mouse-2)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1668 (get-text-property pos 'mouse-face))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1669 (goto-char pos)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1670 (woman (current-word t)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1671
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1672 ;; WoMan menu bar and pop-up menu:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1673 (easy-menu-define ; (SYMBOL MAPS DOC MENU)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1674 woman-menu
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1675 woman-mode-map
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1676 "WoMan Menu"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1677 `("WoMan"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1678 ["WoMan..." woman t] ; [NAME CALLBACK ENABLE]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1679 "--"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1680 ["Next Section" Man-next-section t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1681 ["Previous Section" Man-previous-section t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1682 ["Goto Section..." Man-goto-section t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1683 ["Goto See-Also Section" Man-goto-see-also-section t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1684 ["Follow Reference..." Man-follow-manual-reference t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1685 "--"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1686 ["Previous WoMan Buffer" WoMan-previous-manpage t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1687 ["Next WoMan Buffer" WoMan-next-manpage t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1688 ["Bury WoMan Buffer" Man-quit t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1689 ["Kill WoMan Buffer" Man-kill t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1690 "--"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1691 ;; ["Toggle Fill Frame Width" woman-toggle-fill-frame t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1692 ["Use Full Frame Width" woman-toggle-fill-frame
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1693 :active t :style toggle :selected woman-fill-frame]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1694 ["Reformat Last File" woman-reformat-last-file t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1695 ["Use Coloured Main Faces" woman-colour-faces t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1696 ["Use Black Main Faces" woman-black-faces t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1697 ["Make Contents Menu" (woman-imenu t) (not woman-imenu-done)]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1698 "--"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1699 ["Describe (Wo)Man Mode" describe-mode t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1700 ["Mini Help" woman-mini-help t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1701 ,@(if (fboundp 'customize-group)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1702 '(["Customize..." (customize-group 'woman) t]))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1703 ["Show Version" (message "WoMan %s" woman-version) t]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1704 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1705
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1706 (defun woman-mode ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1707 "Turn on (most of) Man mode to browse a buffer formatted by WoMan.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1708 WoMan is an ELisp emulation of much of the functionality of the Emacs
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1709 `man' command running the standard UN*X man and ?roff programs.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1710 WoMan author: F.J.Wright@Maths.QMW.ac.uk
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1711 WoMan version: see `woman-version'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1712 See `Man-mode' for additional details."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1713 (let ((Man-build-page-list (symbol-function 'Man-build-page-list))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1714 (Man-strip-page-headers (symbol-function 'Man-strip-page-headers))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1715 (Man-unindent (symbol-function 'Man-unindent))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1716 (Man-goto-page (symbol-function 'Man-goto-page)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1717 ;; Prevent inappropriate operations:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1718 (fset 'Man-build-page-list 'ignore)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1719 (fset 'Man-strip-page-headers 'ignore)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1720 (fset 'Man-unindent 'ignore)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1721 (fset 'Man-goto-page 'ignore)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1722 (unwind-protect
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1723 (progn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1724 (set (make-local-variable 'Man-mode-map) woman-mode-map)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1725 ;; Install Man mode:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1726 (Man-mode)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1727 ;; Reset inappropriate definitions:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1728 (setq mode-line-format woman-mode-line-format)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1729 (put 'Man-mode 'mode-class 'special))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1730 ;; Restore the status quo:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1731 (fset 'Man-build-page-list Man-build-page-list)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1732 (fset 'Man-strip-page-headers Man-strip-page-headers)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1733 (fset 'Man-unindent Man-unindent)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1734 (fset 'Man-goto-page Man-goto-page)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1735 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1736 ;; Imenu support:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1737 (set (make-local-variable 'imenu-generic-expression)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1738 ;; `make-local-variable' in case imenu not yet loaded!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1739 woman-imenu-generic-expression)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1740 (set (make-local-variable 'imenu-space-replacement) " ")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1741 ;; For reformat ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1742 ;; necessary when reformatting a file in its old buffer:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1743 (setq imenu--last-menubar-index-alist nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1744 ;; necessary to avoid re-installing the same imenu:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1745 (setq woman-imenu-done nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1746 (if woman-imenu (woman-imenu))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1747 (setq buffer-read-only nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1748 (WoMan-highlight-references)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1749 (setq buffer-read-only t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1750 (set-buffer-modified-p nil)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1751
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1752 (defun woman-imenu (&optional redraw)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1753 "Add a \"Contents\" menu to the menubar.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1754 Optional argument REDRAW, if non-nil, forces mode line to be updated."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1755 (interactive)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1756 (if woman-imenu-done
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1757 ;; This is PRIMARILY to avoid a bug in imenu-add-to-menubar that
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1758 ;; causes it to corrupt the menu bar if it is run more than once
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1759 ;; in the same buffer.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1760 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1761 (setq woman-imenu-done t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1762 (imenu-add-to-menubar woman-imenu-title)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1763 (if redraw (force-mode-line-update))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1764
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1765 (defun woman-toggle-fill-frame ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1766 "Toggle formatting to fill (most of) the width of the current frame."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1767 (interactive)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1768 (setq woman-fill-frame (not woman-fill-frame))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1769 (message "Woman fill column set to %s."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1770 (if woman-fill-frame "frame width" woman-fill-column)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1771 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1772
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1773 (defun woman-mini-help ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1774 "Display WoMan commands and user options in an `apropos' buffer."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1775 ;; Based on apropos-command in apropos.el
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1776 (interactive)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1777 (require 'apropos)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1778 (let ((message
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1779 (let ((standard-output (get-buffer-create "*Apropos*")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1780 (print-help-return-message 'identity))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1781 (setq apropos-accumulator
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1782 (apropos-internal "woman"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1783 #'(lambda (symbol)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1784 (or (commandp symbol)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1785 (user-variable-p symbol)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1786 ;; Filter out any inhibited symbols:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1787 (let ((tem apropos-accumulator))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1788 (while tem
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1789 (if (get (car tem) 'apropos-inhibit)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1790 (setq apropos-accumulator (delq (car tem) apropos-accumulator)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1791 (setq tem (cdr tem))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1792 ;; Find documentation strings:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1793 (let ((p apropos-accumulator)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1794 doc symbol)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1795 (while p
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1796 (setcar p (list ; must have 3 elements:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1797 (setq symbol (car p)) ; 1. name
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1798 (if (functionp symbol) ; 2. command doc
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1799 (if (setq doc (documentation symbol t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1800 (substring doc 0 (string-match "\n" doc))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1801 "(not documented)"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1802 (if (user-variable-p symbol) ; 3. variable doc
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1803 (if (setq doc (documentation-property
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1804 symbol 'variable-documentation t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1805 (substring doc 0 (string-match "\n" doc))))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1806 (setq p (cdr p))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1807 ;; Output the result:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1808 (and (apropos-print t nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1809 message
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1810 (message message))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1811
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1812
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1813 (defun WoMan-getpage-in-background (topic)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1814 "Use TOPIC to start WoMan from `Man-follow-manual-reference'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1815 ;; topic is a string, generally of the form "section topic"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1816 (let ((s (string-match " " topic)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1817 (if s (setq topic (substring topic (1+ s))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1818 (woman topic)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1819
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1820 (defvar WoMan-Man-start-time nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1821 "Used to record formatting time used by the `man' command.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1822
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1823 (defadvice Man-getpage-in-background
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1824 (around Man-getpage-in-background-advice (topic) activate)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1825 "Use WoMan unless invoked outside a WoMan buffer or invoked explicitly.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1826 Otherwise use Man and record start of formatting time."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1827 (if (and (eq mode-line-format woman-mode-line-format)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1828 (not (eq (caar command-history) 'man)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1829 (WoMan-getpage-in-background topic)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1830 ;; Initiates man processing
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1831 (setq WoMan-Man-start-time (current-time))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1832 ad-do-it))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1833
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1834 (defadvice Man-bgproc-sentinel
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1835 (after Man-bgproc-sentinel-advice activate)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1836 ;; Terminates man processing
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1837 "Report formatting time."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1838 (let* ((time (current-time))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1839 (time (+ (* (- (car time) (car WoMan-Man-start-time)) 65536)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1840 (- (cadr time) (cadr WoMan-Man-start-time)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1841 (message "Man formatting done in %d seconds" time)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1842
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1843 (defun WoMan-highlight-references ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1844 "Highlight the references (in the SEE ALSO section) on mouse-over."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1845 ;; Based on `Man-build-references-alist' in `man'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1846 (when (Man-find-section Man-see-also-regexp)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1847 (forward-line 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1848 (let ((end (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1849 (Man-next-section 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1850 (point))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1851 (back-to-indentation)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1852 (while (re-search-forward Man-reference-regexp end t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1853 ;; Highlight reference when mouse is over it.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1854 ;; (NB: WoMan does not hyphenate!)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1855 ;; [See (elisp)Clickable Text]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1856 (put-text-property (match-beginning 1) (match-end 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1857 'mouse-face 'highlight)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1858 ))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1859
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1860
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1861 ;;; Buffer handling:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1862
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1863 (defun WoMan-previous-manpage ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1864 "Find the previous WoMan buffer."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1865 ;; Assumes currently in a WoMan buffer!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1866 (interactive)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1867 (WoMan-find-buffer) ; find current existing buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1868 (if (null (cdr woman-buffer-alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1869 (error "No previous WoMan buffer"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1870 (if (>= (setq woman-buffer-number (1+ woman-buffer-number))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1871 (length woman-buffer-alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1872 (setq woman-buffer-number 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1873 (if (WoMan-find-buffer)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1874 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1875 (if (< (setq woman-buffer-number (1- woman-buffer-number)) 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1876 (setq woman-buffer-number (1- (length woman-buffer-alist))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1877 (WoMan-previous-manpage)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1878
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1879 (defun WoMan-next-manpage ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1880 "Find the next WoMan buffer."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1881 ;; Assumes currently in a WoMan buffer!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1882 (interactive)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1883 (WoMan-find-buffer) ; find current existing buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1884 (if (null (cdr woman-buffer-alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1885 (error "No next WoMan buffer"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1886 (if (< (setq woman-buffer-number (1- woman-buffer-number)) 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1887 (setq woman-buffer-number (1- (length woman-buffer-alist))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1888 (if (WoMan-find-buffer)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1889 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1890 (WoMan-next-manpage)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1891
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1892 (defun WoMan-find-buffer ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1893 "Switch to buffer corresponding to `woman-buffer-number' and return it.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1894 If such a buffer doesn't exist, remove its association from the alist in
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1895 `woman-buffer-alist' and return nil."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1896 (if (zerop woman-buffer-number)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1897 (let ((buffer (get-buffer (cdr (car woman-buffer-alist)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1898 (if buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1899 (switch-to-buffer buffer)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1900 ;; Delete alist element:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1901 (setq woman-buffer-alist (cdr woman-buffer-alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1902 nil))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1903 (let* ((prev-ptr (nthcdr (1- woman-buffer-number) woman-buffer-alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1904 (buffer (get-buffer (cdr (car (cdr prev-ptr))))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1905 (if buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1906 (switch-to-buffer buffer)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1907 ;; Delete alist element:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1908 (setcdr prev-ptr (cdr (cdr prev-ptr)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1909 (if (>= woman-buffer-number (length woman-buffer-alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1910 (setq woman-buffer-number 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1911 nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1912 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1913
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1914
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1915 ;;; Syntax and display tables:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1916
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1917 (defconst woman-escaped-escape-char ?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1918 ;; An arbitrary unused control character
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1919 "Internal character representation of escaped escape characters.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1920 (defconst woman-escaped-escape-string
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1921 (char-to-string woman-escaped-escape-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1922 "Internal string representation of escaped escape characters.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1923
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1924 (defconst woman-unpadded-space-char ?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1925 ;; An arbitrary unused control character
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1926 "Internal character representation of unpadded space characters.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1927 (defconst woman-unpadded-space-string
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1928 (char-to-string woman-unpadded-space-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1929 "Internal string representation of unpadded space characters.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1930
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1931 (defvar woman-syntax-table nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1932 "Syntax table to support special characters used internally by WoMan.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1933
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1934 (if woman-syntax-table
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1935 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1936 (setq woman-syntax-table (make-syntax-table))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1937 ;; The following internal chars must NOT have whitespace syntax:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1938 (modify-syntax-entry woman-unpadded-space-char "." woman-syntax-table)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1939 (modify-syntax-entry woman-escaped-escape-char "." woman-syntax-table)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1940 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1941
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1942 (defun woman-set-buffer-display-table ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1943 "Set up a display table for a WoMan buffer.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1944 This display table is used for displaying internal special characters, but
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1945 does not interfere with any existing display table, e.g. for displaying
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1946 European characters."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1947 (setq buffer-display-table
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1948 ;; The following test appears to be necessary on some
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1949 ;; non-Windows platforms, e.g. Solaris 2.6 when running on a
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1950 ;; tty. Thanks to T. V. Raman <raman@Adobe.COM>.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1951 ;; The MS-DOS terminal also sets standard-display-table to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1952 ;; a non-nil value.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1953 (if standard-display-table ; default is nil !!!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1954 (copy-sequence standard-display-table)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1955 (make-display-table)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1956 ;; Display the following internal chars correctly:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1957 (aset buffer-display-table woman-unpadded-space-char [?\ ])
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1958 (aset buffer-display-table woman-escaped-escape-char [?\\]))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1959
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1960
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1961 ;;; The main decoding driver:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1962
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1963 (defvar font-lock-mode) ; for the compiler
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1964
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1965 (defun woman-decode-buffer ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1966 "Decode a buffer in UN*X man-page source format.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1967 No external programs are used."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1968 (interactive) ; mainly for testing
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1969 (WoMan-log-begin)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1970 (run-hooks 'woman-pre-format-hook)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1971 (and (boundp 'font-lock-mode) font-lock-mode (font-lock-mode -1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1972 ;; (fundamental-mode)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1973 (let ((start-time (current-time)) ; (HIGH LOW MICROSEC)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1974 time) ; HIGH * 2**16 + LOW seconds
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1975 (message "WoMan formatting buffer...")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1976 ; (goto-char (point-min))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1977 ; (cond
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1978 ; ((re-search-forward "^\\.[ \t]*TH" nil t) ; wrong format if not found?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1979 ; (beginning-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1980 ; (delete-region (point-min) (point))) ; potentially dangerous!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1981 ; (t (message "WARNING: .TH request not found -- not man-page format?")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1982 (woman-decode-region (point-min) (point-max))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1983 (setq time (current-time)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1984 time (+ (* (- (car time) (car start-time)) 65536)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1985 (- (cadr time) (cadr start-time))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1986 (message "WoMan formatting buffer...done in %d seconds" time)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1987 (WoMan-log-end time))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1988 (run-hooks 'woman-post-format-hook))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1989
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1990 (defvar woman-string-alist ; rebound in woman-decode-region
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1991 '(("S" . "") ("R" . "(Reg.)") ("Tm" . "(TM)")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1992 ("lq" . "\"") ("rq" . "\"")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1993 ("''" . "\"") ; needed for gcc.1
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1994 (".T" . "") ; output device from -T option?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1995 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1996 "Alist of strings predefined in the -man macro package `tmac.an'.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1997
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1998 (defvar woman-negative-vertical-space nil ; rebound in woman-decode-region
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
1999 "Set to t if .sp N with N < 0 encountered.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2000
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2001 (defun woman-pre-process-region (from to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2002 "Pre-process escapes and comments in the region of text between FROM and TO.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2003 To be called on original buffer and any .so insertions."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2004 ;; Hide escaped escapes \\ and printable escapes \e very early
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2005 ;; (to be re-instated as just \ very late!):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2006 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2007 ;; .eo turns off escape character processing
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2008 (while (re-search-forward "\\(\\\\[\\e]\\)\\|^\\.eo" to t) ; \\
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2009 (if (match-string 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2010 (replace-match woman-escaped-escape-string t t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2011 (woman-delete-whole-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2012 ;; .ec turns on escape character processing (and sets the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2013 ;; escape character to its argument, if any, which I'm ignoring
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2014 ;; for now!)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2015 (while (and (re-search-forward "\\(\\\\\\)\\|^\\.ec" to t) ; \
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2016 (match-string 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2017 (replace-match woman-escaped-escape-string t t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2018 ;; ***** Need test for .ec arg and warning here! *****
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2019 (woman-delete-whole-line)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2020
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2021 ;; Delete comments .\"<anything>, \"<anything>, pre-processor
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2022 ;; directives '\"<anything> (should give warning?) and null
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2023 ;; requests. (However, should null . requests cause a break?)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2024 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2025 (while (re-search-forward "^[.'][ \t]*\\(\\\\\".*\\)?\n\\|\\\\\".*" to t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2026 (woman-delete-match 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2027 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2028
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2029 (defun woman-non-underline-faces ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2030 "Prepare non-underlined versions of underlined faces."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2031 (let ((face-list (face-list)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2032 (while face-list
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2033 (let* ((face (car face-list))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2034 (face-name (symbol-name face)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2035 (if (and (string-match "\\`woman-" face-name)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2036 (face-underline-p face))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2037 (let ((face-no-ul (intern (concat face-name "-no-ul"))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2038 (copy-face face face-no-ul)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2039 (set-face-underline-p face-no-ul nil))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2040 (setq face-list (cdr face-list)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2041
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2042 (defun woman-decode-region (from to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2043 "Decode the region between FROM and TO in UN*X man-page source format."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2044 ;; Suitable for use in format-alist.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2045 ;; But this requires care to control major mode implied font locking.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2046 ;; Must return the new end of file. See format.el for details.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2047 ;; NB: The `to' argument is bogus: it is not currently used, and if
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2048 ;; it were it would need to be a marker rather than a position!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2049 ;; First force the correct environment:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2050 (let ((case-fold-search nil) ; This is necessary!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2051 (woman-string-alist woman-string-alist)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2052 (woman-fill-column woman-fill-column)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2053 woman-negative-vertical-space)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2054 (setq woman-left-margin woman-default-indent
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2055 woman-prevailing-indent woman-default-indent
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2056 woman-interparagraph-distance 1
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2057 woman-leave-blank-lines nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2058 woman-RS-left-margin nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2059 woman-RS-prevailing-indent nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2060 woman-adjust woman-adjust-both
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2061 woman-justify (nth woman-adjust woman-justify-list)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2062 woman-nofill nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2063
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2064 ;; Prepare non-underlined versions of underlined faces:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2065 (woman-non-underline-faces)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2066
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2067 ;; Set syntax and display tables:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2068 (set-syntax-table woman-syntax-table)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2069 (woman-set-buffer-display-table)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2070
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2071 ;; Based loosely on a suggestion by Theodore Jump:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2072 (if (or woman-fill-frame
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2073 (not (and (integerp woman-fill-column) (> woman-fill-column 0))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2074 (setq woman-fill-column (- (frame-width) woman-default-indent)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2075
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2076 (woman-pre-process-region from nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2077 ;; Process ignore requests, macro definitions,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2078 ;; conditionals and switch source requests:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2079 (woman0-roff-buffer from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2080
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2081 ;; Process \k escapes BEFORE changing tab width (?):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2082 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2083 (woman-mark-horizonal-position)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2084
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2085 ;; Set buffer-local variables:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2086 (setq fill-column woman-fill-column
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2087 tab-width woman-tab-width)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2088
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2089 ;; Hide unpaddable and digit-width spaces \(space) and \0:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2090 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2091 (while (re-search-forward "\\\\[ 0]" nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2092 (replace-match woman-unpadded-space-string t t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2093
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2094 ;; Discard optional hyphen \%; concealed newlines \<newline>;
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2095 ;; point-size change function \sN,\s+N, \s-N:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2096 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2097 (while (re-search-forward "\\\\\\([%\n]\\|s[-+]?[0-9]+\\)" nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2098 (woman-delete-match 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2099
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2100 ;; BEWARE: THIS SHOULD PROBABLY ALL BE DONE MUCH LATER!!!!!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2101 ;; Process trivial escapes \-, \`, \.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2102 ;; (\' must be done after tab processing!):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2103 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2104 (while (re-search-forward "\\\\\\([-`.]\\)" nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2105 (replace-match "\\1"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2106 ;; NB: Must keep ALL zero-width characters \&, \|, and \^ until
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2107 ;; ALL requests processed!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2108
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2109 ;; Process no-break requests and macros (including font-change macros):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2110 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2111 (woman1-roff-buffer)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2112
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2113 ;; Process strings and special character escapes \(xx:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2114 ;; (Must do this BEFORE fontifying!)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2115 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2116 (woman-strings)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2117 ;; Special chars moved after translation in
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2118 ;; `woman2-process-escapes' (for pic.1):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2119 ; (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2120 ; (woman-special-characters)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2121
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2122 ;; Process standard font-change requests and escapes:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2123 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2124 (woman-change-fonts)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2125
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2126 ;; 1/2 em vertical motion \d, \u and general local vertical motion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2127 ;; \v'+/-N' simulated using TeX ^ and _ symbols for now.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2128 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2129 (let ((first t)) ; assume no nesting!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2130 (while (re-search-forward "\\\\\\([du]\\|v'[^']*'\\)" nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2131 (let* ((esc (match-string 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2132 (repl (if (or (= (aref esc 0) ?u)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2133 (and (>= (length esc) 2) (= (aref esc 2) ?-)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2134 "^" "_")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2135 (cond (first
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2136 (replace-match repl nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2137 (put-text-property (1- (point)) (point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2138 'face 'woman-addition-face)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2139 (WoMan-warn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2140 "Initial vertical motion escape \\%s simulated" esc)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2141 (WoMan-log
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2142 " by TeX `%s' in woman-addition-face!" repl))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2143 (t
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2144 (woman-delete-match 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2145 (WoMan-warn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2146 "Terminal vertical motion escape \\%s ignored!" esc)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2147 (setq first (not first))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2148 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2149
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2150 ; ;; \h'+/-N' local horizontal motion.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2151 ; ;; N may include width escape \w'...'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2152 ; ;; Implement arbitrary forward motion and non-overlapping backward
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2153 ; ;; motion.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2154 ; (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2155 ; (while (re-search-forward
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2156 ; ;; Delimiter can be a special char escape sequence \(.. or
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2157 ; ;; a single normal char (usually '):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2158 ; "\\\\h\\(\\\\(..\\|.\\)\\(|\\)?"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2159 ; nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2160 ; (let ((from (match-beginning 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2161 ; (delim (regexp-quote (match-string 1)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2162 ; (absolute (match-string 2)) ; absolute position?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2163 ; (N (woman-parse-numeric-arg)) ; distance
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2164 ; to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2165 ; msg) ; for warning
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2166 ; (if (not (looking-at delim))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2167 ; ;; Warn but leave escape in buffer unprocessed:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2168 ; (WoMan-warn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2169 ; "Local horizontal motion (%s) delimiter error!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2170 ; (buffer-substring from (1+ (point)))) ; point at end of arg
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2171 ; (setq to (match-end 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2172 ; ;; For possible warning -- save before deleting:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2173 ; msg (buffer-substring from to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2174 ; (delete-region from to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2175 ; (if absolute ; make relative
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2176 ; (setq N (- N (current-column))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2177 ; (if (>= N 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2178 ; ;; Move forward by inserting hard spaces:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2179 ; (insert-char woman-unpadded-space-char N)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2180 ; ;; Move backwards by deleting space,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2181 ; ;; first backwards then forwards:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2182 ; (while (and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2183 ; (<= (setq N (1+ N)) 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2184 ; (cond ((memq (preceding-char) '(?\ ?\t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2185 ; (delete-backward-char 1) t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2186 ; ((memq (following-char) '(?\ ?\t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2187 ; (delete-char 1) t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2188 ; (t nil))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2189 ; (if (<= N 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2190 ; (WoMan-warn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2191 ; "Negative horizontal motion (%s) would overwrite!" msg))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2192 ; ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2193
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2194 ;; Process formatting macros
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2195 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2196 (woman2-roff-buffer)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2197
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2198 ;; Go back and process negative vertical space if necessary:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2199 (if woman-negative-vertical-space
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2200 (woman-negative-vertical-space from))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2201
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2202 (if woman-preserve-ascii
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2203 ;; Re-instate escaped escapes to just `\' and unpaddable
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2204 ;; spaces to just `space', without inheriting any text
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2205 ;; properties. This is not necessary, UNLESS the buffer is to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2206 ;; be saved as ASCII.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2207 (progn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2208 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2209 (while (search-forward woman-escaped-escape-string nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2210 (delete-char -1) (insert ?\\))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2211 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2212 (while (search-forward woman-unpadded-space-string nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2213 (delete-char -1) (insert ?\ ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2214 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2215
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2216 ;; Must return the new end of file if used in format-alist.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2217 (point-max)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2218
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2219 (defun woman-horizontal-escapes (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2220 "\\h'+/-N' local horizontal motion, preserving `point'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2221 Argument TO is the target of the motion.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2222 Implement arbitrary forward and non-overlapping backward motion."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2223 ;; Moved from `woman-decode-region' for version 0.50.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2224 ;; N may include width escape \w'...' (but may already be processed!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2225 (let ((from (point)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2226 (while (re-search-forward
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2227 ;; Delimiter can be a special char escape sequence \(.. or
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2228 ;; a single normal char (usually '):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2229 "\\\\h\\(\\\\(..\\|.\\)\\(|\\)?"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2230 to t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2231 (let ((from (match-beginning 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2232 (delim (regexp-quote (match-string 1)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2233 (absolute (match-string 2)) ; absolute position?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2234 (N (woman-parse-numeric-arg)) ; distance
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2235 to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2236 msg) ; for warning
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2237 (if (not (looking-at delim))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2238 ;; Warn but leave escape in buffer unprocessed:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2239 (WoMan-warn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2240 "Local horizontal motion (%s) delimiter error!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2241 (buffer-substring from (1+ (point)))) ; point at end of arg
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2242 (setq to (match-end 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2243 ;; For possible warning -- save before deleting:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2244 msg (buffer-substring from to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2245 (delete-region from to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2246 (if absolute ; make relative
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2247 (setq N (- N (current-column))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2248 (if (>= N 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2249 ;; Move forward by inserting hard spaces:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2250 (insert-char woman-unpadded-space-char N)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2251 ;; Move backwards by deleting space,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2252 ;; first backwards then forwards:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2253 (while (and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2254 (<= (setq N (1+ N)) 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2255 (cond ((memq (preceding-char) '(?\ ?\t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2256 (delete-backward-char 1) t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2257 ((memq (following-char) '(?\ ?\t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2258 (delete-char 1) t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2259 (t nil))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2260 (if (<= N 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2261 (WoMan-warn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2262 "Negative horizontal motion (%s) would overwrite!" msg))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2263 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2264 (goto-char from)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2265
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2266
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2267
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2268 ;;; Process ignore requests (.ig), conditionals (.if etc.),
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2269 ;;; source-switch (.so), macro definitions (.de etc.) and macro
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2270 ;;; expansions.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2271
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2272 (defvar woman0-if-to) ; marker bound in woman0-roff-buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2273 (defvar woman0-macro-alist) ; bound in woman0-roff-buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2274 (defvar woman0-search-regex) ; bound in woman0-roff-buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2275 (defvar woman0-search-regex-start ; bound in woman0-roff-buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2276 "^[.'][ \t]*\\(ig\\|if\\|ie\\|el\\|so\\|rn\\|de\\|am")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2277 (defconst woman0-search-regex-end "\\)\\([ \t]+\\|$\\)")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2278 ;; May need other terminal characters, e.g. \, but NOT \n!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2279 ;; Alternatively, force maximal match (Posix?)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2280
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2281 (defvar woman0-rename-alist) ; bound in woman0-roff-buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2282
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2283 (defun woman0-roff-buffer (from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2284 "Process conditional-type requests and user-defined macros, starting at FROM.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2285 Re-scan new text as appropriate."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2286 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2287 (let ((woman0-if-to (make-marker))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2288 request woman0-macro-alist
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2289 (woman0-search-regex-start woman0-search-regex-start)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2290 (woman0-search-regex
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2291 (concat woman0-search-regex-start woman0-search-regex-end))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2292 woman0-rename-alist)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2293 (while (re-search-forward woman0-search-regex nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2294 (setq request (match-string 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2295 (cond ((string= request "ig") (woman0-ig))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2296 ((string= request "if") (woman0-if "if"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2297 ((string= request "ie") (woman0-if "ie"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2298 ((string= request "el") (woman0-el))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2299 ((string= request "so") (woman0-so))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2300 ((string= request "rn") (woman0-rn))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2301 ((string= request "de") (woman0-de))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2302 ((string= request "am") (woman0-de 'append))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2303 (t (woman0-macro request))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2304 (set-marker woman0-if-to nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2305 (woman0-rename)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2306 ;; Should now re-run `woman0-roff-buffer' if any renaming was
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2307 ;; done, but let's just hope this is not necessary for now!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2308 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2309
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2310 (defun woman0-ig ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2311 ".ig yy -- Discard input up to `.yy', which defaults to `..')."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2312 ;; The terminal request MUST begin with . (not ')!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2313 (looking-at "\\(\\S +\\)?")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2314 (beginning-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2315 (let ((yy (or (match-string 1) "."))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2316 (from (point)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2317 (if (re-search-forward
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2318 (concat "^\\.[ \t]*" (regexp-quote yy) ".*\n") nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2319 (delete-region from (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2320 (WoMan-warn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2321 "ig request ignored -- terminator `.%s' not found!" yy)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2322 (woman-delete-line 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2323 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2324
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2325 (defsubst woman0-process-escapes (from to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2326 "Process escapes within an if/ie condition between FROM and TO."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2327 (woman-strings to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2328 (goto-char from) ; necessary!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2329 ;; Strip font-change escapes:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2330 (while (re-search-forward "\\\\f\\((..\\|.\\)" to t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2331 (woman-delete-match 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2332 (goto-char from) ; necessary!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2333 (woman2-process-escapes to 'numeric))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2334
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2335 (defun woman0-if (request)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2336 ".if/ie c anything -- Discard unless c evaluates to true.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2337 Remember condition for use by a subsequent `.el'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2338 REQUEST is the invoking directive without the leading dot."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2339 ;; c evaluates to a one-character built-in condition name or
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2340 ;; 'string1'string2' or a number > 0, prefix ! negates.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2341 ;; \{ ... \} for multi-line use.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2342 ;; Leaves point at start of new text.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2343 (woman-delete-match 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2344 ;; (delete-horizontal-space)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2345 ;; Process escapes in condition:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2346 (let ((from (point)) negated n (c 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2347 (set-marker woman0-if-to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2348 (save-excursion (skip-syntax-forward "^ ") (point)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2349 ;; Process condition:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2350 (if (setq negated (= (following-char) ?!)) (delete-char 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2351 (cond
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2352 ((looking-at "[no]") (setq c t)) ; accept n(roff) and o(dd page)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2353 ((looking-at "[te]") (setq c nil)) ; reject t(roff) and e(ven page)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2354 ;; Unrecognised letter so reject:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2355 ((looking-at "[A-Za-z]") (setq c nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2356 (WoMan-warn "%s %s -- unrecognised condition name rejected!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2357 request (match-string 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2358 ;; Accept strings if identical:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2359 ((save-restriction
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2360 (narrow-to-region from woman0-if-to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2361 ;; String delimiter can be any non-numeric character,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2362 ;; including a special character escape:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2363 (looking-at "\\(\\\\(..\\|[^0-9]\\)\\(.*\\)\\1\\(.*\\)\\1\\'"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2364 (let ((end1 (copy-marker (match-end 2)))) ; end of first string
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2365 ;; Delete 2nd and 3rd delimiters to avoid processing them:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2366 (delete-region (match-end 3) woman0-if-to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2367 (delete-region (match-end 2) (match-beginning 3))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2368 (goto-char (match-end 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2369 (woman0-process-escapes (point) woman0-if-to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2370 (setq c (string= (buffer-substring (point) end1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2371 (buffer-substring end1 woman0-if-to)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2372 (set-marker end1 nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2373 (goto-char from)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2374 ;; Accept numeric value if > 0:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2375 ((numberp (setq n (progn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2376 (woman0-process-escapes from woman0-if-to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2377 (woman-parse-numeric-arg))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2378 (setq c (> n 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2379 (goto-char from))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2380 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2381 (if (eq c 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2382 (woman-if-ignore woman0-if-to request) ; ERROR!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2383 (woman-if-body request woman0-if-to (eq c negated)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2384 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2385
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2386 (defun woman-if-body (request to delete) ; should be reversed as `accept'?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2387 "Process if-body, including \\{ ... \\}, deleting it if TO is non-nil.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2388 REQUEST is the invoking directive.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2389 If DELETE is non-nil, delete from point."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2390 ;; Assume concealed newlines already processed.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2391 (let ((from (point)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2392 (if to (delete-region (point) to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2393 (delete-horizontal-space)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2394 (cond (;;(looking-at "[^{\n]*\\\\{\\s *") ; multi-line
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2395 ;; allow escaped newlines:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2396 (looking-at "[^{\n]*\\(\\\\\n\\)*\\\\{\\s *\\(\\\\\n\\)*") ; multi-line
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2397 ;; including preceding .if(s) and following newline
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2398 (let ((from (point)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2399 (woman-delete-match 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2400 ;; Allow for nested \{ ... \} -- BUT BEWARE that this
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2401 ;; algorithm only supports one level of nesting!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2402 (while
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2403 (and (re-search-forward
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2404 ;; "\\(\\\\{\\)\\|\\(\n[.']\\)?[ \t]*\\\\}[ \t]*"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2405 ;; Interpret bogus `el \}' as `el \{',
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2406 ;; especially for Tcl/Tk man pages:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2407 "\\(\\\\{\\|el[ \t]*\\\\}\\)\\|\\(\n[.']\\)?[ \t]*\\\\}[ \t]*")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2408 (match-string 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2409 (re-search-forward "\\\\}"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2410 (delete-region (if delete from (match-beginning 0)) (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2411 (if (looking-at "^$") (delete-char 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2412 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2413 (delete (woman-delete-line 1)) ; single-line
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2414 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2415 ;; Process matching .el anything:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2416 (cond ((string= request "ie")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2417 ;; Discard unless previous .ie c `evaluated to false'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2418 (cond ((re-search-forward "^[.'][ \t]*el[ \t]*" nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2419 (woman-delete-match 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2420 (woman-if-body "el" nil (not delete)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2421 ;; Got here after processing a single-line `.ie' as a body
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2422 ;; clause to be discarded:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2423 ((string= request "el")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2424 (cond ((re-search-forward "^[.'][ \t]*el[ \t]*" nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2425 (woman-delete-match 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2426 (woman-if-body "el" nil t))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2427 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2428 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2429 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2430
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2431 (defun woman0-el ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2432 "Isolated .el request -- should not happen!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2433 (WoMan-warn "el request without matching `ie' rejected!")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2434 (cond (woman-ignore
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2435 (woman-delete-match 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2436 (delete-horizontal-space)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2437 (woman-if-body "el" nil t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2438 (t ; Ignore -- leave in buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2439 ;; This does not work too well, but it's only for debugging!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2440 (skip-chars-forward "^ \t")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2441 (if (looking-at "[ \t]*\\{") (search-forward "\\}"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2442 (forward-line 1))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2443
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2444 (defun woman-if-ignore (to request)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2445 "Ignore an if request REQUEST at TO and warn about that."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2446 (WoMan-warn-ignored request "ignored -- condition not handled!")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2447 (if woman-ignore
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2448 (woman-if-body request to t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2449 ;; Ignore -- leave in buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2450 ;; This does not work too well, but it's only for debugging!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2451 (skip-chars-forward "^ \t")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2452 (if (looking-at "[ \t]*\\{") (search-forward "\\}"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2453 (forward-line 1)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2454
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2455 (defun woman0-so ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2456 ".so filename -- Switch source file. `.so' requests may be nested."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2457 ;; Leaves point at start of new text.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2458 ;; (skip-chars-forward " \t")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2459 (let* ((beg (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2460 (end (progn (woman-forward-arg 'unquote) (point)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2461 (name (buffer-substring beg end))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2462 (filename name))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2463 ;; If the specified file does not exist in this ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2464 (or (file-exists-p filename)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2465 ;; or the parent directory ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2466 (file-exists-p
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2467 (setq filename (concat "../" name)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2468 ;; then use the WoMan search mechanism to find the filename ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2469 (setq filename
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2470 (woman-file-name
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2471 (file-name-sans-extension
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2472 (file-name-nondirectory name))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2473 ;; Cannot find the file, so ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2474 (kill-buffer (current-buffer))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2475 (error "File `%s' not found" name))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2476 (beginning-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2477 (woman-delete-line 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2478 (let ((from (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2479 (to (make-marker))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2480 (length (woman-insert-file-contents filename 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2481 (set-marker to (+ from length))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2482 (woman-pre-process-region from to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2483 (set-marker to nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2484 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2485 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2486
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2487
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2488 ;;; Process macro definitions:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2489
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2490 (defun woman0-rn ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2491 "Process .rn xx yy -- rename macro xx to yy."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2492 ;; For now, done backwards AFTER all macro expansion.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2493 ;; Should also allow requests and strings to be renamed!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2494 (if (eolp) ; ignore if no argument
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2495 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2496 (let* ((beg (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2497 (end (progn (woman-forward-arg 'unquote 'concat) (point)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2498 (old (buffer-substring beg end))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2499 new)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2500 (if (eolp) ; ignore if no argument
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2501 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2502 (setq beg (point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2503 end (progn (woman-forward-arg 'unquote) (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2504 new (buffer-substring beg end)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2505 woman0-rename-alist (cons (cons new old) woman0-rename-alist)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2506 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2507 (woman-delete-whole-line))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2508
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2509 (defun woman0-rename ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2510 "Effect renaming required by .rn requests."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2511 ;; For now, do this backwards AFTER all macro expansion.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2512 (while woman0-rename-alist
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2513 (let* ((new (car woman0-rename-alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2514 (old (cdr new))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2515 (new (car new)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2516 (setq woman0-rename-alist (cdr woman0-rename-alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2517 (goto-char (point-min))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2518 (setq new (concat "^[.'][ \t]*" (regexp-quote new)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2519 (setq old (concat "." old))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2520 (while (re-search-forward new nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2521 (replace-match old nil t)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2522
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2523 (defconst woman-unescape-regex
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2524 (concat woman-escaped-escape-string
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2525 "\\(" woman-escaped-escape-string "\\)?"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2526
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2527 (defsubst woman-unescape (macro)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2528 "Replace escaped sequences in body of MACRO.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2529 Replaces || by |, but | by \, where | denotes the internal escape."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2530 (let (start)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2531 (while (setq start (string-match woman-unescape-regex macro start))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2532 (setq macro
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2533 (if (match-string 1 macro)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2534 (replace-match "" t t macro 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2535 (replace-match "\\" t t macro))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2536 start (1+ start)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2537 macro))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2538
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2539 (defun woman0-de (&optional append)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2540 "Process .de/am xx yy -- (re)define/append macro xx; end at `..'.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2541 \(Should be up to call of yy, which defaults to `.')
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2542 Optional argument APPEND, if non-nil, means append macro."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2543 ;; Modelled on woman-strings. BEWARE: Processing of .am is a hack!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2544 ;; Add support for .rm?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2545 ;; (skip-chars-forward " \t")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2546 (if (eolp) ; ignore if no argument
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2547 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2548 (looking-at "[^ \t\n]+") ; macro name
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2549 (let* ((macro (match-string 0)) from
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2550 (previous (assoc macro woman0-macro-alist)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2551 (if (not previous)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2552 (setq woman0-search-regex-start
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2553 (concat woman0-search-regex-start "\\|" (regexp-quote macro))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2554 woman0-search-regex
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2555 (concat woman0-search-regex-start woman0-search-regex-end)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2556 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2557 ;; Macro body runs from start of next line to line
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2558 ;; beginning with `..'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2559 ;; The terminal request MUST begin with `.' (not ')!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2560 (forward-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2561 (setq from (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2562 (re-search-forward "^\\.[ \t]*\\.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2563 (beginning-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2564 (let ((body (woman-unescape (buffer-substring from (point)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2565 (if (and append previous)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2566 (setq previous (cdr previous)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2567 body (concat body (cdr previous))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2568 append (car previous)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2569 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2570 (setq macro (cons macro (cons append body))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2571 ;; This should be an update, but consing a new string
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2572 ;; onto the front of the alist has the same effect:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2573 (setq woman0-macro-alist (cons macro woman0-macro-alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2574 (forward-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2575 (delete-region from (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2576 (backward-char) ; return to end of .de/am line
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2577 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2578 (beginning-of-line) ; delete .de/am line
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2579 (woman-delete-line 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2580
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2581 (defun woman0-macro (request)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2582 "Process macro call like the named REQUEST."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2583 ;; Leaves point at start of new text.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2584 (let ((macro (assoc request woman0-macro-alist)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2585 (if macro
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2586 (woman-interpolate-macro (cdr macro))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2587 ;; SHOULD DELETE THE UNINTERPRETED REQUEST!!!!!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2588 ;; Output this message once only per call (cf. strings)?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2589 (WoMan-warn "Undefined macro %s not interpolated!" request))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2590
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2591 (defun woman-interpolate-macro (macro)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2592 "Interpolate (.de) or append (.am) a expansion of MACRO into the buffer."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2593 ;; Could make this more efficient by checking which arguments are
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2594 ;; actually used in the expansion!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2595 (skip-chars-forward " \t")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2596 ;; Process arguments:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2597 (let ((argno 0) (append (car macro))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2598 argno-string formal-arg from actual-arg start)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2599 (setq macro (cdr macro))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2600 (while (not (eolp))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2601 ;; Get next actual arg:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2602 (setq argno (1+ argno))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2603 (setq argno-string (format "%d" argno))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2604 (setq formal-arg (concat "\\\\\\$" argno-string)) ; regexp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2605 (setq from (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2606 (woman-forward-arg 'unquote 'noskip)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2607 (setq actual-arg (buffer-substring from (point)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2608 (skip-chars-forward " \t") ; now skip following whitespace!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2609 ;; Replace formal arg with actual arg:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2610 (setq start nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2611 (while (setq start (string-match formal-arg macro start))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2612 (setq macro (replace-match actual-arg t t macro)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2613 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2614 ;; Delete any remaining formal arguments:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2615 (setq start nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2616 (while
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2617 (setq start (string-match "\\\\\\$." macro start))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2618 (setq macro (replace-match "" t t macro)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2619 ;; Replace .$ number register with actual arg:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2620 ;; (Do this properly via register mechanism later!)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2621 (setq start nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2622 (while
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2623 (setq start (string-match "\\\\n(\\.\\$" macro start)) ; regexp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2624 (setq macro (replace-match argno-string t t macro)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2625 (if append
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2626 (forward-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2627 (beginning-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2628 (woman-delete-line 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2629 (save-excursion ; leave point at start of new text
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2630 (insert macro))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2631
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2632
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2633 ;;; Process strings:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2634
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2635 (defun woman-strings (&optional to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2636 "Process ?roff strings: defined/updated by `.ds xx string' requests.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2637 Interpolate by `\*x' and `\*(xx' escapes.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2638 Optional argument TO specifies where in the buffer does the request end."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2639 ;; Add support for .as and .rm?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2640 (while
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2641 ;; Find .ds requests and \* escapes:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2642 (re-search-forward "\\(^[.'][ \t]*ds\\)\\|\\\\\\*" to t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2643 (cond ((match-string 1) ; .ds
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2644 (skip-chars-forward " \t")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2645 (if (eolp) ; ignore if no argument
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2646 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2647 (re-search-forward "[^ \t\n]+")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2648 (let ((string (match-string 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2649 (skip-chars-forward " \t")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2650 ; (setq string
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2651 ; (cons string
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2652 ; ;; hack (?) for CGI.man!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2653 ; (cond ((looking-at "\"\"") "\"")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2654 ; ((looking-at ".*") (match-string 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2655 ; ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2656 ;; Above hack causes trouble in arguments!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2657 (looking-at ".*")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2658 (setq string (cons string (match-string 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2659 ;; This should be an update, but consing a new string
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2660 ;; onto the front of the alist has the same effect:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2661 (setq woman-string-alist (cons string woman-string-alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2662 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2663 (beginning-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2664 (woman-delete-line 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2665 (t ; \*
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2666 (let ((beg (match-beginning 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2667 (cond ((= (following-char) ?\( )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2668 (forward-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2669 (re-search-forward ".."))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2670 (t (re-search-forward ".")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2671 (let* ((stringname (match-string 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2672 (string (assoc stringname woman-string-alist)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2673 (cond (string
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2674 (delete-region beg (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2675 ;; Temporary hack in case string starts with a
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2676 ;; control character:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2677 (if (bolp) (insert-before-markers "\\&"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2678 (insert-before-markers (cdr string)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2679 (t
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2680 (WoMan-warn "Undefined string %s not interpolated!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2681 stringname)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2682 (cond (woman-ignore
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2683 ;; Output above message once only per call
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2684 (delete-region beg (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2685 (setq woman-string-alist
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2686 (cons (cons stringname "")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2687 woman-string-alist))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2688 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2689 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2690 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2691 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2692
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2693
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2694 ;;; Process special character escapes \(xx:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2695
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2696 (defconst woman-special-characters
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2697 ;; To be built heuristically as required!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2698 ;; MUST insert all characters as strings for correct conversion to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2699 ;; multibyte representation!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2700 '(("em" "--" "\276" . t) ; 3/4 Em dash
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2701 ("bu" "*" "\267" . t) ; bullet
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2702 ("fm" "'") ; foot mark
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2703 ("co" "(C)" "\251") ; copyright
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2704
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2705 ("pl" "+" "+" . t) ; math plus
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2706 ("mi" "-" "-" . t) ; math minus
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2707 ("**" "*" "*" . t) ; math star
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2708 ("aa" "'" "\242" . t) ; acute accent
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2709 ("ul" "_") ; underrule
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2710
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2711 ("*S" "Sigma" "S" . t) ; Sigma
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2712
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2713 (">=" ">=" "\263" . t) ; >=
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2714 ("<=" "<=" "\243" . t) ; <=
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2715 ("->" "->" "\256" . t) ; right arrow
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2716 ("<-" "<-" "\254" . t) ; left arrow
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2717 ("mu" " x " "\264" . t) ; multiply
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2718 ("+-" "+/-" "\261" . t) ; plus-minus
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2719 ("bv" "|") ; bold vertical
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2720
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2721 ;; groff etc. extensions:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2722 ("lq" "\"")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2723 ("rq" "\"")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2724 ("aq" "'")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2725 ("ha" "^")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2726 ("ti" "~")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2727 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2728 "Alist of special character codes with ASCII and extended-font equivalents.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2729 Each alist elements has the form
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2730 (input-string ascii-string extended-font-string . use-symbol-font)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2731 where
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2732 * `\\(input-string' is the ?roff encoding,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2733 * `ascii-string' is the (multi-character) ASCII simulation,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2734 * `extended-font-string' is the single-character string representing
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2735 the character position in the extended 256-character font, and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2736 * `use-symbol-font' is t to indicate use of the symbol font or nil,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2737 i.e. omitted, to indicate use of the default font.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2738 Any element may be nil. Avoid control character codes (0 to \\37, \\180
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2739 to \\237) in `extended-font-string' for now, since they can be
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2740 displayed only with a modified display table.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2741
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2742 Use the Emacs command `woman-display-extended-fonts' or a character
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2743 map accessory to help construct this alist.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2744
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2745 (defun woman-special-characters (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2746 "Process special character escapes \(xx up to buffer position TO."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2747 ;; Must be done AFTER translation, which may use special chars.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2748 (while (re-search-forward "\\\\(\\(..\\)" to t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2749 (let ((replacement
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2750 (assoc (match-string-no-properties 1) woman-special-characters)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2751 (if (and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2752 replacement
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2753 (cond ((and woman-use-symbols (cddr replacement))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2754 ; use extended font
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2755 (woman-delete-match 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2756 (insert-before-markers (nth 2 replacement))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2757 (if (nthcdr 3 replacement) ; use woman-symbol-face
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2758 (put-text-property (1- (point)) (point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2759 'face 'woman-symbol-face))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2760 t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2761 ((cadr replacement) ; Use ASCII simulation
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2762 (woman-delete-match 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2763 (insert-before-markers (cadr replacement))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2764 t)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2765 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2766 (WoMan-warn "Special character \\(%s not interpolated!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2767 (match-string-no-properties 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2768 (if woman-ignore (woman-delete-match 0))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2769 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2770
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2771 (defun woman-display-extended-fonts ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2772 "Display glyphs of graphic charactes and their octal codes.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2773 All the characters in the ranges [32..127] and [160..255] are displayed
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2774 together with the corresponding glyphs from the default and symbol fonts.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2775 Useful for constructing the `woman-special-characters' alist."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2776 (interactive)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2777 (with-output-to-temp-buffer "*WoMan Extended Font Map*"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2778 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2779 (set-buffer standard-output)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2780 (let ((i 32))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2781 (while (< i 256)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2782 (insert (format "\\%03o " i) (string i) " " (string i))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2783 (put-text-property (1- (point)) (point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2784 'face 'woman-symbol-face)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2785 (insert " ")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2786 (setq i (1+ i))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2787 (when (= i 128) (setq i 160) (insert "\n"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2788 (if (zerop (% i 8)) (insert "\n")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2789 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2790 (print-help-return-message)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2791
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2792
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2793 ;;; Formatting macros that do not cause a break:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2794
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2795 (defvar request) ; Bound locally by woman1-roff-buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2796 (defvar unquote) ; Bound locally by woman1-roff-buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2797
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2798 (defun woman-unquote (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2799 "Delete any double-quote characters between point and TO.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2800 Leave point at TO (which should be a marker)."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2801 (let (in-quote)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2802 (while (search-forward "\"" to 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2803 (if (and in-quote (looking-at "\""))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2804 ;; Repeated double-quote represents single double-quote
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2805 (delete-char 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2806 (if (or in-quote (looking-at ".*\"")) ; paired
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2807 (delete-char -1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2808 (setq in-quote (not in-quote))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2809 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2810 (if in-quote
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2811 (WoMan-warn "Unpaired \" in .%s arguments." request))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2812 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2813
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2814 (defsubst woman-unquote-args ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2815 "Delete any double-quote characters up to the end of the line."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2816 (woman-unquote (save-excursion (end-of-line) (point-marker))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2817
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2818 (defun woman1-roff-buffer ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2819 "Process non-breaking requests."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2820 (let ((case-fold-search t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2821 request fn unquote)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2822 (while
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2823 ;; Find next control line:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2824 (re-search-forward woman-request-regexp nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2825 (cond
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2826 ;; Construct woman function to call:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2827 ((setq fn (intern-soft
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2828 (concat "woman1-"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2829 (setq request (match-string 1)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2830 (if (get fn 'notfont) ; not a font-change request
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2831 (funcall fn)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2832 ;; Delete request or macro name:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2833 (woman-delete-match 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2834 ;; If no args then apply to next line else unquote args
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2835 ;; (unquote is used by called function):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2836 (setq unquote (not (eolp)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2837 (if (eolp) (delete-char 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2838 ; ;; Hide leading control character in unquoted argument:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2839 ; (cond ((memq (following-char) '(?. ?'))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2840 ; (insert "\\&")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2841 ; (beginning-of-line)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2842 ;; Call the appropriate function:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2843 (funcall fn)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2844 ;; Hide leading control character in quoted argument (only):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2845 (if (and unquote (memq (following-char) '(?. ?')))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2846 (insert "\\&"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2847 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2848 )))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2849
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2850 ;;; Font-changing macros:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2851
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2852 (defun woman1-B ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2853 ".B -- Set words of current line in bold font."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2854 (woman1-B-or-I ".ft B\n"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2855
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2856 (defun woman1-I ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2857 ".I -- Set words of current line in italic font."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2858 (woman1-B-or-I ".ft I\n"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2859
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2860 (defun woman1-B-or-I (B-or-I)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2861 ".B/I -- Set words of current line in bold/italic font.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2862 B-OR-I is the invoking directive."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2863 ;; Should NOT concatenate the arguments!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2864 (insert B-or-I) ; because it might be a control line
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2865 ;; Return to bol to process .SM/.B, .B/.if etc.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2866 ;; or start of first arg to hide leading control char.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2867 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2868 (if unquote
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2869 (woman-unquote-args)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2870 (while (looking-at "^[.']") (forward-line))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2871 (end-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2872 (delete-horizontal-space))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2873 (insert "\\fR")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2874
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2875 (defun woman1-SM ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2876 ".SM -- Set the current line in small font, i.e. IGNORE!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2877 nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2878
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2879 (defalias 'woman1-SB 'woman1-B)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2880 ;; .SB -- Set the current line in small bold font, i.e. just embolden!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2881 ;; (This is what c:/usr/local/share/groff/tmac/tmac.an does. The
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2882 ;; Linux man.7 is wrong about this!)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2883
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2884 (defun woman1-BI ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2885 ".BI -- Join words of current line alternating bold and italic fonts."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2886 (woman1-alt-fonts (list "\\fB" "\\fI")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2887
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2888 (defun woman1-BR ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2889 ".BR -- Join words of current line alternating bold and Roman fonts."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2890 (woman1-alt-fonts (list "\\fB" "\\fR")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2891
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2892 (defun woman1-IB ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2893 ".IB -- Join words of current line alternating italic and bold fonts."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2894 (woman1-alt-fonts (list "\\fI" "\\fB")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2895
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2896 (defun woman1-IR ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2897 ".IR -- Join words of current line alternating italic and Roman fonts."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2898 (woman1-alt-fonts (list "\\fI" "\\fR")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2899
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2900 (defun woman1-RB ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2901 ".RB -- Join words of current line alternating Roman and bold fonts."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2902 (woman1-alt-fonts (list "\\fR" "\\fB")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2903
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2904 (defun woman1-RI ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2905 ".RI -- Join words of current line alternating Roman and italic fonts."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2906 (woman1-alt-fonts (list "\\fR" "\\fI")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2907
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2908 (defun woman1-alt-fonts (fonts)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2909 "Join words using alternating fonts in FONTS, which MUST be a dynamic list."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2910 (nconc fonts fonts) ; circular list!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2911 (insert (car fonts))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2912 ;; Return to start of first arg to hide leading control char:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2913 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2914 (setq fonts (cdr fonts))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2915 (woman-forward-arg unquote 'concat) ; unquote is bound above
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2916 (while (not (eolp))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2917 (insert (car fonts))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2918 (setq fonts (cdr fonts))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2919 (woman-forward-arg unquote 'concat)) ; unquote is bound above
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2920 (insert "\\fR")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2921 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2922
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2923 (defun woman-forward-arg (&optional unquote concat)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2924 "Move forward over one ?roff argument, optionally deleting quotes.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2925 If optional arg UNQUOTE is non-nil, delete any argument quotes.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2926 If optional arg CONCAT is non-nil, join arguments."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2927 (if (eq (following-char) ?\")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2928 (progn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2929 (if unquote (delete-char 1) (forward-char))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2930 (re-search-forward "\"\\|$")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2931 ;; Repeated double-quote represents single double-quote
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2932 (while (eq (following-char) ?\") ; paired
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2933 (if unquote (delete-char 1) (forward-char))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2934 (re-search-forward "\"\\|$"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2935 (if (eq (preceding-char) ?\")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2936 (if unquote (delete-backward-char 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2937 (WoMan-warn "Unpaired \" in .%s arguments." request)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2938 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2939 ;; (re-search-forward "[^\\\n] \\|$") ; inconsistent
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2940 (skip-syntax-forward "^ "))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2941 (cond ((null concat) (skip-chars-forward " \t")) ; don't skip eol!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2942 ((eq concat 'noskip)) ; do not skip following whitespace
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2943 (t (woman-delete-following-space)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2944 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2945
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2946
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2947 ;;; The following requests are not explicit font-change requests and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2948 ;;; so are flagged `notfont' to turn off automatic request deletion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2949 ;;; and further processing.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2950
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2951 (put 'woman1-TP 'notfont t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2952 (defun woman1-TP ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2953 ".TP -- After tag line, reset font to Roman for paragraph body."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2954 ;; Same for .IP, but forward only 1 line?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2955 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2956 ;; May be an `irrelevant' control line in the way, so ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2957 (forward-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2958 (forward-line (if (looking-at "\\.\\S-+[ \t]*$") 2 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2959 ;; May be looking at control line, so ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2960 (insert ".ft R\n")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2961
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2962 (put 'woman1-ul 'notfont t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2963 (defun woman1-ul ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2964 ".ul N -- Underline (italicize) the next N input lines, default N = 1."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2965 (let ((N (if (eolp) 1 (woman-parse-numeric-arg)))) ; woman-get-numeric-arg ?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2966 (woman-delete-whole-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2967 (insert ".ft I\n")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2968 (forward-line N)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2969 (insert ".ft R\n")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2970 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2971
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2972 ;; Other non-breaking requests:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2973
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2974 ;; Hyphenation
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2975 ;; Warnings commented out.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2976
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2977 (put 'woman1-nh 'notfont t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2978 (defun woman1-nh ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2979 ".nh -- No hyphenation, i.e. IGNORE!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2980 ;; Must be handled here to avoid breaking!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2981 ;; (WoMan-log-1 ".nh request ignored -- hyphenation not supported!")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2982 (woman-delete-whole-line))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2983
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2984 (put 'woman1-hy 'notfont t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2985 (defun woman1-hy ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2986 ".hy N -- Set hyphenation mode to N, i.e. IGNORE!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2987 ;; (WoMan-log-1 ".hy request ignored -- hyphenation not supported!")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2988 (woman-delete-whole-line))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2989
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2990 (put 'woman1-hc 'notfont t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2991 (defun woman1-hc ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2992 ".hc c -- Set hyphenation character to c, i.e. delete it!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2993 (let ((c (char-to-string (following-char))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2994 ;; (WoMan-log
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2995 ;; "Hyphenation character %s deleted -- hyphenation not supported!" c)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2996 (woman-delete-whole-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2997 (setq c (concat "\\(" c "\\)\\|^[.'][ \t]*hc"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2998 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2999 (while (and (re-search-forward c nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3000 (match-string 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3001 (delete-char -1)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3002 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3003
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3004 (put 'woman1-hw 'notfont t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3005 (defun woman1-hw ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3006 ".hw words -- Set hyphenation exception words, i.e. IGNORE!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3007 ;; (WoMan-log-1 ".hw request ignored -- hyphenation not supported!")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3008 (woman-delete-whole-line))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3009
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3010 ;; Other non-breaking requests correctly ignored by nroff:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3011
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3012 (put 'woman1-ps 'notfont t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3013 (defalias 'woman1-ps 'woman-delete-whole-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3014 ;; .ps -- Point size -- IGNORE!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3015
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3016 (put 'woman1-ss 'notfont t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3017 (defalias 'woman1-ss 'woman-delete-whole-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3018 ;; .ss -- Space-character size -- IGNORE!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3019
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3020 (put 'woman1-cs 'notfont t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3021 (defalias 'woman1-cs 'woman-delete-whole-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3022 ;; .cs -- Constant character space (width) mode -- IGNORE!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3023
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3024 (put 'woman1-ne 'notfont t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3025 (defalias 'woman1-ne 'woman-delete-whole-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3026 ;; .ne -- Need vertical space -- IGNORE!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3027
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3028 (put 'woman1-vs 'notfont t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3029 (defalias 'woman1-vs 'woman-delete-whole-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3030 ;; .vs -- Vertical base line spacing -- IGNORE!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3031
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3032 (put 'woman1-bd 'notfont t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3033 (defalias 'woman1-bd 'woman-delete-whole-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3034 ;; .bd -- Embolden font -- IGNORE!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3035
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3036 ;; Non-breaking SunOS-specific macros:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3037
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3038 (defun woman1-TX ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3039 ".TX t p -- Resolve SunOS abbrev t and join to p (usually punctuation)."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3040 (insert "SunOS ")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3041 (woman-forward-arg 'unquote 'concat))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3042
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3043 (put 'woman1-IX 'notfont t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3044 (defalias 'woman1-IX 'woman-delete-whole-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3045 ;; .IX -- Index macro, for Sun internal use -- IGNORE!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3046
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3047
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3048 ;;; Direct font selection:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3049
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3050 (defconst woman-font-alist
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3051 '(("R" . default)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3052 ("I" . woman-italic-face)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3053 ("B" . woman-bold-face)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3054 ("P" . previous)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3055 ("1" . default)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3056 ("2" . woman-italic-face)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3057 ("3" . woman-bold-face) ; used in bash.1
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3058 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3059 "Alist of ?roff font indicators and woman font variables and names.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3060
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3061 (defun woman-change-fonts ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3062 "Process font changes."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3063 ;; ***** NEEDS REVISING IF IT WORKS OK *****
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3064 ;; Paragraph .LP/PP/HP/IP/TP and font .B/.BI etc. macros reset font.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3065 ;; Should .SH/.SS reset font?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3066 ;; Font size setting macros (?) should reset font.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3067 (let ((woman-font-alist woman-font-alist) ; for local updating
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3068 (previous-pos (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3069 (previous-font 'default)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3070 (current-font 'default))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3071 (while
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3072 ;; Find font requests, paragraph macros and font escapes:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3073 (re-search-forward
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3074 "^[.'][ \t]*\\(\\(\\ft\\)\\|\\(.P\\)\\)\\|\\(\\\\f\\)" nil 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3075 (let (font beg notfont)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3076 ;; Match font indicator and leave point at end of sequence:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3077 (cond ((match-string 2)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3078 ;; .ft request found
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3079 (setq beg (match-beginning 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3080 (skip-chars-forward " \t")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3081 (if (eolp) ; default is previous font
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3082 (setq font previous-font)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3083 (looking-at "[^ \t\n]+"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3084 (forward-line)) ; end of control line and \n
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3085 ((match-string 3)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3086 ;; Macro that resets font found
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3087 (setq font 'default))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3088 ((match-string 4)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3089 ;; \f escape found
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3090 (setq beg (match-beginning 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3091 (cond ((= (following-char) ?\( )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3092 (forward-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3093 (re-search-forward ".."))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3094 (t (re-search-forward ".")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3095 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3096 (t (setq notfont t)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3097 (if notfont
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3098 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3099 ;; Get font name:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3100 (or font
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3101 (let ((fontstring (match-string 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3102 (setq font (assoc fontstring woman-font-alist)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3103 ;; NB: woman-font-alist contains VARIABLE NAMES.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3104 font (if font
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3105 (cdr font)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3106 (WoMan-warn "Unknown font %s." fontstring)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3107 ;; Output this message once only per call ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3108 (setq woman-font-alist
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3109 (cons (cons fontstring 'woman-unknown-face)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3110 woman-font-alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3111 'woman-unknown-face)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3112 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3113 ;; Delete font control line or escape sequence:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3114 (cond (beg (delete-region beg (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3115 (if (eq font 'previous) (setq font previous-font))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3116 (woman-set-face previous-pos (point) current-font)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3117 (if beg
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3118 ;; Explicit font control
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3119 (setq previous-pos (point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3120 previous-font current-font)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3121 ;; Macro that resets font
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3122 ;; (forward-line) ; DOES NOT WORK! but unnecessary?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3123 ;; Must process font changes in any paragraph tag!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3124 (setq previous-pos (point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3125 previous-font 'default))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3126 (setq current-font font)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3127 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3128 ;; Set font after last request up to eob:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3129 (woman-set-face previous-pos (point) current-font)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3130 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3131
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3132 (defun woman-set-face (from to face)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3133 "Set the face of the text from FROM to TO to face FACE.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3134 Ignore the default face and underline only word characters."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3135 (or (eq face 'default) ; ignore
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3136 (not woman-fontify)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3137 (if (face-underline-p face)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3138 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3139 (let ((face-no-ul (intern (concat (symbol-name face) "-no-ul"))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3140 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3141 (while (< (point) to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3142 (skip-syntax-forward "w" to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3143 (put-text-property from (point) 'face face)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3144 (setq from (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3145 (skip-syntax-forward "^w" to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3146 (put-text-property from (point) 'face face-no-ul)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3147 (setq from (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3148 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3149 (put-text-property from to 'face face))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3150 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3151
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3152
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3153 ;;; Output translation:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3154
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3155 (defvar translations nil) ; Also bound locally by woman2-roff-buffer
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3156 ;; A list of the form (\"[ace]\" (a . b) (c . d) (e . ?\ )) or nil.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3157
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3158 (defun woman-get-next-char ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3159 "Return and delete next char in buffer, including special chars."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3160 (if ;;(looking-at "\\\\(\\(..\\)")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3161 ;; Match special \(xx and strings \*x, \*(xx:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3162 (looking-at "\\\\\\((..\\|\\*\\((..\\|.\\)\\)")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3163 (prog1 (match-string 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3164 (woman-delete-match 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3165 (prog1 (char-to-string (following-char))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3166 (delete-char 1))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3167
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3168 (defun woman2-tr (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3169 ".tr abcde -- Translate a -> b, c -> d, ..., e -> space.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3170 TO is the buffer position where the directive ends.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3171 \(Breaks, but should not.) Supports special chars."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3172 ;; This should be an update, but consing onto the front of the alist
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3173 ;; has the same effect and match duplicates should not matter.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3174 ;; Initialize translation data structures:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3175 (let ((matches (car translations))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3176 (alist (cdr translations))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3177 a b)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3178 ;; `matches' must be a string:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3179 (setq matches
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3180 (concat (if matches (substring matches 1 -1)) "]"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3181 ;; Process .tr arguments:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3182 (while (not (eolp)) ; (looking-at "[ \t]*$") ???
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3183 (setq a (woman-get-next-char))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3184 (if (eolp)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3185 (setq b " ")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3186 (setq b (woman-get-next-char)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3187 (setq matches
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3188 (if (= (length a) 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3189 (concat a matches)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3190 (concat matches "\\|\\" a))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3191 alist (cons (cons a b) alist)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3192 (delete-char 1) ; no blank line
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3193 ;; Rebuild translations list:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3194 (setq matches
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3195 (if (= (string-to-char matches) ?\])
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3196 (substring matches 3)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3197 (concat "[" matches))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3198 translations (cons matches alist))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3199 ;; Format any following text:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3200 (woman2-format-paragraphs to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3201 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3202
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3203 (defsubst woman-translate (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3204 "Translate up to marker TO. Do this last of all transformations."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3205 (if translations
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3206 (let ((matches (car translations))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3207 (alist (cdr translations)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3208 (while (re-search-forward matches to t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3209 ;; Done like this to retain text properties and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3210 ;; support translation of special characters:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3211 (insert-before-markers-and-inherit
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3212 (cdr (assoc
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3213 (buffer-substring-no-properties
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3214 (match-beginning 0) (match-end 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3215 alist)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3216 (woman-delete-match 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3217 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3218
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3219
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3220 ;;; Registers:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3221
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3222 (defvar woman-registers ; these are all read-only
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3223 '((".H" 24) (".V" 48) ; resolution in basic units
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3224 (".g" 0) ; not groff
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3225 ;; (Iff emulating groff need to implement groff italic correction
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3226 ;; \/, e.g. for pic.1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3227 (".i" left-margin) ; current indent
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3228 (".j" woman-adjust) ; current adjustment
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3229 (".l" fill-column) ; current line length
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3230 (".s" 12) ; current point size
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3231 (".u" (if woman-nofill 0 1)) ; 1/0 in fill/nofill mode
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3232 (".v" 48) ; current vertical line spacing
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3233 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3234 "Register alist: the key is the register name as a string.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3235 Each element has the form (KEY VALUE . INC) -- inc may be nil.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3236 Also bound locally in `woman2-roff-buffer'.")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3237
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3238 (defun woman-mark-horizonal-position ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3239 "\\kx -- Store current horizontal position in INPUT LINE in register x."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3240 (while (re-search-forward "\\\\k\\(.\\)" nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3241 (goto-char (match-beginning 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3242 (setq woman-registers
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3243 (cons (list (match-string 1) (current-column))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3244 woman-registers))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3245 (woman-delete-match 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3246
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3247 (defsubst woman2-process-escapes-to-eol (&optional numeric)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3248 "Process remaining escape sequences up to eol.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3249 Handle numeric arguments specially if optional argument NUMERIC is non-nil."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3250 (woman2-process-escapes
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3251 (save-excursion (end-of-line) (point-marker))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3252 numeric))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3253
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3254 (defun woman2-nr (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3255 ".nr R +/-N M -- Assign +/-N to register R wrt to previous value, if any.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3256 The increment for auto-incrementing is set to M.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3257 TO is where the directive ends.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3258 \[Breaks, but should not!]"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3259 (let* ((name (buffer-substring
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3260 (point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3261 (progn (skip-syntax-forward "^ ") (point))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3262 (pm (progn ; increment
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3263 (skip-chars-forward " \t")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3264 (when (memq (char-after) '(?+ ?-))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3265 (forward-char) (char-before))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3266 (value (if (eolp) ; no value
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3267 nil ; to be interpreted as zero
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3268 (woman2-process-escapes-to-eol 'numeric)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3269 (woman-parse-numeric-arg)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3270 (inc (progn ; auto-increment
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3271 (skip-chars-forward " \t")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3272 (if (eolp) ; no value
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3273 nil ; to be interpreted as zero ???
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3274 (woman-parse-numeric-arg))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3275 (oldvalue (assoc name woman-registers)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3276 (when oldvalue
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3277 (setq oldvalue (cdr oldvalue)) ; (value . inc)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3278 (unless inc (setq inc (cdr oldvalue))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3279 (cond ((null value)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3280 (setq value 0) ; correct?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3281 (WoMan-warn "nr %s -- null value assigned as zero!" name))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3282 ((symbolp value)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3283 (setq value (list 'quote value))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3284 (if pm ; increment old value
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3285 (setq oldvalue (if oldvalue (car oldvalue) 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3286 value (if (eq pm ?+)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3287 (+ oldvalue value)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3288 (- oldvalue value))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3289 (setq woman-registers
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3290 (cons (cons name (cons value inc)) woman-registers))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3291 (woman-delete-whole-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3292 (woman2-format-paragraphs to)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3293
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3294
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3295 ;;; Numeric (and "non-text") request arguments:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3296
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3297 (defsubst woman-get-numeric-arg ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3298 "Get the value of a numeric argument at or after point, don't move point.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3299 The argument can include the width function and scale indicators.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3300 Assumes 10 characters per inch."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3301 (woman2-process-escapes-to-eol 'numeric)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3302 (save-excursion (woman-parse-numeric-arg)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3303
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3304 (defun woman-parse-numeric-arg ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3305 "Get the value of a numeric expression at or after point.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3306 Unlike `woman-get-numeric-arg', leaves point after the argument.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3307 The expression may be an argument in quotes."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3308 (if (= (following-char) ?\") (forward-char))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3309 ;; Allow leading +/-:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3310 (let ((value (if (looking-at "[+-]") 0 (woman-parse-numeric-value)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3311 op)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3312 (while (cond
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3313 ((looking-at "[+-/*%]") ; arithmetic operators
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3314 (forward-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3315 (setq op (intern-soft (match-string 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3316 (setq value (funcall op value (woman-parse-numeric-value))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3317 ((looking-at "[<=>]=?") ; relational operators
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3318 (goto-char (match-end 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3319 (setq op (or (intern-soft (match-string 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3320 (intern-soft "=")))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3321 (setq value (if (funcall op value (woman-parse-numeric-value))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3322 1 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3323 ((memq (setq op (following-char)) '(?& ?:)) ; Boolean and / or
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3324 (forward-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3325 (setq value
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3326 ;; and / or are special forms, not functions, in ELisp
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3327 (if (eq op ?&)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3328 ;; and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3329 (if (> value 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3330 (if (> (woman-parse-numeric-value) 0) 1 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3331 ;; skip second operand
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3332 (prog1 0 (woman-parse-numeric-value)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3333 ;; or
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3334 (if (> value 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3335 ;; skip second operand
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3336 (prog1 1 (woman-parse-numeric-value))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3337 (if (> (woman-parse-numeric-value) 0) 1 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3338 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3339 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3340 ; (if (looking-at "[ \t\nRC\)\"]") ; R, C are tab types
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3341 ; ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3342 ; (WoMan-warn "Unimplemented numerical operator `%c' in %s"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3343 ; (following-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3344 ; (buffer-substring
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3345 ; (save-excursion (beginning-of-line) (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3346 ; (save-excursion (end-of-line) (point))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3347 ; (skip-syntax-forward "^ "))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3348 value
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3349 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3350
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3351 (defun woman-parse-numeric-value ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3352 "Get a single numeric value at or after point.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3353 Leaving point after the value. It can be a number register or width
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3354 function (which assumes 10 characters per inch) and can include scale
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3355 indicators. The value may be an expression in parentheses."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3356 ;; Must replace every \' by some different single character first
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3357 ;; before calling this function by calling
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3358 ;; (woman2-process-escapes-to-eol 'numeric)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3359 (if (eq (following-char) ?\()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3360 ;; Treat parenthesized expression as a single value.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3361 (let (n)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3362 (forward-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3363 (setq n (woman-parse-numeric-arg))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3364 (skip-syntax-forward " ")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3365 (if (eq (following-char) ?\))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3366 (forward-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3367 (WoMan-warn "Parenthesis confusion in numeric expression!"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3368 n)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3369 (let ((n (cond ((looking-at "[-+]?[.0-9]+") ; single number
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3370 ;; currently needed to set match-end, even though
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3371 ;; string-to-number returns 0 if number not parsed.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3372 (string-to-number (match-string 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3373 ((looking-at "\\\\n\\([-+]\\)?\\(\(\\(..\\)\\|\\(.\\)\\)")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3374 ;; interpolate number register, maybe auto-incremented
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3375 (let* ((pm (match-string-no-properties 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3376 (name (or (match-string-no-properties 3)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3377 (match-string-no-properties 4)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3378 (value (assoc name woman-registers)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3379 (if value
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3380 (let (inc)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3381 (setq value (cdr value) ; (value . inc)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3382 inc (cdr value)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3383 ;; eval internal (.X) registers
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3384 ;; stored as lisp variable names:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3385 value (eval (car value)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3386 (if (and pm inc) ; auto-increment
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3387 (setq value
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3388 (funcall (intern-soft pm) value inc)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3389 woman-registers
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3390 (cons (cons name (cons value inc))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3391 woman-registers)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3392 value)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3393 (WoMan-warn "Undefined register %s defaulted to 0."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3394 name)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3395 0) ; default to zero
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3396 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3397 ((re-search-forward
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3398 ;; Delimiter can be special char escape \(.. or
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3399 ;; single normal char (usually '):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3400 "\\=\\\\w\\(\\\\(..\\|.\\)" nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3401 (let ((from (match-end 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3402 (delim (regexp-quote (match-string 1))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3403 (if (re-search-forward delim nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3404 ;; Return width of string:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3405 (- (match-beginning 0) from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3406 (WoMan-warn "Width escape delimiter error!"))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3407 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3408 (if (null n)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3409 ;; ERROR -- should handle this better!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3410 (progn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3411 (WoMan-warn "Numeric/register argument error: %s"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3412 (buffer-substring
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3413 (point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3414 (save-excursion (end-of-line) (point))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3415 (skip-syntax-forward "^ ")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3416 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3417 (goto-char (match-end 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3418 ;; Check for scale factor:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3419 (if
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3420 (cond
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3421 ((looking-at "\\s ") nil) ; stay put!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3422 ((looking-at "[mnuv]")) ; ignore for now
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3423 ((looking-at "i") (setq n (* n 10))) ; inch
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3424 ((looking-at "c") (setq n (* n 3.9))) ; cm
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3425 ((looking-at "P") (setq n (* n 1.7))) ; Pica
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3426 ((looking-at "p") (setq n (* n 0.14))) ; point
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3427 ;; NB: May be immediately followed by + or -, etc.,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3428 ;; in which case do nothing and return nil.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3429 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3430 (goto-char (match-end 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3431 (if (numberp n) (round n) n))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3432 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3433
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3434
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3435 ;;; VERTICAL FORMATTING -- Formatting macros that cause a break:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3436
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3437 ; Vertical spacing philosophy:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3438 ; Delete all vertical space as it is encountered. Then insert
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3439 ; vertical space only before text, as required.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3440
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3441 (defun woman2-roff-buffer ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3442 "Process breaks. Format paragraphs and headings."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3443 (let ((case-fold-search t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3444 (to (make-marker))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3445 (canonically-space-region
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3446 (symbol-function 'canonically-space-region))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3447 (insert-and-inherit (symbol-function 'insert-and-inherit))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3448 (set-text-properties (symbol-function 'set-text-properties))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3449 (woman-registers woman-registers)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3450 fn request translations
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3451 tab-stop-list)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3452 ;; ?roff does not squeeze multiple spaces, but does fill, so...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3453 (fset 'canonically-space-region 'ignore)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3454 ;; Try to avoid spaces inheriting underlines from preceding text!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3455 (fset 'insert-and-inherit (symbol-function 'insert))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3456 (fset 'set-text-properties 'ignore)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3457 (unwind-protect
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3458 (while
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3459 ;; Find next control line:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3460 (re-search-forward woman-request-regexp nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3461 (cond
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3462 ;; Construct woman function to call:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3463 ((setq fn (intern-soft
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3464 (concat "woman2-"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3465 (setq request (match-string 1)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3466 ;; Delete request or macro name:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3467 (woman-delete-match 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3468 ;; Unrecognised request:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3469 ((prog1 nil
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3470 ;; (WoMan-warn ".%s request ignored!" request)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3471 (WoMan-warn-ignored request "ignored!")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3472 ;; (setq fn 'woman2-LP)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3473 ;; AVOID LEAVING A BLANK LINE!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3474 ;; (setq fn 'woman2-format-paragraphs)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3475 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3476 ;; .LP assumes it is at eol and leaves a (blank) line,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3477 ;; so leave point at end of line before paragraph:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3478 ((or (looking-at "[ \t]*$") ; no argument
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3479 woman-ignore) ; ignore all
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3480 ;; (beginning-of-line) (kill-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3481 ;; AVOID LEAVING A BLANK LINE!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3482 (beginning-of-line) (woman-delete-line 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3483 (t (end-of-line) (insert ?\n))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3484 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3485 (if (not (or fn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3486 (and (not (memq (following-char) '(?. ?')))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3487 (setq fn 'woman2-format-paragraphs))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3488 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3489 ;; Find next control line:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3490 (set-marker to (woman-find-next-control-line))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3491 ;; Call the appropriate function:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3492 (funcall fn to)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3493 (if (not (eobp)) ; This should not happen, but ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3494 (woman2-format-paragraphs (point-max-marker) woman-left-margin))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3495 (fset 'canonically-space-region canonically-space-region)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3496 (fset 'set-text-properties set-text-properties)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3497 (fset 'insert-and-inherit insert-and-inherit)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3498 (set-marker to nil))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3499
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3500 (defun woman-find-next-control-line ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3501 "Find and return start of next control line."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3502 ; (let ((to (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3503 ; (re-search-forward "^\\." nil t))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3504 ; (if to (1- to) (point-max)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3505 (let (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3506 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3507 ;; Must handle
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3508 ;; ...\c
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3509 ;; .br (and other requests?)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3510 ;; by deleting both the \c and the following request.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3511 ;; BEWARE THAT THIS CODE MAY BE UNRELIABLE!!!!!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3512 (while
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3513 (and
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3514 (setq to (re-search-forward "\\(\\\\c\\)?\n[.']" nil t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3515 (match-string 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3516 (looking-at "br"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3517 (goto-char (match-beginning 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3518 (woman-delete-line 2)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3519 (if to (1- to) (point-max))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3520
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3521 (defun woman2-PD (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3522 ".PD d -- Set the interparagraph distance to d.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3523 Round to whole lines, default 1 line. (Breaks, but should not.)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3524 TO is the buffer position where the directive ends."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3525 ;; .ie \\n[.$] .nr PD (v;\\$1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3526 ;; .el .nr PD .4v>?\n[.V]
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3527 (woman-set-interparagraph-distance)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3528 (woman2-format-paragraphs to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3529
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3530 (defun woman-set-interparagraph-distance ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3531 "Set interparagraph distance from .PD directive at point."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3532 (setq woman-interparagraph-distance
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3533 (if (eolp) 1 (woman-get-numeric-arg)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3534 ;; Should allow .PD 0 to set zero line spacing
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3535 (woman-delete-line 1)) ; ignore remaining args
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3536
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3537 (defsubst woman-interparagraph-space ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3538 "Set `woman-leave-blank-lines' from `woman-interparagraph-distance'."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3539 ; (if (> woman-interparagraph-distance 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3540 ; (forward-line 1) ; leave 1 blank line
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3541 ; (woman-delete-line 1)) ; do not leave blank line
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3542 (setq woman-leave-blank-lines woman-interparagraph-distance)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3543 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3544
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3545 (defun woman2-TH (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3546 ".TH n c x v m -- Begin a page as per directive ending at TO.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3547 n is the name of the chapter c; x is extra commentary; v alters page
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3548 foot left; m alters page head center.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3549 \(Should set prevailing indent (and tabs) to 5.)"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3550 (woman-forward-arg 'unquote 'concat)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3551 (insert ?\()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3552 (woman-forward-arg 'unquote 'concat)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3553 (insert ?\))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3554 (let ((start (point)) here)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3555 (while (not (eolp))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3556 (cond ((looking-at "\"\"[ \t]")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3557 (delete-char 2)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3558 ;; (delete-horizontal-space)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3559 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3560 (delete-horizontal-space)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3561 (setq here (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3562 (insert " -- ")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3563 (woman-forward-arg 'unquote 'concat)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3564 ;; Delete repeated arguments:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3565 (if (string-match (buffer-substring here (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3566 (buffer-substring start here))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3567 (delete-region here (point)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3568 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3569 ;; Embolden heading (point is at end of heading):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3570 (woman-set-face
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3571 (save-excursion (beginning-of-line) (point)) (point) 'woman-bold-face)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3572 (forward-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3573 (delete-blank-lines)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3574 (setq woman-left-margin woman-default-indent)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3575 (setq woman-prevailing-indent woman-default-indent)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3576 (woman2-format-paragraphs to woman-left-margin))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3577
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3578 (defun woman2-SH (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3579 ".SH -- Sub-head. Leave blank line and subhead at TO.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3580 Format following paragraph. Set prevailing indent to 5."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3581 (if (eolp) ; If no args then
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3582 (delete-char 1) ; apply to next line
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3583 (woman-unquote-args) ; else unquote to end of heading
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3584 (beginning-of-line))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3585 (woman2-process-escapes-to-eol)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3586 (woman-leave-blank-lines woman-interparagraph-distance)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3587 (setq woman-leave-blank-lines nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3588 ;; Optionally embolden heading (point is at beginning of heading):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3589 (if woman-bold-headings
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3590 (woman-set-face
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3591 (point) (save-excursion (end-of-line) (point)) 'woman-bold-face))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3592 (forward-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3593 (setq woman-left-margin woman-default-indent
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3594 woman-nofill nil) ; fill output lines
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3595 (setq woman-prevailing-indent woman-default-indent)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3596 (woman2-format-paragraphs to woman-left-margin))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3597
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3598 (defun woman2-SS (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3599 ".SS -- Sub-sub-head at TO. Like .SH but indent heading 3 spaces."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3600 (if (eolp) ; If no args then
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3601 (delete-char 1)) ; apply to next line.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3602 (insert " ")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3603 (beginning-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3604 (woman2-SH to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3605
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3606 (defun woman2-LP (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3607 ".LP,.PP -- Begin paragraph at TO. Set prevailing indent to 5.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3608 Leave 1 blank line and format following paragraph."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3609 (woman-delete-line 1) ; ignore any arguments
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3610 (woman-interparagraph-space)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3611 (setq woman-prevailing-indent woman-default-indent)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3612 (woman2-format-paragraphs to woman-left-margin))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3613
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3614 (defalias 'woman2-PP 'woman2-LP)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3615 (defalias 'woman2-P 'woman2-LP)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3616
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3617 (defun woman2-ns (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3618 ".ns -- Turn on no-space mode at TO and format following paragraph."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3619 ;; Should not cause a break!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3620 (woman-delete-line 1) ; ignore argument(s)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3621 (setq woman-nospace t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3622 (woman2-format-paragraphs to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3623
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3624 (defun woman2-rs (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3625 ".rs -- Turn off no-space mode at TO and format following paragraph."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3626 ;; Should not cause a break!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3627 (woman-delete-line 1) ; ignore argument(s)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3628 (setq woman-nospace nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3629 (woman2-format-paragraphs to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3630
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3631 (defun woman2-sp (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3632 ".sp N -- If N > 0, leave 1 blank line at TO and format following paragraph."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3633 (let ((N (if (eolp) 1 (woman-get-numeric-arg))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3634 (if (>= N 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3635 (woman-delete-line 1) ; ignore argument(s)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3636 (setq woman-negative-vertical-space t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3637 (insert ".sp ")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3638 (forward-line))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3639 (setq woman-leave-blank-lines N)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3640 (woman2-format-paragraphs to)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3641
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3642 (defun woman-negative-vertical-space (from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3643 ".sp N with N < 0 => overlap following with preceding lines at FROM."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3644 ;; Run by woman-decode-region if necessary -- not usually required.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3645 (WoMan-warn "Negative vertical spacing support is experimental!")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3646 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3647 (while
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3648 ;; Find next control line:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3649 (re-search-forward "^\\.sp " nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3650 (let ((N (woman-get-numeric-arg))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3651 overlap overwritten)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3652 (woman-delete-whole-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3653 (setq from (point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3654 overlap (buffer-substring from
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3655 (progn (forward-line (- N)) (point))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3656 (delete-region from (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3657 (forward-line N)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3658 (let ((imax (length overlap))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3659 (i 0) c)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3660 (while (< i imax)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3661 (setq c (aref overlap i))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3662 (cond ((eq c ?\n) ; skip
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3663 (forward-line))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3664 ((eolp) ; extend line
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3665 ;; Insert character INCLUDING TEXT PROPERTIES:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3666 ;; (insert (substring overlap i (1+ i)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3667 (let ((eol (string-match "\n" overlap i)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3668 (insert (substring overlap i eol))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3669 (setq i (or eol imax)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3670 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3671 ((eq c ?\ ) ; skip
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3672 (forward-char))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3673 ((eq c ?\t) ; skip
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3674 (if (eq (following-char) ?\t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3675 (forward-char) ; both tabs, just skip
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3676 (let ((i woman-tab-width))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3677 (while (> i 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3678 (if (eolp)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3679 (insert ?\ ) ; extend line
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3680 (forward-char)) ; skip
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3681 (setq i (1- i)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3682 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3683 (t
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3684 (if (or (eq (following-char) ?\ ) ; overwrite OK
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3685 overwritten) ; warning only once per ".sp -"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3686 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3687 (setq overwritten t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3688 (WoMan-warn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3689 "Character(s) overwritten by negative vertical spacing in line %d"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3690 (count-lines 1 (point))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3691 (delete-char 1) (insert (substring overlap i (1+ i)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3692 (setq i (1+ i))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3693 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3694 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3695
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3696
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3697 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3698 ;; The following function should probably do ALL width and number
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3699 ;; register interpolation.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3700 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3701
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3702 (defun woman2-process-escapes (to &optional numeric)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3703 "Process remaining escape sequences up to marker TO, preserving point.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3704 Optional argument NUMERIC, if non-nil, means the argument is numeric."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3705 ;; The first two cases below could be merged (maybe)!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3706 (let ((from (point)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3707 ;; Discard zero width filler character used to hide leading dots
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3708 ;; and zero width characters \|, \^:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3709 (while (re-search-forward "\\\\[&|^]" to t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3710 (woman-delete-match 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3711 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3712 ;; Interrupt text processing -- CONTINUE current text with the
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3713 ;; next text line (after any control lines, unless processing to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3714 ;; eol):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3715 (while (re-search-forward "\\\\c.*\n?" to t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3716 (woman-delete-match 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3717 ;; but do not delete the final newline ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3718 (if (and (or (eobp) (= (point) to)) (not (bolp)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3719 (insert-before-markers ?\n))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3720 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3721 (woman-translate to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3722 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3723 (woman-special-characters to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3724 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3725 ;; Printable version of the current escape character, ASSUMED to be `\'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3726 ;; This must be done LAST of all escape processing!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3727 ;; Done like this to preserve any text properties of the `\'
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3728 (while (search-forward "\\" to t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3729 (let ((c (following-char)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3730 (cond ((eq c ?') ; \' -> '
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3731 (delete-char -1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3732 (cond (numeric ; except in numeric args, \' -> `
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3733 (delete-char 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3734 (insert ?`))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3735 ((eq c ?\( )) ; uninterpreted special character
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3736 ; \(.. -- do nothing
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3737 ((eq c ?t) ; non-interpreted tab \t
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3738 (delete-char 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3739 (delete-char -1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3740 (insert "\t"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3741 ((and numeric
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3742 (memq c '(?w ?n ?h)))) ; leave \w, \n, \h (?????)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3743 ((eq c ?l) (woman-horizontal-line))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3744 (t
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3745 ;; \? -> ? where ? is any remaining character
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3746 (WoMan-warn "Escape ignored: \\%c -> %c" c c)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3747 (delete-char -1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3748 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3749 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3750 ;; Process non-default tab settings:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3751 (cond (tab-stop-list
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3752 (while (search-forward "\t" to t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3753 (woman-tab-to-tab-stop))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3754 (goto-char from)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3755
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3756 ;; Must replace \' by something before processing \w, done above.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3757
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3758 ;; Replace all `\w' and `\n' escapes:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3759 ;; (This may be a bit too recursive!)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3760 (while (re-search-forward "\\\\[nw]" to t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3761 (let ((from (match-beginning 0)) N)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3762 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3763 (setq N (woman-parse-numeric-value))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3764 (delete-region from (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3765 ;; Interpolate value:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3766 (insert-before-markers (number-to-string N))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3767 (goto-char from)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3768
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3769 (defun woman-horizontal-line ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3770 "\\l'Nc' -- Draw a horizontal line of length N using character c, default _."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3771 (delete-char -1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3772 (delete-char 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3773 (looking-at "\\(.\\)\\(.*\\)\\1")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3774 (let ((to (make-marker)) from N c)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3775 (set-marker to (match-end 2))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3776 (delete-char 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3777 (setq from (point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3778 N (woman-parse-numeric-arg))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3779 (setq c (if (< (point) to) (following-char) ?_))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3780 (delete-region from to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3781 (delete-char 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3782 (set-marker to nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3783 (insert (make-string N c))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3784 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3785
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3786 ;;; 4. Text Filling, Adjusting, and Centering
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3787
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3788 (defun woman2-br (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3789 ".br -- Break. Leave no blank line at TO and format following paragraph."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3790 (woman-delete-line 1) ; ignore any arguments
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3791 (woman2-format-paragraphs to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3792
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3793 (defun woman2-fi (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3794 ".fi -- Fill subsequent output lines at TO.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3795 Leave no blank line and format following paragraph"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3796 (setq woman-nofill nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3797 (woman-delete-line 1) ; ignore any arguments
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3798 ;; Preserve any final blank line in the nofill region:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3799 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3800 (forward-line -1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3801 (if (looking-at "[ \t]*$") (setq woman-leave-blank-lines 1)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3802 (woman2-format-paragraphs to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3803
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3804 (defun woman2-nf (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3805 ".nf -- Nofill at TO. Subsequent lines are neither filled nor adjusted.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3806 Input text lines are copied directly to output lines without regard for
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3807 the current line length."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3808 (setq woman-nofill t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3809 (woman-delete-line 1) ; ignore any arguments
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3810 (woman2-format-paragraphs to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3811
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3812 (defun woman2-ad (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3813 ".ad c -- Line adjustment is begun at TO (once fill mode is on).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3814 Set justification mode to c if specified. (Breaks, but should not.)"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3815 ;; c = l -- left, r -- right, c -- center, b or n -- both,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3816 ;; absent -- unchanged. Initial mode adj,both.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3817 (setq woman-adjust
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3818 (cond ((eolp) woman-adjust-previous)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3819 ((eq (following-char) ?l) woman-adjust-left)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3820 ((eq (following-char) ?r) woman-adjust-right)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3821 ((eq (following-char) ?c) woman-adjust-center)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3822 ((memq (following-char) '(?b ?n)) woman-adjust-both)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3823 (t (woman-get-numeric-arg))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3824 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3825 woman-justify (nth woman-adjust woman-justify-list))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3826 (woman-delete-line 1) ; ignore any remaining arguments
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3827 (woman2-format-paragraphs to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3828
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3829 (defun woman2-na (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3830 ".na -- No adjusting at TO.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3831 (Breaks, but should not.)"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3832 (setq woman-adjust-previous woman-adjust
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3833 woman-justify-previous woman-justify
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3834 woman-adjust woman-adjust-left ; fill but do not adjust
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3835 woman-justify (nth woman-adjust woman-justify-list))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3836 (woman-delete-line 1) ; ignore any arguments
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3837 (woman2-format-paragraphs to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3838
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3839 ;;; The main formatting functions:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3840
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3841 (defun woman-leave-blank-lines (&optional leave)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3842 "Delete all blank lines around point.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3843 Leave one blank line if optional argument LEAVE is non-nil and non-zero,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3844 or if LEAVE is nil and `woman-leave-blank-lines' is non-nil and non-zero."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3845 ;; ***** It may suffice to delete only lines ABOVE point! *****
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3846 ;; NOTE: Function arguments are evaluated left to right
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3847 ;; (*note (elisp)Function Forms::.).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3848 (delete-region
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3849 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3850 (if (not (eq (skip-syntax-backward " ") 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3851 (forward-line)) ; forward-char ?
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3852 (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3853 (progn (skip-syntax-forward " ")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3854 (beginning-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3855 (point)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3856 (if woman-nospace
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3857 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3858 (if (or (null leave) (eq leave 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3859 ;; output any `pending' vertical space ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3860 (setq leave woman-leave-blank-lines))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3861 (if (and leave (> leave 0)) (insert-before-markers ?\n))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3862 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3863 (setq woman-leave-blank-lines nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3864 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3865
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3866 ;; `fill-region-as-paragraph' in `fill.el' appears to be the principal
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3867 ;; text filling function, so that is what I use here.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3868
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3869 (defvar woman-temp-indent nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3870
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3871 (defun woman2-format-paragraphs (to &optional new-left)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3872 "Indent paragraphs at TO to current left margin.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3873 Optional argument NEW-LEFT, if non-nil, means set current left margin.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3874 If `woman-nofill' is nil, also fill and adjust."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3875 ;; Blank space should only ever be output before text.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3876 (if new-left (setq left-margin new-left))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3877 (if (looking-at "^\\s *$")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3878 ;; A blank line should leave a space like .sp 1 (p. 14).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3879 (setq woman-leave-blank-lines 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3880 (skip-syntax-forward " ")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3881 ;; Successive control lines are sufficiently common to be worth a
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3882 ;; special case (maybe):
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3883 (if (>= (point) to) ; >= as a precaution!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3884 ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3885 ;; (woman-leave-blank-lines)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3886 (woman-reset-nospace)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3887 ;; (woman2-process-escapes to) ; 7 October 1999
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3888 (woman2-process-escapes to 'numeric)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3889 (if woman-nofill
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3890 ;; Indent without filling or adjusting ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3891 (progn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3892 (woman-leave-blank-lines)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3893 (cond (woman-temp-indent
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3894 (indent-to woman-temp-indent)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3895 (forward-line)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3896 (indent-rigidly (point) to left-margin)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3897 (woman-horizontal-escapes to)) ; 7 October 1999
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3898 ;; Fill and justify ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3899 ;; Blank lines and initial spaces cause a break.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3900 ; (cond ((and (= (point) to) (not (looking-at ".nf"))) ; Yuk!!!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3901 ; ;; No text after a request that caused a break, so delete
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3902 ; ;; any spurious blank line left:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3903 ; (forward-line -1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3904 ; (if (looking-at "^\\s *$") (kill-line) (forward-line))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3905 (while (< (point) to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3906 (woman-leave-blank-lines)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3907 (let ((from (point)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3908 ;; Indent first lin of paragraph:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3909 (indent-to (or woman-temp-indent left-margin))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3910 (woman-horizontal-escapes to) ; 7 October 1999
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3911 ;; Find the beginning of the next paragraph:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3912 (forward-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3913 ; (if (re-search-forward "\\(^\\s *$\\)\\|\\(^\\s +\\)" to 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3914 ; ;; A blank line should leave a space like .sp 1 (p. 14).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3915 ; (if (eolp)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3916 ; (progn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3917 ; (skip-syntax-forward " ")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3918 ; (setq woman-leave-blank-lines 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3919 ; (setq woman-leave-blank-lines nil)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3920 (and (re-search-forward "\\(^\\s *$\\)\\|\\(^\\s +\\)" to 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3921 ;; A blank line should leave a space like .sp 1 (p. 14).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3922 (eolp)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3923 (skip-syntax-forward " ")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3924 (setq woman-leave-blank-lines 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3925 (beginning-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3926 ;; If a single short line then just leave it.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3927 ;; This is necessary to preserve some table layouts.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3928 ;; PROBABLY NOT NECESSARY WITH SQUEEZE MODIFICATION !!!!!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3929 (if (or (> (count-lines from (point)) 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3930 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3931 (backward-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3932 (> (current-column) fill-column)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3933 ;; ?roff does not squeeze multiple spaces
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3934 ;; (fill-region-as-paragraph from (point) woman-justify t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3935 ;; NOSQUEEZE has no effect if JUSTIFY is full, so
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3936 ;; redefine canonically-space-region, see above.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3937 (progn
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3938 ;; Needs a re-write of the paragraph formatter to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3939 ;; avoid this nonsense to handle temporary indents!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3940 (if (and woman-temp-indent (< woman-temp-indent left-margin))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3941 (let ((left-margin woman-temp-indent))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3942 (fill-region-as-paragraph from (point) woman-justify)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3943 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3944 (goto-char from)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3945 (forward-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3946 (setq from (point)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3947 (fill-region-as-paragraph from (point) woman-justify))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3948 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3949 ;; A blank line should leave a space like .sp 1 (p. 14).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3950 ;; Delete all but 1 trailing blank lines:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3951 ;;(woman-leave-blank-lines 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3952 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3953 )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3954 (setq woman-temp-indent nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3955 ;; Non-white-space text has been processed, so ...
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3956 ;;(setq woman-leave-blank-lines nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3957 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3958
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3959
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3960 ;;; Tagged, indented and hanging paragraphs:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3961
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3962 (defun woman2-TP (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3963 ".TP i -- Set prevailing indent to i at TO.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3964 Begin indented paragraph with hanging tag given by next text line.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3965 If tag doesn't fit, place it on a separate line."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3966 (let ((i (woman2-get-prevailing-indent)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3967 (woman-leave-blank-lines woman-interparagraph-distance)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3968 (woman2-tagged-paragraph to i)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3969
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3970 (defun woman2-IP (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3971 ".IP x i -- Same as .TP with tag x. TO is where the directive ends."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3972 (woman-interparagraph-space)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3973 (if (eolp) ; no args
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3974 ;; Like LP without resetting prevailing indent
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3975 (woman2-format-paragraphs to (+ woman-left-margin
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3976 woman-prevailing-indent))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3977 (woman-forward-arg 'unquote)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3978 (let ((i (woman2-get-prevailing-indent 'leave-eol)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3979 (beginning-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3980 (woman-leave-blank-lines) ; must be here,
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3981 (woman2-tagged-paragraph to i))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3982
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3983 (defun woman-find-next-control-line-carefully ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3984 "Find and return start of next control line, even if already there!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3985 (if (looking-at "^[.']")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3986 (point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3987 (woman-find-next-control-line)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3988
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3989 (defun woman2-tagged-paragraph (to i)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3990 "Set prevailing indent at TO to I.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3991 Begin indented paragraph with hanging tag given by current text line.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3992 If tag doesn't fit, leave it on separate line."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3993 (if (not (looking-at "\\s *$")) ; non-empty tag
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3994 (setq woman-leave-blank-lines nil))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3995
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3996 ;; Temporary hack for bash.1 and groff_mmse.7 until code is revised
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3997 ;; to process all requests uniformly:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3998 (cond ((and (= (point) to) (looking-at "^[.'][ \t]*\\(PD\\|br\\|ta\\) *"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3999 (if (string= (match-string 1) "br")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4000 (woman-delete-line 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4001 (woman-delete-match 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4002 (if (string= (match-string 1) "ta") ; for GetInt.3
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4003 (woman2-ta to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4004 (woman-set-interparagraph-distance)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4005 (set-marker to (woman-find-next-control-line-carefully))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4006 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4007
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4008 (let ((tag (point)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4009 (woman-reset-nospace)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4010 ;; Format the tag:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4011 (woman2-process-escapes-to-eol)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4012 ;; TIDY UP THE FOLLOWING CODE
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4013 ;; (indent-to woman-left-margin)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4014 (setq left-margin woman-left-margin)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4015 (forward-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4016 (fill-region-as-paragraph (save-excursion (forward-line -1) (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4017 (point) woman-justify)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4018
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4019 ;; Temporary hack for bash.1 until all requests processed uniformly:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4020 (cond ((and (= (point) to) (looking-at "^[.'][ \t]*PD *"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4021 (woman-delete-match 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4022 (woman-set-interparagraph-distance)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4023 (set-marker to (woman-find-next-control-line-carefully))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4024 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4025
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4026 ;; Format the paragraph body, if there is one! Set indented left
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4027 ;; margin anyway, because the paragraph body may begin with a
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4028 ;; control line:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4029 (setq left-margin (+ woman-left-margin i))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4030 (cond ((< (point) to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4031 (woman2-format-paragraphs to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4032 (goto-char tag) (end-of-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4033 (cond ((> (setq i (- left-margin (current-column))) 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4034 (delete-char 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4035 (delete-horizontal-space)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4036 ;; Necessary to avoid spaces inheriting underlines.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4037 ;; Cannot simply delete (current-column) whitespace
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4038 ;; characters because some may be tabs!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4039 (while (> i 0) (insert ? ) (setq i (1- i)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4040 (goto-char to) ; necessary ???
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4041 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4042 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4043
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4044 (defun woman2-HP (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4045 ".HP i -- Set prevailing indent at TO to i.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4046 Begin paragraph with hanging indent."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4047 (let ((i (woman2-get-prevailing-indent)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4048 (woman-interparagraph-space)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4049 (setq woman-temp-indent woman-left-margin)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4050 (woman2-format-paragraphs to (+ woman-left-margin i))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4051 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4052
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4053 (defun woman2-get-prevailing-indent (&optional leave-eol)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4054 "Set the prevailing indent to an integer argument at point, and return it.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4055 If no argument at point, return prevailing indent.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4056 Delete line from point and eol unless LEAVE-EOL is non-nil."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4057 (if (eolp)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4058 (or leave-eol (delete-char 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4059 (let ((i (woman-get-numeric-arg)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4060 (woman-delete-line) (or leave-eol (delete-char 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4061 ;; i = 0 if the argument was not a number
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4062 (if (> i 0) (setq woman-prevailing-indent i))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4063 woman-prevailing-indent)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4064
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4065 (defmacro woman-push (value stack)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4066 "Push VALUE onto STACK."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4067 `(setq ,stack (cons ,value ,stack)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4068
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4069 (defmacro woman-pop (variable stack)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4070 "Pop the value at the top of STACK into VARIABLE.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4071 Allow for mismatched requests!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4072 `(if ,stack
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4073 (setq ,variable (car ,stack)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4074 ,stack (cdr ,stack))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4075
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4076 (defun woman2-RS (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4077 ".RS i -- Start relative indent at TO, move left margin in distance i.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4078 Set prevailing indent to 5 for nested indents."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4079 (woman-push woman-left-margin woman-RS-left-margin)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4080 (woman-push woman-prevailing-indent woman-RS-prevailing-indent)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4081 (setq woman-left-margin (+ woman-left-margin
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4082 (woman2-get-prevailing-indent))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4083 woman-prevailing-indent woman-default-indent)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4084 (woman2-format-paragraphs to woman-left-margin))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4085
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4086 (defun woman2-RE (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4087 ".RE -- End of relative indent at TO.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4088 Set prevailing indent to amount of starting .RS."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4089 (woman-pop woman-left-margin woman-RS-left-margin)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4090 (woman-pop woman-prevailing-indent woman-RS-prevailing-indent)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4091 (woman-delete-line 1) ; ignore any arguments
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4092 (woman2-format-paragraphs to woman-left-margin))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4093
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4094
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4095 ;;; Line Length and Indenting:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4096
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4097 (defun woman-set-arg (arg &optional previous)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4098 "Reset, increment or decrement ARG, delete the whole remaining control line.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4099 Argument must be quoted.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4100 Optional argument PREVIOUS, if non-nil, is evaluated to set ARG at eol."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4101 (if (eolp) ; space already skipped
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4102 (set arg (if previous (eval previous) 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4103 (if previous (set previous (eval arg)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4104 (woman2-process-escapes-to-eol 'numeric)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4105 (let ((pm (if (looking-at "[+-]")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4106 (prog1 (following-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4107 (forward-char 1))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4108 (i (woman-parse-numeric-arg)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4109 (cond ((null pm) (set arg i))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4110 ((= pm ?+) (set arg (+ (eval arg) i)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4111 ((= pm ?-) (set arg (- (eval arg) i)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4112 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4113 (beginning-of-line))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4114 (woman-delete-line 1)) ; ignore any remaining arguments
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4115
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4116 ;; NEED TO RATIONALIZE NAMES FOR PREVIOUS VALUES!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4117 (defvar woman-ll-fill-column woman-fill-column)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4118 (defvar woman-in-left-margin woman-left-margin)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4119
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4120 (defun woman2-ll (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4121 ".ll +/-N -- Set, increment or decrement line length at TO.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4122 \(Breaks, but should not.)"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4123 (woman-set-arg 'fill-column 'woman-ll-fill-column)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4124 (woman2-format-paragraphs to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4125
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4126 (defun woman2-in (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4127 ".in +/-N -- Set, increment or decrement the indent at TO."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4128 (woman-set-arg 'left-margin 'woman-in-left-margin)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4129 (woman2-format-paragraphs to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4130
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4131 (defun woman2-ti (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4132 ".ti +/-N -- Temporary indent at TO."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4133 ;; Ignore if no argument.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4134 ;; Indent next output line only wrt current indent.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4135 ;; Current indent is not changed.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4136 (setq woman-temp-indent left-margin)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4137 (woman-set-arg 'woman-temp-indent)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4138 (woman2-format-paragraphs to nil))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4139
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4140
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4141 ;;; Tabs, Leaders, and Fields:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4142
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4143 (defun woman2-ta (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4144 ".ta Nt ... -- Set tabs at TO, left type, unless t=R(right), C(centered).
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4145 \(Breaks, but should not.) The tab stops are separated by spaces;
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4146 a value preceded by + represents an increment to the previous stop value."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4147 (setq tab-stop-list nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4148 (woman2-process-escapes-to-eol 'numeric)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4149 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4150 (let ((tab-stop 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4151 (while (not (eolp))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4152 (let ((plus (cond ((eq (following-char) ?+) (forward-char 1) t)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4153 (i (woman-parse-numeric-arg)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4154 (setq tab-stop (if plus (+ tab-stop i) i)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4155 (if (memq (following-char) '(?R ?C))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4156 (setq tab-stop (cons tab-stop (following-char))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4157 (setq tab-stop-list (cons tab-stop tab-stop-list))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4158 (skip-syntax-forward "^ ") ; skip following R, C, `;', etc.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4159 (skip-chars-forward " \t")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4160 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4161 (woman-delete-line 1) ; ignore any remaining arguments
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4162 (setq tab-stop-list (reverse tab-stop-list))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4163 (woman2-format-paragraphs to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4164
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4165 (defsubst woman-get-tab-stop (tab-stop-list)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4166 "If TAB-STOP-LIST is a cons, return its car, else return TAB-STOP-LIST."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4167 (if (consp tab-stop-list) (car tab-stop-list) tab-stop-list))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4168
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4169 (defun woman-tab-to-tab-stop ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4170 "Insert spaces to next defined tab-stop column.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4171 The variable `tab-stop-list' is a list of columns where there are tab stops:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4172 pairs (COLUMN . TYPE) where type is either R or C."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4173 ;; Based on tab-to-tab-stop in indent.el.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4174 ;; R & C tabs probably not quite right!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4175 (delete-backward-char 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4176 (let ((tabs tab-stop-list))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4177 (while (and tabs (>= (current-column)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4178 (woman-get-tab-stop (car tabs))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4179 (setq tabs (cdr tabs)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4180 (if tabs
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4181 (let* ((tab (car tabs))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4182 (type (and (consp tab) (cdr tab)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4183 eol n)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4184 (if type
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4185 (setq tab (woman-get-tab-stop tab)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4186 eol (save-excursion (end-of-line) (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4187 n (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4188 (search-forward "\t" eol t))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4189 n (- (if n (1- n) eol) (point))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4190 tab (- tab (if (eq type ?C) (/ n 2) n))) )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4191 (setq n (- tab (current-column)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4192 (while (> n 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4193 (insert ?\ )
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4194 (setq n (1- n))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4195 (insert ?\ ))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4196
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4197 (defun woman2-DT (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4198 ".DT -- Restore default tabs at TO.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4199 (Breaks, but should not.)"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4200 ;; Currently just terminates special tab processing.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4201 (setq tab-stop-list nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4202 (woman-delete-line 1) ; ignore any arguments
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4203 (woman2-format-paragraphs to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4204
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4205 (defun woman2-fc (to)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4206 ".fc a b -- Set field delimiter a and pad character b at TO.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4207 A VERY FIRST ATTEMPT to make fields at least readable!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4208 Needs doing properly!"
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4209 (if (eolp)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4210 (woman-delete-whole-line) ; ignore!
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4211 (let ((delim (following-char))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4212 (pad ?\ ) end) ; pad defaults to space
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4213 (forward-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4214 (skip-chars-forward " \t")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4215 (or (eolp) (setq pad (following-char)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4216 (woman-delete-whole-line)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4217 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4218 (if (re-search-forward "^[.'][ \t]*fc\\s " nil t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4219 (setq end (match-beginning 0))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4220 ;; A field is contained between a pair of field delimiter
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4221 ;; characters and consists of sub-strings separated by padding
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4222 ;; indicator characters:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4223 (setq delim (string delim ?[ ?^ delim ?] ?* delim))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4224 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4225 (while (re-search-forward delim end t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4226 (goto-char (match-beginning 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4227 (delete-char 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4228 (insert woman-unpadded-space-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4229 (goto-char (match-end 0))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4230 (delete-backward-char 1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4231 (insert-before-markers woman-unpadded-space-char)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4232 (subst-char-in-region
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4233 (match-beginning 0) (match-end 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4234 pad woman-unpadded-space-char t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4235 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4236 ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4237 (woman2-format-paragraphs to))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4238
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4239
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4240 ;;; WoMan message logging:
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4241
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4242 ;;; The basis for this logging code was shamelessly pirated from bytecomp.el
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4243 ;;; by Jamie Zawinski <jwz@lucid.com> & Hallvard Furuseth <hbf@ulrik.uio.no>
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4244
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4245 (defvar WoMan-current-file nil) ; bound in woman-really-find-file
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4246 (defvar WoMan-Log-header-point-max nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4247
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4248 (defun WoMan-log-begin ()
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4249 "Log the beginning of formatting in *WoMan-Log*."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4250 (let ((WoMan-current-buffer (buffer-name)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4251 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4252 (set-buffer (get-buffer-create "*WoMan-Log*"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4253 (or (eq major-mode 'view-mode) (view-mode 1))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4254 (setq buffer-read-only nil)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4255 (goto-char (point-max))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4256 (insert "\n\^L\nFormatting "
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4257 (if (stringp WoMan-current-file)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4258 (concat "file " WoMan-current-file)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4259 (concat "buffer " WoMan-current-buffer))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4260 " at " (current-time-string) "\n")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4261 (setq WoMan-Log-header-point-max (point-max))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4262 )))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4263
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4264 (defun WoMan-log (format &rest args)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4265 "Log a message out of FORMAT control string and optional ARGS."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4266 (WoMan-log-1 (apply 'format format args)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4267
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4268 (defun WoMan-warn (format &rest args)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4269 "Log a warning message out of FORMAT control string and optional ARGS."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4270 (setq format (apply 'format format args))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4271 (WoMan-log-1 (concat "** " format)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4272
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4273 (defun WoMan-warn-ignored (request ignored)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4274 "Log a warning message about ignored directive REQUEST.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4275 IGNORED is a string appended to the log message."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4276 (let ((tail
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4277 (buffer-substring (point)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4278 (save-excursion (end-of-line) (point)))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4279 (if (and (> (length tail) 0)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4280 (/= (string-to-char tail) ?\ ))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4281 (setq tail (concat " " tail)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4282 (WoMan-log-1
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4283 (concat "** " request tail " request " ignored))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4284
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4285 (defun WoMan-log-end (time)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4286 "Log the end of formatting in *WoMan-Log*.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4287 TIME specifies the time it took to format the man page, to be printed
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4288 with the message."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4289 (WoMan-log-1 (format "Formatting time %d seconds." time) 'end))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4290
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4291 (defun WoMan-log-1 (string &optional end)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4292 "Log a message STRING in *WoMan-Log*.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4293 Optional argument END, if non-nil, means make buffer read-only after logging
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4294 the message."
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4295 (save-excursion
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4296 (set-buffer (get-buffer-create "*WoMan-Log*"))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4297 (goto-char (point-max))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4298 (or end (insert " ")) (insert string "\n")
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4299 (if end
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4300 (setq buffer-read-only t)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4301 (if woman-show-log
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4302 (select-window ; to return to
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4303 (prog1 (selected-window) ; WoMan window
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4304 (select-window (display-buffer (current-buffer)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4305 (cond (WoMan-Log-header-point-max
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4306 (goto-char WoMan-Log-header-point-max)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4307 (forward-line -1)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4308 (recenter 0)))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4309 )))))
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4310 nil) ; for woman-file-readable-p etc.
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4311
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4312 (provide 'woman)
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4313
eb06b6bb8aa8 New file.
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4314 ;;; woman.el ends here