]> code.delx.au - gnu-emacs/blob - doc/misc/url.texi
Doc fixes for fclist and grep
[gnu-emacs] / doc / misc / url.texi
1 \input texinfo
2 @setfilename ../../info/url.info
3 @settitle URL Programmer's Manual
4 @include docstyle.texi
5
6 @iftex
7 @c @finalout
8 @end iftex
9 @c @setchapternewpage odd
10 @c @smallbook
11
12 @tex
13 \overfullrule=0pt
14 %\global\baselineskip 30pt % for printing in double space
15 @end tex
16 @dircategory Emacs lisp libraries
17 @direntry
18 * URL: (url). URL loading package.
19 @end direntry
20
21 @copying
22 This is the manual for the @code{url} Emacs Lisp library.
23
24 Copyright @copyright{} 1993--1999, 2002, 2004--2016 Free Software
25 Foundation, Inc.
26
27 @quotation
28 Permission is granted to copy, distribute and/or modify this document
29 under the terms of the GNU Free Documentation License, Version 1.3 or
30 any later version published by the Free Software Foundation; with no
31 Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,''
32 and with the Back-Cover Texts as in (a) below. A copy of the license
33 is included in the section entitled ``GNU Free Documentation License''.
34
35 (a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
36 modify this GNU manual.''
37 @end quotation
38 @end copying
39
40 @c
41 @titlepage
42 @title URL Programmer's Manual
43 @subtitle First Edition, URL Version 2.0
44 @author William M. Perry @email{wmperry@@gnu.org}
45 @author David Love @email{fx@@gnu.org}
46 @page
47 @vskip 0pt plus 1filll
48 @insertcopying
49 @end titlepage
50
51 @contents
52
53 @node Top
54 @top URL
55
56 @ifnottex
57 @insertcopying
58 @end ifnottex
59
60 @menu
61 * Introduction:: About the @code{url} library.
62 * URI Parsing:: Parsing (and unparsing) URIs.
63 * Retrieving URLs:: How to use this package to retrieve a URL.
64 * Supported URL Types:: Descriptions of URL types currently supported.
65 * General Facilities:: URLs can be cached, accessed via a gateway
66 and tracked in a history list.
67 * Customization:: Variables you can alter.
68 * GNU Free Documentation License:: The license for this documentation.
69 * Function Index::
70 * Variable Index::
71 * Concept Index::
72 @end menu
73
74 @node Introduction
75 @chapter Introduction
76 @cindex URL
77 @cindex URI
78 @cindex uniform resource identifier
79 @cindex uniform resource locator
80
81 A @dfn{Uniform Resource Identifier} (URI) is a specially-formatted
82 name, such as an Internet address, that identifies some name or
83 resource. The format of URIs is described in RFC 3986, which updates
84 and replaces the earlier RFCs 2732, 2396, 1808, and 1738. A
85 @dfn{Uniform Resource Locator} (URL) is an older but still-common
86 term, which basically refers to a URI corresponding to a resource that
87 can be accessed (usually over a network) in a specific way.
88
89 Here are some examples of URIs (taken from RFC 3986):
90
91 @example
92 ftp://ftp.is.co.za/rfc/rfc1808.txt
93 http://www.ietf.org/rfc/rfc2396.txt
94 ldap://[2001:db8::7]/c=GB?objectClass?one
95 mailto:John.Doe@@example.com
96 news:comp.infosystems.www.servers.unix
97 tel:+1-816-555-1212
98 telnet://192.0.2.16:80/
99 urn:oasis:names:specification:docbook:dtd:xml:4.1.2
100 @end example
101
102 This manual describes the @code{url} library, an Emacs Lisp library
103 for parsing URIs and retrieving the resources to which they refer.
104 (The library is so-named for historical reasons; nowadays, the ``URI''
105 terminology is regarded as the more general one, and ``URL'' is
106 technically obsolete despite its widespread vernacular usage.)
107
108 @node URI Parsing
109 @chapter URI Parsing
110
111 A URI consists of several @dfn{components}, each having a different
112 meaning. For example, the URI
113
114 @example
115 http://www.gnu.org/software/emacs/
116 @end example
117
118 @noindent
119 specifies the scheme component @samp{http}, the hostname component
120 @samp{www.gnu.org}, and the path component @samp{/software/emacs/}.
121
122 @cindex parsed URIs
123 The format of URIs is specified by RFC 3986. The @code{url} library
124 provides the Lisp function @code{url-generic-parse-url}, a (mostly)
125 standard-compliant URI parser, as well as function
126 @code{url-recreate-url}, which converts a parsed URI back into a URI
127 string.
128
129 @defun url-generic-parse-url uri-string
130 This function returns a parsed version of the string @var{uri-string}.
131 @end defun
132
133 @defun url-recreate-url uri-obj
134 @cindex unparsing URLs
135 Given a parsed URI, this function returns the corresponding URI string.
136 @end defun
137
138 @cindex parsed URI
139 The return value of @code{url-generic-parse-url}, and the argument
140 expected by @code{url-recreate-url}, is a @dfn{parsed URI}: a CL
141 structure whose slots hold the various components of the URI@.
142 @xref{Top,the CL Manual,,cl,GNU Emacs Common Lisp Emulation}, for
143 details about CL structures. Most of the other functions in the
144 @code{url} library act on parsed URIs.
145
146 @menu
147 * Parsed URIs:: Format of parsed URI structures.
148 * URI Encoding:: Non-@acronym{ASCII} characters in URIs.
149 @end menu
150
151 @node Parsed URIs
152 @section Parsed URI structures
153
154 Each parsed URI structure contains the following slots:
155
156 @table @code
157 @item type
158 The URI scheme (a string, e.g., @code{http}). @xref{Supported URL
159 Types}, for a list of schemes that the @code{url} library knows how to
160 process. This slot can also be @code{nil}, if the URI is not fully
161 specified.
162
163 @item user
164 The user name (a string), or @code{nil}.
165
166 @item password
167 The user password (a string), or @code{nil}. The use of this URI
168 component is strongly discouraged; nowadays, passwords are transmitted
169 by other means, not as part of a URI.
170
171 @item host
172 The host name (a string), or @code{nil}. If present, this is
173 typically a domain name or IP address.
174
175 @item port
176 The port number (an integer), or @code{nil}. Omitting this component
177 usually means to use the ``standard'' port associated with the URI
178 scheme.
179
180 @item filename
181 The combination of the ``path'' and ``query'' components of the URI (a
182 string), or @code{nil}. If the query component is present, it is the
183 substring following the first @samp{?} character, and the path
184 component is the substring before the @samp{?}. The meaning of these
185 components is scheme-dependent; they do not necessarily refer to a
186 file on a disk.
187
188 @item target
189 The fragment component (a string), or @code{nil}. The fragment
190 component specifies a ``secondary resource'', such as a section of a
191 webpage.
192
193 @item fullness
194 This is @code{t} if the URI is fully specified, i.e., the
195 hierarchical components of the URI (the hostname and/or username
196 and/or password) are preceded by @samp{//}.
197 @end table
198
199 @findex url-type
200 @findex url-user
201 @findex url-password
202 @findex url-host
203 @findex url-port
204 @findex url-filename
205 @findex url-target
206 @findex url-attributes
207 @findex url-fullness
208 These slots have accessors named @code{url-@var{part}}, where
209 @var{part} is the slot name. For example, the accessor for the
210 @code{host} slot is the function @code{url-host}. The @code{url-port}
211 accessor returns the default port for the URI scheme if the parsed
212 URI's @var{port} slot is @code{nil}.
213
214 The slots can be set using @code{setf}. For example:
215
216 @example
217 (setf (url-port url) 80)
218 @end example
219
220 @node URI Encoding
221 @section URI Encoding
222
223 @cindex percent encoding
224 The @code{url-generic-parse-url} parser does not obey RFC 3986 in
225 one respect: it allows non-@acronym{ASCII} characters in URI strings.
226
227 Strictly speaking, RFC 3986 compatible URIs may only consist of
228 @acronym{ASCII} characters; non-@acronym{ASCII} characters are
229 represented by converting them to UTF-8 byte sequences, and performing
230 @dfn{percent encoding} on the bytes. For example, the o-umlaut
231 character is converted to the UTF-8 byte sequence @samp{\xD3\xA7},
232 then percent encoded to @samp{%D3%A7}. (Certain ``reserved''
233 @acronym{ASCII} characters must also be percent encoded when they
234 appear in URI components.)
235
236 The function @code{url-encode-url} can be used to convert a URI
237 string containing arbitrary characters to one that is properly
238 percent-encoded in accordance with RFC 3986.
239
240 @defun url-encode-url url-string
241 This function return a properly URI-encoded version of
242 @var{url-string}. It also performs @dfn{URI normalization},
243 e.g., converting the scheme component to lowercase if it was
244 previously uppercase.
245 @end defun
246
247 To convert between a string containing arbitrary characters and a
248 percent-encoded all-@acronym{ASCII} string, use the functions
249 @code{url-hexify-string} and @code{url-unhex-string}:
250
251 @defun url-hexify-string string &optional allowed-chars
252 This function performs percent-encoding on @var{string}, and returns
253 the result.
254
255 If @var{string} is multibyte, it is first converted to a UTF-8 byte
256 string. Each byte corresponding to an allowed character is left
257 as-is, while all other bytes are converted to a three-character
258 sequence: @samp{%} followed by two upper-case hex digits.
259
260 @vindex url-unreserved-chars
261 @cindex unreserved characters
262 The allowed characters are specified by @var{allowed-chars}. If this
263 argument is @code{nil}, the allowed characters are those specified as
264 @dfn{unreserved characters} by RFC 3986 (see the variable
265 @code{url-unreserved-chars}). Otherwise, @var{allowed-chars} should
266 be a vector whose @var{n}-th element is non-@code{nil} if character
267 @var{n} is allowed.
268 @end defun
269
270 @defun url-unhex-string string &optional allow-newlines
271 This function replaces percent-encoding sequences in @var{string} with
272 their character equivalents, and returns the resulting string.
273
274 If @var{allow-newlines} is non-@code{nil}, it allows the decoding of
275 carriage returns and line feeds, which are normally forbidden in URIs.
276 @end defun
277
278 @node Retrieving URLs
279 @chapter Retrieving URLs
280
281 The @code{url} library defines the following three functions for
282 retrieving the data specified by a URL@. The actual retrieval protocol
283 depends on the URL's URI scheme, and is performed by lower-level
284 scheme-specific functions. (Those lower-level functions are not
285 documented here, and generally should not be called directly.)
286
287 In each of these functions, the @var{url} argument can be either a
288 string or a parsed URL structure. If it is a string, that string is
289 passed through @code{url-encode-url} before using it, to ensure that
290 it is properly URI-encoded (@pxref{URI Encoding}).
291
292 @defun url-retrieve-synchronously url silent no-cookies
293 This function synchronously retrieves the data specified by @var{url},
294 and returns a buffer containing the data. The return value is
295 @code{nil} if there is no data associated with the URL (as is the case
296 for @code{dired}, @code{info}, and @code{mailto} URLs).
297
298 If the optional argument @var{silent} is non-@code{nil}, progress
299 messages are suppressed. If the optional argument @var{no-cookies} is
300 non-@code{nil}, cookies are not stored or sent.
301 @end defun
302
303 @defun url-retrieve url callback &optional cbargs silent no-cookies
304 This function retrieves @var{url} asynchronously, calling the function
305 @var{callback} when the object has been completely retrieved. The
306 return value is the buffer into which the data will be inserted, or
307 @code{nil} if the process has already completed.
308
309 The callback function is called this way:
310
311 @example
312 (apply @var{callback} @var{status} @var{cbargs})
313 @end example
314
315 @noindent
316 where @var{status} is a plist representing what happened during the
317 retrieval, with most recent events first, or an empty list if no
318 events have occurred. Each pair in the plist is one of:
319
320 @table @code
321 @item (:redirect @var{redirected-to})
322 This means that the request was redirected to the URL
323 @var{redirected-to}.
324
325 @item (:error (@var{error-symbol} . @var{data}))
326 This means that an error occurred. If so desired, the error can be
327 signaled with @code{(signal @var{error-symbol} @var{data})}.
328 @end table
329
330 When the callback function is called, the current buffer is the one
331 containing the retrieved data (if any). The buffer also contains any
332 MIME headers associated with the data retrieval.
333
334 If the optional argument @var{silent} is non-@code{nil}, progress
335 messages are suppressed. If the optional argument @var{no-cookies} is
336 non-@code{nil}, cookies are not stored or sent.
337 @end defun
338
339 @defun url-queue-retrieve url callback &optional cbargs silent no-cookies
340 This function acts like @code{url-retrieve}, but with limits on the
341 number of concurrently-running network processes. The option
342 @code{url-queue-parallel-processes} controls the number of concurrent
343 processes, and the option @code{url-queue-timeout} sets a timeout in
344 seconds.
345
346 To use this function, you must @code{(require 'url-queue)}.
347 @end defun
348
349 @vindex url-queue-parallel-processes
350 @defopt url-queue-parallel-processes
351 The value of this option is an integer specifying the maximum number
352 of concurrent @code{url-queue-retrieve} network processes. If the
353 number of @code{url-queue-retrieve} calls is larger than this number,
354 later ones are queued until earlier ones are finished.
355 @end defopt
356
357 @vindex url-queue-timeout
358 @defopt url-queue-timeout
359 The value of this option is a number specifying the maximum lifetime
360 of a @code{url-queue-retrieve} network process, once it is started.
361 If a process is not finished by then, it is killed and removed from
362 the queue.
363 @end defopt
364
365 @node Supported URL Types
366 @chapter Supported URL Types
367
368 This chapter describes functions and variables affecting URL retrieval
369 for specific schemes.
370
371 @menu
372 * http/https:: Hypertext Transfer Protocol.
373 * file/ftp:: Local files and FTP archives.
374 * info:: Emacs "Info" pages.
375 * mailto:: Sending email.
376 * news/nntp/snews:: Usenet news.
377 * rlogin/telnet/tn3270:: Remote host connectivity.
378 * irc:: Internet Relay Chat.
379 * data:: Embedded data URLs.
380 * nfs:: Networked File System.
381 * ldap:: Lightweight Directory Access Protocol.
382 * man:: Unix man pages.
383 * Tramp:: Schemes supported via Tramp.
384 @end menu
385
386 @node http/https
387 @section @code{http} and @code{https}
388
389 The @code{http} scheme refers to the Hypertext Transfer Protocol. The
390 @code{url} library supports HTTP version 1.1, specified in RFC 2616.
391 Its default port is 80.
392
393 The @code{https} scheme is a secure version of @code{http}, with
394 transmission via SSL@. It is defined in RFC 2069, and its default port
395 is 443. When using @code{https}, the @code{url} library performs SSL
396 encryption via the @code{ssl} library, by forcing the @code{ssl}
397 gateway method to be used. @xref{Gateways in general}.
398
399 @defopt url-honor-refresh-requests
400 If this option is non-@code{nil} (the default), the @code{url} library
401 honors the HTTP @samp{Refresh} header, which is used by servers to
402 direct clients to reload documents from the same URL or a or different
403 one. If the value is @code{nil}, the @samp{Refresh} header is
404 ignored; any other value means to ask the user on each request.
405 @end defopt
406
407 @menu
408 * Cookies::
409 * HTTP language/coding::
410 * HTTP URL Options::
411 * Dealing with HTTP documents::
412 @end menu
413
414 @node Cookies
415 @subsection Cookies
416
417 @findex url-cookie-delete
418 @defun url-cookie-list
419 This command creates a @file{*url cookies*} buffer listing the current
420 cookies, if there are any. You can remove a cookie using the
421 @kbd{C-k} (@code{url-cookie-delete}) command.
422 @end defun
423
424 @defopt url-cookie-file
425 The file in which cookies are stored, defaulting to @file{cookies} in
426 the directory specified by @code{url-configuration-directory}.
427 @end defopt
428
429 @defopt url-cookie-confirmation
430 Specifies whether confirmation is required to accept cookies.
431 @end defopt
432
433 @defopt url-cookie-multiple-line
434 Specifies whether to put all cookies for the server on one line in the
435 HTTP request to satisfy broken servers like
436 @url{http://www.hotmail.com}.
437 @end defopt
438
439 @defopt url-cookie-trusted-urls
440 A list of regular expressions matching URLs from which to accept
441 cookies always.
442 @end defopt
443
444 @defopt url-cookie-untrusted-urls
445 A list of regular expressions matching URLs from which to reject
446 cookies always.
447 @end defopt
448
449 @defopt url-cookie-save-interval
450 The number of seconds between automatic saves of cookies to disk.
451 Default is one hour.
452 @end defopt
453
454
455 @node HTTP language/coding
456 @subsection Language and Encoding Preferences
457
458 HTTP allows clients to express preferences for the language and
459 encoding of documents which servers may honor. For each of these
460 variables, the value is a string; it can specify a single choice, or
461 it can be a comma-separated list.
462
463 Normally, this list is ordered by descending preference. However, each
464 element can be followed by @samp{;q=@var{priority}} to specify its
465 preference level, a decimal number from 0 to 1; e.g., for
466 @code{url-mime-language-string}, @w{@code{"de, en-gb;q=0.8,
467 en;q=0.7"}}. An element that has no @samp{;q} specification has
468 preference level 1.
469
470 @defopt url-mime-charset-string
471 @cindex character sets
472 @cindex coding systems
473 This variable specifies a preference for character sets when documents
474 can be served in more than one encoding.
475
476 HTTP allows specifying a series of MIME charsets which indicate your
477 preferred character set encodings, e.g., Latin-9 or Big5, and these
478 can be weighted. The default series is generated automatically from
479 the associated MIME types of all defined coding systems, sorted by the
480 coding system priority specified in Emacs. @xref{Recognize Coding, ,
481 Recognizing Coding Systems, emacs, The GNU Emacs Manual}.
482 @end defopt
483
484 @defopt url-mime-language-string
485 @cindex language preferences
486 A string specifying the preferred language when servers can serve
487 files in several languages. Use RFC 1766 abbreviations, e.g.,
488 @samp{en} for English, @samp{de} for German.
489
490 The string can be @code{"*"} to get the first available language (as
491 opposed to the default).
492 @end defopt
493
494 @node HTTP URL Options
495 @subsection HTTP URL Options
496
497 HTTP supports an @samp{OPTIONS} method describing things supported by
498 the URL@.
499
500 @defun url-http-options url
501 Returns a property list describing options available for URL@. The
502 property list members are:
503
504 @table @code
505 @item methods
506 A list of symbols specifying what HTTP methods the resource
507 supports.
508
509 @item dav
510 @cindex DAV
511 A list of numbers specifying what DAV protocol/schema versions are
512 supported.
513
514 @item dasl
515 @cindex DASL
516 A list of supported DASL search types supported (string form).
517
518 @item ranges
519 A list of the units available for use in partial document fetches.
520
521 @item p3p
522 @cindex P3P
523 The @dfn{Platform For Privacy Protection} description for the resource.
524 Currently this is just the raw header contents.
525 @end table
526
527 @end defun
528
529 @node Dealing with HTTP documents
530 @subsection Dealing with HTTP documents
531
532 HTTP URLs are retrieved into a buffer containing the HTTP headers
533 followed by the body. Since the headers are quasi-MIME, they may be
534 processed using the MIME library. @xref{Top,, Emacs MIME,
535 emacs-mime, The Emacs MIME Manual}.
536
537 @node file/ftp
538 @section file and ftp
539 @cindex files
540 @cindex FTP
541 @cindex File Transfer Protocol
542 @cindex compressed files
543 @cindex dired
544
545 The @code{ftp} and @code{file} schemes are defined in RFC 1808. The
546 @code{url} library treats @samp{ftp:} and @samp{file:} as synonymous.
547 Such URLs have the form
548
549 @example
550 ftp://@var{user}:@var{password}@@@var{host}:@var{port}/@var{file}
551 file://@var{user}:@var{password}@@@var{host}:@var{port}/@var{file}
552 @end example
553
554 @noindent
555 If the URL specifies a local file, it is retrieved by reading the file
556 contents in the usual way. If it specifies a remote file, it is
557 retrieved using either the Tramp or the Ange-FTP package.
558 @xref{Remote Files,,, emacs, The GNU Emacs Manual}.
559
560 When retrieving a compressed file, it is automatically uncompressed
561 if it has the file suffix @file{.z}, @file{.gz}, @file{.Z},
562 @file{.bz2}, or @file{.xz}. (The list of supported suffixes is
563 hard-coded, and cannot be altered by customizing
564 @code{jka-compr-compression-info-list}.)
565
566 @defopt url-directory-index-file
567 This option specifies the filename to look for when a @code{file} or
568 @code{ftp} URL specifies a directory. The default is
569 @file{index.html}. If this file exists and is readable, it is viewed.
570 Otherwise, Emacs visits the directory using Dired.
571 @end defopt
572
573 @node info
574 @section info
575 @cindex Info
576 @cindex Texinfo
577 @findex Info-goto-node
578
579 The @code{info} scheme is non-standard. Such URLs have the form
580
581 @example
582 info:@var{file}#@var{node}
583 @end example
584
585 @noindent
586 and are retrieved by invoking @code{Info-goto-node} with argument
587 @samp{(@var{file})@var{node}}. If @samp{#@var{node}} is omitted, the
588 @samp{Top} node is opened.
589
590 @node mailto
591 @section mailto
592
593 @cindex mailto
594 @cindex email
595 A @code{mailto} URL specifies an email message to be sent to a given
596 email address. For example, @samp{mailto:foo@@bar.com} specifies
597 sending a message to @samp{foo@@bar.com}. The ``retrieval method''
598 for such URLs is to open a mail composition buffer in which the
599 appropriate content (e.g., the recipient address) has been filled in.
600
601 As defined in RFC 6068, a @code{mailto} URL can have the form
602
603 @example
604 @samp{mailto:@var{mailbox}[?@var{header}=@var{contents}[&@var{header}=@var{contents}]]}
605 @end example
606
607 @noindent
608 where an arbitrary number of @var{header}s can be added. If the
609 @var{header} is @samp{body}, then @var{contents} is put in the message
610 body; otherwise, a @var{header} header field is created with
611 @var{contents} as its contents. Note that the @code{url} library does
612 not perform any checking of @var{header} or @var{contents}, so you
613 should check them before sending the message.
614
615 @defopt url-mail-command
616 @vindex mail-user-agent
617 The value of this variable is the function called whenever url needs
618 to send mail. This should normally be left its default, which is the
619 standard mail-composition command @code{compose-mail}. @xref{Sending
620 Mail,,, emacs, The GNU Emacs Manual}.
621 @end defopt
622
623 If the document containing the @code{mailto} URL itself possessed a
624 known URL, Emacs automatically inserts an @samp{X-Url-From} header
625 field into the mail buffer, specifying that URL.
626
627 @node news/nntp/snews
628 @section @code{news}, @code{nntp} and @code{snews}
629 @cindex news
630 @cindex network news
631 @cindex usenet
632 @cindex NNTP
633 @cindex snews
634
635 The @code{news}, @code{nntp}, and @code{snews} schemes, defined in RFC
636 1738, are used for reading Usenet newsgroups. For compatibility with
637 non-standard-compliant news clients, the @code{url} library allows
638 host and port fields to be included in @code{news} URLs, even though
639 they are properly only allowed for @code{nntp} and @code{snews}.
640
641 @code{news} and @code{nntp} URLs have the following form:
642
643 @table @samp
644 @item news:@var{newsgroup}
645 Retrieves a list of messages in @var{newsgroup};
646 @item news:@var{message-id}
647 Retrieves the message with the given @var{message-id};
648 @item news:*
649 Retrieves a list of all available newsgroups;
650 @item nntp://@var{host}:@var{port}/@var{newsgroup}
651 @itemx nntp://@var{host}:@var{port}/@var{message-id}
652 @itemx nntp://@var{host}:@var{port}/*
653 Similar to the @samp{news} versions.
654 @end table
655
656 The default port for @code{nntp} (and @code{news}) is 119. The
657 difference between an @code{nntp} URL and a @code{news} URL is that an
658 @code{nttp} URL may specify an article by its number. The
659 @samp{snews} scheme is the same as @samp{nntp}, except that it is
660 tunneled through SSL and has default port 563.
661
662 These URLs are retrieved via the Gnus package.
663
664 @cindex environment variable
665 @vindex NNTPSERVER
666 @defopt url-news-server
667 This variable specifies the default news server from which to fetch
668 news, if no server was specified in the URL@. The default value,
669 @code{nil}, means to use the server specified by the standard
670 environment variable @samp{NNTPSERVER}, or @samp{news} if that
671 environment variable is unset.
672 @end defopt
673
674 @node rlogin/telnet/tn3270
675 @section rlogin, telnet and tn3270
676 @cindex rlogin
677 @cindex telnet
678 @cindex tn3270
679 @cindex terminal emulation
680 @findex terminal-emulator
681
682 These URL schemes are defined in RFC 1738, and are used for logging in
683 via a terminal emulator. They have the form
684
685 @example
686 telnet://@var{user}:@var{password}@@@var{host}:@var{port}
687 @end example
688
689 @noindent
690 but the @var{password} component is ignored. By default, the
691 @code{telnet} scheme is handled via Tramp (@pxref{Tramp}).
692
693 To handle rlogin, telnet and tn3270 URLs, a @code{rlogin},
694 @code{telnet} or @code{tn3270} (the program names and arguments are
695 hardcoded) session is run in a @code{terminal-emulator} buffer.
696 Well-known ports are used if the URL does not specify a port.
697
698 @node irc
699 @section irc
700 @cindex IRC
701 @cindex Internet Relay Chat
702 @cindex ZEN IRC
703 @cindex ERC
704 @cindex rcirc
705
706 The @code{irc} scheme is defined in the Internet Draft at
707 @url{http://www.w3.org/Addressing/draft-mirashi-url-irc-01.txt} (which
708 was never approved as an RFC). Such URLs have the form
709
710 @example
711 irc://@var{host}:@var{port}/@var{target},@var{needpass}
712 @end example
713
714 @noindent
715 and are retrieved by opening an @acronym{IRC} session using the
716 function specified by @code{url-irc-function}.
717
718 @defopt url-irc-function
719 The value of this option is a function, which is called to open an IRC
720 connection for @code{irc} URLs. This function must take five
721 arguments, @var{host}, @var{port}, @var{channel}, @var{user} and
722 @var{password}. The @var{channel} argument specifies the channel to
723 join immediately, and may be @code{nil}.
724
725 The default is @code{url-irc-rcirc}, which uses the Rcirc package.
726 Other options are @code{url-irc-erc} (which uses ERC) and
727 @code{url-irc-zenirc} (which uses ZenIRC).
728 @end defopt
729
730 @node data
731 @section data
732 @cindex data URLs
733
734 The @code{data} scheme, defined in RFC 2397, contains MIME data in
735 the URL itself. Such URLs have the form
736
737 @example
738 data:@r{[}@var{media-type}@r{]}@r{[};@var{base64}@r{]},@var{data}
739 @end example
740
741 @noindent
742 @var{media-type} is a MIME @samp{Content-Type} string, possibly
743 including parameters. It defaults to
744 @samp{text/plain;charset=US-ASCII}. The @samp{text/plain} can be
745 omitted but the charset parameter supplied. If @samp{;base64} is
746 present, the @var{data} are base64-encoded.
747
748 @node nfs
749 @section nfs
750 @cindex NFS
751 @cindex Network File System
752 @cindex automounter
753
754 The @code{nfs} scheme, defined in RFC 2224, is similar to @code{ftp}
755 except that it points to a file on a remote host that is handled by an
756 NFS automounter on the local host. Such URLs have the form
757
758 @example
759 nfs://@var{user}:@var{password}@@@var{host}:@var{port}/@var{file}
760 @end example
761
762 @defvar url-nfs-automounter-directory-spec
763 @end defvar
764 A string saying how to invoke the NFS automounter. Certain @samp{%}
765 sequences are recognized:
766
767 @table @samp
768 @item %h
769 The hostname of the NFS server;
770 @item %n
771 The port number of the NFS server;
772 @item %u
773 The username to use to authenticate;
774 @item %p
775 The password to use to authenticate;
776 @item %f
777 The filename on the remote server;
778 @item %%
779 A literal @samp{%}.
780 @end table
781
782 Each can be used any number of times.
783
784 @node ldap
785 @section ldap
786 @cindex LDAP
787 @cindex Lightweight Directory Access Protocol
788
789 The LDAP scheme is defined in RFC 2255.
790
791 @node man
792 @section man
793 @cindex @command{man}
794 @cindex Unix man pages
795 @findex man
796
797 The @code{man} scheme is a non-standard one. Such URLs have the form
798
799 @example
800 @samp{man:@var{page-spec}}
801 @end example
802
803 @noindent
804 and are retrieved by passing @var{page-spec} to the Lisp function
805 @code{man}.
806
807 @node Tramp
808 @section URL Types Supported via Tramp
809
810 @vindex url-tramp-protocols
811 Some additional URL types are supported by passing them to Tramp
812 (@pxref{Top, The Tramp Manual,, tramp, The Tramp Manual}). These
813 protocols are listed in the @code{url-tramp-protocols} variable, which
814 you can customize. The default value includes the following
815 protocols:
816
817 @table @code
818 @item ftp
819 The file transfer protocol. @xref{file/ftp}.
820
821 @item ssh
822 @cindex ssh
823 The secure shell protocol. @xref{Inline Methods,,, tramp, The Tramp
824 Manual}.
825
826 @item scp
827 @cindex scp
828 The secure file copy protocol. @xref{External Methods,,, tramp, The
829 Tramp Manual}.
830
831 @item rsync
832 @cindex rsync
833 The remote sync protocol.
834
835 @item telnet
836 The telnet protocol.
837 @end table
838
839 @node General Facilities
840 @chapter General Facilities
841
842 @menu
843 * Disk Caching::
844 * Proxies::
845 * Gateways in general::
846 * History::
847 @end menu
848
849 @node Disk Caching
850 @section Disk Caching
851 @cindex Caching
852 @cindex Persistent Cache
853 @cindex Disk Cache
854
855 The disk cache stores retrieved documents locally, whence they can be
856 retrieved more quickly. When requesting a URL that is in the cache,
857 the library checks to see if the page has changed since it was last
858 retrieved from the remote machine. If not, the local copy is used,
859 saving the transmission over the network.
860 @cindex Cleaning the cache
861 @cindex Clearing the cache
862 @cindex Cache cleaning
863 Currently the cache isn't cleared automatically.
864 @c Running the @code{clean-cache} shell script
865 @c fist is recommended, to allow for future cleaning of the cache. This
866 @c shell script will remove all files that have not been accessed since it
867 @c was last run. To keep the cache pared down, it is recommended that this
868 @c script be run from @i{at} or @i{cron} (see the manual pages for
869 @c crontab(5) or at(1) for more information)
870
871 @defopt url-automatic-caching
872 Setting this variable non-@code{nil} causes documents to be cached
873 automatically.
874 @end defopt
875
876 @defopt url-cache-directory
877 This variable specifies the
878 directory to store the cache files. It defaults to sub-directory
879 @file{cache} of @code{url-configuration-directory}.
880 @end defopt
881
882 @defopt url-cache-creation-function
883 The cache relies on a scheme for mapping URLs to files in the cache.
884 This variable names a function which sets the type of cache to use.
885 It takes a URL as argument and returns the absolute file name of the
886 corresponding cache file. The two supplied possibilities are
887 @code{url-cache-create-filename-using-md5} and
888 @code{url-cache-create-filename-human-readable}.
889 @end defopt
890
891 @defun url-cache-create-filename-using-md5 url
892 Creates a cache file name from @var{url} using MD5 hashing.
893 This is creates entries with very few cache collisions and is fast.
894 @cindex MD5
895 @smallexample
896 (url-cache-create-filename-using-md5 "http://www.example.com/foo/bar")
897 @result{} "/home/fx/.url/cache/fx/http/com/example/www/b8a35774ad20db71c7c3409a5410e74f"
898 @end smallexample
899 @end defun
900
901 @defun url-cache-create-filename-human-readable url
902 Creates a cache file name from @var{url} more obviously connected to
903 @var{url} than for @code{url-cache-create-filename-using-md5}, but
904 more likely to conflict with other files.
905 @smallexample
906 (url-cache-create-filename-human-readable "http://www.example.com/foo/bar")
907 @result{} "/home/fx/.url/cache/fx/http/com/example/www/foo/bar"
908 @end smallexample
909 @end defun
910
911 @defun url-cache-expired
912 This function returns non-@code{nil} if a cache entry has expired (or is absent).
913 The arguments are a URL and optional expiration delay in seconds
914 (default @var{url-cache-expire-time}).
915 @end defun
916
917 @defopt url-cache-expire-time
918 This variable is the default number of seconds to use for the
919 expire-time argument of the function @code{url-cache-expired}.
920 @end defopt
921
922 @defun url-fetch-from-cache
923 This function takes a URL as its argument and returns a buffer
924 containing the data cached for that URL.
925 @end defun
926
927 @c Fixme: never actually used currently?
928 @c @defopt url-standalone-mode
929 @c @cindex Relying on cache
930 @c @cindex Cache only mode
931 @c @cindex Standalone mode
932 @c If this variable is non-@code{nil}, the library relies solely on the
933 @c cache for fetching documents and avoids checking if they have changed
934 @c on remote servers.
935 @c @end defopt
936
937 @c With a large cache of documents on the local disk, it can be very handy
938 @c when traveling, or any other time the network connection is not active
939 @c (a laptop with a dial-on-demand PPP connection, etc.). Emacs/W3 can rely
940 @c solely on its cache, and avoid checking to see if the page has changed
941 @c on the remote server. In the case of a dial-on-demand PPP connection,
942 @c this will keep the phone line free as long as possible, only bringing up
943 @c the PPP connection when asking for a page that is not located in the
944 @c cache. This is very useful for demonstrations as well.
945
946 @node Proxies
947 @section Proxies and Gatewaying
948
949 @c fixme: check/document url-ns stuff
950 @cindex proxy servers
951 @cindex proxies
952 @cindex environment variables
953 @vindex HTTP_PROXY
954 Proxy servers are commonly used to provide gateways through firewalls
955 or as caches serving some more-or-less local network. Each protocol
956 (HTTP, FTP, etc.)@: can have a different gateway server. Proxying is
957 conventionally configured commonly amongst different programs through
958 environment variables of the form @code{@var{protocol}_proxy}, where
959 @var{protocol} is one of the supported network protocols (@code{http},
960 @code{ftp} etc.). The library recognizes such variables in either
961 upper or lower case. Their values are of one of the forms:
962 @itemize @bullet
963 @item @code{@var{host}:@var{port}}
964 @item A full URL;
965 @item Simply a host name.
966 @end itemize
967
968 @vindex NO_PROXY
969 The @code{NO_PROXY} environment variable specifies URLs that should be
970 excluded from proxying (on servers that should be contacted directly).
971 This should be a comma-separated list of hostnames, domain names, or a
972 mixture of both. Asterisks can be used as wildcards, but other
973 clients may not support that. Domain names may be indicated by a
974 leading dot. For example:
975 @example
976 NO_PROXY="*.aventail.com,home.com,.seanet.com"
977 @end example
978 @noindent says to contact all machines in the @samp{aventail.com} and
979 @samp{seanet.com} domains directly, as well as the machine named
980 @samp{home.com}. If @code{NO_PROXY} isn't defined, @code{no_PROXY}
981 and @code{no_proxy} are also tried, in that order.
982
983 Proxies may also be specified directly in Lisp.
984
985 @defopt url-proxy-services
986 This variable is an alist of URL schemes and proxy servers that
987 gateway them. The items are of the form @w{@code{(@var{scheme}
988 . @var{host}:@var{portnumber})}}, says that the URL @var{scheme} is
989 gatewayed through @var{portnumber} on the specified @var{host}. An
990 exception is the pseudo scheme @code{"no_proxy"}, which is paired with
991 a regexp matching host names not to be proxied. This variable is
992 initialized from the environment as above.
993
994 @example
995 (setq url-proxy-services
996 '(("http" . "proxy.aventail.com:80")
997 ("no_proxy" . "^.*\\(aventail\\|seanet\\)\\.com")))
998 @end example
999 @end defopt
1000
1001 @node Gateways in general
1002 @section Gateways in General
1003 @cindex gateways
1004 @cindex firewalls
1005
1006 The library provides a general gateway layer through which all
1007 networking passes. It can both control access to the network and
1008 provide access through gateways in firewalls. This may make direct
1009 connections in some cases and pass through some sort of gateway in
1010 others.@footnote{Proxies (which only operate over HTTP) are
1011 implemented using this.} The library's basic function responsible for
1012 making connections is @code{url-open-stream}.
1013
1014 @defun url-open-stream name buffer host service
1015 @cindex opening a stream
1016 @cindex stream, opening
1017 Open a stream to @var{host}, possibly via a gateway. The other
1018 arguments are as for @code{open-network-stream}. This will not make a
1019 connection if @code{url-gateway-unplugged} is non-@code{nil}.
1020 @end defun
1021
1022 @defvar url-gateway-local-host-regexp
1023 This is a regular expression that matches local hosts that do not
1024 require the use of a gateway. If @code{nil}, all connections are made
1025 through the gateway.
1026 @end defvar
1027
1028 @defvar url-gateway-method
1029 This variable controls which gateway method is used. It may be useful
1030 to bind it temporarily in some applications. It has values taken from
1031 a list of symbols. Possible values are:
1032
1033 @table @code
1034 @item telnet
1035 @cindex @command{telnet}
1036 Use this method if you must first telnet and log into a gateway host,
1037 and then run telnet from that host to connect to outside machines.
1038
1039 @item rlogin
1040 @cindex @command{rlogin}
1041 This method is identical to @code{telnet}, but uses @command{rlogin}
1042 to log into the remote machine without having to send the username and
1043 password over the wire every time.
1044
1045 @item socks
1046 @cindex @sc{socks}
1047 Use if the firewall has a @sc{socks} gateway running on it. The
1048 @sc{socks} v5 protocol is defined in RFC 1928.
1049
1050 @c @item ssl
1051 @c This probably shouldn't be documented
1052 @c Fixme: why not? -- fx
1053
1054 @item native
1055 This method uses Emacs's builtin networking directly. This is the
1056 default. It can be used only if there is no firewall blocking access.
1057 @end table
1058 @end defvar
1059
1060 The following variables control the gateway methods.
1061
1062 @defopt url-gateway-telnet-host
1063 The gateway host to telnet to. Once logged in there, you then telnet
1064 out to the hosts you want to connect to.
1065 @end defopt
1066 @defopt url-gateway-telnet-parameters
1067 This should be a list of parameters to pass to the @command{telnet} program.
1068 @end defopt
1069 @defopt url-gateway-telnet-password-prompt
1070 This is a regular expression that matches the password prompt when
1071 logging in.
1072 @end defopt
1073 @defopt url-gateway-telnet-login-prompt
1074 This is a regular expression that matches the username prompt when
1075 logging in.
1076 @end defopt
1077 @defopt url-gateway-telnet-user-name
1078 The username to log in with.
1079 @end defopt
1080 @defopt url-gateway-telnet-password
1081 The password to send when logging in.
1082 @end defopt
1083 @defopt url-gateway-prompt-pattern
1084 This is a regular expression that matches the shell prompt.
1085 @end defopt
1086
1087 @defopt url-gateway-rlogin-host
1088 Host to @samp{rlogin} to before telnetting out.
1089 @end defopt
1090 @defopt url-gateway-rlogin-parameters
1091 Parameters to pass to @samp{rsh}.
1092 @end defopt
1093 @defopt url-gateway-rlogin-user-name
1094 User name to use when logging in to the gateway.
1095 @end defopt
1096 @defopt url-gateway-prompt-pattern
1097 This is a regular expression that matches the shell prompt.
1098 @end defopt
1099
1100 @defopt socks-server
1101 This specifies the default server, it takes the form
1102 @w{@code{("Default server" @var{server} @var{port} @var{version})}}
1103 where @var{version} can be either 4 or 5.
1104 @end defopt
1105 @defvar socks-password
1106 If this is @code{nil} then you will be asked for the password,
1107 otherwise it will be used as the password for authenticating you to
1108 the @sc{socks} server.
1109 @end defvar
1110 @defvar socks-username
1111 This is the username to use when authenticating yourself to the
1112 @sc{socks} server. By default this is your login name.
1113 @end defvar
1114 @defvar socks-timeout
1115 This controls how long, in seconds, to wait for responses from the
1116 @sc{socks} server; it is 5 by default.
1117 @end defvar
1118 @c fixme: these have been effectively commented-out in the code
1119 @c @defopt socks-server-aliases
1120 @c This a list of server aliases. It is a list of aliases of the form
1121 @c @var{(alias hostname port version)}.
1122 @c @end defopt
1123 @c @defopt socks-network-aliases
1124 @c This a list of network aliases. Each entry in the list takes the form
1125 @c @var{(alias (network))} where @var{alias} is a string that names the
1126 @c @var{network}. The networks can contain a pair (not a dotted pair) of
1127 @c @sc{ip} addresses which specify a range of @sc{ip} addresses, an @sc{ip}
1128 @c address and a netmask, a domain name or a unique hostname or @sc{ip}
1129 @c address.
1130 @c @end defopt
1131 @c @defopt socks-redirection-rules
1132 @c This a list of redirection rules. Each rule take the form
1133 @c @var{(Destination network Connection type)} where @var{Destination
1134 @c network} is a network alias from @code{socks-network-aliases} and
1135 @c @var{Connection type} can be @code{nil} in which case a direct
1136 @c connection is used, or it can be an alias from
1137 @c @code{socks-server-aliases} in which case that server is used as a
1138 @c proxy.
1139 @c @end defopt
1140 @defopt socks-nslookup-program
1141 @cindex @command{nslookup}
1142 This the @samp{nslookup} program. It is @code{"nslookup"} by default.
1143 @end defopt
1144
1145 @menu
1146 * Suppressing network connections::
1147 @end menu
1148 @c * Broken hostname resolution::
1149
1150 @node Suppressing network connections
1151 @subsection Suppressing Network Connections
1152
1153 @cindex network connections, suppressing
1154 @cindex suppressing network connections
1155 @cindex bugs, HTML
1156 @cindex HTML ``bugs''
1157 In some circumstances it is desirable to suppress making network
1158 connections. A typical case is when rendering HTML in a mail user
1159 agent, when external URLs should not be activated, particularly to
1160 avoid ``bugs'' which ``call home'' by fetch single-pixel images and the
1161 like. To arrange this, bind the following variable for the duration
1162 of such processing.
1163
1164 @defvar url-gateway-unplugged
1165 If this variable is non-@code{nil} new network connections are never
1166 opened by the URL library.
1167 @end defvar
1168
1169 @c @node Broken hostname resolution
1170 @c @subsection Broken Hostname Resolution
1171
1172 @c @cindex hostname resolver
1173 @c @cindex resolver, hostname
1174 @c Some C libraries do not include the hostname resolver routines in
1175 @c their static libraries. If Emacs was linked statically, and was not
1176 @c linked with the resolver libraries, it will not be able to get to any
1177 @c machines off the local network. This is characterized by being able
1178 @c to reach someplace with a raw ip number, but not its hostname
1179 @c (@url{http://129.79.254.191/} works, but
1180 @c @url{http://www.cs.indiana.edu/} doesn't). This used to happen on
1181 @c SunOS4 and Ultrix, but is now probably now rare. If Emacs can't be
1182 @c rebuilt linked against the resolver library, it can use the external
1183 @c @command{nslookup} program instead.
1184
1185 @c @defopt url-gateway-broken-resolution
1186 @c @cindex @code{nslookup} program
1187 @c @cindex program, @code{nslookup}
1188 @c If non-@code{nil}, this variable says to use the program specified by
1189 @c @code{url-gateway-nslookup-program} program to do hostname resolution.
1190 @c @end defopt
1191
1192 @c @defopt url-gateway-nslookup-program
1193 @c The name of the program to do hostname lookup if Emacs can't do it
1194 @c directly. This program should expect a single argument on the command
1195 @c line---the hostname to resolve---and should produce output similar to
1196 @c the standard Unix @command{nslookup} program:
1197 @c @example
1198 @c Name: www.cs.indiana.edu
1199 @c Address: 129.79.254.191
1200 @c @end example
1201 @c @end defopt
1202
1203 @node History
1204 @section History
1205
1206 @findex url-do-setup
1207 The library can maintain a global history list tracking URLs accessed.
1208 URL completion can be done from it. The history mechanism is set up
1209 automatically via @code{url-do-setup} when it is configured to be on.
1210 Note that the size of the history list is currently not limited.
1211
1212 @vindex url-history-hash-table
1213 The history ``list'' is actually a hash table,
1214 @code{url-history-hash-table}. It contains access times keyed by URL
1215 strings. The times are in the format returned by @code{current-time}.
1216
1217 @defun url-history-update-url url time
1218 This function updates the history table with an entry for @var{url}
1219 accessed at the given @var{time}.
1220 @end defun
1221
1222 @defopt url-history-track
1223 If non-@code{nil}, the library will keep track of all the URLs
1224 accessed. If it is @code{t}, the list is saved to disk at the end of
1225 each Emacs session. The default is @code{nil}.
1226 @end defopt
1227
1228 @defopt url-history-file
1229 The file storing the history list between sessions. It defaults to
1230 @file{history} in @code{url-configuration-directory}.
1231 @end defopt
1232
1233 @defopt url-history-save-interval
1234 @findex url-history-setup-save-timer
1235 The number of seconds between automatic saves of the history list.
1236 Default is one hour. Note that if you change this variable directly,
1237 rather than using Custom, after @code{url-do-setup} has been run, you
1238 need to run the function @code{url-history-setup-save-timer}.
1239 @end defopt
1240
1241 @defun url-history-parse-history &optional fname
1242 Parses the history file @var{fname} (default @code{url-history-file})
1243 and sets up the history list.
1244 @end defun
1245
1246 @defun url-history-save-history &optional fname
1247 Saves the current history to file @var{fname} (default
1248 @code{url-history-file}).
1249 @end defun
1250
1251 @defun url-completion-function string predicate function
1252 You can use this function to do completion of URLs from the history.
1253 @end defun
1254
1255 @node Customization
1256 @chapter Customization
1257
1258 @cindex environment variables
1259 The following environment variables affect the @code{url} library's
1260 operation at startup.
1261
1262 @table @code
1263 @item TMPDIR
1264 @vindex TMPDIR
1265 @vindex url-temporary-directory
1266 If this is defined, @var{url-temporary-directory} is initialized from
1267 it.
1268 @end table
1269
1270 The following user options affect the general operation of
1271 @code{url} library.
1272
1273 @defopt url-configuration-directory
1274 @cindex configuration files
1275 The value of this variable specifies the name of the directory where
1276 the @code{url} library stores its various configuration files, cache
1277 files, etc.
1278
1279 The default value specifies a subdirectory named @file{url/} in the
1280 standard Emacs user data directory specified by the variable
1281 @code{user-emacs-directory} (normally @file{~/.emacs.d}). However,
1282 the old default was @file{~/.url}, and this directory is used instead
1283 if it exists.
1284 @end defopt
1285
1286 @defopt url-debug
1287 @cindex debugging
1288 Specifies the types of debug messages which are logged to
1289 the @file{*URL-DEBUG*} buffer.
1290 @code{t} means log all messages.
1291 A number means log all messages and show them with @code{message}.
1292 It may also be a list of the types of messages to be logged.
1293 @end defopt
1294 @defopt url-personal-mail-address
1295 @end defopt
1296 @defopt url-privacy-level
1297 @end defopt
1298 @defopt url-uncompressor-alist
1299 @end defopt
1300 @defopt url-passwd-entry-func
1301 @end defopt
1302 @defopt url-standalone-mode
1303 @end defopt
1304 @defopt url-bad-port-list
1305 @end defopt
1306 @defopt url-max-password-attempts
1307 @end defopt
1308 @defopt url-temporary-directory
1309 @end defopt
1310 @defopt url-show-status
1311 @end defopt
1312 @defopt url-confirmation-func
1313 The function to use for asking yes or no functions. This is normally
1314 either @code{y-or-n-p} or @code{yes-or-no-p}, but could be another
1315 function taking a single argument (the prompt) and returning @code{t}
1316 only if an affirmative answer is given.
1317 @end defopt
1318 @defopt url-gateway-method
1319 @c fixme: describe gatewaying
1320 A symbol specifying the type of gateway support to use for connections
1321 from the local machine. The supported methods are:
1322
1323 @table @code
1324 @item telnet
1325 Run telnet in a subprocess to connect;
1326 @item rlogin
1327 Rlogin to another machine to connect;
1328 @item socks
1329 Connect through a socks server;
1330 @item ssl
1331 Connect with SSL;
1332 @item native
1333 Connect directly.
1334 @end table
1335 @end defopt
1336
1337 @defopt url-user-agent
1338 The User Agent string used for sending HTTP/HTTPS requests. The value
1339 should be a string or a function of no arguments that returns a
1340 string. The default value is @w{@samp{User-Agent: @var{package-name}
1341 URL/Emacs}}, where @var{package-name} is the value of
1342 @code{url-package-name} and its version, if they are non-@code{nil}.
1343 @end defopt
1344
1345 @node GNU Free Documentation License
1346 @appendix GNU Free Documentation License
1347 @include doclicense.texi
1348
1349 @node Function Index
1350 @unnumbered Command and Function Index
1351 @printindex fn
1352
1353 @node Variable Index
1354 @unnumbered Variable Index
1355 @printindex vr
1356
1357 @node Concept Index
1358 @unnumbered Concept Index
1359 @printindex cp
1360
1361 @bye