summaryrefslogtreecommitdiff
path: root/jabber.texi
diff options
context:
space:
mode:
Diffstat (limited to 'jabber.texi')
-rw-r--r--jabber.texi3020
1 files changed, 3020 insertions, 0 deletions
diff --git a/jabber.texi b/jabber.texi
new file mode 100644
index 0000000..128b551
--- /dev/null
+++ b/jabber.texi
@@ -0,0 +1,3020 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename jabber.info
+@settitle jabber.el manual 0.8.0
+@c %**end of header
+
+@dircategory Emacs
+@direntry
+* jabber.el: (jabber). Emacs XMPP (Jabber) client
+@end direntry
+
+@copying
+This manual is for jabber.el, version 0.8.0.
+
+Copyright @copyright{} 2004, 2005, 2006, 2007, 2008, 2009 Magnus Henoch, Tom Berger.
+
+@quotation
+Permission is granted to make and distribute verbatim copies or
+modified versions of this manual, provided the copyright notice and
+this permission notice are preserved on all copies.
+@end quotation
+@end copying
+
+@titlepage
+@title jabber.el
+@subtitle instant messaging for XMPP (Jabber)
+@author by Magnus Henoch and Tom Berger
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top, Introduction, (dir), (dir)
+@top jabber.el manual
+
+@insertcopying
+
+@end ifnottex
+
+@menu
+* Introduction::
+* Basic operation::
+* Groupchat::
+* Composing messages::
+* File transfer::
+* Services::
+* Personal information::
+* Avatars::
+* Time queries::
+* Useful features::
+* Message history::
+* Typing notifications::
+* Roster import and export::
+* XMPP URIs::
+* Customization::
+* Hacking and extending::
+* Protocol support::
+* Concept index::
+* Function index::
+* Variable index::
+@end menu
+
+
+@node Introduction, Basic operation, Top, Top
+@chapter Introduction
+
+jabber.el is an XMPP (Jabber) client running under Emacs. For more
+information on the open instant messaging protocol,
+please visit @uref{http://xmpp.org}.
+
+As a XMPP client, jabber.el is mostly just a face in the crowd,
+except that it uses buffers where GUI clients have windows. There is
+a roster buffer, and to chat with someone you open a chat buffer, and
+there are buffers for
+interaction with servers and services. Then again, jabber.el delivers
+excellent console performance and customizable hooks (if you have
+speech synthesizer software, hook it up to your presence alerts).
+
+jabber.el does not yet support PGP encryption, sending and receiving
+roster items, and various other things.
+
+@menu
+* Contacts::
+@end menu
+
+@node Contacts, , , Introduction
+@section Contacts
+
+@itemize @bullet
+@item
+There is a web page at
+@uref{http://emacs-jabber.sf.net/}.
+
+@item
+There is a Sourceforge
+project page at @uref{http://sourceforge.net/projects/emacs-jabber},
+with bug and patch trackers.
+
+@item
+There is a mailing list:
+@email{emacs-jabber-general@@lists.sourceforge.net},
+@uref{https://lists.sourceforge.net/lists/listinfo/emacs-jabber-general},
+@uref{http://dir.gmane.org/gmane.emacs.jabber.general}
+
+@item
+There is a chat room, @code{jabber.el@@conference.jabber.se}. If you
+have successfully connected, you can join it by typing @kbd{M-x
+jabber-muc-join} and entering the address.
+
+@end itemize
+
+@node Basic operation, Groupchat, Introduction, Top
+@chapter Basic operation
+
+This chapter is intended as an introduction to basic usage of
+jabber.el. If you have used XMPP before and are familiar with the
+terminology, you might find it a bit too basic---in that case, just
+skim it, making sure to pick up the commands mentioned.
+
+I'll assume that you have already successfully installed jabber.el; if
+not, consult the @file{README} file. Also, make sure you have
+@code{(require 'jabber)} or @code{(load "jabber-autoloads")} in your
+@file{.emacs}.
+
+There are a handful of global keybindings for common commands. They
+start with @kbd{C-x C-j}, and you can get a list of them by typing
+@kbd{C-x C-j C-h}.
+
+@menu
+* Do you have a Jabber account?::
+* Registering an account::
+* Connecting::
+* Chatting::
+* Presence::
+* Presence subscription::
+* Roster buffer::
+@end menu
+
+@node Do you have a Jabber account?, Registering an account, , Basic operation
+@section Do you have a Jabber account?
+
+Jabber has become rather popular as an instant messaging technology.
+Several sites use it, but often not under the names ``Jabber'' or
+``XMPP''. Examples:
+
+@itemize @bullet
+@item
+Google Talk uses Jabber. If you have a Gmail address, you can use it as
+a Jabber ID. @xref{Account settings}, for Google-specific configuration.
+
+@item
+LJ Talk (of Livejournal) uses Jabber. Your Jabber ID is
+@samp{@var{ljusername}@@livejournal.com}.
+@end itemize
+
+@node Registering an account, Connecting, Do you have a Jabber account?, Basic operation
+@section Registering an account
+
+@cindex Registering an account
+
+If you do not yet have a Jabber account, you can register one. The
+registration processes for various servers differ, but many servers
+support so-called ``in-band registration'', which is described in this
+section.
+
+To register an account, type @kbd{C-u M-x jabber-connect} and enter your
+desired JID in the form @samp{@var{username}@@@var{server}}. You will
+be presented with a registration form to fill out and send. There the
+username you chose will be prefilled. After registration, you can
+connect to the server as usual.
+
+@node Connecting, Chatting, Registering an account, Basic operation
+@section Connecting
+
+@findex jabber-connect-all
+@findex jabber-connect
+@findex jabber-disconnect-one
+@findex jabber-disconnect
+
+@cindex Connecting
+
+Now, type @kbd{C-x C-j C-c} and enter your JID and password. If you
+successfully connect, jabber.el will download your roster and display it
+in a buffer called @code{*-jabber-roster-*}.
+
+By default, you will appear as ``online'' to your contacts. To change
+this to e.g. ``away'', type @kbd{M-x jabber-send-presence} or @kbd{C-x
+C-j C-p}. @xref{Presence}, for more information.
+
+To disconnect, type @kbd{M-x jabber-disconnect} or @kbd{C-x C-j C-d}.
+Use @kbd{M-x jabber-disconnect-one} to disconnect just one account (or just type @kbd{C-u C-x C-j C-d}).
+
+If you don't want to type your JID every time you connect, you can save
+it in the variable @code{jabber-account-list}. @xref{Account
+settings}. If you configure more than one account, all of them will be
+connected when you type @kbd{C-x C-j C-c}, as that key is bound to
+@code{jabber-connect-all}. To connect only one account, possibly one
+that's not in your list, type @kbd{M-x jabber-connect} or @kbd{C-u C-x
+C-j C-c}.
+
+@node Chatting, Presence, Connecting, Basic operation
+@section Chatting
+
+@cindex Chatting
+@findex jabber-chat-with
+
+There are several ways to open a chat buffer. The shortest way is to
+put point over the person you want to chat with in the roster display
+and hit RET.
+
+You can also use the function @code{jabber-chat-with}. This function is
+bound to @kbd{C-x C-j C-j} in the global keymap. You will be asked to
+enter a JID in the minibuffer. You can also enter the roster name of
+one of your contacts. All JIDs and names in your roster can be
+tab-completed.
+
+You can also use menus to access commands. In the roster display, you
+can access several menus through keystrokes or mouse clicks. You can
+bring one big menu up by pressing the second mouse button, or you can
+bring up the ``chat menu'' by typing @kbd{C-c C-c}. If you do the
+latter while point is on a roster entry, that entry will be the
+default value when you are asked for whom to chat with.
+
+Now, try opening a chat with someone. A buffer named
+@code{*-jabber-chat-:-@var{person}-*} will be created and selected.
+Type your message at the end of the buffer, and hit @kbd{RET} to send
+it. To include a newline in your message, use @kbd{C-j}.
+
+When you receive a message from someone, you will see a red indicator in
+the mode line. You can click this indicator with the mouse, or type
+@kbd{C-x C-j C-l} to switch to the relevant buffer. @xref{Tracking
+activity}.
+
+@node Presence, Presence subscription, Chatting, Basic operation
+@section Presence
+
+@cindex Presence
+@cindex Sending presence
+@findex jabber-send-presence
+@findex jabber-send-default-presence
+@vindex jabber-default-show
+@vindex jabber-default-status
+@vindex jabber-default-priority
+
+@dfn{Presence} is the Jabber term for letting other people know that you
+are online, and additionally how ``available'' you are. There are
+three elements to presence: availability state (called ``show''),
+status message, and priority.
+
+Your show state may either be empty (meaning simply ``online''), or
+one of @code{away}, @code{xa}, @code{dnd} and @code{chat}, meaning
+``away'', ``extended away'' (i.e. away for an extended period), ``do
+not disturb'', and ``free for chat'', respectively. This information
+is available to everyone subscribing to your presence, but technically
+it does not restrict anyone's actions. You can chat with people even
+if you claim to be away.
+
+The status message is a short text complementing your show status,
+such as ``at home'', ``working'', ``phone'', ``playing games'' or
+whatever you want. It is sent to everyone subscribing to your
+presence, but not all clients prominently display it to the user.
+
+The priority is only interesting if you are running more than one Jabber
+client at a time accessing the same account. @xref{Resources and
+priority}.
+
+To set your presence, use the function @code{jabber-send-presence}
+(bound to @kbd{C-x C-j C-p}).
+It can be called both interactively and in Lisp code. For the latter
+case, use something like @code{(jabber-send-presence "away" "idle for
+10 minutes" 10)}. There are a few shortcuts:
+@table @kbd
+@item C-x C-j C-a
+Send ``away'' presence (with prefix argument, specify status text)
+@item C-x C-j C-x
+Send ``extended away'' presence (with prefix argument, specify status
+text)
+@item C-x C-j C-o
+Send default presence (see below)
+@end table
+
+By default, jabber.el sets your presence when you connect. If you
+want it not to do that, remove @code{jabber-send-current-presence}
+from @code{jabber-post-connect-hooks}. If you want to change the
+presence that is sent, change the variables
+@code{jabber-default-show}, @code{jabber-default-status} and
+@code{jabber-default-priority}.
+
+With jabber.el, you can set your presence remotely. @xref{Ad-Hoc Commands}.
+
+@menu
+* Resources and priority::
+* Directed presence::
+@end menu
+
+@node Resources and priority, Directed presence, , Presence
+@subsection Resources and priority
+
+@cindex Resource
+@cindex Priority
+
+Every connection to an account has a specific name, a @dfn{resource}.
+The account itself has a JID of the form
+@samp{@var{username}@@@var{server}} (a @dfn{bare JID}), but the
+connections have JIDs of the form
+@samp{@var{username}@@@var{server}/@var{resource}} (a @dfn{full JID}).
+You can choose the resource name yourself by entering a JID of the
+latter form at the connection prompt (@pxref{Connecting}), or by
+configuring it in @code{jabber-account-list} (@pxref{Account settings})
+
+Each session has a @dfn{priority}. The priority determines what happens
+when a message is sent to the bare JID (i.e. without specifying what
+connection should receive message). Such messages are delivered to the
+connection with the highest non-negative priority value. If there are
+no connections, or if all connections have negative priority, the
+message is either stored on the server for later delivery or bounced to
+the sender, depending on the server configuration.
+
+If there are several connections with the same priority, the behaviour
+depends on the server. Some server implementations deliver the message
+to all such connections, while others choose one connection depending on
+certain rules.
+
+Note that these rules do not apply when a message is sent to a full
+JID. Such messages are sent to the specified resource, if it is still
+connected, and otherwise treated as messages to the bare JID. In the
+chat buffers of jabber.el, messages are sent to whatever JID the last
+message came from (usually a full JID), or to the bare JID if no message
+has been received yet. Other clients may have different behaviour.
+
+@node Directed presence, , Resources and priority, Presence
+@subsection Directed presence
+
+@cindex directed presence
+@cindex send directed presence
+@findex jabber-send-directed-presence
+You can send ``directed presence'' with @kbd{M-x
+jabber-send-directed-presence}. This is mostly useful to manage
+transports---sending directed presence is a way to turn them on and
+off. You can also send directed presence to an annoying contact to
+appear as away or offline to that contact. Note, however, that in both
+of these cases, all subscribed entities will get your next global
+presence update.
+
+@node Presence subscription, Roster buffer, Presence, Basic operation
+@section Presence subscription
+
+@cindex Presence subscription
+@cindex Subscribing to someone's presence
+@findex jabber-send-subscription-request
+
+Having permission to view the presence status of a person is called
+@dfn{subscribing to his presence}. Presence subscription between two
+persons can be asymmetric. Subscription state is shown in the roster
+display by arrows (@pxref{Customizing the roster buffer}). A
+left-pointing arrow means that the contact can see your presence
+(``from''). A right-pointing arrow means that you can see the contact's
+presence (``to''). The most common case is mutual subscription, a
+double-ended arrow (``both'').
+
+When jabber.el receives a presence subscription request, it will present
+it to you in a chat buffer, and offer you to choose subscription mode
+and send a subscription request back to that person. The ``Mutual''
+button accepts the request and sends a reciprocal request.@footnote{If this
+request is superfluous, the server will drop it without bothering the
+contact.} The ``One-way'' button accepts the request, but doesn't ask
+for a subscription in return. The ``Decline'' button declines the
+request.
+
+To request subscription to someone, type @kbd{M-x
+jabber-send-subscription-request}. You will be prompted for the JID
+to send it to. This command can also be accessed through the Roster
+menu, by typing @kbd{C-c C-r} in the roster buffer. After that, you
+will probably want to give the contact a more readable name. The
+command for that is @code{jabber-roster-change}, which is also
+available in the Roster menu or by typing @kbd{e} on a person in the
+roster buffer.
+
+@node Roster buffer, , Presence subscription, Basic operation
+@section The roster buffer
+
+@cindex Roster buffer, basics
+@cindex Menus
+@cindex Key bindings
+
+The roster buffer is called @code{*-jabber-roster-*}. It simply
+contains a list of the contacts on your roster. If you have several
+accounts connected, contacts will be grouped by account.
+
+In the roster buffer, any command which requires a JID will default to
+the JID under point when called. These commands can be called through
+either keyboard menus or mouse menus. To open a menu with the mouse,
+simply press the second mouse button over the JID in
+question.@footnote{For some reason, mouse menus don't work in XEmacs.
+Patches are welcome.} This will bring up a menu with all available
+actions. The keyboard menus are split into categories: Chat, Roster,
+Information, MUC (Multi-User Chat, or groupchat) and Services, opened
+by @kbd{C-c C-c}, @kbd{C-c C-r}, @kbd{C-c C-i}, @kbd{C-c C-m} and
+@kbd{C-c C-s}, respectively.
+
+@vindex jabber-roster-show-bindings
+A list of keybindings is displayed at the top of the roster buffer.
+You can turn it off by setting @code{jabber-roster-show-bindings} to
+nil.
+
+@findex jabber-display-roster
+You can call @code{jabber-display-roster} (bound to @kbd{g}) to
+redisplay your roster according to changed preferences
+(@pxref{Customizing the roster buffer}). This will not refetch your
+roster from the server. Refetching the roster is usually not needed,
+since updates are pushed to clients automatically.
+
+You can choose not to have the roster updated automatically on
+presence changes (@pxref{Presence alerts}). In that case, you need to
+call @code{jabber-display-roster} manually.
+
+@vindex jabber-show-offline-contacts
+@cindex Hiding offline contacts
+@cindex Offline contacts, hiding
+Please note, that by default offline contacts showed in roster as any
+others. To hide them, you can use @kbd{o} in roster buffer. To
+permanently hide them, customize @code{jabber-show-offline-contacts}
+variable.
+
+@node Groupchat, Composing messages, Basic operation, Top
+@chapter Groupchat
+
+@cindex Groupchat
+@cindex MUC
+@cindex Chatrooms
+
+The groupchat menu can be accessed by typing @kbd{C-c C-m} in the
+roster buffer. You can also type the commands directly, as will be
+shown here.
+
+@findex jabber-muc-join
+@cindex Joining a groupchat
+@cindex Changing nickname
+@cindex Nickname, changing
+To join a groupchat, type @kbd{M-x jabber-muc-join}. You will
+be prompted for the groupchat to join, and your nickname in the
+groupchat. This nickname doesn't need to have any correlation to your
+JID; in fact, groupchats are usually (but not always) configured such
+that only moderators can see your JID. You can change your nickname
+with @kbd{M-x jabber-muc-nick}. @xref{Configuration}, for setting default
+nicknames.
+
+@cindex Query groupchat
+@vindex jabber-muc-disable-disco-check
+When trying to join a room, jabber.el first sends a service discovery
+info request to the room, to find out whether it exists and what
+features are enabled (in particular whether the room is
+password-protected). However, this can cause problems with some buggy
+MUC services (or services that respond in a way that jabber.el doesn't
+expect). A workaround for that is to set
+@code{jabber-muc-disable-disco-check} to @code{t}; however, the bug should be
+unearthed and fixed.
+
+Groupchat messages will be displayed in a buffer called
+@code{*-jabber-groupchat-:-@var{groupchat}-*}. By default, the buffer
+name is based on the JID of the chat room. If you want a shorter name,
+you can add the chat room to your roster and give it a name, using the
+command @kbd{M-x jabber-roster-change}. The groupchat buffer works much
+like the chat buffer. It has its own class of alerts
+(@pxref{Customizing alerts}), and uses activity tracking
+(@pxref{Tracking activity}).
+
+@vindex jabber-muc-completion-delimiter
+@vindex jabber-muc-looks-personaling-symbols
+@cindex Groupchat completion
+@cindex Nick completion in groupchat
+Also, to save from repeating unnesesary typing you can press @kbd{Tab}
+key to complete nick of a groupchat member that you are talking with.
+You can customize your form of personal talking in MUC
+(@code{jabber-muc-completion-delimiter}) and form of personal talking to
+you (@code{jabber-muc-looks-personaling-symbols})---see ``jabber-chat''
+customization group. Defaults are sane, so it is unlikely that you would
+want to change this, but... it is Emacs!
+
+@cindex Topic, MUC
+@findex jabber-muc-set-topic
+To change the topic of a groupchat, type @kbd{M-x jabber-muc-set-topic}.
+The current topic is shown in the header line.
+
+@findex jabber-muc-leave
+To leave a groupchat, type @kbd{M-x jabber-muc-leave}.
+
+@findex jabber-muc-get-config
+If you are the owner of a groupchat, you can change its configuration
+by typing @kbd{M-x jabber-muc-get-config}. A configuration form
+will be rendered in new buffer.
+
+@findex jabber-muc-names
+@vindex jabber-muc-print-names-format
+To see which people are in a groupchat, type @kbd{M-x
+jabber-muc-names}. This gives a list of nicknames,
+``affiliations'', and possibly JIDs according @code{jabber-muc-print-names-format}, sorted by ``roles''.
+@xref{MUC Administration}, for the meaning of roles and affiliations.
+
+
+@menu
+* Configuration::
+* Invitations::
+* Private messages::
+* MUC Administration::
+@end menu
+
+@node Configuration, Invitations, , Groupchat
+@section Configuration
+
+@vindex jabber-muc-default-nicknames
+@vindex jabber-muc-autojoin
+@findex jabber-muc-autojoin
+@cindex Default MUC nickname
+@cindex Autojoin chat rooms
+@cindex Bookmarks, MUC
+@findex jabber-edit-bookmarks
+
+You can configure jabber.el to use a certain nickname for a certain
+room, or to automatically join a certain room when you connect. You can
+do this either by storing bookmarks on the server or by setting Emacs
+variables.
+
+Type @kbd{M-x jabber-edit-bookmarks} to add bookmarks. You can specify
+the JID of the conference, the name of the conference (not used by
+jabber.el), whether to automatically join the room, your desired
+nickname (or leave empty), and the room password (or leave empty).
+
+The default nickname for groupchats is the username part of your JID.
+If you don't use bookmarks, you can set different nicknames for
+different groups by customizing @code{jabber-muc-default-nicknames}.
+There you specify the JID of the group, and your preferred nickname.
+
+Automatically joining certain rooms when connecting can be accomplished
+by setting @code{jabber-muc-autojoin} to a list containing the JIDs of
+the rooms you want to enter. To disable this feature, remove
+@code{jabber-muc-autojoin} from @code{jabber-post-connect-hooks}.
+
+Please note, that @code{jabber-muc-default-nicknames} and
+@code{jabber-muc-autojoin} are machine-local, but apply to @emph{all}
+accounts---if you connect several accounts, both will try to connect to
+the same chat rooms, or use the same nickname. This will lead to
+confusion.
+
+@node Invitations, Private messages, Configuration, Groupchat
+@section Invitations
+
+@cindex Invitations
+@findex jabber-muc-invite
+
+You can invite someone to a groupchat with @kbd{M-x jabber-muc-invite}
+(also available in the MUC menu). Pay attention to the order of the
+arguments---as both users and rooms are just JIDs, it is technically
+possible to invite a room to a user, but that's probably not what you
+want.
+
+When you receive an invitation, it appears in the chat buffer along
+with two buttons, ``Accept'' and ``Decline''. Pressing ``Accept''
+enters the room, as you would expect. Pressing ``Decline'' gives you
+an opportunity to state the reason why you're not joining.
+
+@node Private messages, MUC Administration, Invitations, Groupchat
+@section Private messages
+
+@cindex Private MUC messages
+@findex jabber-muc-private
+
+You can open a private chat with a participant in a chat room with
+@kbd{M-x jabber-muc-private} (or by using the MUC menu). This creates
+a buffer with the name
+@code{*-jabber-muc-priv-@var{group}-@var{nickname}-*} (customizable by
+@code{jabber-muc-private-buffer-format}), which behaves mostly like an
+ordinary chat buffer. This buffer will also be created if someone
+sends a private message to you.
+
+Private MUC messages use the same alerts as normal chat messages.
+@xref{Message alerts}.
+
+@node MUC Administration, , Private messages, Groupchat
+@section Administration
+
+Administration of a MUC room mostly consists of managing roles and
+affiliations. Roles are temporary, and apply until the user leaves the
+room. Affiliations are permanent, and based on JIDs.
+
+@subsection Roles
+
+@findex jabber-muc-set-role
+@cindex Kicking, MUC
+@cindex Voice, MUC
+@cindex Moderator, MUC
+@cindex Roles, MUC
+If you have moderator privileges, you can change the role of a
+participant with @kbd{M-x jabber-muc-set-role}. Kicking means setting
+the role to ``none''. Granting and revoking voice are ``participant''
+and ``visitor'', respectively. ``moderator'' gives moderator
+privileges, obviously.
+
+The possible roles are:
+
+@table @samp
+@item moderator
+Has voice, can change other people's roles.
+
+@item participant
+Has voice.
+
+@item visitor
+Doesn't have voice (can't send messages to everyone, but can send
+private messages)
+
+@item none
+Not in room.
+@end table
+
+@subsection Affiliations
+
+@findex jabber-muc-set-affiliation
+@cindex Affiliations, MUC
+@cindex Banning, MUC
+If you have admin or owner privileges, you can change the affiliation of
+a user with @kbd{M-x jabber-muc-set-affiliation}. Affiliation is
+persistent, and based on JIDs. Depending of your affiliation and the
+MUC implementation, you might not be allowed to perform all kinds of
+changes, and maybe not in one step.
+
+Affiliations are:
+
+@table @samp
+@item owner
+Can destroy room, appoint admins, make people members, ban people.
+
+@item admin
+Can make people members or ban people.
+
+@item member
+Can enter the room, and has voice by default.
+
+@item none
+Rights depend on room configuration. The room might be members-only, or
+grant voice only to members.
+
+@item outcast
+Banned from the room.
+@end table
+
+
+@node Composing messages, File transfer, Groupchat, Top
+@chapter Composing messages
+
+@findex jabber-compose
+@cindex composing messages
+@cindex message composition
+
+The chat buffer interface can be inconvenient for some purposes. As you
+can't use @kbd{RET} to insert a newline (use @kbd{C-j} for that),
+writing a longer message can be painful. Also, it is not possible to
+include a subject in the message, or send the message to multiple
+recipients.
+
+These features are implemented by the message composing tool. Type
+@kbd{M-x jabber-compose} to start it. In the buffer that comes up, you
+can specify recipients, enter a subject, and type your message.
+
+@node File transfer, Services, Composing messages, Top
+@chapter File transfer
+
+@cindex File transfer
+@cindex Sending files
+
+jabber.el has limited support for file transfer. The most important
+limit is that files sent and received are kept in buffers, so Emacs must
+be able to allocate enough memory for the entire file, and the file size
+must be smaller than the maximum buffer size.@footnote{The maximum
+buffer size depends on in the variable @code{most-positive-fixnum}. On
+32-bit systems, this is 128 or 256 megabytes, depending on your
+Emacs version.}
+
+jabber.el is able to exchange files with most Jabber clients (and also
+some MSN transports), but notably not with the official Google Talk
+client. The Google Talk client uses a different file transfer protocol
+which, at the time of this release, has not been published.
+
+@menu
+* Receiving files::
+* Sending files::
+@end menu
+
+@node Receiving files, Sending files, , File transfer
+@section Receiving files
+
+Receiving files requires no configuration. When someone wants to send a
+file to you, you are asked (through @code{yes-or-no-p}) whether you want
+to accept the file. If you answer yes, you get to choose where to save
+the file.
+
+If the sender's client is correctly configured (this is often not the
+case; see below), the file transfer will start. Currently, the only way
+to watch the progress is to inspect the buffer of the file being
+transfered; @kbd{C-x C-b} is one way of doing that. @xref{List Buffers,
+, Listing Existing Buffers, emacs, GNU Emacs Manual}. When the transfer
+is done, the message ``@var{file} downloaded'' appears in the echo area,
+and the buffer is killed.
+
+@c This truly sucks...
+If this doesn't happen, it is most likely the sender's fault. The
+sender needs to have a public IP address, either directly, through port
+forwarding (in which case the client needs to be configured with the
+real public IP address), or through an XEP-0065 proxy. If you have
+activated XML logging (@pxref{Debug options}), you can see the IP
+address that the other client is asking you to connect to there. Often
+you will find that this is an internal IP address (often starts with
+@code{192.168}). See the documentation of the sender's client for
+setting this up.
+
+@node Sending files, , Receiving files, File transfer
+@section Sending files
+
+@cindex proxy, file transfer
+@cindex file transfer proxy
+@cindex XEP-0065 proxy
+
+To send a file to someone, you need an XEP-0065 proxy.@footnote{This
+requirement is not inherent in the protocol, only in the current file
+transfer implementation of jabber.el, and in Emacs versions earlier than
+22.} If your Jabber server hosts such a proxy, it will be found
+automatically, otherwise it needs to be manually configured.
+
+You can check whether your Jabber server has a proxy with @kbd{M-x
+jabber-get-disco-items}; see @ref{Service discovery}.
+
+@vindex jabber-socks5-proxies
+@findex jabber-socks5-query-all-proxies
+To configure a proxy manually, customize the variable
+@code{jabber-socks5-proxies}. Putting @code{proxy.jabber.se} there
+should work. Type @kbd{M-x jabber-socks5-query-all-proxies} to see if
+the proxies answer.
+
+@findex jabber-ft-send
+Now, you can type @kbd{M-x jabber-ft-send} to send a file to someone.
+You need to enter the correct full JID, including resource, to get this
+right. If the contact is logged in with only one client, and you can
+see it online, just typing the JID or roster name is enough. If you run
+the command from a chat buffer, the JID of the contact is given as
+the default value.
+
+If the contact has several clients online, you probably want to send the
+file to a particular one. If you run this command from within a chat
+buffer, the default target will be the one that last sent a message to
+you. If you just type a bare JID or a roster name, the client with the
+highest priority will get the file.
+
+If the contact accepts the file, and the contact's client succeeds in
+connecting to the proxy, jabber.el will send the file through the
+proxy. During this time, your Emacs will be blocked, so you might want
+to avoid sending large files over slow connections.
+
+@node Services, Personal information, File transfer, Top
+@chapter Services
+
+@cindex Browse buffers
+
+Not every Jabber entity is a physical person. There are many
+automatic entities, called servers, services, components, agents,
+transports and other names. The use of these is described here.
+
+The functions described in this chapter use @dfn{browse buffers}.
+Browse buffers are named @code{*-jabber-browse-:-@var{service}-*},
+sometimes with a numerical suffix. The different menus have the same
+keybindings as in the roster buffer, and if you call a function
+operating on a JID while point is over a JID, that JID will be the
+default value, so you don't have to type it or copy it yourself.
+
+You can change the buffer name template by customizing
+the variable @code{jabber-browse-buffer-format}.
+
+@menu
+* Commands::
+* Your home server::
+* Transports::
+* User directories::
+* MUC services::
+@end menu
+
+@node Commands, Your home server, , Services
+@section Commands
+
+A small number of commands is used for almost all interaction with
+Jabber services. Essentially, they are all the same: you request a form
+from the server, fill it in, and send it back.
+
+Most of these commands are available under the Service menu, which is
+opened by typing @kbd{C-c C-s}. Service discovery is under the Info
+menu instead, which is available under @kbd{C-c C-i}.
+
+@menu
+* Registration::
+* Search::
+* Ad-Hoc Commands::
+* Service discovery::
+* Browsing::
+@end menu
+
+@node Registration, Search, , Commands
+@subsection Registration
+
+@cindex Registration
+@findex jabber-get-register
+
+You can get a registration form for a service by typing @kbd{M-x
+jabber-get-register} and entering the JID of the service. On success,
+you get a single-stage form to fill in.
+
+There are two buttons at the bottom of the form, ``Submit'' and ``Cancel
+registration''. ``Submit'' does what you would expect it to, but
+``Cancel registration'' cancels any existing registration with the
+service. Whichever of them you choose, you get a message in the echo
+area informing whether the operation succeeded.
+
+@node Search, Ad-Hoc Commands, Registration, Commands
+@subsection Search
+
+@cindex Search
+@findex jabber-get-search
+
+You can get a search form for a service by typing @kbd{M-x
+jabber-get-search}. This gives you a single-stage form to fill in.
+After you press the ``Submit'' button at the bottom, the search results
+will be displayed in the same buffer.
+
+@node Ad-Hoc Commands, Service discovery, Search, Commands
+@subsection Ad-Hoc Commands
+
+@cindex Ad-Hoc Commands
+@findex jabber-ahc-get-list
+@findex jabber-ahc-execute-command
+
+jabber.el supports a subset of XEP-0050, the standard for Ad-Hoc
+Commands. As the name implies, this can be used for just about
+anything. In particular, it is used not only by services, but also by
+clients (e.g. Psi, and jabber.el itself).
+
+To find which commands are available, run ``Request command list''
+(@code{jabber-ahc-get-list}).@footnote{This is the same thing as a
+disco items request to the node
+@code{http://jabber.org/protocol/commands}.}
+
+To run a command from the list, put point over it and run ``Execute
+command'' (@code{jabber-ahc-execute-command}), accepting the defaults
+for JID and node. (If you already know those, you could of course
+enter them yourself.)
+
+What happens next depends on the command and the service. In some
+cases, the service just responds that the command has been run. You may
+also get a form to fill out. This form may have multiple stages, in
+which case there are ``Next'' and ``Previous'' buttons for navigating
+between stages. You may also see ``Complete'', which runs the command
+skipping any remaining stages of the form, and ``Cancel'', which cancels
+the command.
+
+Currently, jabber.el uses ad-hoc commands for setting presence remotely.
+If you realize that you forgot to set your client to ``away'' with a low
+priority, you can do it remotely from any JID from
+@code{jabber-account-list}. So, you can add disabled JIDs in
+@code{jabber-account-list} to allow them control your
+presence.@footnote{Most Jabber servers also support kicking a client off
+the net by logging in with another client with exactly the same
+resource.}
+
+@node Service discovery, Browsing, Ad-Hoc Commands, Commands
+@subsection Service discovery
+
+@cindex Service discovery
+@findex jabber-get-disco-items
+@findex jabber-get-disco-info
+
+Service discovery is used to find information about servers, services
+and clients. There are two kinds of requests: find @dfn{info} about a
+Jabber entity---i.e. its identity and supported features---and find
+@dfn{items} related to an entity, where the definition of ``related'' is
+left to the entity itself.
+
+The commands to execute such requests are @code{jabber-get-disco-info}
+and @code{jabber-get-disco-items}, respectively. These commands can be
+accessed from the Info menu, which is opened by typing @kbd{C-c C-i}.
+The commands accept a JID and optionally a ``node''.
+
+The result of such a command is displayed in a browse buffer. For an
+info request, the result just lists the identities and features of the
+entity. For an item request, the related items are listed. The items
+may be JIDs, or JIDs with a node. If you put point on one of the items,
+its JID and node will be the default value for any Jabber command.
+
+If you think that the interface to service discovery is awkward and
+should be replaced with something better, you are completely right.
+
+@node Browsing, , Service discovery, Commands
+@subsection Browsing
+
+@cindex Browsing
+@findex jabber-get-browse
+
+Before service discovery, browsing was the way to find information about
+Jabber entities. Nowadays it is all but superseded, but jabber.el still
+supports it. You can use it by typing @kbd{M-x jabber-get-browse}. It
+works much like service discovery.
+
+@node Your home server, Transports, Commands, Services
+@section Your home server
+
+@cindex Password change
+@cindex Changing password
+@cindex Account removal
+@cindex Removing an account
+
+You can interact with your Jabber server to change your password or
+remove your account. Both of these can be accomplished by typing
+@kbd{M-x jabber-get-register} and typing the JID of your server;
+@pxref{Registration}.
+
+
+@node Transports, User directories, Your home server, Services
+@section Transports to other IM networks
+
+@cindex Gateways
+@cindex Transports
+@cindex MSN transport
+@cindex ICQ transport
+@cindex AIM transport
+
+Some Jabber services make it possible to communicate with users on other
+instant messaging networks (e.g. MSN, ICQ, AIM), in effect turning your
+Jabber client into a multi-protocol client. These are called
+@dfn{gateways} or @dfn{transports}. They work by impersonating you on
+the legacy network; therefore you need to provide your username and
+password through registration.
+
+@subsection Finding a transport
+
+To use such a transport, you first need to find one, obviously.
+Sometimes your home server provides the transports you need, but you are
+not limited to those; in principle you can use any transport on the
+Jabber network. Some transports only accept local users, though.
+
+Transports are generally mentioned on the web page of the Jabber server
+in question. You can also find transports from within the client;
+@pxref{Service discovery}.
+
+@subsection Registering with a transport
+
+To register with a transport, type @kbd{M-x jabber-get-register} and
+enter the JID of the transport. This will open a registration form
+where you get to fill in your login information; @pxref{Registration}.
+You can later use this same form to change the information or cancel
+your registration.
+
+After you have registered, the transport will request presence
+subscription. It needs that to know when you are online, and
+synchronize your presence on the legacy network.
+
+@subsection Contact list
+
+Once you are registered, the transport will transfer the contact list
+from the legacy service. From the Jabber side, it appears as if lots of
+people suddenly request presence subscription to you. This is somewhat
+inconvenient, but it is currently the only way that the transport can
+influence your Jabber contact list, as it is an entity external to your
+server.@footnote{Of course, jabber.el could do more to alleviate this
+inconvenience.}
+
+When you have accepted these presence subscriptions, the contacts from
+legacy networks appear as if they were Jabber contacts.
+
+@subsection Finding users
+
+Some legacy networks have a global database of users, and some
+transports support searching that database. In that case, you can
+search for other users with @kbd{M-x jabber-get-search};
+@pxref{Search}.
+
+@node User directories, MUC services, Transports, Services
+@section User directories
+
+There are some Jabber user directories, usually abbreviated JUDs. The
+most well-known one is @samp{users.jabber.org}. You can register with
+such a directory to let other people find you (@pxref{Registration}),
+and you can search the directory (@pxref{Search}).
+
+@node MUC services, , User directories, Services
+@section MUC services
+
+MUC services (Multi-User Chat, chat rooms) are usually not operated by
+these commands, but by commands specific to the MUC protocol;
+@pxref{Groupchat}. However, some MUC services offer nickname
+registration through the registration protocol (@pxref{Registration}),
+and other commands; @pxref{Ad-Hoc Commands}.
+
+@node Personal information, Avatars, Services, Top
+@chapter Personal information
+
+@cindex vCard
+@cindex Personal information
+@findex jabber-vcard-get
+@findex jabber-vcard-edit
+
+The Jabber way of handling personal information (name, addresses, phone
+numbers, etc) is ``vCards'' encoded in XML.@footnote{@xref{XEP-0054}.}
+You can get information about a user by running @kbd{M-x
+jabber-vcard-get}, @kbd{M-x jabber-muc-vcard-get} if you in MUC (also
+available in the MUC menu), and you can edit your own information by
+running @kbd{M-x jabber-vcard-edit}.
+
+The form for editing your information can be slightly confusing---you
+are allowed to enter any number of addresses, phone numbers and e-mail
+addresses, each of which has a set of orthogonal properties. You can
+add and remove items with the @samp{[INS]} and @samp{[DEL]} buttons,
+respectively.
+
+This is also where you set your avatar (@pxref{Avatars}). The size of
+your avatar file is limited to 8 kilobytes.
+
+@node Avatars, Time queries, Personal information, Top
+@chapter Avatars
+
+@cindex avatars
+@vindex jabber-vcard-avatars-retrieve
+@vindex jabber-vcard-avatars-publish
+@vindex jabber-avatar-cache-directory
+@vindex jabber-chat-buffer-show-avatar
+
+jabber.el supports viewing and publishing avatars according to XEP-0153,
+vCard-Based Avatars. By default, if you have an avatar in your vCard
+(@pxref{Personal information}), it will be published for others to see,
+and if other people publish their avatars, they will be displayed in the
+roster buffer and in the header line of chat buffers, if your Emacs can
+display images. Otherwise, jabber.el will not fetch avatars at all.
+
+To disable retrieval of other people's avatars, set
+@code{jabber-vcard-avatars-retrieve} to nil. To disable publishing of
+your own avatar, set @code{jabber-vcard-avatars-publish} to nil. To
+disable avatars in chat buffer header lines, set
+@code{jabber-chat-buffer-show-avatar} to nil.
+
+There are a number of restrictions on avatar images in the
+specification. Most of them are not enforced by jabber.el.
+@itemize @bullet
+@item
+The image should be smaller than 8 kilobytes; this is enforced by
+jabber.el.
+@item
+The image height and width should be between 32 and 96 pixels; the
+recommended size is 64 by 64 pixels.
+@item
+The image should be square.
+@item
+The image should be in either PNG, GIF, or JPEG format. (jabber.el will
+behave incorrectly if the image is not in a format supported by Emacs.)
+@end itemize
+
+Avatars are cached in the directory specified by
+@code{jabber-avatar-cache-directory}, by default
+@file{~/.emacs.d/jabber-avatar-cache/}.@footnote{The default directory
+used to be @file{~/.jabber-avatars}. If this directory already
+exists, it will be used.} The cache is never cleaned, so you might
+want to do that yourself from time to time.
+
+@node Time queries, Useful features, Avatars, Top
+@chapter Time queries
+
+@cindex time query
+@findex jabber-get-time
+With @kbd{M-x jabber-get-time}, you can ask what time an entity (client,
+server or component) thinks it is, and what time zone it thinks it is
+in.
+
+@cindex last online
+@findex jabber-get-last-online
+You can query a server about when a certain user was last seen online.
+Use @kbd{M-x jabber-get-last-online} for that.
+
+@cindex uptime, query
+@cindex idle time, query
+@findex jabber-get-idle-time
+You can also ask a client about how long a user has been idle with
+@kbd{M-x jabber-get-idle-time}. Not all clients answer such queries,
+e.g. jabber.el doesn't. This command can also tell the uptime of a
+server or component.
+
+The first of these commands uses the old Entity Time protocol
+(@pxref{XEP-0090}). It has been superseded by XEP-0202, but jabber.el
+doesn't implement the newer protocol yet. The latter two commands use
+the Last Activity protocol (@pxref{XEP-0012}).
+
+@node Useful features, Message history, Time queries, Top
+@chapter Useful features
+
+jabber.el includes a number of features meant to improve the user
+interface and do other useful things.
+
+@menu
+* Autoaway::
+* Modeline status::
+* Keepalive::
+* Reconnecting::
+* Tracking activity::
+* Watch buddies::
+* Spell checking::
+* Gmail notifications::
+* Saving groups roll state::
+@end menu
+
+@node Autoaway, Modeline status, , Useful features
+@section Autoaway
+
+@cindex autoaway
+@cindex idle
+@cindex xprintidle
+@vindex jabber-autoaway-method
+@vindex jabber-autoaway-methods
+@findex jabber-current-idle-time
+@findex jabber-xprintidle-program
+@findex jabber-termatime-get-idle-time
+@vindex jabber-autoaway-timeout
+@vindex jabber-autoaway-xa-timeout
+@vindex jabber-autoaway-status
+@vindex jabber-autoaway-xa-status
+@vindex jabber-autoaway-priority
+@vindex jabber-autoaway-xa-priority
+
+It is possible to automatically set your status to ``away'' or ``xa''
+when you haven't used your computer for a while. This lets your
+contacts know that you might not answer immediately. You can customize
+timeouts (@code{jabber-autoaway-timeout},
+@code{jabber-autoaway-xa-timeout}), statuses
+(@code{jabber-autoaway-status}, @code{jabber-autoaway-xa-status}) and
+priorityes (@code{jabber-autoaway-priority},
+@code{jabber-autoaway-xa-priority}) to set.
+
+To activate this feature, add @code{jabber-autoaway-start} to
+@code{jabber-post-connect-hooks}, e.g:
+@example
+(add-hook 'jabber-post-connect-hooks 'jabber-autoaway-start)
+@end example
+
+There are different methods to find how long you have been ``idle''.
+The method(s) to use is specified by @code{jabber-autoaway-methods}
+(obsoleted @code{jabber-autoaway--method} will also work). The value
+of this variable should be a list functions that returns the number of
+seconds you have been idle (or nil on error). Minimum of values,
+returned by these functions, is used as ``idle'' time, so default
+should works well. Three functions are provided (all used by default).
+
+@itemize @bullet
+@item
+@code{jabber-current-idle-time} is used if your Emacs has the
+@code{current-idle-time} function (which was introduced in Emacs 22).
+Note that this method only measures the time since you last interacted
+with Emacs, and thus disregards activity in other programs.
+
+@item
+@code{jabber-xprintidle-get-idle-time} uses xprintidle
+@footnote{@uref{http://www.dtek.chalmers.se/~henoch/text/xprintidle.html}}
+program, if found. You can also manually set
+@code{jabber-xprintidle-program} to the correct file path. This method
+uses the same method as
+@uref{http://www.jwz.org/xscreensaver,XScreensaver} to find your idle
+time.
+
+@item
+@code{jabber-termatime-get-idle-time} used on GNU/Linux terminals. It
+uses the access time of the terminal device as a measure of idle time.
+
+@end itemize
+
+@node Modeline status, Keepalive, Autoaway, Useful features
+@section Modeline status
+
+@cindex Modeline
+@findex jabber-mode-line-mode
+@vindex jabber-mode-line-mode
+@vindex jabber-mode-line-compact
+
+By typing @kbd{M-x jabber-mode-line-mode} you toggle display of some
+status in mode lines. The information is your own presence status,
+and some numbers showing the status of your roster contacts. By
+default, there are three numbers, for ``online'' (chatty and online),
+``away'' (away, extended away and do not disturb) and offline
+contacts.
+
+If you set @code{jabber-mode-line-compact} to nil, you get a complete
+breakdown of presence status. That gives you six numbers indicating
+the number of chatty, online, away, extended away, dnd, and offline
+contacts, respectively.
+
+@node Keepalive, Reconnecting, Modeline status, Useful features
+@section Keepalive
+
+@cindex Keepalive
+@cindex Detecting lost connections
+
+Sometimes network connections are lost without you noticing. This is
+especially true with Jabber, as it is quite reasonable to keep the
+connection open for a long time without either sending or receiving
+any data.
+
+On the other hand, the server may want to do the same kind of
+detection, and may expect the client to send something at regular
+intervals.
+
+If you want to detect a lost connection earlier, or make sure that the
+server doesn't drop your connection, you can use the
+keepalive functions. These come in two flavours: whitespace pings and
+XMPP pings.
+
+@subsection Whitespace pings
+@cindex Whitespace pings
+
+A @dfn{whitespace ping} is a single space character sent to the server.
+This is often enough to make NAT devices consider the connection
+``alive'', and likewise for certain Jabber servers, e.g. Openfire. It
+may also make the OS detect a lost connection faster---a TCP connection
+on which no data is sent or received is indistinguishable from a lost
+connection.
+
+@findex jabber-whitespace-ping-start
+@findex jabber-whitespace-ping-stop
+Type @kbd{M-x jabber-whitespace-ping-start} to start it, and @kbd{M-x
+jabber-whitespace-ping-stop} to stop it. The former is in
+@code{jabber-post-connect-hooks} by default; @pxref{Hooks}.
+
+@vindex jabber-whitespace-ping-interval
+The frequency of whitespace pings is controlled by the variable
+@code{jabber-whitespace-ping-interval}. The default value is once every
+30 seconds.
+
+@subsection XMPP pings
+
+These functions work by sending a ping request to your server once in a
+while (by default every ten minutes), and considering the connection
+lost if the server doesn't answer within reasonable time (by default
+20 seconds).
+
+@findex jabber-keepalive-start
+@findex jabber-keepalive-stop
+Type @kbd{M-x jabber-keepalive-start} to start
+it, and @kbd{M-x jabber-keepalive-stop} to stop it. You may want to add
+@code{jabber-keepalive-start} to @code{jabber-post-connect-hooks};
+@pxref{Hooks}.
+
+@vindex jabber-keepalive-interval
+@vindex jabber-keepalive-timeout
+You can customize the interval and the timeout with the variables
+@code{jabber-keepalive-interval} and @code{jabber-keepalive-timeout},
+respectively.
+
+@findex jabber-ping
+You can also manually ping some client/server by using @kbd{M-x
+jabber-ping}. Note that pong will be displayed according
+@code{jabber-alerts-info-messages-hooks} (default is echo in
+minibuffer).
+
+@node Reconnecting, Tracking activity, Keepalive, Useful features
+@section Reconnecting
+
+@cindex Reconnect
+@cindex Automatic reconnection
+@vindex jabber-auto-reconnect
+
+jabber.el supports automatic reconnection to Jabber server(s) upon lost
+connection. By default it is off. To turn on, customize
+the @code{jabber-auto-reconnect} variable.
+
+This is of limited use if you have to type your password every time
+jabber.el reconnects. There are two ways to save your password: you can
+set it in @code{jabber-account-alist} (@pxref{Account settings}), and
+you can use @file{password-cache.el}, which is available in
+recent versions of Gnus and in Emacs 23. Note that you probably want to
+customize @code{password-cache-expiry} if you use the latter.
+
+@node Tracking activity, Watch buddies, Reconnecting, Useful features
+@section Tracking activity
+
+@cindex Activity
+@findex jabber-activity-mode
+@vindex jabber-activity-make-strings
+@vindex jabber-activity-query-unread
+@vindex jabber-activity-count-in-title
+@vindex jabber-activity-count-in-title-format
+
+When you're working on something important you might want to delay
+responding to incoming messages. However, when you're done working,
+will you remember them? If you're anything like me, you'll have a lot
+of buffers in your Emacs session, and a Jabber chat buffer can easily
+get lost.
+
+When @code{jabber-activity-mode} is enabled (by default, it is), Emacs keeps
+track of the buddies which have messaged you since last you visited
+their buffer, and will display them in mode line. As soon as you
+visit their buffer they disappear from the mode line, indicating that
+you've read their message.
+
+If your mode line fills over because of these notifications, you can
+customize @code{jabber-activity-make-strings} to shorten them to the
+shortest possibly unambiguous form.
+
+If you try to exit Emacs while you still have unread messages, you
+will be notified and asked about this. If you don't like that, set
+@code{jabber-activity-query-unread} to nil.
+
+If you want to display the number of unread buffers in the frame title,
+set @code{jabber-activity-count-in-title} to t. The format of the
+number can be changed through
+@code{jabber-activity-count-in-title-format}.
+
+To hide activity notifications for some contacts, use
+@code{jabber-activity-banned} variable - just add boring JIDs (as
+regexps) here.
+
+For complete customizability, write a hook function for
+@code{jabber-activity-update-hook}. From that function, you can take
+action based on @code{jabber-activity-jids},
+@code{jabber-activity-mode-string}, and
+@code{jabber-activity-count-string}.
+
+@node Watch buddies, Spell checking, Tracking activity, Useful features
+@section Watch buddies
+
+@cindex Watch
+@cindex Online notifications
+@findex jabber-watch-add
+@findex jabber-watch-remove
+
+Sometimes you might be waiting for a certain person to come online,
+and you don't want that occasion to get lost in the noise. To get an
+obtrusive message when that happens, type @kbd{M-x jabber-watch-add}
+and select the person in question. You can enter a comment, to
+remember why you added the watch.
+
+You will get a message whenever that person goes from offline to
+online. jabber.el will remember this for the rest of your Emacs
+session (it's not saved to disk, though), but if you want to get rid
+of it, type @kbd{M-x jabber-watch-remove}.
+
+@node Spell checking, Gmail notifications, Watch buddies, Useful features
+@section Spell checking
+
+@cindex flyspell
+@cindex Spell checking
+
+You can activate spell checking in a chat buffer with @kbd{M-x
+flyspell-mode}. It will check only what you are currently writing, not
+what you receive or what you have already sent. You may want to add
+@code{flyspell-mode} to @code{jabber-chat-mode-hook}.
+
+For more information about Emacs spell checking, @pxref{Spelling, ,
+Checking and Correcting Spelling, emacs, GNU Emacs Manual}.
+
+@node Gmail notifications, Saving groups roll state, Spell checking, Useful features
+@section Gmail notifications
+
+@cindex Gmail notifications
+
+If you are connected to a Google Talk account, you can receive
+notifications when a new Gmail message arrives. Gmail notifications
+are enabled by adding the following line to your @file{.emacs}:
+
+@example
+(add-hook 'jabber-post-connect-hooks 'jabber-gmail-subscribe)
+@end example
+
+Default behavior is to display a message that mentions the number of
+received gmails. You can customize this behavior by providing your
+own @code{jabber-gmail-dothreads} function.
+
+Example:
+
+@example
+(eval-after-load "jabber-gmail"
+ '(defun jabber-gmail-dothreads (threads)
+ "Process <mail-thread-info/> elements.
+THREADS is a list of XML sexps corresponding to <mail-thread-info/>
+elements.
+See http://code.google.com/apis/talk/jep_extensions/gmail.html#response"
+ (osd "gmail: %d" (length threads))))
+
+;;; It's usually a good idea to have a shortcut for querying GTalk server.
+(global-set-key (kbd "<f9> g") 'jabber-gmail-query)
+
+;;; The definition of `osd' function used by `jabber-gmail-dothreads'.
+;;; `osd_cat' is shipped with the X OSD library
+;;; [http://www.ignavus.net/software.html].
+(if (and (display-graphic-p) (file-executable-p "/usr/bin/osd_cat"))
+ (defun osd (fmt &rest args)
+ "Display message on X screen."
+ (let ((opts "-p bottom -A center -l 1 \
+-f '-adobe-helvetica-bold-r-*-*-24-*-*-*-*-*-iso10646-1'")
+ (msg (apply 'format (concat fmt "\n") args)))
+ (start-process "osd" nil shell-file-name shell-command-switch
+ (format "echo %s | osd_cat %s"
+ (shell-quote-argument msg) opts))))
+ (defalias 'osd 'message))
+@end example
+
+@node Saving groups roll state, , Gmail notifications, Useful features
+@section Saving groups roll state
+
+@cindex Saving groups roll state
+
+You can save roster's groups rollup/rolldown state between sessions.
+To do this you need to add @code{jabber-roster-save-groups} to
+@code{jabber-pre-disconnect-hook} and
+@code{jabber-roster-restore-groups} to
+@code{jabber-post-connect-hooks}, respectively.
+
+State saved in private storage on server-side (for each account). Note
+that state restoring working by rolling up groups, rolled up at state
+saving (by default, all groups rolled down). Also note that at now,
+@code{jabber-pre-disconnect-hook} run only with
+@code{jabber-disconnect} (not with @code{jabber-disconnect-one}).
+
+
+@node Message history, Typing notifications, Useful features, Top
+@chapter Message history
+
+@cindex History
+@cindex Backlog
+@findex jabber-truncate-top
+@findex jabber-truncate-muc
+@findex jabber-truncate-chat
+@vindex jabber-history-enabled
+@vindex jabber-history-muc-enabled
+@vindex jabber-global-history-filename
+@vindex jabber-use-global-history
+@vindex jabber-history-dir
+@vindex jabber-history-enable-rotation
+@vindex jabber-history-size-limit
+@vindex jabber-backlog-number
+@vindex jabber-backlog-days
+@vindex jabber-log-lines-to-keep
+
+If you want a record of messages sent and received, set
+@code{jabber-history-enabled} to t. If you also want record MUC
+groupchat messages, set @code{jabber-history-muc-enabled} to t.
+Messages will be saved in one file per contact in the directory
+specified by the variable @code{jabber-history-dir} (the default is
+@file{~/.emacs.d/jabber-history}). If you prefer to store messages
+for all contacts in a single file, set
+@code{jabber-use-global-history} to @code{t} and set
+@code{jabber-global-history-filename} as required.@footnote{Using a
+global history file used to be the default. If the file specified by
+@code{jabber-global-history-filename} exists,
+@code{jabber-use-global-history} will default to @code{t} to support
+existing installations.}
+
+When you open a new chat buffer and have entries in your history file,
+the last few messages you recently exchanged with the contact in
+question will be inserted. You can control how many messages with
+@code{jabber-backlog-number} (by default 10), and how old messages
+with @code{jabber-backlog-days} (by default 3 days).
+
+@findex jabber-chat-display-more-backlog
+If you want to see more messages, use the function
+@code{jabber-chat-display-more-backlog}, available in the Chat menu.
+This is currently the only way to view the message history, apart from
+opening the history files manually.
+
+@cindex Rotation of history files
+@cindex History file rotation
+If you worry about your history file(s) size, you can enable history
+rotation feature by setting the variable
+@code{jabber-history-enable-rotation} to @code{t} (default is
+@code{nil}). This feature ``rotates'' your history files according to
+the following rule: When @code{jabber-history-size-limit} (in
+kilobytes) is reached, the @var{history-file} is renamed to
+@file{@var{history-file}-@var{number}}, where @var{number} is 1 or the smallest number
+after the last rotation.
+
+For example, suppose you set the
+@code{jabber-history-size-limit} variable to 512 and you chat with
+your buddy @samp{foo@@jabber.server} using the per-contact strategy to store
+history files. So, when the history file (@file{foo@@jabber-server})
+reaches 512K bytes, it will be renamed to @file{foo@@jabber-server-1}
+and @file{foo@@jabber-server} will be set empty. Next time
+@file{foo@@jabber-server} grows to 512K bytes, it will be saved as
+@file{foo@@jabber-server-2} and so on. Although the example was
+presented with the per-contact history file strategy, history rotation
+works for both per-contact and global history logging strategies.
+
+@cindex Truncate
+@cindex Truncation
+If you also want to keep chat and groupchat buffers from growing too
+much, you can customize @code{jabber-alert-message-hooks} and
+@code{jabber-alert-muc-hooks} by adding truncation upon receiving
+message (@code{jabber-truncate-chat} and @code{jabber-truncate-muc}, respectively).
+The truncation limit may be set by customizing the variable
+@code{jabber-log-lines-to-keep}.
+
+@node Typing notifications, Roster import and export, Message history, Top
+@chapter Typing notifications
+
+There are two protocols for ``contact is typing'' notifications in
+Jabber. jabber.el supports both of them, displaying various information
+in the header line of chat buffers.
+
+@section Message events
+
+@cindex Composing
+@cindex Delivered
+@cindex Displayed
+@vindex jabber-events-request-these
+@vindex jabber-events-confirm-delivered
+@vindex jabber-events-confirm-displayed
+@vindex jabber-events-confirm-composing
+
+The older protocol is called Message Events (@pxref{XEP-0022}). Besides
+typing notification, it lets you know what happens to the messages you send.
+These states are possible:
+
+@itemize @bullet
+@item
+@samp{In offline storage} (the user will receive it on next logon)
+
+@item
+@samp{Delivered} to user's client (but not necessarily displayed)
+
+@item
+@samp{Displayed} to user
+
+@item
+User is @samp{typing a message}
+
+@end itemize
+
+The first state is only reported by servers; the other three are
+reported by clients. jabber.el can report all three of them, and can
+display all four; not all clients support all states, though.
+
+If you don't want jabber.el to send out this information about you, set
+the variables @code{jabber-events-confirm-delivered},
+@code{jabber-events-confirm-displayed}, and/or
+@code{jabber-events-confirm-composing} to nil. You can make jabber.el
+not to request such information by customizing
+@code{jabber-events-request-these}.
+
+@section Chat states
+
+@vindex jabber-chatstates-confirm
+
+The newer protocol is called Chat States (@pxref{XEP-0085}). Rather
+than dealing with individual messages, it describes the state of the
+chat session between two people. The following states are possible:
+
+@itemize @bullet
+@item
+Active (the default state, not displayed)
+
+@item
+Inactive
+
+@item
+Composing
+
+@item
+Paused (i.e., taking a short pause in composing)
+
+@item
+Gone
+
+@end itemize
+
+jabber.el can display all five states, but only ever sends ``active''
+and ``composing'' itself.
+
+To customize sending of chat states, customize the variable
+@code{jabber-chatstates-confirm}.
+
+
+@node Roster import and export, XMPP URIs, Typing notifications, Top
+@chapter Roster import and export
+
+@findex jabber-export-roster
+@findex jabber-import-roster
+@cindex Export roster
+@cindex Import roster
+
+Your roster is saved on the Jabber server, and usually not in the
+client. However, you might want to save the roster to a file anyway.
+The most common reason for this is probably to copy it to another
+account.
+
+To export your roster to a file, type @kbd{M-x jabber-export-roster}.
+A buffer will appear in which you can edit the data to be exported.
+Changes done in that buffer will not affect your real roster.
+
+To import your roster from a file, type @kbd{M-x jabber-import-roster}.
+You will be able to edit the data before importing it. Items not in the
+roster will be added; items in the roster will be modified to match
+imported data. Subscriptions will be updated.
+
+The format of the roster files is the XML used by roster pushes in the
+XMPP protocol, in UTF-8 encoding.
+
+@node XMPP URIs, Customization, Roster import and export, Top
+@chapter XMPP URIs
+
+@cindex URIs
+@cindex URLs
+@cindex links
+@cindex xmpp: links
+@cindex Mozilla integration
+@cindex web browser integration
+@cindex browser integration
+@findex jabber-handle-uri
+
+Many web page authors use links starting with @samp{xmpp:} for JIDs.
+Your web browser could be made to pass such links to jabber.el, so that
+such links are actually useful and not just decoration. How to do that
+depends on your operating system and web browser.
+
+For any of these methods, you need to make sure that you are running
+the Emacs server. @xref{Emacs Server, , Using Emacs as a Server,
+emacs, GNU Emacs Manual}, though the simplest way to start it is to
+customize the variable @code{server-mode}.
+
+@section GNOME
+
+The jabber.el distribution contains a GConf schema which tries to set
+up handling of @samp{xmpp:} URIs. It is installed by @samp{make
+install}. This may or may not work, depending on your GConf
+configuration and other installed applications. To check, try
+running:
+
+@example
+gconftool --get /desktop/gnome/url-handlers/xmpp/command
+@end example
+
+This should print something like:
+
+@example
+/usr/local/libexec/emacs-jabber-uri-handler "%s"
+@end example
+
+This setting is picked up by most GNOME or GTK based web browsers,
+including Firefox.
+
+@section Mozilla and Unix
+
+If you use a Mozilla-based web browser on a Unix-like operating
+system, and the GConf method above doesn't work, you can set it up
+manually by following these steps:
+
+@enumerate
+
+@item
+Note the path of the @file{emacs-jabber-uri-handler} file in the jabber.el
+distribution, and make sure it is executable.
+
+@item
+Set the Mozilla preference @samp{network.protocol-handler.app.xmpp} to
+the path of @file{emacs-jabber-uri-handler}. There are two ways to do this:
+
+@itemize
+@item
+Go to the URL @samp{about:config}, right-click in the list, choose ``New
+string'', and enter @samp{network.protocol-handler.app.xmpp} and the
+path in the following dialogs.
+
+@item
+Open or create the file @file{user.js} in your Mozilla profile directory
+(in the same directory as @file{prefs.js}), and add the following line:
+
+@example
+user_pref("network.protocol-handler.app.xmpp",
+ "@var{/path/to}/emacs-jabber-uri-handler");
+@end example
+
+Restart Mozilla for this change to take effect.
+@end itemize
+@end enumerate
+
+@section Other systems
+
+If you know how to pass an XMPP URI from your browser to the function
+@code{jabber-handle-uri}, your contribution for this section would be
+appreciated.
+
+@node Customization, Hacking and extending, XMPP URIs, Top
+@chapter Customization
+
+@findex jabber-customize
+@cindex Customization
+
+jabber.el is intended to be customizable for many tastes. After all,
+this is Emacs. To open a customization buffer for jabber.el, type
+@kbd{M-x jabber-customize}.
+
+@menu
+* Account settings::
+* Menu::
+* Customizing the roster buffer::
+* Customizing the chat buffer::
+* Customizing alerts::
+* Hooks::
+* Debug options::
+@end menu
+
+@node Account settings, Menu, , Customization
+@section Account settings
+
+@cindex Username
+@cindex Resource
+@cindex Password
+@cindex JID
+@cindex Network server
+
+@vindex jabber-account-list
+All account settings reside in the variable @code{jabber-account-list}.
+Usually you only need to set the JID, in the form
+@samp{username@@server} (or @samp{username@@server/resource} to use a
+specific resource name). These are the other account options:
+
+@table @asis
+@item Disabled
+If the account is disabled, @code{jabber-connect-all} will not attempt
+to connect it. You can still connect it manually with
+@code{jabber-connect}.
+
+@item Password
+You can set the password of the account, so you don't have to enter it
+when you connect. Note that it will be stored unencrypted in your
+customization file.
+
+@item Network server
+If the JID of the Jabber server is not also its DNS name, you may have
+to enter the real DNS name or IP address of the server here.
+
+@item Connection type
+This option specifies whether to use an encrypted connection to the
+server. Usually you want ``STARTTLS'' (@code{starttls}), which means
+that encryption is activated if the server supports it. The other
+possibilities are ``unencrypted'' (@code{network}), which means just
+that, and ``legacy SSL/TLS'' (@code{ssl}), which means that encryption
+is activated on connection.
+
+@item Port
+If the Jabber server uses a nonstandard port, specify it here. The
+default is 5222 for STARTTLS and unencrypted connections, and 5223 for
+legacy SSL connections.
+@end table
+
+@subsection For Google Talk
+
+@cindex Google Talk
+
+If you have a very new version of @file{dns.el},@footnote{Specifically,
+you need Emacs 23, or No Gnus 0.3.} you can connect to
+Google Talk just by specifying your Gmail address as JID. Otherwise,
+you also need to set
+``network server'' to @kbd{talk.google.com} and ``connection type'' to
+``legacy SSL''.
+
+See also @ref{Gmail notifications}.
+
+@subsection Upgrade note
+
+Previous versions of jabber.el had the variables @code{jabber-username},
+@code{jabber-server}, @code{jabber-resource} and
+@code{jabber-password}. These are now obsolete and not used.
+
+@node Menu, Customizing the roster buffer, Account settings, Customization
+@section Menu
+
+@vindex jabber-display-menu
+@cindex Menus
+There is a Jabber menu on the menu bar with some common commands. By
+default, it is displayed only if you are connected, or if you have
+configured any accounts. You can set the variable
+@code{jabber-display-menu} to @code{t} or @code{nil}, to have the menu
+displayed always or never, respectively. The default behaviour
+corresponds to the setting @code{maybe}.
+
+@findex jabber-menu
+Earlier, the way to have the menu appear was to call the function
+@code{jabber-menu}. It still works, but is considered obsolete.
+
+@node Customizing the roster buffer, Customizing the chat buffer, Menu, Customization
+@section Customizing the roster buffer
+
+@cindex Roster buffer, customizing
+
+@cindex Sorting the roster
+@vindex jabber-roster-sort-functions
+@code{jabber-roster-sort-functions} controls how roster items are
+sorted. By default, contacts are sorted first by presence, and then
+alphabetically by displayed name.
+
+@vindex jabber-sort-order
+@code{jabber-sort-order} controls how roster items are sorted by
+presence. It is a list containing strings corresponding to show
+status (@pxref{Presence}) or @code{nil}, which represents offline.
+
+@vindex jabber-show-resources
+@code{jabber-show-resources} controls when your contacts' resources
+are shown in the roster buffer. The default is to show resources when
+a contact has more than one connected resource.
+
+@vindex jabber-roster-line-format
+@code{jabber-roster-line-format} specifies how the entry for each
+contact looks. It is a string where some characters are special if
+preceded by a percent sign:
+
+@table @code
+@item %a
+Avatar of contact, if any
+@item %c
+@samp{*} if the contact is connected, or @samp{ } if not
+@item %u
+Subscription state---see below
+@item %n
+Nickname of contact, or JID if no nickname
+@item %j
+Bare JID of contact (without resource)
+@item %r
+Highest-priority resource of contact
+@item %s
+Availability of contact as a string ("Online", "Away" etc)
+@item %S
+Status string specified by contact
+@end table
+
+@code{jabber-roster-show-title} controls whether to show a "Jabber
+roster" string at the top of the roster buffer. You need to run
+@kbd{M-x jabber-display-roster} after changing this variable to update
+the display.
+
+@code{%u} is replaced by one of the strings given by
+`jabber-roster-subscription-display'.
+
+@vindex jabber-resource-line-format
+@code{jabber-resource-line-format} is nearly identical, except that
+the values correspond to the values of the resource in question, and
+that the @code{%p} escape is available, which inserts the priority of
+the resource.
+
+@vindex jabber-roster-buffer
+@code{jabber-roster-buffer} specifies the name of the roster buffer.
+If you change this, the new name will be used the next time the roster
+is redisplayed.
+
+@vindex jabber-roster-show-bindings
+@code{jabber-roster-show-bindings} controls whether to show a list of
+keybindings at the top of the roster buffer. You need to run @kbd{M-x
+jabber-display-roster} after changing this variable to update the display.
+
+@node Customizing the chat buffer, Customizing alerts, Customizing the roster buffer, Customization
+@section Customizing the chat buffer
+
+@cindex Chat buffer
+@cindex Timestamps
+@cindex Faces, chat buffer
+
+You can customize the look of the prompts in the chat buffer. There
+are separate settings for local text (i.e. what you write) and foreign text
+(i.e. what other people write).
+
+@vindex jabber-chat-text-local
+@vindex jabber-chat-text-foreign
+@code{jabber-chat-text-local} and @code{jabber-chat-text-foreign}
+determine the faces used for chat messages.
+
+@vindex jabber-chat-prompt-local
+@vindex jabber-chat-prompt-foreign
+@vindex jabber-muc-colorize-local
+@vindex jabber-muc-colorize-foreign
+@vindex jabber-muc-nick-saturation
+@vindex jabber-muc-nick-value
+@vindex jabber-muc-participant-colors
+@cindex Nick coloring
+@code{jabber-chat-prompt-local} and @code{jabber-chat-prompt-foreign}
+determine the faces used for the prompts. You can also turn on
+automatic colorization of local (@code{jabber-muc-colorize-local})
+and/or foreign (@code{jabber-muc-colorize-foreign}) prompts. By
+default it is off. You can correct and save for future use auto-generated colors by
+customizing @code{jabber-muc-participant-colors}, @code{jabber-muc-nick-saturation} and
+@code{jabber-muc-nick-value}, if you wish.
+
+@vindex jabber-chat-local-prompt-format
+@vindex jabber-chat-foreign-prompt-format
+@code{jabber-chat-local-prompt-format} and
+@code{jabber-chat-foreign-prompt-format} determine what text is
+displayed in the prompts. They are format strings, with the following
+special sequences defined:
+
+@table @code
+@item %t
+The time when the message was sent or received
+@item %n
+The nickname of the user. For the foreign prompt, this is the name of
+the contact in the roster, or the JID if no name set. For the local
+prompt, this is the username part of your JID.
+@item %u
+The username of the user (i.e. the first part of the JID).
+@item %r
+The resource.
+@item %j
+The bare JID of the user
+@end table
+
+@cindex Timestamp format
+@vindex jabber-chat-time-format
+@code{jabber-chat-time-format} defines how @code{%t} shows time. Its
+format is identical to that passed to @code{format-time-string}.
+@xref{Time Conversion, , Time Conversion, elisp, GNU Emacs Lisp
+Reference Manual}.
+
+@vindex jabber-chat-delayed-time-format
+@code{jabber-chat-delayed-time-format} is used instead of
+@code{jabber-chat-time-format} for delayed messages (messages sent while
+you were offline, or fetched from history). This way you can have short
+timestamps everywhere except where you need long ones. You can always
+see the complete timestamp in a tooltip by hovering over the prompt with
+the mouse.
+
+@cindex Rare timestamps
+@vindex jabber-print-rare-time
+@vindex jabber-rare-time-format
+@vindex jabber-chat-text-local
+By default, timestamps are printed in the chat buffer every hour (at
+``rare'' times). This can be toggled with
+@code{jabber-print-rare-time}. You can customize the displayed time by
+setting @code{jabber-rare-time-format}. Rare timestamps will be printed
+whenever time formatted by that format string would change.
+
+@cindex Header line of chat buffers
+@vindex jabber-chat-header-line-format
+@vindex jabber-muc-header-line-format
+You can also customize the header line of chat buffers, by modifying
+the variable @code{jabber-chat-header-line-format}. The format of
+that variable is the same as that of @code{mode-line-format} and
+@code{header-line-format}. @xref{Mode Line Format, , Mode-Line
+Format, elisp, GNU Emacs Lisp Reference Manual}. For MUC buffers,
+@code{jabber-muc-header-line-format} is used instead.
+
+@vindex jabber-chat-fill-long-lines
+@cindex Filling long lines in chat buffer
+The variable @code{jabber-chat-fill-long-lines} controls whether long
+lines in the chat buffer are wrapped.
+
+@node Customizing alerts, Hooks, Customizing the chat buffer, Customization
+@section Customizing alerts
+
+@cindex Alert hooks
+@findex define-jabber-alert
+
+When an event happens (currently including presence changes, incoming
+messages, and completed queries) you will usually want to be
+notified. Since tastes in this area vary wildly, these alerts are
+implemented as hooks, so you can choose which ones you want, or write
+your own if none fit.
+
+Actually, if you don't want to write your own, stop reading this
+section and just read @ref{Standard alerts}.
+
+Many kinds of alerts consist in displaying a text message through a
+certain mechanism. This text message is provided by a function which
+you can rewrite or replace. If this function returns @code{nil}, no
+message is displayed, and non-textual alerts refrain from action.
+
+If you want to write alert hooks that do nothing except displaying the
+supplied message in some way, use the macro
+@code{define-jabber-alert}. For example, if @var{foo} is a function
+that takes a string as an argument, write
+@example
+(define-jabber-alert foo
+ "Display a message in a fooish way"
+ 'foo)
+@end example
+@noindent
+and all details will be taken care of for you.
+
+The hooks take different arguments depending on category. However,
+they all have in common that the last argument is the result of the
+message function. The message function for each category takes the
+same arguments as the corresponding hooks, except for that last
+argument.
+
+Alert hook contributions are very welcome. You can send them to the
+mailing list, or to the Sourceforge patch tracker. @xref{Contacts}.
+
+Alert hooks are meant for optional UI things, that are subject to
+varying user tastes, and that can be toggled by simply adding or
+removing the function to and from the hook. For other purposes, there
+are corresponding general hooks, that are defvars instead of
+defcustoms, and that are meant to be managed by Lisp code. They have the
+same name as the alert hooks minus the @code{-alert} part,
+e.g. @code{jabber-message-hooks} vs @code{jabber-alert-message-hooks},
+etc.
+
+@menu
+* Standard alerts::
+* Presence alerts::
+* Message alerts::
+* MUC alerts::
+* Info alerts::
+@end menu
+
+@node Standard alerts, Presence alerts, , Customizing alerts
+@subsection Standard alerts
+
+@cindex Alerts
+@cindex Scroll
+
+Thirteen alerts are already written for all four alert categories. These
+all obey the result from the corresponding message function.
+
+The @code{beep} alerts simply sound the terminal bell by calling
+@code{ding}. They are disabled by default.
+
+The @code{echo} alerts display a message in the echo area by calling
+@code{message}. They are enabled by default.
+
+The @code{switch} alerts switch to the buffer where the event occurred
+(chat buffer for incoming messages, roster buffer for presence
+changes, browse buffer for completed queries). They are disabled by
+default. Take care when using them, as they may interrupt your
+editing.
+
+The @code{display} alerts display but do not select the buffer in
+question, using the function @code{display-buffer}. @xref{Choosing
+Window, , Choosing a Window for Display, elisp, GNU Emacs Lisp
+Reference Manual}, for information about customizing its behaviour.
+This is enabled by default for info requests.
+
+@cindex Sound effects
+The @code{wave} alerts play a sound file by calling
+@code{play-sound-file}. No sound files are provided. To use this,
+enter the names of the sound files in
+@code{jabber-alert-message-wave}, @code{jabber-alert-presence-wave}
+and @code{jabber-alert-info-wave}, respectively. You can specify
+specific sound files for contacts matching a regexp in the variables
+@code{jabber-alert-message-wave-alist} and
+@code{jabber-alert-presence-wave-alist}.
+
+@cindex Screen terminal manager
+The @code{screen} alerts send a message through the Screen terminal
+manager@footnote{See @uref{http://www.gnu.org/software/screen/}.}. They do no
+harm if called when you don't use Screen.
+
+@cindex Tmux terminal manager
+The @code{tmux} alerts send a message through the tmux terminal
+manager@footnote{See @uref{http://tmux.sourceforge.net/}.}.
+
+@cindex Ratpoison window manager
+@cindex Window manager, Ratpoison
+The @code{ratpoison} alerts send a message through the Ratpoison
+window manager@footnote{See @uref{http://ratpoison.sourceforge.net/}.}. They
+do no harm if used when you're not running X, but if you are running X
+with another window manager, the ratpoison processes will never exit.
+Emacs doesn't hold on to them, though.
+
+@cindex Sawfish window manager
+@cindex Window manager, Sawfish
+The @code{sawfish} alerts send a message through the Sawfish window
+manager.
+
+@cindex wmii window manager
+@cindex Window manager, wmii
+The @code{wmii} alerts display a message through the wmii window
+manager.
+
+@cindex awesome window manager
+@cindex Window manager, awesome
+The @code{awesome} alerts display a message through the awesome window
+manager. However, to work it needs naughty (i.e.
+@code{require("naughty")} in rc.lua).
+
+@cindex xmessage
+@vindex jabber-xmessage-timeout
+The @code{xmessage} alerts send a message through the standard
+@code{xmessage} tool. The variable @code{jabber-xmessage-timeout}
+controls how long the alert appears.
+
+@cindex OSD
+The @code{osd} alerts send a message onto your screen using
+XOSD.@footnote{XOSD can be found at
+@uref{http://www.ignavus.net/software.html}. You also need
+@file{osd.el} from @uref{http://www.brockman.se/software/osd.el}.}
+
+@cindex notifications.el
+The @code{notifications} alerts send a message using Emacs built-in
+package @file{notifications.el}. Note that @file{notifications.el} first appear in
+Emacs 24.1, so they are disabled by default.
+
+@cindex libnotify
+@cindex notification-daemon
+The @code{libnotify} alerts send a message onto your screen using
+@code{notification-daemon}.
+
+@cindex Festival speech synthesis
+@cindex Speech synthesis, Festival
+The @code{festival} alerts speak the message using the Emacs interface
+of the Festival speech synthesis system@footnote{See
+@uref{http://www.cstr.ed.ac.uk/projects/festival/}.}.
+
+@cindex Autoanswerer
+The @code{autoanswer} alert is kind of special: it will not show you
+message/muc alert, but instead will automaticaly answer to sender. See
+variable `jabber-autoanswer-alist' description for details.
+
+@cindex Scroll chat buffers
+Additionally, for one-to-one and MUC messages, there are @code{scroll}
+alerts (enabled by default), that aim to do the right thing with chat
+buffers that are visible but not active. Sometimes you want point to
+scroll down, and sometimes not. These functions should do what you
+mean; if they don't, it's a bug.
+
+Also, in MUC you can use a family of so-called ``personal'' alerts.
+They are like other MUC alerts, but fire only on incoming messages
+addresed directly to you (also known as ``private messages''). One
+example of such an alert is @code{jabber-muc-echo-personal}, which shows
+a note for an MUC message only if it was addressed to you.
+
+Some of these functions are in the @file{jabber-alert.el} file, and the
+others are in their own files. You can use them as templates or
+inspiration for your own alerts.
+
+@node Presence alerts, Message alerts, Standard alerts, Customizing alerts
+@subsection Presence alerts
+
+@vindex jabber-alert-presence-message-function
+@findex jabber-presence-default-message
+
+Set @code{jabber-alert-presence-message-function} to your desired
+function. This function should look like:
+
+@example
+(defun @var{function} (@var{who} @var{oldstatus} @var{newstatus} @var{statustext})
+ ...
+ )
+@end example
+
+@var{who} is the JID symbol (@pxref{JID symbols}),
+@var{oldstatus} and @var{newstatus} are the previous and current
+stati, respectively, and @var{statustext} is the status message if
+provided, otherwise nil.
+
+@var{oldstatus} and @var{newstatus} can be one of @code{""}
+(i.e. online), @code{"away"}, @code{"xa"}, @code{"dnd"}, @code{"chat"},
+@code{"error"} and @code{nil} (i.e. offline).
+
+@var{newstatus} can also be one of @code{"subscribe"},
+@code{"subscribed"}, @code{"unsubscribe"} and @code{"unsubscribed"}.
+
+The default function, @code{jabber-presence-default-message}, returns
+@code{nil} if @var{oldstatus} and @var{newstatus} are the same, and in
+other cases constructs a message from the given data.
+
+Another function, @code{jabber-presence-only-chat-open-message},
+behave just like @code{jabber-presence-default-message}, but only if
+conversation buffer for according JID is already open. Use it to show
+presence notifications only for ``interesting'' contacts.
+
+All presence alert hooks take the same arguments plus the additional
+@var{proposed-alert}, which is the result of the specified message
+function. This last argument is usually the only one they use.
+
+@node Message alerts, MUC alerts, Presence alerts, Customizing alerts
+@subsection Message alerts
+
+@vindex jabber-alert-message-function
+@findex jabber-message-default-message
+
+Set @code{jabber-alert-message-function} to your desired
+function.@footnote{Logically it should be
+@code{jabber-alert-message-message-function}, but that would be
+really ugly.} This function should look like:
+
+@example
+(defun @var{function} (@var{from} @var{buffer} @var{text})
+ ...
+ )
+@end example
+
+@var{from} is the JID symbol (@pxref{JID symbols}), @var{buffer}
+is the buffer where the message is displayed, and @var{text} is the
+text of the message.
+
+The default function, @code{jabber-message-default-message}, returns
+``Message from @var{person}'', where @var{person} is the name of the
+person if specified in the roster, otherwise the JID.
+
+All message alert hooks take the same arguments plus the additional
+@var{proposed-alert}, which is the result of the specified message
+function.
+
+@vindex jabber-message-alert-same-buffer
+If you don't want message alerts when the chat buffer in question is
+already the current buffer, set @code{jabber-message-alert-same-buffer}
+to nil. This affects the behaviour of the default message function, so
+you'll have to reimplement this functionality if you write your own
+message function.
+
+@node MUC alerts, Info alerts, Message alerts, Customizing alerts
+@subsection MUC alerts
+
+@vindex jabber-alert-muc-function
+@vindex jabber-muc-alert-self
+@findex jabber-muc-default-message
+
+Set @code{jabber-alert-muc-function} to your desired
+function. This function should look like:
+
+@example
+(defun @var{function} (@var{nick} @var{group} @var{buffer} @var{text})
+ ...
+ )
+@end example
+
+@var{nick} is the nickname, @var{group} is the JID of the group,
+@var{buffer} is the buffer where the message is displayed, and
+@var{text} is the text of the message.
+
+The default function, @code{jabber-muc-default-message}, returns
+``Message from @var{nick} in @var{group}'' or ``Message in
+@var{group}'', the latter for messages from the room itself.
+
+All MUC alert hooks take the same arguments plus the additional
+@var{proposed-alert}, which is the result of the specified message
+function.
+
+By default, no alert is made for messages from yourself. To change
+that, customize the variable @code{jabber-muc-alert-self}.
+
+@node Info alerts, , MUC alerts, Customizing alerts
+@subsection Info alerts
+
+@vindex jabber-alert-info-message-function
+@findex jabber-info-default-message
+
+Info alerts are sadly underdeveloped. The message function,
+@code{jabber-alert-info-message-function}, takes two arguments,
+@var{infotype} and @var{buffer}. @var{buffer} is the buffer where
+something happened, and @var{infotype} is either @code{'roster} for
+roster updates, or @code{'browse} for anything that uses the browse
+buffer (basically anything except chatting).
+
+The info alert hooks take an extra argument, as could be expected.
+
+@node Hooks, Debug options, Customizing alerts, Customization
+@section Hooks
+
+jabber.el provides various hooks that you can use for whatever
+purpose.
+
+@table @code
+@vindex jabber-post-connect-hooks
+@item jabber-post-connect-hooks
+This hook is called after successful connection and authentication.
+By default it contains @code{jabber-send-current-presence}
+(@pxref{Presence}). The hook functions get the connection object as
+argument.
+
+@vindex jabber-lost-connection-hooks
+@item jabber-lost-connection-hooks
+This hook is called when you have been disconnected for unknown
+reasons. Usually this isn't noticed for quite a long time.
+
+The hook is called with one argument: the connection object.
+
+@vindex jabber-pre-disconnect-hook
+@item jabber-pre-disconnect-hook
+This hook is called just before voluntary disconnection, i.e. in
+@code{jabber-disconnect}, the command to disconnect all accounts. There
+is currently no hook for disconnection of a single account.
+
+@vindex jabber-post-disconnect-hook
+@item jabber-post-disconnect-hook
+This hook is called after disconnection of any kind, possibly just
+after @code{jabber-lost-connection-hook}.
+
+@vindex jabber-chat-mode-hook
+@item jabber-chat-mode-hook
+This hook is called when a new chat buffer is created.
+
+@vindex jabber-browse-mode-hook
+@item jabber-browse-mode-hook
+This hook is called when a new browse buffer is created.
+
+@vindex jabber-roster-mode-hook
+@item jabber-roster-mode-hook
+This hook is called when the roster buffer is created.
+
+@end table
+
+@node Debug options, , Hooks, Customization
+@section Debug options
+
+These settings provide a lot of information which is usually not very
+interesting, but can be useful for debugging various things.
+
+@vindex jabber-debug-log-xml
+@cindex XML console
+@code{jabber-debug-log-xml} activates XML console. All XML stanzas
+sent and received are logged in the buffer @code{*-jabber-console-@var{jid}-*}
+(and to specified file if value is string).
+Also this buffer can be used to send XML stanzas manually.
+
+@vindex jabber-console-name-format
+Format for console buffer name. %s mean connection jid. Default value is
+@code{*-jabber-console-%s-*}.
+
+@vindex jabber-console-truncate-lines
+Maximum number of lines in console buffer. Use this option to prevent
+over bloating size of buffer.
+Set value to 0 if you want to keep all stanzas in buffer, but
+it's not recommended and may be unsafe.
+
+@vindex jabber-debug-keep-process-buffers
+Usually, the process buffers for Jabber connections are killed when the
+connection is closed, as they would otherwise just fill up memory.
+However, they might contain information about why the connection was
+lost. To keep process buffers, set
+@code{jabber-debug-keep-process-buffers} to @code{t}.
+
+@node Hacking and extending, Protocol support, Customization, Top
+@chapter Hacking and extending
+
+This part of the manual is an attempt to explain parts of the source
+code. It is not meant to discourage you from reading the code
+yourself and trying to figure it out, but as a guide on where to
+look. Knowledge of Jabber protocols is assumed.
+
+@menu
+* Connection object::
+* XML representation::
+* JID symbols::
+* Listening for new requests::
+* Sending new requests::
+* Extending service discovery::
+* Chat printers::
+* Stanza chains::
+@end menu
+
+@node Connection object, XML representation, , Hacking and extending
+@section Connection object
+@cindex connection object
+@cindex account object
+@cindex FSM
+
+Each Jabber connection is represented by a ``connection object''. This
+object has the form of a finite state machine, and is realized by the
+library @code{fsm}.@footnote{So far, this library is only distributed
+with jabber.el. The author hopes that it could be useful for other
+projects, too.}
+
+The various states of this object are defined in @file{jabber-core.el}.
+They describe the way of the connection through the establishing of a
+network connection and authentication, and finally comes to the
+@code{:session-established} state where ordinary traffic takes place.
+
+These details are normally opaque to an extension author. As will be
+noted, many functions expect to receive a connection object, and
+functions at extension points generally receive such an object in order
+to pass it on. The following functions simply query the internal state
+of the connection:
+
+@defun jabber-connection-jid connection
+The @code{jabber-connection-jid} function returns the full JID of
+@var{connection}, i.e. a string of the form
+@code{"username@@server/resource"}.
+@end defun
+
+@defun jabber-connection-bare-jid connection
+The @code{jabber-connection-bare-jid} function returns the bare JID of
+@var{connection}, i.e. a string of the form @code{"username@@server"}.
+@end defun
+
+@node XML representation, JID symbols, Connection object, Hacking and extending
+@section XML representation
+
+@cindex XML representation
+
+The XML representation is the one generated by @file{xml.el} in Emacs,
+namely the following. Each tag is a list. The first element of the
+list is a symbol, the name of which is the name of the tag. The
+second element is an alist of attributes, where the keys are the
+attribute names in symbol form, and the values are strings. The
+remaining elements are the tags and data contained within the tag.
+
+For example,
+@example
+<foo bar='baz'>
+<frobozz/>Fnord
+</foo>
+@end example
+is represented as
+@example
+(foo ((bar . "baz")) (frobozz nil "") "Fnord
+")
+@end example
+
+Note the empty string as the third element of the @code{frobozz}
+list. It is not present in newer (post-21.3) versions of
+@file{xml.el}, but it's probably best to assume it might be there.
+
+@defun jabber-sexp2xml xml-sexp
+This function takes a tag in list representation, and returns its XML
+representation as a string. You will normally not need to use this
+function directly, but it can be useful to see how your sexps will look
+when sent to the outer, non-Lisp, world.
+@end defun
+
+@defun jabber-send-sexp connection sexp
+This function sends @var{sexp}, an XMPP stanza in list representation,
+and sends it over @var{connection}.
+
+You will normally use the functions @code{jabber-send-presence},
+@code{jabber-send-message} and @code{jabber-send-iq} instead of this
+function.
+@end defun
+
+@node JID symbols, Listening for new requests, XML representation, Hacking and extending
+@section JID symbols
+
+@vindex jabber-jid-obarray
+JIDs are sometimes represented as symbols. Its name is the JID, and it is interned
+in @code{jabber-jid-obarray}. A roster entry can have the following
+properties:
+
+@table @code
+@item xml
+The XML tag received from the server on roster update
+
+@item name
+The name of the roster item (just like the XML attribute)
+
+@item subscription
+The subscription state; a string, one of @code{"none"}, @code{"from"},
+@code{"to"} and @code{"both"}
+
+@item ask
+The ask state; either @code{nil} or @code{"subscribe"}
+
+@item groups
+A list of strings (possibly empty) containing all the groups the
+contact is in
+
+@item connected
+Boolean, true if any resource is connected
+
+@item show
+Presence show value for highest-priority connected resource; a string,
+one of @code{""} (i.e. online), @code{"away"}, @code{"xa"},
+@code{"dnd"}, @code{"chat"}, @code{"error"} and @code{nil}
+(i.e. offline)
+
+@item status
+Presence status message for highest-priority connected resource
+
+@item resources
+Alist. Keys are strings (resource names), values are plists with
+properties @code{connected}, @code{show}, @code{status} and
+@code{priority}.
+
+@end table
+
+Incoming presence information is inserted in @code{resources}, and the
+information from the resource with the highest priority is inserted in
+@code{show} and @code{status} by the function
+@code{jabber-prioritize-resources}.
+
+@node Listening for new requests, Sending new requests, JID symbols, Hacking and extending
+@section Listening for new requests
+
+@findex jabber-send-iq
+@findex jabber-process-iq
+@findex jabber-signal-error
+@vindex jabber-iq-get-xmlns-alist
+@vindex jabber-iq-set-xmlns-alist
+
+To listen for new IQ requests, add the appropriate entry in
+@code{jabber-iq-get-xmlns-alist} or @code{jabber-iq-set-xmlns-alist}.
+The key is the namespace of the request, and the value is a function
+that takes two arguments, the connection object, and
+the entire IQ stanza in list format.
+@code{jabber-process-iq} reads these alists to determine which
+function to call on incoming packets.
+
+For example, the Ad-Hoc Commands module contains the following:
+
+@example
+(add-to-list 'jabber-iq-set-xmlns-alist
+ (cons "http://jabber.org/protocol/commands"
+ 'jabber-ahc-process))
+@end example
+
+To send a response to an IQ request, use @samp{(jabber-send-iq
+@var{connection} @var{sender} "result" @var{query} nil nil nil nil
+@var{id})}, where @var{query} is the query in list format.
+@code{jabber-send-iq} will encapsulate the query in an IQ packet with
+the specified id.
+
+To return an error to the Jabber entity that sent the query, use
+@code{jabber-signal-error}. The signal is caught by
+@code{jabber-process-iq}, which takes care of sending the error.
+You can also use @code{jabber-send-iq-error}.
+
+@node Sending new requests, Extending service discovery, Listening for new requests, Hacking and extending
+@section Sending new requests
+
+@findex jabber-send-iq
+@findex jabber-process-iq
+
+To send an IQ request, use @code{jabber-send-iq}. It will generate an
+id, and create a mapping for it for use when the response comes. The
+syntax is:
+
+@example
+(jabber-send-iq @var{connection} @var{to} @var{type} @var{query}
+ @var{success-callback} @var{success-closure}
+ @var{failure-callback} @var{failure-closure})
+@end example
+
+@var{success-callback} will be called if the response is of type
+@samp{result}, and @var{failure-callback} will be called if the response
+is of type @samp{error}. Both callbacks take three arguments, the
+connection object, the IQ stanza of the response, and the corresponding
+closure item earlier passed to @code{jabber-send-iq}.
+
+@findex jabber-report-success
+@findex jabber-process-data
+Two standard callbacks are provided. @code{jabber-report-success} takes
+a string as closure item, and reports success or failure in the echo
+area by appending either @samp{succeeded} or @samp{failed} to the
+string. @code{jabber-process-data} prepares a browse buffer. If its
+closure argument is a function, it calls that function with point in
+this browse buffer. If it's a string, it prints that string along with
+the error message in the IQ response. If it's anything else
+(e.g. @code{nil}), it just dumps the XML in the browse buffer.
+
+Examples follow. This is the hypothetical Jabber protocol ``frob'',
+for which only success report is needed:
+@example
+(jabber-send-iq connection
+ "someone@@somewhere.org" "set"
+ '(query ((xmlns . "frob")))
+ 'jabber-report-success "Frobbing"
+ 'jabber-report-success "Frobbing")
+@end example
+This will print ``Frobbing succeeded'' or ``Frobbing failed: @var{reason}'',
+respectively, in the echo area.
+
+The protocol ``investigate'' needs to parse results and show them in a
+browse buffer:
+@example
+(jabber-send-iq connection
+ "someone@@somewhere.org" "get"
+ '(query ((xmlns . "investigate")))
+ 'jabber-process-data 'jabber-process-investigate
+ 'jabber-process-data "Investigation failed")
+@end example
+Of course, the previous example could have used
+@code{jabber-report-success} for the error message. It's a matter of
+UI taste.
+
+@node Extending service discovery, Chat printers, Sending new requests, Hacking and extending
+@section Service discovery
+
+Service discovery (XEP-0030) is a Jabber protocol for communicating
+features supported by a certain entity, and items affiliated with an
+entity. jabber.el has APIs for both providing and requesting such
+information.
+
+
+@menu
+* Providing info::
+* Requesting info::
+@end menu
+
+@node Providing info, Requesting info, , Extending service discovery
+@subsection Providing info
+
+Your new IQ request handlers will likely want to advertise their
+existence through service discovery.
+
+@vindex jabber-advertised-features
+To have an additional feature reported in response to disco info
+requests, add a string to @code{jabber-advertised-features}.
+
+@vindex jabber-disco-items-nodes
+@vindex jabber-disco-info-nodes
+By default, the service discovery functions reject all requests
+containing a node identifier with an ``Item not found'' error. To
+make them respond, add the appropriate entries to
+@code{jabber-disco-items-nodes} and @code{jabber-disco-info-nodes}.
+Both variables work in the same way. They are alists, where the keys
+are the node names, and the values are lists of two items.
+
+The first item is the data to return --- either a list, or a function
+taking the connection object and the entire IQ stanza and returning a
+list; in either case this list contains the XML nodes to include in the
+@code{<query/>} node in the response.
+
+@findex jabber-my-jid-p
+The second item is the access control function. An access control
+function receives the connection object and a JID as arguments, and
+returns non-nil if access is to be granted. If nil is specified
+instead of a function, access is always granted. One such function is
+provided, @code{jabber-my-jid-p}, which grants access for JIDs where
+the username and server (not necessarily resource) are equal to those
+of the user, or one of the user's configured accounts.
+
+@node Requesting info, , Providing info, Extending service discovery
+@subsection Requesting info
+
+jabber.el has a facility for requesting disco items and info. All
+positive responses are cached.
+
+To request disco items or info from an entity, user one of these
+functions:
+
+@defun jabber-disco-get-info jc jid node callback closure-data &optional force
+Get disco information for @var{jid} and @var{node}. A request is sent
+asynchronously on the connection @var{jc}. When the response arrives,
+@var{callback} is called with three arguments: @var{jc},
+@var{closure-data}, and the result. The result may be retrieved from
+the cache, unless @var{force} is non-nil.
+
+If the request was successful, or retrieved from cache, it looks like
+@code{(@var{identities} @var{features})}, where @var{identities} and
+@var{features} are lists. Each identity is @code{["@var{name}"
+"@var{category}" "@var{type}"]}, and each feature is a string denoting
+the namespace of the feature.
+
+If the request failed, the result is an @code{<error/>} node.
+@end defun
+
+@defun jabber-disco-get-items jc jid node callback closure-data &optional force
+Get disco information for @var{jid} and @var{node}. A request is sent
+asynchronously on the connection @var{jc}. When the response arrives,
+@var{callback} is called with three arguments: @var{jc},
+@var{closure-data}, and the result. The result may be retrieved from
+the cache, unless @var{force} is non-nil.
+
+If the request was successful, or retrieved from cache, the result is
+a list of items, where each item is @code{["@var{name}" "@var{jid}"
+"@var{node}"]}. The values are either strings or nil.
+
+If the request failed, the result is an @code{<error/>} node.
+@end defun
+
+If you only want to see what is in the cache, use one of the following
+functions. They don't use a callback, but return the result directly.
+
+@defun jabber-disco-get-info-immediately jid node
+Return cached disco information for @var{jid} and @var{node}, or nil
+if the cache doesn't contain this information. The result is the same
+as for @code{jabber-disco-get-info}.
+@end defun
+
+@defun jabber-disco-get-items-immediately jid node
+Return cached disco items for @var{jid} and @var{node}, or nil
+if the cache doesn't contain this information. The result is the same
+as for @code{jabber-disco-get-items}.
+@end defun
+
+In the future, this facility will be expanded to provide information
+acquired through XEP-0115, Entity capabilities, which is a protocol
+for sending disco information in @code{<presence/>} stanzas.
+
+@node Chat printers, Stanza chains, Extending service discovery, Hacking and extending
+@section Chat printers
+
+@vindex jabber-chat-printers
+@vindex jabber-muc-printers
+@vindex jabber-body-printers
+@cindex Chat printers
+@cindex Body printers
+
+Chat printers are functions that print a certain aspect of an incoming
+message in a chat buffer. Included are functions for printing subjects
+(@code{jabber-chat-print-subject}), bodies
+(@code{jabber-chat-print-body}, and @code{jabber:x:oob}-style URLs
+(@code{jabber-chat-print-url}). The functions in
+@code{jabber-chat-printers} are called in order, with the entire
+@code{<message/>} stanza as argument. As described in the docstring
+of @code{jabber-chat-printers}, these functions are run in one of two
+modes: @code{printp}, in which they are supposed to return true if
+they would print anything, and @code{insert}, in which they are
+supposed to actually print something, if appropriate, using the
+function @code{insert}.
+
+For MUC, the functions in @code{jabber-muc-printers} are prepended to
+those in @code{jabber-chat-printers}.
+
+Body printers are a subgroup of chat printers. They are exclusive; only
+one of them applies to any given message. The idea is that
+``higher-quality'' parts of the message override pieces included for
+backwards compatibility. Included are @code{jabber-muc-print-invite}
+and @code{jabber-chat-normal-body}; functions for XHTML-IM and PGP
+encrypted messages may be written in the future. The functions in
+@code{jabber-body-printers} are called in order until one of them
+returns non-nil.
+
+@node Stanza chains, , Chat printers, Hacking and extending
+@section Stanza chains
+
+@vindex jabber-message-chain
+@vindex jabber-iq-chain
+@vindex jabber-presence-chain
+
+If you really need to get under the skin of jabber.el, you can add
+functions to the lists @code{jabber-message-chain},
+@code{jabber-iq-chain} and @code{jabber-presence-chain}. The
+functions in these lists will be called in order when an XML stanza of
+the corresponding type arrives, with the connection object and the
+entire XML stanza passed as arguments. Earlier functions can modify
+the stanza to change the behaviour of downstream functions, but
+remember: with great power comes great responsibility.
+
+@node Protocol support, Concept index, Hacking and extending, Top
+@appendix Protocol support
+
+@cindex Supported protocols
+
+These are the protocols currently supported (in full or partially) by
+jabber.el.
+
+@menu
+* RFC 3920:: XMPP-CORE
+* RFC 3921:: XMPP-IM
+* XEP-0004:: Data Forms
+* XEP-0012:: Last Activity
+* XEP-0020:: Feature Negotiation
+* XEP-0022:: Message Events
+* XEP-0030:: Service Discovery
+* XEP-0045:: Multi-User Chat
+* XEP-0049:: Private XML Storage
+* XEP-0050:: Ad-Hoc Commands
+* XEP-0054:: vcard-temp
+* XEP-0055:: Jabber Search
+* XEP-0065:: SOCKS5 Bytestreams
+* XEP-0066:: Out of Band Data
+* XEP-0068:: Field Standardization for Data Forms
+* XEP-0077:: In-Band Registration
+* XEP-0078:: Non-SASL Authentication
+* XEP-0082:: Jabber Date and Time Profiles
+* XEP-0085:: Chat State Notifications
+* XEP-0086:: Error Condition Mappings
+* XEP-0090:: Entity Time
+* XEP-0091:: Delayed Delivery
+* XEP-0092:: Software Version
+* XEP-0095:: Stream Initiation
+* XEP-0096:: File Transfer
+* XEP-0146:: Remote Controlling Clients
+* XEP-0153:: vCard-Based Avatars
+* XEP-0199:: XMPP Ping
+* XEP-0245:: The /me Command
+@end menu
+
+@node RFC 3920, RFC 3921, , Protocol support
+@section RFC 3920 (XMPP-CORE)
+
+Most of RFC 3920 is supported, with the following exceptions.
+
+SASL is supported only when an external SASL library from FLIM or Gnus
+is present. As SASL is an essential part to XMPP, jabber.el will send
+pre-XMPP stream headers if it is not available.
+
+None of the stringprep profiles are implemented. jabber.el changes
+JIDs to lowercase internally; that's all.
+
+jabber.el doesn't interpret namespace prefixes.
+
+The @code{xml:lang} attribute is neither interpreted nor generated.
+
+SRV records are used if a modern version of @code{dns.el} is installed.
+
+@node RFC 3921, XEP-0004, RFC 3920, Protocol support
+@section RFC 3921 (XMPP-IM)
+
+Most of RFC 3921 is supported, with the following exceptions.
+
+Messages of type ``headline'' are not treated in any special way.
+
+The @code{<thread/>} element is not used or generated.
+
+Sending ``directed presence'' is supported; however, presence stanzas
+received from contacts not in roster are ignored.
+
+Privacy lists are not supported at all.
+
+jabber.el doesn't support XMPP-E2E or ``im:'' CPIM URIs.
+
+@node XEP-0004, XEP-0012, RFC 3921, Protocol support
+@section XEP-0004 (Data Forms)
+
+XEP-0004 support is good enough for many purposes. Limitations are
+the following.
+
+Forms in incoming messages are not interpreted. See each specific
+protocol for whether forms are accepted in that context.
+
+``Cancel'' messages are probably not consistently generated when they
+should be. This is partly a paradigm clash, as jabber.el doesn't use
+modal dialog boxes but buffers which can easily be buried.
+
+@code{<required/>} elements are not enforced.
+
+The field types ``jid-single'', ``jid-multi'' and ``list-multi'' are
+not implemented, due to programmer laziness. Let us know if you need
+them.
+
+@node XEP-0012, XEP-0020, XEP-0004, Protocol support
+@section XEP-0012 (Last Activity)
+
+jabber.el can generate all three query types described in the protocol.
+However, it does not answer to such requests.
+
+@node XEP-0020, XEP-0022, XEP-0012, Protocol support
+@section XEP-0020 (Feature Negotiation)
+
+There are no known limitations or bugs in XEP-0020 support.
+
+@node XEP-0022, XEP-0030, XEP-0020, Protocol support
+@section XEP-0022 (Message Events)
+
+jabber.el understands all four specified kinds of message events
+(offline, delivered, displayed, and composing) and by default requests
+all of them. It also reports those three events that make sense for
+clients.
+
+@node XEP-0030, XEP-0045, XEP-0022, Protocol support
+@section XEP-0030 (Service Discovery)
+
+Service discovery is supported, both as client and server. When used in
+the code, service discovery results are cached indefinitely.
+
+@node XEP-0045, XEP-0049, XEP-0030, Protocol support
+@section XEP-0045 (Multi-User Chat)
+
+jabber.el supports parts of XEP-0045. Entering, leaving and chatting
+work. So do invitations and private messages. Room configuration is
+supported. Changing roles of participants (basic moderation) is
+implemented, as is changing affiliations, but requesting affiliation
+lists is not yet supported.
+
+@node XEP-0049, XEP-0050, XEP-0045, Protocol support
+@section XEP-0049 (Private XML Storage)
+
+jabber.el contains an implementation of XEP-0049; It is used
+for bookmarks and roster's groups roll state saving.
+
+@node XEP-0050, XEP-0054, XEP-0049, Protocol support
+@section XEP-0050 (Ad-Hoc Commands)
+
+jabber.el is probably the first implementation of XEP-0050 (see
+@uref{http://article.gmane.org/gmane.network.jabber.devel/21413, post
+on jdev from 2004-03-10}). Both the client and server parts are
+supported.
+
+@node XEP-0054, XEP-0055, XEP-0050, Protocol support
+@section XEP-0054 (vcard-temp)
+
+Both displaying other users' vCards and editing your own vCard are
+supported. The implementation tries to follow the schema in the XEP
+accurately.
+
+@node XEP-0055, XEP-0065, XEP-0054, Protocol support
+@section XEP-0055 (Jabber Search)
+
+XEP-0055 is supported, both with traditional fields and with Data Forms
+(@pxref{XEP-0004}). As the traditional fields specified by the XEP is a
+subset of those allowed in XEP-0077, handling of those two form types
+are merged. @xref{XEP-0077}.
+
+@node XEP-0065, XEP-0066, XEP-0055, Protocol support
+@section XEP-0065 (SOCKS5 Bytestreams)
+
+XEP-0065 is supported. Currently jabber.el cannot act as a server, not
+even on on Emacsen that support server sockets (GNU Emacs 22 and up).
+Therefore it relies on proxies. Proxies have to be entered and queried
+manually.
+
+Psi's ``fast mode''
+(@uref{http://delta.affinix.com/specs/stream.html}), which gives
+greater flexibility with regards to NAT, is not implemented.
+
+@node XEP-0066, XEP-0068, XEP-0065, Protocol support
+@section XEP-0066 (Out of Band Data)
+
+jabber.el will display URLs sent in message stanzas qualified by
+the @code{jabber:x:oob} namespace, as described in this XEP. Sending
+such URLs or doing anything with iq stanzas (using the
+@code{jabber:iq:oob} namespace) is not supported.
+
+@node XEP-0068, XEP-0077, XEP-0066, Protocol support
+@section XEP-0068 (Field Standardization for Data Forms)
+
+XEP-0068 is only used in the context of creating a new Jabber account,
+to prefill the username field of the registration form.
+
+@node XEP-0077, XEP-0078, XEP-0068, Protocol support
+@section XEP-0077 (In-Band Registration)
+
+In-band registration is supported for all purposes. That means
+registering a new Jabber account, changing Jabber password, removing a
+Jabber account, registering with a service, and cancelling
+registration to a service. Data forms are supported as well. URL
+redirections are not.
+
+jabber.el will not prevent or alert a user trying to change a password
+over an unencrypted connection.
+
+@node XEP-0078, XEP-0082, XEP-0077, Protocol support
+@section XEP-0078 (Non-SASL Authentication)
+
+Non-SASL authentication is supported, both plaintext and digest.
+Digest is preferred, and a warning is displayed to the user if only
+plaintext is available.
+
+@node XEP-0082, XEP-0085, XEP-0078, Protocol support
+@section XEP-0082 (Jabber Date and Time Profiles)
+
+The DateTime profile of XEP-0082 is supported. Currently this is only
+used for file transfer.
+
+@node XEP-0085, XEP-0086, XEP-0082, Protocol support
+@section XEP-0085 (Chat State Notifications)
+
+XEP-0085 is partially supported. Currently only active/composing
+notifications are @emph{sent} though all five notifications are handled on
+receipt.
+
+@node XEP-0086, XEP-0090, XEP-0085, Protocol support
+@section XEP-0086 (Error Condition Mappings)
+
+Legacy errors are interpreted, but never generated. XMPP style error
+messages take precedence when errors are reported to the user.
+
+@node XEP-0090, XEP-0091, XEP-0086, Protocol support
+@section XEP-0090 (Entity Time)
+
+jabber.el can query other entities for their time, and return the
+current time to those who ask.
+
+@node XEP-0091, XEP-0092, XEP-0090, Protocol support
+@section XEP-0091 (Delayed Delivery)
+
+The time specified on delayed incoming messages is interpreted, and
+displayed in chat buffers instead of the current time.
+
+@node XEP-0092, XEP-0095, XEP-0091, Protocol support
+@section XEP-0092 (Software Version)
+
+The user can request the version of any entity. jabber.el answers
+version requests to anyone, giving ``jabber.el'' as name, and the
+Emacs version as OS.
+
+@node XEP-0095, XEP-0096, XEP-0092, Protocol support
+@section XEP-0095 (Stream Initiation)
+
+XEP-0095 is supported, both incoming and outgoing, except that jabber.el
+doesn't check service discovery results before sending a stream
+initiation request.
+
+@node XEP-0096, XEP-0146, XEP-0095, Protocol support
+@section XEP-0096 (File Transfer)
+
+Both sending and receiving files is supported. If a suitable program is
+found, MD5 hashes of outgoing files are calculated and sent. However,
+hashes of received files are not checked. Ranged transfers are not
+supported. In-band bytestreams are not yet supported, even though
+XEP-0096 requires them.
+
+@node XEP-0146, XEP-0153, XEP-0096, Protocol support
+@section XEP-0146 (Remote Controlling Clients)
+
+The ``set-status'' command in XEP-0146 is supported.
+
+@node XEP-0153, XEP-0199, XEP-0146, Protocol support
+@section XEP-0153 (vCard-Based Avatars)
+
+vCard-based avatars are supported, both publishing and displaying. The
+pixel size limits on avatars are not enforced.
+
+@node XEP-0199, XEP-0245, XEP-0153, Protocol support
+@section XEP-0199 (XMPP Ping)
+
+XEP-0199 is fully supported.
+
+@node XEP-0245, ,XEP-0199, Protocol support
+@section XEP-0245 (/me Command)
+
+XEP-0245 is partially supported (except XHTML-IM).
+
+@node Concept index, Function index, Protocol support, Top
+@unnumbered Concept index
+
+@printindex cp
+
+@node Function index, Variable index, Concept index, Top
+@unnumbered Function index
+
+@printindex fn
+
+@node Variable index, , Function index, Top
+@unnumbered Variable index
+
+@printindex vr
+
+@bye
+
+@ignore
+ arch-tag: 995bf3da-0e87-4b15-895a-1e85fac139a2
+@end ignore