diff lisp/behavior-defs.el @ 2546:5d1743698fb3

[xemacs-hg @ 2005-02-03 05:26:39 by ben] behavior ws #3: behavior updates behavior.el: Major update. Add documentation of how it works. behavior-defs.el: Only define the basic behavior groups here. Move the definitions for particular packages to the appropriate package files. mwheel.el: Add define-behavior for mwheel.
author ben
date Thu, 03 Feb 2005 05:26:41 +0000
parents 79940b592197
children 308d34e9f07d
line wrap: on
line diff
--- a/lisp/behavior-defs.el	Thu Feb 03 05:03:45 2005 +0000
+++ b/lisp/behavior-defs.el	Thu Feb 03 05:26:41 2005 +0000
@@ -1,6 +1,6 @@
 ;;; behavior-defs.el --- definitions of specific behaviors
 
-;; Copyright (C) 2000, 2001, 2002 Ben Wing.
+;; Copyright (C) 2000, 2001, 2002, 2003 Ben Wing.
 
 ;; Author: Ben Wing
 ;; Maintainer: XEmacs Development Team
@@ -31,475 +31,27 @@
 
 ;;; Commentary:
 
-;; This file will be dumped with XEmacs.
+;; This file is dumped with XEmacs.
 
 ;;; Code:
 
-(require 'behavior)
-
-(define-behavior 'scroll-in-place
-"This package provides improved vertical scrolling commands for XEmacs.
-These new commands offer the following features:
-
-+ When a scrolling command is executed, XEmacs tries to keep point as
-  close as possible to its original window position (window line and
-  column).  This is what \"scroll in place\" means: point stays \"in place\"
-  within the window.  (There are times when point must be moved from its
-  original window position in order to execute the scroll; see below.)
-
-  The variable `scroll-in-place', which is true by default, determines
-  whether or not the standard XEmacs scrolling commands (`scroll-down',
-  `scroll-up', `scroll-other-window-down', and `scroll-other-window') use
-  the \"in place\" features listed here.  When `scroll-in-place' is `nil'
-  the standard XEmacs scrolling commands essentially just call the
-  original versions of themselves.  (Note that even when `scroll-in-place'
-  is `nil' the new versions of `scroll-down' and `scroll-up' have slightly
-  different behavior when a minibuffer window is the selected window.  See
-  below.)
-
-  It is possible to turn off (or turn on) \"in place\" scrolling for certain
-  buffers by making buffer-local bindings of the variable `scroll-in-
-  place' for those buffers.  The variable `scroll-in-place' is not usually
-  buffer-local, but you can make it so if you desire.
-
-+ Because the improved scrolling commands keep point at its original
-  window position, these scrolling commands are \"reversible.\"  The
-  `scroll-up' command undoes the effect of the immediately previous
-  `scroll-down' command (if any) and vice versa.  In other words, if you
-  scroll up and then immediately scroll back down, the window config-
-  uration is restored to its exact original state.  This allows you to
-  browse through a buffer more easily, as you can always get back to the
-  original configuration.
-
-  Note, however, that the improved scrolling commands are guaranteed to be
-  reversible only if there are no intervening non-scrolling commands.
-  Also, if you give a prefix argument to a scrolling command (in order to
-  specify the number of lines to scroll by), previous scrolling commands
-  may no longer be reversible.  More specifically, if the new prefix
-  argument has a different magnitude than the previous scrolling distance,
-  then any previous scrolling commands are not reversible.  The new prefix
-  argument takes precedence.
-
-  You might find it useful to think of the scrolling commands as forming
-  \"chains.\"  A scrolling command either starts or continues a chain.  By
-  issuing a non-scrolling command or by changing the number of lines to be
-  scrolled, you break the chain.  (Note that simply changing the scrolling
-  direction won't break the chain; changing the absolute number of lines
-  to be scrolled is what breaks the chain.)  Scrolling commands are
-  guaranteed to be reversible only within the current chain.  Hopefully
-  that's clear enough.
-
-+ When a scrolling command is given a prefix argument (which specifies the
-  number of lines to scroll by), then that argument becomes the default
-  scrolling distance for all immediately subsequent scrolling commands.
-  This means that you can easily set the scrolling distance for a chain
-  of scrolling commands.  Note that a new prefix argument or any non-
-  scrolling command breaks the chain (as described above), and any further
-  scrolling commands will use the usual defaults (or the prefix argument
-  you specify at that time, of course).
-
-  However, there are cases in which one doesn't want the current scrolling
-  command to use the default scrolling distance that was set by the
-  previous scrolling command.  For example, suppose that you had special
-  commands that scrolled one line up and one line down.  When you invoke
-  one of these commands, the \"in place\" scrolling routines set the default
-  scrolling distance to be just one line.  Now suppose that you use one of
-  your special commands and then immediately invoke `scroll-up' (`C-v'),
-  expecting it to scroll by a near windowful of text.  You would be
-  disappointed --- because the previous command set the default scrolling
-  distance to be just one line, `scroll-up' just scrolls by one line.
-
-  To solve this problem, \"scroll-in-place\" allows you to divide scrolling
-  commands into separate \"groups.\"  Commands in a group can only form
-  chains with (and therefore, inherit defaults from) commands in the same
-  group.  (Note that no command can be in more than one group.)  If you
-  invoke a scrolling command that is not in the same group as that of the
-  immediately previous scrolling command, then the previous chain is
-  broken and you start a new chain --- with a new set of defaults.
-
-  So to solve the problem described above, you could put your one-line
-  scrolling commands in their own group.  Once that is done, the standard
-  scrolling commands will not form chains with your one-line scrolling
-  commands, and therefore will not use the default scrolling distance set
-  by those commands.  Problem solved!
-
-  By default, all \"in place\" scrolling commands are in a single group.  If
-  you want to partition some commands into separate groups, you must do
-  that yourself *before* any \"in place\" commands are invoked.  For more
-  information about grouping commands, see the documentation for the
-  variables `scroll-command-groups' and `scroll-default-command-group'.
-
-+ The improved scrolling commands will avoid displaying empty lines past
-  the end of the buffer when possible.  In other words, just as you can't
-  see \"dead space\" before the beginning of the buffer text, the new
-  scrolling commands try to avoid displaying \"dead space\" past the end of
-  the buffer text.  This behavior is somewhat configurable; see the
-  documentation for the variable `scroll-allow-blank-lines-past-eob'.
-
-  Dead space will be displayed if it is necessary in order to make a
-  previous scrolling action reversible, however.
-
-+ If the scrolling commands cannot keep point at its initial window
-  position (because a buffer boundary is on screen and the window can't be
-  scrolled as far as necessary to keep point at the right place), point is
-  allowed to temporarily stray from its initial window position.  That is,
-  point moves the correct number of window lines, even if it means that it
-  has to stray from its desired window position.  This straying is undone
-  when (and if) the scrolling action is reversed.
-
-+ If a scrolling command tries to move point past a buffer boundary, point
-  is instead moved to the boundary (the beginning or the end of the buffer
-  as appropriate) and an appropriate message is displayed.  This motion is
-  reversible, of course.
-
-  However, if point was already at the buffer boundary when the scrolling
-  command was invoked, the command signals an appropriate error instead.
-
-+ When a minibuffer window is the selected window, the new versions of
-  `scroll-up' and `scroll-down' either scroll the window in the variable
-  `minibuffer-scroll-window' (which is usually the window of completions)
-  or the `next-window' if there is no `minibuffer-scroll-window'.  This is
-  usually much more useful than scrolling the minibuffer itself.  (Note
-  that this feature is available even when the variable `scroll-in-place'
-  is `nil'.)
-
-+ When a scrolling command is scrolling a window other than the selected
-  window, it will signal an appropriate buffer boundary error if the
-  window cannot be scrolled (because the appropriate buffer boundary is
-  already visible).  This means that an error is signalled even in cases
-  that would be allowed (by \"straying\" point or by moving it to the buffer
-  boundary) if the window were selected.
-
-  (If an error were not signalled in these cases, then there would be many
-  cases in which the last scroll in a particular direction would appear to
-  do nothing because only the point position would change --- the
-  displayed text would stay the same!  To avoid these cases the scrolling
-  commands signal boundary errors \"prematurely\" when the window to be
-  scrolled is not selected.)"
-  :short-doc "Keep cursor on same line when scrolling"
-  :require 'scroll-in-place
-  :enable #'turn-on-scroll-in-place
-  :disable #'turn-off-scroll-in-place)
-
-(define-behavior 'mouse-avoidance
-"For those who are annoyed by the mouse pointer obscuring text,
-this mode moves the mouse pointer - either just a little out of
-the way, or all the way to the corner of the frame. 
-
-Customize `mouse-avoidance-mode' to one of the symbols `banish',
-`exile', `jump', `animate', `cat-and-mouse', `proteus', or `none'.
-
-Effects of the different modes: 
- * banish: Move the mouse to the upper-right corner on any keypress.
- * exile: Move the mouse to the corner only if the cursor gets too close,
-     and allow it to return once the cursor is out of the way.
- * jump: If the cursor gets too close to the mouse, displace the mouse
-     a random distance & direction.
- * animate: As `jump', but shows steps along the way for illusion of motion.
- * cat-and-mouse: Same as `animate'.
- * proteus: As `animate', but changes the shape of the mouse pointer too.
-
-Whenever the mouse is moved, the frame is also raised.
-
-\(see `mouse-avoidance-threshold' for definition of \"too close\",
-and `mouse-avoidance-nudge-dist' and `mouse-avoidance-nudge-var' for
-definition of \"random distance\".)"
-  :short-doc "Keep mouse away from cursor"
-  :enable #'(lambda ()
-	       (mouse-avoidance-mode 'animate))
-  :disable #'(lambda ()
-	       (mouse-avoidance-mode 'none)))
-
-(define-behavior 'jka-compr
-  "This package implements low-level support for reading, writing,
-and loading compressed files.  It hooks into the low-level file
-I/O functions (including write-region and insert-file-contents) so
-that they automatically compress or uncompress a file if the file
-appears to need it (based on the extension of the file name).
-Packages like Rmail, VM, GNUS, and Info should be able to work
-with compressed files without modification."
-  :short-doc "Transparently handle compressed files"
-  :enable #'jka-compr-install
-  :disable #'jka-compr-uninstall)
-
-(define-behavior 'efs
-"EFS is a system for transparent file-transfer between remote VMS, CMS,
-MTS, MVS, Twenex, Explorer (the last two are Lisp machines), TOPS-20,
-DOS (running the Distinct, Novell, FTP software, NCSA, Microsoft in both
-unix and DOS mode, Super TCP, and Hellsoft FTP servers), Windows NT
-\(running the Microsoft or Hummingbird ftp servers), Unix descriptive
-listings (dl), KA9Q, OS/2 hosts using FTP. This means that you can edit,
-copy and otherwise manipulate files on any machine you have access to
-from within Emacs as if it were a local file. EFS works by introducing
-an extended filename syntax, and overloading functions such as
-`insert-file-contents' so that accessing a remote file causes
-appropriate commands to be sent to an FTP process.
-
-The syntax to use is like this:
-
-\(for anonymous:)     /ftp.xemacs.org:/pub/xemacs/
-\(for non-anonymous:) /ben@gwyn.tux.org:/etc/mail/xemacs/aliases-xemacs
-
-You can specify either a file or a directory (in the latter case,
-Dired will be brought up).  All operations in XEmacs on such files
-should work exactly as on any other files, modulo the additional
-slowness."
-  :short-doc "Transparent file access over FTP"
-  :require 'efs-auto
-  :enable #'ignore
-  ;; can't :disable
-  )
-
-
-(define-behavior 'resize-minibuffer
-  "When this behavior is enabled, the minibuffer is dynamically resized to
-contain the entire region of text put in it as you type.
-
-The maximum height to which the minibuffer can grow is controlled by the
-variable `resize-minibuffer-window-max-height'.
-
-The variable `resize-minibuffer-window-exactly' determines whether the
-minibuffer window should ever be shrunk to make it no larger than needed to
-display its contents.
+(define-behavior-group 'tty)
+(define-behavior-group 'toolbars)
+(define-behavior-group 'menus)
+(define-behavior-group 'mouse)
+(define-behavior-group 'editing)
+(define-behavior-group 'keyboard)
+(define-behavior-group 'files)
+(define-behavior-group 'games)
+(define-behavior-group 'processes)
+(define-behavior-group 'display)
+(define-behavior-group 'programming)
+(define-behavior-group 'international)
+(define-behavior-group 'buffers-and-windows)
+(define-behavior-group 'internet)
 
-When using a window system, it is possible for a minibuffer to be the sole
-window in a frame.  Since that window is already its maximum size, the only
-way to make more text visible at once is to increase the size of the frame.
-The variable `resize-minibuffer-frame' controls whether this should be
-done.  The variables `resize-minibuffer-frame-max-height' and
-`resize-minibuffer-frame-exactly' are analogous to their window
-counterparts."
-  :short-doc "Resize minibuffer automatically"
-  :enable #'(lambda ()
-	      (resize-minibuffer-mode 1))
-  :disable #'(lambda ()
-	       (resize-minibuffer-mode -1)))
-
-(define-behavior 'func-menu
-  "Suppose you have a file with a lot of functions in it. Well, this
-package makes it easy to jump to any of those functions. The names of
-the functions in the current buffer are automatically put into menubar
-menu, you select one of the function-names and the point is moved to
-that very function. The mark is pushed on the mark-ring, so you can
-easily go back to where you were. Alternatively, you can use enter the
-name of the desired function via the minibuffer which offers
-completing read input. In addition, the name of the function before
-point is optionally displayed in the modeline."
-  :short-doc "Add a menu of defined functions"
-  :require 'func-menu
-  :enable #'(lambda ()
-	      (add-hook 'find-file-hooks 'fume-add-menubar-entry)
-	      (mapc #'(lambda (buffer)
-			(with-current-buffer buffer
-			  (setq fume-display-in-modeline-p t)
-			  (fume-add-menubar-entry)))
-		    (buffer-list)))
-  :disable #'(lambda ()
-	       (remove-hook 'find-file-hooks 'fume-add-menubar-entry)
-	       (fset 'widen (symbol-function 'fume-widen))
-	       (fset 'narrow-to-region (symbol-function 'narrow-to-region))
-	       (mapc #'(lambda (buffer)
-			 (with-current-buffer buffer
-			   (fume-remove-menubar-entry)
-			   (setq fume-display-in-modeline-p nil)
-			   (fume-remove-post-command-hook
-			    'fume-tickle-modeline)
-			   (fume-remove-post-command-hook
-			    'fume-maybe-install-modeline-feature)
-			   (fume-remove-post-command-hook
-			    'fume-rescan-buffer-trigger)))
-		     (buffer-list))))
-
-(define-behavior 'mwheel
-  "This code enables the use of the infamous 'wheel' on the new
-crop of mice.  Under XFree86 and the XSuSE X Servers, the wheel
-events are sent as button4/button5 events, which are automatically
-set up to do scrolling in the expected way.  The actual way that the
-scrolling works can be controlled by `mwheel-scroll-amount' and
-`mwheel-follow-mouse'."
-  :short-doc "Mouse wheel support for X Windows"
-  :enable 'mwheel-install)
-
-(define-behavior 'recent-files
-"Recent-files adds the menu \"Recent Files\" (or whatever name you
-choose, see \"Customization:\" below) to Emacs's menubar. Its
-entries are the files (and directories) that have recently been
-opened by Emacs. You can open one of these files again by
-selecting its entry in the \"Recent Files\" menu. The list of file
-entries in this menu is preserved from one Emacs session to
-another. You can prevent Emacs from saving this list by selecting
-\"Don't save recent-files list on exit\" from the menu. If you have
-disabled saving, you can re-enable it by selecting \"Save
-recent-files list on exit\".
-
-The menu has permanent and non-permanent entries. Permanent
-entries are marked with an asterisk in front of the filename. The
-non-permanent entries are hidden in a submenu.
-
-Each time you open a file in Emacs, it is added as a non-permanent
-entry to the menu. The value of `recent-files-number-of-entries'
-determines how many non-permanent entries are held in the
-menu. When the number of non-permanent entries reaches this value,
-the least recently added non-permanent entry is removed from the
-menu when another non-permanent entry is added. It is not removed
-from the list, though; it may reappear when entries are deleted
-from the list. The number of entries saved to disk is the value of
-the variable `recent-files-number-of-saved-entries'.
-
-Permanent entries are not removed from the menu. You can make a
-file entry permanent by selecting \"Make <buffer> permanent\" (where
-<buffer> is the name of the current buffer) when the current
-buffer holds this file. \"Make <buffer> non-permanent\" makes the
-file entry of the current buffer non-permanent.
-
-The command \"Kill buffer <buffer> and delete entry\" is handy when
-you have accidently opened a file but want to keep neither the
-buffer nor the entry.
-
-You can erase the list of non-permanent entries by selecting
-\"Erase non-permanent entries\" from the menu.
-
-Customization:
-
-There are lots of variables to control the behaviour of
-recent-files. You do not have to change any of them if you like it
-as it comes out of the box. However, you may want to look at these
-options to make it behave different.
-
-`recent-files-number-of-entries'
-   Controls how many non-permanent entries are shown in the
-   recent-files list.  The default is 15. 
-
-`recent-files-number-of-saved-entries'
-   Controls how many non-permanent entries are saved to disk when
-   Emacs exits or recent-files-save-the-list is called. The
-   default is 50.
-
-`recent-files-save-file'
-   The name of the file where the recent-files list is saved
-   between Emacs session. You probably don't need to change this.
-   The default is \".recent-files.el\" in your home directory.
-
-`recent-files-dont-include'
-   A list of regular expressions for files that should not be
-   included into the recent-files list. This list is empty by
-   default. For instance, a list to exclude all .newsrc
-   files, all auto-save-files, and all files in the /tmp
-   directory (but not the /tmp directory itself) would look
-   like this:
-        (setq recent-files-dont-include
-              '(\"/\\.newsrc\" \"~$\" \"^/tmp/.\"))
-   The default is empty.
-
-`recent-files-use-full-names'
-   If the value of this variable is non-nil, the full pathnames of
-   the files are shown in the recent-files menu. Otherwise only
-   the filename part (or the last name component if it is a
-   directory) is shown in the menu. The default it t, i.e. show
-   full names.
-
-`recent-files-filename-replacements'
-   This is a list of pairs of regular expressions and replacement
-   strings. If a filename matches one of the regular expressions,
-   the matching part is replaced by the replacement string for
-   display in the recent-files menu.
-   Example: My home directory is \"/users/mmc/nickel/\". I want to
-   replace it with \"~/\". I also want to replace the directory
-   \"/imports/teleservices/mmc/avc2/\", where I work a lot, with
-   \".../avc2/\". The list then looks like
-       (setq recent-files-filename-replacements
-             '((\"/users/mmc/nickel/\" . \"~/\")
-               (\"/imports/teleservices/mmc/avc2/\" . \".../avc2/\")))
-   Only the first match is replaced. So, if you have several
-   entries in this list that may match a filename simultaneously,
-   put the one you want to match (usually the most special) in
-   front of the others. The default is to replace the home
-   directory with \"~\".
-
-`recent-files-sort-function'
-   Contains a function symbol to sort the display of filenames in
-   the recent-files menu. Supplied are two functions,
-   'recent-files-dont-sort and 'recent-files-sort-alphabetically.
-   The first, which is the default, preserves the order of \"most
-   recent on top\". 
-
-`recent-files-permanent-submenu'
-   If this variable is non-nil, the permanent entries are put into
-   a separate submenu of the recent-files menu. The default is
-   nil.
-
-`recent-files-non-permanent-submenu'
-   If this variable is non-nil, the non-permanent entries are put
-   into a separate submenu of the recent-files menu. The default
-   is nil. (You can set both `recent-files-permanent-submenu' and
-   `recent-files-non-permanent-submenu' to t to have both lists in
-   separate submenus.)
-
-`recent-files-commands-submenu'
-   If this variable is non-nil, the commands if recent-files are
-   placed in a submenu of the recent-files menu. The default is
-   nil.
-
-`recent-files-commands-submenu-title'
-   If the commands are placed in a submenu, this string is used as
-   the title of the submenu. The default is \"Commands...\".
-
-`recent-files-actions-on-top'
-   If this variable is non-nil, the \"action\" menu entries (\"Make
-   <buffer> permanent\" etc.) are put on top of the menu. Otherwise
-   they appear below the file entries or submenus. The default is
-   nil.
-
-`recent-files-permanent-first'
-   If this variable is t, the permanent entries are put first in
-   the recent-files menu, i.e. above the non-permanent entries. If
-   the value is nil, non-permanent entries appear first. If the
-   value is neither t nor nil, the entries are sorted according to
-   recent-files-sort-function. The default is 'sort.
-
-`recent-files-find-file-command'
-   This variable contains to commandto execute when a file entry
-   is selected from the menu. Usually this will be `find-file',
-   which is the default.
-
-KNOWN BUG:
-  - recent-files overwrites the recent-files-save-file
-    unconditionally when Emacs exits. If you have two Emacs
-    processes running, the one exiting later will overwrite the
-    file without merging in the new entries from the other Emacs
-    process. This can be avoided by disabling the save on exit from
-    the menu."
-  :short-doc "`Recent Files' menu"
-  :enable 'recent-files-initialize)
-
-(define-behavior 'filladapt
-  "These functions enhance the default behavior of Emacs' Auto Fill
-mode and the commands `fill-paragraph', `lisp-fill-paragraph',
-`fill-region-as-paragraph' and `fill-region'.
-
-The chief improvement is that the beginning of a line to be
-filled is examined and, based on information gathered, an
-appropriate value for fill-prefix is constructed.  Also the
-boundaries of the current paragraph are located.  This occurs
-only if the fill prefix is not already non-nil.
-
-The net result of this is that blurbs of text that are offset
-from left margin by asterisks, dashes, and/or spaces, numbered
-examples, included text from USENET news articles, etc. are
-generally filled correctly with no fuss."
-  :short-doc "Adaptive (smart) filling"
-  :require 'filladapt
-  :enable  #'(lambda ()
-	       (setq-default filladapt-mode t)
-	       (mapc #'(lambda (buffer)
-			 (with-current-buffer buffer
-			   (unless filladapt-mode
-			     (filladapt-mode 1))))
-		     (buffer-list)))
-  :disable #'(lambda ()
-	       (setq-default filladapt-mode nil)
-	       (mapc #'(lambda (buffer)
-			 (with-current-buffer buffer
-			   (when filladapt-mode
-			     (filladapt-mode -1))))
-		     (buffer-list))))
+(define-behavior 'compose-mail
+  "Not documented."
+  :group 'internet
+  :commands
+  '(["Send %_Mail..." compose-mail]))