Mercurial > hg > xemacs-beta
changeset 100:4be1180a9e89 r20-1b2
Import from CVS: tag r20-1b2
line wrap: on
line diff
--- a/CHANGES-beta Mon Aug 13 09:13:58 2007 +0200 +++ b/CHANGES-beta Mon Aug 13 09:15:11 2007 +0200 @@ -1,4 +1,37 @@ -*- indented-text -*- +to 20.1 beta2 +-- First cut at MS Windows NT support Courtesy of David Hobley +-- itimer.el-1.01 Courtesy of Kyle Jones +-- hm--html-menus-5.2 +-- redo.el-1.01 +-- VM-6.15 +-- miscellaneous efs/dired fixes +-- OO-Browser-2.10 Courtesy of Bob Weiner +-- Yet another man.el Courtesy of jwz +-- Addition to sample.emacs Courtesy of jwz +-- additions/corrections to about.el +-- hyperbole-4.021 Courtesy of Bob Weiner +-- Restoration of reportmail.el Courtesy of jwz +-- Restoration of passwd.el Courtesy of jwz +-- AUC TeX-9.7i Courtesy of Per Abrahamsen +-- viper-2.93 Courtesy of Michael Kifer +-- ediff-2.64 Courtesy of Michael Kifer +-- edmacro.el-3.05 +-- detached-minibuf.el Courtesy of Alvin Shelton +-- whitespace-mode.el Courtesy of Heiko Muenkel +-- winmgr-mode.el Courtesy of David Konerding, Stefan Strobel & Barry Warsaw +-- Gnus-5.4.15 +-- custom-1.44 +-- error-message-string ported from Emacs 19.34. +-- fast-lock.el-3.11.01 Courtesy of Simon Marshall +-- lazy-lock.el-1.16 Courtesy of Simon Marshall +-- speedbar.el Courtesy of Eric Ludlam and Jens Lautenbacher +-- W3-3.0.60 +-- Miscellaneous bug fixes +-- igrep.el-2.56 Courtesy of Kevin Rodgers +-- frame-icon.el Courtesy of Michael Lamoureux and Bob Weiner +-- xrdb-mode.el-1.17 Courtesy of Barry Warsaw + to 20.1 beta1 -- New symbol `signal-error-on-buffer-boundary'. Set to nil to avoid lossage of zmacs region when moving against buffer boundaries. @@ -29,6 +62,6 @@ -- floating-toolbar.el courtesy of Kyle Jones [New] -- Initial Wnn/egg support and bug fixes courtesy of Jareth Hein [New] -- Gnus-5.4.12 Courtesy of Lars Magne Ingebrigtsen [Upgrade] --- custom-1.39 Courtesy of Per Abrahamsen [New] +-- custom-1.40 Courtesy of Per Abrahamsen [New] -- W3-3.0.59 Courtesy of William Perry -- VM-6.13 Courtesy of Kyle Jones [Upgrade]
--- a/ChangeLog Mon Aug 13 09:13:58 2007 +0200 +++ b/ChangeLog Mon Aug 13 09:15:11 2007 +0200 @@ -1,3 +1,16 @@ +Sun Feb 23 17:10:09 1997 Steven L Baur <steve@altair.xemacs.org> + + * XEmacs 20.1-b2 is released. + +Sat Feb 22 14:29:44 1997 Steven L Baur <steve@altair.xemacs.org> + + * XEmacs 19-15-b'95 is released. + +Thu Feb 20 12:40:57 1997 Jan Vroonhof <vroonhof@math.ethz.ch> + + * configure.in (with_xauth): Attempted correction of test for + libXmu on SunOS. + Sat Feb 15 14:11:03 1997 Steven L Baur <steve@altair.xemacs.org> * XEmacs 20.1-b1 is released.
--- a/configure Mon Aug 13 09:13:58 2007 +0200 +++ b/configure Mon Aug 13 09:15:11 2007 +0200 @@ -280,6 +280,8 @@ This is beta level code. --with-wnn6 Compile with support for WNN version 6 This is alpha level code. +--wnn-includes=DIR Search for WNN header files in DIR. +--wnn-libraries=DIR Search for WNN libraries in DIR. --with-i18n3 Compile with I18N level 3 (support for message translation). This doesn't currently work. @@ -445,6 +447,8 @@ native_sound_lib | \ x_includes | \ x_libraries | \ + wnn_includes | \ + wnn_libraries | \ site_includes | \ site_libraries | \ site_runtime_libraries ) @@ -3306,9 +3310,12 @@ :; fi + if test "${internal_cde_lib_found}" = "no" -a -f "/usr/dt/lib/libDtSvc.a"; then + internal_cde_lib_found="yes" + fi if test "${internal_cde_lib_found}" = "yes" ; then internal_cde_includes_found='no' - for arg in ${DEFS} /usr/include ; do + for arg in ${DEFS} /usr/include /usr/dt/include ; do if test -f `echo "${arg}/Dt/Dt.h" | sed 's/^\-I//'` ; then internal_cde_includes_found='yes' fi @@ -3331,6 +3338,13 @@ } +# having CDE implies Tooltalk +if test "${with_cde}" = "yes" -a \ + "${with_tooltalk}" != "no" -a \ + "${with_tooltalk}" != "none" ; then + with_tooltalk='yes' +fi + # # See if we can find OffiX. # @@ -3669,9 +3683,9 @@ :; fi } - # On SunOS4 we must kludge harder to try to detect Xmu + # On SunOS4 (and 5!) we must kludge harder to try to detect Xmu # Upgrade to autoconf 2 and use ac_check_lib - mrb - if test "${with_xmu}" != "yes" -a -n "$OPENWINHOME" ; then + if test "${with_xmu}" != "yes" ; then # begin expansion of ac_have_library ac_save_LIBS="${LIBS}" LIBS="${LIBS} -lXmu -lXt -lXext -lX11 -lm" @@ -4420,6 +4434,7 @@ \${ac_eA}XIM_MOTIF\${ac_eB}XIM_MOTIF\${ac_eC}1\${ac_eD} " } + fi # wnn6 implies wnn support if test "$with_wnn6" = "yes" ; then @@ -4435,6 +4450,26 @@ done fi +# +# set defaults for finding WNN includes and libs +# +if test "${with_wnn}" = "yes" ; then + for arg in "-I${wnn_includes}" "-I/usr/X11R6/include" + do + if test -f `echo "${arg}/wnnerror.h" | sed 's/^\-I//'` ; then + C_SWITCH_SITE="${C_SWITCH_SITE} ${arg}" + wnn_includes=${arg} + fi + done + for arg in "-L${wnn_libraries}" "-I/usr/X11R6/lib" + do + if test -f `echo "${arg}/libwnn.a" | sed 's/^\-L//'` ; then + LD_SWITCH_SITE="${LD_SWITCH_SITE} ${arg}" + wnn_libraries=${arg} + fi + done +fi + # If netdb.h doesn't declare h_errno, we must declare it by hand. test -n "$silent" || echo "checking for declaration of h_errno in netdb.h" cat > conftest.${ac_ext} <<EOF @@ -5768,15 +5803,23 @@ fi +if test "${with_cde}" = "yes" ; then + if test -f "/usr/dt/include/Dt/Dt.h" ; then + C_SWITCH_X_SITE="${C_SWITCH_X_SITE} -I/usr/dt/include" + fi + if test -f "/usr/dt/lib/libDtSvc.a" ; then + LD_SWITCH_X_SITE="${LD_SWITCH_X_SITE} -L/usr/dt/lib" + fi +fi + if test "${with_tooltalk}" = "yes" ; then - for arg in ${DEFS} "-I/usr/include" "-I${OPENWINHOME-/usr/openwin}/include" + for arg in "-I/usr/include/desktop" "-I${OPENWINHOME-/usr/openwin}/include/desktop" "-I/usr/dt/include/Tt" do - if test -f `echo "${arg}/desktop/tt_c.h" | sed 's/^\-I//'` ; then - C_SWITCH_X_SITE="${C_SWITCH_X_SITE} ${arg}/desktop" + if test -f `echo "${arg}/tt_c.h" | sed 's/^\-I//'` ; then + C_SWITCH_X_SITE="${C_SWITCH_X_SITE} ${arg}" fi done - - for arg in ${LIBS} "-L/usr/lib" "-L${OPENWINHHOME-/usr/openwin}/lib" + for arg in "-L/usr/lib" "-L${OPENWINHHOME-/usr/openwin}/lib" "-L/usr/dt/lib" do case "${arg}" in -L*) if test -f `echo "${arg}/libtt.a" | sed 's/^\-L//'` ; then @@ -6927,7 +6970,10 @@ elif test -n "$site_runtime_libraries"; then echo " Additional libraries: ${site_runtime_libraries}" fi - +if test "$with_wnn"; then + echo " Finding WNN includes with: ${wnn_includes}" + echo " Loading WNN libs with: ${wnn_libraries}" +fi test "$with_socks" = yes && echo " Compiling in support for SOCKS." test "$with_term" = yes && echo " Compiling in support for TERM." test "$with_xauth" = yes && echo " Compiling in support for XAUTH." @@ -6958,7 +7004,6 @@ test "$with_ncurses" = yes && echo " Compiling in support for ncurses." test "$with_socks" = yes && echo " Compiling in support for SOCKS." -test "$with_tooltalk" = yes && echo " Compiling in support for ToolTalk." test "$with_mule" = yes && echo " Compiling in Mule (multi-lingual) support." test "$with_xim" != no && echo " Compiling in XIM (X11R5+ I18N input method) support." @@ -6970,6 +7015,7 @@ test "$with_i18n3" = yes && echo " Compiling in I18N support, level 3 (doesn't currently work)." test "$with_cde" = yes && echo " Compiling in support for CDE." +test "$with_tooltalk" = yes && echo " Compiling in support for ToolTalk." test "$with_offix" = yes && echo " Compiling in support for OffiX." test "$with_mocklisp" = yes && echo " Compiling in support for Mocklisp." test "$with_sparcworks" = yes && echo " Compiling in support for SparcWorks."
--- a/configure.in Mon Aug 13 09:13:58 2007 +0200 +++ b/configure.in Mon Aug 13 09:15:11 2007 +0200 @@ -296,6 +296,8 @@ This is beta level code. --with-wnn6 Compile with support for WNN version 6 This is alpha level code. +--wnn-includes=DIR Search for WNN header files in DIR. +--wnn-libraries=DIR Search for WNN libraries in DIR. --with-i18n3 Compile with I18N level 3 (support for message translation). This doesn't currently work. @@ -461,6 +463,8 @@ native_sound_lib | \ x_includes | \ x_libraries | \ + wnn_includes | \ + wnn_libraries | \ site_includes | \ site_libraries | \ site_runtime_libraries ) @@ -2271,9 +2275,12 @@ "${with_cde}" != "yes" ; then internal_cde_lib_found='no' AC_HAVE_LIBRARY(-lDtSvc, internal_cde_lib_found='yes') + if test "${internal_cde_lib_found}" = "no" -a -f "/usr/dt/lib/libDtSvc.a"; then + internal_cde_lib_found="yes" + fi if test "${internal_cde_lib_found}" = "yes" ; then internal_cde_includes_found='no' - for arg in ${DEFS} /usr/include ; do + for arg in ${DEFS} /usr/include /usr/dt/include ; do if test -f `echo "${arg}/Dt/Dt.h" | sed 's/^\-I//'` ; then internal_cde_includes_found='yes' fi @@ -2285,6 +2292,13 @@ fi IF_YES_AC_DEFINE(with_cde, HAVE_CDE) +# having CDE implies Tooltalk +if test "${with_cde}" = "yes" -a \ + "${with_tooltalk}" != "no" -a \ + "${with_tooltalk}" != "none" ; then + with_tooltalk='yes' +fi + # # See if we can find OffiX. # @@ -2369,9 +2383,9 @@ if test "${window_system}" != "none" ; then if test "${with_xmu}" != "no" ; then test "${with_xmu}" != "yes" && { AC_HAVE_LIBRARY(-lXmu, with_xmu="yes") } - # On SunOS4 we must kludge harder to try to detect Xmu + # On SunOS4 (and 5!) we must kludge harder to try to detect Xmu # Upgrade to autoconf 2 and use ac_check_lib - mrb - if test "${with_xmu}" != "yes" -a -n "$OPENWINHOME" ; then + if test "${with_xmu}" != "yes" ; then # begin expansion of ac_have_library ac_save_LIBS="${LIBS}" LIBS="${LIBS} -lXmu -lXt -lXext -lX11 -lm" @@ -2652,6 +2666,26 @@ done fi +# +# set defaults for finding WNN includes and libs +# +if test "${with_wnn}" = "yes" ; then + for arg in "-I${wnn_includes}" "-I/usr/X11R6/include" + do + if test -f `echo "${arg}/wnnerror.h" | sed 's/^\-I//'` ; then + C_SWITCH_SITE="${C_SWITCH_SITE} ${arg}" + wnn_includes=${arg} + fi + done + for arg in "-L${wnn_libraries}" "-I/usr/X11R6/lib" + do + if test -f `echo "${arg}/libwnn.a" | sed 's/^\-L//'` ; then + LD_SWITCH_SITE="${LD_SWITCH_SITE} ${arg}" + wnn_libraries=${arg} + fi + done +fi + # If netdb.h doesn't declare h_errno, we must declare it by hand. AC_COMPILE_CHECK(declaration of h_errno in netdb.h, [#include <netdb.h>], @@ -2879,15 +2913,23 @@ AC_HEADER_EGREP(AuXtErrorJump,audio/Xtutil.h, , old_nas=true) fi +if test "${with_cde}" = "yes" ; then + if test -f "/usr/dt/include/Dt/Dt.h" ; then + C_SWITCH_X_SITE="${C_SWITCH_X_SITE} -I/usr/dt/include" + fi + if test -f "/usr/dt/lib/libDtSvc.a" ; then + LD_SWITCH_X_SITE="${LD_SWITCH_X_SITE} -L/usr/dt/lib" + fi +fi + if test "${with_tooltalk}" = "yes" ; then - for arg in ${DEFS} "-I/usr/include" "-I${OPENWINHOME-/usr/openwin}/include" + for arg in "-I/usr/include/desktop" "-I${OPENWINHOME-/usr/openwin}/include/desktop" "-I/usr/dt/include/Tt" do - if test -f `echo "${arg}/desktop/tt_c.h" | sed 's/^\-I//'` ; then - C_SWITCH_X_SITE="${C_SWITCH_X_SITE} ${arg}/desktop" + if test -f `echo "${arg}/tt_c.h" | sed 's/^\-I//'` ; then + C_SWITCH_X_SITE="${C_SWITCH_X_SITE} ${arg}" fi done - - for arg in ${LIBS} "-L/usr/lib" "-L${OPENWINHHOME-/usr/openwin}/lib" + for arg in "-L/usr/lib" "-L${OPENWINHHOME-/usr/openwin}/lib" "-L/usr/dt/lib" do case "${arg}" in -L*) if test -f `echo "${arg}/libtt.a" | sed 's/^\-L//'` ; then @@ -3130,7 +3172,10 @@ elif test -n "$site_runtime_libraries"; then echo " Additional libraries: ${site_runtime_libraries}" fi - +if test "$with_wnn"; then + echo " Finding WNN includes with: ${wnn_includes}" + echo " Loading WNN libs with: ${wnn_libraries}" +fi test "$with_socks" = yes && echo " Compiling in support for SOCKS." test "$with_term" = yes && echo " Compiling in support for TERM." test "$with_xauth" = yes && echo " Compiling in support for XAUTH." @@ -3161,7 +3206,6 @@ test "$with_ncurses" = yes && echo " Compiling in support for ncurses." test "$with_socks" = yes && echo " Compiling in support for SOCKS." -test "$with_tooltalk" = yes && echo " Compiling in support for ToolTalk." test "$with_mule" = yes && echo " Compiling in Mule (multi-lingual) support." test "$with_xim" != no && echo " Compiling in XIM (X11R5+ I18N input method) support." @@ -3173,6 +3217,7 @@ test "$with_i18n3" = yes && echo " Compiling in I18N support, level 3 (doesn't currently work)." test "$with_cde" = yes && echo " Compiling in support for CDE." +test "$with_tooltalk" = yes && echo " Compiling in support for ToolTalk." test "$with_offix" = yes && echo " Compiling in support for OffiX." test "$with_mocklisp" = yes && echo " Compiling in support for Mocklisp." test "$with_sparcworks" = yes && echo " Compiling in support for SparcWorks."
--- a/etc/COOKIES Mon Aug 13 09:13:58 2007 +0200 +++ b/etc/COOKIES Mon Aug 13 09:15:11 2007 +0200 @@ -1,3 +1,4 @@ +Original annotation: [Someone sent this in from California, and we decided to extend our campaign against information hoarding to recipes as well as software. (Recipes are the closest thing, not involving computers, @@ -8,150 +9,86 @@ Therefore, this recipe can be thought of as a compatible replacement. We have reports that the cookies it makes are pretty good.] -Someone at PG&E called the Mrs. Fields Cookie office -and requested the recipe for her cookies. They asked -her for her charge card number, and she gave it to them -thinking the cost would be $15 to $25. It turned out -to be $200! +New annotation for XEmacs 19.15/20.1: +[This file originally contained SPAM. It has been updated for XEmacs. -sb] -Therefore, this person is giving the recipe to anyone -and everyone she knows (and doesn't know) so that -someone can get use of her $200. Anyway, just keep -passing it on. - -Cream together: 2 cups butter - 2 cups sugar - 2 cups brown sugar +From: jhayward@math.uiuc.edu (Jonathan Hayward) +Subject: A delicacy of delicacies +Date: 19 Feb 1997 16:30:02 -0800 -Add: 4 eggs - 2 tsp. vanilla +Okay, everyone... a true story of justice in the good old U.S. of A. Thought +y'all might enjoy this; if nothing else, it shows internet justice, if it can +be called that. -Mis together in -separate bowl: 4 cups flour - 5 cups oatmeal (put small - amounts of oatmeal in blender until it turns to - powder. Measure out 5 cups of oatmeal and only - "powderize" that, NOT 5 cups "powderized" oatmeal) - - 1 tsp salt - 2 tsp baking powder - 2 tsp baking soda - -Mix: All of the above +On a whim, I decided to visit Hormel's main plant, and, after a tour, we were +allowed to taste samples of their various products. And there was one... I +don't think that words can describe how it tasted. It was a meat product, but +to call it meat would not do it justice. The memory of the taste brings tears +to my eyes. -Add: 24 oz. bag of chocolate chips and - 1 finely grated 8 oz Hershey bar (plain) - -Add: 3 cups chopped nuts (any kind) - -Bake on greased cookie sheet (make golf ball sized balls) and -bake about two inches apart. Bake at 350 degrees for 8 - 10 -minutes. DO NOT OVERBAKE. Makes 112. - -From: ucdavis!lll-lcc!hplabs!parcvax!bane@ucbvax.berkeley.edu (John R. Bane) -Subject: Re: free cookie foundation? +I like to cook in my spare time, so I asked the tour guide if they could give +me the recipe. She frowned, and said, "I'm afraid not." Well, I said, would +you let me buy the recipe? With a cute smile, she said, "Yes." I asked how +much, and she responded, "Two-fifty." I said with approval, just add it to my +tab. -Hi! I "stole" your very expensive cookie recipe off the net. If you -want to send me your SnailMail address, I'll be glad to send you a -dollar (I would like to suggest this to the net, but I think there is -some netiquette rule against asking for money - or is that only money -for oneself?) to help defray the cost (it's not much, but if EVERYone -who took the recipe sent you a dollar, it would help). - -Here also is another cookie recipe which I'm very fond of. +Thirty days later, I received my VISA statement from Hormel and it was $285.00. +I looked again and remembered I had only spent $9.95 for a couple of tins, and +about $20.00 for an anti-nauseant. As I glanced at the bottom of the +statement, it said, "Recipe -- $250.00." Boy, was I upset! I called Hormel's +Accounting Dept. and told them the waitress said it was "two-fifty," and I did +not realize she meant $250.00 for a recipe. I asked them to take back the +recipe and reduce my bill and they said they were sorry, but because all the +recipes were this expensive so not just everyone could duplicate any of our +delicacies... the bill would stand. -Makes 6-8 dozen -Bake at 375 degrees for ~10 min. - -Cream together: - -1 cup shortening (I use Weight Watcher's Reduced Calorie Margarine!) -1/4 cup peanut butter (I recommend the non-sugared kind) -1/2 cup sugar -1/2 cup brown sugar -2 eggs -1 teaspoon vanilla - -Add: +I waited, thinking of how I could get even or even try and get any of my money +back. I just said, "Okay, you folks got my $250.00 and now I'm going to have +$250.00 worth of fun." I told her that I was going to see to it that every +gourmet will have a $250.00 recipe from Hormel for nothing. She replied, "I +wish you wouldn't do this." I said, "I'm sorry but this is the only way I feel +I could get even," and I will. -1/2 cup flour -1 teaspoon soda -1/2 teaspoon salt -2 cups rolled oats (I use the 5-min variety) -1-2 cups chocolate chips (I use 2 cups semi-sweet - ummmm!) -1 cup nuts (I use pecan pieces - don't get them crushed, or the extra - oil will make greasy cookies) -1 cup shredded or flaked coconut - -(The nuts were listed as optional and I added the coconut myself, but -I really love them there! You could also add things like m&m's, or -raisins (I don't care for raisins in cookies, but you might). I've -always wanted to try banana chips.) - -Mix well. Drop by teaspoonfuls on greased cookie sheet (I use pam). -Bake at 375 degrees for approx. 10 min. +So, here it is, and please pass it on to someone else or run a few copies... I +paid for it; now you can have it for free. -My aunt found this recipe in an Amish book called something like -"Eating Well When The Whole World Is Starving," and although I thought -a cookie recipe was a bit odd for a book like that, they are about the -healthiest a cookie is ever likely to get. - -They are also very easy to make (no blending, sifting, rolling, etc.) -and extremely delicious. I get rave reviews and recipe requests whenever -I make them. - - - rene - -Chocolate Chip Cookies - Glamorous, crunchy, rich with chocolate bits & nuts. - -Also known as "Toll House" Cookies ... from Kenneth and Ruth Wakefield's -charming New England Toll House on the outskirts of Whitman, Massachusetts. -These cookies were first introduced to American homemakers in 1939 through -our series of radio talks on "Famous Foods From Famous Eating Places." + (Trust me; this recipe is so good that you will want to make as much as + you can at once, which is why I list so much. This may be doubled, of + course): + 1 pig carcass (all parts that are technically digestible but can't be + used for any other purpose, even hot dogs) + 1 gallon castor oil + 1 salt lick + 1 gallon vomit + 16 lbs recycled plastic -Mix Thoroughly : - 2/3 cup soft shortening ( part butter ) - 1/2 cup granulated sugar - 1/2 cup brown sugar ( packed ) - 1 egg - 1 tsp vanilla - -Sift together and stir in : - 1-1/2 cups sifted flour (*) - 1/2 tsp soda - 1/2 tsp salt - -Stir in : - 1/2 cup cut-up nuts - 6 oz package of semi-sweet chocolate pieces ( about 1-1/4 cups ) - - -(*) for a softer, more rounded cookie, use 1-3/4 cups sifted flour. - + The cooking technique is simple. Use a blender, branch shredder, or + anything else handy to shred the carcass, salt, and plastic; mix evenly + in a sufficiently large container. There are a variety of ways to cook + it; in experimenting, I have found the best option to be slow boiling + in motor oil. But the specific method of cooking doesn't matter much; + with such an extraordinary combination of ingredients, nobody will know + the difference. When it is cooked, compress it into small tins (at + Hormel, it came in dark blue tins with four large white or yellow + letters -- I won't specify which four letter word, because there are + some people who find it to be more obscene and offensive than a certain + crude word for sex), and open and enjoy at leisure. You don't need to + worry about it spoiling; bacteria won't touch it, and at any rate + there is a specific reason why it _can't_ go bad. Makes at least 112 + tins. -Drop rounded teaspoonfuls about 2" apart on ungreased baking sheet. Bake until -delicately browned ... cookies should still be soft. Cool slightly before you -remove them from the baking sheet. +Have fun!! This is not a joke --- this is a true story. That's it. Please, +pass it along to everyone you know, single people, mailing lists, etc... -Temperature: 375 F. ( modern oven ) -Time: bake 8 - 10 minutes -Amount: 4 - 5 dozen 2" cookies - - -===== - -Personal comments : +Oh, and one last thing I almost forgot... -I find it tastes better with a mixture of shortening and butter, as they say. - -You don't need << all >> of that sugar, and it can be whatever color you want. - -The nuts are optional. Feel free to play with the recipe. I put oatmeal in it, -reducing flour accordingly, and sometimes cinnamon. +I feel a little guilty for presuming to speak about how to best serve a +delicacy so wonderful -- the final word must go to gourmets and chefs with a +taste far more refined than mine -- but there are a thousand ways in which it +may be served, and, after a little experimenting, I really HAVE to share with +you my personal favorite: -I also find it useful to grease the cookie sheets. - -I think I'm going to go bake some now ... - --- richard - + Open one tin; slice thinly. Marinate in pesto sauce, with a touch of + thyme. Roast slowly over an open flame (I have found wood -- + preferably oak -- to work best), then THROW THE STUPID THING OUT THE + WINDOW AND COOK YOURSELF A STEAK.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/RIP.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define dead_width 64 +#define dead_height 54 +static char dead_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf5, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x5e, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x13, + 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0xec, 0x22, 0x22, 0x02, 0x00, 0x00, + 0x00, 0x00, 0xd6, 0x88, 0x88, 0x04, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x44, + 0x44, 0x0c, 0x00, 0x00, 0x00, 0x80, 0x1a, 0x11, 0x11, 0x19, 0x00, 0x00, + 0x00, 0x80, 0x2d, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x40, 0x8b, 0x88, + 0x88, 0x28, 0x00, 0x00, 0x00, 0xc0, 0x45, 0x44, 0x44, 0x44, 0x00, 0x00, + 0x00, 0x60, 0x17, 0x11, 0x11, 0x51, 0x00, 0x00, 0x00, 0xa0, 0x25, 0x22, + 0x22, 0x62, 0x00, 0x00, 0x00, 0x70, 0x8b, 0x88, 0x88, 0x88, 0x00, 0x00, + 0x00, 0xf0, 0x46, 0x44, 0x44, 0xc4, 0x00, 0x00, 0x00, 0x50, 0x13, 0x11, + 0x11, 0x91, 0x00, 0x00, 0x00, 0xb0, 0x22, 0x22, 0x22, 0xa2, 0x00, 0x00, + 0x00, 0x50, 0x8b, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0xb0, 0xfe, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x00, 0xb0, 0xf6, 0x81, 0xc7, 0xcf, 0x00, 0x00, 0x00, 0x50, 0x67, 0x02, + 0x83, 0xd9, 0x00, 0x00, 0x00, 0xb0, 0x66, 0x06, 0x83, 0xd9, 0x00, 0x00, + 0x00, 0x50, 0x67, 0x06, 0x83, 0xd9, 0x00, 0x00, 0x00, 0xb0, 0x66, 0x02, + 0x83, 0xd9, 0x00, 0x00, 0x00, 0x50, 0xe7, 0x01, 0x83, 0xcf, 0x00, 0x00, + 0x00, 0xb0, 0x66, 0x01, 0x83, 0xc1, 0x00, 0x00, 0x00, 0x50, 0x67, 0x03, + 0x83, 0xc1, 0x00, 0x00, 0x00, 0xb0, 0x66, 0x03, 0x83, 0xc1, 0x00, 0x00, + 0x00, 0x50, 0x67, 0x2e, 0x93, 0xc9, 0x00, 0x00, 0x00, 0xb0, 0xf6, 0xac, + 0xd7, 0xcb, 0x00, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x00, 0xb0, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x50, 0x13, 0x11, + 0x11, 0x91, 0x00, 0x00, 0x00, 0xb0, 0x22, 0x22, 0x22, 0xa2, 0x00, 0x00, + 0x00, 0x50, 0x8b, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0xb1, 0x46, 0x44, + 0x44, 0xc4, 0x00, 0x00, 0x00, 0x59, 0x13, 0x11, 0x11, 0x91, 0x00, 0x00, + 0x80, 0xba, 0x22, 0x22, 0x22, 0xa2, 0x10, 0x00, 0x80, 0x56, 0x8b, 0x88, + 0x88, 0x88, 0x10, 0x00, 0x80, 0xf6, 0x67, 0x44, 0x44, 0xc6, 0x38, 0x00, + 0x20, 0x5d, 0x33, 0x15, 0x51, 0xd3, 0x38, 0x01, 0x40, 0xfd, 0xb3, 0xaf, + 0xb2, 0xa2, 0xd5, 0x00, 0x40, 0xf5, 0xbb, 0xbe, 0xba, 0xeb, 0xf5, 0x00, + 0x80, 0xf9, 0xd7, 0x75, 0x55, 0xd6, 0xeb, 0x00, 0x80, 0xaa, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x00, 0x00, 0x87, 0xe9, 0xea, 0x56, 0xea, 0x35, 0x01, + 0x00, 0x07, 0x69, 0xea, 0xba, 0x16, 0x2b, 0x01, 0x00, 0x00, 0x30, 0x5c, + 0x92, 0x7a, 0x14, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x6a, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/abacus.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define abicus_width 64 +#define abicus_height 54 +static char abicus_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x2e, 0x0e, 0x87, 0x83, + 0xe0, 0x70, 0x38, 0x2e, 0x2e, 0x9d, 0x4e, 0x87, 0xd0, 0xe9, 0x74, 0x2e, + 0x2e, 0x9f, 0xcf, 0x87, 0xf0, 0xf9, 0x7c, 0x2e, 0x2e, 0x0e, 0x87, 0x83, + 0xe0, 0x70, 0x38, 0x2e, 0x2e, 0x9d, 0x0e, 0x81, 0xd0, 0xe9, 0x74, 0x2e, + 0x2e, 0x9f, 0x0f, 0xc1, 0xf1, 0xf9, 0x7c, 0x2e, 0x2e, 0x0e, 0x07, 0xa1, + 0xe3, 0x70, 0x38, 0x2e, 0x2e, 0x04, 0x02, 0xe1, 0x43, 0x20, 0x10, 0x2e, + 0x2e, 0x04, 0x82, 0xc3, 0x41, 0x20, 0x10, 0x2e, 0x2e, 0x04, 0x42, 0xa7, + 0x43, 0x20, 0x10, 0x2e, 0x3e, 0x04, 0xc2, 0xe7, 0x43, 0x20, 0x10, 0x3e, + 0x22, 0x04, 0x82, 0xc3, 0x41, 0x20, 0x10, 0x22, 0xea, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2b, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, + 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x20, 0xea, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2b, 0x22, 0x04, 0x82, 0x83, 0x40, 0x20, 0x10, 0x22, + 0x3e, 0x04, 0x42, 0x87, 0x40, 0x20, 0x10, 0x3e, 0x2e, 0x04, 0xc2, 0x87, + 0x40, 0x20, 0x10, 0x2e, 0x2e, 0x04, 0x82, 0x83, 0x40, 0x20, 0x10, 0x2e, + 0x2e, 0x04, 0x42, 0x87, 0x40, 0x20, 0x10, 0x2e, 0x2e, 0x04, 0xc2, 0x87, + 0x40, 0x20, 0x10, 0x2e, 0x2e, 0x04, 0x82, 0x83, 0x40, 0x20, 0x10, 0x2e, + 0x2e, 0x04, 0x02, 0x81, 0x40, 0x20, 0x10, 0x2e, 0x2e, 0x0e, 0x07, 0xc1, + 0xe1, 0x70, 0x38, 0x2e, 0x2e, 0x9d, 0x0e, 0xa1, 0xd3, 0xe9, 0x74, 0x2e, + 0x2e, 0x9f, 0x0f, 0xe1, 0xf3, 0xf9, 0x7c, 0x2e, 0x2e, 0x0e, 0x07, 0xc1, + 0xe1, 0x70, 0x38, 0x2e, 0x2e, 0x9d, 0x0e, 0xa1, 0xd3, 0xe9, 0x74, 0x2e, + 0x2e, 0x9f, 0x0f, 0xe1, 0xf3, 0xf9, 0x7c, 0x2e, 0x2e, 0x0e, 0x87, 0xc3, + 0xe1, 0x70, 0x38, 0x2e, 0x2e, 0x9d, 0x4e, 0xa7, 0xd3, 0xe9, 0x74, 0x2e, + 0x2e, 0x9f, 0xcf, 0xe7, 0xf3, 0xf9, 0x7c, 0x2e, 0x2e, 0x0e, 0x87, 0xc3, + 0xe1, 0x70, 0x38, 0x2e, 0x2e, 0x9d, 0x4e, 0xa7, 0xd3, 0xe9, 0x74, 0x2e, + 0x2e, 0x9f, 0xcf, 0xe7, 0xf3, 0xf9, 0x7c, 0x2e, 0x2e, 0x0e, 0x87, 0xc3, + 0xe1, 0x70, 0x38, 0x2e, 0x2e, 0x9d, 0x4e, 0xa7, 0xd3, 0xe9, 0x74, 0x2e, + 0x2e, 0x9f, 0xcf, 0xe7, 0xf3, 0xf9, 0x7c, 0x2e, 0x2e, 0x0e, 0x87, 0xc3, + 0xe1, 0x70, 0x38, 0x2e, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/archie.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define archer_width 64 +#define archer_height 54 +static char archer_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0x1f, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x01, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x0e, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0xd0, 0x03, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x01, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0xd0, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x80, + 0x7f, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0xe0, 0xff, 0x01, 0x00, 0x00, + 0xe8, 0x00, 0x00, 0xf0, 0xff, 0x07, 0x00, 0x00, 0xe8, 0x00, 0x00, 0xf8, + 0xff, 0x07, 0x00, 0x00, 0x68, 0x00, 0x00, 0xf8, 0xff, 0x0f, 0x1a, 0x00, + 0x68, 0x00, 0x00, 0x90, 0xff, 0x0f, 0xad, 0x00, 0x68, 0x00, 0x00, 0x18, + 0xf9, 0x0f, 0x52, 0x01, 0xfc, 0x0f, 0x00, 0x08, 0xfb, 0x8f, 0x29, 0x01, + 0x74, 0xfc, 0x07, 0xb0, 0xf9, 0x47, 0xb4, 0x00, 0x8a, 0x00, 0xfe, 0x28, + 0xfd, 0x87, 0x92, 0x00, 0x82, 0x00, 0x80, 0x07, 0xe6, 0xc7, 0x49, 0x00, + 0xc4, 0x01, 0x00, 0x0c, 0xe0, 0x87, 0x3e, 0x00, 0x02, 0x3e, 0x00, 0x10, + 0xf0, 0x43, 0x0a, 0x00, 0x3a, 0xc0, 0x01, 0x10, 0xa1, 0x3e, 0x05, 0x00, + 0x76, 0x20, 0xfe, 0xff, 0x10, 0x96, 0x02, 0x00, 0xba, 0x00, 0xf0, 0x37, + 0x00, 0x57, 0xff, 0x03, 0x1a, 0x23, 0xf8, 0x73, 0xc0, 0x6f, 0x01, 0x0c, + 0x1a, 0x0c, 0xf8, 0xf3, 0xff, 0xab, 0xe7, 0x31, 0x1a, 0x30, 0xf8, 0xf3, + 0xff, 0xd5, 0x1f, 0x26, 0x1a, 0xc0, 0xf9, 0xf3, 0xff, 0xea, 0x0f, 0x40, + 0x3a, 0x00, 0xf6, 0xf7, 0x93, 0xf5, 0x1f, 0x40, 0x3a, 0x00, 0xe0, 0xe7, + 0x71, 0xfa, 0x1f, 0x21, 0x3a, 0x00, 0x00, 0xe6, 0xa3, 0xff, 0x8f, 0x1c, + 0x7a, 0x00, 0x00, 0xee, 0x05, 0xe0, 0xf7, 0x03, 0x74, 0x00, 0x00, 0xcc, + 0x09, 0xe5, 0x03, 0x00, 0x74, 0x00, 0x00, 0x8e, 0x09, 0xe8, 0x00, 0x00, + 0xf4, 0x00, 0x00, 0x9d, 0x23, 0x70, 0x00, 0x00, 0xe8, 0x01, 0x80, 0xbc, + 0x14, 0x78, 0x00, 0x00, 0xd0, 0x01, 0x40, 0xbc, 0xe6, 0x7f, 0x00, 0x00, + 0xa0, 0x03, 0x30, 0x3c, 0x5d, 0x7c, 0x00, 0x00, 0x40, 0x0e, 0x08, 0x7c, + 0x96, 0x3c, 0x00, 0x00, 0x80, 0x0d, 0x04, 0x7c, 0x84, 0x3e, 0x00, 0x00, + 0x00, 0x1a, 0x03, 0x3c, 0x83, 0x3f, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x5c, + 0x53, 0x3f, 0x00, 0x00, 0x00, 0x70, 0x00, 0x9c, 0x84, 0x1c, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x1c, 0x81, 0x11, 0x00, 0x00, 0x00, 0x18, 0x00, 0x0c, + 0xe9, 0x1f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x0c, 0xc0, 0x0f, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/batman.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,47 @@ +#define batman_icon_width 64 +#define batman_icon_height 64 + +static char batman_icon_bits[] = { + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0xf4, 0xff, 0x44, 0x44, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x07, 0x00, 0x11, 0x11, 0x11, 0xd1, + 0xff, 0xff, 0x1f, 0x11, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x7f, 0x00, + 0x44, 0x44, 0x44, 0xfc, 0x2f, 0x2a, 0xff, 0x44, 0x00, 0x00, 0x00, 0xff, + 0xd9, 0xbe, 0xfd, 0x01, 0x11, 0x11, 0xd1, 0x7f, 0xf1, 0xff, 0xf3, 0x13, + 0x00, 0x00, 0xe0, 0x4f, 0xfd, 0xff, 0xf7, 0x03, 0x44, 0x44, 0xf4, 0x23, + 0xff, 0xff, 0xef, 0x47, 0x00, 0x00, 0xfc, 0xa9, 0xff, 0xff, 0xaf, 0x07, + 0x11, 0x11, 0x7e, 0xf3, 0xff, 0xff, 0x9f, 0x1f, 0x00, 0x00, 0x3f, 0xdc, + 0xff, 0xff, 0x7f, 0x0f, 0x44, 0xc4, 0x9f, 0xa6, 0xfe, 0xff, 0x3f, 0x4f, + 0x00, 0xc0, 0x47, 0x29, 0xfc, 0xff, 0xff, 0x0e, 0x11, 0xf1, 0x93, 0x15, + 0xf9, 0xff, 0x7f, 0x17, 0x00, 0xf0, 0x69, 0x00, 0xf8, 0xff, 0x7f, 0x0a, + 0x44, 0xfc, 0xd0, 0x44, 0xf4, 0xff, 0x7f, 0x57, 0x00, 0x78, 0xca, 0x11, + 0xf0, 0xff, 0xff, 0x02, 0x11, 0x7d, 0xd5, 0x03, 0xf9, 0xff, 0x7f, 0x15, + 0x00, 0x3e, 0xe0, 0x4f, 0xf8, 0xff, 0x7f, 0x02, 0x44, 0x9d, 0xfe, 0x3f, + 0xfc, 0xff, 0x7f, 0x55, 0x00, 0x0c, 0xfd, 0xff, 0xff, 0x7f, 0xfc, 0x00, + 0x11, 0x57, 0xf8, 0xff, 0xff, 0x3f, 0x79, 0x15, 0x40, 0x02, 0xf1, 0xff, + 0xff, 0x1f, 0xf8, 0x04, 0x04, 0x4b, 0xe4, 0xff, 0xff, 0x5f, 0x34, 0x55, + 0x20, 0x01, 0xe0, 0xff, 0xff, 0x1f, 0xb0, 0x04, 0x81, 0x10, 0xd1, 0xff, + 0xff, 0x1f, 0x11, 0x16, 0x80, 0x1a, 0xc0, 0xff, 0xff, 0x1f, 0xd4, 0x0e, + 0x54, 0x98, 0x84, 0xff, 0xff, 0x5f, 0x62, 0x46, 0x40, 0x3c, 0x80, 0xff, + 0xff, 0x00, 0x88, 0x0e, 0x49, 0x3d, 0x91, 0xff, 0x7f, 0x15, 0x51, 0x17, + 0x30, 0x7e, 0x84, 0xff, 0x7f, 0x40, 0x54, 0x07, 0x64, 0xfe, 0xc0, 0xff, + 0x7f, 0x35, 0xb3, 0x43, 0xb8, 0xfe, 0xf7, 0xff, 0x7f, 0x80, 0xda, 0x03, + 0x35, 0xff, 0xff, 0xff, 0x7f, 0x55, 0xd5, 0x13, 0x7c, 0xff, 0xff, 0xff, + 0xff, 0x50, 0xed, 0x01, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xa5, 0xea, 0x44, + 0xbc, 0xff, 0xff, 0xff, 0xe0, 0x9d, 0xf6, 0x00, 0x3d, 0xff, 0xff, 0x7f, + 0xc5, 0x53, 0x7b, 0x11, 0xbc, 0xff, 0xff, 0x7f, 0x48, 0xdf, 0x7d, 0x00, + 0x7c, 0xff, 0xff, 0x7f, 0xa5, 0xf6, 0x7e, 0x44, 0xbc, 0xff, 0xff, 0x7f, + 0x90, 0xaf, 0x1e, 0x00, 0x3d, 0xff, 0xff, 0x7f, 0xd9, 0x7d, 0x1f, 0x11, + 0xfc, 0xff, 0xff, 0x01, 0x54, 0xb5, 0x07, 0x00, 0x3c, 0xff, 0xff, 0x54, + 0x29, 0xdb, 0x47, 0x44, 0x7c, 0xff, 0x7f, 0xa0, 0xdc, 0xee, 0x03, 0x00, + 0x79, 0xff, 0x7f, 0x11, 0x75, 0xf7, 0x11, 0x11, 0x78, 0xfe, 0x7f, 0xc8, + 0x56, 0x7b, 0x00, 0x00, 0xfc, 0xfe, 0xff, 0x24, 0xfb, 0x7e, 0x44, 0x44, + 0xf0, 0xfc, 0xff, 0xe3, 0x6e, 0x1f, 0x00, 0x00, 0xf1, 0xfd, 0xff, 0x3f, + 0xbb, 0x1f, 0x11, 0x11, 0xe0, 0xf3, 0xff, 0x4f, 0xef, 0x07, 0x00, 0x00, + 0xe4, 0xef, 0xff, 0xf7, 0xfb, 0x45, 0x44, 0x44, 0xc0, 0x9f, 0xb5, 0xaa, + 0xfe, 0x00, 0x00, 0x00, 0x91, 0x7f, 0x55, 0xf5, 0x3f, 0x11, 0x11, 0x11, + 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x44, 0xfc, 0xff, 0xff, + 0x47, 0x44, 0x44, 0x44, 0x00, 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x81, 0xff, 0x17, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/broadcast.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,38 @@ +#define noname_width 64 +#define noname_height 64 +static char noname_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x06,0x00,0x00,0x30,0x10,0x00,0x00, + 0x0e,0x01,0x00,0x00,0x40,0x28,0x00,0x00,0x89,0x00,0x00,0x00,0x80,0xc8,0x00, + 0xc0,0x68,0x00,0x00,0x00,0x00,0x0b,0xe1,0x30,0x10,0x00,0x00,0x00,0x00,0x04, + 0xf2,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x08,0x00,0x00,0x00,0x00, + 0x00,0x80,0x41,0x10,0x00,0x00,0x00,0x00,0x00,0x60,0x40,0x20,0x00,0x00,0x00, + 0x00,0x00,0x18,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x10,0xe0,0x80,0x00,0x00, + 0x00,0x00,0x00,0x20,0xe0,0x00,0x01,0x00,0x00,0x00,0x00,0x40,0xe0,0xc0,0x00, + 0x00,0x00,0x00,0x00,0x20,0xe0,0x40,0x00,0x00,0x00,0x00,0x00,0x18,0x30,0x81, + 0x00,0x00,0x00,0x00,0x00,0x04,0x30,0x01,0x01,0x00,0x00,0x00,0x00,0x02,0x50, + 0x01,0x02,0x00,0x00,0x00,0x80,0x01,0x50,0x01,0x04,0x00,0x00,0x00,0x40,0x00, + 0x90,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x98,0x03,0x10,0x00,0x00,0x00,0x00, + 0x00,0xa8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x02,0x00,0x00,0x00,0x00, + 0x00,0x00,0x98,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x00,0x00,0x00, + 0x00,0x00,0x00,0x0c,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x05,0x00,0x00, + 0x00,0x00,0x00,0x00,0xc4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x07,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0e,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x0b, + 0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xb2, + 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00, + 0x07,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x13,0x00,0x00,0x00,0x00,0x00, + 0x00,0xe1,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x13,0x00,0x00,0x00,0x00, + 0x00,0x00,0x07,0x1c,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x2c,0x00,0x00,0x00, + 0x00,0x00,0x80,0x9c,0x23,0x00,0x00,0x00,0x00,0x00,0x80,0xe0,0x20,0x00,0x00, + 0x00,0x00,0x00,0x80,0x1c,0x27,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x78,0x00, + 0x00,0x00,0x00,0x00,0x40,0x03,0x58,0x00,0x00,0x00,0x00,0x00,0x40,0x0c,0x46, + 0x00,0x00,0x00,0x00,0x00,0x40,0x10,0x41,0x00,0x00,0x00,0x00,0x00,0x40,0xe0, + 0x40,0x00,0x00,0x00,0x00,0x00,0x20,0xb0,0x81,0x00,0x00,0x00,0x00,0x00,0x20, + 0x08,0x82,0x00,0x00,0x00,0x00,0x00,0x38,0x06,0x8c,0x00,0x00,0x00,0x00,0x00, + 0xa0,0x01,0xb0,0x02,0x00,0x00,0x00,0x00,0x66,0x00,0xc0,0x06,0x00,0x00,0x00, + 0x00,0xe4,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x68,0xc8,0x18,0x10,0x00,0x00, + 0x00,0x00,0x80,0x1c,0xc0,0x13,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/bug-48.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,23 @@ +#define noname_width 48 +#define noname_height 48 +static char noname_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x01,0x00, + 0x03,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00, + 0x00,0x04,0x0a,0x06,0x00,0x00,0x00,0x88,0x07,0x0e,0x00,0x00,0x00,0xe0,0x0f, + 0x0c,0x00,0x00,0x00,0xc0,0xe7,0x18,0x00,0x00,0x00,0xa0,0xf9,0x19,0x01,0x00, + 0x20,0x80,0xfe,0x09,0x03,0x00,0xc0,0x01,0xff,0x8b,0x01,0x00,0x00,0x03,0xff, + 0x81,0x01,0x00,0x00,0x86,0xff,0x8d,0x00,0x00,0x00,0xc6,0xff,0x8e,0x00,0x00, + 0x00,0x8c,0x3f,0xff,0x00,0x00,0x00,0x98,0x8f,0x3f,0x00,0x00,0x00,0x18,0xb0, + 0x3f,0x00,0x00,0x00,0xf0,0x7f,0xff,0x01,0x00,0x00,0x00,0x7f,0xff,0x03,0x00, + 0x00,0x00,0xff,0xfe,0x06,0x00,0x00,0x08,0xfe,0xfc,0x0d,0x00,0x00,0x7c,0xfe, + 0xfd,0x19,0x00,0x00,0xf0,0xff,0xfb,0x31,0x00,0x00,0x00,0xf8,0xfb,0x63,0x00, + 0x00,0x00,0xf8,0xf7,0xc3,0x03,0x00,0x00,0xf8,0xe7,0x03,0x00,0x00,0x00,0xec, + 0xef,0x07,0x00,0x00,0x00,0xc8,0xcf,0x07,0x00,0x00,0x00,0x88,0x9f,0x07,0x00, + 0x00,0x00,0x88,0xbf,0x0f,0x00,0x00,0x00,0x18,0x3f,0x0f,0x00,0x00,0x00,0x10, + 0x7e,0x0f,0x00,0x00,0x00,0x30,0x7e,0x06,0x00,0x00,0x00,0x60,0xfc,0x00,0x00, + 0x00,0x00,0x60,0xf0,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x30, + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/c++.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define c++.xbm_width 64 +#define c++.xbm_height 64 +static char c++.xbm_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x7f, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, + 0xc0, 0x03, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0xe0, 0x01, 0x00, 0x06, + 0x00, 0x00, 0x06, 0x00, 0xe0, 0x01, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, + 0xe0, 0x01, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0xe0, 0x01, 0x00, 0x06, + 0x00, 0x00, 0x06, 0x00, 0xf0, 0x01, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, + 0xf0, 0x01, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0xf0, 0x01, 0xff, 0xff, + 0x0f, 0xff, 0xff, 0x0f, 0xf0, 0x01, 0xff, 0xff, 0x0f, 0xff, 0xff, 0x0f, + 0xf0, 0x01, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0xf0, 0x01, 0x00, 0x06, + 0x00, 0x00, 0x06, 0x00, 0xf0, 0x01, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, + 0xe0, 0x01, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0xe0, 0x01, 0x00, 0x06, + 0x00, 0x00, 0x06, 0x00, 0xe0, 0x03, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, + 0xe0, 0x03, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0xe0, 0x03, 0x00, 0x06, + 0x00, 0x00, 0x06, 0x00, 0xc0, 0x07, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, + 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x3f, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/c.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define c.xbm_width 64 +#define c.xbm_height 64 +static char c.xbm_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x1f, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, + 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/calculator.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,19 @@ +#define icon_width 28 +#define icon_height 48 +static char icon_bits[] = { + 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x0f, 0x03, 0x00, 0x00, 0x0c, + 0xd3, 0x5d, 0x5d, 0x0c, 0x13, 0x51, 0x45, 0x0c, 0xd3, 0xdd, 0xdd, 0x0d, + 0x53, 0x10, 0x51, 0x0d, 0xd3, 0x1d, 0xdd, 0x0d, 0x03, 0x00, 0x00, 0x0c, + 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x0f, 0x01, 0x00, 0x00, 0x08, + 0xbd, 0xf7, 0xde, 0x0b, 0xbd, 0xf7, 0xde, 0x0b, 0x01, 0x00, 0x00, 0x08, + 0xbd, 0xf7, 0xde, 0x0b, 0xa5, 0x94, 0x52, 0x0a, 0xbd, 0xf7, 0xde, 0x0b, + 0x01, 0x00, 0x00, 0x08, 0xbd, 0xf7, 0xde, 0x0b, 0xbd, 0xf7, 0xde, 0x0b, + 0xbd, 0xf7, 0xde, 0x0b, 0x01, 0x00, 0x00, 0x08, 0xbd, 0xf7, 0xde, 0x0b, + 0xbd, 0xf7, 0xde, 0x0b, 0xbd, 0xf7, 0xde, 0x0b, 0x01, 0x00, 0x00, 0x08, + 0xbd, 0xf7, 0xde, 0x0b, 0xbd, 0x94, 0xd2, 0x0b, 0xbd, 0x94, 0xd2, 0x0b, + 0xbd, 0xf7, 0xde, 0x0b, 0x01, 0x00, 0x00, 0x08, 0xbd, 0xf7, 0xde, 0x0b, + 0xbd, 0x94, 0xd2, 0x0b, 0xbd, 0x94, 0xd2, 0x0b, 0xbd, 0xf7, 0xde, 0x0b, + 0x01, 0x00, 0x00, 0x08, 0xbd, 0xf7, 0xde, 0x0b, 0xbd, 0x94, 0xd2, 0x0b, + 0xbd, 0x94, 0xd2, 0x0b, 0xbd, 0xf7, 0xde, 0x0b, 0x01, 0x00, 0x00, 0x08, + 0xbd, 0xff, 0xde, 0x0b, 0xbd, 0x80, 0xd2, 0x0b, 0xbd, 0x80, 0xd2, 0x0b, + 0xbd, 0xff, 0xde, 0x0b, 0x01, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x0f};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/calendar.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define calendar_width 64 +#define calendar_height 54 +static char calendar_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, + 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0xa0, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x68, 0x00, 0x20, 0x01, 0x00, 0x00, 0x80, 0xff, 0xcf, 0xff, + 0xbf, 0xff, 0x1f, 0x00, 0x80, 0x00, 0x68, 0x0a, 0x20, 0x29, 0x10, 0x00, + 0x80, 0x00, 0x48, 0x05, 0xa0, 0x15, 0x10, 0x00, 0x80, 0x00, 0xe8, 0x0a, + 0x20, 0x2b, 0xb0, 0x00, 0x80, 0x00, 0x48, 0x05, 0xa0, 0x15, 0x50, 0x01, + 0x80, 0x00, 0xec, 0x02, 0x30, 0x0b, 0xb0, 0x00, 0x80, 0x00, 0xcc, 0x01, + 0xb0, 0x07, 0x50, 0x01, 0x80, 0x00, 0xfc, 0x00, 0xf0, 0x03, 0xb0, 0x00, + 0x80, 0x00, 0x78, 0x00, 0xe0, 0x01, 0x50, 0x01, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xb0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x01, + 0x80, 0x00, 0x00, 0xc0, 0x07, 0x00, 0xb0, 0x00, 0x80, 0x00, 0x00, 0xf0, + 0x07, 0x00, 0x50, 0x01, 0x80, 0x00, 0x00, 0xfc, 0x07, 0x00, 0xb0, 0x00, + 0x80, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x50, 0x01, 0x80, 0x00, 0x00, 0xfc, + 0x07, 0x00, 0xb0, 0x00, 0x80, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x50, 0x01, + 0x80, 0x00, 0x00, 0xc0, 0x07, 0x00, 0xb0, 0x00, 0x80, 0x00, 0x00, 0xc0, + 0x07, 0x00, 0x50, 0x01, 0x80, 0x00, 0x00, 0xc0, 0x07, 0x00, 0xb0, 0x00, + 0x80, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x50, 0x01, 0x80, 0x00, 0x00, 0xc0, + 0x07, 0x00, 0xb0, 0x00, 0x80, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x50, 0x01, + 0x80, 0x00, 0x00, 0xc0, 0x07, 0x00, 0xb0, 0x00, 0x80, 0x00, 0x00, 0xc0, + 0x07, 0x00, 0x50, 0x01, 0x80, 0x00, 0x00, 0xc0, 0x07, 0x00, 0xb0, 0x00, + 0x80, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x50, 0x01, 0x80, 0x00, 0x00, 0xc0, + 0x07, 0x00, 0xb0, 0x00, 0x80, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x50, 0x01, + 0x80, 0xff, 0x01, 0xc0, 0x07, 0x00, 0xb0, 0x00, 0x80, 0x01, 0x01, 0xc0, + 0x07, 0x00, 0x50, 0x01, 0x80, 0x02, 0x01, 0xc0, 0x07, 0x00, 0xb0, 0x00, + 0x80, 0x04, 0x01, 0xc0, 0x07, 0x00, 0x50, 0x01, 0x80, 0x08, 0x01, 0x00, + 0x00, 0x00, 0xb0, 0x00, 0x80, 0x10, 0x01, 0x00, 0x00, 0x00, 0x50, 0x01, + 0x80, 0x20, 0x01, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x80, 0x40, 0x01, 0x00, + 0x00, 0x00, 0x50, 0x01, 0x80, 0x80, 0x01, 0x00, 0x00, 0x00, 0xb0, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x01, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x01, + 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x54, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/candle.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define candle_width 64 +#define candle_height 54 +static char candle_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x48, 0x04, 0x01, 0x00, 0x00, + 0x20, 0x88, 0x40, 0x01, 0xa0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x82, 0x20, + 0x40, 0x20, 0x60, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x20, 0x01, 0x18, 0x00, + 0x00, 0x80, 0x80, 0x20, 0x11, 0x08, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x20, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x10, 0x04, 0x10, 0x04, 0x00, + 0x70, 0x01, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x84, 0x40, 0xb0, + 0x04, 0x08, 0x10, 0x00, 0xc0, 0x10, 0x00, 0x60, 0x03, 0x01, 0x00, 0x78, + 0x00, 0x00, 0x02, 0xc0, 0x21, 0x00, 0x84, 0x00, 0x00, 0x09, 0x10, 0x80, + 0x00, 0x10, 0x80, 0x00, 0x20, 0x00, 0x00, 0x8e, 0x0e, 0x00, 0x40, 0x00, + 0x04, 0x12, 0x80, 0xf0, 0x30, 0x00, 0x21, 0x06, 0x00, 0x88, 0x40, 0x80, + 0x43, 0x22, 0x02, 0x18, 0x00, 0x40, 0x40, 0x60, 0x84, 0x10, 0x04, 0x00, + 0x00, 0x00, 0x40, 0x18, 0x84, 0x08, 0x08, 0x00, 0x00, 0x08, 0x80, 0x48, + 0x4a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x54, 0x51, 0x34, 0x20, 0x20, 0x00, + 0x00, 0x02, 0x00, 0xa1, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x62, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x19, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x04, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x08, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0d, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x04, 0x0a, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, + 0x0d, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x04, 0x0a, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x04, 0x0d, 0x00, 0xfc, 0x19, 0x00, 0x00, 0x00, 0x84, + 0x0a, 0x00, 0x3f, 0x38, 0x00, 0x00, 0x00, 0x04, 0x0d, 0x80, 0x0f, 0x30, + 0x00, 0x00, 0x00, 0x87, 0x3a, 0x80, 0x07, 0x30, 0x00, 0x00, 0xc0, 0x06, + 0xdd, 0x00, 0x0f, 0x18, 0x00, 0x00, 0xe0, 0x8c, 0x8a, 0x01, 0x1e, 0x0f, + 0x00, 0xc0, 0xe9, 0xf1, 0xc7, 0xe5, 0xf8, 0x03, 0x00, 0xfe, 0x9c, 0x00, + 0x78, 0xee, 0xdf, 0x00, 0x80, 0xc7, 0x1e, 0xfc, 0x0f, 0x6f, 0x78, 0x00, + 0xf0, 0xe1, 0x04, 0x00, 0xe0, 0xe7, 0xe7, 0x03, 0xf8, 0x00, 0x01, 0xf8, + 0xff, 0xf1, 0xdf, 0x07, 0xf0, 0x01, 0x00, 0xff, 0x7f, 0xfc, 0xe7, 0x03, + 0xc0, 0x07, 0x00, 0xf8, 0x07, 0x1e, 0xf8, 0x01, 0x00, 0x1e, 0x00, 0x00, + 0xe0, 0xe3, 0x3f, 0x00, 0x00, 0xf0, 0x01, 0x80, 0xff, 0xff, 0x0f, 0x00, + 0x00, 0x00, 0xfe, 0xf0, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/cat_black.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,38 @@ +#define noname_width 64 +#define noname_height 64 +static char noname_bits[] = { + 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x03,0x00,0x00,0x00,0x00,0x00,0x00, + 0xd7,0x07,0x00,0x00,0x00,0x00,0x00,0x80,0xf7,0x0f,0x00,0x00,0x00,0x00,0x00, + 0xc0,0xf7,0x1f,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x39,0x00,0x00,0x00,0x00, + 0x00,0xe0,0xff,0x35,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x7f,0x00,0x00,0x00, + 0x00,0x00,0xe0,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x00,0x00, + 0x00,0xc0,0x03,0xe0,0xff,0x7f,0xf0,0x00,0x00,0xe0,0x07,0xd0,0xff,0x7f,0xf8, + 0x01,0x00,0xf8,0x07,0xd0,0xff,0x3f,0xfc,0x01,0x00,0xfc,0x07,0x18,0xff,0x1f, + 0xfe,0x01,0x00,0xfc,0x03,0x3c,0xfe,0x03,0xff,0x01,0x00,0xfe,0x01,0xfc,0xe0, + 0x80,0xff,0x00,0x00,0x7e,0x00,0xfe,0x3f,0xc0,0x7f,0x00,0x00,0x3f,0x00,0xfe, + 0x3f,0xf8,0x07,0x00,0x00,0x1f,0x00,0xfe,0x7f,0xfe,0x01,0x00,0x80,0x1f,0x00, + 0xfe,0xff,0xff,0x00,0x00,0x80,0x0f,0x00,0xfe,0xff,0x7f,0x00,0x00,0x80,0x0f, + 0x00,0xff,0xff,0x3f,0x00,0x00,0x80,0x0f,0x00,0xff,0xff,0x3f,0x00,0x00,0x80, + 0x07,0x80,0xff,0xff,0x1f,0x00,0x00,0x80,0x07,0x80,0xff,0xff,0x0f,0x00,0x00, + 0x80,0x07,0xc0,0xff,0xff,0x0f,0x00,0x00,0x80,0x07,0xf0,0xff,0xff,0x37,0x00, + 0x00,0x80,0x07,0xf8,0xff,0xff,0xfb,0x3e,0x00,0x00,0x0f,0xff,0xff,0xff,0xfd, + 0x6f,0x00,0x00,0xcf,0xff,0xff,0x31,0xfe,0x5f,0x00,0x00,0xee,0xff,0x7f,0x0f, + 0xe0,0x7f,0x00,0x00,0xee,0xff,0xbf,0x07,0x80,0x67,0x00,0x00,0xfc,0xff,0xff, + 0x07,0x00,0x3e,0x00,0x00,0xfc,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0xf0,0xff, + 0xff,0x03,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0xf0, + 0xff,0xff,0x01,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x00,0x00,0x00,0x00,0x00, + 0xe0,0xff,0xfb,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xfb,0x00,0x00,0x00,0x00, + 0x00,0xc0,0xff,0x7d,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x7e,0x00,0x00,0x00, + 0x00,0x00,0xe0,0xff,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x7f,0x3f,0x00,0x00, + 0x00,0x00,0x00,0xf0,0xbf,0x3f,0x00,0x00,0x00,0x00,0x00,0xf0,0xbf,0x1f,0x00, + 0x00,0x00,0x00,0x00,0xf0,0xdf,0x0f,0x00,0x00,0x00,0x00,0x00,0xf0,0xcf,0x03, + 0x00,0x00,0x00,0x00,0x00,0xe0,0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0xe0,0xe7, + 0x01,0x00,0x00,0x00,0x00,0x00,0xe0,0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0xe0, + 0xe7,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0xc3,0x07,0x00,0x00,0x00,0x00,0x00, + 0xc0,0x83,0x1f,0x00,0x00,0x00,0x00,0x00,0xe0,0x87,0x3f,0x00,0x00,0x00,0x00, + 0x00,0xe0,0x0f,0x3f,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00,0x00,0x00,0x00, + 0x00,0x00,0xc0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00,0x00,0x00, + 0x00,0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/coffee.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define t_width 64 +#define t_height 54 +static char t_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x00, 0x00, 0xcc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x38, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0xe0, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x00, 0x80, 0xf3, 0xff, 0xff, 0x7f, 0xfc, 0x0f, + 0x00, 0x00, 0x6e, 0x06, 0xfc, 0x0f, 0xf0, 0x1f, 0x00, 0x00, 0xd4, 0xff, + 0xff, 0x07, 0xc0, 0x3f, 0x00, 0xc0, 0xfd, 0xff, 0xff, 0x0f, 0x00, 0x7f, + 0x00, 0xc0, 0xfd, 0xff, 0xff, 0x0f, 0x00, 0x7e, 0x00, 0x80, 0xfb, 0xff, + 0xff, 0x07, 0x00, 0xfc, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf8, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0xf0, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xf0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0xf0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xf0, 0x00, 0xf0, 0xee, 0xa6, + 0xff, 0x0f, 0x40, 0xf0, 0xc4, 0xff, 0xb3, 0x54, 0xac, 0xfc, 0x01, 0xf0, + 0xfc, 0xe5, 0xff, 0xeb, 0xd6, 0x54, 0xff, 0xf0, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x01, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x01, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0x03, 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xff, 0x9f, 0x03, + 0xff, 0x07, 0xff, 0xff, 0x07, 0xfe, 0x9f, 0x03, 0xff, 0xc3, 0xff, 0xff, + 0x1f, 0xfc, 0x9f, 0x03, 0x3f, 0x06, 0xfc, 0xff, 0x00, 0xff, 0xdf, 0x03, + 0x1f, 0xc8, 0x00, 0x00, 0x9c, 0xff, 0xdf, 0x03, 0x4f, 0x09, 0x00, 0x62, + 0xab, 0xff, 0xef, 0x03, 0xaf, 0x0b, 0x00, 0x80, 0x94, 0xff, 0xf7, 0x01, + 0xae, 0x0f, 0x00, 0x00, 0xaa, 0xff, 0xff, 0x01, 0xae, 0x0f, 0x00, 0x00, + 0x94, 0xff, 0xf9, 0x00, 0x4c, 0x0e, 0x00, 0x00, 0xa8, 0x7f, 0xfe, 0x00, + 0x9c, 0x0a, 0x00, 0x00, 0x94, 0xff, 0x7f, 0x00, 0x78, 0x08, 0x00, 0x00, + 0xa9, 0xff, 0x7f, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x90, 0xff, 0x3f, 0x00, + 0xf0, 0x0f, 0x00, 0x00, 0xa8, 0xff, 0x3f, 0x00, 0xc0, 0x0f, 0x00, 0x00, + 0x90, 0xff, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x80, 0xff, 0x07, 0x00, + 0x00, 0x0c, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x80, 0x3f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/connections-48.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,27 @@ +#define cxism_width 48 +#define cxism_height 48 +static char cxism_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x07, 0x10, 0x89, 0x44, 0x22, 0x91, 0x08, + 0x10, 0x89, 0x44, 0x22, 0x91, 0x08, 0x10, 0x89, 0x44, 0x22, 0x91, 0x08, + 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x07, 0x80, 0xe3, 0x30, 0x0c, 0xc7, 0x01, + 0x00, 0x4d, 0x4b, 0xd2, 0xb2, 0x00, 0x00, 0x72, 0x8c, 0x31, 0x4e, 0x00, + 0x00, 0xc4, 0x99, 0x99, 0x23, 0x00, 0x00, 0x48, 0x66, 0x66, 0x12, 0x00, + 0x00, 0x88, 0xbc, 0x3d, 0x11, 0x00, 0x00, 0x90, 0xf2, 0x4f, 0x09, 0x00, + 0x00, 0xa0, 0xea, 0x57, 0x05, 0x00, 0x00, 0xc0, 0x3e, 0x7c, 0x03, 0x00, + 0x00, 0x80, 0x0f, 0xf0, 0x01, 0x00, 0x00, 0x80, 0x03, 0xc0, 0x01, 0x00, + 0x00, 0x40, 0x04, 0x20, 0x02, 0x00, 0x00, 0x40, 0x04, 0x20, 0x02, 0x00, + 0x00, 0x40, 0x04, 0x20, 0x02, 0x00, 0x00, 0x80, 0x03, 0xc0, 0x01, 0x00, + 0x00, 0x80, 0x0f, 0xf0, 0x01, 0x00, 0x00, 0xc0, 0x3e, 0x7c, 0x03, 0x00, + 0x00, 0xa0, 0xea, 0x57, 0x05, 0x00, 0x00, 0x90, 0xf2, 0x4f, 0x09, 0x00, + 0x00, 0x88, 0xbc, 0x3d, 0x11, 0x00, 0x00, 0x48, 0x66, 0x66, 0x12, 0x00, + 0x00, 0xc4, 0x99, 0x99, 0x23, 0x00, 0x00, 0x72, 0x8c, 0x31, 0x4e, 0x00, + 0x00, 0x4d, 0x4b, 0xd2, 0xb2, 0x00, 0x80, 0xe3, 0x30, 0x0c, 0xc7, 0x01, + 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x07, 0x10, 0x89, 0x44, 0x22, 0x91, 0x08, + 0x10, 0x89, 0x44, 0x22, 0x91, 0x08, 0x10, 0x89, 0x44, 0x22, 0x91, 0x08, + 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/cray.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,38 @@ +#define noname_width 64 +#define noname_height 64 +static char noname_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xe7,0xe3,0x1c, + 0x00,0x00,0x00,0x00,0xbc,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0xfc,0xff,0xff, + 0xff,0x03,0x00,0x00,0x00,0xbc,0x61,0x30,0xf8,0x03,0x00,0x00,0x00,0xb4,0x61, + 0x30,0x18,0x02,0x00,0x00,0x00,0xb4,0x61,0x30,0x18,0x02,0x00,0x00,0x00,0xb4, + 0x61,0x30,0x18,0x02,0x00,0x00,0x00,0xb4,0x61,0x30,0x18,0x02,0x00,0x00,0x00, + 0xb4,0x61,0x30,0x18,0x02,0x00,0x00,0x00,0xb4,0x61,0x30,0x18,0x02,0x00,0x00, + 0x00,0xb4,0x61,0x30,0x18,0x02,0x00,0x00,0x00,0xb4,0x61,0x30,0x18,0x02,0x00, + 0x00,0x00,0xb4,0x61,0x30,0x18,0x02,0x00,0x00,0x00,0xb4,0x61,0x30,0x18,0x02, + 0x00,0x00,0x00,0xb4,0x61,0x30,0x18,0x02,0x00,0x00,0x00,0xb4,0x61,0x30,0x18, + 0x02,0x00,0x00,0x00,0xb4,0x61,0x30,0x18,0x02,0x00,0x00,0x00,0xb4,0x61,0x30, + 0x18,0x02,0x00,0x00,0x00,0xb4,0x61,0x30,0x18,0x02,0x00,0x00,0x00,0xb4,0x61, + 0x30,0x18,0x02,0x00,0x00,0x00,0xb4,0x61,0x30,0x18,0x02,0x00,0x00,0x00,0xb4, + 0x61,0x30,0x18,0x02,0x00,0x00,0x00,0xb4,0x61,0x30,0x18,0x02,0x00,0x00,0x00, + 0xb4,0x61,0x30,0x18,0x02,0x00,0x00,0x00,0xb4,0x61,0x30,0x18,0x02,0x00,0x00, + 0x00,0xb4,0x61,0x30,0x18,0x02,0x00,0x00,0x00,0xb4,0x61,0x30,0x18,0x02,0x00, + 0x00,0x00,0xb4,0x61,0x30,0x18,0x02,0x00,0x00,0x00,0xb4,0x61,0x30,0x18,0x02, + 0x00,0x00,0xe0,0xb7,0x61,0x30,0x18,0x02,0x00,0x00,0xfc,0xb7,0x61,0x30,0x18, + 0x0e,0x00,0x80,0xff,0xb7,0x61,0x30,0x18,0x7e,0x00,0xe0,0xff,0xb7,0x61,0x30, + 0x18,0xfe,0x03,0xf0,0xff,0xbf,0x61,0x30,0xf8,0xff,0x0f,0xf8,0xff,0xbf,0x61, + 0x30,0xf8,0xff,0x3f,0xfc,0xff,0xff,0x63,0x30,0x18,0x00,0x20,0xfc,0xff,0xff, + 0xff,0x30,0x1e,0x00,0x20,0xfc,0xff,0xff,0xff,0xff,0x3f,0x00,0x20,0xf4,0xff, + 0xff,0xff,0xff,0x7f,0x00,0x20,0xe4,0xff,0xff,0xff,0xff,0xff,0x00,0x20,0x44, + 0xff,0xff,0xff,0xff,0xff,0x01,0x20,0x44,0xfc,0xff,0xff,0xff,0xff,0x03,0x20, + 0x44,0xf8,0xff,0xff,0xff,0xff,0x07,0x20,0x44,0x10,0xff,0xff,0xff,0xff,0x0f, + 0x20,0x44,0x10,0xe0,0xff,0xff,0x07,0x08,0x20,0x44,0x10,0x20,0x00,0x02,0x00, + 0x08,0x20,0x44,0x10,0x20,0x00,0x02,0x00,0xf8,0x3f,0x44,0x10,0x20,0x00,0x02, + 0x00,0xf8,0x3f,0x4c,0x10,0x20,0x00,0x02,0x00,0x08,0x00,0x58,0x10,0x20,0x00, + 0x02,0x00,0x08,0x00,0x70,0x10,0x20,0x00,0x02,0x00,0x08,0x00,0xe0,0x10,0x20, + 0x00,0x02,0x00,0x08,0x00,0xc0,0x13,0x20,0x00,0x02,0x00,0x08,0x00,0x80,0x1f, + 0x20,0x00,0x02,0x00,0x08,0x00,0x00,0xfe,0x21,0x00,0x02,0x00,0x08,0x00,0x00, + 0xf0,0xff,0x00,0x02,0xe0,0x0f,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x0f,0x00, + 0x00,0x00,0x80,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/dont_panic.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define dont_panic_new_width 64 +#define dont_panic_new_height 64 +static char dont_panic_new_bits[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0x5f, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x5f, 0xf5, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x58, 0xf6, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xf7, 0x13, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xfb, + 0xff, 0x3f, 0xfb, 0xff, 0xff, 0xf3, 0xcf, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0xf8, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0, 0xff, 0xcf, 0xff, + 0xff, 0xfd, 0x07, 0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x03, 0x00, + 0x80, 0xff, 0xc7, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xff, 0xc7, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xc3, 0xff, 0xff, 0xff, 0x00, 0x06, + 0x00, 0xfe, 0xc1, 0xff, 0xff, 0x7f, 0x00, 0x06, 0x00, 0xc4, 0xe0, 0xff, + 0xff, 0x7f, 0x00, 0x1d, 0x00, 0x04, 0xf0, 0xff, 0xff, 0x7f, 0x1c, 0x2d, + 0x00, 0x04, 0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xc0, 0x70, 0x08, 0xff, 0xff, + 0xff, 0x3f, 0xa0, 0xaa, 0xfb, 0xc8, 0xff, 0xff, 0xef, 0x3f, 0xe0, 0xaa, + 0xf9, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0xac, 0xc0, 0xfc, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x2e, 0x3d, 0xfe, 0xf9, 0xff, 0xf9, 0xff, 0x3f, 0x2f, 0x1f, + 0xfe, 0xf9, 0xff, 0xf9, 0xff, 0x2f, 0x9f, 0x00, 0xfd, 0xf9, 0xff, 0xff, + 0xff, 0x4f, 0x4f, 0xc1, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0x4f, 0xc6, 0xbe, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0x47, 0xe4, 0xd3, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xc7, 0xf2, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xe3, 0xf9, 0xff, + 0x3f, 0xfe, 0xf7, 0xff, 0xbf, 0xe3, 0xf4, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0x73, 0xe2, 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0x71, 0xc6, 0xff, + 0xdb, 0xff, 0xff, 0xfb, 0xff, 0x39, 0x0f, 0xdf, 0xe3, 0xff, 0xff, 0xff, + 0xff, 0x19, 0x3f, 0x3c, 0x84, 0xff, 0xff, 0xff, 0xff, 0x98, 0xff, 0x61, + 0x08, 0xfe, 0xff, 0xff, 0xff, 0xcc, 0xff, 0xff, 0x21, 0x80, 0xff, 0xff, + 0xff, 0xc4, 0xff, 0xff, 0x83, 0x83, 0xff, 0xff, 0xff, 0xe0, 0xef, 0xff, + 0x07, 0x80, 0xff, 0xff, 0x7f, 0xf0, 0xff, 0xff, 0x0f, 0xc0, 0xff, 0xff, + 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x7f, 0xf8, 0xff, 0xff, + 0x7e, 0xf8, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/drawing.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,32 @@ +#define drafting_width 64 +#define drafting_height 54 +static char drafting_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf8,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0x1b,0x00,0x00,0x00,0x00,0x00, + 0x00,0x83,0x07,0x00,0x00,0x00,0x00,0x00,0x80,0xe1,0x1f,0x00,0x00,0x00,0x00, + 0x00,0xc0,0xf8,0x1f,0x00,0x00,0x00,0x00,0x00,0xc0,0x3e,0x3e,0x00,0x00,0x00, + 0x00,0x40,0xc0,0x07,0x33,0x00,0x00,0x00,0x00,0x80,0xe1,0x01,0x13,0x00,0x00, + 0x00,0x00,0x80,0x79,0x80,0x11,0x00,0x00,0x00,0x00,0x00,0x1e,0x80,0x19,0x00, + 0x00,0x00,0x00,0x00,0x0e,0xc0,0x08,0x00,0x00,0xc0,0x7f,0x00,0x0b,0xc0,0x0c, + 0x00,0x00,0xf0,0xff,0xc0,0x10,0x60,0x07,0x00,0x00,0xf8,0xff,0x31,0x20,0xe0, + 0x03,0x00,0x00,0xfc,0x7f,0x0c,0x40,0xf0,0x00,0x00,0x00,0xfe,0x1f,0x07,0x80, + 0x18,0x00,0x00,0x00,0xfe,0xcf,0x0f,0x00,0x19,0xf0,0x00,0x00,0xff,0xf3,0x1f, + 0x00,0x0e,0xff,0x00,0x00,0xff,0xfc,0x1f,0x00,0xfc,0x3f,0x00,0x00,0x7f,0xff, + 0x1f,0x00,0x7e,0x39,0x00,0x00,0xff,0xff,0x1f,0xd0,0x7e,0x3e,0x00,0x00,0xff, + 0xff,0x1f,0x7c,0xff,0x27,0x00,0x00,0xff,0xff,0xff,0x7f,0xff,0x3b,0x00,0x00, + 0xff,0x3f,0xe0,0xbf,0xfd,0x1f,0x00,0x00,0xff,0x3b,0x7e,0x85,0xf1,0x01,0x00, + 0x00,0xff,0xb1,0x03,0xc0,0x73,0x00,0x00,0x00,0xfe,0x21,0x00,0x40,0x7e,0x00, + 0x00,0x00,0xfe,0x40,0x00,0x60,0x38,0x00,0x00,0x00,0xfc,0x80,0x00,0x20,0x1c, + 0x00,0x00,0x00,0x78,0x00,0x01,0x30,0x1e,0x00,0x00,0x00,0x60,0x00,0x02,0x10, + 0x17,0x00,0x00,0x00,0x20,0x00,0x04,0x98,0x13,0x00,0x00,0x00,0x20,0x00,0x08, + 0xc8,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x6c,0x10,0x00,0x00,0x00,0x10,0x00, + 0x20,0x3c,0x10,0x00,0x00,0x00,0x08,0x00,0x40,0x0e,0x10,0x00,0x00,0x00,0x08, + 0x00,0x80,0x06,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x10,0x00,0x00,0x00, + 0x04,0x00,0x00,0x02,0x10,0x00,0x00,0x00,0xfe,0xff,0xff,0x03,0x10,0x00,0x00, + 0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x10,0x00, + 0x00,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x10, + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xe0,0xff,0xff, + 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/elisp.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define elisp.xbm_width 64 +#define elisp.xbm_height 64 +static char elisp.xbm_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x07, 0x00, 0x1c, 0xc0, 0xe3, 0x07, + 0xfe, 0x3f, 0x07, 0x00, 0x1c, 0xf8, 0xe3, 0x0f, 0xfe, 0x3f, 0x07, 0x00, + 0x1c, 0xfe, 0xe3, 0x3e, 0xfe, 0x3f, 0x07, 0x00, 0x1c, 0x1f, 0xe0, 0x3c, + 0x0e, 0x00, 0x07, 0x00, 0x1c, 0x0f, 0xe0, 0x78, 0x0e, 0x00, 0x07, 0x00, + 0x9c, 0x07, 0xe0, 0x70, 0x0e, 0x00, 0x07, 0x00, 0x9c, 0x03, 0xe0, 0x70, + 0x0e, 0x00, 0x07, 0x00, 0x9c, 0x03, 0xe0, 0xe0, 0x0e, 0x00, 0x07, 0x00, + 0x9c, 0x01, 0xe0, 0xe0, 0x0e, 0x00, 0x07, 0x00, 0x9c, 0x01, 0xe0, 0xe0, + 0x0e, 0x00, 0x07, 0x00, 0x9c, 0x01, 0xe0, 0xe0, 0x0e, 0x00, 0x07, 0x00, + 0x9c, 0x03, 0xe0, 0xe0, 0x0e, 0x00, 0x07, 0x00, 0x9c, 0x03, 0xe0, 0xe0, + 0x0e, 0x00, 0x07, 0x00, 0x9c, 0x03, 0xe0, 0xe0, 0x0e, 0x00, 0x07, 0x00, + 0x1c, 0x07, 0xe0, 0xf0, 0x0e, 0x00, 0x07, 0x00, 0x1c, 0x0e, 0xe0, 0x78, + 0xfe, 0x3f, 0x07, 0x00, 0x1c, 0x1c, 0xe0, 0x3f, 0xfe, 0x3f, 0x07, 0x00, + 0x1c, 0x3c, 0xe0, 0x1f, 0xfe, 0x3f, 0x07, 0x00, 0x1c, 0x78, 0xe0, 0x03, + 0xfe, 0x3f, 0x07, 0x00, 0x1c, 0xf0, 0xe0, 0x00, 0x0e, 0x00, 0x07, 0x00, + 0x1c, 0xe0, 0xe1, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x1c, 0xc0, 0xe1, 0x00, + 0x0e, 0x00, 0x07, 0x00, 0x1c, 0x80, 0xe3, 0x00, 0x0e, 0x00, 0x07, 0x00, + 0x1c, 0x00, 0xe3, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x1c, 0x00, 0xe7, 0x00, + 0x0e, 0x00, 0x07, 0x00, 0x1c, 0x00, 0xe7, 0x00, 0x0e, 0x00, 0x07, 0x00, + 0x1c, 0x00, 0xe7, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x1c, 0x00, 0xe7, 0x00, + 0x0e, 0x00, 0x07, 0x00, 0x1c, 0x00, 0xe7, 0x00, 0x0e, 0x00, 0x07, 0x00, + 0x1c, 0x00, 0xe7, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x1c, 0x80, 0xe3, 0x00, + 0x0e, 0x00, 0x07, 0x00, 0x1c, 0xc0, 0xe3, 0x00, 0xfe, 0x3f, 0x07, 0x00, + 0x1c, 0xf0, 0xe1, 0x00, 0xfe, 0x3f, 0xff, 0xff, 0x1c, 0xf8, 0xe0, 0x00, + 0xfe, 0x3f, 0xff, 0xff, 0x9c, 0x7f, 0xe0, 0x00, 0xfe, 0x3f, 0xff, 0xff, + 0x9c, 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/escherknot.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define escherknot_width 64 +#define escherknot_height 54 +static char escherknot_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x45, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x90, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, + 0x00, 0x00, 0x20, 0x09, 0x44, 0x02, 0x68, 0x00, 0x00, 0x00, 0x02, 0xa0, + 0x91, 0x04, 0xd2, 0x00, 0x00, 0x80, 0x50, 0x4d, 0xac, 0x12, 0xa4, 0x01, + 0x00, 0x00, 0x89, 0x52, 0x71, 0x2f, 0x68, 0x01, 0x00, 0x50, 0xd4, 0xaa, + 0xad, 0x1b, 0xc0, 0x01, 0x00, 0x00, 0x55, 0x6d, 0xd5, 0x3f, 0x50, 0x03, + 0x00, 0xa8, 0x7a, 0xaf, 0x55, 0x7e, 0xa0, 0x02, 0x00, 0x44, 0xd5, 0x7d, + 0xeb, 0x4b, 0xc8, 0x03, 0x00, 0x50, 0xff, 0xd7, 0x5a, 0x06, 0xa0, 0x02, + 0x00, 0xea, 0xfe, 0xff, 0xd7, 0x4d, 0x68, 0x03, 0x00, 0xb4, 0xff, 0xff, + 0xad, 0x1a, 0x90, 0x03, 0x00, 0xd9, 0xfe, 0xff, 0xbf, 0x37, 0xe8, 0x03, + 0x80, 0xec, 0x1f, 0xf4, 0xd7, 0x5a, 0xa4, 0x02, 0x00, 0xdb, 0x86, 0xea, + 0xbf, 0x36, 0xe8, 0x03, 0x80, 0xf4, 0x07, 0xb9, 0xff, 0x0d, 0x54, 0x01, + 0x40, 0x57, 0x23, 0xd7, 0xad, 0x05, 0xf5, 0x01, 0x80, 0xfa, 0x43, 0xf8, + 0x78, 0x07, 0xb4, 0x01, 0x40, 0xd7, 0x81, 0xed, 0xf0, 0x41, 0xdd, 0x00, + 0x40, 0x7d, 0x21, 0xf6, 0xe0, 0x11, 0xf5, 0x00, 0x40, 0xd7, 0xa2, 0xd9, + 0x40, 0x40, 0x7b, 0x00, 0x80, 0x77, 0x41, 0xfa, 0x00, 0x50, 0x7d, 0x00, + 0x40, 0xad, 0x51, 0x5b, 0x00, 0xa0, 0x1b, 0x00, 0x80, 0x5f, 0x55, 0xea, + 0x00, 0xda, 0x1e, 0x00, 0x80, 0xb6, 0x52, 0xbb, 0x52, 0xb4, 0x1f, 0x00, + 0x80, 0xdf, 0xa5, 0xd6, 0x04, 0xd5, 0x1f, 0x00, 0x00, 0xad, 0xaa, 0xaa, + 0xd1, 0x7a, 0x1f, 0x00, 0x00, 0x7f, 0xa5, 0xba, 0xab, 0xee, 0x3b, 0x00, + 0x00, 0xde, 0x1b, 0x55, 0xe9, 0xfb, 0x1f, 0x00, 0x00, 0x7c, 0x6d, 0xad, + 0x5a, 0x7f, 0x3f, 0x00, 0x00, 0xf8, 0x57, 0xb5, 0xfe, 0x7f, 0x3b, 0x00, + 0x00, 0xf0, 0x7d, 0x55, 0xe9, 0x4f, 0x3f, 0x00, 0x00, 0xe0, 0x6f, 0xad, + 0xfa, 0xa3, 0x3e, 0x00, 0x00, 0xc0, 0xff, 0xeb, 0xea, 0x40, 0x3b, 0x00, + 0x00, 0x00, 0x7f, 0x5d, 0x25, 0x80, 0x3f, 0x00, 0x00, 0x00, 0xf8, 0xab, + 0x1a, 0xa4, 0x3a, 0x00, 0x00, 0x00, 0x40, 0xdb, 0x26, 0x40, 0x3f, 0x00, + 0x00, 0x00, 0x00, 0xf6, 0xb5, 0xa0, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x5c, + 0xab, 0xaa, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x7e, 0xed, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0xab, 0xbb, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xfe, 0xee, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf7, 0xff, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xbf, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/eye.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define eye_width 64 +#define eye_height 54 +static char eye_bits[] = { + 0x00, 0x00, 0x0a, 0x92, 0x02, 0x00, 0x20, 0x45, 0x11, 0x22, 0xa1, 0xfd, + 0x6d, 0x4b, 0x8a, 0x90, 0x04, 0x48, 0xed, 0x6f, 0xff, 0x0d, 0x49, 0x16, + 0x40, 0xb5, 0x7e, 0xfb, 0xdb, 0xfe, 0x66, 0xc9, 0x51, 0xab, 0x95, 0xdf, + 0xff, 0xf7, 0x5b, 0xb6, 0xe8, 0x54, 0xc0, 0xea, 0xfe, 0x7f, 0xff, 0xeb, + 0xba, 0x17, 0x12, 0xf4, 0xbb, 0xed, 0x6b, 0xbf, 0xcc, 0x42, 0x80, 0x48, + 0xef, 0xff, 0xff, 0xf5, 0x75, 0x10, 0x09, 0xa2, 0xfd, 0x7f, 0xdb, 0x5f, + 0x9a, 0x06, 0xa0, 0x58, 0x6f, 0xdb, 0x7f, 0xfb, 0x06, 0x41, 0x04, 0xa8, + 0xfd, 0xff, 0xff, 0xef, 0x61, 0x00, 0x81, 0xc6, 0xaa, 0xf7, 0x6d, 0xbd, + 0x09, 0x14, 0x10, 0x58, 0xff, 0xfd, 0xff, 0xf7, 0x80, 0x00, 0x41, 0xed, + 0x76, 0x7f, 0xdb, 0x7f, 0x15, 0x20, 0x74, 0xba, 0xdf, 0xdf, 0xff, 0xee, + 0x00, 0x85, 0xd0, 0xef, 0xfb, 0xf7, 0xff, 0xff, 0x24, 0x10, 0xbe, 0xfd, + 0xfe, 0xff, 0x77, 0xbb, 0x00, 0x42, 0xed, 0xff, 0xff, 0xff, 0xfe, 0xdf, + 0xa9, 0xe8, 0xff, 0xd7, 0xff, 0xff, 0xbf, 0xf7, 0x00, 0x70, 0x07, 0xcd, + 0xfd, 0xf7, 0xff, 0xff, 0x44, 0xde, 0xa0, 0x7b, 0xff, 0xfe, 0xfb, 0xbe, + 0x10, 0x7c, 0xcc, 0xfe, 0xbf, 0xff, 0xbf, 0xef, 0x41, 0x3f, 0xfc, 0xff, + 0xff, 0xff, 0xef, 0xff, 0x94, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, + 0xc1, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xc8, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xee, 0xa0, 0xeb, 0xeb, 0xea, 0xff, 0xff, 0xbf, 0xbf, + 0xda, 0xf5, 0xee, 0xe7, 0xff, 0xff, 0xff, 0xff, 0x60, 0xbf, 0x61, 0xf7, + 0xff, 0xff, 0xff, 0xed, 0x98, 0xfa, 0xf0, 0xfd, 0xff, 0xdb, 0xdf, 0xbf, + 0xe1, 0x3f, 0xe0, 0xf7, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x07, 0xf0, 0xff, + 0xff, 0xeb, 0xf7, 0x37, 0x88, 0x05, 0xe2, 0xfe, 0xff, 0x57, 0x7f, 0xdf, + 0x20, 0x50, 0xc0, 0xff, 0xff, 0xe9, 0xff, 0x55, 0x01, 0x30, 0xc0, 0xff, + 0xf7, 0xf7, 0x5f, 0x37, 0x00, 0x84, 0xc0, 0xff, 0x7f, 0xdb, 0xff, 0x8c, + 0x00, 0x00, 0x82, 0xdf, 0xfb, 0xf5, 0x37, 0x93, 0x00, 0x69, 0x08, 0xf7, + 0xbf, 0xda, 0x3e, 0x25, 0x00, 0x80, 0x01, 0xfc, 0x7f, 0xf7, 0xcf, 0x22, + 0x00, 0x40, 0x12, 0xf8, 0x97, 0xfd, 0x33, 0x44, 0x00, 0x90, 0x94, 0x44, + 0xf5, 0xdf, 0xae, 0x10, 0x00, 0x02, 0x32, 0xa0, 0xbe, 0xf5, 0x3f, 0x45, + 0x00, 0xa0, 0xdc, 0xd5, 0xf1, 0xbf, 0x0a, 0x00, 0x00, 0x00, 0xec, 0x7f, + 0x5f, 0xef, 0x5f, 0x12, 0x00, 0x48, 0x65, 0xdf, 0xfb, 0xfb, 0x0f, 0x00, + 0x00, 0x00, 0xba, 0xf5, 0xfe, 0xff, 0x45, 0x21, 0x00, 0x80, 0xb0, 0xff, + 0xbf, 0xff, 0x23, 0x08, 0x00, 0x20, 0xf2, 0xde, 0xfb, 0xdf, 0x08, 0x00, + 0x00, 0x00, 0x40, 0xf7, 0xfe, 0x77, 0x02, 0x41, 0x00, 0x04, 0x94, 0xbd, + 0xef, 0xbd, 0x40, 0x10, 0x00, 0x00, 0xa0, 0xea, 0x7f, 0x1f, 0x0a, 0x04, + 0x08, 0x01, 0x09, 0xfd, 0xfe, 0x87, 0x00, 0x00, 0x00, 0x00, 0x40, 0xaa, + 0xbb, 0x15, 0x40, 0x00, 0x00, 0x00, 0x10, 0xd4, 0xef, 0x41, 0x04, 0x21};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/filing.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define filing_width 64 +#define filing_height 54 +static char filing_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x13, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x44, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x11, 0x91, 0x01, 0x00, 0x00, + 0x00, 0xf0, 0x44, 0x44, 0x44, 0x06, 0x00, 0x00, 0x00, 0x1c, 0x11, 0x11, + 0x11, 0x19, 0x00, 0x00, 0x00, 0x4c, 0x44, 0x44, 0x44, 0x74, 0x00, 0x00, + 0x00, 0x34, 0x11, 0x11, 0x11, 0x6e, 0x00, 0x00, 0x00, 0xc4, 0x44, 0x44, + 0xc4, 0x55, 0x00, 0x00, 0x00, 0x04, 0x13, 0x11, 0xb9, 0x6a, 0x00, 0x00, + 0x00, 0x04, 0x4c, 0x44, 0x57, 0x55, 0x00, 0x00, 0x00, 0x04, 0x30, 0xf1, + 0xaa, 0x6a, 0x00, 0x00, 0x00, 0x04, 0xc0, 0x5c, 0x55, 0x55, 0x00, 0x00, + 0x00, 0x04, 0x00, 0xab, 0xaa, 0x6a, 0x00, 0x00, 0x00, 0x84, 0x00, 0x56, + 0x55, 0x55, 0x00, 0x00, 0x00, 0x84, 0x01, 0xaa, 0xaa, 0x6a, 0x00, 0x00, + 0x00, 0x04, 0x16, 0x56, 0x55, 0x55, 0x00, 0x00, 0x00, 0x04, 0x18, 0xaa, + 0xaa, 0x6a, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x56, 0x55, 0x55, 0x00, 0x00, + 0x00, 0x1d, 0x00, 0xaa, 0xaa, 0x6a, 0x00, 0x00, 0x00, 0x71, 0x00, 0x56, + 0x55, 0x55, 0x00, 0x00, 0x00, 0xc1, 0x01, 0xaa, 0xaa, 0x6a, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x56, 0x55, 0x55, 0x00, 0x00, 0x00, 0x01, 0x1c, 0xaa, + 0xaa, 0x6a, 0x00, 0x00, 0x00, 0x01, 0x70, 0x56, 0x55, 0x55, 0x00, 0x00, + 0x00, 0x01, 0xc0, 0xab, 0xaa, 0x6a, 0x00, 0x00, 0x00, 0x21, 0x00, 0x57, + 0x55, 0x55, 0x00, 0x00, 0x00, 0x61, 0x00, 0xab, 0xaa, 0x6a, 0x00, 0x00, + 0x00, 0x81, 0x05, 0x57, 0x55, 0x55, 0x00, 0x00, 0x00, 0x01, 0x06, 0xab, + 0xaa, 0x6a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x57, 0x55, 0x55, 0x00, 0x00, + 0x00, 0x0c, 0x00, 0xab, 0xaa, 0x6a, 0x00, 0x00, 0x00, 0x34, 0x00, 0x57, + 0x55, 0x55, 0x00, 0x00, 0x00, 0xc4, 0x00, 0xab, 0xaa, 0x6a, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x57, 0x55, 0x55, 0x00, 0x00, 0x00, 0x04, 0x0c, 0xab, + 0xaa, 0x6a, 0x00, 0x00, 0x00, 0x04, 0x30, 0x57, 0x55, 0x55, 0x00, 0x00, + 0x00, 0x04, 0xc0, 0xab, 0xaa, 0x6a, 0x00, 0x00, 0x00, 0x84, 0x00, 0x56, + 0x55, 0x55, 0x00, 0x00, 0x00, 0x84, 0x01, 0xaa, 0xaa, 0x6a, 0x00, 0x00, + 0x00, 0x04, 0x16, 0x56, 0x55, 0x55, 0x00, 0x00, 0x00, 0x04, 0x18, 0xaa, + 0xaa, 0x6a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x56, 0x55, 0x75, 0x00, 0x00, + 0x00, 0x30, 0x00, 0xaa, 0xaa, 0xbe, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x56, + 0xd5, 0xef, 0x06, 0x00, 0x00, 0x00, 0x03, 0xaa, 0xfa, 0xbb, 0x1b, 0x00, + 0x00, 0x00, 0x0c, 0x56, 0xef, 0xee, 0x6e, 0x00, 0x00, 0x00, 0x30, 0xea, + 0xbb, 0xbb, 0x3b, 0x00, 0x00, 0x00, 0xc0, 0xfe, 0xee, 0xee, 0x6e, 0x00, + 0x00, 0x00, 0x00, 0xbf, 0xbb, 0xbb, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/finger.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define finger_width 64 +#define finger_height 54 +static char finger_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x26, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x88, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x03, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x84, 0x83, 0x03, 0x00, 0x00, 0x00, 0x00, 0x08, 0x6c, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x08, 0x38, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x2e, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x11, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x58, 0x08, 0x00, 0x60, 0x00, 0x00, + 0x00, 0x00, 0xc4, 0x07, 0x3c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, + 0x47, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x84, 0xf0, 0x40, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x3f, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0a, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x18, 0x12, 0x04, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x11, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x48, 0x09, + 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x88, 0x07, 0x0c, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x02, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x07, + 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x30, 0x09, 0x70, 0x40, 0x01, 0x00, + 0x00, 0x00, 0xa0, 0x48, 0xc1, 0x0b, 0x03, 0x00, 0x00, 0x00, 0xc0, 0x08, + 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, 0x80, 0x07, 0x04, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x07, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/galaxy.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,38 @@ +#define galaxy_width 64 +#define galaxy_height 64 +static char galaxy_bits[] = { + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0xff,0xff, + 0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfe,0xff,0xf7,0xff,0xff,0xfd,0xff, + 0x1f,0x7b,0xff,0xf3,0xff,0xff,0xfd,0xff,0x07,0xff,0xff,0xff,0xff,0xff,0xff, + 0x7f,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xe4,0x1f,0x83,0xff,0xff,0xff, + 0xff,0x7f,0xf7,0xbb,0xff,0xff,0xff,0xff,0xff,0x1e,0xff,0xc0,0xee,0xff,0xff, + 0xff,0xff,0x9f,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0x8e,0xf1,0xff,0xff,0xfb, + 0xff,0xff,0xff,0x3f,0xfe,0xaf,0xff,0xe7,0xbf,0xff,0x3f,0xc7,0xff,0x73,0xfe, + 0xff,0xbf,0xff,0xff,0xf7,0xee,0xff,0xf9,0x7f,0xbf,0xff,0x7f,0xf9,0x4f,0xff, + 0xf7,0xff,0xff,0xff,0xff,0xfd,0x9f,0xfb,0x8f,0xff,0xfd,0xff,0xff,0xec,0xd6, + 0xff,0xff,0xff,0xff,0xff,0x7f,0x6d,0xf6,0xdf,0xff,0xfc,0xff,0xff,0x3d,0xff, + 0xf6,0xa3,0xff,0xff,0xfd,0xff,0xbf,0x7d,0x57,0x10,0xfd,0xff,0xfb,0xff,0xb9, + 0x75,0x4f,0x20,0xf8,0xf7,0xff,0xff,0x73,0x74,0x0f,0xf0,0xf9,0xf7,0xfd,0xff, + 0x7f,0xdc,0x0e,0x29,0xc3,0xff,0xff,0xff,0x77,0xec,0x0f,0xe0,0xe7,0xff,0xff, + 0xff,0xff,0xec,0x27,0x48,0x9f,0xef,0xff,0xff,0xef,0xe9,0x07,0x90,0x7e,0xef, + 0xff,0xff,0xbe,0x33,0x22,0x60,0x5f,0xff,0xff,0xff,0xff,0xf6,0x89,0xe0,0xfb, + 0xfe,0xff,0xff,0xff,0xc9,0x1f,0xb0,0xbf,0xfe,0xff,0xff,0xff,0x1f,0xc0,0x1a, + 0xfe,0xed,0xff,0xff,0xff,0xcf,0x7f,0x70,0xbd,0xfe,0xff,0xff,0xff,0xbf,0xc7, + 0x70,0x3c,0xfe,0xff,0xff,0xf7,0xff,0xfa,0x3f,0xa7,0xef,0xff,0xff,0xef,0xfb, + 0x0f,0x9f,0xbf,0xfe,0xff,0xff,0xcf,0xf7,0xff,0xdf,0xbf,0xfe,0xff,0xff,0xdf, + 0xe7,0xff,0xe7,0x7f,0xfb,0xff,0xff,0xbf,0x7f,0x73,0x61,0xba,0xff,0xff,0xff, + 0xff,0xff,0xc0,0xfc,0xbb,0xff,0xff,0xff,0xff,0xef,0x1f,0x7a,0xcb,0xff,0xdf, + 0xff,0xff,0xf9,0x77,0xbf,0xcf,0xff,0xdf,0xff,0xff,0x73,0xf9,0xff,0xef,0xff, + 0xdf,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xfb, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0x8f,0xff,0xff, + 0xfe,0xff,0xff,0xff,0xff,0x7f,0xe8,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0x1f, + 0xf9,0xff,0xff,0xfe,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf3,0x7f,0xff, + 0xff,0x7f,0xff,0xff,0xcf,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/gnu.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,33 @@ +#define gnu_width 50 +#define gnu_height 50 +static unsigned char gnu_bits[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xf3, 0xff, 0x8f, 0xff, 0xe1, 0xff, 0xff, 0xf9, 0x3f, 0x22, + 0xfe, 0xcb, 0xff, 0xff, 0xf8, 0xc3, 0xf8, 0xfc, 0xcb, 0xff, 0x7f, 0xfc, + 0xe0, 0xf9, 0xf9, 0xdb, 0xff, 0x7f, 0xfc, 0xf0, 0xfb, 0xf3, 0xd9, 0xff, + 0x3f, 0x7e, 0xf8, 0xff, 0xf7, 0xcc, 0xff, 0x9f, 0x3e, 0x1c, 0x7f, 0x44, + 0xce, 0xff, 0xcf, 0x1e, 0xcc, 0x01, 0x00, 0xe7, 0xff, 0xef, 0x0e, 0xce, + 0x38, 0x1c, 0xe0, 0xff, 0xef, 0x0e, 0x27, 0xfe, 0xfa, 0xc3, 0xff, 0xef, + 0x7c, 0x93, 0xff, 0xe5, 0xbf, 0xff, 0xef, 0x99, 0xc9, 0xab, 0x2a, 0x00, + 0xff, 0xcf, 0xc3, 0x24, 0x54, 0xc5, 0xd5, 0xff, 0x9f, 0x7f, 0x16, 0xab, + 0xca, 0xff, 0xff, 0x1f, 0x1f, 0x93, 0x46, 0x95, 0xff, 0xff, 0x7f, 0xc8, + 0x49, 0x99, 0x8a, 0xff, 0xff, 0xff, 0xf0, 0x49, 0x4b, 0x95, 0xff, 0xff, + 0xff, 0xf9, 0x4c, 0x88, 0x8a, 0xff, 0xff, 0xff, 0x1e, 0xe6, 0x58, 0x95, + 0xff, 0xff, 0x3f, 0x00, 0xe6, 0xb7, 0x0a, 0xff, 0xff, 0xbf, 0x8a, 0xea, + 0x50, 0x15, 0xff, 0xff, 0xff, 0x8f, 0xca, 0x99, 0x2a, 0xff, 0xff, 0xff, + 0xa7, 0x95, 0x7f, 0x15, 0xff, 0xff, 0xff, 0x23, 0x55, 0x7f, 0x2a, 0xfe, + 0xff, 0xff, 0x63, 0xd8, 0xfc, 0x14, 0xfe, 0xff, 0xff, 0x43, 0x9a, 0xfb, + 0x2b, 0xfe, 0xff, 0xff, 0xc3, 0xaa, 0x12, 0x94, 0xfc, 0xff, 0xff, 0xc1, + 0x32, 0xd5, 0xc1, 0xfd, 0xff, 0xff, 0x81, 0x46, 0xd5, 0x47, 0xfc, 0xff, + 0xff, 0x83, 0x6c, 0xc2, 0x6e, 0xfc, 0xff, 0xff, 0x83, 0x89, 0x88, 0x69, + 0xfe, 0xff, 0xff, 0x07, 0x92, 0x09, 0x3b, 0xfe, 0xff, 0xff, 0x07, 0x22, + 0x01, 0x3c, 0xfe, 0xff, 0xff, 0x0f, 0x4e, 0x02, 0x03, 0xfe, 0xff, 0xff, + 0x2f, 0xd0, 0x18, 0x3e, 0xff, 0xff, 0xff, 0x3f, 0xb0, 0x19, 0x9e, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0x09, 0x80, 0xff, 0xff, 0xff, 0x7f, 0x01, 0xe3, + 0xc1, 0xff, 0xff, 0xff, 0xff, 0x05, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xfd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/gopher.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define xgopher_width 64 +#define xgopher_height 54 +static char xgopher_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x76, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x39, 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf9, + 0xc3, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x06, 0x03, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x30, 0x0e, 0x07, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x78, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x20, 0x0f, 0xf8, 0x01, + 0x80, 0x3f, 0xf8, 0xf0, 0xff, 0x1f, 0x06, 0x06, 0xc0, 0xc0, 0xf8, 0xff, + 0xff, 0x97, 0x01, 0x0c, 0x20, 0x80, 0xf9, 0xff, 0xff, 0xe3, 0xf0, 0x08, + 0x90, 0x07, 0x1f, 0xff, 0xff, 0x40, 0xf8, 0x11, 0xd8, 0x1f, 0x26, 0x38, + 0x38, 0x4c, 0xfc, 0x12, 0xe8, 0x3f, 0x1a, 0xc0, 0x07, 0x90, 0x9e, 0x20, + 0x28, 0x3e, 0x8e, 0x01, 0xc0, 0xa3, 0x1f, 0x20, 0x08, 0x7e, 0xe4, 0x07, + 0x70, 0x8e, 0x0f, 0x20, 0x08, 0x7c, 0x31, 0x08, 0x10, 0x90, 0x03, 0x20, + 0x08, 0xf8, 0x11, 0x30, 0x08, 0x10, 0x07, 0x20, 0x18, 0xf8, 0x09, 0x20, + 0x08, 0x20, 0x07, 0x20, 0x18, 0xf0, 0x89, 0x67, 0xe8, 0x21, 0x03, 0x10, + 0x30, 0xa0, 0xe9, 0x67, 0xe8, 0xe7, 0x03, 0x10, 0x20, 0xc0, 0x01, 0x40, + 0x0b, 0x00, 0x03, 0x08, 0x60, 0xe0, 0x31, 0x80, 0x07, 0x58, 0x07, 0x04, + 0xc0, 0x41, 0x00, 0xc0, 0x0f, 0x00, 0x06, 0x03, 0x00, 0xdf, 0x0f, 0xc0, + 0x0f, 0xe0, 0xff, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0xc0, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0x00, 0xc0, 0x40, 0x0f, 0x00, 0x02, 0xf0, 0x87, 0x01, + 0x00, 0xe0, 0xc0, 0x00, 0x07, 0x0c, 0x06, 0x00, 0x00, 0xbe, 0x00, 0xff, + 0xff, 0xe3, 0x7b, 0x00, 0x80, 0x81, 0x13, 0x1e, 0xc2, 0xf1, 0x80, 0x01, + 0x00, 0x00, 0x3e, 0x08, 0xc2, 0x11, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, + 0xc2, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, 0x40, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, + 0x3f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x1f, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xcc, 0x8f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x28, 0x60, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, + 0x39, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x7f, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0xc0, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xd0, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0xf0, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x20, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x20, 0x72, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/help.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define help_width 64 +#define help_height 54 +static char help_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xe0, 0x01, 0x00, + 0x00, 0xe0, 0x0f, 0x20, 0x02, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x1f, 0x84, + 0x48, 0xf8, 0x07, 0x00, 0x00, 0xf8, 0x3f, 0x50, 0x95, 0xfc, 0x0f, 0x00, + 0x00, 0xfc, 0x7f, 0xaa, 0x2a, 0xfe, 0x1f, 0x00, 0x00, 0xfc, 0xff, 0x55, + 0x55, 0xff, 0x1f, 0x00, 0x00, 0xf2, 0xff, 0xfb, 0xaf, 0xff, 0x3f, 0x00, + 0x00, 0xe2, 0xff, 0x0f, 0xf8, 0xff, 0x27, 0x00, 0x00, 0xc1, 0xff, 0x03, + 0xe0, 0xff, 0x23, 0x00, 0x00, 0x81, 0xff, 0x01, 0xc0, 0xff, 0x41, 0x00, + 0x00, 0x01, 0xff, 0x00, 0x80, 0xff, 0x40, 0x00, 0x80, 0x00, 0x7e, 0x00, + 0x00, 0x7f, 0x80, 0x00, 0x80, 0x00, 0x3c, 0x00, 0x00, 0x3e, 0x80, 0x00, + 0x80, 0x00, 0x1a, 0x00, 0x00, 0x5c, 0x80, 0x00, 0x80, 0x00, 0x14, 0x00, + 0x00, 0x28, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x40, 0x00, 0xe7, 0xfe, 0x0e, 0x3f, 0x00, 0x01, 0x40, 0x00, 0x42, 0x84, + 0x04, 0x62, 0x00, 0x01, 0x40, 0x00, 0x42, 0x04, 0x04, 0x42, 0x00, 0x01, + 0x40, 0x00, 0x42, 0x44, 0x04, 0x62, 0x00, 0x01, 0x40, 0x00, 0x7e, 0x7c, + 0x04, 0x3e, 0x00, 0x01, 0x40, 0x00, 0x42, 0x44, 0x04, 0x02, 0x00, 0x01, + 0x40, 0x00, 0x42, 0x04, 0x04, 0x02, 0x00, 0x01, 0x40, 0x00, 0x42, 0x84, + 0x44, 0x02, 0x00, 0x01, 0x80, 0x00, 0xe7, 0xfe, 0x7e, 0x07, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x38, 0x00, + 0x00, 0x0e, 0x80, 0x00, 0x80, 0x00, 0x7c, 0x00, 0x00, 0x1f, 0x80, 0x00, + 0x00, 0x01, 0xfe, 0x00, 0x80, 0x3f, 0x40, 0x00, 0x00, 0x01, 0xff, 0x01, + 0xc0, 0x7f, 0x40, 0x00, 0x00, 0x82, 0xff, 0x03, 0xe0, 0xff, 0x20, 0x00, + 0x00, 0xc2, 0xff, 0x0f, 0xf8, 0xff, 0x21, 0x00, 0x00, 0xe2, 0xff, 0xfb, + 0xe7, 0xff, 0x13, 0x00, 0x00, 0xf4, 0xff, 0x01, 0xc0, 0xff, 0x17, 0x00, + 0x00, 0xfc, 0xff, 0x00, 0x80, 0xff, 0x0f, 0x00, 0x00, 0xf8, 0x7f, 0x00, + 0x00, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0xfe, 0x07, 0x00, + 0x00, 0xe0, 0x1f, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0xc0, 0x0f, 0x00, + 0x00, 0xf8, 0x01, 0x00, 0x00, 0x80, 0x47, 0x00, 0x80, 0xf4, 0x00, 0x00, + 0x00, 0x00, 0x17, 0x12, 0x21, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x45, + 0x54, 0x1d, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xaa, 0xaa, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x57, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/hourglass.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define hourglass_width 64 +#define hourglass_height 54 +static char hourglass_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x58, 0x25, 0x11, 0x04, 0x82, 0x10, 0x49, 0x15, + 0x58, 0x25, 0x55, 0x95, 0xaa, 0x54, 0x49, 0x15, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xc0, 0xdf, 0x80, 0x03, 0x78, 0x00, 0xe2, 0x03, + 0xc0, 0x7a, 0x80, 0x02, 0x58, 0x00, 0xd4, 0x02, 0xc0, 0x5a, 0x80, 0x00, + 0x58, 0x00, 0xd4, 0x02, 0xc0, 0x1a, 0x00, 0x02, 0x58, 0x00, 0xd4, 0x02, + 0xc0, 0x32, 0x80, 0x02, 0x58, 0x00, 0xca, 0x02, 0xc0, 0x32, 0x80, 0x02, + 0x58, 0x00, 0xca, 0x02, 0xc0, 0x52, 0x81, 0x00, 0x58, 0x00, 0xca, 0x02, + 0xc0, 0xa2, 0x00, 0x82, 0x5a, 0x00, 0xc5, 0x02, 0xc0, 0xe2, 0x80, 0xd0, + 0x5d, 0x00, 0xc5, 0x02, 0xc0, 0x42, 0x81, 0x7e, 0x59, 0x80, 0xc2, 0x02, + 0xc0, 0x82, 0x83, 0xdf, 0x5c, 0x41, 0xc1, 0x02, 0xc0, 0x02, 0xe7, 0xbf, + 0xd9, 0xa4, 0xc0, 0x02, 0xc0, 0x02, 0xfa, 0xdb, 0x5a, 0x53, 0xc0, 0x02, + 0xc0, 0x02, 0xec, 0xef, 0xdd, 0x24, 0xc0, 0x02, 0xc0, 0x02, 0x98, 0xbf, + 0x5a, 0x19, 0xc0, 0x02, 0xc0, 0x02, 0x60, 0xd6, 0x59, 0x06, 0xc0, 0x02, + 0xc0, 0x02, 0x80, 0xb9, 0xda, 0x01, 0xc0, 0x02, 0xc0, 0x02, 0x80, 0xa7, + 0x5d, 0x00, 0xc0, 0x02, 0xc0, 0x02, 0x80, 0xcd, 0x59, 0x00, 0xc0, 0x02, + 0xc0, 0x02, 0x80, 0x95, 0x5b, 0x00, 0xc0, 0x02, 0xc0, 0x02, 0x80, 0xa5, + 0x5c, 0x00, 0xc0, 0x02, 0xc0, 0x02, 0x80, 0x25, 0x5d, 0x00, 0xc0, 0x02, + 0xc0, 0x02, 0x80, 0xa5, 0x5c, 0x00, 0xc0, 0x02, 0xc0, 0x02, 0x80, 0x65, + 0x5d, 0x00, 0xc0, 0x02, 0xc0, 0x02, 0x80, 0xd5, 0x5a, 0x00, 0xc0, 0x02, + 0xc0, 0x02, 0x80, 0x2d, 0x5d, 0x00, 0xc0, 0x02, 0xc0, 0x02, 0x80, 0x97, + 0x59, 0x00, 0xc0, 0x02, 0xc0, 0x02, 0x80, 0x03, 0xd9, 0x01, 0xc0, 0x02, + 0xc0, 0x02, 0xe0, 0x84, 0x58, 0x06, 0xc0, 0x02, 0xc0, 0x02, 0xd8, 0x02, + 0x59, 0x19, 0xc0, 0x02, 0xc0, 0x02, 0x34, 0x82, 0x5a, 0x24, 0xc0, 0x02, + 0xc0, 0x02, 0x8a, 0x00, 0x58, 0x50, 0xc0, 0x02, 0xc0, 0x02, 0x85, 0x02, + 0x58, 0xa0, 0xc0, 0x02, 0xc0, 0x82, 0x83, 0x82, 0x59, 0x40, 0xc1, 0x02, + 0xc0, 0xc2, 0x01, 0x42, 0x5e, 0x80, 0xc2, 0x02, 0xc0, 0xe2, 0x80, 0xea, + 0x5a, 0x00, 0xc5, 0x02, 0xc0, 0xa2, 0x80, 0x5e, 0x5d, 0x00, 0xc5, 0x02, + 0xc0, 0x72, 0x81, 0xba, 0xdd, 0x00, 0xca, 0x02, 0xc0, 0xd2, 0x80, 0x6f, + 0x5a, 0x01, 0xca, 0x02, 0xc0, 0x2a, 0xc1, 0xf6, 0x59, 0x03, 0xd4, 0x02, + 0xc0, 0xba, 0xe0, 0x55, 0x5a, 0x04, 0xd4, 0x02, 0xc0, 0x6a, 0x79, 0xaf, + 0x5c, 0x09, 0xd4, 0x02, 0xc0, 0xaa, 0xfd, 0x5b, 0xda, 0x34, 0xd4, 0x02, + 0xc0, 0xd6, 0xfe, 0x6f, 0x5c, 0x50, 0xe8, 0x02, 0xc0, 0xb6, 0xff, 0x37, + 0x5b, 0xa5, 0xe9, 0x02, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x58, 0x25, 0x11, 0x04, 0x82, 0x10, 0x49, 0x15, 0x58, 0x25, 0x55, 0xa5, + 0xaa, 0x54, 0x49, 0x15, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/kotl.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define kotl.xbm_width 64 +#define kotl.xbm_height 64 +static char kotl.xbm_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x60, 0xfc, 0xff, 0xfc, 0x7f, 0x0e, 0x00, + 0x1c, 0x70, 0xfc, 0xff, 0xfc, 0x7f, 0x0e, 0x00, 0x1c, 0x38, 0xfc, 0xff, + 0xfc, 0x7f, 0x0e, 0x00, 0x1c, 0x1c, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, + 0x1c, 0x0e, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, 0x1c, 0x07, 0x1c, 0xe0, + 0x80, 0x03, 0x0e, 0x00, 0x9c, 0x03, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, + 0xdc, 0x01, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, 0xfc, 0x00, 0x1c, 0xe0, + 0x80, 0x03, 0x0e, 0x00, 0x7c, 0x00, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, + 0x3c, 0x00, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, 0x3c, 0x00, 0x1c, 0xe0, + 0x80, 0x03, 0x0e, 0x00, 0x7c, 0x00, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, + 0xfc, 0x00, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, 0xfc, 0x00, 0x1c, 0xe0, + 0x80, 0x03, 0x0e, 0x00, 0xdc, 0x01, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, + 0xdc, 0x01, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, 0x9c, 0x03, 0x1c, 0xe0, + 0x80, 0x03, 0x0e, 0x00, 0x9c, 0x03, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, + 0x1c, 0x07, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, 0x1c, 0x07, 0x1c, 0xe0, + 0x80, 0x03, 0x0e, 0x00, 0x1c, 0x0e, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, + 0x1c, 0x0e, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, 0x1c, 0x1c, 0x1c, 0xe0, + 0x80, 0x03, 0x0e, 0x00, 0x1c, 0x1c, 0x1c, 0xe0, 0x80, 0x03, 0x0e, 0x00, + 0x1c, 0x38, 0xfc, 0xff, 0x80, 0x03, 0xfe, 0x3f, 0x1c, 0x78, 0xfc, 0xff, + 0x80, 0x03, 0xfe, 0x3f, 0x1c, 0x70, 0xfc, 0xff, 0x80, 0x03, 0xfe, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/library.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define library_width 64 +#define library_height 54 +static char library_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x04, 0x00, 0x00, + 0x00, 0x80, 0x3f, 0x00, 0xa0, 0x07, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, + 0x60, 0x04, 0x00, 0x00, 0x00, 0x80, 0x2e, 0xfc, 0x3f, 0x06, 0x00, 0x00, + 0x00, 0x80, 0x2a, 0x04, 0xe0, 0x05, 0x00, 0x00, 0x00, 0x80, 0x2e, 0x04, + 0x20, 0xff, 0x00, 0x00, 0x00, 0x80, 0x20, 0x04, 0xe0, 0x84, 0x00, 0x00, + 0x00, 0x80, 0x20, 0x04, 0x20, 0x87, 0x00, 0x00, 0x00, 0x80, 0x20, 0x54, + 0x63, 0xb4, 0x00, 0x00, 0x00, 0x80, 0x2a, 0xb4, 0xae, 0xa7, 0x00, 0x00, + 0x00, 0x86, 0x2c, 0x04, 0xe0, 0x84, 0x30, 0x00, 0x00, 0x85, 0xe8, 0x07, + 0x20, 0xb6, 0x50, 0x00, 0x00, 0x85, 0xec, 0x47, 0xe1, 0x84, 0x50, 0x00, + 0xe0, 0xce, 0x62, 0x46, 0xa2, 0x97, 0xb9, 0x03, 0x30, 0xd8, 0x60, 0xc7, + 0xe2, 0x95, 0x0d, 0x06, 0x90, 0xf0, 0xe6, 0x07, 0x23, 0xa7, 0x87, 0x04, + 0xc8, 0xe0, 0xe4, 0x46, 0x61, 0x84, 0x83, 0x09, 0x08, 0xc0, 0x6c, 0x87, + 0xa0, 0x87, 0x01, 0x08, 0x04, 0xc0, 0xe2, 0x07, 0xe1, 0xb5, 0x01, 0x10, + 0xa4, 0xc3, 0x64, 0xc6, 0x20, 0xa7, 0xe1, 0x12, 0x54, 0xc4, 0x62, 0x47, + 0xe2, 0x84, 0x11, 0x15, 0x34, 0xc4, 0xea, 0x47, 0x20, 0xb7, 0x11, 0x16, + 0x18, 0xc8, 0x6e, 0x87, 0x62, 0xa4, 0x09, 0x0c, 0x00, 0xc8, 0xe0, 0x86, + 0xa1, 0x87, 0x09, 0x00, 0x00, 0xc8, 0x62, 0x06, 0xe3, 0xa5, 0x09, 0x00, + 0x00, 0xcc, 0xe4, 0x47, 0x20, 0x96, 0x19, 0x00, 0x00, 0xc4, 0xe2, 0x07, + 0xe3, 0x94, 0x11, 0x00, 0x00, 0xc6, 0x60, 0x06, 0xa3, 0x87, 0x31, 0x00, + 0x00, 0xc3, 0xe0, 0xc7, 0xe2, 0x95, 0x61, 0x00, 0x80, 0xc1, 0x7f, 0x07, + 0x61, 0xa6, 0xc1, 0x00, 0xc0, 0xc0, 0xe4, 0x46, 0x60, 0xa5, 0x81, 0x01, + 0x60, 0xc0, 0x6a, 0x87, 0xa3, 0x97, 0x01, 0x03, 0x30, 0xc0, 0x7f, 0xc7, + 0x63, 0xb5, 0x01, 0x06, 0x18, 0xc0, 0xe0, 0x07, 0xa1, 0xa6, 0x01, 0x0c, + 0x08, 0xc0, 0xe0, 0xc7, 0xe1, 0x95, 0x01, 0x08, 0x08, 0xc0, 0xe0, 0x07, + 0x20, 0x87, 0x01, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/lisp.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define lisp.xbm_width 64 +#define lisp.xbm_height 64 +static char lisp.xbm_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x80, 0xc7, 0x0f, 0x00, + 0x00, 0x0e, 0x00, 0x38, 0xf0, 0xc7, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x38, + 0xfc, 0xc7, 0x7d, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x3e, 0xc0, 0x79, 0x00, + 0x00, 0x0e, 0x00, 0x38, 0x1e, 0xc0, 0xf1, 0x00, 0x00, 0x0e, 0x00, 0x38, + 0x0f, 0xc0, 0xe1, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x07, 0xc0, 0xe1, 0x00, + 0x00, 0x0e, 0x00, 0x38, 0x07, 0xc0, 0xc1, 0x01, 0x00, 0x0e, 0x00, 0x38, + 0x03, 0xc0, 0xc1, 0x01, 0x00, 0x0e, 0x00, 0x38, 0x03, 0xc0, 0xc1, 0x01, + 0x00, 0x0e, 0x00, 0x38, 0x03, 0xc0, 0xc1, 0x01, 0x00, 0x0e, 0x00, 0x38, + 0x07, 0xc0, 0xc1, 0x01, 0x00, 0x0e, 0x00, 0x38, 0x07, 0xc0, 0xc1, 0x01, + 0x00, 0x0e, 0x00, 0x38, 0x07, 0xc0, 0xc1, 0x01, 0x00, 0x0e, 0x00, 0x38, + 0x0e, 0xc0, 0xe1, 0x01, 0x00, 0x0e, 0x00, 0x38, 0x1c, 0xc0, 0xf1, 0x00, + 0x00, 0x0e, 0x00, 0x38, 0x38, 0xc0, 0x7f, 0x00, 0x00, 0x0e, 0x00, 0x38, + 0x78, 0xc0, 0x3f, 0x00, 0x00, 0x0e, 0x00, 0x38, 0xf0, 0xc0, 0x07, 0x00, + 0x00, 0x0e, 0x00, 0x38, 0xe0, 0xc1, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x38, + 0xc0, 0xc3, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x80, 0xc3, 0x01, 0x00, + 0x00, 0x0e, 0x00, 0x38, 0x00, 0xc7, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x38, + 0x00, 0xc6, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x00, 0xce, 0x01, 0x00, + 0x00, 0x0e, 0x00, 0x38, 0x00, 0xce, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x38, + 0x00, 0xce, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x00, 0xce, 0x01, 0x00, + 0x00, 0x0e, 0x00, 0x38, 0x00, 0xce, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x38, + 0x00, 0xce, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x00, 0xc7, 0x01, 0x00, + 0x00, 0x0e, 0x00, 0x38, 0x80, 0xc7, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x38, + 0xe0, 0xc3, 0x01, 0x00, 0x00, 0xfe, 0xff, 0x39, 0xf0, 0xc1, 0x01, 0x00, + 0x00, 0xfe, 0xff, 0x39, 0xff, 0xc0, 0x01, 0x00, 0x00, 0xfe, 0xff, 0x39, + 0x7f, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/load.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define load_width 64 +#define load_height 54 +static char load_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x04, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x3e, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x04, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x04, 0x80, 0xff, 0x00, 0x00, 0x00, 0x00, 0x20, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x04, 0x80, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x04, 0xc0, 0xff, 0x01, 0x00, 0x00, 0x00, 0x20, + 0x04, 0xc0, 0xff, 0x01, 0x00, 0x00, 0x00, 0x20, 0x04, 0xe1, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x20, 0x04, 0xe3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x20, + 0x84, 0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x20, 0xc4, 0xf7, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x20, 0xc4, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x20, + 0xc4, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x20, 0xe4, 0xff, 0xff, 0x0f, + 0x00, 0x00, 0x00, 0x20, 0xe4, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x20, + 0xe4, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x20, 0xe4, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0x20, 0xf4, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x20, + 0xf4, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x20, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xf4, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x20, + 0xfc, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x30, 0xfc, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x00, 0x30, 0xfc, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x30, + 0xfc, 0xff, 0xff, 0xff, 0x00, 0x04, 0x00, 0x38, 0xfc, 0xff, 0xff, 0xff, + 0x10, 0x16, 0x00, 0x38, 0xfc, 0xff, 0xff, 0xff, 0x39, 0x1e, 0x02, 0x3c, + 0xfc, 0xff, 0xff, 0xff, 0x7b, 0x3f, 0x27, 0x3e, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/mail.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define MailFull_width 64 +#define MailFull_height 64 +static char MailFull_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x50, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x75, 0xa0, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x7a, + 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x20, 0x8c, 0x79, 0x36, + 0xf8, 0x78, 0x66, 0x78, 0x50, 0xdc, 0xcd, 0x36, 0x98, 0xcd, 0x6e, 0x74, + 0x20, 0xac, 0xfd, 0x36, 0xf8, 0xcc, 0x18, 0x78, 0x50, 0x8c, 0xcd, 0x36, + 0x98, 0xcd, 0x76, 0x74, 0x20, 0x8c, 0xcd, 0xf6, 0xfb, 0x78, 0x66, 0x78, + 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0xa0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7b, 0xd0, 0xff, 0x7f, 0xff, 0xe1, 0xc0, 0xff, 0x77, + 0xa0, 0xff, 0x3f, 0xfe, 0x40, 0x80, 0xff, 0x7b, 0x50, 0x55, 0x15, 0x7c, + 0x00, 0x00, 0x55, 0x75, 0xa0, 0xaa, 0x0a, 0x38, 0x20, 0x80, 0xab, 0x7a, + 0xf8, 0xff, 0x07, 0x30, 0x10, 0xc0, 0xff, 0x7f, 0xfc, 0xff, 0x03, 0x60, + 0x48, 0xe2, 0xff, 0x7f, 0xfe, 0xff, 0x21, 0xc0, 0x24, 0xf1, 0xff, 0x7f, + 0x00, 0x80, 0x40, 0x80, 0x93, 0x38, 0x00, 0x00, 0x00, 0x40, 0x90, 0x00, + 0x4b, 0x1c, 0x00, 0x00, 0x00, 0x40, 0x24, 0x01, 0x26, 0x0e, 0x00, 0x00, + 0x00, 0x80, 0x48, 0x02, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, + 0x98, 0x03, 0x00, 0x00, 0x00, 0x00, 0x22, 0x09, 0xf0, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x44, 0x12, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, + 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x09, 0x9f, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x02, 0xce, 0x03, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, + 0xe4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xf0, 0x03, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x78, 0x07, 0x19, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x7c, 0x8e, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x7e, 0x5c, 0x66, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x3f, 0x38, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x90, + 0x07, 0x10, 0x87, 0x01, 0xe0, 0xff, 0xff, 0xf3, 0x03, 0x08, 0x02, 0x03, + 0x20, 0x00, 0x00, 0x0a, 0x01, 0x04, 0x00, 0x06, 0x20, 0x00, 0xe0, 0x06, + 0x00, 0x02, 0x00, 0x0e, 0x20, 0x00, 0xe0, 0x02, 0x08, 0x01, 0x10, 0x07, + 0x20, 0x00, 0xe0, 0x01, 0x84, 0x20, 0x89, 0x03, 0x20, 0x00, 0x80, 0x00, + 0x42, 0x90, 0xc4, 0x01, 0x20, 0xff, 0x00, 0x01, 0x29, 0x48, 0xe2, 0x00, + 0x20, 0x00, 0x00, 0x82, 0x14, 0x24, 0x70, 0x00, 0x20, 0xdf, 0x03, 0x46, + 0x0a, 0x92, 0x38, 0x00, 0x20, 0x00, 0x00, 0x0e, 0x05, 0x49, 0x1c, 0x00, + 0x20, 0xff, 0x07, 0x9e, 0x08, 0x24, 0x0e, 0x00, 0x20, 0x00, 0x00, 0x2e, + 0x18, 0x10, 0x07, 0x00, 0xe0, 0xff, 0xff, 0x4f, 0x3c, 0x88, 0x03, 0x00, + 0x80, 0xff, 0xff, 0x8f, 0x4e, 0xc0, 0x01, 0x00, 0x80, 0xff, 0xff, 0x0f, + 0x87, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/manpage.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define manpage_width 64 +#define manpage_height 54 +static char manpage_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, + 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x55, 0x92, 0x24, + 0x49, 0x92, 0x3c, 0x00, 0x00, 0x19, 0x49, 0x92, 0x24, 0x49, 0x3c, 0x00, + 0x00, 0x91, 0x24, 0x49, 0x92, 0x24, 0x7d, 0x01, 0x00, 0x59, 0x92, 0x24, + 0x49, 0x92, 0xac, 0x02, 0x00, 0x15, 0x49, 0x92, 0x24, 0x49, 0x7c, 0x01, + 0x00, 0x99, 0x24, 0x49, 0x92, 0x24, 0xbd, 0x02, 0x00, 0x51, 0x92, 0x24, + 0x49, 0x92, 0x7c, 0x01, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x02, + 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x74, 0x01, 0x00, 0x99, 0x73, 0xfe, + 0x38, 0xe7, 0xb4, 0x02, 0x00, 0x91, 0x73, 0xfe, 0x39, 0xe7, 0x7c, 0x01, + 0x00, 0x99, 0x73, 0xfe, 0x39, 0xff, 0xbc, 0x02, 0x00, 0x95, 0x73, 0xce, + 0x39, 0x3c, 0x74, 0x01, 0x00, 0x99, 0x73, 0xce, 0x39, 0x18, 0xb4, 0x02, + 0x00, 0x91, 0x73, 0xce, 0x39, 0x3c, 0x74, 0x01, 0x00, 0x99, 0x7f, 0xce, + 0x39, 0xff, 0xbc, 0x02, 0x00, 0x95, 0x7f, 0xce, 0x39, 0xe7, 0x7c, 0x01, + 0x00, 0x19, 0x3f, 0xce, 0x39, 0xe7, 0xbc, 0x02, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0x01, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x02, + 0x00, 0x55, 0x92, 0x24, 0x49, 0x92, 0x74, 0x01, 0x00, 0x19, 0x49, 0x92, + 0x24, 0x49, 0xb4, 0x02, 0x00, 0x91, 0x24, 0x49, 0x92, 0x24, 0x6d, 0x01, + 0x00, 0x59, 0x92, 0x24, 0x49, 0x92, 0xac, 0x02, 0x00, 0x15, 0x49, 0x92, + 0x24, 0x49, 0x6c, 0x01, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, + 0x00, 0x51, 0x14, 0x63, 0x92, 0x89, 0x7c, 0x01, 0x00, 0x19, 0xaa, 0x94, + 0x52, 0x0a, 0xac, 0x02, 0x00, 0x95, 0xa2, 0x97, 0xd2, 0x0b, 0x75, 0x01, + 0x00, 0x59, 0xa2, 0x94, 0x52, 0x8a, 0xbc, 0x02, 0x00, 0x11, 0xa2, 0x94, + 0x4c, 0x3a, 0x7c, 0x01, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x02, + 0x00, 0x55, 0x92, 0x24, 0x49, 0x92, 0x7c, 0x01, 0x00, 0x19, 0x49, 0x92, + 0x24, 0x49, 0xb4, 0x02, 0x00, 0x91, 0x24, 0x49, 0x92, 0x24, 0x6d, 0x01, + 0x00, 0x59, 0x92, 0x24, 0x49, 0x92, 0xb4, 0x02, 0x00, 0x15, 0x49, 0x92, + 0x24, 0x49, 0x74, 0x01, 0x00, 0x99, 0x24, 0x49, 0x92, 0x24, 0xb5, 0x02, + 0x00, 0x51, 0x92, 0x24, 0x49, 0x92, 0x74, 0x01, 0x00, 0x19, 0x49, 0x92, + 0x24, 0x49, 0xbc, 0x02, 0x00, 0x95, 0x24, 0x49, 0x92, 0x24, 0x7d, 0x01, + 0x00, 0x59, 0x92, 0x24, 0x49, 0x92, 0xac, 0x02, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x00, 0x6e, 0x01, 0x00, 0xee, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x02, + 0x00, 0x51, 0x3f, 0x1e, 0xfb, 0x3f, 0x7d, 0x01, 0x00, 0xb1, 0xfa, 0xaf, + 0xef, 0xff, 0xbb, 0x02, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01, + 0x00, 0xa8, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x02, 0x00, 0x50, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x01, 0x00, 0xa0, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x02};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/manpage2.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define manpage_width 64 +#define manpage_height 54 +static char manpage_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xaa, 0x8a, 0x08, + 0x00, 0xa8, 0x1c, 0x00, 0x00, 0x32, 0x55, 0x00, 0x00, 0x40, 0x3d, 0x00, + 0x00, 0xa2, 0x02, 0x00, 0x00, 0x82, 0x7c, 0x01, 0x00, 0x32, 0x91, 0x04, + 0x26, 0x01, 0xad, 0x02, 0x00, 0xaa, 0xa0, 0x0a, 0x29, 0x80, 0x7c, 0x01, + 0x00, 0x32, 0x41, 0x0e, 0x29, 0x00, 0xbd, 0x02, 0x00, 0xa2, 0x20, 0x02, + 0x29, 0x00, 0x7c, 0x01, 0x00, 0x32, 0x11, 0x0c, 0x66, 0x80, 0xbc, 0x02, + 0x00, 0xaa, 0x02, 0x00, 0x00, 0x50, 0x74, 0x01, 0x00, 0x32, 0x04, 0x00, + 0x00, 0x00, 0xb4, 0x02, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x01, + 0x00, 0xb2, 0x73, 0xfe, 0x38, 0xe7, 0xbc, 0x02, 0x00, 0xaa, 0x73, 0xfe, + 0x39, 0xe7, 0x74, 0x01, 0x00, 0xb2, 0x73, 0xfe, 0x39, 0xff, 0xb4, 0x02, + 0x00, 0xa2, 0x73, 0xce, 0x39, 0x3c, 0x74, 0x01, 0x00, 0xb2, 0x73, 0xce, + 0x39, 0x18, 0xbc, 0x02, 0x00, 0xaa, 0x73, 0xce, 0x39, 0x3c, 0x7c, 0x01, + 0x00, 0xb2, 0x7f, 0xce, 0x39, 0xff, 0xbc, 0x02, 0x00, 0xa2, 0x7f, 0xce, + 0x39, 0xe7, 0x7c, 0x01, 0x00, 0x32, 0x3f, 0xce, 0x39, 0xe7, 0xbc, 0x02, + 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x74, 0x01, 0x00, 0xb2, 0x00, 0x00, + 0x00, 0x00, 0xb4, 0x02, 0x00, 0x22, 0x85, 0x1d, 0x49, 0x00, 0x6d, 0x01, + 0x00, 0xb2, 0x4a, 0xa4, 0x4a, 0xa0, 0xac, 0x02, 0x00, 0x2a, 0x85, 0x9c, + 0x4b, 0x40, 0x6d, 0x01, 0x00, 0xb2, 0x02, 0x85, 0x48, 0x80, 0xb4, 0x02, + 0x00, 0x22, 0xc1, 0x04, 0xdb, 0x00, 0x7d, 0x01, 0x00, 0xb2, 0x00, 0x00, + 0x00, 0x10, 0xac, 0x02, 0x00, 0x2a, 0x09, 0xc6, 0x04, 0x09, 0x75, 0x01, + 0x00, 0xb2, 0x08, 0x29, 0x85, 0x02, 0xbc, 0x02, 0x00, 0x22, 0x38, 0x29, + 0x95, 0x03, 0x7d, 0x01, 0x00, 0xb2, 0x48, 0x29, 0x8d, 0x80, 0xbc, 0x02, + 0x00, 0x2a, 0x39, 0xc6, 0x14, 0x03, 0x7d, 0x01, 0x00, 0xb2, 0x02, 0x00, + 0x00, 0x00, 0xb4, 0x02, 0x00, 0x22, 0x01, 0x00, 0x00, 0x40, 0x6d, 0x01, + 0x00, 0xb2, 0x02, 0x80, 0x00, 0x80, 0xb4, 0x02, 0x00, 0x2a, 0x55, 0x10, + 0x40, 0x01, 0x75, 0x01, 0x00, 0xb2, 0xaa, 0xa2, 0x00, 0x80, 0xb4, 0x02, + 0x00, 0x22, 0x55, 0x55, 0x15, 0x50, 0x75, 0x01, 0x00, 0xb2, 0xaa, 0xaa, + 0x0a, 0xa0, 0xbc, 0x02, 0x00, 0x2a, 0x55, 0x55, 0x55, 0x51, 0x7c, 0x01, + 0x00, 0xb2, 0xaa, 0x22, 0x88, 0x00, 0xac, 0x02, 0x00, 0x62, 0x00, 0x00, + 0x00, 0x00, 0x6e, 0x01, 0x00, 0xdc, 0xff, 0xff, 0xff, 0xff, 0xab, 0x02, + 0x00, 0x62, 0x3f, 0x1e, 0xfb, 0x3f, 0x7d, 0x01, 0x00, 0xa2, 0xfa, 0xaf, + 0xef, 0xff, 0xbb, 0x02, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x01, + 0x00, 0xa0, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x02, 0x00, 0x40, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x01, 0x00, 0x80, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x02};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/match.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define burn_width 64 +#define burn_height 54 +static char burn_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x8d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x84, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, + 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x9a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x62, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, + 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x0d, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc1, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x01, 0x00, 0x00, + 0x00, 0xf0, 0x03, 0xbf, 0x1a, 0x01, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0xd5, + 0x1f, 0x01, 0x00, 0x00, 0x3e, 0x00, 0xfc, 0xfe, 0x9f, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x03, 0xfc, 0x9f, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0xfc, + 0x5f, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/meter.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define meter_width 64 +#define meter_height 64 +static char meter_bits[] = { + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xc3, 0x01, 0x00, 0xfc, + 0x1f, 0x00, 0xc0, 0x61, 0x23, 0x02, 0x80, 0xff, 0xff, 0x00, 0x20, 0x62, + 0x13, 0x04, 0xf0, 0xff, 0xff, 0x07, 0x10, 0x64, 0x13, 0x04, 0xfc, 0x03, + 0xe0, 0x1f, 0x10, 0x64, 0x13, 0x04, 0x7f, 0x00, 0x00, 0x7f, 0x10, 0x64, + 0x23, 0x82, 0x0f, 0x00, 0x00, 0xf8, 0x20, 0x62, 0xc3, 0xc1, 0x07, 0x00, + 0x00, 0xf0, 0xc1, 0x61, 0x03, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x60, + 0x03, 0xf0, 0x00, 0x80, 0x00, 0x80, 0x07, 0x60, 0x03, 0x38, 0x80, 0x80, + 0x80, 0x00, 0x0e, 0x60, 0x03, 0x1c, 0x80, 0x80, 0x80, 0x00, 0x1c, 0x60, + 0x03, 0x1e, 0x02, 0x81, 0x40, 0x20, 0x3c, 0x60, 0x03, 0x0f, 0x02, 0x01, + 0x40, 0x20, 0x78, 0x60, 0x03, 0x07, 0x24, 0x00, 0x00, 0x10, 0x70, 0x60, + 0x83, 0x07, 0x64, 0x00, 0x00, 0x10, 0xf0, 0x60, 0x83, 0x03, 0xe0, 0x00, + 0x00, 0x00, 0xe0, 0x60, 0xc3, 0x09, 0xe0, 0x01, 0x00, 0x00, 0xc8, 0x61, + 0xc3, 0x11, 0xe0, 0x03, 0x00, 0x00, 0xc4, 0x61, 0xc3, 0x21, 0xe0, 0x03, + 0x00, 0x00, 0xc2, 0x61, 0xe3, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x80, 0x63, + 0xe3, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x63, 0xe3, 0x00, 0x80, 0x01, + 0x00, 0x00, 0x80, 0x63, 0x73, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x67, + 0x73, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x67, 0x73, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x67, 0x73, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x67, + 0x73, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x67, 0x73, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x67, 0x73, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x67, + 0x73, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x67, 0x73, 0x00, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x67, 0x73, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x67, + 0x73, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x67, 0xe3, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x80, 0x63, 0xe3, 0x00, 0x00, 0x38, 0x00, 0x00, 0x80, 0x63, + 0xe3, 0x00, 0x00, 0x30, 0x00, 0x00, 0x80, 0x63, 0xc3, 0x01, 0x00, 0x70, + 0x00, 0x00, 0xc0, 0x61, 0xc3, 0x01, 0x00, 0x70, 0x00, 0x00, 0xc0, 0x61, + 0xc3, 0x01, 0x00, 0xf8, 0x0f, 0x00, 0xc0, 0x61, 0x83, 0x03, 0x00, 0xff, + 0x7f, 0x00, 0xe0, 0x60, 0x83, 0x07, 0xe0, 0xff, 0xff, 0x03, 0xf0, 0x60, + 0x03, 0x07, 0xf0, 0xff, 0xff, 0x07, 0x70, 0x60, 0x03, 0x0f, 0xfc, 0xff, + 0xff, 0x1f, 0x78, 0x60, 0x03, 0x1e, 0xfe, 0xff, 0xff, 0x3f, 0x3c, 0x60, + 0x03, 0x1c, 0xff, 0x7f, 0xff, 0x7f, 0x1c, 0x60, 0x03, 0xb8, 0xff, 0xdf, + 0xfd, 0xff, 0x0e, 0x60, 0x03, 0xf0, 0xff, 0xaf, 0xfb, 0xff, 0x07, 0x60, + 0x03, 0xe0, 0xff, 0x6f, 0xfb, 0xff, 0x03, 0x60, 0xc3, 0xe1, 0xff, 0xef, + 0xfa, 0xff, 0xc3, 0x61, 0x23, 0xc2, 0xff, 0xdf, 0xfd, 0xff, 0x21, 0x62, + 0x13, 0x04, 0xff, 0x3f, 0xfe, 0x7f, 0x10, 0x64, 0x13, 0x04, 0xfc, 0xff, + 0xff, 0x1f, 0x10, 0x64, 0x13, 0x04, 0xf0, 0xff, 0xff, 0x07, 0x10, 0x64, + 0x23, 0x02, 0x80, 0xff, 0xff, 0x00, 0x20, 0x62, 0xc3, 0x01, 0x00, 0xfc, + 0x1f, 0x00, 0xc0, 0x61, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/mickey-wiz.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define mickey-wiz_width 64 +#define mickey-wiz_height 64 +static char mickey-wiz_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x26, 0x0d, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x23, 0x07, 0x00, 0x00, 0x90, 0x00, 0x00, 0x80, 0xa0, 0x02, 0x00, 0x00, + 0x20, 0x01, 0x00, 0x40, 0xe2, 0x02, 0x00, 0x00, 0x20, 0x02, 0x00, 0x20, + 0x02, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x10, 0x06, 0x01, 0x00, 0x00, + 0x40, 0x04, 0x00, 0x08, 0x05, 0x01, 0x00, 0x00, 0x80, 0x08, 0x00, 0xf4, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x32, 0xa3, 0x00, 0x00, 0x00, + 0x00, 0x21, 0xc0, 0xce, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x21, 0x20, 0x30, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x43, 0x10, 0xe0, 0x68, 0x00, 0x00, 0x00, + 0x80, 0xc1, 0xd0, 0x01, 0x7b, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x71, 0x1f, + 0x46, 0x00, 0x00, 0x00, 0x40, 0x64, 0x71, 0x34, 0x28, 0x00, 0x00, 0x00, + 0x40, 0xce, 0x11, 0x60, 0x38, 0x00, 0x00, 0x00, 0x80, 0x7d, 0x71, 0xe3, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x64, 0xf1, 0xe3, 0xf7, 0x03, 0x00, 0x00, + 0x00, 0x44, 0xf1, 0xe3, 0xff, 0x07, 0x00, 0x00, 0x00, 0x44, 0xd1, 0xf2, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x44, 0xaf, 0x01, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x48, 0x41, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, + 0xfe, 0x0f, 0x00, 0x00, 0x00, 0x88, 0x01, 0x60, 0xfc, 0x07, 0x00, 0x00, + 0x00, 0xf0, 0x02, 0x60, 0xe6, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x10, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xdc, 0x7f, 0x00, 0x02, 0x00, + 0x00, 0x00, 0xc4, 0x77, 0x90, 0x81, 0x05, 0x00, 0x00, 0x00, 0x98, 0x2b, + 0x28, 0x42, 0x04, 0x00, 0x00, 0x00, 0xf0, 0x37, 0x48, 0x3e, 0x04, 0x00, + 0x00, 0x00, 0xe0, 0x1c, 0x88, 0x0f, 0x02, 0x00, 0x00, 0x00, 0xc0, 0x91, + 0x17, 0x80, 0x19, 0x00, 0x00, 0x00, 0x40, 0x91, 0x6f, 0x80, 0x2f, 0x00, + 0x00, 0x00, 0xc0, 0x08, 0x56, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x07, + 0x8a, 0x01, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, 0x85, 0x81, 0x0f, 0x00, + 0x00, 0x00, 0x80, 0xe0, 0x7e, 0x3e, 0x03, 0x00, 0x00, 0x00, 0x80, 0x90, + 0x42, 0x60, 0x04, 0x00, 0x00, 0x00, 0x80, 0xab, 0x81, 0xc0, 0x0c, 0x00, + 0x00, 0x00, 0x80, 0x5e, 0x81, 0x01, 0x07, 0x00, 0x00, 0x00, 0x80, 0x37, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xd9, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x37, + 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x6f, 0x04, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xa0, 0xdf, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x3f, + 0x03, 0x18, 0x00, 0x00, 0x00, 0x00, 0x90, 0x0f, 0x0c, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x28, 0xff, 0xf0, 0x0f, 0x83, 0x1f, 0x00, 0x00, 0x68, 0xb9, + 0x80, 0x66, 0x44, 0x20, 0x00, 0x00, 0x70, 0xa6, 0x81, 0xf1, 0x39, 0x20, + 0x00, 0x00, 0x08, 0x80, 0x02, 0x80, 0xe7, 0x31, 0x00, 0x00, 0xf8, 0x7f, + 0x02, 0x03, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0xf7, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/network.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define network_width 64 +#define network_height 54 +static char network_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, + 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0xda, 0xbf, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc1, 0xff, 0x83, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xff, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x40, 0x80, 0xff, 0x07, 0x02, 0x00, 0x00, + 0x00, 0x40, 0x80, 0xff, 0x03, 0x02, 0x00, 0x00, 0x00, 0x20, 0xc0, 0xff, + 0x03, 0x04, 0x00, 0x00, 0x00, 0x20, 0xc0, 0xff, 0x03, 0x04, 0x00, 0x00, + 0x00, 0x20, 0x80, 0xff, 0x0b, 0x08, 0x00, 0x00, 0x00, 0x10, 0x80, 0x7f, + 0x02, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7d, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x10, 0x00, 0xfb, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0xc6, + 0x0f, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0xc0, 0x03, 0x08, 0x00, 0x00, + 0x00, 0x10, 0x00, 0xc0, 0xf7, 0x08, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x80, + 0xff, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xfc, 0x0e, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0xdc, 0xff, 0xff, 0x01, + 0x00, 0x60, 0x30, 0x00, 0x2c, 0x00, 0x00, 0x02, 0x00, 0x10, 0x40, 0x00, + 0xac, 0xff, 0x7f, 0x02, 0x00, 0x08, 0x80, 0x00, 0xae, 0x55, 0xd5, 0x02, + 0x80, 0x0f, 0xc0, 0x07, 0xaf, 0xaa, 0xaa, 0x02, 0x60, 0x10, 0x20, 0x18, + 0xa7, 0x55, 0xc1, 0x02, 0x10, 0x00, 0x00, 0xe0, 0xa0, 0xaa, 0xa2, 0x02, + 0x08, 0x00, 0x00, 0x40, 0xa0, 0x55, 0xc1, 0x02, 0x04, 0x00, 0x00, 0x40, + 0xa0, 0xaa, 0xaa, 0x02, 0x04, 0x00, 0x00, 0x80, 0xa0, 0x55, 0xd5, 0x02, + 0x02, 0x00, 0x00, 0x80, 0xa0, 0xaa, 0xaa, 0x02, 0x02, 0x00, 0x00, 0x00, + 0xa1, 0x55, 0xd5, 0x02, 0x02, 0x00, 0x10, 0x20, 0xa1, 0xaa, 0xaa, 0x02, + 0x02, 0x00, 0x10, 0x20, 0x21, 0xff, 0x7f, 0x02, 0x82, 0x00, 0x30, 0x20, + 0x21, 0x00, 0x00, 0x02, 0x84, 0x00, 0x60, 0x18, 0xe1, 0xff, 0xff, 0x03, + 0x84, 0x01, 0x90, 0x07, 0xc1, 0xff, 0xff, 0x01, 0x08, 0x03, 0x08, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x0c, 0xc0, 0xf8, 0xff, 0xff, 0x0f, + 0x68, 0x18, 0x03, 0xb0, 0x04, 0x00, 0x00, 0x10, 0x98, 0xf7, 0x01, 0x40, + 0x52, 0x55, 0x55, 0x25, 0x10, 0x00, 0x00, 0x60, 0xa9, 0xaa, 0xaa, 0x4a, + 0x30, 0x10, 0x30, 0x18, 0x01, 0x00, 0x00, 0x40, 0x40, 0x18, 0xe0, 0x0f, + 0xff, 0xff, 0xff, 0x7f, 0x80, 0x3f, 0xc0, 0x00, 0xfe, 0xff, 0xff, 0x3f, + 0x00, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/news.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define news_width 64 +#define news_height 54 +static char news_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x1c, 0x00, + 0x00, 0xff, 0xff, 0x01, 0x00, 0xf0, 0x18, 0x00, 0x00, 0x3f, 0x00, 0xcc, + 0xdb, 0x36, 0x10, 0x00, 0x00, 0x03, 0xc0, 0xcc, 0xb0, 0xe4, 0x33, 0x00, + 0xf0, 0x87, 0xc2, 0x9b, 0xb3, 0x0d, 0x23, 0x00, 0xe0, 0xc7, 0x8f, 0x9f, + 0xe1, 0xef, 0x63, 0x00, 0xe0, 0x8f, 0x87, 0x39, 0xcf, 0xcc, 0x41, 0x00, + 0xc0, 0x8f, 0x05, 0x33, 0x00, 0x00, 0x40, 0x00, 0x80, 0x0f, 0x00, 0x03, + 0x00, 0xff, 0xc3, 0x00, 0xff, 0x1f, 0x00, 0xfc, 0xff, 0x00, 0x80, 0x00, + 0x9f, 0x1f, 0xfe, 0x01, 0x00, 0xff, 0x83, 0x01, 0x3f, 0x1f, 0x00, 0xfe, + 0xff, 0x00, 0x00, 0x01, 0x3f, 0x3f, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x7e, 0x3e, 0x00, 0x00, + 0x00, 0xe0, 0x7f, 0x02, 0x7e, 0x7e, 0x00, 0x00, 0xf0, 0xf7, 0x77, 0x02, + 0x7c, 0x7e, 0x00, 0x9e, 0x1f, 0x64, 0xff, 0x06, 0xfc, 0x7c, 0xfc, 0xbf, + 0x01, 0xc8, 0xff, 0x04, 0xfc, 0xfc, 0x78, 0x2b, 0x01, 0xc8, 0xdb, 0x0d, + 0xf8, 0xfd, 0xb8, 0x5f, 0x03, 0x90, 0xff, 0x09, 0xf8, 0xf9, 0xd1, 0x7f, + 0x06, 0x90, 0xef, 0x09, 0xf8, 0xf9, 0x71, 0x7f, 0x04, 0x3f, 0x7c, 0x1a, + 0xf0, 0xf3, 0xe1, 0xf5, 0xfd, 0x01, 0xff, 0x13, 0xf0, 0xf3, 0xc3, 0x7f, + 0x01, 0x00, 0xff, 0x33, 0xe0, 0xf3, 0xc3, 0xdb, 0xf1, 0x3f, 0x46, 0x37, + 0xe0, 0xe7, 0xc3, 0xfb, 0xb2, 0x2b, 0xfe, 0x27, 0xe0, 0xe7, 0x87, 0xf7, + 0xf3, 0x7e, 0x7c, 0x6f, 0xc0, 0xe7, 0x87, 0xaf, 0x67, 0x5f, 0xfc, 0x67, + 0xc0, 0xcf, 0x0f, 0x5d, 0xe7, 0xef, 0x3c, 0x40, 0xc0, 0xcf, 0x0f, 0xf5, + 0xcb, 0xbf, 0x80, 0x4f, 0x80, 0xcf, 0x0f, 0xbf, 0xcf, 0xf7, 0xf8, 0x68, + 0x80, 0x9f, 0x1f, 0xee, 0xcf, 0xfe, 0x08, 0x68, 0x80, 0x9f, 0x1f, 0xbe, + 0xc9, 0xef, 0x08, 0x38, 0x00, 0xbf, 0x1f, 0xde, 0xcf, 0xff, 0x08, 0x1c, + 0x00, 0xff, 0x1f, 0xa6, 0xc7, 0xf9, 0x0c, 0x0e, 0x00, 0xff, 0x0f, 0xff, + 0xc7, 0x7f, 0xfe, 0x07, 0x00, 0xfe, 0x0f, 0xed, 0xe7, 0xff, 0x7f, 0x00, + 0x00, 0xfe, 0x07, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, + 0x07, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/news2.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,38 @@ +#define noname_width 64 +#define noname_height 64 +static char noname_bits[] = { + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x80,0x01,0x00,0x88,0x00,0x00,0x00,0x00,0x80,0x21,0x20,0x98,0x00,0x00,0x00, + 0x04,0x84,0x21,0x20,0x98,0x38,0x22,0x0e,0x04,0x84,0x75,0x75,0xa9,0x44,0x22, + 0x91,0xae,0xae,0xf9,0xf8,0xa8,0x44,0x2a,0x01,0x1f,0x9f,0x71,0x70,0xc8,0x7c, + 0x2a,0x0e,0x0e,0x8e,0x51,0x50,0xc8,0x04,0x2a,0x10,0x0a,0x8a,0x89,0x88,0x88, + 0x44,0x2a,0x11,0x11,0x91,0x01,0x00,0x88,0x38,0x14,0x0e,0x00,0x80,0x01,0x00, + 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x71,0x57,0x77,0x55,0x00,0xee,0x62,0x8e, + 0x11,0x75,0x55,0x57,0x00,0xa2,0xa2,0x82,0x11,0x55,0x77,0x27,0x00,0xa6,0xa2, + 0x8e,0x11,0x55,0x51,0x25,0x00,0xa2,0xa2,0x88,0x71,0x57,0x51,0x25,0x00,0xe2, + 0x6e,0x8e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x71,0x75,0x77,0x77,0x75, + 0xa0,0xae,0x8e,0x11,0x12,0x11,0x21,0x15,0xe0,0xa2,0x82,0x31,0x12,0x73,0x27, + 0x32,0xe0,0xe6,0x8e,0x11,0x15,0x41,0x24,0x12,0xa0,0xe2,0x88,0x71,0x75,0x77, + 0x77,0x72,0xa0,0xae,0x8e,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x71,0x27, + 0x73,0x75,0xe0,0x42,0xea,0x86,0x51,0x51,0x25,0x17,0xa0,0xa2,0x2e,0x8a,0x71, + 0x73,0x25,0x57,0xe0,0xe2,0x6e,0x8a,0x31,0x51,0x25,0x55,0xa0,0xa2,0x2a,0x8a, + 0x51,0x57,0x73,0x75,0xe0,0xae,0xea,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xfd,0xdf,0xff,0xfd,0xdf,0xff, + 0xff,0x9f,0x01,0x40,0x55,0x01,0x40,0x00,0x00,0x90,0xfd,0xdf,0xaa,0xfd,0xdf, + 0x00,0x00,0x90,0x01,0x40,0x55,0x01,0x40,0x01,0x00,0x90,0xfd,0xdf,0xaa,0xfd, + 0x5f,0x02,0x00,0x90,0x01,0x40,0x55,0x01,0x40,0x04,0x00,0x90,0xfd,0xdf,0xaa, + 0xfd,0x5f,0x88,0x01,0x90,0x01,0x40,0x55,0x01,0x40,0x50,0x02,0x90,0xfd,0xdf, + 0xaa,0xfd,0x5f,0x20,0x04,0x90,0x01,0x40,0x55,0x01,0x40,0x00,0x08,0x90,0xfd, + 0xdf,0xaa,0xfd,0x5f,0x00,0x10,0x90,0x01,0x40,0x55,0x01,0x40,0x00,0xa0,0x91, + 0xfd,0xdf,0xaa,0xfd,0x5f,0x00,0x40,0x92,0x01,0x40,0x55,0x01,0x40,0x00,0x00, + 0x94,0xfd,0xdf,0xaa,0xfd,0x5f,0x00,0x00,0x98,0x01,0xc0,0xff,0x01,0x40,0x00, + 0x00,0x90,0xfd,0x1f,0x00,0xfc,0x5f,0x00,0x00,0x90,0x01,0x00,0x00,0x00,0x40, + 0x00,0x00,0x90,0xfd,0xdf,0xff,0xfd,0x5f,0x00,0x00,0x90,0x01,0x00,0x00,0x00, + 0x40,0x00,0x00,0x90,0xfd,0xdf,0xff,0xfd,0xdf,0xff,0xff,0x9f,0x01,0x00,0x00, + 0x00,0x00,0x00,0x00,0x80,0xfd,0xdf,0xff,0xfd,0xdf,0xff,0xff,0x9f,0x01,0x00, + 0x00,0x00,0x00,0x00,0x00,0x80,0xfd,0xdf,0xff,0xfd,0xdf,0xff,0xff,0x9f,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xfd,0xdf,0xff,0xfd,0xdf,0xff,0xff,0x9f, + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xfd,0xdf,0xff,0xfd,0xdf,0xff,0xff, + 0x9f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/nuke.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define Nuke.xbm_width 64 +#define Nuke.xbm_height 64 +static char Nuke.xbm_bits[] = { + 0x00, 0x00, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, + 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x55, 0x55, 0x07, 0x00, 0x00, + 0x00, 0x00, 0xa6, 0xaa, 0xaa, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd5, 0x57, + 0xd5, 0x1d, 0x00, 0x00, 0x00, 0x80, 0xa7, 0xae, 0xea, 0xaa, 0x00, 0x00, + 0x00, 0x00, 0x57, 0x5d, 0x75, 0x15, 0x00, 0x00, 0x00, 0x80, 0xa2, 0xaa, + 0xaa, 0xaa, 0x0b, 0x00, 0x00, 0x40, 0x55, 0x55, 0x55, 0x15, 0x1f, 0x00, + 0x00, 0xa0, 0xaa, 0xaa, 0xaa, 0xaa, 0x1a, 0x00, 0x00, 0x7c, 0x55, 0x55, + 0x55, 0xd5, 0x0f, 0x00, 0x00, 0xe4, 0xaa, 0xaa, 0xaf, 0xaa, 0x0a, 0x00, + 0x00, 0x74, 0x5f, 0xd5, 0x55, 0x55, 0x15, 0x00, 0x00, 0xaa, 0xba, 0xaa, + 0xaa, 0xff, 0x6a, 0x00, 0x00, 0x54, 0x75, 0x57, 0x55, 0x55, 0xd5, 0x01, + 0x00, 0xa8, 0xaa, 0xae, 0xea, 0xae, 0x0a, 0x02, 0x00, 0x5e, 0x75, 0x75, + 0x55, 0x5d, 0x15, 0x02, 0x00, 0xaa, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0x06, + 0x40, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x02, 0x40, 0xab, 0xaa, 0xaa, + 0xaa, 0xaa, 0xab, 0x03, 0xc0, 0xf5, 0x5f, 0x7f, 0x55, 0x7f, 0xf7, 0x01, + 0x80, 0xbb, 0xfe, 0xff, 0xff, 0xbf, 0xbe, 0x00, 0x00, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0x01, 0x00, 0xee, 0xfa, 0xfb, 0xff, 0xfe, 0xfe, 0x00, + 0x00, 0xc0, 0x18, 0x6f, 0xd5, 0x8b, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xbb, + 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x55, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb4, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x5e, 0x55, 0x02, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xef, + 0xbb, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xec, 0x7e, 0xbf, 0x37, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xf7, 0xf7, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x12, 0x5f, + 0x55, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x6e, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, + 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb6, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, + 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x5e, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, + 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x55, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xbb, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, + 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x2e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x6f, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xba, + 0xab, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x98, 0xff, 0x7d, 0x1d, 0x00, 0x00, + 0x00, 0x00, 0xd8, 0xf7, 0xeb, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x68, 0xff, + 0x7d, 0xf3, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xfb, 0xef, 0xff, 0x00, 0x00, + 0x00, 0x00, 0xf5, 0xde, 0x57, 0xef, 0x03, 0x00, 0x00, 0x00, 0xbb, 0xb7, + 0xab, 0x97, 0x07, 0x00, 0x00, 0x80, 0xb7, 0x6e, 0x55, 0xb8, 0x07, 0x00, + 0x00, 0xa0, 0xdb, 0xdb, 0x3e, 0x7f, 0x1f, 0x00, 0x00, 0xc0, 0x0f, 0xde, + 0xff, 0xc9, 0x11, 0x00, 0x00, 0xc0, 0xfa, 0xf6, 0xae, 0x3b, 0x16, 0x00, + 0x00, 0xe0, 0xe7, 0x6f, 0x7f, 0xc8, 0x09, 0x00, 0x00, 0xe0, 0x3a, 0xff, + 0xbb, 0xbb, 0x09, 0x00, 0x00, 0xa0, 0xeb, 0xde, 0xd5, 0x9d, 0x1f, 0x00, + 0x00, 0x60, 0x86, 0xf6, 0xae, 0x41, 0x13, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/outline.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define outline.xbm_width 64 +#define outline.xbm_height 64 +static char outline.xbm_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xf0, + 0xff, 0x71, 0x00, 0x00, 0x80, 0xff, 0xff, 0xf0, 0xff, 0x71, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xf0, 0xff, 0x71, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, + 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, + 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, + 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, + 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, + 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, + 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, + 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x80, 0x03, 0xe0, 0x00, 0x0e, 0x70, 0x00, 0x00, + 0x80, 0xff, 0xff, 0x00, 0x0e, 0xf0, 0xff, 0x0f, 0x80, 0xff, 0xff, 0x00, + 0x0e, 0xf0, 0xff, 0x0f, 0x80, 0xff, 0xff, 0x00, 0x0e, 0xf0, 0xff, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/page.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define unknown_width 64 +#define unknown_height 54 +static char unknown_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x80, 0x38, 0xbf, + 0xf7, 0x84, 0x00, 0x00, 0x00, 0x80, 0x9c, 0xcf, 0xf3, 0x04, 0x01, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0xa8, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x50, 0x03, 0x00, + 0x00, 0x80, 0x7c, 0xfd, 0x8e, 0x7a, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x80, 0xfc, 0xf6, 0xbe, 0x77, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x80, 0xbc, 0xef, 0xb7, 0x6f, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x80, 0xbc, 0xa5, 0xf7, 0x7f, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x80, 0x64, 0xff, 0xe6, 0x77, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x80, 0x74, 0xdf, 0xbf, 0x77, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x80, 0x6c, 0x8e, 0x3e, 0x7f, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x80, 0x7c, 0x3e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x80, 0xa0, 0x8f, 0xcf, 0x7b, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x80, 0xf4, 0xdb, 0x5c, 0x7b, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x80, 0xe4, 0x5e, 0xcd, 0x7f, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x80, 0x6c, 0xa4, 0xbd, 0x79, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x80, 0xe4, 0xdb, 0xcf, 0x7b, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/perl.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define perl.xbm_width 64 +#define perl.xbm_height 64 +static char perl.xbm_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, + 0xf8, 0x03, 0xff, 0x1f, 0xf8, 0x0f, 0x07, 0x00, 0xf8, 0x07, 0xff, 0x9f, + 0xff, 0x1f, 0x07, 0x00, 0xb8, 0x0f, 0xff, 0x9f, 0xff, 0x1f, 0x07, 0x00, + 0x38, 0x0e, 0xff, 0x9f, 0x1f, 0x3e, 0x07, 0x00, 0x38, 0x1c, 0x07, 0x80, + 0x0f, 0x3c, 0x07, 0x00, 0x38, 0x1c, 0x07, 0x80, 0x0f, 0x38, 0x07, 0x00, + 0x38, 0x38, 0x07, 0x80, 0x0f, 0x3c, 0x07, 0x00, 0x38, 0x38, 0x07, 0x80, + 0x1f, 0x3c, 0x07, 0x00, 0x38, 0x38, 0x07, 0x80, 0x3f, 0x1f, 0x07, 0x00, + 0x38, 0x38, 0x07, 0x80, 0xff, 0x1f, 0x07, 0x00, 0x38, 0x38, 0x07, 0x80, + 0xfb, 0x0f, 0x07, 0x00, 0x38, 0x38, 0x07, 0x80, 0xe3, 0x03, 0x07, 0x00, + 0x38, 0x38, 0x07, 0x80, 0xe3, 0x01, 0x07, 0x00, 0x38, 0x3c, 0x07, 0x80, + 0xe3, 0x01, 0x07, 0x00, 0x38, 0x1e, 0x07, 0x80, 0xc3, 0x03, 0x07, 0x00, + 0xf8, 0x0f, 0x07, 0x80, 0xc3, 0x01, 0x07, 0x00, 0xf8, 0x07, 0xff, 0x9f, + 0xc3, 0x03, 0x07, 0x00, 0xf8, 0x00, 0xff, 0x9f, 0xc3, 0x03, 0x07, 0x00, + 0x38, 0x00, 0xff, 0x9f, 0xc3, 0x03, 0x07, 0x00, 0x38, 0x00, 0xff, 0x9f, + 0x83, 0x03, 0x07, 0x00, 0x38, 0x00, 0x07, 0x80, 0x83, 0x07, 0x07, 0x00, + 0x38, 0x00, 0x07, 0x80, 0x83, 0x07, 0x07, 0x00, 0x38, 0x00, 0x07, 0x80, + 0x83, 0x07, 0x07, 0x00, 0x38, 0x00, 0x07, 0x80, 0x83, 0x07, 0x07, 0x00, + 0x38, 0x00, 0x07, 0x80, 0x83, 0x07, 0x07, 0x00, 0x38, 0x00, 0x07, 0x80, + 0x03, 0x07, 0x07, 0x00, 0x38, 0x00, 0x07, 0x80, 0x03, 0x07, 0x07, 0x00, + 0x38, 0x00, 0x07, 0x80, 0x03, 0x0f, 0x07, 0x00, 0x38, 0x00, 0x07, 0x80, + 0x03, 0x0f, 0x07, 0x00, 0x38, 0x00, 0x07, 0x80, 0x03, 0x0e, 0x07, 0x00, + 0x38, 0x00, 0x07, 0x80, 0x03, 0x0e, 0x07, 0x00, 0x38, 0x00, 0x07, 0x80, + 0x03, 0x1e, 0x07, 0x00, 0x38, 0x00, 0xff, 0x9f, 0x03, 0x1e, 0x07, 0x00, + 0x38, 0x00, 0xff, 0x9f, 0x03, 0x1e, 0xff, 0x7f, 0x38, 0x00, 0xff, 0x9f, + 0x03, 0x3c, 0xff, 0x7f, 0x38, 0x00, 0xff, 0x9f, 0x03, 0x1c, 0xff, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/phone.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define phone_width 64 +#define phone_height 54 +static char phone_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x00, + 0xc0, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x01, 0x70, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x07, 0xb8, 0xaa, 0xba, 0xaa, 0xaa, 0xae, 0xaa, 0x0e, + 0x5c, 0x55, 0xfd, 0xff, 0xff, 0x5f, 0x55, 0x1d, 0xac, 0xaa, 0x6a, 0x55, + 0x55, 0xab, 0xaa, 0x1a, 0x54, 0x55, 0xbd, 0xaa, 0xaa, 0x5d, 0x55, 0x15, + 0xac, 0xaa, 0xee, 0xff, 0xff, 0xbb, 0xaa, 0x1a, 0x54, 0x55, 0x57, 0x55, + 0x55, 0x55, 0x55, 0x1d, 0xac, 0xaa, 0xab, 0xaa, 0xaa, 0xea, 0xaa, 0x1e, + 0x54, 0xd5, 0xfd, 0xff, 0xff, 0xdf, 0x55, 0x1f, 0xac, 0xea, 0x07, 0x00, + 0x00, 0xf0, 0xab, 0x3a, 0x58, 0x35, 0xf5, 0xff, 0xff, 0x57, 0x56, 0x3d, + 0xf0, 0x0f, 0x97, 0x00, 0x80, 0x74, 0xf8, 0x37, 0x00, 0x00, 0x15, 0xb1, + 0x0d, 0x55, 0x00, 0x30, 0x00, 0x00, 0x57, 0xb4, 0x4d, 0x74, 0x00, 0x30, + 0x00, 0x00, 0x35, 0x02, 0x20, 0x56, 0x00, 0x30, 0x00, 0x00, 0x97, 0xb0, + 0x8d, 0x74, 0x3c, 0x30, 0x00, 0x00, 0x15, 0xb1, 0x0d, 0x55, 0x7f, 0x30, + 0x00, 0x00, 0x57, 0x04, 0x40, 0x74, 0xc3, 0x30, 0x00, 0x00, 0x35, 0xb2, + 0x2d, 0xd6, 0x81, 0x31, 0x00, 0x00, 0x97, 0xb0, 0x8d, 0xf4, 0x80, 0x31, + 0x00, 0x00, 0x15, 0x01, 0x00, 0x55, 0x80, 0x31, 0x00, 0x00, 0x57, 0xb4, + 0x4d, 0x74, 0x80, 0x31, 0x00, 0x00, 0x35, 0xb2, 0x2d, 0x56, 0xc0, 0x30, + 0x00, 0x00, 0x97, 0x00, 0x80, 0x74, 0x60, 0x30, 0x00, 0x00, 0x15, 0xfd, + 0x3f, 0x55, 0x30, 0x30, 0x00, 0x00, 0x57, 0x04, 0x60, 0x74, 0x18, 0x30, + 0x00, 0x00, 0x35, 0xfe, 0x3f, 0x56, 0x0c, 0x18, 0x00, 0x00, 0xf7, 0xff, + 0xff, 0x77, 0x06, 0x18, 0x00, 0x00, 0x05, 0x00, 0x00, 0x50, 0x03, 0x0c, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f, 0x03, 0x06, 0x00, 0x00, 0x57, 0x55, + 0x55, 0x75, 0x03, 0x06, 0x00, 0x00, 0xab, 0xaa, 0xaa, 0x6a, 0x03, 0x03, + 0x00, 0x00, 0x57, 0x55, 0x55, 0x75, 0x83, 0x01, 0x00, 0x00, 0xab, 0xaa, + 0xaa, 0x6a, 0xc3, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x55, 0xfe, 0x00, + 0x00, 0x00, 0xab, 0xaa, 0xaa, 0x6a, 0x7c, 0x00, 0x00, 0x00, 0x56, 0x55, + 0x55, 0x35, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/quality.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define ribbon_width 64 +#define ribbon_height 64 +static char ribbon_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xcf, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xcf, 0xff, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xe7, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xff, 0xe7, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0xff, 0xf3, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xf3, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xf9, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xf9, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xfc, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xff, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x7f, 0xfe, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x7f, 0xfe, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0x3f, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0x3f, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x9b, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0x9b, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xc1, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x80, 0xff, 0xe0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, + 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0x00, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x3f, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, + 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0xc0, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x3f, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, + 0x8c, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x1e, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x5f, 0x7e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x3f, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x3f, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x9f, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x9f, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0xcf, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xcf, 0xff, 0x01, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xbf, 0xff, 0xe7, 0xff, 0x00, 0x00, + 0x00, 0xc0, 0xdf, 0xff, 0xe7, 0x7f, 0x00, 0x00, 0x00, 0xc0, 0xdf, 0xff, + 0xf3, 0x7f, 0x00, 0x00, 0x00, 0xe0, 0xef, 0xff, 0xf3, 0x3f, 0x00, 0x00, + 0x00, 0xe0, 0xef, 0xff, 0xf9, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0xf7, 0xff, + 0xf9, 0x1f, 0x00, 0x00, 0x00, 0xf0, 0xf7, 0xff, 0xfc, 0x1f, 0x00, 0x00, + 0x00, 0xf8, 0xfb, 0xff, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0xf8, 0xfb, 0x7f, + 0xfe, 0x0f, 0x00, 0x00, 0x00, 0xfc, 0xfd, 0x7f, 0xfe, 0x07, 0x00, 0x00, + 0x00, 0xfc, 0xfd, 0x3f, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x9f, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x9f, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xcf, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xcf, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xc3, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x80, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x0f, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/question.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,38 @@ +#define qmark_width 64 +#define qmark_height 64 +static char qmark_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xfc,0x7f,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0x03, + 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0xfc,0x07,0xfc, + 0x7f,0x00,0x00,0x00,0x00,0xff,0x01,0xf0,0xff,0x00,0x00,0x00,0x80,0x7f,0x00, + 0xe0,0xff,0x01,0x00,0x00,0xc0,0x1f,0x00,0xc0,0xff,0x03,0x00,0x00,0xe0,0x0f, + 0x00,0x80,0xff,0x07,0x00,0x00,0xe0,0x0f,0x00,0x80,0xff,0x07,0x00,0x00,0xf0, + 0x07,0x00,0x00,0xff,0x0f,0x00,0x00,0xf0,0x0f,0x00,0x00,0xff,0x0f,0x00,0x00, + 0xf8,0x1f,0x00,0x00,0xfe,0x1f,0x00,0x00,0xf8,0x1f,0x00,0x00,0xfe,0x1f,0x00, + 0x00,0xf8,0x1f,0x00,0x00,0xfe,0x1f,0x00,0x00,0xf8,0x1f,0x00,0x00,0xfe,0x1f, + 0x00,0x00,0xf0,0x0f,0x00,0x00,0xfe,0x1f,0x00,0x00,0xc0,0x03,0x00,0x00,0xfe, + 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, + 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x1f,0x00,0x00,0x00,0x00,0x00, + 0x80,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x07,0x00,0x00,0x00,0x00, + 0x00,0xc0,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x03,0x00,0x00,0x00, + 0x00,0x00,0xf0,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0x00,0x00,0x00, + 0x00,0x00,0x00,0xfc,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x3f,0x00,0x00, + 0x00,0x00,0x00,0x00,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x03,0x00, + 0x00,0x00,0x00,0x00,0xc0,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f,0x00, + 0x00,0x00,0x00,0x00,0x00,0xf0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, + 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,0x00,0x00,0x00,0x00, + 0x00,0x80,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x0f,0x00,0x00,0x00, + 0x00,0x00,0x80,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x0f,0x00,0x00, + 0x00,0x00,0x00,0x00,0xfe,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x03,0x00, + 0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x00,0x00,0x00, + 0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x0f,0x00,0x00,0x00,0x00,0x00, + 0x80,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x0f,0x00,0x00,0x00,0x00, + 0x00,0x80,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x07,0x00,0x00,0x00, + 0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/radioactive.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define danger_width 64 +#define danger_height 64 +static char danger_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, + 0x00, 0x80, 0x07, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x80, 0x1f, 0x00, + 0x00, 0xf8, 0x07, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0xfc, 0x0f, 0x00, + 0x00, 0xe0, 0x7f, 0x00, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0x00, + 0x00, 0xfe, 0x1f, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xff, 0x1f, 0x00, + 0x00, 0xf0, 0xff, 0x01, 0x80, 0xff, 0x3f, 0x00, 0x00, 0xf8, 0xff, 0x03, + 0x80, 0xff, 0x7f, 0x00, 0x00, 0xfc, 0xff, 0x03, 0xc0, 0xff, 0x7f, 0x00, + 0x00, 0xfc, 0xff, 0x07, 0xe0, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x0f, + 0xe0, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0x01, + 0x00, 0xff, 0xff, 0x1f, 0xf0, 0xff, 0xff, 0x03, 0x80, 0xff, 0xff, 0x1f, + 0xf0, 0xff, 0xff, 0x07, 0xc0, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x07, + 0xc0, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0x3f, + 0xf8, 0xff, 0xff, 0x1f, 0xf0, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0x07, + 0xc0, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0x83, 0x83, 0xff, 0xff, 0x7f, + 0xfc, 0xff, 0xff, 0xe3, 0x8f, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xf1, + 0x1f, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0x7f, + 0xfc, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xf9, + 0x3f, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/recycle.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,32 @@ +#define recycle_width 64 +#define recycle_height 54 +static char recycle_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0x03, + 0x00,0x00,0x00,0x00,0x60,0x00,0x78,0x0d,0x00,0x00,0x00,0x00,0x10,0x00,0xbc, + 0x10,0x00,0x00,0x00,0x00,0x08,0x00,0x5e,0x20,0x00,0x00,0x00,0x00,0x08,0x00, + 0x2f,0x20,0x00,0x00,0x00,0x00,0x04,0x00,0x17,0x40,0x1c,0x00,0x00,0x00,0x04, + 0x80,0x0a,0x40,0x1f,0x00,0x00,0x00,0x02,0x80,0x06,0x80,0x0d,0x00,0x00,0x00, + 0x02,0x40,0x04,0x00,0x04,0x00,0x00,0x00,0x01,0x40,0x04,0x00,0x02,0x00,0x00, + 0x00,0x01,0x20,0x08,0x00,0x03,0x00,0x00,0x80,0x00,0x20,0x08,0x00,0x01,0x00, + 0x00,0x00,0x03,0x10,0x10,0x80,0x00,0x00,0x00,0x00,0x0c,0x10,0x18,0xc0,0x00, + 0x00,0x00,0x00,0x30,0x08,0x07,0x40,0x00,0x00,0x00,0x00,0xc0,0x08,0xff,0x3f, + 0x0e,0x00,0x80,0xff,0x1f,0x07,0x00,0x80,0x09,0x00,0x80,0x00,0x30,0x04,0x00, + 0x60,0x10,0x00,0x00,0x03,0x20,0x00,0x00,0x18,0x10,0x00,0x00,0x0c,0x60,0x00, + 0x00,0x06,0x20,0x00,0x00,0x08,0x40,0x00,0x00,0x01,0x20,0x00,0x00,0x04,0x80, + 0x00,0x00,0x01,0x40,0x00,0x00,0x04,0x80,0x01,0x00,0x02,0x40,0x00,0x00,0x02, + 0x00,0x01,0x00,0x02,0x80,0x00,0x00,0x02,0x00,0x02,0x00,0x04,0x80,0x00,0x00, + 0x02,0x40,0x06,0x00,0x04,0x80,0x00,0x00,0x02,0xe0,0x05,0x00,0x08,0x80,0x00, + 0x00,0x02,0x20,0x06,0x60,0x08,0x80,0x00,0x00,0x04,0x10,0x00,0x60,0x10,0x40, + 0x00,0x00,0x04,0x10,0x00,0x50,0x10,0x40,0x00,0x00,0x08,0x08,0x00,0x50,0x20, + 0x20,0x00,0x00,0x08,0x08,0x00,0x48,0x20,0x3c,0x00,0x00,0x10,0xfc,0x7f,0xc8, + 0xff,0x1f,0x00,0x00,0x10,0xbc,0x40,0x04,0x00,0x18,0x00,0x00,0x20,0x5e,0x40, + 0x04,0x00,0x0c,0x00,0x00,0x20,0x2e,0x40,0x02,0x00,0x0c,0x00,0x00,0x40,0x17, + 0x40,0x02,0x00,0x06,0x00,0x00,0x40,0x0f,0x40,0x01,0x00,0x06,0x00,0x00,0x80, + 0x07,0x40,0x01,0x00,0x02,0x00,0x00,0x80,0x07,0x40,0x02,0x00,0x03,0x00,0x00, + 0x00,0x07,0x40,0x02,0x80,0x01,0x00,0x00,0x00,0x02,0x40,0x04,0xc0,0x00,0x00, + 0x00,0x00,0x0c,0x40,0x04,0x70,0x00,0x00,0x00,0x00,0xf0,0x7f,0xc8,0x1f,0x00, + 0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/rlogin.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define external_width 64 +#define external_height 54 +static char external_bits[] = { + 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xff, 0xff, 0xaf, 0x01, 0x00, 0x00, 0x00, + 0x40, 0x01, 0x02, 0x29, 0x02, 0x00, 0x00, 0x00, 0x40, 0x6d, 0x5a, 0x29, + 0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x02, 0x2f, 0x02, 0x00, 0x00, 0x00, + 0x40, 0xd5, 0x3a, 0x29, 0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x02, 0x2f, + 0x02, 0x00, 0x00, 0x00, 0x40, 0xff, 0x5b, 0x29, 0x02, 0x00, 0x00, 0x00, + 0x40, 0x01, 0x02, 0x2f, 0x02, 0x00, 0x00, 0x00, 0x40, 0x55, 0x5a, 0x29, + 0x22, 0x00, 0x00, 0x00, 0x40, 0x01, 0x02, 0x2f, 0x32, 0x00, 0x00, 0x00, + 0x40, 0x05, 0x6a, 0x2f, 0xfa, 0x01, 0x00, 0x00, 0x40, 0x01, 0x02, 0x2f, + 0x32, 0x0e, 0x00, 0x00, 0x40, 0xff, 0xff, 0x2f, 0x22, 0x30, 0x00, 0x00, + 0x40, 0x01, 0x00, 0x2e, 0x02, 0x40, 0x00, 0x00, 0x40, 0xff, 0xff, 0x2f, + 0x02, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x01, 0x00, + 0xc0, 0xff, 0xff, 0xff, 0x07, 0x00, 0x01, 0x00, 0x00, 0x1c, 0x00, 0x1e, + 0x07, 0x00, 0x02, 0x00, 0x00, 0xf3, 0xff, 0xc7, 0x04, 0x00, 0x02, 0x00, + 0xc0, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x02, 0x00, 0xe0, 0xff, 0xff, 0x0f, + 0x14, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x08, 0x13, 0x00, 0x04, 0x00, + 0xb0, 0x01, 0x00, 0xc8, 0x08, 0x00, 0x04, 0x00, 0x28, 0x00, 0x00, 0x38, + 0x08, 0x00, 0x1f, 0x00, 0xe4, 0xff, 0xff, 0x0f, 0x04, 0x00, 0x0e, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0xf8, 0xff, 0xff, 0x0f, + 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0c, 0x01, 0xff, 0xff, 0x0f, + 0x52, 0x55, 0x55, 0x8e, 0x00, 0x01, 0x00, 0x08, 0xa9, 0xaa, 0x2a, 0xe7, + 0x01, 0xfd, 0xff, 0x08, 0x01, 0x00, 0x80, 0x93, 0x01, 0x55, 0xd5, 0x0a, + 0xff, 0xff, 0xff, 0xc9, 0x00, 0x2d, 0xaa, 0x08, 0xfe, 0xff, 0xff, 0x78, + 0x00, 0x15, 0xd4, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xaa, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xd5, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xad, 0xaa, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xd5, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xa9, 0x2a, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0xa9, 0x2a, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xa8, 0x2a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa8, 0x2a, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xa8, 0x2a, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/scroll.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define emacs2_width 64 +#define emacs2_height 64 +static char emacs2_bits[] = { + 0x55, 0x55, 0x55, 0x01, 0x00, 0x51, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0x00, + 0x00, 0xa1, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x0c, 0x80, 0x42, 0x55, 0x55, + 0xaa, 0xaa, 0x2a, 0x0f, 0xe0, 0x80, 0xaa, 0xaa, 0x55, 0x55, 0xd5, 0x31, + 0x64, 0x00, 0x55, 0x55, 0xaa, 0xaa, 0xca, 0xc1, 0x38, 0x00, 0xaa, 0xaa, + 0x55, 0x55, 0xa5, 0x40, 0x0d, 0x00, 0x54, 0x55, 0xaa, 0xaa, 0xb6, 0x40, + 0x07, 0x20, 0xa8, 0xaa, 0x55, 0x55, 0x99, 0x20, 0x02, 0x30, 0x50, 0x55, + 0xaa, 0xaa, 0xc8, 0x20, 0x42, 0x18, 0xa0, 0xaa, 0x55, 0x55, 0x41, 0x10, + 0x02, 0x08, 0x40, 0x55, 0xaa, 0x2a, 0x41, 0x08, 0x02, 0x07, 0x84, 0xaa, + 0x55, 0x95, 0x41, 0x00, 0x42, 0x01, 0x08, 0x55, 0xaa, 0xaa, 0x60, 0x00, + 0xc1, 0x01, 0x00, 0xaa, 0x55, 0x4d, 0x20, 0x80, 0x61, 0x02, 0x21, 0x54, + 0xaa, 0xb6, 0x20, 0x60, 0x39, 0x83, 0x06, 0xa8, 0x55, 0x05, 0x28, 0x18, + 0x11, 0x40, 0x01, 0x50, 0xaa, 0x06, 0x30, 0x00, 0x01, 0xa0, 0x00, 0xa0, + 0x55, 0x00, 0x1c, 0x00, 0x07, 0xa0, 0x00, 0x40, 0x2a, 0x00, 0x16, 0x80, + 0x02, 0x30, 0x00, 0x80, 0x75, 0x60, 0x14, 0x80, 0x01, 0x00, 0x00, 0x00, + 0x8a, 0x51, 0x1b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xe2, 0x09, 0x60, + 0x00, 0x06, 0x00, 0x00, 0x46, 0x46, 0x08, 0x1f, 0x00, 0x05, 0x00, 0x00, + 0x25, 0x85, 0x08, 0x10, 0xa0, 0x06, 0x00, 0x00, 0xc6, 0x1a, 0x0c, 0x08, + 0xc0, 0x02, 0x00, 0x00, 0x45, 0x35, 0x04, 0x08, 0x00, 0x06, 0x00, 0x00, + 0xba, 0x6a, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, 0x55, 0xd5, 0x04, 0x42, + 0x14, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xc5, 0x01, 0x0c, 0x00, 0x00, 0x00, + 0x55, 0x55, 0x07, 0x01, 0x03, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x82, 0x94, + 0x02, 0x00, 0x06, 0x00, 0x55, 0x55, 0x43, 0xc8, 0x00, 0x00, 0x02, 0x00, + 0xaa, 0xaa, 0x42, 0x74, 0x00, 0x80, 0x05, 0x00, 0x55, 0x55, 0x3b, 0x20, + 0x00, 0x80, 0x33, 0x00, 0xaa, 0xaa, 0x63, 0x18, 0x00, 0x20, 0x49, 0x00, + 0x55, 0x55, 0xd1, 0x00, 0x00, 0x50, 0x40, 0x00, 0xaa, 0xaa, 0xb1, 0x01, + 0x02, 0x64, 0x20, 0x00, 0x55, 0xd5, 0x59, 0x03, 0x82, 0x08, 0x18, 0x00, + 0xaa, 0xaa, 0xad, 0x06, 0x02, 0x90, 0x06, 0x00, 0x55, 0xd5, 0x54, 0xcd, + 0x03, 0x42, 0x01, 0x00, 0xaa, 0xaa, 0xaa, 0xba, 0x41, 0x84, 0x02, 0x80, + 0x55, 0xd5, 0x56, 0x55, 0xa1, 0x61, 0x01, 0x40, 0xaa, 0xea, 0xab, 0xaa, + 0x60, 0x19, 0x00, 0xa0, 0x55, 0xfd, 0x57, 0xd5, 0x80, 0x04, 0x00, 0x50, + 0xaa, 0xc2, 0xad, 0xaa, 0x01, 0x02, 0x00, 0xa8, 0x55, 0xfd, 0x57, 0x55, + 0x03, 0x12, 0x00, 0x54, 0xaa, 0xe6, 0xaa, 0xaa, 0x06, 0x0c, 0x00, 0xaa, + 0x55, 0xe5, 0x56, 0x55, 0x0d, 0x00, 0x00, 0x55, 0xaa, 0xe6, 0xaa, 0xaa, + 0x1a, 0x00, 0x80, 0xaa, 0x55, 0x73, 0x54, 0x55, 0x35, 0x00, 0x40, 0x55, + 0xaa, 0x31, 0xa8, 0xaa, 0x6a, 0x00, 0xa0, 0xaa, 0xd5, 0x30, 0x50, 0x55, + 0xd5, 0x00, 0x50, 0x55, 0xea, 0xff, 0xbf, 0xaa, 0xaa, 0x01, 0xa8, 0xaa, + 0xf5, 0xff, 0x7f, 0x55, 0x55, 0x03, 0x54, 0x55, 0xea, 0xff, 0xbf, 0xaa, + 0xaa, 0x06, 0xaa, 0xaa, 0xf5, 0xff, 0x7f, 0x55, 0x55, 0x09, 0x55, 0x55, + 0xea, 0xff, 0xbf, 0xaa, 0xaa, 0x8c, 0xaa, 0xaa, 0xd5, 0xff, 0x5f, 0x55, + 0xd5, 0x52, 0x55, 0x55, 0xaa, 0xfe, 0xab, 0xaa, 0x2a, 0xb1, 0xaa, 0xaa, + 0x55, 0x55, 0x55, 0x55, 0x35, 0x50, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, + 0x2a, 0xa8, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x57, 0x55, 0x55, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/scroll2.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define scroll_width 64 +#define scroll_height 54 +static char scroll_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x07, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x20, 0x00, 0x00, + 0x00, 0xf0, 0x7f, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x40, 0xc0, 0x3f, + 0x06, 0x0c, 0x00, 0x00, 0x00, 0x40, 0x38, 0x20, 0xf2, 0x18, 0x00, 0x00, + 0x00, 0x20, 0x06, 0x20, 0x99, 0x31, 0x00, 0x00, 0x00, 0xa0, 0xe1, 0x13, + 0x09, 0x62, 0x40, 0x01, 0x00, 0x41, 0x1e, 0x1e, 0xc9, 0x64, 0xe8, 0x04, + 0x4a, 0x30, 0x00, 0x08, 0x92, 0x54, 0x10, 0x80, 0x22, 0x8c, 0x7f, 0x04, + 0x62, 0xce, 0x00, 0x30, 0x01, 0x73, 0xc0, 0x03, 0x0c, 0x83, 0x00, 0x20, + 0x80, 0x00, 0x00, 0x03, 0xf0, 0x80, 0x00, 0x00, 0x60, 0xf8, 0x87, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x90, 0x07, 0x7c, 0x00, 0x00, 0x80, 0x00, 0x19, + 0x0c, 0x00, 0x30, 0x00, 0x00, 0x00, 0xb1, 0x04, 0x83, 0x7f, 0x08, 0x00, + 0x00, 0x00, 0x11, 0x83, 0x7c, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x21, 0x40, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x30, 0xfc, 0xc1, 0x01, 0x00, + 0x00, 0x00, 0x02, 0xc8, 0x03, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x02, 0x06, + 0x00, 0x8c, 0x01, 0x00, 0x00, 0x00, 0x82, 0xe1, 0x87, 0x43, 0x01, 0x00, + 0x00, 0x00, 0x64, 0x1e, 0x78, 0x80, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x38, 0x40, 0x03, 0x00, 0x00, 0x00, 0x8c, 0x0f, 0x07, 0x80, 0x02, 0x00, + 0x00, 0x00, 0x72, 0xf0, 0x01, 0x40, 0x05, 0x00, 0x00, 0x80, 0x01, 0x3e, + 0x00, 0x80, 0x06, 0x00, 0x00, 0xe0, 0xc0, 0x01, 0x00, 0x40, 0x05, 0x00, + 0x00, 0x30, 0x3f, 0x00, 0x00, 0x80, 0x8a, 0x01, 0x00, 0x18, 0x10, 0x00, + 0x00, 0x40, 0x5d, 0x06, 0x00, 0x0f, 0x10, 0x00, 0x00, 0xa0, 0x3a, 0x0c, + 0xc0, 0x07, 0x20, 0x00, 0x00, 0x50, 0x1d, 0x18, 0xe0, 0x07, 0x20, 0x00, + 0x00, 0xa8, 0x06, 0x30, 0xf8, 0x01, 0x20, 0x00, 0x00, 0xd4, 0x01, 0x28, + 0x3c, 0x3e, 0x60, 0x00, 0x00, 0x3f, 0x00, 0x34, 0x8e, 0xc1, 0x40, 0xe0, + 0xff, 0x00, 0x00, 0x2a, 0x41, 0x7f, 0x41, 0x78, 0x00, 0x00, 0x00, 0x35, + 0xc0, 0x00, 0x41, 0x86, 0x01, 0x00, 0xa0, 0x1a, 0x80, 0xdb, 0x40, 0x32, + 0x03, 0x00, 0x54, 0x0f, 0x80, 0x24, 0x81, 0x5a, 0x06, 0x00, 0xea, 0x00, + 0x40, 0x24, 0x81, 0x92, 0x06, 0x40, 0x3f, 0x00, 0x20, 0x42, 0x82, 0x44, + 0x06, 0xe0, 0x01, 0x00, 0x10, 0x81, 0x0c, 0x39, 0x03, 0x1f, 0x00, 0x00, + 0xcc, 0xff, 0x11, 0x82, 0xf1, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x1f, 0xcc, + 0x0c, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x1f, 0xf0, 0x03, 0x00, 0x00, 0x00, + 0xfc, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/splat.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,44 @@ +#define splat_width 65 +#define splat_height 54 +static char splat_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x04, 0xc0, 0x80, 0x03, 0x0e, 0x00, + 0x43, 0x00, 0x00, 0x08, 0xa0, 0x01, 0x01, 0x04, 0x82, 0x23, 0x00, 0x00, + 0x00, 0xe0, 0x01, 0x01, 0x00, 0x03, 0x11, 0x00, 0x00, 0x00, 0x83, 0x01, + 0x01, 0x04, 0x40, 0xc0, 0x01, 0x00, 0x80, 0x05, 0x00, 0x00, 0x04, 0x00, + 0x64, 0x03, 0x00, 0xc0, 0x0e, 0x04, 0x01, 0x04, 0x18, 0xa0, 0x03, 0x00, + 0xc0, 0x1e, 0x08, 0x03, 0x0e, 0x1f, 0xa1, 0xc3, 0x00, 0x86, 0x1f, 0x90, + 0xff, 0xff, 0x0f, 0xe0, 0x23, 0x00, 0x08, 0x3c, 0xf0, 0xff, 0xff, 0x0f, + 0xf0, 0x10, 0x00, 0x10, 0x20, 0xf0, 0x2b, 0xfd, 0x0f, 0x70, 0x00, 0x00, + 0x00, 0x80, 0x7f, 0xf5, 0xff, 0x0f, 0x10, 0x06, 0x00, 0x00, 0x00, 0xbf, + 0xfe, 0xff, 0x1f, 0x04, 0x00, 0x00, 0x7c, 0x00, 0x5f, 0xff, 0xff, 0x1f, + 0x04, 0x78, 0x00, 0xc6, 0x01, 0xae, 0xff, 0xff, 0x1f, 0x01, 0xfe, 0x00, + 0xfa, 0xe7, 0xdf, 0xff, 0xff, 0xbf, 0x01, 0xf5, 0x00, 0xfc, 0xff, 0xef, + 0xff, 0xff, 0xff, 0x80, 0x7f, 0x00, 0x00, 0xe0, 0xdf, 0xff, 0xff, 0x7f, + 0x40, 0x00, 0x00, 0x00, 0xc0, 0xef, 0xff, 0xff, 0x7f, 0x1e, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0xc0, 0xef, + 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x20, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x1b, 0x00, 0x00, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x3c, 0x00, 0xce, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, + 0x1e, 0x00, 0x84, 0x7f, 0xde, 0xff, 0x03, 0x00, 0x00, 0x0e, 0x04, 0xc4, + 0x1f, 0x88, 0xff, 0x07, 0x30, 0x00, 0x0c, 0x02, 0xc4, 0x1f, 0x00, 0x0f, + 0x1e, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x0c, 0x08, 0x0f, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x0c, 0x08, 0x06, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x08, 0x00, 0x06, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x06, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x04, 0x02, 0x34, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x1c, 0x04, 0x00, 0x68, 0x00, 0x80, 0x00, 0x01, + 0x00, 0x1c, 0x04, 0x00, 0xd0, 0x00, 0x00, 0x80, 0x40, 0x08, 0x08, 0x04, + 0x02, 0x60, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, 0x04, 0x04, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x08, 0x02, 0x04, 0x08, 0x00, 0x00, 0x08, 0x30, 0x00, + 0x08, 0x02, 0x00, 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x02, 0x04, 0xe0, 0x01, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x02, 0x04, 0x20, 0x01, 0x00, 0x80, 0x07, 0x00, + 0x00, 0x02, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x07, 0x00, 0x08, 0x06, 0x04, + 0x00, 0x00, 0x00, 0xb0, 0x43, 0x00, 0x08, 0x05, 0x04, 0x00, 0x00, 0x00, + 0xd8, 0x01, 0x00, 0x1c, 0x07, 0x06, 0x04, 0x00, 0x00, 0xe8, 0x01, 0x20, + 0x88, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x80, 0x0e, 0x0e, + 0x00, 0x02, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/stopsign.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,38 @@ +#define stopsign_width 64 +#define stopsign_height 64 +static char stopsign_bits[] = { + 0x00,0x00,0xfc,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x7f,0x00, + 0x00,0x00,0x00,0x07,0x00,0x00,0xe0,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0xc0, + 0x01,0x00,0x00,0xc0,0xf9,0xff,0xff,0x8f,0x03,0x00,0x00,0xe0,0xac,0xaa,0xaa, + 0x1a,0x07,0x00,0x00,0x70,0x56,0x55,0x55,0x35,0x0e,0x00,0x00,0x38,0xab,0xaa, + 0xaa,0x6a,0x1c,0x00,0x00,0x9c,0x55,0x55,0x55,0xd5,0x38,0x00,0x00,0xce,0xaa, + 0xaa,0xaa,0xaa,0x71,0x00,0x00,0x67,0x55,0x55,0x55,0x55,0xe3,0x00,0x80,0xb3, + 0xaa,0xaa,0xaa,0xaa,0xc6,0x01,0xc0,0x59,0x55,0x55,0x55,0x55,0x8d,0x03,0xe0, + 0xac,0xaa,0xaa,0xaa,0xaa,0x1a,0x07,0x70,0x56,0x55,0x55,0x55,0x55,0x35,0x0e, + 0x38,0xab,0xaa,0xaa,0xaa,0xaa,0x6a,0x1c,0x9c,0x55,0x55,0x55,0x55,0x55,0xd5, + 0x38,0xce,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x71,0x67,0x55,0x55,0x55,0x55,0x55, + 0x55,0xe3,0xb3,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xc6,0x53,0x55,0x55,0x55,0x55, + 0x55,0x55,0xcd,0xb3,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xca,0x53,0x55,0x55,0x55, + 0x55,0x55,0x55,0xcd,0xb3,0xfe,0xfb,0xff,0xfb,0xab,0xff,0xca,0x53,0x03,0x0d, + 0x00,0x0d,0x54,0x80,0xcd,0xb3,0x01,0x0a,0x00,0x07,0x68,0x00,0xcb,0xd3,0x78, + 0xf4,0xf9,0xe3,0x51,0x3e,0xce,0xb3,0xac,0xac,0xa9,0xb2,0x72,0x6a,0xca,0xd3, + 0xd4,0x54,0x59,0x53,0x53,0x56,0xce,0xb3,0xac,0xaf,0xa9,0xb2,0x72,0x6a,0xca, + 0xd3,0x54,0x55,0x59,0x53,0x53,0x56,0xce,0xb3,0xf8,0xaa,0xa9,0xb2,0x72,0x3e, + 0xca,0x53,0x01,0x55,0x59,0x53,0x53,0x00,0xcd,0xb3,0x02,0xaa,0xa9,0xb2,0x72, + 0x80,0xca,0x53,0x7d,0x54,0x59,0x53,0x53,0x7e,0xcd,0xb3,0xaa,0xac,0xa9,0xb2, + 0x72,0xaa,0xca,0x53,0xd7,0x54,0x59,0x53,0x53,0x56,0xcd,0xb3,0xac,0xac,0xa9, + 0xb2,0x72,0xaa,0xca,0xd3,0xd4,0x54,0x59,0x53,0x53,0x56,0xcd,0xb3,0x78,0xac, + 0xa9,0xe2,0x71,0xaa,0xca,0x53,0x01,0x56,0x59,0x05,0x58,0x56,0xcd,0xb3,0x02, + 0xab,0xa9,0x0a,0x6c,0xaa,0xca,0x53,0xfd,0x55,0x5f,0xf5,0xd7,0x55,0xcd,0xb3, + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xca,0x63,0x55,0x55,0x55,0x55,0x55,0x55,0xcd, + 0xc7,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xe6,0x8e,0x55,0x55,0x55,0x55,0x55,0x55, + 0x73,0x1c,0xab,0xaa,0xaa,0xaa,0xaa,0xaa,0x39,0x38,0x56,0x55,0x55,0x55,0x55, + 0xd5,0x1c,0x70,0xac,0xaa,0xaa,0xaa,0xaa,0x6a,0x0e,0xe0,0x58,0x55,0x55,0x55, + 0x55,0x35,0x07,0xc0,0xb1,0xaa,0xaa,0xaa,0xaa,0x9a,0x03,0x80,0x63,0x55,0x55, + 0x55,0x55,0xcd,0x01,0x00,0xc7,0xaa,0xaa,0xaa,0xaa,0xe6,0x00,0x00,0x8e,0x55, + 0x55,0x55,0x55,0x73,0x00,0x00,0x1c,0xab,0xaa,0xaa,0xaa,0x39,0x00,0x00,0x38, + 0x56,0x55,0x55,0xd5,0x1c,0x00,0x00,0x70,0xac,0xaa,0xaa,0x6a,0x0e,0x00,0x00, + 0xe0,0x58,0x55,0x55,0x35,0x07,0x00,0x00,0xc0,0xf1,0xff,0xff,0x9f,0x03,0x00, + 0x00,0x80,0x03,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0xe0,0x00, + 0x00,0x00,0x00,0xfe,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x3f, + 0x00,0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/sundae.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define sundae_width 64 +#define sundae_height 64 +static char sundae_bits[] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0xff, 0x23, 0x22, 0x22, 0x22, 0x22, + 0x88, 0x88, 0x88, 0xcf, 0x89, 0x88, 0x88, 0x88, 0x88, 0xc8, 0x88, 0xf8, + 0x8e, 0x88, 0x88, 0x88, 0x22, 0x22, 0x22, 0xf2, 0x25, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x7a, 0x2f, 0x22, 0x22, 0x22, 0x88, 0x88, 0x88, 0xb8, + 0x9b, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xe8, 0xee, 0x88, 0x88, 0x88, + 0x22, 0x22, 0x22, 0xde, 0x9d, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x76, + 0x8f, 0x22, 0x22, 0x22, 0x88, 0x88, 0x88, 0xf7, 0x0f, 0x89, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xc1, 0x03, 0x89, 0x88, 0x88, 0x22, 0x22, 0xa2, 0x00, + 0x41, 0x23, 0x22, 0x22, 0x22, 0x22, 0xa2, 0x00, 0x30, 0x26, 0x22, 0x22, + 0x88, 0x88, 0x88, 0x00, 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xfe, + 0x43, 0x98, 0x88, 0x88, 0x22, 0x22, 0xc2, 0x00, 0x20, 0x30, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x00, 0x18, 0x20, 0x22, 0x22, 0x88, 0x88, 0x18, 0x80, + 0x07, 0xf0, 0x88, 0x88, 0x88, 0x88, 0x18, 0xf9, 0x00, 0xfe, 0x88, 0x88, + 0x22, 0x22, 0xfc, 0x03, 0x80, 0xff, 0x23, 0x22, 0x22, 0x22, 0xfe, 0x03, + 0xf0, 0xff, 0x23, 0x22, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0x8b, 0x88, + 0x88, 0x88, 0xff, 0xff, 0xff, 0xf7, 0x8f, 0x88, 0x22, 0x22, 0xff, 0xff, + 0xff, 0xf3, 0x2f, 0x22, 0x22, 0x22, 0xff, 0xff, 0xdf, 0xc3, 0x39, 0x22, + 0x88, 0x88, 0xe7, 0xff, 0x9f, 0xc3, 0x91, 0x88, 0x88, 0x88, 0xe3, 0xfd, + 0x8f, 0x03, 0xa0, 0x88, 0x22, 0xa2, 0xe3, 0xf9, 0x8f, 0x03, 0x20, 0x22, + 0x22, 0x62, 0xe3, 0x83, 0x8f, 0x01, 0x20, 0x22, 0x88, 0x28, 0xe2, 0x83, + 0x0f, 0x00, 0xf0, 0x88, 0x88, 0x18, 0xe2, 0x81, 0x0f, 0x80, 0xd1, 0x88, + 0x22, 0x32, 0x02, 0x00, 0x87, 0x63, 0x60, 0x22, 0x22, 0x32, 0x03, 0x00, + 0x07, 0x3c, 0x60, 0x22, 0x88, 0xf8, 0x00, 0x00, 0x06, 0x00, 0xf0, 0x88, + 0x88, 0xe8, 0x01, 0x00, 0x06, 0x00, 0xdc, 0x88, 0x22, 0xa2, 0x0e, 0x00, + 0x06, 0x80, 0x2b, 0x22, 0x22, 0x62, 0x75, 0x00, 0x06, 0x70, 0x35, 0x22, + 0x88, 0xc8, 0xaa, 0x07, 0x02, 0xaf, 0x9a, 0x88, 0x88, 0x88, 0x55, 0xfd, + 0xff, 0x55, 0x8d, 0x88, 0x22, 0x22, 0xab, 0xaa, 0xaa, 0xaa, 0x26, 0x22, + 0x22, 0x22, 0x56, 0x55, 0x55, 0x55, 0x27, 0x22, 0x88, 0x88, 0xac, 0xaa, + 0xaa, 0xaa, 0x8b, 0x88, 0x88, 0x88, 0x5c, 0x55, 0x55, 0xd5, 0x89, 0x88, + 0x22, 0x22, 0xba, 0xaa, 0xaa, 0x6a, 0x22, 0x22, 0x22, 0x22, 0x72, 0x55, + 0x55, 0x7d, 0x22, 0x22, 0x88, 0x88, 0xc8, 0xaa, 0xaa, 0x8e, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x5f, 0xd5, 0x8b, 0x88, 0x88, 0x22, 0x22, 0x22, 0xf2, + 0x3f, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/swissknife.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,38 @@ +#define swissknife_width 64 +#define swissknife_height 64 +static char swissknife_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, + 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, + 0xfe,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0x7f,0x00,0x00,0x00,0x00,0x00, + 0x80,0xeb,0x7f,0x00,0x00,0x40,0x00,0x00,0xc0,0xcd,0x7f,0x00,0x00,0x40,0x01, + 0x00,0xe0,0x96,0x3f,0x00,0x00,0xc0,0x02,0x00,0x70,0x69,0x6f,0x00,0x00,0x00, + 0x02,0x00,0x78,0x15,0xa7,0x00,0x00,0x00,0x09,0x00,0x7c,0xd1,0x43,0x03,0x00, + 0x00,0x17,0x00,0x7e,0xef,0x41,0x04,0x00,0x00,0x10,0x00,0x7f,0xf0,0x42,0x08, + 0x00,0x00,0x08,0x80,0xff,0x7f,0x42,0x30,0x00,0x00,0x68,0xc0,0xff,0x3f,0xc3, + 0x40,0x00,0x00,0x90,0xe1,0xff,0x9f,0x84,0x91,0x00,0x00,0x40,0xf6,0xff,0x4f, + 0x84,0x22,0x01,0x00,0x40,0xfc,0xff,0x27,0xa4,0x44,0x06,0x00,0x80,0xfc,0xff, + 0x03,0xa4,0x88,0x08,0x00,0x00,0xff,0xff,0x19,0xa4,0x10,0x11,0x00,0x00,0xff, + 0xff,0x06,0xa8,0x60,0x10,0x00,0x80,0xff,0x7f,0x02,0x48,0x81,0x20,0x00,0xc0, + 0xff,0xbf,0x01,0x48,0x01,0x21,0x00,0xe0,0xff,0xdf,0x00,0x48,0x01,0x22,0x00, + 0xf0,0xff,0x4f,0x00,0x08,0x01,0x24,0x00,0xf8,0xff,0x37,0x00,0x10,0x01,0x28, + 0x00,0xfc,0xff,0x0b,0x00,0x10,0x02,0x30,0x00,0xfe,0xff,0x09,0x00,0x10,0x02, + 0x00,0x00,0xff,0xff,0x0e,0x00,0x10,0x02,0x00,0x00,0xff,0x7f,0x03,0x00,0x10, + 0x02,0x00,0x80,0xff,0x3f,0x01,0x00,0x20,0x02,0x00,0x80,0xff,0x9f,0x00,0x00, + 0x20,0x01,0x00,0x80,0xff,0x6f,0x00,0x00,0x20,0x01,0x00,0x80,0xff,0x17,0x00, + 0x00,0xe0,0x00,0x00,0x80,0xff,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x07, + 0x00,0x00,0x00,0x00,0x00,0x80,0x77,0x04,0x07,0x00,0x00,0x00,0x00,0x40,0x5c, + 0x04,0x05,0x00,0x00,0x00,0x00,0x20,0xc8,0x07,0x05,0x00,0x00,0x00,0x00,0x20, + 0x88,0x02,0x05,0x00,0x00,0x00,0x00,0x20,0x08,0x05,0x09,0x00,0x00,0x00,0x00, + 0x40,0x04,0x0a,0x09,0x00,0x00,0x00,0x00,0x80,0x03,0x0a,0x09,0x00,0x00,0x00, + 0x00,0x00,0x00,0x14,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x09,0x00,0x00, + 0x00,0x00,0x00,0x00,0x50,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x09,0x00, + 0x00,0x00,0x00,0x00,0x00,0xa0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x0c, + 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x04,0x00,0x00,0x00,0x00, + 0x00,0x00,0xd2,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x0b,0x00,0x00,0x00, + 0x00,0x00,0x00,0x12,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00, + 0x00,0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/tardis.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define tardis_width 64 +#define tardis_height 64 +static char tardis_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xac, 0xaa, 0xaa, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, + 0x55, 0x55, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0x00, 0x80, 0xaa, 0xaa, 0xaa, 0xaa, 0x02, 0x00, 0x00, 0x80, 0x55, 0x55, + 0x55, 0x55, 0x03, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x77, 0xdd, 0x9d, 0x00, 0x00, + 0x00, 0x00, 0x76, 0x77, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x72, 0x77, + 0xdd, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x76, 0x77, 0xdc, 0xdd, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x76, 0x77, + 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x72, 0x77, 0xdd, 0x9d, 0x00, 0x00, + 0x00, 0x00, 0x76, 0x77, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x72, 0x77, + 0xdd, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0xaa, 0xaa, 0xab, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x56, 0x55, + 0x55, 0xd5, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x0b, 0xa0, 0x00, 0x00, + 0x00, 0x00, 0x16, 0x50, 0xa5, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xa8, + 0x4b, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x16, 0x50, 0xa5, 0xd2, 0x00, 0x00, + 0x00, 0x00, 0x2a, 0xa8, 0x4b, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x16, 0x50, + 0xa5, 0xd2, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x4b, 0xa5, 0x00, 0x00, + 0x00, 0x00, 0x56, 0x55, 0x05, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, + 0xab, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x56, 0x55, 0x55, 0xd5, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0xa0, 0x0b, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x45, + 0xa5, 0xd2, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x4b, 0xa5, 0x00, 0x00, + 0x00, 0x00, 0x46, 0x45, 0xa5, 0xd2, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, + 0x4b, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x46, 0x45, 0xa5, 0xd2, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0xa0, 0x0b, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x56, 0x55, + 0x55, 0xd5, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xab, 0xaa, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x40, 0x05, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, + 0x4b, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x46, 0x45, 0xa5, 0xd2, 0x00, 0x00, + 0x00, 0x00, 0xaa, 0xaa, 0x4b, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x46, 0x45, + 0xa5, 0xd2, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x4b, 0xa5, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x40, 0x05, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, + 0xab, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x56, 0x55, 0x55, 0xd5, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x80, 0xaa, 0xaa, + 0xaa, 0xaa, 0x02, 0x00, 0x00, 0x80, 0xaa, 0xaa, 0xaa, 0xaa, 0x02, 0x00, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/terminal.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define terminal_width 64 +#define terminal_height 54 +static char terminal_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x80, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, + 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x00, 0x80, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0x00, 0x80, 0x05, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x00, + 0x80, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0x80, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xd7, 0x00, 0x80, 0x36, 0x00, 0xf0, 0xff, 0xff, 0xb7, 0x00, + 0x80, 0xb5, 0xff, 0xf7, 0xff, 0xff, 0xd7, 0x00, 0x80, 0x36, 0x00, 0xf0, + 0xff, 0xff, 0xb7, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xff, 0xff, 0xd7, 0x00, + 0x80, 0xb6, 0xff, 0xf7, 0xff, 0xff, 0xb7, 0x00, 0x80, 0xb5, 0xff, 0xf7, + 0xff, 0xff, 0xd7, 0x00, 0x80, 0xb6, 0xff, 0x07, 0x00, 0x00, 0xb7, 0x00, + 0x80, 0xb5, 0xff, 0xf7, 0xff, 0x7f, 0xd7, 0x00, 0x80, 0xb6, 0xff, 0x07, + 0x00, 0x00, 0xb7, 0x00, 0x80, 0xb5, 0xff, 0x57, 0x55, 0x55, 0xd7, 0x00, + 0x80, 0xb6, 0xff, 0xa7, 0xaa, 0x2a, 0xb7, 0x00, 0x80, 0x35, 0x00, 0x50, + 0x55, 0x55, 0xd7, 0x00, 0x80, 0xf6, 0xff, 0xa9, 0xaa, 0x2a, 0xb7, 0x00, + 0x80, 0xf5, 0xff, 0x55, 0x55, 0x55, 0xd7, 0x00, 0x80, 0xf6, 0xff, 0xa9, + 0xaa, 0x2a, 0xb7, 0x00, 0x80, 0xf5, 0xff, 0x55, 0x55, 0x55, 0xd7, 0x00, + 0x80, 0xf6, 0xff, 0xa9, 0xaa, 0x2a, 0xb7, 0x00, 0x80, 0xf5, 0xff, 0x55, + 0x55, 0x55, 0xd7, 0x00, 0x80, 0x36, 0xe2, 0xa9, 0xaa, 0x2a, 0xb7, 0x00, + 0x80, 0xb5, 0xea, 0x01, 0x00, 0x00, 0xd7, 0x00, 0x80, 0x36, 0xe2, 0xff, + 0xff, 0xff, 0xb7, 0x00, 0x80, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x00, + 0x80, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0x80, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xd0, 0x00, 0x80, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x00, + 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x00, 0x80, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x7f, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x7a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x75, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0xc0, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x01, 0x40, 0xdf, 0x7b, 0x6f, + 0xef, 0xbd, 0x77, 0x01, 0xa0, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x02, + 0xe0, 0xf7, 0xde, 0xfb, 0x7b, 0xef, 0x7d, 0x03, 0xb0, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x06, 0xd0, 0x7f, 0xef, 0xbd, 0xbd, 0xf7, 0xde, 0x05, + 0xa8, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, 0x54, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x15, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0x56, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x35, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x2a, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/termlock.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define termlock_width 64 +#define termlock_height 54 +static char termlock_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x80, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, + 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x00, 0x80, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0x00, 0x80, 0x05, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x00, + 0x80, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0x80, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xd7, 0x00, 0x80, 0x36, 0x00, 0xf0, 0xff, 0xff, 0xb7, 0x00, + 0x80, 0xb5, 0xff, 0xf7, 0xff, 0xff, 0xd7, 0x00, 0x80, 0x36, 0x00, 0xf0, + 0xff, 0xff, 0xb7, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xff, 0xff, 0xd7, 0x00, + 0x20, 0xb6, 0xff, 0xf7, 0xff, 0xff, 0x37, 0x02, 0x50, 0xb4, 0xff, 0xf7, + 0xff, 0xff, 0x17, 0x05, 0x90, 0xb6, 0xff, 0x07, 0x00, 0x00, 0xb7, 0x04, + 0x50, 0xb0, 0xff, 0xf7, 0xff, 0x7f, 0x07, 0x05, 0xa0, 0xb2, 0xff, 0x07, + 0x00, 0x00, 0xa7, 0x02, 0x00, 0xa5, 0xff, 0x57, 0x55, 0x55, 0x53, 0x00, + 0x80, 0xa8, 0xff, 0xa7, 0xaa, 0x2a, 0x8b, 0x00, 0x00, 0x05, 0x00, 0x50, + 0x55, 0x55, 0x50, 0x00, 0x00, 0x2a, 0xff, 0xa9, 0xaa, 0x2a, 0x2a, 0x00, + 0x80, 0x50, 0xfe, 0x55, 0x55, 0x15, 0x85, 0x00, 0x80, 0x8a, 0xfe, 0xa9, + 0xaa, 0xaa, 0xa8, 0x00, 0x80, 0x51, 0xf8, 0x55, 0x55, 0x05, 0xc5, 0x00, + 0x80, 0xa6, 0xf2, 0xa9, 0xaa, 0xa2, 0xb2, 0x00, 0x80, 0x05, 0xe5, 0x55, + 0x55, 0x51, 0xd0, 0x00, 0x80, 0xb6, 0xe8, 0xa9, 0xaa, 0x8a, 0xb6, 0x00, + 0x80, 0x35, 0x85, 0x01, 0x00, 0x50, 0xd6, 0x00, 0x80, 0x36, 0x2a, 0xff, + 0x7f, 0x2a, 0xb7, 0x00, 0x80, 0xf5, 0x51, 0xfe, 0x3f, 0x85, 0xd7, 0x00, + 0x80, 0xe6, 0x8b, 0xfe, 0xbf, 0xe8, 0xb3, 0x00, 0x80, 0x05, 0x50, 0x00, + 0x00, 0x05, 0xd0, 0x00, 0x80, 0xfa, 0xa7, 0xf2, 0xa7, 0xf2, 0xaf, 0x00, + 0x80, 0x55, 0x05, 0x45, 0x51, 0x50, 0xd5, 0x00, 0x80, 0xaa, 0xaa, 0x88, + 0x8a, 0xaa, 0xaa, 0x00, 0x80, 0xff, 0x3f, 0xe5, 0x53, 0xfe, 0xff, 0x00, + 0x00, 0x00, 0x7f, 0x0a, 0x28, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0x10, + 0x84, 0x7a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf7, 0x77, 0x75, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xf7, 0xf7, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x87, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x37, 0xf6, 0xff, 0xff, 0x00, + 0xc0, 0xaa, 0xaa, 0x32, 0xa6, 0xaa, 0xaa, 0x01, 0x40, 0xdf, 0x7b, 0xfb, + 0xef, 0xbd, 0x77, 0x01, 0xa0, 0xaa, 0xaa, 0xfa, 0xaf, 0xaa, 0xaa, 0x02, + 0xe0, 0xf7, 0xde, 0xfb, 0x6f, 0xef, 0x7d, 0x03, 0xb0, 0xaa, 0xaa, 0xfa, + 0xaf, 0xaa, 0xaa, 0x06, 0xd0, 0x7f, 0xef, 0x79, 0xaf, 0xf7, 0xde, 0x05, + 0xa8, 0xaa, 0xaa, 0x7a, 0xaf, 0xaa, 0xaa, 0x0a, 0x54, 0x55, 0x55, 0x79, + 0x4f, 0x55, 0x55, 0x15, 0xfa, 0xff, 0xff, 0x3b, 0xee, 0xff, 0xff, 0x2f, + 0x56, 0x55, 0x55, 0xf9, 0x4f, 0x55, 0x55, 0x35, 0xaa, 0xaa, 0xaa, 0x02, + 0xa0, 0xaa, 0xaa, 0x2a, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/tex-48.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,23 @@ +#define noname_width 48 +#define noname_height 48 +static char noname_bits[] = { + 0xfc,0xff,0xff,0xff,0xff,0x1f,0x04,0x00,0x00,0x00,0x00,0x10,0x04,0xa2,0xaa, + 0x00,0x00,0x10,0x04,0x10,0xf5,0x77,0x00,0x10,0x84,0xaa,0xbb,0xa0,0x02,0x10, + 0x04,0xf1,0x5f,0x20,0x08,0x10,0xa4,0xea,0xaa,0x2e,0x20,0x10,0x04,0xff,0xff, + 0xff,0x01,0x10,0xa4,0xaa,0xff,0xff,0x8b,0x10,0x54,0xff,0xff,0xfb,0x1f,0x11, + 0xa4,0xea,0xee,0xe2,0x2e,0x12,0x54,0x7f,0xff,0x01,0x30,0x10,0xa4,0xba,0xfe, + 0x83,0xa0,0x10,0xc4,0x1f,0xff,0xc3,0x80,0x13,0xa4,0x0e,0xee,0xee,0x00,0x12, + 0x04,0x07,0xf6,0x7f,0x00,0x10,0x84,0x0b,0xaa,0x2a,0x00,0x10,0x04,0x0f,0xdc, + 0x7f,0x00,0x10,0x04,0x0a,0xa8,0x2a,0x00,0x10,0x04,0x16,0xf0,0x1f,0x00,0x10, + 0x04,0xa9,0xa0,0x02,0x00,0x10,0x04,0x00,0x00,0x00,0x00,0x10,0x04,0x00,0x00, + 0x00,0x00,0x10,0xff,0x7f,0x00,0xe0,0xbf,0x7f,0xff,0x7f,0x00,0xe0,0xbf,0x7f, + 0xcf,0x79,0x00,0x80,0x1f,0x1e,0xc7,0x71,0x00,0x00,0x1f,0x0f,0xc3,0x61,0x00, + 0x00,0xbe,0x07,0xc3,0x61,0x00,0x00,0xfc,0x03,0xc3,0x61,0x00,0x00,0xf8,0x01, + 0xc0,0x01,0x00,0x00,0xf0,0x01,0xc0,0x01,0x00,0x00,0xf0,0x01,0xc0,0xf9,0xff, + 0x07,0xf8,0x03,0xc0,0xf9,0xff,0x07,0xfc,0x07,0xc0,0xe1,0x81,0x07,0x9e,0x0f, + 0xc0,0xc1,0x01,0x07,0x0f,0x1f,0xc0,0xc1,0x61,0x86,0x07,0x3e,0xf8,0xcf,0x61, + 0xe6,0x9f,0xff,0xf8,0xcf,0x71,0xe6,0x9f,0xff,0x00,0xc0,0x7f,0x00,0x00,0x00, + 0x00,0xc0,0x7f,0x00,0x00,0x00,0x00,0xc0,0x71,0x06,0x00,0x00,0x00,0xc0,0x61, + 0x06,0x00,0x00,0x00,0xc0,0x61,0x06,0x00,0x00,0x00,0xc0,0x01,0x07,0x00,0x00, + 0x00,0xe0,0x01,0x07,0x00,0x00,0x00,0xf8,0xff,0x07,0x00,0x00,0x00,0xf8,0xff, + 0x07,0x00,0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/texinfo.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define texinfo.xbm_width 64 +#define texinfo.xbm_height 54 +static char texinfo.xbm_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, + 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x55, 0x92, 0x24, + 0x49, 0x92, 0x3c, 0x00, 0x00, 0x19, 0x49, 0x92, 0x24, 0x49, 0x3c, 0x00, + 0x00, 0x91, 0x24, 0x49, 0x92, 0x24, 0x7d, 0x01, 0x00, 0x59, 0x92, 0x24, + 0x49, 0x92, 0xac, 0x02, 0x00, 0x15, 0x49, 0x92, 0x24, 0x49, 0x7c, 0x01, + 0x00, 0x99, 0x24, 0x49, 0x92, 0x24, 0xbd, 0x02, 0x00, 0x51, 0x92, 0x24, + 0x49, 0x92, 0x7c, 0x01, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x02, + 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x74, 0x01, 0x00, 0x99, 0x7f, 0xfe, + 0x9c, 0x63, 0xb4, 0x02, 0x00, 0x91, 0x7f, 0xfe, 0x9c, 0x63, 0x7c, 0x01, + 0x00, 0x19, 0x0c, 0x06, 0xfc, 0x63, 0xbc, 0x02, 0x00, 0x15, 0x0c, 0x3e, + 0xf0, 0x60, 0x74, 0x01, 0x00, 0x19, 0x0c, 0x3e, 0x60, 0x60, 0xb4, 0x02, + 0x00, 0x11, 0x0c, 0x06, 0xf0, 0x60, 0x74, 0x01, 0x00, 0x19, 0x0c, 0x06, + 0xfc, 0x63, 0xbc, 0x02, 0x00, 0x15, 0x0c, 0xfe, 0x9c, 0x63, 0x7c, 0x01, + 0x00, 0x19, 0x0c, 0xfe, 0x9c, 0x63, 0xbc, 0x02, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0x01, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x02, + 0x00, 0x55, 0x92, 0x24, 0x49, 0x92, 0x74, 0x01, 0x00, 0x19, 0x49, 0x92, + 0x24, 0x49, 0xb4, 0x02, 0x00, 0x91, 0x24, 0x49, 0x92, 0x24, 0x6d, 0x01, + 0x00, 0x59, 0x92, 0x24, 0x49, 0x92, 0xac, 0x02, 0x00, 0x15, 0x49, 0x92, + 0x24, 0x49, 0x6c, 0x01, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, + 0x00, 0x51, 0x14, 0x63, 0x92, 0x89, 0x7c, 0x01, 0x00, 0x19, 0xaa, 0x94, + 0x52, 0x0a, 0xac, 0x02, 0x00, 0x95, 0xa2, 0x97, 0xd2, 0x0b, 0x75, 0x01, + 0x00, 0x59, 0xa2, 0x94, 0x52, 0x8a, 0xbc, 0x02, 0x00, 0x11, 0xa2, 0x94, + 0x4c, 0x3a, 0x7c, 0x01, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x02, + 0x00, 0x55, 0x92, 0x24, 0x49, 0x92, 0x7c, 0x01, 0x00, 0x19, 0x49, 0x92, + 0x24, 0x49, 0xb4, 0x02, 0x00, 0x91, 0x24, 0x49, 0x92, 0x24, 0x6d, 0x01, + 0x00, 0x59, 0x92, 0x24, 0x49, 0x92, 0xb4, 0x02, 0x00, 0x15, 0x49, 0x92, + 0x24, 0x49, 0x74, 0x01, 0x00, 0x99, 0x24, 0x49, 0x92, 0x24, 0xb5, 0x02, + 0x00, 0x51, 0x92, 0x24, 0x49, 0x92, 0x74, 0x01, 0x00, 0x19, 0x49, 0x92, + 0x24, 0x49, 0xbc, 0x02, 0x00, 0x95, 0x24, 0x49, 0x92, 0x24, 0x7d, 0x01, + 0x00, 0x59, 0x92, 0x24, 0x49, 0x92, 0xac, 0x02, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x00, 0x6e, 0x01, 0x00, 0xee, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x02, + 0x00, 0x51, 0x3f, 0x1e, 0xfb, 0x3f, 0x7d, 0x01, 0x00, 0xb1, 0xfa, 0xaf, + 0xef, 0xff, 0xbb, 0x02, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01, + 0x00, 0xa8, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x02, 0x00, 0x50, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x01, 0x00, 0xa0, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x02};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/tree-48.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,27 @@ +#define tree48_width 48 +#define tree48_height 48 +static char tree48_bits[] = { + 0x00, 0x00, 0x7f, 0x0b, 0x01, 0x00, 0x00, 0x00, 0xbf, 0x16, 0x01, 0x00, + 0x00, 0x00, 0x6f, 0x05, 0x01, 0x00, 0x00, 0x00, 0x7f, 0x1a, 0x01, 0x00, + 0x00, 0x00, 0x7f, 0x35, 0x01, 0x00, 0x00, 0x00, 0xbf, 0x1c, 0x01, 0x00, + 0x00, 0x00, 0x6f, 0x0b, 0x01, 0x00, 0x00, 0x00, 0xef, 0x09, 0x01, 0x00, + 0x00, 0x00, 0x7b, 0x05, 0x01, 0x00, 0x00, 0x00, 0xf1, 0x09, 0x01, 0x00, + 0x00, 0x00, 0x77, 0x1b, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x0d, 0x01, 0x00, + 0x00, 0x00, 0xff, 0x0f, 0x01, 0x00, 0x00, 0x00, 0xff, 0x0b, 0x01, 0x00, + 0x00, 0x00, 0xef, 0x0f, 0x01, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x01, 0x00, + 0x00, 0x00, 0xbb, 0x17, 0x01, 0x00, 0x00, 0x00, 0xe9, 0x1f, 0x01, 0x00, + 0x00, 0x00, 0xf3, 0x3f, 0x03, 0x00, 0x00, 0x80, 0xf9, 0x3f, 0x07, 0x00, + 0x00, 0x80, 0xe5, 0x2e, 0x07, 0x00, 0x00, 0xc0, 0x7b, 0xdf, 0x0e, 0x00, + 0x00, 0xf0, 0xff, 0xfc, 0x0f, 0x00, 0x00, 0xf8, 0x7f, 0xfd, 0xff, 0x00, + 0x00, 0xfc, 0xff, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x07, + 0x80, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0x7f, 0x79, 0x0e, + 0xf0, 0xe7, 0x3f, 0x7d, 0x79, 0x1d, 0xfc, 0x33, 0x1e, 0x39, 0x72, 0x3c, + 0xfc, 0x73, 0x3e, 0x39, 0xe4, 0x38, 0xde, 0x93, 0x5e, 0x39, 0xe2, 0x78, + 0xce, 0x15, 0x4f, 0x7a, 0xc4, 0x75, 0xcf, 0xa5, 0x1f, 0xbc, 0xa4, 0x45, + 0xcf, 0x95, 0x3b, 0x3a, 0x91, 0xc3, 0xcf, 0x89, 0x59, 0x3a, 0xca, 0x63, + 0xe3, 0x99, 0x59, 0xfa, 0xe0, 0x57, 0xe3, 0xab, 0x99, 0xd8, 0x71, 0xd6, + 0xe3, 0xcb, 0x91, 0xd8, 0x31, 0x56, 0xa3, 0xea, 0x12, 0x4c, 0x11, 0x55, + 0x92, 0x72, 0x12, 0x4a, 0x93, 0x8c, 0x92, 0x72, 0x11, 0x49, 0x57, 0x14, + 0x92, 0x32, 0x12, 0x4d, 0x94, 0x92, 0x11, 0x11, 0x22, 0x09, 0x82, 0x42, + 0x91, 0x12, 0xa1, 0x10, 0x61, 0x64, 0xca, 0x22, 0x10, 0x91, 0x50, 0x04, + 0x44, 0x22, 0x08, 0x09, 0x89, 0x08, 0x2a, 0x14, 0x10, 0x12, 0x89, 0x10};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/tree.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define tree_width 64 +#define tree_height 64 +static char tree.bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x25, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x15, 0x69, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x11, 0x26, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x26, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x42, 0x83, 0x01, 0x00, 0x00, + 0x00, 0x98, 0x2d, 0xc2, 0x4a, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x47, 0xe0, + 0x5c, 0x29, 0x00, 0x00, 0x00, 0x80, 0x45, 0xa2, 0x29, 0x19, 0x00, 0x00, + 0x00, 0x06, 0x4b, 0xc2, 0x10, 0xee, 0x00, 0x00, 0x00, 0x34, 0x0a, 0xa3, + 0x98, 0x03, 0x00, 0x00, 0x80, 0x00, 0x16, 0x61, 0xe0, 0x00, 0x00, 0x00, + 0x80, 0x40, 0x94, 0x51, 0x69, 0x04, 0x00, 0x00, 0x00, 0x01, 0x04, 0xb9, + 0x24, 0xeb, 0x02, 0x00, 0x00, 0x03, 0xd9, 0x14, 0x12, 0x04, 0x00, 0x00, + 0xe0, 0x17, 0x8c, 0xc0, 0x10, 0x00, 0x00, 0x00, 0x00, 0xe3, 0xda, 0x48, + 0x08, 0x00, 0x01, 0x00, 0x80, 0x01, 0x66, 0x28, 0x48, 0xaf, 0x01, 0x00, + 0x00, 0x00, 0x38, 0x38, 0x5e, 0x28, 0x00, 0x00, 0x00, 0x30, 0xb5, 0x10, + 0x06, 0x07, 0x00, 0x00, 0x00, 0x4d, 0x2c, 0x22, 0x02, 0x01, 0x01, 0x00, + 0xc0, 0xc1, 0x30, 0x66, 0xeb, 0x5d, 0x06, 0x00, 0x40, 0xa0, 0x21, 0x04, + 0x23, 0x00, 0x01, 0x00, 0x00, 0xc0, 0x23, 0x4c, 0x21, 0xe8, 0x06, 0x00, + 0xc0, 0x9b, 0x66, 0x0c, 0xa1, 0x50, 0x08, 0x00, 0x00, 0xb8, 0x65, 0x84, + 0x89, 0xa0, 0x03, 0x00, 0x00, 0x08, 0x6a, 0x98, 0x44, 0x10, 0x0c, 0x00, + 0x00, 0x96, 0x34, 0x80, 0x40, 0x08, 0x10, 0x00, 0x00, 0x00, 0x7a, 0x0c, + 0x40, 0x17, 0x0d, 0x00, 0x00, 0x00, 0x70, 0x98, 0xc0, 0x51, 0x1c, 0x00, + 0x00, 0x38, 0xc0, 0x18, 0x30, 0xc4, 0x03, 0x00, 0x00, 0x5c, 0xe1, 0x98, + 0x1c, 0x44, 0x01, 0x00, 0x00, 0x0c, 0x2c, 0x48, 0x07, 0x74, 0x00, 0x00, + 0x00, 0x76, 0x6a, 0x88, 0x07, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, + 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0xbd, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0x84, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x80, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd7, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x6b, 0x93, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/wizard.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define wizard_width 64 +#define wizard_height 54 +static char wizard_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, + 0x03, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0x03, 0x00, 0x20, 0x40, + 0x00, 0x00, 0xf8, 0xfe, 0x07, 0x00, 0x50, 0x92, 0x00, 0x00, 0x3c, 0xfe, + 0x0f, 0x00, 0x68, 0xd9, 0x00, 0x00, 0x0c, 0xfc, 0x1f, 0x00, 0x64, 0x4d, + 0x00, 0x00, 0x04, 0xd7, 0x1f, 0x00, 0xb2, 0x7e, 0x00, 0x00, 0xc0, 0xff, + 0x1f, 0x00, 0xfc, 0x5f, 0x00, 0x00, 0xa0, 0xff, 0xcf, 0x0f, 0x10, 0x7f, + 0x00, 0xc0, 0x7f, 0x00, 0xf0, 0x33, 0x10, 0x4e, 0x00, 0x70, 0xf0, 0xff, + 0x7f, 0x40, 0x18, 0x26, 0x00, 0xe8, 0xc3, 0xff, 0x03, 0x9f, 0x1c, 0x22, + 0x00, 0xfc, 0x1f, 0x00, 0xc0, 0x7f, 0x9c, 0x11, 0x00, 0xfc, 0x7f, 0x00, + 0xf8, 0x7f, 0xce, 0x08, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x1f, 0x6e, 0x04, + 0x00, 0x00, 0x9e, 0x6d, 0x72, 0x07, 0x6f, 0x02, 0x00, 0x80, 0x3f, 0xc6, + 0x38, 0xff, 0x6f, 0x06, 0x00, 0xf8, 0xfb, 0xc3, 0xdf, 0x7e, 0x77, 0x06, + 0x00, 0xfc, 0xfd, 0xe7, 0x9f, 0x7d, 0x77, 0x07, 0x80, 0xff, 0xd7, 0xbd, + 0x03, 0x9f, 0xea, 0x0f, 0x70, 0xc0, 0xab, 0x7e, 0x0a, 0xd7, 0x73, 0x0f, + 0x88, 0x05, 0x1f, 0xba, 0x82, 0xce, 0xe6, 0x0f, 0x64, 0x00, 0x2e, 0x82, + 0xc0, 0x8f, 0x43, 0x0f, 0x36, 0x30, 0x0c, 0x00, 0x00, 0x37, 0xf8, 0x0f, + 0x3a, 0x18, 0xb9, 0x00, 0xc0, 0x5f, 0x76, 0x0f, 0x3a, 0x80, 0x19, 0x00, + 0x88, 0xff, 0xff, 0x0f, 0x7b, 0xc0, 0xd8, 0x02, 0xd0, 0xff, 0x7f, 0x0f, + 0x7b, 0xfc, 0x7c, 0x40, 0xf4, 0xff, 0xff, 0x07, 0xb3, 0xbb, 0xbe, 0x09, + 0xe5, 0xff, 0xbf, 0x07, 0xbf, 0x9b, 0xfd, 0x5d, 0xef, 0xff, 0xff, 0x07, + 0x3b, 0x99, 0xfe, 0xdf, 0xff, 0xff, 0xde, 0x03, 0x23, 0x49, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0x03, 0x1f, 0xf2, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0x01, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x01, 0xfe, 0xf7, 0xfd, 0xff, + 0xf7, 0xff, 0xfd, 0x01, 0xfe, 0xf7, 0xff, 0xff, 0xff, 0xbf, 0xdb, 0x00, + 0xfc, 0xb7, 0xff, 0xfe, 0x7f, 0xff, 0x0f, 0x00, 0xfc, 0xb7, 0xff, 0xff, + 0xf7, 0x7f, 0x01, 0x00, 0xfc, 0xdf, 0xff, 0xfe, 0xff, 0xfd, 0x03, 0x00, + 0xf8, 0xcb, 0xff, 0xff, 0xef, 0xf7, 0x0f, 0x00, 0xf0, 0xf1, 0x7b, 0xef, + 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfc, 0xef, 0xff, 0xff, 0xef, 0x7f, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0x01, 0xf0, 0x0f, 0xfc, 0xef, + 0xff, 0x3e, 0xe0, 0x03, 0xf8, 0x27, 0xfa, 0xf7, 0xfb, 0x4d, 0x48, 0x00, + 0x80, 0xc1, 0xf7, 0xff, 0xfe, 0xf7, 0x85, 0x00, 0x80, 0x6a, 0xc0, 0xff, + 0x7f, 0x00, 0xaf, 0x01, 0x40, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x38, 0x02, + 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x60, 0x02, 0xc0, 0x03, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/words.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define Words_width 64 +#define Words_height 54 +static char Words_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x24, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x92, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x24, + 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x92, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x24, 0x48, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x04, + 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x92, 0x24, 0x01, 0x00, 0x00, + 0x00, 0x80, 0x24, 0x49, 0x12, 0x02, 0x00, 0x00, 0x00, 0x40, 0x12, 0x20, + 0x49, 0x04, 0x00, 0x00, 0x00, 0x20, 0x49, 0x92, 0x24, 0x09, 0x00, 0x00, + 0x00, 0x10, 0x20, 0x01, 0x82, 0x10, 0x00, 0x00, 0x00, 0x48, 0x92, 0x24, + 0x49, 0x22, 0x00, 0x00, 0x00, 0x24, 0x09, 0x92, 0x24, 0x41, 0x00, 0x00, + 0x00, 0x12, 0x20, 0x49, 0x92, 0x84, 0x00, 0x00, 0x00, 0x41, 0x92, 0x24, + 0x08, 0x02, 0x01, 0x00, 0x80, 0x24, 0x09, 0x82, 0x20, 0x01, 0x02, 0x00, + 0x40, 0x12, 0x20, 0x48, 0x12, 0x00, 0x04, 0x00, 0x20, 0x49, 0x92, 0x04, + 0x49, 0x00, 0x08, 0x00, 0x40, 0x24, 0x49, 0x92, 0x24, 0x00, 0x10, 0x00, + 0x80, 0x90, 0x04, 0x09, 0x12, 0x00, 0x20, 0x00, 0x00, 0x49, 0x10, 0x20, + 0x09, 0x00, 0x40, 0x00, 0x00, 0x22, 0x49, 0x92, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x84, 0x24, 0x09, 0x02, 0x00, 0x40, 0x00, 0x00, 0x48, 0x92, 0x24, + 0x01, 0x00, 0x20, 0x00, 0x00, 0x10, 0x49, 0x12, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x20, 0x24, 0x49, 0xf0, 0x03, 0x08, 0x00, 0x00, 0x40, 0x92, 0x20, + 0x08, 0x04, 0x04, 0x00, 0x00, 0x80, 0x48, 0x12, 0x04, 0x08, 0x02, 0x00, + 0x00, 0x00, 0x21, 0x01, 0x32, 0x10, 0x01, 0x00, 0x00, 0x00, 0x92, 0x04, + 0x4e, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x44, 0xf2, 0xfb, 0xc7, 0x03, 0x00, + 0x00, 0x00, 0x08, 0x09, 0x31, 0x80, 0x03, 0x00, 0x00, 0x00, 0x90, 0x04, + 0x02, 0x80, 0x03, 0x00, 0x00, 0x00, 0x20, 0x02, 0x04, 0x80, 0x03, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x18, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x00, + 0xe0, 0x9f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xe1, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x80, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/world-inv.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define face_width 64 +#define face_height 64 +static char face_bits[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x45, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xbe, + 0x57, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xd3, 0xfa, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0x77, 0xbe, 0xee, 0xeb, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfd, + 0xb1, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xed, 0xef, 0xcb, 0xab, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6e, 0xdd, 0xff, 0xff, 0xff, 0x7f, 0xdb, 0x7f, + 0xab, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfe, 0xff, + 0xff, 0xbf, 0xfe, 0x6e, 0xf5, 0xbb, 0xfd, 0xff, 0xff, 0xff, 0xdb, 0xff, + 0xff, 0x57, 0xfd, 0xff, 0xff, 0xef, 0xfe, 0x5f, 0xfd, 0xaf, 0xfa, 0xff, + 0xff, 0xbf, 0x7f, 0xfb, 0xba, 0xaf, 0xf6, 0xff, 0xff, 0xf7, 0xdb, 0x7f, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xd5, 0xfe, 0xef, 0xed, 0xff, + 0xff, 0xf7, 0x5b, 0xfd, 0xb7, 0x7f, 0xfd, 0xff, 0xff, 0xff, 0x5f, 0xea, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xbd, 0xb9, 0xbe, 0xde, 0xff, 0xfd, 0xff, + 0xff, 0xfb, 0xab, 0x76, 0xfb, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0x7f, 0xff, + 0xa4, 0xff, 0xfb, 0xff, 0xff, 0xdb, 0x5b, 0xdd, 0xd5, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xfe, 0xbb, 0xa5, 0xef, 0xf6, 0xff, 0xff, 0xfb, 0x6f, 0xad, + 0x52, 0xdd, 0xbf, 0xff, 0xff, 0xf5, 0xdf, 0x55, 0x49, 0xfe, 0xff, 0xff, + 0xff, 0xbb, 0xef, 0x5e, 0x92, 0xae, 0xff, 0xff, 0xff, 0xf5, 0xfe, 0xad, + 0x22, 0xdb, 0xdf, 0xff, 0xff, 0xa5, 0xbb, 0x5f, 0x55, 0x74, 0xff, 0xff, + 0xff, 0xdb, 0xde, 0x3e, 0x89, 0xba, 0xd7, 0xff, 0xff, 0x55, 0xb5, 0x9f, + 0x64, 0xfc, 0xfd, 0xff, 0xff, 0xa3, 0xdf, 0x56, 0x4a, 0xb9, 0xef, 0xff, + 0xff, 0x27, 0xbf, 0x2f, 0xa9, 0xea, 0xfe, 0xff, 0xff, 0x47, 0xdf, 0x5f, + 0xa2, 0xac, 0xdb, 0xff, 0xff, 0x2f, 0x6d, 0x15, 0x50, 0x75, 0xfb, 0xff, + 0xff, 0x57, 0xba, 0x02, 0x2a, 0xa9, 0xee, 0xff, 0xff, 0xaf, 0xd6, 0x48, + 0x84, 0xaa, 0xfa, 0xff, 0xff, 0xbf, 0x2a, 0x02, 0x30, 0x55, 0xfa, 0xff, + 0xff, 0xbf, 0x8a, 0x00, 0x4a, 0x2b, 0xfd, 0xff, 0xff, 0xbf, 0x55, 0x11, + 0x51, 0x55, 0xff, 0xff, 0xff, 0x7f, 0xad, 0x04, 0x54, 0xd5, 0xfe, 0xff, + 0xff, 0xff, 0x95, 0x90, 0x28, 0xa9, 0xff, 0xff, 0xff, 0xff, 0x77, 0x05, + 0xaa, 0xea, 0xff, 0xff, 0xff, 0xff, 0xad, 0x50, 0x24, 0xb5, 0xff, 0xff, + 0xff, 0xff, 0x17, 0x05, 0x51, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x51, + 0x4a, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, 0xa4, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x25, 0xa8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/world.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,46 @@ +#define world.xbm_width 64 +#define world.xbm_height 64 +static char world.xbm_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, + 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x01, 0x70, 0x00, 0x00, 0x00, 0x80, 0x03, 0x40, 0x01, 0x80, 0x03, 0x00, + 0x00, 0x60, 0x00, 0xba, 0x5f, 0x00, 0x0c, 0x00, 0x00, 0x1c, 0x80, 0x41, + 0xa8, 0x02, 0x70, 0x00, 0x80, 0x03, 0x40, 0x2c, 0x05, 0x05, 0x80, 0x03, + 0x70, 0x00, 0x88, 0x41, 0x11, 0x14, 0x00, 0x04, 0x08, 0x00, 0x60, 0x02, + 0x4e, 0x09, 0x00, 0x0e, 0x1c, 0x00, 0x12, 0x10, 0x34, 0x54, 0x00, 0x1f, + 0x3e, 0x00, 0x00, 0x00, 0x91, 0x22, 0x00, 0x1f, 0x3e, 0x80, 0x24, 0x80, + 0x54, 0x88, 0x00, 0x1f, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x81, 0x0f, + 0xfc, 0x41, 0x01, 0x91, 0x0a, 0x44, 0x72, 0x04, 0x08, 0x1e, 0x24, 0x00, + 0x00, 0xa8, 0x0e, 0x04, 0x08, 0x10, 0x01, 0xa0, 0x02, 0x50, 0x05, 0x04, + 0x08, 0x40, 0x80, 0x04, 0x45, 0x50, 0x09, 0x04, 0x08, 0x08, 0x24, 0x80, + 0x00, 0x40, 0x00, 0x04, 0x08, 0x00, 0x41, 0x2a, 0x01, 0x10, 0x12, 0x04, + 0x08, 0x08, 0xa4, 0x02, 0x48, 0x80, 0x02, 0x04, 0x08, 0x00, 0xa0, 0x15, + 0x00, 0x00, 0x01, 0x04, 0x08, 0x42, 0x46, 0x41, 0x21, 0x00, 0x02, 0x04, + 0x08, 0x04, 0x54, 0x89, 0x04, 0x00, 0x20, 0x04, 0x08, 0x02, 0x80, 0x00, + 0x5b, 0x00, 0x04, 0x04, 0x08, 0x24, 0xa4, 0x22, 0x2a, 0x00, 0x00, 0x04, + 0x08, 0x02, 0x01, 0x44, 0x5a, 0x10, 0x09, 0x04, 0x08, 0x04, 0x90, 0x52, + 0xad, 0x22, 0x40, 0x04, 0x08, 0x0a, 0x20, 0xaa, 0xb6, 0x01, 0x00, 0x04, + 0x08, 0x44, 0x10, 0xa1, 0x6d, 0x51, 0x00, 0x04, 0x08, 0x0a, 0x01, 0x52, + 0xdd, 0x24, 0x20, 0x04, 0x08, 0x5a, 0x44, 0xa0, 0xaa, 0x8b, 0x00, 0x04, + 0x08, 0x24, 0x21, 0xc1, 0x76, 0x45, 0x28, 0x04, 0x08, 0xaa, 0x4a, 0x60, + 0x9b, 0x03, 0x02, 0x04, 0x08, 0x5c, 0x20, 0xa9, 0xb5, 0x46, 0x10, 0x04, + 0x08, 0xd8, 0x40, 0xd0, 0x56, 0x15, 0x01, 0x04, 0x08, 0xb8, 0x20, 0xa0, + 0x5d, 0x53, 0x24, 0x04, 0x08, 0xd0, 0x92, 0xea, 0xaf, 0x8a, 0x04, 0x04, + 0x08, 0xa8, 0x45, 0xfd, 0xd5, 0x56, 0x11, 0x04, 0x08, 0x50, 0x29, 0xb7, + 0x7b, 0x55, 0x05, 0x04, 0x08, 0x40, 0xd5, 0xfd, 0xcf, 0xaa, 0x05, 0x04, + 0x08, 0x40, 0x75, 0xff, 0xb5, 0xd4, 0x02, 0x04, 0x08, 0x40, 0xaa, 0xee, + 0xae, 0xaa, 0x01, 0x04, 0x08, 0xa0, 0x52, 0xfb, 0xab, 0x2a, 0x07, 0x04, + 0x08, 0x18, 0x6a, 0x6f, 0xd7, 0x56, 0x08, 0x04, 0x1c, 0x06, 0x88, 0xfa, + 0x55, 0x15, 0x10, 0x0e, 0xbe, 0x01, 0x52, 0xaf, 0xdb, 0x4a, 0x60, 0x1f, + 0x7e, 0x00, 0xe8, 0xfa, 0xae, 0x02, 0x80, 0x1f, 0x3e, 0x00, 0xa0, 0xae, + 0xb5, 0x0a, 0x00, 0x1f, 0x1c, 0x00, 0x00, 0x75, 0x5b, 0x01, 0x00, 0x0e, + 0x38, 0x00, 0x00, 0xda, 0x57, 0x00, 0x00, 0x07, 0xc0, 0x03, 0x00, 0x80, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0xc0, 0x07, 0x80, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xc0, + 0x01, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe7, 0xf3, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/xmosaic.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,39 @@ +#define xmosaic_width 64 +#define xmosaic_height 54 +static char xmosaic_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, + 0x00, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x30, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x18, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0x03, 0x00, 0x0c, 0x3e, 0x00, 0x00, 0x00, 0xc0, 0x01, + 0x00, 0x84, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x03, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x00, 0xe2, 0xc0, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0x00, 0x61, 0xf0, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x31, 0xfc, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0x18, 0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0xe0, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x84, 0x01, 0xf8, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0xc2, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0xfe, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x20, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x10, 0x80, 0xff, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x10, 0x80, 0xff, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xff, 0xff, 0x03, 0x10, 0x00, 0x00, 0x00, 0x80, 0xff, + 0xff, 0x03, 0x10, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x08, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0xff, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x86, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x0f, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x21, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0xf0, 0x30, 0x00, 0x00, 0xfc, 0xff, 0xff, + 0xff, 0x7f, 0x18, 0x01, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x1f, 0x0c, 0x01, + 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x8e, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x80, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x43, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0xf8, 0x60, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0x30, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x18, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 0x0e, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/frame-icon/ying-yang-48.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,27 @@ +#define yinyang_width 48 +#define yinyang_height 48 +static char yinyang_bits[] = { + 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x01, 0x00, + 0x00, 0xc0, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x30, 0x00, 0xc0, 0x1f, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x06, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x01, 0x00, 0x00, 0xfe, 0x01, 0x80, 0x00, 0x00, 0x00, 0xfc, 0x03, + 0x40, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x40, 0x00, 0x00, 0x00, 0xf8, 0x07, + 0x20, 0x00, 0x80, 0x03, 0xf8, 0x0f, 0x10, 0x00, 0xc0, 0x07, 0xf8, 0x1f, + 0x10, 0x00, 0xc0, 0x07, 0xf8, 0x1f, 0x08, 0x00, 0xc0, 0x07, 0xf8, 0x3f, + 0x08, 0x00, 0x80, 0x03, 0xf8, 0x3f, 0x04, 0x00, 0x00, 0x00, 0xf8, 0x7f, + 0x04, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0x04, 0x00, 0x00, 0x00, 0xfc, 0x7f, + 0x04, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0xc0, 0xff, 0xff, + 0x02, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x02, 0x00, 0xe0, 0xff, 0xff, 0xff, + 0x02, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0xff, 0xff, + 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0x02, 0x80, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x80, 0xff, 0xff, 0xff, 0x7f, 0x04, 0xc0, 0xff, 0xff, 0xff, 0x7f, + 0x04, 0xc0, 0xff, 0xff, 0xff, 0x7f, 0x04, 0xe0, 0xff, 0xff, 0xff, 0x7f, + 0x08, 0xe0, 0x7f, 0xfc, 0xff, 0x3f, 0x08, 0xe0, 0x3f, 0xf8, 0xff, 0x3f, + 0x10, 0xe0, 0x3f, 0xf8, 0xff, 0x1f, 0x10, 0xe0, 0x3f, 0xf8, 0xff, 0x1f, + 0x20, 0xe0, 0x7f, 0xfc, 0xff, 0x0f, 0x40, 0xe0, 0xff, 0xff, 0xff, 0x07, + 0x40, 0xc0, 0xff, 0xff, 0xff, 0x07, 0x80, 0xc0, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x81, 0xff, 0xff, 0xff, 0x01, 0x00, 0x86, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x08, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x30, 0xfe, 0xff, 0x1f, 0x00, + 0x00, 0xc0, 0xf8, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xef, 0xff, 0x01, 0x00, + 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- a/etc/hypb-mouse.txt Mon Aug 13 09:13:58 2007 +0200 +++ b/etc/hypb-mouse.txt Mon Aug 13 09:15:11 2007 +0200 @@ -37,12 +37,13 @@ Otherwise Action Key Hook Assist Key Hook Special Modes - C/C++ Mode Jumps to id/include def Jumps to next def + C,C++,Objective-C,Java Modes Jumps to id/include def Jumps to next def + Java Cross-Reference Tag Jumps to identifier def Jumps to next def Assembly Language Mode Jumps to id/include def Jumps to next def - Any Lisp mode Jumps to id def Jumps to next def + Any Lisp or Fortran Mode Jumps to id def Jumps to next def Emacs Lisp Compiler Error Jumps to def with error <- same - Grep or Occur match Jumps to match source line <- same - Multi-buffer occur match Jumps to match source line <- same + Grep or Occur Match Jumps to match source line <- same + Multi-buffer Occur Match Jumps to match source line <- same Outline Major/Minor Modes Collapses, expands, and moves outline entries Man Apropos Displays man page entry <- same Man Pages Follows cross refs, file refs and C code refs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/ida-logo.xpm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,198 @@ +/* XPM */ +static char * ida_name [] = { +"368 98 95 2", +/* pixels*/ +"a0 c #131313131313", +"a1 c #3d3d3d3d3d3d", +"a2 c #3e3e3e3e3e3e", +"a3 c #3c3c3c3c3c3c", +"a4 c #0e0e0e0e0e0e", +"a5 c #f0f0f0f0f0f0", +"a6 c #cfcfcfcfcfcf", +"a7 c #d2d2d2d2d2d2", +"a8 c #d5d5d5d5d5d5", +"a9 c #d3d3d3d3d3d3", +"b0 c #d6d6d6d6d6d6", +"b1 c #c7c7c7c7c7c7", +"b2 c #090909090909", +"b3 c #f1f1f1f1f1f1", +"b4 c #1a1a1a1a1a1a", +"b5 c #1c1c1c1c1c1c", +"b6 c #212121212121", +"b7 c #f4f4f4f4f4f4", +"b8 c #202020202020", +"b9 c #797979797979", +"c0 c #696969696969", +"c1 c #6b6b6b6b6b6b", +"c2 c #6f6f6f6f6f6f", +"c3 c #646464646464", +"c4 c #686868686868", +"c5 c #707070707070", +"c6 c #6e6e6e6e6e6e", +"c7 c #747474747474", +"c8 c #737373737373", +"c9 c #767676767676", +"d0 c #6c6c6c6c6c6c", +"d1 c #676767676767", +"d2 c #828282828282", +"d3 c #7b7b7b7b7b7b", +"d4 c #666666666666", +"d5 c #636363636363", +"d6 c #757575757575", +"d7 c #727272727272", +"d8 c #5f5f5f5f5f5f", +"d9 c #787878787878", +"e0 c #5c5c5c5c5c5c", +"e1 c #595959595959", +"e2 c #7d7d7d7d7d7d", +"e3 c #717171717171", +"e4 c #7a7a7a7a7a7a", +"e5 c #6a6a6a6a6a6a", +"e6 c #6d6d6d6d6d6d", +"e7 c #777777777777", +"e8 c #1f1f1f1f1f1f", +"e9 c #232323232323", +"f0 c #222222222222", +"f1 c #555555555555", +"f2 c #7c7c7c7c7c7c", +"f3 c #808080808080", +"f4 c #888888888888", +"f5 c #606060606060", +"f6 c #656565656565", +"f7 c #242424242424", +"f8 c #1e1e1e1e1e1e", +"f9 c #8e8e8e8e8e8e", +"g0 c #1d1d1d1d1d1d", +"g1 c #252525252525", +"g2 c #616161616161", +"g3 c #626262626262", +"g4 c #282828282828", +"g5 c #424242424242", +"g6 c #7e7e7e7e7e7e", +"g7 c #4f4f4f4f4f4f", +"g8 c #838383838383", +"g9 c #a5a5a5a5a5a5", +"h0 c #dfdfdfdfdfdf", +"h1 c #ffffffffffff", +"h2 c #b2b2b2b2b2b2", +"h3 c #f8f8f8f8f8f8", +"h4 c #fcfcfcfcfcfc", +"h5 c #ebebebebebeb", +"h6 c #969696969696", +"h7 c #c5c5c5c5c5c5", +"h8 c #b1b1b1b1b1b1", +"h9 c #2f2f2f2f2f2f", +"i0 c #e4e4e4e4e4e4", +"i1 c #363636363636", +"i2 c #000000000000", +"i3 c #4b4b4b4b4b4b", +"i4 c #060606060606", +"i5 c #2a2a2a2a2a2a", +"i6 c #474747474747", +"i7 c #323232323232", +"i8 c #525252525252", +"i9 c #3a3a3a3a3a3a", +"j0 c #2d2d2d2d2d2d", +"j1 c #343434343434", +"j2 c #1b1b1b1b1b1b", +"j3 c #181818181818", +"j4 c #171717171717", +"a0a1a1a2a2a2a2a2a2a2a1a2a2a2a2a2a2a2a2a2a1a2a2a2a1a2a2a2a2a2a1a1a1a2a2a2a1a2a2a2a2a2a2a2a2a2a2a2a1a2a2a1a2a2a2a2a1a1a2a2a2a2a2a2a2a2a2a1a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a1a1a2a2a2a2a2a2a2a2a2a2a2a1a1a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a1a2a2a2a1a2a2a2a2a2a1a1a1a2a2a2a1a2a2a2a2a2a2a2a2a2a2a2a1a2a2a1a2a2a2a2a1a1a2a2a2a2a2a2a2a2a2a1a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a1a1a2a2a2a2a2a2a2a2a2a2a2a1a1a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a1a2a2a1a1a2a2a2a2a2a1a1a1a2a2a2a1a2a2a2a2a2a2a2a2a2a2a2a1a2a2a1a2a2a2a2a1a1a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a1a1a2a2a2a2a2a2a2a2a2a2a2a2a1a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a1a2a2a1a1a2a2a2a2a2a1a1a1a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a1a2a2a2a2a1a3a2a2a2a2a2a2a2a2a2a1a2a2a2a2a2a2a2a2a2a2a2a4", +"a2a5a6a6a7a6a8a7a7a7a7a7a8a6a7a7a9a9a7a9a7a8a8a7a7b0b0b0a9a6a6a6a8a9a7a7a7a9a7a7a9a8a6a8a8a6a9a8a6a6b0a6a7a8a7a9a7a6a9a8b0a8a9a7a8a9a7a7a7a7a8a8a8a7b0b0a8a8b0a8a8a9a8b0a6a6b0a7a7b0a8b0a8a9a8a9a9a6a6a6a7a6a8a7a7a7a7a7a8a6a7a7a9a9a7a9a7a8a8a7a7b0b0b0a9a6a6a6a8a9a7a7a7a9a7a7a9a8a6a8a8a6a9a8a6a6b0a6a7a8a7a9a7a6a9a8b0a8a9a7a8a9a7a7a7a7a8a8a8a7b0b0a8b0b0a8a8a9a8b0a6a6b0a7a7b0a8b0a8a9a8a9a9a6a6a6a7a6a8a7a7a7a7a7a8a6a7a7a9a9a7a9a7a8a8a7a7b0b0b0a7a6a6a6a8a9a7a7a7a9a7a7a9a8a6a8a8a6a8a8a6a6b0a6a7a8a7a9a7a6a9a8b0a8a9a7a8a9a7a7a7a7a8a8a8a7b0b0a8b0b0a8a8a9a8b0a6a6b0a7a7b0a8b0a8a8a9a9a9a6a6a6a7a6a8a7a7a7a7a7a8a6a7a7a9a9a7a9a7a8a8a7a7b0b0b0a9a6a6a6a8a9a7a7a7a9a7a7a8a9a6a8a8a6a8a8a6a6b0a6a7a8a7a9a7a6a9a8b0a8a8a7a8a9a7a7a7a7a8a8a8a7b0b0a8a9b1b2", +"a1a6b3a8a7a7a7a6a6b0a7a6a7a7a7a7a7a8a7a8a9a8b0a7a9b0b0b0a7a6a8a7b0b0b0a8a7a6a6a9a8b0a8a7b0a6a6a6a7a7a6a7a7a6a8a7a6a7a8a8b0b0a8a9a7a7a9a7a7a7a9a8a8a7a8b0b0a8a8b0a8b0b0a7a6a6b0b0a8b0b0b0a8a9a8a8a6a6a9a8a7a7a7a6a6b0a7a6a7a7a7a7a7a8a7a8a9a8b0a7a9b0b0b0a7a6a8a7b0b0b0a8a7a6a6a9a8b0a8a7b0a6a6a6a7a7a6a7a7a6a8a7a6a7a8a8b0b0a8a9a7a7a9a7a7a7a9a8a8a7a8b0b0a8a8b0a8b0b0a7a6a6b0b0a8b0b0b0a8a9a8a8a6a6a9a8a7a7a7a6a6b0a7a6a7a7a7a7a7a8a7a8a9a8b0a7a9b0b0b0a7a6a8a7b0b0b0a8a7a6a6a9a8b0a8a7b0a6a6a6a7a7a6a7a7a6a8a7a6a7a8a8b0b0a8a9a7a7a8a7a7a7a9a8a8a7a8b0b0a8a8b0a8b0b0a7a6a6b0b0a8b0b0b0a8a9a8a8a6a6a9a8a7a7a7a6a6b0a7a6a7a7a7a7a7a8a7a8a9a8b0a7a9b0b0b0a7a6a8a7b0b0b0a8a7a6a6a9a8b0a9a7b0a6a6a6a7a7a6a7a7a6a8a7a6a7a8a8b0b0a8a8a7a7a9a7a7a7a9a8a8a7a8b0b0b1b4b2", +"a1a6b0b3a8a9a7a6a6b0a9a6a7a7a7a7a7a8a7a8a9b0b0a9a7b0b0b0a6a6b0a8a9b0b0a8a8a9a7a8b0b0a9a6b1a6a7a7a7a9a6a7a8a7a8a7b1a8a8b0a8a8a8a7a8a7a7a7a8a8b0a8a8a9a8a8b0a7a8a9a9b0b0a7a6a7a8b0b0b0b0a8a8a9a8a8a6a6b0a8a8a9a7a6a6b0a9a6a7a7a7a7a7a8a7a8a9b0b0a9a7b0b0b0a6a6b0a8a9b0b0a8a8a9a7a8b0b0a9a6b1a6a7a7a7a9a6a7a8a7a8a7b1a8a8b0a8a8a8a7a8a7a7a7a8a8b0a8a8a8a8a8b0a7a8a9a9b0b0a7a6a7a8b0b0b0b0a8a8a9a8a8a6a6b0a8a8a9a7a6a6b0a9a6a7a7a7a7a7a8a7a8a9b0b0a9a7b0b0b0a7a6b0a8a9b0b0a8a8a9a7a8b0b0a8a6b1b1a7a7a7a9a6a7a8a7a8a7b1a8a8b0a8a8a8a7a8a7a7a7a8a8b0a8a8a9a8a8b0a7a8a9a9b0b0a7a6a7a8b0b0b0b0a8a8a9a8a8a6a6b0a8a8a9a7a6a6b0a9a6a7a7a7a7a7a8a7a8a9b0b0a9a7b0b0b0a6a6b0a8a9b0b0a8a8a9a7a8b0b0a8a6b1b1a7a7a7a9a6a7a8a7a8a7b1a8a8b0a8a8a9a7a7a7a7a7a8a8b0a8a8a8a9a7b1b5b6b2", +"a2a7a8a7b3b3b3b3a5a5b3b3b3b3b3b3b3b3b3b3b3b7b3b3b3b3b7b7b3a5a5b3b3b3b3b3b3b3b3b3b7b3b3b3a5a5a5b3b3b3a5b3a5b3b3a5a5b3b3b7b3b3b3b3b3b3b3b7b3b3b3b3b3b3b3b7b3b3b3b3b3b3b3b3a5a5b3b3b3b7b7b3b3b3b3b7b3a5b3b3b3b3b3b3a5a5b3b3b3b3b3b3b3b3b3b3b3b7b3b3b3b3b7b7b3a5a5b3b3b3b3b3b3b3b3b3b7b3b3b3a5a5a5b3b3b3a5b3a5b3b3a5a5b3b3b7b3b3b3b3b3b3b3b7b3b3b3b3b3b3b3b7b3b3b3b3b3b3b3b3a5a5b3b3b3b7b7b3b3b3b3b7b3a5b3b3b3b3b3b3a5a5b3b3b3b3b3b3b3b3b3b3b3b7b3b3b3b3b7b7a5a5a5b3b3b3b3b3b3b3b3b3b7b7b3b3a5b3b3b3b3b3a5b3a5b3b3a5a5b3b3b7b3b3b3b3b3b3b3b7b3b3b3b3b3b3b3b7b3b3b3b3b3b3b3b3a5a5b3b3b3b7b7b3b3b3b3b7b3a5b3b3b3b3b3b3a5a5b3b3b3b3b3b3b3b3b3b3b3b7b3b3b3b3b7b7a5a5a5b3b3b3b3b3b3b3b3b3b7b7b3b3a5b3b3b3b3b3a5b3a5b3b3a5a5b3b7b3b7b3b3b3b3b7b3b7b3b3b3b3b3b3b3b1b4b5b8b2", +"a2a7b0a8b3b9c0c1c2c2c3c1c4c2c5c4b9c6c2c7c6c8c9d0d1d2d3d2d4d5c3c9d2d3c9c5d6b9d7c8c1c8c1d8c5c6c6c1d8d9c3c6c2c4e0e1c5c5c0e2b9c4b9c4d7e3b9c4c5b9c5c1c1c1d7e3e2e4d7e5e5d7e6e6d8c4e5c3e7c7e3c6c2e3d6c7e5c4e2d7e4b9c0c1c2c2c3c1c4c2c5c4b9c6c2c7c6c8c9d0d1d2d3d2d4d5c3c9d2d3c9c5d6b9d7c8c1c8c1d8c5c6c6c1d8d9c3c6c2c4e0e1c5c5c0e2b9c4b9c4d7e3b9c4c5b9c5c1c1c1d7e3e2e4d7e5e5d7e6e6d8c4e5c3e7c7e3c6c2e3d6c7e5c4e2d7e4b9c0c1c2c2c3c1c4c2c5c4b9c6c2c7c6c8c9d0d1d2d3d2d4d5c3c9d2d3c9c5d6b9d7c8c1c8c1d8c5c6c6c1d8d9c3c6c2c4e0e1c5c5c0e2b9c4b9c4d7e3b9c4c5b9c5c1c1c1d7e3e2e4d7e5e5d7e6e6d8c4e5c3e7c7e3c6c2e3d6c7e5c4e2d7e4b9c0c1c2c2c3c1c4c2c5c4b9c6c2c7c6c8c9d0d1d2d3d2d4d5c3c9d2d3c9c5d6b9d7c8c1c8c1d8c5c6c6c1d8d9c3c6c2c4e0e1c5c5c0e2b9c4b9c4d7c2b9c4c5b9c5c1c1c1d7e8e9f0b6b2", +"a2b0a8a8b7c5c8c1c6c1c1d5f1c1c0b9c0c7c6c7c2d6e7c4e6f2d3f3c7e3d5d6d2f4b9e6c9c9c8c1d2e4d7d5c2e6c1d8c5d8c7d7c8d8c4c2e4b9b9c5e4c5b9b9c1c1e2c5c5d7c1c1c1c4d7d7b9e6d4d5e3e5e3e5c0f5e5f6c8c7c6c2c2d7d3c7e2e4b9d7e4c5c8c1c6c1c1d5f1c1c0b9c0c7c6c7c2d6e7c4e6f2d3f3c7e3d5d6d2f4b9e6c9c9c8c1d2e4d7d5c2e6c1d8c5d8c7d7c8d8c4c2e4b9b9c5e4c5b9b9c1c1e2c5c5d7c1c1c1c4d7d7b9e6d4d5e3e5e3e5c0f5e5f6c8c7c6c2c2d7d3c7e2e4b9d7e4c5c8c1c6c1c1d5f1c1c0b9c0c7c6c7c2d6e7c4e6f2d3f3c7e3d5d6d2f4b9e6c9c9c8c1d2e4d7d5c2e6c1d8c5d8c7d7c8d8c4c2e4b9b9c5e4c5b9b9c1c1e2c5c5d7c1c1c1c4d7d7b9e6d4d5e3e5e3e5c0f5e5f6c8c7c6c2c2d7d3c7e2e4b9d7e4c5c8c1c6c1c1d5f1c1c0b9c0c7c6c7c2d6e7c4e6f2d3f3c7e3d5d6d2f4b9e6c9c9c8c1d2e4d7d5c2e6c1d8c5d8c7d7c8d8c4c2e4b9b9c5e4c5b9b9c1c1e2c5c5d7c1c1c1c4d7b6f7b8f8b2", +"a2b0b0a9b3c5c6c6c2d5c3c3d5c5c4c4e4c8b9c9d7c9d6d5e6c2d9d2c8e6d4c5f9d7c6c9e6f2c1b9d2d3e5c1c0c2d5c2e1e5c8c6e5c2d4b9c5c0d7b9c5e4c2c5c1d5b9c5c4c5c1d7e3c6c6b9d7c4f5f5c1d4c3d6d1e1d4d7b9b9d7c1c9d6c7c7e2b9e4c5c5c5c6c6c2d5c3c3d5c5c4c4e4c8b9c9d7c9d6d5e6c2d9d2c8e6d4c5f9d7c6c9e6f2c1b9d2d3e5c1c0c2d5c2e1e5c8c6e5c2d4b9c5c0d7b9c5e4c2c5c1d5b9c5c4c5c1d7e3c6c6b9d7c4f5f5c1d4c3d6d1e1d4d7b9b9d7c1c9d6c7c7e2b9e4c5c5c5c6c6c2d5c3c3d5c5c4c4e4c8b9c9d7c9d6d5e6c2d9d2c8e6d4c5f9d7c6c9e6f2c1b9d2d3e5c1d4c2d5c2e1e5c8c6e5c2d4b9c5c0d7b9c5e4c2c5c1d5b9c5c4c5c1d7e3c6c6b9d7c4f5f5c1d4c3d6d1e1d4d7b9b9d7c1c9d6c7c7e2b9e4c5c5c5c6c6c2d5c3c3d5c5c4c4e4c8b9c9d7c9d6d5e6c2d9d2c8e6d4c5f9d7c6c9e6f2c1b9d2d3e5c1d4c2d5c2e1e5c8c6e5c2d4b9c5c0d7b9c5e4c2c5c1d5b9c5c4c5c1d7e3c6c6f7b6g0b5b2", +"a2a8a8a7b3b9c8c1c1c3c1c3b9c5c5d5c5c8c5d6c8d6c9f5d0d1c5e7c1d4e6d2f4b9c2e3c8d9e6e4b9d9c2d5e0d8e0c5c4c5c1c8d8c2c5c5c4c5e4c5b9b9c1c1d5c1d7c5c5c5c5c5c6c1c4d7f2e6c3d7d1d5d1d1d5f5d5c8d9c8e5c5d7d7c5e6e2b9c5c4c5b9c8c1c1c3c1c3b9c5c5d5c5c8c5d6c8d6c9f5d0d1c5e7c1d4e6d2f4b9c2e3c8d9e6e4b9d9c2d5e0d8e0c5c4c5c1c8d8c2c5c5c4c5e4c5b9b9c1c1d5c1d7c5c5c5c5c5c6c1c4d7f2e6c3d7d1d5d1d1d5f5d5c8d9c8e5c5d7d7c5e6e2b9c5c4c5b9c8c1c1c3c1c3b9c5c5d5c5c8c5d6c8d6c9f5d0d1c5e7c1d4e6d2f4b9c2e3c8d9e6e4b9d9c2d5e0d8e0c5c4c5c1c8d8c2c5c5c4c5e4c5b9b9c1c1d5c1d7c5c5c5c5c5c6c1c4d7f2e6c3d7d1d5d1d1d5f5d5c8d9c8e5c5d7d7c5e6e2b9c5c4c5b9c8c1c1c3c1c3b9c5c5d5c5c8c5d6c8d6c9f5d0d1c5e7c1d4e6d2f4b9c2e3c8d9e6e4b9d9c2d5e0d8e0c5c4c5c1c8d8c2c5c5c4c5e4c5b9b9c1c1d5c1d7c5c5c5c5c5c6c1c4b6g1e8g0b2", +"a2a8a8b0b3c4c4e0c1d7b9b9c5c5c4c4c2c1d7d6c9e3c6c7c0e5c2d6e6d4e5d2d2c9d7e6d7b9c1b9d2c6d0d4d8c4d8c5e4c8c6e5c4d5c5c5c5c5b9d7c4c4c5c4c1c4c5d4b9d7c5c5c1e5c6d7c1e5c0d4c4d4c8c7e1d8d4d6c7d7e5c8c1d7c1e2b9c5b9e2c5c4c4e0c1d7b9b9c5c5c4c4c2c1d7d6c9e3c6c7c0e5c2d6e6d4e5d2d2c9d7e6d7b9c1b9d2c6d0d4d8c4d8c5e4c8c6e5c4d5c5c5c5c5b9d7c4c4c5c4c1c4c5d4b9d7c5c5c1e5c6d7c1e5c0d4c4d4c8c7e1d8d4d6c7d7e5c8c1d7c1e2b9c5b9e2c5c4c4e0c1d7b9b9c5c5c4c4c2c1d7d6c9e3c6c7c0e5c2d6e6d4e5d2d2c9d7e6d7b9c1b9d2c6d0d4d8c4d8c5e4c8c6e5c4d5c5c5c5c5b9d7c4c4c5c4c1c4c5d4b9d7c5c5c1e5c6d7c1e5c0d4c4d4c8c7e1d8d4d6c7d7e5c8c1d7c1e2b9c5b9e2c5c4c4e0c1d7b9b9c5c5c4c4c2c1d7d6c9e3c6c7c0e5c2d6e6d4e5d2d2c9d7e6d7b9c1b9d2c6d0d4d8c4d8c5e4c8c6e5c4d5c5c5c5c5b9d7c4c4c5c4c1c4c5d4b9d7c5c5c1e5c6b6e8e8e8b2", +"a2a8a8a7b3c2c4c4d7f2b9c4c5c1c4c4c5c4c5c9d7e3c2c5c3e5e6c6c0f5d4b9e4d7c2c5c1e2c2g2e2e5c1c1e0b9c4c5b9c8c6e1c2e0c2c4d7c5d7b9b9c4c1c1c5b9c5e4c5b9d7c5e5c1d1e4c1e5e4c3d4d7e3d7f6d5d7d6c8e6c5c8c1e6e4b9c5d7d7c4c8c2c4c4d7f2b9c4c5c1c4c4c5c4c5c9d7e3c2c5c3e5e6c6c0f5d4b9e4d7c2c5c1e2c2g2e2e5c1c1e0b9c4c5b9c8c6e1c2e0c2c4d7c5d7b9b9c4c1c1c5b9c5e4c5b9d7c5e5c1d1e4c1e5e4c3d4d7e3d7f6d5d7d6c8e6c5c8c1e6e4b9c5d7d7c4c8c2c4c4d7f2b9c4c5c1c4c4c5c4c5c9d7e3c2c5c3e5e6c6c0f5d4b9e4d7c2c5c1e2c2g2e2e5c1c1e0b9c4c5b9c8c6e1c2e0c2c4d7c5d7b9b9c4c1c1c5b9c5e4c5b9d7c5e5c1d1e4c1e5e4c3d4d7e3d7f6d5d7d6c8e6c5c8c1e6e4b9c5d7d7c4c8c2c4c4d7f2b9c4c5c1c4c4c5c4c5c9d7e3c2c5c3e5e6c6c0f5d4b9e4d7c2c5c1e2c2g2e2e5c1c1e0b9c4c5b9c8c6e1c2e0c2c4d7c5d7b9b9c4c1c1c5b9c5e4c5b9d7c5e5c1d1f0e8f8f0b2", +"a2a8a7a7b3c2d7b9d7d4c5c4c1c4c5c1c0c1c4c5c2c1e5c9c5e6c1c2e6g3f5e6c6e6c6c2d7e4c3c2e2d0c4d4e0c5c5c5c5c2d0c4c4e1c1c1c4d7b9d7c5c1d8c4c5c4b9c5d7c1d7c1e5c7e2b9e6c2f3c1d1c8c8c2c4g3d7c7c2d1d7e5e6b9d7c5c4c5c4c4c8c2d7b9d7d4c5c4c1c4c5c1c0c1c4c5c2c1e5c9c5e6c1c2e6g3f5e6c6e6c6c2d7e4c3c2e2d0c4d4e0c5c5c5c5c2d0c4c4e1c1c1c4d7b9d7c5c1d8c4c5c4b9c5d7c1d7c1e5c7e2b9e6c2f3c1d1c8c8c2c4g3d7c7c2d1d7e5e6b9d7c5c4c5c4c4c8c2d7b9d7d4c5c4c1c4c5c1c0c1c4c5c2c1e5c9c5e6c1c2e6g3f5e6c6e6c6c2d7e4c3c2e2d0c4d4e0c5c5c5c5c2d0c4c4e1c1c1c4d7b9d7c5c1d8c4c5c4b9c5d7c1d7c1e5c7e2b9e6c2f3c1d1c8c8c2c4g3d7c7c2d1d7e5e6b9d7c5c4c5c4c4c8c2d7b9d7d4c5c4c1c4c5c1c0c1c4c5c2c1e5c9c5e6c1c2e6g3f5e6c6e6c6c2d7e4c3c2e2d0c4d4e0c5c5c5c5c2d0c4c4e1c1c1c4d7b9d7c5c1d8c4c5c4b9c5d7c1d7c1e5c7e2f7e8b6g1b2", +"a2a7a9a7b3c6c2c2d5c5c5c5e2c2c5d7c5c1c2d7c6d7d7c8c9e6c1e3e6c3d5c1c6d0f6d5c8b9c4c5d7c1c1e0e1c5c5c5c4c2c8c2d5e0c1c1c4d7b9b9d5d5g3d7c1c4c5d7c5c4b9d7c5c5e2d3c0c2e5e6e5c7c9d7d1d5d7d0c6e6c9c1c1e2c5c5c5c4c5c6c2c6c2c2d5c5c5c5e2c2c5d7c5c1c2d7c6d7d7c8c9e6c1e3e6c3d5c1c6d0f6d5c8b9c4c5d7c1c1e0e1c5c5c5c4c2c8c2d5e0c1c1c4d7b9b9d5d5g3d7c1c4c5d7c5c4b9d7c5c5e2d3c0c2e5e6e5c7c9d7d1d5d7d0c6e6c9c1c1e2c5c5c5c4c5c6c2c6c2c2d5c5c5c5e2c2c5d7c5c1c2d7c6d7d7c8c9e6c1e3e6c3d5c1c6d0f6d5c8b9c4c5d7c1c1e0e1c5c5c5c4c2c8c2d5e0c1c1c4d7b9b9d5d5g3d7c1c4c5d7c5c4b9d7c5c5e2d3c0c2e5e6e5c7c9d7d1d5d7d0c6e6c9c1c1e2c5c5c5c4c5c6c2c6c2c2d5c5c5c5e2c2c5d7c5c1c2d7c6d7d7c8c9e6c1e3e6c3d5c1c6d0f6d5c8b9c4c5d7c1c1e0e1c5c5c5c4c2c8c2d5e0c1c1c4d7b9b9d5d5g3d7c1c4c5d7c5c4b9d7c5c5e2f7f8b6e8b2", +"a2a7a7a7b3c2c1d5c5c5c4d7c5c5c5b9c4c4c5d7c6c2e6c1c5e5d4d6e5e5c6d0c6d7g3f6e4e4c2d4c1c1d0f1e0c4c5c5c4c8c6g2e1c4c1d5c5c4e2c5c3c4d5c4c5c5d7b9c5d7c5d7c5e4d6d0c1c5c1c0c8c7e3c6f5g2e5e5e3e3c5c4c1b9c4c1c1c4c1c4c1c2c1d5c5c5c4d7c5c5c5b9c4c4c5d7c6c2e6c1c5e5d4d6e5e5c6d0c6d7g3f6e4e4c2d4c1c1d0f1e0c4c5c5c4c8c6g2e1c4c1d5c5c4e2c5c3c4d5c4c5c5d7b9c5d7c5d7c5e4d6d0c1c5c1c0c8c7e3c6f5g2e5e5e3e3c5c4c1b9c4c1c1c4c1c4c1c2c1d5c5c5c4d7c5c5c5b9c4c4c5d7c6c2e6c1c5e5d4d6e5e5c6d0c6d7g3f6e4e4c2d4c1c1d0f1e0c4c5c5c4c8c6g2e1c4c1d5c5c4e2c5c3c4d5c4c5c5d7b9c5d7c5d7c5e4d6d0c1c5c1c0c8c7e3c6f5g2e5e5e3e3c5c4c1b9c4c1c1c4c1c4c1c2c1d5c5c5c4d7c5c5c5b9c4c4c5d7c6c2e6c1c5e5d4d6e5e5c6d0c6d7g3f6e4e4c2d4c1c1d0f1e0c4c5c5c4c8c6g2e1c4c1d5c5c4e2c5c3c4d5c4c5c5d7b9c5d7c5d7c5e4d6e8e8b6e8b2", +"a2a6a7a8b3c6c5c4c1c5d7e2d7c4c5c5c4c5c6c2d7c2e6d7c6d1c1c0c1d1d4c3d8c3c1e5d2e4e2f9c4c8c6c5c1d5c5c4c4c8d7g2c2c1d5c1d7c5e4c5c5d5c1d7c5c5c5c1c1d7c5c5b9c7e2c4c4d3e7c7c7c2c6d0d4f5g2b9e3c2d2c4d1d7c5c4e0e0c1c2c6c2c5c4c1c5d7e2d7c4c5c5c4c5c6c2d7c2e6d7c6d1c1c0c1d1d4c3d8c3c1e5d2e4e2f9c4c8c6c5c1d5c5c4c4c8d7g2c2c1d5c1d7c5e4c5c5d5c1d7c5c5c5c1c1d7c5c5b9c7e2c4c4d3e7c7c7c2c6d0d4f5g2b9e3c2d2c4d1d7c5c4e0e0c1c2c6c2c5c4c1c5d7e2d7c4c5c5c4c5c6c2d7c2e6d7c6d1c1c0c1d1d4c3d8c3c1e5d2e4e2f9c4c8c6c5c1d5c5c4c4c8d7g2c2c1d5c1d7c5e4c5c5d5c1d7c5c5c5c1c1d7c5c5b9c7e2c4c4d3e7c7c7c2c6d0d4f5g2b9e3c2d2c4d1d7c5c4e0e0c1c2c6c2c5c4c1c5d7e2d7c4c5c5c4c5c6c2d7c2e6d7c6d1c1c0c1d1d4c3d8c3c1e5d2e4e2f9c4c8c6c5c1d5c5c4c4c8d7g2c2c1d5c1d7c5e4c5c5d5c1d7c5c5c5c1c1d7c5c5b9c7e2f8f8f7f0b2", +"a2a6a6a7b3c2b9d5c4e4e4c5e4c5b9c4b9c4c1c9d0c1d1e6d7d7d5c5e5f6e0d8d8c1e6d2e4e2f2d7c5c5c5c4c1d5c1c4c2c8e5c1c4d5d5c4e4b9c5d7c4c1c1c0c5c5d7c1c4c5c5d7c7e7d9c4c3d2f4d3d9b9c7c5f6f5e4d2c5c4f4e6d1d7c5c4e0g2c3c1c6c2b9d5c4e4e4c5e4c5b9c4b9c4c1c9d0c1d1e6d7d7d5c5e5f6e0d8d8c1e6d2e4e2f2d7c5c5c5c4c1d5c1c4c2c8e5c1c4d5d5c4e4b9c5d7c4c1c1c0c5c5d7c1c4c5c5d7c7e7d9c4c3d2f4d3d9b9c7c5f6f5e4d2c5c4f4e6d1d7c5c4e0g2c3c1c6c2b9d5c4e4e4c5e4c5b9c4b9c4c1c9d0c1d1e6d7d7d5c5e5f6e0d8d8c1e6d2e4e2f2d7c5c5c5c4c1d5c1c4c2c8e5c1c4d5d5c4e4b9c5d7c4c1c1c0c5c5d7c1c4c5c5d7c7e7d9c4c3d2f4d3d9b9c7c5f6f5e4d2c5c4f4e6d1d7c5c4e0g2c3c1c6c2b9d5c4e4e4c5e4c5b9c4b9c4c1c9d0c1d1e6d7d7d5c5e5f6e0d8d8c1e6d2e4e2f2d7c5c5c5c4c1d5c1c4c2c8e5c1c4d5d5c4e4b9c5d7c4c1c1c0c5c5d7c1c4c5c5d7c7e7b9g0g0g1g4b2", +"a2a7a7a7b3d0c4c5b9c1c4c1b9c1b9c3c2e3c2c8c0e5g2d0c2c6g2c5e5c3d8c4d0d6c0d3d2c2e4b9g5e5c5c4c4c5c1e5c5c2e5c5c4c4c1b9c4e4c5c5c4c4c4c1d7c5c5c4c5c5c5d7c5d7d7d1d4d2d2d3b9c7c7c8c2c1f2f3b9d5b9c1e3c8c7c5e5d1d1c1c2c1c4c5b9c1c4c1b9c1b9c3c2e3c2c8c0e5g2d0c2c6g2c5e5c3d8c4d0d6c0d3d2c2e4b9g5e5c5c4c4c5c1e5c5c2e5c5c4c4c1b9c4e4c5c5c4c4c4c1d7c5c5c4c5c5c5d7c5d7d7d1d4d2d2d3b9c7c7c8c2c1f2f3b9d5b9c1e3c8c7c5e5d1d1c1c2c1c4c5b9c1c4c1b9c1b9c3c2e3c2c8c0e5g2d0c2c6g2c5e5c3d8c4d0d6c0d3d2c2e4b9g5e5c5c4c4c5c1e5c5c2e5c5c4c4c1b9c4e4c5c5c4c4c4c1d7c5c5c4c5c5c5d7c5d7d7d1d4d2d2d3b9c7c7c8c2c1f2f3b9d5b9c1e3c8c7c5e5d1d1c1c2c1c4c5b9c1c4c1b9c1b9c3c2e3c2c8c0e5g2d0c2c6g2c5e5c3d8c4d0d6c0d3d2c2e4b9g5e5c5c4c4c5c1e5c5c2e5c5c4c4c1b9c4e4c5c5c4c4c4c1d7c5c5c4c5c5c5d7c5d7d7f8g0g1g4b2", +"a2a6a7a7b3c2d5c3c1c5c5c1c5c1c4d7e3e3c6c3c1c0c4d1c6c6d4e5c0d4c1c6c5c9b9g6d3e2b9b9b9c5c5c1c4c3c5e5c3d1e5c4c1e0c2b9c0b9c5b9d5d5d4c1c1d7b9c4d7c5d7b9c5d7c8d5c0d6b9d3b9c7c5c8c6d7e4c5c5b9d6d7c2e6c1e5g2c4d1c1c4c2d5c3c1c5c5c1c5c1c4d7e3e3c6c3c1c0c4d1c6c6d4e5c0d4c1c6c5c9b9g6d3e2b9b9b9c5c5c1c4c3c5e5c3d1e5c4c1e0c2b9c0b9c5b9d5d5d4c1c1d7b9c4d7c5d7b9c5d7c8d5c0d6b9d3b9c7c5c8c6d7e4c5c5b9d6d7c2e6c1e5g2c4d1c1c4c2d5c3c1c5c5c1c5c1c4d7e3e3c6c3c1c0c4d1c6c6d4e5c0d4c1c6c5c9b9g6d3e2b9b9b9c5c5c1c4c3c5e5c3d1e5c4c1e0c2b9c0b9c5b9d5d5d4c1c1d7b9c4d7c5d7b9c5d7c8d5c0d6b9d3b9c7c5c8c6d7e4c5c5b9d6d7c2e6c1e5g2c4d1c1c4c2d5c3c1c5c5c1c5c1c4d7e3e3c6c3c1c0c4d1c6c6d4e5c0d4c1c6c5c9b9g6d3e2b9b9b9c5c5c1c4c3c5e5c3d1e5c4c1e0c2b9c0b9c5b9d5d5d4c1c1d7b9c4d7c5d7b9c5d7c8b5g0f0e9b2", +"a2a6a8a7b3b9c1c2c2e4c5c1c0d5c6c9d6c6c6c0c1c4g2d1c6d1c4c0d4c4e6e6e3c2c9c8g6e4c5b9b9d7c5c2c5c2c3d8e1d4c8e0d8d5b9c5d7b9c5d7c5c1c4c1c4e2c5c5d7c5d7d7d7c8b9f6c3d9b9e7c8b9c7c5c5c6b9e4c5b9d3d7c2c0c3d5g2c4c2c4c5b9c1c2c2e4c5c1c0d5c6c9d6c6c6c0c1c4g2d1c6d1c4c0d4c4e6e6e3c2c9c8g6e4c5b9b9d7c5c2c5c2c3d8e1d4c8e0d8d5b9c5d7b9c5d7c5c1c4c1c4e2c5c5d7c5d7d7d7c8b9f6c3d9b9e7c8b9c7c5c5c6b9e4c5b9d3d7c2c0c3d5g2c4c2c4c5b9c1c2c2e4c5c1c0d5c6c9d6c6c6c0c1c4g2d1c6d1c4c0d4c4e6e6e3c2c9c8g6e4c5b9b9d7c5c2c5c2c3d8e1d4c8e0d8d5b9c5d7b9c5d7c5c1c4c1c4e2c5c5d7c5d7d7d7c8b9f6c3d9b9e7c8b9c7c5c5c6b9e4c5b9d3d7c2c0c3d5g2c4c2c4c5b9c1c2c2e4c5c1c0d5c6c9d6c6c6c0c1c4g2d1c6d1c4c0d4c4e6e6e3c2c9c8g6e4c5b9b9d7c5c2c5c2c3d8e1d4c8e0d8d5b9c5d7b9c5d7c5c1c4c1c4e2c5c5d7c5d7d7d7c8b9g0g0f0f7b2", +"a2a7a9a7b3c4c5f2e5d7c5d5c4c1c1c6c6c0d5c5c0d5d5d5c8c2d4c2d0e5c1e6c6e6c0c1e4e4c2c5d7c5c5c5d5c4c5c5c3c2c1e0d8c1b9b9b9d2e4e4c5c4c5c5c5b9c4c5d7c5d7b9c8d7d7c7c5c5c6b9d7b9c5c7c2e6e2b9d7c5d9e6c1d4c3e6d1d1c2c4c5c4c5f2e5d7c5d5c4c1c1c6c6c0d5c5c0d5d5d5c8c2d4c2d0e5c1e6c6e6c0c1e4e4c2c5d7c5c5c5d5c4c5c5c3c2c1e0d8c1b9b9b9d2e4e4c5c4c5c5c5b9c4c5d7c5d7b9c8d7d7c7c5c5c6b9d7b9c5c7c2e6e2b9d7c5d9e6c1d4c3e6d1d1c2c4c5c4c5f2e5d7c5d5c4c1c1c6c6c0d5c5c0d5d5d5c8c2d4c2d0e5c1e6c6e6c0c1e4e4c2c5d7c5c5c5d5c4c5c5c3c2c1e0d8c1b9b9b9d2e4e4c5c4c5c5c5b9c4c5d7c5d7b9c8d7d7c7c5c5c6b9d7b9c5c7c2e6e2b9d7c5d9e6c1d4c3e6d1d1c2c4c5c4c5f2e5d7c5d5c4c1c1c6c6c0d5c5c0d5d5d5c8c2d4c2d0e5c1e6c6e6c0c1e4e4c2c5d7c5c5c5d5c4c5c5c3c2c1e0d8c1b9b9b9d2e4e4c5c4c5c5c5b9c4c5d7c5d7b9c8d7c7b6b6e8b6b2", +"a2a7a6a7b3c5d5c4c5d5b9d7c4c6d1c2c2c4d5b9c4d5d8e5b9d7d0d7c0e5c1c6e3c5e5c1e4e4d5c4e2b9c5c1c4d5e0e1c2c2e6d5d5d4b9b9c0e4b9b9c4e2e4c5e2c5c5c1d7c4e4b9c5e6e3d7c5e6d3e2c2d7e5b9c6c5d7c5c5f4b9c1d1c0d1c1d1c1g2c1c4c5d5c4c5d5b9d7c4c6d1c2c2c4d5b9c4d5d8e5b9d7d0d7c0e5c1c6e3c5e5c1e4e4d5c4e2b9c5c1c4d5e0e1c2c2e6d5d5d4b9b9c0e4b9b9c4e2e4c5e2c5c5c1d7c4e4b9c5e6e3d7c5e6d3e2c2d7e5b9c6c5d7c5c5f4b9c1d1c0d1c1d1c1g2c1c4c5d5c4c5d5b9d7c4c6d1c2c2c4d5b9c4d5d8e5b9d7d0d7c0e5c1c6e3c5e5c1e4e4d5c4e2b9c5c1c4d5e0e1c2c2e6d5d5d4b9b9c0e4b9b9c4e2e4c5e2c5c5c1d7c4e4b9c5e6e3d7c5e6d3e2c2d7e5b9c6c5d7c5c5f4b9c1d1c0d1c1d1c1g2c1c4c5d5c4c5d5b9d7c4c6d1c2c2c4d5b9c4d5d8e5b9d7d0d7c0e5c1c6e3c5e5c1e4e4d5c4e2b9c5c1c4d5e0e1c2c2e6d5d5d4b9b9c0e4b9b9c4e2e4c5e2c5c5c1d7c4e4b9c5e6e3b6e8b8f7b2", +"a2a7a7a7b3c0c0c5c4d5d5c1d5c6c1e6c5f5d5c4d7c2e6e6d6d6c5d1c1c1e6c0e3e3d0c2e4b9c4b9c5c4c5b9c4e0e0e1c4e5c6d5d5c5c0d7e4b9b9b9c5c5e2b9c4c5c4c5d7c5e2e2c5d7d7c5c1c5g6d3e7c2b9d7c6c7e2c5d7f9d6c1d4d4d5e5d1e5c4c1b9c0c0c5c4d5d5c1d5c6c1e6c5f5d5c4d7c2e6e6d6d6c5d1c1c1e6c0e3e3d0c2e4b9c4b9c5c4c5b9c4e0e0e1c4e5c6d5d5c5c0d7e4b9b9b9c5c5e2b9c4c5c4c5d7c5e2e2c5d7d7c5c1c5g6d3e7c2b9d7c6c7e2c5d7f9d6c1d4d4d5e5d1e5c4c1b9c0c0c5c4d5d5c1d5c6c1e6c5f5d5c4d7c2e6e6d6d6c5d1c1c1e6c0e3e3d0c2e4b9c4b9c5c4c5b9c4e0e0e1c4e5c6d5d5c5c0d7e4b9b9b9c5c5e2b9c4c5c4c5d7c5e2e2c5d7d7c5c1c5g6d3e7c2b9d7c6c7e2c5d7f9d6c1d4d4d5e5d1e5c4c1b9c0c0c5c4d5d5c1d5c6c1e6c5f5d5c4d7c2e6e6d6d6c5d1c1c1e6c0e3e3d0c2e4b9c4b9c5c4c5b9c4e0e0e1c4e5c6d5d5c5c0d7e4b9b9b9c5c5e2b9c4c5c4c5d7c5e2e2c5d7d7e8b8e8g1b2", +"a1a9a7a6b3b9c5c1c4c4d8d5c2c6c5d0c2g2d5c5c9c2d7c6c8c8c8g7c1e6d1c0c5c2c5d4d0e4e2c5c5c5c9d7c4d5e1d5c1e5d1e0c5c4c5c5c5c5c4b9d7c5e2e2c2c5c1c4c5b9d7b9e6d7c5d7c5e5d2b9d6e5d7d6c5d7e7c8b9c7c7c1e5d5d1c0c3c2d1d5c4b9c5c1c4c4d8d5c2c6c5d0c2g2d5c5c9c2d7c6c8c8c8g7c1e6d1c0c5c2c5d4d0e4e2c5c5c5c9d7c4d5e1d5c1e5d1e0c5c4c5c5c5c5c4b9d7c5e2e2c2c5c1c4c5b9d7b9e6d7c5d7c5e5d2b9d6e5d7d6c5d7e7c8b9c7c7c1e5d5d1c0c3c2d1d5c4b9c5c1c4c4d8d5c2c6c5d0c2g2d5c5c9c2d7c6c8c8c8g7c1e6d1c0c5c2c5d4d0e4e2c5c5c5c9d7c4d5e1d5c1e5d1e0c5c4c5c5c5c5c4b9d7c5e2e2c2c5c1c4c5b9d7b9e6d7c5d7c5e5d2b9d6e5d7d6c5d7e7c8b9c7c7c1e5d5d1c0c3c2d1d5c4b9c5c1c4c4d8d5c2c6c5d0c2g2d5c5c9c2d7c6c8c8c8g7c1e6d1c0c5c2c5d4d0e4e2c5c5c5c9d7c4d5e1d5c1e5d1e0c5c4c5c5c5c5c4b9d7c5e2e2c2c5c1c4c5b9d7b9e6d7c5b6e8e8g1b2", +"a2a7a7a7b3b9c5c4c1c1c4c4c4d7e6d0c1f5d5c6c9d7e3c2c2d7c2f1d7d7c4e5d7c4e4d7c4e2e2c5c4d7d9d7d5c4e0d5e0e5c8e4c5c5c2c5e4c5c5c5b9d7e2b9c1c4e2b9b9e2b9c1c5d6d9e5e5c2b9c7c8c6e5c7e4c7b9c7d2d3c1e5c0c3c3c4d1d1c4c4c5b9c5c4c1c1c4c4c4d7e6d0c1f5d5c6c9d7e3c2c2d7c2f1d7d7c4e5d7c4e4d7c4e2e2c5c4d7d9d7d5c4e0d5e0e5c8e4c5c5c2c5e4c5c5c5b9d7e2b9c1c4e2b9b9e2b9c1c5d6d9e5e5c2b9c7c8c6e5c7e4c7b9c7d2d3c1e5c0c3c3c4d1d1c4c4c5b9c5c4c1c1c4c4c4d7e6d0c1f5d5c6c9d7e3c2c2d7c2f1d7d7c4e5d7c4e4d7c4e2e2c5c4d7d9d7d5c4e0d5e0e5c8e4c5c5c2c5e4c5c5c5b9d7e2b9c1c4e2b9b9e2b9c1c5d6d9e5e5c2b9c7c8c6e5c7e4c7b9c7d2d3c1e5c0c3c3c4d1d1c4c4c5b9c5c4c1c1c4c4c4d7e6d0c1f5d5c6c9d7e3c2c2d7c2f1d7d7c4e5d7c4e4d7c4e2e2c5c4d7d9d7d5c4e0d5e0e5c8e4c5c5c2c5e4c5c5c5b9d7e2b9c1c4e2b9b9e2b9c1c5d6d9e8e8e8f0b2", +"a1a7a7a7b3c5c0c2c1d5c5d7d4c6c2e6e1c4c1b9c9c6e3c6c2d9e4f1b9d7b9e5d6c4e4d7c4e2e2c5c2d7c6c4d5e0d5e0c5b9f2e4b9c5c1b9b9d5c1c4e4b9b9c5c4c5c5d7c5e2b9c5d7d6d7c1e6d7c5d7c6e5d7e7d7c5b9c5e2b9d7c0c3d1d1d1d5c0c3c1c4c5c0c2c1d5c5d7d4c6c2e6e1c4c1b9c9c6e3c6c2d9e4f1b9d7b9e5d6c4e4d7c4e2e2c5c2d7c6c4d5e0d5e0c5b9f2e4b9c5c1b9b9d5c1c4e4b9b9c5c4c5c5d7c5e2b9c5d7d6d7c1e6d7c5d7c6e5d7e7d7c5b9c5e2b9d7c0c3d1d1d1d5c0c3c1c4c5c0c2c1d5c5d7d4c6c2e6e1c4c1b9c9c6e3c6c2d9e4f1b9d7b9e5d6c4e4d7c4e2e2c5c2d7c6c4d5e0d5e0c5b9f2e4b9c5c1b9b9d5c1c4e4b9b9c5c4c5c5d7c5e2b9c5d7d6d7c1e6d7c5d7c6e5d7e7d7c5b9c5e2b9d7c0c3d1d1d1d5c0c3c1c4c5c0c2c1d5c5d7d4c6c2e6e1c4c1b9c9c6e3c6c2d9e4f1b9d7b9e5d6c4e4d7c4e2e2c5c2d7c6c4d5e0d5e0c5b9f2e4b9c5c1b9b9d5c1c4e4b9b9c5c4c5c5d7c5e2b9c5d7d6d7b8b8b6b6b2", +"a2a7a7a6b3c5c4c2c1d5c5e2d5c1c2d1c3c0c4c2c6c2c2c2c2d7c5f1c2d7b9e4d7c2c5c6e5b9c2d7c9c6c5c1d5d8e0d8f2b9b9e4b9b9b9c0c5c4d7b9c5e2b9c4d4d7c1c5d7e2b9c5c4d7c5e5d7d7c7c2d7c5d3d3d7c1e2c5d7d9c2c0c0c5d4d4d1c0e5d5c4c5c4c2c1d5c5e2d5c1c2d1c3c0c4c2c6c2c2c2c2d7c5f1c2d7b9e4d7c2c5c6e5b9c2d7c9c6c5c1d5d8e0d8f2b9b9e4b9b9b9c0c5c4d7b9c5e2b9c4d4d7c1c5d7e2b9c5c4d7c5e5d7d7c7c2d7c5d3d3d7c1e2c5d7d9c2c0c0c5d4d4d1c0e5d5c4c5c4c2c1d5c5e2d5c1c2d1c3c0c4c2c6c2c2c2c2d7c5f1c2d7b9e4d7c2c5c6e5b9c2d7c9c6c5c1d5d8e0d8f2b9b9e4b9b9b9c0c5c4d7b9c5e2b9c4d4d7c1c5d7e2b9c5c4d7c5e5d7d7c7c2d7c5d3d3d7c1e2c5d7d9c2c0c0c5d4d4d1c0e5d5c4c5c4c2c1d5c5e2d5c1c2d1c3c0c4c2c6c2c2c2c2d7c5f1c2d7b9e4d7c2c5c6e5b9c2d7c9c6c5c1d5d8e0d8f2b9b9e4b9b9b9c0c5c4d7b9c5e2b9c4d4d7c1c5d7e2b9c5c4d7c5e8b6b6b6b2", +"a2a7a6a7b3c5c5c1c2d8c1d7c1d5c1d1d1f6f5c2c1d1c3d7d7c5d8f1c6c9c6d7d7d6c9d9d5e5c5c2d7d7c4d8c1c4d9d2b9c8f2c5e4c2b9c4c4c5c2c5b9c5e2c1e5c5c1c4d7b9b9d7d7e7c9e2b9e2d3d3b9b9g6e4e2b9d7e5c8d3b9c0c0d7d7d1c2c0g2c4c2c5c5c1c2d8c1d7c1d5c1d1d1f6f5c2c1d1c3d7d7c5d8f1c6c9c6d7d7d6c9d9d5e5c5c2d7d7c4d8c1c4d9d2b9c8f2c5e4c2b9c4c4c5c2c5b9c5e2c1e5c5c1c4d7b9b9d7d7e7c9e2b9e2d3d3b9b9g6e4e2b9d7e5c8d3b9c0c0d7d7d1c2c0g2c4c2c5c5c1c2d8c1d7c1d5c1d1d1f6f5c2c1d1c3d7d7c5d8f1c6c9c6d7d7d6c9d9d5e5c5c2d7d7c4d8c1c4d9d2b9c8f2c5e4c2b9c4c4c5c2c5b9c5e2c1e5c5c1c4d7b9b9d7d7e7c9e2b9e2d3d3b9b9g6e4e2b9d7e5c8d3b9c0c0d7d7d1c2c0g2c4c2c5c5c1c2d8c1d7c1d5c1d1d1f6f5c2c1d1c3d7d7c5d8f1c6c9c6d7d7d6c9d9d5e5c5c2d7d7c4d8c1c4d9d2b9c8f2c5e4c2b9c4c4c5c2c5b9c5e2c1e5c5c1c4d7b9b9d7d7e7c9e9f7e9f7b2", +"a2a7a6a9b3c5b9c6c1d8c2d6e6c2c3d4d7e1d8c2c6d5d1d5d1c4c1d7c6d6d7c9c9c8e2d9d5e5b9c5c5c5c4c4d5d6e4b9c5e4c5c5b9c4c4c1c1e2c5c5d7e2e4c4e4c5c1c4f2b9d7c5b9b9c5b9c9e7d3b9e4e4f2e2e2e3d7e5d7d9e6c1d4c5c2c1c2c0f5e6c4c5b9c6c1d8c2d6e6c2c3d4d7e1d8c2c6d5d1d5d1c4c1d7c6d6d7c9c9c8e2d9d5e5b9c5c5c5c4c4d5d6e4b9c5e4c5c5b9c4c4c1c1e2c5c5d7e2e4c4e4c5c1c4f2b9d7c5b9b9c5b9c9e7d3b9e4e4f2e2e2e3d7e5d7d9e6c1d4c5c2c1c2c0f5e6c4c5b9c6c1d8c2d6e6c2c3d4d7e1d8c2c6d5d1d5d1c4c1d7c6d6d7c9c9c8e2d9d5e5b9c5c5c5c4c4d5d6e4b9c5e4c5c5b9c4c4c1c1e2c5c5d7e2e4c4e4c5c1c4f2b9d7c5b9b9c5b9c9e7d3b9e4e4f2e2e2e3d7e5d7d9e6c1d4c5c2c1c2c0f5e6c4c5b9c6c1d8c2d6e6c2c3d4d7e1d8c2c6d5d1d5d1c4c1d7c6d6d7c9c9c8e2d9d5e5b9c5c5c5c4c4d5d6e4b9c5e4c5c5b9c4c4c1c1e2c5c5d7e2e4c4e4c5c1c4f2b9d7c5b9b9c5f7f0e9g1b2", +"a2a7a6a7b3c5b9c2c2c1c1c2c2e3d0c3c8d8c2c2c4d5d5d1d5d4c1c5d7c9c5c8d6e7d9b9c4d0d4c2c5c4c2c5c1b9e4b9c9d7e3c5c6c6c1c1d1c1c5d7d6c7e3e6c6c5c1c5b9c5d2d7d7c5d7c5d7e7d2f3b9b9e2f2d7c2c1c4d7f2e5f6e6c5c6c2c0c4f5c1d8c5b9c2c2c1c1c2c2e3d0c3c8d8c2c2c4d5d5d1d5d4c1c5d7c9c5c8d6e7d9b9c4d0d4c2c5c4c2c5c1b9e4b9c9d7e3c5c6c6c1c1d1c1c5d7d6c7e3e6c6c5c1c5b9c5d2d7d7c5d7c5d7e7d2f3b9b9e2f2d7c2c1c4d7f2e5f6e6c5c6c2c0c4f5c1d8c5b9c2c2c1c1c2c2e3d0c3c8d8c2c2c4d5d5d1d5d4c1c5d7c9c5c8d6e7d9b9c4d0d4c2c5c4c2c5c1b9e4b9c9d7e3c5c6c6c1c1d1c1c5d7d6c7e3e6c6c5c1c5b9c5d2d7d7c5d7c5d7e7d2f3b9b9e2f2d7c2c1c4d7f2e5f6e6c5c6c2c0c4f5c1d8c5b9c2c2c1c1c2c2e3d0c3c8d8c2c2c4d5d5d1d5d4c1c5d7c9c5c8d6e7d9b9c4d0d4c2c5c4c2c5c1b9e4b9c9d7e3c5c6c6c1c1d1c1c5d7d6c7e3e6c6c5c1c5b9c5d2d7d7c5d7b8b6e9g1b2", +"a2a6a7a9a5c5b9c6c6d8c1c1d7e5e6d5c4d8c6c6d5d4d1d5d1d7c5c1e3c5c1c2c8e7e4b9e4e0d5d8c5b9e4b9f2b9c5e2d7d7c5e6e6e6c1c6c2e3c5e3d6c9d6c6c1c4c4c1c1b9d7e2c5d7c5d7e7e4b9e2b9d2e3c1c2c6d7d0d9e5d1c3c5c2d7c6c0c3c4c2e0c5b9c6c6d8c1c1d7e5e6d5c4d8c6c6d5d4d1d5d1d7c5c1e3c5c1c2c8e7e4b9e4e0d5d8c5b9e4b9f2b9c5e2d7d7c5e6e6e6c1c6c2e3c5e3d6c9d6c6c1c4c4c1c1b9d7e2c5d7c5d7e7e4b9e2b9d2e3c1c2c6d7d0d9e5d1c3c5c2d7c6c0c3c4c2e0c5b9c6c6d8c1c1d7e5e6d5c4d8c6c6d5d4d1d5d1d7c5c1e3c5c1c2c8e7e4b9e4e0d5d8c5b9e4b9f2b9c5e2d7d7c5e6e6e6c1c6c2e3c5e3d6c9d6c6c1c4c4c1c1b9d7e2c5d7c5d7e7e4b9e2b9d2e3c1c2c6d7d0d9e5d1c3c5c2d7c6c0c3c4c2e0c5b9c6c6d8c1c1d7e5e6d5c4d8c6c6d5d4d1d5d1d7c5c1e3c5c1c2c8e7e4b9e4e0d5d8c5b9e4b9f2b9c5e2d7d7c5e6e6e6c1c6c2e3c5e3d6c9d6c6c1c4c4c1c1b9d7e2c5d7c5b6e9f0f0b2", +"a2a6a7a9a5d5c4d9c2e6c1c2c5e5c2d1c1d5c1d5d5d1c4c4c1d7c1c9c8e3e5e6c6c2c9d9c5d8d5f5e4c2e4b9e4c5d7f2d7d7c5c1c1c1c1c2d7e3d7e3d6e7b9c2c2c1c1c4b9b9c4e4d7c5c5c9b9c5b9d3f2c5c2d7c2b9d7d0c1e5c0c4d7e5d7c6e5g2d1c2d5d5c4d9c2e6c1c2c5e5c2d1c1d5c1d5d5d1c4c4c1d7c1c9c8e3e5e6c6c2c9d9c5d8d5f5e4c2e4b9e4c5d7f2d7d7c5c1c1c1c1c2d7e3d7e3d6e7b9c2c2c1c1c4b9b9c4e4d7c5c5c9b9c5b9d3f2c5c2d7c2b9d7d0c1e5c0c4d7e5d7c6e5g2d1c2d5d5c4d9c2e6c1c2c5e5c2d1c1d5c1d5d5d1c4c4c1d7c1c9c8e3e5e6c6c2c9d9c5d8d5f5e4c2e4b9e4c5d7f2d7d7c5c1c1c1c1c2d7e3d7e3d6e7b9c2c2c1c1c4b9b9c4e4d7c5c5c9b9c5b9d3f2c5c2d7c2b9d7d0c1e5c0c4d7e5d7c6e5g2d1c2d5d5c4d9c2e6c1c2c5e5c2d1c1d5c1d5d5d1c4c4c1d7c1c9c8e3e5e6c6c2c9d9c5d8d5f5e4c2e4b9e4c5d7f2d7d7c5c1c1c1c1c2d7e3d7e3d6e7b9c2c2c1c1c4b9b9c4e4d7c5c5f0f0b6f0b2", +"a2a7a7a7b3c4d5c2d1d7e6d7c4c2e0d5c1c6c2c4c2c1c1d5d7d7c2d7c5f6g3c1c0c4d9b9f5e5c4d5b9b9d5b9e4e4e4b9c2e3c6c1c1c4d0c2c6e3c9c9c8c9b9c8d7c4c1c4e2c4b9c5e4c5c2b9d7b9d3d2g8d6c2c2e4e2d7d0c6e5e2c1c2c1c1c6c1d1d1c4c1c4d5c2d1d7e6d7c4c2e0d5c1c6c2c4c2c1c1d5d7d7c2d7c5f6g3c1c0c4d9b9f5e5c4d5b9b9d5b9e4e4e4b9c2e3c6c1c1c4d0c2c6e3c9c9c8c9b9c8d7c4c1c4e2c4b9c5e4c5c2b9d7b9d3d2g8d6c2c2e4e2d7d0c6e5e2c1c2c1c1c6c1d1d1c4c1c4d5c2d1d7e6d7c4c2e0d5c1c6c2c4c2c1c1d5d7d7c2d7c5f6g3c1c0c4d9b9f5e5c4d5b9b9d5b9e4e4e4b9c2e3c6c1c1c4d0c2c6e3c9c9c8c9b9c8d7c4c1c4e2c4b9c5e4c5c2b9d7b9d3d2g8d6c2c2e4e2d7d0c6e5e2c1c2c1c1c6c1d1d1c4c1c4d5c2d1d7e6d7c4c2e0d5c1c6c2c4c2c1c1d5d7d7c2d7c5f6g3c1c0c4d9b9f5e5c4d5b9b9d5b9e4e4e4b9c2e3c6c1c1c4d0c2c6e3c9c9c8c9b9c8d7c4c1c4e2c4b9c5e4c5c2f0b6f0e9b2", +"a2a7a6a6a5c1c6d1d5d0d1e0c2d7d7c1c5c9d9g9h0b0d2d5d5d8c6d5d7d1c2c6c1c4c2c1c5c1d5e5c5e4c2c2c2e4b9c5c6c6c1d1c2b1b0h1a5a7g6f2d6c7d6d6d6c1c5c1c4c5c5d7c5d7c5d7e4b9g6e4e2b9c5h2b1h2h2h2h2h2h2h2h2f4e4d1c0d1d4c3d5c1c6d1d5d0d1e0c2d7d7c1c5c9d9c5c5c1c0d5d5d8c6d5d7d1c2c6c1c4c2c1c5c1d5e5c5e4c2c2c2e4b9c5c6c6c1d1d1g9h2h2c3d9g6f2d6c7d6d6d6c1c5c1c4c5c5d7c5d7c5d7e4b9g6e4e2b9c5e2e2e4d0c1c6e5h2h2h2g6d4d1c0d1d4c3d5c1c6d1d5d0d1e0c2d7d7c1c5c9d9c5c5c1c0d5d5d8c6d5d7d1c2c6c1c4c2c1c5c1d5e5c5e4c2c2c2e4b9c5c6c6c1d1d1d4c5c5c0d9g6f2d6c7d6d6d6c1c5c1c4c5c5d7c5d7c5d7e4b9g6e4e2b9c5e2e2e4d0g9h2h2d7c2c1e5c4d1c0d1d4c3d5c1c6d1d5d0d1e0c2d7d7c1c5c9d9c5c5c1c0d5d5d8c6d5d7d1c2c6c1c4c2c1c5c1d5e5c5e4c2c2c2e4b9c5c6c6c1d1d1d4c5c5c0d9g6f2d6c7d6d6d6c1c5c1c4c5c5d7c5d7c5b6e9f0g1b2", +"a2a8a6a7a5c2c2e1d5e6d5f1c2c1c5c5b9c2c9b1h3a5b0b9e1e1c1c2c4d5c1c5c4c1c3d5c4c2f6d5b9e5c5b9c5b9b9c4e6e6c1d2b7h4b7a5h5h5b0e4d7d7d6d6c8c1c4c4c5c5d7e4c5c9b9b9d7d9e2f9e4e4d9b3h3b7b7h3b7b7h3b7b7b7h3b3b1f4c3e5e0c2c2e1d5e6d5f1c2c1c5c5b9c2c9b9c5c2c4f6e1e1c1c2c4d5c1c5c4c1c3d5c4c2f6d5b9e5c5b9c5b9b9c4e6e6c1d4d5a5h5a5h6g6f3e4d7d7d6d6c8c1c4c4c5c5d7e4c5c9b9b9d7d9e2f9e4e4b9c5e4b9e5e5c5h2h1b7b7h7d6c0c0c5c3e5e0c2c2e1d5e6d5f1c2c1c5c5b9c2c9b9c5c2c4f6e1e1c1c2c4d5c1c5c4c1c3d5c4c2f6d5b9e5c5b9c5b9b9c4e6e6c1d4d1c1d7c6c1f3f3e4d7d7d6d6c8c1c4c4c5c5d7e4c5c9b9b9d7d9e2f9e4e4b9c5e4b9e5h1h3b7h8d1e5c1d4c0c0c5c3e5e0c2c2e1d5e6d5f1c2c1c5c5b9c2c9b9c5c2c4f6e1e1c1c2c4d5c1c5c4c1c3d5c4c2f6d5b9e5c5b9c5b9b9c4e6e6c1d4d1c1d7c6c1f3f3e4d7d7d6d6c8c1c4c4c5c5d7e4c5c9b9f0b6f0g1b2", +"a2a7a6a7a5e6c1f1d0c1d1e0d7c2c1c5c1d7c9h0a5h5h5h9g5e1c0c5d7c1f1d5d1e1d8c3c2c4d5d5b9c4d9c6c2b9c4b9e6c6c1h0h4h5h5h5h5h5i0f0e6d0d7e7c9c4c4c5c1e4c5c5e4c4d7c4e2b9g6d2d3b9d2h1h5h5h5h5h5h5h5h5h5h5h5h5h5b7a8d7d5c6c1f1d0c1d1e0d7c2c1c5c1d7c9e4c4c8c4d8e1d8e6d7d7c1f1d5d1e1d8c3c2c4d5d5b9c4d9c6c2b9c4b9e6c6c1c4c1h1h5i0h8g7f2b9c8e3c8e7c9c4c4c5c1e4c5c5e4c4d7c4e2b9g6d2d3b9e4b9e2b9e5c4f3b7b7h5h5h5g8e1d4c4d5c4d5c6c1f1d0c1d1e0d7c2c1c5c1d7c9e4c4c8c4d8e1d8e6d7d7c1f1d5d1e1d8c3c2c4d5d5b9c4d9c6c2b9c4b9e6c6c1c4c1e3c5c1c6f3d2e4c7e3c8e7c9c4c4c5c1e4c5c5e4c4d7c4e2b9g6d2d3b9e4b9e2b9d2h1h5h5b0i1c3c4d4d1c0c4c3d4d5c6c1f1d0c1d1e0d7c2c1c5c1d7c9e4c4c8c4d8e1d8e6d7d7c1f1d5d1e1d8c3c2c4d5d5b9c4d9c6c2b9c4b9e6c6c1c4c1e3c5c1c6f3d2e4c7e3c8e7c9c4c4c5c1e4c5c5e4c4d7f8g1f0g1b2", +"a2a7a7a7b3c2c1e0e6c6c1d5c2d7b9c1d5c5d7b7a5h5h5i2i3f6e5d7d2e3f1f6c4d8d8g3c1b9f5d0c4d5c2f2b9b9c0e2c6c1d2h1h5h5i0h8c9g2e1i2e1f5d4c5c9c5b9c4c5b9c0c5d3c8b9c0e2e4d2f9e4d9f9h1h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5i0d2d0e5e0e6c6c1d5c2d7b9c1d5c5d7e4b9d5e5d4d5c9c9c9f9e3f1f6c4d8d8g3c1b9f5d0c4d5c2f2b9b9c0e2c6c1d4d0f9h1h5h5c9g1e6e6e6c2e3c7c9c5b9c4c5b9c0c5d3c8b9c0e2e4d2f9e4b9c5c4b9c2c1c4b1h1h5h5h5h5h6h9e0d8d5d4c4c2c1e0e6c6c1d5c2d7b9c1d5c5d7e4b9d5e5d4d5c9c9c9f9e3f1f6c4d8d8g3c1b9f5d0c4d5c2f2b9b9c0e2c6c1d4c1c6e3d0c2g6d2g6b9c7d7e3c7c9c5b9c4c5b9c0c5d3c8b9c0e2e4d2f9e4b9c5c4b9c2d2h2h5h5h8i4g2e1e0f5c0d1d1c4c4c2c1e0e6c6c1d5c2d7b9c1d5c5d7e4b9d6e5d4d5c9c9c9f9e3f1f6c4d8d8g3c1b9f5d0c4d5c2f2b9b9c0e2c6c1d4c1c6e3d0c2g6d2g6b9c7d7e3c7c9c5b9c4c5b9c0c5d3c8b9b8e9f0g1b2", +"a2a7a7a6b3c2d7c4d7c2d1c5d7d7c5d5e5d7f4h1h5h5h8i2i3g7g7e1e7c6c4e5c1d5d8e1f5c2c2d5d5c4c2c2c2d7e4c2e5d4h2h4h5h5c9i2b5i5g1g1g5i6f1d4d7c4c4c2c5c0e2b9b9b9c5e2b9c5d7d2e2c2h2h4h5h5g2i2i2i2i2i2i2i5e1g8h5h5h5h5b0c2c0d5c5c2d1c5d7d7c5d5e5d7b9c9f6d4d8e5e3e7c6e5d3c2c4e5c1d5d8e1f5c2c2d5d5c4c2c2c2d7e4c2e5d4d8c1h2h3h5h5i3i7e1e1d8c0c6c8c9c4c4c2c5c0e2b9b9b9c5e2b9c5d7f3e2c2b9c5c1c2c3f4h1a5h5i0h8h5b0a0g5i8d8e0c4c2d7c4d7c2d1c5d7d7c5d5e5d7b9c9f6d4d8e5e3e7c6e5d3c2c4e5c1d5d8e1f5c2c2d5d5c4c2c2c2d7e4c2e5d4d8c1c5c1e3e4d2d2g6b9d7e3d7c8c9c4c4c2c5c0e2b9b9b9c5e2b9c5d7f3e2c2b9c5c1c2c3g8h8c9i3a0i6g5i3d8f6c0c1f5c4c2d7c4d7c2d1c5d7d7c5d5e5d7b9h2a5a8c2e5e3e7c6e5d3c2c4e5c1d5d8e1f5c2c2d5d5c4c2c2c2d7e4c2e5d4d8c1c5c1e3e4d2d2g6b9d7e3d7c8c9c4c4c2c5c0e2b9b9b9c5e9f7b6b6b2", +"a2a7a9a6a5c4e6d1c2c2c1c5c9c9d5b9c6c5g9h4h5h5g8a0i1i7i9f1d4e6d1e5c4c0c0d5d5g2c4g3e5e0d9c5c5c2b9c5d1f5a6b7h5h5g0j0i6i1i5g1g4h9g5e1e5c4c5c5c5c5e4d7d3c8b9e4b9c5d9b9d3d6b1b7h5h5i9f7i7j0g4g4i5i5g0g0b8h6h5h5h5h8i6e0c0e6c1c5c9c9d5b9c6d6d9b9d5d1c0d0c9d6c1d6c9e3e5e5c4c0c0d5d5g2c4g3e5e0d9c5c5c2b9c5d4d5g3c5h2h3h5h5g0i1i9a2g7e0c1e3c9c4c5c5c5c5e4d7d3c8b9e4b9c5d9b9d3d7c6d7c1e5c1b0h4h5h5c9g8h5h5a0h9i9g7f1d5c4e6d1c2c2c1c5c9c9d5b9c6d6d9b9d5d1c0d0c9d6c1d6c9e3e5e5c4c0c0d5d5g2c4g3e5e0d9c5c5c2b9c5d4g3d5c6c6c4d3d2f4f3b9c9c7e3e3c8c9c4c5c5c5c5e4d7d3c8b9e4b9c5d9b9d3d7c6d7c1e5c1d1e1i7i5i5j1j1a2g7d8c4c6d5c4c4e6d1c2c2c1c5c9c9d5b9c6c7d9b7h5i0b0d8c9d6c1d6c9e3e5e5c4c0c0d5d5g2c4g3e5e0d9c5c5c2b9c5d4g3d5c6c6c4d3d2f4f3b9c9c7e3e3c8c9c4c5c5c5c5e4d7d3c8b9f0f0b8f0b2", +"a2a8a9a6b3c1c4e6c5c1c5e4c9e6c1c1c9d9h2h3h5h5c9a4f7f0j0g5e1c4d8c1e6e6e5e6c3d5d8d5c4d5c5b9d5c2e2c2c4c1a5a5h5h8i4a2j1e8j2b4g0e9j1i6f5e5d7d9c4c5c5d9b9d7e4d7b9b9c9c8e7c9b0b7h5h5a4g1f0j2b4j2b4j3g0g0g0j3g8h5h5h5c9g7d8d5e6e4c9e6c1c1c9d9b9d6c9d4c4g2d5c5d6c5c8c6d5e5e6e6e5e6c3d5d8d5c4d5c5b9d5c2e2c2c4e6c7c8h0b7h5h5i2i7i5g4i9g7f5c1e3c6c8d9c4c5c5d9b9d7e4d7b9b9c9c8e7c9c5e6e5c4g9h1a5h5b0i2g9h5h5i9b8h9g5i3g2c0d4c6c5c1c5e4c9e6c1c1c9d9b9d6c9d4c4g2d5c5d6c5c8c6d5e5e6e6e5e6c3d5d8d5c4d5c5b9d5c2e2c2c4e6d6d7c1c6d2d2g6c9d7e3c5c5c6c5e3c6c8d9c4c5c5d9b9d7e4d7b9b9c9c8e7c9c5e6e5c4c6c1e5f6g7i9i5g1i7g5e1c6c2g3c1c1c4e6c5c1c5e4c9e6c1c1c9d9f4h1h5h5g8a0d8e5c5c5c8c6d5e5e6e6e5e6c3d5d8d5c4d5c5b9d5c2e2c2c4e6d6d7c1c6d2d2g6c9d7e3c5c5c6c5e3c6c8d9c4c5c5d9b9d7e4b6f0f0f0b2", +"a2a7a7a6b3c1c0c2d7e6c5d7d7c6c6c1c9d7a7b7h5h5i9b4e8j2g1i1f1e0f5c6c2e5e6d1c9d5c4f5f6b9e5e2c1c2e4c5c1c8h1h5h5h8a0i9f0b4b4f8f0i5i1i6d8c6d9c9c5d7b9d9d9b9b9e2e4c5c5c9d6c9h1h5h5i0i2i5g0j4j4j2e8g0g0g0g0g0i9b0h5h5b0g0i3e1c4c5d7c6c6c1c9d7d3b9e6d5f5f5f6c7d7c6c8c3f5c6c2e5e6d1c9d5c4f5f6b9e5e2c1c2e4c5c1c8f2e3b3a5h5h8i2i7b8b8j0i6e0c0c2c8d9c9c5d7b9d9d9b9b9e2e4c5c5c9d6c9e3e6c4c9a5b7h5h5i3b2h3h5h5c9a4b8h9a2e1d4c0c2d7e6c5d7d7c6c6c1c9d7d3b9e6d5f5f5f6c7d7c6c8c3f5c6c2e5e6d1c9d5c4f5f6b9e5e2c1c2e4c5c1c8f2e3d0d7f3g6b9c2e3c2e6c6e6c6c2c8d9c9c5d7b9d9d9b9b9e2e4c5c5c9d6c9e3e6c0c6e5c4d0d5f1g5h9g1j0i9f1f6c6d8c1c1c0c2d7e6c5d7d7c6c6c1c9c2g9h4h5h5g2b8i8f5d4d1c8c3f5c6c2e5e6d1c9d5c4f5f6b9e5e2c1c2e4c5c1c8f2e3d0d7f3g6b9c2e3c2e6c6e6c6c2c8d9c9c5d7b9d9d9b9b9e9f0b8b8b2", +"a2a9a8a6b3c6c4c8d7c2c2c5d7d7c5c0f2c9h0b7h5h5a4b8g0b4f7i8f3f4f5d5d9h2b0h0h0b0h2d4c4c0c5b9c3e4f9f9f9h2h1h5h5c9f0e5i9j4f8g4j1g5i6i8c8h2b0b0a5h0b1f9d7e7c6c2b9d7c5e2c5f9h1h5h5h8i2j0b5j4b5g1j0i7h9h9h9i7i7b1h5h5h5i5i9i6d8d1c5d7c5c0g9a6h0a5a8b0h2e5d4c9c7c2e3c3d5d5d4c2c6d7g6h2a7b0a5b0h2f4d4e4c5c1c5d9f2b9h1h5h5h6a4i5g0b5i5g5e0f9f9f9f3e6b9b9c0c7c2b9c6c2b9d7c5e2c5d3d7d4e5h2h1h5h5h8i2i7a6h5h5h8b2g0i5i1e1c0e5d7d7c2c2c5h2a6b0h0h0h0a6d3d5g2c1c3f6c9c7c2e3c3e6h2b0b0h0h0b0h2e5d8c4c0c5b9c3e4c5c1c5d9f4h2b0h0a5h0b1f9c5d0e6c6c6c1e6c5d9e6b9b9c0g9b1h0a5b0a6g9e3e2c5d3d7d4e5d6f9f9d2c4d8i8g5i7j1g5e1g9a7b0a5b0a6h2f2c2c2c5d7d7d9f4g9f9a6h3h5h5i9g5e6f1f1g2c1c3d5d5d4f4b1b0h0b0b0h2f4c0c5b9c3e4c5c1c5d9f2e3d2b1h0h0h0h0b0g9e6c6c6c1e6c5d9e6b9b9c0c7c2b9c6f0f0b6b6b2", +"a2a8b0a6b3c6c6f5c2d0c5c5d9c0b9c0d9e7h1h5h5b0i2g1b5b4g1b1h4h3g8h2b7h4b7a5a5a5a5b7d2c5c0d7c5d2h1h3h3h4b7h5h5c9f9h3f9j1e9i9i3f1c2a6h1h4b7a5a5h5a5a5h5c9c2c2e4c9b9d7e4g9h4h5h5c9a4g4b4b4g1i1i6g7g7i3i3g7f1f9a5h5h5g2b8j1i3f5c7c3h2b7h1h3a5a5h5a5a5h5g9d7c8d7d4d1c4e5c1c9c7b1h1h4b7a5a5h5a5b7h2c4e0e0d6d9c7f9h4h5h5g2j3i5b4b5j0e6h0h1h4h7g8d7c4c5b9c6c2c6c2c2e4c9b9d7c9d3c9b9e4b7b7h5h5i9a0i9g9a5h5h5i4j3g4i7g7c3d0f5c2e6g9b3h1h3a5a5h5a5a5a5b1c3f6c3d4d7c8d7g2b1h1h1b7a5a5a5a5a5b7g9g3c5c0d7c5c4e0e0f4a8h1h4b7a5a5h5a5a5a8c7c6e6e6c1c1c4c1c1c4f9a5h1h3a5a5h5a5a5h5f9c9d3c9b9c0f9h1h3g9b9d5d5f1g7i6f9b7h1h3a5a5h5a5a5b7g9c5c5d9c3h2h1h4h3h4a5h5h5i3b1h3d7i3f1e0c3e5f4b0h1h3b7a5a5a5a5b7b1c0d7c5c4e0e0d6d9g6b0h1h4b7a5a5a5a5a5b7f4e6c1c1c4c1c1c4c5b9c6e3c6e6f0f0f7f0b2", +"a2a7b0a6b3d7c0e1c3c3d7b9c4d8d5e2b9f9h1h5h5h8i4g1b4b5g4a7a5h5h5b1h5h5h5h5h5h5h5h5i0d3d6e6c5f9h4h5h5h5h5h5h5h5h5h5h5g2i5i6e0d2b7h4a5h5h5h5h5h5h5h5h5b0e2e6e6d6c9c9c9h2h3h5h5e1g0f7j3g0i5g5e1f5d5d8f5c3c4h2b7i0h5c9a4g1i9e1d8b1h1h3h5h5h5h5h5h5h5h5i0h7c0b9d1c0c1e6e6f4h0h4b7h5h5h5h5h5h5h5h5h7c3e5d6c9e3h2h4h5h5i9b8g1j3f8f3b7h4h5h5h5h6e1g2d9c5c8e6d7c8c2c5d6c9c9c9e7c2e5b1h4h5h5h6i2i7j0d9b7h5h5i5j3f7i5g7c3d1e1c3b1h1h3h5h5h5h5h5h5h5h5h5h7d8c3d1c7e3d2h0h1b7h5h5h5h5h5h5h5h5i0g9e6c9c5c5c4c1f4b7h4a5h5h5h5h5h5h5h5h5b0b9e5c1c0c6d7d7c1h2h1h3h5h5h5h5h5h5h5h5b0h6d7e6e5c4g9h4h5h5g8d8d4d5d8g9h1h3h5h5h5h5h5h5h5h5i0h6c9d4d8h2h5h5h5h5h5h5h5h5h5h5h5i9g7f1c3g9h1h4a5h5h5h5h5h5h5h5h5h7e5e6c4c1e5d9f9b7h1a5h5h5h5h5h5h5h5h5i0g8f6e6d7d7c1c4e4c5c8e6d7c8b8b6f0f0b2", +"a2a8b0a6b3d7c1e0c1c3c5c4e5f5c4e3e4g9h4h5h5c9a4f7b5g0j0b7a5h5h8h6h5h5h8c9c9h8b0h5h5b0i3f6c0e6g8h5h5h5h5h5h5h5h5h5h5i9f8i6e4h1h4h5h5h5b0h6c9c9h8h5h5i0b0c3d4d6e6c2b9b0b7h5h5i9e9b6j4e8i7g7d5d0d0e5e5d7d3f9b7h5h5c9a4g0j0g5b1h1a5h5h5h5h8c9c9c9b0h5h5h5g8d4g2d1c1e6c7a5h4a5h5h5b0h8c9c9h8h5h5h5c9e6c2d7e3b1b7h5h5a4j0f0f0h2h1h3i0h5i0i9i2j1c3c6d7c2e6c1c6c5c5b9e6e3c9c9c7f9h1a5h5b0g0b5i1b6a1b7h5h5g2j4f7g4i6d5c0e0f9h1a5h5h5i0h8c9c9c9b0h5h5h5e5e1e3c2d7h2h1h5h5h5b0h6c9c9c9b0h5h5h5f1d5c4e6c2d3h1h4h5h5h5b0h6c9c9h8h5h5i0b0d5c3f6e6d7c2h2h1b7h5h5h5h8c9c9h6b0h5h5b0e0e5d1e6h2h3h5h5g0g5d5c3f4h1b7h5h5i0h8c9c9c9b0h5h5i0g5d8e1c4h8h5h5h5h5h5h5h5h5h5h5i2j1g7f4h1b7h5h5i0b0h8c9h6h8h5h5h5h6d5e5d8e4c9h0h4h5h5h5b0c9c9c9h6h5h5i0b0i6f6c6c6c7c2b9b9c2e6c1c6b6b8f0b8b2", +"a2b0b0a6b3e3e6g2e6c1e5e4c4f5c2f2c2h2h3h5h5e1j3b8b4b6i7h1h5h5h5h5h8h9i4j3f0g0i3h8h5h5i9e1e1g7c0e1i2i2h8h5h8i2i2i2i2i2b6g7a5h3h5h5h5c9i2i4g0e9b4g5i0h5i0c9i8d1e6c8c9a5a5h5h5i2e9e8j4e8j1e1d5c1e6e5c1f2f3h2h3h5h5c9a0b5f0f9h1a5h5h5h8h9i4a0j0i5j3h6h5h5b0i9e1g3e6e6b1h4h5h5h5h6i2i2a0i5b6f1h5h5i0i9e0d4c1b0a5h5b0i4i7i6b0h1b7h5h5h8b2i4g5f1f1g2d5c1c4d7c8e5c5c7d7d6c9c7c4b0h3h5h5c9i4i9i5g0j4a5h5h5h6a0b8f7i6d8d4g3a7h3h5h5h8a0i2b4f0b6b8h6h5h5h8i5e0c1e3b7b7h5h5g8b2i4g0g4g1j1h8h5h5c9g5f6g2d8a5h3h5h5h5c9i2i4g0b8j2g5i0h5i0c9i8e0c0c2d2b7b7h5h5b0i5b2j3b8g0h9h8i0h5c9i3e0f5b0b7h5h5i2i6e1e1b0h3h5h5h8a4i2b4f7f8f0h8i0h5g2i3g7c3d6i1i2i2h5h5c9i2i2i2i2i2i7g7a5h3h5h5b0g2i2i2a0b8j3c9i0h5h5g5g5f5d9f4h1a5h5h5e1i2a4f7b8g0g7i0h5h5i9i8g2c1c8b9e2d7c8e5c7c8f8b6f0f0b2", +"a2b0b0b0b3c8c5c5d7c2c5e5d5c4c4d9c8h0b7h5h5i9f7e9b4e8e5h1h5h5h5h8a0b2i7a2i9h9f7h5h5h5c9g4g7e1g3e2e6h1h5h5h6b2f8b4j4j2f0g9h1h5h5h5e1i2g1i6i1i7i5b8h2h5h5b0g0e1c3c2d7h1h5h5h8i2j0b5b4g1i9d8e6d0c6c4e6f2f2b1b7h5h5c9a0g0a2b7b7h5h5h8a4a0i1i1i9h9g4e1b0h5h5g2a2f5d6f4h1b7h5h5e1i2g0a2h9j1i5e4b0h5h5i9a2f1f5h1a5h5h8i4f4h1h4h5h5h5c9i2j3g5g5i9i1i6g7e0e1c8c5c3e5d3c9c9d6d7g9h1a5h5b0a4g1i7f0j2j2b1h5h5b0a4f0j0a2e1e5e3h1a5h5h5a4a4g5a2i7h9b8d7h5h5h8a4i6i8f4h1h5h5h8i4g0g5i1h9g4j0g9h5h5c9f8g5e1h2h1h5h5h5e1i2g1i9j1j0g4b8h2h5h5b0f8i3e0c3h0h4h5h5h8a4i4g5i9i5i5i5a8h5h5h8f8i6e1b7a5h5h8i2a2a2g3a7h5h5i0a0a0g7a2i7i5g1h4h5h5c9g0g5i8e6c1g9h4h5h5e1a0f8b4j3g0g0b1h4h5h5i0g0i4j0g5j1i5b8g4h7h5h5h6j1i8c0h2h3h5h5c9i2h9g5j1i5g1a2h8h5h5i9j0i3e0c5e3b9c2c1d8d6c5g0f8e9f7b2", +"a2b0b0b0b7d1e3d9c2d6e4c4c4b9b9d9b9a5a5h5h5i2g4b8j3f0f4h3h5h5b0g0b2b8i5g4f7e8g0h4h5h5c9a0j0i6d8c6f4h4h5h5g2b2j3j4j4j4a2h1b7h5h5g2i2h9i9i5g1g0b4j3f4b0h5h5g0i9g7g3f9h1h5h5h8b2g4j2b5g4a2d5d7e6e6e5c1f2g6h0b7h5h5i9a0g0b1b7h5h5b0a4a0g5h9g1g1f8g0b5h3i0h5g8g0i3g3a5h3h5h5h8i2i7i9i7g1g0j2a2a8h5h5i9b8i9d9h1h5h5c9h9h1b7h5i0b0f7i2g4i6i7i5f7g4i7g5i8f1e6d6d8e2c8d6c2d6g6a5h3h5h5e1i4a2i5j2b5g1f9a5h5h5a4f7g1i9i6d1c9h1h5h5h8i2i6j1i5b6j2b4j2e5c9e1b2h9a2d2h3h5h5c9a0i9i5g1e8b5j2f8g8c9i9a0i7f5h1b7h5h5g2i2i5i1i5b6b5b4b4f4h5i0h5g0i1g7f9h1a5h5h5h9a0i1j1i5b5f8b5g9b0h5h8b2j1i8h1h5h5h6a4i7h9j1e1h8h8g2i4g7i9g4g0b5g0h1h5h5c9a0i1i3g3e5h2h3h5h5i5a0j3j3j4b4a2h1a5h5h5i9i4g5i9i5b6b5b5g0b1i0h5h8a4i9e1h2b7h5h5i9g1i9i5b8b5b4b5i1c9c9g0g0j1g7f5e3c2e3e5d8c5d6j2e9b6f0b2", +"a2b0b0b0b7d1d7d9c8b9b9e5e5e4b9f3d9h1h5h5h8i2i7e8g0g1g9h3h5h5c9i4b5j3j3g0b5b5b8h1h5h5c9a4e9j1i3e1h2h3h5h5i9a4j4j4j4j4g9h4h5h5h8i2i5j1g1b5b4b4g0f0g3b7h5h5g2g1i1g7g9h3h5i0c9a0g4j3g0i5i6c8e3e6d0c4c1d2f4h1a5h5h5i5f0g4h1a5h5h5i3b2g5h9e8b4g0e8f0g1b1h5h5i0a4j1e6h1h5h5b0b2b4a2i5f0j2j2e8g0i3h8h8i5j3j0e4h4h5h5e1f4a5h5i0h8a4b2i9i9h9f7g0b4b6j0g5i8g2e6c7d8c2c8c1d7c6h2h4h5h5h8i2i5i7e8b4f0j0f3b7h5h5i3b6f0i9i6d4c8b7h5h5b0h9i6g1f8j2g0f8f7h9g0a0j4e9h9e5h3h5i0h8a2g4g0j4j2f8b6g1i5a0a0b4g0h2h3h5h5h8i2i5i1g4b5j4b4g0g0d8b7h5h5g2b8i9b1h3h5h5c9i2i9h9f7b5a0j2e8b8h6h8c9b2g4e6h4h5h5c9j3i5g1g1i9i3b5b4i7a2g4g0j4g0e1h1h5h5c9a4g4i1f1g3b0b7h5h5i2j4b4j3b4g0g9h4h5h5c9i2i7h9g4g0j3j2f8g1b1h5h5h5b2i5i9g9b7h5h5e5i6g4g0j3j4g0b6g1f7a0a4g0g1i1i6f6c1d7c1c4c2c7j2f0b6b8b2", +"a2b0b0b0b3d0b9c9c6d9e4e5d0c5b9g6g9h1h5h5h8b2h9g0j2j0a7b7h5h5g0j3b8a0j4j2b6g1e5h1h5h5c9a4f8g1i9i8b1b7h5h5a4j3j3j4b4f0h0b7h5h5i9a4i9g1g0j3j2b6i5j0e6h4h5h5c9a0g4i9h2h3h5h5i3g0f0j4e8h9i6c4e3c8d0e5e3g6h2h1h5h5b0i4b6d9h1h5h5h8i2i1i1f7j4j4b6j0j1i9a6a5h5h5i2g1h2b3h5h5c9b2g5j0f8j2j2b6g1h9i1h9a4b2j3b6g9h3h5h5c9b0h5h5g2i2a4i9j1g4b8b4j2e8i5i9i3g7d5c7c7d8c2d6c1c5d2b7b7h5h5i9a0i9g4b4b4g1i9e5h3h5h5c9j3b6i5g5d5c8g9h5h5i0i0h5b1f4i9g4j0i1i3i3a2h9g1g4i1h2h5h5h5b0h5h2c2h9j0j1i9i6a2i1g4b8h0b7h5h5i9a0i9g4b5j4j3b8g4i7e6h4h5h5c9a0j1h1a5h5h5a4g1j0f0g0b4j3e9i7j1i9g0a0a0b8f4h3h5h5i9g0f7b5f0i1i3g9b1b0h1h1h1h1h1h1h3h5h5i9a0e8g4a2d8a5a5h5h8i4f0b4b4b8g1h0b7h5h5b8g7g9f4f4f4f4f4g9g9h0a5h5b0i4b8i5i9h5h5h5h5b0h0h2g3g0g4i7i9i9i9j0i5b8j0g5e1e5e6d8c1d6c7j2b6f0e8b2", +"a2h0a6a6b3e6b9c7c8d3b9c1e4b9c0e5h2h3h5i0c9j4j0b4f8h9b3a5i0b0i2g4e8a0j4e8j0i9f4h3h5h5i3a0g0f8i7i6b0a5h5i0i2b8b5b4g0e1h1h5h5b0i2i5i5g0b4b4b8i7g5a2f3h3h5h5c9a0f8j0a6b7h5h5i5f7e8j4e8i7g7d0e6c5e5c1d6f4a6b7h5i0h8i2f0b1b7h5h5e1a0i1f0j2j4b5i7a2i8f1a8a5h5h5i2f0h0b7h5h5i5f7i1b8b4g0f0j0i9i6g7i8g7i9g4b4b1b7h5h5h5h5b0i5i2a0i5i5f7b5j2j2f7j0i9i8f5e1e5c7d7d8c5d6c4c1b1h4h5i0h8i2i7j0f8j4b5h9a2e1h3h5h5h8a0b4g4a2g3e6e7g9h5h5h5h5h5a5b7h0g9e1c0e5f5i6j1j0i7g5h8h5h5i0h5h5a5h3h0f4f1g3d8g7i9f1h1h5h5b0i2h9j0g0j4j3b6h9i9i6e4h3h5h5c9a4d9h1h5i0h8i2i9f0b5b4g0f0i1i3i3e1i8i6j1f0h2b7h5h5a4g1b6j2b6e4h0h1h3a5a5h5h5h5h5h5h5h5h5g0g1b6g0h9g5h1h5h5h8a4j0j2j2g1g3h1h5h5b0c9h5h5b7h3b7h3h3h5h3h5h5h5h8i2b6b6j0g7b0h5h5h5h5i0b7h3b1d9i8f1g7g5i9j0i5i1g7d4d7d8d0c9c8j2b8f0f8b2", +"a2b0a6a6b7e6e5b9d7c6c2c5f2e2c5d7b1b7h5h5i3b8f0b4g0a2h1h5h5g8b2i5g0j4b4i5a2i6h2h3h5h5g0g0g0j2i5g5h1a5h5h8i2i5b5j2f0e6h4h5h5c9b2h9b8j3j3b8i5g5e1i8h2h3h5h5i3a0g0f0b3a5h5h5i2g1f8j4g1i1f1c4d0c5c2e5e6d2h1a5h5h5i3a0g1b1a5h5h5b2f7i5g0j2j2g1g5d8f5c3b7a5h5h8i4f7h1h5h5b0i2j1i5j3j4f0i7g5i8e0d8g2e0i3i9i5h0a5h5b0h5h5b0a4a0b5b8b5b5j3b5f7i7g5i3g3e6d8c1d6c5d8d8e5d6f9h1b7h5h5j3g7h1h1h1h1h1h1h1h1h1i0h5h5i4b4j0i1i8c6e3d7c2h8h5h5h5h5h5h5h5b7f4f2c3e1i6i9i9g5e1c9b0h5h5h5h5h5h5a5h5c1e6c3g7c2h4h5h5c9b2i1e9j3a0b8h9g5g7d8g9h4h5h5i3a4f4h3h5h5i3j3i7b5j3g0g1h9a2e1d1c3f5f5i6j1a6b7h5b0i2h9e8b4h2h1h3h5h5h5h5h5h5h5h5h5h5h5h5i2j0f0b5h9d9h1h5h5c9a0g4j2b5j0f9h4h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h8b2b8b5i5g5c3c9i0i0h5h5h5h5i0a5h7f5c3f1i3i9i9g5i3c3c5d8d0d6c2j2j2b8f0b2", +"a2a8a9a7b3d4e6c2e3c8c0c2d3c5d9d0b0b7h5h5g0g4b6j3f0e6h4h5h5c9b4g4b5j4f8i1i8e1b0b7h5h5i2g4b5j2g4d4h1h5h5c9a4i5g0j2g4f4h3h5h5i3g0g4b4j4b8i5g5e1c0e1h0b7h5h5i9b8b8j0h1h5h5h8i2i5j2b4g1a2e1e5e6c6c5e6c4b1h1h5h5i0i4f0e8a5a5h5h8i2j1f0j4g0f0j1f1c0c4g9h1h5h5h8b2g1h1h5h5h8b2j1f0j4b4j0a2e1d8f5g2d4f6d8g7a2h1h5i0h8h6h5h5h8j3j3j3a0j3g0g4i7i3e1d5e6c5f5c6c8d7d5c1d6c9b0h3h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5i5f8g0h9g7c3e6c8d4i9i9g2h8h5h5h5h5h5i0b9c0d4e0i8i8g7e1e5h9i9g8h8h5h5h5h5h5b0e6e6e1g9h3h5h5i3g0j0f8a0f8i5g5i8e0c3h0b7h5h5i9f0f4b7h5h5i9g1g4j4j3f0i7g5e1c6d7c1d1f5f5a3h1a5h5h8i4h9g0e4h1b7h5h5h5b0c9c9e1i9i9i9h8h5h8i2j0g0g0j0f9h3h5h5i9f0g1b4f0i7h2b7h5h5h8h8h8h8h8h8h8h8h8h8h8h8h8h8c9b2b8b4g1g5e1i3h9i3g8b0h5h5h5h5h5h8d8f5e1i3g7g7e0c0e3f5c1c8d7b5b8f0f0b2", +"a2a8a7a7a5d4c1e6c8c2c7c2d6d3f2e6b7a5h5h5i2j0f8j3g4f4h4h5h5i9g0g1j2b4g1i6d5e1b7a5h5h8i2i5b4j2g4f3h4h5h5e1g0g4b4b8i5h2h5h5h5i9b8f7j3j3g1i9i8d4e3c6h1a5h5b0i2f7b8e1h1h5h5h6a4g4b4b5g4a2d8c4d0e5e3e6d2h1b7h5h5c9i2i5g0h1h5h5h8a4i7b5j4f0j0g5g3c2c6b1h3h5h5g2a4i6h1h5h5c9b2j0f8j4f8i9i8d1d5f5f5e5e5c4c0f3h1h5h5c9a0b0h5h5g8j3a0g0g0j0i9i3d8f6c1e3d7c3c1d6e6e0d8c9h2h1a5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5h5g2j3b5i5i6e0c5c2c2g2g7h9a0a0e1g8h5h5h5h8i3f5e6d5d4e1g3d7f1g5f7a4b8g2h8h5h5h5c9d8e1h2h5h5h5i9i5g4j2j4b8i9i8c3g2c8h1a5h5b0i2f0h2b7h5h5i2g1f7a0b5j0g5i3e1d6c7d0c4c4c3d7h1h5h5c9a0i5j0b3h5h5h5b0i9i2b2j3a0j3a2b1h5h5c9a4f0b5b6i5h2h3h5h5g0i5f7j3f0i1h2h5h5h5i9b2b2i4i4i4b2b2b2a4a4a4a4a4a4a0g0b4g1i9f1i8i3i9g0b2i5c9b0i0h5h5g5d8g2e1g3f5d1c6d7c3c6d6e6b5j2f0b6b2", +"a2b0a7a7a5d5c7d7c4d0c1d0g6d2f4f3h1h5h5h8i2h9b5g0g1b1b7h5h5a4g1b6b4f8j0g7d1e5h1h5h5h6a4i5b5g0g4h2h3h5h5i9b8f7b4g0i7g9b7h5h5i9b8g0j3g0h9i6e1c1e5b1h4h5h5h6i4i5g0f4h3h5h5c9a0g1j2g0i5i6d8c4c6c1c1f3b7h3h5h5b0a4e8g4j3h1h5h5h8a4h9j2b4g4i1i3d0d6d3h1b7h5h5g0g0g3h4h5h5c9j4g4b4j4g1i6f1d5f9h2h2d7c9c9c2g9h3h5h5i3g0g7i0h5h5g2j3g0i5g5i8e1c1c5e5c2d0d8e5c7c6e0f5d7h0h3h5h5c9i9i9i9i9i9i9i9i9i9i9i9i9g2h5h5h6a4b4g1i6d8d5d0e5c3c3i8i9f7g0g0g8h5h5i0a0e1d8d0e3c3c4f2d8i8g5i5b8e8e8h8h5h5h8f0g7h2b7h5h5i9g4b6j3f8i5i6f5g2c1b1h4h5h5h6i4g4b1b7h5h5i2i5f8a0b8j1g7g7e5h2h2f9d7c5e5g9h4h5h5e1j2g4e6h1h5h5h8b2b2i9i1i5f0j2h2h3h5h5e5a4g0j2f0j0a6b7h5h5i2i7f8g0f0i9h2b7h5h5i9g1b8a0a0j2b8b8g1h9f4f9f4g1e9b8j2j2g1i9f1g2e1g7i9i5b8j3i9b0h5h5c9i9i8d8c1c6c0c2d0d8d1c7c6b5b5f8f8b2", +"a2b0a7a7a5d4e4c1c1c6c1f6f3e2f4f9h4h5h5h6a4g1b5b5g4a6b7h5b0i2h9f8b4b8i1f1c3f4h1h5h5g2j3i5b4b8i7b1b7h5h5i2g1f7b4b8i1f4b7h5h5g2b8g0j3b8i1f1g2e5f4h1a5h5h5i9j3g4b4h2h5h5h5i9j3f7j3g0h9e1g3e5e6c2f4a5h4h5h5h5i3i4j1e8j4b0h5h5b0a4j0b4j2i7g5i8d7c1b0h4h5h5h8i4j0j0h3h5h5h6a0b8j3b5h9i6d8e6b7h3b7h8d6b9d7b1h5h5h5g0b8b8f9h5h5b0i9i5i9g7d5d5e3d7c1e5c0e0e5c9c8c1d1h2h1h5h5b0a4b8f7j3a0a4a4b4g0b8f7g1g1h2h5h5b0i4j4g7a6a7g9e6e5d5c9d5f1j1g1g4h0i0h5h5i2i9f9b0h0f3e6d1d4d8f1i9h9g4a3h4h5h5h8b2i9f4b7h5h5g2f7e8j3b8i1f1d5g3f9h1b7h5h5i9g0g1g9a5h5h5g0g1j2a0e9g5e1g3h2h1b7h7h6d7e3h2h3h5h5i9b8j0f4h3h5h5e1a4g5i9f7f8b4j1h1b7h5h5i9b2b5b4g1i7b7a5h5h8i2j0e8j2g4a2g9h5h5h5i5b8e8a0j3b4j2b4b5e1h1h3h7c9b5g0g9b1b1a3f1e0d4c3g7j1j0b8d9h5i0h5c9j4g5i3d5c6c1e5c0d8d1c9c8g0f8e8f8b2", +"a2a7a7a9a5c3b9c2e6c2c0c4d2e4f3h2h3h5h5g2a0g4b4f8h9h1h5h5h8i4j0e8j2f7i9f5e6h2h3h5h5i9b8f7b4f0j1a5a5h5h8i2i7e8j4e9i9i8h5h5i0h8j3b5j3g1a2e0d4e3a5h3h5h5h8i4f7f0b4b1a5h5h5a4g1b6j4e8i7i8d5d0d7h2h1h3h5h5h5h6i2g1j0g0a0f4h5h5h5h9g4j3e8i9i3d8d1h2h1a5h5h5i9a4h9g0h2h5h5b0a4f0j3e8i9i6d8b1h1h5h5h8a2c9c5b0b7h5h5i2i5g0j4h8h5h5h8i5g5f1d8e5e6c8e6e5c1d8e5c9c7d5d9b7b7h5h5e1b2i9g1g0a0a0j3j3b5g0g0e8b4h2h5h5h5a4a0e1h4a5b0h6c0c4f2c2e5i6a2f4h1h5h5b0i2g4g9h3a5b0g8c4c0e6c3i8i6a3h2h4h5h5g8b2j0i9h5h5i0h8b4b5j3g1g5e1d8c7a5h3h5h5h8i4g1f0a2b7h5h5e1b8b4j3g4i6f5f2b7b7h5h5g2i8e6a7b7h5h5i2g1f0f4b7h5h5a4i5i7e8j2j4a0h2h4h5h5h5a4a0b5g0g4a2h1h5h5c9a4h9g0g0j0i6e6b7h5h5g2f7g0j4b4b6f7f7a2h0h3h5h5c9a0f0b1b7a5h8g7d4e3c0f1g7a2i1h0b7h5h5e1a4i5a2i8d1e5e5c1d8e5c9c7b5g0e8e8b2", +"a2a7a7a7a5d7c2c2c9c7c1f5b9d2e2b1b7h5h5i9g0b8j3b8g7h1h5h5c9a0i5e8e8g4g5c3d9a6b7h5h5a4i5g1j3e9i1h1h5h5h8b2j0b5j3g4g5e1b1i0h5b0g0g0b5j0i6d8d2h0h1h5h5b0g0a4h9b8j4h1a5h5b0i4i5f8j4f0i9d8f9a6b7h1b7h5h5h5g8i4j3i7b8b4b4a2b7h5h5c9g0b4f0i9e0g3h2h1b7h5h5c9i4j0g1j4f4a5i0h5i9b8g0i5i1i8h2h1a5h5h5e1g0g2f5b7a5h5h8i2j0f8j2j0h7h5h5h8j0g7g2c2e3e3c6c1e5e1c6c9d6d8b1h4h5h5h8i2h9j0e8j3j3j3b5g0b5b6e8g0b5f4b7i0h5i3a0h9h3h5h5g8g5d8d7g6c8g3f4b7h3h5h5c9i2f8e6b7h5h5i3i3d1d9c9d8e1h2h1b7h5h5i9a4b8j0h2h5h5b0g0g0j3i5i6e1f3h0h1h5h5b0g0a4h9b8j4h5h5h5h8a0j3j3j0i8d9a5h4h5h5b0i2i3c4h0a5h5b0i2i7b6f4h3h5h5a4j1g4b4j4j2h2b7b7h5h5b0i4b5b5g0g4e6h1h5h5c9g0g4b5g0h9g7f5h0h5h5h8b8e8j3e8i7a3c2b7h4h5h5b0i2b4h9h2a5h5h5j3d4c1f6f5c3e5b1h1h5h5b0a4a0b8i7g5d8f6c1e5e1c1c9d6j2g0b8b8b2", +"a2a7a7a7a5e3c2e5c8e5g3f5d2c9e4b0b7h5h5a4f0e8j4f0d9h4h5h5g2j3g1f8b6j0g5e5b9h0a5h5i0i2i7b6b4g1e6h1h5h5c9a0i5b5b5j0g7e1f2a5h5h5h8c2e1g3f3b1h1h4h5h5h5g2i4h9g1g0a2h1h5h5h8b2a6b1b1h1h1h1h1h3a5h5h5h5h5c9i4g0h9g1j2j4g0j0h2h5h5h5f3f1d8c2g9a5h1b7h5h5b0a0f7i9f8a0f0h5h5h5h8d9e1e5f4a5h1b7h5h5h8i2i7i3e1h1h5h5h6a4j0b5f8f7i3b0h5h5c9i9f1g2c6e3c3c6c1e1c2d6b9f4h1a5h5h5i9a0i9f7b5j4b5g1i5i5j0i7j0j0j0i8b7h5h5c9a4g0h0h5h5i0c7f3f9f9h2b0h1h3h5h5b0a4a0g0a1h3h5h5h8f3f4f4g9g9a5h1b7h5h5h8i2j3g0f0g7a5h5h5h8c2e1e5f3b1h1h4h5h5h5g2i4h9g1j2j4f4h5h5h5d7c2f1c2b1h1h4h5h5h5i3b2g7i8h1h5h5h6b2j0j2e1b7h5h5c9g3e1i8f4h0b7a5h5h5h5h8i2g0g0g0j0e6h3h5h5c9j1g3i1b8j1f1c3h2h5h5h5h6f4e5g3e4b1h1h3h5h5h5i9b2i9j1e4b7h5h5h6f9f4f9f4b1b7h1a5h5h5c9i4g0b5f0i1g7e1e5c1e1c2c9e7b5f8f8f0b2", +"a2a7a7a6a5f2c2c4c4c6c3d1d2d9d3h1a5h5b0i4g4g0b4f0g9h3h5h5i9b8g4g0e9h9i6e6g6h1a5h5h8i2i7b6g0g4f4h3h5h5i3g0g1j3f8h9g7f5e5g9i0h5h5b0h5h3h4h3a5h5h5h5c9i4i5i5g0j4e5h4h5h5b0h8a5a5a5a5h5h5h5h5h5h5h5h8i5i2f0i7f7e8j4b4f0i1i3h7h5h5h5h7h4h4h3h5h5h5h5b0b8b2a2i5b4b4f0d4b0h5h5b0b7b3h3b7h5h5h5b0a4a0i9i1e6h1h5h5g2j3g1b5g0j0i9e2i0h5h5e1g5f1d1e3f5c1c1f1b9b9d7b0h3h5h5h6i2h9i5f8b4j2g1i1g5i6i6i3i6i6i6g7h4h5h5h8a4b6i8h5h5h5b0a5b3h3h3h3a5h5h5b0i5i4i5b5b4f4h5h5h5b0h5h3h4h3h5h5h5h5h8a4a4f7f8g0j0d3i0h5h5b0h5h3h3h3a5h5h5h5c9i4i5h9g0j3b4g1h7h5h5h5h7h3h3h3a5h5h5h5g2i2i7i1e5h1h5h5c9a0i5b4j2h2h5h5h5h7h3b7h3h3i0i0b0h5h5g8a4b8b5f8i7i8h3h5h5b0g9h3f9i9i9e1c2d7h2h5h5h5b0h5h3h3h3a5h5h5b0e1i2i1i1j0i7h7h5h5h5h7b7h3h3h3b7h5h5h5h6i2b5f7j3g0h9i3i8c0c1f1b9b9d7b5f8f8b8b2", +"a2a7a6a9b3e4c1c6c6c1c1c1d2c9f3h2h5h5h8i4j0g0g0g4f3h7h5h5i2g4g1j2g1i7g7c8d2b1h5h5c9a4h9f8g0g4d9h7h5h5g0f7b6j3f7i7g7e0c4c2b9i0h5h5h5h5h5h5h5h5i0i3i4f7i1e9b4j4e1h2h5h5h5h5h5h5h5h5h5h5h5h5b0h6i5i2a0i7i5g1j2g0b4b8i7i6e1c3h8h5h5h5h5h5h5h5h5i0h8a4b2j1i7b8b4g0i5g5d7i0h5h5h5h5h5h5h5i0b0i5b2i9j0f0g3g9h5h5i9g0g4j3e8j0i6f1h6h5h5b0i9i6e0f6d8d4d1c6c8c9d2h2b0h5h5g0b5j1f0j2b4f0j1i3f1e1d8d4d8e1g3g3g9h5h5h5b2b6f0e1i0h5i0i0h5h5h5h5h5h5h8i5i4i1g4f8j4f7g8h5h5i0h5h5h5h5h5h5h5h6a4a4i7f7g0b5g4i9c2i0h5h5h5h5h5h5h5h5i0i3i4b8i7f7j3j4g0i7i6h8h5h5h5h5h5h5h5h5h5c9i2i5j1f7a2g9h5h5i3e8f0b4g0h9h8h5h5h5h5h5h5h5i0h8j3h5h5c9a4j2j2f0i7i6f9i0h5h5h5h5h5e5j1f1c5e7c7h6h5h5h5h5h5h5h5h5h5b0i5i4i7i9g4b6j0a3h8h5h5h5h5h5h5h5h5h5b0c9i2b5h9f8j4b5j0g5g7d5d1c6c8c9c2e8e8e8b6b2", +"a2a7a6a7b3f3c9d4d1e6g2f6c9e2c9c8h8c9i9a4i5j2g0j0i6h6g8c9i2j1b6j2g4i1i8d7d2d3h8c9i9g0i5b4f8h9i3g8h6c9i2g4f8j4e9i1f1f5d5c4c3i3c9i0h5h5h5h5h8e5b2i4i7i9b8b4j4g0i5c2h6c9c9c9c9c9c9c9c9c9i3j3i2i4j3i9i1g4g0b4g0g0f0i5i9f1e1f5e6e1h8h5h5h5h5b0h6i9i2j4i9i7f0b4j2f0i1g7g3i3g8i0i0h5h5h5h8e1i2i4i7j0b8b4f8g2g8c9a4f7b8j3f0i7i3e0e1c1c9c9i3i5i3e1g3d1e3c5c5c9g2d7h8g8i3i2j1g4j2j4f8j0g5e1d5c4d7e6e6c4e5g6c2h6c9c9a4b6f0h9i9c9i0h5h5h5h5b0g8i5i4a0i9i7e9j2j2g4i9g5h6h5h5h5h5h5h8c9g0i2g0i7i5g0j2b5i5g5e1i3c9i0h5h5h5h5h8e5b2i4i5i1g1b5j4j3g4i9f1e1e1h8h5h5h5h5b0g8b8i4g1i9g1j2j3i9g8c9g0f7f0j4f0j1g7e1h8h5h5h5h5h6i9i2j1h6c9i9a4j4j3e9i1g7g3h6h8h5h5h5h5i5f7f1d5e6d6e6g2h8i0h5h5h5b0h8i3i2b2j1i9g1b5j2e9i1i3i3h8h5h5h5h5h5h8e1a4i4f7j1g1j3j4g0h9i6e1c3e3c5c5c9e0b5g0f0f0b2", +"a2a6a6a7b7f2c1d5d5d1g3c9d3c5d9e5d5i1j0h9g4j2g0i7g7d5i3i7g4i7e8f8j0i9f1d9e4e7e0j0g1i5g4j2e8j1g7c3i8i5b6h9b5j3g1i9i8d8c1c3e6e1i3j3i2i9g0i2i4a4g4i9h9b8b5j3j3g4i1g7g5h9f7j3a4b2a4a4j4b5g0g1h9h9h9i7g1j2a0j4b6g4j0i9i3f5g2c9d7e0h9b2g0i9i2i2i4j3i7i1h9b8b5b4e8j0i6d8d0e1i3g0i2i9i2i2i2a4i5i9i5e8b4b4b6i5i9i5b8h9b8j3b6j1i8e1e5e1h9j3a0g0i9i3d8c3c5c7c0d4d5c4e1i9h9i1j1f0j4b4g1i1f1d8e5d7e4c8e3c1d6f4c9f6j1f7g0f0g0g4i9g5j3i2i5g0i2i2a4g0i9i9i7f7b5b4b6j0i6i8i3a0i2i9a4i2i4a4i5i9i7g1g0j3b4f7i7g7f5d5g7j3i2i9g0i2i4a4f7i7h9b8g0j4j3b8i7i6e0d8e1i5b2g0g0i2i2b2j3i9i7g1b5b4j2g4i9f7f7i5f0b4g4i9i8e1i9a4i5a4i2i2g0i9i9i5a0a4a4b4j2f0i9g7d5d9i6a0i5a4i2i2i5i6e1d4d7c2d5i9a4g0i5i2i2i2a0i5j1j0g1g0j3b5g1g5i8g7i7b2a4i9i2i2i2a4i5i7j1g1b5j3j3b8i1i3f5d4c5c7c0d4d5e8b8f0b6b2", +"a2a6a6a7b3d2d0e0c1e5f6d2d7d9c4d1c4c8f1g5g4g0f0i7i8c4e6c3i3i7f0f0i5a2e1d9e4d9d4e0i8i1i5g0f7j1i8d4c2e1i3i7b8b5i5g5i8d4f6d0c2c3f1g5i7b8b4e9j0h9j0i5b5j3j4j4b8i7i6e1c4f5g7j1b6j4j4j2e8e9g1b8e8e8e8b6j4a0j3e8j0a2g5i6g2c3d5d2c2d0g7i1g4b8b5j0h9h9j0f0e8j2b4e8g4i9f1e6d4g3f1f1i9i5j4b6g4g4i5e9f8j3j4g0i5i9g7e1i3j1f7g0g1i9i8d4e6c3f1g5i5g1h9g5e1c0d7e7d5d5d4d8c5e5e1i6h9e8b4e8h9i6e1e5e6d6c7e5e5c5d6d2e6d8e1i8a2j0g0f7i9i3g5g5i5g0g0g1i5i7i5g4b8b5j2b5i5a2i8d5e1g5j1g1j3b8g4j1i7j0b6b4j4j4b8j0g5i8g3e5e0g5i7f7j3b8j0i5i5f7g0b5j3j3b6h9g5g7c1c5d1e1g5h9b4b4f7g1i5g1e8j2j3b4f0h9i6g7i3i9f7g0g4i9i8g3d8i8i5j4j2g1i7j1g4g0g0j3j3g0j2g4i9g7g3b9d4e1a2b8b5b5g1j1i6f1d5c4c0g3a2i5g0e8i5h9i5g1f7g0b5b4b5e9i7i3f5e1i8i9i5g0j3g1i5i5i5g1b8b5j3j3e8j0i6f5e5d7c8e7d5d5d4j2b8b8e8b2", +"a1a6a6a8b7e5c4f6c1e6c2d6c9e7d1c0d7c5d8i3i1g1g4a2e1d4e6d8g7i9i5j0h9i6d4f2d7c7d4d5f1g5j1e9i5a2i8d4d4g2g7i1i5g1i7i3f1d5e5d0c2c4d5i8g5j1g4f7e8e8f8b4b4b5e8b8j1i6e1c3c1e6f1a2i5e8b5f8f8b6g0b5j2g0b6f0b5e8g4j1i6i6i8e1d4c1c2d6c7d6e1i3a2h9f7b6b6e8j2b5j2b5f0i5i9g7d8d6c3d4e6d4g7i9f7e8b5j2g0j3j3b4f8i5i1i3e1e1g7g5j0e9i5g5e1c4c2c4d8i8i9i7j0i9g7f6e3e5c2c8d7c4c5d7d8i3i1g4f0i5i9i8d5c5d7d3c2e6e6c9d2d2d5d8d5g3e1i7f7g4i9g7f1g7i1i5f8b5b8e8b5b5j2g0b6j0i9g7d8d5f5e1g5i1f0f8e8b6g0g0j3j3b4e8h9i9g7g2c0e5g2i8g5j0g1b8g0g0j3j3j3j3g0f7h9a2g7c3c2c8c2c0e1i9j0e9b6g0g0g0j3b4b5g1i7g5i8d8f1g5i7g4h9i6e1c1c8d5i1g4b6b6f0b5j3j3g0g0e9g1f7i7i9f1c1c9d0c3g7i1g1b8f8f0h9g5f1d1e5c2i3a2i7g4f0e8j2b4j3j3b5f8g1j1i6e1g2c3e0i3i9j0b6f8j2g0b4b5j2j3g0b6i5g5e1c1c2c9b9e6c2c8d7g0b8f0e8b2", +"a1a6a9a8b7e5c3e6e6c6c5d9c9e5e5d1d6c5c0d8i6i9i9i6e0d4c2d5f5i6i9i9i9g7d0d9f2d7d4f5e0g7i6i1i9g7f5d1d4d4e1i3i9i7i9i8g2d4c3c6c2g2e1f5e0g7i1j0g1f0e8e8f0g4i7a2i6e1f5e6d6d0g3i3i9h9j0h9j0h9i5j0i5j0i7h9j0h9g5g7c3d8e0e5e6c6c5d9c9c4d4e0f1g5i7j0g1b8b6b6f0i5i7a3i8e1d4c9e5d1c8e3d4g7i7g4b6e8b6b8f0g4i7i9i3e1e0f6e1i3i9i9i9i3e1e6c2g2e1d8e0i6i9i9i3f5e5c2d7d6b9b9c0e6g3e1i6i9j1i9i3d8e6g6d7f2e3c8e3c9g6d7g3f5e3e5e5g5i7i1g5e1g3d5g7i1i5f7f0b6b6f0g4j0j1a2g7e0c4c3c2f5f1g7i7g4g1f7f0f0f8b6g4i7i6i8f5c1e3e6f6f5g7i6j1g4e9b8f8f8g0g1j0i7i9i8c0d7c6d7d7e3g2i8g5j1i5g1f8b6e8g1h9i1i6i8d8d5d5d8g5a2a2i8d5c8d9d4i6i1j1i5g4e8g0f0i5h9i1i9i1i1i6e1c5c8e3c5g3i6i9g4f0f0j0i9f1e0c0c7d8g7i6i9j0f0f8b5f8b6i5h9i9g7f5f6c3c4f5d8g7i9i7g1b6g0g0b8f7b6g1j1i3e0c3c6d7c9c5d7d7c8b9f0b8b8e8b2", +"a1a6a8a8b3c4d4c1e6c7e6e7e7c0e5d9e4c7d7c0f5i8g7f1f5d1c3e5c0e1g7i8g7f1d0c9d9d9f6d5f5e0f1g7i8e0d4d1c2e5f6e1g7i6g7e0c3c3c6d0c5e1e0d4e1d8i8i6i9j1i1j1i1g5i6f1d8g3d0c7d7c5d1d8g7i6i6g7i6g5g5i3i6g7g5a2g5g7d8g3d4c3c3e6e6c7e6e7e7c0e5c2e6d8g7g5i9i1i7j1i1a2i6i8d5c4e5c9d1f6d7d6e6d4i6a2j1h9i7j1i9g5i3g7f5f6c1g3d5e1i8i6g7i8f6d0c5e1e0d4f1e1g7g7f1d8e6d7d7c8c7c9d7c1c1c0e1g7i3g7e1c3e3f2d9c2e6f2e4e2e5d5f5e5c8c2d5f1i6i3i8c3d1c2d4i3g5a2i9i1i1i1a2i6i3f1f5c3d5e6c2c4g3f5i6i9i9i1i1i1i7j1a2i6e1c3c2c7d7c1c2c4c3e1g7i9i9i7i7j0j1i9i6g5g7d5d8c2c5d7c8c2e6e5e1g7g5i9j1i7j1a2i6i8e1f5c4c4e6e6d8g7g7c3c5f2c4d8f1f1i3a2i1h9h9i1g5g7g7f1i8i6f1e6c9c9d9c5c6g3i3a2i1i7j1g5e1c3e5d6c3e1e0i8i6i9h9j0h9i7g5i3e1d5c1d1c2c1d0f5d8g7i3i9i1h9h9i7i1i7i9g7g7d4d0d7c8c2d7d7d7d6c7f7b6e8b6b2", +"a1b0a8a9b3f6d7c2c6d7d7e7c4d4e5e7d9e2e4d7c6e6g3d1c2c4c1d4c6c0d8e1d8d8c9b9c6d6f6c4d5d8d1d4d4c0d4c6c2c2c2f5g2e1d5g2c1c1c6c1c3c4e6d1e5g2d5f5e1i8i6g7i8g3d8c1c1c1c7c5d7e6c4c3d5e1d1g3e1e1e1g3d4d4e1e1f1c5c2c6c1f6d7c2c6d7d7e7c4d4e5d6c7c8e5d8e1e1i8i8e0f1e0f5c1c2c0d1d0d5e7b9c6c2e1f1i3i6i8i8e1e0e0c3c1e6c5c3c1g2g2e0d5d5c1c1c3c4d0d1e5g2d5c3f6c4g3c2c2e4c5c9e3e6c7c1c1d8d8d8e5e5f2c7c2d0d0d9d3b9e6g3f5e4c7e3c4d8f6d8f5c1c2c9d5e0e1e0e1e1e1e1e0c3d4e5c2c0c1d4c2c2d4f5d8g7d8e1g7f1i3g7i8f1e5c6c7d7c1c6c2c5c6f5g2f1i8i3g7i3i8f1e1d8d4c3c2d1c5c7c8d7c3c1d4e5f1e1i8g7f1f1d8d8c3c4e6d0e4c5c3d8d8e6d9b9e6d5d8c2c3e1g7i6i8i8e1g3f6c0e1e1g2d7d9e2e4c9d7c2d5d8e1i3g7i8c3c0d4d1e5f5c5c0e1e1i6i3i6i3e1f5c1c2e5c6c2c2c5c3e5d8f5i8i8i3g7g7i3i8e1d8d4c3c2c8c8d7d1c2c2b9c5f7b6e8f0b2", +"a1b0a8a7b3d5c5c6e3d7d9e5d4d1e7d6f2f3d2e4d7c5d0c4e5d1e5c2d7e5e5e5d4c2e3e7c8e3d4d1d5f5e3c6c2c1c2e5e3e6e5e5c3e5g2e5e3c6e6c2g2c2c2c5c5c0c6e5e0d5e1d5c0c4e6c1e3c6c7b9c7c7c8d0e6c2c7d4c4c4e6c8d9d2d5e1d8b9c7e5c1d5c5c6e3d7d9e5d4d1b9d6g6g6e4d7e6d1c3g3c3g2d4c6d7e5c6d0c0e3c8e7c8e3c3g3e0e1d4d1c0c0c1c4e3e6e5c1d4c2g2c4c2c1d0c2g2c2c2c5c5c0c6e6e0c1d5c2c8d7c5e6d7c6d7b9e3c5c2c1c6d7e7e6d0e6c7b9g6d2d4d8d8b9c9e5c1d5d0e5c6e3d6e5c3c3d7e6c5d7d9c6c2e6e6c0d0d1e5c2d7e5c6d0d4c1c0c1c4c3e0d8d8d8d7e3d7c5c5e5e3e6e5e5c3e5e0g2d4c3c3d4e0c2e6c5c5e5c5c2f5e6d5c6d7e6c1c3d4d5e5d7c2c5c8e6c5d7e7d0c1c4c2b9e4d2c3d8d8b9d7d5g3e1d4d4c1c6d6d1d5c3d6d6f2f3d2b9d9d7d0d5d5e0g2d1c6d1c6d0e5e3c8d7d0c0e0e0e1e1e6c6e3c2c2e5e3e6e5c1d1c2e0d1c4c3d5c3e1c1c1c6c5e5c5c2f5e6d5c6c8d7c5e8b6e8f0b2", +"a1a8a7a9b3b9e3c5c8c8e2e5d1d3g6e4d2g6d2g6d3d2d9d6c6c0d7d1c5d0f5c0e3e7d7e7d6d6e5c3d5d5d7c8c7e3c1c1d7c6c6c2d4c3c6c4c3e5c6c1c2c7e3d0c4d7c3g2c3e5d5c1c8d3c5c5c8d9d6c8e3c5d7e5e6e6c2d0c1e3b9d7c9d2d5d8d4c9d1d0e6b9e3c5c8c8e2e5d1d3g6e4d2g6d2g6d3g6d6c7c1e5d7d1c5c1f5c0e3e7d7e7d6d6e5c3d5f5c5d7c7e3c1c1d7c6c6c2d4c3c6c4c3e5c6c1c2d7e3d0c4d7c3g2d4e6d5d0c7d3c5c5c8d9e7d7e3c5d7e5e6e6c5d0c1c5b9d7c9d2d5f5d4d6d1d0e6d9e3c5c8c8e2d0d1d3g6e4d2f2f3g6d3d2d9d6c6c0d7d1c5c1f5c0e3e7d7e7c7d6e5c3d5f5d7c8c7e3c1c1d7c6c6c2d4c3c2d1d5e5c6c1c2d7e3d0c4d7c3g2d4d0d5d0c7d3c5c5d7d6e7d7e3c5d7e5e6e6c5e6c1c5e4d7e7d2d5f5d4c9d1d0c1b9e3c5c8c8d2c0d1b9g6e4d2g6d2g6d3d2d9d6d0c0c5d1c5d0f5e5e3e7d7e7d6c7c4g3d5d5d7c8c7e3c1c1d7c6c6c2d4c3c5c4c3e5c6c1c2c7e3d0c4c5d4g2d4d0d5d0c7d3c5b6b6f0f7b2", +"a2a8a6a7b3d9c2c2c8c8c1e5c4g6d9e2d2d2d2e4d3d2b9c1e5c5c3c5d1c7f5d0g6c9b9d6c2e7e5f5c3c0e7d6c9e6d7c1d7e3c6d4d0e5c1c6c1e3e6c1c8c5c8c1d7d4e5f6c2c1e6d7b9c5e3d7e4c9c7d7d7c2d0e6c6d0e5d0e6b9e4d6c2e4d8d5c7c9c3c4e5d9c2c2c8c8c1e5c4g6d9e2d2d2d2e4e4d2b9c1e5c5c3c5d1c7f5d0g6c9b9d6c2e7c4d8f6c0e7d6c9e6d7c1d7e3c6d4d0e5c1c6c1e3e6e5c8c5c8c1d7d4e5f6c6c1e6d7b9c5e3d7e4c9c7d7d7c2d0e6e6d0d0d0e6b9e4d6d7e4g3d5c7c9c3c4e5d9c2c2c8c8c1e5c4g6d9e2g6d2d2e4e4d2b9c1e5c5c3c5d1c7f5d0g6c9b9d6c2e7e5f5f6c0e7d6c9e6d7c1d7e3c6d4d0e5c1c6c1e3e6c1c8c5c8c1d7d4e5f6c6c1e6d7b9c5e3d7e4c9c7d7d7c2d0e6e6d0d0d0e6e7f2c9c2e4d5d8c7c9c3c4e5d9c2c2c8c8e5c1c4g6d9e2d2d2d2d3d3d2b9c1e5c5c3c5d1c7f5d0g6c9b9d6c2e7c1f5f6c0e7d6c9e6d7c1d7e3c6d4d0e5c1c6c1e3e6e5c8c5c8c1d7d1e5f6c6c1e6d7b9c5e3b6f0f0b6b2", +"a2a8a7a6b3c8e6d9e3c7f6c0c9d3c9g6f3d2f3e4d2d2b9e6c6c9e2c5c5b9d0e5d2g6d3b9d6c9c6d8d4c9c9d6d6c2e3d0e3c2c0c2f6c6d4c2c8c1e6c6e3c1c5c3d4d1d4c5e6e5c7d7e3c2c2b9d3b9d6c8c2d6c1c5d0d0d0e6e3f2c9c8c8d2d5d8c8c9c4f6c7c8e6d9e3c7f6c0c9d3c9g6f3d2d2b9d2d2b9e6c6c9e2c5c5b9d0e5d2g6d3b9d6c9c6d8d1c9c9d6d6c2e3d0e3c2c0c2f6c6d4c2c8c1e6c6e3c1c5c3d4d1d4c5e6e5c7d7e3c2c2b9d3b9d6c8c2d6c1c5d0d0c1e6e3f2c9d7c8d2d5d8c8c9c4f6c7c8e6d9e3c7f6c0c9d3d9g6f3d2d2b9d2d2b9e6c6c9e2c5c5b9d0e5d2g6d3b9d6c9c6d8d4c9c9d6d6c2e3d0e3c2c0c2d4c6d4c2c8c1e6c6e3c1c5c3d4d1d4c5e6e5c7d7e3c2c2b9d3b9d6c8c2d6c1c5d0d0c1e6e3f2c9d7c7d2d5d8c8c9c4f6c7c8e6d9e3c7f6c0c9d3d9g6f3d2f3b9d2d2b9e6c6c9e2c5c5b9d0e5d2g6d3b9d6c9c6d8d4c9c9d6d6c2e3d0e3c2c0c2f6c6d4c2c8c1e6c6e3c1c5c3d4d1d4c5e6e5c7d7e3c2c2f0f0f0f0b2", +"a2b0b0a8b3d5d5c1e3d4e5d1d6d7d9d3d2e2d2g6g6e3d7e7d7c9e4c4e2b9c4c3f4b9c2c9e3d4c4d8c1c7d6c9c2d7c6c1c1e5c2d1c1c1e5c6c7e3e6c5c2d8e0e0f6c4e6c0d4c3c7c2c2c2c9d7d3b9c7c2c2d7e6d7d0e6e3d7d6d7c7c8e7d0e6d4c8d6b9d7c8d5d5c1e3d4e5d1d6d7d9d3d2e2d2g6g6e3d7e7d7c9e4c4e2b9c4c3f4b9c2c9e3d4c4d8c1c7d6c9c2d7c6c1c1e5c2d1c1c1e5c6c7e3e6c5c2d8e0e0f6c4e6c0d4c3c7c2c2c2c9d7d3b9c7c2c2d7e6d7d0e6e3d7d6d7c7c8e7d0e6d4c8d6b9d7c8d5d5c1e3d4e5d1d6d7b9d3d2f2d2g6g6e3d7e7d7c9e4c4e2b9c4c3f4b9c2c9e3d4c4d8c1c7d6c9c2d7c6c1c1e5c2d1e5c1e5c6c7e3e6c5c2d8e0e0f6c4e6c0d4c3c7c2c2c2c9d7d3b9c7c2c2d7e6d7d0e6e3d7d6d7c7c8e7d0e6d4c8d6b9d7c8d5d5c1e3d4e5d1d6d7b9d3d2e2d2g6g6e3d7e7d7c9e4c4e2b9c4c3f4b9c2c9e3d4c4d8c1c7d6c9c2d7c6c1c1e5c2d1c1c1e5c6c7e3e6c5c2d8e0e0f6c4e6c0d4c3c7c2c2c2c9b6f7f0f0b2", +"a2b0b0a8a5g2f5c8c2d4c4d9d7d7d2f2d2d2g6e4f2c5d7b9e6d3c5d7e4c4f5e5c9c6c2d7d5d1e5c1c4c9d7c6d7e6e6c6d4d4e5c6d0d4e3e3c6c6d7c2d0c3e0c2d0c1c4d5d5d1c2e6c2e7e3d9d3d2b9b9c9d3c8b9e3f2c9b9b9e2c7c7d2e3c1c9c8f3d3d7f5g2f5c8c2d4c4d9d7d7d2f2d2d2g6e4f2c5d7b9e6d3c5d7e4c4f5e5c9c6c2d7d5d1e5c1c4c9d7c6d7e6e6c6d4d4e5c6d0d4e3e3c6c6d7c2d0c3e0c2d0c1c4d5d5d1c2e6c2e7e3d9d3d2b9b9c9d3c8b9e3f2c9b9b9e2c7c7d2c5c1c9c8f3d3d7f5g2f5c8c2d4c4d9d7d7d2f2d2d2g6e4f2d7d7b9e6d3c5d7e4c4f5e5c9c6c2d7d5d1e5c1c4c9d7c6d7e6e6c6d4d4e5c2d0d4e3e3c6c6d7c2d0c3e0c2d0c1c4d5d5d1c2e6c2e7e3d9d3d2b9b9c9d3c8b9e3f2c9b9b9e2c7c7d2e3e6c9c8f3d3d7f5g2f5c8c2d4c4d9d7d7d2f2d2d2g6e4f2c5d7b9e6d3c5d7e4c4f5e5c9c6c2d7d5d1e5c1c4c9d7c6d7e6e6c6d4d4e5c6d0d4e3e3c6c6d7c2d0c3e0c2d0c1c4d5d5d1c2e6c2e7e3f0e9g1f7b2", +"a2b0b0a8a5c3c8c6c5e3c9c7d7f3d3d2g6g6d2e4b9b9d7d7b9d7c0b9c5c4e5c5b9b9d7d7c3c4c0c1c4d9c2c6c5e3c6e5d4d1c4c3c1d4c6c4d4d6c2d6c6d5f1d8e3e3e5d5d5c1c7c7c7c9e3c9d3b9f2b9d6b9d6b9d3e2b9g6c9f2b9d2d2e6c1c7c8e4b9c8d5c3c8c6c5e3c9c7d7f3d3d2g6g6d2e4b9b9d7d7b9d7c0b9c5c4e5c5b9b9d7d7c3c4c0c1c4d9c2c6c5e3c6e5d4d1c4c3c1d4c6c4d4d6c2d6c6d5f1d8e3e3e5d5d5c1c7c7c7c9e3c9d3b9f2b9d6b9d6b9d3e2b9g6c9f2b9d2d2e6c1c7c8e4b9c8d5c3c8c6c5e3c9c7d7f3d3d2g6g6d2f2b9b9d7d7b9d7c0b9c5c4e5c5b9b9d7d7c3c4c0c1c4d9c2c6c5e3c6e5d4d1c4c3c1d4c6c4d4d6c2d6c6d5f1d8e3e3e5d5d5c1c7c7c7c9e3c9d3b9f2b9d6b9d6b9d3e2b9g6c9f2b9d2d2e5c1c7c8e4b9c8d5c3c8c6c5e3c9c7d7f3d3d2g6g6d2e4b9b9d7d7b9d7c0b9c5c4e5c5b9b9d7d7c3c4c0c1c4d9c2c6c5e3c6e5d4d1c4c3c1d4c6c4d4d6c2d6c6d5f1d8e3e3e5d5d5c1c7c7c7c9d7f0e9f7g1b2", +"a2b0b0a8b3c6c6e5c5e3c7c8f2d2g6b9b9d2b9e4d6d7c5c9c0b9b9c0d0e5f5e3d7c3f5e0d8d5e5c0c0d9c7e3d7d6e5e6d4d1c6d4c5c0c3c2d7c7d7c2c1d8d8e5c6d7c2c0c3d7c9d6e3d7c9b9c9d6b9b9c8c8e4b9c7d3e2d6d3b9b9d2d2f4b9c5c7e2c9d7e5c6c6e5c5e3c7c8f2d2g6b9d3d2b9e4d6d7c5c9c0b9b9c0d0e5f5e3d7c3f5e0d8d5e5c0c0d9c7e3d7d6e5e6d4d1c6d4c5c0c3c2d7c7d7c2c1d8d8e5c6d7c2c0c3d7c9d6e3d7c9b9c9d6b9b9c8c8e4b9c7d3e2d6d3b9b9d2d2f4b9c5c7e2c9d7e5c6c6e5c5e3c7c8f2d2g6b9d3d2b9e4d6d7c5c9c0b9b9c0d0e5f5e3d7c3f5e0d8d5e5c0c0d9c7e3d7d6e5e6d4d1c6d4c5c0c3c2d7c7d7c2c1d8d8e5c6d7c2c0c3d7c9d6e3d7c9b9c9d6b9b9c8c8e4b9c7d3e2d6d3b9b9d2d2f4f2c5d7e2c9d7e5c6c6e5c5e3c7c8f2d2g6b9b9d2b9e4d6d7c5c9c0b9b9c0d0e5f5e3d7c3f5e0d8d5e5c0c0d9c7e3d7d6e5e6d4d1c6d4c5c0c3c2d7c7d7c2c1d8d8e5c6d7c2c0c3d7c9d6e3d7c9f7f0b6f0b2", +"a2b0a7a6b3d0e5e3e3e3c6c8d6c4d0e2b9g6d6d6d7e6b9c0d7c1b9b9d5c3d4c6g2d8d8d8e0c7e5e5f2c9d7d7d7e7c2d1d1d4d0d1d0e5c6c6e6c1d7d7c3e1c2c4e6c2e5f6d4c8c7c8c6c5e3d9c9c9e4d7c8b9f2c9d9d3c9c8e4b9b9e3c5g6e4e6c2e2d4d4c6d0e5e3e3e3c6c8d6c4d0e2f2f2d6d6d7e6b9c0d7c1b9b9d5c3d4c6g2d8d8d8e0c7e5e5f2c9d7d7d7e7c2d1d1d4d0d1d0e5c6c6e6c1d7d7c3e1c2c4e6c2e5f6d4c8c7c8c6c5e3d9c9c9e4d7c8b9f2c9d9d3c9c8e4b9b9e3c5g6e4e6c2e2d4d4c6d0e5e3e3e3c6c8d6c4d0e2f2f2d6d6d7e6b9c0d7c1b9b9d5c3d4c6g2d8d8d8e0c7e5e5f2c9d7d7d7e7c2d1d1d4d0d1d0e5c6c6e6c1d7d7c3e1c2c4e6c2e5f6d4c8c7c8c6c5e3d9c9c9e4d7c8b9f2c9d9d3c9c8e4b9b9c5c8g6e4e6c2e2d4d4c6d0e5e3e3e3c6c8d6c4d0e2b9g6d6d6d7e6b9c0d7c1b9b9d5c3d4c6g2d8d8d8e0c7e5e5f2c9d7d7d7e7c2d1d1d4d0d1d0e5c6c6e6c1d7d7c3e1c2c4e6c2e5f6d4c8c7c8c6c5e3f0e9f0f0b2", +"a2a8a7a6b3c2c6c9c8e3d7d7g6e6e6g6f3f2d7c7e3c2c5c2c5d7c1e5f5g3g3c2f5d8e6c1e6c6d5c6d2d2c6c2e7d9e3c3c3e5c1f6c6c1c8c5d0e5c0d7c2f6b9c2e5e6d1d4c2c7e3e3c1c1c1c8d6e7d7c7d6b9d3d6d3c9c7c9b9b9c8e6c8c9c7e3c1b9c4c4c2c2c6c9c8e3d7d7g6e6e6g6g6f2d7c7e3c2c5c2c5d7c1e5f5g3g3c2f5d8e6c1e6c6d5c6d2d2c6c2e7d9e3c3c3e5c1f6c6c1c8c5d0e5c0d7c2f6b9c2e5e6d1d4c2c7e3e3c1c1c1c8d6e7d7c7d6b9d3d6d3c9c7c9b9b9c8e6c8c9c7e3c1b9c4c4c2c2c6c9c8e3d7d7g6e6e6g6g6f2d7c7e3c2c5c2c5d7c1e5f5g3g3c2f5d8e6c1e6c6d5c6d2d2c6c2e7d9e3c3c3e5c1f6c6c1c8c5d0e5c0d7c2f6b9c2e5e6d1d4c2c7e3e3c1c1c1c8d6e7d7c7d6b9d3d6d3c9c7c9b9b9d7e6c8c9c7e3c1b9c4c4c2c2c6c9c8e3d7d7g6e6e6g6f3f2d7c7e3c2c5c2c5d7c1e5f5g3g3c2f5d8e6c1e6c6d5c6d2d2c6c2e7d9e3c3c3e5c1f6c6c1c8c5d0e5c0d7c2f6b9c2e5e6d1d4c2c7e3e3c1c1c1b6f0f7b6b2", +"a2a8a6a6b3c8d9d6c8c7d2f3e6e6e6f3c8c5e6e3d7d7d9c7c2e5c2e6d8d8c5d7c6c6d0c2c1e6d5c3c8c1d7d7e3c1f6d1g3c1e5g2d4c6c5c2d4c1c1e3e6c5c3c2d5d5g2e6d7c9c2c6c1c1e5c9e4d6d6e4c7c7d7c8c9e7c9b9d6c2e6c2d3c9f2e6d3e3f5c3d6c8d9d6c8c7d2f3e6e6e6f3c7c5e6e3d7d7d9c7c2e5c2e6d8d8c5d7c6c6d0c2c1e6d5c3c8c1d7d7e3c1f6d1g3c1e5g2d4c6c5c2d4c1c1e3e6c5c3c2d5d5g2e6d7c9c2c6c1c1e5c9e4d6d6e4c7c7d7c8c9e7c9b9d6c2e6c2d3c9f2e6d3e3f5c3d6c8d9d6c8c7d2f3e6e6e6f3c7c5e6e3d7d7d9c7c2e5c2e6d8d8c5d7c6c6d0c2c1e6d5c3c8c1d7d7e3c1f6d1g3c1e5g2d4c6c5c2d4c1c1e3e6c5c3c2d5d5g2e6d7c9c2c6c1c1e5c9e4d6d6e4c7c7d7c8c9e7c9b9d6c2e6c2d3c9f2e6d3e3f5c3d6c8d9d6c8c7d2f3e6e6e6f3c8c5e6e3d7d7d9c7c2e5c2e6d8d8c5d7c6c6d0c2c1e6d5c3c8c1d7d7e3c1f6d1g3c1e5g2d4c6c5c2d4c1c1e3e6c5c3c2d5d5g2e6d7c9c2c6c1c1e5f0f0f0f0b2", +"a2a7a6a7b3c8e7e7c8c7d2g6e6e6g6d9e5c5d7c2d7c6d9c9c2c0d1d1c6c1d7c6f6c4c0c5c4d7d7c7c2c4c5e6c5e5c3c3c3c4d0g2c4c3d7c2e6e6c6c5c1c2d5c5c4d5c1c6c5e3c6c1c2c5c6c2d7d6d7c8e2d7c7c9d9d7d9e3c5c2e3c1e4f2g6c9d3e5d5c6d6c8e7e7c8c7d2g6e6e6g6d9e5c5d7c2d7c6d9c9c2c0d1d1c6c1d7c6f6c4c0c5c4d7d7c7c2c4c5e6c5e5c3c3c3c4d0g2c4c3d7c2e6e6c6c5c1c2d5c5c4d5c1c6c5e3c6c1c2c5c6c2d7d6d7c8e2d7c7c9d9d7d9e3c5c2e3c1e4f2g6c9d3e5d5c6d6c8e7e7c8c7d2g6e6e6g6d9e5c5d7c2d7c6d9c9c2c0d1d1c6c1d7c6f6c4c0c5c4d7d7c7c2c4c5e6c5e5c3c3c3c4d0g2c4c3d7c2e6e6c6c5c1c2d5c5c4d5c1c6c5e3c6c1c2c5c6c2d7d6d7c8e2d7c7c9d9d7d9e3c5c2e3c1e4f2g6c9d3e5d5c6d6c8e7e7c8c7d2g6e6e6g6d9e5c5d7c2d7c6d9c9c2c0d1d1c6c1d7c6f6c4c0c5c4d7d7c7c2c4c5e6c5e5c3c3c3c4d0g2c4c3d7c2e6e6c6c5c1c2d5c5c4d5c1c6c5e3c6c1c2c5c6b8b6f0b6b2", +"a2a7a9a8b3c7c9c7d7c7g6e5e6c1f2d9c4c4e6e3c5c5b9b9e5e5d9c1e5e5e3c3c6e5c1e5d0d1c8c5e5c6e5e6c1e5d4c0d5c3c0d8e5e5c2e3d6c6c5d6c2c7e4b9c2c2c1c2c6c2c1c1e3c5c6c4b9e5b9d7c7e3c5f2d7d9c7e6d0c5d2e4b9g6d2d3e5c4e3d7d6c7c9c7d7c7g6e5e6c1f2d9c4c4e6e3c5c5b9b9e5e5d9c1e5e5e3c3c6e5c1e5d0d1c8c5e5c6e5e6c1e5d4c0d5c3c0d8e5e5c2e3d6c6c5d6c2c7e4b9c2c2c1c2c6c2c1c1e3c5c6c4b9e5b9d7c7e3c5f2d7d9c7e6d0c5d2e4b9g6d2d3e5c4e3d7d6c7c9c7d7c7g6e5e6c1f2d9c4c4e6e3c5c5b9b9e5e5d9c1e5e5e3c3c6e5c1e5d0d1c8c5e5c6e5e6c1e5d4c0d5c3c0d8e5e5c2e3d6c6c5d6c2c7e4b9c2c2c1c2c6c2c1c1e3c5c6c4b9e5b9d7c7e3c5f2d7d9c7e6d0c5d2e4b9g6d2d3e5c4e3d7d6c7c9c7d7c7g6e5e6c1f2d9c4c4e6e3c5c5b9b9e5e5d9c1e5e5e3c3c6e5c1e5d0d1c8c5e5c6e5e6c1e5d4c0d5c3c0d8e5e5c2e3d6c6c5d6c2c7e4b9c2c2c1c2c6c2c1c1e3c5c6f8f0b8f0b2", +"a2a7a9a8b3d9c7c8d7c8c7d4e6g6e4c1c4c8e5d7d9c7c8c1b9c0e1d8g2c0d5e5c0c6e6c1c1e5d7c8c4c2e5g2d5d1d0e3c1c4d5c3c8d6c0c8d7c7c2d6c5e7b9b9d6d7c6c1c8e3e6e6c5c6e6e3e5d0c9c6c7c9c9d7d7c2c1d4d0c9d3b9d2e2f4d6c2e5d0c7c9d9c7c8d7c8c7d4e6g6e4c1c4c8e5d7d9c7c8c1b9c0e1d8g2c0d5e5c0c6e6c1c1e5d7c8c4c2e5g2d5d1d0e3c1c4d5c3c8d6c0c8d7c7c2d6c5e7b9b9d6d7c6c1c8e3e6e6c5c6e6e3e5d0c9c6c7c9c9d7d7c2c1d4d0c9d3b9d2e2f4d6c2e5d0c7c9d9c7c8d7c8c7d4e6g6e4c1c4c8e5d7d9c7c8c1b9c0e1d8g2c0d5e5c0c6e6c1c1e5d7c8c4c2e5g2d5d1d0e3c1c4d5c3c8d6c0c8d7c7c2d6c5e7b9b9d6d7c6c1c8e3e6e6c5c6e6e3e5d0c9c6c7c9c9d7d7c2c1d4d0c9d3b9d2e2f4d6c2e5d0c7c9d9c7c8d7c8c7d4e6g6e4c1c4c8e5d7d9c7c8c1b9c0e1d8g2c0d5e5c0c6e6c1c1e5d7c8c4c2e5g2d5d1d0e3c1c4d5c3c8d6c0c8d7c7c2d6c5e7b9b9d6d7c6c1c8e3e6e6c5c6e6b8b8b8f0b2", +"a1a7a9b0b3d6e7c5e3g6c1d4c7d2e2d6c5c2c5c7c8c5c0c1c5e5c4e0c4e3c0e6c1d0c8c4c1f6c2d4c5c1d5c6e6c6e3e3c5d5f5c1c1d6c1c6d7c8b9d9c7c9b9c2c2c5g2d4c5c3c4c5d7c1c1c8e5d1c6d6c5b9c5d6e3d1c1c2d7d3b9d6d2c9d3c4c2e5c6c7c9d6e7c5e3g6c1d4c7d2e2d6c5c2c5c7c8c5c0c1c5e5c4e0c4e3c0e6c1d0c8c4c1f6c2d4c5c1d5c6e6c6e3e3c5d5f5c1c1d6c1c6d7c8b9d9c7c9b9c2c2c5g2d4c5c3c4c5d7c1c1c8e5d1c6d6c5b9c5d6e3d1c1c2d7d3b9d6d2c9d3c4c2e5c6c7c9d6e7c5e3g6c1d4c7d2e2d6c5c2c5c7c8c5c0c1c5e5c4e0c4e3c0e6c1d0c8c4c1f6c2d4c5c1d5c6e6c6e3e3c5d5f5c1c1d6c1c6d7c8b9d9c7c9b9c2c2c5g2d4c5c3c4c5d7c1c1c8e5d1c6d6c5b9c5d6e3d1c1c2d7d3b9d6d2c9d3c4c2e5c6c7c9d6e7c5e3g6c1d4c7d2e2d6c5c2c5c7c8c5c0c1c5e5c4e0c4e3c0e6c1d0c8c4c1f6c2d4c5c1d5c6e6c6e3e3c5d5f5c1c1d6c1c6d7c8b9d9c7c9b9c2c2c5g2d4c5c3c4c5d7c1e5b6b8f8b8b2", +"a2b0a9a8b3c8e7e3c2c4c8c8d2d2g6c5e6e6c6c7d7c2c5c1e5c0d4e5e3c7g2c3e6e3c4c2e3c6c0f6f5e5c1c5c6d7e3e3c4f6g2e5c7c1c0c7d7c1d7d6c9c8g6c2d5c1e1g2d4c1b9c4c2d5d4c2d0c0e6c2c2b9c1d6c1d1c2g2c1b9b9c1e6d3c2d5d6d3d0c7c7c7e7e3c2c4c8c8d2d2g6c5e6e6c6c7d7c2c5c1e5c0d4e5e3c7g2c3e6e3c4c2e3c6c0f6f5e5c1c5c6d7e3e3c4f6g2e5c7c1c0c7d7c1d7d6c9c8g6c2d5c1e1g2d4c1b9c4c2d5d4c2d0c0e6c2c2b9c1d6c1d1c2g2c1b9b9c1e6d3c2d5d6d3d0c7c7c7e7e3c2c4c8c8d2d2g6c5e6e6c6c7d7c2c5c1e5c0d4e5e3c7g2c3e6e3c4c2e3c6c0f6f5e5c1c5c6d7e3e3c4f6g2e5c7c1c0c7d7c1d7d6c9c8g6c2d5c1e1g2d4c1b9c4c2d5d4c2d0c0e6c2c2b9c1d6c1d1c2g2c1b9b9c1e6d3c2d5d6d3d0c7c7c7e7e3c2c4c8c8d2d2g6c5e6e6c6c7d7c2c5c1e5c0d4e5e3c7g2c3e6e3c4c2e3c6c0f6f5e5c1c5c6d7e3e3c4f6g2e5c7c1c0c7d7c1d7d6c9c8g6c2d5c1e1g2d4c1b9c4c2d5d4b8b8e8b8b2", +"a2b0a9a9b3c7e3c5c8e6c5f9e4e7d7e5c8c8d7c7c2c2c1d4c5c6c2c6c0e5c4d4c4e3c2d7d7e3c0e5c5d7c6c2c5d0c5d5c4d4d1c5d6c8d5c1c2e6d5c6c7f2e4e1e1e0e0d5d4c4c1c4c1c1e5c4d7c9c5e6g3c6c6c0e6e6e7c2e6b9c1f5d5b9d5d5d9d3e6d7c7c7e3c5c8e6c5f9e4e7d7e5c8c8d7c7c2c2c1d4c5c6c2c6c0e5c4d4c4e3c2d7d7e3c0e5c5d7c6c2c5d0c5d5c4d4d1c5d6c8d5c1c2e6d5c6c7f2e4e1e1e0e0d5d4c4c1c4c1c1e5c4d7c9c5e6g3c6c6c0e6e6e7c2e6b9c1f5d5b9d5d5d9d3e6d7c7c7e3c5c8e6c5f9e4e7d7e5c8c8d7c7c2c2c1d4c5c6c2c6c0e5c4d4c4e3c2d7d7e3c0e5c5d7c6c2c5d0c5d5c4d4d1c5d6c8d5c1c2e6d5c6c7f2e4e1e1e0e0d5d4c4c1c4c1c1e5c4d7c9c5e6g3c6c6c0e6e6e7c2e6b9c1f5d5b9d5d5d9d3e6d7c7c7e3c5c8e6c5f9e4e7d7e5c8c8d7c7c2c2c1d4c5c6c2c6c0e5c4d4c4e3c2d7d7e3c0e5c5d7c6c2c5d0c5d5c4d4d1c5d6c8d5c1c2e6d5c6c7f2e4e1e1e0e0d5d4c4c1c4c1c1c0f8b6f7b8b2", +"a2b0a9a9b3d2c5c7d2e6c4e2d6d7e3d1c2e3c8c9d7d8d4c6c6c9c8c2c5c2c4d1c4c3d7c2c1c1e5c0c5c5c6c1e3e6e3c1c1c3f5e6c5c8d4c3c7c6d5c3b9c5b9e1e1c4g2c1c4c1b9c1c4c4c6c2c5c9c0d4c1c0f6d4e6g6d2e2d2e6d8d5e6d6f5f6f9d9e3c5e2d2c5c7d2e6c4e2d6d7e3d1c2e3c8c9d7d8d4c6c6c9c8c2c5c2c4d1c4c3d7c2c1c1e5c0c5c5c6c1e3e6e3c1c1c3f5e6c5c8d4c3c7c6d5c3b9c5b9e1e1c4g2c1c4c1b9c1c4c4c6c2c5c9c0d4c1c0f6d4e6g6d2e2d2e6d8d5e6d6f5f6f9d9e3c5e2d2c5c7d2e6c4e2d6d7e3d1c2e3c8c9d7d8d4c6c6c9c8c2c5c2c4d1c4c3d7c2c1c1e5c0c5c5c6c1e3e6e3c1c1c3f5e6c5c8d4c3c7c6d5c3b9c5b9e1e1c4g2c1c4c1b9c1c4c4c6c2c5c9c0d4c1c0f6d4e6g6d2e2d2e6d8d5e6d6f5f6f9d9e3c5e2d2c5c7d2e6c4e2d6d7e3d1c2e3c8c9d7d8d4c6c6c9c8c2c5c2c4d1c4c3d7c2c1c1e5c0c5c5c6c1e3e6e3c1c1c3f5e6c5c8d4c3c7c6d5c3b9c5b9e1e1c4g2c1c4c1b9c1c4c4c6b8b8f0f8b2", +"a2a8a9a9b7c5c7c9c9c9d9e4c7c5c6c1c3c2d6e3d7d5c1d7d7c8d6c8e7e6c5d5e6d1c6d6d0c1c0c1c2e3c4c0c6d7d6c6c3c4g2d7c5c6g2d4c8d7f6e1f2c4c3i3c1d5c4c5c5c3d5c4e4c5e6d9e5c9c1c3e6c0f6f6d6d2d2f2d2f5d8e6f2e4d5d5f9e7c5d7e4c5c7c9c9c9d9e4c7c5c6c1c3c2d6e3d7d5c1d7d7c8d6c8e7e6c5d5e6d1c6d6d0c1c0c1c2e3c4c0c6d7d6c6c3c4g2d7c5c6g2d4c8d7f6e1f2c4c3i3c1d5c4c5c5c3d5c4e4c5e6d9e5c9c1c3e6c0f6f6d6d2d2f2d2f5d8e6f2e4d5d5f9e7c5d7e4c5c7c9c9c9d9e4c7c5c6c1c3c2d6e3d7d5c1d7d7c8d6c8e7e6c5d5e6d1c6d6d0c1c0c1c2e3c4c0c6d7d6c6c3c4g2d7c5c6g2d4c8d7f6e1f2c4c3i3c1d5c4c5c5c3d5c4e4c5e6d9e5c9c1c3e6c0f6f6d6d2d2f2d2f5d8e6f2e4d5d5f9e7c5d7e4c5c7c9c9c9d9e4c7c5c6c1c3c2d6e3d7d5c1d7d7c8d6c8e7e6c5d5e6d1c6d6d0c1c0c1c2e3c4c0c6d7d6c6c3c4g2d7c5c6g2d4c8d7f6e1f2c4c3i3c1d5c4c5c5c3d5c4e4c5c6f0b8b6b8b2", +"a2b0a9a8b3c5c7d4e5d9d9e4e4e6e5e6c1e3c7c5e6c8c8c1c1c8c8e5e5d8f5c4c2d7d6c7d0c4d5c5d7e3c6c5c1d0d5c3d4d5c5c2g2e6c0e0c6f6g2e6c5d5e1g2c4c2c1c4c2c5b9c4d7b9c2c5e6c6c2d0d1c0c4c6e7c5e6c1c2g3e1e5d2g6d8f5f9d9c2d7d7d7c8d4e5d9d9e4e4e6e5e6c1e3c7c5e6c8c8c1c1c8c8e5e5d8f5c4c2d7d6c7d0c4d5c5d7e3c6c5c1d0d5c3d4d5c5c2g2e6c0e0c6f6g2e6c5d5e1g2c4c2c1c4c2c5b9c4d7b9c2c5e6c6c2d0d1c0c4c6e7c5e6c1c2g3e1e5d2g6d8f5f9d9c2d7d7d7c8d4e5d9d9e4e4e6e5e6c1e3c7c5e6c8c8c1c1c8c8e5e5d8f5c4c2d7d6c7d0c4d5c5d7e3c6c5c1d0d5c3d4d5c5c2g2e6c0e0c6f6g2e6c5d5e1g2c4c2c1c4c2c5b9c4d7b9c2c5e6c6c2d0d1c0c4c6e7c5e6c1c2g3e1e5d2g6d8f5f9d9c2d7d7d7c8d4e5d9d9e4e4e6e5e6c1e3c7c5e6c8c8c1c1c8c8e5e5d8f5c4c2d7d6c7d0c4d5c5d7e3c6c5c1d0d5c3d4d5c5c2g2e6c0e0c6f6g2e6c5d5e1g2c4c2c1c4c2c5b9c4d7b9c2b6b8b8b8b2", +"a2a8a9a8b3c4b9d4f6c7d9g6g6c9d7c2d7c2d7e6c4c6e5c1e5d3e3c6e1e1f5c2e6d6e7d6d1c3c1e3c2e6c5c6c1d4f6d5c3e6c1e5e1d4d7c3d0d1d4c2c1e1e1c2c5c4c1c4c5b9c0c5c5b9e5c5d9e5e6d1c6e5c1c1b9c8c4e5c1d8f5g6d2c2d8d5d2c8c2c7e6e5b9d4f6c7d9g6g6c9d7c2d7c2d7e6c4c6e5c1e5d3e3c6e1e1f5c2e6d6e7d6d1c3c1e3c2e6c5c6c1d4f6d5c3e6c1e5e1d4d7c3d0d1d4c2c1e1e1c2c5c4c1c4c5b9c0c5c5b9e5c5d9e5e6d1c6e5c1c1b9c8c4e5c1d8f5g6d2c2d8d5d2c8c2c7e6e5b9d4f6c7d9g6g6c9d7c2d7c2d7e6c4c6e5c1e5d3e3c6e1e1f5c2e6d6e7d6d1c3c1e3c2e6c5c6c1d4f6d5c3e6c1e5e1d4d7c3d0d1d4c2c1e1e1c2c5c4c1c4c5b9c0c5c5b9e5c5d9e5e6d1c6e5c1c1b9c8c4e5c1d8f5g6d2c2d8d5d2c8c2c7e6e5b9d4f6c7d9g6g6c9d7c2d7c2d7e6c4c6e5c1e5d3e3c6e1e1f5c2e6d6e7d6d1c3c1e3c2e6c5c6c1d4f6d5c3e6c1e5e1d4d7c3d0d1d4c2c1e1e1c2c5c4c1c4c5b9c0c5c5b9e5b8f7b8e8b2", +"a2a8a8a8b3c7e7d5e5b9d9g6f2f2f2d7d7d6c1d7c4c3e5c3e4b9c7e5e0g2g2e6c7d7d6c6c3e6d0c5c1c0c2e6c3c4d5c3d4c1c6g2e1e0c2f5c3c1g3d7d1e1c4b9c4c5c5b9c4c2c5b9c4e2b9c5c6c5d1d1c9c5c5d7d6d7d6c1e6d5d0e4d2d1c3c6g6c7c7d7c5c7e7d5e5b9d9g6f2f2f2d7d7d6c1d7c4c3e5c3e4b9c7e5e0g2g2e6c7d7d6c6c3e6d0c5c1c0c2e6c3c4d5c3d4c1c6g2e1e0c2f5c3c1g3d7d1e1c4b9c4c5c5b9c4c2c5b9c4e2b9c5c6c5d1d1c9c5c5d7d6d7d6c1e6d5d0e4d2d1c3c6g6c7c7d7c5c7e7d5e5b9d9g6f2f2f2d7d7d6c1d7c4c3e5c3e4b9c7e5e0g2g2e6c7d7d6c6c3e6d0c5c1c0c2e6c3c4d5c3d4c1c6g2e1e0c2f5c3c1g3d7d1e1c4b9c4c5c5b9c4c2c5b9c4e2b9c5c6c5d1d1c9c5c5d7d6d7d6c1e6d5d0e4d2d1c3c6g6c7c7d7c5c7e7d5e5b9d9g6f2f2f2d7d7d6c1d7c4c3e5c3e4b9c7e5e0g2g2e6c7d7d6c6c3e6d0c5c1c0c2e6c3c4d5c3d4c1c6g2e1e0c2f5c3c1g3d7d1e1c4b9c4c5c5b9c4c2c5b9c4e2b9b8b8b8g0b2", +"a2b0a8b0b3e6e3e6d7d6f3g6b9e7d6d7d7d7c2c1f6f6d1d1c0d9c5e1d8e0d0c7d4f6c1c4e6c5c1e3d5e5e6d5g3d5c4e5c0c2e6e0d8d5e0c8d9d7c2c9e0c4c2b9c4c5c4c2c4c5b9c4c5b9c7e5c5e5c6b9d6c5e6b9c6e3c1d0c2g6e7e4e5c1d5e3f2e7e7d9c7e6e3e6d7d6f3g6b9e7d6d7d7d7c2c1f6f6d1d1c0d9c5e1d8e0d0c7d4f6c1c4e6c5c1e3d5e5e6d5g3d5c4e5c0c2e6e0d8d5e0c8d9d7c2c9e0c4c2b9c4c5c4c2c4c5b9c4c5b9c7e5c5e5c6b9d6c5e6b9c6e3c1d0c2g6e7e4e5c1d5e3f2e7e7d9c7e6e3e6d7d6f3g6b9e7d6d7d7d7c2c1f6f6d1d1c0d9c5e1d8e0d0c7d4f6c1c4e6c5c1e3d5e5e6d5g3d5c4e5c0c2e6e0d8d5e0c8d9d7c2c9e0c4c2b9c4c5c4c2c4c5b9c4c5b9c7e5c5e5c6b9d6c5e6b9c6e3c1d0c2g6e7e4e5c1d5e3f2e7e7d9c7e6e3e6d7d6f3g6b9e7d6d7d7d7c2c1f6f6d1d1c0d9c5e1d8e0d0c7d4f6c1c4e6c5c1e3d5e5e6d5g3d5c4e5c0c2e6e0d8d5e0c8d9d7c2c9e0c4c2b9c4c5c4c2c4c5b9c4c5b9c7b8b8e8b8b2", +"a2b0b0b0b7d4d4e6e3c9f2d9d7c4d7d1c7c5c2c2d1e5d4d5c2e5d1g3d8c6c9d1c3d5c1c6c1c1d1c0d5c0c6d5g2e0c1c6e3c6e5d5f1d5e0b9c8c5c2b9e1c2d7c5c4c2c1c1e5b9c4c4c5c4c9d3f4d2f9g6e6c2d6c7e6f5d4c1d2d2d6d2e5c6c8d7f9e2d9d2d6d4d4e6e3c9f2d9d7c4d7d1c7c5c2c2d1e5d4d5c2e5d1g3d8c6c9d1c3d5c1c6c1c1d1c0d5c0c6d5g2e0c1c6e3c6e5d5f1d5e0b9c8c5c2b9e1c2d7c5c4c2c1c1e5b9c4c4c5c4c9d3f4d2f9g6e6c2d6c7e6f5d4c1d2d2d6d2e5c6c8d7f9e2d9d2d6d4d4e6e3c9f2d9d7c4d7d1c7c5c2c2d1e5d4d5c2e5d1g3d8c6c9d1c3d5c1c6c1c1d1c0d5c0c6d5g2e0c1c6e3c6e5d5f1d5e0b9c8c5c2b9e1c2d7c5c4c2c1c1e5b9c4c4c5c4c9d3f4d2f9g6e6c2d6c7e6f5d4c1d2d2d6d2e5c6c8d7f9e2d9d2d6d4d4e6e3c9f2d9d7c4d7d1c7c5c2c2d1e5d4d5c2e5d1g3d8c6c9d1c3d5c1c6c1c1d1c0d5c0c6d5g2e0c1c6e3c6e5d5f1d5e0b9c8c5c2b9e1c2d7c5c4c2c1c1e5b9c4c4c5c4c9e9g4g1g4b2", +"a2b0a8b0a5d4d1c6c1e6f2d9c8c4c2c6c7d6e5d0f6d1e0c8c2e6f6d8e1b9c7d4d5d0c0c6d0c4d5c3e6c1e6f5d8c1c8e6d6e6c4e0d5e5d8c6d7c2c5d5c2c5b9c5c4c2c1c4c2c4c4c2c4e4e3d2d2f4d2b9c6e6c9d7g3f5g3c9e5e6c9d3c7c5e5c9f2f4d7d6d4d4d1c6c1e6f2d9c8c4c2c6c7d6e5d0f6d1e0c8c2e6f6d8e1b9c7d4d5d0c0c6d0c4d5c3e6c1e6f5d8c1c8e6d6e6c4e0d5e5d8c6d7c2c5d5c2c5b9c5c4c2c1c4c2c4c4c2c4e4e3d2d2f4d2b9c6e6c9d7g3f5g3c9e5e6c9d3c7c5e5c9f2f4d7d6d4d4d1c6c1e6f2d9c8c4c2c6c7d6e5d0f6d1e0c8c2e6f6d8e1b9c7d4d5d0c0c6d0c4d5c3e6c1e6f5d8c1c8e6d6e6c4e0d5e5d8c6d7c2c5d5c2c5b9c5c4c2c1c4c2c4c4c2c4e4e3d2d2f4d2b9c6e6c9d7g3f5g3c9e5e6c9d3c7c5e5c9f2f4d7d6d4d4d1c6c1e6f2d9c8c4c2c6c7d6e5d0f6d1e0c8c2e6f6d8e1b9c7d4d5d0c0c6d0c4d5c3e6c1e6f5d8c1c8e6d6e6c4e0d5e5d8c6d7c2c5d5c2c5b9c5c4c2c1c4c2c4c4c2c4e4c5g1g4g4g4b2", +"a2b0b0a7a5c4d7c6c1d0e5d6c8e6c2c7c9e3c1c1d1d8c8c2e6f6d1c4c9g6d5d1e5e6c2c2c1d1c3d4c1c1c4c1g2c4c6d0c6c7e6f1c5b9c5c8c8c2e1e1c6c5c5c4c2c4d8c1c4c5c4b9c5d7c9e7d2d2d3c7c1c1d0c4d8d1f2c3f5d4c2e7b9e3d7c9e2d3c7d4d4c4d7c6c1d0e5d6c8e6c2c7c9e3c1c1d1d8c8c2e6f6d1c4c9g6d5d1e5e6c2c2c1d1c3d4c1c1c4c1g2c4c6d0c6c7e6f1c5b9c5c8c8c2e1e1c6c5c5c4c2c4d8c1c4c5c4b9c5d7c9e7d2d2d3c7c1c1d0c4d8d1f2c3f5d4c2e7b9e3d7c9e2d3c7d4d4c4d7c6c1d0e5d6c8e6c2c7c9e3c1c1d1d8c8c2e6f6d1c4c9g6d5d1e5e6c2c2c1d1c3d4c1c1c4c1g2c4c6d0c6c7e6f1c5b9c5c8c8c2e1e1c6c5c5c4c2c4d8c1c4c5c4b9c5d7c9e7d2d2d3c7c1c1d0c4d8d1f2c3f5d4c2e7b9e3d7c9e2d3c7d4d4c4d7c6c1d0e5d6c8e6c2c7c9e3c1c1d1d8c8c2e6f6d1c4c9g6d5d1e5e6c2c2c1d1c3d4c1c1c4c1g2c4c6d0c6c7e6f1c5b9c5c8c8c2e1e1c6c5c5c4c2c4d8c1c4c5c4b9c5d7c9f0g1g1f0b2", +"a2b0a6a6b1g4e9e9b6e8f0f0b8b8b8f0b8b8g0f8g0b8b8f8b5g0b5f0f0e9g0f8f0f8e8e8g0e8g0g0e8e8f8b8b5e8e8b6f8b6e8j2f0f0b8b8f0g0j3j3b8f0b8b8b8b5b8b8b8b8b8f8f0f0f0g1g1f0b6f8e8e8b8f8j2g0g1b8b8b8b8b8f0f0b6b6f0g1e8f8f8g4e9e9b6e8f0f0b8b8b8f0b8b8g0f8g0b8b8f8b5g0b5f0f0e9g0f8f0f8e8e8g0e8g0g0e8e8f8b8b5e8e8b6f8b6e8j2f0f0b8b8f0g0j3j3b8f0b8b8b8b5b8b8b8b8b8f8f0f0f0g1g1f0b6f8e8e8b8f8j2g0g1b8b8b8b8b8f0f0b6b6f0g1e8f8f8g4e9e9b6e8f0f0b8b8b8f0b8b8g0f8g0b8b8f8b5g0b5f0f0e9g0f8f0f8e8e8g0e8g0g0e8e8f8b8b5e8e8b6f8b6e8j2f0f0b8b8f0g0j3j3b8f0b8b8b8b5b8b8b8b8b8f8f0f0f0g1g1f0b6f8e8e8b8f8j2g0g1b8b8b8b8b8f0f0b6b6f0g1e8f8f8g4e9e9b6e8f0f0b8b8b8f0b8b8g0f8g0b8b8f8b5g0b5f0f0e9g0f8f0f8e8e8g0e8g0g0e8e8f8b8b5e8e8b6f8b6e8j2f0f0b8b8f0g0j3j3b8f0b8b8b8b5b8b8b8b8b8f8f0f0f0b2g1f0b6b2", +"a2b0a7b1b4f0g1e9f0b8f0g1b6b8b6b8b6j3g0b8j3b8f8b6g0f8g0f7f0f8b5j2b6b6b6e8g0f8f8e8e8g0e8f8e8b8b6g0b6b6b6j2j2b8f0f8g0b5j3g0e8f8e9b6b8f8f0f0f8f8b8b6b8e9f7f7f7f7b8b8e8b8b6b6e8e8g1g0g0f0b8b8b6b6b6b6f0f0f8f8b6g1g1e9f0b8f0g1b6b8b6b8b6j3g0b8j3b8f8b6g0f8g0f7f0f8b5j2b6b6b6e8g0f8f8e8e8g0e8f8e8b8b6g0b6b6b6j2j2b8f0f8g0b5j3g0e8f8e9b6b8f8f0f0f8f8b8b6b8e9f7f7f7f7b8b8e8b8b6b6e8e8g1g0g0f0b8b8b6b6b6b6f0f0f8f8b6g1g1e9f0b8f0g1b6b8b6b8b6j3g0b8j3b8f8b6g0f8g0f7f0f8b5j2b6b6b6e8g0f8f8e8e8g0e8f8e8b8b6g0b6b6b6j2j2b8f0f8g0b5j3g0e8f8e9b6b8f8f0f0f8f8b8b6b8e9f7f7f7f7b8b8e8b8b6b6e8e8g1g0g0f0b8b8b6b6b6b6f0f0f8f8b6g1g1e9f0b8f0g1b6b8b6b8b6j3g0b8j3b8f8b6g0f8g0f7f0f8b5j2b6b6b6e8g0f8f8e8e8g0e8f8e8b8b6g0b6b6b6j2j2b8f0f8g0b5j3g0e8f8e9b6b8f8f0f0f8f8b8b6b8e9f7g1b2f0b8b2", +"a1a6b1b4g0b6b5b8e9b5b6b6b8f0b8b8f8j2b8b8f8b5e8b6f8b5f0f7f0f7j2b5g0b8e8b8b8e8g0b8f8e8f8f0b5b6f0e8b8b6j2b6g0b6f8b8b5b4g0f7f8g1b8f0b6f0f7b8b5b8f7b8b6b6g1e9g1f0b6e9f0e9e8b6f8b6g1f8e8e9b8f0e8e8b6b6b6g0g0g0g0b8b5b8e9b5b6b6b8f0b8b8f8j2b8b8f8b5e8b6f8b5f0f7f0f7j2b5g0b8e8b8b8e8g0b8f8e8f8f0b5b6f0e8b8b6j2b6g0b6f8b8b5b4g0f7f8g1b8f0b6f0f7b8b5b8f7b8b6b6g1e9g1f0b6e9f0e9e8b6f8b6g1f8e8e9b8f0e8e8b6b6b6g0g0g0g0b8b5b8e9b5b6b6b8f0b8b8f8j2b8b8f8b5e8b6f8b5f0f7f0f7j2b5g0b8e8b8b8e8g0b8f8e8f8f0b5b6f0e8b8b6j2b6g0b6f8b8b5b4g0f7f8g1b8f0b6f0f7b8b5b8f7b8b6b6g1e9g1f0b6e9f0e9e8b6f8b6g1f8e8e9b8f0e8e8b6b6b6g0g0g0g0b8b5b8e9b5b6b6b8f0b8b8f8j2b8b8f8b5e8b6f8b5f0f7f0f7j2b5g0b8e8b8b8e8g0b8f8e8f8f0b5b6f0e8b8b6j2b6g0b6f8b8b5b4g0f7f8g1b8f0b6f0f7b8b5b8f7b8b6b6g1e9g1b2b6b2", +"a2b1a0j2e8e8f8b8b8b8f8b8b8b6b8b6b8g0b8b8b5b6b6f8f8f8g1e9g1g1j2b5b5f7f0g0g0b8g0e8b6b8b8b6f8b6f0b6b5b8b8f8b8e8e8f8j2j3b8b8f0g1b6f8b6g1b8g0f8b8f0f0f7b8b6e9g1e9f7f7e9e8f0e8g0b5g1f8e8g1b6b6b6b6b6b6g0j2b5f8e8b8f8b8b8b8f8b8b8b6b8b6b8g0b8b8b5b6b6f8f8f8g1e9g1g1j2b5b5f7f0g0g0b8g0e8b6b8b8b6f8b6f0b6b5b8b8f8b8e8e8f8j2j3b8b8f0g1b6f8b6g1b8g0f8b8f0f0f7b8b6e9g1e9f7f7e9e8f0e8g0b5g1f8e8g1b6b6b6b6b6b6g0j2b5f8e8b8f8b8b8b8f8b8b8b6b8b6b8g0b8b8b5b6b6f8f8f8g1e9g1g1j2b5b5f7f0g0g0b8g0e8b6b8b8b6f8b6f0b6b5b8b8f8b8e8e8f8j2j3b8b8f0g1b6f8b6g1b8g0f8b8f0f0f7b8b6e9g1e9f7f7e9e8f0e8g0b5g1f8e8g1b6b6b6b6b6b6g0j2b5f8e8b8f8b8b8b8f8b8b8b6b8b6b8g0b8b8b5b6b6f8f8f8g1e9g1g1j2b5b5f7f0g0g0b8g0e8b6b8b8b6f8b6f0b6b5b8b8f8b8e8e8f8j2j3b8b8f0g1b6f8b6g1b8g0f8b8f0f0f7b8b6e9g1e9b2b2", +"a4i4i4b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2i4b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2i4b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2i4b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2i4b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2i2", +};
--- a/etc/sample.emacs Mon Aug 13 09:13:58 2007 +0200 +++ b/etc/sample.emacs Mon Aug 13 09:15:11 2007 +0200 @@ -258,11 +258,44 @@ ; t ;; don't do the normal operations. ; ))) - )) )) +;; Oh, and here's a cute hack you might want to put in the sample .emacs +;; file: it changes the color of the window if it's not on the local +;; machine, or if it's running as root: + +;; local emacs background: whitesmoke +;; remote emacs background: palegreen1 +;; root emacs background: coral2 +(cond + ((and (string-match "XEmacs" emacs-version) + (eq window-system 'x) + (boundp 'emacs-major-version) + (= emacs-major-version 19) + (>= emacs-minor-version 12)) + (let* ((root-p (eq 0 (user-uid))) + (dpy (or (getenv "DISPLAY") "")) + (remote-p (not + (or (string-match "^\\(\\|unix\\|localhost\\):" dpy) + (let ((s (system-name))) + (if (string-match "\\.\\(netscape\\|mcom\\)\\.com" s) + (setq s (substring s 0 (match-beginning 0)))) + (string-match (concat "^" (regexp-quote s)) dpy))))) + (bg (cond (root-p "coral2") + (remote-p "palegreen1") + (t nil)))) + (cond (bg + (let ((def (color-name (face-background 'default))) + (faces (list-faces))) + (while faces + (let ((obg (face-background (car faces)))) + (if (and obg (equal def (color-name obg))) + (set-face-background (car faces) bg))) + (setq faces (cdr faces))))))))) + + ;;; Older versions of emacs did not have these variables ;;; (emacs-major-version and emacs-minor-version.) ;;; Let's define them if they're not around, since they make @@ -320,16 +353,50 @@ ;;; ******************** -;;; Load ange-ftp, which uses the FTP protocol as a pseudo-filesystem. +;;; Load efs, which uses the FTP protocol as a pseudo-filesystem. ;;; When this is loaded, the pathname syntax /user@host:/remote/path ;;; refers to files accessible through ftp. ;;; (require 'dired) -(require 'ange-ftp) -(setq ange-ftp-default-user "anonymous" ; id to use for /host:/remote/path - ange-ftp-generate-anonymous-password t ; use $USER@`hostname` - ange-ftp-binary-file-name-regexp "." ; always transfer in binary mode +;; compatible ange-ftp/efs initialization derived from code +;; from John Turner <turner@lanl.gov> +;; As of 19.15, efs is bundled instead of ange-ftp. +;; NB: doesn't handle 20.0 properly, efs didn't appear until 20.1. +;; +;; The environment variable EMAIL_ADDRESS is used as the password +;; for access to anonymous ftp sites, if it is set. If not, one is +;; constructed using the environment variables USER and DOMAINNAME +;; (e.g. turner@lanl.gov), if set. + +(if (and running-xemacs (< emacs-major-version 20) (>= emacs-minor-version 15)) + (progn + (message "Loading and configuring bundled packages... efs") + (require 'efs-auto) + (if (getenv "USER") + (setq efs-default-user (getenv "USER"))) + (if (getenv "EMAIL_ADDRESS") + (setq efs-generate-anonymous-password (getenv "EMAIL_ADDRESS")) + (if (and (getenv "USER") + (getenv "DOMAINNAME")) + (setq efs-generate-anonymous-password + (concat (getenv "USER")"@"(getenv "DOMAINNAME"))))) + (setq efs-auto-save 1) + )) +(if (and running-xemacs (< emacs-major-version 20) (< emacs-minor-version 15)) + (progn + (message "Loading and configuring bundled packages... ange-ftp") + (require 'ange-ftp) + (if (getenv "USER") + (setq ange-ftp-default-user (getenv "USER"))) + (if (getenv "EMAIL_ADDRESS") + (setq ange-ftp-generate-anonymous-password (getenv "EMAIL_ADDRESS")) + (if (and (getenv "USER") + (getenv "DOMAINNAME")) + (setq ange-ftp-generate-anonymous-password + (concat (getenv "USER")"@"(getenv "DOMAINNAME"))))) + (setq ange-ftp-auto-save 1) ) + ) ;;; ******************** @@ -339,8 +406,8 @@ (setq auto-save-directory (expand-file-name "~/autosave/") auto-save-directory-fallback auto-save-directory auto-save-hash-p nil - ange-ftp-auto-save t - ange-ftp-auto-save-remotely nil + efs-auto-save t + efs-auto-save-remotely nil ;; now that we have auto-save-timeout, let's crank this up ;; for better interactive response. auto-save-interval 2000
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/vm/audio_stamp.xpm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,43 @@ +/* XPM */ +static char *audio_stamp[] = { +/* width height num_colors chars_per_pixel */ +" 18 24 12 1", +/* colors */ +". c #000000", +"# c #00ffff", +"a c #00ff00", +"b c #bebebe s background", +"c c #ff00ff", +"d c #ff0000", +"e c #6e6e6e", +"f c #ffffff", +"g c #ffff00", +"h c #e7e7e7", +"i c #bfbfbf", +"j c #0000ff", +/* pixels */ +"bbbbbbbbbbbbbbbbbb", +"bbbbbbbbbbbbabbbbb", +"bbbbbbbbbbbebbbbbb", +"bbbbbbbeebbbbbebbb", +"bbbbbbbe.bbbbjebbb", +"bbbbbbeh.bbejijhbb", +"bbbbbebh.bijhieiib", +"bbbbiehh.bieiejibb", +"b..e.hhh.biebjjiib", +"b.hehhhh.bejibebci", +"b.hhhhhh.ijjiibiib", +"b.hhhhhh.ihiiieiii", +"b.hhhhhh.ibiiieiii", +"b.hhhhhh.bhfbbdhii", +"b.hhhhhh.bbbbieiib", +"b.hehhhh.bbbideiib", +"b..e.hhh.bbbidebbb", +"bbbbbehh.bbbiibbbb", +"bbbbbebh.bbbbbbbgi", +"bbbbiieh.bbbbbbbgg", +"bbbbiibe.bb#bbbbib", +"bbbbbbbeebbbh#bbgb", +"bbbbbbbbbbbbbbbbii", +"bbbbbbbbbbbbbbbbgb" +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/vm/document.xpm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,69 @@ +/* XPM */ +static char *document2[] = { +/* width height num_colors chars_per_pixel */ +" 24 30 32 1", +/* colors */ +". c #000000", +"# c #a4a5a4", +"a c #9f9f9f", +"b c #999999", +"c c #919191", +"d c #818181", +"e c #6d6d6d", +"f c #5d5d5d", +"g c #494949", +"h c #eaeaea", +"i c #373737", +"j c #e3e4e3", +"k c #d4d4d4", +"l c #c8c8c8", +"m c #0d0d0d", +"n c #b4b4b4", +"o c #b0aeb0", +"p c #aeaeae", +"q c #aaaaaa s background", +"r c #888888", +"s c #767676", +"t c #646464", +"u c #545454", +"v c #ffffff", +"w c #f6f7f6", +"x c #efefef", +"y c #dfdfdf", +"z c #dad9da", +"A c #242424", +"B c #cfcfcf", +"C c #bfbfbf", +"D c #b9b9b9", +/* pixels */ +"qqqqqaetr#qqqqqqqqqqqqqq", +"qqqq#errefd#qqqqqqqqqqqq", +"qqq#rzklCqcdsdra#qqqqqqq", +"qqqrkvvxzkkln#rtfdaqqqqq", +"qq#dvvvvvvxxzklCqcrdsr#q", +"qq#rresr#lxvvvvxhzl#tisq", +"qqqqqdsefgieCxvvvvxiAiiq", +"qqqqqrCttffuuuernkagtiiq", +"qqqq#nxvxxcsuetsuigrsitq", +"qqqqczhzxhzzlC#seffscifq", +"qqqqrvlyxxzlCCzxxkCaCmrq", +"qqqq#vvlzqhzvvvklalvciaq", +"qqqckhlkzzhlCCkhhxvvguqq", +"qqqrvvxvklalxxxlq#xvmd#q", +"qqqcvxklkvxvxllkhxvlArqq", +"qq#Cvvvvvvvvvvvvhxvtgqqq", +"qqrxxvvvvvvvvvvvvvvAeqqq", +"qqrvkzhzhxxvvvvvvvkmrqqq", +"qqqlhvvlCrnkhvvvvvci#qqq", +"qckxxxhxxkzzllllvvguqqqq", +"qrvklklxxxhlnlzxvhmrqqqq", +"qahzvvhCcCnxvxlhvqicqqqq", +"clxkkqlzhkkklCzvvfg#qqqq", +"txvvvvxlrzlzvvkvvAeqqqqq", +"dtalvvvvvvxknzhvlArqqqqq", +"rgimmgdqhvvvvvvvei#qqqqq", +"qq#rtiA..i#xvvvvitqqqqqq", +"qqqqqarsgimmis#Cmrqqqqqq", +"qqqqqqqqq#ceiA..icqqqqqq", +"qqqqqqqqqqqq#rdfeqqqqqqq" +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/vm/film.xpm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,69 @@ +/* XPM */ +static char *film[] = { +/* width height num_colors chars_per_pixel */ +" 24 30 32 1", +/* colors */ +". c #000000", +"# c #799fa1", +"a c #060919", +"b c #411707", +"c c #8fc7ff", +"d c #3f4040", +"e c #873d06", +"f c #62b1e6", +"g c #392e26", +"h c #292a2a", +"i c #9a9e9f", +"j c #284367", +"k c #646666", +"l c #aacae6", +"m c #238fc1", +"n c #182a50", +"o c #93673e", +"p c #7f7f80", +"q c #131516", +"r c #aaaaaa s background", +"s c #ddf2fd", +"t c #6991ac", +"u c #1c0804", +"v c #494b4a", +"w c #948b79", +"x c #733006", +"y c #151c34", +"z c #592009", +"A c #9f4c05", +"B c #54585d", +"C c #376389", +"D c #231305", +/* pixels */ +"rrrrrrrrwirrrrrrrrrrrrrr", +"rrrrpddv..prrrrrrrrrrrrr", +"rrrpjdkyajjprriiiwiiwirr", +"rrrnf.pfu.tgri.q....agir", +"rrktC.dlC.hCpiivqCCjjhBr", +"rrdcv..lca.tjrrddoBoogdr", +"rptcj.ulcj.djrrvdAAAAzBr", +"rBtcj..lcCuapprvgxxxxbdr", +"rvcfB.alkr..#BrBdDDDDuBr", +"rdjkt.kB.#..#vrBgnnnhadr", +"rjq.lCla.kq.BvrBgttmtjhr", +"rn..llc..Bh.BvrkvAAAAbBr", +"rh..rjl..Bh.kvrkgAAAAzdr", +"rn..#tla.pa.pdrBgxxxxbdr", +"rv..rccq.py.pBrvgzbzbqkr", +"rjhhlniC.ra.rdrvha.auhBr", +"rv#lt.Bctc..fBrdgCmCChkr", +"rvcct.qlc#.utkrhztCtpnBr", +"rBflC..lcC.nCiidxAAAxdkr", +"rptcB..lcj.Cvrphbeeezhpr", +"rrdcC.qlfuutkrkhDbzbqhrr", +"rrktt.Bcv.Cnrrkq....ddrr", +"rrihtnrtaaBkrrhnCCCnhBrr", +"rrrdq#t..avrrpBepppDqwrr", +"rrrp..BipwrrrvDeeexqdrrr", +"rrrrh.krrrrrkqDbDbDhkrrr", +"rrrrp.qrrrrphynnyaudrrrr", +"rrrrrd.hkpBqhoBkjqdprrrr", +"rrrrrrv......u.qhhprrrrr", +"rrrrrrrpvqu..uadpirrrrrr" +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/vm/gear.xpm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,278 @@ +/* XPM */ +static char *gear[] = { +/* width height num_colors chars_per_pixel */ +" 24 30 241 2", +/* colors */ +".. c #aaaaaa s background", +".# c #8e8e8e", +".a c #4d4d4d", +".b c #9f9f9f", +".c c #888888", +".d c #848484", +".e c #838383", +".f c #828282", +".g c #484848", +".h c #303030", +".i c #131313", +".j c #141414", +".k c #707070", +".l c #777777", +".m c #2b2b2b", +".n c #1d1d1d", +".o c #121212", +".p c #393939", +".q c #727272", +".r c #a0a0a0", +".s c #8b8b8b", +".t c #3e3e3e", +".u c #878787", +".v c #151515", +".w c #2d2d2d", +".x c #8a8a8a", +".y c #171717", +".z c #202020", +".A c #0c0c0c", +".B c #191919", +".C c #222222", +".D c #333333", +".E c #2f2f2f", +".F c #353535", +".G c #cacaca", +".H c #e9e9e9", +".I c #5c5c5c", +".J c #c5c5c5", +".K c #323232", +".L c #d9d9d9", +".M c #f9f9f9", +".N c #ffffff", +".O c #fbfbfb", +".P c #c7c7c7", +".Q c #1e1e1e", +".R c #6c6c6c", +".S c #a7a7a7", +".T c #242424", +".U c #1a1a1a", +".V c #6e6e6e", +".W c #bababa", +".X c #efefef", +".Y c #fefefe", +".Z c #f6f6f6", +".0 c #eaeaea", +".1 c #e8e8e8", +".2 c #454545", +".3 c #d3d3d3", +".4 c #e0e0e0", +".5 c #f7f7f7", +".6 c #4f4f4f", +".7 c #232323", +".8 c #e4e4e4", +".9 c #f0f0f0", +"#. c #e7e7e7", +"## c #e5e5e5", +"#a c #bfbfbf", +"#b c #fcfcfc", +"#c c #d1d1d1", +"#d c #d2d2d2", +"#e c #ececec", +"#f c #f5f5f5", +"#g c #111111", +"#h c #363636", +"#i c #7f7f7f", +"#j c #e6e6e6", +"#k c #e2e2e2", +"#l c #e1e1e1", +"#m c #f4f4f4", +"#n c #cfcfcf", +"#o c #cdcdcd", +"#p c #d5d5d5", +"#q c #1c1c1c", +"#r c #101010", +"#s c #919191", +"#t c #666666", +"#u c #dfdfdf", +"#v c #dddddd", +"#w c #2e2e2e", +"#x c #dbdbdb", +"#y c #cecece", +"#z c #cccccc", +"#A c #c8c8c8", +"#B c #c6c6c6", +"#C c #c3c3c3", +"#D c #a3a3a3", +"#E c #1f1f1f", +"#F c #212121", +"#G c #a1a1a1", +"#H c #272727", +"#I c #565656", +"#J c #4e4e4e", +"#K c #b2b2b2", +"#L c #dedede", +"#M c #5d5d5d", +"#N c #6a6a6a", +"#O c #dadada", +"#P c #d0d0d0", +"#Q c #cbcbcb", +"#R c #c9c9c9", +"#S c #c4c4c4", +"#T c #c2c2c2", +"#U c #c1c1c1", +"#V c #373737", +"#W c #0f0f0f", +"#X c #969696", +"#Y c #d7d7d7", +"#Z c #d8d8d8", +"#0 c #d6d6d6", +"#1 c #d4d4d4", +"#2 c #bdbdbd", +"#3 c #494949", +"#4 c #181818", +"#5 c #343434", +"#6 c #dcdcdc", +"#7 c #bebebe", +"#8 c #bcbcbc", +"#9 c #0e0e0e", +"a. c #c0c0c0", +"a# c #bbbbbb", +"aa c #b8b8b8", +"ab c #414141", +"ac c #b6b6b6", +"ad c #f8f8f8", +"ae c #b9b9b9", +"af c #b7b7b7", +"ag c #b5b5b5", +"ah c #3d3d3d", +"ai c #404040", +"aj c #7b7b7b", +"ak c #b4b4b4", +"al c #afafaf", +"am c #444444", +"an c #161616", +"ao c #4b4b4b", +"ap c #b3b3b3", +"aq c #b1b1b1", +"ar c #adadad", +"as c #ababab", +"at c #8f8f8f", +"au c #b0b0b0", +"av c #aeaeae", +"aw c #acacac", +"ax c #a9a9a9", +"ay c #a6a6a6", +"az c #a4a4a4", +"aA c #9d9d9d", +"aB c #9b9b9b", +"aC c #a8a8a8", +"aD c #a5a5a5", +"aE c #9e9e9e", +"aF c #9c9c9c", +"aG c #9a9a9a", +"aH c #989898", +"aI c #383838", +"aJ c #8c8c8c", +"aK c #959595", +"aL c #939393", +"aM c #6d6d6d", +"aN c #a2a2a2", +"aO c #999999", +"aP c #979797", +"aQ c #949494", +"aR c #929292", +"aS c #909090", +"aT c #8d8d8d", +"aU c #292929", +"aV c #858585", +"aW c #3f3f3f", +"aX c #474747", +"aY c #868686", +"aZ c #525252", +"a0 c #2c2c2c", +"a1 c #7a7a7a", +"a2 c #4c4c4c", +"a3 c #585858", +"a4 c #686868", +"a5 c #7e7e7e", +"a6 c #898989", +"a7 c #717171", +"a8 c #3a3a3a", +"a9 c #515151", +"b. c #5a5a5a", +"b# c #424242", +"ba c #818181", +"bb c #050505", +"bc c #797979", +"bd c #505050", +"be c #747474", +"bf c #808080", +"bg c #7c7c7c", +"bh c #2a2a2a", +"bi c #4a4a4a", +"bj c #fafafa", +"bk c #1b1b1b", +"bl c #767676", +"bm c #737373", +"bn c #262626", +"bo c #f1f1f1", +"bp c #0d0d0d", +"bq c #0b0b0b", +"br c #787878", +"bs c #757575", +"bt c #6f6f6f", +"bu c #434343", +"bv c #3b3b3b", +"bw c #5e5e5e", +"bx c #696969", +"by c #252525", +"bz c #5f5f5f", +"bA c #575757", +"bB c #282828", +"bC c #010101", +"bD c #6b6b6b", +"bE c #676767", +"bF c #646464", +"bG c #636363", +"bH c #616161", +"bI c #000000", +"bJ c #5b5b5b", +"bK c #464646", +"bL c #656565", +"bM c #595959", +"bN c #3c3c3c", +"bO c #606060", +"bP c #555555", +"bQ c #545454", +"bR c #626262", +"bS c #535353", +"bT c #7d7d7d", +"bU c #313131", +/* pixels */ +"................................................", +"..................aB.I.l.#.a.a.IaB..............", +".................l.n.i.m.n.i.i.i.i#t............", +"...............p.i.i#N.i.i.i.i.n.n.a............", +"...........H.0.z.iab.M.Gab.i.n.i.i#t............", +".......W.M.0.H.l.i#N.H.3.0#N.i.i.i.m.r...r......", +"......#K#X.H.4...p...3.G.J.I.i.i.i.i.6ab.z.r....", +"......#N.m.4.3.3.G.G.J.J.W.z.i.i.i.n.i.i.i.I....", +".....J.6.r.4.3.G.G.J.W.W#K#X.n.6#t.i.i.i.i.n.#..", +"..#K.0.0.0.3.G.J.J.W.W#K.....#.H.#.n.i.i.i.i#t..", +"...G.H.3.3.G.J.J.W.W#K.....r.raB#X.6.i.i.i.aaB..", +"...4.3.G.G.J.J.W#K#K.....r.raB#X#X#i.n.i.n#i....", +"..#X.r.G.J.J#K.W#K.raB.r.raB#X.#.#.c.a.n.i.6....", +"..aB.p.r.J.W#K#KaB.p.m#NaB#X.#.#.c.l.z.i.i.m....", +"....aBaB.W#K#K..#t.n.i.h.#.#.#.c#iab.i.i.i.i#g.I", +"....#K#K#K.....r.a.z.a.i#X.c.c#i.l.a.i.i.i.i.i.6", +"...W.H.....r.raB.a.I.m.i.l.##i.l.l.I.i.i.i.n.h#t", +"...J.G...r.raB#X#tab#t.i.I...l#N#N#N.a.p.n.h.6#t", +".....3.r.raB#X#X#N.p.p#g.m#K.l#N#N#t.I.I.h.6ab.l", +".....3aBaB#X#X.#.c.c.i.i#t.r#N#t#t.I.6.6ababab..", +".....3.#.c.#.c.c.c...l.p.J.l#t.I.I.I.6.6.pab....", +"....#X.a.p#N.c#i#i#i#K.G.c#t.I.I.6.6abab.n.p....", +"..........#t#i#i.l#N#N#t.I.I.I.6.6ab.m.z.i.naB..", +"...........J.l#N#N#N#t.I.I.6.6.a.a.h.i.i.i#i....", +"........#K.r.l#N#N#t.I.I.6.6.aabab.h.i.i.a......", +"..........#N#t#t#t.I.I.6.6.aabab.p.p.z.p.r......", +"...........rab.6.m.p.6.6.aab.p.p.h.h.p.r........", +".............r.I.c.c.p.aab.h.n.n.h.h#X..........", +"..................aB.mab.p.p.i.i.z.#............", +"...................r.z.m.m.mab#N................" +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/vm/getmail-dn.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,26 @@ +#define getmail-dn_width 64 +#define getmail-dn_height 42 +static char getmail-dn_bits[] = { + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf0,0xff,0xff,0xff, + 0xff,0xff,0xff,0x9f,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0x8f,0x0f,0xff,0xff, + 0xff,0xff,0xff,0xff,0x4f,0x3d,0xfc,0xff,0xff,0xff,0xff,0xff,0x07,0xea,0xf0, + 0xff,0xff,0xff,0xff,0xff,0x07,0xd0,0xc3,0xff,0xff,0xff,0xff,0xff,0x13,0xa0, + 0x0e,0xff,0xff,0xff,0xff,0xff,0xab,0x00,0x3d,0xfc,0xff,0xff,0xff,0xff,0x53, + 0x05,0x2a,0xf9,0xff,0xff,0xff,0xff,0xfb,0x0a,0x90,0xf2,0xff,0xff,0xff,0xff, + 0x1b,0x57,0x40,0xf5,0xff,0xff,0xff,0xff,0x1b,0xac,0xaa,0xe8,0xff,0xff,0xff, + 0xff,0x1b,0x70,0x55,0xe0,0xff,0xff,0xff,0xff,0x1b,0xc0,0x22,0xe3,0xff,0xff, + 0xff,0xff,0x1b,0x02,0x55,0xe0,0xff,0xff,0xff,0xff,0x1b,0x0e,0xa4,0xe0,0xff, + 0xff,0xff,0xff,0x33,0x3e,0x56,0xe1,0xff,0xff,0xff,0xff,0xcf,0xff,0xa6,0xea, + 0xff,0xff,0xff,0xff,0x3f,0xff,0x57,0xe5,0xff,0xff,0xff,0xff,0xff,0xfc,0xa7, + 0xea,0xff,0xff,0xff,0xff,0xff,0xf1,0x57,0xe5,0xff,0xff,0xff,0xff,0xff,0xcf, + 0xa7,0xf8,0xff,0xff,0xff,0xff,0xff,0x1f,0x57,0xfe,0xff,0xff,0xff,0xff,0xff, + 0x7f,0x84,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe1,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0x83,0xff,0xf9,0xf3,0xf9,0x27,0xff, + 0xff,0x39,0xff,0xf9,0xf3,0xf9,0x3f,0xff,0xff,0xfc,0xc3,0xf0,0xe3,0x18,0x26, + 0xff,0xff,0xfc,0x99,0xf9,0xe3,0xc8,0x24,0xff,0xff,0x0c,0x99,0xf9,0x43,0xf8, + 0x24,0xff,0xff,0x3c,0x81,0xf9,0x53,0x19,0x24,0xff,0xff,0x3c,0xf9,0xf9,0x13, + 0xc9,0x24,0xff,0xff,0x39,0x99,0xe9,0xb3,0xc9,0x24,0xff,0xff,0x43,0xc3,0xf3, + 0xb3,0x19,0x21,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/vm/getmail-dn.xpm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,51 @@ +/* XPM */ +static char * getmail-up_xpm[] = { +"64 42 6 1", +" c gray75 s backgroundToolBarColor", +"@ c #C0C0C0C0C0C0", +". c gray60", +"X c #808080808080", +"o c #FFFFFFFFFFFF", +"O c gray60", +" ", +" ..... ", +" ..@@@XX.. ", +" .Xo@@@@@XX.. ", +" .o@o@o@@@@XX.. ", +" .ooooo@o@o@@@XX.. ", +" .oooooooo@o@@@@XX.. ", +" .o@oooooooo@o@o@@@XX.. ", +" .@o@o@oooooooo@o@@@@XX.. ", +" .o@o@o@o@oooooo@o@o@..@X. ", +" .@@@@@o@o@oooooooo@.X@X@X. ", +" .@@..X@@@o@o@ooooo.X@X@X@. ", +" .@@.O..X@@o@o@o@o@.@X@..X@. ", +" .@@.OO...X@@@o@o@.@X@.XX.X. ", +" .@@.OO.....X@@o@o.X@X.@@X.. ", +" .@@.OO.@X....X@o@.@X@X.oX.. ", +" .@@..O.@@@X....X@.X@X@.oX.. ", +" ..@@X..@@@@@X..@@.@X@X@..X. ", +" ..@@@@@@@@@@X@@.X@X@X@X@. ", +" ..@@@@@@@@@@@.@X@X@X@X. ", +" ..@@@@@@@@@.X@X@X@X@. ", +" ...@@@@@@@.@X@X@X@.. ", +" ..@@@@@.X@X@X.. ", +" ...@@@.@X@.. ", +" X..@.X.. ", +" .... ", +" ", +" ", +" . ", +" ..... .. .. .. .. .. ", +" .. .. .. .. .. .. ", +" .. .... .... ... ... .... .. .. ", +" .. .. .. .. ... ... .. .. .. .. ", +" .. .... .. .. .. .... .... .. .. .. ", +" .. .. ...... .. .. . . .. ..... .. .. ", +" .. .. .. .. .. ... .. .. .. .. .. ", +" .. .. .. .. .. . .. . .. .. .. .. .. ", +" .... . .... .. .. . .. ... .... .. ", +" ", +" ", +" ", +" "};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/vm/getmail-up.xbm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,26 @@ +#define getmail-up_width 64 +#define getmail-up_height 42 +static char getmail-up_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0x00,0x00,0x00, + 0x00,0x00,0x00,0x60,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xf0,0x00,0x00, + 0x00,0x00,0x00,0x00,0xb0,0xc2,0x03,0x00,0x00,0x00,0x00,0x00,0xf8,0x15,0x0f, + 0x00,0x00,0x00,0x00,0x00,0xf8,0x2f,0x3c,0x00,0x00,0x00,0x00,0x00,0xec,0x5f, + 0xf1,0x00,0x00,0x00,0x00,0x00,0x54,0xff,0xc2,0x03,0x00,0x00,0x00,0x00,0xac, + 0xfa,0xd5,0x06,0x00,0x00,0x00,0x00,0x04,0xf5,0x6f,0x0d,0x00,0x00,0x00,0x00, + 0xe4,0xa8,0xbf,0x0a,0x00,0x00,0x00,0x00,0xe4,0x53,0x55,0x17,0x00,0x00,0x00, + 0x00,0xe4,0x8f,0xaa,0x1f,0x00,0x00,0x00,0x00,0xe4,0x3f,0xdd,0x1c,0x00,0x00, + 0x00,0x00,0xe4,0xfd,0xaa,0x1f,0x00,0x00,0x00,0x00,0xe4,0xf1,0x5b,0x1f,0x00, + 0x00,0x00,0x00,0xcc,0xc1,0xa9,0x1e,0x00,0x00,0x00,0x00,0x30,0x00,0x59,0x15, + 0x00,0x00,0x00,0x00,0xc0,0x00,0xa8,0x1a,0x00,0x00,0x00,0x00,0x00,0x03,0x58, + 0x15,0x00,0x00,0x00,0x00,0x00,0x0e,0xa8,0x1a,0x00,0x00,0x00,0x00,0x00,0x30, + 0x58,0x07,0x00,0x00,0x00,0x00,0x00,0xe0,0xa8,0x01,0x00,0x00,0x00,0x00,0x00, + 0x80,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x06,0x0c,0x06,0xd8,0x00, + 0x00,0xc6,0x00,0x06,0x0c,0x06,0xc0,0x00,0x00,0x03,0x3c,0x0f,0x1c,0xe7,0xd9, + 0x00,0x00,0x03,0x66,0x06,0x1c,0x37,0xdb,0x00,0x00,0xf3,0x66,0x06,0xbc,0x07, + 0xdb,0x00,0x00,0xc3,0x7e,0x06,0xac,0xe6,0xdb,0x00,0x00,0xc3,0x06,0x06,0xec, + 0x36,0xdb,0x00,0x00,0xc6,0x66,0x16,0x4c,0x36,0xdb,0x00,0x00,0xbc,0x3c,0x0c, + 0x4c,0xe6,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/vm/getmail-up.xpm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,51 @@ +/* XPM */ +static char * getmail-up_xpm[] = { +"64 42 6 1", +" c #C3C3C3C3C3C3 s backgroundToolBarColor", +"@ c #C0C0C0C0C0C0", +". c #000000000000", +"X c #808080808080", +"o c #FFFFFFFFFFFF", +"O c #FFFF00000000", +" ", +" ..... ", +" ..@@@XX.. ", +" .Xo@@@@@XX.. ", +" .o@o@o@@@@XX.. ", +" .ooooo@o@o@@@XX.. ", +" .oooooooo@o@@@@XX.. ", +" .o@oooooooo@o@o@@@XX.. ", +" .@o@o@oooooooo@o@@@@XX.. ", +" .o@o@o@o@oooooo@o@o@..@X. ", +" .@@@@@o@o@oooooooo@.X@X@X. ", +" .@@..X@@@o@o@ooooo.X@X@X@. ", +" .@@.O..X@@o@o@o@o@.@X@..X@. ", +" .@@.OO...X@@@o@o@.@X@.XX.X. ", +" .@@.OO.....X@@o@o.X@X.@@X.. ", +" .@@.OO.@X....X@o@.@X@X.oX.. ", +" .@@..O.@@@X....X@.X@X@.oX.. ", +" ..@@X..@@@@@X..@@.@X@X@..X. ", +" ..@@@@@@@@@@X@@.X@X@X@X@. ", +" ..@@@@@@@@@@@.@X@X@X@X. ", +" ..@@@@@@@@@.X@X@X@X@. ", +" ...@@@@@@@.@X@X@X@.. ", +" ..@@@@@.X@X@X.. ", +" ...@@@.@X@.. ", +" X..@.X.. ", +" .... ", +" ", +" ", +" . ", +" ..... .. .. .. .. .. ", +" .. .. .. .. .. .. ", +" .. .... .... ... ... .... .. .. ", +" .. .. .. .. ... ... .. .. .. .. ", +" .. .... .. .. .. .... .... .. .. .. ", +" .. .. ...... .. .. . . .. ..... .. .. ", +" .. .. .. .. .. ... .. .. .. .. .. ", +" .. .. .. .. .. . .. . .. .. .. .. .. ", +" .... . .... .. .. . .. ... .... .. ", +" ", +" ", +" ", +" "};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/vm/message.xpm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,62 @@ +/* XPM */ +static char *message[] = { +/* width height num_colors chars_per_pixel */ +" 24 30 25 1", +/* colors */ +". c #000000", +"# c #a4a579", +"a c #9f9c66", +"b c #918e5d", +"c c #817f53", +"d c #6d6b46", +"e c #5d5b3c", +"f c #49482f", +"g c #eae696", +"h c #373623", +"i c #d4d088", +"j c #c8c480", +"k c #0d0d08", +"l c #b4b173", +"m c #aaa76d s background", +"n c #888657", +"o c #76744c", +"p c #646240", +"q c #545236", +"r c #fffaa3", +"s c #efeb99", +"t c #dfdb8f", +"u c #bac384", +"v c #242317", +"w c #bfbc7a", +/* pixels */ +"mmmmmadpn#mmmmmmmmmmmmmm", +"mmmm#dnndec#mmmmmmmmmmmm", +"mmm#nuijwmbcocna#mmmmmmm", +"mmmnirrsuiijl#npecammmmm", +"mm#crrrrrrssuijwmbncon#m", +"mm#nndon#jsrrrrsguj#phom", +"mmmmmcodefhdwsrrrrshvhhm", +"mmmmmnwppeeqqqdnliafphhm", +"mmmm#lsrssboqdpoqhfnohpm", +"mmmmbugusguujw#odeeobhem", +"mmmmnrjtssujwwussiwawknm", +"mmmm#rrjumgurrrijajrbham", +"mmmbigjiuugjwwiggsrrfqmm", +"mmmnrrsrijajsssjm#srkc#m", +"mmmbrsijirsrsjjigsrjvnmm", +"mm#wrrrrrrrrrrrrgsrpfmmm", +"mmnssrrrrrrrrrrrrrrvdmmm", +"mmnriugugssrrrrrrriknmmm", +"mmmjgrrjwnligrrrrrbh#mmm", +"mbisssgssiuujjjjrrfqmmmm", +"mnrijijsssgjljusrgknmmmm", +"magurrgwbwlsrsjgrmhbmmmm", +"bjsiimjugiiijwurref#mmmm", +"psrrrrsjnujurrirrvdmmmmm", +"cpajrrrrrrsilugrjvnmmmmm", +"nfhkkfcmgrrrrrrrdh#mmmmm", +"mm#nphv..h#srrrrhpmmmmmm", +"mmmmmanofhkkho#wknmmmmmm", +"mmmmmmmmm#bdhv..hbmmmmmm", +"mmmmmmmmmmmm#ncedmmmmmmm" +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/vm/stuffed_box.xpm Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,291 @@ +/* XPM */ +static char *stuffed_box[] = { +/* width height num_colors chars_per_pixel */ +" 24 30 254 2", +/* colors */ +".. c #000000", +".# c #b1b1b1", +".a c #242120", +".b c #505955", +".c c #491909", +".d c #3e1608", +".e c #a9a9a9 s background", +".f c #eeeef0", +".g c #a7a7a7", +".h c #a3411c", +".i c #663622", +".j c #5c210b", +".k c #a83e17", +".l c #2f2824", +".m c #9f7b71", +".n c #d38141", +".o c #a3a3a3", +".p c #d27f40", +".q c #a1a1a1", +".r c #511c0a", +".s c #ccc1be", +".t c #9d9d9d", +".u c #cd773b", +".v c #903a13", +".w c #592a15", +".x c #1e1d1d", +".y c #cdcccc", +".z c #959595", +".A c #939393", +".B c #e8ac69", +".C c #919191", +".D c #8f8f8f", +".E c #8d8d8d", +".F c #240e05", +".G c #652810", +".H c #a55f3b", +".I c #878787", +".J c #f2f1f0", +".K c #a0491f", +".L c #8a4a27", +".M c #0c0401", +".N c #efbf80", +".O c #7d7d7d", +".P c #3d3531", +".Q c #2a0b04", +".R c #7b7b7b", +".S c #81401e", +".T c #797979", +".U c #adacac", +".V c #904d26", +".W c #eab071", +".X c #11132a", +".Y c #737373", +".Z c #999695", +".0 c #ab4119", +".1 c #d16d31", +".2 c #b3b8b5", +".3 c #030305", +".4 c #212129", +".5 c #b74c1e", +".6 c #ca7b41", +".7 c #696969", +".8 c #404644", +".9 c #2d1e17", +"#. c #656565", +"## c #8b3417", +"#a c #dfae7d", +"#b c #f5eeef", +"#c c #5e260f", +"#d c #d58445", +"#e c #5f5f5f", +"#f c #763416", +"#g c #5a200b", +"#h c #301006", +"#i c #7a2f10", +"#j c #edb87a", +"#k c #4e1b09", +"#l c #da8e4d", +"#m c #8b8a8a", +"#n c #d97435", +"#o c #d58648", +"#p c #32160b", +"#q c #fefefe", +"#r c #e8ad6b", +"#s c #020000", +"#t c #474747", +"#u c #bfbfc0", +"#v c #4f505c", +"#w c #6b280e", +"#x c #fcdf9c", +"#y c #e39e5c", +"#z c #160803", +"#A c #3f3f3f", +"#B c #61230e", +"#C c #140601", +"#D c #3c0e04", +"#E c #7e3010", +"#F c #eaeaea", +"#G c #a4a3a2", +"#H c #bb5121", +"#I c #cd642c", +"#J c #b94f1f", +"#K c #cb622a", +"#L c #333333", +"#M c #d88747", +"#N c #110601", +"#O c #d58344", +"#P c #070301", +"#Q c #511e0b", +"#R c #bf9f84", +"#S c #d2d2d2", +"#T c #6f290e", +"#U c #eed6b2", +"#V c #c55c27", +"#W c #441708", +"#X c #bab8b7", +"#Y c #e9ae6b", +"#Z c #823110", +"#0 c #171717", +"#1 c #eccba6", +"#2 c #51200e", +"#3 c #a33c16", +"#4 c #983915", +"#5 c #7f6352", +"#6 c #eab26f", +"#7 c #361207", +"#8 c #bd5222", +"#9 c #d0672e", +"a. c #a35326", +"a# c #da8f52", +"aa c #aaaaaa", +"ab c #a8a8a8", +"ac c #a6a6a6", +"ad c #a4a4a4", +"ae c #d38041", +"af c #303246", +"ag c #a2a2a2", +"ah c #b85020", +"ai c #d17e3f", +"aj c #521d0b", +"ak c #a0a0a0", +"al c #e6a764", +"am c #d07c3e", +"an c #cf7a3d", +"ao c #9e9e9e", +"ap c #9c9c9c", +"aq c #c75d28", +"ar c #1b0a03", +"as c #d88a49", +"at c #433f3e", +"au c #989898", +"av c #65250d", +"aw c #969696", +"ax c #0a0806", +"ay c #949494", +"az c #581e0a", +"aA c #c6c5c5", +"aB c #909090", +"aC c #d67d3d", +"aD c #9ea0a1", +"aE c #121211", +"aF c #db7838", +"aG c #414249", +"aH c #8a8a8a", +"aI c #d88c4c", +"aJ c #b0461b", +"aK c #28322d", +"aL c #4f5150", +"aM c #833613", +"aN c #848484", +"aO c #361306", +"aP c #808080", +"aQ c #551e0a", +"aR c #762d10", +"aS c #837b79", +"aT c #17110f", +"aU c #cfcfd4", +"aV c #943413", +"aW c #767676", +"aX c #98534f", +"aY c #ad461b", +"aZ c #727272", +"a0 c #1c1917", +"a1 c #c06a34", +"a2 c #6c6c6c", +"a3 c #722b0f", +"a4 c #c96029", +"a5 c #9a9999", +"a6 c #60616a", +"a7 c #67240e", +"a8 c #764a37", +"a9 c #3b1407", +"b. c #504e4d", +"b# c #100601", +"ba c #e7aa67", +"bb c #f4e0b9", +"bc c #d4d6d5", +"bd c #423028", +"be c #545454", +"bf c #d66f32", +"bg c #c05623", +"bh c #d36b2f", +"bi c #d2692e", +"bj c #4a4a4a", +"bk c #762e0f", +"bl c #461d0e", +"bm c #56150a", +"bn c #6c290f", +"bo c #ecb472", +"bp c #c58859", +"bq c #404040", +"br c #5f220c", +"bs c #3a3a3a", +"bt c #cd652c", +"bu c #363636", +"bv c #e7e7e7", +"bw c #732c0f", +"bx c #fee4a1", +"by c #68270e", +"bz c #dfdfdf", +"bA c #7a3819", +"bB c #2c2c2c", +"bC c #dbdbdb", +"bD c #f0ece9", +"bE c #d48243", +"bF c #282828", +"bG c #4e4b4a", +"bH c #5c5b5b", +"bI c #988f8c", +"bJ c #de7c39", +"bK c #b54c1e", +"bL c #b44a1d", +"bM c #b3481c", +"bN c #342f2d", +"bO c #220701", +"bP c #c45b26", +"bQ c #190802", +"bR c #c35925", +"bS c #d56c30", +"bT c #3f3d3b", +"bU c #e0803e", +"bV c #fbfafa", +"bW c #dd9252", +"bX c #afb0b6", +"bY c #772b0f", +"bZ c #f7f6f6", +"b0 c #220b04", +"b1 c #0e0e0e", +"b2 c #cb763d", +"b3 c #dd9b5f", +"b4 c #ad4219", +"b5 c #fadb99", +"b6 c #67756f", +"b7 c #e9e8e8", +/* pixels */ +".e.e.e.e.e.e.e.e.e.e.e.e.o.e.e.e.e.e.e.e.e.e.e.e", +".e.e.e.e.e.e.e.e.e.e.e.o.2.Z.m.o.e.e.e.e.o.o.e.e", +".e.e.e.e.e.e.e.e.e.e.obcbZ.6bp.H.m.o.e.e.e.s.o.o", +".e.e.e.e.e.e.e.e.e.e.fbZbZbbbc.Nbp.H.map.2.mbZbz", +".e.e.e.e.e.e.e.e.e.e#RbIbc#b.qbp.W.Bbpa.a8.YaA.7", +".e.e.e.e.e.e.e.ebIa8.y.sbD#S.Ibe.L.B#rbob3.Lbl.o", +".e.e.e.e.e.e.o#5a1#abe.y.o.qb.#e.q#U.Nbobob5.w.e", +".e.e.e.e.ebI.H.n#RbI.q#eaPbdb..o.I#X.N.W.N#lbl.e", +".e.e.e.oaXa1.nai.Vblb.#..9.x.Rbc#S.i#a.N#daF.d.e", +".e.e.e.ia1bU.uai.n.6bdbs.3#z.dbI#jal.N#n#n.SaLaA", +".e.e.e#W#c.Hai.u.6a#.m.3a8aI.H.Hal.N#n.1.Sat#XbI", +".e.e.e#W.v.j.V.uai.n#l.6bpas#lal#1#n#I.S.vbnaTaN", +".e.e.e.Q.v.v#w.Ga1.u#d#das#lbW.N#I#I.S#Z.1#Ibl.e", +".e.e.e.9bO#T.v#Z.j.H.u.n.na#.N.u#V.v.F#Ra#.1.9.U", +".e.e.e.P#haE.G.v.v.jbA.ua#.N.ubg.haTb.#b#obfbl.e", +".e.e.A.o#SbHbF#p#T.v#E.Gbpa4#HbnaTaLbIbp#Va.bT.U", +".e.e.e.IbcaubH#7#7.j.v#i.v.5#E##bY.v.h#V#Hbdak.e", +".e.e.eb.a8#S.9.G#ibl.d#T##.vaY#H.5.5bgbgblaN.q.e", +".e.e.eb..Ga8.i#ZbYbY.j.Q.jaY.5.5#H#H.m.w.7.o.e.e", +".e.e.ebGbYbn#w#i#T#T#T.j#ZaJ.5.5.5.S.y#u.A.o.e.e", +".e.e.oaL.d#Tbn#T#T#T#w.G#ZaY.5.h.i.Dbz.fbV.y#u.o", +".e.eapbHaxbObTa2#T#w.G.j#iaYaYb..2aua6.Obzbz#q.2", +".e.e.o.RaL.a.q.Ube#w.j.jaR.k#4#h#A.o.Dbzau#qbcap", +".e.eapaN#Aa2.ybv#Xa8#g#g#T.k#Z.PbG#L.o.2.2bZ.A.o", +".o.I.Aak.fbZbXaZbz#.#gbl#T##bd.IaNbH#L.Obz.2.z.e", +".Aa2.Rbz.eaAaDaNaU.lax.d.j.9aP.q.e.AbHbsa2aN.o.e", +"ap.Y#AaA#S.o.DbZ.obebBb1aTaS.o.e.e.o.Ia2.Yap.e.e", +".o.AbHbeaAaU.faA.I.I.7be.Rak.e.e.e.e.eap.o.e.e.e", +".e.o.Ibe#A#u.e.R.o.oap.A.o.e.e.e.e.e.e.e.e.e.e.e", +".e.e.oaNbHbe.R.o.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e" +};
--- a/info/dir Mon Aug 13 09:13:58 2007 +0200 +++ b/info/dir Mon Aug 13 09:15:11 2007 +0200 @@ -46,6 +46,7 @@ Packages: +* AUC TeX:: Mode for editing TeX files. * CC-MODE:: Mode for editing C, C++, and Objective-C code. * CL:: A Common Lisp compatibility package for Emacs-Lisp. * Custom:: Customization Library for Emacs
--- a/lib-src/ChangeLog Mon Aug 13 09:13:58 2007 +0200 +++ b/lib-src/ChangeLog Mon Aug 13 09:15:11 2007 +0200 @@ -1,3 +1,7 @@ +Wed Feb 19 18:24:49 1997 Steven L Baur <steve@altair.xemacs.org> + + * update-elc.sh: Added lisp/auctex. + Thu Feb 13 11:32:47 1997 Steven L Baur <steve@altair.xemacs.org> * Makefile.in.in: Install pstogif script.
--- a/lib-src/update-elc.sh Mon Aug 13 09:13:58 2007 +0200 +++ b/lib-src/update-elc.sh Mon Aug 13 09:15:11 2007 +0200 @@ -50,7 +50,7 @@ # Compute patterns to ignore when searching for files -ignore_dirs="egg its quail" # ### Not ported yet... +ignore_dirs="its quail" # ### Not ported yet... # Only use Mule XEmacs to compile Mule-specific elisp dirs echo "Checking for Mule support..." @@ -94,6 +94,7 @@ make_special oobr HYPB_ELC='' elc make_special eos -k # not stricly necessary... make_special ilisp elc +make_special auctex ignore_pattern='' for dir in $ignore_dirs ; do @@ -106,7 +107,6 @@ ignore_pattern="$ignore_pattern"' \!/,!d \!/edebug/edebug-test.el$!d -\!/emulators/edt.el$!d \!/energize/energize-load.el$!d \!/energize/write-file.el$!d \!/paths.el$!d
--- a/lisp/ChangeLog Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/ChangeLog Mon Aug 13 09:15:11 2007 +0200 @@ -1,3 +1,173 @@ +Sun Feb 23 12:56:28 1997 Steven L Baur <steve@altair.xemacs.org> + + * edebug/edebug.el: Synch up with Emacs 19.34. + + * prim/itimer-autosave.el (auto-save-timeout): Increase to 960. + +Sat Feb 22 17:11:31 1997 Steven L Baur <steve@altair.xemacs.org> + + * prim/loadup.el: Dump new file itimer-autosave.el. + +Sat Feb 22 17:06:32 1997 Kyle Jones <kyle_jones@wonderworks.com> + + * prim/itimer.el: Cleanup, removal of autosave cruft. + +Fri Feb 21 09:41:44 1997 Steven L Baur <steve@altair.xemacs.org> + + * prim/simple.el (line-move-ignore-invisible): Reverse previous + change to make this default to nil again. + +Thu Feb 20 14:30:50 1997 Jamie Zawinski <jwz@netscape.com> + + * prim/files.el (hack-local-variables-prop-line): New version. + +Thu Feb 20 11:14:22 1997 Steven L Baur <steve@altair.xemacs.org> + + * prim/files.el: Delete definition of dired-kept-versions. + + * prim/about.el (about-xemacs-xref): Added Kyle's picture. :-) + +Wed Feb 19 15:47:47 1997 Steven L Baur <steve@altair.xemacs.org> + + * packages/vc.el (diff-switches): Restore since this global + variable went away with the passing of ange-ftp. + + * utils/autoload.el (generate-file-autoloads-1): Don't let + find-file-hooks be run. + (update-file-autoloads): Ditto. + (update-autoloads-from-directory): Ditto. + + * x11/x-menubar.el (default-menubar): Correct unguarded reference + to fast-lock-mode variable. + +Wed Feb 19 08:04:02 1997 Noah Friedman <friedman@prep.ai.mit.edu> + + * eldoc.el (eldoc-message-commands): Doc fixes. + (eldoc-message): Make function, not macro. + + * eldoc.el (eldoc-last-message): New internal variable. + (eldoc-mode): Initialize it to nil. + (eldoc-message): Use it. + (eldoc-print-current-symbol-info): Use it. + + * eldoc.el (eldoc-pre-command-refresh-echo-area): New function. + (eldoc-mode): Put it on pre-command-hook if in XEmacs or using + idle timers in Emacs. + + * eldoc.el (eldoc-message-commands-table-size): New constant. + (eldoc-add-command): Use it to initialize eldoc-message-commands. + + * eldoc.el (eldoc-display-message-no-interference-p): New function. + (eldoc-display-message-p): Use it. + + * eldoc.el (eldoc-print-fnsym-args, eldoc-print-var-docstring): + Arg sym no longer optional. + Do not initialize arg if nil. + + * eldoc.el (eldoc-forward-sexp-safe): Function deleted. + (eldoc-beginning-of-sexp): New function. + (eldoc-fnsym-in-current-sexp): Use eldoc-beginning-of-sexp. + Use eldoc-current-symbol to get symbol at point. + + * eldoc.el (eldoc-function-argstring-from-docstring-method-table): + Forge docstrings for `and', `or', `list', `+', and `-'. + + * eldoc.el (eldoc-add-command-completions): New function. + (eldoc-add-command): Take list of args. + No longer interactive. + (eldoc-remove-command-completions): New function. + (eldoc-remove-command): Take list of args. + No longer interactive. + + * eldoc.el: Initialize eldoc-message-commands using + eldoc-add-command-completions. + + * eldoc.el (eldoc-display-message-p): New function. + Return nil if cursor-in-echo-area, or using idle timers and a + command is still active. + (eldoc-print-current-symbol-info): Use eldoc-display-message-p. + +Tue Feb 18 14:20:01 1997 David Byers <davby@ida.liu.se> + + * packages/paren.el (paren-highlight): Minor typo correction. + +Tue Feb 18 13:05:33 1997 Steven L Baur <steve@altair.xemacs.org> + + * prim/loadup.el: Dump new file custom-xmas. + +Mon Feb 17 21:01:38 1997 Steven L Baur <steve@altair.xemacs.org> + + * prim/help.el (function-compatible-p): New function. + (function-compatibility-doc): New function. + (describe-function-1): Use them. + (variable-compatible-p): New function. + (variable-compatibility-doc): New function. + (describe-variable): Use them. + +Mon Feb 17 19:12:55 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * prim/obsolete.el (x-color-values): Added for Emacs + compatibility. + +Mon Feb 17 18:11:24 1997 Michael Kifer <kifer@CS.SunySB.EDU> + + * prim/files.el (file-remote-p): Force load of EFS if not already + loaded. + +Mon Feb 17 17:45:23 1997 Bob Weiner <weiner@infodock.com> + + * modes/lisp-mode.el (eval-last-sexp): Do something special if + evaluating (interactive ...). + +Sun Feb 16 21:49:18 1997 Bjorn Victor <Bjorn.Victor@DoCS.UU.SE> + + * utils/facemenu.el (facemenu-adjust-face-sizes): Strip size when + face is neither nil nor cons. + +Sun Feb 16 14:26:03 1997 Steven L Baur <steve@altair.xemacs.org> + + * prim/loadup.el: Try not dumping font.elc. + + * prim/obsolete.el (display-column-mode): Remove column.el and + leave a forwarding address. + +Sat Feb 15 23:21:11 1997 Kyle Jones <kyle_jones@wonderworks.com> + + * prim/minibuf.el (read-from-minibuffer): Don't put evaluated + expressions in the minibuffer history list. + +Sat Feb 15 22:57:11 1997 Steven L Baur <steve@altair.xemacs.org> + + * packages/scroll-in-place.el (scroll-signal-boundary-error): + Allow user to suspend error signals. + +Sat Feb 15 21:43:49 1997 John Turner <turner@branagh.ta52.lanl.gov> + + * packages/column.el (current-line): Correct defaults for starting + at 1, remove an obsolete variable. + +Sat Feb 15 20:17:46 1997 Hal Peterson <hrp@netstar.com> + + * packages/vc.el (vc-backend-print-log): Change `cvs rlog' to + `cvs log' + +Mon Feb 17 02:01:27 1997 Hrvoje Niksic <hniksic@bjesomar.srce.hr> + + * utils/edmacro.el (edmacro-format-keys): Would bug out on empty + macro. + +Mon Feb 17 02:01:27 1997 Hrvoje Niksic <hniksic@bjesomar.srce.hr> + + * utils/edmacro.el (edmacro-format-keys): Would bug out on empty + macro. + (edmacro-fix-menu-commands): Would bug out on 'control, etc. + (edmacro-events-to-keys): New function. + (edmacro-format-keys): Use it. + (edmacro-finish-edit): Compare to macros, not strings. + (edmacro-fkeys): New function. + (edmacro-format-keys): Use it. + (edit-kbd-macro): Tweak. + Sat Feb 15 13:58:14 1997 Kyle Jones <kyle_jones@wonderworks.com> * packages/info.el: Don't call switch-to-buffer if the Info frame
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/CHANGES Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,5 @@ +News in 9.7 +=========== + + * Added minimal support for `sentence-end-double-space'. +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/ChangeLog Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,875 @@ +Thu Feb 20 11:30:50 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 9.7i released. + +Thu Feb 20 10:59:38 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex.el: Removed autoloads that conflicts with `tex-mode.el'. + (TeX-lisp-directory): Default to data-directory. + +Sat Feb 15 18:00:48 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 9.7h released. + +Sat Feb 15 13:39:30 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex-buf.el (TeX-lisp-directory): Removed. + +Fri Feb 07 14:58:29 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 9.7g released. + +Thu Feb 6 11:01:35 1997 Karl Eichwalder <ke@ke.Central.DE> + + * Makefile (install-lisp): Don't install $(aucdir)/lpath.el and + $(aucdir)/tex-site.el. + (contrib, install-contrib): New targets. + +Thu Jan 30 06:59:57 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-math-default): uparow -> uparrow. Reported by + Kyeong Soo Kim <kks@baekdu.rgit.wustl.edu>. + +Wed Jan 29 04:57:42 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Makefile (AUCSRC): Removed `ltx-help.el'. + +Mon Jan 27 00:52:51 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 9.7f released. + +Mon Jan 27 00:40:35 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-label-function): New variable. + (LaTeX-label): New function. + (LaTeX-section-label): Use it. + (LaTeX-env-figure): Ditto. + (LaTeX-env-label): Ditto. + Patch supplied by Carsten Dominik <dominik@strw.LeidenUniv.nl> for + better RevTeX.el support. + + * latex.el (LaTeX-env-figure): Don't insert \leavevmode, at the + request of David Carlisle <carlisle@ma.man.ac.uk>. + +Mon Jan 20 18:41:23 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 9.7e released. + +Mon Jan 20 18:38:58 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex-buf.el (TeX-parse-error): Support LaTeX warnings. Patch by + Frederic Devernay <devernay@istar.fr>. + (TeX-warning): Ditto. + +Fri Jan 17 17:42:20 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 9.7d released. + +Fri Jan 17 17:40:39 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex-jp.el: XEmacs 20 support by Soren Dayton + <csdayton@cs.uchicago.edu>. + +Mon Jan 13 00:52:26 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Makefile (CP): Use `cp -p'. Suggested by Graham Gough + <graham@cs.man.ac.uk>. + + * Version 9.7c released. + +Wed Jan 8 15:00:06 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * doc/intro.texi: Spelling fixes by Franklin Chen <chen@adi.com>. + + * tex-buf.el (TeX-shell-command-option): Insitialize from + shell-command-switch. Suggested by Fabio@Colorado.EDU (Fabio + Somenzi). + + * latex.el (LaTeX-mode-menu): Added sans serif. Patch by Ralf + Fassel <ralf@atg.venture.de>. + +Fri Jan 3 13:49:44 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Makefile (install-lisp): Also install `.el' files. Requested by + several people. + +Wed Dec 11 07:32:47 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * Makefile (tex.elc): New entry. + (install-lisp): Use it. Trevor Jim <tjim@saul.cis.upenn.edu> + reported that `make install' wouldn't make the elc files. + +Tue Dec 10 16:48:59 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 9.7b released. + +Tue Dec 10 07:49:54 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex-buf.el (TeX-run-format): Bind `buffer' before `process' to + avoid side effect. Suggested by Frederic Devernay + <devernay@istar.fr>. + + * Version 9.7a released. + +Tue Dec 10 07:49:56 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-fill-region-as-para-do): Minimal support for + `sentence-end-double-space'. + +Mon Dec 09 14:58:18 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 9.6m released. + +Sun Dec 01 17:33:49 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 9.6l released. + +Sun Dec 1 17:31:48 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex-jp.el: Patch from IKEMOTO Masahiro + <ikeyan@airlab.cs.ritsumei.ac.jp>. + +Fri Nov 29 18:50:26 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 9.6k released. + +Fri Nov 22 14:40:05 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-mode-menu): Made `LaTeX-math-mode' a toggle. + +Sat Nov 16 19:24:39 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 9.6j released. + +Thu Nov 14 15:42:38 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-common-initialization): Added eqref to + LaTeX-label-list. Suggested by Martin Hagstrom + <martinh@sto.foa.se>. + +Wed Nov 13 16:15:36 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex-buf.el (TeX-region-create): Disable font lock. Suggested by + several, patch by Christoph Wedler <wedler@fmi.uni-passau.de>. + +Tue Nov 5 20:21:07 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex.el (TeX-file-extensions): Added "texinfo". + +Mon Sep 30 18:45:42 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-mode-map): Do not overwrite standard binding of + `M-g'. + + * tex.el (popup-mode-menu): Run `LaTeX-menu-update' if present. + Workaround for bug reported by Hendrik Visage + <hendrikv@di.denel.co.za> and othors. + + * latex.el (LaTeX-float): Allow nil. + (LaTeX-env-figure): Don't insert float if nil. Feature suggested + by Andre Eickler <eickler@db.fmi.uni-passau.de>. + +Mon Sep 16 17:17:59 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 9.6i released. + +Mon Sep 16 17:15:02 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex.el (TeX-mode-syntax-table): Made `$' have the syntax class + `$' at the suggestion of Mats Bengtsson <matsb@s3.kth.se>. + +Sat Aug 31 16:03:52 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (TeX-arg-cite): Use `multi-prompt' when asking for + entries. + (TeX-arg-bibliography): Ditto. + +Thu Aug 29 22:22:14 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * Makefile: Simplified installation (I hope). + +Wed Aug 28 00:22:11 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * Makefile: Removed lacheck. + +Fri Aug 23 10:23:45 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex-buf.el (TeX-run-command): Change to master directory before + executing command. + (TeX-region-file): Allow dummy second argument. + (TeX-run-background): Run in master directory. + (TeX-run-interactive): Run in master directory. + + * tex.el (TeX-master-file): Allow second argument `NONDIRECTOPRY'. + (TeX-expand-list): Set second argument `NONDIRECTORY' to file + entries. + (TeX-master-directory): New function. + * tex.el (TeX-auto-write): Write in master directory. + +Thu Aug 22 22:33:45 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-current-environment): Ignore comments. Reported + by Stephen Eglen <stephene@cogs.susx.ac.uk>. + + * tex.el (TeX-directory-absolute-p): Added `windows-nt'. + + * tex-buf.el (TeX-shell): Added `windows-nt'. + (TeX-shell-command-option): Added `emx' and `windows-nt'. + Reported by Ulrich Poetter <poetter@em.uni-frankfurt.d400.de>. + +Wed Aug 21 13:57:43 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex.el (VirTeX-common-initialization): Removed duplicate + initialization of `words-include-escapes'. Reperted by Mark Hovey + <hovey@math.mit.edu>. + +Wed Aug 14 19:43:31 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * Makefile (CONTRIB): Added `font-latex.el'. + +Tue Jul 30 12:19:01 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * Makefile (aucdir): Changed `lib' to `share' per new emacs + conventions. Reported by "Edward J. Huff" + <huffe@carbon.chem.nyu.edu>. + +Tue Jul 16 20:18:59 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-fill-region-as-para-do): Make sure `.}' gets + two spaces at end of sentence when filling. + +Mon Jul 15 12:13:36 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex.el (TeX-parse-path): Ignore tralining //. Suggested by + G�ran Uddeborg <G�ran.Uddeborg@carmen.se>. + +Sun May 5 11:06:37 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * all: Use version number instead of CVS id. + + * tex.el (TeX-mode-map): Don't bind `del'. We aren't supposed to + have any tabs in the first place. + +Thu May 2 01:28:52 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex.el (TeX-mark-active, TeX-active-mark) [XEmacs]: The + definition of these two were swapped. Bug reported by + Vladimir Alexiev <vladimir@cs.ualberta.ca>. + +Thu Apr 25 11:20:03 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex.el (TeX-update-style): Don't run parent style hooks for + files that doesn't match `TeX-one-master'. Suggested by many + people. + +Wed Apr 24 14:44:13 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-close-environment): Bind + `next-line-add-newlines' to t. Patch by Fritz Knabe + <knabe@matecumbe.ing.puc.cl>. + +Mon Apr 1 16:36:04 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-fill-region-as-para-do): Fill `.}' as a sentence + end. Patch by Fritz Knabe <knabe@matecumbe.ing.puc.cl>. + +Mon Mar 11 22:56:30 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-math-cal): Use `\mathcal{}' under LaTeX2e. + Reported by Mate Wierdl <wierdlm@zebra.msci.memphis.edu>. + +Tue Mar 5 17:27:39 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex-info.el (texinfo-mode): Rely on texinfo.el to provide the + outline regexp. + +Tue Feb 20 09:43:29 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex.el (TeX-command-menu-queue, TeX-command-menu-queue-entry): + New functions supporting printer queue queries from the menu. By + Ulrik Dickow <dickow@nbi.dk> + (TeX-command-menu-entry): Use them. + +Tue Feb 13 19:50:18 1996 Per Abrahamsen <abraham@dina.kvl.dk> + + * style/swedish.el: Support for Swedish quotation style by "G\vran + Uddeborg" <gvran@uddeborg.pp.se>. + +Thu Dec 21 16:49:19 1995 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-math-default): Added more definitions by Mehmet + Balcilar <MBALCIL@econ.wayne.edu>. + +Mon Dec 18 18:58:22 1995 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-fill-region-as-paragraph): Removed old version. + (LaTeX-math-menu): Redefined the math mode menu. + +Thu Dec 14 19:51:15 1995 Per Abrahamsen <abraham@dina.kvl.dk> + + * latex.el (LaTeX-math-menu): New variable. + (LaTeX-mode-menu): Use it. Suggested by Peter S Galbraith + <rhogee@mixing.qc.dfo.ca>. + +Mon Nov 13 23:49:16 1995 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex.el (VirTeX-common-initialization): Set `comment-multi-line' + to nil. + +Fri Oct 13 14:16:36 1995 Per Abrahamsen <abraham@dina.kvl.dk> + + * PROBLEMS: Some easymenu explanations. + + * tex.el: Require easymenu.el instead of auc-menu.el. + * Makefile (AUCSRC): Removed easymenu.el and auc-menu.el. + (MINMAPSRC): Removed easymenu.el, column.el and cpp.el. + * easymenu.el: File deleted. + * column.el: File deleted. + * cpp.el: File deleted. + + * latex.el (LaTeX-math-insert): Don't check if `TeX-insert-macro' + is defined. + (LaTeX-close-environment): Work better when called on an empty + line. Fixed by David Aspinall <da@dcs.ed.ac.uk>. + +Thu Oct 12 15:45:00 1995 Per Abrahamsen <abraham@dina.kvl.dk> + + * tex.el ('LaTeX-math-mode): Autoload from latex.el instead of + ltx-math.el. Reported by Richard Brankin <richard@num-alg-grp.co.uk>. + +Tue Feb 14 20:36:00 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * latex.el (LaTeX-fill-region-as-paragraph): Should now format \\ + correctly. Patch by michal@ellpspace.math.ualberta.ca (Michal + Jaegermann). + (LaTeX-fill-region-as-para-do): New function. + (LaTeX-fill-region-as-paragraph): Do not fill paragraphs inside + special environments. + +Sun Feb 12 15:40:15 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex.el (TeX-byte-compile): Make it default to nil. Suggested by + michal@ellpspace.math.ualberta.ca (Michal Jaegermann). + + * tex-buf.el (TeX-command-query): Also offer to save files when + started from a menu. Reported by wscoas@win.tue.nl (Anton + A. Stoorvogel). + (TeX-LaTeX-sentinel): Don't suggest BibTeX if there is no + bibliographies. Suggested by Piet van Oostrum <piet@cs.ruu.nl>. + +Sat Feb 11 21:44:19 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex-buf.el (TeX-run-format): Protect against being run from a + different buffer. Patch by Michael Kifer + <kifer@sbkifer.cs.sunysb.edu>. + + * latex.el (LaTeX-math-default): Moved `Phi' from V to F in + LaTeX-math-mode. Suggested by dak@ind.rwth-aachen.de (David + Kastrup). + * doc/math-ref.tex: Documented it. + +Thu Feb 2 11:24:46 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex-buf.el (TeX-home-buffer): Added interactive, reported by + edavid@lami.univ-evry.fr. + +Wed Feb 1 11:12:35 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * hilit-LaTeX.el: Upgraded to 1.06. + + * Makefile (CONTRIB, EXTRAFILES): Moved tex-jp.el to CONTRIB. + +Fri Jan 27 21:56:32 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * latex.el (LaTeX-paragraph-commands): Incorrectly placed + parenthesis. Reported by mic@cs.ucsd.edu (Michelangelo Grigni). + +Thu Jan 26 13:39:56 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * latex.el (LaTeX-fill-region): Use marker to mark end of region + instead of integer, as the formatting may change the size of the + region. + (LaTeX-common-initialization): Fixed bug in paragraph definitions. + Reported by Steve Anderson <anderson@sapir.ling.yale.edu>. + + * tex.el (save-match-data): Added by koba@flab.fujitsu.co.jp + (Kobayashi Shinji). + (bibtex-mode-hook): Don't use add-hook yet. Reported by + koba@flab.fujitsu.co.jp (Kobayashi Shinji). + +Wed Jan 25 14:59:57 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex.el (change-major-mode-hook): Also clear + `LaTeX-environment-list'. + + * Makefile (AUCSRC): Add `auc-menu.el'. + + * tex.el: Use auc-menu instead of easymenu. + + * tex.el: Inserted comment to mark end of site customization. + Suggested by john@minster.york.ac.uk (John A. Murdie). + + * tex.el (change-major-mode-hook): Forgot a set of parentheses. + Reported by Frederic Devernay <Frederic.Devernay@sophia.inria.fr>. + + * tex-buf.el (TeX-current-pages): Removed extra parentheses. + Reported by mic@cs.ucsd.edu (Michelangelo Grigni). + +Tue Jan 24 23:37:35 1995 Per Abrahamsen (abraham@iesd.auc.dk) + + * tex.el (change-major-mode-hook): Added workaround for error in + XEmacs 19.11's `kill-all-local-variables'. + +Mon Jan 23 16:03:35 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * latex.el (LaTeX-common-initialization): Removed unnecessary + regexp quotes of `TeX-esc'. + + * style/amsart.el: Move `eqref' definition to `style/amstex.el' + and load that style hook. + * style/amstex.el: New file. + * Makefile (STYLESRC): Added it. + Suggested by vb1890@PLAY.CS.NYU.EDU (Victor Boyko). + +Sun Jan 22 14:18:12 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * latex.el, ltx-math.el, Makefile: Integrated `ltx-math.el' in + `latex.el'. + * tex-site.el: Removed autoload for `LaTeX-math-mode'. + +Thu Jan 19 12:31:45 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * latex.el (latex-mode): Epoch fix by Martin Sjolin + <marsj@ida.liu.se>. + +Tue Jan 17 15:12:54 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * bib-cite.el: New file contributed by Peter S. Galbraith + <rhogee@bathybius.meteo.mcgill.ca>. + + * hilit-LaTeX.el: New file contributed by Peter S. Galbraith + <rhogee@bathybius.meteo.mcgill.ca>. + + * Makefile (CONTRIB): New macro for user contributed emacs lisp + packages, initialized with `bib-cite.el' and `hilit-LaTeX.el'. + (EXTRAFILES): Added $(CONTRIB) to the list. + + * tex.el (TeX-directory-absolute-p): Moved definition before + `TeX-macro-private'. Reported by Frederic Devernay + <Frederic.Devernay@sophia.inria.fr>. + + * latex.el (LaTeX-common-initialization): Remove extra and wrong + "\\\\par" from `paragraph-separate'. Bug reported by + nijhof@th.rug.nl (Jeroen Nijhof). + +Wed Jan 11 11:43:01 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex-buf.el (TeX-command-region): Comment fix. Patch by + wlang@rs6000.mri.akh-wien.ac.at (Willi Langenberger). + (TeX-region-create): More outline-mode safe. Patch by + wlang@rs6000.mri.akh-wien.ac.at (Willi Langenberger). + + * Makefile (dist): Put version number in WWW page. Suggested by + several people. + + * latex.el (LaTeX-auto-regexp-list): Ignore first optional + argument to newenvironment if there is a second. Problem reported + by schiotz@ltf.dth.dk (Jakob Schiotz). + + * style/amsbook.el: New file. Problem reported by Denby Wong + <3dw16@qlink.queensu.ca>. + +Wed Jan 4 02:34:11 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex-buf.el (TeX-TeX-sentinel-check): New function. Updates + `TeX-current-page' with regexp by dodd@roebling.poly.edu (Lawrence + R. Dodd) + (TeX-current-pages): New function. + (TeX-LaTeX-sentinel, TeX-TeX-sentinel): Use it. +y (TeX-format-filter): Removed unnecessary check before assignment. + +Tue Jan 3 03:38:54 1995 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex-buf.el (TeX-LaTeX-sentinel): Write number of pages even + when labels or citations are missing. Patch by + dodd@roebling.poly.edu (Lawrence R. Dodd). + +Wed Dec 7 11:47:56 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex.el (TeX-directory-absolute-p): New function. Should work on + both Unix and MS DOS. Problem reported by schiotz@ltf.dth.dk + (Jakob Schiotz). + (TeX-parse-path): Use it. + (TeX-auto-generate): Use it. + +Mon Dec 5 12:11:12 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * latex.el (BibTeX-auto-store): Set TeX-auto-parse-length to + 999999 locally. Problem reported by Christoph Wedler + <wedler@fmi.uni-passau.de>. + +Fri Dec 2 08:20:10 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex-buf.el (TeX-LaTeX-sentinel): Check whether the ".bbl" file + need to be udpated before setting TeX-command-next to "BibTeX". + (TeX-command-query): Remove previous change. + +Mon Nov 28 01:16:05 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * latex.el (LaTeX-209-to-2e): New function by + Graham Gough <graham@cs.man.ac.uk>. + + * latex.el (LaTeX-mode-menu): Move many commands to new + "Miscellaneous" submenu. + + * tex-buf.el (TeX-home-buffer): Don't take arg. + + * latex.el (LaTeX-left-right-indent-level): New variable + controling indentation for \left \right blocks. + (LaTeX-indent-level-count): New function. Previously only LaTeX + macros at the beginning of the line would affect indentation. + This problem was reported by many people. + (LaTeX-indent-calculate-last): Call `LaTeX-indent-level-count'. + Take into account that \end and \right at the beginning of the + line has immediate effect. + +Sun Nov 27 21:08:28 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * latex.el (TeX-global-input-files): New variable. Idea and + sample code by Christophe Mignot <Christophe.Mignot@loria.fr>. + (TeX-arg-input-file): Use it. + (BibTeX-global-style-files): Mention how it is reset in + `TeX-normal-mode'. + (BibTeX-global-files): Ditto. + + * tex.el (TeX-normal-mode): Reset `BibTeX-global-style-files', + `BibTeX-global-files', and `TeX-global-input-files' if invoked + with an argument. + + * tex-site.el: Ignore trailing `/' when adding TeX-lisp-directory + to load-path. Patch by Michael Ernst + <mernst@research.microsoft.com>. + + * tex-buf.el (TeX-LaTeX-sentinel): Don't rerun LaTeX on missing + references, unless they have changed. Patch by schiotz@ltf.dth.dk + (Jakob Schiotz). + + * latex.el (LaTeX2e-font-replace): New function. + (LaTeX-common-initialization): Set TeX-font-replace-function to + LaTeX2e-font-replace when using latex2e. + + * tex.el (TeX-font-replace-function): New variable. + (TeX-font): Use it. + + TeX-font-replace-function and LaTeX2e-font-replace were + contributed by Peter Thiemann + <thiemann@provence.informatik.uni-tuebingen.de>. + + +Tue Nov 22 14:21:05 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * MSDOS: Added. Contributed by schiotz@ltf.dth.dk (Jakob + Schiotz). + + * OEMACS: Removed. + + * tex.el (VirTeX-common-initialization): Make + `words-include-escapes' a local variable before setting it. + Reported by Bo Nygaard Bai <bai@iesd.auc.dk>. + +Tue Nov 15 11:12:38 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex.el (TeX-auto-store): Change to functions that prevent the + auto file buffer from entering emacs-lisp-mode. + (TeX-auto-insert): Don't rely on emacs-lisp-mode for indentation. + Suggested by Stefan Sch�f (schoef@informatik.uni-oldenburg.de). + +Fri Nov 11 16:37:54 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex.el (TeX-macro-global): Change to `standard' path. + +Wed Nov 9 22:35:21 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex-buf.el (TeX-command-query): Suggest TeX-command-default + again if bbl file is newer than dvi file. + +Mon Nov 7 19:16:07 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex.el (TeX-submit-bug-report): Indicate LaTeX-version. + Suggested by schiotz@ltf.dth.dk (Jakob Schiotz). + +Wed Oct 26 15:37:53 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * Makefile (dist): Automatically update AUC-TeX-version and + AUC-TeX-date in tex.el + + * tex.el (AUC-TeX-version): Added AUC-TeX-version and + AUC-TeX-date from auc-ver.el. + + * auc-ver.el: File removed. + + * tex.el: Added version specific code from seperate files. + + * tex-19.el, tex-18.el, tex-lcd.el: Files removed. + +Tue Oct 25 13:05:36 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * doc/auc-tex.texi (Projects): Removed an implemented item. + + * tex.el (TeX-command-current): New variable. + (TeX-command-select-master): New function. + (TeX-command-select-buffer): New function. + (TeX-command-select-region): New function. + (TeX-command-menu): Use TeX-command-current instead of explicit + file argument. + (TeX-command-menu-print): Remove file argument. + (TeX-command-menu-printer-entry): Don't pass file argument. + (TeX-command-create-menu): Removed. + (TeX-mode-menu): New menu. + (plain-TeX-mode-menu): Removed entries now in TeX-mode-menu. + (plain-TeX-mode-menu): Use `toggle' for bad boxes. + (plain-TeX-common-initialization): Enable TeX-mode-menu. + + * latex.el (LaTeX-mode-menu): Removed entries now in + TeX-mode-menu. + (LaTeX-mode-menu): Use `toggle' for bad boxes. + (LaTeX-common-initialization): Enable TeX-mode-menu. + + * tex-info.el (TeXinfo-command-menu): New menu. + (TeXinfo-mode-menu): Move commands to new menu. + (TeXinfo-mode-menu): Use `toggle' for bad boxes. + (texinfo-mode): Enable TeXinfo-command-menu. + +Mon Oct 24 22:49:51 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * Makefile (AUCSRC): Removed auc-menu.el from AUC TeX distribution. + (MINMAPSRC): Added easymenu.el temporarily to min-map distribution. + + * auc-menu.el: Just load easymenu.el when using GNU Emacs. + + * easymenu.el Try to use RMS's easymenu instead of auc-menu. + (easy-menu-define): Call `easy-menu-do-define' to do + the real work. Document XEmacs keyword arguments. + (easy-menu-do-define): New function. + (easy-menu-create-keymaps): Support XEmacs keyword arguments in + menu definition. + (easy-menu-remove): Make is a function instead of a macro. + (easy-menu-add): Ditto. + +Fri Oct 21 14:46:16 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * doc/auc-tex.texi (Completion): Less confusing BibTeX advice, I hope. + + * tex-jp.el: Added patch from koba@flab.fujitsu.co.jp (Kobayashi + Shinji). + + * latex.el (TeX-arg-insert-braces): Have \left and \right on + different lines. Patch by thiemann@informatik.uni-tuebingen.de + (Peter Thiemann). + + * Makefile (dist): Add CHANGES and ChangeLog files to the ftp + directory. Suggested by Frederic Devernay + <Frederic.Devernay@sophia.inria.fr>. + + * latex.el (LaTeX-indent-calculate): Allow nil second element in + `LaTeX-indent-environment-list'. + (LaTeX-indent-environment-list): Added special environments + suggested by thiemann@informatik.uni-tuebingen.de (Peter + Thiemann). + +Thu Oct 20 22:58:59 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * tex.el (TeX-auto-list-information): Spelling error. + +Tue Oct 18 13:24:26 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * latex.el (LaTeX-common-initialization): Make "LaTeX2e" the + default command if you have set `LaTeX-version' to "2" and is + using "\documentclass". + +Thu Oct 6 14:38:52 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * latex.el (LaTeX-paragraph-commands): End each word with a "\\b" + to avoid accidentally matching longer macros. + + * tex.el (TeX-add-local-master): Use three %'s when adding buffer + local variables. Suggested by Raymond Toy <toy@rtp.ericsson.se>. + + * tex.el (TeX-format-list): Added entry for AmSTeX by Ulf Juergens + <ulf@Mathematik.Uni-Bielefeld.DE>. + + * tex.el (ams-tex-mode): Run AmS-TeX-mode-hook, not + plain-TeX-mode-hook. Reported by Ulf Juergens + <ulf@Mathematik.Uni-Bielefeld.DE>. + + * tex-buf.el (TeX-format-filter): Add `save-match-data'. Patch by + David Aspinall <da@dcs.edinburgh.ac.uk>. + +Wed Sep 14 10:53:15 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * cpp.el: Use RMS's version. + +Tue Sep 13 10:59:07 1994 Per Abrahamsen <abraham@iesd.auc.dk> + + * doc/history.texi, doc/auc-tex.texi: Fixes from Chris Fearnley + <@vm.uni-c.dk:FEARNLCJ@DUVM>. + +Fri Sep 9 13:15:33 1994 Per Abrahamsen <abraham@research.att.com> + + * latex.el (LaTeX-insert-environment): Don't fill environments + listed in `LaTeX-indent-environment-list'. Suggestion by Graham + Gough <graham@cs.man.ac.uk>. + + * tex.el (LaTeX-command-style): Made latex2e first in the list. + Suggested by Frederic Devernay <Frederic.Devernay@sophia.inria.fr>. + +Mon Sep 5 05:14:31 1994 Per Abrahamsen <abraham@research.att.com> + + * tex.el (TeX-file-extensions): Added LaTeX2 `cls' extension after + query by jmv@di.uminho.pt (Jose Manuel Valenca). + +Tue Aug 30 00:05:28 1994 Per Abrahamsen <abraham@research.att.com> + + * tex-jp.el: New version from koba@flab.fujitsu.co.jp (Kobayashi + Shinji). + + * tex.el (TeX-command-list): Fifth element is now ignored. + + * tex-buf.el (TeX-command-query): Check if region file is newer + than dvi file. + (TeX-command-region): Only query for command _after_ region file + is created. + (TeX-region-create): Only save file if the new content is + different than the original content. + +Mon Aug 29 13:41:59 1994 Per Abrahamsen (abraham@research.att.com) + + * tex-buf.el (TeX-warning): Use offset for line end. Fixed by + ddw2@sunbim.be (Dominique de Waleffe). + +Fri Aug 26 18:17:57 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * doc/auc-tex.texi (Projects): Removed preceding item from + wishlist. + + * latex.el (LaTeX-common-initialization): Fix to comments + separating paragraphs by koba@flab.fujitsu.co.jp (Kobayashi + Shinji). + + * tex-jp.el (LaTeX-fill-region-as-paragraph): New version for MULE + 2.0 by Tomotake FURUHATA <furuhata@trl.ibm.co.jp>. + + * tex.el (TeX-function-p): Spelling error in doc. + +Tue Aug 23 11:00:35 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * doc/intro.texi (Contacts): Some reformulations. + +Sun Aug 21 18:47:23 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * tex-jp.el (TeX-insert-punctuation): Japanese version from + koba@flab.fujitsu.co.jp (Kobayashi Shinji). + +Fri Aug 19 14:59:57 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * doc/install.texi: The `site-lisp' directory is also available in + Lucide Emacs 19.10. Reported by Tim Geisler + <geisler@pms.informatik.uni-muenchen.de>. + +Thu Aug 18 06:56:53 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * latex.el (TeX-arg-cite): Prompt for multiple keys. Suggested by + Masahiro Kitagawa <kitagawa@ee.es.osaka-u.ac.jp>. + +Wed Aug 17 14:00:16 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * style/german.el ("german"): Use `TeX-quote-after-quote'. + Suggested by te@informatik.uni-hannover.de (Thomas Esser). + + * latex.el (LaTeX-common-initialization): Error in regexp for + multiple arguments to `\cite', reported by Masahiro Kitagawa + <kitagawa@ee.es.osaka-u.ac.jp>. + +Wed Aug 17 01:24:55 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * latex.el (LaTeX-env-figure): Put caption inside center + environment. Suggested by Martin Wunderli <wunderli@inf.ethz.ch>. + + * tex.el (TeX-strip-extension): If NODIR is set to `path', remove + the directory part iff it is equal to the current directory, or is + a member of either `TeX-macro-global' or `TeX-macro-private'. + (TeX-master-file): Use `path' for NODIR when querying the user for + a file name. Reported finger@brachio.Informatik.Uni-Dortmund.DE + (Bernd Finger). + +Tue Aug 16 12:22:04 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * latex.el (LaTeX-common-initialization): `eqnarray*' should not + have a label. Reported by dodd@roebling.poly.edu (Lawrence R. + Dodd). + +Thu Aug 11 16:00:18 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * tex-buf.el (TeX-background-filter): Always show background + output. + +Wed Aug 10 19:14:42 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * Makefile (MINMAPSRC): Added `all.el'. + + * all.el: New file. + + * tex-buf.el (TeX-LaTeX-sentinel): Write "some" if + TeX-current-page is nil. Reported by Michail Rozman + <roz@physik.uni-ulm.de>. + +Tue Aug 9 01:26:58 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * auc-menu.el (easy-menu-add): Undid previous change. + (top level `cond'): Use Emacs 18 code if `window-system' is nil. + Patch by Patrice Belleville <patrice@cs.sfu.ca>. + +Mon Aug 8 21:40:01 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * tex.el (TeX-electric-macro): No electricity after `.' or `\'. + +Sat Aug 6 13:53:01 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * latex.el (LaTeX-paragraph-commands): New variable. + (LaTeX-common-initialization): Use it. Suggested by + liyuan@allwise.research.att.com (Yuan P. Li). + + * auc-menu.el (easy-menu-add): Check that `x-popup-menu' is bound + and that we are running under X before calling it. Reported by + Adrian F. Clark <alien@essex.ac.uk> + +Thu Aug 4 19:14:53 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * tex-jp.el (LaTeX-fill-region-as-paragraph): Patch for Emacs 19 + regexps by koba@flab.fujitsu.co.jp (Kobayashi Shinji) reported by + Uenami Ken'ichi <uenami@rita.cow.melco.co.jp>. + + * doc/auc-tex.texi (European): Mention `iso-cvt.el' as suggested + by mike@vlsivie.tuwien.ac.at (Michael Gschwind). + +Wed Aug 3 15:36:02 1994 Per Abrahamsen (abraham@iesd.auc.dk) + + * doc/history.texi: New file. + + * doc/Makefile (HISTORY): Added rule. + + * Makefile (EXTRAFILES): Added `ChangeLog'. + (DOCFILES): Added `history.texi'. + + * doc/auc-tex.texi (History): Made ready for 9.2. Move history to + `history.texi'. + + * doc/changes.texi: Made ready for 9.2. Introduce ChangeLog. + + * Makefile (LispInstall): Use "/bin/pwd" instead of "pwd". + reported by mic@cs.ucsd.edu (Michelangelo Grigni). + + * ChangeLog: New file. + + * Version 9.1 released. +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/INSTALLATION Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,117 @@ +Installation of AUC TeX +*********************** + +Compiling +========= + +The following describes how to install AUC TeX under Unix. You may +also be able to do use these instructions under some other operating +systems, if you have already installed the proper GNU tools, such as +`make'. + + To install AUC TeX for an entire site (which may just be your own +personal Linux box), issue the following two commands as root: + + make + make lispdir=/usr/local/share/emacs/site-lisp install + + except that instead of /usr/local/... you should use the location of +your sites emacs installation. AUC TeX will then be installed in a +subdirectory named `auctex' of the `site-lisp' directory, and the file +`tex-site.el' will be stored directly in the `site-lisp'. You can now +tell your users to enable AUC TeX by adding + + (require 'tex-site) + + to their `.emacs' file. + + If you use xemacs instead, or if your emacs binary is named something +else than `emacs', specify this by using the commands + + make EMACS=xemacs + make lispdir=/usr/local/share/emacs/site-lisp install + + to install. + + If you want to install AUC TeX in your personal account, you should +chose a directory for all your emacs add-ons, for example an `elisp' +subdirectory in your home directory. You can then install AUC TeX with +the commands + + make + make lispdir=$HOME/elisp install + + You will then need to add the following lines to your `.emacs' file: + + (setq load-path (cons "~/elisp" load-path)) + (require 'tex-site) + +Customizing +=========== + + Next, you should edit the file `tex-site.el' to fit your local site. +You do this by looking at the customization section in the beginning +of `tex.el' and copy the definitions that are wrong for your site to +`tex-site.el'. Do *not* edit `tex.el' directly, or you will have to do +all the work over again when you upgrade AUC TeX. AUC TeX will not +overwrite your old `tex-site.el' file next time you install, so you +will be able to keep all your customizations. + + There are two variables with a special significance. + + - User Option: TeX-lisp-directory + The directory where you want to install the AUC TeX lisp files. + + This variable is set automatically by the `make install' command. +If you don't issue a `make install', for example if you don't want to +install AUC TeX in a different place, you will have to set this +variable manually to the location of the compiled files. + + - User Option: TeX-macro-global + Directories containing the site's TeX style files. + + Normally, AUC TeX will only allow you to complete a short list of +build-in macros and environments and on the macros you define yourself. +If you issue the `M-x TeX-auto-generate-global' command after loading +AUC TeX, you will be able to complete on all macros available in the +standard style files used by your document. To do this, you must set +this variable to a list of directories where the standard style files +are located. The directories will be searched recursively, so there is +no reason to list subsirectories explicitly. + + You probably also need to change `TeX-command-list' to make sure +that the commands used for starting TeX, printing, etc. work on your +system. Copy the definition from `tex.el' to `tex-site.el' and edit +the command names appropriately. + + Finally, copy and edit `TeX-printer-list' to contain the printers +available at your site. + + To extract information from your sites TeX macros, type `M-x +TeX-auto-generate-global' in your emacs. This will only work if you +have set `TeX-macro-global' correctly in `tex-site.el'. + +Contributed files +================= + + There are several files that are not part of AUC TeX proper, but +included in the distribution in case they are useful. + +`hilit-LaTeX.el' + Better highlighting for the obsolete `hilit19' package. + +`font-latex.el' + Better highlighting for the FONT-LOCK package. + +`bib-cite.el' + Better support for bibliographies and much more. + +`tex-jp.el' + Support for Japanese. + +`func-doc.el' + Support for context sensitive online help for various languages. + + Read the comments in the start of each file for more information +about how to install, what they do, and who wrote and maintains them. +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/Makefile Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,218 @@ +# Makefile - for the AUC TeX distribution. +# +# Maintainer: Per Abrahamsen <auc-tex@sunsite.auc.dk> +# Version: 9.7i +# +# Edit the makefile, type `make', and follow the instructions. + +##---------------------------------------------------------------------- +## YOU MUST EDIT THE FOLLOWING LINES +##---------------------------------------------------------------------- + +# Where local software is found +prefix=/usr/local + +# Where info files go. +infodir = $(prefix)/info + +# Where local lisp files go. +lispdir = $(prefix)/share/emacs/site-lisp + +# Where the AUC TeX emacs lisp files go. +aucdir=$(lispdir)/auctex + +# Name of your emacs binary +EMACS=emacs + +##---------------------------------------------------------------------- +## YOU MAY NEED TO EDIT THESE +##---------------------------------------------------------------------- + +# Do not change the definition of autodir below, unless you also +# update TeX-auto-global in tex-init.el + +# Where the automatically generated lisp files for your site go. +autodir=$(aucdir)/auto + +# Using emacs in batch mode. +BATCH=$(EMACS) -batch -q -l lpath.el + +# Specify the byte-compiler for compiling AUC TeX files +ELC= $(BATCH) -f batch-byte-compile + +# Specify the byte-compiler for generating style files +AUTO= $(EMACS) -batch -l $(aucdir)/tex.elc \ + -l $(aucdir)/latex.elc -f TeX-auto-generate-global + +# Specify the byte-compiler for compiling generated style files +AUTOC= $(ELC) + +# How to move the byte compiled files to their destination. +MV = mv + +# How to copy the lisp files to their distination. +CP = cp -p + +##---------------------------------------------------------------------- +## BELOW THIS LINE ON YOUR OWN RISK! +##---------------------------------------------------------------------- + +SHELL = /bin/sh + +FTPDIR = /home/ftp/pub/Staff/Per.Abrahamsen/auctex +#FTPDIR = /home/ftp/pub/Staff/Per.Abrahamsen/mirror/ftp/auctex + +WWWDIR = $(HOME)/.public_html/auctex +#WWWDIR = /home/ftp/pub/Staff/Per.Abrahamsen/mirror/www/auctex + +REMOVE = ltx-help.el + +MINMAPSRC = auc-menu.el maniac.el outln-18.el all.el multi-prompt.el + +CONTRIB = bib-cite.el tex-jp.el font-latex.el +CONTRIBELC = bib-cite.elc font-latex.elc + +AUCSRC = auc-old.el tex.el tex-buf.el latex.el tex-info.el multi-prompt.el +AUCELC = auc-old.elc tex.elc tex-buf.elc latex.elc tex-info.elc \ + multi-prompt.elc + + +STYLESRC = style/slides.el style/foils.el style/amstex.el \ + style/article.el style/book.el style/letter.el \ + style/report.el style/amsart.el style/amsbook.el \ + style/epsf.el style/psfig.el style/latexinfo.el \ + style/dutch.el style/german.el style/dk.el \ + style/j-article.el style/j-book.el style/j-report.el \ + style/jarticle.el style/jbook.el style/jreport.el \ + style/dinbrief.el style/virtex.el style/plfonts.el \ + style/plhb.el style/harvard.el style/swedish.el + +DOCFILES = doc/Makefile doc/auc-tex.texi doc/intro.texi doc/install.texi \ + doc/changes.texi doc/tex-ref.tex doc/math-ref.tex doc/history.texi + +EXTRAFILES = COPYING PROBLEMS MSDOS VMS OS2 WIN-NT Makefile ChangeLog \ + lpath.el tex-site.el $(CONTRIB) + +all: lisp + +lisp: + $(ELC) $(AUCSRC) $(STYLESRC) $(CONTRIB) + +install: install-lisp + +tex.elc: tex.el + $(ELC) $(AUCSRC) $(STYLESRC) + +contrib: + $(ELC) bib-cite.el + $(ELC) font-latex.el +# $(ELC) tex-jp.el # Doesn't compile without MULE +# $(ELC) hilit-LaTeX.el # Doesn't compile without X + +install-lisp: tex.elc + if [ ! -d $(lispdir) ]; then mkdir $(lispdir); else true; fi ; + if [ -f $(lispdir)/tex-site.el ]; \ + then \ + echo "Leaving old tex-site.el alone."; \ + else \ + sed -e 's#@AUCDIR#$(aucdir)/#' tex-site.el \ + > $(lispdir)/tex-site.el ; \ + fi + if [ ! -d $(aucdir) ]; then mkdir $(aucdir); else true; fi ; + if [ `/bin/pwd` != `(cd $(aucdir) && /bin/pwd)` ] ; \ + then \ + if [ ! -d $(aucdir)/style ]; then mkdir $(aucdir)/style; \ + else true; fi ; \ + $(MV) $(AUCELC) $(aucdir) ; \ + $(MV) style/*.elc $(aucdir)/style ; \ + $(CP) $(AUCSRC) $(aucdir) ; \ + $(CP) style/*.el $(aucdir)/style ; \ + else \ + echo "Leaving compiled files in place."; \ + fi + +install-contrib: + $(MV) $(CONTRIBELC) $(aucdir) + $(MV) bib-cite.elc $(aucdir) + $(MV) font-latex.elc $(aucdir) + $(CP) $(CONTRIB) $(aucdir) + +install-info: + -(cd doc; $(MAKE) install infodir=$(infodir)) + + +install-auto: + @echo "Use \"M-x TeX-auto-generate-global RET\" instead." + + +.el.elc: + $(ELC) $< + +clean: + rm -rf *~ #*# lex.yy.c idetex auctex + (cd doc; $(MAKE) clean) + +wc: + wc $(AUCSRC) $(STYLESRC) + +dist: + @if [ "X$(TAG)" = "X" ]; then echo "*** No tag ***"; exit 1; fi + if [ "X$(OLD)" = "X" ]; then echo "No patch"; exit 1; fi + @echo "**********************************************************" + @echo "** Making distribution of auctex for release $(TAG)" + @echo "**********************************************************" + if [ -d auctex-$(TAG) ]; then rm -r auctex-$(TAG) ; fi + rm -f $(WWWDIR)/version + echo $(TAG) > $(WWWDIR)/version + perl -pi.bak -e "s/Version: $(OLD)/Version: $(TAG)/" \ + $(AUCSRC) $(EXTRAFILES) + mv ChangeLog ChangeLog.old + echo `date "+%a %b %d %T %Y "` \ + " Per Abrahamsen <abraham@dina.kvl.dk>" > ChangeLog + echo >> ChangeLog + echo " * Version" $(TAG) released. >> ChangeLog + echo >> ChangeLog + cat ChangeLog.old >> ChangeLog + cvs commit -m "Release $(OLD)++" tex.el + rm -f tex.el.orig + mv tex.el tex.el.orig + sed -e '/defconst AUC-TeX-date/s/"[^"]*"/"'"`date`"'"/' \ + -e '/defconst AUC-TeX-version/s/"[^"]*"/"'$(TAG)'"/' \ + < tex.el.orig > tex.el + rm -f $(REMOVE) + -cvs remove $(REMOVE) + -cvs add $(AUCSRC) $(EXTRAFILES) + -(cd doc; cvs add `echo $(DOCFILES) | sed -e s@doc/@@g` ) + -(cd style; cvs add `echo $(STYLESRC) | sed -e s@style/@@g` ) + cvs commit -m "Release $(TAG)" + cvs tag release_`echo $(TAG) | sed -e 's/[.]/_/g'` + mkdir auctex-$(TAG) + mkdir auctex-$(TAG)/style + mkdir auctex-$(TAG)/doc + cp $(AUCSRC) $(EXTRAFILES) auctex-$(TAG) + cp $(STYLESRC) auctex-$(TAG)/style + cp $(DOCFILES) auctex-$(TAG)/doc + (cd doc; $(MAKE) dist; cp auctex auctex-* ../auctex-$(TAG)/doc ) + (cd doc; cp INSTALLATION README CHANGES ../auctex-$(TAG)/ ) + cp doc/CHANGES $(FTPDIR)/CHANGES-$(TAG) + cp doc/auc-tex.ps $(FTPDIR) + cp ChangeLog $(FTPDIR) + cp doc/*.html $(WWWDIR)/doc + rm -f $(FTPDIR)/auctex-$(TAG).tar.gz $(FTPDIR)/auctex.tar.gz + rm -f $(FTPDIR)/auctex.tar.Z $(FTPDIR)/auctex.zip + tar -cf - auctex-$(TAG) | gzip --best > $(FTPDIR)/auctex-$(TAG).tar.gz + tar -cf - auctex-$(TAG) | compress > $(FTPDIR)/auctex.tar.Z + zip -r $(FTPDIR)/auctex auctex-$(TAG) + (cd $(FTPDIR); ln -s auctex-$(TAG).tar.gz auctex.tar.gz) + cvs rdiff -r release_`echo $(OLD) | sed -e 's/[.]/_/g'` \ + -r release_`echo $(TAG) | sed -e 's/[.]/_/g'` auctex \ + > $(FTPDIR)/auctex-$(OLD)-to-$(TAG).patch ; exit 0 + +patch: + cvs rdiff -r release_`echo $(OLD) | sed -e 's/[.]/_/g'` \ + -r release_`echo $(TAG) | sed -e 's/[.]/_/g'` auctex + +min-map: + -cvs add $(MINMAPSRC) + cvs commit -m "Update" + cp $(MINMAPSRC) doc/math-ref.tex $(FTPDIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/PROBLEMS Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,105 @@ +* Your Emacs is missing easymenu.el. + +Please upgrade. + +If that is absolutely impossible, you can try installing + + <URL:ftp://sunsite.auc.dk/packages/auctex/auc-menu.el> + +under the name easymenu.el at some place where emacs can find it. +The best place is in the standard Emacs lisp directory, because that +will automatically be removed when you upgrade. + +* Missing menus or menus containing just the word "Bug". + +You probably have an old version of easymenu.el or auc-menu.el. Find +it, delete it, and recompile AUC TeX. If you are using an old Emacs, +the easymenu.el may have been distributed with it. In that case, see +the previous point. + +* You are not using UNIX or can't figure out how to install. + +0. Delete any old version you have. + +1. Edit tex-site.el. Read the comments in the file. + +2. Add (load-file "<Path to AUC TeX>/tex-site.el") to your .emacs file. + +If you start a fresh emacs, AUC TeX should be loaded now. +The two next steps are optional: + +3. Byte compile the files with "M-x byte-compile-file" for speed. + +4. Do a `M-x TeX-auto-generate-global' to get full macro completion. + +Look also for files with names like MSDOS, OS2, or VMS that might be +applicable for your system. + +* You get errors during byte compilation. + +This often indicates a type in your customizations. If you have +modified `tex-site.el', try to enter that file from Emacs and type +`M-x eval-current-buffer RET' to find the error. + +This is can also be because some old version of AUC TeX gets loaded +during the compilation. Make sure to remove all old versions, and try +again. The Emacs 19 byte-compiler will give warning about free +variables and unknown functions. Ignore them. + +tex-jp.el will fail unless you have an emacs that understands japanese. + +NEmacs-3.3.2 cannot `make install-auto', use `M-x TeX-auto-generate-global' +instead. + +Mule-1.0-KIRITSUBO fails to parse some of the style files. + +* You are using NeXT Emacs. + +NeXT Emacs is broken, a workaround is available by ftp: + +host: sunsite.auc.dk +file: /packages/auctex/get-proc-env.el.z (gzip'ed) + +* You are mixing Emacs 18, FSF Emacs 19, and Lucid Emacs 19. + +Make sure to use the correct byte-compiled files for each version. +You may want to disable the automatic byte compilation by setting + + (setq TeX-byte-compile nil) + +in your .emacs file. + +* None if this completion or multifile stuff works... + +It must be enabled first, insert this in your emacs: + + (setq-default TeX-master nil) + (setq TeX-parse-self t) + (setq TeX-auto-save t) + +Read also the chapters about parsing and multifile documents in the +manual. + +* When I save `foo.bib' AUC TeX forgets the information in `foo.tex'. + +For various reasons, AUC TeX ignores the extension when it store +information about a file, so you should use unique base names for your +files. E.g. rename `foo.bib' to `foob.bib'. + +* (La)TeX Interactive does not work. + +You need comint.el on Emacs 18. Look at your favorite elisp archive. + +* TeX-save-document does not work. + +Make sure TeX-check-path contains "./" somewhere. + +* Ispell does not ignore TeX macros. + +GNU ispell 4.0 does not understand TeX. Upgrade to International +Ispell 3.1 which works much better on TeX documents. + + +% Local Variables: +% mode: outline-minor +% End:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/README Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,170 @@ +Introduction to AUC TeX +*********************** + +This section of the AUC TeX manual gives a brief overview of what AUC +TeX is, and the section is also available as a `README' file. It is +*not* an attempt to document AUC TeX. Real documentation for AUC TeX +is available in the rest of the manual, which you can find in the `doc' +directory. + + Read the `INSTALLATION' file for information about how to install +AUC TeX. It is identical to the Installation chapter in the AUC TeX +manual. + + If you are upgrading from the previous version of AUC TeX, the +latest changes can be found in the `CHANGES' file. If you are +upgrading from an older version, read the History chapter in the AUC +TeX manual. + + AUC TeX is a comprehensive customizable integrated environment for +writing input files for LaTeX using GNU Emacs. + + AUC TeX lets you run TeX/LaTeX and other LaTeX-related tools, such +as a output filters or post processor from inside Emacs. Especially +`running LaTeX' is interesting, as AUC TeX lets you browse through the +errors TeX reported, while it moves the cursor directly to the reported +error, and displays some documentation for that particular error. This +will even work when the document is spread over several files. + + AUC TeX automatically indents your `LaTeX-source', not only as you +write it -- you can also let it indent and format an entire document. +It has a special outline feature, which can greatly help you `getting an +overview' of a document. + + Apart from these special features, AUC TeX provides an large range of +handy Emacs macros, which in several different ways can help you write +your LaTeX documents fast and painless. + + All features of AUC TeX are documented using the GNU Emacs online +documentation system. That is, documentation for any command is just a +key click away! + + AUC TeX is written entirely in Emacs-Lisp, and hence you can easily +add new features for your own needs. It was not made as part of any +particular employment or project (apart from the AUC TeX project +itself). AUC TeX is distributed under the `GNU Emacs General Public +License' and may therefore almost freely be copied and redistributed. + + The next sections are a short introduction to some `actual' features. +For further information, refer to the build-in online documentation of +AUC TeX. + +Indentation and formatting +========================== + + AUC TeX may automatically indent your document as you write it. By +pressing lfd instead of ret at the end of a line, the current line is +indented by two spaces according to the current environment level, and +the cursor is moved down one line. By pressing tab, the current line +is indented, and the cursor stays where it is. The well-known Emacs +feature `format-paragraph' (`M-q') is reimplemented especially for AUC +TeX to follow the indentation. A special command `LaTeX-fill-buffer' +lets you indent an entire document like the well-known C utility indent +(this time, only according to the LaTeX structure :-). + +Completion +========== + + By studying your `\documentstyle' command (in the top of your +document), and consulting a precompiled list of (La)TeX symbols from a +large number of TeX and LaTeX files, AUC TeX is aware of the LaTeX +commands you should able to use in this particular document. This +`knowledge' of AUC TeX is used for two purposes. + + 1. To make you able to `complete' partly written LaTeX commands. You + may e.g. write `\renew' and press `M-tab' (`TeX-complete-symbol'), + and then AUC TeX will complete the word `\renewcommand' for you. + In case of ambiguity it will display a list of possible + completions. + + 2. To aid you inserting environments, that is \begin - \end pairs. + This is done by pressing C-c C-e (LaTeX-environment), and you will + be prompted for which `environment' to insert. + +Editing your document +===================== + + A number of more or less intelligent keyboard macros have been +defined to aid you editing your document. The most important are +listed here below. + +`LaTeX-environment' + (`C-c C-e') Insert a `\begin{}' -- `\end{}' pair as described + above. + +`LaTeX-section' + (`C-c C-s') Insert one of `\chapter', `\section', etc. + +`TeX-font' + (`C-c C-f C-r', `C-c C-f C-i', `C-c C-f C-b') Insert one of + `{\textrm }'), `{\textit \/}' `{\textbf }' etc. + + A number of additional functions are available. But it would be far +too much to write about here. Refer to the rest of the AUC TeX +documentation for further information. + +Running LaTeX +============= + + When invoking on of the commands `TeX-command-master' (`C-c C-c') or +`TeX-command-region' (`C-c C-r') LaTeX is run on either the entire +current document or a given region of it. The Emacs view is split in +two, and the output of TeX is printed in the second half of the screen, +as you may simultaneously continue editing your document. In case TeX +found any errors when processing your input you can call the function +`TeX-next-error' (`C-c `') which will move the cursor to the first +given error, and display a short explanatory text along with the +message TeX gave. This procedure may be repeated until all errors have +been displayed. By pressing `C-c C-w' (`TeX-toggle-debug-boxes') you +can toggle whether the browser also should notify over-full/under-full +boxes or not. + + Once you've successfully formatted your document, you may preview or +print it by invoking `TeX-command-master' again. + +Outlines +======== + + Along with AUC TeX comes support for outline mode for Emacs, which +lets you browse the sectioning structure of your document, while you +will still be able to use the full power of the rest of the AUC TeX +functionality. + +Availability +============ + + The most recent version is always available by ftp at + + `ftp://ftp.iesd.auc.dk/pub/emacs-lisp/auctex.tar.gz' + + In case you don't have access anonymous ftp, you can get it by email +requests to `<ftpmail@decwrl.dec.com>'. + + WWW users may want to check out the AUC TeX page at + + `http://www.iesd.auc.dk/~amanda/auctex/' + +Contacts +======== + + There has been established a mailing list for help, bug reports, +feature requests and general discussion about AUC TeX. You're very +welcome to join. Traffic average at an article by day, but they come +in bursts. If you are only interested in information on updates, you +could refer to the newsgroups `comp.text.tex' and `gnu.emacs.sources'. + + If you want to contact the AUC TeX mailing list, send mail to +`<auc-tex-request@iesd.auc.dk>' in order to join. Articles should be +send to `<auc-tex@iesd.auc.dk>'. + + To contact the current maintainers of auc-TeX directly, email +`<auc-tex_mgr@iesd.auc.dk>'. + + AUC TeX development + c/o Kresten Krab Thorup + + Mathematics and Computer Science + University of Aalborg + DK 9000 Aalborg + Denmark +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/auc-old.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,249 @@ +;;; auc-old.el - Compatibility with AUC TeX 6.* +;; +;; Maintainer: Per Abrahamsen <auc-tex@sunsite.auc.dk> +;; Version: 9.7i +;; +;; Copyright (C) 1991 Kresten Krab Thorup +;; Copyright (C) 1993 Per Abrahamsen +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 1, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Commentary: + +;; This file contains an alternative keymapping, compatible with +;; older versions of AUC TeX. You are strongly suggested to try the +;; new keyboard layout, as we would like this file to go away +;; eventually. + +;;; Code: + +(require 'latex) + +;;; Keymaps + +(defun TeX-define-key (key value) + "OBSOLETE: Define KEY to VALUE in TeX and LaTeX mode." + (define-key plain-TeX-mode-map key value) + (define-key LaTeX-mode-map key value)) + +(TeX-define-key "\n" 'TeX-terminate-paragraph) +(TeX-define-key "\e}" 'up-list) +(TeX-define-key "\e{" 'TeX-insert-braces) +(TeX-define-key "\C-c\C-b" 'TeX-bold) +(TeX-define-key "\C-c\C-i" 'TeX-italic) +(TeX-define-key "\C-c\C-s" 'TeX-slanted) +(TeX-define-key "\C-c\C-r" 'TeX-roman) +(TeX-define-key "\C-c\C-e" 'TeX-emphasize) +(TeX-define-key "\C-c\C-t" 'TeX-typewriter) +(TeX-define-key "\C-c\C-y" 'TeX-small-caps) +(TeX-define-key "\C-c\C-d" 'TeX-region) +(TeX-define-key "\C-c\C-a" 'TeX-buffer) +(TeX-define-key "\C-c\C-p" 'TeX-preview) +(TeX-define-key "\C-c\C-n" 'TeX-next-error) +(TeX-define-key "\C-c!" 'TeX-print) +(TeX-define-key "\e\t" 'TeX-complete-symbol) +(TeX-define-key "\C-c$" 'TeX-run-lacheck) + +(define-key LaTeX-mode-map "\C-c\n" 'TeX-terminate-paragraph) +(define-key LaTeX-mode-map "\C-c\C-x" 'LaTeX-section) +(define-key LaTeX-mode-map "\C-c\C-c" 'LaTeX-environment) +(define-key LaTeX-mode-map "\C-c@" 'LaTeX-bibtex) +(define-key LaTeX-mode-map "\C-c#" 'LaTeX-makeindex) +(define-key LaTeX-mode-map "\em" 'LaTeX-math-mode) +(define-key LaTeX-mode-map "\es" 'LaTeX-fill-section) +(define-key LaTeX-mode-map "\e\C-e" 'LaTeX-mark-environment) +(define-key LaTeX-mode-map "\e\C-x" 'LaTeX-mark-section) +(define-key LaTeX-mode-map "\e\C-q" 'LaTeX-fill-environment) + +;;; Buffer + +(defun TeX-region (begin end) + "OBSOLETE: Run TeX-command-default on current region." + (interactive "r") + (require 'tex-buf) + (setq TeX-current-process-region-p t) + (if (nth 4 (assoc TeX-command-default TeX-command-list)) + (TeX-region-create (TeX-region-file "tex") + (buffer-substring begin end) + (file-name-nondirectory (buffer-file-name)) + (count-lines (point-min) begin))) + (TeX-command TeX-command-default 'TeX-region-file)) + +(defun TeX-buffer () + "OBSOLETE: Run TeX-command-default on the current document." + (interactive) + (save-some-buffers) ; added for compatibility reasons + (require 'tex-buf) + (setq TeX-current-process-region-p nil) + (TeX-command TeX-command-default 'TeX-master-file)) + +(defun TeX-old-command (name) + "OBSOLETE: Run command NAME on either the current document or region." + (require 'tex-buf) + (if TeX-current-process-region-p + (TeX-command name 'TeX-region-file) + (TeX-command name 'TeX-master-file))) + +(defun TeX-preview () + "OBSOLETE: Run View command on either the current document or region." + (interactive) + (TeX-old-command "View")) + +(defun TeX-print () + "OBSOLETE: Run Print command on either the current document or region." + (interactive) + (TeX-old-command "Print")) + +(defun TeX-run-lacheck() + "OBSOLETE: Run lacheck command on either the current document or region." + (interactive) + (TeX-old-command "Check")) + +(defun LaTeX-bibtex () + "OBSOLETE: Run BibTeX command on either the current document or region." + (interactive) + (TeX-old-command TeX-command-BibTeX)) + +(defun LaTeX-makeindex () + "OBSOLETE: Run Index command on either the current document or region." + (interactive) + (TeX-old-command "Index")) + +;;; Fonts + +(defun TeX-bold () + (interactive "*") + (insert TeX-grop TeX-esc "bf " TeX-grcl) + (backward-char 1)) + +(defun TeX-italic () + (interactive "*") + (insert TeX-grop TeX-esc "it " TeX-esc "/" TeX-grcl) + (backward-char 3)) + +(defun TeX-slanted () + (interactive "*") + (insert TeX-grop TeX-esc "sl " TeX-esc "/" TeX-grcl) + (backward-char 3)) + +(defun TeX-roman () + (interactive "*") + (insert TeX-grop TeX-esc "rm " TeX-grcl) + (backward-char 1)) + +(defun TeX-emphasize () + (interactive "*") + (insert TeX-grop TeX-esc "em " TeX-esc "/" TeX-grcl) + (backward-char 3)) + +(defun TeX-typewriter () + (interactive "*") + (insert TeX-grop TeX-esc "tt " TeX-grcl) + (backward-char 1)) + +(defun TeX-small-caps () + (interactive "*") + (insert TeX-grop TeX-esc "sc " TeX-grcl) + (backward-char 1)) + +;;; AUC (La)TeX Mode +;; +;; Added by marsj@ida.liu.se Thu Mar 5 17:52:38 1992 to support +;; automatic mode change after using insert-mode-line hook. Also +;; modified regexp to choose tex mode to be more aware of latex +;; (documentstyle is uniq, isn'it) + +(defun insert-mode-line () + "This little macro inserts `% -*- mode-name -*-' if not present. +You should insert this in your TeX-mode-hook!" + (interactive "*") + (save-excursion + (goto-char (point-min)) + (if (not (re-search-forward "-\\*-.*-\\*-" 100 t)) + (insert-string (concat "% -*- " + (substring (symbol-name major-mode) 0 -5) + " -*-\n"))))) + +(defun auc-tex-mode () + "Called when we have a mode line specification in first line." + (interactive) + (plain-tex-mode)) + +(defun auc-latex-mode () + "Called when we have a mode line specification in first line." + (interactive) + (latex-mode)) + +;;; Validation + +(defun TeX-validate-buffer () + "Check current buffer for paragraphs containing mismatched $'s. +As each such paragraph is found, a mark is pushed at its beginning, +and the location is displayed for a few seconds." + (interactive) + (let ((opoint (point))) + (goto-char (point-max)) + ;; Does not use save-excursion + ;; because we do not want to save the mark. + (unwind-protect + (while (and (not (input-pending-p)) (not (bobp))) + (let ((end (point))) + (search-backward "\n\n" nil 'move) + (or (TeX-validate-paragraph (point) end) + (progn + (push-mark (point)) + (message "Mismatch found in pararaph starting here") + (sit-for 4))))) + (goto-char opoint)))) + +(defun TeX-validate-paragraph (start end) + (condition-case () + (save-excursion + (save-restriction + (narrow-to-region start end) + (goto-char start) + (forward-sexp (- end start)) + t)) + (error nil))) + +(defun TeX-terminate-paragraph (inhibit-validation) + "Insert two newlines, breaking a paragraph for TeX. +Check for mismatched braces/$'s in paragraph being terminated. +A prefix arg inhibits the checking." + (interactive "*P") + (or inhibit-validation + (TeX-validate-paragraph + (save-excursion + (search-backward "\n\n" nil 'move) + (point)) + (point)) + (message "Paragraph being closed appears to contain a mismatch")) + (reindent-then-newline-and-indent) + (newline-and-indent)) + +;;; Miscellaneous + +(defun TeX-cmd-on-region (begin end command) + "Reads a (La)TeX-command. Makes current region a TeX-group. +Inserts command at the start of the group." + (interactive "*r\ns(La)TeX-command on region: ") + (save-excursion + (goto-char end) (insert TeX-grcl) + (goto-char begin) (insert TeX-grop TeX-esc command " "))) + +(provide 'auc-old) +(provide 'auc-tex) + +;;; auc-old.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/bib-cite.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,2722 @@ +;; bib-cite.el - Display \cite, \ref or \label / Extract refs from BiBTeX file. + +;; Copyright (C) 1994, 1995, 1996, 1997 Peter S. Galbraith + +;; Author: Peter S. Galbraith <rhogee@bathybius.meteo.mcgill.ca> +;; Created: 06 July 1994 +;; Version: 2.28 (22 January 97) +;; Keywords: bibtex, cite, auctex, emacs, xemacs + +;; RCS $Id: bib-cite.el,v 1.1 1997/02/20 02:17:35 steve Exp $ +;; Note: RCS version number does not correspond to release number. + +;; Everyone is granted permission to copy, modify and redistribute this +;; file provided: +;; 1. All copies contain this copyright notice. +;; 2. All modified copies shall carry a prominant notice stating who +;; made modifications and the date of such modifications. +;; 3. The name of the modified file be changed. +;; 4. No charge is made for this software or works derived from it. +;; This clause shall not be construed as constraining other software +;; distributed on the same medium as this software, nor is a +;; distribution fee considered a charge. + +;; LCD Archive Entry: +;; bib-cite|Peter Galbraith|galbraith@mixing.qc.dfo.ca| +;; Display \cite, \ref or \label / Extract refs from BiBTeX file.| +;; 22-Jan-1997|2.28|~/misc/bib-cite.el.gz| + +;; ---------------------------------------------------------------------------- +;;; Commentary: + +;; New versions of this package (if they exist) may be found at: +;; ftp://ftp.phys.ocean.dal.ca/users/rhogee/elisp/bib-cite.el + +;; Operating Systems: +;; Works in unix, DOS and OS/2. Developped under Linux. +;; VMS: I have no clue if this works under VMS. I don't know how emacs handle +;; logical names (i.e. for BIBINPUTS) but I am willing to fix this package for +;; VMS if someone if willing to test it and answer questions. + +;; AUC-TEX USERS: +;; auc-tex is a super-charged LaTeX mode for emacs. Get it at: +;; ftp://ftp.iesd.auc.dk/pub/emacs-lisp/auctex.tar.gz <-stable release +;; ftp://ftp.dina.kvl.dk/pub/Staff/Per.Abrahamsen/auctex/ <-alpha release +;; +;; WWW users may want to check out the AUC TeX page at +;; http://www.iesd.auc.dk/~amanda/auctex/ +;; +;; bib-cite.el is included in the auc-tex distribution. Therefore, if +;; you use auc-tex, you probably have an old version of bib-cite.el in +;; your load-path which may get loaded instead of this file (unless this +;; is the auc-tex file!). Make sure you replace that file, or rename it, +;; or delete it!!! + +;; MS-DOS USERS: +;; Multifile documents are supported by bib-cite by using etags (TAGS files) +;; which contains a bug for MSDOS (at least for emacs 19.27 it does). +;; Get the file +;; ftp://ftp.phys.ocean.dal.ca/users/rhogee/elisp/bib-cite.etags-bug-report +;; to see what patches to make to etags.c to fix it. + +;; Description: +;; ~~~~~~~~~~~ +;; This package is used in various TeX modes to display or edit references +;; associated with \cite commands, or matching \ref and \label commands. +;; (so I actually overstep BiBTeX bounds here...) +;; These are the functions: +;; +;; bib-display bib-display-mouse +;; - Display citation, \ref or \label under point +;; bib-find bib-find-mouse +;; - Edit citation, \ref or \label under point +;; bib-make-bibliography - Make BiBTeX file containing only cite keys used. +;; bib-apropos - Search BiBTeX source files for keywords. +;; bib-etags - Refreshes (or builds) the TAGS files for +;; multi-file documents. +;; bib-create-auto-file - Used in bibtex-mode to create cite key +;; completion .el file for auctex. +;; bib-highlight-mouse - Highlight \cite, \ref and \label commands in +;; green when the mouse is over them. + +;; About Cite Commands and related functions: +;; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +;; Various flavors of \cite commands are allowed (as long as they contain +;; the word `cite') and they may optionally have bracketed [] options. +;; Bibtex Cross-references are displayed, and @string abbreviations are +;; substituted or included. +;; +;; The \cite text is found (by emacs) in the bibtex source files listed in the +;; \bibliography command. The BiBTeX files can be located in a search path +;; defined by an environment variable (typically BIBINPUTS, but you can change +;; this). +;; +;; All citations used in a buffer can also be listed in a new bibtex buffer by +;; using bib-make-bibliography. This is useful to make a bibtex file for a +;; document from a large bibtex database. In this case, cross-references are +;; included, as well as the @string commands used. The @string abbreviations +;; are not substituted. +;; +;; The bibtex files can also be searched for entries matching a regular +;; expression using bib-apropos. + +;; Usage instructions: +;; ~~~~~~~~~~~~~~~~~~ +;; bib-display Bound to Mouse-3 when specially highlighted. +;; In Hyperbole, bound to the Assist key. +;; Bound to `\C-c b d' +;; +;; bib-display will show the bibtex entry or the corresponding label or +;; ref commands from anywhere within a document. +;; With cursor on the \cite command itslef +;; -> display all citations of the cite command from the BiBTeX source. +;; With cursor on a particular cite key within the brackets +;; -> display that citation's text from the BiBTeX source file(s). +;; +;; Example: +;; +;; \cite{Wadhams81,Bourke.et.al87,SchneiderBudeus94} +;; ^Cursor -> Display-all-citations ^Cursor -> Display-this-citation +;; +;; With cursor on a \label command +;; -> Display first matching \ref command in the document +;; With cursor on a \ref command +;; -> Display environment associated with the matching \label command. +;; +;; Finding a ref or label within a multi-file document requires a TAGS file, +;; which is automatically generated for you. This enables you to then use +;; any tags related emacs features. +;; +;; bib-find Bound to Mouse-2 when specially highlighted. +;; In Hyperbole, bound to the Action key. +;; Bound to `\C-c b f' +;; +;; bib-find will select the buffer and move point to the BiBTeX source file +;; at the proper citation for a cite command, or move point to anywhere +;; within a document for a label or ref command. The ref chosen is the +;; first occurrance within a document (using a TAGS file). If point is +;; moved within the same buffer, mark is set before the move and a message +;; stating so is given. If point is moved to another file, this is done in +;; a new window using tag functions. Within a plain file, the search +;; pattern is set for another similar \ref command (since TAGS file are not +;; used). Within a multi-file document the following tag functions are +;; appropriately setup: +;; +;; C-u M-. Find next alternate definition of last tag specified. +;; +;; C-u - M-. Go back to previous tag found. +;; +;; +;; For multi-file documents, you must be using auctex (so that bib-cite can +;; find the master file) and all \input and \include commands must be first +;; on a line (not preceeded by any non-white text). +;; +;; imenu support (Suggested key binding: Shift-Mouse-3) +;; +;; If you want to bind imenu globally to Shift-Mouse-3, do so by adding the +;; following to your ~/.emacs +;; +;; (require 'imenu) +;; (define-key global-map [S-mouse-3] 'imenu) +;; +;; Another good place to define Imenu is in the menu-bar. You can try this +;; manually with +;; +;; M-x imenu-add-to-menubar RET Imenu RET +;; +;; or in a hook such as: +;; +;; (add-hook 'LaTeX-mode-hook '(lambda () (imenu-add-to-menubar "Imenu"))) +;; +;; The imenu facility (distributed with emacs) is supported by bib-cite to +;; move point to a LaTeX section (or chapter) division or to a label +;; declaration. When editing a multi-file document, all such declarations +;; within the document are displayed in the menu (again using a TAGS file). +;; If you do not want to load imenu.el and use these features, set +;; bib-use-imenu to nil. (This feature is disabled in xemacs because I'm +;; told it doesn't have imenu). +;; +;; bib-make-bibliography: Bound to `\C-c b m' +;; +;; Extract citations used in the current document from the \bibliography{} +;; file(s). Put them into a new suitably-named buffer. In a auctex +;; multi-file document, the .aux files are used to find the cite keys (for +;; speed). You will be warned if these are out of date. +;; +;; This buffer is not saved to a file. It is your job to save it to whatever +;; name you wish. Note that auctex has a unique name space for LaTeX and +;; BiBTeX files, so you should *not* name the bib file associated with +;; example.tex as example.bib! Rather, name it something like +;; example-bib.bib. +;; +;; bib-apropos: Bound to `\C-c b a' +;; +;; Searches the \bibliography{} file(s) for entries containing a keyword and +;; display them in the *help* buffer. You can trim down your search by using +;; bib-apropos in the *Help* buffer after the first invocation. the current +;; buffer is also searched for keyword matches if it is in bibtex-mode. +;; +;; It doesn't display cross-references nor does it substitute or display +;; @string commands used. It could easily be added, but it's faster this +;; way. Drop me a line if this would be a useful addition. +;; +;; If you find yourself entering a cite command and have forgotten which key +;; you want, but have entered a few initial characters as in `\cite{Gal', +;; then invoke bib-apropos. It will take that string (in this case `Gal') as +;; an initial response to the apropos prompt. You are free to edit it, or +;; simply press carriage return. +;; +;; bib-etags: Bound to `\C-c b e' +;; +;; Creates a TAGS file for auc-tex's multi-file document (or refreshes it). +;; This is used by bib-find when editing multi-file documents. The TAGS file +;; is created automatically, but it isn't refreshed automatically. So if +;; bib-find can't find something, try running bib-etags again. The *rescan* +;; in imenu also calls bib-etags to refresh the TAGS file, so that is another +;; way to generate it. +;; +;; bib-create-auto-file: +;; +;; Use this when editing a BiBTeX buffer to generate the auc-tex .el file +;; which tell emacs about all its cite keys. I've added this command to +;; bibtex-mode pull-down menu. +;; +;; bib-highlight-mouse: Bound to `\C-c b h' +;; +;; Highlights \cite, \ref and \label commands in green when the mouse is over +;; them. By default, a call to this function is added to LaTeX-mode-hook +;; (via bib-cite-initialize) if you set bib-highlight-mouse-t to true. But +;; you may want to run this command to refresh the highlighting for newly +;; edited text. + +;; Installation instructions: +;; ~~~~~~~~~~~~~~~~~~~~~~~~~ +;; If you use a menued environment (e.g. X Window System), bib-cite must be +;; loaded *after* your LaTeX-mode menus are created in order to bypass an +;; annoying bug in bib-cite. This is done by loading bib-cite via a +;; mode-hook: +;; - If you are using AUC-TeX (http://sunsite.auc.dk/auctex/), add the +;; following lines to your ~/.emacs file: +;; +;; (defun my-LaTeX-mode-hook () +;; (require 'bib-cite)) +;; (add-hook 'LaTeX-mode-hook 'my-LaTeX-mode-hook) +;; +;; - If you are using Emacs' regulare LaTeX-mode, use instead: +;; +;; (defun my-LaTeX-mode-hook () +;; (require 'bib-cite)) +;; (add-hook 'latex-mode-hook 'my-TeX-mode-hook) +;; +;; If you do not use a windowed environment, all you need to do is add this +;; line to your .emacs file: +;; +;; (require 'bib-cite) +;; +;; bib-cite can be used with auctex, or stand-alone. If used with auctex on a +;; multi-file document (and auctex's parsing is used), then all \bibliography +;; commands in the document will be found and used. +;; --- +;; The following variable can be unset (like shown) to tell bib-cite to +;; not give advice messages about which commands to use to find the next +;; occurrence of a search: +;; +;; (setq bib-novice nil) +;; --- +;; By default, bib-cite adds a menu-bar pull-down menu under a separate name. +;; Under emacs' tex-mode and auctex's latex-mode, it can be placed within +;; the existing menu if you set the following: +;; +;; (setq bib-cite-put-menu-separately nil) +;; +;; This variable has no effect under XEmacs. Should I change this? +;; --- +;; The imenu features will be disabled if you set this variable to nil +;; +;; (setq bib-use-imenu nil) +;; +;; This variable has no effect under XEmacs. +;; --- +;; If you use hilit19 (or hl319), then bib-display will use it to highlight +;; the display unless you turn this off with: +;; +;; (setq bib-hilit-if-available nil) +;; +;; If you don't use hilit19, or if this is nil, and if you use font-lock +;; then it will be used by bib-display. +;; --- +;; The variable bib-switch-to-buffer-function sets the function used to +;; select buffers (if they differ from the original) in bib-cite commands +;; bib-make-bibliography, bib-display, bib-find +;; You may use `switch-to-buffer' `switch-to-buffer-other-window' or +;; `switch-to-buffer-other-frame'. +;; --- +;; The following variable determines whether we will attempt to highlight +;; citation, ref and label commands in green when they are under the +;; mouse. When highlighted, the mouse keys work to call bib-display +;; (bound to [mouse-3]) and bib-find (bound to [mouse-2]). If you use a +;; mode other than LaTeX-mode, you'll want to call bib-highlight-mouse with +;; a hook (See how we do this at the end of this file with the add-hook +;; command). +;; +;; (setq bib-highlight-mouse-t nil) +;; --- +;; If you use DOS or OS/2, you may have to set the following variable: +;; +;; (setq bib-dos-or-os2-variable t) +;; +;; if bib-cite.el fails to determine that you are using DOS or OS/2. +;; Try `C-h v bib-dos-or-os2-variable' to see if it needs to be set manually. +;; --- +;; bib-cite needs to call the etags program with its output file option +;; and also with the append option (usually -a). +;; I figured that DOS and OS/2 would use "etags /o=" instead of the unix +;; variant "etags -o ", but users have reported differently. So while the +;; unix notation is used here, you can reset it if you need to like so: +;; +;; (setq bib-etags-command "etags /o=") +;; (setq bib-etags-append-command "etags /a /o=") +;; --- +;; For multi-file documents, a TAGS file is generated by etags. +;; By default, its name is TAGS. You can change this like so: +;; +;; (setq bib-etags-filename "TAGSLaTeX") +;; --- +;; If your environment variable to find BiBTeX files is not BIBINPUTS, then +;; reset it with the following variable (here, assuming it's TEXBIB instead): +;; +;; (setq bib-bibtex-env-variable "TEXBIB") +;; +;; Note that any directory ending in a double slash will cause bib-cite to +;; search recursively through subdirectories for your .bib files. This can +;; be slow, so use this judiciously. +;; e.g. setenv BSTINPUTS .:/home/rhogee/LaTeX/bibinputs// +;; -> all directories below /home/rhogee/LaTeX/bibinputs/ will be +;; searched. +;; --- +;; If you do not wish bib-display to substitute @string abbreviations, +;; then set the following variable like so: +;; +;; (setq bib-substitute-string-in-display nil) +;; --- +;; Warnings are given when @string abbreviations are not defined in your bib +;; files. The exception is for months, usually defined in style files. If you +;; use other definitions in styles file (e.g. journals), then you may add them +;; to the `bib-substitute-string-in-display' list variable. + +;; If you find circumstances in which this package fails, please let me know. + +;; Things for me to do in later versions: +;; - jmv@di.uminho.pt (Jose Manuel Valenca) wants: +;; - prompt for \cite as well as \label and \ref +;; (and use auctex's completion list) +;; - implement string concatenation, with #[ \t\n]*STRING_NAME +;; - Create new command to substitute @string text in any bibtex buffer. + +;; ---------------------------------------------------------------------------- +;;; Change log: +;; V2.28 Jan 22 97 - Peter Galbraith (RCS V1.9) +;; - Bug in bib-create-auto-file. +;; V2.27 Dec 31 96 - Peter Galbraith (RCS V1.8) +;; - allow spaces between cite keys. +;; - Vladimir Alexiev <vladimir@cs.ualberta.ca> +;; Allow () delimiters as well as {}. +;; Better check on bibtex-menu +;; Erase *bibtex-bibliography* buffer. +;; V2.26 Sep 24 96 - Peter Galbraith (RCS V1.7) +;; imenu bug fix. +;; V2.25 Sep 23 96 - Anders Stenman <stenman@isy.liu.se> (RCS V1.6) +;; XEmacs bib-cite-fontify-help-as-latex bug fix. +;; V2.24 Aug 19 96 - Peter Galbraith (RCS V1.3) +;; XEmacs bug fix, minor defvars - Vladimir Alexiev <vladimir@cs.ualberta.ca> +;; V2.23 Aug 13 96 - Peter Galbraith (RCS V1.2) +;; XEmacs - Add bib-cite entries to bibtex-mode popup menu. +;; V2.22 July 22 96 - Peter Galbraith (RCS V1.1) +;; local-map has `m' for bib-make-bibliography instead of `b' +;; set-buffer-menubar in XEmacs so that menu disappears after use. +;; V2.21 July 12 96 - Peter Galbraith +;; Define `\C-c b' keymap for both plain tex and auctex, in XEmacs and emacs. +;; Separate menu-bar menu in gnu emacs. +;; font-lock support for bib-display'ed citations (bibtex fontification) +;; and for matching \ref{} and \labels (latex fontification). +;; buffer-substring-no-properties in bib-apropos +;; (bug in completing-read with mouse faces) +;; imenu-sort-function made local and nil. +;; imenu--LaTeX-name-and-position fixed for section name containing "\" +;; Various other things... (whitespace within label strings, etc...) +;; V2.20 June 25 96 - Peter Galbraith +;; imenu fixed for emacs-19.31. +;; V2.19 May 13 96 +;; PSG: +;; - @string substitution fixed; bib-edit-citation fixed when buffer exists; +;; Christoph Wedler <wedler@fmi.uni-passau.de>: +;; - Added bib-switch-to-buffer-function +;; - (setq tags-always-exact nil) for xemacs +;; - removed eval-after-load foe xemacs +;; V2.18 May 06 96 - PSG +;; New eval-after-load from Fred Devernay <Frederic.Devernay@sophia.inria.fr> +;; V2.17 May 03 96 - PSG +;; Fixed bug introduced in V2.16, reported by Dennis Dams <wsindd@win.tue.nl> +;; V2.16 May 02 96 - Vladimir Alexiev <vladimir@cs.ualberta.ca> +;; - somewhat compatible with Hyperbole by binding bib-find and bib-display to +;; the Action and Assist keys inside the bib-highlight-mouse-keymap. +;; - makes more liberal provisions for users with a tty. +;; V2.15 Apr 09 96 - +;; - fix "Buffer read-only" error caused by mouse-face text properties +;; patch by Piet van Oostrum <piet@cs.ruu.nl> +;; - Use tmm non-X menu, patch by Vladimir Alexiev <vladimir@cs.ualberta.ca> +;; - input{file.txt} would not work. +;; bug report: David Kastrup <dak@pool.informatik.rwth-aachen.de> +;; V2.14 Feb 26 96 - PSG - define eval-after-load for xemacs +;; Frederic Devernay's <Frederic.Devernay@sophia.inria.fr> suggestion. +;; V2.13 Feb 08 96 - Peter Galbraith - Fixed recursive use of bib-apropos. +;; V2.12 Jan 19 96 - Peter Galbraith +;; emacs-19.30's [down-mouse-1] is defined (rather than [mouse-1]), so +;; bib-highlight-mouse-keymap now has [down-mouse-1] defined to override it. +;; V2.11 Nov 21 95 - Peter Galbraith +;; - Fixed bib-create-auto-file when bib file loaded before LaTeX file. +;; - Michal Mnuk's better imenu labels menu <Michal.Mnuk@risc.uni-linz.ac.at> +;; - [mouse-1] and [mouse-2] key defs for highlighted regions. +;; - Improve X menus. +;; - Skip over style files in bib-document-TeX-files. +;; - Add menus and mouse highlighting for xemacs +;; Anders Stenman <stenman@isy.liu.se> Dima Barsky <D.Barsky@ee.surrey.ac.uk> +;; - Check bib-use-imenu before calling LaTeX-hook-setq-imenu. +;; From: Kurt Hornik <hornik@ci.tuwien.ac.at> +;; - Remove mouse face properties before inserting new ones. +;; From: Peter Whaite <peta@Whippet.McRCIM.McGill.EDU> +;; V2.10 Aug 17 95 - Peter Galbraith - fatal bugs in bib-make-bibliography. +;; V2.09 Jul 19 95 - Peter Galbraith +;; - Had introduced bug in search-directory-tree. synced with ff-paths.el. +;; V2.08 Jul 13 95 - Peter Galbraith +;; Fred Douglis <douglis@research.att.com> says etags should be required +;; V2.07 Jul 04 95 - Peter Galbraith +;; - Minor changes with filename manipulations (careful with DOS...) +;; - Problem if auc-tex not already loaded -> LaTeX-mode-map +;; V2.06 Jul 03 95 - Peter Galbraith - Added recursion through BIBINPUTS path. +;; V2.05 Jun 22 95 - Peter Galbraith Bug: Hanno Wirth <wirth@jake.igd.fhg.de> +;; bib-get-citations would truncate @String{KEY ="J. {\"u} Res."} +;; V2.04 Jun 19 95 - Peter Galbraith - +;; - use bibtex-mode syntax table in bib buffer, else bib-apropos truncates +;; an article if it contains an unbalanced closing parenthesis. +;; - bib-highlight-mouse would mark a buffer modified +;; V2.03 May 16 95 - Peter Galbraith - +;; auc-tec menu compatible with old "AUC TeX" pull-down name +;; V2.02 May 10 95 - Peter Galbraith - +;; bug report by Bodo Huckestein <bh@thp.Uni-Koeln.DE> (getenv env) under DOS +;; V2.01 Mar 27 95 - Peter Galbraith - No imenu on xemacs; check BIBINPUT also +;; V2.00 Mar 27 95 - Peter Galbraith +;; - bib-find and bib-display replace bib-edit-citation and +;; bib-display-citation +;; - bib-apropos now take initial guess from start of cite argument at point. +;; - Multi-file support for bib-make-bibliography using .aux files. +;; - \label and \ref functionality for bib-find and bib-display: +;; - \label may appear within an \begin\end or to label a (sub-)section. +;; - Cursor on \label, goto first \ref, set next i-search to pattern. +;; - Cursor on \ref, goto \label or display it's environment or section. +;; - Works on hidden code! +;; V1.08 Jan 16 95 - Peter Galbraith +;; bib-apropos can be used within *Help* buffer to trim a search. +;; V1.07 Dec 13 94 - Peter Galbraith +;; - Fixed: multi-line @string commands in non-inserted display. +;; - Fixed: quoted \ character in @string commands. +;; - BiBTeX comments should not affect bib-cite +;; - Fixed bib-apropos (from Christoph Wedler <wedler@fmi.uni-passau.de>) +;; Faster now, and avoids infinite loops. +;; - Added bib-edit-citation to edit a bibtex files about current citation. +;; - Allow space and newlines between citations: \cite{ entry1, entry2} +;; - Added bib-substitute-string-in-display, bib-string-ignored-warning +;; and bib-string-regexp. +;; - bib-display-citation (from Markus Stricker <stricki@vision.ee.ethz.ch>) +;; Could not find entry with trailing spaces +;; V1.06 Nov 20 94 - Peter Galbraith +;; - Fixed bib-apropos for: +;; hilighting without invoking bibtex mode. +;; display message when no matches found. +;; would search only last bib file listed (forgot to `goto-char 1') +;; - Fixed bib-make-bibliography that would only see first citation in a +;; multi-key \cite command (found by Michail Rozman <roz@physik.uni-ulm.de> +;; - bib-make-bibliography didn't see \cite[A-Z]* commands. +;; Found by Richard Stanton <stanton@haas.berkeley.edu> +;; ************************************************** +;; - * Completely rewritten code to support crossrefs * +;; ************************************************** +;; - autodetection of OS/2 and DOS for bib-dos-or-os2-variable +;; - Created bib-display-citation-mouse +;; - bib-apropos works in bibtex-mode on the current buffer +;; - bibtex entry may have comma on next line (!) +;; @ARTICLE{Kiryati-91 +;; , YEAR = {1991 } +;; ... +;; V1.05 Nov 02 94 - Peter Galbraith +;; - bug fix by rossmann@TI.Uni-Trier.DE (Jan Rossmann) +;; for (boundp 'TeX-check-path) instead of fboundp. Thanks! +;; - Translate environment variable set by bib-bibtex-env-variable. +;; (suggested by Richard Stanton <stanton@haas.berkeley.edu>) +;; - add bib-dos-or-os2-variable to set environment variable path separator +;; - Add key-defs for any tex-mode and auc-tex menu-bar entries. +;; [in auc-tec TeX-mode-map is common to both TeX and LaTeX at startup +;; (but TeX-mode-map is only copied to LaTeX-mode-map at initilisation) +;; in plain emacs, use tex-mode-map for both TeX and LaTeX.] +;; - Add key def for bibtex-mode to create auc-tex's parsing file. +;; - Fix bugs found by <thompson@loon.econ.wisc.edu> +;; - fix bib-get-citation for options +;; - fix bib-get-citation for commas preceeded citation command +;; - better regexp for citations and their keys. +;; - Added @string support for any entry (not just journal entries). +;; (I had to disallow numbers in @string keys because of years. +;; Is that ok?) +;; - added bib-apropos +;; V1.04 Oct 24 94 - Peter Galbraith +;; - Don't require dired-aux, rather define the function we need from it. +;; - Regexp-quote the re-search for keys. +;; - Name the bib-make-bibliography buffer diffently than LaTeX buffer +;; because auc-tex's parsing gets confused if same name base is used. +;; V1.03 Oct 24 94 - Peter Galbraith - require dired-aux for dired-split +;; V1.02 Oct 19 94 - Peter Galbraith +;; - If using auc-tex with parsing activated, use auc-tex's functions +;; to find all \bibliography files in a multi-file document. +;; - Find bib files in pwd, BIBINPUTS environment variable path and +;; TeX-check-path elisp variable path. +;; - Have the parser ignore \bibliography that is on a commented `%' line. +;; (patched by Karl Eichwalder <karl@pertron.central.de>) +;; - Allow for spaces between entry type and key in bib files: +;; (e.g @Article{ key} ) +;; (suggested by Nathan E. Doss <doss@ERC.MsState.Edu>) +;; - Allows options in \cite command (e.g. agu++ package \cite[e.g.][]{key}) +;; - Includes @String{} abbreviations for `journal' entries +;; V1.01 July 07 94 - Peter Galbraith - \bibliography command may have list of +;; BibTeX files. All must be readable. +;; V1.00 July 06 94 - Peter Galbraith - Created +;; ---------------------------------------------------------------------------- +;;; Code: + +;;>>>>>>User-Modifiable variables start here: + +(defvar bib-novice t + "*Give advice to novice users about what commands to use next.") + +(defvar bib-use-imenu (not (string-match "XEmacs\\|Lucid" emacs-version)) + "*Use imenu package for LaTeX modes (coded in bib-cite).") + +(defvar bib-hilit-if-available t + "*Use hilit19 or hl319 to hilit bib-display if available") + +(defvar bib-switch-to-buffer-function 'switch-to-buffer + "*Function used to select buffers if they differ from the original. +You may use `switch-to-buffer' `switch-to-buffer-other-window' or +`switch-to-buffer-other-frame'.") + +(defvar bib-highlight-mouse-t t + "*Call bib-highlight-mouse from LaTeX-mode-hook to add green highlight.") + +(defvar bib-bibtex-env-variable "BIBINPUTS" + "*Environment variable setting the path where BiBTeX input files are found. +BiBTeX 0.99b manual says this should be TEXBIB. +Another version says it should BSTINPUTS. I don't know anymore! + +The colon character (:) is the default path separator in unix, but you may +use semi-colon (;) for DOS or OS/2 if you set bib-dos-or-os2-variable to `t'.") + +(defvar bib-dos-or-os2-variable (or (equal 'emx system-type) + (equal 'ms-dos system-type)) +;; Under OS/2 system-type equals emx +;; Under DOS system-type equals ms-dos + "*`t' if you use DOS or OS/2 for bib-make-bibliography/bib-display + +It tells bib-make-bibliography and bib-display to translate +the BIBINPUTS environment variable using the \";\" character as +a path separator and to translate DOS' backslash to slash. + +e.g. Use a path like \"c:\\emtex\\bibinput;c:\\latex\\bibinput\" + +(You can change the environment variable which is searched by setting the +elisp variable bib-bibtex-env-variable)") + +(defvar bib-etags-command "etags -o " + "*Variable for the etags command and its output option. +In unix, this is usually \"etags -o \" +In DOS and OS/2, this *may* be \"etags /o=\" If so, set it this variable.") + +(defvar bib-etags-append-command "etags -a -o " + "*Variable for the etags command and its append and output option. +In unix, this is usually \"etags -a -o \" +In DOS and OS/2, this *may* be \"etags /a /o=\" If so, set it this variable.") + +(defvar bib-etags-filename "TAGS" + "*Variable for the filename generated by etags, by defaults this TAGS +but you may want to change this to something like TAGSLaTeX such that it can +coexist with some other tags file in your master file directory.") + +(defvar bib-substitute-string-in-display t + "*Determines if bib-display will substitute @string definitions. +If t, then the @string text is substituted. +If nil, the text is not substituted but the @string entry is included.") + +(defvar bib-string-ignored-warning + '("jan" "feb" "mar" "apr" "may" "jun" "jul" "aug" "sep" "sept" "oct" "nov" + "dec") + "*List of @string abbreviations for which a warning is given if not defined. +These are usually month abbreviations (or journals) defined in a style file.") + +;;<<<<<<User-Modifiable variables end here. + +;; Following from bibtex.el +(defvar + bib-cite-bibtex-font-lock-keywords + '(("^\\( \\|\t\\)*\\(@[A-Za-z]+\\)[ \t]*[({]\\([][A-Za-z0-9.:;?!`'()/*@_+=|<>-]+\\)?" + (2 font-lock-function-name-face) + (3 font-lock-reference-face nil t)) + ;; reference type and reference label + ("^[ \t]*\\(OPT[^\"#%'(),={} \t\n0-9][^\"#%'(),={} \t\n]*\\)[ \t]*=" + 1 font-lock-comment-face) + ;; optional field names (treated as comments) + ("^[ \t]*\\([^\"#%'(),={} \t\n0-9][^\"#%'(),={} \t\n]*\\)[ \t]*=" + 1 font-lock-variable-name-face) + ;; field names + "Default expressions to fontify in BibTeX mode.")) + +(defvar bib-cite-bibtex-mode-syntax-table + (let ((st (make-syntax-table))) + ;; [alarson:19920214.1004CST] make double quote a string quote + (modify-syntax-entry ?\" "\"" st) + (modify-syntax-entry ?$ "$$ " st) + (modify-syntax-entry ?% "< " st) + (modify-syntax-entry ?' "w " st) + (modify-syntax-entry ?@ "w " st) + (modify-syntax-entry ?\\ "\\" st) + (modify-syntax-entry ?\f "> " st) + (modify-syntax-entry ?\n "> " st) + (modify-syntax-entry ?~ " " st) + st)) +;; Code from bibtex.el ends + +;; @string starts with a letter and does not contain any of ""#%'(),={} +;; Here we do not check that the field contains only one string field and +;; nothing else. +(defvar bib-string-regexp + "^[, \t]*[a-zA-Z]+[ \t]*=[ \t]*\\([a-zA-Z][^#%'(),={}\" \t\n]*\\)" + "Regular expression for field containing a @string") + +(defvar bib-ext-list nil + "xemacs buffer-local list of bib-cite extents.") +(make-variable-buffer-local 'bib-ext-list) + +(defun bib-display () + "Display BibTeX citation or matching \\ref or \\label command under point. + +If text under cursor is a \\cite command, then display its BibTeX info from +\\bibliography input file. + Example with cursor located over cite command or arguments: + \cite{Wadhams81,Bourke.et.al87,SchneiderBudeus94} + ^Display-all-citations ^Display-this-citation + +If text under cursor is a \\ref command, then display environment associated +with its matching \\label command. + +If text under cursor is a \\label command, then display the text around +the first matching \\ref command. + +The user is prompted for a \\label or \\ref is nothing suitable is found under +the cursor. The first prompt is for a label. If you answer with an empty +string, a second prompt for a ref will be given. + +A TAGS file is created and used for multi-file documents under auctex." + (interactive) + (let ((cite)) + (save-excursion + (if (not (looking-at "\\\\")) + (re-search-backward "[\\]" nil t)) + (if (looking-at "\\\\[a-zA-Z]*cite") + (setq cite t))) + (if cite + (bib-display-citation) + (bib-display-label)))) + +(defun bib-find () + "Edit BibTeX citation or find matching \\ref or \\label command under point. + +For multi-entry cite commands, the cursor should be on the actual cite key +desired (otherwise a random entry will be selected). +e.g.: \cite{Wadhams81,Bourke.et.al87,SchneiderBudeus94} + ^Display-this-citation + +If text under cursor is a \\ref command, then point is moved to its matching +\\label command. + +If text under cursor is a \\label command, then point is moved to the first +matching \\ref command. + +The user is prompted for a \\label or \\ref is nothing suitable is found under +the cursor. The first prompt is for a label. If you answer with an empty +string, a second prompt for a ref will be given. + +A TAGS file is created and used for multi-file documents under auctex." + (interactive) + (let ((cite)) + (save-excursion + (if (not (looking-at "\\\\")) + (re-search-backward "[ \\\n]" nil t)) + (if (looking-at "\\\\[a-zA-Z]*cite") + (setq cite t))) + (if cite + (bib-edit-citation) + (bib-find-label)))) + +(defun bib-display-mouse (EVENT) + "Display BibTeX citation or matching \\ref or \\label command under mouse. +See bib-display." + (interactive "e") + (mouse-set-point EVENT) + (bib-display)) + +(defun bib-find-mouse (EVENT) + "Edit BibTeX citation or find matching \\ref or \\label command under mouse. +See bib-find." + (interactive "e") + (mouse-set-point EVENT) + (bib-find)) + +(defun bib-apropos () + "Display BibTeX entries containing a keyword from bibliography file. +The files specified in the \\bibliography command are searched unless +the current buffer is in bibtex-mode or is the Help buffer. In those +cases, *it* is searched. This allows you to trim down a search further +by using bib-apropos sequentially." + ;;(interactive "sBibTeX apropos: ") + (interactive) + (let* ((keylist (and (boundp 'TeX-auto-update) ;Avoid error in FRAMEPOP + (fboundp 'LaTeX-bibitem-list) ;Use this if using auctex + (LaTeX-bibitem-list))) + (keyword (bib-apropos-keyword-at-point)) + (keyword (completing-read "BiBTeX apropos: " keylist nil nil keyword)) + (the-text)(key-point)(start-point) + (new-buffer-f (and (not (string-match "^bib" mode-name)) + (not (string-equal "*Help*" (buffer-name))))) + (bib-buffer (or (and new-buffer-f (bib-get-bibliography nil)) + (current-buffer)))) + (save-excursion + (set-buffer bib-buffer) + (goto-char (point-min)) + (while (and (re-search-forward "^[ \t]*@" nil t) + (re-search-forward keyword nil t)) + (setq key-point (point)) ;To make sure this is within entry + (re-search-backward "^[ \t]*@" nil t) + (setq start-point (point)) + (forward-list 1) + (if (< (point) key-point) ;And this is that test... + (goto-char key-point) ;Not within entry, skip it. + (setq the-text + (cons (concat (buffer-substring start-point (point)) "\n") + the-text)))) + (if (not the-text) + (message "Sorry, no matches found.") + (with-output-to-temp-buffer "*Help*" + (mapcar 'princ (nreverse the-text))) + (if bib-novice + (message + (substitute-command-keys + (concat "Use \\[bib-apropos] again in the *help* buffer" + " to trim the search")))) + (cond + ((and bib-hilit-if-available + (fboundp 'hilit-highlight-region)) + (set-buffer "*Help*") + (hilit-highlight-region (point-min) (point-max) 'bibtex-mode t)) + ;; font-lock? + ((featurep 'font-lock) + (set-buffer "*Help*") + (set (make-local-variable 'font-lock-defaults) + '(bib-cite-bibtex-font-lock-keywords + nil t ((?$ . "\"")(?\" . ".")))) + (font-lock-fontify-buffer)))) + (if new-buffer-f + (kill-buffer bib-buffer))))) + +(defvar bib-document-citekeys-obarray-warnings nil + "bib-cite internal variable") + +(defun bib-make-bibliography () + "Extract citations used in the current document from \bibliography{} file(s). +Put them into a buffer named after the current buffer, with extension .bib. + +In an auc-tex multi-file document, parsing must be on and the citation keys +are extracted from the .aux files. + +In a plain LaTeX buffer (not multi-file), the cite keys are extracted from +the text itself. Therefore the text need not have been previously processed +by LaTeX. + +This function is useful when you want to share a LaTeX file, and therefore want +to create a bibtex file containing only the references used in the document." + (interactive) + (let* ((the-keys-obarray (or (bib-document-citekeys-obarray) + (bib-buffer-citekeys-obarray))) + ;1st in case of error + (new-buffer + (create-file-buffer + (concat (substring (buffer-name) 0 + (or (string-match "\\." (buffer-name)) + (length (buffer-name)))) + "-bib.bib"))) + (bib-buffer (bib-get-bibliography nil)) + (the-warnings (bib-get-citations the-keys-obarray + bib-buffer + new-buffer + nil))) + (kill-buffer bib-buffer) +;;; (switch-to-buffer new-buffer) + (funcall bib-switch-to-buffer-function new-buffer) + (bibtex-mode) + (cond + ((and bib-hilit-if-available + (fboundp 'hilit-highlight-region)) + (hilit-highlight-buffer t)) + ((featurep 'font-lock) ;Perhaps let the user's setup determine + (font-lock-fontify-buffer))) ; if font-lock fontifies? + (if (or bib-document-citekeys-obarray-warnings + the-warnings) + (progn + (cond + ((and bib-document-citekeys-obarray-warnings the-warnings) + (with-output-to-temp-buffer "*Help*" + (princ bib-document-citekeys-obarray-warnings the-warnings))) + (bib-document-citekeys-obarray-warnings + (with-output-to-temp-buffer "*Help*" + (princ bib-document-citekeys-obarray-warnings))) + (the-warnings + (with-output-to-temp-buffer "*Help*" (princ the-warnings)))) + (setq bib-document-citekeys-obarray-warnings nil) ;Reset + (bib-cite-fontify-red))) + (if bib-novice + (message + (substitute-command-keys + "Use \\[save-buffer] to save this buffer to a file."))))) + +(defun bib-cite-fontify-red (&optional limit) + "Fontify *Help* buffer in red-bold up to optional limit" + (if (and window-system ;Not exactly correct for XEmacs + (not (facep 'red-bold))) + (progn + (copy-face 'bold 'red-bold) + (set-face-foreground 'red-bold "red"))) + (save-excursion + (set-buffer "*Help*") + (let ((before-change-functions) (after-change-functions)) + (put-text-property (point-min)(or limit (point-max)) + 'face 'red-bold)))) + +(defun bib-cite-fontify-help-as-latex () + (save-excursion + (cond + ((and bib-hilit-if-available + (fboundp 'hilit-highlight-region)) + (set-buffer "*Help*") + (hilit-highlight-region (point-min) (point-max) 'LaTeX-mode t)) + ;; font-lock? + ((and (featurep 'font-lock) + (featurep 'font-latex)) + (set-buffer "*Help*") + (setq font-lock-defaults '(font-latex-keywords-2 nil nil ((?$ . "\"")))) + ;; Add all syntax table for `proper' fontification? + (font-lock-fontify-buffer)) + ((featurep 'font-lock) + (make-local-variable 'font-lock-defaults) + (setq font-lock-defaults '(tex-font-lock-keywords nil nil ((?$ . "\"")))) + (set-buffer "*Help*") + (font-lock-fontify-buffer))))) + +(defvar bib-document-TeX-files-warnings nil + "bib-cite internal variable") + +(defun bib-etags (&optional masterdir) + "Invoke etags on all tex files of the document, storing the TAGS file +in the master-directory. Expect errors if you use this outside of auctex +or within a plain single-file document. +Also makes sure that the TAGS buffer is updated. +See variables bib-etags-command and bib-etags-filename" + (interactive) + (require 'etags) + (let* ((the-file-list (bib-document-TeX-files)) + (the-file (car the-file-list)) + (dir (or masterdir (bib-master-directory))) + (the-tags-file (expand-file-name bib-etags-filename dir)) + (the-tags-buffer (get-file-buffer the-tags-file))) + ;; Create TAGS file with first TeX file (master file) + (shell-command (concat bib-etags-command the-tags-file " " the-file)) + (setq the-file-list (cdr the-file-list)) + ;; Append to TAGS file for all other TeX files. + (while the-file-list + (setq the-file (car the-file-list)) + (shell-command + (concat bib-etags-append-command the-tags-file " " the-file)) + (setq the-file-list (cdr the-file-list))) + (if the-tags-buffer ;buffer existed; we must refresh it. + (save-excursion + (set-buffer the-tags-buffer) + (revert-buffer t t))) + + ;; Check value of tags-file-name against the-tags-file + (or (equal the-tags-file tags-file-name) ;make sure it's current + (visit-tags-table the-tags-file)) + + ;(set (make-local-variable 'tags-file-name) the-tags-file)) + ;; above should not be needed + + ;; Weird Bug: + ;; (visit-tags-table-buffer) seems to get called twice when called by + ;; find-tag on an undefined tag. The second time, it's in the TAGS + ;; buffer and returns an error because TAGS buffer does have + ;; tags-file-name set. + ;; To get around this. I'm setting this variable in the TAGS buffer. + ;; Skip this in XEmacs (Changed by Anders Stenman) + (if (not (string-match "XEmacs\\|Lucid" emacs-version)) + (save-excursion + (set-buffer (get-file-buffer the-tags-file)) + (set (make-local-variable 'tags-file-name) the-tags-file)))) + + + (if bib-document-TeX-files-warnings ;free variable loose in emacs! + (progn + (with-output-to-temp-buffer "*Help*" + (princ bib-document-TeX-files-warnings)) + (setq bib-document-TeX-files-warnings nil) ;Reset + (bib-cite-fontify-red) + ;;;(if (and bib-hilit-if-available + ;;; (fboundp 'hilit-region-set-face)) + ;;; (save-excursion + ;;; (set-buffer "*Help*") + ;;; (hilit-region-set-face + ;;; 1 (point-max) + ;;; (cdr (assq 'error hilit-face-translation-table))))) + ))) + +(defun bib-Is-hidden () + "Return true is current point is hidden" + (if (not selective-display) + nil ;Not hidden if not using this... + (save-excursion + (if (not (re-search-backward "[\n\^M]" nil t)) + nil ;Play safe + (if (string-equal (buffer-substring (match-beginning 0)(match-end 0)) + "\n") + nil + t))))) + +(defun bib-highlight-mouse () + "Make that nice green highlight when the mouse is over LaTeX commands" + (interactive) +;;;Comment this out. User should be able to use bib-highlight-mouse +;;;to try it out regardless of bib-highlight-mouse-t. +;;;Check bib-highlight-mouse-t only in automated cases. +;;; +;;; (if (and bib-highlight-mouse-t +;;; ;;window-system) ;Do nothing unless under X +;;; ) +;;; *all of code was here* +;;; ) + (save-excursion + (let ((s)(e)(extent) + (inhibit-read-only t) + (modified (buffer-modified-p))) ;put-text-property changing this? + (goto-char (point-min)) + ;; * peta Wed Nov 8 16:27:29 1995 -- better remove the mouse face + ;; properties first. + (if (string-match "XEmacs\\|Lucid" emacs-version) + (while bib-ext-list + (delete-extent (car bib-ext-list)) + (setq bib-ext-list (cdr bib-ext-list))) + ;; Remove properties for regular emacs + ;; FIXME This detroys all mouse-faces and local-maps! + ;; FIXME Hope no other package is using them in this buffer! + (let ((before-change-functions) (after-change-functions)) + (remove-text-properties (point-min) (point-max) + '(mouse-face t local-map t)))) + (while + (re-search-forward + "\\\\\\(ref\\|label\\|[A-Za-z]*cite[A-Za-z]*\\(\\[.*\\]\\)?\\){[^}]*}" + nil t) + (setq s (match-beginning 0)) + (setq e (match-end 0)) + (cond + ((string-match "XEmacs\\|Lucid" emacs-version) + (setq extent (make-extent s e)) + (setq bib-ext-list (cons extent bib-ext-list)) + (set-extent-property extent 'highlight t) + (set-extent-property extent 'start-open t) + (set-extent-property extent 'keymap bib-highlight-mouse-keymap)) + (t + (let ((before-change-functions) (after-change-functions) + ;;(this-overlay (make-overlay s e)) + ) +;;; Even using overlays doens't help here. If bib-highlight-mouse-keymap +;;; does not include the AucTeX menus, then these disappear when we click +;;; onto a \cite command. Perhaps using bib-cite as a minor mode will fix +;;; this? For now, bib-cite must be loaded after these menus are built. +;;; It must therefore be loaded in a mode-hook. + (put-text-property s e 'local-map bib-highlight-mouse-keymap) + (put-text-property s e 'mouse-face 'highlight) + ;;(overlay-put this-overlay 'local-map bib-highlight-mouse-keymap) + ;;(overlay-put this-overlay 'mouse-face 'highlight) + )))) + (set-buffer-modified-p modified)))) + +(defun bib-toggle-highlight () + (interactive) + (if (setq bib-highlight-mouse-t (not bib-highlight-mouse-t)) + (bib-highlight-mouse) + (let ((modified (buffer-modified-p)) + (inhibit-read-only t)) + (cond + ((string-match "XEmacs\\|Lucid" emacs-version) + (while bib-ext-list + (delete-extent (car bib-ext-list)) + (setq bib-ext-list (cdr bib-ext-list)))) + (t + (let ((before-change-functions) (after-change-functions)) + (remove-text-properties (point-min) (point-max) + '(mouse-face local-map))))) + (set-buffer-modified-p modified)))) + +;;---------------------------------------------------------------------------- +;; Routines to display or edit a citation's bibliography + +(defun bib-display-citation () + "Do the displaying of cite info. Returns t if found cite key, nil otherwise. +Example with cursor located over cite command or arguments: +\cite{Wadhams81,Bourke.et.al87,SchneiderBudeus94} + ^Display-all-citations ^Display-this-citation" + (save-excursion + (let* ((the-keys-obarray (bib-get-citekeys-obarray)) ;1st in case of error + (work-buffer (get-buffer-create "*bibtex-work*")) + (bib-buffer (bib-get-bibliography nil)) + (the-warnings (bib-get-citations + the-keys-obarray + bib-buffer + work-buffer + bib-substitute-string-in-display)) + (the-warn-point)) + (if the-warnings + (progn + (set-buffer work-buffer) + (goto-char 1) + (insert the-warnings) + (setq the-warn-point (point)))) + (with-output-to-temp-buffer + "*Help*" + (set-buffer work-buffer) + (princ (buffer-substring 1 (point-max)))) + (cond + ((and bib-hilit-if-available + (fboundp 'hilit-highlight-region)) + (set-buffer "*Help*") + (hilit-highlight-region (point-min) (point-max) 'bibtex-mode t) + (if the-warn-point + (hilit-region-set-face + 1 the-warn-point + (cdr (assq 'error hilit-face-translation-table))))) + ((featurep 'font-lock) + (set-buffer "*Help*") + (set (make-local-variable 'font-lock-defaults) + '(bib-cite-bibtex-font-lock-keywords + nil t ((?$ . "\"")(?\" . ".")))) + (font-lock-fontify-buffer) + (if the-warn-point + (bib-cite-fontify-red the-warn-point)))) + (kill-buffer bib-buffer) + (kill-buffer work-buffer)))) + +(defun bib-edit-citation () + "Do the edit of cite info. Returns t if found cite key, nil otherwise. +Find and and put edit point in bib file associated with a BibTeX citation +under cursor from \bibliography input file. +In a multi-entry cite command, the cursor should be on the actual cite key +desired (otherwise a random entry will be selected). +e.g.: \cite{Wadhams81,Bourke.et.al87,SchneiderBudeus94} + ^Display-this-citation" + (let ((the-keys-obarray (bib-get-citekeys-obarray)) ;1st in case of error + (bib-buffer (bib-get-bibliography t)) + (the-key)(the-file)) + (save-excursion + (mapatoms ;Do this for each cite-key found... + (function (lambda (cite-key) + (setq the-key (symbol-name cite-key)))) + the-keys-obarray) + (set-buffer bib-buffer) + (goto-char (point-min)) + (if (not (re-search-forward + (concat "@[^{(]+[{(][\t ]*" the-key "[ ,\n]") nil t)) + (progn + (kill-buffer bib-buffer) + (error "Sorry, could not find bib entry for %s" the-key)) + (re-search-backward "%%%Filename: \\([^\n]*\\)" nil t) + (setq the-file (buffer-substring (match-beginning 1)(match-end 1))) + (kill-buffer bib-buffer))) +;;; (find-file the-file) + (funcall bib-switch-to-buffer-function (find-file-noselect the-file)) + (goto-char (point-min)) ;V2.19 fix + (re-search-forward (concat "@[^{(]+[{(][\t ]*" the-key "[ ,\n]") nil t))) + +;;-------------------------------------------------------------------------- +;; Function for bib-apropos + +(defun bib-apropos-keyword-at-point () + ;; Returns the keyword under point for initial input to bib-apropos prompt + (save-excursion + (let ((here (point))) + (cond + ((and (re-search-backward "[\n{, ]" nil t) + (string-equal "{" (buffer-substring (match-beginning 0) + (match-end 0)))) + (if (fboundp 'buffer-substring-no-properties) + (buffer-substring-no-properties (1+ (point)) here) + (buffer-substring (1+ (point)) here))))))) + +;;-------------------------------------------------------------------------- +;; Functions for Displaying or moving to matching \ref or \label command + +(defun bib-display-label () +;; "Display environment associated with a label or first ref assoc. with label +;;The label or ref name is extracted from the text under the cursor, or the +;;user is prompted is nothing suitable is found. The first prompt is for a +;;label. If you answer with an empty string, a second prompt for a ref will +;;be given." + (let ((the-name (bib-guess-or-prompt-for-label))) + (if (not the-name) + (message "No name given") + (bib-display-or-find-label the-name t)))) + +(defun bib-find-label () + "Move to a label, or the first occurance of a ref. +The label or ref name is extracted from the text under the cursor. +;;If nothing suitable is found, the user is prompted. The first prompt is for a +;;label. If you answer with an empty string, a second prompt for a ref will be +;;given. +;; +;;If within a single file document: +;; You can move back with C-x C-x as the mark is set before moving. +;; You can search for next occurrances of a ref command with C-s C-s. +;; +;;If within a multi-file document (in auctex only) +;; You can move back with C-x C-x if within the same buffer. If not, just +;; select your previous buffer. +;; You can search for next occurrances of a ref command with tag commands: +;; C-u M-. Find next alternate definition of last tag specified. +;; C-u - M-. Go back to previous tag found." + (let ((the-name (bib-guess-or-prompt-for-label))) + (if (not the-name) + (message "No name given") + (bib-display-or-find-label the-name nil)))) + +;;-------------------------------------------------------------------------- +;; Functions for Displaying or moving to matching \ref or \label command + +(defun bib-display-or-find-label (the-name displayf) +;; work horse for bib-find-label and bib-display-label + (let* ((masterfile (bib-master-file)) + (masterdir (and masterfile + (file-name-directory masterfile))) + (new-point)(new-buffer)) + (save-excursion + ;; Now we are either in a simple file, or with a multi-file document + (cond + (masterfile ;Multi-file document + (cond + (displayf ;Display only + (set-buffer (bib-etags-find-noselect the-name masterdir)) + (re-search-forward the-name nil t) ;'cos tags puts point line begin + (if (string-match "^\\\\label" the-name) + (bib-display-this-environment) ;display the label's environment + (bib-display-this-ref))) ; display the ref's context + (t ;Move to it + (setq new-buffer (bib-etags-find-noselect the-name masterdir)) + (if bib-novice + (message + (substitute-command-keys + (concat "Use C-u \\[find-tag] to find the next occurrence; " + "Use C-u - \\[find-tag] to find the previous.")))) + (if (equal new-buffer (current-buffer)) + (setq new-point (point))) ;Moving with the same buffer + (and (string-match "^\\\\ref" the-name) + (setq search-ring (cons the-name search-ring)))))) + (t ;Single-file document + (goto-char (point-min)) + (if (search-forward the-name nil t) + (if displayf + (if (string-match "^\\\\label" the-name) + (bib-display-this-environment) ;Display the environment + (bib-display-this-ref)) ; display the ref's context + (setq new-point (match-beginning 0)) ;or move there + (if bib-novice + (message + (substitute-command-keys + (concat + "Use \\[isearch-forward] \\[isearch-forward] to find the " + "next occurrence; Use C-x C-x to go back.")))) + (if (string-match "^\\\\ref" the-name) + (setq search-ring (cons the-name search-ring)) + (setq search-ring (cons (concat "\\ref" (substring the-name 6)) + search-ring)))) + (message "Sorry, cannot find %s" the-name))))) + (if new-point + (progn + (push-mark (point) t nil) ;We've moving there... push mark + (goto-char new-point)) + (if new-buffer ;We've changing buffer +;; (switch-to-buffer new-buffer) + (funcall bib-switch-to-buffer-function new-buffer))) + (if (bib-Is-hidden) + (save-excursion + (beginning-of-line) + (show-entry))))) + +(defvar bib-label-prompt-map nil) +(if bib-label-prompt-map + () + (setq bib-label-prompt-map (copy-keymap minibuffer-local-completion-map)) + (define-key bib-label-prompt-map " " 'self-insert-command)) + +(defun bib-guess-or-prompt-for-label () + ;; Guess from context, or prompt the user for a label command + (save-excursion + (if (not (looking-at "\\\\")) ;If not on beginning of a command + (re-search-backward "[\\]" + (save-excursion (beginning-of-line)(point)) + t)) + (cond + ((looking-at "\\\\ref{") ;On \ref, looking for matching \label + (let ((b (progn (search-forward "{" nil t)(forward-char -1)(point))) + (e (progn (forward-sexp 1)(point)))) + (concat "\\label" (buffer-substring b e)))) + ((looking-at "\\\\label{") ;On \label, looking for matching \ref + (let ((b (progn (search-forward "{" nil t)(forward-char -1)(point))) + (e (progn (forward-sexp 1)(point)))) + (concat "\\ref" (buffer-substring b e)))) + (t ;Prompt the user + (let* ((minibuffer-local-completion-map bib-label-prompt-map) + (the-alist (create-alist-from-list + (cdr (reverse LaTeX-label-list)))) + ;;; LaTeX-label-list example: + ;;; '(("label3" "label4")("label1" "label2") nil) + ;; so let's get rid of that nil part in embedded list. + (the-name + (if (string-equal "18" (substring emacs-version 0 2)) + (completing-read "Label: " the-alist nil nil nil) + (completing-read "Label: " the-alist nil nil nil + 'LaTeX-find-label-hist-alist)))) + (if (not (equal the-name "")) + (concat "\\label{" the-name "}") + ;; else try to get a \ref + (if (string-equal "18" (substring emacs-version 0 2)) + (setq the-name (completing-read "Ref: " the-alist nil nil nil)) + (setq the-name (completing-read "Ref: " the-alist nil nil nil + 'LaTeX-find-label-hist-alist))) + (if (not (equal the-name "")) + (concat "\\ref{" the-name "}") + nil))))))) + +(defun bib-display-this-ref () + "Display a few lines around current point" + (cond + ((bib-Is-hidden) + (with-output-to-temp-buffer "*BiBTemp*" + (princ + (buffer-substring + (save-excursion + (let ((i 3)) + (while (and (> i 0) + (re-search-backward "[\n\^M]" nil t) + (setq i (1- i))))) + (point)) + (save-excursion + (let ((i 3)) + (while (and (> i 0) + (re-search-forward "[\n\^M]" nil t) + (setq i (1- i))))) + (point))))) + (set-buffer "*BiBTemp*") + (while (search-forward "\^M" nil t) + (replace-match "\n" nil t)) + (goto-char 1) + (if (looking-at "\n") ;Remove first empty line... + (delete-char 1)) + (with-output-to-temp-buffer "*Help*" + (princ (buffer-substring 1 (point-max)))) + (bib-cite-fontify-help-as-latex) + (kill-buffer "*BiBTemp*")) + (t + (with-output-to-temp-buffer ; display the ref's context + "*Help*" + (princ + (buffer-substring (save-excursion (forward-line -2)(point)) + (save-excursion (forward-line 3)(point))))) + (bib-cite-fontify-help-as-latex)))) + +(defun bib-display-this-environment () + "Display the environment associated with a label, or its section name +Assumes point is already on the label. +Does not save excursion." +;; Bugs: The method used here to detect the environment is *not* foolproof. +;; It will get confused, for example, between two figure environments, +;; picking out both instead of the section label above them. But since +;; users typically puts their labels next to the section declaration, +;; I'm satisfied with this... for now. +;; I could have used the following auc-tex functions: +;; LaTeX-current-environment +;; Function: Return the name (a string) of the enclosing LaTeX environment. +;; LaTeX-current-section +;; Function: Return the level of the section that contain point. +;; but then this code would only work as part of auc-tex... + (let ((the-point (point)) + (end-point (point)) + (the-environment)(foundf)) + (while (and (not foundf) + (goto-char end-point) ;Past end of last search + (re-search-forward "\\(^\\|\^M\\)[ \t]*\\\\end{\\([^}]*\\)}" + nil t)) + (setq end-point (point)) + (setq the-environment (buffer-substring (match-beginning 2) + (match-end 2))) + (and (not (string-match "document" the-environment)) + (re-search-backward (concat "\\(^\\|\^M\\)[ \t]*\\\\begin{" + (regexp-quote the-environment) "}")) + (<= (point) the-point) + (setq foundf t))) + (if foundf ;A good environment + (progn + (cond ((bib-Is-hidden) ;Better way is: replace-within-string + (with-output-to-temp-buffer "*BiBTemp*" + (princ (buffer-substring (point) end-point))) + (set-buffer "*BiBTemp*") + (while (search-forward "\^M" nil t) + (replace-match "\n" nil t)) + (goto-char 1) + (if (looking-at "\n") ;Remove first empty line... + (delete-char 1)) + (with-output-to-temp-buffer "*Help*" + (princ (buffer-substring 1 (point-max)))) + (kill-buffer "*BiBTemp*")) + (t + (with-output-to-temp-buffer "*Help*" + (princ (buffer-substring (point) end-point))))) + (bib-cite-fontify-help-as-latex)) + ;; Just find the section declaration + (goto-char the-point) + (if (re-search-backward + "\\(^\\|\^M\\)[ \t]*\\\\\\(sub\\)*section{\\([^}]*\\)}" nil t) + (message (buffer-substring (match-beginning 0)(match-end 0))) + (error + "Sorry, could not find an environment or section declaration"))))) + +(defvar LaTeX-find-label-hist-alist nil "History list for LaTeX-find-label") +(defvar LaTeX-label-list nil "Used by auc-tex to store label names") + + +(defun create-alist-from-list (the-list) +;;; Return a single list from a list that may contain either items +;;; or any number of list levels containing items. +;;; e.g. turns +;;; '(("label3" "label4")("label1" "label2") "label") +;;; into +;;; '(("label3") ("label4") ("label1") ("label2") ("label")) + (mapcar 'list (bib-cite-mh-list-to-string the-list))) + +;;; +;;; Following two functions from mh-utils.el (part of GNU emacs) +;;; I have changed the names in case these functions change what they do. +;;; + +(defun bib-cite-mh-list-to-string (l) + ;; Flattens the list L and makes every element of the new list into a string. + (nreverse (bib-cite-mh-list-to-string-1 l))) + +(defun bib-cite-mh-list-to-string-1 (l) + (let ((new-list nil)) + (while l + (cond ((null (car l))) + ((symbolp (car l)) + (setq new-list (cons (symbol-name (car l)) new-list))) + ((numberp (car l)) + (setq new-list (cons (int-to-string (car l)) new-list))) + ((equal (car l) "")) + ((stringp (car l)) (setq new-list (cons (car l) new-list))) + ((listp (car l)) + (setq new-list (nconc (bib-cite-mh-list-to-string-1 (car l)) + new-list))) + (t (error "Bad element in mh-list-to-string: %s" (car l)))) + (setq l (cdr l))) + new-list)) + +;; ------------------------------------------------------------------------- +;; Routines to extract cite keys from text + +;; ... is truly remarkable, as shown in \citeN{Thomson77,Test56}. Every +;; \cite[{\it e.g.}]{Thomson77,Test56} + +(defun bib-get-citations (keys-obarray bib-buffer new-buffer substitute) + "Put citations of KEYS-OBARRAY from BIB-BUFFER into NEW-BUFFER, +Substitute strings if SUBSTITUTE is t +Return the-warnings as text." + (let ((the-warnings) ;The only variable to remember... + (case-fold-search t)) ;All other results go into new-buffer + ;; bibtex is not case-sensitive for keys. + (save-excursion + (let ((the-text)) + (set-buffer bib-buffer) + (mapatoms ;Do this for each cite-key found... + (function + (lambda (cite-key) + (goto-char (point-min)) + (if (re-search-forward + (concat "@[^{(]+[{(][\t ]*" + (regexp-quote (symbol-name cite-key)) + "\\([, ]\\\|$\\)") + ;; ^^ ^ comma, space or end-of-line + nil t) + (setq the-text (concat the-text + (buffer-substring + (progn (beginning-of-line)(point)) + (progn (forward-sexp 2)(point))) + "\n\n")) + (setq the-warnings (concat the-warnings + "Cannot find entry for: " + (symbol-name cite-key) "\n"))))) + keys-obarray) + (if (not the-text) + (error "Sorry, could not find any of the references")) + ;; Insert the citations in the new buffer + (set-buffer new-buffer) + (insert the-text) + (goto-char 1)) + + ;; We are at beginning of new-buffer. + ;; Now handle crossrefs + (let ((crossref-obarray (make-vector 201 0))) + (while (re-search-forward + "[, \t]*crossref[ \t]*=[ \t]*\\(\"\\|\{\\)" nil t) + ;;handle {text} or "text" cases + (if (string-equal "{" (buffer-substring (match-beginning 1) + (match-end 1))) + (re-search-forward "[^\}]+" nil t) + (re-search-forward "[^\"]+" nil t)) + (intern (buffer-substring (match-beginning 0)(match-end 0)) + crossref-obarray)) + ;; Now find the corresponding keys, + ;; but add them only if not already in `keys-obarray' + (set-buffer bib-buffer) + (goto-char 1) + (let ((the-text)) + (mapatoms ;Do this for each crossref key found... + (function + (lambda (crossref-key) + (if (not (intern-soft (symbol-name crossref-key) keys-obarray)) + (progn + ;; Not in keys-obarray, so not yet displayed. + (goto-char (point-min)) + (if (re-search-forward + (concat "@[^{(]+[{(][\t ]*" + (regexp-quote (symbol-name crossref-key)) + "\\(,\\|$\\)") + nil t) + (setq the-text + (concat the-text + (buffer-substring + (progn (beginning-of-line)(point)) + (progn (forward-sexp 2)(point))) + "\n\n")) + (setq the-warnings + (concat the-warnings + "Cannot find crossref entry for: " + (symbol-name crossref-key) "\n"))))))) + crossref-obarray) + ;; Insert the citations in the new buffer + (set-buffer new-buffer) + (goto-char (point-max)) + (if the-text + (insert the-text))) + (goto-char 1)) + + ;; Now we have all citations in new-buffer, collect all used @String keys + ;; Ex: journal = JPO, + (let ((strings-obarray (make-vector 201 0))) + (while (re-search-forward bib-string-regexp nil t) + (intern (buffer-substring (match-beginning 1)(match-end 1)) + strings-obarray)) + ;; Now find the corresponding @String commands + ;; Collect either the @string commands, or the string to substitute + (set-buffer bib-buffer) + (goto-char 1) + (let ((string-alist) + (the-text)) + (mapatoms ;Do this for each string-key found... + (function + (lambda (string-key) + (goto-char (point-min)) + ;; search for @string{ key = {text}} or @string{ key = "text"} + (if (re-search-forward + (concat "^[ \t]*@string[{(]" + (regexp-quote (symbol-name string-key)) + "[\t ]*=[\t ]*\\(\"\\|\{\\)") + nil t) + (let ((the-string-start (1- (match-end 1))) ;catch bracket + ;;handle {text} or "text" cases + (the-string-end + (cond + ((string-equal "\"" + (buffer-substring (match-beginning 1) + (match-end 1))) + + (re-search-forward "[^\\]\"" nil t) + (point)) + (t + (forward-char -1) + (forward-list 1) + (point))))) + (if substitute ;Collect substitutions + (setq string-alist + (append + string-alist + (list + (cons (symbol-name string-key) + (regexp-quote + (buffer-substring the-string-start + the-string-end)))))) + ;;Collect the strings command themseves + (setq the-text + (concat the-text + (buffer-substring + (progn (forward-char 1)(point)) + (re-search-backward "^[ \t]*@string[{(]" + nil t)) + "\n")))) + ;; @string entry not found + (if (not (member (symbol-name string-key) + bib-string-ignored-warning)) + (setq the-warnings + (concat the-warnings + "Cannot find @String entry for: " + (symbol-name string-key) "\n")))))) + strings-obarray) + ;; Now we have `the-text' of @string commands, + ;; or the `string-alist' to substitute. + (set-buffer new-buffer) + (if substitute + (while string-alist + (goto-char 1) + (let ((the-key (car (car string-alist))) + (the-string (cdr (car string-alist)))) + (while (re-search-forward + (concat "\\(^[, \t]*[a-zA-Z]+[ \t]*=[ \t]*\\)" + the-key + "\\([, \t\n]\\)") + nil t) + (replace-match (concat "\\1" the-string "\\2") t))) + (setq string-alist (cdr string-alist))) + ;; substitute is nil; Simply insert text of @string commands + (goto-char 1) + (if the-text + (insert the-text "\n"))) + (goto-char 1)))) + + ;; We are done! + ;; Return the warnings... + the-warnings)) + +(defun bib-get-citekeys-obarray () + "Return obarray of citation key (within curly brackets) under cursor." + (save-excursion + ;; First find *only* a key *within a cite command + (let ((the-point (point)) + (keys-obarray (make-vector 201 0))) + ;; First try to match a cite command + (if (and (skip-chars-backward "a-zA-Z") ;Stops on \ or { + (looking-at "[a-zA-Z]*cite[a-zA-Z]*")) + (progn + ;;skip over any optional arguments to \cite[][]{key} command + (skip-chars-forward "a-zA-Z") + (while (looking-at "\\[") + (forward-list 1)) + (re-search-forward "{[ \n]*\\([^,} \n]+\\)" nil t) + (intern (buffer-substring (match-beginning 1)(match-end 1)) + keys-obarray) + (while (and (skip-chars-forward " \n") ;no effect on while + (looking-at ",")) + (forward-char 1) + ;;The following re-search skips over leading spaces + (re-search-forward "\\([^,} \n]+\\)" nil t) + (intern (buffer-substring (match-beginning 1)(match-end 1)) + keys-obarray))) + + ;; Assume we are on the keyword + (goto-char the-point) + (let ((the-start (re-search-backward "[\n{, ]" nil t)) + (the-end (progn (goto-char the-point) + (re-search-forward "[\n}, ]" nil t)))) + (if (and the-start the-end) + (intern (buffer-substring (1+ the-start) (1- the-end)) + keys-obarray) + ;; Neither... + (error "Sorry, can't find a reference here")))) + keys-obarray))) + +(defun bib-buffer-citekeys-obarray () + "Extract citations keys used in the current buffer" + (let ((keys-obarray (make-vector 201 0))) + (save-excursion + (goto-char (point-min)) + ;; Following must allow for \cite[e.g.][]{key} !!! + ;; regexp for \cite{key1,key2} was "\\\\[a-Z]*cite[a-Z]*{\\([^,}]+\\)" + (while (re-search-forward "\\\\[a-zA-Z]*cite[a-zA-Z]*\\(\\[\\|{\\)" + nil t) + (backward-char 1) + (while (looking-at "\\[") ; ...so skip all bracketted options + (forward-sexp 1)) + ;; then lookup first key + (if (looking-at "{[ \n]*\\([^,} \n]+\\)") + (progn + (intern (buffer-substring (match-beginning 1)(match-end 1)) + keys-obarray) + (goto-char (match-end 1)) + (while (and (skip-chars-forward " \n") + (looking-at ",")) + (forward-char 1) + (re-search-forward "\\([^,} \n]+\\)" nil t) + (intern (buffer-substring (match-beginning 1)(match-end 1)) + keys-obarray))))) + (if keys-obarray + keys-obarray + (error "Sorry, could not find any citation keys in this buffer."))))) + +;;--------------------------------------------------------------------------- +;; Multi-file document programming requirements: +;; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +;; bib-make-bibliography +;; bib-document-citekeys-obarray needs the master .aux file to extract +;; citation keys. +;; Included .aux files (corresponding to \include'd LaTeX files) are +;; then specified relative to the master-file-directory. +;; +;; bib-get-bibliography (used by interactive commands to extract bib sources) +;; +;; bibtex source filenames are returned from (LaTeX-bibliography-list) +;; unformatted. Since only a single \bibliogragrphy command is allowed +;; by BiBTeX in a document, it is safe to assume that their path is +;; relative to the master file's directory (since the path is relative +;; to where the BiBTeX program is actually ran). +;; +;; imenu +;; +;; Requires list of all tex files (complete with paths) to call etags on +;; them. +;; I used (TeX-style-list) to get the list of possible tex files, but +;; they are not in sorted order. Therefore the imenu would be somewhat +;; confusing. I'll have to do the scan myself, except that I'll only be +;; looking at the master file for \include statements. + +;; (See TeX-check-files, used in TeX-save-document. All documents related +;; files are returned by (TeX-style-list) and stored in TeX-active-styles. +;; Original idea was to search TeX-check-path for files listed in +;; TeX-active-styles (with possible relative or full paths) that end in .tex.) + +(defun bib-master-directory () +;; Returns the directory associated with the master file. +;; If no master file, then return current default. + (let ((masterfile (bib-master-file))) + (if masterfile + (file-name-directory (expand-file-name (TeX-master-file))) + default-directory))) + +(defun bib-master-file () +;; return master file full path, or nil if not a multi-file document +;; I wish there were a better way to tell about non multi-file documents... + (let ((master + (cond + ((not (boundp 'TeX-master)) + ;; This buffer doesn't know what a master file is, so return now. + nil) + ((and TeX-master ;Set, but not to t + (not (eq TeX-master 't))) ; then we have an actual name + (expand-file-name TeX-master)) + ((and (eq TeX-master 't) ;Test if master file itself + (progn ;But also require at least one \include + (save-excursion + (goto-char 1) ;Too bad I have to do this search... + ;; Require that user uses \input{file} + ;; rather than \input file + (re-search-forward "^[ \t]*\\\\\\(include\\|input\\){" + nil t)))) + (buffer-file-name)) + (t + nil)))) + (cond + ((not master) + nil) + ((string-match ".tex$" master) + master) + (t + (concat master ".tex"))))) + +;; I don't use this one because files are not returned in order... +;; (defun bib-document-TeX-files () +;; ;; Return all tex input files associated with a known multi-file document. +;; (let ((master-directory (bib-master-directory)) +;; (the-list (cons (file-name-nondirectory (TeX-master-file)) +;; (TeX-style-list))) +;; ;; TeX-style-list returns "../master" for the main file if TeX-master +;; ;; was set like that. "../master" would not be found relative +;; ;; to the master-directory! So let's add it to the list w/o directory. +;; (the-result) +;; (the-file)) +;; (while the-list +;; (setq the-file (expand-file-name (car the-list) master-directory)) +;; (setq the-list (cdr the-list)) +;; (and (not (string-match ".tex$" the-file)) +;; (setq the-file (concat the-file ".tex"))) +;; (and (file-readable-p the-file) +;; (not (member the-file the-result)) ;listed already? +;; (setq the-result (cons the-file the-result)))) +;; the-result)) + +(defun bib-document-TeX-files () + ;; For a multi-file document in auctex only. + ;; Return all tex input files associated with a *known* multi-file document. + ;; No checking is done that this is a real multi-file document. + + ;; sets global variable bib-document-TeX-files-warnings + + (setq bib-document-TeX-files-warnings nil) + (let* ((masterfile (bib-master-file)) + (dir (and masterfile (file-name-directory masterfile))) + (tex-buffer (get-buffer-create "*tex-document*")) + (the-list (list masterfile)) + (the-file)) + (if (not masterfile) + (progn + (kill-buffer tex-buffer) + (error + "Sorry, but this is not a multi-file document (Try C-u C-c C-n if using auctex)"))) + (save-excursion + (set-buffer tex-buffer) + ;; set its directory so relative includes work without expanding + (setq default-directory dir) + (insert-file-contents masterfile) + (goto-char (point-min)) + (while (re-search-forward "^[ \t]*\\\\\\(input\\|include\\){\\(.*\\)}" + nil t) + (let ((the-file (buffer-substring (match-beginning 2)(match-end 2)))) + (if (string-match ".sty$" the-file) ;Skip over style files! + nil + (if (and (not (file-readable-p (expand-file-name the-file dir))) + (not (string-match ".tex$" the-file))) + (setq the-file (concat the-file ".tex"))) + (setq the-file (expand-file-name the-file dir)) + (if (not (file-readable-p the-file)) + (setq bib-document-TeX-files-warnings + (concat + bib-document-TeX-files-warnings + (format "Warning: File not found: %s" the-file))) + (setq the-list (cons (expand-file-name the-file dir) the-list)) + (end-of-line)(insert "\n") + (insert-file-contents the-file)))))) + (kill-buffer tex-buffer) + (nreverse the-list))) + +(defun bib-document-citekeys-obarray () +;; Return cite keys obarray for multi-file document, or nil if not a multi-file +;; document. This is a auc-tex supported feature only. +;; Also, see bib-buffer-citekeys-obarray. +;; Sets global variable bib-document-citekeys-obarray-warnings. + (setq bib-document-citekeys-obarray-warnings nil) + (let ((master-tex (bib-master-file)) + (master-aux)) + (if (not master-tex) + nil ;Not a multifile document. No need... + (setq master-aux (bib-return-aux-file-from-tex master-tex "aux")) + (or (file-readable-p master-aux) + (error "Sorry, cannot read file %s" master-aux)) + (and (file-newer-than-file-p master-tex master-aux) + (setq bib-document-citekeys-obarray-warnings + (format "Warning: %s is out of date relative to %s.\n" + master-aux master-tex))) + (let ((work-buffer (get-buffer-create "*bib-cite-work*")) + (keys-obarray (make-vector 201 0))) + (save-excursion + (set-buffer work-buffer) + (insert-file-contents master-aux) + ;; Because we will be looking for \input statements, we need to set + ;; the default directory to that of the master file. + (setq default-directory (file-name-directory master-tex)) + ;; bib-make-bibliography will need this also to find .bib files + ;; look for \@input{chap1/part1.aux} + (while (re-search-forward "^\\\\@input{\\(.*\\)}$" nil t) + (let* ((auxfile (buffer-substring(match-beginning 1)(match-end 1))) + (texfile (bib-return-aux-file-from-tex auxfile "tex"))) + (if (not (file-readable-p auxfile)) + (setq bib-document-citekeys-obarray-warnings + (concat + bib-document-citekeys-obarray-warnings + (format "Warning: %s is not found or readable.\n" + auxfile))) + (if (file-newer-than-file-p texfile auxfile) + (setq bib-document-citekeys-obarray-warnings + (concat + bib-document-citekeys-obarray-warnings + (format + "Warning: %s is out of date relative to %s.\n" + auxfile texfile)))) + (end-of-line)(insert "\n") + (insert-file-contents (buffer-substring (match-beginning 1) + (match-end 1)))))) + (goto-char 1) + ;; look for \citation{gertsenshtein59} + (while (re-search-forward "^\\\\citation{\\(.*\\)}$" nil t) + (intern (buffer-substring (match-beginning 1)(match-end 1)) + keys-obarray))) + (kill-buffer work-buffer) + keys-obarray)))) + +(defun bib-return-aux-file-from-tex (texname ext) +;; given name.name.XXX return name.name.ext + (concat (substring texname 0 -3) ext)) + +(defun bib-etags-find-noselect (tag &optional masterdir) +;; Returns a buffer with point on `tag'. buffer is not selected. +;; Makes sure TAGS file exists, etc. + (require 'etags) + (let* ((master (or masterdir (bib-master-directory))) + (the-buffer (current-buffer)) + (new-buffer) + (the-tags-file-name (expand-file-name bib-etags-filename master))) + (or (file-exists-p the-tags-file-name) ;make sure TAGS exists + (bib-etags master)) + (or (equal the-tags-file-name tags-file-name) ;make sure it's current + (visit-tags-table the-tags-file-name)) + ;; find-tag-noselect should set the TAGS file for the new buffer + ;; that's what C-h f visit-tags-table says... + (if (string-match "XEmacs\\|Lucid" emacs-version) + (progn + (find-tag tag) + (setq new-buffer (current-buffer)) + (set-buffer the-buffer)) + (setq new-buffer (find-tag-noselect tag)) ;Seems to set buffer to TAGS + (set-buffer the-buffer)) + new-buffer)) + +;;--------------------------------------------------------------------------- +;; imenu stuff +;; All of this should only be loaded if imenu is *already* loaded because +;; we redefine imenu here. + +(cond + (bib-use-imenu + (require 'imenu) + (require 'cl) + ;;; Now done at end of this file: + ;;(add-hook 'LaTeX-mode-hook 'LaTeX-hook-setq-imenu) + + (defvar bib-imenu-document-counter nil + "bib-cite internal variable") + +;; FIXME: If bib-cite becomes a minor mode, then this hook will go away +;; and this will be done in the minor-mode function. + (defun LaTeX-hook-setq-imenu () + ;; User who *never* uses multi-file documents could change this to: + ;; 'imenu--create-LaTeX-index-for-buffer + (setq imenu-create-index-function 'imenu--create-LaTeX-index)) + + (defun imenu--create-LaTeX-index () + ;; dispatch to proper function, depending on whether a multi-file document. + (let ((masterfile (bib-master-file))) + (if masterfile + (imenu--create-LaTeX-index-for-document masterfile) + (imenu--create-LaTeX-index-for-buffer)))) + + (defun imenu--create-LaTeX-index-for-document (masterfile) + ;; For a multi-file document in auctex only. + ;; Create imenu--index-alist for master file buffer and use the same + ;; for all input files? This would be faster... Maybe in next version? + (bib-etags) ;Create a new TAGS file, user needs it. + (let ((tex-buffer (get-buffer-create "*imenu-tex*")) + (index-alist '()) + (index-label-alist '()) + (prev-pos)) + (save-excursion + (set-buffer tex-buffer) + ;; set its directory so relative includes work without expanding + (setq default-directory (file-name-directory masterfile)) + (insert-file-contents masterfile) + (goto-char (point-min)) + (while (re-search-forward + "^[ \t]*\\\\\\(input\\|include\\){\\([^}]*\\)}" nil t) + (let ((the-file (buffer-substring (match-beginning 2)(match-end 2)))) + (if (and (not (file-readable-p + (expand-file-name the-file default-directory))) + (not (string-match ".tex$" the-file))) + (setq the-file (concat the-file ".tex"))) + (end-of-line)(insert "\n") + (insert-file-contents the-file))) + ;; Now, the document is like any other tex file + (setq bib-imenu-document-counter -99) ;IDs menu entries start at -100 + (goto-char (point-max)) + (imenu-progress-message prev-pos 0 t) + (while + (re-search-backward +;;; "\\\\\\(\\(sub\\)*section\\|chapter\\|label\\){[^}]+}" + "\\(\\\\label\\)\\|\\(^[ ]*\\\\\\(\\(sub\\)*section\\|chapter\\)\\){[^}]+}" + nil t) + (imenu-progress-message prev-pos nil t) + (save-match-data + (save-excursion + (cond + ((looking-at "\\\\label") + (push (imenu--LaTeX-name-and-etags) + index-label-alist)) + (t + (push (imenu--LaTeX-name-and-etags) + index-alist)))))) + (kill-buffer tex-buffer) + (imenu-progress-message prev-pos 100 t) + ;;Michal Mnuk's add-on removes \label <Michal.Mnuk@risc.uni-linz.ac.at> + ;;Plus PSG's fix for 19.31 w/o imenu-create-submenu-name + (and index-label-alist + (push (cons (or (and (fboundp 'imenu-create-submenu-name) + (imenu-create-submenu-name "Labels")) + "Labels") + (sort (imenu--remove-LaTeX-keyword-list + index-label-alist) 'imenu--label-cmp)) + index-alist)) + ;;(and index-label-alist + ;; (push (cons (imenu-create-submenu-name "Labels") + ;; index-label-alist) + ;; index-alist)) + index-alist))) + + (defun imenu--create-LaTeX-index-for-buffer () + ;; For non-multi-file documents. + (let ((index-alist '()) + (index-label-alist '()) + prev-pos) + (setq bib-imenu-document-counter -99) ;IDs menu entries starting at -100 + (goto-char (point-max)) + (imenu-progress-message prev-pos 0 t) + (while + (re-search-backward +;;; Better regexp, but slow +;;; "^[^;]*\\(\\\\\\)\\(\\(sub\\)*section\\|chapter\\|label\\){[^}]+}" +;;; Original regexp that would catch commented-out stuff +;;; "\\\\\\(\\(sub\\)*section\\|chapter\\|label\\){[^}]+}" + "\\(\\\\label\\)\\|\\(^[ ]*\\\\\\(\\(sub\\)*section\\|chapter\\)\\){[^}]+}" + nil t) + (imenu-progress-message prev-pos nil t) + (save-match-data + (save-excursion + (cond + ((looking-at "\\\\label") + (push (imenu--LaTeX-name-and-position) + index-label-alist)) + (t + (push (imenu--LaTeX-name-and-position) + index-alist)))))) + (imenu-progress-message prev-pos 100 t) + ;;Michal Mnuk's add-on removes \label <Michal.Mnuk@risc.uni-linz.ac.at> + ;;Plus PSG's fix for 19.31 w/o imenu-create-submenu-name + (and index-label-alist + (push (cons (or (and (fboundp 'imenu-create-submenu-name) + (imenu-create-submenu-name "Labels")) + "Labels") + (sort (imenu--remove-LaTeX-keyword-list + index-label-alist) 'imenu--label-cmp)) + index-alist)) + ;;(and index-label-alist + ;; (push (cons (imenu-create-submenu-name "Labels") + ;; index-label-alist) + ;; index-alist)) + index-alist)) + + ;;Michal Mnuk's three routines: + (defun imenu--remove-LaTeX-keyword-list (llist) + "Remove the LaTeX KEYWORD from car's of all elements in LLIST." + (mapcar + (function (lambda (element) + (imenu--remove-LaTeX-keyword-el element "label"))) + llist)) + + (defun imenu--remove-LaTeX-keyword-el (element keyword) + "Remove the LaTeX KEYWORD from car of ELEMENT." + (save-match-data + ;; Shouls I have extra option here: "[ + (string-match (concat "\\\\" keyword "{\\(.*\\)}") (car element)) + (cons + (substring (car element) (match-beginning 1) (match-end 1)) + (cdr element)))) + + (defun imenu--label-cmp (el1 el2) + "Predicate to compare labels in lists produced by + imenu--create-LaTeX-index." + (string< (car el1) (car el2))) + + (defun imenu--LaTeX-name-and-position () + (save-excursion + ;; We're on the opening slash + (let ((beg (point)) + (end (progn (search-forward "{" nil t) + (forward-char -1) + (forward-sexp 1) + (point))) + (marker (make-marker))) + (set-marker marker beg) + (cons (buffer-substring beg end) marker)))) + + (defun imenu--LaTeX-name-and-etags () + (save-excursion + (setq bib-imenu-document-counter (1- bib-imenu-document-counter)) + (cons (buffer-substring (point) + (progn (search-forward "{") + (forward-char -1) + (forward-sexp 1) + (point))) + bib-imenu-document-counter))) + + ;; Updated to imenu in Emacs 19.33 + (defun imenu (index-item) + "Jump to a place in the buffer chosen using a buffer menu or mouse menu. +See `imenu-choose-buffer-index' for more information." + (interactive + (list (save-restriction + (widen) + (imenu-choose-buffer-index)))) + ;; Convert a string to an alist element. + (if (stringp index-item) + (setq index-item (assoc index-item (imenu--make-index-alist)))) + (and index-item + (progn + (push-mark) + (cond + ((markerp (cdr index-item)) + (if (or ( > (marker-position (cdr index-item)) (point-min)) + ( < (marker-position (cdr index-item)) (point-max))) + ;; widen if outside narrowing + (widen)) + (goto-char (marker-position (cdr index-item)))) + ;; PSG - Handle tags + ((and (numberp (cdr index-item)) + (< (cdr index-item) -99)) + (find-tag (car index-item))) + (t + (if (or ( > (cdr index-item) (point-min)) + ( < (cdr index-item) (point-max))) + ;; widen if outside narrowing + (widen)) + (goto-char (cdr index-item))))))) +;;; end of bib-use-imenu stuff + )) +;; -------------------------------------------------------------------------- +;; The following routines make a temporary bibliography buffer +;; holding all bibtex files found. + +(defun bib-get-bibliography (include-filenames-f) + "Returns a new bibliography buffer holding all bibtex files in the document. + +If using auc-tex, and either TeX-parse-self is set or C-c C-n is used to +parse the document, then the entire multifile document will be searched +for \bibliography commands. + +If this fails, the current buffer is searched for the first \bibliography +command. + +If include-filenames-f is true, include as a special header the filename +of each bib file. + +Puts the buffer in text-mode such that forward-sexp works with german \" +accents embeded in bibtex entries." + (let ((bib-list (or (and (fboundp 'LaTeX-bibliography-list) + (boundp 'TeX-auto-update) + (LaTeX-bibliography-list)) +;; LaTeX-bibliography-list (if bound) returns an unformatted list of +;; bib files used in the document, but only if parsing is turned on +;; or C-c C-n was used. + (bib-bibliography-list))) + (bib-buffer (get-buffer-create "*bibtex-bibliography*")) + ;; Path is relative to the master directory + (default-directory (bib-master-directory)) + (the-name)(the-warnings)(the-file)) + (save-excursion + ;; such that forward-sexp works with embeeded \" in german, + ;; and unbalanced () + (set-buffer bib-buffer) + (erase-buffer) + (set-syntax-table text-mode-syntax-table) +;; (if (boundp 'bibtex-mode-syntax-table) +;; (set-syntax-table bibtex-mode-syntax-table) +;; (text-mode)) + ) + ;;We have a list of bib files + ;;Search for them, include them, list those not readable + (while bib-list + (setq the-name (car (car bib-list))) ;Extract the string only + (setq bib-list (cdr bib-list)) + (setq the-name + (substring the-name + (string-match "[^ ]+" the-name) ;remove leading spaces + (string-match "[ ]+$" the-name))) ;remove trailing space + (if (not (string-match "\\.bib$" the-name)) + (setq the-name (concat the-name ".bib"))) + (setq the-file + (or + (and (file-readable-p (expand-file-name (concat "./" the-name))) + (expand-file-name (concat "./" the-name))) + (psg-checkfor-file-list the-name + (psg-list-env bib-bibtex-env-variable)) + ;; Check for BIBINPUT env variable as well (by popular demand!) + (psg-checkfor-file-list the-name (psg-list-env "BIBINPUT")) + (and (boundp 'TeX-check-path) + (psg-checkfor-file-list the-name TeX-check-path)))) + (if the-file + (progn + (save-excursion + (set-buffer bib-buffer) + (goto-char (point-max)) + (if include-filenames-f + (insert "%%%Filename: " the-file "\n")) + (insert-file-contents the-file nil) + (goto-char 1))) + (setq the-warnings + (concat the-warnings "Could not read file: " the-name "\n")))) + (if the-warnings + (progn + (with-output-to-temp-buffer "*Help*" + (princ the-warnings)) + (kill-buffer bib-buffer) + (error + "Sorry, can't find all bibtex files in \\bibliography command")) + bib-buffer))) + +(defun bib-bibliography-list () + "Return list of bib files listed in first \\bibliography command in buffer +Similar output to auc-tex's LaTeX-bibliography-list +The first element may contain trailing whitespace (if there was any in input) +although BiBTeX doesn't allow it!" + (save-excursion + (goto-char 1) + (if (not (re-search-forward "^[ \t]*\\\\bibliography{[ \t]*\\([^},]+\\)" + nil t)) + (error "Sorry, can't find \\bibliography command anywhere") + (let ((the-list (list (buffer-substring + (match-beginning 1)(match-end 1)))) + (doNext t)) + (while doNext + (if (looking-at ",") + (setq the-list + (append the-list + (list (buffer-substring + (progn (skip-chars-forward ", ")(point)) + (progn (re-search-forward "[,}]" nil t) + (backward-char 1) + (skip-chars-backward ", ") + (point)))))) + (setq doNext nil))) + (mapcar 'list the-list))))) + +;; BibTeX-mode key def to create auc-tex's parsing file. +(defun bib-create-auto-file () + "Force the creation of the auc-tex auto file for a bibtex buffer" + (interactive) + (if (not (require 'latex)) + (error "Sorry, This is only useful if you have auc-tex")) + (let ((TeX-auto-save t) + (TeX-auto-update t) + (TeX-auto-regexp-list BibTeX-auto-regexp-list)) + ;; TeX-auto-write + ;; -> calls TeX-auto-store + ;; -> calls TeX-auto-parse + ;; clears LaTeX-auto-bibtem (temporary holding space for bibitems) + ;; searches buffer using regexp in TeX-auto-regexp-list + ;; -> if LaTeX-auto-bibtem (the temporary holding space for bibitems) + ;; holds stuffs like + ;; ("Zimmermann:1991" "Anger_et_al:1993") + ;; as determined by + ;; (member nil (mapcar 'TeX-auto-entry-clear-p TeX-auto-parser)) + ;; then it creates the auto file. + + ;; TeX-auto-write may call TeX-master-file which may fail if + ;; TeX-header-end is unset (by LaTeX-common-initialization in latex-mode) + (if (not TeX-header-end) + (setq TeX-header-end LaTeX-header-end)) + + (TeX-auto-write))) + +;; --------------------------------------------------------------------------- +;; Key definitions start here... + +;; Christoph Wedler <wedler@fmi.uni-passau.de> +;; Replace eval-after-load (which doesn't work with efs anyway) +;; with add-submenu in bib-cite-initialize + +;;(if ((and (string-match "XEmacs\\|Lucid" emacs-version) +;; (or window-system +;; (fboundp 'smart-menu)) ;text menus by Bob Weiner +;; (not (fboundp 'eval-after-load)))) +;; ;; define eval-after-load for XEmacs +;; (defun eval-after-load (file form) +;; "Arrange that, if FILE is ever loaded, FORM will be run at that +;;time. +;;This makes or adds to an entry on `after-load-alist'. +;;It does nothing if FORM is already on the list for FILE. +;;FILE should be the name of a library, with no directory name." +;; (or (assoc file after-load-alist) +;; (setq after-load-alist (cons (list file) after-load-alist))) +;; (let ((elt (assoc file after-load-alist))) +;; (or (member form (cdr elt)) +;; (nconc elt (list form)))) +;; form)) + +(defvar bib-cite-map + (let ((map (make-sparse-keymap))) + (define-key map "a" 'bib-apropos) + (define-key map "m" 'bib-make-bibliography) + (define-key map "d" 'bib-display) + (define-key map "e" 'bib-etags) + (define-key map "f" 'bib-find) + (define-key map "h" 'bib-highlight-mouse) + map) + "Keymap to bind to \\C-cb in latex keymap") + +(cond + ((and (string-match "XEmacs\\|Lucid" emacs-version) + (or window-system + (fboundp 'smart-menu))) ;text menus by Bob Weiner + ;; + ;; xemacs under X with auc-tex + ;; + + ;; Christoph Wedler <wedler@fmi.uni-passau.de> + (defvar bib-cite-xemacs-menu + '("Bib-Cite" + ;;"---" + ["Make BibTeX bibliography buffer" bib-make-bibliography t] + ["Display citation or matching \\ref or \\label" bib-display t] + ["Find BibTeX citation or matching \\ref or \\label" bib-find t] + ["Search apropos BibTeX files" bib-apropos t] + ["Build TAGS file for multi-file document" bib-etags (bib-master-file)] + ["Refresh \\cite, \\ref and \\label mouse highlight" + bib-highlight-mouse t]) + "Submenu of LaTeX menu, used by bib-cite.") + +;;; Add to bibtex.el's popup menu + (defvar bib-cite-xemacs-bibtex-mode-menu + '("---" + "Bib-Cite" + "---" + ["Search apropos BibTeX files" bib-apropos t] + ["Create auc-tex auto parsing file" bib-create-auto-file t]) + "Submenu of bibtex-mode menu, used by bib-cite.") + + (if (boundp 'bibtex-menu) + ;; Add menu now + (setq bibtex-menu + (append + bibtex-menu + bib-cite-xemacs-bibtex-mode-menu)) + ;; Setup to add menu later + (defun bib-cite-bibtex-mode-hook () + (if (boundp 'bibtex-menu) + (progn + (setq bibtex-menu + (append + bibtex-menu + bib-cite-xemacs-bibtex-mode-menu)) + (remove-hook 'bibtex-mode-hook 'bib-cite-bibtex-mode-hook)))) + (add-hook 'bibtex-mode-hook 'bib-cite-bibtex-mode-hook)) +;;; Done - Add to bibtex.el's popup menu + +;; (eval-after-load +;; "latex" +;; '(progn +;; (add-menu-button '("LaTeX") ["----" nil t]) +;; (add-menu-button +;; '("LaTeX") ["Make BibTeX bibliography buffer" bib-make-bibliography t]) +;; (add-menu-button +;; '("LaTeX") ["Display citation or matching \\ref or \\label" +;; bib-display t]) +;; (add-menu-button +;; '("LaTeX") ["Find BibTeX citation or matching \\ref or \\label" +;; bib-find t]) +;; (add-menu-button +;; '("LaTeX") ["Search apropos BibTeX files" bib-apropos t]) +;; (add-menu-button +;; '("LaTeX") ["Build TAGS file for multi-file document" bib-etags t]) +;; (add-menu-button +;; '("LaTeX") +;; ["Refresh \\cite, \\ref and \\label mouse highlight" +;; bib-highlight-mouse t]) + + ) + + ((and (not (string-match "XEmacs\\|Lucid" emacs-version)) + (string-equal "19" (substring emacs-version 0 2)) + (or window-system + (fboundp 'tmm-menubar))) ; 19.30 - Will autoload if necessary + ;; + ;; emacs-19 under X-windows (or non-X with tmm) + ;; + + ;; This *almost* makes me want to switch over to XEmacs... + + ;; to auc-tex auto file for a bibtex buffer + (eval-after-load + "bibtex" + '(progn + (cond + ((lookup-key bibtex-mode-map [menu-bar move/edit]) + (define-key-after + (lookup-key bibtex-mode-map [menu-bar move/edit]) + [bib-nil] '("---" . nil) '"--") + (define-key-after + (lookup-key bibtex-mode-map [menu-bar move/edit]) + [bib-apropos] '("Search Apropos" . bib-apropos) 'bib-nil) + (define-key-after + (lookup-key bibtex-mode-map [menu-bar move/edit]) + [auc-tex-parse] + '("Create auc-tex auto parsing file" . bib-create-auto-file) + 'bib-apropos)) + ((lookup-key bibtex-mode-map [menu-bar bibtex-edit]) + (define-key-after + (lookup-key bibtex-mode-map [menu-bar bibtex-edit]) + [bib-nil] '("---" . nil) '"--") + (define-key-after + (lookup-key bibtex-mode-map [menu-bar bibtex-edit]) + [bib-apropos] '("Search Apropos" . bib-apropos) 'bib-nil) + (define-key-after + (lookup-key bibtex-mode-map [menu-bar bibtex-edit]) + [auc-tex-parse] + '("Create auc-tex auto parsing file" . bib-create-auto-file) + 'bib-apropos))))) + + (defvar bib-cite-put-menu-separately t + "*Put bib-cite menubar menu separately, not within LaTeX pull-down menu") + (cond + ((not bib-cite-put-menu-separately) ;Old method - Destroy code? + (defun bib-add-menu-keys (the-key) + (cond + (the-key ;make sure keymap exists + (define-key-after the-key [bib-nil] '("---" . nil) '"--") + (define-key-after the-key [bib-make-bibliography] + '("Make BiBTeX bibliography buffer" . bib-make-bibliography) + 'bib-nil) + (define-key-after the-key [bib-display] + '("Display citation or matching \\ref or \\label" . bib-display) + 'bib-make-bibliography) + (define-key-after the-key [bib-find] + '("Find BiBTeX citation or matching \\ref or \\label" . bib-find) + 'bib-display) + (define-key-after the-key [bib-apropos] + '("Search apropos BiBTeX files" . bib-apropos) 'bib-find) + ;;;(put 'ps-print-region-with-faces 'menu-enable 'mark-active) + ;;;(define-key menu-bar-tools-menu [ps-print-buffer] + ;;; '("Postscript Print Buffer" . ps-print-buffer-with-faces)) + (put 'bib-etags 'menu-enable '(bib-master-file)) + (define-key-after the-key [bib-etags] + '("Build TAGS file for multi-file document" . bib-etags) + 'bib-apropos) + (define-key-after the-key [bib-highlight-mouse] + '("Refresh \\cite, \\ref and \\label mouse highlight" . + bib-highlight-mouse) + 'bib-etags)))) + + ;;for auc-tex's LaTeX-mode + (eval-after-load + "latex" + '(let ((the-key (or (lookup-key LaTeX-mode-map [menu-bar LaTeX]) + (lookup-key LaTeX-mode-map [menu-bar AUC\ TeX])))) + ;;;(define-key LaTeX-mode-map [S-mouse-1] 'bib-display-mouse) + ;;;(define-key LaTeX-mode-map [S-mouse-2] 'bib-find-mouse) + (define-key LaTeX-mode-map "\C-cb" bib-cite-map) + (bib-add-menu-keys the-key))) + + ;;for auc-tex's TeX-mode + (eval-after-load + "tex" + '(let ((the-key (lookup-key TeX-mode-map [menu-bar TeX]))) + ;;;(define-key TeX-mode-map [S-mouse-1] 'bib-display-mouse) + ;;;(define-key TeX-mode-map [S-mouse-2] 'bib-find-mouse) + (define-key TeX-mode-map "\C-cb" bib-cite-map) + (bib-add-menu-keys the-key))) + + ;;for plain tex-mode + (eval-after-load + "tex-mode" + '(progn + (let ((the-key (lookup-key tex-mode-map [menu-bar tex]))) + ;;;(define-key tex-mode-map [S-mouse-1] 'bib-display-mouse) + ;;;(define-key tex-mode-map [S-mouse-2] 'bib-find-mouse) + (define-key tex-mode-map "\C-cb" bib-cite-map) + (bib-add-menu-keys the-key) + (define-key tex-mode-map [menu-bar tex bib-etags] + 'undefined))))) + + (t ;New method - separate menu + (setq bib-cite-menu-map (make-sparse-keymap "bib-cite")) + (define-key bib-cite-menu-map [bib-display] + '("Display citation or matching \\ref or \\label" . bib-display)) + (define-key bib-cite-menu-map [bib-find] + '("Find BiBTeX citation or matching \\ref or \\label" . bib-find)) + (define-key bib-cite-menu-map [bib-make-bibliography] + '("Make BiBTeX bibliography buffer" . bib-make-bibliography)) + (put 'bib-etags 'menu-enable '(bib-master-file)) + (define-key bib-cite-menu-map [bib-etags] + '("Build TAGS file for multi-file document" . bib-etags)) + (define-key bib-cite-menu-map [bib-apropos] + '("Search apropos BiBTeX files" . bib-apropos)) + (define-key bib-cite-menu-map [bib-highlight-mouse] + '("Refresh \\cite, \\ref and \\label mouse highlight" + . bib-highlight-mouse)) + + (eval-after-load + "tex-mode" + '(progn + ;;;(define-key tex-mode-map [S-mouse-1] 'bib-display-mouse) + ;;;(define-key tex-mode-map [S-mouse-2] 'bib-find-mouse) + (define-key tex-mode-map "\C-cb" bib-cite-map) + (define-key tex-mode-map [menu-bar bib-cite-menu-map] + (cons "Bib-Cite" bib-cite-menu-map)) + (define-key tex-mode-map [menu-bar bib-cite-menu-map bib-etags] + 'undefined))) + + ;;for auc-tex's LaTeX-mode + (eval-after-load + "latex" + '(progn + ;;;(define-key LaTeX-mode-map [S-mouse-1] 'bib-display-mouse) + ;;;(define-key LaTeX-mode-map [S-mouse-2] 'bib-find-mouse) + (define-key LaTeX-mode-map "\C-cb" bib-cite-map) + (define-key LaTeX-mode-map [menu-bar bib-cite-menu-map] + (cons "Bib-Cite" bib-cite-menu-map)))) + + ;;for auc-tex's TeX-mode + (eval-after-load + "tex" + '(progn + ;;;(define-key TeX-mode-map [S-mouse-1] 'bib-display-mouse) + ;;;(define-key TeX-mode-map [S-mouse-2] 'bib-find-mouse) + (define-key TeX-mode-map "\C-cb" bib-cite-map))) + )))) + +;; This must be after adding to LaTeX-mode-map because we copy it here. +(defvar bib-highlight-mouse-keymap + ;; First, copy the local keymap so we don't have `disappearing' menus + ;; when the mouse is moved over a \ref, \label or \cite command. + ;; FIXME: **This only works if bib-cite is loaded after TeX keymaps + ;; are constructed. Thus, if bib-cite is loaded in a hook. + + ;; FIXME: Check out (mouse-major-mode-menu) to see how it grabs the local + ;; menus to display. Maybe on `highlighted' commands we could only + ;; display the bib-cite stuff (or a subset of it). + (let ((m (cond + ((boundp 'LaTeX-mode-map) + (copy-keymap LaTeX-mode-map)) + ((boundp 'tex-mode-map) + (copy-keymap tex-mode-map)) + (t + (make-sparse-keymap))))) + (cond + ((string-match "XEmacs\\|Lucid" emacs-version) + (set-keymap-name m 'bib-highlight-mouse-keymap) + (cond + ;; action-key stuff from Vladimir Alexiev <vladimir@cs.ualberta.ca> + ((commandp 'action-key) + ;; for hyperbole. The Right Way is to define implicit buttons + ;; (defib) bib-cite and label-ref instead of overriding action-key and + ;; assist key, so that eg smart key help can be obtained, but I'm + ;; lazy. + (substitute-key-definition 'action-key 'bib-find m global-map) + (substitute-key-definition 'assist-key 'bib-display m global-map) + (substitute-key-definition 'action-key-depress + 'bib-find-mouse m global-map) + (substitute-key-definition 'assist-key-depress + 'bib-display-mouse m global-map) + (substitute-key-definition 'action-mouse-key nil m global-map) + (substitute-key-definition 'assist-mouse-key nil m global-map)) + (t ; xemacs, not hyperbole + (define-key m "\e\r" 'bib-find-mouse) ; bug Fixed in V2.17 + (define-key m "\e\n" 'bib-display-mouse) ;bug Fixed in V2.17 + ;;(define-key m [(shift button1)] 'bib-display-mouse) + (define-key m [button3] 'bib-display-mouse) + (define-key m [button2] 'bib-find-mouse)))) + (t ; emacs 19 + (cond + ((commandp 'action-key) + (substitute-key-definition 'action-key 'bib-find m global-map) + (substitute-key-definition 'assist-key 'bib-display m global-map) + (substitute-key-definition 'action-mouse-key-emacs19 + 'bib-find-mouse m global-map) + (substitute-key-definition 'assist-mouse-key-emacs19 + 'bib-display-mouse m global-map) + (substitute-key-definition 'action-key-depress-emacs19 + nil m global-map) + (substitute-key-definition 'assist-key-depress-emacs19 + nil m global-map)) + (t ; emacs 19, not hyperbole + (define-key m [down-mouse-3] 'bib-display-mouse) + (define-key m [mouse-2] 'bib-find-mouse))))) + m)) +;; -------------------------------------------------------------------------- +;; The following routines are also defined in other packages... + +;; Must be in sync with function of same name in ff-paths.el +(defun psg-checkfor-file-list (filename list) + "Check for presence of FILENAME in directory LIST. Return 1st found path." + ;;USAGE: (psg-checkfor-file-list "gri.cmd" (psg-list-env "PATH")) + ;;USAGE: (psg-checkfor-file-list "gri-mode.el" load-path) + ;;USAGE: (psg-checkfor-file-list "gri.cmd" (psg-translate-ff-list "gri.tmp")) + (let ((the-list list) + (filespec)) + (while the-list + (if (not (car the-list)) ; it is nil + (setq filespec (expand-file-name filename "~")) + (setq filespec + (concat (file-name-as-directory (car the-list)) filename))) + (if (file-exists-p filespec) + (setq the-list nil) + (setq filespec nil) + (setq the-list (cdr the-list)))) + (if filespec + filespec + ;; If I have not found a file yet, then check if some directories + ;; ended in // and recurse through them. + (let ((the-list list)) + (while the-list + (if (not (string-match "//$" (car the-list))) nil + (setq filespec (car + (search-directory-tree + (substring (car the-list) 0 (match-beginning 0)) + (concat "^" filename "$") + t + t))) + (if filespec ;Success! + (setq the-list nil))) + (setq the-list (cdr the-list))) + filespec)))) + + +(defun search-directory-tree (directories extension-regexp recurse first-file) + "Return a list of all reachable files in DIRECTORIES ending with EXTENSION. +DIRECTORIES is a list or a single-directory string +EXTENSION is actually (any) regexp, usually \\\\.bib$ +If RECURSE is t, then we will recurse into the directory tree, + nil, we will only search the list given. +If FIRST-FILE is t, stop after first file is found." + (or (listp directories) + (setq directories (list directories))) + + (let (match) + (while directories + (let* ((directory (file-name-as-directory (car directories))) + (content (and directory + (file-readable-p directory) + (file-directory-p directory) + (directory-files directory)))) + (setq directories (cdr directories)) + (while content + (let ((file (expand-file-name (car content) directory))) + (cond ((string-match "[.]+$" (car content))) ;This or parent dir + ((not (file-readable-p file))) + ((and recurse + (file-directory-p file)) + (setq directories + (cons (file-name-as-directory file) directories))) + ((string-match extension-regexp + (file-name-nondirectory file)) + (and first-file + (setq content nil + directories nil)) + (setq match (cons file match))))) + (setq content (cdr content))))) + + match)) + +;;; (defun psg-checkfor-file-list (filename list) +;;; (let ((the-list list) +;;; (filespec)) +;;; (while the-list +;;; (if (not (car the-list)) ; it is nil +;;; (setq filespec (concat "~/" filename)) +;;; (setq filespec +;;; (concat (file-name-as-directory (car the-list)) filename))) +;;; (if (file-exists-p filespec) +;;; (setq the-list nil) +;;; (setq filespec nil) +;;; (setq the-list (cdr the-list)))) +;;; filespec)) + +(or (fboundp 'dired-replace-in-string) + ;; This code is part of GNU emacs + (defun dired-replace-in-string (regexp newtext string) + ;; Replace REGEXP with NEWTEXT everywhere in STRING and return result. + ;; NEWTEXT is taken literally---no \\DIGIT escapes will be recognized. + (let ((result "") (start 0) mb me) + (while (string-match regexp string start) + (setq mb (match-beginning 0) + me (match-end 0) + result (concat result (substring string start mb) newtext) + start me)) + (concat result (substring string start))))) + + +;; Could use fset here to equal TeX-split-string to dired-split if only +;; dired-split is defined. That would eliminate a check in psg-list-env. +(and (not (fboundp 'TeX-split-string)) + (not (fboundp 'dired-split)) + ;; This code is part of auc-tex + (defun TeX-split-string (char string) + "Returns a list of strings. given REGEXP the STRING is split into +sections which in string was seperated by REGEXP. + +Examples: + + (TeX-split-string \"\:\" \"abc:def:ghi\") + -> (\"abc\" \"def\" \"ghi\") + + (TeX-split-string \" *\" \"dvips -Plw -p3 -c4 testfile.dvi\") + + -> (\"dvips\" \"-Plw\" \"-p3\" \"-c4\" \"testfile.dvi\") + +If CHAR is nil, or \"\", an error will occur." + + (let ((regexp char) + (start 0) + (result '())) + (while (string-match regexp string start) + (let ((match (string-match regexp string start))) + (setq result (cons (substring string start match) result)) + (setq start (match-end 0)))) + (setq result (cons (substring string start nil) result)) + (nreverse result)))) + +;; Must be in sync with function of same name in ff-paths.el +;; (See also PC-include-file-path in standard emacs ditsribution.) +(defun psg-list-env (env) + "Return a list of directory elements in ENVIRONMENT variable (w/o leading $) +argument may consist of environment variable plus a trailing directory, e.g. +HOME or HOME/bin (trailing directory not supported in dos or OS/2). + +bib-dos-or-os2-variable affects: + path separator used (: or ;) + whether backslashes are converted to slashes" + (if (not (getenv env)) + nil ;Because dired-replace-in-string fails + (let* ((value (if bib-dos-or-os2-variable + (dired-replace-in-string "\\\\" "/" (getenv env)) + (getenv env))) + (sep-char (or (and bib-dos-or-os2-variable ";") ":")) + (entries (and value + (or (and (fboundp 'TeX-split-string) + (TeX-split-string sep-char value)) + (dired-split sep-char value)))) + entry + answers) + (while entries + (setq entry (car entries)) + (setq entries (cdr entries)) + (if (file-directory-p entry) + (setq answers (cons entry answers)))) + (nreverse answers)))) + +;; +;; Create the unified hook to call from LaTeX-mode-hook +;; +(defun bib-cite-initialize () + ;; Christoph Wedler's <wedler@fmi.uni-passau.de> suggestion for xemacs + ;; Added for version 2.19 + (if (boundp 'tags-always-exact) + (progn + (make-local-variable 'tags-always-exact) + (setq tags-always-exact nil))) + + ;; Christoph Wedler <wedler@fmi.uni-passau.de> + (and (boundp 'bib-cite-xemacs-menu) + bib-cite-xemacs-menu + (fboundp 'add-submenu) ;Insurance for emacs + ;;;FIXME: I can do this to add a main menu. + ;;(add-submenu nil bib-cite-xemacs-menu) + ;; This makes it buffer-specific so I don't need to remove it. + (set-buffer-menubar (copy-sequence current-menubar)) + (add-submenu '("LaTeX") bib-cite-xemacs-menu)) + + (cond + ((string-match "XEmacs\\|Lucid" emacs-version) + ;; Define keys for XEmacs + ;; Could do all modes like this for emacs also... + (local-set-key "\C-cba" 'bib-apropos) + (local-set-key "\C-cbm" 'bib-make-bibliography) + (local-set-key "\C-cbd" 'bib-display) + (local-set-key "\C-cbe" 'bib-etags) + (local-set-key "\C-cbf" 'bib-find) + (local-set-key "\C-cbh" 'bib-highlight-mouse))) + + (if bib-highlight-mouse-t + (bib-highlight-mouse)) + (if bib-use-imenu + (LaTeX-hook-setq-imenu)) + + ;; Make sure that imenu-sort-function is nil + (and (boundp 'imenu-sort-function) + imenu-sort-function + (make-local-variable 'imenu-sort-function) + (setq imenu-sort-function nil)) + ) + +(add-hook 'LaTeX-mode-hook 'bib-cite-initialize t) ;auctex's latex-mode +(add-hook 'latex-mode-hook 'bib-cite-initialize t) ;emacs' plain latex-mode + +;; If bib-cite.el is loaded in a mode hook, bib-highlight-mouse and +;; LaTeX-hook-setq-imenu are not called on the buffer... +;; so invoke it now for .tex buffers. Same for imenu. +;(if (string-match ".tex$" (buffer-name)) +; (bib-cite-initialize)) + +(if (or (eq major-mode 'latex-mode) + (eq major-mode 'plain-tex-mode)) + (bib-cite-initialize)) + +(provide 'bib-cite) +;;; bib-cite.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/font-latex.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,790 @@ +;;; font-latex.el --- LaTeX fontification for Font Lock mode. + +;; Copyright (C) 1996 Peter S. Galbraith + +;; Authors: Peter S. Galbraith <galbraith@mixing.qc.dfo.ca> +;; Simon Marshall <Simon.Marshall@esrin.esa.it> +;; Maintainer: Peter S. Galbraith <galbraith@mixing.qc.dfo.ca> +;; Created: 06 July 1996 +;; Version: 0.403 *Beta* (19 Nov 96) +;; Keywords: LaTeX faces + +;; RCS $Id: font-latex.el,v 1.1 1997/02/20 02:17:35 steve Exp $ +;; Note: RCS version number does not correspond to release number. + +;; LCD Archive Entry: (Not yet submitted!) +;; font-latex|Peter Galbraith|galbraith@mixing.qc.dfo.ca| +;; LaTeX fontification for font-lock| +;; 06-Jul-1996|0.01|~/modes/font-latex.el| + +;; The archive is archive.cis.ohio-state.edu in /pub/gnu/emacs/elisp-archive. + +;;; This file is not part of GNU Emacs. + +;; This package is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; This package is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Commentary: + +;; New versions of this package (if they exist) may be found at: +;; ftp://ftp.phys.ocean.dal.ca/users/rhogee/elisp/font-latex.el + +;; Description: +;; This package enhances font-lock fontification patterns for LaTeX. +;; font-lock mode is a minor mode that causes your comments to be +;; displayed in one face, strings in another, reserved words in another, +;; and so on. +;; +;; Please see the accompanying file font-latex.tex for a demo of what +;; font-latex is supposed to do at different fontification levels. + +;; Installation instructions: +;; +;; Put this file in your emacs load-path, and byte-compile it: +;; M-x byte-compile-file +;; ** It runs faster when you byte-compile it! ** +;; +;; Then all you need to do is add this form to your .emacs file: +;; +;; (if window-system +;; (require 'font-latex)) +;; +;; There are two levels of fontification, selected by the value of the +;; font-lock variable font-lock-maximum-decoration. font-latex uses two +;; levels. There are ways documented in font-latex.el to set this +;; differently for each mode that uses font-lock, but if you are unsure and +;; are running on a fast enough machine, try putting this in your ~/.emacs +;; file: +;; (setq font-lock-maximum-decoration t) +;; It probably best to put it before the (require 'font-latex) statement. +;; +;; Lazy-lock users: +;; +;; lazy-lock and font-lock don't work too well together (up to Emacs 19.33 +;; and XEmacs 19.14 anyway). font-latex uses functions to find text to +;; fontify that may span more than one line, and this doesn't suit +;; lazy-lock's search limits too well. +;; +;; Old hilit19 (and hilit-LaTeX) users: +;; +;; If you are upgrading from using hilit-LaTeX.el or were using hilit19, +;; you must disable hilit19 (at least for latex mode) in order to use +;; font-latex.el. Here's how: +;; +;; - If you don't care to use hilit19 at all, don't `load' or `require' it +;; in your ~/.emacs file by removing the "(require 'hilit-LaTeX)" line. +;; - If you wish to use hilit19 everywhere but in latex mode, add the +;; following before your `load' or `require' hilit19: +;; +;; (setq hilit-mode-enable-list '(not latex-mode)) +;; +;; You can tell you using font-latex instead of hilit-LaTeX because: +;; +;; - colours will be different +;; - You'll see a message like `Fontifying font-latex.tex...done' +;; instead of `highlighting 1: \(^\|[^\\]\)\(\\[a-zA-Z\\]+\)' +;; ---------------------------------------------------------------------------- +;;; Change log: +;; V0.403 19Nov96 (RCS V1.37) +;; - Christoph Wedler <wedler@fmi.uni-passau.de> +;; XEmacs patch for local math-font +;; - Changed scheme for fontification of \section*{...} +;; V0.402 13Nov96 PSG (RCS V1.35) +;; - Embeded comments handled. +;; - Better XEmacs initilisation. +;; V0.401 12Nov96 PSG (RCS V1.34) - Nothing fontified when commented-out. +;; V0.400 11Nov96 PSG (RCS V1.33) +;; - Stab at on-the-fly multiline. +;; - mono support: <Johannes.Weinert@Informatik.Uni-Oldenburg.DE> +;; V0.314 16Oct96 PSG - Support for dark background removed for XEmacs. +;; V0.313 07Oct96 PSG (RCS V1.31) - Support for dark background. +;; V0.312 26Aug96 PSG (RCS V1.30) - Added font-latex-commented-outp. +;; V0.311 22Aug96 PSG (RCS V1.29) - fixed for XEmacs. +;; V0.310 22Aug96 simon (RCS V1.27) +;; - make font-latex-setup run font-lock-make-faces before variable trickery. +;; - set font-latex-string-face to the global value of font-lock-string-face. +;; V0.309 21Aug96 PSG (RCS V1.26) +;; - new font-latex-math-face done by string syntax. User may modify it. +;; - new font-latex-string-face. +;; V0.308 15Aug96 PSG (RCS V1.25) +;; - $$...$$ gets font-latex-math-face +;; - font-latex-match-math-envII fixed. +;; V0.307 14Aug96 PSG (RCS V1.23) - setup okay if loaded in a latex-mode-hook +;; V0.306 14Aug96 PSG (RCS V1.22) - added "item" to font-latex-match-function +;; V0.305 14Aug96 PSG (RCS V1.20) - use keep in font-latex-match-math-envII +;; V0.304 14Aug96 PSG (RCS V1.18) - minor comment edits. +;; V0.303 14Aug96 simon (RCS V1.17) +;; - rewrote font-latex-match-math-envII like font-latex-match-quotation +;; V0.302 12Aug96 PSG (RCS V1.16) +;; - (goto-char end) in condition-case error to avoid infinite loops. +;; V0.301 08Aug96 PSG (RCS V1.14) +;; - Better faces in XEmacs. +;; V0.300 07Aug96 PSG (RCS V1.12) +;; - Changed font-latex-match-font-inside-braces again for stranded \bf +;; - "[a-z]+box" changed +;; - font-latex-match-math-env checks preceding-char for \\[ +;; - use eval-after-compile in font-latex-match-math-envII +;; V0.201 05Aug96 PSG added \\(display\\)?math to Simon's changes +;; V0.200 05Aug96 simon: (RCS V1.10) +;; - fixed font-latex-match-command-outside-arguments +;; - rewrote font-latex-match-font-outside-braces like above +;; - rewrote font-latex-match-font-inside-braces like above +;; V0.101 01Aug96 PSG added \\(display\\)?math +;; V0.100 01Aug96 PSG - massive new test version +;; V0.061 23Jul96 PSG +;; - Removed trailing "\\>" in warning-face regexp (fails with \\ \- \\*) +;; V0.06 23Jul96 PSG +;; - fixed dobib in font-latex-labels. +;; - shorter font regexp in levels 3+4. +;; - removed \item and & from type +;; - fixed font-latex-math-envII regexp +;; V0.05 22Jul96 PSG +;; - changed \ref etc to reference-face. +;; - \\b added in buggy \item[option] regexp (not really fixed). +;; - font-latex-labels regexp bug +;; V0.041 simon: +;; - added font-latex-match-command-outside-arguments +;; - rewrote font-latex-match-quotation and font-latex-bib-highlight-mouse +;; - rewrote then removed bib-cite functionality. +;; - general top-level cleanup +;; V0.04 11Jul96 PSG +;; - added font-lock-comment-start-regexp defined in 19.32 +;; - encoded 8-bit characters to 7-bit. +;; V0.03 10Jul96 PSG +;; - font-latex-bib-cite-mouse-highlight-p can change after font-lock-defaults +;; is constructed. +;; V0.02 09Jul96 PSG +;; - added font-latex-bib-cite-mouse-highlight-p +;; - Fixed `overwrite' flags +;; V0.01 06Jul96 Peter S Galbraith - Created +;; ---------------------------------------------------------------------------- +;;; Code: +(require 'font-lock) + +(defvar font-latex-warning-face 'font-latex-warning-face + "Face to use for LaTeX major keywords.") +(defvar font-latex-sedate-face 'font-latex-sedate-face + "Face to use for LaTeX minor keywords.") +(defvar font-latex-italic-face 'font-latex-italic-face + "Face to use for LaTeX italics.") +(defvar font-latex-bold-face 'font-latex-bold-face + "Face to use for LaTeX bolds.") +(defvar font-latex-math-face 'font-latex-math-face + "Face to use for LaTeX math environments.") + +;; End-User can stop reading here. + +;; Make sure font-latex.el is supported. I don't claim to have tested this... +(if (if (save-match-data (string-match "Lucid\\|XEmacs" (emacs-version))) + (and (= emacs-major-version 19) (< emacs-minor-version 14)) + (and (= emacs-major-version 19) (< emacs-minor-version 29))) + (error "`font-latex' was written for Emacs 19.29/XEmacs 19.14 or later")) + +(defvar font-latex-is-XEmacs + (not (null (save-match-data (string-match "XEmacs\\|Lucid" emacs-version))))) + +(defvar font-latex-string-face nil + "Face to use for strings. This is set by Font LaTeX.") + +(defvar font-lock-comment-start-regexp nil + "Regexp to match the start of a comment.") + +(eval-when-compile + (require 'cl)) + +(cond + ((not font-latex-is-XEmacs) + ;;; emacs: + ;; Otherwise I overwrite fock-lock-face-attributes. + ;; font-lock.el needs a better way to add these faces! + (if (not font-lock-face-attributes) + (font-lock-make-faces)) + (unless (assq 'font-latex-sedate-face font-lock-face-attributes) + (cond + ;; FIXME: Add better conditions for grayscale. + ((memq font-lock-display-type '(mono monochrome grayscale greyscale + grayshade greyshade)) + (setq font-lock-face-attributes + (append + font-lock-face-attributes + (list '(font-latex-bold-face nil nil t nil nil) + '(font-latex-italic-face nil nil nil t nil) + '(font-latex-math-face nil nil nil nil t) + '(font-latex-sedate-face nil nil nil t nil) + (list + 'font-latex-warning-face + (cdr (assq 'background-color (frame-parameters))) + (cdr (assq 'foreground-color (frame-parameters))) + nil nil nil))))) + ((eq font-lock-background-mode 'light) ; light colour background + (setq font-lock-face-attributes + (append + font-lock-face-attributes + ;;;FIXME: These won't follow font-lock-type-face's changes. + ;;; Should I change to a (copy-face) scheme? + '((font-latex-bold-face "DarkOliveGreen" nil t nil nil) + (font-latex-italic-face "DarkOliveGreen" nil nil t nil) + (font-latex-math-face "green4") + (font-latex-sedate-face "grey50") + (font-latex-warning-face "red" nil t nil nil))))) + (t ; dark colour background + (setq font-lock-face-attributes + (append + font-lock-face-attributes + '((font-latex-bold-face "OliveGreen" nil t nil nil) + (font-latex-italic-face "OliveGreen" nil nil t nil) + (font-latex-math-face "LightSeaGreen") + ;; good are > LightSeaGreen, LightCoral, coral, orchid, orange + (font-latex-sedate-face "grey60") + (font-latex-warning-face "red" nil t nil nil)))))))) + (t + ;;; XEmacs: + (make-face 'font-latex-string-face "Face to use for LaTeX string.") + (copy-face 'font-lock-string-face 'font-latex-string-face) + + (make-face 'font-latex-bold-face "Face to use for LaTeX bolds.") + (copy-face 'font-lock-type-face 'font-latex-bold-face) + (make-face-bold 'font-latex-bold-face) + + (make-face 'font-latex-italic-face "Face to use for LaTeX italics.") + (copy-face 'font-lock-type-face 'font-latex-italic-face) + (make-face-italic 'font-latex-italic-face) + + (make-face 'font-latex-math-face "Face to use for LaTeX math.") + (make-face 'font-latex-sedate-face "Face to use for LaTeX minor keywords.") + (make-face 'font-latex-warning-face "Face to use for LaTeX major keywords.") + (make-face-bold 'font-latex-warning-face) + ;; XEmacs uses a tag-list thingy to determine if we are using color + ;; or mono (and I assume a dark background). + (set-face-foreground 'font-latex-math-face "green4" 'global nil 'append) + (set-face-foreground 'font-latex-sedate-face "grey50" 'global nil 'append) + (set-face-foreground 'font-latex-warning-face "red" 'global nil 'append))) + +(defun font-latex-setup () + "Setup this buffer for LaTeX font-lock. Usually called from a hook." + ;; Trickery to make $$ fontification be in `font-latex-math-face' while + ;; strings get whatever `font-lock-string-face' has been set to. + (if font-latex-is-XEmacs + ;; Cool patch from Christoph Wedler... + (let (instance) + (mapcar (function + (lambda (property) + (setq instance + (face-property-instance 'font-latex-math-face property + nil 0 t)) + (if (numberp instance) + (setq instance + (face-property-instance 'default property nil 0))) + (or (numberp instance) + (set-face-property 'font-lock-string-face property + instance (current-buffer))))) + (built-in-face-specifiers))) + (font-lock-make-faces) + (make-local-variable 'font-lock-string-face) + (setq font-lock-string-face font-latex-math-face + font-latex-string-face (default-value 'font-lock-string-face)) + ;; Tell Font Lock about the support. + (make-local-variable 'font-lock-defaults) + ;; Parentheses () are disabled because they should not delimit fontification + ;; in LaTeX text. + (setq font-lock-defaults + '((font-latex-keywords font-latex-keywords-1 font-latex-keywords-2) + nil nil ((?\( . ".") (?\) . ".") (?$ . "\"")) nil + (font-lock-comment-start-regexp . "%") + (font-lock-mark-block-function . mark-paragraph))))) + +(when font-latex-is-XEmacs + (put 'latex-mode 'font-lock-defaults + '((font-latex-keywords font-latex-keywords-1 font-latex-keywords-2) + nil nil ((?\( . ".") (?\) . ".") (?$ . "\"")) nil + (font-lock-comment-start-regexp . "%") + (font-lock-mark-block-function . mark-paragraph))) + (put 'latex-tex-mode 'font-lock-defaults 'latex-mode) + (put 'LaTex-tex-mode 'font-lock-defaults 'latex-mode) + (put 'LaTeX-mode 'font-lock-defaults 'latex-mode) + (put 'japanese-LaTeX-mode 'font-lock-defaults 'latex-mode) + (put 'LATeX-MoDe 'font-lock-defaults 'latex-mode) + (put 'lATEx-mODe 'font-lock-defaults 'latex-mode)) + +(defconst font-latex-keywords-1 + (list + ;; FIXME: Maybe I should put this in a function, use override but let + ;; the function determine if commented-out. + (list (concat "\\\\\\(\\(no\\)?pagebreak\\|\\(new\\|clear\\(double\\)?\\)" + "page\\|enlargethispage\\|\\(no\\)?linebreak\\|newline\\|" + "-\\|\\\\\\(\*\\)?\\|displaybreak\\|allowdisplaybreaks\\)") + '(0 font-latex-warning-face)) + '("\\$\\$\\([^$]+\\)\\$\\$" 1 font-latex-math-face) ;;; $$...$$ + '(font-latex-match-quotation . font-latex-string-face) ;;; ``...'' + '(font-latex-match-font-outside-braces ;;;\textit{text} + (0 font-lock-keyword-face + append ;Override? [t 'keep 'prepend 'append] + ;; Can't use prepend because that overwrites syntax fontification + ;; e.g. comments. + t) ;Laxmatch? if t, do not signal error + (1 font-latex-italic-face append t) + (2 font-latex-bold-face append t) + (3 font-lock-type-face append t)) + '(font-latex-match-font-inside-braces ;;;{\it text} + (0 font-lock-keyword-face append t) + (1 font-latex-italic-face append t) + (2 font-latex-bold-face append t) + (3 font-lock-type-face append t))) + "Subdued level highlighting for LaTeX modes.") + +(defconst font-latex-keywords-2 + (append font-latex-keywords-1 + '((font-latex-match-reference ;;;\cite + (0 font-lock-keyword-face append t) + (1 font-lock-variable-name-face append t) ;;; [opt] + (2 font-lock-reference-face append t)) ;;; {key} + (font-latex-match-function ;;;\section + (0 font-lock-keyword-face append t) + (1 font-lock-variable-name-face append t) ;;; [opt] + (2 font-lock-function-name-face append t)) ;;; {text} + (font-latex-match-variable + (0 font-lock-keyword-face nil t) + (1 font-lock-variable-name-face nil t) + (2 font-lock-variable-name-face nil t)) + (font-latex-match-math-env + (0 font-latex-math-face append t)) ;;;\(...\) + (font-latex-match-math-envII ;;;Math environ. + (0 font-latex-math-face append t)) + ("\\\\[@A-Za-z]+" ;;;Other commands + (0 font-latex-sedate-face append)))) + "High level highlighting for LaTeX modes.") + +(defvar font-latex-keywords font-latex-keywords-1 + "Default expressions to highlight in TeX mode.") + + +(defun font-latex-match-reference (limit) + (font-latex-match-command-outside-arguments + (eval-when-compile + (concat "\\\\" "\\(" + (mapconcat 'identity + '("[A-Za-z]*cite[A-Za-z]*" "label" "\\(page\\|v\\|eq\\)?ref" + "index" "glossary" "\\(footnote\\(mark\\|text\\)?\\)") + "\\|") + "\\)\\>")) + limit nil nil)) + +(defun font-latex-match-function (limit) + "Fontify things like \\section{text}" + (font-latex-match-command-outside-arguments + (eval-when-compile + (concat "\\\\" "\\(" + (mapconcat 'identity + ;; \\*? doesn't work with \\> at the end of the regexp. + ;; Instead, allow `*' for all commands (!) + '("item" ;;;FIXME: does not have an {arg} so should treated elsewhere. + "include" "input" "bibliography" + "part" "chapter" "\\(sub\\)*section" "\\(sub\\)*paragraph" + "begin" "end" + "title" "author" "date" "thanks" "address" + "pagenumbering" + "\\(this\\)?pagestyle" + "nofiles" "includeonly" + "bibliographystyle" "\\(document\\(style\\|class\\)\\)" + "\\(re\\)?new\\(environment\\|command\\|length\\|theorem\\|counter\\)" + "usepackage" "caption" "\\(f\\|m\\|s\\)box" "\\(v\\|h\\)space") + "\\|") + "\\)\\>")) + limit nil t)) + +(defun font-latex-match-variable (limit) + "Fontify things like \\newcommand{stuff}" + (font-latex-match-command-outside-arguments + (eval-when-compile + (concat "\\\\" "\\(" + "set\\(length\\|towidth\\|counter\\)\\|" + "addto\\(length\\|counter\\)" + "\\)\\>")) + limit t nil)) + + +;; FIXME: --About font-latex-commented-outp-- +;; Fontification is *slower* for affected functions (in particular +;; font-latex-match-function), so it will be worth it to increase +;; performance in the algorithm. +;; - don't return (store-match-data (list nil nil)) in +;; font-latex-match-command-outside-arguments, instead skip over +;; commented-out parts internally. +;; - Perhaps handling outlined code is excessive and slows down the +;; search too much? +;; - Is save-match-data expensive? The calling function could store +;; the match-data before it calls (font-latex-commented-outp) knowing +;; that is would trash the list. +(defun font-latex-commented-outp () + "Return t is comment character is found between bol and point." + (save-excursion + (let ((limit (point))) + (save-match-data + ;; Handle outlined code + (re-search-backward "^\\|\C-m" (point-min) t) + (if (re-search-forward "^%\\|[^\\]%" limit t) + t + nil))))) + +(defvar font-latex-match-command-cache-state nil + "Cache state of unterminated match to fontify") +(defvar font-latex-match-command-cache-start nil + "Cache start of unterminated match to fontify") +(defvar font-latex-match-command-cache-limit nil + "Cache end of unterminated match to fontify") +(defvar font-latex-match-command-cache-keywords nil + "Cache keywords of unterminated match to fontify") +(make-variable-buffer-local 'font-latex-match-command-cache-state) +(make-variable-buffer-local 'font-latex-match-command-cache-start) +(make-variable-buffer-local 'font-latex-match-command-cache-limit) +(make-variable-buffer-local 'font-latex-match-command-cache-keywords) + +;; FIXME - Note to myself +;; In call to font-latex-match-command-outside-arguments, I could arrange +;; such that keywords which cannot use [options] have this set to nil. +;; LaTeX code woulldn't fontify if options are used illegally in commands, +;; cuing users in that they are doing something wrong. (See RCS V1.11 for +;; useopt option) +;; +;; NOTE - Without an override flag, font-lock does not re-fontify the +;; option `opt' when the `t' is typed-in in "\cite[opt". The first `o' +;; was fontified and now has a face, which font-lock-apply-highlight +;; won't override. The `p' and `t' get a face as they are typed by +;; inheriting from left-stickyness on the `o'. +;; THEREFORE, I cannot rely on font-lock-apply-highlight to continue +;; multi-line incomplete patterns, because the first character of the +;; pattern on the first line has a face. I must use `prepend'. +(defun font-latex-match-command-outside-arguments (keywords limit twoargs + asterix) + "Search for regexp command KEYWORDS[opt]{arg} before LIMIT. +If TWOARG is t, allow two arguments {arg1}{arg2} +If ASTERIX is t, fontify trailing asterix in command. +Sets `match-data' so that: + subexpression 0 is the keyword, + subexpression 1 is the contents of any following [...] forms + subexpression 2 is the contents of any following {...} forms. +Returns nil if none of KEYWORDS is found." + ;; Prior incomplete match? + (if font-latex-match-command-cache-state + (setq font-latex-match-command-cache-state nil) ;Stop now! + (when (and font-latex-match-command-cache-keywords + (equal font-latex-match-command-cache-keywords keywords) + (>= font-latex-match-command-cache-limit (point)) + (< font-latex-match-command-cache-start (point))) + (goto-char font-latex-match-command-cache-start) + (setq font-latex-match-command-cache-state 'stop)) ;Can only do once + (when (re-search-forward keywords limit t) + (let ((this-start (match-beginning 0))) + (cond + ((font-latex-commented-outp) + ;; Return a nul match such that we skip over this pattern. + ;; (Would be better to skip over internally to this function) + (store-match-data (list nil nil)) + t) + (t + (let ((kbeg (match-beginning 0)) + (kend (+ (match-end 0) + (if (and asterix (eq (following-char) ?\*)) 1 0))) + sbeg send cbeg cend) + (goto-char kend) ;May be moved by asterix + (while (eq (following-char) ?\[) + (save-restriction + ;; Restrict to LIMIT. + (narrow-to-region (point-min) limit) + (setq sbeg (1+ kend)) + (if (condition-case nil + (goto-char (or (scan-sexps (point) 1) (point-max))) + (error)) + (setq send (1- (point))) + (setq send (point-max)) + (goto-char send) + (setq font-latex-match-command-cache-state 'stop)))) + (when (eq (following-char) ?\{) + (save-restriction + ;; Restrict to LIMIT. + (narrow-to-region (point-min) limit) + (setq cbeg (1+ (point))) + (if (condition-case nil + (goto-char (or (scan-sexps (point) 1) (point-max))) + (error)) + (setq cend (1- (point))) + (setq cend (point-max)) + (goto-char cend) + (setq font-latex-match-command-cache-state 'stop)))) + (when (and twoargs (eq (following-char) ?\{)) + (save-restriction + ;; Restrict to LIMIT. + (narrow-to-region (point-min) limit) + (if (condition-case nil + (goto-char (or (scan-sexps (point) 1) (point-max))) + (error)) + (setq cend (1- (point))) + (setq cend (point-max)) + (goto-char cend) + (setq font-latex-match-command-cache-state 'stop)))) + (store-match-data (list kbeg kend sbeg send cbeg cend)) + (when font-latex-match-command-cache-state + (setq font-latex-match-command-cache-start this-start) + (setq font-latex-match-command-cache-limit (point)) + (setq font-latex-match-command-cache-keywords keywords)) + t))))))) + +(defvar font-latex-match-font-cache-state nil + "Cache state of unterminated match to fontify") +(defvar font-latex-match-font-cache-start nil + "Cache start of unterminated match to fontify") +(defvar font-latex-match-font-cache-limit nil + "Cache end of unterminated match to fontify") +(defvar font-latex-match-font-cache-keywords nil + "Cache keywords of unterminated match to fontify") +(make-variable-buffer-local 'font-latex-match-font-cache-state) +(make-variable-buffer-local 'font-latex-match-font-cache-start) +(make-variable-buffer-local 'font-latex-match-font-cache-limit) +(make-variable-buffer-local 'font-latex-match-font-cache-keywords) + +(defun font-latex-match-font-outside-braces (limit) + "Search for font-changing command like \textbf{fubar} before LIMIT. +Sets `match-data' so that: + subexpression 0 is the keyword, + subexpression 1 is the content to fontify in italic. + subexpression 2 is the content to fontify in bold. + subexpression 3 is the content to fontify in type-face. +Returns nil if no font-changing command is found." + (if font-latex-match-font-cache-state + (setq font-latex-match-font-cache-state nil) ;Stop now! + (when (and font-latex-match-font-cache-keywords + (equal font-latex-match-font-cache-keywords keywords) + (>= font-latex-match-font-cache-limit (point)) + (< font-latex-match-font-cache-start (point))) + (goto-char font-latex-match-font-cache-start) + (setq font-latex-match-font-cache-state 'stop)) ;Can only do once + (when (re-search-forward + (eval-when-compile + (concat "\\\\" "\\(" + "\\(emph\\)\\|" ;;; 2 - italic + "\\(text\\(" + "\\(it\\|sl\\)\\|" ;;; 5 - italic + "\\(md\\|rm\\|sf\\|tt\\)\\|" ;;; 6 - type + "\\(bf\\|sc\\|up\\)" ;;; 7 - bold + "\\)\\)\\|" + "\\(boldsymbol\\|pmb\\)" ;;; 8 - bold + "\\)" "{")) + limit t) + (cond + ((font-latex-commented-outp) + ;; Return a nul match such that we skip over this pattern. + ;; (Would be better to skip over internally to this function) + ;; Using `prepend' won't help here, because the problem is that + ;; scan-sexp *fails* to find a commented-out matching bracket! + (store-match-data (list nil nil)) + t) + (t + (let ((kbeg (match-beginning 0)) (kend (match-end 1)) + (beg (match-end 0)) end itbeg itend bfbeg bfend ttbeg ttend) + (goto-char kend) + (save-restriction + ;; Restrict to LIMIT. + (narrow-to-region (point-min) limit) + (if (condition-case nil + (goto-char (or (scan-sexps (point) 1) (point-max))) + (error)) + (setq end (1- (point))) + (setq end (point-max)) + (goto-char end) + (setq font-latex-match-font-cache-state 'stop))) + (cond ((or (match-beginning 2) (match-beginning 5)) + (setq itbeg beg + itend end)) + ((match-beginning 6) + (setq ttbeg beg + ttend end)) + (t + (setq bfbeg beg + bfend end))) + (store-match-data + (list kbeg kend itbeg itend bfbeg bfend ttbeg ttend)) + (when font-latex-match-font-cache-state + (setq font-latex-match-font-cache-start kbeg) + (setq font-latex-match-font-cache-limit (point)) + (setq font-latex-match-font-cache-keywords keywords)) + ;; Start the subsequent search immediately after this keyword. + (goto-char kend) + t)))))) + +(defvar font-latex-match-infont-cache-state nil + "Cache state of unterminated match to fontify") +(defvar font-latex-match-infont-cache-start nil + "Cache start of unterminated match to fontify") +(defvar font-latex-match-infont-cache-limit nil + "Cache end of unterminated match to fontify") +(defvar font-latex-match-infont-cache-keywords nil + "Cache keywords of unterminated match to fontify") +(make-variable-buffer-local 'font-latex-match-infont-cache-state) +(make-variable-buffer-local 'font-latex-match-infont-cache-start) +(make-variable-buffer-local 'font-latex-match-infont-cache-limit) +(make-variable-buffer-local 'font-latex-match-infont-cache-keywords) + +(defun font-latex-match-font-inside-braces (limit) + "Search for font-changing command like {\bf fubar} before LIMIT. +Sets `match-data' so that: + subexpression 0 is the keyword. + subexpression 1 is the content to fontify in italic. + subexpression 2 is the content to fontify in bold. + subexpression 3 is the content to fontify in type-face. +Returns nil if no font-changing command is found." + (if font-latex-match-infont-cache-state + (setq font-latex-match-infont-cache-state nil) ;Stop now! + (when (and font-latex-match-infont-cache-keywords + (equal font-latex-match-infont-cache-keywords keywords) + (>= font-latex-match-infont-cache-limit (point)) + (< font-latex-match-infont-cache-start (point))) + (goto-char font-latex-match-infont-cache-start) + (setq font-latex-match-infont-cache-state 'stop)) ;Can only do once + (when (re-search-forward + (eval-when-compile + (concat "\\\\" "\\(" + ;;; 2 - italic + "\\(em\\|it\\(shape\\)?\\|sl\\(shape\\)?\\)\\|" + ;;; 5 - bold + "\\(bf\\(series\\)?\\|upshape\\|sc\\(shape\\)?\\)\\|" + "mdseries\\|tt\\(family\\)?\\|" + "sf\\(family\\)?\\|rm\\(family\\)?\\|" + "tiny\\|scriptsize\\|footnotesize\\|" + "small\\|normalsize\\|large\\|Large\\|LARGE\\|huge\\|Huge" + "\\)\\>[ \t]*")) + limit t) + (cond + ((font-latex-commented-outp) + ;; Return a nul match such that we skip over this pattern. + ;; (Would be better to skip over internally to this function) + ;; Using `prepend' won't help here, because the problem is that + ;; scan-sexp *fails* to find a commented-out matching bracket! + (store-match-data (list nil nil)) + t) + (t + (let ((kbeg (match-beginning 0)) (kend (match-end 1)) + (beg (match-end 0)) end itbeg itend bfbeg bfend ttbeg ttend) + (goto-char (match-beginning 0)) + (cond + ((not (eq (preceding-char) ?\{)) + ;; Fontify only the keyword as bf/it/type (no argument found). + (cond ((match-beginning 2) (setq itbeg kbeg itend kend)) + ((match-beginning 5) (setq bfbeg kbeg bfend kend)) + (t (setq ttbeg kbeg ttend kend))) + (goto-char (match-end 0)) + (store-match-data + (list nil nil itbeg itend bfbeg bfend ttbeg ttend)) + t) + (t + (condition-case nil + (forward-char -1) + (error)) + (save-restriction + ;; Restrict to LIMIT. + (narrow-to-region (point-min) limit) + (if (condition-case nil + (goto-char (or (scan-sexps (point) 1) (point-max))) + (error)) + (setq end (1- (point))) + (setq end (point-max)) + (goto-char end) + (setq font-latex-match-infont-cache-state 'stop))) + (cond ((match-beginning 2) (setq itbeg beg itend end)) + ((match-beginning 5) (setq bfbeg beg bfend end)) + (t (setq ttbeg beg ttend end))) + (store-match-data + (list kbeg kend itbeg itend bfbeg bfend ttbeg ttend)) + (when font-latex-match-infont-cache-state + (setq font-latex-match-infont-cache-start kbeg) + (setq font-latex-match-infont-cache-limit (point)) + (setq font-latex-match-infont-cache-keywords keywords)) + ;; Start the subsequent search immediately after this keyword. + (goto-char kend))))))))) + +;;; FIXME: Add caches for math-env, math-envII and quotations. +(defun font-latex-match-math-env (limit) + "Used for patterns like: +\\( F = ma \\) +\\ [ F = ma \\] but not \\\\ [len]" + (when (re-search-forward "\\(\\\\(\\)\\|\\(\\\\\\[\\)" limit t) + (goto-char (match-beginning 0)) + (if (eq (preceding-char) ?\\) ; \\[ is not a math environment + (progn + (goto-char (match-end 0)) + (store-match-data (list nil nil)) + t) + (let ((b1start (point))) + (search-forward (cond ((match-beginning 1) "\\)") + (t "\\]")) + limit 'move) + (let ((b2end (or (match-end 0) (point)))) + (store-match-data (list b1start b2end)) + t))))) + +(defun font-latex-match-math-envII (limit) + "Used for patterns like: +\\begin{equation} + fontified stuff +\\end{equation} +The \\begin{equation} and \\end{equation are not fontified here." + (when (re-search-forward + (eval-when-compile + (concat "\\\\begin{\\(\\(display\\)?math\\|equation\\|eqnarray" + "\\|gather\\|multline\\|align\\|x*alignat" + "\\)\\*?}")) + limit t) + (let ((beg (match-end 0)) end) + (if (search-forward (concat "\\end{" (buffer-substring + (match-beginning 1)(match-end 0))) + limit 'move) + (setq end (match-beginning 0)) + (setq end (point))) + (store-match-data (list beg end)) + t))) + +(defun font-latex-match-quotation (limit) + "Used for patterns like: +``this is a normal quote'' and these are multilingual quoted strings: +\"< french \"> and \"`german\"' quotes, << french >> and 8-bit french." + (when (re-search-forward + (eval-when-compile + (concat "\\(``\\)\\|\\(\"<\\)\\|\\(\"`\\)\\|\\(<<\\)\\|" + "\\(" (char-to-string 171) "\\)")) ; An 8-bit "<<" + limit t) + (let ((beg (match-beginning 0))) + (search-forward + (cond ((match-beginning 1) "''") + ((match-beginning 2) "\">") + ((match-beginning 3) "\"'") + ((match-beginning 4) ">>") + ((match-beginning 5) (eval-when-compile (char-to-string 187)))) + limit 'move) + (store-match-data (list beg (point))) + t))) + +;; Install ourselves + +(add-hook 'LaTeX-mode-hook 'font-latex-setup) +(add-hook 'latex-mode-hook 'font-latex-setup) +;; If font-latex is loaded using a latex-mode-hook, then the add-hook above +;; won't be called this time around. Check for this now: +(if (eq major-mode 'latex-mode) + (font-latex-setup)) + +;; Provide ourselves: + +(provide 'font-latex) + +;;; font-latex.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/latex.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,3075 @@ +;;; latex.el --- Support for LaTeX documents. +;; +;; Maintainer: Per Abrahamsen <auc-tex@sunsite.auc.dk> +;; Version: 9.7i +;; Keywords: wp +;; X-URL: http://sunsite.auc.dk/auctex + +;; Copyright 1991 Kresten Krab Thorup +;; Copyright 1993, 1994, 1995, 1996, 1997 Per Abrahamsen +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 1, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Code: + +(require 'tex) + +;;; Syntax + +(defvar LaTeX-optop "[" + "The LaTeX optional argument opening character.") +(make-variable-buffer-local 'LaTeX-optop) + +(defvar LaTeX-optcl "]" + "The LaTeX optional argument closeing character.") +(make-variable-buffer-local 'LaTeX-optcl) + +;;; Style + +(defvar LaTeX-default-style "article" + "*Default when creating new documents.") + + (make-variable-buffer-local 'LaTeX-default-style) + +(defvar LaTeX-default-options nil + "*Default options to documentstyle. +A list of strings.") + + (make-variable-buffer-local 'LaTeX-default-options) + +;;; Syntax Table + +(defvar LaTeX-mode-syntax-table (copy-syntax-table TeX-mode-syntax-table) + "Syntax table used in LaTeX mode.") + +(progn ; set [] to match for LaTeX. + (modify-syntax-entry (string-to-char LaTeX-optop) + (concat "(" LaTeX-optcl) + LaTeX-mode-syntax-table) + (modify-syntax-entry (string-to-char LaTeX-optcl) + (concat ")" LaTeX-optop) + LaTeX-mode-syntax-table)) + +;;; Sections + +(defun LaTeX-section (arg) + "Insert a template for a LaTeX section. +Determinate the type of section to be inserted, by the argument ARG. + +If ARG is nil or missing, use the current level. +If ARG is a list (selected by C-u), go downward one level. +If ARG is negative, go up that many levels. +If ARG is positive or zero, use absolute level: + + 0 : part + 1 : chapter + 2 : section + 3 : subsection + 4 : subsubsection + 5 : paragraph + 6 : subparagraph + +The following variables can be set to customize: + +LaTeX-section-hook Hooks to run when inserting a section. +LaTeX-section-label Prefix to all section labels." + + (interactive "*P") + (let* ((val (prefix-numeric-value arg)) + (level (cond ((null arg) + (LaTeX-current-section)) + ((listp arg) + (LaTeX-down-section)) + ((< val 0) + (LaTeX-up-section (- val))) + (t val))) + (name (LaTeX-section-name level)) + (toc nil) + (title "") + (done-mark (make-marker))) + (newline) + (run-hooks 'LaTeX-section-hook) + (newline) + (if (marker-position done-mark) + (goto-char (marker-position done-mark))) + (set-marker done-mark nil))) + +(defun LaTeX-current-section () + "Return the level of the section that contain point. +See also LaTeX-section for description of levels." + (save-excursion + (max (LaTeX-largest-level) + (if (re-search-backward (LaTeX-outline-regexp) nil t) + (- (LaTeX-outline-level) (LaTeX-outline-offset)) + (LaTeX-largest-level))))) + +(defun LaTeX-down-section () + "Return the value of a section one level under the current. Tries to +find what kind of section that have been used earlier in the text, If +this fail, it will just return one less than the current section." + (save-excursion + (let ((current (LaTeX-current-section)) + (next nil) + (regexp (LaTeX-outline-regexp))) + (if (not (re-search-backward regexp nil t)) + (1+ current) + (while (not next) + (cond + ((eq (LaTeX-current-section) current) + (if (re-search-forward regexp nil t) + (if (<= (setq next (LaTeX-current-section)) current) ;Wow! + (setq next (1+ current))) + (setq next (1+ current)))) + ((not (re-search-backward regexp nil t)) + (setq next (1+ current))))) + next)))) + +(defun LaTeX-up-section (arg) + "Return the value of the section ARG levels above this one." + (save-excursion + (if (zerop arg) + (LaTeX-current-section) + (let ((current (LaTeX-current-section))) + (while (and (>= (LaTeX-current-section) current) + (re-search-backward (LaTeX-outline-regexp) + nil t))) + (LaTeX-up-section (1- arg)))))) + +(defvar LaTeX-section-list '(("part" 0) + ("chapter" 1) + ("section" 2) + ("subsection" 3) + ("subsubsection" 4) + ("paragraph" 5) + ("subparagraph" 6)) + "List which elements is the names of the sections used by LaTeX.") + +(defun LaTeX-section-name (level) + "Return the name of the section corresponding to LEVEL." + (let ((entry (TeX-member level LaTeX-section-list + (function (lambda (a b) (equal a (nth 1 b))))))) + (if entry + (nth 0 entry) + nil))) + +(defun LaTeX-section-level (name) + "Return the level of the section NAME." + (let ((entry (TeX-member name LaTeX-section-list + (function (lambda (a b) (equal a (nth 0 b))))))) + + (if entry + (nth 1 entry) + nil))) + +(defvar TeX-outline-extra nil + "*List of extra TeX outline levels. + +Each element is a list with two entries. The first entry is the +regular expression matching a header, and the second is the level of +the header. See LaTeX-section-list for existing header levels.") + +(defun LaTeX-outline-regexp (&optional anywhere) + "Return regexp for LaTeX sections. + +If optional argument ANYWHERE is not nil, do not require that the +header is at the start of a line." + (concat (if anywhere "" "^") + "[ \t]*" + (regexp-quote TeX-esc) + "\\(appendix\\|documentstyle\\|documentclass\\|" + (mapconcat 'car LaTeX-section-list "\\|") + "\\)\\b" + (if TeX-outline-extra + "\\|" + "") + (mapconcat 'car TeX-outline-extra "\\|") + "\\|" TeX-header-end + "\\|" TeX-trailer-start)) + +(defvar LaTeX-largest-level nil + "Largest sectioning level with current document style") + +(make-variable-buffer-local 'LaTeX-largest-level) + +(defun LaTeX-largest-level () + (TeX-update-style) + LaTeX-largest-level) + +(defun LaTeX-outline-offset () + "Offset to add to LaTeX-section-list levels to get outline level." + (- 2 (LaTeX-largest-level))) + +(defun TeX-look-at (list) + "Check if we are looking at the first element of a member of LIST. +If so, return the second element, otherwise return nil." + (while (and list + (not (looking-at (nth 0 (car list))))) + (setq list (cdr list))) + (if list + (nth 1 (car list)) + nil)) + +(defun LaTeX-outline-level () + "Find the level of current outline heading in an LaTeX document." + (cond ((looking-at LaTeX-header-end) 1) + ((looking-at LaTeX-trailer-start) 1) + ((TeX-look-at TeX-outline-extra) + (max 1 (+ (TeX-look-at TeX-outline-extra) + (LaTeX-outline-offset)))) + (t + (save-excursion + (skip-chars-forward " \t") + (forward-char 1) + (cond ((looking-at "appendix") 1) + ((looking-at "documentstyle") 1) + ((looking-at "documentclass") 1) + ((TeX-look-at LaTeX-section-list) + (max 1 (+ (TeX-look-at LaTeX-section-list) + (LaTeX-outline-offset)))) + (t + (error "Unrecognized header"))))))) + +(add-hook 'TeX-remove-style-hook + (function (lambda () (setq LaTeX-largest-level nil)))) + +(defvar LaTeX-section-hook + '(LaTeX-section-heading + LaTeX-section-title +;; LaTeX-section-toc ; Most people won't want this + LaTeX-section-section + LaTeX-section-label) + "*List of hooks to run when a new section is inserted. + +The following variables are set before the hooks are run + +level - numeric section level, see the documentation of `LaTeX-section'. +name - name of the sectioning command, derived from `level'. +title - The title of the section, default to an empty string. +toc - Entry for the table of contents list, default nil. +done-mark - Position of point afterwards, default nil (meaning end). + +The following standard hook exist - + +LaTeX-section-heading: Query the user about the name of the +sectioning command. Modifies `level' and `name'. + +LaTeX-section-title: Query the user about the title of the +section. Modifies `title'. + +LaTeX-section-toc: Query the user for the toc entry. Modifies +`toc'. + +LaTeX-section-section: Insert LaTeX section command according to +`name', `title', and `toc'. If `toc' is nil, no toc entry is +enserted. If `toc' or `title' are empty strings, `done-mark' will be +placed at the point they should be inserted. + +LaTeX-section-label: Insert a label after the section command. +Controled by the variable `LaTeX-section-label'. + +To get a full featured LaTeX-section command, insert + + (setq LaTeX-section-hook + '(LaTeX-section-heading + LaTeX-section-title + LaTeX-section-toc + LaTeX-section-section + LaTeX-section-label)) + +in your .emacs file.") + +(defvar LaTeX-section-label + '(("chapter" . "cha:") + ("section" . "sec:") + ("subsection" . "sec:")) + "*Default prefix when asking for a label. + +If it is a string, it it used unchanged for all kinds of sections. +If it is nil, no label is inserted. +If it is a list, the list is searched for a member whose car is equal +to the name of the sectioning command being inserted. The cdr is then +used as the prefix. If the name is not found, or if the cdr is nil, +no label is inserted.") + +;;; Section Hooks. + +(defun LaTeX-section-heading () + "Hook to prompt for LaTeX section name. +Insert this hook into LaTeX-section-hook to allow the user to change +the name of the sectioning command inserted with M-x LaTeX-section." + (let ((string (completing-read + (concat "Select level: (default " name ") ") + LaTeX-section-list + nil nil nil))) + ; Update name + (if (not (zerop (length string))) + (setq name string)) + ; Update level + (setq level (LaTeX-section-level name)))) + +(defun LaTeX-section-title () + "Hook to prompt for LaTeX section title. +Insert this hook into LaTeX-section-hook to allow the user to change +the title of the section inserted with M-x LaTeX-section." + (setq title (read-string "What title: "))) + +(defun LaTeX-section-toc () + "Hook to prompt for the LaTeX section entry in the table of content . +Insert this hook into LaTeX-section-hook to allow the user to insert +a different entry for the section in the table of content." + (setq toc (read-string "Toc Entry: ")) + (if (zerop (length toc)) + (setq toc nil))) + +(defun LaTeX-section-section () + "Hook to insert LaTeX section command into the file. +Insert this hook into LaTeX-section-hook after those hooks which sets +the `name', `title', and `toc' variables, but before those hooks which +assumes the section already is inserted." + (insert TeX-esc name) + (cond ((null toc)) + ((zerop (length toc)) + (insert LaTeX-optop) + (set-marker done-mark (point)) + (insert LaTeX-optcl)) + (t + (insert LaTeX-optop toc LaTeX-optcl))) + (insert TeX-grop) + (if (zerop (length title)) + (set-marker done-mark (point))) + (insert title TeX-grcl) + (newline)) + +(defun LaTeX-section-label () + "Hook to insert a label after the sectioning command. +Insert this hook into LaTeX-section-hook to prompt for a label to be +inserted after the sectioning command. + +The beaviour of this hook is controled by LaTeX-section-label." + (and (LaTeX-label name) + (newline))) + +;;; Environments + +(defvar LaTeX-default-environment "itemize" + "*The default environment when creating new ones with LaTeX-environment.") + (make-variable-buffer-local 'LaTeX-default-environment) + +(defun LaTeX-environment (arg) + "Make LaTeX environment (\\begin{...}-\\end{...} pair). +With optional ARG, modify current environment. + +It may be customized with the following variables: + +LaTeX-default-environment Your favorite environment. +LaTeX-default-style Your favorite document style. +LaTeX-default-options Your favorite document style options. +LaTeX-float Where you want figures and tables to float. +LaTeX-table-label Your prefix to labels in tables. +LaTeX-figure-label Your prefix to labels in figures. +LaTeX-default-format Format for array and tabular. +LaTeX-default-position Position for array and tabular." + + (interactive "*P") + (let ((environment (completing-read (concat "Environment type: (default " + (if (TeX-near-bobp) + "document" + LaTeX-default-environment) + ") ") + (LaTeX-environment-list)))) + ;; Get default + (cond ((and (zerop (length environment)) + (TeX-near-bobp)) + (setq environment "document")) + ((zerop (length environment)) + (setq environment LaTeX-default-environment)) + (t + (setq LaTeX-default-environment environment))) + + (let ((entry (assoc environment (LaTeX-environment-list)))) + (if (null entry) + (LaTeX-add-environments (list environment))) + + (if arg + (LaTeX-modify-environment environment) + (LaTeX-environment-menu environment))))) + +(defun LaTeX-environment-menu (environment) + ;; Insert ENVIRONMENT around point or region. + (let ((entry (assoc environment (LaTeX-environment-list)))) + (cond ((not (and entry (nth 1 entry))) + (LaTeX-insert-environment environment)) + ((numberp (nth 1 entry)) + (let ((count (nth 1 entry)) + (args "")) + (while (> count 0) + (setq args (concat args TeX-grop TeX-grcl)) + (setq count (- count 1))) + (LaTeX-insert-environment environment args))) + ((stringp (nth 1 entry)) + (let ((prompts (cdr entry)) + (args "")) + (while prompts + (setq args (concat args + TeX-grop + (read-from-minibuffer (concat (car prompts) + ": ")) + TeX-grcl)) + (setq prompts (cdr prompts))) + (LaTeX-insert-environment environment args))) + (t + (apply (nth 1 entry) environment (nthcdr 2 entry)))))) + +(defun LaTeX-close-environment () + "Creates an \\end{...} to match the current environment." + (interactive "*") + (if (> (point) + (save-excursion + (beginning-of-line) + (skip-chars-forward " \t") + (point))) + (insert "\n")) + (insert "\\end{" (LaTeX-current-environment 1) "}") + (LaTeX-indent-line) + (if (not (looking-at "[ \t]*$")) + (insert "\n") + (let ((next-line-add-newlines t)) + (next-line 1) + (beginning-of-line))) + (LaTeX-indent-line)) + +(autoload 'outline-flag-region "outline") + +(defun LaTeX-hide-environment () + "Hide current LaTeX environment using selective display." + (interactive) + (outline-flag-region (save-excursion (LaTeX-find-matching-begin) (point)) + (save-excursion (LaTeX-find-matching-end) (point)) + ?\r)) + +(defun LaTeX-show-environment () + "Show current LaTeX environment." + (interactive) + (outline-flag-region (save-excursion (LaTeX-find-matching-begin) (point)) + (save-excursion (LaTeX-find-matching-end) (point)) + ?\n)) + +(defun LaTeX-insert-environment (environment &optional extra) + "Insert environment of type ENV, with optional argument EXTRA." + (if (and (TeX-active-mark) + (not (eq (mark) (point)))) + (progn + (if (< (mark) (point)) + (exchange-point-and-mark)) + (or (TeX-looking-at-backward "^[ \t]*") + (newline)) + (insert TeX-esc "begin" TeX-grop environment TeX-grcl) + (LaTeX-indent-line) + (if extra (insert extra)) + (newline) + (goto-char (mark)) + (or (TeX-looking-at-backward "^[ \t]*") + (newline)) + (insert TeX-esc "end" TeX-grop environment TeX-grcl) + (or (looking-at "[ \t]*$") + (save-excursion (newline-and-indent))) + (LaTeX-indent-line) + (end-of-line 0) + (or (assoc environment LaTeX-indent-environment-list) + (LaTeX-fill-environment nil))) + (or (TeX-looking-at-backward "^[ \t]*") + (newline)) + (insert TeX-esc "begin" TeX-grop environment TeX-grcl) + (LaTeX-indent-line) + (if extra (insert extra)) + (newline-and-indent) + (newline) + (insert TeX-esc "end" TeX-grop environment TeX-grcl) + (or (looking-at "[ \t]*$") + (save-excursion (newline-and-indent))) + (LaTeX-indent-line) + (end-of-line 0))) + +(defun LaTeX-modify-environment (environment) + ;; Modify current environment. + (save-excursion + (LaTeX-find-matching-end) + (re-search-backward (concat (regexp-quote TeX-esc) + "end" + (regexp-quote TeX-grop) + " *\\([a-zA-Z*]*\\)" + (regexp-quote TeX-grcl)) + (save-excursion (beginning-of-line 1) (point))) + (replace-match (concat TeX-esc "end" TeX-grop environment TeX-grcl) t t) + (beginning-of-line 1) + (LaTeX-find-matching-begin) + (re-search-forward (concat (regexp-quote TeX-esc) + "begin" + (regexp-quote TeX-grop) + " *\\([a-zA-Z*]*\\)" + (regexp-quote TeX-grcl)) + (save-excursion (end-of-line 1) (point))) + (replace-match (concat TeX-esc "begin" TeX-grop environment TeX-grcl) t t))) + +(defun LaTeX-current-environment (&optional arg) + "Return the name (a string) of the enclosing LaTeX environment. +With optional ARG>=1, find that outer level." + (setq arg (if arg (if (< arg 1) 1 arg) 1)) + (save-excursion + (while (and + (/= arg 0) + (re-search-backward + (concat (regexp-quote TeX-esc) "begin" (regexp-quote TeX-grop) + "\\|" + (regexp-quote TeX-esc) "end" (regexp-quote TeX-grop)) + nil t 1)) + (cond ((TeX-in-comment) + (beginning-of-line 1)) + ((looking-at (concat (regexp-quote TeX-esc) + "end" (regexp-quote TeX-grop))) + (setq arg (1+ arg))) + (t + (setq arg (1- arg))))) + (if (/= arg 0) + "document" + (search-forward TeX-grop) + (let ((beg (point))) + (search-forward TeX-grcl) + (backward-char 1) + (buffer-substring beg (point)))))) + +(defun TeX-near-bobp () + ;; Return t iff there's nothing but whitespace between (bob) and (point). + (save-excursion + (skip-chars-backward " \t\n") + (bobp))) + +;;; Environment Hooks + +(defvar LaTeX-document-style-hook nil + "List of hooks to run when inserting a document style environment. + +To insert a hook here, you must insert it in the appropiate style file.") + +(defun LaTeX-env-document (&optional ignore) + "Create new LaTeX document." + + (TeX-insert-macro (if (string-equal LaTeX-version "2") + "documentstyle" + "documentclass")) + + (newline 3) + (end-of-line 0) + (LaTeX-insert-environment "document") + (run-hooks 'LaTeX-document-style-hook) + (setq LaTeX-document-style-hook nil)) + +(defvar LaTeX-float "htbp" + "*Default float when creating figure and table environments. +Set to nil if you don't want any float.") + (make-variable-buffer-local 'LaTeX-float) + +(defvar LaTeX-label-function nil + "*A function inserting a label at point. +Sole argument of the function is the environment. The function has to return +the label inserted, or nil if no label was inserted.") + +(defvar LaTeX-figure-label "fig:" + "*Default prefix to figure labels.") + (make-variable-buffer-local 'LaTeX-figure-label) + +(defvar LaTeX-table-label "tab:" + "*Default prefix to table labels.") + (make-variable-buffer-local 'LaTeX-table-label) + +(defvar LaTeX-default-format "" + "Specifies the default format string for array and tabular environments.") + (make-variable-buffer-local 'LaTeX-default-format) + +(defvar LaTeX-default-position "" + "Specifies the default position string for array and tabular environments.") + (make-variable-buffer-local 'LaTeX-default-position) + +(defun LaTeX-env-item (environment) + "Insert ENVIRONMENT and the first item." + (LaTeX-insert-environment environment) + (if (TeX-active-mark) + (progn + (LaTeX-find-matching-begin) + (end-of-line 1)) + (end-of-line 0)) + (delete-char 1) + (delete-horizontal-space) + (LaTeX-insert-item)) + +(defun LaTeX-label (environment) + "Insert a label for ENVIRONMENT at point. +If LaTeX-label-function is a valid function, LaTeX label will transfer the +job to this function." + (let (label) + (if (and (boundp 'LaTeX-label-function) + LaTeX-label-function + (fboundp LaTeX-label-function)) + + (setq label (funcall LaTeX-label-function environment)) + (let ((prefix + (cond + ((string= "figure" environment) LaTeX-figure-label) + ((string= "table" environment) LaTeX-table-label) + ((assoc environment LaTeX-section-list) + (cond + ((stringp LaTeX-section-label) LaTeX-section-label) + ((and (listp LaTeX-section-label) + (assoc environment LaTeX-section-label)) + (cdr (assoc environment LaTeX-section-label))) + (t nil))) + (t "")))) + (if prefix + (progn + (setq label (read-string "What label: " prefix)) + (if (string= prefix label) + (setq label nil) ; No label eneterd + (insert TeX-esc "label" TeX-grop label TeX-grcl))))) + (if label + (progn + (LaTeX-add-labels label) + label) + nil)))) + + +(defun LaTeX-env-figure (environment) + "Create ENVIRONMENT with \\label and \\caption commands." + (let ((float (read-string "Float to: " LaTeX-float)) + (caption (read-string "Caption: ")) + (center (y-or-n-p "Center: "))) + + (setq LaTeX-float (if (zerop (length float)) + LaTeX-float + float)) + + (LaTeX-insert-environment environment + (and LaTeX-float + (concat LaTeX-optop + LaTeX-float + LaTeX-optcl))) + + (if center + (progn + (LaTeX-insert-environment "center"))) + + (newline-and-indent) + (LaTeX-label environment) + (end-of-line 0) + (LaTeX-indent-line) + + (if (zerop (length caption)) + () + ;; NOTE: Caption is _inside_ center because that looks best typeset. + (newline-and-indent) + (insert TeX-esc "caption" TeX-grop caption TeX-grcl) + (end-of-line 0) + (LaTeX-indent-line)) + + (if (string= environment "table") (LaTeX-env-array "tabular")))) + +(defun LaTeX-env-array (environment) + "Insert ENVIRONMENT with position and column specifications +like array and tabular." + (let ((pos (read-string "Position: ")) + (fmt (read-string "Format: " LaTeX-default-format))) + (setq LaTeX-default-position pos) + (setq LaTeX-default-format fmt) + (LaTeX-insert-environment environment + (concat + (if (not (zerop (length pos))) + (format "[%s]" pos)) + (format "{%s}" fmt))) + (end-of-line 0) + (next-line 1) + (delete-horizontal-space))) + +(defun LaTeX-env-label (environment) + "Insert ENVIRONMENT and prompt for label." + (LaTeX-insert-environment environment) + (and (LaTeX-label environment) + (newline-and-indent))) + +(defun LaTeX-env-list (environment) + "Insert ENVIRONMENT and the first item." + (let ((label (read-string "Default Label: "))) + (LaTeX-insert-environment environment + (format "{%s}{}" label)) + (end-of-line 0) + (delete-char 1) + (delete-horizontal-space)) + (LaTeX-insert-item)) + +(defun LaTeX-env-minipage (environment) + "Create new LaTeX minipage." + (let ((pos (read-string "Position: " LaTeX-default-position)) + (width (read-string "Width: "))) + (setq LaTeX-default-position pos) + (if (zerop (length width)) + (setq width "4cm")) + (LaTeX-insert-environment environment + (concat (if (not (zerop (length pos))) + (format "[%s]" pos)) + (format "{%s}" width))) + (end-of-line 0) + (next-line 1) + (delete-horizontal-space))) + +(defun LaTeX-env-tabular* (environment) + "Insert ENVIRONMENT with width, position and column specifications." + (let ((width (read-string "Width: ")) + (pos (read-string "Position: " LaTeX-default-position)) + (fmt (read-string "Format: " LaTeX-default-format))) + (setq LaTeX-default-position pos) + (setq LaTeX-default-format fmt) + (LaTeX-insert-environment environment + (concat + (if (not (zerop (length width))) + (format "{%s}" width)) + (if (not (zerop (length pos))) + (format "[%s]" pos)) + (format "{%s}" fmt))) + (end-of-line 0) + (next-line 1) + (delete-horizontal-space))) + +(defun LaTeX-env-picture (environment) + "Insert ENVIRONMENT with width, height specifications." + (let ((width (read-string "Width: ")) + (height (read-string "Height: ")) + (x-offset (read-string "X Offset: ")) + (y-offset (read-string "Y Offset: "))) + (if (zerop (length x-offset)) + (setq x-offset "0")) + (if (zerop (length y-offset)) + (setq y-offset "0")) + (LaTeX-insert-environment environment + (concat (format "(%s,%s)" width height) + (if (not (and (string= x-offset "0") + (string= y-offset "0"))) + (format "(%s,%s)" x-offset y-offset)))) + + (end-of-line 0) + (next-line 1) + (delete-horizontal-space))) + +(defun LaTeX-env-bib (environment) + "Insert ENVIRONMENT with label for bibitem." + (LaTeX-insert-environment environment + (concat TeX-grop + (read-string "Label for BibItem: " "99") + TeX-grcl)) + (end-of-line 0) + (delete-char 1) + (delete-horizontal-space) + (LaTeX-insert-item)) + +;;; Item hooks + +(defvar LaTeX-item-list nil + "An list of environments where items have a special syntax. +The cdr is the name of the function, used to insert this kind of items.") + +(defun LaTeX-insert-item () + "Insert a new item in an environment. +You may use LaTeX-item-list to change the routines used to insert the item." + (interactive "*") + (let ((environment (LaTeX-current-environment))) + (newline) + (if (assoc environment LaTeX-item-list) + (funcall (cdr (assoc environment LaTeX-item-list))) + (TeX-insert-macro "item")) + (LaTeX-indent-line))) + +(defun LaTeX-item-argument () + "Insert a new item with an optional argument." + (let ((TeX-arg-item-label-p t)) + (TeX-insert-macro "item"))) + +(defun LaTeX-item-bib () + "Insert a new bibitem." + (TeX-insert-macro "bibitem")) + +;;; Parser + +(defvar LaTeX-auto-minimal-regexp-list + '(("\\\\document\\(style\\|class\\)\ +\\(\\[\\(\\([^#\\\\\\.%]\\|%[^\n\r]*[\n\r]\\)+\\)\\]\\)?\ +{\\([^#\\\\\\.\n\r]+\\)}" + (3 5 1) LaTeX-auto-style)) + "Minimal list of regular expressions matching LaTeX macro definitions.") + +(defvar LaTeX-auto-label-regexp-list + '(("\\\\label{\\([^\n\r%\\{}]+\\)}" 1 LaTeX-auto-label)) + "List of regular expression matching LaTeX labels only.") + +(defvar LaTeX-auto-regexp-list + (append + '(("\\\\newcommand{?\\\\\\([a-zA-Z]+\\)}?\\[\\([0-9]+\\)\\]\ +\\[\\([^\]\\\\\n\r]+\\)\\]" + (1 2 3) LaTeX-auto-optional) + ("\\\\newcommand{?\\\\\\([a-zA-Z]+\\)}?\\[\\([0-9]+\\)\\]" + (1 2) LaTeX-auto-arguments) + ("\\\\newcommand{?\\\\\\([a-zA-Z]+\\)}?" 1 TeX-auto-symbol) + ("\\\\newenvironment{?\\([a-zA-Z]+\\)}?\\[\\([0-9]+\\)\\]\\[" + 1 LaTeX-auto-environment) + ("\\\\newenvironment{?\\([a-zA-Z]+\\)}?\\[\\([0-9]+\\)\\]" + (1 2) LaTeX-auto-env-args) + ("\\\\newenvironment{?\\([a-zA-Z]+\\)}?" 1 LaTeX-auto-environment) + ("\\\\newtheorem{\\([a-zA-Z]+\\)}" 1 LaTeX-auto-environment) + ("\\\\input{\\(\\.*[^#}%\\\\\\.\n\r]+\\)\\(\\.[^#}%\\\\\\.\n\r]+\\)?}" + 1 TeX-auto-file) + ("\\\\include{\\(\\.*[^#}%\\\\\\.\n\r]+\\)\\(\\.[^#}%\\\\\\.\n\r]+\\)?}" + 1 TeX-auto-file) + ("\\\\usepackage\\(\\[[^\]\\\\]*\\]\\)?\ +{\\(\\([^#}\\\\\\.%]\\|%[^\n\r]*[\n\r]\\)+\\)}" + (2) LaTeX-auto-style) + ("\\\\bibitem{\\([a-zA-Z][^, \n\r\t%\"#'()={}]*\\)}" 1 LaTeX-auto-bibitem) + ("\\\\bibitem\\[[^][\n\r]+\\]{\\([a-zA-Z][^, \n\r\t%\"#'()={}]*\\)}" + 1 LaTeX-auto-bibitem) + ("\\\\bibliography{\\([^#}\\\\\n\r]+\\)}" 1 LaTeX-auto-bibliography)) + LaTeX-auto-label-regexp-list + LaTeX-auto-minimal-regexp-list) + "List of regular expression matching common LaTeX macro definitions.") + +(defun LaTeX-auto-prepare () + ;; Prepare for LaTeX parsing. + (setq LaTeX-auto-arguments nil + LaTeX-auto-optional nil + LaTeX-auto-env-args nil + LaTeX-auto-style nil + LaTeX-auto-end-symbol nil)) + +(add-hook 'TeX-auto-prepare-hook 'LaTeX-auto-prepare) + +(defun LaTeX-auto-cleanup () + ;; Cleanup after LaTeX parsing. + + ;; Cleanup BibTeX files + (setq LaTeX-auto-bibliography + (apply 'append (mapcar (function (lambda (arg) + (TeX-split-string "," arg))) + LaTeX-auto-bibliography))) + + ;; Cleanup document styles and packages + (if (null LaTeX-auto-style) + () + (while LaTeX-auto-style + (let* ((entry (car LaTeX-auto-style)) + (options (nth 0 entry)) + (style (nth 1 entry)) + (class (nth 2 entry))) + + ;; Next document style. + (setq LaTeX-auto-style (cdr LaTeX-auto-style)) + + ;; Get the options. + (setq options (TeX-split-string + "\\([ \t\r\n]\\|%[^\n\r]*[\n\r]\\|,\\)+" + options)) + + ;; Strip empty options. + (if (string-equal (car options) "") + (setq options (cdr options))) + (let ((index options)) + (while (cdr-safe index) + (if (string-equal (car (cdr index)) "") + (setcdr index (cdr (cdr index))) + (setq index (cdr index))))) + + ;; Add them, to the style list. + (setq TeX-auto-file (append options TeX-auto-file)) + + ;; The second argument if present is a normal style file. + (if (null style) + () + (setq TeX-auto-file (cons style TeX-auto-file)) + + ;; And a special "art10" style file combining style and size. + (setq TeX-auto-file + (cons (concat + (cond ((string-equal "article" style) + "art") + ((string-equal "book" style) + "bk") + ((string-equal "report" style) + "rep") + ((string-equal "jarticle" style) + "jart") + ((string-equal "jbook" style) + "jbk") + ((string-equal "jreport" style) + "jrep") + ((string-equal "j-article" style) + "j-art") + ((string-equal "j-book" style) + "j-bk") + ((string-equal "j-report" style ) + "j-rep") + (t style)) + (cond ((member "11pt" options) + "11") + ((member "12pt" options) + "12") + (t + "10"))) + TeX-auto-file))) + + ;; The third argument if "class" indicates LaTeX2e features. + (cond ((equal class "class") + (setq TeX-auto-file (cons "latex2e" TeX-auto-file))) + ((equal class "style") + (setq TeX-auto-file (cons "latex2" TeX-auto-file))))))) + + ;; Cleanup optional arguments + (mapcar (function (lambda (entry) + (setq TeX-auto-symbol + (cons (list (nth 0 entry) + (string-to-int (nth 1 entry))) + TeX-auto-symbol)))) + LaTeX-auto-arguments) + + ;; Cleanup default optional arguments + (mapcar (function (lambda (entry) + (setq TeX-auto-symbol + (cons (list (nth 0 entry) + (vector "argument") + (1- (string-to-int (nth 1 entry)))) + TeX-auto-symbol)))) + LaTeX-auto-optional) + + ;; Cleanup environments arguments + (mapcar (function (lambda (entry) + (setq LaTeX-auto-environment + (cons (list (nth 0 entry) + (string-to-int (nth 1 entry))) + LaTeX-auto-environment)))) + LaTeX-auto-env-args) + + ;; Cleanup use of def to add environments + ;; NOTE: This uses an O(N^2) algorithm, while an O(N log N) + ;; algorithm is possible. + (mapcar (function (lambda (symbol) + (if (not (TeX-member symbol TeX-auto-symbol 'equal)) + ;; No matching symbol, insert in list + (setq TeX-auto-symbol + (cons (concat "end" symbol) TeX-auto-symbol)) + ;; Matching symbol found, remove from list + (if (equal (car TeX-auto-symbol) symbol) + ;; Is it the first symbol? + (setq TeX-auto-symbol (cdr TeX-auto-symbol)) + ;; Nope! Travel the list + (let ((list TeX-auto-symbol)) + (while (consp (cdr list)) + ;; Until we find it. + (if (equal (car (cdr list)) symbol) + ;; Then remove it. + (setcdr list (cdr (cdr list)))) + (setq list (cdr list))))) + ;; and add the symbol as an environment. + (setq LaTeX-auto-environment + (cons symbol LaTeX-auto-environment))))) + LaTeX-auto-end-symbol)) + +(add-hook 'TeX-auto-cleanup-hook 'LaTeX-auto-cleanup) + +(TeX-auto-add-type "label" "LaTeX") +(TeX-auto-add-type "bibitem" "LaTeX") +(TeX-auto-add-type "environment" "LaTeX") +(TeX-auto-add-type "bibliography" "LaTeX" "bibliographies") + +(fset 'LaTeX-add-bibliographies-auto + (symbol-function 'LaTeX-add-bibliographies)) +(defun LaTeX-add-bibliographies (&rest bibliographies) + "Add BIBLIOGRAPHIES to the list of known bibliographies and style files." + (apply 'LaTeX-add-bibliographies-auto bibliographies) + (apply 'TeX-run-style-hooks bibliographies)) + +(fset 'LaTeX-add-environments-auto + (symbol-function 'LaTeX-add-environments)) +(defun LaTeX-add-environments (&rest environments) + "Add ENVIRONMENTS to the list of known environments." + (apply 'LaTeX-add-environments-auto environments) + (setq LaTeX-menu-changed t)) + +;;; BibTeX + +;;;###autoload +(defun BibTeX-auto-store () + "This function should be called from bibtex-mode-hook. +It will setup BibTeX to store keys in an auto file." + ;; We want this to be early in the list, so we do not + ;; add it before we enter BibTeX mode the first time. + (if (boundp 'local-write-file-hooks) + (add-hook 'local-write-file-hooks 'TeX-safe-auto-write) + (add-hook 'write-file-hooks 'TeX-safe-auto-write)) + (make-local-variable 'TeX-auto-update) + (setq TeX-auto-update 'BibTeX) + (make-local-variable 'TeX-auto-untabify) + (setq TeX-auto-untabify nil) + (make-local-variable 'TeX-auto-parse-length) + (setq TeX-auto-parse-length 999999) + (make-local-variable 'TeX-auto-regexp-list) + (setq TeX-auto-regexp-list BibTeX-auto-regexp-list)) + +(defvar BibTeX-auto-regexp-list + '(("@[Ss][Tt][Rr][Ii][Nn][Gg]" 1 ignore) + ("@[a-zA-Z]+[{(][ \t]*\\([a-zA-Z][^, \n\r\t%\"#'()={}]*\\)" + 1 LaTeX-auto-bibitem)) + "List of regexp-list expressions matching BibTeX items.") + +;;; Macro Argument Hooks + +(defun TeX-arg-conditional (optional expr then else) + "Implement if EXPR THEN ELSE. + +If EXPR evaluate to true, parse THEN as an argument list, else parse +ELSE as an argument list." + (TeX-parse-arguments (if (eval expr) then else))) + +(defun TeX-arg-free (optional &optional &rest args) + "Parse its arguments but use no braces when they are inserted." + (let ((< "") + (> "")) + (if (equal (length args) 1) + (TeX-parse-argument optional (car args)) + (TeX-parse-argument optional args)))) + +(defun TeX-arg-literal (optional &optional &rest args) + "Insert its arguments into the buffer. +Used for specifying extra syntax for a macro." + (apply 'insert args)) + +(defun TeX-arg-eval (optional &rest args) + "Evaluate args and insert value in buffer." + (TeX-argument-insert (eval args) optional)) + +(defun TeX-arg-label (optional &optional prompt definition) + "Prompt for a label completing with known labels." + (let ((label (completing-read (TeX-argument-prompt optional prompt "Key") + (LaTeX-label-list)))) + (if (and definition (not (string-equal "" label))) + (LaTeX-add-labels label)) + (TeX-argument-insert label optional optional))) + +(defun TeX-arg-macro (optional &optional prompt definition) + "Prompt for a TeX macro with completion." + (let ((macro (completing-read (TeX-argument-prompt optional prompt + (concat "Macro: " + TeX-esc) + t) + (TeX-symbol-list)))) + (if (and definition (not (string-equal "" macro))) + (TeX-add-symbols macro)) + (TeX-argument-insert macro optional TeX-esc))) + +(defun TeX-arg-environment (optional &optional prompt definition) + "Prompt for a LaTeX environment with completion." + (let ((environment (completing-read (TeX-argument-prompt optional prompt + "Environment") + (TeX-symbol-list)))) + (if (and definition (not (string-equal "" environment))) + (LaTeX-add-environments environment)) + + (TeX-argument-insert environment optional))) + +(defun TeX-arg-cite (optional &optional prompt definition) + "Prompt for a BibTeX citation with completion." + (setq prompt (concat (if optional "(Optional) " "") + (if prompt prompt "Add key") + ": (default none) ")) + (let ((items (multi-prompt "," t prompt (LaTeX-bibitem-list)))) + (apply 'LaTeX-add-bibitems items) + (TeX-argument-insert (mapconcat 'identity items ",") optional optional))) + +(defun TeX-arg-counter (optional &optional prompt definition) + "Prompt for a LaTeX counter." + ;; Completion not implemented yet. + (TeX-argument-insert + (read-string (TeX-argument-prompt optional prompt "Counter")) + optional)) + +(defun TeX-arg-savebox (optional &optional prompt definition) + "Prompt for a LaTeX savebox." + ;; Completion not implemented yet. + (TeX-argument-insert + (read-string (TeX-argument-prompt optional prompt + (concat "Savebox: " TeX-esc) + t)) + optional TeX-esc)) + +(defun TeX-arg-file (optional &optional prompt) + "Prompt for a filename in the current directory." + (TeX-argument-insert (read-file-name (TeX-argument-prompt optional + prompt "File") + "" "" nil) + optional)) + +(defun TeX-arg-define-label (optional &optional prompt) + "Prompt for a label completing with known labels." + (TeX-arg-label optional prompt t)) + +(defun TeX-arg-define-macro (optional &optional prompt) + "Prompt for a TeX macro with completion." + (TeX-arg-macro optional prompt t)) + +(defun TeX-arg-define-environment (optional &optional prompt) + "Prompt for a LaTeX environment with completion." + (TeX-arg-environment optional prompt t)) + +(defun TeX-arg-define-cite (optional &optional prompt) + "Prompt for a BibTeX citation." + (TeX-arg-cite optional prompt t)) + +(defun TeX-arg-define-counter (optional &optional prompt) + "Prompt for a LaTeX counter." + (TeX-arg-counter optional prompt t)) + +(defun TeX-arg-define-savebox (optional &optional prompt) + "Prompt for a LaTeX savebox." + (TeX-arg-savebox optional prompt t)) + +(defvar LaTeX-style-list '(("book") + ("article") + ("letter") + ("slides") + ("report")) + "*List of document styles.") + + (make-variable-buffer-local 'LaTeX-style-list) + +(defun TeX-arg-document (optional &optional ignore) + "Insert arguments to documentstyle and documentclass." + (let ((style (completing-read + (concat "Document style: (default " LaTeX-default-style ") ") + LaTeX-style-list)) + (options (read-string "Options: " + (if (stringp LaTeX-default-options) + LaTeX-default-options + (mapconcat 'identity + LaTeX-default-options + ","))))) + (if (zerop (length style)) + (setq style LaTeX-default-style)) + (if (not (zerop (length options))) + (insert LaTeX-optop options LaTeX-optcl)) + (insert TeX-grop style TeX-grcl)) + + ;; remove old information + (TeX-remove-style) + + ;; defined in individual style hooks + (TeX-update-style)) + +(defvar TeX-global-input-files nil + "*List of the non-local TeX input files. + +Initialized once at the first time you prompt for an input file. +May be reset with `C-u \\[TeX-normal-mode]'.") + +(defun TeX-arg-input-file (optionel &optional prompt local) + "Prompt for a tex or sty file. + +First optional argument is the promt, the second is a flag. +If the flag is set, only complete with local files." + (if (or TeX-global-input-files local) + () + (message "Searching for files...") + (setq TeX-global-input-files + (mapcar 'list (TeX-search-files (append TeX-macro-private + TeX-macro-global) + TeX-file-extensions t t)))) + (let ((file (if TeX-check-path + (completing-read + (TeX-argument-prompt optionel prompt "File") + (append (mapcar 'list + (TeX-search-files '(".") + TeX-file-extensions + t t)) + (if local + nil + TeX-global-input-files))) + (read-file-name + (TeX-argument-prompt optionel prompt "File"))))) + (if (null file) + (setq file "")) + (if (not (string-equal "" file)) + (TeX-run-style-hooks file)) + (TeX-argument-insert file optionel))) + +(defvar BibTeX-global-style-files nil + "*Association list of BibTeX style files. + +Initialized once at the first time you prompt for an input file. +May be reset with `C-u \\[TeX-normal-mode]'.") + +(defun TeX-arg-bibstyle (optional &optional prompt) + "Prompt for a BibTeX style file." + (message "Searching for BibTeX styles...") + (or BibTeX-global-style-files + (setq BibTeX-global-style-files + (mapcar 'list + (TeX-search-files (append TeX-macro-private + TeX-macro-global) + BibTeX-style-extensions t t)))) + + (TeX-argument-insert + (completing-read (TeX-argument-prompt optional prompt "BibTeX style") + (append (mapcar 'list + (TeX-search-files '(".") + BibTeX-style-extensions + t t)) + BibTeX-global-style-files)) + optional)) + +(defvar BibTeX-global-files nil + "*Association list of BibTeX files. + +Initialized once at the first time you prompt for an BibTeX file. +May be reset with `C-u \\[TeX-normal-mode]'.") + +(defun TeX-arg-bibliography (optional &optional prompt) + "Prompt for a BibTeX database file." + (message "Searching for BibTeX files...") + (or BibTeX-global-files + (setq BibTeX-global-files + (mapcar 'list (TeX-search-files nil BibTeX-file-extensions t t)))) + + (let ((styles (multi-prompt + "," t + (TeX-argument-prompt optional prompt "BibTeX files") + (append (mapcar 'list + (TeX-search-files '(".") + BibTeX-file-extensions + t t)) + BibTeX-global-files)))) + (apply 'LaTeX-add-bibliographies styles) + (TeX-argument-insert (mapconcat 'identity styles ",") optional))) + +(defun TeX-arg-corner (optional &optional prompt) + "Prompt for a LaTeX side or corner position with completion." + (TeX-argument-insert + (completing-read (TeX-argument-prompt optional prompt "Position") + '(("") ("l") ("r") ("t") ("b") ("tl") ("tr") ("bl") ("br")) + nil t) + optional)) + +(defun TeX-arg-lr (optional &optional prompt) + "Prompt for a LaTeX side with completion." + (TeX-argument-insert + (completing-read (TeX-argument-prompt optional prompt "Position") + '(("") ("l") ("r")) + nil t) + optional)) + +(defun TeX-arg-tb (optional &optional prompt) + "Prompt for a LaTeX side with completion." + (TeX-argument-insert + (completing-read (TeX-argument-prompt optional prompt "Position") + '(("") ("t") ("b")) + nil t) + optional)) + +(defun TeX-arg-pagestyle (optional &optional prompt) + "Prompt for a LaTeX pagestyle with completion." + (TeX-argument-insert + (completing-read (TeX-argument-prompt optional prompt "Pagestyle") + '(("plain") ("empty") ("headings") ("myheadings"))) + optional)) + +(defun TeX-arg-verb (optional &optional ignore) + "Prompt for delimiter and text." + (let ((del (read-quoted-char "Delimiter: ")) + (text (read-from-minibuffer "Text: "))) + (insert del text del))) + +(defun TeX-arg-pair (optional first second) + "Insert a pair of number, prompted by FIRST and SECOND. + +The numbers are surounded by parenthesizes and separated with a +comma." + (insert "(" (read-string (concat first ": ")) "," + (read-string (concat second ": ")) ")")) + +(defun TeX-arg-size (optional) + "Insert width and height as a pair." + (TeX-arg-pair optional "Width" "Height")) + +(defun TeX-arg-coordinate (optional) + "Insert x and y coordinate as a pair." + (TeX-arg-pair optional "X position" "Y position")) + +(defconst TeX-braces-default-association + '(("[" . "]") + ("\\{" . "\\}") + ("(" . ")") + ("|" . "|") + ("\\|" . "\\|") + ("/" . "/") + ("\\backslash" . "\\backslash") + ("\\lfloor" . "\\rfloor") + ("\\lceil" . "\\rceil") + ("\\langle" . "\\rangle"))) + +(defvar TeX-braces-user-association nil + "A list of your personal association of brace symbols for \\left and \\right + +The car of each entry is the brace used with \\left, +the cdr is the brace used with \\right.") + +(defvar TeX-braces-association + (append TeX-braces-user-association + TeX-braces-default-association) + "A list of association of brace symbols for \\left and \\right. +The car of each entry is the brace used with \\left, +the cdr is the brace used with \\right.") + +(defvar TeX-left-right-braces + '(("[") ("]") ("\\{") ("\\}") ("(") (")") ("|") ("\\|") + ("/") ("\\backslash") ("\\lfloor") ("\\rfloor") + ("\\lceil") ("\\rceil") ("\\langle") ("\\rangle") + ("\\uparrow") ("\\Uparrow") ("\\downarrow") ("\\Downarrow") + ("\\updownarrow") ("\\Updownarrow") (".")) + "List of symbols which can follow the \\left or \\right command") + +(defun TeX-arg-insert-braces (optional &optional prompt) + (save-excursion + (backward-word 1) + (backward-char) + (newline-and-indent) + (beginning-of-line 0) + (if (looking-at "^[ \t]*$") + (progn (delete-horizontal-space) + (delete-char 1)))) + (let ((left-brace (completing-read + (TeX-argument-prompt optional prompt "Which brace") + TeX-left-right-braces))) + (insert left-brace) + (newline-and-indent) + (save-excursion + (let ((right-brace (cdr (assoc left-brace + TeX-braces-association)))) + (newline) + (insert TeX-esc "right") + (if (and TeX-arg-right-insert-p + right-brace) + (insert right-brace) + (insert (completing-read + (TeX-argument-prompt optional prompt "Which brace") + TeX-left-right-braces))) + (LaTeX-indent-line))))) + +;;; Indentation + +(defvar LaTeX-indent-level 2 + "*Indentation of begin-end blocks in LaTeX.") + +(defvar LaTeX-item-indent (- LaTeX-indent-level) + "*Extra indentation for lines beginning with an item.") + +(defvar LaTeX-item-regexp "\\(bib\\)?item\\b" + "*Regular expression matching macros considered items.") + +(defun LaTeX-indent-line () + "Indent the line containing point, as LaTeX source. +Add LaTeX-indent-level indentation in each \\begin{ - \\end{ block. +Lines starting with an item is given an extra indentation of +LaTeX-item-indent." + (interactive) + (let ((indent (LaTeX-indent-calculate))) + (save-excursion + (if (/= (current-indentation) indent) + (let ((beg (progn + (beginning-of-line) + (point)))) + (back-to-indentation) + (delete-region beg (point)) + (indent-to indent)))) + (if (< (current-column) indent) + (back-to-indentation)))) + +(defun LaTeX-fill-region-as-paragraph (from to &optional justify-flag) + "Fill region as one paragraph: break lines to fit fill-column, +but leave all lines ending with \\\\ (plus its optional argument) alone. +Prefix arg means justify too. +From program, pass args FROM, TO and JUSTIFY-FLAG." + (interactive "*r\nP") + (or (assoc (LaTeX-current-environment) LaTeX-indent-environment-list) + (save-restriction + (narrow-to-region from to) + (goto-char from) + (while (not (eobp)) + (LaTeX-indent-line) + (forward-line)) + (goto-char from) + (while (not (eobp)) + (if + (re-search-forward (concat "^.*" + (regexp-quote TeX-esc) + (regexp-quote TeX-esc) + "\\(\\s-*\\*\\)?" + "\\(\\s-*\\[[^]]*\\]\\)?\\s-*$") + nil t) + (progn + (goto-char (match-end 0)) + (delete-horizontal-space) + ;; I doubt very much if we want justify - + ;; this is a line with \\ + ;; if you think otherwise - uncomment the next line + ;; (and justify-flag (justify-current-line)) + (forward-char) + ;; keep our position in a buffer + (save-excursion + (LaTeX-fill-region-as-para-do + from (match-beginning 0) justify-flag)) + (setq from (point))) + ;; ELSE part follows - loop termination relies on a fact + ;; that (LaTeX-fill-region-as-para-do) moves point past + ;; the filled region + (LaTeX-fill-region-as-para-do from to justify-flag))) + ;; the following four lines are clearly optional, but I like my + ;; LaTeX code that way + (goto-char (point-min)) + (while (search-forward "$$ " nil t) + (replace-match "$$\n" t t) + (LaTeX-indent-line))))) + +(defun LaTeX-fill-region-as-para-do (from to justify-flag) + "Fill region as one paragraph: break lines to fit fill-column." + (if (< from to) + (progn + ;; (save-restriction) here is likely not needed because + ;; it was done by a caller, but I am not sure - mj + (save-restriction + (goto-char from) + (skip-chars-forward " \n") + (LaTeX-indent-line) + (beginning-of-line) + (narrow-to-region (point) to) + (setq from (point)) + + ;; from is now before the text to fill, + ;; but after any fill prefix on the first line. + + ;; Make sure sentences ending at end of line get an extra space. + (if (or (not (boundp 'sentence-end-double-space)) + sentence-end-double-space) + (progn + (goto-char from) + (while (re-search-forward "[.?!][]})\"']*$" nil t) + (insert ? )))) + ;; The change all newlines to spaces. + (subst-char-in-region from (point-max) ?\n ?\ ) + ;; Flush excess spaces, except in the paragraph indentation. + (goto-char from) + (skip-chars-forward " \t") + (while (re-search-forward " *" nil t) + (delete-region + (+ (match-beginning 0) + (if (save-excursion + (skip-chars-backward " ]})\"'") + (memq (preceding-char) '(?. ?? ?!))) + 2 1)) + (match-end 0))) + (goto-char (point-max)) + (delete-horizontal-space) + (insert " ") + (goto-char (point-min)) + (let ((prefixcol 0)) + (while (not (eobp)) + (move-to-column (1+ fill-column)) + (if (eobp) + nil + (skip-chars-backward "^ \n") + (if (if (zerop prefixcol) + (bolp) + (>= prefixcol (current-column))) + (skip-chars-forward "^ \n") + (forward-char -1))) + (delete-horizontal-space) + (if (equal (preceding-char) ?\\) + (insert ? )) + (insert ?\n) + (LaTeX-indent-line) + (setq prefixcol (current-column)) + (and justify-flag (not (eobp)) + (progn + (forward-line -1) + (justify-current-line) + (forward-line 1))) + ) + (goto-char (point-max)) + (delete-horizontal-space)))))) + +(defun LaTeX-fill-paragraph (prefix) + "Fill and indent paragraph at or after point. +Prefix arg means justify as well." + (interactive "*P") + (save-excursion + (beginning-of-line) + (if (looking-at "[ \t]*%]") + (re-search-forward "^[ \t]*[^% \t\n]")) + (forward-paragraph) + (or (bolp) (newline 1)) + (and (eobp) (open-line 1)) + (let ((end (point-marker)) + (start (progn + (backward-paragraph) + (point)))) + (LaTeX-fill-region-as-paragraph start end prefix)))) + +(defun LaTeX-fill-region (from to &optional justify what) + "Fill and indent each of the paragraphs in the region as LaTeX text. +Prefix arg (non-nil third arg, if called from program) +means justify as well. Fourth arg WHAT is a word to be displayed when +formatting." + (interactive "*r\nP") + (save-restriction + (save-excursion + (let ((length (- to from)) + (to (set-marker (make-marker) to))) + (goto-char from) + (beginning-of-line) + (while (< (point) to) + (message "Formatting%s ... %d%%" + (if (not what) + "" + what) + (/ (* 100 (- (point) from)) length)) + (save-excursion (LaTeX-fill-paragraph justify)) + (forward-paragraph 2) + (if (not (eobp)) + (backward-paragraph))) + (set-marker to nil))) + (message "Finished"))) + +(defun LaTeX-find-matching-end () + "Move point to the \\end of the current environment" + (interactive) + (let ((regexp (concat (regexp-quote TeX-esc) "\\(begin\\|end\\)\\b")) + (level 1)) + (beginning-of-line 1) + (if (looking-at (concat " *" (regexp-quote TeX-esc) "begin\\b")) + (end-of-line 1)) + (while (and (> level 0) (re-search-forward regexp nil t)) + (if (= (char-after (1+ (match-beginning 0))) ?b);;begin + (setq level (1+ level)) + (setq level (1- level)))) + (if (= level 0) + (search-forward "}") + (error "Can't locate end of current environment")))) + +(defun LaTeX-find-matching-begin () + "Move point to the \\begin of the current environment" + (interactive) + (let ((regexp (concat (regexp-quote TeX-esc) "\\(begin\\|end\\)\\b")) + (level 1)) + (beginning-of-line 1) + (if (looking-at (concat " *" (regexp-quote TeX-esc) "begin\\b")) + (end-of-line 1)) + (while (and (> level 0) (re-search-backward regexp nil t)) + (if (= (char-after (1+ (match-beginning 0))) ?e);;end + (setq level (1+ level)) + (setq level (1- level)))) + (or (= level 0) + (error "Can't locate beginning of current environment")))) + +(defun LaTeX-mark-environment () + "Set mark to end of current environment and point to the matching begin +will not work properly if there are unbalanced begin-end pairs in +comments and verbatim environments" + (interactive) + (let ((cur (point))) + (LaTeX-find-matching-end) + (beginning-of-line 2) + (set-mark (point)) + (goto-char cur) + (LaTeX-find-matching-begin) + (TeX-activate-region))) + +(defun LaTeX-fill-environment (justify) + "Fill and indent current environment as LaTeX text." + (interactive "*P") + (save-excursion + (LaTeX-mark-environment) + (re-search-forward "{\\([^}]+\\)}") + (LaTeX-fill-region + (region-beginning) + (region-end) + justify + (concat " environment " (TeX-match-buffer 1))))) + +(defun LaTeX-fill-section (justify) + "Fill and indent current logical section as LaTeX text." + (interactive "*P") + (save-excursion + (LaTeX-mark-section) + (re-search-forward "{\\([^}]+\\)}") + (LaTeX-fill-region + (region-beginning) + (region-end) + justify + (concat " section " (TeX-match-buffer 1))))) + +(defun LaTeX-mark-section () + "Set mark at end of current logical section, and point at top." + (interactive) + (re-search-forward (concat "\\(" (LaTeX-outline-regexp) + "\\|\\'\\)")) + (re-search-backward "^") + (set-mark (point)) + (re-search-backward (concat "\\(" (LaTeX-outline-regexp) + "\\|\\`\\)")) + (TeX-activate-region)) + +(defun LaTeX-fill-buffer (justify) + "Fill and indent current buffer as LaTeX text." + (interactive "*P") + (save-excursion + (LaTeX-fill-region + (point-min) + (point-max) + justify + (concat " buffer " (buffer-name))))) + +(defvar LaTeX-indent-environment-list + '(("verbatim" current-indentation) + ("verbatim*" current-indentation) + ;; The following should have there own, smart indentation function. + ;; Some other day. + ("alltt") + ("array") + ("displaymath") + ("eqnarray") + ("eqnarray*") + ("equation") + ("equation*") + ("picture") + ("tabbing") + ("table") + ("table*") + ("tabular") + ("tabular*")) + "Alist of environments with special indentation. +The second element in each entry is the function to calculate the +indentation level in columns.") + +(defvar LaTeX-indent-environment-check t + "*If non-nil, check for any special environments.") + +(defvar LaTeX-left-comment-regexp "%%%" + "*Regexp matching comments that should be placed on the left margin.") + +(defvar LaTeX-right-comment-regexp "%[^%]" + "*Regexp matching comments that should be placed to the right margin.") + +(defvar LaTeX-ignore-comment-regexp nil + "*Regexp matching comments that whose indentation should not be touched.") + +(defun LaTeX-indent-calculate () + ;; Return the correct indentation of line of LaTeX source. (I hope...) + (save-excursion + (back-to-indentation) + (cond ((looking-at (concat (regexp-quote TeX-esc) + "\\(begin\\|end\\){verbatim\\*?}")) + ;; \end{verbatim} must be flush left, otherwise an unwanted + ;; empty line appears in LaTeX's output. + 0) + ((and LaTeX-left-comment-regexp + (looking-at LaTeX-left-comment-regexp)) + ;; Comments to the left margin. + 0) + ((and LaTeX-right-comment-regexp + (looking-at LaTeX-right-comment-regexp)) + ;; Comments to the right margin. + comment-column) + ((and LaTeX-ignore-comment-regexp + (looking-at LaTeX-ignore-comment-regexp)) + ;; Comments best left alone. + (current-indentation)) + ((and LaTeX-indent-environment-check + ;; Special environments. + (let ((entry (assoc (LaTeX-current-environment) + LaTeX-indent-environment-list))) + (and entry + (nth 1 entry) + (funcall (nth 1 entry)))))) + ((looking-at (concat (regexp-quote TeX-esc) "end\\b")) + ;; Backindent at \end. + (- (LaTeX-indent-calculate-last) LaTeX-indent-level)) + ((looking-at (concat (regexp-quote TeX-esc) "right\\b")) + ;; Backindent at \right. + (- (LaTeX-indent-calculate-last) LaTeX-left-right-indent-level)) + ((looking-at (concat (regexp-quote TeX-esc) LaTeX-item-regexp)) + ;; Items. + (+ (LaTeX-indent-calculate-last) LaTeX-item-indent)) + (t (LaTeX-indent-calculate-last))))) + +(defvar LaTeX-left-right-indent-level LaTeX-indent-level + "*The level of indentation produced by a \\left macro.") + +(defun LaTeX-indent-level-count () + ;; Count indentation change caused by all \left, \right, \begin, and + ;; \end commands in the current line. + (save-excursion + (save-restriction + (let ((count 0)) + (narrow-to-region (point) + (save-excursion + (re-search-forward (concat "[^" + (regexp-quote TeX-esc) + "]%\\|\n\\|\\'")) + (backward-char) + (point))) + (while (search-forward TeX-esc nil t) + (cond + ((looking-at "left\\b") + (setq count (+ count LaTeX-left-right-indent-level))) + ((looking-at "right\\b") + (setq count (- count LaTeX-left-right-indent-level))) + ((looking-at "begin\\b") + (setq count (+ count LaTeX-indent-level))) + ((looking-at "end\\b") + (setq count (- count LaTeX-indent-level))) + ((looking-at (regexp-quote TeX-esc)) + (forward-char 1)))) + count)))) + +(defun LaTeX-indent-calculate-last () + "Return the correct indentation of a normal line of text. +The point is supposed to be at the beginning of the current line." + (save-restriction + (widen) + (skip-chars-backward "\n\t ") + (move-to-column (current-indentation)) + + ;; Ignore comments. + (while (and (looking-at (regexp-quote comment-start)) (not (bobp))) + (skip-chars-backward "\n\t ") + (if (not (bobp)) + (move-to-column (current-indentation)))) + + (cond ((bobp) 0) + ((looking-at (concat (regexp-quote TeX-esc) "begin{document}")) + ;; I dislike having all of the document indented... + (current-indentation)) + ((looking-at (concat (regexp-quote TeX-esc) "begin *" + (regexp-quote TeX-grop) + "verbatim\\*?" + (regexp-quote TeX-grcl))) + 0) + ((looking-at (concat (regexp-quote TeX-esc) "end" + (regexp-quote TeX-grop) + "verbatim\\*?" + (regexp-quote TeX-grcl))) + ;; If I see an \end{verbatim} in the previous line I skip + ;; back to the preceding \begin{verbatim}. + (save-excursion + (if (re-search-backward (concat (regexp-quote TeX-esc) + "begin *" + (regexp-quote TeX-grop) + "verbatim\\*?" + (regexp-quote TeX-grcl)) 0 t) + (LaTeX-indent-calculate-last) + 0))) + (t (+ (current-indentation) + (TeX-brace-count-line) + (LaTeX-indent-level-count) + (cond ((looking-at (concat (regexp-quote TeX-esc) "end\\b")) + LaTeX-indent-level) + ((looking-at (concat (regexp-quote TeX-esc) "right\\b")) + LaTeX-left-right-indent-level) + ((looking-at (concat (regexp-quote TeX-esc) + LaTeX-item-regexp)) + (- LaTeX-item-indent)) + (t 0))))))) + +;;; Math Minor Mode + +(defvar LaTeX-math-list nil + "AList of your personal LaTeX math symbols. + +Each entry should be a list with three elements, KEY, VALUE, and MENU. +KEY is the key to be redefined (under `LaTeX-math-abbrev-prefix' in +math minor mode, VALUE can be a string with the name of the macro to +be inserted, or a function to be called. The optional third element is +the name of the submenu where the command should be added. + +See also `LaTeX-math-menu'.") + +(defconst LaTeX-math-default + '((?a "alpha" "greek") + (?b "beta" "greek") + (?c LaTeX-math-cal "Cal-whatever") + (?d "delta" "greek") + (?e "epsilon" "greek") + (?f "phi" "greek") + (?g "gamma" "greek") + (?h "eta" "greek") + (?k "kappa" "greek") + (?l "lambda" "greek") + (?m "mu" "greek") + (?N "nabla" "greek") + (?n "nu" "greek") + (?o "omega" "greek") + (?p "pi" "greek") + (?q "theta" "greek") + (?r "rho" "greek") + (?s "sigma" "greek") + (?t "tau" "greek") + (?u "upsilon" "greek") + (?x "chi" "greek") + (?y "psi" "greek") + (?z "zeta" "greek") + (?D "Delta" "Greek") + (?F "Phi" "Greek") + (?G "Gamma" "Greek") + (?Q "Theta" "Greek") + (?L "Lambda" "Greek") + (?Y "Psi" "Greek") + (?P "Pi" "Greek") + (?S "Sigma" "Greek") + (?U "Upsilon" "Greek") + (?O "Omega" "Greek") + (nil "pm" "Binary Op") + (nil "mp" "Binary Op") + (?* "times" "Binary Op") + (nil "div" "Binary Op") + (nil "ast" "Binary Op") + (nil "star" "Binary Op") + (nil "circ" "Binary Op") + (nil "bullet" "Binary Op") + (?. "cdot" "Binary Op") + (?- "cap" "Binary Op") + (?+ "cup" "Binary Op") + (nil "uplus" "Binary Op") + (nil "sqcap" "Binary Op") + (?| "vee" "Binary Op") + (?& "wedge" "Binary Op") + (?\\ "setminus" "Binary Op") + (nil "wr" "Binary Op") + (nil "diamond" "Binary Op") + (nil "bigtriangleup" "Binary Op") + (nil "bigtriangledown" "Binary Op") + (nil "triangleleft" "Binary Op") + (nil "triangleright" "Binary Op") + (nil "lhd" "Binary Op") + (nil "rhd" "Binary Op") + (nil "unlhd" "Binary Op") + (nil "unrhd" "Binary Op") + (nil "oplus" "Binary Op") + (nil "ominus" "Binary Op") + (nil "otimes" "Binary Op") + (nil "oslash" "Binary Op") + (nil "odot" "Binary Op") + (nil "bigcirc" "Binary Op") + (nil "dagger" "Binary Op") + (nil "ddagger" "Binary Op") + (nil "amalg" "Binary Op") + (?< "leq" "Relational") + (?> "geq" "Relational") + (nil "qed" "Relational") + (nil "equiv" "Relational") + (nil "models" "Relational") + (nil "prec" "Relational") + (nil "succ" "Relational") + (nil "sim" "Relational") + (nil "perp" "Relational") + (nil "preceq" "Relational") + (nil "succeq" "Relational") + (nil "simeq" "Relational") + (nil "mid" "Relational") + (nil "ll" "Relational") + (nil "gg" "Relational") + (nil "asymp" "Relational") + (nil "parallel" "Relational") + (?{ "subset" "Relational") + (?} "supset" "Relational") + (nil "approx" "Relational") + (nil "bowtie" "Relational") + (?\[ "subseteq" "Relational") + (?\] "supseteq" "Relational") + (nil "cong" "Relational") + (nil "Join" "Relational") + (nil "sqsubset" "Relational") + (nil "sqsupset" "Relational") + (nil "neq" "Relational") + (nil "smile" "Relational") + (nil "sqsubseteq" "Relational") + (nil "sqsupseteq" "Relational") + (nil "doteq" "Relational") + (nil "frown" "Relational") + (?i "in" "Relational") + (nil "ni" "Relational") + (nil "propto" "Relational") + (nil "vdash" "Relational") + (nil "dashv" "Relational") + (?\C-b "leftarrow" "Arrows") + (nil "Leftarrow" "Arrows") + (?\C-f "rightarrow" "Arrows") + (nil "Rightarrow" "Arrows") + (nil "leftrightarrow" "Arrows") + (nil "Leftrightarrow" "Arrows") + (nil "mapsto" "Arrows") + (nil "hookleftarrow" "Arrows") + (nil "leftharpoonup" "Arrows") + (nil "leftharpoondown" "Arrows") + (nil "longleftarrow" "Arrows") + (nil "Longleftarrow" "Arrows") + (nil "longrightarrow" "Arrows") + (nil "Longrightarrow" "Arrows") + (nil "longleftrightarrow" "Arrows") + (nil "Longleftrightarrow" "Arrows") + (nil "longmapsto" "Arrows") + (nil "hookrightarrow" "Arrows") + (nil "rightharpoonup" "Arrows") + (nil "rightharpoondown" "Arrows") + (?\C-p "uparrow" "Arrows") + (nil "Uparrow" "Arrows") + (?\C-n "downarrow" "Arrows") + (nil "Downarrow" "Arrows") + (nil "updownarrow" "Arrows") + (nil "Updownarrow" "Arrows") + (nil "nearrow" "Arrows") + (nil "searrow" "Arrows") + (nil "swarrow" "Arrows") + (nil "nwarrow" "Arrows") + (nil "ldots" "Misc Symbol") + (nil "cdots" "Misc Symbol") + (nil "vdots" "Misc Symbol") + (nil "ddots" "Misc Symbol") + (nil "aleph" "Misc Symbol") + (nil "prime" "Misc Symbol") + (?A "forall" "Misc Symbol") + (?I "infty" "Misc Symbol") + (nil "hbar" "Misc Symbol") + (?0 "emptyset" "Misc Symbol") + (?E "exists" "Misc Symbol") + (nil "nabla" "Misc Symbol") + (nil "surd" "Misc Symbol") + (nil "Box" "Misc Symbol") + (nil "triangle" "Misc Symbol") + (nil "Diamond" "Misc Symbol") + (nil "imath" "Misc Symbol") + (nil "jmath" "Misc Symbol") + (nil "ell" "Misc Symbol") + (nil "neg" "Misc Symbol") + (?/ "not" "Misc Symbol") + (nil "top" "Misc Symbol") + (nil "flat" "Misc Symbol") + (nil "natural" "Misc Symbol") + (nil "sharp" "Misc Symbol") + (nil "wp" "Misc Symbol") + (nil "bot" "Misc Symbol") + (nil "clubsuit" "Misc Symbol") + (nil "diamondsuit" "Misc Symbol") + (nil "heartsuit" "Misc Symbol") + (nil "spadesuit" "Misc Symbol") + (nil "mho" "Misc Symbol") + (nil "Re" "Misc Symbol") + (nil "Im" "Misc Symbol") + (nil "angle" "Misc Symbol") + (nil "partial" "Misc Symbol") + (nil "sum" "Var Symbol") + (nil "prod" "Var Symbol") + (nil "coprod" "Var Symbol") + (nil "int" "Var Symbol") + (nil "oint" "Var Symbol") + (nil "bigcap" "Var Symbol") + (nil "bigcup" "Var Symbol") + (nil "bigsqcup" "Var Symbol") + (nil "bigvee" "Var Symbol") + (nil "bigwedge" "Var Symbol") + (nil "bigodot" "Var Symbol") + (nil "bigotimes" "Var Symbol") + (nil "bigoplus" "Var Symbol") + (nil "biguplus" "Var Symbol") + (nil "arccos" "Log-like") + (nil "arcsin" "Log-like") + (nil "arctan" "Log-like") + (nil "arg" "Log-like") + (?\C-c "cos" "Log-like") + (nil "cosh" "Log-like") + (nil "cot" "Log-like") + (nil "coth" "Log-like") + (nil "csc" "Log-like") + (nil "deg" "Log-like") + (?\C-d "det" "Log-like") + (nil "dim" "Log-like") + (?\C-e "exp" "Log-like") + (nil "gcd" "Log-like") + (nil "hom" "Log-like") + (?\C-_ "inf" "Log-like") + (nil "ker" "Log-like") + (nil "lg" "Log-like") + (?\C-l "lim" "Log-like") + (nil "liminf" "Log-like") + (nil "limsup" "Log-like") + (nil "ln" "Log-like") + (nil "log" "Log-like") + (nil "max" "Log-like") + (nil "min" "Log-like") + (nil "Pr" "Log-like") + (nil "sec" "Log-like") + (?\C-s "sin" "Log-like") + (nil "sinh" "Log-like") + (?\C-^ "sup" "Log-like") + (?\C-t "tan" "Log-like") + (nil "tanh" "Log-like") + (nil "uparrow" "delimiters") + (nil "Uparrow" "delimiters") + (nil "downarrow" "delimiters") + (nil "Downarrow" "delimiters") + (nil "{" "delimiters") + (nil "}" "delimiters") + (nil "updownarrow" "delimiters") + (nil "Updownarrow" "delimiters") + (nil "lfloor" "delimiters") + (nil "rfloor" "delimiters") + (nil "lceil" "delimiters") + (nil "rceil" "delimiters") + (?\( "langle" "delimiters") + (?\) "rangle" "delimiters") + (nil "backslash" "delimiters") + (nil "|" "delimiters") + (nil "rmoustache" "Delimiters") + (nil "lmoustache" "Delimiters") + (nil "rgroup" "Delimiters") + (nil "lgroup" "Delimiters") + (nil "arrowvert" "Delimiters") + (nil "Arrowvert" "Delimiters") + (nil "bracevert" "Delimiters") + (nil "widetilde" "Constructs") + (nil "widehat" "Constructs") + (nil "overleftarrow" "Constructs") + (nil "overrightarrow" "Constructs") + (nil "overline" "Constructs") + (nil "underline" "Constructs") + (nil "overbrace" "Constructs") + (nil "underbrace" "Constructs") + (nil "sqrt" "Constructs") + (nil "frac" "Constructs") + (?^ "hat" "Accents") + (nil "acute" "Accents") + (nil "bar" "Accents") + (nil "dot" "Accents") + (nil "breve" "Accents") + (nil "check" "Accents") + (nil "grave" "Accents") + (nil "vec" "Accents") + (nil "ddot" "Accents") + (?~ "tilde" "Accents") + (nil "ulcorner" ("AMS" "Hebrew")) + (nil "urcorner" ("AMS" "Hebrew")) + (nil "llcorner" ("AMS" "Hebrew")) + (nil "lrcorner" ("AMS" "Hebrew")) + (nil "dashrightarrow" ("AMS" "Arrows")) + (nil "dashleftarrow" ("AMS" "Arrows")) + (nil "leftleftarrows" ("AMS" "Arrows")) + (nil "leftrightarrows" ("AMS" "Arrows")) + (nil "Lleftarrow" ("AMS" "Arrows")) + (nil "twoheadleftarrow" ("AMS" "Arrows")) + (nil "leftarrowtail" ("AMS" "Arrows")) + (nil "looparrowleft" ("AMS" "Arrows")) + (nil "leftrightharpoons" ("AMS" "Arrows")) + (nil "curvearrowleft" ("AMS" "Arrows")) + (nil "circlearrowleft" ("AMS" "Arrows")) + (nil "Lsh" ("AMS" "Arrows")) + (nil "upuparrows" ("AMS" "Arrows")) + (nil "upharpoonleft" ("AMS" "Arrows")) + (nil "downharpoonleft" ("AMS" "Arrows")) + (nil "multimap" ("AMS" "Arrows")) + (nil "leftrightsquigarrow" ("AMS" "Arrows")) + (nil "looparrowright" ("AMS" "Arrows")) + (nil "rightleftharpoons" ("AMS" "Arrows")) + (nil "curvearrowright" ("AMS" "Arrows")) + (nil "circlearrowright" ("AMS" "Arrows")) + (nil "Rsh" ("AMS" "Arrows")) + (nil "downdownarrows" ("AMS" "Arrows")) + (nil "upharpoonright" ("AMS" "Arrows")) + (nil "downharpoonright" ("AMS" "Arrows")) + (nil "rightsquigarrow" ("AMS" "Arrows")) + (nil "nleftarrow" ("AMS" "Neg Arrows")) + (nil "nrightarrow" ("AMS" "Neg Arrows")) + (nil "nLeftarrow" ("AMS" "Neg Arrows")) + (nil "nRightarrow" ("AMS" "Neg Arrows")) + (nil "nleftrightarrow" ("AMS" "Neg Arrows")) + (nil "nLeftrightarrow" ("AMS" "Neg Arrows")) + (nil "leqq" ("AMS" "Relational I")) + (nil "leqslant" ("AMS" "Relational I")) + (nil "eqslantless" ("AMS" "Relational I")) + (nil "lesssim" ("AMS" "Relational I")) + (nil "lessapprox" ("AMS" "Relational I")) + (nil "approxeq" ("AMS" "Relational I")) + (nil "lessdot" ("AMS" "Relational I")) + (nil "lll" ("AMS" "Relational I")) + (nil "lessgtr" ("AMS" "Relational I")) + (nil "lesseqgtr" ("AMS" "Relational I")) + (nil "lesseqqgtr" ("AMS" "Relational I")) + (nil "doteqdot" ("AMS" "Relational I")) + (nil "risingdotseq" ("AMS" "Relational I")) + (nil "fallingdotseq" ("AMS" "Relational I")) + (nil "backsim" ("AMS" "Relational I")) + (nil "backsimeq" ("AMS" "Relational I")) + (nil "subseteqq" ("AMS" "Relational I")) + (nil "Subset" ("AMS" "Relational I")) + (nil "sqsubset" ("AMS" "Relational I")) + (nil "preccurlyeq" ("AMS" "Relational I")) + (nil "curlyeqprec" ("AMS" "Relational I")) + (nil "precsim" ("AMS" "Relational I")) + (nil "precapprox" ("AMS" "Relational I")) + (nil "vartriangleleft" ("AMS" "Relational I")) + (nil "trianglelefteq" ("AMS" "Relational I")) + (nil "vDash" ("AMS" "Relational I")) + (nil "Vvdash" ("AMS" "Relational I")) + (nil "smallsmile" ("AMS" "Relational I")) + (nil "smallfrown" ("AMS" "Relational I")) + (nil "bumpeq" ("AMS" "Relational I")) + (nil "Bumpeq" ("AMS" "Relational I")) + (nil "geqq" ("AMS" "Relational II")) + (nil "geqslant" ("AMS" "Relational II")) + (nil "eqslantgtr" ("AMS" "Relational II")) + (nil "gtrsim" ("AMS" "Relational II")) + (nil "gtrapprox" ("AMS" "Relational II")) + (nil "gtrdot" ("AMS" "Relational II")) + (nil "ggg" ("AMS" "Relational II")) + (nil "gtrless" ("AMS" "Relational II")) + (nil "gtreqless" ("AMS" "Relational II")) + (nil "gtreqqless" ("AMS" "Relational II")) + (nil "eqcirc" ("AMS" "Relational II")) + (nil "circeq" ("AMS" "Relational II")) + (nil "triangleq" ("AMS" "Relational II")) + (nil "thicksim" ("AMS" "Relational II")) + (nil "thickapprox" ("AMS" "Relational II")) + (nil "supseteqq" ("AMS" "Relational II")) + (nil "Supset" ("AMS" "Relational II")) + (nil "sqsupset" ("AMS" "Relational II")) + (nil "succcurlyeq" ("AMS" "Relational II")) + (nil "curlyeqsucc" ("AMS" "Relational II")) + (nil "succsim" ("AMS" "Relational II")) + (nil "succapprox" ("AMS" "Relational II")) + (nil "vartriangleright" ("AMS" "Relational II")) + (nil "trianglerighteq" ("AMS" "Relational II")) + (nil "Vdash" ("AMS" "Relational II")) + (nil "shortmid" ("AMS" "Relational II")) + (nil "shortparallel" ("AMS" "Relational II")) + (nil "between" ("AMS" "Relational II")) + (nil "pitchfork" ("AMS" "Relational II")) + (nil "varpropto" ("AMS" "Relational II")) + (nil "blacktriangleleft" ("AMS" "Relational II")) + (nil "therefore" ("AMS" "Relational II")) + (nil "backepsilon" ("AMS" "Relational II")) + (nil "blacktriangleright" ("AMS" "Relational II")) + (nil "because" ("AMS" "Relational II")) + (nil "nless" ("AMS" "Neg Rel I")) + (nil "nleq" ("AMS" "Neg Rel I")) + (nil "nleqslant" ("AMS" "Neg Rel I")) + (nil "nleqq" ("AMS" "Neg Rel I")) + (nil "lneq" ("AMS" "Neg Rel I")) + (nil "lneqq" ("AMS" "Neg Rel I")) + (nil "lvertneqq" ("AMS" "Neg Rel I")) + (nil "lnsim" ("AMS" "Neg Rel I")) + (nil "lnapprox" ("AMS" "Neg Rel I")) + (nil "nprec" ("AMS" "Neg Rel I")) + (nil "npreceq" ("AMS" "Neg Rel I")) + (nil "precnsim" ("AMS" "Neg Rel I")) + (nil "precnapprox" ("AMS" "Neg Rel I")) + (nil "nsim" ("AMS" "Neg Rel I")) + (nil "nshortmid" ("AMS" "Neg Rel I")) + (nil "nmid" ("AMS" "Neg Rel I")) + (nil "nvdash" ("AMS" "Neg Rel I")) + (nil "nvDash" ("AMS" "Neg Rel I")) + (nil "ntriangleleft" ("AMS" "Neg Rel I")) + (nil "ntrianglelefteq" ("AMS" "Neg Rel I")) + (nil "nsubseteq" ("AMS" "Neg Rel I")) + (nil "subsetneq" ("AMS" "Neg Rel I")) + (nil "varsubsetneq" ("AMS" "Neg Rel I")) + (nil "subsetneqq" ("AMS" "Neg Rel I")) + (nil "varsubsetneqq" ("AMS" "Neg Rel I")) + (nil "ngtr" ("AMS" "Neg Rel II")) + (nil "ngeq" ("AMS" "Neg Rel II")) + (nil "ngeqslant" ("AMS" "Neg Rel II")) + (nil "ngeqq" ("AMS" "Neg Rel II")) + (nil "gneq" ("AMS" "Neg Rel II")) + (nil "gneqq" ("AMS" "Neg Rel II")) + (nil "gvertneqq" ("AMS" "Neg Rel II")) + (nil "gnsim" ("AMS" "Neg Rel II")) + (nil "gnapprox" ("AMS" "Neg Rel II")) + (nil "nsucc" ("AMS" "Neg Rel II")) + (nil "nsucceq" ("AMS" "Neg Rel II")) + (nil "succnsim" ("AMS" "Neg Rel II")) + (nil "succnapprox" ("AMS" "Neg Rel II")) + (nil "ncong" ("AMS" "Neg Rel II")) + (nil "nshortparallel" ("AMS" "Neg Rel II")) + (nil "nparallel" ("AMS" "Neg Rel II")) + (nil "nvDash" ("AMS" "Neg Rel II")) + (nil "nVDash" ("AMS" "Neg Rel II")) + (nil "ntriangleright" ("AMS" "Neg Rel II")) + (nil "ntrianglerighteq" ("AMS" "Neg Rel II")) + (nil "nsupseteq" ("AMS" "Neg Rel II")) + (nil "nsupseteqq" ("AMS" "Neg Rel II")) + (nil "supsetneq" ("AMS" "Neg Rel II")) + (nil "varsupsetneq" ("AMS" "Neg Rel II")) + (nil "supsetneqq" ("AMS" "Neg Rel II")) + (nil "varsupsetneqq" ("AMS" "Neg Rel II")) + (nil "dotplus" ("AMS" "Binary Op")) + (nil "smallsetminus" ("AMS" "Binary Op")) + (nil "Cap" ("AMS" "Binary Op")) + (nil "Cup" ("AMS" "Binary Op")) + (nil "barwedge" ("AMS" "Binary Op")) + (nil "veebar" ("AMS" "Binary Op")) + (nil "doublebarwedge" ("AMS" "Binary Op")) + (nil "boxminus" ("AMS" "Binary Op")) + (nil "boxtimes" ("AMS" "Binary Op")) + (nil "boxdot" ("AMS" "Binary Op")) + (nil "boxplus" ("AMS" "Binary Op")) + (nil "divideontimes" ("AMS" "Binary Op")) + (nil "ltimes" ("AMS" "Binary Op")) + (nil "rtimes" ("AMS" "Binary Op")) + (nil "leftthreetimes" ("AMS" "Binary Op")) + (nil "rightthreetimes" ("AMS" "Binary Op")) + (nil "curlywedge" ("AMS" "Binary Op")) + (nil "curlyvee" ("AMS" "Binary Op")) + (nil "circleddash" ("AMS" "Binary Op")) + (nil "circledast" ("AMS" "Binary Op")) + (nil "circledcirc" ("AMS" "Binary Op")) + (nil "centerdot" ("AMS" "Binary Op")) + (nil "intercal" ("AMS" "Binary Op")) + (nil "hbar" ("AMS" "Misc")) + (nil "hslash" ("AMS" "Misc")) + (nil "vartriangle" ("AMS" "Misc")) + (nil "triangledown" ("AMS" "Misc")) + (nil "square" ("AMS" "Misc")) + (nil "lozenge" ("AMS" "Misc")) + (nil "circledS" ("AMS" "Misc")) + (nil "angle" ("AMS" "Misc")) + (nil "measuredangle" ("AMS" "Misc")) + (nil "nexists" ("AMS" "Misc")) + (nil "mho" ("AMS" "Misc")) + (nil "Finv" ("AMS" "Misc")) + (nil "Game" ("AMS" "Misc")) + (nil "Bbbk" ("AMS" "Misc")) + (nil "backprime" ("AMS" "Misc")) + (nil "varnothing" ("AMS" "Misc")) + (nil "blacktriangle" ("AMS" "Misc")) + (nil "blacktriangledown" ("AMS" "Misc")) + (nil "blacksquare" ("AMS" "Misc")) + (nil "blacklozenge" ("AMS" "Misc")) + (nil "bigstar" ("AMS" "Misc")) + (nil "sphericalangle" ("AMS" "Misc")) + (nil "complement" ("AMS" "Misc")) + (nil "eth" ("AMS" "Misc")) + (nil "diagup" ("AMS" "Misc")) + (nil "diagdown" ("AMS" "Misc")) + (nil "Hat" ("AMS" "Accents")) + (nil "Check" ("AMS" "Accents")) + (nil "Tilde" ("AMS" "Accents")) + (nil "Acute" ("AMS" "Accents")) + (nil "Grave" ("AMS" "Accents")) + (nil "Dot" ("AMS" "Accents")) + (nil "Ddot" ("AMS" "Accents")) + (nil "Breve" ("AMS" "Accents")) + (nil "Bar" ("AMS" "Accents")) + (nil "Vec" ("AMS" "Accents")) + (nil "dddot" ("AMS" "Accents")) + (nil "ddddot" ("AMS" "Accents")) + (nil "bigl" ("AMS" "Delimiters")) + (nil "bigr" ("AMS" "Delimiters")) + (nil "Bigl" ("AMS" "Delimiters")) + (nil "Bigr" ("AMS" "Delimiters")) + (nil "biggl" ("AMS" "Delimiters")) + (nil "biggr" ("AMS" "Delimiters")) + (nil "Biggl" ("AMS" "Delimiters")) + (nil "Biggr" ("AMS" "Delimiters")) + (nil "lvert" ("AMS" "Delimiters")) + (nil "rvert" ("AMS" "Delimiters")) + (nil "lVert" ("AMS" "Delimiters")) + (nil "rVert" ("AMS" "Delimiters")) + (nil "nobreakdash" ("AMS" "Special")) + (nil "leftroot" ("AMS" "Special")) + (nil "uproot" ("AMS" "Special")) + (nil "accentedsymbol" ("AMS" "Special")) + (nil "xleftarrow" ("AMS" "Special")) + (nil "xrightarrow" ("AMS" "Special")) + (nil "overset" ("AMS" "Special")) + (nil "underset" ("AMS" "Special")) + (nil "dfrac" ("AMS" "Special")) + (nil "genfrac" ("AMS" "Special")) + (nil "tfrac" ("AMS" "Special")) + (nil "binom" ("AMS" "Special")) + (nil "dbinom" ("AMS" "Special")) + (nil "tbinom" ("AMS" "Special")) + (nil "smash" ("AMS" "Special")) + (nil "eucal" ("AMS" "Special")) + (nil "boldsymbol" ("AMS" "Special")) + (nil "text" ("AMS" "Special")) + (nil "intertext" ("AMS" "Special")) + (nil "substack" ("AMS" "Special")) + (nil "subarray" ("AMS" "Special")) + (nil "sideset" ("AMS" "Special")))) + +(defvar LaTeX-math-abbrev-prefix "`" + "Prefix key for use in LaTeX-math-mode.") + +(defvar LaTeX-math-keymap (make-sparse-keymap) + "Keymap used for LaTeX-math-mode commands.") + +(defvar LaTeX-math-menu + '("Math" + ("Greek") ("greek") ("Binary Op") ("Relational") ("Arrows") + ("Misc Symbol") ("Var Symbol") ("Log-like") ("delimiters") + ("Delimiters") ("Constructs") ("Accents") ("AMS")) + "Menu containing LaTeX math commands. +The menu entries will be generated dynamically, but you can specify +the sequence by initializing this variable.") + +(define-key LaTeX-math-keymap + (concat LaTeX-math-abbrev-prefix LaTeX-math-abbrev-prefix) + 'LaTeX-math-insert-prefix) + +(let ((math (reverse (append LaTeX-math-list LaTeX-math-default))) + (map (lookup-key LaTeX-math-keymap LaTeX-math-abbrev-prefix))) + (while math + (let* ((entry (car math)) + (key (nth 0 entry)) + value menu name) + (setq math (cdr math)) + (if (listp (cdr entry)) + (setq value (nth 1 entry) + menu (nth 2 entry)) + (setq value (cdr entry) + menu nil)) + (if (stringp value) + (progn + (setq name (intern (concat "LaTeX-math-" value))) + (fset name (list 'lambda (list 'arg) (list 'interactive "*P") + (list 'LaTeX-math-insert value 'arg)))) + (setq name value)) + (if key + (progn + (setq key (if (numberp key) (char-to-string key) (vector key))) + (define-key map key name))) + (if menu + (let ((parent LaTeX-math-menu)) + (if (listp menu) + (progn + (while (cdr menu) + (let ((sub (assoc (car menu) LaTeX-math-menu))) + (if sub + (setq parent sub) + (setcdr parent (cons (list (car menu)) (cdr parent)))) + (setq menu (cdr menu)))) + (setq menu (car menu)))) + (let ((sub (assoc menu parent))) + (if sub + (if (stringp value) + (setcdr sub (cons (vector value name t) (cdr sub))) + (error "Cannot have multiple special math menu items")) + (setcdr parent + (cons (if (stringp value) + (list menu (vector value name t)) + (vector menu name t)) + (cdr parent)))))))))) + +(easy-menu-define LaTeX-math-mode-menu + LaTeX-math-keymap + "Menu used in math minor mode." + LaTeX-math-menu) + +(defvar LaTeX-math-mode nil + "Is LaTeX-math-mode on or off? non nil means on.") + + (make-variable-buffer-local 'LaTeX-math-mode) + +(or (assoc 'LaTeX-math-mode minor-mode-alist) + (setq minor-mode-alist (cons '(LaTeX-math-mode " Math") minor-mode-alist))) + +(or (assoc 'LaTeX-math-mode minor-mode-map-alist) + (setq minor-mode-map-alist + (cons (cons 'LaTeX-math-mode LaTeX-math-keymap) + minor-mode-map-alist))) + +(defun LaTeX-math-mode (&optional arg) + "A minor mode with easy acces to TeX math macros. + +Easy insertion of LaTeX math symbols. If you give a prefix argument, +the symbols will be surrounded by dollar signs. The following +commands are defined: + +\\{LaTeX-math-keymap}" + (interactive "P") + (setq LaTeX-math-mode + (not (or (and (null arg) LaTeX-math-mode) + (<= (prefix-numeric-value arg) 0)))) + (if LaTeX-math-mode + (easy-menu-add LaTeX-math-mode-menu LaTeX-math-keymap) + (easy-menu-remove LaTeX-math-mode-menu)) + (set-buffer-modified-p (buffer-modified-p))) + +(fset 'latex-math-mode 'LaTeX-math-mode) + +(defun LaTeX-math-insert-prefix () + "Insert the value of `LaTeX-math-abbrev-prefix'." + (interactive "*") + (let (LaTeX-math-mode) + (call-interactively (key-binding LaTeX-math-abbrev-prefix)))) + +(defun LaTeX-math-insert (string dollar) + ;; Inserts \STRING{}. If DOLLAR is non-nil, put $'s around it. + (if dollar (insert "$")) + (TeX-insert-macro string) + (if dollar (insert "$"))) + +(defun LaTeX-math-cal (char dollar) + "Inserts a {\\cal CHAR}. If DOLLAR is non-nil, put $'s around it." + (interactive "*c\nP") + (if dollar (insert "$")) + (if (member "latex2e" (TeX-style-list)) + (insert "\\mathcal{" (char-to-string char) "}") + (insert "{\\cal " (char-to-string char) "}")) + (if dollar (insert "$"))) + +(provide 'latex) + +;;; Keymap + +(defvar LaTeX-mode-map + (let ((map (copy-keymap TeX-mode-map))) + + ;; Standard + (define-key map "\n" 'reindent-then-newline-and-indent) + + ;; From latex.el + (define-key map "\t" 'LaTeX-indent-line) + (define-key map "\eq" 'LaTeX-fill-paragraph) ;*** Alias + ;; This key is now used by Emacs for face settings. + ;; (define-key map "\eg" 'LaTeX-fill-region) ;*** Alias + (define-key map "\e\C-e" 'LaTeX-find-matching-end) + (define-key map "\e\C-a" 'LaTeX-find-matching-begin) + + (define-key map "\C-c\C-q\C-p" 'LaTeX-fill-paragraph) + (define-key map "\C-c\C-q\C-r" 'LaTeX-fill-region) + (define-key map "\C-c\C-q\C-s" 'LaTeX-fill-section) + (define-key map "\C-c\C-q\C-e" 'LaTeX-fill-environment) + + (define-key map "\C-c." 'LaTeX-mark-environment) ;*** Dubious + (define-key map "\C-c*" 'LaTeX-mark-section) ;*** Dubious + + (define-key map "\C-c\C-e" 'LaTeX-environment) + (define-key map "\C-c\n" 'LaTeX-insert-item) + (or (key-binding "\e\r") + (define-key map "\e\r" 'LaTeX-insert-item)) ;*** Alias + (define-key map "\C-c]" 'LaTeX-close-environment) + (define-key map "\C-c\C-s" 'LaTeX-section) + + ;; Outline commands... + ;; We want to use the right prefix, if possible. + (let ((outline (cond ((not (boundp 'outline-minor-mode-prefix)) + (lookup-key map "\C-c")) + ((keymapp (lookup-key map outline-minor-mode-prefix)) + (lookup-key map outline-minor-mode-prefix)) + (t + (define-key map + outline-minor-mode-prefix (make-sparse-keymap)) + (lookup-key map outline-minor-mode-prefix))))) + (define-key outline "\C-z" 'LaTeX-hide-environment) + (define-key outline "\C-x" 'LaTeX-show-environment)) + + (define-key map "\C-c~" 'LaTeX-math-mode) ;*** Dubious + + map) + "Keymap used in LaTeX-mode.") + +(defvar LaTeX-environment-menu-name "Insert Environment (C-c C-e)") + +(defun LaTeX-environment-menu-entry (entry) + ;; Create an entry for the environment menu. + (vector (car entry) (list 'LaTeX-environment-menu (car entry)) t)) + +(defvar LaTeX-environment-modify-menu-name "Change Environment (C-u C-c C-e)") + +(defun LaTeX-environment-modify-menu-entry (entry) + ;; Create an entry for the change environment menu. + (vector (car entry) (list 'LaTeX-modify-environment (car entry)) t)) + +(defun LaTeX-section-enable-symbol (LEVEL) + ;; Symbol used to enable section LEVEL in the menu bar. + (intern (concat "LaTeX-section-" (int-to-string (nth 1 entry)) "-enable"))) + +(defun LaTeX-section-enable (entry) + ;; Enable or disable section ENTRY from LaTeX-section-list. + (let ((level (nth 1 entry))) + (set (LaTeX-section-enable-symbol level) + (>= level LaTeX-largest-level)))) + +(defun LaTeX-section-menu (level) + ;; Insert section from menu. + (let ((LaTeX-section-hook (delq 'LaTeX-section-heading + (copy-sequence LaTeX-section-hook)))) + (LaTeX-section level))) + +(defun LaTeX-section-menu-entry (entry) + ;; Create an entry for the section menu. + (let ((enable (LaTeX-section-enable-symbol (nth 1 entry)))) + (set enable t) + (vector (car entry) (list 'LaTeX-section-menu (nth 1 entry)) enable))) + +(defun LaTeX-section-menu-create () + ;; Create a menu over LaTeX sections. + (append '("Section (C-c C-s)") + (mapcar 'LaTeX-section-menu-entry LaTeX-section-list))) + +(defvar LaTeX-menu-changed nil) +;; Need to update LaTeX menu. +(make-variable-buffer-local 'LaTeX-menu-changed) + +(defun LaTeX-menu-update () + ;; Update entries on AUC TeX menu. + (or (not (eq major-mode 'latex-mode)) + (null LaTeX-menu-changed) + (not (fboundp 'easy-menu-change)) + (progn + (TeX-update-style) + (setq LaTeX-menu-changed nil) + (message "Updating section menu...") + (mapcar 'LaTeX-section-enable LaTeX-section-list) + (message "Updating environment menu...") + (easy-menu-change '("LaTeX") LaTeX-environment-menu-name + (mapcar 'LaTeX-environment-menu-entry + (LaTeX-environment-list))) + (message "Updating modify environment menu...") + (easy-menu-change '("LaTeX") LaTeX-environment-modify-menu-name + (mapcar 'LaTeX-environment-modify-menu-entry + (LaTeX-environment-list))) + (message "Updating...done")))) + +(add-hook 'activate-menubar-hook 'LaTeX-menu-update) + +(easy-menu-define LaTeX-mode-menu + LaTeX-mode-map + "Menu used in LaTeX mode." + (list "LaTeX" + (list LaTeX-environment-menu-name "Bug.") + (list LaTeX-environment-modify-menu-name "Bug.") + (LaTeX-section-menu-create) + ["Macro..." TeX-insert-macro t] + ["Complete" TeX-complete-symbol t] + ["Item" LaTeX-insert-item t] + (list "Insert Font" + ["Emphasize" (TeX-font nil ?\C-e) :keys "C-c C-f C-e"] + ["Bold" (TeX-font nil ?\C-b) :keys "C-c C-f C-b"] + ["Typewriter" (TeX-font nil ?\C-t) :keys "C-c C-f C-t"] + ["Small Caps" (TeX-font nil ?\C-c) :keys "C-c C-f C-c"] + ["Sans Serif" (TeX-font nil ?\C-f) :keys "C-c C-f C-f"] + ["Italic" (TeX-font nil ?\C-i) :keys "C-c C-f C-i"] + ["Slanted" (TeX-font nil ?\C-s) :keys "C-c C-f C-s"] + ["Roman" (TeX-font nil ?\C-r) :keys "C-c C-f C-r"]) + (list "Change Font" + ["Emphasize" (TeX-font t ?\C-e) :keys "C-u C-c C-f C-e"] + ["Bold" (TeX-font t ?\C-b) :keys "C-u C-c C-f C-b"] + ["Typewriter" (TeX-font t ?\C-t) :keys "C-u C-c C-f C-t"] + ["Small Caps" (TeX-font t ?\C-c) :keys "C-u C-c C-f C-c"] + ["Sans Serif" (TeX-font t ?\C-f) :keys "C-u C-c C-f C-f"] + ["Italic" (TeX-font t ?\C-i) :keys "C-u C-c C-f C-i"] + ["Slanted" (TeX-font t ?\C-s) :keys "C-u C-c C-f C-s"] + ["Roman" (TeX-font t ?\C-r) :keys "C-u C-c C-f C-r"]) + ["Delete Font" (TeX-font t ?\C-d) :keys "C-c C-f C-d"] + "-" + ["Next Error" TeX-next-error t] + (list "TeX Output" + ["Kill Job" TeX-kill-job t] + ["Debug Bad Boxes" TeX-toggle-debug-boxes + :style toggle :selected TeX-debug-bad-boxes ] + ["Switch to Original File" TeX-home-buffer t] + ["Recenter Output Buffer" TeX-recenter-output-buffer t]) + (list "Formatting and Marking" + ["Format Environment" LaTeX-fill-environment t] + ["Format Paragraph" LaTeX-fill-paragraph t] + ["Format Region" LaTeX-fill-region t] + ["Format Section" LaTeX-fill-section t] + ["Mark Environment" LaTeX-mark-environment t] + ["Mark Section" LaTeX-mark-section t] + ["Beginning of Environment" LaTeX-find-matching-begin t] + ["End of Environment" LaTeX-find-matching-end t] + ["Hide Environment" LaTeX-hide-environment t] + ["Show Environment" LaTeX-show-environment t]) + (list "Miscellaneous" + ["Uncomment Region" TeX-un-comment-region t] + ["Comment Region" TeX-comment-region t] + ["Switch to Master file" TeX-home-buffer t] + ["Save Document" TeX-save-document t] + ["Math Mode" LaTeX-math-mode + :style toggle :selected LaTeX-math-mode ] + ["Documentation" TeX-goto-info-page t] + ["Submit bug report" TeX-submit-bug-report t] + [ "Convert 209 to 2e" LaTeX-209-to-2e + :active (member "latex2" (TeX-style-list)) ] + ["Reset Buffer" TeX-normal-mode t] + ["Reset AUC TeX" (TeX-normal-mode t) :keys "C-u C-c C-n"]))) + +(defvar LaTeX-font-list + '((?\C-b "\\textbf{" "}") + (?\C-c "\\textsc{" "}") + (?\C-e "\\emph{" "}") + (?\C-f "\\textsf{" "}") + (?\C-i "\\textit{" "}") + (?\C-m "\\textmd{" "}") + (?\C-n "\\textnormal{" "}") + (?\C-r "\\textrm{" "}") + (?\C-s "\\textsl{" "}") + (?\C-t "\\texttt{" "}") + (?\C-u "\\textup{" "}") + (?\C-d "" "" t)) + "Font commands used with LaTeX2e. See `TeX-font-list'.") + +;;; Mode + +(defvar TeX-arg-cite-note-p nil + "*If non-nil, ask for optional note in citations.") + +(defvar TeX-arg-footnote-number-p nil + "*If non-nil, ask for optional number in footnotes.") + +(defvar TeX-arg-item-label-p nil + "*If non-nil, always ask for optional label in items. +Otherwise, only ask in description environments.") + +(defvar TeX-arg-right-insert-p t + "*If non-nil, always insert automatically the corresponding +\\right if \\left is inserted.") + +(defvar LaTeX-paragraph-commands + (concat "\\[\\|\\]\\|" ; display math delimitors + "begin\\b\\|end\\b\\|part\\b\\|chapter\\b\\|label\\b\\|" + "caption\\b\\|section\\b\\|subsection\\b\\|subsubsection\\b\\|" + "par\\b\\|noindent\\b\\|paragraph\\b\\|include\\b\\|" + "includeonly\\b\\|tableofcontents\\b\\|appendix\\b") + "Regexp matching names of LaTeX macros that should have their own line.") + +;;; Do not ;;;###autoload because of conflict with standard tex-mode.el. +(defun latex-mode () + "Major mode for editing files of input for LaTeX. +See info under AUC TeX for full documentation. + +Special commands: +\\{LaTeX-mode-map} + +Entering LaTeX mode calls the value of text-mode-hook, +then the value of TeX-mode-hook, and then the value +of LaTeX-mode-hook." + (interactive) + (LaTeX-common-initialization) + (setq mode-name "LaTeX") + (setq major-mode 'latex-mode) + (setq TeX-command-default "LaTeX") + (run-hooks 'text-mode-hook 'TeX-mode-hook 'LaTeX-mode-hook) + + ;; Defeat filladapt if auto-fill-mode is set in text-mode-hook. + (and (boundp 'filladapt-function-table) + (boundp 'auto-fill-function) + (eq auto-fill-function 'do-auto-fill) + (setq auto-fill-function + (cdr (assoc 'do-auto-fill filladapt-function-table))))) + +(defvar LaTeX-header-end + (concat (regexp-quote TeX-esc) "begin *" TeX-grop "document" TeX-grcl) + "Default end of header marker for LaTeX documents.") + +(defvar LaTeX-trailer-start + (concat (regexp-quote TeX-esc) "end *" TeX-grop "document" TeX-grcl) + "Default start of trailer marker for LaTeX documents.") + +(defun LaTeX2e-font-replace (start end) + "Replace LaTeX2e font specification around point with START and END." + (save-excursion + (catch 'done + (while t + (if (/= ?\\ (following-char)) + (skip-chars-backward "a-zA-Z ")) + (skip-chars-backward "\\\\") + (if (looking-at "\\\\\\(emph\\|text[a-z]+\\){") + (throw 'done t) + (up-list -1)))) + (forward-sexp 2) + (save-excursion + (replace-match start t t)) + (delete-backward-char 1) + (insert end))) + +(defun LaTeX-common-initialization () + ;; Common initialization for LaTeX derived modes. + (VirTeX-common-initialization) + (set-syntax-table LaTeX-mode-syntax-table) + (make-local-variable 'indent-line-function) + (setq indent-line-function 'LaTeX-indent-line) + (use-local-map LaTeX-mode-map) + (easy-menu-add TeX-mode-menu LaTeX-mode-map) + (easy-menu-add LaTeX-mode-menu LaTeX-mode-map) + + (or LaTeX-largest-level + (setq LaTeX-largest-level (LaTeX-section-level "section"))) + + (setq TeX-header-end LaTeX-header-end + TeX-trailer-start LaTeX-trailer-start) + + (require 'outline) + (make-local-variable 'outline-level) + (setq outline-level 'LaTeX-outline-level) + (make-local-variable 'outline-regexp) + (setq outline-regexp (LaTeX-outline-regexp t)) + + (make-local-variable 'TeX-auto-full-regexp-list) + (setq TeX-auto-full-regexp-list + (append LaTeX-auto-regexp-list plain-TeX-auto-regexp-list)) + + (setq paragraph-start + (concat + "\\(" + "^.*[^" TeX-esc "\n]%.*$\\|" + "^%.*$\\|" + "^[ \t]*$\\|" + "^[ \t]*" + (regexp-quote TeX-esc) + "\\(" + LaTeX-paragraph-commands + "\\|item\\b" + "\\)" + "\\|" + "^[ \t]*\\$\\$" ; display math delimitor + "\\)" )) + (setq paragraph-separate + (concat + "\\(" + "^.*[^" TeX-esc "\n]%.*$\\|" + "^%.*$\\|" + "^[ \t]*$\\|" + "^[ \t]*" + (regexp-quote TeX-esc) + "\\(" + LaTeX-paragraph-commands + "\\)" + "\\)")) + (setq selective-display t) + + (make-local-variable 'LaTeX-item-list) + (setq LaTeX-item-list '(("description" . LaTeX-item-argument) + ("thebibliography" . LaTeX-item-bib))) + + (setq TeX-complete-list + (append '(("\\\\cite\\[[^]\n\r\\%]*\\]{\\([^{}\n\r\\%,]*\\)" + 1 LaTeX-bibitem-list "}") + ("\\\\cite{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-bibitem-list "}") + ("\\\\cite{\\([^{}\n\r\\%]*,\\)\\([^{}\n\r\\%,]*\\)" + 2 LaTeX-bibitem-list) + ("\\\\nocite{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-bibitem-list "}") + ("\\\\nocite{\\([^{}\n\r\\%]*,\\)\\([^{}\n\r\\%,]*\\)" + 2 LaTeX-bibitem-list) + ("\\\\ref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}") + ("\\\\eqref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}") + ("\\\\pageref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}") + ("\\\\begin{\\([A-Za-z]*\\)" 1 LaTeX-environment-list "}") + ("\\\\end{\\([A-Za-z]*\\)" 1 LaTeX-environment-list "}") + ("\\\\renewcommand{\\\\\\([A-Za-z]*\\)" + 1 LaTeX-symbol-list "}") + ("\\\\renewenvironment{\\([A-Za-z]*\\)" + 1 LaTeX-environment-list "}")) + TeX-complete-list)) + + (LaTeX-add-environments + '("document" LaTeX-env-document) + '("enumerate" LaTeX-env-item) + '("itemize" LaTeX-env-item) + '("list" LaTeX-env-list) + '("trivlist" LaTeX-env-item) + '("picture" LaTeX-env-picture) + '("tabular" LaTeX-env-array) + '("tabular*" LaTeX-env-array) + '("array" LaTeX-env-array) + '("eqnarray" LaTeX-env-label) + '("equation" LaTeX-env-label) + '("minipage" LaTeX-env-minipage) + + ;; The following have no special support, but are included in + ;; case the auto files are missing. + + "sloppypar" "picture" "tabbing" "verbatim" "verbatim*" + "flushright" "flushleft" "displaymath" "math" "quote" "quotation" + "abstract" "center" "titlepage" "verse" "eqnarray*" + + ;; The following are not defined in latex.el, but in a number of + ;; other style files. I'm to lazy to copy them to all the + ;; corresponding .el files right now. + + ;; This means that AUC TeX will complete e.g. + ;; ``thebibliography'' in a letter, but I guess we can live with + ;; that. + + '("description" LaTeX-env-item) + '("figure" LaTeX-env-figure) + '("figure*" LaTeX-env-figure) + '("table" LaTeX-env-figure) + '("table*" LaTeX-env-figure) + '("thebibliography" LaTeX-env-bib) + '("theindex" LaTeX-env-item)) + + (TeX-add-symbols + '("addtocounter" TeX-arg-counter "Value") + '("alph" TeX-arg-counter) + '("arabic" TeX-arg-counter) + '("fnsymbol" TeX-arg-define-counter) + '("newcounter" TeX-arg-define-counter + [ TeX-arg-counter "Within counter" ]) + '("roman" TeX-arg-counter) + '("setcounter" TeX-arg-counter "Value") + '("usecounter" TeX-arg-counter) + '("value" TeX-arg-counter) + '("stepcounter" TeX-arg-counter) + '("refstepcounter" TeX-arg-counter) + '("label" TeX-arg-define-label) + '("pageref" TeX-arg-label) + '("ref" TeX-arg-label) + '("newcommand" TeX-arg-define-macro [ "Number of arguments" ] t) + '("renewcommand" TeX-arg-macro [ "Number of arguments" ] t) + '("newenvironment" TeX-arg-define-environment + [ "Number of arguments"] t t) + '("renewenvironment" TeX-arg-environment + [ "Number of arguments"] t t) + '("newtheorem" TeX-arg-define-environment + [ TeX-arg-environment "Numbered like" ] + t [ (TeX-arg-eval progn (if (eq (save-excursion + (backward-char 2) + (preceding-char)) ?\]) + () + (TeX-arg-counter t "Within counter")) + "") ]) + '("newfont" TeX-arg-define-macro t) + '("circle" "Diameter") + '("circle*" "Diameter") + '("dashbox" "Dash Length" TeX-arg-size + [ TeX-arg-corner ] t) + '("frame" t) + '("framebox" (TeX-arg-conditional + (string-equal (LaTeX-current-environment) "picture") + (TeX-arg-size [ TeX-arg-corner ] t) + ([ "Length" ] [ TeX-arg-lr ] t))) + '("line" (TeX-arg-pair "X slope" "Y slope") "Length") + '("linethickness" "Dimension") + '("makebox" (TeX-arg-conditional + (string-equal (LaTeX-current-environment) "picture") + (TeX-arg-size [ TeX-arg-corner ] t) + ([ "Length" ] [ TeX-arg-lr ] t))) + '("multiput" + TeX-arg-coordinate + (TeX-arg-pair "X delta" "Y delta") + "Number of copies" + t) + '("oval" TeX-arg-size [ TeX-arg-corner "Portion" ]) + '("put" TeX-arg-coordinate t) + '("savebox" TeX-arg-define-savebox + (TeX-arg-conditional + (string-equal (LaTeX-current-environment) "picture") + (TeX-arg-size [ TeX-arg-corner ] t) + ([ "Length" ] [ TeX-arg-lr ] t))) + '("shortstack" [ TeX-arg-lr ] t) + '("vector" (TeX-arg-pair "X slope" "Y slope") "Length") + '("cline" "Span `i-j'") + '("multicolumn" "Columns" "Position" t) + '("item" + (TeX-arg-conditional (or TeX-arg-item-label-p + (string-equal (LaTeX-current-environment) + "description")) + ([ "Item label" ]) + ()) + (TeX-arg-literal " ")) + '("bibitem" [ "Bibitem label" ] TeX-arg-define-cite) + '("cite" + (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) ()) + TeX-arg-cite) + '("nocite" TeX-arg-cite) + '("bibliographystyle" TeX-arg-bibstyle) + '("bibliography" TeX-arg-bibliography) + '("footnote" + (TeX-arg-conditional TeX-arg-footnote-number-p ([ "Number" ]) nil) + t) + '("footnotetext" + (TeX-arg-conditional TeX-arg-footnote-number-p ([ "Number" ]) nil) + t) + '("footnotemark" + (TeX-arg-conditional TeX-arg-footnote-number-p ([ "Number" ]) nil)) + '("newlength" TeX-arg-define-macro) + '("setlength" TeX-arg-macro "Length") + '("addtolength" TeX-arg-macro "Length") + '("settowidth" TeX-arg-macro t) + '("\\" [ "Space" ]) + '("\\*" [ "Space" ]) + '("hyphenation" t) + '("linebreak" [ "How much [0 - 4]" ]) + '("nolinebreak" [ "How much [0 - 4]" ]) + '("nopagebreak" [ "How much [0 - 4]" ]) + '("pagebreak" [ "How much [0 - 4]" ]) + '("stackrel" t nil) + '("frac" t nil) + '("lefteqn" t) + '("overbrace" t) + '("overline" t) + '("sqrt" [ "Root" ] t) + '("underbrace" t) + '("underline" t) + '("author" t) + '("date" t) + '("thanks" t) + '("title" t) + '("pagenumbering" (TeX-arg-eval + completing-read "Numbering style: " + '(("arabic") ("roman") ("Roman") ("alph") ("Alph")))) + '("pagestyle" TeX-arg-pagestyle) + '("markboth" t nil) + '("markright" t) + '("thispagestyle" TeX-arg-pagestyle) + '("addvspace" "Length") + '("fbox" t) + '("hspace*" "Length") + '("hspace" "Length") + '("mbox" t) + '("newsavebox" TeX-arg-define-savebox) + '("parbox" [ TeX-arg-tb] "Width" t) + '("raisebox" "Raise" [ "Height above" ] [ "Depth below" ] t) + '("rule" [ "Raise" ] "Width" "Thickness") + '("sbox" TeX-arg-define-savebox t) + '("usebox" TeX-arg-savebox) + '("vspace*" "Length") + '("vspace" "Length") + '("documentstyle" TeX-arg-document) + '("include" (TeX-arg-input-file "File" t)) + '("includeonly" t) + '("input" TeX-arg-input-file) + '("addcontentsline" TeX-arg-file + (TeX-arg-eval + completing-read "Numbering style: " LaTeX-section-list) + t) + '("addtocontents" TeX-arg-file t) + '("typeout" t) + '("typein" [ TeX-arg-define-macro ] t) + '("verb" TeX-arg-verb) + '("verb*" TeX-arg-verb) + '("extracolsep" t) + '("index" t) + '("glossary" t) + '("numberline" "Section number" "Heading") + '("caption" t) + '("marginpar" [ "Left margin text" ] "Text") + '("left" TeX-arg-insert-braces) + + ;; These have no special support, but are included in case the + ;; auto files are missing. + + "LaTeX" "SLiTeX" "samepage" "newline" "smallskip" "medskip" + "bigskip" "stretch" "nonumber" "centering" "raggedright" + "raggedleft" "kill" "pushtabs" "poptabs" "protect" "arraystretch" + "hline" "vline" "cline" "thinlines" "thicklines" "and" "makeindex" + "makeglossary" "reversemarginpar" "normalmarginpar" + "raggedbottom" "flushbottom" "sloppy" "fussy" "newpage" + "clearpage" "cleardoublepage" "twocolumn" "onecolumn") + + (TeX-run-style-hooks "LATEX") + + (make-local-variable 'TeX-font-list) + (make-local-variable 'TeX-font-replace-function) + (if (string-equal LaTeX-version "2") + () + (setq TeX-font-list LaTeX-font-list) + (setq TeX-font-replace-function 'LaTeX2e-font-replace) + (TeX-add-symbols + '("newcommand" TeX-arg-define-macro + [ "Number of arguments" ] [ "Default value for first argument" ] t) + '("renewcommand" TeX-arg-macro + [ "Number of arguments" ] [ "Default value for first argument" ] t) + '("usepackage" [ "Options" ] (TeX-arg-input-file "Package")) + '("documentclass" TeX-arg-document))) + + (TeX-add-style-hook "latex2e" + ;; Use new fonts for `\documentclass' documents. + (function (lambda () + (setq TeX-font-list LaTeX-font-list) + (setq TeX-font-replace-function 'LaTeX2e-font-replace) + (if (equal LaTeX-version "2") + (setq TeX-command-default "LaTeX2e")) + (run-hooks 'LaTeX2e-hook)))) + + (TeX-add-style-hook "latex2" + ;; Use old fonts for `\documentstyle' documents. + (function (lambda () + (setq TeX-font-list (default-value 'TeX-font-list)) + (setq TeX-font-replace-function + (default-value 'TeX-font-replace-function)) + (run-hooks 'LaTeX2-hook))))) + +(defvar LaTeX-builtin-opts + '("12pt" "11pt" "10pt" "twocolumn" "twoside" "draft") + "Built in options for LaTeX standard styles") + +(defun LaTeX-209-to-2e () + "Make a stab at changing 2.09 doc header to 2e style." + (interactive) + (TeX-home-buffer) + (let (optstr optlist 2eoptlist 2epackages docline docstyle) + (goto-char (point-min)) + (if + (search-forward-regexp + "\\documentstyle\\[\\([^]]*\\)\\]{\\([^}]*\\)}" + (point-max) t) + (setq optstr (buffer-substring (match-beginning 1) (match-end 1)) + docstyle (buffer-substring (match-beginning 2) + (match-end 2)) + optlist (TeX-split-string "," optstr)) + (if (search-forward-regexp + "\\documentstyle{\\([^}]*\\)}" + (point-max) t) + (setq docstyle (buffer-substring (match-beginning 1) + (match-end 1))) + (error "No documentstyle defined"))) + (beginning-of-line 1) + (setq docline (point)) + (insert "%%%") + (while optlist + (if (member (car optlist) LaTeX-builtin-opts) + (setq 2eoptlist (cons (car optlist) 2eoptlist)) + (setq 2epackages (cons (car optlist) 2epackages))) + (setq optlist (cdr optlist))) + ;;(message (format "%S %S" 2eoptlist 2epackages)) + (goto-char docline) + (next-line 1) + (insert "\\documentclass") + (if 2eoptlist + (insert "[" + (mapconcat (function (lambda (x) x)) + (nreverse 2eoptlist) ",") "]")) + (insert "{" docstyle "}\n") + (if 2epackages + (insert "\\usepackage{" + (mapconcat (function (lambda (x) x)) + (nreverse 2epackages) "}\n\\usepackage{") "}\n")) + (if (equal docstyle "slides") + (progn + (goto-char (point-min)) + (while (re-search-forward "\\\\blackandwhite{" nil t) + (replace-match "\\\\input{" nil nil))))) + (TeX-normal-mode nil)) + +;;; latex.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/lpath.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,8 @@ +;;; This file is only used for installing AUC TeX. +;;; It is not a part of AUC TeX itself. + +;; Make sure we get the right files. +(setq load-path (cons "." load-path) + byte-compile-warnings nil + TeX-lisp-directory "<none>") +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/multi-prompt.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,138 @@ +;;; multi-prompt.el --- completing read of multiple strings. + +;; Copyright (C) 1996, 1997 Per Abrahamsen. + +;; Author: Per Abrahamsen <abraham@dina.kvl.dk> +;; Keywords: extensions +;; Version: 0.2 +;; Bogus-Bureaucratic-Cruft: How 'bout ESR and the LCD people agreed +;; on a common format? + +;; LCD Archive Entry: +;; multi-prompt|Per Abrahamsen|abraham@dina.kvl.dk| +;; completing read of multiple strings| +;; 1996-08-31|0.1|~/functions/multi-prompt.el.Z| + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Commentary: + +;; This package is written for use in emacs lisp programs, where the +;; user is prompted for a string of the form: +;; +;; FOO,BAR,BAZ +;; +;; where FOO, BAR, and BAZ are elements of some table. The function +;; `multi-prompt' is a replacement `completing-read' that will allow +;; the user to enter a string like the above, yet get completion on +;; both FOO, BAR, and BAZ. + +;;; Change Log: +;; +;; Sat Feb 15 17:58:31 MET 1997 +;; * Version 0.2 released. +;; Renamed predicate to `mp-predicate'. +;; Sat Aug 31 18:32:20 MET DST 1996 +;; * Version 0.1 released. +;; Fixed `predicate' bug. +;; Added provide. +;; Added `multi-prompt-found' variable. +;; Sat Aug 31 16:29:14 MET DST 1996 +;; * Created. + +;;; Code: + +(provide 'multi-prompt) + +(defvar multi-prompt-found nil + "List of entries currently added during a `multi-prompt'.") + +(defun multi-prompt (separator + unique prompt table + &optional mp-predicate require-match initial history) + "Completing prompt for a list of strings. +The first argument SEPARATOR should be the string (of length 1) to +separate the elements in the list. The second argument UNIQUE should +be non-nil, if each element must be unique. The remaining elements +are the arguments to `completing-read'. See that." + (let ((old-map (if require-match + minibuffer-local-must-match-map + minibuffer-local-completion-map)) + (new-map (make-sparse-keymap))) + (if (fboundp 'set-keymap-parent) + ;; `set-keymap-parent' was introduced in Emacs 19.32. + (set-keymap-parent new-map old-map) + (setq new-map (copy-keymap old-map))) + (define-key new-map separator (if require-match + 'multi-prompt-next-must-match + 'multi-prompt-next)) + (define-key new-map "\C-?" 'multi-prompt-delete) + (let* ((minibuffer-local-completion-map new-map) + (minibuffer-local-must-match-map new-map) + (multi-prompt-found nil) + (done nil) + (filter (cond (unique + (lambda (x) + (and (not (member (car x) multi-prompt-found)) + (or (null mp-predicate) + (funcall mp-predicate x))))) + (mp-predicate))) + (answer (catch 'multi-prompt-exit + (while t + (let ((extra (catch 'multi-prompt-next + (throw 'multi-prompt-exit + (completing-read prompt + table + filter + require-match + initial + history))))) + (cond ((eq extra 'back) + (when multi-prompt-found + (setq prompt (substring + prompt 0 + (- 0 (length separator) + (length + (car multi-prompt-found)))) + initial (car multi-prompt-found)) + (setq multi-prompt-found + (cdr multi-prompt-found)))) + (t + (setq prompt (concat prompt extra separator) + initial nil) + (setq multi-prompt-found + (cons extra multi-prompt-found))))))))) + (if answer + (nreverse (cons answer multi-prompt-found)) + multi-prompt-found)))) + +(defun multi-prompt-delete () + (interactive) + (if (bobp) + (throw 'multi-prompt-next 'back) + (call-interactively 'backward-delete-char))) + +(defun multi-prompt-next () + (interactive) + (throw 'multi-prompt-next + (buffer-substring-no-properties (point-min) (point-max)))) + +(defun multi-prompt-next-must-match () + (interactive) + (if (call-interactively 'minibuffer-complete) + (throw 'multi-prompt-next + (buffer-substring-no-properties (point-min) (point-max))))) + +;;; multi-prompt.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/amsart.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,10 @@ +;;; amsart.el --- AMS article style hook. + +;;; Code: + +(TeX-add-style-hook "amsart" + (function + (lambda () + (TeX-run-style-hooks "amstex")))) + +;;; amsart.el ends here.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/amsbook.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,10 @@ +;;; amsbook.el --- AMS book style hook. + +;;; Code: + +(TeX-add-style-hook "amsbook" + (function + (lambda () + (TeX-run-style-hooks "amstex")))) + +;;; amsbook.el ends here.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/amstex.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,11 @@ +;;; amstex.el --- AMS LaTeX support. + +;;; Code: + +(TeX-add-style-hook "amstex" + (function + (lambda () + (TeX-add-symbols + '("eqref" TeX-arg-label))))) + +;;; amstex.el ends here.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/article.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,11 @@ +;;; article.el - Special code for article style. + +;; $Id: article.el,v 1.1 1997/02/20 02:15:41 steve Exp $ + +;;; Code: + +(TeX-add-style-hook "article" + (function (lambda () + (setq LaTeX-largest-level (LaTeX-section-level "section"))))) + +;;; article.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/book.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,11 @@ +;;; book.el - Special code for book style. + +;; $Id: book.el,v 1.1 1997/02/20 02:15:41 steve Exp $ + +;;; Code: + +(TeX-add-style-hook "book" + (function (lambda () + (setq LaTeX-largest-level (LaTeX-section-level "chapter"))))) + +;;; book.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/dinbrief.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,163 @@ +;;; dinbrief.el - Special code for LaTeX-Style dinbrief. + +;; Contributed by Werner Fink <tex@itap.physik.uni-stuttgart.de> +;; Please direct comments to him. + +;;; Commentary: + +;; LaTeX-Style: dinbrief.sty +;; Server: rusinfo.rus.uni-stuttgart.de +;; Directory: /pub/soft/tex/macros/latex/contrib/letters + +;;; Code: + +(TeX-add-style-hook "dinbrief" + (function + (lambda () + (LaTeX-add-environments + '("letter" LaTeX-recipient-hook)) + (TeX-add-symbols + '("Absender" "Absender: ") + '("Postvermerk" "Postvermerk: ") + '("Datum" "Datum: ") + '("Betreff" "Betreff: ") + '("Behandlungsvermerk" "Behandlungsvermerk: ") + '("Verteiler" "Verteiler: ") + "makelabel" "Retourlabel" + '("Anlagen" "Anlagen: ") + '("Fenster" "Fenster \(ja/nein\): ") + '("Retouradresse" "Retouradresse: ") + '("signature" "Unterschrift: ") + '("opening" "Anrede: ") + '("closing" "Schlu\"s: "))))) + +(defun LaTeX-recipient-hook (environment) + "Insert ENVIRONMENT and prompt for recipient and address." + (let ((sender (read-input "Absender: " (user-full-name))) + (recipient (read-input "Empf\"anger: ")) + (address (read-input "Anschrift: ")) + (postvermerk (read-input "Postvermerk: ")) + (date (read-input "Datum: " (LaTeX-today))) + (betreff (read-input "Betreff: ")) + (vermerk (read-input "Behandlungsvermerk: ")) + (verteil (read-input "Verteiler: ")) + (anlage (read-input "Anlagen: ")) + (opening (read-input "Anrede: ")) + (closing (read-input "Schlu\"s: ")) + (fenster (read-input "Fenster \(ja/nein\): ")) + (signature (read-input "Unterschrift: ")) + ) + + (if (not (zerop (length sender))) + (progn + (insert TeX-esc "Absender" TeX-grop sender TeX-grcl) + (newline-and-indent))) + (if (not (zerop (length postvermerk))) + (progn + (insert TeX-esc "Postvermerk" TeX-grop postvermerk TeX-grcl) + (newline-and-indent))) + (if (not (zerop (length betreff))) + (progn + (insert TeX-esc "Betreff" TeX-grop betreff TeX-grcl) + (newline-and-indent))) + (if (not (zerop (length vermerk))) + (progn + (insert TeX-esc "Behandlungsvermerk" TeX-grop vermerk TeX-grcl) + (newline-and-indent))) + (if (not (zerop (length verteil))) + (progn + (insert TeX-esc "Verteiler" TeX-grop verteil TeX-grcl) + (newline-and-indent))) + (if (not (zerop (length anlage))) + (progn + (insert TeX-esc "Anlagen" TeX-grop anlage TeX-grcl) + (newline-and-indent))) + (if (string= fenster "ja") + (progn + (insert TeX-esc "Fenster") + (let ((retouradr (read-input "Retouradresse: " (user-full-name)))) + (newline-and-indent) + (if (not (zerop (length retouradr))) + (progn + (insert TeX-esc "Retouradresse" TeX-grop retouradr TeX-grcl) + (newline-and-indent)))))) + (if (not (zerop (length signature))) + (progn + (insert TeX-esc "signature" TeX-grop signature TeX-grcl) + (newline-and-indent))) + (if (not (zerop (length date))) + (progn + (insert TeX-esc "Datum" TeX-grop date TeX-grcl) + (newline-and-indent))) + (newline-and-indent) + + (let ((indentation (current-column))) + (LaTeX-insert-environment + environment + (concat TeX-grop recipient + (if (not (zerop (length address))) + (concat + (if (not (zerop (length recipient))) + (concat " " TeX-esc TeX-esc " ")) + address)) + TeX-grcl)) + (save-excursion ; Fix indentation of address + (if (search-backward TeX-grcl nil 'move) + (let ((addr-end (point-marker))) + (if (search-backward TeX-grop nil 'move) + (let ((addr-column (current-column))) + (while (search-forward + (concat TeX-esc TeX-esc) + (marker-position addr-end) 'move) + (progn + (newline) + (indent-to addr-column)))))))) + (insert "\n") + (indent-to indentation)) + (insert TeX-esc "opening" + TeX-grop + (if (zerop (length opening)) + (concat TeX-esc " ") + opening) + TeX-grcl "\n") + + (indent-relative-maybe) + (save-excursion + (insert "\n" TeX-esc "closing" + TeX-grop + (if (zerop (length closing)) + (concat TeX-esc " ") + closing) + TeX-grcl "\n") + (indent-relative-maybe)))) + +(defun LaTeX-today nil + "Return a string representing todays date according to flavor." + (interactive) + (let ((ctime-string (current-time-string)) + (month-alist '(("Jan" . "Januar") + ("Feb" . "Februar") + ("Mar" . "M\\\"arz") + ("Apr" . "April") + ("May" . "Mai") + ("Jun" . "Juni") + ("Jul" . "Juli") + ("Aug" . "August") + ("Sep" . "September") + ("Oct" . "Oktober") + ("Nov" . "November") + ("Dec" . "Dezember")))) + (string-match + "^\\S-+\\s-+\\(\\S-+\\)\\s-+\\(\\S-+\\)\\s-+\\S-+\\s-+\\(\\S-+\\)" + ctime-string) + (let ((year (substring ctime-string (match-beginning 3) (match-end 3))) + (month (substring ctime-string (match-beginning 1) (match-end 1))) + (day (substring ctime-string (match-beginning 2) (match-end 2)))) + (if (assoc month month-alist) + (progn + (setq month (cdr (assoc month month-alist))) + (if (> 2 (length day)) + (setq day (concat "0" day))))) + (format "Stuttgart, den %s. %s %s" day month year)))) + +;;; dinbrief.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/dk.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,11 @@ +;;; dk.el - Setup AUC TeX for editing Danish text. + +;; $Id: dk.el,v 1.1 1997/02/20 02:15:42 steve Exp $ + +;;; Code: + +(TeX-add-style-hook "dk" + (function (lambda () + (run-hooks 'TeX-language-dk-hook)))) + +;;; dk.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/dutch.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,11 @@ +;;; dutch.el - Setup AUC TeX for editing Dutch text. + +;; $Id: dutch.el,v 1.1 1997/02/20 02:15:42 steve Exp $ + +;;; Code: + +(TeX-add-style-hook "dutch" + (function (lambda () + (run-hooks 'TeX-language-nl-hook)))) + +;;; dutch.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/epsf.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,96 @@ +;;; epsf.el - Support for the epsf style option. + +;; Contributed by Marc Gemis <makke@wins.uia.ac.be> + +;;; Code: + +(TeX-add-style-hook "epsf" + (function + (lambda () + (TeX-add-symbols + '("epsfsize" TeX-arg-epsfsize) + '("epsffile" TeX-arg-file) + '("epsfbox" TeX-arg-file) + "epsflly" "epsfury" "testit" "epsfgetlitbb" + "epsfnormal" "epsfgetbb" "other" "epsfsetgraph" + "PsFragSpecialArgs" "epsfaux" "testit" "epsfgrab" + "epsfllx" "epsflly" "epsfury" "epsfverbosetrue" + ) + (LaTeX-add-environments + '("epsffig" LaTeX-env-epsffigure) + ) + + ))) + + +(defun LaTeX-env-epsffigure (environment) + "Create a `figure'-environment with \\label and \\caption and \\epsfbox +commands. Eventually a `psfrags'-environment is inserted round the \\epsfbox." + + (let ((float (read-input "Float to: " LaTeX-float)) + (caption (read-input "Caption: ")) + (label (read-input "Label: " LaTeX-figure-label)) + ; gf: ask if there is an psfrag environment needed + (psfrag (y-or-n-p "PS fragments: ")) + (psfile (read-file-name "EPS-file: " "" "" nil)) + ) + + (setq LaTeX-float (if (zerop (length float)) + LaTeX-float + float)) + + (LaTeX-insert-environment "figure" + (concat LaTeX-optop LaTeX-float LaTeX-optcl)) + (LaTeX-insert-environment "center") + (if psfrag + (progn + (LaTeX-insert-environment "psfrags") + (newline-and-indent) + )) + (if (or (zerop (length label)) + (and (string= "figure" environment) + (equal LaTeX-figure-label label)) + ) + () + (newline-and-indent) + (insert TeX-esc "label" TeX-grop label TeX-grcl) + (end-of-line 0) + (LaTeX-indent-line)) + + + (newline-and-indent) + (insert TeX-esc "leavevmode") + (newline-and-indent) + (insert TeX-esc "epsfbox" TeX-grop psfile TeX-grcl) + (if (zerop (length caption)) + () + (newline-and-indent) + (insert TeX-esc "caption" TeX-grop caption TeX-grcl)) + (newline) + (forward-line 4) + (newline) + +)) + +(defun TeX-arg-epsfsize (optional &optional prompt definition) + "Create a line that print epsf figures at a certain percentage" + (interactive) + (let ((scale (read-input "Scale (%): ")) + ) + (setq scalestr (if (zerop (length scale)) + "75" + (format "%s" scale) + )) + (save-excursion + ; append #1#{scale#1} + (insert "#1#2" TeX-grop "0." scale "#1" TeX-grcl) + ; insert \def before \epsfsize + (beginning-of-line 1) + (newline) + (insert TeX-esc "def") + (forward-line -1) + (insert "% From now on print figures at " scale "% of original size") + ) + (end-of-line))) + +;;; epsf.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/foils.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,47 @@ +;;; foils.el - Special code for FoilTeX. + +;; $Id: foils.el,v 1.1 1997/02/20 02:15:42 steve Exp $ + +;;; Code: + +(require 'latex) + +(TeX-add-style-hook "foils" + (function + (lambda () + (add-hook 'LaTeX-document-style-hook 'LaTeX-style-foils) + (setq LaTeX-default-style "foils") + (setq LaTeX-default-options '("landscape")) + (TeX-add-symbols + '("foilhead" [ "Rubric-body separation" ] "Foil rubric"))))) + +(defun LaTeX-style-foils nil + "Prompt for and insert foiltex options." + (require 'timezone) + (let* ((date (timezone-parse-date (current-time-string))) + (year (string-to-int (aref date 0))) + (month (string-to-int (aref date 1))) + (day (string-to-int (aref date 2))) + (title (read-input "Title: "))) + (save-excursion + (goto-char (point-max)) + (re-search-backward ".begin.document.") + (insert TeX-esc "title" + TeX-grop title TeX-grcl "\n") + (insert TeX-esc "author" + TeX-grop (user-full-name) TeX-grcl "\n") + (insert TeX-esc "date" TeX-grop + (format "%d-%02d-%02d" year month day) + TeX-grcl "\n") + (insert "" TeX-esc "\nMyLogo" TeX-grop TeX-grcl "\n") + (insert "%" TeX-esc "Restriction" TeX-grop TeX-grcl "\n") + (insert "%" TeX-esc "rightfooter" TeX-grop TeX-grcl "\n") + (insert "%" TeX-esc "leftheader" TeX-grop TeX-grcl "\n") + (insert "%" TeX-esc "rightheader" TeX-grop TeX-grcl "\n\n") + (re-search-forward ".begin.document.") + (end-of-line) + (newline-and-indent) + (insert "" TeX-esc "maketitle\n\n")) + (forward-line -1))) + +;;; foils.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/german.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,28 @@ +;;; german.el - Setup AUC TeX for editing German text. + +;; $Id: german.el,v 1.1 1997/02/20 02:15:42 steve Exp $ + +;;; Commentary: +;; +;; `german.sty' use `"' to give next character an umlaut. + +;;; Code: + +(defvar LaTeX-german-mode-syntax-table + (copy-syntax-table LaTeX-mode-syntax-table) + "Syntax table used in LaTeX mode when using `german.sty'.") + +(modify-syntax-entry ?\" "w" LaTeX-german-mode-syntax-table) + +(TeX-add-style-hook "german" + (function (lambda () + (set-syntax-table LaTeX-german-mode-syntax-table) + (make-local-variable 'TeX-open-quote) + (make-local-variable 'TeX-close-quote) + (make-local-variable 'TeX-quote-after-quote) + (setq TeX-quote-after-quote t) + (setq TeX-open-quote "\"`") + (setq TeX-close-quote "\"'") + (run-hooks 'TeX-language-de-hook)))) + +;;; german.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/harvard.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,97 @@ +;; harvard.el --- Support for Harvard Citation style package for AUC-TeX + +;; Copyright (C) 1994 Berwin Turlach <berwin@core.ucl.ac.be> + +;; Version: $Id: harvard.el,v 1.1 1997/02/20 02:15:42 steve Exp $ + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 1, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Commentary: + +;; Harvard citation style is from Peter Williams available on the CTAN +;; servers + +;;; Code: + +(require 'latex) + +(TeX-add-style-hook "harvard" + (function + (lambda () + + (LaTeX-add-environments + '("thebibliography" LaTeX-env-harvardbib ignore)) + + (TeX-add-symbols + "harvardand" + '("citeasnoun" + (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) nil) + TeX-arg-cite) + '("possessivecite" + (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) nil) + TeX-arg-cite) + '("citeaffixed" + (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) nil) + TeX-arg-cite "Affix") + '("citeyear" + (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) nil) + TeX-arg-cite) + '("citename" + (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) nil) + TeX-arg-cite) + '("citationstyle" + (TeX-arg-eval completing-read "Citation style: " '(("agsm") ("dcu")))) + '("citationmode" + (TeX-arg-eval completing-read "Citation mode: " + '(("full") ("abbr") ("default")))) + '("harvardparenthesis" + (TeX-arg-eval completing-read "Harvardparenthesis: " + '(("round") ("curly") ("angle") ("square")))) + '("bibliographystyle" + (TeX-arg-eval + completing-read "Bibliography style: " + '(("agsm") ("dcu") ("jmr") ("jphysicsB") ("kluwer") ("nederlands"))) + ignore) + '("harvarditem" [ "Short citation" ] + "Complete citation" "Year" TeX-arg-define-cite)) + + (setq TeX-complete-list + (append '(("\\\\citeasnoun{\\([^{}\n\m\\%]*\\)" + 1 LaTeX-bibitem-list "}") + ("\\\\citeyear{\\([^{}\n\m\\%]*\\)" + 1 LaTeX-bibitem-list "}") + ("\\\\citename{\\([^{}\n\m\\%]*\\)" + 1 LaTeX-bibitem-list "}")) + TeX-complete-list)) + + (setq LaTeX-item-list + (cons '("thebibliography" . LaTeX-item-harvardbib) + LaTeX-item-list))))) + +(defun LaTeX-env-harvardbib (environment &optional ignore) + "Insert ENVIRONMENT with label for harvarditem." + (LaTeX-insert-environment environment + (concat TeX-grop "xx" TeX-grcl)) + (end-of-line 0) + (delete-char 1) + (delete-horizontal-space) + (LaTeX-insert-item)) + +;; Analog to LaTeX-item-bib from latex.el +(defun LaTeX-item-harvardbib () + "Insert a new harvarditem." + (TeX-insert-macro "harvarditem")) + +;; harvard.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/j-article.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,11 @@ +;;; j-article.el - Special code for j-article style. + +;; $Id: j-article.el,v 1.1 1997/02/20 02:15:42 steve Exp $ + +;;; Code: + +(TeX-add-style-hook "j-article" + (function (lambda () + (setq LaTeX-largest-level (LaTeX-section-level "section"))))) + +;;; j-article.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/j-book.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,11 @@ +;;; j-book.el - Special code for j-book style. + +;; $Id: j-book.el,v 1.1 1997/02/20 02:15:42 steve Exp $ + +;;; Code: + +(TeX-add-style-hook "j-book" + (function (lambda () (setq LaTeX-largest-level + (LaTeX-section-level "chapter"))))) + +;;; j-book.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/j-report.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,11 @@ +;;; j-report.el - Special code for j-report style. + +;; $Id: j-report.el,v 1.1 1997/02/20 02:15:42 steve Exp $ + +;;; Code: + +(TeX-add-style-hook "j-report" + (function (lambda () (setq LaTeX-largest-level + (LaTeX-section-level "chapter"))))) + +;;; j-report.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/jarticle.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,10 @@ +;;; jarticle.el - Special code for jarticle style. + +;; $Id: jarticle.el,v 1.1 1997/02/20 02:15:43 steve Exp $ + +;;; Code: + +(TeX-add-style-hook "jarticle" + (function (lambda () (setq LaTeX-largest-level 2)))) + +;;; jarticle.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/jbook.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,11 @@ +;;; jbook.el - Special code for jbook style. + +;; $Id: jbook.el,v 1.1 1997/02/20 02:15:43 steve Exp $ + +;;; Code: + +(TeX-add-style-hook "jbook" + (function (lambda () (setq LaTeX-largest-level + (LaTeX-section-level "chapter"))))) + +;;; jbook.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/jreport.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,12 @@ +;;; jreport.el - Special code for jreport style. + +;; $Id: jreport.el,v 1.1 1997/02/20 02:15:43 steve Exp $ + +;;; Code: + +(TeX-add-style-hook "jreport" + (function (lambda () (setq LaTeX-largest-level + (LaTeX-section-level "chapter"))))) + + +;;; jreport.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/latexinfo.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,183 @@ +;;; latexinfo.el - Support for LaTeXinfo files. + +;; Copyright (C) 1993 Marc Gemis <makke@wins.uia.ac.be> + +;; Author: Marc Gemis <makke@wins.uia.ac.be> +;; Version: $Id: latexinfo.el,v 1.1 1997/02/20 02:15:43 steve Exp $ + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Code: + +(require 'latex) + +;;; LaTeXinfo mode + +(defvar TeX-latexinfo-node-regexp + '("\\\\node[ \t]+\\([^,\n\r%]+\\)" 1 TeX-auto-label) + "Matches LaTeXinfo \\node commands, only current node will be found. +We ignore next, previous and up fields.") + +(defvar LaTeXinfo-mode nil + "Non-nil means LaTeXinfo minor mode is active.") + (make-variable-buffer-local 'LaTeXinfo-mode) + +(defvar LaTeXinfo-mode-map nil + "Keymap containing LaTeXinfo commands.") + +(if LaTeXinfo-mode-map + () + (setq LaTeXinfo-mode-map (make-sparse-keymap)) + (define-key LaTeXinfo-mode-map "\C-c\C-u\C-b" 'latexinfo-format-buffer) + (define-key LaTeXinfo-mode-map "\C-c\C-u\C-r" 'latexinfo-format-region) + (define-key LaTeXinfo-mode-map "\C-c\C-u\C-s" 'latexinfo-show-structure) + (define-key LaTeXinfo-mode-map "\C-c\C-ud" 'makke:latexinfo-delete-structure) + (define-key LaTeXinfo-mode-map "\C-c\C-ug" 'latexinfo-goto-node) + (define-key LaTeXinfo-mode-map "\C-c\C-ui" 'makke:latexinfo-structure)) + +(or (assq 'LaTeXinfo-mode minor-mode-map-alist) + (setq minor-mode-map-alist + (cons (cons 'LaTeXinfo-mode LaTeXinfo-mode-map) + minor-mode-map-alist))) + +(defun TeX-arg-latexinfo-index (optional &optional prompt) + "Prompt for a LaTeXinfo index type with completion." + (TeX-argument-insert + (completing-read (TeX-argument-prompt optional prompt "Index") + '(("cp") ("vr") ("fn") ("tp") ("pg") ("ky")) + nil t) + optional)) + +(defun LaTeX-item-latexinfo-menu () + "Insert a new menu item" + (insert "* ::") + (backward-char 2)) + +(defun latexinfo-goto-node () ; temporarily here, later in latexinfo-upd.el ?? + "Place pointer on the node given by the user, read node with completion +This fails when the user types in the label of something else" + (interactive) + (let ((node-name (completing-read "Goto Node: " (LaTeX-label-list)))) + (goto-char (point-min)) + (if (re-search-forward + (concat + TeX-esc "node[ \\t]+" node-name "," + "\\|" + TeX-esc "label{" LaTeX-section-label node-name + "\\|" + TeX-esc "label{" node-name + ) + (point-max) t) + (beginning-of-line 1) + (error "No such node")))) + +;;; Hook + +(TeX-add-style-hook "latexinfo" + (function + (lambda () + (require 'latexinfo) + (require 'latexinfo-structure) + + (require 'min-map) + (setq LaTeXinfo-mode t) + + (TeX-auto-add-regexp TeX-latexinfo-node-regexp) + + (TeX-add-symbols + '("node" + (TeX-arg-literal " ") + (TeX-arg-free TeX-arg-define-label "Node name") + (TeX-arg-literal ", ") + (TeX-arg-free TeX-arg-label "Next node") + (TeX-arg-literal ", ") + (TeX-arg-free TeX-arg-label "Previous node") + (TeX-arg-literal ", ") + (TeX-arg-free TeX-arg-label "Up node")) + '("setfilename" TeX-arg-file) + + '("var" t) + '("dfn" t) + '("emph" t) + '("kbd" t) + '("code" t) + '("samp" t) + '("key" t) + '("ctrl" t) + '("file" t) + + '("comment" + (TeX-arg-literal " ") + (TeX-arg-free "Comment")) + '("c" + (TeX-arg-literal " ") + (TeX-arg-free "Comment")) + + '("cindex" t) + '("cpsubindex" 2) + '("cpindexbold" t) + + '("newindex" TeX-arg-latexinfo-index) + + '("br" nil) + '("w" "Text") + '("dots" nil) + '("refill" nil) + '("bullet" nil) + '("copyright" nil) + '("sp" nil) + + '("xref" TeX-arg-label) + '("pxref" TeX-arg-label) + '("inforef" + (TeX-arg-literal "{") + (TeX-arg-free "Name of node") + (TeX-arg-literal ", ") + (TeX-arg-free "Name for note") + (TeX-arg-literal ", ") + (TeX-arg-free TeX-arg-file "Info file") + (TeX-arg-literal "}"))) + + (LaTeX-add-environments "menu" "tex" "ignore" "ifinfo" "iftex" + "example" "same" "display" "format") + + ; Menu's have a special kind of items + (make-local-variable 'LaTeX-item-list) + (setq LaTeX-item-list (cons '("menu" . LaTeX-item-latexinfo-menu) + LaTeX-item-list)) + + (make-local-variable 'TeX-font-list) + (setq TeX-font-list + (list (list ?\C-b (concat TeX-esc "b{") "}") + (list ?\C-c (concat TeX-esc "sc{") "}") + (list ?\C-e (concat TeX-esc "emph{") "}") + (list ?\C-i (concat TeX-esc "i{") "}") + (list ?\C-r (concat TeX-esc "r{") "}") + (list ?\C-s (concat TeX-esc "samp{") "}") + (list ?\C-t (concat TeX-esc "t{") "}") + (list ?s (concat TeX-esc "strong{") "}") + (list ?\C-f (concat TeX-esc "file{") "}") + (list ?\C-d (concat TeX-esc "dfn{") "}") + (list ?\C-v (concat TeX-esc "var{") "}") + (list ?k (concat TeX-esc "key{") "}") + (list ?\C-k (concat TeX-esc "kbd{") "}") + (list ?c (concat TeX-esc "code{") "}") + (list ?C (concat TeX-esc "cite{") "}"))) + + ;; need the following stuff to let xref and pxref work + (make-local-variable 'LaTeX-section-label) + (setq LaTeX-section-label "")))) + +;;; latexinfo.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/letter.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,122 @@ +;;; letter.el - Special code for letter style. + +;; $Id: letter.el,v 1.1 1997/02/20 02:15:43 steve Exp $ + +;;; Code: + +;; You may want to define this in tex-site.el to contain your +;; organizations address. +(defvar LaTeX-letter-sender-address "" + "Initial value when prompting for a sender address in the letter style.") + +(TeX-add-style-hook "letter" + (function + (lambda () + (LaTeX-add-environments + '("letter" LaTeX-env-recipient)) + (TeX-add-symbols + '("name" "Sender: ") + '("address" "Sender address: ") + '("signature" "Signature: ") + '("opening" "Opening: ") + '("closing" "Closing: "))))) + +(defun LaTeX-env-recipient (environment) + "Insert ENVIRONMENT and prompt for recipient and address." + (let ((sender (read-input "Sender: " (user-full-name))) + (sender-address (read-input "Sender address: " + LaTeX-letter-sender-address)) + (recipient (read-input "Recipient: ")) + (address (read-input "Recipient address: ")) + (signature (read-input "Signature: ")) + (opening (read-input "Opening: ")) + (closing (read-input "Closing: ")) + (date (read-input "Date: " (LaTeX-today)))) + + (insert TeX-esc "name" TeX-grop sender TeX-grcl) + (newline-and-indent) + (if (not (zerop (length sender-address))) + (progn + (setq LaTeX-letter-sender-address sender-address) + (insert TeX-esc "address" TeX-grop sender-address TeX-grcl) + (newline-and-indent))) + (if (not (zerop (length signature))) + (progn + (insert TeX-esc "signature" TeX-grop signature TeX-grcl) + (newline-and-indent))) + (if (not (zerop (length date))) + (progn + (insert TeX-esc "def" TeX-esc "today" TeX-grop date TeX-grcl) + (newline-and-indent))) + (newline-and-indent) + + (let ((indentation (current-column))) + (LaTeX-insert-environment + environment + (concat TeX-grop recipient + (if (not (zerop (length address))) + (concat + (if (not (zerop (length recipient))) + (concat " " TeX-esc TeX-esc " ")) + address)) + TeX-grcl)) + (save-excursion ; Fix indentation of address + (if (search-backward TeX-grcl nil 'move) + (let ((addr-end (point-marker))) + (if (search-backward TeX-grop nil 'move) + (let ((addr-column (current-column))) + (while (search-forward + (concat TeX-esc TeX-esc) + (marker-position addr-end) 'move) + (progn + (newline) + (indent-to addr-column)))))))) + (insert "\n") + (indent-to indentation)) + (insert TeX-esc "opening" + TeX-grop + (if (zerop (length opening)) + (concat TeX-esc " ") + opening) + TeX-grcl "\n") + + (indent-relative-maybe) + (save-excursion + (insert "\n" TeX-esc "closing" + TeX-grop + (if (zerop (length closing)) + (concat TeX-esc " ") + closing) + TeX-grcl "\n") + (indent-relative-maybe)))) + +(defun LaTeX-today nil + "Return a string representing todays date according to flavor." + (interactive) + (let ((ctime-string (current-time-string)) + (month-alist '(("Jan". "01") + ("Feb" . "02") + ("Mar" . "03") + ("Apr" . "04") + ("May" . "05") + ("Jun" . "06") + ("Jul" . "07") + ("Aug" . "08") + ("Sep" . "09") + ("Oct" . "10") + ("Nov" . "11") + ("Dec" . "12")))) + (string-match + "^\\S-+\\s-+\\(\\S-+\\)\\s-+\\(\\S-+\\)\\s-+\\S-+\\s-+\\(\\S-+\\)" + ctime-string) + (let ((year (substring ctime-string (match-beginning 3) (match-end 3))) + (month (substring ctime-string (match-beginning 1) (match-end 1))) + (day (substring ctime-string (match-beginning 2) (match-end 2)))) + (if (assoc month month-alist) + (progn + (setq month (cdr (assoc month month-alist))) + (if (> 2 (length day)) + (setq day (concat "0" day))))) + (format "%s-%s-%s" year month day)))) + +;;; letter.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/plfonts.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,31 @@ +;;; plfonts.el - Setup AUC TeX for editing Polish text with plfonts.sty + +;; $Id: plfonts.el,v 1.1 1997/02/20 02:15:43 steve Exp $ + +;;; Commentary: +;; +;; `plfonts.sty' use `"' to make next character Polish. +;; `plfonts.sty' <C> L. Holenderski, IIUW, lhol@mimuw.edu.pl + +;;; Code: + +(defvar LaTeX-plfonts-mode-syntax-table + (copy-syntax-table LaTeX-mode-syntax-table) + "Syntax table used in LaTeX mode when using `plfonts.sty'.") + +(modify-syntax-entry ?\" "w" LaTeX-plfonts-mode-syntax-table) + +(TeX-add-style-hook "plfonts" + (function (lambda () + (set-syntax-table LaTeX-plfonts-mode-syntax-table) + (make-local-variable 'TeX-open-quote) + (make-local-variable 'TeX-close-quote) + (make-local-variable 'TeX-quote-after-quote) + (make-local-variable 'TeX-command-default) + (setq TeX-open-quote "\"<") + (setq TeX-close-quote "\">") + (setq TeX-quote-after-quote t) + (setq TeX-command-default "plLaTeX") + (run-hooks 'TeX-language-pl-hook)))) + +;;; plfonts.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/plhb.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,31 @@ +;;; plhb.el - Setup AUC TeX for editing Polish text with plhb.sty + +;; $Id: plhb.el,v 1.1 1997/02/20 02:15:43 steve Exp $ + +;;; Commentary: +;; +;; `plhb.sty' use `"' to make next character Polish. +;; `plhb.sty' <C> J. S. Bie\'n, IIUW, jsbien@mimuw.edu.pl + +;;; Code: + +(defvar LaTeX-plhb-mode-syntax-table + (copy-syntax-table LaTeX-mode-syntax-table) + "Syntax table used in LaTeX mode when using `plhb.sty'.") + +(modify-syntax-entry ?\" "w" LaTeX-plhb-mode-syntax-table) + +(TeX-add-style-hook "plhb" + (function (lambda () + (set-syntax-table LaTeX-plhb-mode-syntax-table) + (make-local-variable 'TeX-open-quote) + (make-local-variable 'TeX-close-quote) + (make-local-variable 'TeX-command-default) + (make-local-variable 'TeX-quote-after-quote) + (setq TeX-open-quote "\"<") + (setq TeX-close-quote "\">") + (setq TeX-quote-after-quote t) + (setq TeX-command-default "plLaTeX") + (run-hooks 'TeX-language-pl-hook)))) + +;;; plhb.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/psfig.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,79 @@ +;;; psfig.el - Support for the psfig style option. + +;; Contributed by Marc Gemis <makke@wins.uia.ac.be> +;; Please direct comments to him. + +;;; Code: + +(TeX-add-style-hook "psfig" + (function + (lambda () + ;; probable some of the following symbols may be removed + (TeX-add-symbols "protect" "figurepath" "fbox" + "other" "letter" "other" "then" "Sine" "Cosine" + "psdraft" "psfull" "psscalefirst" "psrotatefirst" + "psnodraftbox" "psdraftbox" "pssilent" "psnoisy" + "minmaxtest" + '("psfig" TeX-arg-psfig) + '("psfigurepath" t) + ) + (LaTeX-add-environments + '("psfigure" LaTeX-env-psfigure) + ) + ))) + +(defun TeX-arg-psfig (optional) + "Ask for file, width and length. Insert psfig macro" + (let ((psfile (read-file-name "PS-file: " "" "" nil)) + (figwidth (read-input "Figure width: ")) + (figheight (read-input "Figure height: ")) + ) + + (insert TeX-grop "figure=" psfile) + (if (not (zerop (length figwidth))) + (insert ",width=" figwidth)) + (if (not (zerop (length figheight))) + (insert ",height=" figheight)) + (insert TeX-grcl) + ) + ) + + +(defun LaTeX-env-psfigure (environment) + "Create with \\label and \\caption and \\psfig commands." + (let ((float (read-input "Float to: " LaTeX-float)) + (caption (read-input "Caption: ")) + (label (read-input "Label: " LaTeX-figure-label)) + ; gf: ask if this should be centered + (psfile (read-file-name "PS-file: " "" "" nil)) + (figwidth (read-input "Figure width: ")) + (figheight (read-input "Figure height: ")) + ) + + (setq LaTeX-float (if (zerop (length float)) + LaTeX-float + float)) + + (LaTeX-insert-environment "figure" + (concat LaTeX-optop LaTeX-float LaTeX-optcl)) + + (insert TeX-esc "centerline" TeX-grop TeX-esc "psfig" TeX-grop + "figure=" psfile) + (if (not (zerop (length figwidth))) + (insert ",width=" figwidth)) + (if (not (zerop (length figheight))) + (insert ",height=" figheight)) + (insert TeX-grcl TeX-grcl) + (if (zerop (length caption)) + () + (newline-and-indent) + (insert TeX-esc "caption" TeX-grop caption TeX-grcl)) + (if (or (zerop (length label)) + (equal LaTeX-figure-label label)) + () + (newline-and-indent) + (insert TeX-esc "label" TeX-grop label TeX-grcl)) + + (forward-line 2))) + +;;; psfig.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/report.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,11 @@ +;;; report.el - Special code for report style. + +;; $Id: report.el,v 1.1 1997/02/20 02:15:43 steve Exp $ + +;;; Code: + +(TeX-add-style-hook "report" + (function (lambda () + (setq LaTeX-largest-level (LaTeX-section-level "chapter"))))) + +;;; report.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/slides.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,52 @@ +;;; slides.el - Special code for slitex. +;; +;; $Id: slides.el,v 1.1 1997/02/20 02:15:43 steve Exp $ + +(require 'latex) + +;;; Code: + +(TeX-add-style-hook "slides" + (function + (lambda () + (setq LaTeX-default-style "slides") + (add-hook 'LaTeX-document-style-hook 'LaTeX-style-slides) + (LaTeX-add-environments '("slide" LaTeX-env-slide) + '("overlay" LaTeX-env-slide)) + (TeX-run-style-hooks "SLITEX")))) + +(defvar LaTeX-slide-color "" + "*Default slide color.") + + (make-variable-buffer-local 'LaTeX-slide-color) + +(defun LaTeX-style-slides () + "Prompt for and insert SliTeX options." + (let ((slide-file (read-input "Slide file: ")) + (slide-colors (read-input "Slide colors (comma separetade list): " + "black"))) + (save-excursion + (goto-char (point-min)) ; insert before \end{document} + (if (re-search-forward ".end.document." (point-max) t) + (beginning-of-line 1)) + (open-line 2) + (indent-relative-maybe) + (if (equal slide-colors "black") + (insert TeX-esc "blackandwhite" + TeX-grop slide-file TeX-grcl) + (progn + (insert TeX-esc "colors" + TeX-grop slide-colors TeX-grcl) + (newline-and-indent) + (insert TeX-esc "colorslides" + TeX-grop slide-file TeX-grcl)))))) + +(defun LaTeX-env-slide (environment) + "Insert ENVIRONMENT and prompt for slide colors." + (setq LaTeX-slide-color + (read-input "Slide colors: " LaTeX-slide-color)) + (LaTeX-insert-environment environment + (concat TeX-grop LaTeX-slide-color TeX-grcl))) + + +;;; slides.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/swedish.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,13 @@ +;;; swedish.el - Setup AUC TeX for editing Swedish text. + +;; $Id: swedish.el,v 1.1 1997/02/20 02:15:44 steve Exp $ + +;;; Commentary: +;; +;; Apparently the Swedes use ''this style'' quotations. + +(TeX-add-style-hook "swedish" + (function (lambda () + (make-local-variable 'TeX-open-quote) + (setq TeX-open-quote "''") + (run-hooks 'TeX-language-sv-hook))))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/style/virtex.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,83 @@ +;;; virtex.el - Common code for all TeX formats. + +;; $Id: virtex.el,v 1.1 1997/02/20 02:15:44 steve Exp $ + +;;; Code: + +(TeX-add-style-hook "virtex" + (function + (lambda () + (TeX-add-symbols "/" "above" "abovedisplayshortskip" + "abovedisplayskip" "abovewithdelims" "accent" + "adjdemerits" "advance" "afterassignment" + "aftergroup" "atop" "atopwithdelims" "badness" + "baselineskip" "batchmode" "begingroup" + "belowdisplayshortskip" "belowdisplayskip" + "binoppenalty" "botmark" "box" "boxmaxdepth" + "brokenpenalty" "catcode" "char" "chardef" + "cleaders" "closein" "closeout" "clubpenalty" + "copy" "count" "countdef" "cr" "crcr" "csname" + "day" "deadcycles" "def" "defaulthyphenchar" + "defaultskewchar" "delcode" "delimiter" + "delimiterfactor" "delimitershortfall" "dimen" + "dimendef" "discretionary" "displayindent" + "displaylimits" "displaystyle" + "displaywidowpenalty" "displaywidth" "divide" + "doublehyphendemerits" "dp" "dump" "edef" "else" + "emergencystretch" "end" "endcsname" "endgroup" + "endinput" "endlinechar" "eqno" "errhelp" + "errmessage" "errorcontextlines" "errorstopmode" + "escapechar" "everycr" "everydisplay" + "everyhbox" "everyjob" "everymath" "everypar" + "everyvbox" "exhyphenpenalty" "expandafter" + "fam" "fi" "finalhyphendemerits" "firstmark" + "floatingpenalty" "font" "fontdimen" "fontname" + "futurelet" "gdef" "global" "globaldefs" + "halign" "hangafter" "hangindent" "hbadness" + "hbox" "hfil" "hfill" "hfilneg" "hfuzz" + "hoffset" "holdinginserts" "hrule" "hsize" + "hskip" "hss" "ht" "hyphenpenation" "hyphenchar" + "hyphenpenalty" "if" "ifcase" "ifcat" "ifdim" + "ifeof" "iffalse" "ifhbox" "ifinner" "ifhmode" + "ifmmode" "ifnum" "ifodd" "iftrue" "ifvbox" + "ifvoid" "ifx" "ignorespaces" "immediate" + "indent" "input" "inputlineno" "insert" + "insertpenalties" "interlinepenalty" "jobname" + "kern" "language" "lastbox" "lastkern" + "lastpenalty" "lastskip" "lccode" "leaders" + "left" "lefthyphenmin" "leftskip" "leqno" "let" + "limits" "linepenalty" "lineskip" + "lineskiplimit" "long" "looseness" "lower" + "lowercase" "mag" "markaccent" "mathbin" + "mathchar" "mathchardef" "mathchoise" + "mathclose" "mathcode" "mathinner" "mathhop" + "mathopen" "mathord" "mathpunct" "mathrel" + "mathsurround" "maxdeadcycles" "maxdepth" + "meaning" "medmuskip" "message" "mkern" "month" + "moveleft" "moveright" "mskip" "multiply" + "muskip" "muskipdef" "newlinechar" "noalign" + "noboundary" "noexpand" "noindent" "nolimits" + "nonscript" "nonstopmode" "nulldelimiterspace" + "nullfont" "number" "omit" "openin" "openout" + "or" "outer" "output" "outputpenalty" + "overfullrule" "parfillskip" "parindent" + "parskip" "pausing" "postdisplaypenalty" + "predisplaypenalty" "predisplaysize" + "pretolerance" "relpenalty" "rightskip" + "scriptspace" "showboxbreadth" "showboxdepth" + "smallskipamount" "spaceskip" "splitmaxdepth" + "splittopskip" "tabskip" "thickmuskip" + "thinmuskip" "time" "tolerance" "topskip" + "tracingcommands" "tracinglostchars" + "tracingmacros" "tracingonline" "tracingoutput" + "tracingpages" "tracingparagraphs" + "tracingrestores" "tracingstats" "uccode" + "uchyph" "underline" "unhbox" "unhcopy" "unkern" + "unpenalty" "unskip" "unvbox" "unvcopy" + "uppercase" "vadjust" "valign" "vbadness" "vbox" + "vcenter" "vfil" "vfill" "vfilneg" "vfuzz" + "voffset" "vrule" "vsize" "vskip" "vss" "vtop" + "wd" "widowpenalty" "write" "xdef" "xleaders" + "xspaceskip" "year")))) + +;;; virtex.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/tex-buf.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,1610 @@ +;;; tex-buf.el - External commands for AUC TeX. +;; +;; Maintainer: Per Abrahamsen <auc-tex@sunsite.auc.dk> +;; Version: 9.7i + +;; Copyright (C) 1991 Kresten Krab Thorup +;; Copyright (C) 1993, 1996 Per Abrahamsen +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 1, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Code: + +(defvar no-doc + "This function is part of AUC TeX, but has not yet been loaded. +Full documentation will be available after autoloading the function." + "Documentation for autoload functions.") + +;;; Customization: + +(defvar TeX-process-asynchronous (not (eq system-type 'ms-dos)) + "*Use asynchronous processes.") + +(defvar TeX-shell + (if (memq system-type '(ms-dos emx windows-nt)) + shell-file-name + "/bin/sh") + "Name of shell used to parse TeX commands.") + +(defvar TeX-shell-command-option + (cond ((memq system-type '(ms-dos emx windows-nt) ) + (cond ((boundp 'shell-command-option) + shell-command-option) + ((boundp 'shell-command-switch) + shell-command-switch) + (t + "/c"))) + (t ;Unix & EMX (Emacs 19 port to OS/2) + "-c")) + "Shell argument indicating that next argument is the command.") + +;;; Interactive Commands +;; +;; The general idea is, that there is one process and process buffer +;; associated with each master file, and one process and process buffer +;; for running TeX on a region. Thus, if you have N master files, you +;; can run N + 1 processes simultaneously. +;; +;; Some user commands operates on ``the'' process. The following +;; algorithm determine what ``the'' process is. +;; +;; IF last process started was on a region +;; THEN ``the'' process is the region process +;; ELSE ``the'' process is the master file (of the current buffer) process + +(defun TeX-save-document (name) + "Save all files belonging to the current document. +Return non-nil if document need to be re-TeX'ed." + (interactive (list (TeX-master-file))) + (if (string-equal name "") + (setq name (TeX-master-file))) + + (TeX-check-files (concat name ".dvi") + (cons name (TeX-style-list)) + TeX-file-extensions)) + +(defun TeX-command-master () + "Run command on the current document." + (interactive) + (TeX-command (TeX-command-query (TeX-master-file)) 'TeX-master-file)) + +(defvar TeX-command-region-begin nil) +(defvar TeX-command-region-end nil) +;; Used for marking the last region. + +(make-variable-buffer-local 'TeX-command-region-begin) +(make-variable-buffer-local 'TeX-command-region-end) + +(defun TeX-command-region (&optional old) + "Run TeX on the current region. + +Query the user for a command to run on the temporary file specified by +the variable TeX-region. If the chosen command is so marked in +TeX-command-list, and no argument (or nil) is given to the command, +the region file file be recreated with the current region. If mark is +not active, the new text in the previous used region will be used. + +If the master file for the document has a header, it is written to the +temporary file before the region itself. The document's header is all +text before TeX-header-end. + +If the master file for the document has a trailer, it is written to +the temporary file before the region itself. The document's trailer is +all text after TeX-trailer-start." + (interactive "P") + (if (and (TeX-mark-active) (not old)) + (let ((begin (min (point) (mark))) + (end (max (point) (mark)))) + (if TeX-command-region-begin + () + (setq TeX-command-region-begin (make-marker) + TeX-command-region-end (make-marker))) + (set-marker TeX-command-region-begin begin) + (set-marker TeX-command-region-end end))) + (if (null TeX-command-region-begin) + (error "Mark not set")) + (let ((begin (marker-position TeX-command-region-begin)) + (end (marker-position TeX-command-region-end))) + (TeX-region-create (TeX-region-file TeX-default-extension) + (buffer-substring begin end) + (file-name-nondirectory (buffer-file-name)) + (count-lines (save-restriction (widen) (point-min)) + begin))) + (TeX-command (TeX-command-query (TeX-region-file)) 'TeX-region-file)) + +(defun TeX-command-buffer () + "Run TeX on the current buffer. + +Query the user for a command to run on the temporary file specified by +the variable TeX-region. The region file file be recreated from the +visible part of the buffer." + (interactive) + (let ((TeX-command-region-begin (point-min-marker)) + (TeX-command-region-end (point-max-marker))) + (TeX-command-region t))) + +(defun TeX-recenter-output-buffer (line) + "Redisplay buffer of TeX job output so that most recent output can be seen. +The last line of the buffer is displayed on line LINE of the window, or +at bottom if LINE is nil." + (interactive "P") + (let ((buffer (TeX-active-buffer))) + (if buffer + (let ((old-buffer (current-buffer))) + (pop-to-buffer buffer t) + (bury-buffer buffer) + (goto-char (point-max)) + (recenter (if line + (prefix-numeric-value line) + (/ (window-height) 2))) + (pop-to-buffer old-buffer)) + (message "No process for this document.")))) + +(defun TeX-kill-job () + "Kill the currently running TeX job." + (interactive) + (let ((process (TeX-active-process))) + (if process + (kill-process process) + ;; Should test for TeX background process here. + (error "No TeX process to kill")))) + +(defun TeX-home-buffer () + "Go to the buffer where you last issued a TeX command. +If there is no such buffer, or you already are in that buffer, find +the master file." + (interactive) + (if (or (null TeX-command-buffer) + (eq TeX-command-buffer (current-buffer))) + (find-file (TeX-master-file TeX-default-extension)) + (switch-to-buffer TeX-command-buffer))) + +(defun TeX-next-error (reparse) + "Find the next error in the TeX output buffer. +Prefix by C-u to start from the beginning of the errors." + (interactive "P") + (if (null (TeX-active-buffer)) + (error "No TeX output buffer") + (funcall (TeX-process-get-variable (TeX-active-master) 'TeX-parse-function) + reparse))) + +(defun TeX-toggle-debug-boxes () + "Toggle if the debugger should display \"bad boxes\" too." + (interactive) + (cond (TeX-debug-bad-boxes + (setq TeX-debug-bad-boxes nil)) + (t + (setq TeX-debug-bad-boxes t))) + (message (concat "TeX-debug-bad-boxes: " (cond (TeX-debug-bad-boxes "on") + (t "off"))))) + +;;; Command Query + +(defun TeX-command (name file) + "Run command NAME on the file you get by calling FILE. + +FILE is a function return a file name. It has one optional argument, +the extension to use on the file. + +Use the information in TeX-command-list to determine how to run the +command." + (setq TeX-current-process-region-p (eq file 'TeX-region-file)) + (let ((command (TeX-command-expand (nth 1 (assoc name TeX-command-list)) + file)) + (hook (nth 2 (assoc name TeX-command-list))) + (confirm (nth 3 (assoc name TeX-command-list)))) + + ;; Verify the expanded command + (if confirm + (setq command + (read-from-minibuffer (concat name " command: ") command))) + + ;; Now start the process + (TeX-process-set-variable name 'TeX-command-next TeX-command-Show) + (apply hook name command (apply file nil) nil))) + +(defun TeX-command-expand (command file &optional list) + "Expand COMMAND for FILE as described in LIST. +LIST default to TeX-expand-list." + (if (null list) + (setq list TeX-expand-list)) + (while list + (let ((case-fold-search nil) ; Do not ignore case. + (string (car (car list))) ;First element + (expansion (car (cdr (car list)))) ;Second element + (arguments (cdr (cdr (car list))))) ;Remaining elements + (while (string-match string command) + (let ((prefix (substring command 0 (match-beginning 0))) + (postfix (substring command (match-end 0)))) + (setq command (concat prefix + (cond ((TeX-function-p expansion) + (apply expansion arguments)) + ((boundp expansion) + (apply (eval expansion) arguments)) + (t + (error "Nonexpansion %s" expansion))) + postfix))))) + (setq list (cdr list))) + command) + +(defun TeX-check-files (derived originals extensions) + "Check that DERIVED is newer than any of the ORIGINALS. +Try each original with each member of EXTENSIONS, in all directories +in TeX-check-path." + (let ((found nil) + (regexp (concat "\\`\\(" + (mapconcat (function (lambda (dir) + (regexp-quote (expand-file-name dir)))) + TeX-check-path "\\|") + "\\).*\\(" + (mapconcat 'regexp-quote originals "\\|") + "\\)\\.\\(" + (mapconcat 'regexp-quote extensions "\\|") + "\\)\\'")) + (buffers (buffer-list))) + (while buffers + (let* ((buffer (car buffers)) + (name (buffer-file-name buffer))) + (setq buffers (cdr buffers)) + (if (and name (string-match regexp name)) + (progn + (and (buffer-modified-p buffer) + (or (not TeX-save-query) + (y-or-n-p (concat "Save file " + (buffer-file-name buffer) + "? "))) + (save-excursion (set-buffer buffer) (save-buffer))) + (if (file-newer-than-file-p name derived) + (setq found t)))))) + found)) + +(defvar TeX-save-query t + "*If non-nil, ask user for permission to save files before starting TeX.") + +(defun TeX-command-query (name) + "Query the user for a what TeX command to use." + (let* ((default (cond ((if (string-equal name TeX-region) + (TeX-check-files (concat name ".dvi") + (list name) + TeX-file-extensions) + (TeX-save-document (TeX-master-file))) + TeX-command-default) + ((and (eq major-mode 'latex-mode) + (TeX-check-files (concat name ".bbl") + (mapcar 'car + (LaTeX-bibliography-list)) + BibTeX-file-extensions)) + ;; We should check for bst files here as well. + TeX-command-BibTeX) + ((TeX-process-get-variable name + 'TeX-command-next + TeX-command-Show)) + (TeX-command-Show))) + (completion-ignore-case t) + (answer (or TeX-command-force + (completing-read + (concat "Command: (default " default ") ") + TeX-command-list nil t)))) + ;; If the answer "latex" it will not be expanded to "LaTeX" + (setq answer (car-safe (TeX-assoc answer TeX-command-list))) + (if (and answer + (not (string-equal answer ""))) + answer + default))) + +(defvar TeX-command-next nil + "The default command next time TeX-command is invoked.") + + (make-variable-buffer-local 'TeX-command-next) + +(defun TeX-printer-query (&optional command element) + "Query the user for a printer name. +COMMAND is the default command to use if the entry for the printer in +TeX-printer-list does not itself have it specified in the ELEMENT'th +entry." + (or command (setq command TeX-print-command)) + (or element (setq element 1)) + (let ((printer (if TeX-printer-list + (let ((completion-ignore-case t)) + (completing-read (concat "Printer: (default " + TeX-printer-default ") ") + TeX-printer-list)) + ""))) + + (setq printer (or (car-safe (TeX-assoc printer TeX-printer-list)) + printer)) + (if (or (null printer) (string-equal "" printer)) + (setq printer TeX-printer-default) + (setq TeX-printer-default printer)) + + (let ((expansion (let ((entry (assoc printer TeX-printer-list))) + (if (and entry (nth element entry)) + (nth element entry) + command)))) + (if (string-match "%p" printer) + (error "Don't use %s in printer names" "%p")) + (while (string-match "%p" expansion) + (setq expansion (concat (substring expansion 0 (match-beginning 0)) + printer + (substring expansion (match-end 0))))) + expansion))) + +(defun TeX-style-check (styles) + "Check STYLES compared to the current style options." + + (let ((files (TeX-style-list))) + (while (and styles + (not (TeX-member (car (car styles)) files 'string-match))) + (setq styles (cdr styles)))) + (if styles + (nth 1 (car styles)) + "")) + +;;; Command Hooks + +(defvar TeX-after-start-process-function nil + "Hooks to run after starting an asynchronous process. +Used by Japanese TeX to set the coding system.") + +(defvar TeX-show-compilation nil + "*If non-nil, show output of TeX compilation in other window.") + +(defun TeX-run-command (name command file) + "Create a process for NAME using COMMAND to process FILE. +Return the new process." + (let ((default TeX-command-default) + (buffer (TeX-process-buffer-name file)) + (dir (TeX-master-directory))) + (TeX-process-check file) ; Check that no process is running + (setq TeX-command-buffer (current-buffer)) + (get-buffer-create buffer) + (set-buffer buffer) + (erase-buffer) + (if dir (cd dir)) + (insert "Running `" name "' on `" file "' with ``" command "''\n") + (setq mode-name name) + (if TeX-show-compilation + (display-buffer buffer) + (message "Type `C-c C-l' to display results of compilation.")) + (setq TeX-parse-function 'TeX-parse-command) + (setq TeX-command-default default) + (setq TeX-sentinel-function + (function (lambda (process name) + (message (concat name ": done."))))) + (if TeX-process-asynchronous + (let ((process (start-process name buffer TeX-shell + TeX-shell-command-option command))) + (if TeX-after-start-process-function + (funcall TeX-after-start-process-function process)) + (TeX-command-mode-line process) + (set-process-filter process 'TeX-command-filter) + (set-process-sentinel process 'TeX-command-sentinel) + (set-marker (process-mark process) (point-max)) + (setq compilation-in-progress (cons process compilation-in-progress)) + process) + (setq mode-line-process ": run") + (set-buffer-modified-p (buffer-modified-p)) + (sit-for 0) ; redisplay + (call-process TeX-shell nil buffer nil + TeX-shell-command-option command)))) + +(defun TeX-run-format (name command file) + "Create a process for NAME using COMMAND to format FILE with TeX." + (let ((buffer (TeX-process-buffer-name file)) + (process (TeX-run-command name command file))) + ;; Hook to TeX debuger. + (save-excursion + (set-buffer buffer) + (TeX-parse-reset) + (setq TeX-parse-function 'TeX-parse-TeX) + (setq TeX-sentinel-function 'TeX-TeX-sentinel) + (if TeX-process-asynchronous + (progn + ;; Updating the mode line. + (setq TeX-current-page "[0]") + (TeX-format-mode-line process) + (set-process-filter process 'TeX-format-filter))) + process))) + +(defun TeX-run-TeX (name command file) + "Create a process for NAME using COMMAND to format FILE with TeX." + (let ((process (TeX-run-format name command file))) + (if TeX-process-asynchronous + process + (TeX-synchronous-sentinel name file process)))) + +(defun TeX-run-LaTeX (name command file) + "Create a process for NAME using COMMAND to format FILE with TeX." + (let ((process (TeX-run-format name command file))) + (setq TeX-sentinel-function 'TeX-LaTeX-sentinel) + (if TeX-process-asynchronous + process + (TeX-synchronous-sentinel name file process)))) + +(defun TeX-run-BibTeX (name command file) + "Create a process for NAME using COMMAND to format FILE with BibTeX." + (let ((process (TeX-run-command name command file))) + (setq TeX-sentinel-function 'TeX-BibTeX-sentinel) + (if TeX-process-asynchronous + process + (TeX-synchronous-sentinel name file process)))) + +(defun TeX-run-compile (name command file) + "Ignore first and third argument, start compile with second argument." + (compile command)) + +(defun TeX-run-shell (name command file) + "Ignore first and third argument, start shell-command with second argument." + (shell-command command) + (if (eq system-type 'ms-dos) + (redraw-display))) + +(defun TeX-run-discard (name command file) + "Start process with second argument, discarding its output." + (process-kill-without-query (start-process (concat name " discard") + nil TeX-shell + TeX-shell-command-option + command))) + +(defun TeX-run-dviout (name command file) + "Call process wbith second argument, discarding its output. With support +for the dviout previewer, especially when used with PC-9801 series." + (if (and (boundp 'dos-machine-type) (eq dos-machine-type 'pc98)) ;if PC-9801 + (send-string-to-terminal "\e[2J")) ; clear screen + (call-process TeX-shell (if (eq system-type 'ms-dos) "con") nil nil + TeX-shell-command-option command) + (if (eq system-type 'ms-dos) + (redraw-display))) + +(defun TeX-run-background (name command file) + "Start process with second argument, show output when and if it arrives." + (let ((dir (TeX-master-directory))) + (set-buffer (get-buffer-create "*TeX background*")) + (if dir (cd dir)) + (erase-buffer) + (let ((process (start-process (concat name " background") + nil TeX-shell + TeX-shell-command-option command))) + (if TeX-after-start-process-function + (funcall TeX-after-start-process-function process)) + (set-process-filter process 'TeX-background-filter) + (process-kill-without-query process)))) + +(defun TeX-run-interactive (name command file) + "Run TeX interactively. +Run command in a buffer (in comint-shell-mode) so that it accepts user +interaction. If you return to the file buffer after the TeX run, +Error parsing on C-x ` should work with a bit of luck." + (require 'comint) + (let ((default TeX-command-default) + (buffer (TeX-process-buffer-name file)) + (process nil) + (dir (TeX-master-directory))) + (TeX-process-check file) ; Check that no process is running + (setq TeX-command-buffer (current-buffer)) + (with-output-to-temp-buffer buffer) + (set-buffer buffer) + (if dir (cd dir)) + (insert "Running `" name "' on `" file "' with ``" command "''\n") + (comint-exec buffer name TeX-shell nil + (list TeX-shell-command-option command)) + (comint-mode) + (setq mode-name name) + (setq TeX-command-default default) + (setq process (get-buffer-process buffer)) + (if TeX-after-start-process-function + (funcall TeX-after-start-process-function process)) + (TeX-command-mode-line process) + (set-process-sentinel process 'TeX-command-sentinel) + (set-marker (process-mark process) (point-max)) + (setq compilation-in-progress (cons process compilation-in-progress)) + (TeX-parse-reset) + (setq TeX-parse-function 'TeX-parse-TeX) + (setq TeX-sentinel-function 'TeX-LaTeX-sentinel))) + +;;; Command Sentinels + +(defun TeX-synchronous-sentinel (name file result) + "Process TeX command output buffer after the process dies." + (let* ((buffer (TeX-process-buffer file))) + (save-excursion + (set-buffer buffer) + + ;; Append post-mortem information to the buffer + (goto-char (point-max)) + (insert "\n" mode-name (if (and result (zerop result)) + " finished" " exited") " at " + (substring (current-time-string) 0 -5)) + (setq mode-line-process ": exit") + + ;; Do command specific actions. + (setq TeX-command-next TeX-command-Show) + (goto-char (point-min)) + (apply TeX-sentinel-function nil name nil) + + ;; Force mode line redisplay soon + (set-buffer-modified-p (buffer-modified-p))))) + +(defun TeX-command-sentinel (process msg) + "Process TeX command output buffer after the process dies." + (let* ((buffer (process-buffer process)) + (name (process-name process))) + (cond ((null (buffer-name buffer)) ; buffer killed + (set-process-buffer process nil) + (set-process-sentinel process nil)) + ((memq (process-status process) '(signal exit)) + (save-excursion + (set-buffer buffer) + + ;; Append post-mortem information to the buffer + (goto-char (point-max)) + (insert "\n" mode-name " " msg) + (forward-char -1) + (insert " at " + (substring (current-time-string) 0 -5)) + (forward-char 1) + + ;; Do command specific actions. + (TeX-command-mode-line process) + (setq TeX-command-next TeX-command-Show) + (goto-char (point-min)) + (apply TeX-sentinel-function process name nil) + + + ;; If buffer and mode line will show that the process + ;; is dead, we can delete it now. Otherwise it + ;; will stay around until M-x list-processes. + (delete-process process) + + ;; Force mode line redisplay soon + (set-buffer-modified-p (buffer-modified-p)))))) + (setq compilation-in-progress (delq process compilation-in-progress))) + + +(defvar TeX-sentinel-function (function (lambda (process name))) + "Hook to cleanup TeX command buffer after temination of PROCESS. +NAME is the name of the process.") + + (make-variable-buffer-local 'TeX-sentinel-function) + +(defun TeX-TeX-sentinel (process name) + "Cleanup TeX output buffer after running TeX." + (if (TeX-TeX-sentinel-check process name) + () + (message (concat name ": formatted " (TeX-current-pages))) + (setq TeX-command-next TeX-command-Show))) + +(defun TeX-current-pages () + ;; String indictating the number of pages formatted. + (cond ((null TeX-current-page) + "some pages.") + ((string-match "[^0-9]1[^0-9]" TeX-current-page) + (concat TeX-current-page " page.")) + (t + (concat TeX-current-page " pages.")))) + +(defun TeX-TeX-sentinel-check (process name) + "Cleanup TeX output buffer after running TeX. +Return nil ifs no errors were found." + (save-excursion + (goto-char (point-max)) + (if (re-search-backward "^Output written on.* (\\([0-9]+\\) page" nil t) + (setq TeX-current-page (concat "{" (TeX-match-buffer 1) "}")))) + (if process (TeX-format-mode-line process)) + (if (re-search-forward "^! " nil t) + (progn + (message (concat name " errors in `" (buffer-name) + "'. Use C-c ` to display.")) + (setq TeX-command-next TeX-command-default) + t) + (setq TeX-command-next TeX-command-Show) + nil)) + +(defun TeX-LaTeX-sentinel (process name) + "Cleanup TeX output buffer after running LaTeX." + (cond ((TeX-TeX-sentinel-check process name)) + ((and (save-excursion + (re-search-forward "^LaTeX Warning: Citation" nil t)) + (let ((current (current-buffer))) + (set-buffer TeX-command-buffer) + (prog1 (and (LaTeX-bibliography-list) + (TeX-check-files (TeX-master-file "bbl") + (TeX-style-list) + (append TeX-file-extensions + BibTeX-file-extensions))) + (set-buffer current)))) + (message (concat "You should run BibTeX to get citations right, " + (TeX-current-pages))) + (setq TeX-command-next TeX-command-BibTeX)) + ((re-search-forward "^LaTeX Warning: Label(s)" nil t) + (message (concat "You should run LaTeX again " + "to get references right, " + (TeX-current-pages))) + (setq TeX-command-next TeX-command-default)) + ((re-search-forward "^LaTeX Warning: Reference" nil t) + (message (concat name ": there were unresolved references, " + (TeX-current-pages))) + (setq TeX-command-next TeX-command-Show)) + ((re-search-forward "^LaTeX Warning: Citation" nil t) + (message (concat name ": there were unresolved citations, " + (TeX-current-pages))) + (setq TeX-command-next TeX-command-Show)) + ((re-search-forward + "^\\(\\*\\* \\)?J?I?p?\\(La\\|Sli\\)TeX\\(2e\\)? \\(Version\\|ver\\.\\|<[0-9/]*>\\)" nil t) + (message (concat name ": successfully formatted " + (TeX-current-pages))) + (setq TeX-command-next TeX-command-Show)) + (t + (message (concat name ": problems after " + (TeX-current-pages))) + (setq TeX-command-next TeX-command-default)))) + +(defun TeX-BibTeX-sentinel (process name) + "Cleanup TeX output buffer after running BibTeX." + (message "You should perhaps run LaTeX again to get citations right.") + (setq TeX-command-next TeX-command-default)) + +;;; Process Control + + +;; This variable is chared with `compile.el'. +(defvar compilation-in-progress nil + "List of compilation processes now running.") + +(or (assq 'compilation-in-progress minor-mode-alist) + (setq minor-mode-alist (cons '(compilation-in-progress " Compiling") + minor-mode-alist))) + +(defun TeX-process-get-variable (name symbol &optional default) + "Return the value in the process buffer for NAME of SYMBOL. + +Return DEFAULT if the process buffer does not exist or SYMBOL is not +defined." + (let ((buffer (TeX-process-buffer name))) + (if buffer + (save-excursion + (set-buffer buffer) + (if (boundp symbol) + (eval symbol) + default)) + default))) + +(defun TeX-process-set-variable (name symbol value) + "Set the variable SYMBOL in the process buffer to VALUE. +Return nil iff no process buffer exist." + (let ((buffer (TeX-process-buffer name))) + (if buffer + (save-excursion + (set-buffer buffer) + (set symbol value) + t) + nil))) + +(defun TeX-process-check (name) + "Check if a process for the TeX document NAME already exist. +If so, give the user the choice of aborting the process or the current +command." + (let ((process (TeX-process name))) + (cond ((null process)) + ((not (eq (process-status process) 'run))) + ((yes-or-no-p (concat "Process `" + (process-name process) + "' for document `" + name + "' running, kill it? ")) + (delete-process process)) + (t + (error "Cannot have two processes for the same document"))))) + +(defun TeX-process-buffer-name (name) + "Return name of AUC TeX buffer associated with the document NAME." + (concat "*" (abbreviate-file-name (expand-file-name name)) " output*")) + +(defun TeX-process-buffer (name) + "Return the AUC TeX buffer associated with the document NAME." + (get-buffer (TeX-process-buffer-name name))) + +(defun TeX-process (name) + "Return AUC TeX process associated with the document NAME." + (and TeX-process-asynchronous + (get-buffer-process (TeX-process-buffer name)))) + +;;; Process Filters + +(defun TeX-command-mode-line (process) + "Format the mode line for a buffer containing output from PROCESS." + (setq mode-line-process (concat ": " + (symbol-name (process-status process)))) + (set-buffer-modified-p (buffer-modified-p))) + +(defun TeX-command-filter (process string) + "Filter to process normal output." + (save-excursion + (set-buffer (process-buffer process)) + (save-excursion + (goto-char (process-mark process)) + (insert-before-markers string) + (set-marker (process-mark process) (point))))) + +(defvar TeX-current-page nil + "The page number currently being formatted, enclosed in brackets.") + + (make-variable-buffer-local 'TeX-current-page) + +(defun TeX-format-mode-line (process) + "Format the mode line for a buffer containing TeX output from PROCESS." + (setq mode-line-process (concat " " TeX-current-page ": " + (symbol-name (process-status process)))) + (set-buffer-modified-p (buffer-modified-p))) + +(defun TeX-format-filter (process string) + "Filter to process TeX output." + (save-excursion + (set-buffer (process-buffer process)) + (save-excursion + (goto-char (process-mark process)) + (insert-before-markers string) + (set-marker (process-mark process) (point))) + (save-excursion + (save-match-data + (if (re-search-backward "\\[[0-9]+\\(\\.[0-9\\.]+\\)?\\]" nil t) + (setq TeX-current-page (TeX-match-buffer 0))))) + (TeX-format-mode-line process))) + +(defvar TeX-parse-function nil + "Function to call to parse content of TeX output buffer.") + (make-variable-buffer-local 'TeX-parse-function) + +(defun TeX-background-filter (process string) + "Filter to process background output." + (let ((old-window (selected-window)) + (pop-up-windows t)) + (pop-to-buffer "*TeX background*") + (goto-char (point-max)) + (insert string) + (select-window old-window))) + + +;;; Active Process + +(defvar TeX-current-process-region-p nil + "This variable is set to t iff the last TeX command is on a region.") + +(defun TeX-active-process () + "Return the active process for the current buffer." + (if TeX-current-process-region-p + (TeX-process (TeX-region-file)) + (TeX-process (TeX-master-file)))) + +(defun TeX-active-buffer () + "Return the buffer of the active process for this buffer." + (if TeX-current-process-region-p + (TeX-process-buffer (TeX-region-file)) + (TeX-process-buffer (TeX-master-file)))) + +(defun TeX-active-master (&optional extension) + "The master file currently being compiled." + (if TeX-current-process-region-p + (TeX-region-file extension) + (TeX-master-file extension))) + +(defvar TeX-command-buffer nil + "The buffer from where the last TeX command was issued.") + +;;; Region File + +(defun TeX-region-create (file region original offset) + "Create a new file named FILE with the string REGION +The region is taken from ORIGINAL starting at line OFFSET. + +The current buffer and master file is searched, in order to ensure +that the TeX header and trailer information is also included. + +The OFFSET is used to provide the debugger with information about the +original file." + (let* (;; We shift buffer a lot, so we must keep track of the buffer + ;; local variables. + (header-end TeX-header-end) + (trailer-start TeX-trailer-start) + + ;; We seach for header and trailer in the master file. + (master-name (TeX-master-file TeX-default-extension)) + (master-buffer (find-file-noselect master-name)) + + ;; Attempt to disable font lock. + (font-lock-defaults-alist nil) + (font-lock-defaults nil) + (font-lock-maximum-size 0) + (font-lock-mode-hook nil) + (font-lock-auto-fontify nil) + (font-lock-mode-enable-list nil) + ;; And insert them into the FILE buffer. + (file-buffer (find-file-noselect file)) + ;; But remember original content. + original-content + + ;; We search for the header from the master file, if it is + ;; not present in the region. + (header (if (string-match header-end region) + "" + (save-excursion + (save-restriction + (set-buffer master-buffer) + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + ;; NOTE: We use the local value of + ;; TeX-header-end from the master file. + (if (not (re-search-forward TeX-header-end nil t)) + "" + (re-search-forward "[\r\n]" nil t) + (buffer-substring (point-min) (point))))))))) + + ;; We search for the trailer from the master file, if it is + ;; not present in the region. + (trailer-offset 0) + (trailer (if (string-match trailer-start region) + "" + (save-excursion + (save-restriction + (set-buffer master-buffer) + (save-excursion + (save-restriction + (widen) + (goto-char (point-max)) + ;; NOTE: We use the local value of + ;; TeX-trailer-start from the master file. + (if (not (re-search-backward TeX-trailer-start nil t)) + "" + ;;(beginning-of-line 1) + (re-search-backward "[\r\n]" nil t) + (setq trailer-offset + (count-lines (point-min) (point))) + (buffer-substring (point) (point-max)))))))))) + (save-excursion + (set-buffer file-buffer) + (setq original-content (buffer-string)) + (erase-buffer) + (insert "\\message{ !name(" master-name ")}" + header + "\n\\message{ !name(" original ") !offset(") + (insert (int-to-string (- offset + (count-lines (point-min) (point)))) + ") }\n" + region + "\n\\message{ !name(" master-name ") !offset(") + (insert (int-to-string (- trailer-offset + (count-lines (point-min) (point)))) + ") }\n" + trailer) + (if (string-equal (buffer-string) original-content) + (set-buffer-modified-p nil) + (save-buffer 0))))) + +(defun TeX-region-file (&optional extension nondirectory) + "Return TeX-region file name with EXTENSION. +If optional second argument NONDIRECTORY is nil, do not include +the directory." + (concat (if nondirectory "" (TeX-master-directory)) + (cond ((eq extension t) + (concat TeX-region "." TeX-default-extension)) + (extension + (concat TeX-region "." extension)) + (t + TeX-region)))) + +(defvar TeX-region "_region_" + "*Base name for temporary file for use with TeX-region.") + +;;; Parsing + +;;; - Global Parser Variables + +(defvar TeX-error-point nil + "How far we have parsed until now.") + + (make-variable-buffer-local 'TeX-error-point) + +(defvar TeX-error-file nil + "Stack of files in which errors have occured") + + (make-variable-buffer-local 'TeX-error-file) + +(defvar TeX-error-offset nil + "Add this to any line numbers from TeX. Stack like TeX-error-file.") + + (make-variable-buffer-local 'TeX-error-offset) + +(defun TeX-parse-reset () + "Reset all variables used for parsing TeX output." + (setq TeX-error-point (point-min)) + (setq TeX-error-offset nil) + (setq TeX-error-file nil)) + +;;; - Parsers Hooks + +(defun TeX-parse-command (reparse) + "We can't parse anything but TeX." + (error "I cannot parse %s output, sorry" + (if (TeX-active-process) + (process-name (TeX-active-process)) + "this"))) + +(defun TeX-parse-TeX (reparse) + "Find the next error produced by running TeX. +Prefix by C-u to start from the beginning of the errors. + +If the file occurs in an included file, the file is loaded (if not +already in an Emacs buffer) and the cursor is placed at the error." + + (let ((old-buffer (current-buffer))) + (pop-to-buffer (TeX-active-buffer)) + (if reparse + (TeX-parse-reset)) + (goto-char TeX-error-point) + (TeX-parse-error old-buffer))) + +;;; - Parsing (La)TeX + +(defvar TeX-translate-location-hook nil + "List of functions to be called before showing an error or warning. + +You might want to examine and modify the free variables `file', +`offset', `line', `string', `error', and `context' from this hook.") + +(defun TeX-parse-error (old) + "Goto next error. Pop to OLD buffer if no more errors are found." + (while + (progn + (re-search-forward (concat "\\(" + "^! \\|" + "(\\|" + ")\\|" + "\\'\\|" + "!offset([---0-9]*)\\|" + "!name([^)]*)\\|" + "^.*erfull \\\\.*[0-9]*--[0-9]*\\|" + "^LaTeX Warning: .*[0-9]+\\.$" + "\\)")) + (let ((string (TeX-match-buffer 1))) + + (cond (;; TeX error + (string= string "! ") + (TeX-error) + nil) + + ;; LaTeX warning + ((string-match (concat "\\(" + "^.*erfull \\\\.*[0-9]*--[0-9]*\\|" + "^LaTeX Warning: .*[0-9]+\\.$" + "\\)") + + string) + (TeX-warning string)) + + ;; New file -- Push on stack + ((string= string "(") + (re-search-forward "\\([^()\n \t]*\\)") + (setq TeX-error-file + (cons (TeX-match-buffer 1) TeX-error-file)) + (setq TeX-error-offset (cons 0 TeX-error-offset)) + t) + + ;; End of file -- Pop from stack + ((string= string ")") + (setq TeX-error-file (cdr TeX-error-file)) + (setq TeX-error-offset (cdr TeX-error-offset)) + t) + + ;; Hook to change line numbers + ((string-match "!offset(\\([---0-9]*\\))" string) + (rplaca TeX-error-offset + (string-to-int (substring string + (match-beginning 1) + (match-end 1)))) + t) + + ;; Hook to change file name + ((string-match "!name(\\([^)]*\\))" string) + (rplaca TeX-error-file (substring string + (match-beginning 1) + (match-end 1))) + t) + + ;; No more errors. + (t + (message "No more errors.") + (beep) + (pop-to-buffer old) + nil)))))) + +(defun TeX-error () + "Display an error." + + (let* (;; We need the error message to show the user. + (error (progn + (re-search-forward "\\(.*\\)") + (TeX-match-buffer 1))) + + ;; And the context for the help window. + (context-start (point)) + + ;; And the line number to position the cursor. + (line (if (re-search-forward "l\\.\\([0-9]+\\)" nil t) + (string-to-int (TeX-match-buffer 1)) + 1)) + ;; And a string of the context to search for. + (string (progn + (beginning-of-line) + (re-search-forward " \\(\\([^ \t]*$\\)\\|\\($\\)\\)") + (TeX-match-buffer 1))) + + ;; And we have now found to the end of the context. + (context (buffer-substring context-start (progn + (forward-line 1) + (end-of-line) + (point)))) + ;; We may use these in another buffer. + (offset (car TeX-error-offset) ) + (file (car TeX-error-file))) + + ;; Remember where we was. + (setq TeX-error-point (point)) + + ;; Find the error. + (if (null file) + (error "Error occured after last TeX file closed")) + (run-hooks 'TeX-translate-location-hook) + (find-file-other-window file) + (goto-line (+ offset line)) + (if (not (string= string " ")) + (search-forward string nil t)) + + ;; Explain the error. + (if TeX-display-help + (TeX-help-error error context) + (message (concat "! " error))))) + +(defun TeX-warning (string) + "Display a warning for STRING. +Return nil if we gave a report." + + (let* ((error (concat "** " string)) + + ;; bad-box is nil if this is a "LaTeX Warning" + (bad-box (string-match "^.*erfull \\\\.*[0-9]*--[0-9]*" string)) + ;; line-string: match 1 is beginning line, match 2 is end line + (line-string (if bad-box " \\([0-9]*\\)--\\([0-9]*\\)" + "on input line \\([0-9]*\\)\\.")) + ;; word-string: match 1 is the word + (word-string (if bad-box "[][\\W() ---]\\(\\w+\\)[][\\W() ---]*$" + "`\\(\\w+\\)'")) + + ;; Get error-line (warning) + (line (progn + (re-search-backward line-string) + (string-to-int (TeX-match-buffer 1)))) + (line-end (if bad-box (string-to-int (TeX-match-buffer 2)) + line)) + + ;; Find the context + (context-start (progn (if bad-box (end-of-line) + (beginning-of-line)) + (point))) + + (context (progn + (forward-line 1) + (end-of-line) + (while (equal (current-column) 79) + (forward-line 1) + (end-of-line)) + (buffer-substring context-start (point)))) + + ;; This is where we want to be. + (error-point (point)) + + ;; Now find the error word. + (string (progn + (re-search-backward word-string + context-start t) + (TeX-match-buffer 1))) + + ;; We might use these in another file. + (offset (car TeX-error-offset)) + (file (car TeX-error-file))) + + ;; This is where we start next time. + (goto-char error-point) + (setq TeX-error-point (point)) + + ;; Go back to TeX-buffer + (if TeX-debug-bad-boxes + (progn + (run-hooks 'TeX-translate-location-hook) + (find-file-other-window file) + ;; Find line and string + (goto-line (+ offset line)) + (beginning-of-line 0) + (let ((start (point))) + (goto-line (+ offset line-end)) + (end-of-line) + (search-backward string start t) + (search-forward string nil t)) + ;; Display help + (if TeX-display-help + (TeX-help-error error (if bad-box context (concat "\n" context))) + (message (concat "! " error))) + nil) + t))) + +;;; - Help + +(defun TeX-help-error (error output) + "Print ERROR in context OUTPUT in another window." + + (let ((old-buffer (current-buffer)) + (log-file (TeX-active-master "log")) + (TeX-error-pointer 1)) + + ;; Find help text entry. + (while (not (string-match (car (nth TeX-error-pointer + TeX-error-description-list)) + error)) + (setq TeX-error-pointer (+ TeX-error-pointer 1))) + + (pop-to-buffer (get-buffer-create "*TeX Help*")) + (erase-buffer) + (insert "ERROR: " error + "\n\n--- TeX said ---" + output + "\n--- HELP ---\n" + (save-excursion + (if (and (string= (cdr (nth TeX-error-pointer + TeX-error-description-list)) + "No help available") + (let* ((log-buffer (find-file-noselect log-file))) + (set-buffer log-buffer) + (auto-save-mode nil) + (setq buffer-read-only t) + (goto-line (point-min)) + (search-forward error nil t 1))) + (progn + (re-search-forward "^l.") + (re-search-forward "^ [^\n]+$") + (forward-char 1) + (let ((start (point))) + (re-search-forward "^$") + (concat "From the .log file...\n\n" + (buffer-substring start (point))))) + (cdr (nth TeX-error-pointer + TeX-error-description-list))))) + (goto-char (point-min)) + (pop-to-buffer old-buffer))) + +;;; Error Messages + +(defvar TeX-error-description-list + '(("Bad \\\\line or \\\\vector argument.*" . +"The first argument of a \\line or \\vector command, which specifies the +slope, is illegal\.") + + ("Bad math environment delimiter.*" . +"TeX has found either a math-mode-starting command such as \\[ or \\( +when it is already in math mode, or else a math-mode-ending command +such as \\) or \\] while in LR or paragraph mode. The problem is caused +by either unmatched math mode delimiters or unbalanced braces\.") + + ("Bad use of \\\\\\\\.*" . +"A \\\\ command appears between paragraphs, where it makes no sense. This +error message occurs when the \\\\ is used in a centering or flushing +environment or else in the scope of a centering or flushing +declaration.") + + ("\\\\begin{[^ ]*} ended by \\\\end{[^ ]*}." . +"LaTeX has found an \\end command that doesn't match the corresponding +\\begin command. You probably misspelled the environment name in the +\\end command, have an extra \\begin, or else forgot an \\end.") + + ("Can be used only in preamble." . +"LaTeX has encountered, after the \\begin{document}, one of the +following commands that should appear only in the preamble: +\\documentstyle, \\nofiles, \\includeonly, \\makeindex, or +\\makeglossary. The error is also caused by an extra \\begin{document} +command.") + + ("Command name [^ ]* already used.*" . +"You are using \\newcommand, \\newenvironment, \\newlength, \\newsavebox, +or \\newtheorem to define a command or environment name that is +already defined, or \\newcounter to define a counter that already +exists. (Defining an environment named gnu automatically defines the +command \\gnu.) You'll have to choose a new name or, in the case of +\\newcommand or \\newenvironment, switch to the \\renew ... command.") + + ("Counter too large." . +"Some object that is numbered with letters, probably an item in a +enumerated list, has received a number greater than 26. Either you're +making a very long list or you've been resetting counter values.") + + ("Environment [^ ]* undefined." . +"LaTeX has encountered a \\begin command for a nonexistent environment. +You probably misspelled the environment name. ") + + ("Float(s) lost." . +"You put a figure or table environment or a \\marginpar command inside a +parbox---either one made with a minipage environment or \\parbox +command, or one constructed by LaTeX in making a footnote, figure, +etc. This is an outputting error, and the offending environment or +command may be quite a way back from the point where LaTeX discovered +the problem. One or more figures, tables, and/or marginal notes have +been lost, but not necessarily the one that caused the error.") + + ("Illegal character in array arg." . +"There is an illegal character in the argument of an array or tabular +environment, or in the second argument of a \\multicolumn command.") + + ("Missing \\\\begin{document}." . +"LaTeX produced printed output before encountering a \\begin{document} +command. Either you forgot the \\begin{document} command or there is +something wrong in the preamble. The problem may be a stray character +or an error in a declaration---for example, omitting the braces around +an argument or forgetting the \\ in a command name.") + + ("Missing p-arg in array arg.*" . +"There is a p that is not followed by an expression in braces in the +argument of an array or tabular environment, or in the second argument +of a \\multicolumn command.") + + ("Missing @-exp in array arg." . +"There is an @ character not followed by an @-expression in the +argument of an array or tabular environment, or in the second argument +of a \\multicolumn command.") + + ("No such counter." . +"You have specified a nonexistent counter in a \\setcounter or +\\addtocounter command. This is probably caused by a simple typing +error. However, if the error occurred while a file with the extension +aux is being read, then you probably used a \\newcounter command +outside the preamble.") + + ("Not in outer par mode." . +"You had a figure or table environment or a \\marginpar command in math +mode or inside a parbox.") + + ("\\\\pushtabs and \\\\poptabs don't match." . +"LaTeX found a \\poptabs with no matching \\pushtabs, or has come to the +\\end{tabbing} command with one or more unmatched \\pushtabs commands.") + + ("Something's wrong--perhaps a missing \\\\item." . +"The most probable cause is an omitted \\item command in a list-making +environment. It is also caused by forgetting the argument of a +thebibliography environment.") + + ("Tab overflow." . +"A \\= command has exceeded the maximum number of tab stops that LaTeX +permits.") + + ("There's no line here to end." . +"A \\newline or \\\\ command appears between paragraphs, where it makes no +sense. If you're trying to ``leave a blank line'', use a \\vspace +command.") + + ("This may be a LaTeX bug." . +"LaTeX has become thoroughly confused. This is probably due to a +previously detected error, but it is possible that you have found an +error in LaTeX itself. If this is the first error message produced by +the input file and you can't find anything wrong, save the file and +contact the person listed in your Local Guide.") + + ("Too deeply nested." . +"There are too many list-making environments nested within one another. +How many levels of nesting are permitted may depend upon what computer +you are using, but at least four levels are provided, which should be +enough.") + + ("Too many unprocessed floats." . +"While this error can result from having too many \\marginpar commands +on a page, a more likely cause is forcing LaTeX to save more figures +and tables than it has room for. When typesetting its continuous +scroll, LaTeX saves figures and tables separately and inserts them as +it cuts off pages. This error occurs when LaTeX finds too many figure +and/or table environments before it is time to cut off a page, a +problem that is solved by moving some of the environments farther +towards the end of the input file. The error can also be caused by a +``logjam''---a figure or table that cannot be printed causing others +to pile up behind it, since LaTeX will not print figures or tables out +of order. The jam can be started by a figure or table that either is +too large to fit on a page or won't fit where its optional placement +argument says it must go. This is likely to happen if the argument +does not contain a p option.") + + ("Undefined tab position." . +"A \\>, \\+, \\-, or \\< command is trying to go to a nonexistent tab +position---one not defined by a \\= command.") + + ("\\\\< in mid line." . +"A \\< command appears in the middle of a line in a tabbing environment. +This command should come only at the beginning of a line.") + + ("Counter too large." . +"Footnotes are being ``numbered'' with letters or footnote symbols and +LaTeX has run out of letters or symbols. This is probably caused by +too many \\thanks commands.") + + ("Double subscript." . +"There are two subscripts in a row in a mathematical +formula---something like x_{2}_{3}, which makes no sense.") + + ("Double superscript." . +"There are two superscripts in a row in a mathematical +formula---something like x^{2}^{3}, which makes no sense.") + + ("Extra alignment tab has been changed to \\\\cr." . +"There are too many separate items (column entries) in a single row of +an array or tabular environment. In other words, there were too many & +'s before the end of the row. You probably forgot the \\\\ at the end of +the preceding row.") + + ("Extra \\}, or forgotten \\$." . +"The braces or math mode delimiters don't match properly. You probably +forgot a {, \\[, \\(, or $.") + + ("Font [^ ]* not loaded: Not enough room left." . +"The document uses more fonts than TeX has room for. If different parts +of the document use different fonts, then you can get around the +problem by processing it in parts.") + + ("I can't find file `.*'." . +"TeX can't find a file that it needs. If the name of the missing file +has the extension tex, then it is looking for an input file that you +specified---either your main file or another file inserted with an +\\input or \\include command. If the missing file has the extension sty +, then you have specified a nonexistent document style or style +option.") + + ("Illegal parameter number in definition of .*" . +"This is probably caused by a \\newcommand, \\renewcommand, +\\newenvironment, or \\renewenvironment command in which a # is used +incorrectly. A # character, except as part of the command name \\#, +can be used only to indicate an argument parameter, as in #2, which +denotes the second argument. This error is also caused by nesting one +of the above four commands inside another, or by putting a parameter +like #2 in the last argument of a \\newenvironment or \\renewenvironment +command.") + + ("Illegal unit of measure ([^ ]* inserted)." . +"If you just got a + + ! Missing number, treated as zero. + +error, then this is part of the same problem. If not, it means that +LaTeX was expecting a length as an argument and found a number +instead. The most common cause of this error is writing 0 instead of +something like 0in for a length of zero, in which case typing return +should result in correct output. However, the error can also be caused +by omitting a command argument.") + + ("Misplaced alignment tab character \\&." . +"The special character &, which should be used only to separate items +in an array or tabular environment, appeared in ordinary text. You +probably meant to type \\&.") + + ("Missing control sequence inserted." . +"This is probably caused by a \\newcommand, \\renewcommand, \\newlength, +or \\newsavebox command whose first argument is not a command name.") + + ("Missing number, treated as zero." . +"This is usually caused by a LaTeX command expecting but not finding +either a number or a length as an argument. You may have omitted an +argument, or a square bracket in the text may have been mistaken for +the beginning of an optional argument. This error is also caused by +putting \\protect in front of either a length command or a command such +as \\value that produces a number.") + + ("Missing [{}] inserted." . +"TeX has become confused. The position indicated by the error locator +is probably beyond the point where the incorrect input is.") + + ("Missing \\$ inserted." . +"TeX probably found a command that can be used only in math mode when +it wasn't in math mode. Remember that unless stated otherwise, all +the commands of Section can be used only in math mode. TeX is not in +math mode when it begins processing the argument of a box-making +command, even if that command is inside a math environment. This error +also occurs if TeX encounters a blank line when it is in math mode.") + + ("Not a letter." . +"Something appears in the argument of a \\hyphenation command that +doesn't belong there.") + + ("Paragraph ended before [^ ]* was complete." . +"A blank line occurred in a command argument that shouldn't contain +one. You probably forgot the right brace at the end of an argument.") + + ("\\\\[^ ]*font [^ ]* is undefined .*" . +"These errors occur when an uncommon font is used in math mode---for +example, if you use a \\sc command in a formula inside a footnote, +calling for a footnote-sized small caps font. This problem is solved +by using a \\load command.") + + ("Font .* not found." . +"You requested a family/series/shape/size combination that is totally +unknown. There are two cases in which this error can occur: + 1) You used the \\size macro to select a size that is not available. + 2) If you did not do that, go to your local `wizard' and + complain fiercely that the font selection tables are corrupted!") + + ("TeX capacity exceeded, sorry .*" . +"TeX has just run out of space and aborted its execution. Before you +panic, remember that the least likely cause of this error is TeX not +having the capacity to process your document. It was probably an +error in your input file that caused TeX to run out of room. The +following discussion explains how to decide whether you've really +exceeded TeX's capacity and, if so, what to do. If the problem is an +error in the input, you may have to use the divide and conquer method +described previously to locate it. LaTeX seldom runs out of space on a +short input file, so if running it on the last few pages before the +error indicator's position still produces the error, then there's +almost certainly something wrong in the input file. + +The end of the error indicator tells what kind of space TeX ran out +of. The more common ones are listed below, with an explanation of +their probable causes. + +buffer size +=========== +Can be caused by too long a piece of text as the argument +of a sectioning, \\caption, \\addcontentsline, or \\addtocontents +command. This error will probably occur when the \\end{document} is +being processed, but it could happen when a \\tableofcontents, +\\listoffigures, or \\listoftables command is executed. To solve this +problem, use a shorter optional argument. Even if you're producing a +table of contents or a list of figures or tables, such a long entry +won't help the reader. + +exception dictionary +==================== +You have used \\hyphenation commands to give TeX +more hyphenation information than it has room for. Remove some of the +less frequently used words from the \\hyphenation commands and insert +\\- commands instead. + +hash size +========= +Your input file defines too many command names and/or uses +too many cross-ref- erencing labels. + +input stack size +================ +This is probably caused by an error in a command +definition. For example, the following command makes a circular +definition, defining \\gnu in terms of itself: + + \\newcommand{\\gnu}{a \\gnu} % This is wrong! + +When TeX encounters this \\gnu command, it will keep chasing its tail +trying to figure out what \\gnu should produce, and eventually run out +of ``input stack''. + +main memory size +================ +This is one kind of space that TeX can run out of when processing a +short file. There are three ways you can run TeX out of main memory +space: (1) defining a lot of very long, complicated commands, (2) +making an index or glossary and having too many \\index or \\glossary +commands on a single page, and (3) creating so complicated a page of +output that TeX can't hold all the information needed to generate it. +The solution to the first two problems is obvious: define fewer +commands or use fewer \\index and \\glossary commands. The third problem +is nastier. It can be caused by large tabbing, tabular, array, and +picture environments. TeX's space may also be filled up with figures +and tables waiting for a place to go. To find out if you've really +exceeded TeX's capacity in this way, put a \\clearpage command in your +input file right before the place where TeX ran out of room and try +running it again. If it doesn't run out of room with the \\clearpage +command there, then you did exceed TeX's capacity. If it still runs +out of room, then there's probably an error in your file. If TeX is +really out of room, you must give it some help. Remember that TeX +processes a complete paragraph before deciding whether to cut the +page. Inserting a \\newpage command in the middle of the paragraph, +where TeX should break the page, may save the day by letting TeX write +the current page before processing the rest of the paragraph. (A +\\pagebreak command won't help.) If the problem is caused by +accumulated figures and tables, you can try to prevent them from +accumulating---either by moving them further towards the end of the +document or by trying to get them to come out sooner. If you are +still writing the document, simply add a \\clearpage command and forget +about the problem until you're ready to produce the final version. +Changes to the input file are likely to make the problem go away. + +pool size +========= +You probably used too many cross-ref-erencing \\labels and/or defined +too many new command names. More precisely, the labels and command +names that you define have too many characters, so this problem can be +solved by using shorter names. However, the error can also be caused +by omitting the right brace that ends the argument of either a counter +command such as \\setcounter, or a \\newenvironment or \\newtheorem +command. + +save size +========= +This occurs when commands, environments, and the scopes of +declarations are nested too deeply---for example, by having the +argument of a \\multiput command contain a picture environment that in +turn has a \\footnotesize declaration whose scope contains a \\multiput +command containing a ....") + + ("Text line contains an invalid character." . +"The input contains some strange character that it shouldn't. A mistake +when creating the file probably caused your text editor to insert this +character. Exactly what could have happened depends upon what text +editor you used. If examining the input file doesn't reveal the +offending character, consult the Local Guide for suggestions.") + + ("Undefined control sequence." . +"TeX encountered an unknown command name. You probably misspelled the +name. If this message occurs when a LaTeX command is being processed, +the command is probably in the wrong place---for example, the error +can be produced by an \\item command that's not inside a list-making +environment. The error can also be caused by a missing \\documentstyle +command.") + + ("Use of [^ ]* doesn't match its definition." . +"It's probably one of the picture-drawing commands, and you have used +the wrong syntax for specifying an argument. If it's \\@array that +doesn't match its definition, then there is something wrong in an +@-expression in the argument of an array or tabular +environment---perhaps a fragile command that is not \\protect'ed.") + + ("You can't use `macro parameter character \\#' in [^ ]* mode." . +"The special character # has appeared in ordinary text. You probably +meant to type \\#.") + + ("Overfull \\\\hbox .*" . +"Because it couldn't find a good place for a line break, TeX put more +on this line than it should.") + + ("Overfull \\\\vbox .*" . +"Because it couldn't find a good place for a page break, TeX put more +on the page than it should. ") + + ("Underfull \\\\hbox .*" . +"Check your output for extra vertical space. If you find some, it was +probably caused by a problem with a \\\\ or \\newline command---for +example, two \\\\ commands in succession. This warning can also be +caused by using the sloppypar environment or \\sloppy declaration, or +by inserting a \\linebreak command.") + + ("Underfull \\\\vbox .*" . +"TeX could not find a good place to break the page, so it produced a +page without enough text on it. ") + +;; New list items should be placed here +;; +;; ("err-regexp" . "context") +;; +;; the err-regexp item should match anything + + (".*" . "No help available")) ; end definition +"A list of the form (\"err-regexp\" . \"context\") used by function +\\{TeX-help-error} to display help-text on an error message or warning. +err-regexp should be a regular expression matching the error message +given from TeX/LaTeX, and context should be some lines describing that +error") + +(provide 'tex-buf) + +;;; tex-buf.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/tex-info.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,394 @@ +;;; tex-info.el - Support for editing TeXinfo source. +;; +;; Maintainer: Per Abrahamsen <auc-tex@sunsite.auc.dk> +;; Version: 9.7i + +;; Copyright (C) 1993, 1994, 1997 Per Abrahamsen +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Code: + +(require 'tex) +(condition-case nil ;Lucid is not providing. + (require 'texinfo) + (error)) + +;;; Environments: + +(defvar TeXinfo-environment-list + '(("cartouche") + ("defcv") + ("deffn") ("defivar") ("defmac") + ("defmethod") ("defop") ("defopt") ("defspec") ("deftp") + ("deftypefn") ("deftypefun") ("deftypevar") ("deftypevr") + ("defun") ("defvar") ("defvr") ("description") ("display") + ("enumerate") ("example") ("ifset") ("ifclear") ("flushleft") + ("flushright") ("format") ("ftable") ("iftex") ("itemize") + ("lisp") ("quotation") ("smallexample") ("smalllisp") ("table") + ("tex") ("titlepage") ("vtable")) + "Alist of TeXinfo environments.") + +(defconst texinfo-environment-regexp + ;; Overwrite version from `texinfo.el'. + (concat "^@\\(" + (mapconcat 'car TeXinfo-environment-list "\\|") + "\\|end\\)") + "Regexp for environment-like TeXinfo list commands. +Subexpression 1 is what goes into the corresponding `@end' statement.") + +(defun TeXinfo-insert-environment (env) + "Insert TeXinfo environment ENV. +When called interactively, prompt for an environment." + (interactive (list (completing-read "Environment: " + TeXinfo-environment-list))) + (insert "@" env "\n\n@end " env "\n") + (if (null (cdr-safe (assoc "defcv" TeXinfo-environment-list))) + (forward-line -2) + ;; apply arguments + )) + +;;; Keymap: + +(defvar TeXinfo-mode-map nil + "Keymap for TeXinfo mode.") + +(if TeXinfo-mode-map + () + (setq TeXinfo-mode-map (make-sparse-keymap)) + + ;; From texinfo.el + + ;; bindings for updating nodes and menus + (define-key TeXinfo-mode-map "\C-c\C-um" 'texinfo-master-menu) + (define-key TeXinfo-mode-map "\C-c\C-u\C-m" 'texinfo-make-menu) + (define-key TeXinfo-mode-map "\C-c\C-u\C-n" 'texinfo-update-node) + (define-key TeXinfo-mode-map "\C-c\C-u\C-e" 'texinfo-every-node-update) + (define-key TeXinfo-mode-map "\C-c\C-u\C-a" 'texinfo-all-menus-update) + + ;; From TeX-mode + + ;; Standard + (define-key TeXinfo-mode-map "\177" 'backward-delete-char-untabify) + (define-key TeXinfo-mode-map "\C-c}" 'up-list) + (define-key TeXinfo-mode-map "\C-c#" 'TeX-normal-mode) + (define-key TeXinfo-mode-map "\C-c\C-n" 'TeX-normal-mode) + (define-key TeXinfo-mode-map "\C-c?" 'describe-mode) + + ;; From tex.el + (define-key TeXinfo-mode-map "\C-c{" 'TeX-insert-braces) + (define-key TeXinfo-mode-map "\C-c\C-f" 'TeX-font) + (define-key TeXinfo-mode-map "\C-c\C-m" 'TeX-insert-macro) + (define-key TeXinfo-mode-map "\e\t" 'TeX-complete-symbol) + + (define-key TeXinfo-mode-map "\C-c;" 'TeX-comment-region) + (define-key TeXinfo-mode-map "\C-c%" 'TeX-comment-paragraph) + (define-key TeXinfo-mode-map "\C-c'" 'TeX-comment-paragraph) ;*** Old way + (define-key TeXinfo-mode-map "\C-c:" 'TeX-un-comment-region) ;*** Old way + (define-key TeXinfo-mode-map "\C-c\"" 'TeX-un-comment) ;*** Old way + + ;; From tex-buf.el + (define-key TeXinfo-mode-map "\C-c\C-c" 'TeX-command-master) + (define-key TeXinfo-mode-map "\C-c\C-k" 'TeX-kill-job) + (define-key TeXinfo-mode-map "\C-c\C-l" 'TeX-recenter-output-buffer) + (define-key TeXinfo-mode-map "\C-c^" 'TeX-home-buffer) + (define-key TeXinfo-mode-map "\C-c`" 'TeX-next-error) + (define-key TeXinfo-mode-map "\C-c\C-w" 'TeX-toggle-debug-boxes) + + ;; From tex.cpl.el + + ;; Simulating LaTeX-mode + + (define-key TeXinfo-mode-map "\C-c\C-e" 'TeXinfo-insert-environment) + (define-key TeXinfo-mode-map "\C-c\n" 'texinfo-insert-@item) + (define-key TeXinfo-mode-map "\C-c\C-s" 'texinfo-insert-@node) + (define-key TeXinfo-mode-map "\C-c]" 'texinfo-insert-@end)) + +(easy-menu-define TeXinfo-mode-menu + TeXinfo-mode-map + "Menu used in TeXinfo mode." + (list "TeXinfo" + ["Environment..." TeXinfo-insert-environment t] + ["Node..." texinfo-insert-@node t] + ["Macro..." TeX-insert-macro t] + ["Complete" TeX-complete-symbol t] + ["Item" texinfo-insert-@item t] + (list "Insert Font" + ["Emphasize" (TeX-font nil ?\C-e) :keys "C-c C-f C-e"] + ["Bold" (TeX-font nil ?\C-b) :keys "C-c C-f C-b"] + ["Typewriter" (TeX-font nil ?\C-t) :keys "C-c C-f C-t"] + ["Small Caps" (TeX-font nil ?\C-c) :keys "C-c C-f C-c"] + ["Italic" (TeX-font nil ?\C-i) :keys "C-c C-f C-i"] + ["Sample" (TeX-font nil ?\C-s) :keys "C-c C-f C-s"] + ["Roman" (TeX-font nil ?\C-r) :keys "C-c C-f C-r"]) + (list "Change Font" + ["Emphasize" (TeX-font t ?\C-e) :keys "C-u C-c C-f C-e"] + ["Bold" (TeX-font t ?\C-b) :keys "C-u C-c C-f C-b"] + ["Typewriter" (TeX-font t ?\C-t) :keys "C-u C-c C-f C-t"] + ["Small Caps" (TeX-font t ?\C-c) :keys "C-u C-c C-f C-c"] + ["Italic" (TeX-font t ?\C-i) :keys "C-u C-c C-f C-i"] + ["Sample" (TeX-font t ?\C-s) :keys "C-u C-c C-f C-s"] + ["Roman" (TeX-font t ?\C-r) :keys "C-u C-c C-f C-r"]) + "-" + ["Save Document" TeX-save-document t] + ["Next Error" TeX-next-error t] + (list "TeX Output" + ["Kill Job" TeX-kill-job t] + ["Debug Bad Boxes" TeX-toggle-debug-boxes + :style toggle :selected TeX-debug-bad-boxes ] + ["Switch to original file" TeX-home-buffer t] + ["Recenter Output Buffer" TeX-recenter-output-buffer t]) + "--" + ["Create Master Menu" texinfo-master-menu t] + ["Create Menu" texinfo-make-menu t] + ["Update Node" texinfo-update-node t] + ["Update Every Node" texinfo-every-node-update t] + ["Update All Menus" texinfo-all-menus-update t] + ["Uncomment Region" TeX-un-comment-region t] + ["Comment Region" TeX-comment-region t] + ["Switch to Master file" TeX-home-buffer t] + ["Submit bug report" TeX-submit-bug-report t] + ["Reset Buffer" TeX-normal-mode t] + ["Reset AUC TeX" (TeX-normal-mode t) :keys "C-u C-c C-n"])) + +(easy-menu-define TeXinfo-command-menu + TeXinfo-mode-map + "Menu used in TeXinfo mode for external commands." + (append '("Command") + (mapcar 'TeX-command-menu-entry TeX-command-list))) + +(defvar TeXinfo-font-list + '((?\C-b "@b{" "}") + (?\C-c "@sc{" "}") + (?\C-e "@emph{" "}") + (?\C-i "@i{" "}") + (?\C-r "@r{" "}") + (?\C-s "@samp{" "}") + (?\C-t "@t{" "}") + (?s "@strong{" "}") + (?\C-f "@file{" "}") + (?\C-d "@dfn{" "}") + (?\C-v "@var{" "}") + (?k "@key{" "}") + (?\C-k "@kbd{" "}") + (?c "@code{" "}") + (?C "@cite{" "}")) + "Font commands used in TeXinfo mode. See `TeX-font-list'.") + +;;; Mode: + +;;; Do not ;;;###autoload because of conflict with standard tex-mode.el. +(defun texinfo-mode () + "Major mode for editing files of input for TeXinfo. + +Special commands: +\\{TeXinfo-mode-map} + +Entering TeXinfo mode calls the value of text-mode-hook, +then the value of TeX-mode-hook, and then the value of +TeXinfo-mode-hook." + (interactive) + ;; Mostly stolen from texinfo.el + (setq mode-name "TeXinfo") + (setq major-mode 'texinfo-mode) + (use-local-map TeXinfo-mode-map) + (set-syntax-table texinfo-mode-syntax-table) + (make-local-variable 'page-delimiter) + (setq page-delimiter + (concat + "^@node [ \t]*[Tt]op\\|^@\\(" + texinfo-chapter-level-regexp + "\\)")) + (make-local-variable 'require-final-newline) + (setq require-final-newline t) + (make-local-variable 'indent-tabs-mode) + (setq indent-tabs-mode nil) + (make-local-variable 'paragraph-separate) + (setq paragraph-separate + (concat "\b\\|^@[a-zA-Z]*[ \n]\\|" paragraph-separate)) + (make-local-variable 'paragraph-start) + (setq paragraph-start + (concat "\b\\|^@[a-zA-Z]*[ \n]\\|" paragraph-start)) + (make-local-variable 'fill-column) + (setq fill-column 72) + (make-local-variable 'comment-start) + (setq comment-start "@c ") + (make-local-variable 'comment-start-skip) + (setq comment-start-skip "@c +\\|@comment +") + (make-local-variable 'words-include-escapes) + (setq words-include-escapes t) + (if (not (boundp 'texinfo-imenu-generic-expression)) + ;; This was introduced in 19.30. + () + (make-local-variable 'imenu-generic-expression) + (setq imenu-generic-expression texinfo-imenu-generic-expression)) + (make-local-variable 'font-lock-defaults) + (setq font-lock-defaults '(texinfo-font-lock-keywords t)) + (if (not (boundp 'texinfo-section-list)) + ;; This was included in 19.31. + () + (make-local-variable 'outline-regexp) + (setq outline-regexp + (concat "@\\(" + (mapconcat 'car texinfo-section-list "\\>\\|") + "\\>\\)")) + (make-local-variable 'outline-level) + (setq outline-level 'texinfo-outline-level)) + + ;; Mostly AUC TeX stuff + (easy-menu-add TeXinfo-command-menu TeXinfo-mode-map) + (easy-menu-add TeXinfo-mode-menu TeXinfo-mode-map) + (make-local-variable 'TeX-command-current) + (setq TeX-command-current 'TeX-command-master) + + (setq TeX-default-extension "texi") + (make-local-variable 'TeX-esc) + (setq TeX-esc "@") + + (make-local-variable 'TeX-auto-regexp-list) + (setq TeX-auto-regexp-list 'TeX-auto-empty-regexp-list) + (make-local-variable 'TeX-auto-update) + (setq TeX-auto-update t) + + (setq TeX-command-default "TeX") + (setq TeX-header-end "%**end") + (setq TeX-trailer-start (regexp-quote (concat TeX-esc "bye"))) + + (make-local-variable 'TeX-complete-list) + (setq TeX-complete-list + (list (list "@\\([a-zA-Z]*\\)" 1 'TeX-symbol-list nil) + (list "" TeX-complete-word))) + + (make-local-variable 'TeX-font-list) + (setq TeX-font-list TeXinfo-font-list) + + (TeX-add-symbols + '("appendix" "Title") + '("appendixsec" "Title") + '("appendixsection" "Title") + '("appendixsubsec" "Title") + '("appendixsubsubsec" "Title") + '("asis") + '("author" "Author") + '("b" "Text") + '("bullet") + '("bye") + '("c" "Comment") + '("center" "Line-of-text") + '("chapheading" "Title") + '("chapter" "Title") + '("cindex" "Entry") + '("cite" "Reference") + '("clear" "Flag") + '("code" "Sample-code") + '("comment" "Comment") + '("contents") + '("copyright") + '("defcodeindex" "Index-name") + '("defindex" "Index-name") + '("dfn" "Term") + '("dmn" "Dimension") + '("dots") + '("emph" "Text") + '("equiv") + '("error") + '("evenfooting" TeXinfo-lrc-argument-hook) + '("evenheading" TeXinfo-lrc-argument-hook) + '("everyfooting" TeXinfo-lrc-argument-hook) + '("everyheading" TeXinfo-lrc-argument-hook) + '("exdent" "Line-of-text") + '("expansion") + '("file" "Filename") + '("finalout") + '("findex" "Entry") + '("footnote" "Text-of-footnote") + '("footnotestyle" "Style") + '("group") + '("heading" "Title") + '("headings" "On-off-single-double") + '("i" "Text") + '("ignore") + '("include" "Filename") + '("inforef" "Node-name" "Info-file-name") + '("item") + '("itemx") + '("kbd" "Keyboard-characters") + '("key" "Key-name") + '("kindex" "Entry") + '("majorheading" "Title") + '("menu") + '("minus") + '("need" "N") + '("node" "Name" "Next" "Previous" "Up") + '("noindent") + '("oddfooting" TeXinfo-lrc-argument-hook) + '("oddheading" TeXinfo-lrc-argument-hook) + '("page") + '("paragraphindent" "Indent") + '("pindex" "Entry") + '("point") + '("print") + '("printindex" "Index-name") + '("pxref" "Node-name") + '("r" "Text") + '("ref" "Node-name") + '("refill") + '("result") + '("samp" "Text") + '("sc" "Text") + '("section" "Title") + '("set" "Flag") + '("setchapternewpage" "On-off-odd") + '("setfilename" "Info-file-name") + '("settitle" "Title") + '("shortcontents") + '("smallbook") + '("sp" "N") + '("strong" "Text") + '("subheading" "Title") + '("subsection" "Title") + '("subsubheading" "Title") + '("subsubsection" "Title") + '("subtitle" "Title") + '("summarycontents") + '("syncodeindex" "From-index" "Into-index") + '("synindex" "From-index" "Into-index") + '("t" "Text") + '("TeX") + '("thischapter") + '("thischaptername") + '("thisfile") + '("thispage") + '("tindex" "Entry") + '("title" "Title") + '("titlefont" "Text") + '("titlepage") + '("today") + '("top" "Title") + '("unnumbered" "Title") + '("unnumberedsec" "Title") + '("unnumberedsubsec" "Title") + '("unnumberedsubsubsec" "Title") + '("value" "Flag") + '("var" "Metasyntactic-variable") + '("vindex" "Entry") + '("vskip" "Amount") + '("w" "Text")) + + (run-hooks 'text-mode-hook 'TeXinfo-mode-hook)) + +(provide 'tex-info) + +;;; tex-info.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/tex-jp.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,1197 @@ +;;; tex-jp.el - Support for Japanese TeX. + +;;; Code: + +(require 'latex) + +;;; Customization + +(setq TeX-format-list + (append '(("JLATEX" japanese-latex-mode + "\\\\\\(\\\\documentstyle[^%\n]*{j\\|\\\\documentclass[^%\n]*{j\\)") + ("JTEX" japanese-plain-tex-mode + "-- string likely in Japanese TeX --")) + TeX-format-list)) + +(setq TeX-command-list + (append (list (list "jTeX" "jtex '\\nonstopmode\\input %t'" + 'TeX-run-TeX nil t) + (list "pTeX" "ptex '\\nonstopmode\\input %t'" + 'TeX-run-TeX nil t) + (list "jBibTeX" "jbibtex %s" 'TeX-run-BibTeX nil nil)) + TeX-command-list)) + +(setq LaTeX-command-style + (append (if (string-equal LaTeX-version "2") + '(("^ams" "amsjlatex") + ("^jslides$" "jslitex") + ("^j-?\\(article\\|report\\|book\\)$" "jlatex")) + '(("^j-\\(article\\|report\\|book\\)$" "jlatex") + ("^j\\(article\\|report\\|book\\)$" "platex") + ("." "jlatex"))) + LaTeX-command-style)) + +(setcdr (assoc "%l" TeX-expand-list) + (list 'TeX-style-check LaTeX-command-style)) + +(defvar japanese-TeX-error-messages t + "If non-nil, explain TeX error messages in Japanese.") + +(if (or (boundp 'MULE) + (featurep 'mule)) + (if (string-match "XEmacs" emacs-version) + (progn + (defvar TeX-japanese-process-input-coding-system + (find-coding-system 'euc-japan) + "TeX-process' coding system with standard input.") + (defvar TeX-japanese-process-output-coding-system + (find-coding-system 'junet) + "TeX-process' coding system with standard output.")) + (progn + (defvar TeX-japanese-process-input-coding-system *euc-japan* + "TeX-process' coding system with standard input.") + (defvar TeX-japanese-process-output-coding-system *junet* + "TeX-process' coding system with standard output.")))) + +(if (boundp 'NEMACS) + (defvar TeX-process-kanji-code 2 + "TeX-process' kanji code with standard I/O. +0:No-conversion 1:Shift-JIS 2:JIS 3:EUC/AT&T/DEC")) + +(defvar japanese-LaTeX-default-style "j-article" + "*Default when creating new Japanese documents.") +(make-variable-buffer-local 'japanese-LaTeX-default-style) + +(defvar japanese-LaTeX-style-list + '(("book") + ("article") + ("letter") + ("slides") + ("report") + ("jbook") + ("j-book") + ("jarticle") + ("j-article") + ("jslides") + ("jreport") + ("j-report")) + "*List of Japanese document styles.") +(make-variable-buffer-local 'japanese-LaTeX-style-list) + +;;; Coding system + +(if (boundp 'MULE) + (setq TeX-after-start-process-function + (function (lambda (process) + (set-process-coding-system + process + TeX-japanese-process-input-coding-system + TeX-japanese-process-output-coding-system))))) +(if (boundp 'NEMACS) + (setq TeX-after-start-process-function + (function + (lambda (process) + (set-process-kanji-code process TeX-process-kanji-code))))) + +(if (and (string-match "XEmacs" emacs-version) + (featurep 'mule)) + (setq TeX-after-start-process-function + (function (lambda (process) + (set-process-input-coding-system + process + TeX-japanese-process-input-coding-system) + (set-process-output-coding-system + process + TeX-japanese-process-output-coding-system))))) + +;;; Japanese Parsing + +(if (or (boundp 'MULE) + (featurep 'mule)) +(progn + +(defconst LaTeX-auto-regexp-list + (append + '(("\\\\newcommand{?\\\\\\(\\([a-zA-Z]\\|\\cj\\)+\\)}?\\[\\([0-9]+\\)\\]\ +\\[\\([^\]\\\\\n\r]+\\)\\]" + (1 3 4) LaTeX-auto-optional) + ("\\\\newcommand{?\\\\\\(\\([a-zA-Z]\\|\\cj\\)+\\)}?\\[\\([0-9]+\\)\\]" + (1 3) LaTeX-auto-arguments) + ("\\\\newcommand{?\\\\\\(\\([a-zA-Z]\\|\\cj\\)+\\)}?" 1 TeX-auto-symbol) + ("\\\\newenvironment{?\\(\\([a-zA-Z]\\|\\cj\\)+\\)}?\\[\\([0-9]+\\)\\]" + (1 3) LaTeX-auto-env-args) + ("\\\\newenvironment{?\\(\\([a-zA-Z]\\|\\cj\\)+\\)}?" 1 LaTeX-auto-environment) + ("\\\\newtheorem{\\(\\([a-zA-Z]\\|\\cj\\)+\\)}" 1 LaTeX-auto-environment) + ("\\\\input{\\(\\.*[^#}%\\\\\\.\n\r]+\\)\\(\\.[^#}%\\\\\\.\n\r]+\\)?}" + 1 TeX-auto-file) + ("\\\\include{\\(\\.*[^#}%\\\\\\.\n\r]+\\)\\(\\.[^#}%\\\\\\.\n\r]+\\)?}" + 1 TeX-auto-file) + ("\\\\usepackage\\(\\[[^\]\\\\]*\\]\\)?\ +{\\(\\([^#}\\\\\\.%]\\|%[^\n\r]*[\n\r]\\)+\\)}" + (2) LaTeX-auto-style) + ("\\\\bibitem{\\(\\([a-zA-Z]\\|\\cj\\)[^, \n\r\t%\"#'()={}]*\\)}" 1 LaTeX-auto-bibitem) + ("\\\\bibitem\\[[^][\n\r]+\\]{\\(\\([a-zA-Z]\\|\\cj\\)[^, \n\r\t%\"#'()={}]*\\)}" + 1 LaTeX-auto-bibitem) + ("\\\\bibliography{\\([^#}\\\\\n\r]+\\)}" 1 LaTeX-auto-bibliography)) + LaTeX-auto-label-regexp-list + LaTeX-auto-minimal-regexp-list) + "List of regular expression matching common LaTeX macro definitions.") + +(defconst plain-TeX-auto-regexp-list + '(("\\\\def\\\\\\(\\([a-zA-Z]\\|\\cj\\)+\\)[^a-zA-Z@]" 1 + TeX-auto-symbol-check) + ("\\\\let\\\\\\(\\([a-zA-Z]\\|\\cj\\)+\\)[^a-zA-Z@]" 1 + TeX-auto-symbol-check) + ("\\\\font\\\\\\(\\([a-zA-Z]\\|\\cj\\)+\\)[^a-zA-Z@]" 1 TeX-auto-symbol) + ("\\\\chardef\\\\\\(\\([a-zA-Z]\\|\\cj\\)+\\)[^a-zA-Z@]" 1 TeX-auto-symbol) + ("\\\\new\\(count|dimen|muskip|skip\\)\\\\\\(\\([a-z]\\|\\cj\\)+\\)[^a-zA-Z@]" + 2 TeX-auto-symbol) + ("\\\\newfont{?\\\\\\(\\([a-zA-Z]\\|\\cj\\)+\\)}?" 1 TeX-auto-symbol) + ("\\\\typein\\[\\\\\\(\\([a-zA-Z]\\|\\cj\\)+\\)\\]" 1 TeX-auto-symbol) + ("\\\\input +\\(\\.*[^#%\\\\\\.\n\r]+\\)\\(\\.[^#%\\\\\\.\n\r]+\\)?" + 1 TeX-auto-file) + ("\\\\mathchardef\\\\\\(\\([a-zA-Z]\\|\\cj\\)+\\)[^a-zA-Z@]" 1 + TeX-auto-symbol)) + "List of regular expression matching common LaTeX macro definitions.") + +(defconst BibTeX-auto-regexp-list + '(("@[Ss][Tt][Rr][Ii][Nn][Gg]" 1 ignore) + ("@[a-zA-Z]+[{(][ \t]*\\(\\([a-zA-Z]\\|\\cj\\)[^, \n\r\t%\"#'()={}]*\\)" + 1 LaTeX-auto-bibitem)) + "List of regexp-list expressions matching BibTeX items.") + +)) + +(if (boundp 'NEMACS) +(progn + +(defconst LaTeX-auto-regexp-list + (append + '(("\\\\newcommand{?\\\\\\(\\([a-zA-Z]\\|\\z\\)+\\)}?\\[\\([0-9]+\\)\\]\ +\\[\\([^\]\\\\\n\r]+\\)\\]" + (1 3 4) LaTeX-auto-optional) + ("\\\\newcommand{?\\\\\\(\\([a-zA-Z]\\|\\z\\)+\\)}?\\[\\([0-9]+\\)\\]" + (1 3) LaTeX-auto-arguments) + ("\\\\newcommand{?\\\\\\(\\([a-zA-Z]\\|\\z\\)+\\)}?" 1 TeX-auto-symbol) + ("\\\\newenvironment{?\\(\\([a-zA-Z]\\|\\z\\)+\\)}?\\[\\([0-9]+\\)\\]" + (1 3) LaTeX-auto-env-args) + ("\\\\newenvironment{?\\(\\([a-zA-Z]\\|\\z\\)+\\)}?" 1 LaTeX-auto-environment) + ("\\\\newtheorem{\\(\\([a-zA-Z]\\|\\z\\)+\\)}" 1 LaTeX-auto-environment) + ("\\\\input{\\(\\.*[^#}%\\\\\\.\n\r]+\\)\\(\\.[^#}%\\\\\\.\n\r]+\\)?}" + 1 TeX-auto-file) + ("\\\\include{\\(\\.*[^#}%\\\\\\.\n\r]+\\)\\(\\.[^#}%\\\\\\.\n\r]+\\)?}" + 1 TeX-auto-file) + ("\\\\usepackage\\(\\[[^\]\\\\]*\\]\\)?\ +{\\(\\([^#}\\\\\\.%]\\|%[^\n\r]*[\n\r]\\)+\\)}" + (2) LaTeX-auto-style) + ("\\\\bibitem{\\(\\([a-zA-Z]\\|\\z\\)[^, \n\r\t%\"#'()={}]*\\)}" 1 LaTeX-auto-bibitem) + ("\\\\bibitem\\[[^][\n\r]+\\]{\\(\\([a-zA-Z]\\|\\z\\)[^, \n\r\t%\"#'()={}]*\\)}" + 1 LaTeX-auto-bibitem) + ("\\\\bibliography{\\([^#}\\\\\n\r]+\\)}" 1 LaTeX-auto-bibliography)) + LaTeX-auto-label-regexp-list + LaTeX-auto-minimal-regexp-list) + "List of regular expression matching common LaTeX macro definitions.") + +(defconst plain-TeX-auto-regexp-list + '(("\\\\def\\\\\\(\\([a-zA-Z]\\|\\z\\)+\\)[^a-zA-Z@]" 1 + TeX-auto-symbol-check) + ("\\\\let\\\\\\(\\([a-zA-Z]\\|\\z\\)+\\)[^a-zA-Z@]" 1 + TeX-auto-symbol-check) + ("\\\\font\\\\\\(\\([a-zA-Z]\\|\\z\\)+\\)[^a-zA-Z@]" 1 TeX-auto-symbol) + ("\\\\chardef\\\\\\(\\([a-zA-Z]\\|\\z\\)+\\)[^a-zA-Z@]" 1 TeX-auto-symbol) + ("\\\\new\\(count|dimen|muskip|skip\\)\\\\\\(\\([a-z]\\|\\z\\)+\\)[^a-zA-Z@]" + 2 TeX-auto-symbol) + ("\\\\newfont{?\\\\\\(\\([a-zA-Z]\\|\\z\\)+\\)}?" 1 TeX-auto-symbol) + ("\\\\typein\\[\\\\\\(\\([a-zA-Z]\\|\\z\\)+\\)\\]" 1 TeX-auto-symbol) + ("\\\\input +\\(\\.*[^#%\\\\\\.\n\r]+\\)\\(\\.[^#%\\\\\\.\n\r]+\\)?" + 1 TeX-auto-file) + ("\\\\mathchardef\\\\\\(\\([a-zA-Z]\\|\\z\\)+\\)[^a-zA-Z@]" 1 + TeX-auto-symbol)) + "List of regular expression matching common LaTeX macro definitions.") + +(defconst BibTeX-auto-regexp-list + '(("@[Ss][Tt][Rr][Ii][Nn][Gg]" 1 ignore) + ("@[a-zA-Z]+[{(][ \t]*\\(\\([a-zA-Z]\\|\\z\\)[^, \n\r\t%\"#'()={}]*\\)" + 1 LaTeX-auto-bibitem)) + "List of regexp-list expressions matching BibTeX items.") + +)) + +(defconst TeX-auto-full-regexp-list + (append LaTeX-auto-regexp-list plain-TeX-auto-regexp-list) + "Full list of regular expression matching TeX macro definitions.") + +;;; Japanese TeX modes + +(defvar japanese-TeX-mode nil + "Flag to determine if Japanese initialization is needed.") + +(add-hook 'plain-TeX-mode-hook 'japanese-plain-tex-mode-initialization) + +;;;###autoload +(defun japanese-plain-tex-mode () + "Major mode for editing files of input for Japanese plain TeX. +Set japanese-TeX-mode to t, and enters plain-tex-mode." + (interactive) + (setq japanese-TeX-mode t) + (plain-tex-mode)) + +(defun japanese-plain-tex-mode-initialization () + "Japanese plain-TeX specific initializations." + (if japanese-TeX-mode + (setq TeX-command-default "jTeX"))) + +(add-hook 'LaTeX-mode-hook 'japanese-latex-mode-initialization) + +;;;###autoload +(defun japanese-latex-mode () + "Major mode for editing files of input for Japanese plain TeX. +Set japanese-TeX-mode to t, and enters latex-mode." + (interactive) + (setq japanese-TeX-mode t) + (latex-mode)) + +(defun japanese-latex-mode-initialization () + "Japanese LaTeX specific initializations." + (if japanese-TeX-mode + (progn + (setq LaTeX-default-style japanese-LaTeX-default-style) + (setq LaTeX-style-list japanese-LaTeX-style-list) + (setq TeX-command-BibTeX "jBibTeX") + (setq japanese-TeX-mode nil)))) + +;;; MULE and NEMACS paragraph filling. + +(if (boundp 'MULE) +(if (string-lessp emacs-version "19") +(defun LaTeX-fill-region-as-paragraph (from to &optional justify-flag) + "Fill region as one paragraph: break lines to fit fill-column. +Prefix arg means justify too. +From program, pass args FROM, TO and JUSTIFY-FLAG." + (interactive "*r\nP") + (save-restriction + (goto-char from) + (skip-chars-forward "\n") + (LaTeX-indent-line) + (beginning-of-line) + (narrow-to-region (point) to) + (setq from (point)) + + ;; Delete whitespace at beginning of line from every line, + ;; except the first line. + (goto-char (point-min)) + (forward-line 1) + (while (not (eobp)) + (delete-horizontal-space) + (forward-line 1)) + + ;; Ignore the handling routine related with `fill-prefix'. + + ;; from is now before the text to fill, + ;; but after any fill prefix on the first line. + + ;; Make sure sentences ending at end of line get an extra space. + (goto-char from) + ;;; patch by S.Tomura 88-Jun-30 + ;;$B!cE}9g!d(B + ;; . + CR ==> . + SPC + SPC + ;; . + SPC + CR + ==> . + SPC + + ;;(while (re-search-forward "[.?!][])""']*$" nil t) + ;; (insert ? )) + (while (re-search-forward "[.?!][])\"']*$" nil t) + (if (eobp) + nil + ;; replace CR by two spaces. + (delete-char 1) ; delete newline + (insert " "))) + ;; end of patch + ;; The change all newlines to spaces. + ;; patched by S.Tomura 87-Dec-7 + ;; bug fixed by S.Tomura 88-May-25 + ;; modified by S.Tomura 88-Jun-21 + ;;(subst-char-in-region from (point-max) ?\n ?\ ) + ;; modified by K.Handa 92-Mar-2 + ;; Spacing is not necessary for charcters of no word-separater. + ;; The regexp word-across-newline is used for this check. + (if (not (stringp word-across-newline)) + (subst-char-in-region from (point-max) ?\n ?\ ) + (goto-char from) + (end-of-line) + (while (not (eobp)) + (delete-char 1) + (if (eobp) nil ; 92.6.30 by K.Handa + (if (not (looking-at word-across-newline)) + (progn + (forward-char -1) + (if (and (not (eq (following-char) ? )) + (not (looking-at word-across-newline))) + (progn + (forward-char 1) + (insert ? )) + (forward-char 1)))) + (end-of-line)))) + ;; After the following processing, there's two spaces at end of sentence + ;; and single space at end of line within sentence. + ;; end of patch + ;; Flush excess spaces, except in the paragraph indentation. + (goto-char from) + (skip-chars-forward " \t") + (while (re-search-forward " *" nil t) + (delete-region + (+ (match-beginning 0) + (if (save-excursion + (skip-chars-backward " ])\"'") + (memq (preceding-char) '(?. ?? ?!))) + 2 1)) + (match-end 0))) + (goto-char (point-max)) + (delete-horizontal-space) + (insert " ") + (goto-char (point-min)) + (let ((prefixcol 0) + ;; patch by K.Handa 92-Mar-2 + (re-break-point (concat "[ \t\n]\\|" word-across-newline)) + ;; end of patch + ) + (while (not (eobp)) + (move-to-column (1+ fill-column)) + (if (eobp) + nil + ;; patched by S.Tomura 87-Jun-2 + ;; Big change by K.Handa 92-Mar-2 + ;; Move back to start of word. + ;; (skip-chars-backward "^ \n") + ;; (if (if (zerop prefixcol) (bolp) (>= prefixcol (current-column))) + ;; ;; Move back over whitespace before the word. + ;; (skip-chars-forward "^ \n") + ;; ;; Normally, move back over the single space between the words. + ;; (forward-char -1)) + + ;; At first, find breaking point at the left of fill-column, + ;; but after kinsoku-shori, the point may be right of fill-column. + ;; 92.4.15 by K.Handa -- re-search-backward will back to prev line. + ;; 92.4.27 by T.Enami -- We might have gone back too much... + (let ((p (point)) ch) + (re-search-backward re-break-point nil 'mv) + (setq ch (following-char)) + (if (or (= ch ? ) (= ch ?\t)) + (skip-chars-backward " \t") + (forward-char 1) + (if (<= p (point)) + (forward-char -1)))) + (kinsoku-shori) + ;; Check if current column is at the right of prefixcol. + ;; If not, find break-point at the right of fill-column. + ;; This time, force kinsoku-shori-nobashi. + (if (>= prefixcol (current-column)) + (progn + (move-to-column (1+ fill-column)) + ;; 92.4.15 by K.Handa -- suppress error in re-search-forward + (re-search-forward re-break-point nil t) + (forward-char -1) + (kinsoku-shori-nobashi)))) + ;; end of patch S.Tomura + + ;; Replace all whitespace here with one newline. + ;; Insert before deleting, so we don't forget which side of + ;; the whitespace point or markers used to be on. + ;; patch by S. Tomura 88-Jun-20 + ;; 92.4.27 by K.Handa + (skip-chars-backward " \t") + (if mc-flag + ;; $B!cJ,3d!d(B WAN means chars which match word-across-newline. + ;; (0) | SPC + SPC* <EOB> --> NL + ;; (1) WAN | SPC + SPC* --> WAN + SPC + NL + ;; (2) | SPC + SPC* + WAN --> SPC + NL + WAN + ;; (3) '.' | SPC + nonSPC --> '.' + SPC + NL + nonSPC + ;; (4) '.' | SPC + SPC --> '.' + NL + ;; (5) | SPC* --> NL + (let ((start (point)) ; 92.6.30 by K.Handa + (ch (following-char))) + (if (and (= ch ? ) + (progn ; not case (0) -- 92.6.30 by K.Handa + (skip-chars-forward " \t") + (not (eobp))) + (or + (progn ; case (1) + (goto-char start) + (forward-char -1) + (looking-at word-across-newline)) + (progn ; case (2) + (goto-char start) + (skip-chars-forward " \t") + (and (not (eobp)) + (looking-at word-across-newline))) + (progn ; case (3) + (goto-char (1+ start)) + (and (not (eobp)) + (/= (following-char) ? ) + (progn + (skip-chars-backward " ])\"'") + (memq (preceding-char) '(?. ?? ?!))))))) + ;; We should keep one SPACE before NEWLINE. (1),(2),(3) + (goto-char (1+ start)) + ;; We should delete all SPACES around break point. (4),(5) + (goto-char start)))) + ;; end of patch + (if (equal (preceding-char) ?\\) + (insert ? )) + (insert ?\n) + (delete-horizontal-space) + + ;; Ignore the handling routine related with `fill-prefix'. + + (LaTeX-indent-line) + (setq prefixcol (current-column)) + ;; Justify the line just ended, if desired. + (and justify-flag (not (eobp)) + (progn + (forward-line -1) + (justify-current-line) + (forward-line 1))) + ) + (goto-char (point-max)) + (delete-horizontal-space)))) +(defun LaTeX-fill-region-as-paragraph (from to &optional justify-flag) + "Fill region as one paragraph: break lines to fit fill-column.\n\ +Prefix arg means justify too.\n\ +From program, pass args FROM, TO and JUSTIFY-FLAG." + (interactive "*r\nP") + (save-restriction + (goto-char from) + (skip-chars-forward " \n") + (LaTeX-indent-line) + (beginning-of-line) + (narrow-to-region (point) to) + (setq from (point)) + + ;; Delete whitespace at beginning of line from every line, + ;; except the first line. + (goto-char (point-min)) + (forward-line 1) + (while (not (eobp)) + (delete-horizontal-space) + (forward-line 1)) + + ;; from is now before the text to fill, + ;; but after any fill prefix on the first line. + + ;; Make sure sentences ending at end of line get an extra space. + (goto-char from) + ;; patch by S.Tomura 88-Jun-30 + ;;$B!cE}9g!d(B + ;; . + CR ==> . + SPC + SPC + ;; . + SPC + CR + ==> . + SPC + + ;; (while (re-search-forward "[.?!][])\"']*$" nil t) + ;; (insert ? )) + (while (re-search-forward "[.?!][])}\"']*$" nil t) + (if (eobp) + nil + ;; replace CR by two spaces. + ;; insert before delete to preserve marker. + (insert " ") + ;; delete newline + (delete-char 1))) + ;; end of patch + ;; The change all newlines to spaces. + ;; (subst-char-in-region from (point-max) ?\n ?\ ) + ;; patched by S.Tomura 87-Dec-7 + ;; bug fixed by S.Tomura 88-May-25 + ;; modified by S.Tomura 88-Jun-21 + ;; modified by K.Handa 92-Mar-2 + ;; Spacing is not necessary for charcters of no word-separater. + ;; The regexp word-across-newline is used for this check. + (if (not (stringp word-across-newline)) + (subst-char-in-region from (point-max) ?\n ?\ ) + ;; + ;; WAN +NL+WAN --> WAN + WAN + ;; not(WAN)+NL+WAN --> not(WAN) + WAN + ;; WAN +NL+not(WAN) --> WAN + not(WAN) + ;; SPC +NL+not(WAN) --> SPC + not(WAN) + ;; not(WAN)+NL+not(WAN) --> not(WAN) + SPC + not(WAN) + ;; + (goto-char from) + (end-of-line) + (while (not (eobp)) + ;; 92.8.26 , 92.8.30 by S. Tomura + + ;; Insert SPC only when point is between nonWAN. Insert + ;; before deleting to preserve marker if possible. + (if (or (prog2 ; check following char. + (forward-char) ; skip newline + (or (eobp) + (looking-at word-across-newline)) + (forward-char -1)) + (prog2 ; check previous char. + (forward-char -1) + (or (eq (following-char) ?\ ) + (looking-at word-across-newline)) + (forward-char))) + nil + (insert ?\ )) + (delete-char 1) ; delete newline + (end-of-line))) + ;; Flush excess spaces, except in the paragraph indentation. + (goto-char from) + (skip-chars-forward " \t") + (while (re-search-forward " *" nil t) + (delete-region + (+ (match-beginning 0) + (if (save-excursion + (skip-chars-backward " ])\"'") + (memq (preceding-char) '(?. ?? ?!))) + 2 1)) + (match-end 0))) + (goto-char (point-max)) + (delete-horizontal-space) + (insert " ") + (goto-char (point-min)) + (let ((prefixcol 0) linebeg + ;; patch by K.Handa 92-Mar-2 + (re-break-point (concat "[ \n]\\|" word-across-newline)) + ;; end of patch + ) + (while (not (eobp)) + (setq linebeg (point)) + (move-to-column (1+ fill-column)) + (if (eobp) + nil + ;;(skip-chars-backward "^ \n") + (fill-move-backward-to-break-point re-break-point) + (if sentence-end-double-space + (while (and (> (point) (+ linebeg 2)) + (eq (preceding-char) ?\ ) + (not (eq (following-char) ?\ )) + (eq (char-after (- (point) 2)) ?\.)) + (forward-char -2) + (fill-move-backward-to-break-point re-break-point linebeg))) + (kinsoku-shori) + (if (if (zerop prefixcol) + (save-excursion + (skip-chars-backward " " linebeg) + (bolp)) + (>= prefixcol (current-column))) + ;; Keep at least one word even if fill prefix exceeds margin. + ;; This handles all but the first line of the paragraph. + ;; Meanwhile, don't stop at a period followed by one space. + (let ((first t)) + (move-to-column prefixcol) + (while (and (not (eobp)) + (or first + (and (not (bobp)) + sentence-end-double-space + (save-excursion (forward-char -1) + (and (looking-at "\\. ") + (not (looking-at "\\. "))))))) + (skip-chars-forward " ") + ;; (skip-chars-forward "^ \n") + (fill-move-forward-to-break-point re-break-point) + (setq first nil))) + ;; Normally, move back over the single space between the words. + (if (eq (preceding-char) ? ) + (forward-char -1)))) + (if mc-flag + ;; $B!cJ,3d!d(B WAN means chars which match word-across-newline. + ;; (0) | SPC + SPC* <EOB> --> NL + ;; (1) WAN | SPC + SPC* --> WAN + SPC + NL + ;; (2) | SPC + SPC* + WAN --> SPC + NL + WAN + ;; (3) '.' | SPC + nonSPC --> '.' + SPC + NL + nonSPC + ;; (4) '.' | SPC + SPC --> '.' + NL + ;; (5) | SPC* --> NL + (let ((start (point)) ; 92.6.30 by K.Handa + (ch (following-char))) + (if (and (= ch ? ) + (progn ; not case (0) -- 92.6.30 by K.Handa + (skip-chars-forward " \t") + (not (eobp))) + (or + (progn ; case (1) + (goto-char start) + (forward-char -1) + (looking-at word-across-newline)) + (progn ; case (2) + (goto-char start) + (skip-chars-forward " \t") + (and (not (eobp)) + (looking-at word-across-newline) + ;; never leave space after the end of sentence + (not (fill-end-of-sentence-p)))) + (progn ; case (3) + (goto-char (1+ start)) + (and (not (eobp)) + (/= (following-char) ? ) + (fill-end-of-sentence-p))))) + ;; We should keep one SPACE before NEWLINE. (1),(2),(3) + (goto-char (1+ start)) + ;; We should delete all SPACES around break point. (4),(5) + (goto-char start)))) + ;; end of patch + (delete-horizontal-space) + (if (equal (preceding-char) ?\\) + (insert ? )) + (insert ?\n) + (LaTeX-indent-line) + (setq prefixcol (current-column)) + (and justify-flag (not (eobp)) + (progn + (forward-line -1) + (justify-current-line) + (forward-line 1))) + ) + (goto-char (point-max)) + (delete-horizontal-space)))))) + +(if (boundp 'NEMACS) +(defun LaTeX-fill-region-as-paragraph (from to &optional justify-flag) + "Fill region as one paragraph: break lines to fit fill-column. +Prefix arg means justify too. +From program, pass args FROM, TO and JUSTIFY-FLAG." + (interactive "r\nP") + (save-restriction + (goto-char from) + (skip-chars-forward " \n") + (LaTeX-indent-line) + (beginning-of-line) + (narrow-to-region (point) to) + (setq from (point)) + + ;; Delete whitespace at beginning of line from every line, + ;; except the first line. + (goto-char (point-min)) + (forward-line 1) + (while (not (eobp)) + (delete-horizontal-space) + (forward-line 1)) + + ;; from is now before the text to fill, + ;; but after any fill prefix on the first line. + + ;; Make sure sentences ending at end of line get an extra space. + (goto-char from) + ;;; patch by S.Tomura 88-Jun-30 + ;;$B!cE}9g!d(B + ;; . + CR ==> . + SPC + SPC + ;; . + SPC + CR + ==> . + SPC + + ;;(while (re-search-forward "[.?!][])""']*$" nil t) + ;; (insert ? )) + (while (re-search-forward "[.?!][])""']*$" nil t) + (if (eobp) + nil + (delete-char 1) + (insert " "))) ;; replace CR by two spaces. + ;; end of patch + ;; The change all newlines to spaces. + ;; patched by S.Tomura 87-Dec-7 + ;; bug fixed by S.Tomura 88-May-25 + ;; modified by S.Tomura 88-Jun-21 + ;;(subst-char-in-region from (point-max) ?\n ?\ ) + ;;$BF|K\8l$N8l$N8e$K$O6uGr$O$J$$!#(B + (goto-char from) + (end-of-line) + (while (not (eobp)) + (delete-char 1) + (if (and (< ? (preceding-char)) ;; + SPC + CR + X ==> + SPC + X + (< (preceding-char) 128) + (<= ? (following-char)) + (< (following-char) 128)) + (insert ?\ )) + (end-of-line)) + ;; $B<!$N=hM}$GJ8Kv$K$O(Btwo spaces$B$,$"$j!"$=$l0J30$O(Bsingle space$B$K$J$C$F$$$k!#(B + ;; end of patch + ;; Flush excess spaces, except in the paragraph indentation. + (goto-char from) + (skip-chars-forward " \t") + (while (re-search-forward " *" nil t) + (delete-region + (+ (match-beginning 0) + (if (save-excursion + (skip-chars-backward " ])\"'") + (memq (preceding-char) '(?. ?? ?!))) + 2 1)) + (match-end 0))) + (goto-char from) + (skip-chars-forward " \t") + (while (re-search-forward " " nil t) + (if (<= 128 (following-char)) + (let ((dummy 0)) + (backward-char 1) + (if (<= 128 (preceding-char)) + (delete-char 1)) + (forward-char 1)))) + (goto-char (point-max)) + (delete-horizontal-space) + (insert " ") + (goto-char (point-min)) + (let ((prefixcol 0)) + (while (not (eobp)) + ;; patched by S.Tomura 88-Jun-2 + ;;(move-to-column (1+ fill-column)) + (move-to-column fill-column) + ;; end of patch + ;; patched by S.Tomura 88-Jun-16, 89-Oct-2, 89-Oct-19 + ;; $B4A;z%3!<%I$N>l9g$K$O(Bfill-column$B$h$jBg$-$/$J$k$3$H$,$"$k!#(B + (or (>= fill-column (current-column)) (backward-char 1)) + ;; end of patch + (if (eobp) + nil + ;; patched by S.Tomura 87-Jun-2 + ;;(skip-chars-backward "^ \n") + ;;(if (if (zerop prefixcol) (bolp) (>= prefixcol (current-column))) + ;; (skip-chars-forward "^ \n") + ;; (forward-char -1))) + ;; $B86B'$H$7$F(Bfill-column$B$h$j:8B&$KJ,3dE@$rC5$9!#(B + ;; Find a point to break lines + (skip-chars-backward " \t") ;; skip SPC and TAB + (if (or (<= 128 (preceding-char)) + (<= 128 (following-char)) ;; 88-Aug-25 + (= (following-char) ? ) + (= (following-char) ?\t)) + (kinsoku-shori) + (if(re-search-backward "[ \t\n]\\|\\z" ;; 89-Nov-17 + (point-min) (point-min)) + (forward-char 1)) + (skip-chars-backward " \t") + (kinsoku-shori)) + ;; prifixcol$B$h$j1&B&$KJ,3dE@$rC5$9!#(B + ;; $B$3$N>l9g$OJ,3dE@$O(Bfill-column$B$h$j1&B&$K$J$k!#(B + (if (>= prefixcol (current-column)) + (progn + (move-to-column prefixcol) + (if (re-search-forward "[ \t]\\|\\z" ;; 89-Nov-17 + (point-max) (point-max)) + (backward-char 1)) + (skip-chars-backward " \t") + (kinsoku-shori) + ;; $B$=$l$bBLL\$J$iJ,3d$rD|$a$k!#(B + (if (>= prefixcol (current-column)) (goto-char (point-max)))))) + ;; end of patch S.Tomura + ;; patch by S. Tomura 88-Jun-20 + ;;(delete-horizontal-space) + ;;$B!cJ,3d!d(B + ;; $BA43Q(B | SPC + SPC$B!v(B --> $BA43Q(B + SPC + CR + ;; | SPC + SPC* + $BA43Q(B --> SPC + CR + $BA43Q(B + ;; . | SPC + SPC + --> . + CR + ;; . | SPC + nonSPC --> . + SPC + CR + nonSPC + ;; + ;; . | $BH>3Q(B --> $BJ,3d$7$J$$(B + ;; . | $BA43Q(B --> $BJ,3d$7$J$$(B + (if (not kanji-flag) (delete-horizontal-space) + (let ((start) (end)) + (skip-chars-backward " \t") + (setq start (point)) + (skip-chars-forward " \t") + (setq end (point)) + (delete-region start end) + (if (and (not + (and (save-excursion + (skip-chars-backward " ])\"'") + (memq (preceding-char) '(?. ?? ?!))) + (= end (+ start 2)))) + (or (and (or (<= 128 (preceding-char)) + (<= 128 (following-char))) + (< start end) + (not (eobp))) + (and (memq (preceding-char) '(?. ?? ?!)) + (= (1+ start) end) + (not (eobp))))) + (insert ? )))) + ;; end of patch + (if (equal (preceding-char) ?\\) + (insert ? )) + (insert ?\n) + (LaTeX-indent-line) + (setq prefixcol (current-column)) + (and justify-flag (not (eobp)) + (progn + (forward-line -1) + (justify-current-line) + (forward-line 1))) + ) + (goto-char (point-max)) + (delete-horizontal-space))))) + +;;; Support for various self-insert-command + +(cond ((fboundp 'can-n-egg-self-insert-command) + (fset 'tex-jp-self-insert-command 'can-n-egg-self-insert-command)) + ((fboundp 'egg-self-insert-command) + (fset 'tex-jp-self-insert-command 'egg-self-insert-command)) + ((fboundp 'canna-self-insert-command) + (fset 'tex-jp-self-insert-command 'canna-self-insert-command)) + (t + (fset 'tex-jp-self-insert-command 'self-insert-command))) + +(defun TeX-insert-punctuation () + "Insert point or comma, cleaning up preceding space." + (interactive) + (if (TeX-looking-at-backward "\\\\/\\(}+\\)" 50) + (replace-match "\\1" t)) + (call-interactively 'tex-jp-self-insert-command)) + +;;; Error Messages + +(if japanese-TeX-error-messages + (setq TeX-error-description-list + '(("Bad \\\\line or \\\\vector argument.*" . +"$B@~$N79$-$r;XDj$9$k!$(B\\line$B$^$?$O(B\\vector$B$N:G=i$N0z?t$,IT@5$G$9!%(B") + + ("Bad math environment delimiter.*" . +"$B?t<0%b!<%ICf$G?t<0%b!<%I3+;O%3%^%s%I(B\\[$B$^$?$O(B\\($B!$$^$?$O!$?t<0%b!<%I30$G(B +$B?t<0%b!<%I=*N;%3%^%s%I(B\\[$B$^$?$O(B\\($B$r(BTeX$B$,8+$D$1$^$7$?!%$3$NLdBj$O!$?t<0%b!<(B +$B%I$N%G%j%_%?$,%^%C%A$7$F$$$J$+$C$?$j!$3g8L$N%P%i%s%9$,$H$l$F$$$J$+$C$?$j$9(B +$B$k$?$a$K@8$8$^$9!%(B") + + ("Bad use of \\\\\\\\.*" . +"\\\\$B%3%^%s%I$,%Q%i%0%i%UCf$K$"$j$^$7$?!%$3$N;H$$$+$?$OL50UL#$G$9!%(B +$B$3$N%(%i!<%a%C%;!<%8$O(B\\\\$B$,(Bcentering$B4D6-$d(Bflushing$B4D6-$G;H$o$l$?(B +$B;~!$$"$k$$$O(Bcentering/flushing$B@k8@$,M-8z$J$H$3$m$G;H$o$l$?;~$K@8$8$^$9!%(B") + + ("\\\\begin{[^ ]*} ended by \\\\end{[^ ]*}." . +"$BBP1~$9$k(B\\begin$BL?Na$N$J$$(B\\end$BL?Na$r(BLaTeX$B$,8+$D$1$^$7$?!%(B\\end$BL?Na$N4D(B +$B6-L>$r4V0c$($?$+!$M>J,$J(B\\begin$BL?Na$,$"$k$+!$(B\\end$BL?Na$r$o$9$l$?$+$N$$$:(B +$B$l$+$G$7$g$&!%(B") + + ("Can be used only in preamble." . +"$B%W%j%"%s%V%k$G$7$+;H$($J$$(B\\documentstyle$B!&(B\\nofiles$B!&(B\\includeonly +\\makeindex$B!&(B\\makeglossary$B$N$&$A$N$$$:$l$+$,(B\\begin{document}$B$h$j$b(B +$B8e$G;H$o$l$F$$$k$N$r(BLaTeX$B$,8!=P$7$^$7$?!%$3$N%(%i!<$O(B\\begin{document} +$B$,M>J,$K$"$C$?;~$K$b@8$8$^$9!%(B") + + ("Command name [^ ]* already used.*" . +"$B$9$G$KDj5A$5$l$F$$$kL?NaL>$^$?$O4D6-L>$KBP$7$F(B\\newcommand$B!&(B +\\newenvironment$B!&(B\\newlength$B!&(B\\newsavebox$B!&(B\\newtheorem$B$N$&$A$N$$$:(B +$B$l$+$r<B9T$7$h$&$H$7$F$$$^$9(B($B$"$k4D6-$rDj5A$9$k$HF1$8L>A0$NL?Na$,<+F0(B +$BE*$KDj5A$5$l$k$N$G!$4{$KB8:_$9$k4D6-$HF1L>$NL?Na$ODj5A$G$-$^$;$s(B)$B!%?7(B +$B$7$$L>A0$r9M$($k$+!$(B\\newcommand$B$+(B\\newenvironment$B$N>l9g$J$iBP1~$9$k(B +\\renew...$BL?Na$r;H$o$J$1$l$P$J$j$^$;$s!%(B") + + ("Counter too large." . +"$BJ8;z$G=g=xIU$1$5$l$?$b$N!$$?$V$sHV9fIU$1$5$l$?%j%9%H4D6-$N%i%Y%k$,!$(B +26$B$h$j$bBg$-$$HV9f$r<u$1<h$j$^$7$?!%Hs>o$KD9$$%j%9%H$r;H$C$F$$$k$+!$(B +$B%+%&%s%?$r:F@_Dj$7$F$7$^$C$?$+$N$$$:$l$+$G$7$g$&!%(B") + + ("Environment [^ ]* undefined." . +"$BDj5A$5$l$F$$$J$$4D6-$KBP$9$k(B\\begin$BL?Na$r(BLaTeX$B$,8+$D$1$^$7$?!%$*$=$i$/(B +$B4D6-L>$r4V0c$($?$N$G$7$g$&!%(B") + + ("Float(s) lost." . +"parbox$B$N$J$+$K(Bfigure$B4D6-!&(Btable$B4D6-$^$?$O(B\\marginpar$BL?Na$,$"$j$^$7$?(B +\($B$J$*!$(Bparbox$B$O(Bminipage$B4D6-$+(B\\parbox$BL?Na$K$h$C$F:n$i$l$k$+!$5SCm$d?^(B +$B$J$I$KBP$7$F(BLaTeX$B$,@8@.$9$k$b$N$G$9(B\)$B!%$3$l$O=PNO;~$N%(%i!<$J$N$G!$860x(B +$B$H$J$C$F$$$k4D6-$"$k$$$OL?Na$O!$(BLaTeX$B$,LdBj$rH/8+$7$?>l=j$h$j$b$@$$$V(B +$B$sA0$K$"$k2DG=@-$,$"$j$^$9!%=PNO$5$l$F$$$J$$?^!&I=!&K5Cm$J$I$,$$$/$D$+(B +$B$"$k$+$b$7$l$^$;$s$,!$$=$l$i$,860x$G$"$k$H$O8B$j$^$;$s!%(B") + + ("Illegal character in array arg." . +"array$B4D6-$^$?$O(Btabular$B4D6-$N0z?t!$$^$?$O(B\\multicolumn$BL?Na$NBh(B2$B0z?t(B +$B$NCf$KIT@5$JJ8;z$,$"$j$^$7$?!%(B") + + ("Missing \\\\begin{document}." . +"\\begin{document}$BL?Na$h$jA0$K(BLaTeX$B$,=PNO$r9T$J$C$F$7$^$$$^$7$?!%(B +\\begin{document}$BL?Na$rK:$l$?$+!$%W%j%"%s%V%k$K2?$+4V0c$$$,$"$k$N$G$7$g$&!%(B +$BBG$A4V0c$$$K$h$kJ8;z$d!$@k8@$N8m$j$K$h$k2DG=@-$b$"$j$^$9!%Nc$($P!$0z?t$r(B +$B0O$`3g8L$rH4$+$7$?$H$+!$L?NaL>$N(B\\$B$rK:$l$?>l9g$J$I$G$9!%(B") + + ("Missing p-arg in array arg.*" . +"array$B4D6-!&(Btabular$B4D6-$N0z?t!$$"$k$$$O(B\\multicolumn$BL?Na$NBh(B2$B0z?t$NCf$K!$(B +$B3g8L$K0O$^$l$?I=8=$N$D$$$F$$$J$$(Bp$B$,$"$j$^$7$?!%(B") + + ("Missing @-exp in array arg." . +"array$B4D6-!&(Btabular$B4D6-$N0z?t!$$"$k$$$O(B\\multicolumn$BL?Na$NBh(B2$B0z?t$NCf$K!$(B +@$BI=8=$N$D$$$F$$$J$$(B@$B$,$"$j$^$7$?!%(B") + + ("No such counter." . +"\\setcounter$BL?Na$^$?$O(B\\addtocounter$BL?Na$G!$B8:_$7$J$$%+%&%s%?$,;XDj$5$l(B +$B$^$7$?!%$*$=$i$/$?$@$N%?%$%W%_%9$G$7$g$&!%$?$@$7!$%(%i!<$,(Baux$B%U%!%$%k$NCf(B +$B$G@8$8$?>l9g$O!$(B\\newcounter$BL?Na$r%W%j%"%s%V%k$N30$G;H$C$?$N$@$H;W$o$l$^$9!%(B") + + ("Not in outer par mode." . +"figure$B4D6-!&(Btable$B4D6-$"$k$$$O(B\\marginpar$BL?Na$,?t<0%b!<%I$^$?$O(Bparbox$B$NCf(B +$B$G;H$o$l$^$7$?!%(B") + + ("\\\\pushtabs and \\\\poptabs don't match." . +"\\pushtabs$B$HBP1~$7$J$$(B\\poptabs$B$,$_$D$+$C$?$+!$$^$?$O!$BP1~$9$k(B\\poptabs +$B$r$b$?$J$$(B\\pushtabs$B$,$"$k$N$K(B\\end{tabbing}$B$,8=$l$F$7$^$$$^$7$?!%(B") + + ("Something's wrong--perhaps a missing \\\\item." . +"$B%j%9%H4D6-$NCf$K(B\\item$BL?Na$,$J$$$N$,:G$b$"$j$=$&$J%1!<%9$G$9!%(B +thebibliography$B4D6-$G0z?t$rK:$l$?>l9g$K$b@8$8$^$9!%(B") + + ("Tab overflow." . +"\\=$B$,!$(BLaTeX$B$G5v$5$l$k%?%V%9%H%C%W$N:GBg?t$rD6$($F$$$^$9!%(B") + + ("There's no line here to end." . +"\\newline$BL?Na$^$?$O(B\\\\$BL?Na$,%Q%i%0%i%U4V$K$"$j$^$9!%$3$N;H$$$+$?$O(B +$BL50UL#$G$9!%$b$76u9T$r$"$1$?$$$N$G$7$?$i!$(B\\vspace$B$r;H$C$F$/$@$5$$!%(B") + + ("This may be a LaTeX bug." . +"$B$^$C$?$/$o$1$,$o$+$i$J$/$J$C$F$7$^$$$^$7$?!%$?$V$s$3$l0JA0$K8!=P$5$l$?(B +$B%(%i!<$N$;$$$@$H;W$o$l$^$9!%$7$+$7!$(BLaTeX$B<+BN$N%P%0$G$"$k2DG=@-$b$"$j$^$9!%(B +$B$b$7$3$N%(%i!<$,F~NO%U%!%$%k$KBP$9$k:G=i$N%(%i!<$G$"$j!$2?$b4V0c$$$,8+$D(B +$B$+$i$J$$>l9g$O!$$=$N%U%!%$%k$rJ]B8$7$F!$%m!<%+%k%,%$%I$K=q$+$l$F$$$k@UG$(B +$B<T$KO"Mm$7$F$/$@$5$$!%(B") + + ("Too deeply nested." . +"$B%j%9%H4D6-$NF~$l;R$,?<$9$.$^$9!%2?CJ3,$NF~$l;R$,5v$5$l$k$+$O;H$C$F$$$k(B +$B%3%s%T%e!<%?$K0MB8$7$^$9$,!$>/$J$/$H$b(B4$BCJ3,$^$G$O5v$5$l$F$$$^$9(B($BIaDL$O(B +$B$=$l$G==J,$G$7$g$&(B)$B!%(B") + + ("Too many unprocessed floats." . +"$B$3$N%(%i!<$O(B1$B%Z!<%8Cf$N(B\\marginpar$BL?Na$,B?$9$.$k$?$a$K@8$8$k>l9g$b$"(B +$B$j$^$9$,!$$b$C$H$"$j$=$&$J$N$O!$8B3&$rD6$($F?^$dI=$rJ]B8$7$h$&$H$7$?>l(B +$B9g$G$9!%D9$$J8=q$rAHHG$7$F$$$/$H$-!$(BLaTeX$B$O?^$dI=$r8D!9$KJ]B8$7!$%Z!<(B +$B%8$NJ,3d$r9T$J$&;~$K$=$l$i$rA^F~$7$^$9!%$3$N%(%i!<$O!$%Z!<%8$X$NJ,3d$,(B +$B9T$J$o$l$kA0$K!$$"$^$j$K$bB?$/$N(Bfigure$B4D6-$d(Btable$B4D6-$,8+$D$+$C$?>l9g(B +$B$K@8$8$^$9!%$3$NLdBj$O4D6-$N$&$A$N$$$/$D$+$rJ8=q$N=*$o$j$NJ}$K0\F0$9$l(B +$B$P2r7h$G$-$^$9!%$^$?!$$3$N%(%i!<$O(B``logjam''$B$K$h$C$F@8$8$k$3$H$b$"$j$^(B +$B$9!%(B``logjam''$B$H$O!$(BLaTeX$B$,=P8==g=xDL$j$K$7$+?^I=$r=PNO$G$-$J$$$;$$$G!$(B +$B$D$^$C$F$$$k8e$m$N?^I=$N$?$a$KA0$N?^I=$r=PNO$G$-$J$/$J$k$3$H$r$$$$$^$9!%(B +$B$3$N%8%c%`$N860x$O!$Bg$-$9$.$F(B1$B%Z!<%8$J$$$7$O;XDj$5$l$?NN0h$K<}$^$i$J(B +$B$$$h$&$J?^$dI=$G$"$k2DG=@-$,$"$j$^$9!%$3$l$O!$0z?t$K(Bp$B%*%W%7%g%s$,;XDj(B +$B$5$l$F$$$J$$$H5/$-$d$9$/$J$j$^$9!%(B") + + ("Undefined tab position." . +"\\>$B!&(B\\+$B!&(B\\-$B$^$?$O(B\\<$BL?Na$G!$B8:_$7$J$$%?%V0LCV!$$9$J$o$A(B\\=$BL?Na$GDj(B +$B5A$5$l$F$$$J$$%?%V0LCV$r;XDj$7$h$&$H$7$F$$$^$9!%(B") + + ("\\\\< in mid line." . +"\\<$BL?Na$,(Btabbing$B4D6-$N9T$NESCf$K8=$l$^$7$?!%$3$NL?Na$O9T$N@hF,$K$J$1$l$P(B +$B$J$j$^$;$s!%(B") + + ("Counter too large." . +"$B5SCm$,J8;z$^$?$O5SCm5-9f$G=g=x$E$1$5$l$F$$$^$9$,!$J8;z$^$?$O5-9f$r;H$$(B +$B@Z$C$F$7$^$$$^$7$?!%$*$=$i$/(B\\thanks$BL?Na$N;H$$$9$.$G$9!%(B") + + ("Double subscript." . +"$B?t<0Cf$N(B1$B$D$NNs$K(B2$B$D$N2<IU$-J8;z$,$D$$$F$$$^$9!%Nc$($P(Bx_{2}_{3}$B$N$h$&$K!%(B +$B$3$N$h$&$JI=8=$OL50UL#$G$9!%(B") + + ("Double superscript." . +"$B?t<0Cf$N(B1$B$D$NNs$K(B2$B$D$N>eIU$-J8;z$,$D$$$F$$$^$9!%Nc$($P(Bx^{2}^{3}$B$N$h$&$K!%(B +$B$3$N$h$&$JI=8=$OL50UL#$G$9!%(B") + + ("Extra alignment tab has been changed to \\\\cr." . +"array$B4D6-$^$?$O(Btabular$B4D6-$N(B1$BNsCf$K$"$k9`L\$,B?$9$.$^$9!%8@$$49$($k$H!$(B +$BNs$N=*$o$j$^$G$K$"$k(B&$B$N?t$,B?$9$.$^$9!%$*$=$i$/A0$NNs$N:G8e$K(B\\\\$B$r$D$1(B +$B$k$N$rK:$l$?$N$G$7$g$&!%(B") + + ("Extra \\}, or forgotten \\$." . +"$B3g8L$^$?$O?t<0%b!<%I$N%G%j%_%?$,@5$7$/BP1~$7$F$$$^$;$s!%$*$=$i$/(B{$B!&(B\\[$B!&(B +\\($B$"$k$$$O(B$$B$N$&$A$N$$$:$l$+$r=q$-K:$l$?$N$G$7$g$&!%(B") + + ("Font [^ ]* not loaded: Not enough room left." . +"$B$3$NJ8=q$O8B3&$h$j$bB?$/$N%U%)%s%H$r;H$C$F$$$^$9!%$b$7J8=q$NItJ,$4$H$K(B +$BJL!9$N%U%)%s%H$,;H$o$l$F$$$k$N$J$i!$J,3d$7$F=hM}$9$l$PLdBj$O2r7h$5$l$^$9!%(B") + + ("I can't find file `.*'." . +"$BI,MW$J%U%!%$%k$,8+$D$+$j$^$;$s$G$7$?!%$b$78+$D$+$i$J$$%U%!%$%k$N3HD%;R(B +$B$,(Btex$B$N>l9g!$$"$J$?$,;XDj$7$?%U%!%$%k!$$9$J$o$A%a%$%s%U%!%$%k$^$?$O(B +\\input$BL?Na!&(B\\include$BL?Na$GA^F~$5$l$k%U%!%$%k$,8+$D$+$i$J$$$N$G$9!%(B +$B3HD%;R$,(Bsty$B$G$"$l$P!$B8:_$7$J$$J8=q%9%?%$%k$^$?$O%9%?%$%k%*%W%7%g%s$r(B +$B;XDj$7$h$&$H$7$F$$$^$9!%(B") + + ("Illegal parameter number in definition of .*" . +"$B$3$l$O$*$=$i$/!$(B\\newcommand$B!&(B\\renewcommand$B!&(B\\newenvironment$B$^$?$O(B +\\renewenvironment$BL?Na$N$J$+$G(B#$B$,@5$7$/;H$o$l$J$+$C$?$?$a$K@8$8$?%(%i!<(B +$B$G$9!%(B\\#$BL?Na$H$7$F;H$o$l$k>l9g$r=|$1$P!$(B#$B$H$$$&J8;z$O!$Nc$($P(B2$BHVL\$N(B +$B0z?t$r;XDj$9$k(B#2$B$N$h$&$K!$0z?t%Q%i%a!<%?$H$7$F$7$+;H$($^$;$s!%$^$?!$(B +$B$3$N%(%i!<$O!$>e$K$"$2$?(B4$B$D$N%3%^%s%I$,$*8_$$$KF~$l;R$K$J$C$F$$$k>l9g(B +$B$d!$(B\\newenvironment$BL?Na!&(B\\renewenvironment$BL?Na$G(B#2$B$N$h$&$J%Q%i%a!<%?(B +$B$,:G8e$N0z?t$NCf$G;H$o$l$F$$$k>l9g$K$b@8$8$^$9!%(B") + + ("Illegal unit of measure ([^ ]* inserted)." . +"$B$b$7(B + ! Missing number, treated as zero. +$B$H$$$&%(%i!<$,5/$-$?D>8e$G$"$l$P!$$3$N%(%i!<$N860x$b$=$l$HF1$8$G$9!%(B +$B$=$&$G$J$$>l9g$O!$(BLaTeX$B$,0z?t$H$7$F(Blength$B$r4|BT$7$F$$$k$N$K(Bnumber$B$,(B +$B8=$l$?$3$H$r0UL#$7$F$$$^$9!%$3$N%(%i!<$N:G$b$"$j$,$A$J860x$OD9$5(B0$B$r(B +$BI=$o$9(B0in$B$N$h$&$JI=8=$NBe$o$j$K(B0$B$H$+$$$F$7$^$&$3$H$K$"$j$^$9!%$?$@$7!$(B +$BL?Na$N0z?t$r=q$-K:$l$?>l9g$K$b$3$N%(%i!<$,@8$8$k$3$H$,$"$j$^$9!%(B") + + ("Misplaced alignment tab character \\&." . +"array$B$^$?$O(Btabular$B4D6-$G$N9`L\6h@Z$j$K$N$_;H$o$l$k$Y$-J8;z(B&$B$,IaDL$NJ8(B +$B$NCf$K$"$j$^$7$?!%$?$V$s(B\\&$B$HF~NO$7$?$+$C$?$N$G$7$g$&!%(B") + + ("Missing control sequence inserted." . +"$B$3$N%(%i!<$O!$$*$=$i$/L?NaL>$G$J$$$b$N$r(B\\newcommand$B!&(B\\renewcommand$B!&(B +\\newlength$B$^$?$O(B\\newsavebox$B$NBh(B1$B0z?t$H$7$F;H$C$?$?$a$K@8$8$?$N$G$7$g$&!%(B") + + ("Missing number, treated as zero." . +"$B$3$N%(%i!<$O$?$$$F$$!$0z?t$H$7$F(Bnumber$B$^$?$O(Blength$B$rI,MW$H$7$F$$$kL?Na$K(B +$BBP$7$F0z?t$,M?$($i$l$J$+$C$?$?$a$K@8$8$^$9!%0z?t$r=q$-K:$l$?$N$+!$%F%-%9%H(B +$B$NCf$NBg3g8L(B([])$B$,%*%W%7%g%s0z?t$N;XDj$H4V0c$($i$l$F$7$^$C$?$+$N$I$A$i$+$G(B +$B$7$g$&!%$^$?!$?t$r@8@.$9$k(B\\value$B$N$h$&$JL?Na$d(Blength$BL?Na$NA0$K(B\\protect$B$r(B +$BCV$$$?>l9g$K$b$3$N%(%i!<$O@8$8$^$9!%(B") + + ("Missing [{}] inserted." . +"TeX$B$O4{$K$o$1$,$o$+$i$J$/$J$C$F$$$^$9!%%(%i!<%a%C%;!<%8$K$h$C$F<($5$l$F(B +$B$$$k>l=j$O$?$V$sF~NO$K4V0c$$$,$"$C$?$H$3$m$h$j$b8e$m$K$J$C$F$7$^$C$F$$$k(B +$B$G$7$g$&!%(B") + + ("Missing \\$ inserted." . +"$B$*$=$i$/!$?t<0%b!<%ICf$G$7$+;H$($J$$L?Na$r(BTeX$B$,?t<0%b!<%I30$G8!=P$7$?(B +$B$N$@$H;W$o$l$^$9!%FC$K5-=R$5$l$F$$$J$$8B$j!$(BLaTeX Book(Lamport$BCx(B,$BLu=q(B +$B$O%"%9%-!<=PHG(B)$B$N(B3.3$B@a$K$"$kE:;z!&J,?t!&?t3X5-9f$J$I$N%3%^%s%I$O$9$Y$F(B +$B?t<0%b!<%I$G$7$+;H$($J$$$N$@$H$$$&$3$H$KCm0U$7$F$/$@$5$$!%$?$H$(L?Na$,(B +$B?t<04D6-$NCf$K$"$C$?$H$7$F$b!$(Bbox$B$r@8@.$9$kL?Na$N0z?t$r=hM}$7$O$8$a$?(B +$B;~E@$G$O!$(BTeX$B$O$^$@?t<0%b!<%I$KF~$C$F$$$J$$$N$G$9!%$^$?!$$3$N%(%i!<$O!$(B +$B?t<0%b!<%ICf$G(BTeX$B$,6u9T$r8!=P$7$?>l9g$K$b@8$8$^$9!%(B") + + ("Not a letter." . +"\\hyphenation$BL?Na$N0z?t$NCf$K$J$K$+@5$7$/$J$$$b$N$,$"$j$^$9!%(B") + + ("Paragraph ended before [^ ]* was complete." . +"$BL?Na$N0z?t$NCf$KIT@5$J6u9T$,F~$C$F$7$^$C$F$$$^$9!%$*$=$i$/0z?t$N=*$o$j(B +$B$KJD$83g8L$r$D$1$k$N$rK:$l$?$N$G$7$g$&!%(B") + + ("\\\\[^ ]*font [^ ]* is undefined .*" . +"$B$3$N%(%i!<$O$"$^$j0lHLE*$G$J$$%U%)%s%H$,?t<0%b!<%I$G;H$o$l$?;~$K@8$8(B +$B$^$9!%Nc$($P!$5SCm$NCf$N?t<0$G(B\\sc$BL?Na$,;H$o$l$k$H!$(Bfootnotesize$B$N(B +small caps$B%U%)%s%H$,8F$S$@$5$l$k$3$H$K$J$j$^$9!%$3$NLdBj$O(B\\load$BL?Na$r(B +$B;H$($P2r7h$G$-$^$9!%(B") + + ("Font .* not found." . +"$BL$CN$N(Bfamily/series/shape/size$B$NAH$_9g$o$;$N%U%)%s%H$,;XDj$5$l$^$7$?!%(B +$B$3$N%(%i!<$,5/$-$k%1!<%9$O(B2$B$D9M$($i$l$^$9!%(B + 1) \\size$B%^%/%m$G;H$($J$$%5%$%:$rA*Br$7$h$&$H$7$?!%(B + 2) $B$=$&$G$J$1$l$P!$4IM}<T$N$H$3$m$K9T$C$F!$%U%)%s%HA*Br%F!<%V%k$,(B + $BIe$C$F$$$k$HJ86g$r$D$1$F$d$j$^$7$g$&(B!") + + ("TeX capacity exceeded, sorry .*" . +"TeX$B$,%a%b%j$r;H$$$-$C$F$7$^$$!$<B9T$rCfCG$7$^$7$?!%$7$+$7!$92$F$J$$$G(B +$B$/$@$5$$!%$3$N%(%i!<$,@8$8$?860x$O!$$?$V$s!$(BTeX$B$K$"$J$?$NJ8=q$r=hM}$G(B +$B$-$k$@$1$NG=NO$,$J$$$+$i$G$O$"$j$^$;$s!%(BTeX$B$K%a%b%j$r;H$$$-$i$;$?860x(B +$B$O!$$*$=$i$/F~NO$7$?%U%!%$%k$NA0$NJ}$G@8$8$?%(%i!<$G$9!%$"$J$?$,K\Ev$K(B +TeX$B$NMFNL$rD6$($?$3$H$r$7$h$&$H$7$?$N$+$I$&$+!$$=$7$F$=$N>l9g$I$&$9$l(B +$B$P$$$$$N$+$rH=CG$9$kJ}K!$r0J2<$K@bL@$7$^$9!%$b$7LdBj$,F~NO%U%!%$%kCf$N(B +$B%(%i!<$K$"$k>l9g$O!$8D!9$N%(%i!<$r2r7h$7$F$$$/J}K!$r$H$k$N$,$h$$$G$7$g(B +$B$&!%(BLaTeX$B$,C;$$%U%!%$%k$G%a%b%j$r;H$$$-$k$3$H$O$a$C$?$K$"$j$^$;$s$+$i!$(B +$B%(%i!<$N5/$-$?0LCV$h$jA0$K=hM}$7$?%Z!<%8$,?t%Z!<%8$7$+$J$1$l$P!$$^$:4V(B +$B0c$$$J$/F~NO%U%!%$%k$KLdBj$,$"$k$O$:$G$9!%(B + +$B%(%i!<%a%C%;!<%8$N:G8e$K!$(BTeX$B$,;H$$$-$C$F$7$^$C$?%a%b%j$N<oN`$,<($5$l(B +$B$F$$$^$9!%$=$l$i$N$&$A0lHLE*$J$b$N$K$D$$$F!$9M$($i$l$k860x$r0J2<$K5s$2(B +$B$^$9!%(B + +buffer size +=========== +$B>O@a!&(B\\caption$B!&(B\\addcontentsline$B$"$k$$$O(B\\addtocontents$BL?Na$N0z?t$H(B +$B$7$FM?$($?%F%-%9%H$,D9$9$.$k>l9g$K@8$8$k$3$H$,$"$j$^$9!%$3$N%(%i!<$O(B +$B$?$$$F$$(B\\end{document}$B$r=hM}$7$F$$$k;~$K@8$8$^$9$,!$(B\\tableofcontents$B!&(B +\\listoffigures$B$"$k$$$O(B\\listoftables$BL?Na$r<B9T$7$F$$$k>l9g$K$b5/$-$k(B +$B$3$H$,$"$j$^$9!%$3$NLdBj$r2r7h$9$k$K$O!$$b$C$HC;$$%F%-%9%H$r%*%W%7%g%s(B +$B0z?t$H$7$FM?$($F$/$@$5$$!%L\<!$d?^I=0lMw$r:n@.$7$F$b!$8+=P$7$,D9$9$.$k(B +$B$HFI$_$K$/$/$J$k$O$:$G$9!%(B + +exception dictionary +==================== +TeX$B$,;}$C$F$$$kNN0h0J>e$K%O%$%U%M!<%7%g%s>pJs$rM?$($h$&$H$7$F$$$^$9!%(B +$B$"$^$j;H$o$J$$C18l$N(B\\hyphenation$BL?Na$r<h$j=|$$$F!$Be$o$j$K(B\\-$BL?Na$r;H$C(B +$B$F$/$@$5$$!%(B + +hash size +========= +$BL?NaL>$NDj5A$^$?$OAj8_;2>H%i%Y%k$NDj5A$,B?$9$.$^$9!%(B + +input stack size +================ +$B$3$N%(%i!<$O$*$=$i$/L?NaDj5ACf$N8m$j$K$h$k$b$N$G$9!%Nc$($P!$<!$NL?Na$O(B +$B:F5"E*Dj5A$H$J$C$F$*$j!$<+J,<+?H$r;H$C$F(B\\gnu$B$rDj5A$7$F$$$^$9!%(B + + \\newcommand{\\gnu}{a \\gnu} % $B$3$l$O$@$a(B + +$B$3$N(B\\gnu$BL?Na$r8+$D$1$k$H(BTeX$B$O(B\\gnu$B$,2?$r$&$_$@$9$N$+$r7hDj$7$h$&$H$7(B +$B$F$=$NKvHx$r$$$D$^$G$bDI$$$D$E$1!$$d$,$F(B``input stack''$B$r;H$$$-$C$F$7(B +$B$^$$$^$9!%(B + +main memory size +================ +$B$3$l$O!$(BTeX$B$,C;$$%U%!%$%k$r=hM}$7$F$$$k;~$K;H$$$-$k2DG=@-$N$"$k%a%b%j(B +$B$N$R$H$D$G$9!%(Bmain memory$B$r;H$$$-$k$N$O<!$N(B3$B$D$N>l9g$N$$$:$l$+$G$9!%(B +\(1\)$BHs>o$KD9$/J#;($JL?Na$r?tB?$/Dj5A$7$?!%(B(2)index$B$^$?$O(Bglossary$B$r:n$C(B +$B$F$$$k$H$-!$(B1$B%Z!<%8Cf$K$"$^$j$K$bB?$/$N(B\\index$B$^$?$O(B\\glossary$BL?Na$,$"(B +$B$k!%(B(3)$B@8@.$N$?$a$N>pJs$r(BTeX$B$,J];}$7$-$l$J$$$h$&$J!$$"$^$j$K$bJ#;($J%Z!<(B +$B%8$r@8@.$7$h$&$H$7$?!%:G=i$N(B2$B$D$NLdBj$N2r7hJ}K!$OL@$i$+$G$9!%L?NaDj5A(B +$B$N?t$"$k$$$O(B\\index$B!&(B\\glossary$BL?Na$N?t$r8:$i$9$3$H$G$9!%(B3$BHVL\$NLdBj$O(B +$B$A$g$C$HLq2p$G$9!%$3$l$O!$Bg$-$J(Btabbin$B!&(Btabular$B!&(Barray$B!&(Bpicture$B4D6-$N(B +$B$;$$$G@8$8$k$3$H$,$"$j$^$9!%=PNO0LCV$,7hDj$5$l$k$N$rBT$C$F$$$k?^$dI=$G(B +TeX$B$N%a%b%j$,$$$C$Q$$$K$J$C$F$$$k$N$+$b$7$l$^$;$s!%K\Ev$K(BTeX$B$NMFNL$rD6(B +$B$($F$7$^$C$?$N$+$I$&$+D4$Y$k$?$a$K$O!$%(%i!<$N5/$3$C$?>l=j$ND>A0$K(B +\\clearpage$BL?Na$rF~$l$F$b$&0lEY%3%s%Q%$%k$r<B9T$7$F$_$F$/$@$5$$!%$b$7(B +$B$=$l$G$b%a%b%j$,B-$j$J$/$J$k$h$&$J$i!$$J$s$i$+$N<jCJ$r9V$8$kI,MW$,$"$j(B +$B$^$9!%(BTeX$B$,%Z!<%8$r@ZCG$9$k$+$I$&$+7hDj$9$k$?$a$K$OCJMnA4BN$r=hM}$7$J(B +$B$1$l$P$J$i$J$$$H$$$&$3$H$r;W$$$@$7$F$/$@$5$$!%CJMn$NESCf$K(B\\newpage$BL?(B +$BNa$rF~$l$l$P!$CJMn$N;D$j$r=hM}$9$kA0$K:#$N%Z!<%8$r(BTeX$B$K=PNO$5$;$k$3$H(B +$B$GM>M5$,$G$-$k$+$b$7$l$^$;$s(B(\\pagebreak$BL?Na$G$O$@$a$G$9(B)$B!%$b$7?^$dI=(B +$B$,N/$^$C$F$$$k$3$H$,LdBj$J$N$J$i$P!$?^I=$r$b$C$H8e$m$NJ}$K0\F0$9$k$H$+!$(B +$B$"$k$$$O$b$C$HA0$N;~E@$G=PNO$5$l$k$h$&$K$9$l$P2sHr$G$-$^$9!%$b$7$^$@J8(B +$B=q$r:n@.$7$F$$$kESCf$J$i!$$H$j$"$($:(B\\clearpage$BL?Na$rF~$l$F$*$$$F!$:G(B +$B=*HG$r:n$k;~$^$G$3$NLdBj$OC*>e$2$7$F$*$-$^$7$g$&!%F~NO%U%!%$%k$,JQ$o$k(B +$B$HLdBj$,2r>C$5$l$k>l9g$b$"$k$N$G$9!%(B + +pool size +========= +$BAj8_;2>H$N(B\\label$B$,B?$9$.$k$+!$L?Na$NDj5A$,B?$9$.$k$+$N$I$A$i$+$G$9!%(B +$B@53N$K$$$($P!$Dj5A$7$?%i%Y%kL>$*$h$SL?NaL>$K;H$C$?J8;z?t$,B?$9$.$k$H$$(B +$B$&$3$H$G$9!%$G$9$+$i!$$b$C$HC;$$L>A0$r;H$($P$3$NLdBj$O2r7h$7$^$9!%$?$@(B +$B$7!$$3$N%(%i!<$O!$(B\\setcounter$B$J$I$N%+%&%s%?L?Na$d(B\\newenvironment$B!&(B +\\newtheorem$BL?Na$N0z?t$N=*$o$j$r<($91&3g8L$rK:$l$?>l9g$K$b@8$8$^$9!%(B + +save size +========= +$B$3$N%(%i!<$O!$@k8@$NM-8zHO0O$dL?Na!&4D6-$,$"$^$j$K$b?<$/F~$l;R$K$J$C$F(B +$B$$$k>l9g$K@8$8$^$9!%$?$H$($P!$(B\\multiput$BL?Na$N0z?t$K(Bpicture$B4D6-$,$"$j!$(B +$B$=$N$J$+$K(B\\footnotesize$B@k8@$,$"$j!$$=$N@k8@$NM-8zHO0O$K(B\\multiput$BL?Na(B +$B$,$"$C$F!$$=$N0z?t$K(B... $B$H$$$&$h$&$J>l9g$G$9!%(B") + + ("Text line contains an invalid character." . +"$BF~NOCf$KIT@5$JJ8;z$,4^$^$l$F$$$^$9!%%U%!%$%k:n@.$N8m$j$K$h$C$F%F%-%9%H(B +$B%(%G%#%?$,$3$NJ8;z$rA^F~$7$F$7$^$C$?$N$G$7$g$&!%<B:]$K2?$,5/$-$?$N$+$O(B +$B%(%G%#%?$K$h$j$^$9!%F~NO%U%!%$%k$rD4$Y$F$_$F!$;XE&$5$l$?J8;z$,8+$D$+$i(B +$B$J$$>l9g$K$O%m!<%+%k%,%$%I$r8+$F$/$@$5$$!%(B") + + ("Undefined control sequence." . +"TeX$B$,L$Dj5A$NL?NaL>$rH/8+$7$^$7$?!%$*$=$i$/F~NO$N8m$j$G$7$g$&!%$b$7$3(B +$B$N%(%i!<$,(BLaTeX$BL?Na$N=hM}Cf$K@8$8$?>l9g$O!$$=$NL?Na$O4V0c$C$?0LCV$KCV$+(B +$B$l$F$$$^$9!%Nc$($P!$%j%9%H4D6-$NCf$G$J$$$N$K(B\\item$BL?Na$,;H$o$l$?>l9g$J$I(B +$B$G$9!%$^$?!$(B\\documentstyle$BL?Na$,$J$$>l9g$K$b$3$N%(%i!<$,@8$8$^$9!%(B") + + ("Use of [^ ]* doesn't match its definition." . +"$B$*$=$i$/IA2h$N$?$a$NL?Na$@$H;W$o$l$^$9$,!$0z?t$N;H$$$+$?$,4V0c$C$F$$(B +$B$^$9!%4V0c$C$F$$$k$N$,(B\\@array$BL?Na$N>l9g$O!$(Barray$B4D6-$+(Btabular$B4D6-$G$N(B +@$BI=8=$N0z?t$K$J$K$+8m$j$,$"$k$N$G$7$g$&!%(Bfragile$B$JL?Na$,(B\\protect$B$5$l$F(B +$B$$$J$$$N$+$b$7$l$^$;$s!%(B") + + ("You can't use `macro parameter character \\#' in [^ ]* mode." . +"$BFC<lJ8;z(B#$B$,IaDL$N%F%-%9%H$NCf$K8=$l$^$7$?!%$*$=$i$/(B\\#$B$H=q$-$?$+$C$?(B +$B$N$G$7$g$&!%(B") + + ("Overfull \\\\hbox .*" . +"$B9TJ,3d$N$?$a$NE,@Z$J>l=j$,8+$D$+$i$J$+$C$?$N$G!$(B1$B9T$K<}$^$k$Y$-J,NL0J>e(B +$B$N=PNO$,9T$J$o$l$F$7$^$$$^$7$?!%(B") + + ("Overfull \\\\vbox .*" . +"$B%Z!<%8J,3d$N$?$a$NE,@Z$J>l=j$,8+$D$+$i$J$+$C$?$N$G!$(B1$B%Z!<%8$K<}$^$k$Y$-(B +$BJ,NL0J>e$N=PNO$,9T$J$o$l$F$7$^$$$^$7$?!%(B") + + ("Underfull \\\\hbox .*" . +"$BM>J,$J?bD>%9%Z!<%9$,$J$$$+$I$&$+=PNO$r3N$+$a$F$/$@$5$$!%$b$7$"$l$P!$$=(B +$B$l$O(B\\\\$BL?Na$^$?$O(B\\newline$BL?Na$K4X78$9$kLdBj$N$?$a$K@8$8$?$b$N$G$9!%Nc(B +$B$($P(B2$B$D$N(B\\\\$BL?Na$,B3$$$F$$$k>l9g$J$I$G$9!%$3$N7Y9p$O(Bsloppypar$B4D6-$d(B +\\sloppy$B@k8@$N;HMQ!$$"$k$$$O(B\\linebreak$BL?Na$NA^F~$J$I$K$h$k>l9g$b$"$j$^$9!%(B") + + ("Underfull \\\\vbox .*" . +"$B%Z!<%8$rJ,3d$9$k$?$a$NE,@Z$J>l=j$,8+$D$1$i$l$:!$==J,$J%F%-%9%H$N$J$$(B +$B%Z!<%8$,$G$-$F$7$^$$$^$7$?!%(B") + +;; New list items should be placed here +;; +;; ("err-regexp" . "context") +;; +;; the err-regexp item should match anything + + (".*" . "$B$4$a$s$J$5$$!%3:Ev$9$k%X%k%W%a%C%;!<%8$,$"$j$^$;$s!%(B")))) + +(provide 'tex-jp) + +;;; tex-jp.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/tex-site.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,61 @@ +;;; tex-site.el - Select AUC TeX as your tex mode. + +;; Copyright (C) 1991 Kresten Krab Thorup +;; Copyright (C) 1993, 1994, 1997 Per Abrahamsen + +;; Author: Per Abrahamsen <abraham@iesd.auc.dk> +;; Maintainer: Per Abrahamsen <auc-tex@sunsite.auc.dk> +;; Version: XEmacs +;; Keywords: wp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Commentary: + +;; This file contains variables customized for the local site. + +;; It also contains all necessary autoloads, so the user can simple +;; enable AUC TeX by putting (load "tex-site") in his .emacs file, +;; or the administrator can insert it in the site-start.el file. +;; +;; The ideal place for this file is in the `site-lisp' directory. + +;;; Code: + +(defvar no-doc + "This function is part of AUC TeX, but has not yet been loaded. +Full documentation will be available after autoloading the function." + "Documentation for autoload functions.") + +;;; Customization: +;; +;; Copy variables you need to change from the start of `tex.el' and +;; insert them here. + +;;; Autoloads: + +;; This hook will store bibitems when you save a BibTeX buffer. +(add-hook 'bibtex-mode-hook 'BibTeX-auto-store) + +;; Load from AUC TeX files instead of standard files. +(autoload 'tex-mode "tex" no-doc t) +(autoload 'plain-tex-mode "tex" no-doc t) +(autoload 'tex-insert-quote "tex" no-doc t) +(autoload 'texinfo-mode "tex-info" no-doc t) +(autoload 'latex-mode "latex" no-doc t) + +(provide 'tex-site) + +;;; tex-site.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/tex.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,2640 @@ +;;; tex.el --- Support for TeX documents. + +;; Maintainer: Per Abrahamsen <auc-tex@sunsite.auc.dk> +;; Version: 9.7i +;; Keywords: wp +;; X-URL: http://sunsite.auc.dk/auctex + +;; Copyright (C) 1985, 1986 Free Software Foundation, Inc. +;; Copyright (C) 1987 Lars Peter Fischer +;; Copyright (C) 1991 Kresten Krab Thorup +;; Copyright (C) 1993, 1994, 1996, 1997 Per Abrahamsen +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 1, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Code: + +;;; Site Customization +;; +;; The following variables are likely to need to be changed for your +;; site. It is suggested that you do this by *not* changing this +;; file, but instead copy those definitions you need to change to +;; `tex-site.el'. + +(defvar TeX-lisp-directory "auctex/" + "*The directory where the AUC TeX lisp files are located.") + +;; Change this to point to the place where the TeX macros are stored +;; at yourt site. [Ignore when bundled with XEmacs] +(defvar TeX-macro-global '("/usr/lib/texmf/tex/") + "*Directories containing the sites TeX macro files and style files. + +The directory names *must* end with a slash.") + +;; How to print. + +(defvar TeX-print-command "dvips %s -P%p" + "*Command used to print a file. + +First %p is expanded to the printer name, then ordinary expansion is +performed as specified in TeX-expand-list.") + +(defvar TeX-queue-command "lpq -P%p" + "*Command used to show the status of a printer queue. + +First %p is expanded to the printer name, then ordinary expansion is +performed as specified in TeX-expand-list.") + +;; This is the major configuration variable. Most sites will only +;; need to change the second string in each entry, which is the name +;; of a command to send to the shell. If you use other formatters +;; like AMSLaTeX or AMSTeX, you can add those to the list. See +;; TeX-expand-list for a description of the % escapes + +(defvar TeX-command-list + ;; You may have to remove the single quotes around the command + ;; arguments if you use DOS. + (list (list "TeX" "tex '\\nonstopmode\\input %t'" 'TeX-run-TeX nil t) + (list "TeX Interactive" "tex %t" 'TeX-run-interactive nil t) + (list "LaTeX" "%l '\\nonstopmode\\input{%t}'" + 'TeX-run-LaTeX nil t) + (list "LaTeX Interactive" "%l %t" 'TeX-run-interactive nil t) + (list "LaTeX2e" "latex2e '\\nonstopmode\\input{%t}'" + 'TeX-run-LaTeX nil t) + (if (or window-system (getenv "DISPLAY")) + (list "View" "%v " 'TeX-run-background t nil) + (list "View" "dvi2tty -q -w 132 %s " 'TeX-run-command t nil)) + (list "Print" "%p " 'TeX-run-command t nil) + (list "Queue" "%q" 'TeX-run-background nil nil) + (list "File" "dvips %d -o %f " 'TeX-run-command t nil) + (list "BibTeX" "bibtex %s" 'TeX-run-BibTeX nil nil) + (list "Index" "makeindex %s" 'TeX-run-command nil t) + ;; (list "Check" "chktex -v3 %s" 'TeX-run-compile nil t) + ;; Uncomment the above line and comment out the next line to + ;; use `chktex' instead of `lacheck'. + (list "Check" "lacheck %s" 'TeX-run-compile nil t) + (list "Spell" "<ignored>" 'TeX-run-ispell nil nil) + (list "Other" "" 'TeX-run-command t t) + ;; Not part of standard TeX. + (list "Makeinfo" "makeinfo %t" 'TeX-run-compile nil t) + (list "AmSTeX" "amstex '\\nonstopmode\\input %t'" + 'TeX-run-TeX nil t)) + "*List of commands to execute on the current document. + +Each element is a list, whose first element is the name of the command +as it will be presented to the user. + +The second element is the string handed to the shell after being +expanded. The expansion is done using the information found in +TeX-expand-list. + +The third element is the function which actually start the process. +Several such hooks has been defined: + +TeX-run-command: Start up the process and show the output in a +separate buffer. Check that there is not two commands running for the +same file. Return the process object. + +TeX-run-format: As TeX-run-command, but assume the output is created +by a TeX macro package. Return the process object. + +TeX-run-TeX: For TeX output. + +TeX-run-LaTeX: For LaTeX output. + +TeX-run-interactive: Run TeX or LaTeX interactively. + +TeX-run-BibTeX: For BibTeX output. + +TeX-run-compile: Use `compile' to run the process. + +TeX-run-shell: Use `shell-command' to run the process. + +TeX-run-discard: Start the process in the background, discarding its +output. + +TeX-run-background: Start the process in the background, show output +in other window. + +TeX-run-dviout: Special hook for the Japanese dviout previewer for +PC-9801. + +To create your own hook, define a function taking three arguments: The +name of the command, the command string, and the name of the file to +process. It might be useful to use TeX-run-command in order to +create an asynchronous process. + +If the fourth element is non-nil, the user will get a chance to +modify the expanded string. + +The fifth element is obsolete and ignored.") + +;; You may want to change the default LaTeX version for your site. +(defvar LaTeX-version "2e" + "Default LaTeX version. Currently recognized is \"2\" and \"2e\".") + +;; You may want special options to the view command depending on the +;; style options. Only works if parsing is enabled. + +(defvar LaTeX-command-style + (if (string-equal LaTeX-version "2") + ;; There is a lot of different LaTeX 2 based formats. + '(("^latex2e$" "latex2e") + ("^foils$" "foiltex") + ("^ams" "amslatex") + ("^slides$" "slitex") + ("^plfonts\\|plhb$" "platex") + ("." "latex")) + ;; They have all been combined in LaTeX 2e. + '(("." "latex"))) + "*List of style options and LaTeX commands. + +If the first element (a regular expresion) matches the name of one of +the style files, any occurrence of the string %l in a command in +TeX-command-list will be replaced with the second element. The first +match is used, if no match is found the %l is replaced with the empty +string.") + +;; Enter the names of the printers available at your site, or nil if +;; you only have one printer. + +(defvar TeX-printer-list + '(("Local" "dvips -f %s | lpr" "lpq") + ("lw") ("ps")) + "*List of available printers. + +The first element of each entry is the printer name. + +The second element is the command used to print to this +printer. It defaults to the value of TeX-print-command. + +The third element is the command used to examine the print queue for +this printer. It defaults to the value of TeX-queue-command. + +Any occurence of `%p' in the second or third element is expanded to +the printer name given in the first element, then ordinary expansion +is performed as specified in TeX-expand-list.") + +;; The name of the most used printer. + +(defvar TeX-printer-default (or (getenv "PRINTER") + (and TeX-printer-list + (car (car TeX-printer-list))) + "lw") + "*Default printer to use with TeX-command.") + +;; You may want special options to the view command depending on the +;; style options. Only works if parsing is enabled. + +(defvar TeX-view-style '(("^a5$" "xdvi %d -paper a5") + ("^landscape$" "xdvi %d -paper a4r -s 4") + ;; The latest xdvi can show embedded postscript. + ;; If you don't have that, uncomment next line. + ;; ("^epsf$" "ghostview %f") + ("." "xdvi %d")) + "*List of style options and view options. + +If the first element (a regular expresion) matches the name of one of +the style files, any occurrence of the string %v in a command in +TeX-command-list will be replaced with the second element. The first +match is used, if no match is found the %v is replaced with the empty +string.") + +;; This is the list of expansion for the commands in +;; TeX-command-list. Not likely to be changed, but you may e.g. want +;; to handle .ps files. + +(defvar TeX-expand-list + (list (list "%p" 'TeX-printer-query) ;%p must be the first entry + (list "%q" (function (lambda () + (TeX-printer-query TeX-queue-command 2)))) + (list "%v" 'TeX-style-check TeX-view-style) + (list "%l" 'TeX-style-check LaTeX-command-style) + (list "%s" 'file nil t) + (list "%t" 'file 't t) + (list "%d" 'file "dvi" t) + (list "%f" 'file "ps" t)) + "*List of expansion strings for TeX command names. + +Each entry is a list with two or more elements. The first element is +the string to be expanded. The second element is the name of a +function returning the expanded string when called with the remaining +elements as arguments. The special value `file' will be expanded to +the name of the file being processed, with an optional extension.") + +;; End of Site Customization. + +;;; Import + +(or (assoc TeX-lisp-directory (mapcar 'list load-path)) ;No `member' yet. + (setq load-path (cons TeX-lisp-directory load-path))) + +(defvar no-doc + "This function is part of AUC TeX, but has not yet been loaded. +Full documentation will be available after autoloading the function." + "Documentation for autoload functions.") + +;; This hook will store bibitems when you save a BibTeX buffer. +(defvar bibtex-mode-hook nil) +(or (memq 'BibTeX-auto-store bibtex-mode-hook) ;No `add-hook' yet. + (setq bibtex-mode-hook (cons 'BibTeX-auto-store bibtex-mode-hook))) + +(autoload 'BibTeX-auto-store "latex" no-doc t) + +(autoload 'LaTeX-math-mode "latex" no-doc t) +(autoload 'japanese-plain-tex-mode "tex-jp" no-doc t) +(autoload 'japanese-latex-mode "tex-jp" no-doc t) +(autoload 'japanese-slitex-mode "tex-jp" no-doc t) +(autoload 'texinfo-mode "tex-info" no-doc t) +(autoload 'latex-mode "latex" no-doc t) + +(autoload 'multi-prompt "multi-prompt" no-doc nil) + +;;; Portability. + +(require 'easymenu) + +;; An GNU Emacs 19 function. +(or (fboundp 'set-text-properties) + (fset 'set-text-properties (symbol-function 'ignore))) + +;; An GNU Emacs 19 variable. +(defvar minor-mode-map-alist nil) + +;;; Special support for Emacs 18 + +(cond ((< (string-to-int emacs-version) 19) + +(condition-case error + (require 'outline) ;No provide in Emacs 18 outline.el + (error (provide 'outline))) + +;; Emacs 18 grok this regexp, but you loose the ability to use +;; whitespace anywhere in your documentstyle command. +(defvar LaTeX-auto-minimal-regexp-list + '(("\\\\documentstyle\\[\\([^#\\\\\\.\n\r]+\\)\\]{\\([^#\\\\\\.\n\r]+\\)}" + (1 2) LaTeX-auto-style) + ("\\\\documentstyle{\\([^#\\\\\\.\n\r]+\\)}" (1) LaTeX-auto-style) + ("\\\\documentclass\\[\\([^#\\\\\\.\n\r]+\\)\\]{\\([^#\\\\\\.\n\r]+\\)}" + (1 2) LaTeX-auto-style) + ("\\\\documentclass{\\([^#\\\\\\.\n\r]+\\)}" (1) LaTeX-auto-style)) + "Minimal list of regular expressions matching LaTeX macro definitions.") + +;; The Emacs 19 definition of `comment-region'. +(defun comment-region (beg end &optional arg) + "Comment the region; third arg numeric means use ARG comment characters. +If ARG is negative, delete that many comment characters instead. +Comments are terminated on each line, even for syntax in which newline does +not end the comment. Blank lines do not get comments." + ;; if someone wants it to only put a comment-start at the beginning and + ;; comment-end at the end then typing it, C-x C-x, closing it, C-x C-x + ;; is easy enough. No option is made here for other than commenting + ;; every line. + (interactive "r\np") + (or comment-start (error "No comment syntax is defined")) + (if (> beg end) (let (mid) (setq mid beg beg end end mid))) + (save-excursion + (save-restriction + (let ((cs comment-start) (ce comment-end)) + (cond ((not arg) (setq arg 1)) + ((> arg 1) + (while (> (setq arg (1- arg)) 0) + (setq cs (concat cs comment-start) + ce (concat ce comment-end))))) + (narrow-to-region beg end) + (goto-char beg) + (while (not (eobp)) + (if (< arg 0) + (let ((count arg)) + (while (and (> 1 (setq count (1+ count))) + (looking-at (regexp-quote cs))) + (delete-char (length cs))) + (if (string= "" ce) () + (setq count arg) + (while (> 1 (setq count (1+ count))) + (end-of-line) + ;; this is questionable if comment-end ends in whitespace + ;; that is pretty brain-damaged though + (skip-chars-backward " \t") + (backward-char (length ce)) + (if (looking-at (regexp-quote ce)) + (delete-char (length ce))))) + (forward-line 1)) + (if (looking-at "[ \t]*$") () + (insert cs) + (if (string= "" ce) () + (end-of-line) + (insert ce))) + (search-forward "\n" nil 'move))))))) + +;; The Emacs 19 definition of `add-hook'. +(defun add-hook (hook function &optional append) + "Add to the value of HOOK the function FUNCTION. +FUNCTION is not added if already present. +FUNCTION is added (if necessary) at the beginning of the hook list +unless the optional argument APPEND is non-nil, in which case +FUNCTION is added at the end. + +HOOK should be a symbol, and FUNCTION may be any valid function. If +HOOK is void, it is first set to nil. If HOOK's value is a single +function, it is changed to a list of functions." + (or (boundp hook) (set hook nil)) + ;; If the hook value is a single function, turn it into a list. + (let ((old (symbol-value hook))) + (if (or (not (listp old)) (eq (car old) 'lambda)) + (set hook (list old)))) + (or (if (consp function) + ;; Clever way to tell whether a given lambda-expression + ;; is equal to anything in the hook. + (let ((tail (assoc (cdr function) (symbol-value hook)))) + (equal function tail)) + (memq function (symbol-value hook))) + (set hook + (if append + (nconc (symbol-value hook) (list function)) + (cons function (symbol-value hook)))))) + +;; An Emacs 19 function. +(defun make-directory (dir) + "Create the directory DIR." + (shell-command (concat "mkdir " (if (string-match "/$" dir) + (substring dir 0 -1) + dir)))) + +;; An Emacs 19 function. +(defun abbreviate-file-name (name) + name) + +;; Different interface for each variant. +(defun TeX-active-mark () + ;; Emacs 18 does not have active marks. + nil) + +;; Different interface for each variant. +(defun TeX-mark-active () + ;; In Emacs 18 (mark) returns nil when not active. + (mark)) + +;; An Emacs 19 function. +(defun member (elt list) + "Return non-nil if ELT is an element of LIST. Comparison done with EQUAL. +The value is actually the tail of LIST whose car is ELT." + (while (and list (not (equal elt (car list)))) + (setq list (cdr list))) + list) + +;; An Emacs 19 macro. +(defmacro save-match-data (&rest body) + "Execute the BODY forms, restoring the global value of the match data." + (let ((original (make-symbol "match-data"))) + (list + 'let (list (list original '(match-data))) + (list 'unwind-protect + (cons 'progn body) + (list 'store-match-data original))))) + +) + +;;; Special support for XEmacs + +((or (string-match "Lucid" emacs-version) + (string-match "XEmacs" emacs-version)) + +(if (eq emacs-minor-version 13) + ;; XEmacs 19.13 had a partial defintion of set-text-properties. + (defadvice set-text-properties (around ignore-strings activate) + "Ignore strings." + (or (stringp (ad-get-arg 3)) + ad-do-it))) + +(defadvice popup-mode-menu (before LaTeX-update activate) + "Run `LaTeX-menu-update' before showing menu." + (and (fboundp 'LaTeX-menu-update) + (LaTeX-menu-update))) + +(defun TeX-mark-active () + ;; In Lucid (mark) returns nil when not active. + (if zmacs-regions + (mark) + (mark t))) + +(defun TeX-active-mark () + (and zmacs-regions (mark))) + +;; Lucid 19.11 have no idea what `kill-all-local-variables' is +;; supposed to do. I have to explicitly clear `TeX-symbol-list' +;; despite it being buffer local. You can verify this by removing the +;; hook below, setting a breakpoint just after the call to +;; `kill-all-local-variables' in `VirTeX-common-initialization' and +;; examine the local and global value of `TeX-symbol-list'. Make sure +;; you have a `%%% mode: latex' line in your file variable section, +;; and have latex-mode as your default mode for ".tex" files. +;; Unfortunately I have been unable to isolate the error further. +(add-hook 'change-major-mode-hook + '(lambda () (setq TeX-symbol-list nil + LaTeX-environment-list nil))) + +;; Lucid 19.6 grok this regexp, but you loose the ability to use +;; whitespace in your documentstyle command. +(string-match "\\`[0-9]+\\.\\([0-9]+\\)" emacs-version) +(or (> (string-to-int (substring emacs-version + (match-beginning 1) (match-end 1))) + 8) + (> (string-to-int emacs-version) 19) + (boundp 'LaTeX-auto-minimal-regexp-list) + (setq LaTeX-auto-minimal-regexp-list + '(("\\\\documentstyle\\[\\([^#\\\\\\.\n\r]+\\)\\]{\\([^#\\\\\\.\n\r]+\\)}" + (1 2) LaTeX-auto-style) + ("\\\\documentstyle{\\([^#\\\\\\.\n\r]+\\)}" (1) LaTeX-auto-style) + ("\\\\documentclass\\[\\([^#\\\\\\.\n\r]+\\)\\]{\\([^#\\\\\\.\n\r]+\\)}" + (1 2) LaTeX-auto-style) + ("\\\\documentclass{\\([^#\\\\\\.\n\r]+\\)}" (1) LaTeX-auto-style)))) + +;; Lucid only +(fset 'TeX-activate-region (symbol-function 'zmacs-activate-region)) + +) +;;; Special support for GNU Emacs 19 + +(t + +(defun TeX-mark-active () + ;; In FSF 19 mark-active indicates if mark is active. + mark-active) + +(defun TeX-active-mark () + (and transient-mark-mode mark-active)) + +(defun TeX-activate-region ()) + +)) + +;;; Version + +;; These two variables are automatically updated with "make dist", so +;; be careful before changing anything. + +(defconst AUC-TeX-version "9.7i" + "AUC TeX version number") + +(defconst AUC-TeX-date "Thu Feb 20 11:30:55 MET 1997" + "AUC TeX release date") + +;;; Buffer + +(defvar TeX-display-help t + "*Non-nil means popup help when stepping thrugh errors with \\[TeX-next-error]") + +(defvar TeX-debug-bad-boxes nil + "*Non-nil means also find overfull/underfull boxes warnings with TeX-next-error") + +(defvar TeX-command-BibTeX "BibTeX" + "*The name of the BibTeX entry in TeX-command-list.") + (make-variable-buffer-local 'TeX-command-BibTeX) + +(defvar TeX-command-Show "View" + "*The default command to show (view or print) a TeX file. +Must be the car of an entry in TeX-command-list.") + (make-variable-buffer-local 'TeX-command-Show) + +(defvar TeX-command-Print "Print" + "The name of the Print entry in TeX-command-Print.") + +(defvar TeX-command-Queue "Queue" + "The name of the Queue entry in TeX-command-Queue.") + +(autoload 'TeX-region-create "tex-buf" no-doc nil) +(autoload 'TeX-save-document "tex-buf" no-doc t) +(autoload 'TeX-home-buffer "tex-buf" no-doc t) +(autoload 'TeX-command-region "tex-buf" no-doc t) +(autoload 'TeX-command-buffer "tex-buf" no-doc t) +(autoload 'TeX-command-master "tex-buf" no-doc t) +(autoload 'TeX-command "tex-buf" no-doc nil) +(autoload 'TeX-kill-job "tex-buf" no-doc t) +(autoload 'TeX-recenter-output-buffer "tex-buf" no-doc t) +(autoload 'TeX-next-error "tex-buf" no-doc t) +(autoload 'TeX-toggle-debug-boxes "tex-buf" no-doc t) +(autoload 'TeX-region-file "tex-buf" no-doc nil) + +(defvar TeX-trailer-start nil + "Regular expression delimiting start of trailer in a TeX file.") + + (make-variable-buffer-local 'TeX-trailer-start) + +(defvar TeX-header-end nil + "Regular expression delimiting end of header in a TeX file.") + + (make-variable-buffer-local 'TeX-header-end) + +(defvar TeX-command-default nil + "The default command for TeX-command in the current major mode.") + + (make-variable-buffer-local 'TeX-command-default) + + +;;; Master File + +(defvar TeX-one-master "\\.tex$" + "*Regular expression matching ordinary TeX files. + +You should set this variable to match the name of all files, where +automatically adding a file variable with the name of the master file +is a good idea. When AUC TeX add the name of the master file as a +file variable, it does not need to ask next time you edit the file. + +If you dislike AUC TeX automatically modifying your files, you can set +this variable to \"<none>\".") + +(defun TeX-master-file (&optional extension nondirectory) + "Return the name of the master file for the current document. + +If optional argument EXTENSION is non-nil, add that file extension to +the name. Special value `t' means use `TeX-default-extension'. + +If optional second argument NONDIRECTORY is non-nil, do not include +the directory. + +Currently is will check for the presence of a ``Master:'' line in +the beginning of the file, but that feature will be phased out." + (if (eq extension t) + (setq extension TeX-default-extension)) + (let ((my-name (if (buffer-file-name) + (TeX-strip-extension nil (list TeX-default-extension) t) + "<none>"))) + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + (cond + ;; Special value 't means it is own master (a free file). + ((equal TeX-master my-name) + (setq TeX-master t)) + + ;; For files shared between many documents. + ((eq 'shared TeX-master) + (setq TeX-master + (TeX-strip-extension + (read-file-name "Master file: (default this file) " + nil "///") + (list TeX-default-extension) + 'path)) + (if (or (string-equal TeX-master "///") + (string-equal TeX-master "")) + (setq TeX-master t))) + + ;; We might already know the name. + (TeX-master) + + ;; Support the ``Master:'' line (under protest!) + ((re-search-forward + "^%% *[Mm]aster:?[ \t]*\\([^ \t\n]+\\)" 500 t) + (setq TeX-master + (TeX-strip-extension (TeX-match-buffer 1) + (list TeX-default-extension))) + (if TeX-convert-master + (progn + (beginning-of-line) + (kill-line 1) + (TeX-add-local-master)))) + + ;; Is this a master file? + ((re-search-forward TeX-header-end 10000 t) + (setq TeX-master my-name)) + + ;; Ask the user (but add it as a local variable). + (t + (setq TeX-master + (TeX-strip-extension + (condition-case name + (read-file-name "Master file: (default this file) " + nil "<default>") + (quit "<quit>")) + (list TeX-default-extension) + 'path)) + (cond ((string-equal TeX-master "<quit>") + (setq TeX-master t)) + ((or (string-equal TeX-master "<default>") + (string-equal TeX-master "")) + (setq TeX-master t) + (TeX-add-local-master)) + (t + (TeX-add-local-master))))))) + + (let ((name (if (eq TeX-master t) + my-name + TeX-master))) + + (if (TeX-match-extension name) + ;; If it already have an extension... + (if (equal extension TeX-default-extension) + ;; Use instead of the default extension + (setq extension nil) + ;; Otherwise drop it. + (setq name (TeX-strip-extension name)))) + + ;; Remove directory if needed. + (if nondirectory + (setq name (file-name-nondirectory name))) + + (if extension + (concat name "." extension) + name)))) + +(defun TeX-master-directory () + "Directory of master file." + (abbreviate-file-name + (expand-file-name + (concat (file-name-directory buffer-file-name) + (file-name-directory (TeX-master-file)))))) + +(defvar TeX-master t + "*The master file associated with the current buffer. +If the file being edited is actually included from another file, you +can tell AUC TeX the name of the master file by setting this variable. +If there are multiple levels of nesting, specify the top level file. + +If this variable is nil, AUC TeX will query you for the name. + +If the variable is t, AUC TeX will assume the file is a master file +itself. + +If the variable is 'shared, AUC TeX will query for the name, but not +change the file. + +It is suggested that you use the File Variables (see the info node in +the Emacs manual) to set this variable permanently for each file.") + + (make-variable-buffer-local 'TeX-master) + +(defvar TeX-convert-master t + "*If not nil, automatically convert ``Master:'' lines to file variables. +This will be done when AUC TeX first try to use the master file.") + +(defun TeX-add-local-master () + "Add local variable for TeX-master." + + (if (and (buffer-file-name) + (string-match TeX-one-master + (file-name-nondirectory (buffer-file-name))) + (not buffer-read-only)) + (progn + (goto-char (point-max)) + (if (re-search-backward (concat "^\\([^\n]+\\)Local " "Variables:") + (- (point-max) 3000) t) + (let ((prefix (TeX-match-buffer 1))) + (re-search-forward (regexp-quote (concat prefix + "End:"))) + (beginning-of-line 1) + (insert prefix "TeX-master: " (prin1-to-string TeX-master) "\n")) + (insert "\n%%% Local " "Variables: \n" + "%%% mode: " (substring (symbol-name major-mode) 0 -5) + "\n" + "%%% TeX-master: " (prin1-to-string TeX-master) "\n" + "%%% End: \n"))))) + +;;; Style Paths + +(or (string-match "/\\'" TeX-lisp-directory) + (setq TeX-lisp-directory (concat TeX-lisp-directory "/"))) + +(defvar TeX-auto-global (concat TeX-lisp-directory "auto/") + "*Directory containing automatically generated information. +Must end with a slash. + +For storing automatic extracted information about the TeX macros +shared by all users of a site.") + +(defvar TeX-style-global (concat TeX-lisp-directory "style/") + "*Directory containing hand generated TeX information. +Must end with a slash. + +These correspond to TeX macros shared by all users of a site.") + +(defvar TeX-auto-local "auto/" + "*Directory containing automatically generated TeX information. +Must end with a slash. + +This correspond to TeX macros found in the current directory.") + +(defvar TeX-style-local "style/" + "*Directory containing hand generated TeX information. +Must end with a slash. + +These correspond to TeX macros found in the current directory.") + +(defun TeX-split-string (regexp string) + "Returns a list of strings. given REGEXP the STRING is split into +sections which in string was seperated by REGEXP. + +Examples: + + (TeX-split-string \"\:\" \"abc:def:ghi\") + -> (\"abc\" \"def\" \"ghi\") + + (TeX-split-string \" *\" \"dvips -Plw -p3 -c4 testfile.dvi\") + + -> (\"dvips\" \"-Plw\" \"-p3\" \"-c4\" \"testfile.dvi\") + +If REGEXP is nil, or \"\", an error will occur." + + (let ((start 0) + (result '())) + (while (string-match regexp string start) + (let ((match (string-match regexp string start))) + (setq result (cons (substring string start match) result)) + (setq start (match-end 0)))) + (setq result (cons (substring string start nil) result)) + (nreverse result))) + +(defun TeX-directory-absolute-p (dir) + ;; Non-nil iff DIR is the name of an absolute directory. + (if (memq system-type '(ms-dos emx windows-nt)) + (string-match "^\\([A-Za-z]:\\)?/" dir) + (string-match "^/" dir))) + +(defun TeX-parse-path (env) + ;; Return a list if private TeX directories found in environment + ;; variable ENV. + (let* ((value (getenv env)) + (entries (and value (TeX-split-string ":" value))) + entry + answers) + (while entries + (setq entry (car entries)) + (setq entries (cdr entries)) + (or (string-match "/$" entry) + (setq entry (concat entry "/"))) + (and (string-match "//$" entry) + (setq entry (substring entry 0 -1))) + (or (not (TeX-directory-absolute-p entry)) + (member entry TeX-macro-global) + (string-equal "/" entry) + (setq answers (cons entry answers)))) + answers)) + +(defvar TeX-macro-private (append (TeX-parse-path "TEXINPUTS") + (TeX-parse-path "BIBINPUTS")) + "*Directories where you store your personal TeX macros. +Each must end with a slash.") + +(defvar TeX-auto-private (mapcar (function (lambda (entry) + (concat entry TeX-auto-local))) + TeX-macro-private) + "*List of directories containing automatically generated information. +Must end with a slash. + +These correspond to the personal TeX macros.") + +(if (stringp TeX-auto-private) ;Backward compatibility + (setq TeX-auto-private (list TeX-auto-private))) + +(defvar TeX-style-private (mapcar (function (lambda (entry) + (concat entry + TeX-style-local))) + TeX-macro-private) + "*List of directories containing hand generated information. +Must end with a slash. + +These correspond to the personal TeX macros.") + +(if (stringp TeX-style-private) ;Backward compatibility + (setq TeX-style-private (list TeX-style-private))) + +(defvar TeX-style-path + (let ((path)) + (mapcar (function (lambda (file) (if file (setq path (cons file path))))) + (append (list TeX-auto-global TeX-style-global) + TeX-auto-private TeX-style-private + (list TeX-auto-local TeX-style-local))) + path) + "*List of directories to search for AUC TeX style files.") + +(defvar TeX-check-path (append (list "./") TeX-macro-private TeX-macro-global) + "*Directory path to search for dependencies. + +If nil, just check the current file. +Used when checking if any files have changed.") + +;;; Style Files + +(defvar TeX-style-hook-list nil + "List of TeX style hooks currently loaded. + +Each entry is a list where the first element is the name of the style, +and the remaining elements are hooks to be run when that style is +active.") + +(defvar TeX-byte-compile nil + "*Not nil means try to byte compile auto files before loading.") + +(defun TeX-load-style (style) + "Search for and load each definition for style in TeX-style-path." + (cond ((assoc style TeX-style-hook-list)) ; We already found it + ((string-match "\\`\\(.+/\\)\\([^/]*\\)\\'" style) ;Complex path + (let* ((dir (substring style (match-beginning 1) (match-end 1))) + (style (substring style (match-beginning 2) (match-end 2))) + (TeX-style-path (append (list (concat dir TeX-auto-local) + (concat dir TeX-style-local)) + TeX-style-path))) + (TeX-load-style style))) + (t ;Relative path + ;; Insert empty list to mark the fact that we have searched. + (setq TeX-style-hook-list (cons (list style) TeX-style-hook-list)) + ;; Now check each element of the path + (mapcar (function (lambda (name) + (TeX-load-style-file (if (string-match "/$" name) + (concat name style) + (concat name "/" style))))) + TeX-style-path)))) + +(defun TeX-load-style-file (file) + ;; Load FILE checking for a lisp extensions. + (let ((el (concat file ".el")) + (elc (concat file ".elc"))) + (cond ((and (null TeX-byte-compile) + (file-readable-p el)) + (load-file el)) + ((file-newer-than-file-p el elc) + (if (not (file-writable-p elc)) + (load-file el) + (byte-compile-file el) + (load-file elc))) + ((file-readable-p elc) + (load-file elc)) + ((file-readable-p el) + (load-file el))))) + +(defun TeX-add-style-hook (style hook) + "Give STYLE yet another HOOK to run." + (let ((entry (assoc style TeX-style-hook-list))) + (if (null entry) + (setq TeX-style-hook-list (cons (list style hook) TeX-style-hook-list)) + (setcdr entry (cons hook (cdr entry)))))) + +(defun TeX-unload-style (style) + "Forget that we once loaded STYLE." + (cond ((null (assoc style TeX-style-hook-list))) + ((equal (car (car TeX-style-hook-list)) style) + (setq TeX-style-hook-list (cdr TeX-style-hook-list))) + (t + (let ((entry TeX-style-hook-list)) + (while (not (equal (car (car (cdr entry))) style)) + (setq entry (cdr entry))) + (setcdr entry (cdr (cdr entry))))))) + +(defvar TeX-virgin-style (if (and TeX-auto-global + (file-directory-p TeX-auto-global)) + "virtex" + "NoVirtexSymbols") + "Style all documents use.") + +(defvar TeX-active-styles nil + "List of styles currently active in the document.") + + (make-variable-buffer-local 'TeX-active-styles) + +(defun TeX-run-style-hooks (&rest styles) + "Run the TeX following style hooks." + (mapcar (function + (lambda (style) + (if (TeX-member style TeX-active-styles 'string-equal) + () ;Avoid recursion. + (setq TeX-active-styles + (cons style TeX-active-styles)) + (TeX-load-style style) + (if (string-match "\\`\\(.+/\\)\\([^/]*\\)\\'" style) + (setq style ; Complex path + (substring style (match-beginning 2) (match-end 2)))) + (mapcar 'funcall + (cdr-safe (assoc style TeX-style-hook-list)))))) + styles)) + +(defvar TeX-parse-self nil + "*Parse file after loading it if no style hook is found for it.") + +(defvar TeX-style-hook-applied-p nil + "Nil, unless the style specific hooks have been applied.") + (make-variable-buffer-local 'TeX-style-hook-applied-p) + +(defun TeX-update-style (&optional force) + "Run style specific hooks for the current document. + +Only do this if it has not been done before, or if optional argument +FORCE is not nil." + + (if (or (eq TeX-auto-update 'BibTeX) ; Not a real TeX buffer + (and (not force) TeX-style-hook-applied-p)) + () + (setq TeX-style-hook-applied-p t) + (message "Applying style hooks...") + (TeX-run-style-hooks (TeX-strip-extension nil nil t)) + ;; Run parent style hooks if it has a single parent that isn't itself. + (if (or (not (memq TeX-master '(nil t))) + (and (buffer-file-name) + (string-match TeX-one-master + (file-name-nondirectory (buffer-file-name))))) + (TeX-run-style-hooks (TeX-master-file))) + + (if (and TeX-parse-self + (null (cdr-safe (assoc (TeX-strip-extension nil nil t) + TeX-style-hook-list)))) + (TeX-auto-apply)) + + (message "Applying style hooks... done"))) + +(defvar TeX-remove-style-hook nil + "List of hooks to call when we remove the style specific information.") + (make-variable-buffer-local 'TeX-remove-style-hook) + +(defun TeX-remove-style () + "Remnove all style specific information." + (setq TeX-style-hook-applied-p nil) + (run-hooks 'TeX-remove-style-hooks) + (setq TeX-active-styles (list TeX-virgin-style))) + +(defun TeX-style-list () + "Return a list of all styles (subfils) use by the current document." + (TeX-update-style) + TeX-active-styles) + +;;; Special Characters + +(defvar TeX-esc "\\" "The TeX escape character.") + (make-variable-buffer-local 'TeX-esc) + +(defvar TeX-grop "{" "The TeX group opening character.") + (make-variable-buffer-local 'TeX-grop) + +(defvar TeX-grcl "}" "The TeX group closing character.") + (make-variable-buffer-local 'TeX-grcl) + +;;; Symbols + +;; Must be before keymaps. + +(defvar TeX-complete-word 'ispell-complete-word + "*Function to call for completing non-macros in tex-mode.") + +(defvar TeX-complete-list nil + "List of ways to complete the preceding text. + +Each entry is a list with the following elements: + +0. Regexp matching the preceding text. +1. A number indicating the subgroup in the regexp containing the text. +2. A function returning an alist of possible completions. +3. Text to append after a succesful completion. + +Or alternatively: + +0. Regexp matching the preceding text. +1. Function to do the actual completion.") + +(defun TeX-complete-symbol () + "Perform completion on TeX/LaTeX symbol preceding point." + (interactive "*") + (let ((list TeX-complete-list) + entry) + (while list + (setq entry (car list) + list (cdr list)) + (if (TeX-looking-at-backward (car entry) 250) + (setq list nil))) + (if (numberp (nth 1 entry)) + (let* ((sub (nth 1 entry)) + (close (nth 3 entry)) + (begin (match-beginning sub)) + (end (match-end sub)) + (pattern (TeX-match-buffer 0)) + (symbol (buffer-substring begin end)) + (list (funcall (nth 2 entry))) + (completion (try-completion symbol list))) + (cond ((eq completion t) + (and close + (not (looking-at (regexp-quote close))) + (insert close))) + ((null completion) + (error "Can't find completion for \"%s\"" pattern)) + ((not (string-equal symbol completion)) + (delete-region begin end) + (insert completion) + (and close + (eq (try-completion completion list) t) + (not (looking-at (regexp-quote close))) + (insert close))) + (t + (message "Making completion list...") + (let ((list (all-completions symbol list nil))) + (with-output-to-temp-buffer "*Completions*" + (display-completion-list list))) + (message "Making completion list...done")))) + (funcall (nth 1 entry))))) + +(defvar TeX-default-macro "ref" + "*The default macro when creating new ones with TeX-insert-macro.") + + (make-variable-buffer-local 'TeX-default-macro) + +(defvar TeX-insert-braces t + "*If non-nil, append a empty pair of braces after inserting a macro.") + +(defun TeX-math-mode-p () + "Are we in TeX math mode?" + ;; This should check for dollar signs, but thats to hard for now. + (and (boundp 'LaTeX-math-mode) LaTeX-math-mode)) + +(defun TeX-insert-macro (symbol) + "Insert TeX macro with completion. + +AUC TeX knows of some macros, and may query for extra arguments." + (interactive (list (completing-read (concat "Macro (default " + TeX-default-macro + "): " + TeX-esc) + (TeX-symbol-list)))) + (cond ((string-equal symbol "") + (setq symbol TeX-default-macro)) + ((interactive-p) + (setq TeX-default-macro symbol))) + (TeX-parse-macro symbol (cdr-safe (assoc symbol (TeX-symbol-list))))) + +(defvar TeX-electric-macro-map nil) + +(if TeX-electric-macro-map + () + (setq TeX-electric-macro-map (copy-keymap minibuffer-local-completion-map)) + (define-key TeX-electric-macro-map " " 'minibuffer-complete-and-exit)) + +(defun TeX-electric-macro () + "Insert TeX macro with completion. + +AUC TeX knows of some macros, and may query for extra arguments. +Space will complete and exit." + (interactive) + (if (memq (preceding-char) '(?\\ ?.)) + (call-interactively 'self-insert-command) + (let ((minibuffer-local-completion-map TeX-electric-macro-map)) + (call-interactively 'TeX-insert-macro)))) + +(defun TeX-parse-macro (symbol args) + "How to parse TeX macros which takes one or more arguments." + + ;; First argument is the name of the macro. + + ;; If called with no additional arguments, insert macro with point + ;; inside braces. Otherwise, each argument of this function should + ;; match an argument to the TeX macro. What is done depend on the + ;; argument type. + + ;; string: Use the string as a prompt to prompt for the argument. + + ;; number: Insert that many braces, leave point inside the first. + + ;; nil: Insert empty braces. + + ;; t: Insert empty braces, leave point between the braces. + + ;; other symbols: Call the symbol as a function. You can define + ;; your own hook, or use one of the predefined argument hooks. If + ;; you add new hooks, you can assume that point is placed directly + ;; after the previous argument, or after the macro name if this is + ;; the first argument. Please leave point located efter the + ;; argument you are inserting. If you want point to be located + ;; somewhere else after all hooks have been processed, set the value + ;; of `exit-mark'. It will point nowhere, until the argument hook + ;; set it. By convention, these hook all start with `TeX-arg-'. + + ;; list: If the car is a string, insert it as a prompt and the next + ;; element as initial input. Otherwise, call the car of the list + ;; with the remaining elements as arguments. + + ;; vector: Optional argument. If it has more than one element, + ;; parse it as a list, otherwise parse the only element as above. + ;; Use square brackets instead of curly braces, and is not inserted + ;; on empty user input. + + (insert TeX-esc symbol) + (let ((exit-mark (make-marker)) + (position (point))) + (TeX-parse-arguments args) + (cond ((marker-position exit-mark) + (goto-char (marker-position exit-mark)) + (set-marker exit-mark nil)) + ((and TeX-insert-braces + (equal position (point)) + (string-match "[a-zA-Z]+" symbol) + (not (TeX-math-mode-p))) + (insert TeX-grop TeX-grcl))))) + +(defun TeX-arg-string (optional &optional prompt input) + "Prompt for a string." + (TeX-argument-insert + (read-string (TeX-argument-prompt optional prompt "Text") input) + optional)) + +(defun TeX-parse-arguments (args) + "Parse TeX macro arguments. + +See TeX-parse-macro for details." + (let ((last-optional-rejected nil)) + (while args + (if (vectorp (car args)) + (if last-optional-rejected + () + (let ((< LaTeX-optop) + (> LaTeX-optcl)) + (TeX-parse-argument t (if (equal (length (car args)) 1) + (aref (car args) 0) + (append (car args) nil))))) + (let ((< TeX-grop) + (> TeX-grcl)) + (setq last-optional-rejected nil) + (TeX-parse-argument nil (car args)))) + (setq args (cdr args))))) + +(defun TeX-parse-argument (optional arg) + "Depending on OPTIONAL, insert TeX macro argument ARG in curly braces. +If OPTIONAL is set, only insert if there is anything to insert, and +then use scare brackets. + +See TeX-parse-macro for details." + + (cond ((stringp arg) + (TeX-arg-string optional arg)) + ((numberp arg) + (if (< arg 1) + () + (TeX-parse-argument optional t) + (while (> arg 1) + (TeX-parse-argument optional nil) + (setq arg (- arg 1))))) + ((null arg) + (insert < >)) + ((eq arg t) + (insert < ) + (set-marker exit-mark (point)) + (insert >)) + ((symbolp arg) + (funcall arg optional)) + ((listp arg) + (let ((head (car arg)) + (tail (cdr arg))) + (cond ((stringp head) + (apply 'TeX-arg-string optional arg)) + ((symbolp head) + (apply head optional tail)) + (t (error "Unknown list argument type %s" + (prin1-to-string head)))))) + (t (error "Unknown argument type %s" (prin1-to-string arg))))) + +(defun TeX-argument-insert (name optional &optional prefix) + "Insert NAME surrounded by curly braces. + +If OPTIONAL, only insert it if not empty, and then use scuare brackets." + (if (and optional (string-equal name "")) + (setq last-optional-rejected t) + (insert <) + (if prefix + (insert prefix)) + (if (and (string-equal name "") + (null (marker-position exit-mark))) + (set-marker exit-mark (point)) + (insert name)) + (insert >))) + +(defun TeX-argument-prompt (optional prompt default &optional complete) + "Return a argument prompt. + +If OPTIONAL is not nil then the prompt will start with ``(Optional) ''. + +PROMPT will be used if not nil, otherwise use DEFAULT. + +Unless optional argument COMPLETE is non-nil, ``: '' will be appended." + (concat (if optional "(Optional) " "") + (if prompt prompt default) + (if complete "" ": "))) + +;;; The Mode + +(defvar TeX-format-list + '(("AMSTEX" ams-tex-mode + "\\\\document\\b") + ("LATEX" latex-mode + "\\\\\\(begin\\|section\\|chapter\\|documentstyle\\|documentclass\\)\\b") + ("TEX" plain-tex-mode ".")) + "*List of format packages to consider when choosing a TeX mode. + +A list with a entry for each format package available at the site. + +Each entry is a list with three elements. + +1. The name of the format package. +2. The name of the major mode. +3. A regexp typically matched in the beginning of the file. + +When entering tex-mode, each regexp is tried in turn in order to find +when major mode to enter.") + +(defvar TeX-default-mode 'latex-mode + "*Mode to enter for a new file when it can't be determined whether +the file is plain TeX or LaTeX or what.") + +(defvar TeX-force-default-mode nil + "*If set to nil, try to infer the mode of the file from its content.") + +;;; Do not ;;;###autoload because of conflict with standard tex-mode.el. +(defun tex-mode () + "Major mode for editing files of input for TeX or LaTeX. +Tries to guess whether this file is for plain TeX or LaTeX. + +The algorithm is as follows: + + 1) if the file is empty or TeX-force-default-mode is not set to nil, + TeX-default-mode is chosen + 2) If \\documentstyle or \\begin{, \\section{, \\part{ or \\chapter{ is + found, latex-mode is selected. + 3) Otherwise, use plain-tex-mode " + (interactive) + + (funcall (if (or (equal (buffer-size) 0) + TeX-force-default-mode) + TeX-default-mode + (save-excursion + (goto-char (point-min)) + (let ((comment-start-skip ;Used by TeX-in-comment + (concat + "\\(\\(^\\|[^\\]\\)\\(" + (regexp-quote TeX-esc) + (regexp-quote TeX-esc) + "\\)*\\)\\(%+ *\\)")) + (entry TeX-format-list) + answer) + (while (and entry (not answer)) + (if (re-search-forward (nth 2 (car entry)) + 10000 t) + (if (not (TeX-in-comment)) + (setq answer (nth 1 (car entry)))) + (setq entry (cdr entry)))) + (if answer + answer + TeX-default-mode)))))) + +;;; Do not ;;;###autoload because of conflict with standard tex-mode.el. +(defun plain-tex-mode () + "Major mode for editing files of input for plain TeX. +See info under AUC TeX for documentation. + +Special commands: +\\{TeX-mode-map} + +Entering plain-tex-mode calls the value of text-mode-hook, +then the value of TeX-mode-hook, and then the value +of plain-TeX-mode-hook." + (interactive) + (plain-TeX-common-initialization) + (setq mode-name "TeX") + (setq major-mode 'plain-tex-mode) + (setq TeX-command-default "TeX") + (run-hooks 'text-mode-hook 'TeX-mode-hook 'plain-TeX-mode-hook)) + +;;;###autoload +(defun ams-tex-mode () + "Major mode for editing files of input for AmS TeX. +See info under AUC TeX for documentation. + +Special commands: +\\{TeX-mode-map} + +Entering AmS-tex-mode calls the value of text-mode-hook, +then the value of TeX-mode-hook, and then the value +of AmS-TeX-mode-hook." + (interactive) + (plain-TeX-common-initialization) + (setq mode-name "AmS TeX") + (setq major-mode 'ams-tex-mode) + (setq TeX-command-default "AmSTeX") + (run-hooks 'text-mode-hook 'TeX-mode-hook 'AmS-TeX-mode-hook)) + +(defun VirTeX-common-initialization () + ;; Initialize + (kill-all-local-variables) + (setq local-abbrev-table text-mode-abbrev-table) + (setq indent-tabs-mode nil) + + ;; Ispell support + (make-local-variable 'ispell-parser) + (setq ispell-parser 'tex) + (make-local-variable 'ispell-tex-p) + (setq ispell-tex-p t) + + ;; Redefine some standard varaibles + (make-local-variable 'paragraph-start) + (make-local-variable 'paragraph-separate) + (make-local-variable 'comment-start) + (setq comment-start "%") + (make-local-variable 'comment-start-skip) + (setq comment-start-skip + (concat + "\\(\\(^\\|[^\\]\\)\\(" + (regexp-quote TeX-esc) + (regexp-quote TeX-esc) + "\\)*\\)\\(%+ *\\)")) + (make-local-variable 'comment-indent-hook) + (setq comment-indent-hook 'TeX-comment-indent) + (make-local-variable 'comment-multi-line) + (setq comment-multi-line nil) + (make-local-variable 'compile-command) + (if (boundp 'compile-command) + () + (setq compile-command "make")) + (make-local-variable 'words-include-escapes) + (setq words-include-escapes nil) + + ;; Make TAB stand out + ;; (make-local-variable 'buffer-display-table) + ;; (setq buffer-display-table (if standard-display-table + ;; (copy-sequence standard-display-table) + ;; (make-display-table))) + ;; (aset buffer-display-table ?\t (apply 'vector (append "<TAB>" nil))) + + ;; Symbol completion. + (make-local-variable 'TeX-complete-list) + (setq TeX-complete-list + (list (list "\\\\\\([a-zA-Z]*\\)" + 1 'TeX-symbol-list (if TeX-insert-braces "{}")) + (list "" TeX-complete-word))) + + ;; We want this to be early in the list, so we do not add it before + ;; we enter TeX mode the first time. + (if (boundp 'local-write-file-hooks) + (add-hook 'local-write-file-hooks 'TeX-safe-auto-write) + (add-hook 'write-file-hooks 'TeX-safe-auto-write)) + (make-local-variable 'TeX-auto-update) + (setq TeX-auto-update t)) + +(defun plain-TeX-common-initialization () + ;; Common initialization for plain TeX like modes. + (VirTeX-common-initialization) + (use-local-map plain-TeX-mode-map) + (easy-menu-add TeX-mode-menu plain-TeX-mode-map) + (easy-menu-add plain-TeX-mode-menu plain-TeX-mode-map) + (set-syntax-table TeX-mode-syntax-table) + (setq paragraph-start + (concat + "\\(^[ \t]*$" + "\\|" (regexp-quote TeX-esc) "par\\|" + "^[ \t]*" + (regexp-quote TeX-esc) + "\\(" + "begin\\|end\\|part\\|chapter\\|" + "section\\|subsection\\|subsubsection\\|" + "paragraph\\|include\\|includeonly\\|" + "tableofcontents\\|appendix\\|label\\|caption\\|" + "\\[\\|\\]" ; display math delimitors + "\\)" + "\\|" + "^[ \t]*\\$\\$" ; display math delimitor + "\\)" )) + (setq paragraph-separate + (concat + "\\(" + (regexp-quote TeX-esc) + "par\\|" + "^[ \t]*$\\|" + "^[ \t]*" + (regexp-quote TeX-esc) + "\\(" + "begin\\|end\\|label\\|caption\\|part\\|chapter\\|" + "section\\|subsection\\|subsubsection\\|" + "paragraph\\|include\\|includeonly\\|" + "tableofcontents\\|appendix\\|" (regexp-quote TeX-esc) + "\\)" + "\\)")) + (setq TeX-header-end (regexp-quote "%**end of header")) + (setq TeX-trailer-start (regexp-quote (concat TeX-esc "bye"))) + (TeX-run-style-hooks "TEX")) + +;;; Hilighting + +(if (boundp 'hilit-patterns-alist) + (let ((latex-patterns (cdr-safe (assq 'latex-mode hilit-patterns-alist))) + (plain-tex-patterns (cdr-safe (assq 'plain-tex-mode + hilit-patterns-alist)))) + (if (and latex-patterns plain-tex-patterns) + (setq hilit-patterns-alist + (append (list (cons 'ams-tex-mode plain-tex-patterns)) + hilit-patterns-alist))))) + +;;; Parsing + +(defvar TeX-auto-parser '((styles TeX-auto-file TeX-run-style-hooks))) +;; Alist of parsed information. +;; Each entry is a list with the following elements: +;; +;; 0. Name of information type. +;; 1. Name of temporary variable used when parsing. +;; 2. Name of function to add information to add to #3. +;; 3. Name of variable holding buffer local information. +;; 4. Name of variable indicating that #3 has changed. + + +(defconst TeX-auto-parser-temporary 1) +(defconst TeX-auto-parser-add 2) +(defconst TeX-auto-parser-local 3) +(defconst TeX-auto-parser-change 4) + +(defun TeX-auto-add-type (name prefix &optional plural) + "Add information about name to the parser using PREFIX. + +Optional third argument PLURAL is the plural form of TYPE. +By default just add a `s'. + +This function create a set of variables and functions to maintain a +separate type of information in the parser." + (let* ((names (or plural (concat name "s"))) + (tmp (intern (concat prefix "-auto-" name))) + (add (intern (concat prefix "-add-" names))) + (local (intern (concat prefix "-" name "-list"))) + (change (intern (concat prefix "-" name "-changed")))) + (setq TeX-auto-parser + (cons (list name tmp add local change) TeX-auto-parser)) + (set local nil) + (make-variable-buffer-local local) + (set change nil) + (make-variable-buffer-local change) + (fset add (list 'lambda '(&rest entries) + (concat "Add information about " (upcase name) + " to the current buffer.") + (list 'TeX-auto-add-information name 'entries))) + (fset local (list 'lambda nil + (concat "List of " names + " active in the current buffer.") + (list 'TeX-auto-list-information name))) + (add-hook 'TeX-remove-style-hook + (list 'lambda nil (list 'setq (symbol-name local) nil))))) + +(defun TeX-auto-add-information (name entries) + ;; For NAME in `TeX-auto-parser' add ENTRIES. + (let* ((entry (assoc name TeX-auto-parser)) + (change (nth TeX-auto-parser-change entry)) + (change-value (symbol-value change)) + (local (nth TeX-auto-parser-local entry)) + (local-value (symbol-value local))) + (if change-value + (set local (cons entries local-value)) + (set change t) + (set local (list entries local-value))))) + +(defun TeX-auto-list-information (name) + ;; Return information in `TeX-auto-parser' about NAME. + (TeX-update-style) + (let* ((entry (assoc name TeX-auto-parser)) + (change (nth TeX-auto-parser-change entry)) + (change-value (symbol-value change)) + (local (nth TeX-auto-parser-local entry))) + (if (not change-value) + () + (set change nil) + ;; Sort it + (message "Sorting " name "...") + (set local + (sort (mapcar 'TeX-listify (apply 'append (symbol-value local))) + 'TeX-car-string-lessp)) + ;; Make it unique + (message "Removing duplicates...") + (let ((entry (symbol-value local))) + (while (and entry (cdr entry)) + (let ((this (car entry)) + (next (car (cdr entry)))) + (if (not (string-equal (car this) (car next))) + (setq entry (cdr entry)) + ;; We have two equal symbols. Use the one with + ;; most arguments. + (if (> (length next) (length this)) + (setcdr this (cdr next))) + (setcdr entry (cdr (cdr entry))))))) + (message "Removing duplicates... done")) + (symbol-value local))) + +(TeX-auto-add-type "symbol" "TeX") + +(defvar TeX-auto-apply-hook nil + "Hook run when a buffer is parsed and the information is applied.") + +(defun TeX-auto-apply () + ;; Parse and apply TeX information in the current buffer. + (TeX-auto-parse) + (run-hooks 'TeX-auto-apply-hook) + (mapcar 'TeX-auto-apply-entry TeX-auto-parser)) + +(defun TeX-auto-apply-entry (entry) + ;; Apply the information in an entry in `TeX-auto-parser'. + (let ((value (symbol-value (nth TeX-auto-parser-temporary entry))) + (add (nth TeX-auto-parser-add entry))) + (if value (apply add value)))) + +(defun TeX-safe-auto-write () + ;; Call TeX-auto-write safely + (condition-case name + (and (boundp 'TeX-auto-update) + TeX-auto-update + (TeX-auto-write)) + (error nil)) + ;; Continue with the other write file hooks. + nil) + +(defvar TeX-auto-save nil + "*Automatically save style information when saving the buffer.") + +(defvar TeX-auto-untabify t + "*Automatically untabify when saving the buffer.") + +(defun TeX-auto-write () + ;; Save all relevant TeX information from the current buffer. + (if TeX-auto-untabify + (untabify (point-min) (point-max))) + (if (and TeX-auto-save TeX-auto-local) + (let* ((file (concat (TeX-master-directory) + TeX-auto-local + (if (string-match "/$" TeX-auto-local) "" "/") + (TeX-strip-extension nil TeX-all-extensions t) + ".el")) + (dir (file-name-directory file))) + ;; Create auto directory if possible. + (if (not (file-exists-p dir)) + (condition-case name + (make-directory (substring dir 0 -1)) + (error nil))) + (if (file-writable-p file) + (save-excursion + (TeX-update-style) + (TeX-auto-store file)) + (message "Can't write style information."))))) + +(defvar TeX-macro-default (car-safe TeX-macro-private) + "*Default directory to search for TeX macros.") + +(defvar TeX-auto-default (car-safe TeX-auto-private) + "*Default directory to place automatically generated TeX information.") + +;;;###autoload +(defun TeX-auto-generate (tex auto) + "Generate style file for TEX and store it in AUTO. +If TEX is a directory, generate style files for all files in the directory." + (interactive (list (setq TeX-macro-default + (expand-file-name (read-file-name + "TeX file or directory: " + TeX-macro-default + TeX-macro-default 'confirm))) + (setq TeX-auto-default + (expand-file-name (read-file-name + "AUTO lisp directory: " + TeX-auto-default + TeX-auto-default 'confirm))))) + (cond ((not (file-readable-p tex))) + ((string-match TeX-ignore-file tex)) + ((file-directory-p tex) + (let ((files (directory-files tex)) + (default-directory (concat (if (TeX-directory-absolute-p tex) + "" + default-directory) + (if (string-match "/$" tex) + tex + (concat tex "/"))))) + (mapcar (function (lambda (file) + (if (or TeX-file-recurse + (not (file-directory-p file))) + (TeX-auto-generate file auto)))) + files))) + ((TeX-match-extension tex (append TeX-file-extensions + BibTeX-file-extensions)) + (save-excursion + (set-buffer (find-file-noselect tex)) + (message "Parsing %s..." tex) + (TeX-auto-store (concat auto + (if (string-match "/$" auto) "" "/") + (TeX-strip-extension tex + TeX-all-extensions + t) + ".el")) + (kill-buffer (current-buffer)) + (message "Parsing %s... done" tex))))) + +;;;###autoload +(defun TeX-auto-generate-global () + "Create global auto directory for global TeX macro definitions." + (interactive) + (make-directory (if (string-match "/$" TeX-auto-global) + (substring TeX-auto-global 0 -1) + TeX-auto-global)) + (mapcar (function (lambda (macro) (TeX-auto-generate macro TeX-auto-global))) + TeX-macro-global) + (byte-recompile-directory TeX-auto-global 0)) + +(defun TeX-auto-store (file) + ;; Extract information for auc tex from current buffer and store it in FILE. + (TeX-auto-parse) + + (if (member nil (mapcar 'TeX-auto-entry-clear-p TeX-auto-parser)) + (let ((style (TeX-strip-extension nil TeX-all-extensions t))) + (TeX-unload-style style) + (save-excursion + (set-buffer (generate-new-buffer file)) + (erase-buffer) + (insert "(TeX-add-style-hook \"" style "\"\n" + " (function\n" + " (lambda ()") + (mapcar 'TeX-auto-insert TeX-auto-parser) + (insert ")))\n\n") + (write-region (point-min) (point-max) file nil 'silent) + (kill-buffer (current-buffer)))) + (if (file-exists-p (concat file "c")) + (delete-file (concat file "c"))) + (if (file-exists-p file) + (delete-file file)))) + +(defun TeX-auto-entry-clear-p (entry) + ;; Check if the temporary for `TeX-auto-parser' entry ENTRY is clear. + (null (symbol-value (nth TeX-auto-parser-temporary entry)))) + +(defun TeX-auto-insert (entry) + ;; Insert code to initialize ENTRY from `TeX-auto-parser'. + (let ((name (symbol-name (nth TeX-auto-parser-add entry))) + (list (symbol-value (nth TeX-auto-parser-temporary entry)))) + (if (null list) + () + (insert "\n (" name) + (while list + (insert "\n ") + (if (stringp (car list)) + (insert (prin1-to-string (car list))) + (insert "'" (prin1-to-string (car list)))) + (setq list (cdr list))) + (insert ")")))) + +(defvar TeX-auto-ignore + '("csname" "filedate" "fileversion" "docdate" "next" "labelitemi" + "labelitemii" "labelitemiii" "labelitemiv" "labelitemv" + "labelenumi" "labelenumii" "labelenumiii" "labelenumiv" + "labelenumv" "theenumi" "theenumii" "theenumiii" "theenumiv" + "theenumv" "document" "par" "do" "expandafter") + "List of symbols to ignore when scanning a TeX style file.") + +(defun TeX-auto-add-regexp (regexp) + "Add REGEXP to TeX-auto-regexp-list if not already a member." + (if (symbolp TeX-auto-regexp-list) + (setq TeX-auto-regexp-list (symbol-value TeX-auto-regexp-list))) + (or (memq regexp TeX-auto-regexp-list) + (setq TeX-auto-regexp-list (cons regexp TeX-auto-regexp-list)))) + +(defvar TeX-auto-empty-regexp-list + '(("<IMPOSSIBLE>\\(\\'\\`\\)" 1 ignore)) + "List of regular expressions guaranteed to match nothing.") + +(defvar plain-TeX-auto-regexp-list + '(("\\\\def\\\\\\([a-zA-Z]+\\)[^a-zA-Z@]" 1 TeX-auto-symbol-check) + ("\\\\let\\\\\\([a-zA-Z]+\\)[^a-zA-Z@]" 1 TeX-auto-symbol-check) + ("\\\\font\\\\\\([a-zA-Z]+\\)[^a-zA-Z@]" 1 TeX-auto-symbol) + ("\\\\chardef\\\\\\([a-zA-Z]+\\)[^a-zA-Z@]" 1 TeX-auto-symbol) + ("\\\\new\\(count|dimen|muskip|skip\\)\\\\\\([a-z]+\\)[^a-zA-Z@]" + 2 TeX-auto-symbol) + ("\\\\newfont{?\\\\\\([a-zA-Z]+\\)}?" 1 TeX-auto-symbol) + ("\\\\typein\\[\\\\\\([a-zA-Z]+\\)\\]" 1 TeX-auto-symbol) + ("\\\\input +\\(\\.*[^#%\\\\\\.\n\r]+\\)\\(\\.[^#%\\\\\\.\n\r]+\\)?" + 1 TeX-auto-file) + ("\\\\mathchardef\\\\\\([a-zA-Z]+\\)[^a-zA-Z@]" 1 TeX-auto-symbol)) + "List of regular expression matching common LaTeX macro definitions.") + +(defvar TeX-auto-full-regexp-list plain-TeX-auto-regexp-list + "Full list of regular expression matching TeX macro definitions.") + +(defvar TeX-auto-prepare-hook nil + "List of hooks to be called before parsing a TeX file.") + +(defvar TeX-auto-cleanup-hook nil + "List of hooks to be called after parsing a TeX file.") + +(defvar TeX-auto-parse-length 999999 + "*Maximal length of TeX file that will be parsed.") + (make-variable-buffer-local 'TeX-auto-parse-length) + +(defun TeX-auto-parse () + "Parse TeX information in current buffer. + +Call the functions in TeX-auto-prepare-hook before parsing, and the +functions in TeX-auto-cleanup-hook after parsing." + + (let ((case-fold-search nil) + (regexp-list (if (symbolp TeX-auto-regexp-list) + (symbol-value TeX-auto-regexp-list) + TeX-auto-regexp-list))) + + (mapcar 'TeX-auto-clear-entry TeX-auto-parser) + (run-hooks 'TeX-auto-prepare-hook) + + ;; Parse + (save-excursion + (goto-char (min (point-max) TeX-auto-parse-length)) + ;; Extract the information. + (let ((regexp (concat "\\(" + (mapconcat 'car regexp-list "\\)\\|\\(") + "\\)"))) + (while (re-search-backward regexp nil t) + (if (TeX-in-comment) + () + (let* ((entry (TeX-member nil regexp-list + (function (lambda (a b) + (looking-at (nth 0 b)))))) + (symbol (nth 2 entry)) + (match (nth 1 entry))) + (if (fboundp symbol) + (funcall symbol match) + (set symbol (cons (if (listp match) + (mapcar 'TeX-match-buffer match) + (TeX-match-buffer match)) + (symbol-value symbol))))))))) + + ;; Cleanup ignored symbols. + + ;; NOTE: This is O(N M) where it could be O(N log N + M log M) if we + ;; sorted the lists first. + (while (member (car TeX-auto-symbol) TeX-auto-ignore) + (setq TeX-auto-symbol (cdr TeX-auto-symbol))) + (let ((list TeX-auto-symbol)) + (while (and list (cdr list)) + (if (member (car (cdr list)) TeX-auto-ignore) + (setcdr list (cdr (cdr list))) + (setq list (cdr list))))) + + (run-hooks 'TeX-auto-cleanup-hook))) + +(defun TeX-auto-clear-entry (entry) + ;; Set the temporary variable in ENTRY to nil. + (set (nth TeX-auto-parser-temporary entry) nil)) + +(defvar LaTeX-auto-end-symbol nil) + +(defun TeX-auto-symbol-check (match) + "Add MATCH to TeX-auto-symbols. +Check for potential LaTeX environments." + (let ((symbol (if (listp match) + (mapcar 'TeX-match-buffer match) + (TeX-match-buffer match)))) + (if (and (stringp symbol) + (string-match "^end\\(.+\\)$" symbol)) + (setq LaTeX-auto-end-symbol + (cons (substring symbol (match-beginning 1) (match-end 1)) + LaTeX-auto-end-symbol)) + (setq TeX-auto-symbol (cons symbol TeX-auto-symbol))))) + +;;; Utilities +;; +;; Some of these functions has little to do with TeX, but nonetheless we +;; should use the "TeX-" prefix to avoid name clashes. + +(defvar TeX-auto-regexp-list 'TeX-auto-full-regexp-list + "*List of regular expresions used for parsing the current file.") + (make-variable-buffer-local 'TeX-auto-regexp-list) + +(defvar TeX-file-extensions '("tex" "sty" "cls" "ltx" "texi" "texinfo") + "*File extensions used by manually generated TeX files.") + +(defvar TeX-all-extensions '("[^.\n]+") + "All possible file extensions.") + +(defvar TeX-default-extension "tex" + "*Default extension for TeX files.") + + (make-variable-buffer-local 'TeX-default-extension) + +(defvar BibTeX-file-extensions '("bib") + "Valid file extensions for BibTeX files.") + +(defvar BibTeX-style-extensions '("bst") + "Valid file extensions for BibTeX styles.") + +(defvar TeX-ignore-file "\\(^\\|/\\)\\(\\.\\|\\.\\.\\|RCS\\|SCCS\\|CVS\\)$" + "*Regular expression matching file names to ignore. + +These files or directories will not be considered when searching for +TeX files in a directory.") + +(defvar TeX-file-recurse t + "*If not nil, search TeX directories recursivly.") + +(defun TeX-match-extension (file &optional extensions) + "Return non-nil if FILE has an one of EXTENSIONS. + +If EXTENSIONS is not specified or nil, the value of +TeX-file-extensions is used instead." + + (if (null extensions) + (setq extensions TeX-file-extensions)) + + (let ((regexp (concat "\\.\\(" + (mapconcat 'identity extensions "\\|") + "\\)$"))) + (string-match regexp file))) + +(defun TeX-strip-extension (&optional string extensions nodir nostrip) + "Return STRING without any trailing extension in EXTENSIONS. +If NODIR is `t', also remove directory part of STRING. +If NODIR is `path', remove directory part of STRING if it is equal to +the current directory, TeX-macro-private or TeX-macro-global. +If NOSTRIP is set, do not remove extension after all. +STRING defaults to the name of the current buffer. +EXTENSIONS defaults to TeX-file-extensions." + + (if (null string) + (setq string (or (buffer-file-name) "<none>"))) + + (if (null extensions) + (setq extensions TeX-file-extensions)) + + (let* ((strip (if (and (not nostrip) + (TeX-match-extension string extensions)) + (substring string 0 (match-beginning 0)) + string)) + (dir (file-name-directory (expand-file-name strip)))) + (if (or (eq nodir t) + (string-equal dir (expand-file-name "./")) + (member dir TeX-macro-global) + (member dir TeX-macro-private)) + (file-name-nondirectory strip) + strip))) + +(defun TeX-search-files (&optional directories extensions nodir strip) + "Return a list of all reachable files in DIRECTORIES ending with EXTENSIONS. +If optional argument NODIR is set, remove directory part. +If optional argument STRIP is set, remove file extension. +If optional argument DIRECTORIES is set, search in those directories. +Otherwise, search in all TeX macro directories. +If optional argument EXTENSIONS is not set, use TeX-file-extensions" + + (if (null extensions) + (setq extensions TeX-file-extensions)) + + (if (null directories) + (setq directories + (cons "./" (append TeX-macro-private TeX-macro-global)))) + + (let (match) + + (while directories + (let* ((directory (car directories)) + (content (and directory + (file-readable-p directory) + (file-directory-p directory) + (directory-files directory)))) + + (setq directories (cdr directories)) + + (while content + (let ((file (concat directory (car content)))) + + (setq content (cdr content)) + (cond ((string-match TeX-ignore-file file)) + ((not (file-readable-p file))) + ((file-directory-p file) + (if TeX-file-recurse + (setq directories + (cons (concat file "/") directories)))) + ((TeX-match-extension file extensions) + (setq match (cons (TeX-strip-extension file + extensions + nodir + (not strip)) + match)))))))) + + match)) + +(defun TeX-car-string-lessp (a b) + (string-lessp (car a) (car b))) + +(defun TeX-listify (a) + (if (listp a) a (list a))) + +(defun TeX-member (elt list how) + "Returns the member ELT in LIST. Comparison done with HOW. + +Return nil if ELT is not a member of LIST." + (while (and list (not (funcall how elt (car list)))) + (setq list (cdr list))) + (car-safe list)) + +(defun TeX-assoc (elem list) + "Like assoc, except case incentive." + (let ((case-fold-search t)) + (TeX-member elem list + (function (lambda (a b) + (string-match (concat "^" (regexp-quote a) "$") + (car b))))))) + +(defun TeX-match-buffer (n) + "Return the substring corresponding to the N'th match. +See match-data for details." + (if (match-beginning n) + (let ((str (buffer-substring (match-beginning n) (match-end n)))) + (set-text-properties 0 (length str) nil str) + (copy-sequence str)) + "")) + +(defun TeX-function-p (arg) + "Return non-nil if ARG is callable as a function." + (or (and (fboundp 'byte-code-function-p) + (byte-code-function-p arg)) + (and (listp arg) + (eq (car arg) 'lambda)) + (and (symbolp arg) + (fboundp arg)))) + +(defun TeX-looking-at-backward (regexp &optional limit) + ;; Return non-nil if the text before point matches REGEXP. + ;; Optional second argument LIMIT gives a max number of characters + ;; to look backward for. + (let ((pos (point))) + (save-excursion + (and (re-search-backward regexp + (if limit (max (point-min) (- (point) limit))) + t) + (eq (match-end 0) pos))))) + +;;; Syntax Table + +(defvar TeX-mode-syntax-table (make-syntax-table) + "Syntax table used while in TeX mode.") + + (make-variable-buffer-local 'TeX-mode-syntax-table) + +(progn ; Define TeX-mode-syntax-table. + (modify-syntax-entry (string-to-char TeX-esc) + "\\" TeX-mode-syntax-table) + (modify-syntax-entry ?\f ">" TeX-mode-syntax-table) + (modify-syntax-entry ?\n ">" TeX-mode-syntax-table) + (modify-syntax-entry (string-to-char TeX-grop) + (concat "(" TeX-grcl) + TeX-mode-syntax-table) + (modify-syntax-entry (string-to-char TeX-grcl) + (concat ")" TeX-grop) + TeX-mode-syntax-table) + (modify-syntax-entry ?% "<" TeX-mode-syntax-table) + (modify-syntax-entry ?\" "." TeX-mode-syntax-table) + (modify-syntax-entry ?& "." TeX-mode-syntax-table) + (modify-syntax-entry ?_ "." TeX-mode-syntax-table) + (modify-syntax-entry ?@ "_" TeX-mode-syntax-table) + (modify-syntax-entry ?~ " " TeX-mode-syntax-table) + (modify-syntax-entry ?$ "$" TeX-mode-syntax-table) + (modify-syntax-entry ?' "w" TeX-mode-syntax-table)) + +;;; Menu Support + +(defvar TeX-command-current 'TeX-command-master) +;; Function used to run external command. + +(defun TeX-command-select-master () + (interactive) + (message "Next command will be on the master file") + (setq TeX-command-current 'TeX-command-master)) + +(defun TeX-command-select-buffer () + (interactive) + (message "Next command will be on the buffer") + (setq TeX-command-current 'TeX-command-buffer)) + +(defun TeX-command-select-region () + (interactive) + (message "Next command will be on the region") + (setq TeX-command-current 'TeX-command-region)) + +(defvar TeX-command-force nil) +;; If non-nil, TeX-command-query will return the value of this +;; variable instead of quering the user. + +(defun TeX-command-menu (name) + ;; Execute TeX-command-list NAME from a menu. + (let ((TeX-command-force name)) + (funcall TeX-command-current))) + +(defun TeX-command-menu-print (printer command name) + ;; Print on PRINTER using method COMMAND to run NAME. + (let ((TeX-printer-default printer) + (TeX-printer-list nil) + (TeX-print-command command)) + (TeX-command-menu name))) + +(defun TeX-command-menu-printer-entry (entry) + ;; Return TeX-printer-list ENTRY as a menu item. + (vector (nth 0 entry) + (list 'TeX-command-menu-print + (nth 0 entry) + (or (nth lookup entry) command) + name) + t)) + +;; Begin fix part 1 by Ulrik Dickow <dickow@nbi.dk> 16-Feb-1996, +;; to make queue command usable. Easy but ugly code duplication again. + +(defun TeX-command-menu-queue (printer command name) + ;; Show queue for PRINTER using method COMMAND to run NAME. + (let ((TeX-printer-default printer) + (TeX-printer-list nil) + (TeX-queue-command command)) + (TeX-command-menu name))) + +(defun TeX-command-menu-queue-entry (entry) + ;; Return TeX-printer-list ENTRY as a menu item. + (vector (nth 0 entry) + (list 'TeX-command-menu-queue + (nth 0 entry) + (or (nth lookup entry) command) + name) + t)) + +;; End fix part 1. + +(defun TeX-command-menu-entry (entry) + ;; Return TeX-command-list ENTRY as a menu item. + (let ((name (car entry))) + (cond ((and (string-equal name TeX-command-Print) + TeX-printer-list) + (let ((command TeX-print-command) + (lookup 1)) + (append (list TeX-command-Print) + (mapcar 'TeX-command-menu-printer-entry + TeX-printer-list)))) + ((and (string-equal name TeX-command-Queue) + TeX-printer-list) + (let ((command TeX-queue-command) + (lookup 2)) + (append (list TeX-command-Queue) + (mapcar 'TeX-command-menu-queue-entry ; dickow fix part 2. + TeX-printer-list)))) + (t + (vector name (list 'TeX-command-menu name) t))))) + +;;; Keymap + +(defvar TeX-electric-escape nil + "If this is non-nil when AUC TeX is loaded, the TeX escape +character ``\\'' will be bound to `TeX-electric-macro'.") + +(defvar TeX-mode-map nil + "Keymap for common TeX and LaTeX commands.") + +(if TeX-mode-map + () + (setq TeX-mode-map (make-sparse-keymap)) + + ;; Standard + ;; (define-key TeX-mode-map "\177" 'backward-delete-char-untabify) + (define-key TeX-mode-map "\C-c}" 'up-list) + (define-key TeX-mode-map "\C-c#" 'TeX-normal-mode) + (define-key TeX-mode-map "\C-c\C-n" 'TeX-normal-mode) + (define-key TeX-mode-map "\C-c?" 'describe-mode) + (define-key TeX-mode-map "\C-c\C-i" 'TeX-goto-info-page) + + ;; From tex.el + (define-key TeX-mode-map "\"" 'TeX-insert-quote) + (define-key TeX-mode-map "$" 'TeX-insert-dollar) + (define-key TeX-mode-map "." 'TeX-insert-punctuation) + (define-key TeX-mode-map "," 'TeX-insert-punctuation) + (define-key TeX-mode-map "\C-c{" 'TeX-insert-braces) + (define-key TeX-mode-map "\C-c\C-f" 'TeX-font) + (define-key TeX-mode-map "\C-c\C-m" 'TeX-insert-macro) + (if TeX-electric-escape + (define-key TeX-mode-map "\\" 'TeX-electric-macro)) + (define-key TeX-mode-map "\e\t" 'TeX-complete-symbol) ;*** Emacs 19 way + + (define-key TeX-mode-map "\C-c;" 'TeX-comment-region) + (define-key TeX-mode-map "\C-c%" 'TeX-comment-paragraph) + + (define-key TeX-mode-map "\C-c'" 'TeX-comment-paragraph) ;*** Old way + (define-key TeX-mode-map "\C-c:" 'TeX-un-comment-region) ;*** Old way + (define-key TeX-mode-map "\C-c\"" 'TeX-un-comment) ;*** Old way + + ;; From tex-buf.el + (define-key TeX-mode-map "\C-c\C-d" 'TeX-save-document) + (define-key TeX-mode-map "\C-c\C-r" 'TeX-command-region) + (define-key TeX-mode-map "\C-c\C-b" 'TeX-command-buffer) + (define-key TeX-mode-map "\C-c\C-c" 'TeX-command-master) + (define-key TeX-mode-map "\C-c\C-k" 'TeX-kill-job) + (define-key TeX-mode-map "\C-c\C-l" 'TeX-recenter-output-buffer) + (define-key TeX-mode-map "\C-c^" 'TeX-home-buffer) + (define-key TeX-mode-map "\C-c`" 'TeX-next-error) + (define-key TeX-mode-map "\C-c\C-w" 'TeX-toggle-debug-boxes)) + +(easy-menu-define TeX-mode-menu + TeX-mode-map + "Menu used in TeX mode." + (append '("Command") + '(("Command on" + [ "Master File" TeX-command-select-master + :keys "C-c C-c" :style radio + :selected (eq TeX-command-current 'TeX-command-master) ] + [ "Buffer" TeX-command-select-buffer + :keys "C-c C-b" :style radio + :selected (eq TeX-command-current 'TeX-command-buffer) ] + [ "Region" TeX-command-select-region + :keys "C-c C-r" :style radio + :selected (eq TeX-command-current 'TeX-command-region) ])) + (let ((file 'TeX-command-on-current)) + (mapcar 'TeX-command-menu-entry TeX-command-list)))) + +(defvar plain-TeX-mode-map (copy-keymap TeX-mode-map) + "Keymap used in plain TeX mode.") + +(easy-menu-define plain-TeX-mode-menu + plain-TeX-mode-map + "Menu used in plain TeX mode." + (list "TeX" + ["Macro..." TeX-insert-macro t] + ["Complete" TeX-complete-symbol t] + ["Save Document" TeX-save-document t] + ["Next Error" TeX-next-error t] + ["Kill Job" TeX-kill-job t] + ["Debug Bad Boxes" TeX-toggle-debug-boxes + :style toggle :selected TeX-debug-bad-boxes ] + ["Switch to Original File" TeX-home-buffer t] + ["Recenter Output Buffer" TeX-recenter-output-buffer t] + ;; ["Uncomment" TeX-un-comment t] + ["Uncomment Region" TeX-un-comment-region t] + ;; ["Comment Paragraph" TeX-comment-paragraph t] + ["Comment Region" TeX-comment-region t] + ["Switch to Master file" TeX-home-buffer t] + ["Documentation" TeX-goto-info-page t] + ["Submit bug report" TeX-submit-bug-report t] + ["Reset Buffer" TeX-normal-mode t] + ["Reset AUC TeX" (TeX-normal-mode t) :keys "C-u C-c C-n"])) + +;;; Comments + +(defun TeX-un-comment-region (start end level) + "Remove up to LEVEL comment characters from each line in the region." + (interactive "*r\np") + (comment-region start end (- level))) + +(defun TeX-un-comment (level) + "Delete up to LEVEL %'s from the beginning of each line in a comment." + (interactive "*p") + (save-excursion + ; Find first comment line + (re-search-backward (concat "^[^" comment-start "]") nil 'limit) + (let ((beg (point))) + (forward-line 1) + ; Find last comment line + (re-search-forward (concat "^[^" comment-start "]") nil 'limit) + ; Uncomment region + (comment-region beg (point) (- level))))) + +(fset 'TeX-comment-region 'comment-region) + +(defun TeX-comment-paragraph (level) + "Inserts LEVEL %'s at the beginning of every line in the current paragraph." + (interactive "*p") + (if (< level 0) + (TeX-un-comment (- level)) + (save-excursion + (mark-paragraph) + (comment-region (point) (mark) level)))) + +(defun TeX-in-comment () + ;; Return non-nil if point is in a comment. + (if (or (bolp) + (null comment-start-skip) + (eq (preceding-char) ?\r)) + nil + (save-excursion + (let ((pos (point))) + (re-search-backward "^\\|\r" nil t) + (or (looking-at comment-start-skip) + (re-search-forward comment-start-skip pos t)))))) + +;;; Indentation + +(defun TeX-brace-count-line () + "Count number of open/closed braces." + (save-excursion + (save-restriction + (let ((count 0)) + (narrow-to-region (point) + (save-excursion + (re-search-forward "[^\\\\]%\\|\n\\|\\'") + (backward-char) + (point))) + + (while (re-search-forward "\\({\\|}\\|\\\\.\\)" nil t) + (cond + ((string= "{" (TeX-match-buffer 1)) + (setq count (+ count TeX-brace-indent-level))) + ((string= "}" (TeX-match-buffer 1)) + (setq count (- count TeX-brace-indent-level))))) + count)))) + +(defvar TeX-brace-indent-level 2 + "*The level of indentation produced by a open brace.") + +(defun TeX-comment-indent () + (if (looking-at "%%%") + (current-column) + (skip-chars-backward " \t") + (max (if (bolp) 0 (1+ (current-column))) + comment-column))) + +;;; Fonts + +(defvar TeX-font-list '((?\C-b "{\\bf " "}") + (?\C-c "{\\sc " "}") + (?\C-e "{\\em " "\\/}") + (?\C-i "{\\it " "\\/}") + (?\C-r "{\\rm " "}") + (?\C-s "{\\sl " "\\/}") + (?\C-t "{\\tt " "}") + (?\C-d "" "" t)) + "*List of fonts used by TeX-font. + +Each entry is a list with three elements. The first element is the +key to active the font. The second element is the string to insert +before point, and the third element is the string to insert after +point. An optional fourth element means always replace if not nil.") + +(defvar TeX-font-replace-function 'TeX-font-replace + "Determines the function which is called when a font should be replaced.") + +(defun TeX-describe-font-entry (entry) + ;; A textual description of an ENTRY in TeX-font-list. + (concat (format "%8s\t" (key-description (char-to-string (nth 0 entry)))) + (if (nth 3 entry) + "-- delete font" + (format "%10s %s" (nth 1 entry) (nth 2 entry))))) + +(defun TeX-font (replace what) + "Insert template for font change command. +If REPLACE is not nil, replace current font. WHAT determines the font +to use, as specified by TeX-font-list." + (interactive "*P\nc") + (TeX-update-style) + (let* ((entry (assoc what TeX-font-list))) + (setq replace (or replace (nth 3 entry))) + (cond ((null entry) + (let ((help (concat "Font list:\n\n" + (mapconcat 'TeX-describe-font-entry + TeX-font-list "\n")))) + (with-output-to-temp-buffer "*Help*" + (set-buffer "*Help*") + (insert help)))) + (replace + (funcall TeX-font-replace-function (nth 1 entry) (nth 2 entry))) + ((TeX-active-mark) + (save-excursion + (cond ((> (mark) (point)) + (insert (nth 1 entry)) + (goto-char (mark)) + (insert (nth 2 entry))) + (t + (insert (nth 2 entry)) + (goto-char (mark)) + (insert (nth 1 entry)))))) + (t + (insert (nth 1 entry)) + (save-excursion + (insert (nth 2 entry))))))) +(defun TeX-font-replace (start end) + "Replace font specification around point with START and END." + (save-excursion + (while (not (looking-at "{\\\\[a-zA-Z]+ ")) + (up-list -1)) + (forward-sexp) + (save-excursion + (replace-match start t t)) + (if (save-excursion + (backward-char 3) + (if (looking-at (regexp-quote "\\/}")) + (progn + (delete-char 3) + nil) + t)) + (delete-backward-char 1)) + (insert end))) + +;;; Dollars +;; +;; Originally stolen from VorTeX. +;; Copyright (C) 1986, 1987, 1988 Pehong Chen (phc@renoir.berkeley.edu) + +(defvar TeX-dollar-sign ?$ + "*Character user to enter and leaver math mode in TeX.") + +(defconst TeX-dollar-string (char-to-string TeX-dollar-sign)) + +(defconst TeX-dollar-regexp + (concat "^" (regexp-quote TeX-dollar-string) "\\|[^" TeX-esc "]" + (regexp-quote TeX-dollar-string))) + +(defvar TeX-dollar-list nil) + (make-variable-buffer-local 'TeX-match-dollar-on) + +(defvar TeX-par-start nil) + (make-variable-buffer-local 'TeX-par-start) + +(defvar TeX-par-end nil) + (make-variable-buffer-local 'TeX-par-end) + +(defvar TeX-symbol-marker nil) + +(defvar TeX-symbol-marker-pos 0) + +(defun TeX-bouncing-point (m) + (save-excursion + (if (pos-visible-in-window-p) + (sit-for 1) + (let* ((pos1 (point)) + (pos2 (+ pos1 m)) + (sym (buffer-substring pos1 pos2)) + (msg1 (progn (beginning-of-line) (buffer-substring (point) pos1))) + (msg2 (progn (end-of-line) (buffer-substring pos2 (point))))) + (message "%s`%s'%s" msg1 sym msg2))))) + +(defun TeX-locate-delimiter (pos sym symlst) + (let ((marker nil) + (marker-pos 0) + (pair t) + (head nil)) + (catch 'loop + (while symlst + (setq marker (car symlst)) + (setq marker-pos (1- (marker-position marker))) + (if (and (/= pos marker-pos) (= (char-after marker-pos) sym)) + (if (> pos marker-pos) + (progn + (setq TeX-symbol-marker-pos marker-pos) + (setq TeX-symbol-marker marker) + (setq head (cons marker head)) + (setq pair (not pair))) + (if pair (setq TeX-symbol-marker nil)) + (throw 'loop (append (reverse head) + (cons (set-marker (make-marker) (1+ pos)) + symlst))))) + (setq symlst (cdr symlst))) + (if pair (setq TeX-symbol-marker nil)) + (reverse (cons (set-marker (make-marker) (1+ pos)) head))))) + +(defun TeX-dollar-verify () + ;; Verify if the current paragraph is the same as last. + ;; If so, do nothing, otherwise reset TeX-par-start and TeX-par-end and + ;; reconstruct the symbol-list. + (let ((start (save-excursion + (if (re-search-backward paragraph-separate nil t) + (point) + 1))) + (end (save-excursion + (if (re-search-forward paragraph-separate nil t) + (1+ (point)) + (1+ (point-max))))) + (init nil)) + (if (null TeX-par-start) + (setq TeX-par-start (set-marker (make-marker) 1))) + (if (/= (marker-position TeX-par-start) start) + (progn + (set-marker TeX-par-start start) + (setq init t))) + (if (null TeX-par-end) + (setq TeX-par-end (set-marker (make-marker) 1))) + (if (/= (marker-position TeX-par-end) end) + (progn + (set-marker TeX-par-end end) + (setq init t))) + (if init + (save-excursion + (setq TeX-dollar-list nil) + (goto-char start) + (while (re-search-forward TeX-dollar-regexp end t) + (setq TeX-dollar-list + (append TeX-dollar-list + (list (set-marker (make-marker) + (if (= (following-char) + TeX-dollar-sign) + (progn + (forward-char 1) + (point)) + (point))))))))))) + +(defun TeX-insert-dollar (&optional arg) + "Insert dollar sign. + +Show matching dollar sign if this dollar sign end the TeX math mode. +Ensure double dollar signs match up correctly by inserting extra +dollar signs when needed. + +With optional ARG, insert that many dollar signs." + (interactive "P") + (if arg + (let ((count (prefix-numeric-value arg))) + (if (listp arg) + (self-insert-command 1) ;C-u always inserts just one + (self-insert-command count))) + (let ((pc (preceding-char)) + (pos (point)) + (pt (point)) + (single t)) + (TeX-dollar-verify) + (if (= pc (string-to-char TeX-esc)) + (insert TeX-dollar-sign) + (if (and (= pc TeX-dollar-sign) + (/= (char-after (- (point) 2)) (string-to-char TeX-esc))) + (progn + (setq single nil) + (if (and (> pos 2) (= (char-after (- pos 2)) TeX-dollar-sign)) + (setq pt (1- pos)) ; Doesn't echo 3rd $, if $$ already + (backward-char 1) + (insert TeX-dollar-sign) + (goto-char (1+ pos)))) + (insert TeX-dollar-sign)) + (setq TeX-dollar-list + (TeX-locate-delimiter pt TeX-dollar-sign TeX-dollar-list)) + (if TeX-symbol-marker + (save-excursion + (goto-char TeX-symbol-marker-pos) + (if (and (= (preceding-char) TeX-dollar-sign) + (/= (char-after (- (point) 2)) TeX-dollar-sign)) + (progn + (backward-char 1) + (if single + (save-excursion + (goto-char pos) + (insert TeX-dollar-sign)))) ; $$foo$`$' + (if (not single) + (progn + (insert TeX-dollar-sign) ; `$'$foo$$ + (backward-char 1)))) + (TeX-bouncing-point (if single 1 2)))))))) + +;;; Simple Commands + +(defun TeX-normal-mode (arg) + "Remove all information about this buffer, and apply the style hooks again. +Save buffer first including style information. +With optional argument, also reload the style hooks." + (interactive "*P") + (if arg + (setq TeX-style-hook-list nil + BibTeX-global-style-files nil + BibTeX-global-files nil + TeX-global-input-files nil)) + (let ((TeX-auto-save t)) + (if (buffer-modified-p) + (save-buffer) + (TeX-auto-write))) + (normal-mode) + (TeX-update-style)) + +(defvar TeX-open-quote "``" + "*String inserted by typing \\[TeX-insert-quote] to open a quotation.") + +(defvar TeX-close-quote "''" + "*String inserted by typing \\[TeX-insert-quote] to close a quotation.") + +(defvar TeX-quote-after-quote nil + "*Behaviour of \\[TeX-insert-quote]. Nil means standard behaviour; +when non-nil, opening and closing quotes are inserted only after \".") + +;;;###autoload +(defun TeX-insert-quote (arg) + "Insert the appropriate quote marks for TeX. +Inserts the value of `TeX-open-quote' (normally ``) or `TeX-close-quote' +\(normally '') depending on the context. If `TeX-quote-after-quote' +is non-nil, this insertion works only after \". +With prefix argument, always inserts \" characters." + (interactive "*P") + (if arg + (self-insert-command (prefix-numeric-value arg)) + (TeX-update-style) + (if TeX-quote-after-quote + (insert (cond ((bobp) + ?\") + ((not (= (preceding-char) ?\")) + ?\") + ((save-excursion + (forward-char -1) + (bobp)) + (delete-backward-char 1) + TeX-open-quote) + ((save-excursion + (forward-char -2) ;;; at -1 there is double quote + (looking-at "[ \t\n]\\|\\s(")) + (delete-backward-char 1) + TeX-open-quote) + (t + (delete-backward-char 1) + TeX-close-quote))) + (insert (cond ((bobp) + TeX-open-quote) + ((= (preceding-char) (string-to-char TeX-esc)) + ?\") + ((= (preceding-char) ?\") + ?\") + ((save-excursion + (forward-char (- (length TeX-open-quote))) + (looking-at (regexp-quote TeX-open-quote))) + (delete-backward-char (length TeX-open-quote)) + ?\") + ((save-excursion + (forward-char (- (length TeX-close-quote))) + (looking-at (regexp-quote TeX-close-quote))) + (delete-backward-char (length TeX-close-quote)) + ?\") + ((save-excursion + (forward-char -1) + (looking-at "[ \t\n]\\|\\s(")) + TeX-open-quote) + (t + TeX-close-quote)))))) + +;; For the sake of BibTeX... +;;; Do not ;;;###autoload because of conflict with standard tex-mode.el. +(fset 'tex-insert-quote 'TeX-insert-quote) + +(defun TeX-insert-punctuation () + "Insert point or comma, cleaning up preceding space." + (interactive) + (if (TeX-looking-at-backward "\\\\/\\(}+\\)" 50) + (replace-match "\\1" t)) + (call-interactively 'self-insert-command)) + +(defun TeX-insert-braces (arg) + "Make a pair of braces around next ARG sexps and leave point inside. +No argument is equivalent to zero: just insert braces and leave point +between." + (interactive "P") + (insert TeX-grop) + (save-excursion + (if arg (forward-sexp (prefix-numeric-value arg))) + (insert TeX-grcl))) + +(defun TeX-goto-info-page () + "Read documentation for AUC TeX in the info system." + (interactive) + (require 'info) + (Info-goto-node "(auctex)")) + +;;;###autoload +(defun TeX-submit-bug-report () + "Submit via mail a bug report on AUC TeX" + (interactive) + (require 'reporter) + (reporter-submit-bug-report + "auc-tex@iesd.auc.dk" + (concat "AUC TeX " AUC-TeX-version) + (list 'window-system + 'LaTeX-version + 'TeX-style-path + 'TeX-auto-save + 'TeX-parse-self + 'TeX-master) + nil nil + "Remember to cover the basics, that is, what you expected to happen and +what in fact did happen.")) + +;;; Ispell Support + +;; The FSF ispell.el use this. +(defun ispell-tex-buffer-p () + (and (boundp 'ispell-tex-p) ispell-tex-p)) + +;; The FSF ispell.el might one day use this. +(setq ispell-enable-tex-parser t) + +(defun TeX-run-ispell (command string file) + "Run ispell on current TeX buffer." + (cond ((and (string-equal file (TeX-region-file)) + (fboundp 'ispell-region)) + (call-interactively 'ispell-region)) + ((string-equal file (TeX-region-file)) + (call-interactively 'spell-region)) + ((fboundp 'ispell-buffer) + (ispell-buffer)) + ((fboundp 'ispell) + (ispell)) + (t + (spell-buffer)))) + +;; Some versions of ispell 3 use this. +(defvar ispell-tex-major-modes nil) +(setq ispell-tex-major-modes + (append '(plain-tex-mode ams-tex-mode latex-mode) + ispell-tex-major-modes)) + +(provide 'tex) + +;;; tex.el ends here
--- a/lisp/custom/ChangeLog Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/custom/ChangeLog Mon Aug 13 09:15:11 2007 +0200 @@ -1,3 +1,62 @@ +Thu Feb 20 11:55:45 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 1.44 released. + +Thu Feb 20 11:44:33 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * custom-edit.el (custom-variable-action): Pass symbol to + `custom-unlispify-tag-name'. + (custom-group-action): Ditto. + (custom-face-action): Ditto. + +Wed Feb 19 19:41:38 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * custom.el (get-face-documentation): New function. + (set-face-documentation): Ditto. + (custom-declare-face): Use it. + + * custom-edit.el (custom-face): Ditto. + +Tue Feb 18 21:42:38 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 1.43 released. + +Tue Feb 18 19:57:28 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * widget.el: Don't call autoloads when `load-gc' is fbound. + + * Version 1.42 released. + +Tue Feb 18 08:39:59 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * custom.el (custom-background-mode): Doc fix. + (custom-declare-variable): Ditto. + Patch by Simon Marshall <Simon.Marshall@esrin.esa.it>. + + * custom.el (custom-face-display-set): Pass frame parameter to + `copy-face'. + (custom-face-attribites-set): Pass frame parameter. + + * custom-xmas.el: Cleanup. + + * custom.el (XEmacs): Load "custom-xmas" instead of requiring. + + * widget-edit.el (widget-keymap): Removed duplicate key binding. + +Mon Feb 17 12:58:40 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 1.41 released. + +Mon Feb 17 12:43:12 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * custom-edit.el (custom-variable-action): Use + `custom-unlispify-tag-name' instead of `capitalize'. + (custom-face-action): Ditto. + (custom-group-action): Ditto. + + * custom-xmas.el: New file. + * custom.el: Move XEmacs code there. + Sat Feb 15 22:27:07 1997 Per Abrahamsen <abraham@dina.kvl.dk> * Version 1.40 released.
--- a/lisp/custom/custom-edit.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/custom/custom-edit.el Mon Aug 13 09:15:11 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Keywords: help, faces -;; Version: 1.40 +;; Version: 1.44 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: @@ -911,8 +911,8 @@ (widget-put widget :custom-state 'unknown) (custom-redraw widget)) (let* ((completion-ignore-case t) - (answer (widget-choose (capitalize - (symbol-name (widget-get widget :value))) + (answer (widget-choose (custom-unlispify-tag-name + (widget-get widget :value)) custom-variable-menu event))) (if answer @@ -1075,7 +1075,8 @@ :format-handler 'custom-face-format-handler :sample-face 'custom-face-tag-face :help-echo "Push me to set or reset this face." - :documentation-property 'face-documentation + :documentation-property '(lambda (face) + (get-face-documentation face)) :value-create 'custom-face-value-create :action 'custom-face-action :custom-set 'custom-face-set @@ -1153,7 +1154,7 @@ (custom-redraw widget)) (let* ((completion-ignore-case t) (symbol (widget-get widget :value)) - (answer (widget-choose (capitalize (symbol-name symbol)) + (answer (widget-choose (custom-unlispify-tag-name symbol) custom-face-menu event))) (if answer (funcall answer widget))))) @@ -1376,8 +1377,8 @@ (widget-put widget :custom-state 'unknown) (custom-redraw widget)) (let* ((completion-ignore-case t) - (answer (widget-choose (capitalize - (symbol-name (widget-get widget :value))) + (answer (widget-choose (custom-unlispify-tag-name + (widget-get widget :value)) custom-group-menu event))) (if answer
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/custom/custom-xmas.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,78 @@ +;;; custom-xmas.el -- XEmacs specific custom support. +;; +;; Copyright (C) 1996, 1997 Free Software Foundation, Inc. +;; +;; Author: Per Abrahamsen <abraham@dina.kvl.dk> +;; Keywords: help, faces +;; Version: 1.44 +;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ + +;;; Commentary: +;; +;; See `custom.el'. + +;;; Code: + +(unless (featurep 'custom) + (error "Load `custom.el' instead")) + +;; Emacs function missing in XEmacs 19.14. +(unless (fboundp 'x-color-values) + (defun x-color-values (color &optional frame) + "Return a description of the color named COLOR on frame FRAME. +The value is a list of integer RGB values--(RED GREEN BLUE). +These values appear to range from 0 to 65280 or 65535, depending +on the system; white is (65280 65280 65280) or (65535 65535 65535). +If FRAME is omitted or nil, use the selected frame." + (color-instance-rgb-components (make-color-instance color)))) + +;; Overwrite Emacs definition. +(defun custom-facep (face) + "Face symbol or object." + (or (facep face) + (find-face face))) + +;; Support for special XEmacs font attributes. +(autoload 'font-create-object "font" nil) + +(unless (fboundp 'face-font-name) + (defun face-font-name (face &rest args) + (apply 'face-font face args))) + +(defun custom-set-face-font-size (face size &rest args) + "Set the font of FACE to SIZE" + (let* ((font (apply 'face-font-name face args)) + (fontobj (font-create-object font))) + (set-font-size fontobj size) + (apply 'set-face-font face fontobj args))) + +(defun custom-set-face-font-family (face family &rest args) + "Set the font of FACE to FAMILY" + (let* ((font (apply 'face-font-name face args)) + (fontobj (font-create-object font))) + (set-font-family fontobj family) + (apply 'set-face-font face fontobj args))) + +(nconc custom-face-attributes + '((:family (editable-field :format "Family: %v") + custom-set-face-font-family) + (:size (editable-field :format "Size: %v") + custom-set-face-font-size))) + +;; Overwrite Emacs definition. +(defun custom-menu-reset () + "Reset customize menu." + (remove-hook 'custom-define-hook 'custom-menu-reset) + (when (fboundp 'add-submenu) + ;; XEmacs with menus. + (add-submenu '("Help") custom-help-menu))) + +(defun get-face-documentation (face) + "Get the documentation string for FACE." + (face-property face 'doc-string)) + +(defun set-face-documentation (face string) + "Set the documentation string for FACE to STRING." + (set-face-property face 'doc-string string)) + +;; custom-xmas.el ends here
--- a/lisp/custom/custom.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/custom/custom.el Mon Aug 13 09:15:11 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Keywords: help, faces -;; Version: 1.40 +;; Version: 1.44 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: @@ -35,16 +35,6 @@ ;;; Compatibility. -(unless (fboundp 'x-color-values) - ;; Emacs function missing in XEmacs 19.14. - (defun x-color-values (color) - "Return a description of the color named COLOR on frame FRAME. -The value is a list of integer RGB values--(RED GREEN BLUE). -These values appear to range from 0 to 65280 or 65535, depending -on the system; white is (65280 65280 65280) or (65535 65535 65535). -If FRAME is omitted or nil, use the selected frame." - (color-instance-rgb-components (make-color-instance color)))) - (unless (fboundp 'frame-property) ;; XEmacs function missing in Emacs 19.34. (defun frame-property (frame property &optional default) @@ -53,7 +43,7 @@ default))) (defun custom-background-mode () - "Kludge to detext background mode." + "Kludge to detect background mode." (let* ((bg-resource (condition-case () (x-get-resource ".backgroundMode" "BackgroundMode" 'string) @@ -80,22 +70,16 @@ ;; XEmacs and Emacs have different definitions of `facep'. ;; The Emacs definition is the useful one, so emulate that. -(cond ((not (fboundp 'facep)) - (defun custom-facep (face) - "No faces" - nil)) - ((string-match "XEmacs" emacs-version) - (defun custom-facep (face) - "Face symbol or object." - (or (facep face) - (find-face face)))) - (t - (defalias 'custom-facep 'facep))) +(if (fboundp 'facep) + (defalias 'custom-facep 'facep) + (defun custom-facep (face) + "No faces" + nil)) ;;; The `defcustom' Macro. (defun custom-declare-variable (symbol value doc &rest args) - "Like `defcustom', but SYMBOL and VALUE are evaluated as notmal arguments." + "Like `defcustom', but SYMBOL and VALUE are evaluated as normal arguments." (unless (and (default-boundp symbol) (not (get symbol 'saved-value))) (set-default symbol (if (get symbol 'saved-value) @@ -154,6 +138,15 @@ ;;; The `defface' Macro. + +;(defun get-face-documentation (face) +; "Get the documentation string for FACE." +; (get face 'face-documentation)) + +;(defun set-face-documentation (face string) +; "Set the documentation string for FACE to STRING." +; (put face 'face-documentation string)) + (defun custom-declare-face (face spec doc &rest args) "Like `defface', but FACE is evaluated as a normal argument." (put face 'factory-face spec) @@ -163,8 +156,8 @@ ;; If the user has already created the face, respect that. (let ((value (or (get face 'saved-face) spec))) (custom-face-display-set face value)))) - (when doc - (put face 'face-documentation doc)) + (when (and doc (null (get-face-documentation face))) + (set-face-documentation face doc)) (custom-handle-all-keywords face args 'custom-face) (run-hooks 'custom-define-hook) face) @@ -337,7 +330,7 @@ Iff optional FRAME is non-nil, set it for that frame only. See `defface' for information about SPEC." (when (fboundp 'copy-face) - (copy-face 'custom-face-empty face) + (copy-face 'custom-face-empty face frame) (while spec (let* ((entry (car spec)) (display (nth 0 entry)) @@ -408,34 +401,6 @@ value of the attribute, and optionally the frame where the face should be changed.") -(when (string-match "XEmacs" emacs-version) - ;; Support for special XEmacs font attributes. - (require 'font) - - (unless (fboundp 'face-font-name) - (defun face-font-name (face &rest args) - (apply 'face-font face args))) - - (defun set-face-font-size (face size &rest args) - "Set the font of FACE to SIZE" - (let* ((font (apply 'face-font-name face args)) - (fontobj (font-create-object font))) - (set-font-size fontobj size) - (apply 'set-face-font face fontobj args))) - - (defun set-face-font-family (face family &rest args) - "Set the font of FACE to FAMILY" - (let* ((font (apply 'face-font-name face args)) - (fontobj (font-create-object font))) - (set-font-family fontobj family) - (apply 'set-face-font face fontobj args))) - - (nconc custom-face-attributes - '((:family (editable-field :format "Family: %v") - set-face-font-family) - (:size (editable-field :format "Size: %v") - set-face-font-size)))) - (defun custom-face-attribites-set (face frame &rest atts) "For FACE on FRAME set the attributes [KEYWORD VALUE].... Each keyword should be listed in `custom-face-attributes'. @@ -447,7 +412,7 @@ (fun (nth 2 (assq name custom-face-attributes)))) (setq atts (cdr (cdr atts))) (condition-case nil - (funcall fun face value) + (funcall fun face value frame) (error nil))))) (defun custom-set-face-bold (face value &optional frame) @@ -557,27 +522,24 @@ ["Apropos..." customize-apropos t]) "Customize menu") -(defun custom-menu-reset () - "Reset customize menu." - (remove-hook 'custom-define-hook 'custom-menu-reset) - (cond ((fboundp 'add-submenu) - ;; XEmacs with menus. - (add-submenu '("Help") custom-help-menu)) - ((string-match "XEmacs" emacs-version) - ;; XEmacs without menus. - ) - (t - ;; Emacs. - (define-key global-map [menu-bar help-menu customize-menu] - (cons (car custom-help-menu) - (easy-menu-create-keymaps (car custom-help-menu) - (cdr custom-help-menu))))))) - -(unless (fboundp 'load-gc) - (custom-menu-reset)) +;(defun custom-menu-reset () +; "Reset customize menu." +; (remove-hook 'custom-define-hook 'custom-menu-reset) +; (define-key global-map [menu-bar help-menu customize-menu] +; (cons (car custom-help-menu) +; (easy-menu-create-keymaps (car custom-help-menu) +; (cdr custom-help-menu))))) ;;; The End. (provide 'custom) +(when (and (not (fboundp 'load-gc)) + (string-match "XEmacs" emacs-version)) + ;; Overwrite definitions for XEmacs. + (load-library "custom-xmas")) + +(unless (fboundp 'load-gc) + (custom-menu-reset)) + ;; custom.el ends here
--- a/lisp/custom/widget-browse.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/custom/widget-browse.el Mon Aug 13 09:15:11 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Keywords: extensions -;; Version: 1.40 +;; Version: 1.44 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary:
--- a/lisp/custom/widget-edit.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/custom/widget-edit.el Mon Aug 13 09:15:11 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Keywords: extensions -;; Version: 1.40 +;; Version: 1.44 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: @@ -47,15 +47,14 @@ (unless (and (featurep 'custom) (fboundp 'custom-declare-variable)) ;; We have the old custom-library, hack around it! (defmacro defgroup (&rest args) nil) - (defmacro defcustom (&rest args) nil) + (defmacro defcustom (var value doc &rest args) + `(defvar ,var ,value ,doc)) (defmacro defface (&rest args) nil) (define-widget-keywords :prefix :tag :load :link :options :type :group) (when (fboundp 'copy-face) (copy-face 'default 'widget-documentation-face) (copy-face 'bold 'widget-button-face) - (copy-face 'italic 'widget-field-face)) - (defvar widget-mouse-face 'highlight) - (defvar widget-menu-max-size 40))) + (copy-face 'italic 'widget-field-face)))) ;;; Compatibility. @@ -564,7 +563,6 @@ (define-key widget-keymap "\t" 'widget-forward) (define-key widget-keymap "\M-\t" 'widget-backward) (define-key widget-keymap [(shift tab)] 'widget-backward) - (define-key widget-keymap [(shift tab)] 'widget-backward) (define-key widget-keymap [backtab] 'widget-backward) (if (string-match "XEmacs" (emacs-version)) (progn
--- a/lisp/custom/widget-example.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/custom/widget-example.el Mon Aug 13 09:15:11 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Keywords: help, extensions, faces, hypermedia -;; Version: 1.40 +;; Version: 1.44 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ (require 'widget)
--- a/lisp/custom/widget.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/custom/widget.el Mon Aug 13 09:15:11 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Keywords: help, extensions, faces, hypermedia -;; Version: 1.40 +;; Version: 1.44 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: @@ -42,12 +42,12 @@ :hide-rear-space) ;; These autoloads should be deleted when the file is added to Emacs. -(autoload 'widget-create "widget-edit") -(autoload 'widget-insert "widget-edit") -(autoload 'widget-browse "widget-browse" nil t) -(autoload 'widget-browse-at "widget-browse" nil t) +(unless (fboundp 'load-gc) + (autoload 'widget-create "widget-edit") + (autoload 'widget-insert "widget-edit") + (autoload 'widget-browse "widget-browse" nil t) + (autoload 'widget-browse-at "widget-browse" nil t)) -;;;###autoload (defun define-widget (name class doc &rest args) "Define a new widget type named NAME from CLASS.
--- a/lisp/edebug/edebug.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/edebug/edebug.el Mon Aug 13 09:15:11 2007 +0200 @@ -22,14 +22,14 @@ ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ;; 02111-1307, USA. -;;; Synched up with: Not in FSF +;;; Synched up with: FSF 19.34. ;;; Commentary: ;; LCD Archive Entry: ;; edebug|Daniel LaLiberte|liberte@cs.uiuc.edu ;; |A source level debugger for Emacs Lisp. -;; |$Date: 1996/12/18 22:51:47 $|$Revision: 1.1.1.2 $|~/modes/edebug.el| +;; |$Date: 1997/02/24 01:13:06 $|$Revision: 1.2 $|~/modes/edebug.el| ;; This minor mode allows programmers to step through Emacs Lisp ;; source code while executing functions. You can also set @@ -38,7 +38,7 @@ ;; expressions, trap errors normally caught by debug, and display a ;; debug style backtrace. -;; Installation +;;; Installation ;; ============= ;; Put edebug.el in some directory in your load-path and @@ -59,7 +59,7 @@ ;; `debugger' to `edebug-debug'. This is no longer necessary ;; since Edebug automatically sets it whenever Edebug is active. -;; Minimal Instructions +;;; Minimal Instructions ;; ===================== ;; First evaluate a defun with C-xx, then run the function. Step @@ -82,25 +82,23 @@ ;; uiucdcs!liberte ;; liberte@cs.uiuc.edu -;; =============================== ;; For the early revision history, see edebug-history. ;;; Code: (defconst edebug-version - (let ((raw-version "$Revision: 1.1.1.2 $")) + (let ((raw-version "$Revision: 1.2 $")) (substring raw-version (string-match "[0-9.]*" raw-version) (match-end 0)))) (require 'backquote) -;; Emacs 18 doesnt have defalias. +;; Emacs 18 doesn't have defalias. (eval-and-compile (or (fboundp 'defalias) (fset 'defalias 'fset))) -;; Bug reporting -;; ============== +;;; Bug reporting (defconst edebug-maintainer-address "liberte@cs.uiuc.edu") @@ -128,9 +126,7 @@ 'edebug-print-circle )))) - -;; Options -;; =============================== +;;; Options (defvar edebug-setup-hook nil "*Functions to call before edebug is used. @@ -252,9 +248,7 @@ "*If non-nil, an expression to test for at every stop point. If the result is non-nil, then break. Errors are ignored.") - -;; Form spec utilities. -;; =============================== +;;; Form spec utilities. ;;;###autoload (defmacro def-edebug-spec (symbol spec) @@ -279,9 +273,7 @@ edebug-form-spec )) - -;; Utilities -;; =============================== +;;; Utilities ;; Define edebug-gensym - from old cl.el (defvar edebug-gensym-index 0 @@ -330,7 +322,7 @@ (defun edebug-window-list () "Return a list of windows, in order of `next-window'." - ;; This doesnt work for epoch. + ;; This doesn't work for epoch. (let* ((first-window (selected-window)) (window-list (list first-window)) (next (next-window first-window))) @@ -372,7 +364,7 @@ "Returns the function named by OBJECT, or nil if it is not a function." (setq object (edebug-lookup-function object)) (if (or (subrp object) - (compiled-function-p object) + (compiled-function-p object) ; XEmacs (and (listp object) (eq (car object) 'lambda) (listp (car (cdr object))))) @@ -403,8 +395,7 @@ (set-buffer (marker-buffer edebug:s-r-beg)) (narrow-to-region edebug:s-r-beg edebug:s-r-end)))))) -;; Display -;; ============ +;;; Display (defconst edebug-trace-buffer "*edebug-trace*" "Name of the buffer to put trace info in.") @@ -426,7 +417,7 @@ (split-window)) ;; (message "next window: %s" (next-window)) (sit-for 1) (if (eq (get-buffer-window edebug-trace-buffer) (next-window)) - ;; Dont select trace window + ;; Don't select trace window nil (select-window (next-window)))) (set-window-buffer (selected-window) buffer) @@ -498,8 +489,7 @@ (defalias 'edebug-input-pending-p 'input-pending-p) -;; Redefine read and eval functions -;; ================================= +;;; Redefine read and eval functions ;; read is redefined to maybe instrument forms. ;; eval-defun is redefined to check edebug-all-forms and edebug-all-defs. @@ -522,7 +512,7 @@ t (read text line using minibuffer and use it). This version, from Edebug, maybe instruments the expression. But the -STREAM must be the current buffer to do so. Whether it instuments is +STREAM must be the current buffer to do so. Whether it instruments is also dependent on the values of `edebug-all-defs' and `edebug-all-forms'." (or stream (setq stream standard-input)) @@ -533,6 +523,8 @@ (or (fboundp 'edebug-original-eval-defun) (defalias 'edebug-original-eval-defun (symbol-function 'eval-defun))) +;; We should somehow arrange to be able to do this +;; without actually replacing the eval-defun command. (defun edebug-eval-defun (edebug-it) "Evaluate the top-level form containing point, or after point. @@ -542,13 +534,16 @@ argument. If instrumenting, it prints: `Edebug: FUNCTIONNAME'. Otherwise, it prints in the minibuffer." (interactive "P") - (let ((edebugging (not (eq (not edebug-it) (not edebug-all-defs)))) - (edebug-result)) - (setq edebug-result - (eval - (let ((edebug-all-forms edebugging) - (edebug-all-defs (eq edebug-all-defs (not edebug-it)))) - (edebug-read-top-level-form)))) + (let* ((edebugging (not (eq (not edebug-it) (not edebug-all-defs)))) + (edebug-result) + (form + (let ((edebug-all-forms edebugging) + (edebug-all-defs (eq edebug-all-defs (not edebug-it)))) + (edebug-read-top-level-form)))) + (if (and (eq (car form) 'defvar) + (cdr-safe (cdr-safe form))) + (setq form (cons 'defconst (cdr form)))) + (setq edebug-result (eval form)) (if (not edebugging) (princ edebug-result) edebug-result))) @@ -565,7 +560,7 @@ or if an error occurs, leave point after it with mark at the original point." (interactive) (eval - ;; Bind edebug-all-forms only while reading, not while evaling + ;; Bind edebug-all-forms only while reading, not while evalling ;; but this causes problems while edebugging edebug. (let ((edebug-all-forms t) (edebug-all-defs t)) @@ -616,8 +611,7 @@ (defalias 'eval-defun (symbol-function 'edebug-original-eval-defun))) -;; Edebug internal data -;; =============================== +;;; Edebug internal data ;; The internal data that is needed for edebugging is kept in the ;; buffer-local variable `edebug-form-data'. @@ -702,10 +696,7 @@ ;; (set-marker (nth 2 entry) nil) (setq edebug-form-data (delq entry edebug-form-data))))) - -;; Parser utilities -;; =============================== - +;;; Parser utilities (defun edebug-syntax-error (&rest args) ;; Signal an invalid-read-syntax with ARGS. @@ -723,6 +714,8 @@ (aset table ?\( 'lparen) (aset table ?\) 'rparen) (aset table ?\' 'quote) + (aset table ?\` 'backquote) + (aset table ?\, 'comma) (aset table ?\" 'string) (aset table ?\? 'char) (aset table ?\[ 'lbracket) @@ -730,12 +723,13 @@ (aset table ?\. 'dot) (aset table ?\# 'hash) ;; We treat numbers as symbols, because of confusion with -, -1, and 1-. - ;; We dont care about any other chars since they wont be seen. + ;; We don't care about any other chars since they won't be seen. table)) (defun edebug-next-token-class () ;; Move to the next token and return its class. We only care about - ;; lparen, rparen, dot, quote, string, char, vector, or symbol. + ;; lparen, rparen, dot, quote, backquote, comma, string, char, vector, + ;; or symbol. (edebug-skip-whitespace) (aref edebug-read-syntax-table (following-char))) @@ -772,12 +766,14 @@ (forward-char -1)))) ((eq class 'quote) (forward-char 1) (list 'quote (edebug-read-sexp))) + ((eq class 'backquote) + (list '\` (edebug-read-sexp))) + ((eq class 'comma) + (list '\, (edebug-read-sexp))) (t ; anything else, just read it. (edebug-original-read (current-buffer)))))) - -;; Offsets for reader -;; ============================== +;;; Offsets for reader ;; Define a structure to represent offset positions of expressions. ;; Each offset structure looks like: (before . after) for constituents, @@ -852,8 +848,8 @@ (edebug-store-after-offset (point))))) -;; Reader for Emacs Lisp. -;; ========================================== +;;; Reader for Emacs Lisp. + ;; Uses edebug-next-token-class (and edebug-skip-whitespace) above. (defconst edebug-read-alist @@ -861,6 +857,8 @@ (lparen . edebug-read-list) (string . edebug-read-string) (quote . edebug-read-quote) + (backquote . edebug-read-backquote) + (comma . edebug-read-comma) (lbracket . edebug-read-vector) (hash . edebug-read-function) )) @@ -897,6 +895,42 @@ (edebug-storing-offsets (point) 'quote) (edebug-read-storing-offsets stream))) +(defun edebug-read-backquote (stream) + ;; Turn `thing into (\` thing) + (let ((opoint (point))) + (forward-char 1) + ;; Generate the same structure of offsets we would have + ;; if the resulting list appeared verbatim in the input text. + (edebug-storing-offsets opoint + (list + (edebug-storing-offsets opoint '\`) + (edebug-read-storing-offsets stream))))) + +(defvar edebug-read-backquote-new nil + "Non-nil if reading the inside of a new-style backquote with no parens around it. +Value of nil means reading the inside of an old-style backquote construct +which is surrounded by an extra set of parentheses. +This controls how we read comma constructs.") + +(defun edebug-read-comma (stream) + ;; Turn ,thing into (\, thing). Handle ,@ and ,. also. + (let ((opoint (point))) + (forward-char 1) + (let ((symbol '\,)) + (cond ((eq (following-char) ?\.) + (setq symbol '\,\.) + (forward-char 1)) + ((eq (following-char) ?\@) + (setq symbol '\,@) + (forward-char 1))) + ;; Generate the same structure of offsets we would have + ;; if the resulting list appeared verbatim in the input text. + (if edebug-read-backquote-new + (list + (edebug-storing-offsets opoint symbol) + (edebug-read-storing-offsets stream)) + (edebug-storing-offsets opoint symbol))))) + (defun edebug-read-function (stream) ;; Turn #'thing into (function thing) (forward-char 1) @@ -912,7 +946,18 @@ (prog1 (let ((elements)) (while (not (memq (edebug-next-token-class) '(rparen dot))) - (setq elements (cons (edebug-read-storing-offsets stream) elements))) + (if (eq (edebug-next-token-class) 'backquote) + (let ((edebug-read-backquote-new (not (null elements))) + (opoint (point))) + (if edebug-read-backquote-new + (setq elements (cons (edebug-read-backquote stream) elements)) + (forward-char 1) ; Skip backquote. + ;; Call edebug-storing-offsets here so that we + ;; produce the same offsets we would have had + ;; if the backquote were an ordinary symbol. + (setq elements (cons (edebug-storing-offsets opoint '\`) + elements)))) + (setq elements (cons (edebug-read-storing-offsets stream) elements)))) (setq elements (nreverse elements)) (if (eq 'dot (edebug-next-token-class)) (let (dotted-form) @@ -937,10 +982,7 @@ (forward-char 1) ; skip \] )) - - -;; Cursors for traversal of list and vector elements with offsets. -;;==================================================================== +;;; Cursors for traversal of list and vector elements with offsets. (defvar edebug-dotted-spec nil) @@ -1017,8 +1059,7 @@ (setq offset (cdr offset))) offset)) -;; The Parser -;; =============================== +;;; The Parser ;; The top level function for parsing forms is ;; edebug-read-and-maybe-wrap-form; it calls all the rest. It checks the @@ -1070,7 +1111,7 @@ (let (result edebug-top-window-data edebug-def-name;; make sure it is locally nil - ;; I dont like these here!! + ;; I don't like these here!! edebug-&optional edebug-&rest edebug-gate @@ -1094,7 +1135,7 @@ def-kind defining-form-p def-name - ;; These offset things dont belong here, but to support recursive + ;; These offset things don't belong here, but to support recursive ;; calls to edebug-read, they need to be here. edebug-offsets edebug-offsets-stack @@ -1113,7 +1154,7 @@ (eq 'name (car (cdr spec))) (eq 'symbol (edebug-next-token-class))) (edebug-original-read (current-buffer)))))) -;;(message "all defs: %s all forms: %s" edebug-all-defs edebug-all-forms) +;;;(message "all defs: %s all forms: %s" edebug-all-defs edebug-all-forms) (cond (defining-form-p (if (or edebug-all-defs edebug-all-forms) @@ -1188,7 +1229,7 @@ (quote (, edebug-def-name)) (, (if edebug-inside-func (` (list (,@ - ;; Doesnt work with more than one def-body!! + ;; Doesn't work with more than one def-body!! ;; But the list will just be reversed. (nreverse edebug-def-args)))) 'nil)) @@ -1217,7 +1258,7 @@ ;; (edebug-after (edebug-before BEFORE-INDEX) AFTER-INDEX FORM) ;; Also increment the offset index for subsequent use. ;; if (not edebug-stop-before-symbols) and form is a symbol, - ;; then dont call edebug-before. + ;; then don't call edebug-before. (list 'edebug-after (list 'edebug-before before-index) after-index form)) @@ -1406,7 +1447,7 @@ ((symbolp form) (cond - ;; Check for constant symbols that dont get wrapped. + ;; Check for constant symbols that don't get wrapped. ((or (memq form '(t nil)) (and (fboundp 'edebug-keywordp) (edebug-keywordp form))) form) @@ -1495,9 +1536,7 @@ "Head of list form must be a symbol or lambda expression."))) )) - -;; Matching of specs. -;; =================== +;;; Matching of specs. (defvar edebug-after-dotted-spec nil) @@ -1505,8 +1544,8 @@ (defconst edebug-max-depth 150) ;; maximum number of matching recursions. -;; Failure to match -;; ================== +;;; Failure to match + ;; This throws to no-match, if there are higher alternatives. ;; Otherwise it signals an error. The place of the error is found ;; with the two before- and after-offset functions. @@ -1594,7 +1633,7 @@ ;; Define specs for all the symbol specs with functions used to process them. -;; Perhaps we shouldnt be doing this with edebug-form-specs since the +;; Perhaps we shouldn't be doing this with edebug-form-specs since the ;; user may want to define macros or functions with the same names. ;; We could use an internal obarray for these primitive specs. @@ -1712,7 +1751,7 @@ (let (edebug-gate ;; only while matching each spec edebug-best-error edebug-error-point) - ;; Doesnt support e.g. &or symbolp &rest form + ;; Doesn't support e.g. &or symbolp &rest form (edebug-match-one-spec cursor (car specs))))) ;; Match failed, so reset and try again. (setq specs (cdr specs)) @@ -1741,7 +1780,7 @@ (defun edebug-match-&key (cursor specs) ;; Following specs must look like (<name> <spec>) ... ;; where <name> is the name of a keyword, and spec is its spec. - ;; This really doesnt save much over the expanded form and takes time. + ;; This really doesn't save much over the expanded form and takes time. (edebug-match-&rest cursor (cons '&or @@ -1845,7 +1884,7 @@ (defun edebug-match-&define (cursor specs) ;; Match a defining form. - ;; Normally, &define is interpretted specially other places. + ;; Normally, &define is interpreted specially other places. ;; This should only be called inside of a spec list to match the remainder ;; of the current list. e.g. ("lambda" &define args def-body) (edebug-make-form-wrapper @@ -1932,12 +1971,12 @@ (list (edebug-wrap-def-body (edebug-forms cursor))))) -;; Edebug Form Specs -;; ========================================================== -;; See cl-specs.el for common lisp specs. - -;;* Spec for def-edebug-spec -;; Out of date. +;;;; Edebug Form Specs +;;; ========================================================== +;;; See cl-specs.el for common lisp specs. + +;;;;* Spec for def-edebug-spec +;;; Out of date. (defun edebug-spec-p (object) "Return non-nil if OBJECT is a symbol with an edebug-form-spec property." @@ -1967,7 +2006,7 @@ )) -;;* Emacs special forms and some functions. +;;;* Emacs special forms and some functions. ;; quote expects only one argument, although it allows any number. (def-edebug-spec quote sexp) @@ -1984,7 +2023,7 @@ (def-edebug-spec defmacro (&define name lambda-list def-body)) -(def-edebug-spec arglist lambda-list) ;; denegrated - use lambda-list. +(def-edebug-spec arglist lambda-list) ;; deprecated - use lambda-list. (def-edebug-spec lambda-list (([&rest arg] @@ -2085,7 +2124,6 @@ ;; Anything else? -;;==================== ;; Some miscellaneous specs for macros in public packages. ;; Send me yours. @@ -2103,13 +2141,11 @@ [&optional ("interactive" interactive)] def-body)) - -;; The debugger itself -;; =============================== +;;; The debugger itself (defvar edebug-active nil) ;; Non-nil when edebug is active -;; add minor-mode-alist entry +;;; add minor-mode-alist entry (or (assq 'edebug-active minor-mode-alist) (setq minor-mode-alist (cons (list 'edebug-active " *Debugging*") minor-mode-alist))) @@ -2171,8 +2207,7 @@ (defvar cl-lexical-debug) ;; Defined in cl.el -;; Handling signals -;; ================= +;;; Handling signals (if (not (fboundp 'edebug-original-signal)) (defalias 'edebug-original-signal (symbol-function 'signal))) @@ -2200,8 +2235,7 @@ (edebug-original-signal edebug-signal-name edebug-signal-data)) -;; Entering Edebug -;; ================== +;;; Entering Edebug (defun edebug-enter (edebug-function edebug-args edebug-body) ;; Entering FUNC. The arguments are ARGS, and the body is BODY. @@ -2518,8 +2552,8 @@ (setq edebug-buffer-points (edebug-get-displayed-buffer-points))) ;; First move the edebug buffer point to edebug-point - ;; so that window start doesnt get changed when we display it. - ;; I dont know if this is going to help. + ;; so that window start doesn't get changed when we display it. + ;; I don't know if this is going to help. ;;(set-buffer edebug-buffer) ;;(goto-char edebug-point) @@ -2614,7 +2648,7 @@ (eq edebug-arg-mode 'error)) (progn ;; (setq edebug-execution-mode 'step) - ;; (edebug-overlay-arrow) ; this doesnt always show up. + ;; (edebug-overlay-arrow) ; this doesn't always show up. (edebug-recursive-edit))) ; <---------- Recursive edit ;; Reset the edebug-window-data to whatever it is now. @@ -2660,7 +2694,7 @@ 'no-force) ;; Unrestore edebug-buffer's window-point. ;; Needed in addition to setting the buffer point - ;; - otherwise quitting doesnt leave point as is. + ;; - otherwise quitting doesn't leave point as is. ;; But this causes point to not be restored at times. ;; Also, it may not be a visible window. ;; (set-window-point window edebug-point) @@ -2680,8 +2714,8 @@ (set-buffer edebug-outside-buffer) ;; Restore point, and mark. ;; Needed even if restoring windows because - ;; that doesnt restore point and mark in the current buffer. - ;; But dont restore point if edebug-buffer is current buffer. + ;; that doesn't restore point and mark in the current buffer. + ;; But don't restore point if edebug-buffer is current buffer. (if (not (eq edebug-buffer edebug-outside-buffer)) (goto-char edebug-outside-point)) (if (marker-buffer (edebug-mark-marker)) @@ -2904,13 +2938,12 @@ )) -;; Display related functions -;; =============================== +;;; Display related functions (defun edebug-adjust-window (old-start) ;; If pos is not visible, adjust current window to fit following context. -;; (message "window: %s old-start: %s window-start: %s pos: %s" -;; (selected-window) old-start (window-start) (point)) (sit-for 5) +;;; (message "window: %s old-start: %s window-start: %s pos: %s" +;;; (selected-window) old-start (window-start) (point)) (sit-for 5) (if (not (pos-visible-in-window-p)) (progn ;; First try old-start @@ -3078,9 +3111,7 @@ (message "Displaying %s %s" buffer (if already-displaying "off" "on")))) - -;; Breakpoint related functions -;; =============================== +;;; Breakpoint related functions (defun edebug-find-stop-point () ;; Return (function . index) of the nearest edebug stop point. @@ -3144,7 +3175,8 @@ (goto-char (+ edebug-def-mark (aref offset-vector (car breakpoint)))) - (message (concat (if (nth 2 breakpoint) + (message "%s" + (concat (if (nth 2 breakpoint) "Temporary " "") (if (car (cdr breakpoint)) (format "Condition: %s" @@ -3238,8 +3270,7 @@ (setq edebug-global-break-condition expression)) -;; Mode switching functions -;; =============================== +;;; Mode switching functions (defun edebug-set-mode (mode shortmsg msg) ;; Set the edebug mode to MODE. @@ -3464,8 +3495,7 @@ ;; (edebug-set-mode 'exiting "Exit...")) -;; ----------------------------------------------------------------- -;; The following initial mode setting definitions are not used yet. +;;; The following initial mode setting definitions are not used yet. '(defconst edebug-initial-mode-alist '((edebug-Continue-fast . Continue-fast) @@ -3510,9 +3540,7 @@ (error "Key must map to one of the mode changing commands") ))) - -;; Evaluation of expressions -;; =============================== +;;; Evaluation of expressions (def-edebug-spec edebug-outside-excursion t) @@ -3620,8 +3648,8 @@ (get (car edebug-err) 'error-message) (car (cdr edebug-err)))))) -;; Printing -;; ========= +;;; Printing + ;; Replace printing functions. ;; obsolete names @@ -3703,8 +3731,7 @@ (interactive) (message "%s" edebug-previous-result)) -;; Read, Eval and Print -;; ===================== +;;; Read, Eval and Print (defun edebug-eval-expression (edebug-expr) "Evaluate an expression in the outside environment. @@ -3737,9 +3764,7 @@ (princ "\n") )) - -;; Edebug Minor Mode -;; =============================== +;;; Edebug Minor Mode ;; Global GUD bindings for all emacs-lisp-mode buffers. (define-key emacs-lisp-mode-map "\C-x\C-a\C-s" 'edebug-step-mode) @@ -3902,9 +3927,8 @@ " (use-local-map edebug-mode-map)) - -;; edebug eval list mode -;; =============================================== +;;; edebug eval list mode + ;; A list of expressions and their evaluations is displayed in *edebug*. (defun edebug-eval-result-list () @@ -4039,9 +4063,7 @@ (setq mode-name "Edebug-Eval") (use-local-map edebug-eval-mode-map)) - -;; Interface with standard debugger. -;; ======================================== +;;; Interface with standard debugger. ;; (setq debugger 'edebug) ; to use the edebug debugger ;; (setq debugger 'debug) ; use the standard debugger @@ -4120,8 +4142,7 @@ ))))) -;; Trace display -;; =============================== +;;; Trace display (defun edebug-trace-display (buf-name fmt &rest args) "In buffer BUF-NAME, display FMT and ARGS at the end and make it visible. @@ -4131,7 +4152,8 @@ ;; (edebug-trace-display "*trace-point*" ;; "saving: point = %s window-start = %s" ;; (point) (window-start)) - (let* ((selected-window (selected-window)) + (let* ((oldbuf (current-buffer)) + (selected-window (selected-window)) (buffer (get-buffer-create buf-name)) buf-window) ;; (message "before pop-to-buffer") (sit-for 1) @@ -4147,7 +4169,8 @@ ;; (set-window-point buf-window (point)) ;; (edebug-sit-for 0) (bury-buffer buffer) - (select-window selected-window)) + (select-window selected-window) + (set-buffer oldbuf)) buf-name) @@ -4156,8 +4179,7 @@ (apply 'edebug-trace-display edebug-trace-buffer fmt args)) -;; Frequency count and coverage -;; ============================== +;;; Frequency count and coverage (defun edebug-display-freq-count () "Display the frequency count data for each line of the current @@ -4240,8 +4262,7 @@ (undo))) -;; Menus -;;========= +;;; Menus (defun edebug-toggle (variable) (set variable (not (eval variable))) @@ -4308,12 +4329,12 @@ "XEmacs style menus for Edebug.") -;; Emacs version specific code -;;============================= -;; The default for all above is Emacs 18, because it is easier to compile -;; Emacs 18 code in Emacs 19 than vice versa. This default will -;; change once most people are using Emacs 19 or derivatives. - +;;; Emacs version specific code + +;;; The default for all above is Emacs 18, because it is easier to compile +;;; Emacs 18 code in Emacs 19 than vice versa. This default will +;;; change once most people are using Emacs 19 or derivatives. + ;; Epoch specific code is in a separate file: edebug-epoch.el. ;; The byte-compiler will complain about changes in number of arguments @@ -4375,7 +4396,7 @@ (edebug-safe-prin1-to-string (car values))))) (easy-menu-define edebug-menu edebug-mode-map "Edebug menus" edebug-mode-menus) - (if (eq (console-type) 'x) + (if (eq (console-type) 'x) ; XEmacs (x-popup-menu nil (lookup-key edebug-mode-map [menu-bar Edebug]))) ) @@ -4419,8 +4440,8 @@ (edebug-emacs-version-specific) -;; Byte-compiler -;; ==================== +;;; Byte-compiler + ;; Extension for bytecomp to resolve undefined function references. ;; Requires new byte compiler. @@ -4490,7 +4511,7 @@ popup-menu ;; CL cl-macroexpand-all - ;; And believe it or not, the byte compiler doesnt know about: + ;; And believe it or not, the byte compiler doesn't know about: byte-compile-resolve-functions )) @@ -4504,8 +4525,7 @@ ))) -;; Autoloading of Edebug accessories -;;=================================== +;;; Autoloading of Edebug accessories (if (featurep 'cl) (add-hook 'edebug-setup-hook @@ -4523,11 +4543,10 @@ (function (lambda () (require 'edebug-cl-read))))) -;; Finalize Loading -;;=================== - -;; Finally, hook edebug into the rest of Emacs. -;; There are probably some other things that could go here. +;;; Finalize Loading + +;;; Finally, hook edebug into the rest of Emacs. +;;; There are probably some other things that could go here. ;; Install edebug read and eval functions. (edebug-install-read-eval-functions)
--- a/lisp/ediff/ediff-init.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/ediff/ediff-init.el Mon Aug 13 09:15:11 2007 +0200 @@ -1156,11 +1156,13 @@ ;;; In-line functions -(defsubst ediff-file-remote-p (file-name) - (require 'ange-ftp) - (car (if ediff-xemacs-p - (ange-ftp-ftp-path file-name) - (ange-ftp-ftp-name file-name)))) +(or (fboundp 'ediff-file-remote-p) ; user supplied his own function + (defun ediff-file-remote-p (file-name) + (car (cond ((featurep 'efs) (efs-ftp-path file-name)) + ((fboundp 'file-remote-p) (efs-ftp-path file-name)) + (t (require 'ange-ftp) + ;; Can happen only in Emacs, since XEmacs has file-remote-p + (ange-ftp-ftp-name file-name)))))) (defsubst ediff-frame-unsplittable-p (frame) @@ -1601,10 +1603,10 @@ (apply 'message string args))) (defun ediff-file-attributes (filename attr-number) - (let ((handler (find-file-name-handler filename 'find-file-noselect))) - (if (and handler (string-match "ange-ftp" (format "%S" handler))) - -1 - (nth attr-number (file-attributes filename))))) + (if (ediff-file-remote-p filename) + -1 + (nth attr-number (file-attributes filename)))) + (defsubst ediff-file-size (filename) (ediff-file-attributes filename 7)) (defsubst ediff-file-modtime (filename)
--- a/lisp/efs/Makefile Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/efs/Makefile Mon Aug 13 09:15:11 2007 +0200 @@ -2,7 +2,7 @@ # # File: Makefile # Release: $efs release: 1.15 $ -# Version: $Revision: 1.2 $ +# Version: $Revision: 1.3 $ # RCS: # Description: Makefile for byte-compiling efs and dired. # Author: Andy Norman, HPLabs, Bristol, UK. @@ -83,7 +83,7 @@ COREOBJS = efs-defun.elc efs-ovwrt.elc efs-fnh.elc efs-cu.elc efs-netrc.elc \ efs.elc efs-dired.elc efs-report.elc \ - efs-cp-p.elc auto-save.elc + efs-cp-p.elc DOBJS = default-dir.elc dired.elc dired-mob.elc dired-oas.elc \ dired-rgxp.elc dired-shell.elc dired-vir.elc dired-xy.elc \ dired-grep.elc dired-uu.elc \ @@ -96,11 +96,14 @@ efs-tops-20.elc efs-dl.elc efs-guardian.elc efs-coke.elc \ efs-vms.elc efs-vos.elc efs-plan9.elc efs-ms-unix.elc VMOBJS = efs-vm.elc -GEOBJS = dired-fsf.elc dired-mule.elc efs-dired-mule.elc -XEOBJS = dired-xemacs.elc +GEOBJS = dired-fsf.elc dired-mule.elc efs-dired-mule.elc \ + passwd.elc diff.elc auto-save.elc +XEOBJS = dired-faces.elc dired-xemacs.elc OBJS = $(DOBJS) $(EFSOBJS) $(VMOBJS) $(GEOBJS) $(XEOBJS) \ + efs-18.elc efs-19.elc efs-19.23.elc \ efs-l19.11.elc efs-x19.15.elc \ - emacs-19.elc fn-handler.elc + emacs-19.elc fn-handler.elc \ + reporter.elc # fixup.el is never byte-compiled. It would do no harm, but be a waste # of time. @@ -142,7 +145,9 @@ dired-sex.elc: dired-sex.el dired-mule.elc: dired-mule.el dired-xemacs.elc: dired-xemacs.el +dired-faces.elc: dired-faces.el default-dir.elc: default-dir.el +diff.elc: diff.el # efs core files efs.elc: efs.el efs-defun.elc: efs-defun.el @@ -180,6 +185,9 @@ efs-plan9.elc: efs-plan9.el efs-ms-unix.elc: efs-ms-unix.el # efs support for different Emacs versions +efs-18.elc: efs-18.el +efs-19.elc: efs-19.el +efs-19.23.elc: efs-19.23.el efs-l19.11.elc: efs-l19.11.el efs-x19.15.elc: efs-x19.15.el # efs vm support @@ -187,8 +195,6 @@ # backward compatibility files fn-handler.elc: fn-handler.el emacs-19.elc: emacs-19.el -# auto-save package -auto-save.elc: auto-save.el # Core targets core: $(COREOBJS) @@ -225,6 +231,10 @@ all: $(OBJS) # Making for a specific emacs version +18: emacs-19.elc fn-handler.elc efs dired efs-18.elc dired-mule.elc \ + efs-dired-mule.elc reporter.elc passwd.elc diff.elc auto-save.elc +19: fn-handler.elc efs dired efs-19.elc $(GEOBJS) +19.23: efs dired efs-19.23.elc $(GEOBJS) l19.11: efs dired efs-l19.11.elc $(XEOBJS) x19.15: efs dired efs-x19.15.elc $(XEOBJS)
--- a/lisp/efs/auto-save.el Mon Aug 13 09:13:58 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,513 +0,0 @@ -;; -*- Emacs-Lisp -*- -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; File: auto-save.el -;; Version: $Revision: 1.2 $ -;; RCS: -;; Description: Safer autosaving with support for efs and /tmp. -;; This version of auto-save is designed to work with efs, -;; instead of ange-ftp. -;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>, -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defconst auto-save-version (substring "$Revision: 1.2 $" 11 -2) - "Version number of auto-save.") - -;;; Copyright (C) 1992 by Sebastian Kremer <sk@thp.uni-koeln.de> - -;;; This program is free software; you can redistribute it and/or modify -;;; it under the terms of the GNU General Public License as published by -;;; the Free Software Foundation; either version 1, or (at your option) -;;; any later version. - -;;; This program is distributed in the hope that it will be useful, -;;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;;; GNU General Public License for more details. - -;;; You should have received a copy of the GNU General Public License -;;; along with this program; if not, write to the Free Software -;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -;;;; OVERVIEW ========================================================== - -;;; Combines autosaving for efs (to a local or remote directory) -;;; with the ability to do autosaves to a fixed directory on a local -;;; disk, in case NFS is slow. The auto-save file used for -;;; /usr/foo/bar/baz.txt -;;; will be -;;; AUTOSAVE/#\!usr\!foo\!bar\!baz.txt# -;;; assuming AUTOSAVE is the non-nil value of the variable -;;; `auto-save-directory'. - -;;; Takes care that autosave files for non-file-buffers (e.g. *mail*) -;;; from two simultaneous Emacses don't collide. - -;;; Autosaves even if the current directory is not writable. - -;;; Can limit autosave names to 14 characters using a hash function, -;;; see `auto-save-hash-p'. - -;;; See `auto-save-directory' and `make-auto-save-file-name' and -;;; references therein for complete documentation. - -;;; Meta-x recover-all-files will effectively do recover-file on all -;;; files whose autosave file is newer (one of the benefits of having -;;; all autosave files in the same place). - -;;;; INSTALLATION ====================================================== - -;;; Put this file into your load-path and the following in your ~/.emacs: - -;;; If you want to autosave in the fixed directory /tmp/USER-autosave/ -;;; (setq auto-save-directory -;;; (concat "/tmp/" (user-login-name) "-autosave/")) - -;;; If you don't want to save in /tmp (e.g., because it is swap -;;; mounted) but rather in ~/autosave/ -;;; (setq auto-save-directory (expand-file-name "~/autosave/")) - -;;; If you want to save each file in its own directory (the default) -;;; (setq auto-save-directory nil) -;;; You still can take advantage of autosaving efs remote files -;;; in a fixed local directory, `auto-save-directory-fallback' will -;;; be used. - -;;; If you want to use 14 character hashed autosave filenames -;;; (setq auto-save-hash-p t) - -;;; Finally, put this line after the others in your ~/.emacs: -;;; (require 'auto-save) - - -;;;; ACKNOWLEDGEMENT =================================================== - -;;; This code is loosely derived from autosave-in-tmp.el by Jamie -;;; Zawinski <jwz@lucid.com> (the version I had was last modified 22 -;;; dec 90 jwz) and code submitted to ange-ftp-lovers on Sun, 5 Apr -;;; 92 23:20:47 EDT by drw@BOURBAKI.MIT.EDU (Dale R. Worley). -;;; auto-save.el tries to cover the functionality of those two -;;; packages. - -;;; Valuable comments and help from Dale Worley, Andy Norman, Jamie -;;; Zawinski and Sandy Rutherford are gratefully acknowledged. - -;;;; PROVISION ======================================================== - -(provide 'auto-save) - -;;;; CUSTOMIZATION ===================================================== - -(defvar auto-save-directory nil - - ;;; Don't make this user-variable-p, it should be set in .emacs and - ;;; left at that. In particular, it should remain constant across - ;;; several Emacs session to make recover-all-files work. - - "If non-nil, fixed directory for autosaving: all autosave files go -there. If this directory does not yet exist at load time, it is -created and its mode is set to 0700 so that nobody else can read your -autosave files. - -If nil, each autosave files goes into the same directory as its -corresponding visited file. - -A non-nil `auto-save-directory' could be on a local disk such as in -/tmp, then auto-saves will always be fast, even if NFS or the -automounter is slow. In the usual case of /tmp being locally mounted, -note that if you run emacs on two different machines, they will not -see each other's auto-save files. - -The value \(expand-file-name \"~/autosave/\"\) might be better if /tmp -is mounted from swap (possible in SunOS, type `df /tmp' to find out) -and thus vanishes after a reboot, or if your system is particularly -thorough when cleaning up /tmp, clearing even non-empty subdirectories. - -It should never be an efs remote filename because that would -defeat `efs-auto-save-remotely'. - -Unless you set `auto-save-hash-p', you shouldn't set this to a -directory in a filesystem that does not support long filenames, since -a file named - - /home/sk/lib/emacs/lisp/auto-save.el - -will have a longish filename like - - AUTO-SAVE-DIRECTORY/#\\!home\\!sk\\!lib\\!emacs\\!lisp\\!auto-save.el# - -as auto save file. - -See also variables `auto-save-directory-fallback', -`efs-auto-save' and `efs-auto-save-remotely'.") - -(defvar auto-save-hash-p nil - "If non-nil, hashed autosave names of length 14 are used. -This is to avoid autosave filenames longer than 14 characters. -The directory used is `auto-save-hash-directory' regardless of -`auto-save-directory'. -Hashing defeats `recover-all-files', you have to recover files -individually by doing `recover-file'.") - -;;; This defvar is in efs.el now, but doesn't hurt to give it here as -;;; well so that loading first auto-save.el does not abort. -(or (boundp 'efs-auto-save) (defvar efs-auto-save 0)) -(or (boundp 'efs-auto-save-remotely) (defvar efs-auto-save-remotely nil)) - -(defvar auto-save-offer-delete nil - "*If non-nil, `recover-all-files' offers to delete autosave files -that are out of date or were dismissed for recovering. -Special value 'always deletes those files silently.") - -;;;; end of customization - - -;;; Preparations to be done at load time - -(defvar auto-save-directory-fallback (expand-file-name "~/autosave/") - ;; not user-variable-p, see above - "Directory used for local autosaving of remote files if -both `auto-save-directory' and `efs-auto-save-remotely' are nil. -Also used if a working directory to be used for autosaving is not writable. -This *must* always be the name of directory that exists or can be -created by you, never nil.") - -(defvar auto-save-hash-directory - (expand-file-name "hash/" (or auto-save-directory - auto-save-directory-fallback)) - "If non-nil, directory used for hashed autosave filenames.") - -(defun auto-save-check-directory (var) - (let ((dir (symbol-value var))) - (if (null dir) - nil - ;; Expand and store back into the variable - (set var (setq dir (expand-file-name dir))) - ;; Make sure directory exists - (if (file-directory-p dir) - nil - ;; Else we create and chmod 0700 the directory - (setq dir (directory-file-name dir)) ; some systems need this - (if (fboundp 'make-directory) ; V19 or tree dired - (make-directory dir) - (call-process "mkdir" nil nil nil dir)) - (set-file-modes dir (* 7 8 8)))))) - -(mapcar (function auto-save-check-directory) - '(auto-save-directory auto-save-directory-fallback)) - -(and auto-save-hash-p - (auto-save-check-directory 'auto-save-hash-directory)) - - -;;; Computing an autosave name for a file and vice versa - -(defun make-auto-save-file-name ();; redefines files.el - ;; auto-save-file-name-p need not be redefined. - - "Return file name to use for auto-saves of current buffer. -Does not consider `auto-save-visited-file-name'; that is checked -before calling this function. - -Offers to autosave all files in the same `auto-save-directory'. All -autosave files can then be recovered at once with function -`recover-all-files'. - -Takes care to make autosave files for files accessed through efs -be local files if variable `efs-auto-save-remotely' is nil. - -Takes care of slashes in buffer names to prevent autosave errors. - -Takes care that autosave files for buffers not visiting any file (such -as `*mail*') from two simultaneous Emacses don't collide by prepending -the Emacs pid. - -Uses 14 character autosave names if `auto-save-hash-p' is true. - -Autosaves even if the current directory is not writable, using -directory `auto-save-directory-fallback'. - -You can redefine this for customization (he he :-). -See also function `auto-save-file-name-p'." - - ;; We have to be very careful about not signalling an error in this - ;; function since files.el does not provide for this (e.g. find-file - ;; would fail for each new file). - - (condition-case error-data - (let* ((file-name (or (and (boundp 'buffer-file-truename) - buffer-file-truename - ;; Make sure that the file name is expanded. - (expand-file-name buffer-file-name)) - (and buffer-file-name - (expand-file-name buffer-file-name)))) - ;; So autosavename looks like #%...#, roughly as with the - ;; old make-auto-save-file-name function. The - ;; make-temp-name inserts the pid of this Emacs: this - ;; avoids autosaving from two Emacses into the same file. - ;; It cannot be recovered automatically then because in - ;; the next Emacs session (the one after the crash) the - ;; pid will be different, but file-less buffers like - ;; *mail* must be recovered manually anyway. - (name-prefix (if file-name nil (make-temp-name "#%"))) - (save-name (or file-name - ;; Prevent autosave errors. Buffername - ;; (to become non-dir part of filename) will - ;; be unslashified twice. Don't care. - (auto-save-unslashify-name (buffer-name)))) - (remote-p (and (stringp file-name) - (fboundp 'efs-ftp-path) - (efs-ftp-path file-name)))) - ;; Return the appropriate auto save file name: - (expand-file-name;; a buffername needs this, a filename not - (if remote-p - (if efs-auto-save-remotely - (auto-save-name-in-same-directory save-name) - ;; We have to use the `fixed-directory' now since the - ;; `same-directory' would be remote. - ;; It will use the fallback if needed. - (auto-save-name-in-fixed-directory save-name)) - ;; Else it is a local file (or a buffer without a file, hence - ;; the name-prefix). - ;; Hashed files always go into the special hash dir, never - ;; in the same directory, to make recognizing reliable. - (if (or auto-save-directory auto-save-hash-p) - (auto-save-name-in-fixed-directory save-name name-prefix) - (auto-save-name-in-same-directory save-name name-prefix))))) - - ;; If any error occurs in the above code, return what the old - ;; version of this function would have done. It is not ok to - ;; return nil, e.g., when after-find-file tests - ;; file-newer-than-file-p, nil would bomb. - - (error (progn - (message "make-auto-save-file-name %s" error-data) - (sit-for 2) - (if buffer-file-name - (concat (file-name-directory buffer-file-name) - "#" - (file-name-nondirectory buffer-file-name) - "#") - (expand-file-name (concat "#%" (buffer-name) "#"))))))) - -(defun auto-save-original-name (savename) - "Reverse of `make-auto-save-file-name'. -Returns nil if SAVENAME was not associated with a file (e.g., it came -from an autosaved `*mail*' buffer) or does not appear to be an -autosave file at all. -Hashed files are not understood, see `auto-save-hash-p'." - (let ((basename (file-name-nondirectory savename)) - (savedir (file-name-directory savename))) - (cond ((or (not (auto-save-file-name-p basename)) - (string-match "^#%" basename)) - nil) - ;; now we know it looks like #...# thus substring is safe to use - ((or (equal savedir auto-save-directory) ; 2nd arg may be nil - (equal savedir auto-save-directory-fallback)) - ;; it is of the `-fixed-directory' type - (auto-save-slashify-name (substring basename 1 -1))) - (t - ;; else it is of `-same-directory' type - (concat savedir (substring basename 1 -1)))))) - -(defun auto-save-name-in-fixed-directory (filename &optional prefix) - ;; Unslashify and enclose the whole FILENAME in `#' to make an auto - ;; save file in the auto-save-directory, or if that is nil, in - ;; auto-save-directory-fallback (which must be the name of an - ;; existing directory). If the results would be too long for 14 - ;; character filenames, and `auto-save-hash-p' is set, hash FILENAME - ;; into a shorter name. - ;; Optional PREFIX is string to use instead of "#" to prefix name. - (let ((base-name (concat (or prefix "#") - (auto-save-unslashify-name filename) - "#"))) - (if (and auto-save-hash-p - auto-save-hash-directory - (> (length base-name) 14)) - (expand-file-name (auto-save-cyclic-hash-14 filename) - auto-save-hash-directory) - (expand-file-name base-name - (or auto-save-directory - auto-save-directory-fallback))))) - -(defun auto-save-name-in-same-directory (filename &optional prefix) - ;; Enclose the non-directory part of FILENAME in `#' to make an auto - ;; save file in the same directory as FILENAME. But if this - ;; directory is not writable, use auto-save-directory-fallback. - ;; FILENAME is assumed to be in non-directory form (no trailing slash). - ;; It may be a name without a directory part (pesumably it really - ;; comes from a buffer name then), the fallback is used then. - ;; Optional PREFIX is string to use instead of "#" to prefix name. - (let ((directory (file-name-directory filename))) - (or (null directory) - (file-writable-p directory) - (setq directory auto-save-directory-fallback)) - (concat directory ; (concat nil) is "" - (or prefix "#") - (file-name-nondirectory filename) - "#"))) - -(defun auto-save-unslashify-name (s) - ;; "Quote any slashes in string S by replacing them with the two - ;;characters `\\!'. - ;;Also, replace any backslash by double backslash, to make it one-to-one." - (let ((limit 0)) - (while (string-match "[/\\]" s limit) - (setq s (concat (substring s 0 (match-beginning 0)) - (if (string= (substring s - (match-beginning 0) - (match-end 0)) - "/") - "\\!" - "\\\\") - (substring s (match-end 0)))) - (setq limit (1+ (match-end 0))))) - s) - -(defun auto-save-slashify-name (s) - ;;"Reverse of `auto-save-unslashify-name'." - (let (pos) - (while (setq pos (string-match "\\\\[\\!]" s pos)) - (setq s (concat (substring s 0 pos) - (if (eq ?! (aref s (1+ pos))) "/" "\\") - (substring s (+ pos 2))) - pos (1+ pos)))) - s) - - -;;; Hashing for autosave names - -;;; Hashing function contributed by Andy Norman <ange@hplb.hpl.hp.com> -;;; based upon C code from pot@fly.cnuce.cnr.IT (Francesco Potorti`). - -(defun auto-save-cyclic-hash-14 (s) - ;; "Hash string S into a string of length 14. - ;; A 7-bytes cyclic code for burst correction is calculated on a - ;; byte-by-byte basis. The polynomial used is D^7 + D^6 + D^3 +1. - ;; The resulting string consists of hexadecimal digits [0-9a-f]. - ;; In particular, it contains no slash, so it can be used as autosave name." - (let ((crc (make-string 7 0)) - result) - (mapcar - (function - (lambda (new) - (setq new (+ new (aref crc 6))) - (aset crc 6 (+ (aref crc 5) new)) - (aset crc 5 (aref crc 4)) - (aset crc 4 (aref crc 3)) - (aset crc 3 (+ (aref crc 2) new)) - (aset crc 2 (aref crc 1)) - (aset crc 1 (aref crc 0)) - (aset crc 0 new))) - s) - (setq result (format "%02x%02x%02x%02x%02x%02x%02x" - (aref crc 0) - (aref crc 1) - (aref crc 2) - (aref crc 3) - (aref crc 4) - (aref crc 5) - (aref crc 6))) - result)) - -;; This leaves two characters that could be used to wrap it in `#' or -;; make two filenames from it: one for autosaving, and another for a -;; file containing the name of the autosaved filed, to make hashing -;; reversible. -(defun auto-save-cyclic-hash-12 (s) - "Outputs the 12-characters ascii hex representation of a 6-bytes -cyclic code for burst correction calculated on STRING on a -byte-by-byte basis. The used polynomial is D^6 + D^5 + D^4 + D^3 +1." - (let ((crc (make-string 6 0))) - (mapcar - (function - (lambda (new) - (setq new (+ new (aref crc 5))) - (aset crc 5 (+ (aref crc 4) new)) - (aset crc 4 (+ (aref crc 3) new)) - (aset crc 3 (+ (aref crc 2) new)) - (aset crc 2 (aref crc 1)) - (aset crc 1 (aref crc 0)) - (aset crc 0 new))) - s) - (format "%02x%02x%02x%02x%02x%02x" - (aref crc 0) - (aref crc 1) - (aref crc 2) - (aref crc 3) - (aref crc 4) - (aref crc 5)))) - - - -;;; Recovering files - -(defun recover-all-files (&optional silent) - "Do recover-file for all autosave files which are current. -Only works if you have a non-nil `auto-save-directory'. - -Optional prefix argument SILENT means to be silent about non-current -autosave files. This is useful if invoked automatically at Emacs -startup. - -If `auto-save-offer-delete' is t, this function will offer to delete -old or rejected autosave files. - -Hashed files (see `auto-save-hash-p') are not understood, use -`recover-file' to recover them individually." - (interactive "P") - (let ((savefiles (directory-files auto-save-directory t "^#")) - afile ; the auto save file - file ; its original file - (total 0) ; # of files offered to recover - (count 0)) ; # of files actually recovered - (or (equal auto-save-directory auto-save-directory-fallback) - (setq savefiles - (append savefiles - (directory-files auto-save-directory-fallback t "^#")))) - (while savefiles - (setq afile (car savefiles) - file (auto-save-original-name afile) - savefiles (cdr savefiles)) - (cond ((and file (not (file-newer-than-file-p afile file))) - (message "autosave file \"%s\" is not current." afile) - (sit-for 2)) - (t - (setq total (1+ total)) - (with-output-to-temp-buffer "*Directory*" - (call-process "ls" nil standard-output nil - "-l" afile (if file (list file)))) - (if (yes-or-no-p (format "Recover %s from auto save file? " - file)) - (let* ((obuf (current-buffer)) - (buf (set-buffer - (if file - (find-file-noselect file t) - (generate-new-buffer "*recovered*")))) - (buffer-read-only nil)) - (erase-buffer) - (insert-file-contents afile nil) - (condition-case () - (after-find-file nil) - (error nil)) - (setq buffer-auto-save-file-name nil) - (setq count (1+ count)) - (message "\ -Auto-save off in buffer \"%s\" till you do M-x auto-save-mode." - (buffer-name)) - (set-buffer obuf) - (sit-for 1)) - ;; If not used for recovering, offer to delete - ;; autosave file - (and auto-save-offer-delete - (or (eq 'always auto-save-offer-delete) - (yes-or-no-p - (format "Delete autosave file for `%s'? " file))) - (delete-file afile)))))) - (if (zerop total) - (or silent (message "Nothing to recover.")) - (message "%d/%d file%s recovered." count total (if (= count 1) "" "s")))) - (if (get-buffer "*Directory*") (kill-buffer "*Directory*"))) - -;;; end of auto-save.el
--- a/lisp/efs/default-dir.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/efs/default-dir.el Mon Aug 13 09:15:11 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: default-dir.el ;; RCS: -;; Version: $Revision: 1.2 $ +;; Version: $Revision: 1.3 $ ;; Description: Defines the function default-directory, for fancy handling ;; of the initial contents in the minibuffer when reading ;; file names. @@ -222,7 +222,9 @@ (efs-overwrite-fn "default-dir" 'load-file 'default-dir-load-file) -(require 'view) +(condition-case nil + (require 'view-less) + (error (require 'view))) (defun default-dir-view-file (file) "Documented as original"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/efs/dired-faces.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,89 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; File: dired-faces.el +;; Dired Version: $Revision: 1.1 $ +;; RCS: +;; Description: rudimentary face customization support for dired +;; Author: Mike Sperber <sperber@informatik.uni-tuebingen.de> +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(provide 'dired-faces) + +(require 'custom) + +;;; Variables + +(defgroup dired nil + "Directory editing." + :group 'emacs) + +(defcustom dired-do-highlighting t + "Set if we should use highlighting according to filetype." + :type 'boolean + :group 'dired) + +(defcustom dired-do-interactive-permissions t + "Set if we should allow interactive chmod." + :type 'boolean + :group 'dired) + +(defface dired-face-marked '((((class color)) + (:background "PaleVioletRed")) + (t (:underline t))) + "Face used for marked files." + :group 'dired) + +(defface dired-face-flagged '((((class color)) + (:background "LightSlateGray")) + (t (:underline t))) + "Face used for flagged files." + :group 'dired) + +(defface dired-face-directory '((t (:bold t))) + "Face used for directories." + :group 'dired) + +(defface dired-face-executable '((((class color)) + (:foreground "SeaGreen")) + (t (:bold t))) + "Face used for executables." + :group 'dired) + +(defface dired-face-setuid '((((class color)) + (:foreground "Red")) + (t (:bold t))) + "Face used for setuid executables." + :group 'dired) + +(defface dired-face-boring '((((class color)) + (:foreground "Grey")) + (((class grayscale)) + (:foreground "Grey"))) + "Face used for unimportant files." + :group 'dired) + +(defface dired-face-permissions '((t (:background "grey75") + (:foreground "black"))) + "Face used for interactive permissions." + :group 'dired) + +(defface dired-face-deleted '((((class color)) + (:foreground "yellow3")) + (t (:reverse t))) + "Face used to indicate deleted files." + :group 'dired) + +(defface dired-face-socket '((((class color)) + (:foreground "magenta")) + (t (:bold nil))) + "Face used to indicate sockets." + :group 'dired) + +(defface dired-face-symlink '((((class color)) + (:foreground "cyan")) + (t (:bold t))) + "Face used to indicate symbolic links." + :group 'dired) + +;;; end of dired-faces.el
--- a/lisp/efs/dired-xemacs.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/efs/dired-xemacs.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: dired-xemacs.el -;; Dired Version: $Revision: 1.1 $ +;; Dired Version: $Revision: 1.2 $ ;; RCS: ;; Description: dired functions for XEmacs ;; Author: Mike Sperber <sperber@informatik.uni-tuebingen.de> @@ -10,10 +10,12 @@ (provide 'dired-xemacs) (require 'dired) +(require 'dired-faces) (require 'backquote) -;;; Variables + +;;; Variables not meant for user editing ;; kludge (defun dired-demarkify-regexp (re) @@ -24,12 +26,6 @@ (length re))) re)) -(defvar dired-do-highlighting t - "Set if we should use highlighting according to filetype.") - -(defvar dired-do-interactive-permissions t - "Set if we should allow interactive chmod.") - (defvar dired-re-raw-dir (dired-demarkify-regexp dired-re-dir)) (defvar dired-re-raw-sym (dired-demarkify-regexp dired-re-sym)) (defvar dired-re-raw-exe (dired-demarkify-regexp dired-re-exe)) @@ -46,90 +42,20 @@ (defvar dired-re-raw-setgid (concat "^" dired-re-inode-size - "-[-r][-w][-x][-r][-w][Ss][-r][-w][xst]") + "-[-r][-w][-x][-r][-w][sS][-r][-w][xst]") "setgid plain file (even if not executable)") (defvar dired-re-pre-permissions "^.? ?[0-9 ]*[-d]" "Regexp matching the preamble to file permissions part of a dired line. This shouldn't match socket or symbolic link lines (which aren't editable).") -(defvar dired-re-permissions "[-r][-w][-Ssx][-r][-w][-sx][-r][-w][-xst]" +(defvar dired-re-permissions "[-r][-w][-Ssx][-r][-w][-Ssx][-r][-w][-xst]" "Regexp matching the file permissions part of a dired line.") ;;; Setup (setq dired-modeline-tracking-cmds '(mouse-track)) -;;; Make needed faces if the user hasn't already done so. -;;; Respect X resources (`make-face' uses them when they exist). - -(let ((change-it - (function (lambda (face) - (or (if (fboundp 'facep) - (facep face) - (memq face (face-list))) - (make-face face)) - (not (face-differs-from-default-p face)))))) - - (if (funcall change-it 'dired-face-marked) - (progn - (set-face-background 'dired-face-marked "PaleVioletRed" - 'global '(color) 'append) - (set-face-underline-p 'dired-face-marked t - 'global '(mono) 'append) - (set-face-underline-p 'dired-face-marked t - 'global '(grayscale) 'append))) - (if (funcall change-it 'dired-face-deleted) - (progn - (set-face-background 'dired-face-deleted "LightSlateGray" - 'global '(color) 'append) - (set-face-underline-p 'dired-face-deleted t - 'global '(mono) 'append) - (set-face-underline-p 'dired-face-deleted t - 'global '(grayscale) 'append))) - (if (funcall change-it 'dired-face-directory) - (make-face-bold 'dired-face-directory)) - (if (funcall change-it 'dired-face-executable) - (progn - (set-face-foreground 'dired-face-executable "SeaGreen" - 'global '(color) 'append) - (make-face-bold 'dired-face-executable))) - (if (funcall change-it 'dired-face-setuid) - (progn - (set-face-foreground 'dired-face-setuid "Red" - 'global '(color) 'append) - (make-face-bold 'dired-face-setuid))) - (if (funcall change-it 'dired-face-socket) - (progn - (set-face-foreground 'dired-face-socket "Gold" - 'global '(color) 'append) - (make-face-italic 'dired-face-socket))) - (if (funcall change-it 'dired-face-symlink) - (progn - (set-face-foreground 'dired-face-symlink "MediumBlue" - 'global '(color) 'append) - (make-face-bold 'dired-face-symlink))) - - (if (funcall change-it 'dired-face-boring) - (progn - (set-face-foreground 'dired-face-boring "Grey" - 'global '(color) 'append) - (set-face-background-pixmap - 'dired-face-boring - [xbm :data (32 2 "\125\125\125\125\252\252\252\252")] - 'global '(mono) 'append) - (set-face-background-pixmap - 'dired-face-boring - [xbm :data (32 2 "\125\125\125\125\252\252\252\252")] - 'global '(grayscale) 'append))) - (if (funcall change-it 'dired-face-permissions) - (progn - (set-face-foreground 'dired-face-permissions "MediumOrchid" - 'global '(color) 'append) - (set-face-underline-p 'dired-face-deleted t - 'global '(mono) 'append) - (set-face-underline-p 'dired-face-deleted t - 'global '(grayscale) 'append)))) ;;; Menus @@ -569,7 +495,7 @@ ((char-equal dired-default-marker mark) 'dired-face-marked) ((char-equal dired-del-marker mark) - 'dired-face-deleted) + 'dired-face-flagged) (t 'default)))) (set-extent-face extent @@ -658,7 +584,7 @@ ;; This is probably overdoing it. ;; Someone give me lexical scoping here ... -(defun dired-setup-chmod-keymap (domain id keys) +(defun dired-setup-chmod-keymap (domain id keys &optional toggle-keys) (let* ((names (mapcar (function @@ -692,7 +618,7 @@ (interactive) (cond ((looking-at "-") (dired-do-interactive-chmod ,(concat (list domain ?+ (car keys))))) - ,@(let ((l keys) + ,@(let ((l (or toggle-keys keys)) (c '())) (while l (setq c @@ -704,7 +630,9 @@ (concat (list domain ?+ (cadr l)))))) c)) (setq l (cdr l))) - (reverse c))))) + (reverse c)) + (t (dired-do-interactive-chmod + ,(concat (list domain ?+ (car keys)))))))) (eval `(defun ,mouse-toggle-name (event) @@ -762,13 +690,13 @@ (setq dired-u-r-keymap (dired-setup-chmod-keymap ?u ?r '(?r)) dired-u-w-keymap (dired-setup-chmod-keymap ?u ?w '(?w)) - dired-u-x-keymap (dired-setup-chmod-keymap ?u ?x '(?s ?S ?x)) + dired-u-x-keymap (dired-setup-chmod-keymap ?u ?x '(?x ?s ?S) '(?x)) dired-g-r-keymap (dired-setup-chmod-keymap ?g ?r '(?r)) dired-g-w-keymap (dired-setup-chmod-keymap ?g ?w '(?w)) - dired-g-x-keymap (dired-setup-chmod-keymap ?g ?x '(?s ?x)) + dired-g-x-keymap (dired-setup-chmod-keymap ?g ?x '(?x ?s ?S) '(?x)) dired-o-r-keymap (dired-setup-chmod-keymap ?o ?r '(?r)) dired-o-w-keymap (dired-setup-chmod-keymap ?o ?w '(?w)) - dired-o-x-keymap (dired-setup-chmod-keymap ?o ?x '(?s ?t ?x)))) + dired-o-x-keymap (dired-setup-chmod-keymap ?o ?x '(?x ?s ?t) '(?x)))) (defun dired-make-permissions-interactive (beg) (save-excursion
--- a/lisp/efs/dired.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/efs/dired.el Mon Aug 13 09:15:11 2007 +0200 @@ -5,7 +5,7 @@ ;; ;; File: dired.el ;; RCS: -;; Dired Version: $Revision: 1.2 $ +;; Dired Version: $Revision: 1.3 $ ;; Description: The DIRectory EDitor is for manipulating, and running ;; commands on files in a directory. ;; Authors: FSF, @@ -36,7 +36,7 @@ ;;; Dired Version -(defconst dired-version (substring "$Revision: 1.2 $" 11 -2) +(defconst dired-version (substring "$Revision: 1.3 $" 11 -2) "The revision number of Tree Dired (as a string). Don't forget to mention this when reporting bugs to: @@ -1254,8 +1254,6 @@ (define-key dired-mode-map "\M-v" 'dired-scroll-down) (define-key dired-mode-map "\M-<" 'dired-beginning-of-buffer) (define-key dired-mode-map "\M->" 'dired-end-of-buffer) - ;; This is silly, I'm changing it. -sb - ;; (define-key dired-mode-map "\C-m" 'dired-goto-file) (define-key dired-mode-map "\C-m" 'dired-advertised-find-file) ;; motion by subdirectories (define-key dired-mode-map "^" 'dired-up-directory)
--- a/lisp/efs/efs-cu.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/efs/efs-cu.el Mon Aug 13 09:15:11 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-cu.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: $Revision: 1.3 $ ;; RCS: ;; Description: Common utilities needed by efs files. ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> @@ -55,7 +55,7 @@ (defconst efs-cu-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "$Revision: 1.3 $" 11 -2))) (defconst efs-case-insensitive-host-types '(vms cms mts ti-twenex ti-explorer dos mvs tops-20 mpe ka9q dos-distinct
--- a/lisp/efs/efs-dired.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/efs/efs-dired.el Mon Aug 13 09:15:11 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-dired.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: $Revision: 1.3 $ ;; RCS: ;; Description: Extends much of Dired to work under efs. ;; Authors: Sebastian Kremer <sk@thp.uni-koeln.de>, @@ -25,7 +25,7 @@ (defconst efs-dired-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "$Revision: 1.3 $" 11 -2))) ;;;; ---------------------------------------------------------------- ;;;; User Configuration Variables
--- a/lisp/efs/efs-kerberos.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/efs/efs-kerberos.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,9 +1,9 @@ ;; -*-Emacs-Lisp-*- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -;; File: efs-efs-kerberos.el +;; File: efs-kerberos.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: $Revision: 1.2 $ ;; RCS: ;; Description: Support for Kerberos gateways. ;; Author: Sandy Rutherford <sandy@gandalf.sissa.it> @@ -21,7 +21,7 @@ (defconst efs-kerberos-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "$Revision: 1.2 $" 11 -2))) ;;; Internal Variables
--- a/lisp/efs/efs-x19.15.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/efs/efs-x19.15.el Mon Aug 13 09:15:11 2007 +0200 @@ -2,8 +2,8 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: efs-x19.15.el -;; Release: $efs release: 1.14 $ -;; Version: $Revision: 1.1 $ +;; Release: $efs release: 1.15 $ +;; Version: $Revision: 1.2 $ ;; RCS: ;; Description: efs support for XEmacs, versions 19.15, and later. ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> @@ -18,9 +18,9 @@ (require 'efs-ovwrt) (defconst efs-x19\.15-version - (concat (substring "$efs release: 1.14 $" 14 -2) + (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "$Revision: 1.2 $" 11 -2))) ;;; Functions requiring special defs. for these XEmacs versions.
--- a/lisp/efs/efs.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/efs/efs.el Mon Aug 13 09:15:11 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: $Revision: 1.3 $ ;; RCS: ;; Description: Transparent FTP support for the original GNU Emacs ;; from FSF and Lucid Emacs @@ -97,7 +97,8 @@ ;;; ;;; (require 'efs) ;;; -;;; in your .emacs file. +;;; in your .emacs file. Note this takes awhile, and some users have +;;; found this to be unbearably slow. Therefore ... ;;; ;;; If you would like efs to be autoloaded when you attempt to access ;;; a remote file, put @@ -905,7 +906,7 @@ ;;; efs|Andy Norman and Sandy Rutherford ;;; |ange@hplb.hpl.hp.com and sandy@ibm550.sissa.it ;;; |transparent FTP Support for GNU Emacs -;;; |$Date: 1997/02/15 22:20:36 $|$efs release: 1.15 beta $| +;;; |$Date: 1997/02/24 01:13:11 $|$efs release: 1.15 beta $| ;;; Host and listing type notation: ;;; @@ -1052,7 +1053,7 @@ (defconst efs-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "$Revision: 1.3 $" 11 -2))) (defconst efs-time-zero 1970) ; we count time from midnight, Jan 1, 1970 GMT. @@ -7438,8 +7439,6 @@ (efs-internal-file-name-extension filename))) (type (efs-xfer-type host-type filename nil nil)) (abbr (efs-relativize-filename filename)) - (temp (concat (car (efs-make-tmp-name nil host)) - (or (substring abbr (string-match "\\." abbr)) ""))) (i-f-c-size 0)) (unwind-protect
--- a/lisp/gnus/ChangeLog Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/ChangeLog Mon Aug 13 09:15:11 2007 +0200 @@ -1,3 +1,173 @@ +Thu Feb 20 04:16:50 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no> + + * gnus.el: Gnus v5.4.15 is released. + +Thu Feb 20 03:28:00 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * gnus-xmas.el (gnus-xmas-mode-line-buffer-identification): + Respect non-standard mode line settings. + + * gnus-group.el (gnus-group-line-format): Doc fix. + + * nndoc.el (nndoc-rfc934-type-p): New function. + (nndoc-type-alist): Define RFC934 type. + +Wed Feb 19 05:18:06 1997 Hrvoje Niksic <hniksic@srce.hr> + + * gnus-group.el (gnus-group-set-mode-line): Mark the change with + two asterisks. + +Thu Feb 20 03:19:28 1997 Joev Dubach <dubach1@husc.harvard.edu> + + * gnus-topic.el (gnus-topic-prepare-topic): Show empty topics. + +Thu Feb 20 02:30:27 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * gnus-group.el (gnus-group-process-prefix): Use + `gnus-region-active-p'. + + * gnus-score.el (gnus-hierarchial-home-score-file): Respect short + file names. + (gnus-hierarchial-home-adapt-file): Ditto. + +Wed Feb 19 00:44:41 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * nnml.el (nnml-request-regenerate): Return t. + + * gnus-srvr.el (gnus-server-regenerate-server): Better messaging. + + * gnus.el: Autoload gnus-quote-arg-for-sh-or-csh. + +Tue Feb 18 23:26:28 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no> + + * gnus.el: Gnus v5.4.14 is released. + +Tue Feb 18 21:47:18 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * gnus-xmas.el (gnus-xmas-modeline-glyph): Didn't work when the + etc dir couldn't be found. + + * gnus-topic.el (gnus-topic-fold): Enter into dribble. + + * nnbabyl.el (nnbabyl-request-scan): Put things in right dir. + * nnmbox.el (nnmbox-request-scan): Ditto. + + * gnus-sum.el (gnus-offer-save-summaries): Use + `switch-to-buffer'. + + * nnkiboze.el (nnkiboze-enter-nov): Removed debug. + + * gnus-sum.el (gnus-summary-insert-pseudos): Quote when not + viewing separately. + +Sun Feb 16 23:43:19 1997 Hrvoje Niksic <hniksic@srce.hr> + + * gnus-topic.el (gnus-topic-edit-parameters): Print the topic + name. + + * gnus-group.el (gnus-group-edit-group): Print the group name. + +Sun Feb 16 18:30:27 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * gnus-score.el (gnus-score-adaptive): Respect score adapt + settings. + + * gnus-sum.el (gnus-summary-prev-page): Search all frames for + window. + (gnus-summary-next-page): Ditto. + +Sun Feb 16 18:12:01 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no> + + * gnus.el: Gnus v5.4.13 is released. + +Sun Feb 16 16:20:33 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * gnus-nocem.el (gnus-nocem-scan-groups): Allow NULL references. + + * message.el (message-make-caesar-translation-table): New function. + (message-caesar-region): Use it. + + * messagexmas.el (message-xmas-make-caesar-translation-table): New + function. + + * gnus-art.el (gnus-article-add-buttons): Respect previous + buttons. + (gnus-button-in-region-p): New function. + (gnus-article-add-buttons): Use it. + + * nnweb.el (nnweb-max-hits): Fixed default. + +Tue Feb 11 20:25:42 1997 Hrvoje Niksic <hniksic@srce.hr> + + * gnus-srvr.el (gnus-server-regenerate-server): Typo. + +Sun Feb 16 15:24:40 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * message.el: Removed `message-point-at-bol' and `eol'. + + * gnus-start.el (gnus-read-active-file): Allow FORCE argument. + (gnus-check-bogus-newsgroups): Use it. + + * gnus-srvr.el (gnus-server-copy-server): Allow copying of + unreadable servers. + +Thu Feb 13 19:44:33 1997 Steven L Baur <steve@altair.xemacs.org> + + * gnus-util.el (gnus-output-to-mail): Make sure `From ' lines in + saved messages are preceded by a newline. + +Wed Feb 12 05:28:32 1997 Zlatko Calusic <zcalusic@srce.hr> + + * gnus-sum.el (gnus-summary-copy-article): Use TO-NEWSGROUP. + +Sat Feb 15 21:48:23 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * nnmail.el: Organized customization options. + * gnus.el: Updated. + +Wed Feb 12 18:06:11 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * gnus-kill.el: Reorganized customization + options. + * gnus-sum.el: Ditto. + * gnus-score.el: Ditto. + * gnus-start.el: Ditto. + * gnus.el: Ditto. + +Fri Feb 14 09:30:42 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * gnus-art.el (article-strip-multiple-blank-lines): Inhibit + point-motion hooks. + (article-hide-pgp): Don't hide the leading newline. + + * gnus-group.el (gnus-group-quick-select-group): Bind + gnus-home-score-file to nil. + + * gnus-start.el (gnus-dribble-read-file): Changed prompt. + +Wed Feb 12 09:39:53 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * nnmail.el (nnmail-get-new-mail): Make sure we're using directory + file names. + +Tue Feb 11 14:00:56 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * message.el (message-followup): Respect Posted-To. + +Tue Feb 11 08:15:38 1997 Rich Pieri <rich.pieri@prescienttech.com> + + * nnmail.el (nnmail-pop3-movemail): New function. + +Tue Feb 11 03:44:43 1997 Karl Kleinpaste <karl@jprc.com> + + * gnus-art.el (gnus-emphasis-alist): Made compounds available + again. + +Mon Feb 10 08:54:09 1997 Steven L Baur <steve@altair.xemacs.org> + + * dgnushack.el (dgnushack-compile): XEmacs doesn't complain about + portability variables any more. + Mon Feb 10 14:19:55 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no> * gnus.el: Gnus v5.4.12 is released.
--- a/lisp/gnus/custom-opt.el Mon Aug 13 09:13:58 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -;;; custom-opt.el --- An option group. -;; -;; Copyright (C) 1996 Free Software Foundation, Inc. -;; -;; Author: Per Abrahamsen <abraham@dina.kvl.dk> -;; Keywords: help, faces -;; Version: 1.24 -;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ - -;;; Code: - -(require 'custom) - -(defgroup options nil - "This group contains often used customization options." - :group 'emacs) - -(defvar custom-options - '((line-number-mode boolean) - (column-number-mode boolean) - (debug-on-error boolean) - (debug-on-quit boolean) - (case-fold-search boolean) - (case-replace boolean) - (transient-mark-mode boolean)) - "Alist of customization options. -The first element of each entry should be a variable name, the second -a widget type.") - -(let ((options custom-options) - option name type) - (while options - (setq option (car options) - options (cdr options) - name (nth 0 option) - type (nth 1 option)) - (put name 'custom-type type) - (custom-add-to-group 'options name 'custom-variable)) - (run-hooks 'custom-define-hook)) - -;;; The End. - -(provide 'custom-opt) - -;; custom-edit.el ends here
--- a/lisp/gnus/dgnushack.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/dgnushack.el Mon Aug 13 09:15:11 2007 +0200 @@ -60,9 +60,6 @@ (cond ((or (string= file "custom.el") (string= file "browse-url.el")) (setq byte-compile-warnings nil)) - (xemacs - (setq byte-compile-warnings - '(free-vars unresolved callargs redefine))) (t (setq byte-compile-warnings '(free-vars unresolved callargs redefine obsolete))))
--- a/lisp/gnus/gnus-art.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/gnus-art.el Mon Aug 13 09:15:11 2007 +0200 @@ -179,11 +179,10 @@ '(("_" "_" underline) ("/" "/" italic) ("\\*" "\\*" bold) - ;;("_/" "/_" underline-italic) - ;;("_\\*" "\\*_" underline-bold) + ("_/" "/_" underline-italic) + ("_\\*" "\\*_" underline-bold) ("\\*/" "/\\*" bold-italic) - ;;("_\\*/" "/\\*_" underline-bold-italic) - ))) + ("_\\*/" "/\\*_" underline-bold-italic)))) `(("\\(\\s-\\|^\\)\\(_\\(\\(\\w\\|_[^_]\\)+\\)_\\)\\(\\s-\\|[?!.,;]\\)" 2 3 gnus-emphasis-underline) ,@(mapcar @@ -931,7 +930,8 @@ (goto-char (point-min)) ;; Hide the "header". (when (search-forward "\n-----BEGIN PGP SIGNED MESSAGE-----\n" nil t) - (gnus-article-hide-text-type (match-beginning 0) (match-end 0) 'pgp)) + (gnus-article-hide-text-type (1+ (match-beginning 0)) + (match-end 0) 'pgp)) (setq beg (point)) ;; Hide the actual signature. (and (search-forward "\n-----BEGIN PGP SIGNATURE-----\n" nil t) @@ -1010,13 +1010,16 @@ "Replace consecutive blank lines with one empty line." (interactive) (save-excursion - (let (buffer-read-only) + (let ((inhibit-point-motion-hooks t) + buffer-read-only) ;; First make all blank lines empty. (goto-char (point-min)) + (search-forward "\n\n" nil t) (while (re-search-forward "^[ \t]+$" nil t) (replace-match "" nil t)) ;; Then replace multiple empty lines with a single empty line. (goto-char (point-min)) + (search-forward "\n\n" nil t) (while (re-search-forward "\n\n\n+" nil t) (replace-match "\n\n" t t))))) @@ -2459,9 +2462,9 @@ :type 'regexp) (defcustom gnus-button-alist - `(("\\(\\b<\\(url: ?\\)?news:\\([^>\n\t ]*\\)>\\)" 1 t - gnus-button-message-id 3) - ("\\bnews:\\([^\n\t ]+\\)" 0 t gnus-button-message-id 1) + `(("<\\(url: ?\\)?news:\\([^>\n\t ]*@[^>\n\t ]*\\)>" 0 t + gnus-button-message-id 2) + ("\\bnews:\\([^>\n\t ]*@[^>\n\t ]*+\\)" 0 t gnus-button-message-id 1) ("\\(\\b<\\(url: ?\\)?news:\\(//\\)?\\([^>\n\t ]*\\)>\\)" 1 t gnus-button-fetch-group 4) ("\\bnews:\\(//\\)?\\([^>\n\t ]+\\)" 0 t gnus-button-fetch-group 2) @@ -2674,6 +2677,10 @@ (gnus-article-add-button start (1- end) 'gnus-signature-toggle end))))))) +(defun gnus-button-in-region-p (b e prop) + "Say whether PROP exists in the region." + (text-property-not-all b e prop nil)) + (defun gnus-article-add-buttons (&optional force) "Find external references in the article and make buttons of them. \"External references\" are things like Message-IDs and URLs, as @@ -2703,7 +2710,7 @@ (from (match-beginning 0))) (when (and (or (eq t (nth 1 entry)) (eval (nth 1 entry))) - (not (get-text-property (point) 'gnus-callback))) + (not (gnus-button-in-region-p from end 'gnus-callback))) ;; That optional form returned non-nil, so we add the ;; button. (gnus-article-add-button @@ -2818,14 +2825,19 @@ (defun gnus-button-fetch-group (address) "Fetch GROUP specified by ADDRESS." - (if (not (string-match "^\\([^:/]+\\)\\(:\\([^/]+\\)\\)?/\\(.*\\)$" address)) - (error "Can't parse %s" address) - (gnus-group-read-ephemeral-group - (match-string 4 address) - `(nntp ,(match-string 1 address) (nntp-address ,(match-string 1 address)) - (nntp-port-number ,(if (match-end 3) - (match-string 3 address) - "nntp")))))) + (if (not (string-match "[:/]" address)) + ;; This is just a simple group url. + (gnus-group-read-ephemeral-group address gnus-select-method) + (if (not (string-match "^\\([^:/]+\\)\\(:\\([^/]+\\)/\\)?\\(.*\\)$" + address)) + (error "Can't parse %s" address) + (gnus-group-read-ephemeral-group + (match-string 4 address) + `(nntp ,(match-string 1 address) + (nntp-address ,(match-string 1 address)) + (nntp-port-number ,(if (match-end 3) + (match-string 3 address) + "nntp"))))))) (defun gnus-split-string (string pattern) "Return a list of substrings of STRING which are separated by PATTERN."
--- a/lisp/gnus/gnus-group.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/gnus-group.el Mon Aug 13 09:15:11 2007 +0200 @@ -155,7 +155,7 @@ %l Whether there are GroupLens predictions for this group (string) %n Select from where (string) %z A string that look like `<%s:%n>' if a foreign select method is used -?d The date the group was last entered. +%d The date the group was last entered. %u User defined specifier. The next character in the format string should be a letter. Gnus will call the function gnus-user-format-function-X, where X is the letter following %u. The function will be passed the @@ -1208,7 +1208,7 @@ (mode-string (eval gformat))) ;; Say whether the dribble buffer has been modified. (setq mode-line-modified - (if modified "---*- " "----- ")) + (if modified "--**- " "----- ")) ;; If the line is too long, we chop it off. (when (> (length mode-string) max-len) (setq mode-string (substring mode-string 0 (- max-len 4)))) @@ -1413,10 +1413,7 @@ (setq n (1- n)) (gnus-group-next-group way))) (nreverse groups))) - ((and (boundp 'transient-mark-mode) - transient-mark-mode - (boundp 'mark-active) - mark-active) + ((gnus-region-active-p) ;; Work on the region between point and mark. (let ((max (max (point) (mark))) groups) @@ -1501,6 +1498,7 @@ (require 'gnus-score) (let (gnus-visual gnus-score-find-score-files-function + gnus-home-score-file gnus-apply-kill-hook gnus-summary-expunge-below) (gnus-group-read-group all t))) @@ -1882,11 +1880,12 @@ (t info)) ;; The proper documentation. (format - "Editing the %s." + "Editing the %s for `%s'." (cond ((eq part 'method) "select method") ((eq part 'params) "group parameters") - (t "group info"))) + (t "group info")) + group) `(lambda (form) (gnus-group-edit-group-done ',part ,group form)))))
--- a/lisp/gnus/gnus-kill.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/gnus-kill.el Mon Aug 13 09:15:11 2007 +0200 @@ -32,22 +32,23 @@ (defcustom gnus-kill-file-mode-hook nil "Hook for Gnus kill file mode." - :group 'gnus-score + :group 'gnus-score-kill :type 'hook) (defcustom gnus-kill-expiry-days 7 "*Number of days before expiring unused kill file entries." - :group 'gnus-score + :group 'gnus-score-kill + :group 'gnus-score-expire :type 'integer) (defcustom gnus-kill-save-kill-file nil "*If non-nil, will save kill files after processing them." - :group 'gnus-score + :group 'gnus-score-kill :type 'boolean) (defcustom gnus-winconf-kill-file nil "What does this do, Lars?" - :group 'gnus-score + :group 'gnus-score-kill :type 'sexp) (defcustom gnus-kill-killed t @@ -55,7 +56,7 @@ If it is nil, Gnus will never apply kill files to articles that have already been through the scoring process, which might very well save lots of time." - :group 'gnus-score + :group 'gnus-score-kill :type 'boolean)
--- a/lisp/gnus/gnus-nocem.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/gnus-nocem.el Mon Aug 13 09:15:11 2007 +0200 @@ -145,7 +145,9 @@ ;; ignore scanning followups. (and (string-match "@@NCM" (mail-header-subject header)) (or gnus-nocem-liberal-fetch - (and (string= "" (mail-header-references header)) + (and (or (string= "" (mail-header-references + header)) + (null (mail-header-references header))) (not (member (mail-header-message-id header) gnus-nocem-seen-message-ids)))) (gnus-nocem-check-article group header)))))))
--- a/lisp/gnus/gnus-score.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/gnus-score.el Mon Aug 13 09:15:11 2007 +0200 @@ -43,7 +43,7 @@ (setq gnus-global-score-files '(\"/ftp.ifi.uio.no:/pub/larsi/ding/score/soc.motss.SCORE\" \"/ftp.some-where:/pub/score\"))" - :group 'gnus-score + :group 'gnus-score-files :type '(repeat file)) (defcustom gnus-score-file-single-match-alist nil @@ -58,7 +58,7 @@ These score files are loaded in addition to any files returned by gnus-score-find-score-files-function (which see)." - :group 'gnus-score + :group 'gnus-score-files :type '(repeat (cons regexp (repeat file)))) (defcustom gnus-score-file-multiple-match-alist nil @@ -74,17 +74,18 @@ These score files are loaded in addition to any files returned by gnus-score-find-score-files-function (which see)." - :group 'gnus-score + :group 'gnus-score-files :type '(repeat (cons regexp (repeat file)))) (defcustom gnus-score-file-suffix "SCORE" "Suffix of the score files." - :group 'gnus-score + :group 'gnus-score-files :type 'string) (defcustom gnus-adaptive-file-suffix "ADAPT" "Suffix of the adaptive score files." - :group 'gnus-score + :group 'gnus-score-files + :group 'gnus-score-adapt :type 'string) (defcustom gnus-score-find-score-files-function 'gnus-score-find-bnews @@ -104,7 +105,7 @@ This variable can also be a list of functions to be called. Each function should either return a list of score files, or a list of score alists." - :group 'gnus-score + :group 'gnus-score-files :type '(radio (function-item gnus-score-find-single) (function-item gnus-score-find-hierarchical) (function-item gnus-score-find-bnews) @@ -112,13 +113,13 @@ (defcustom gnus-score-interactive-default-score 1000 "*Scoring commands will raise/lower the score with this number as the default." - :group 'gnus-score + :group 'gnus-score-default :type 'integer) (defcustom gnus-score-expiry-days 7 "*Number of days before unused score file entries are expired. If this variable is nil, no score file entries will be expired." - :group 'gnus-score + :group 'gnus-score-expire :type '(choice (const :tag "never" nil) number)) @@ -126,34 +127,34 @@ "*In non-nil, update matching score entry dates. If this variable is nil, then score entries that provide matches will be expired along with non-matching score entries." - :group 'gnus-score + :group 'gnus-score-expire :type 'boolean) (defcustom gnus-orphan-score nil "*All orphans get this score added. Set in the score file." - :group 'gnus-score + :group 'gnus-score-default :type 'integer) (defcustom gnus-decay-scores nil "*If non-nil, decay non-permanent scores." - :group 'gnus-score + :group 'gnus-score-decay :type 'boolean) (defcustom gnus-decay-score-function 'gnus-decay-score "*Function called to decay a score. It is called with one parameter -- the score to be decayed." - :group 'gnus-score + :group 'gnus-score-decay :type '(radio (function-item gnus-decay-score) (function :tag "Other"))) (defcustom gnus-score-decay-constant 3 "*Decay all \"small\" scores with this amount." - :group 'gnus-score + :group 'gnus-score-decay :type 'integer) (defcustom gnus-score-decay-scale .05 "*Decay all \"big\" scores with this factor." - :group 'gnus-score + :group 'gnus-score-decay :type 'number) (defcustom gnus-home-score-file nil @@ -186,7 +187,7 @@ The list will be traversed from the beginning towards the end looking for matches." - :group 'gnus-score + :group 'gnus-score-files :type '(choice string (repeat (choice string (cons regexp (repeat file)) @@ -196,7 +197,8 @@ (defcustom gnus-home-adapt-file nil "Variable to control where new adaptive score entries are to go. This variable allows the same syntax as `gnus-home-score-file'." - :group 'gnus-score + :group 'gnus-score-adapt + :group 'gnus-score-files :type '(choice string (repeat (choice string (cons regexp (repeat file)) @@ -211,7 +213,7 @@ (gnus-killed-mark (from -1) (subject -20)) (gnus-del-mark (from -2) (subject -15))) "Alist of marks and scores." -:group 'gnus-score +:group 'gnus-score-adapt :type '(repeat (cons (symbol :tag "Mark") (repeat (list (choice :tag "Header" (const from) @@ -221,7 +223,7 @@ (defcustom gnus-ignored-adaptive-words nil "List of words to be ignored when doing adaptive word scoring." - :group 'gnus-score + :group 'gnus-score-adapt :type '(repeat string)) (defcustom gnus-default-ignored-adaptive-words @@ -240,7 +242,7 @@ "both" "true" "off" "say" "another" "state" "might" "under" "start" "try" "re") "Default list of words to be ignored when doing adaptive word scoring." - :group 'gnus-score + :group 'gnus-score-adapt :type '(repeat string)) (defcustom gnus-default-adaptive-word-score-alist @@ -249,13 +251,13 @@ (,gnus-killed-mark . -20) (,gnus-del-mark . -15)) "Alist of marks and scores." -:group 'gnus-score +:group 'gnus-score-adapt :type '(repeat (cons (character :tag "Mark") (integer :tag "Score")))) (defcustom gnus-score-mimic-keymap nil "*Have the score entry functions pretend that they are a keymap." - :group 'gnus-score + :group 'gnus-score-default :type 'boolean) (defcustom gnus-score-exact-adapt-limit 10 @@ -266,12 +268,13 @@ than this variable, exact matching will be used. If this variable is nil, exact matching will always be used." - :group 'gnus-score + :group 'gnus-score-adapt :type '(choice (const nil) integer)) (defcustom gnus-score-uncacheable-files "ADAPT$" "All score files that match this regexp will not be cached." - :group 'gnus-score + :group 'gnus-score-adapt + :group 'gnus-score-files :type 'regexp) (defcustom gnus-score-default-header nil @@ -291,7 +294,7 @@ f: followup If nil, the user will be asked for a header." - :group 'gnus-score + :group 'gnus-score-default :type '(choice (const :tag "from" a) (const :tag "subject" s) (const :tag "body" b) @@ -320,7 +323,7 @@ =: equal to number If nil, the user will be asked for a match type." - :group 'gnus-score + :group 'gnus-score-default :type '(choice (const :tag "substring" s) (const :tag "exact string" e) (const :tag "fuzzy string" f) @@ -334,7 +337,7 @@ (defcustom gnus-score-default-fold nil "Use case folding for new score file entries iff not nil." - :group 'gnus-score + :group 'gnus-score-default :type 'boolean) (defcustom gnus-score-default-duration nil @@ -347,14 +350,14 @@ i: immediate If nil, the user will be asked for a duration." - :group 'gnus-score + :group 'gnus-score-default :type '(choice (const :tag "temporary" t) (const :tag "permanent" p) (const :tag "immediate" i))) (defcustom gnus-score-after-write-file-function nil "Function called with the name of the score file just written to disk." - :group 'gnus-score + :group 'gnus-score-files :type 'function) @@ -2050,7 +2053,7 @@ (defun gnus-score-adaptive () "Create adaptive score rules for this newsgroup." - (when gnus-use-adaptive-scoring + (when gnus-newsgroup-adaptive ;; We change the score file to the adaptive score file. (save-excursion (set-buffer gnus-summary-buffer) @@ -2059,8 +2062,8 @@ (gnus-score-file-name gnus-newsgroup-name gnus-adaptive-file-suffix)))) ;; Perform ordinary line scoring. - (when (or (not (listp gnus-use-adaptive-scoring)) - (memq 'line gnus-use-adaptive-scoring)) + (when (or (not (listp gnus-newsgroup-adaptive)) + (memq 'line gnus-newsgroup-adaptive)) (save-excursion (let* ((malist (gnus-copy-sequence gnus-adaptive-score-alist)) (alist malist) @@ -2119,8 +2122,8 @@ (setq data (cdr data)))))) ;; Perform adaptive word scoring. - (when (and (listp gnus-use-adaptive-scoring) - (memq 'word gnus-use-adaptive-scoring)) + (when (and (listp gnus-newsgroup-adaptive) + (memq 'word gnus-newsgroup-adaptive)) (nnheader-temp-write nil (let* ((hashtb (gnus-make-hashtable 1000)) (date (gnus-day-number (current-time-string))) @@ -2702,14 +2705,16 @@ (if (string-match "^[^.]+\\." group) (concat (match-string 0 group) gnus-score-file-suffix) ;; Group name without any dots. - (concat group "." gnus-score-file-suffix))) + (concat group (if (gnus-use-long-file-name 'not-score) "." "/") + gnus-score-file-suffix))) (defun gnus-hierarchial-home-adapt-file (group) "Return the adapt file of the top-level hierarchy of GROUP." (if (string-match "^[^.]+\\." group) (concat (match-string 0 group) gnus-adaptive-file-suffix) ;; Group name without any dots. - (concat group "." gnus-adaptive-file-suffix))) + (concat group (if (gnus-use-long-file-name 'not-score) "." "/") + gnus-adaptive-file-suffix))) ;;; ;;; Score decays
--- a/lisp/gnus/gnus-srvr.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/gnus-srvr.el Mon Aug 13 09:15:11 2007 +0200 @@ -242,8 +242,7 @@ (when entry (gnus-dribble-enter (concat "(gnus-server-set-info \"" server "\" '" - (prin1-to-string (cdr entry)) ") -"))) + (prin1-to-string (cdr entry)) ")\n"))) (when (or entry oentry) ;; Buffer may be narrowed. (save-restriction @@ -401,8 +400,8 @@ (defun gnus-server-copy-server (from to) (interactive (list - (unless (gnus-server-server-name) - (error "No server on the current line")) + (or (gnus-server-server-name) + (error "No server on the current line")) (read-string "Copy to: "))) (unless from (error "No server on current line")) @@ -410,9 +409,10 @@ (error "No name to copy to")) (when (assoc to gnus-server-alist) (error "%s already exists" to)) - (unless (assoc from gnus-server-alist) + (unless (gnus-server-to-method from) (error "%s: no such server" from)) - (let ((to-entry (gnus-copy-sequence (assoc from gnus-server-alist)))) + (let ((to-entry (cons from (gnus-copy-sequence + (gnus-server-to-method from))))) (setcar to-entry to) (setcar (nthcdr 2 to-entry) to) (push to-entry gnus-server-killed-servers) @@ -735,9 +735,10 @@ (if (not (gnus-check-backend-function 'request-regenerate (car (gnus-server-to-method server)))) (error "This backend doesn't support regeneration") - (gnus-message 5 "Requesing regeneration of %s..." server) - (when (gnus-request-regenerate server) - (gnus-message 5 "Requesing regeneration of %s...done" server))))) + (gnus-message 5 "Requesting regeneration of %s..." server) + (if (gnus-request-regenerate server) + (gnus-message 5 "Requesting regeneration of %s...done" server) + (gnus-message 5 "Couldn't regenerate %s" server))))) (provide 'gnus-srvr)
--- a/lisp/gnus/gnus-start.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/gnus-start.el Mon Aug 13 09:15:11 2007 +0200 @@ -69,14 +69,14 @@ "*Non-nil means that Gnus will use a dribble file to store user updates. If Emacs should crash without saving the .newsrc files, complete information can be restored from the dribble file." - :group 'gnus-start + :group 'gnus-dribble-file :type 'boolean) (defcustom gnus-dribble-directory nil "*The directory where dribble files will be saved. If this variable is nil, the directory where the .newsrc files are saved will be used." - :group 'gnus-start + :group 'gnus-dribble-file :type '(choice directory (const nil))) (defcustom gnus-check-new-newsgroups t @@ -120,7 +120,7 @@ "*Non-nil means that Gnus will check and remove bogus newsgroup at startup. If this variable is nil, then you have to tell Gnus explicitly to check for bogus newsgroups with \\<gnus-group-mode-map>\\[gnus-group-check-bogus-groups]." - :group 'gnus-start + :group 'gnus-start-server :type 'boolean) (defcustom gnus-read-active-file t @@ -137,48 +137,48 @@ be told about new newsgroups that arrive. To do that, set `gnus-check-new-newsgroups' to `ask-server'. This may not work properly with all servers." - :group 'gnus-start + :group 'gnus-start-server :type '(choice (const nil) (const some) (const t))) (defcustom gnus-level-subscribed 5 "*Groups with levels less than or equal to this variable are subscribed." - :group 'gnus-start + :group 'gnus-group-levels :type 'integer) (defcustom gnus-level-unsubscribed 7 "*Groups with levels less than or equal to this variable are unsubscribed. Groups with levels less than `gnus-level-subscribed', which should be less than this variable, are subscribed." - :group 'gnus-start + :group 'gnus-group-levels :type 'integer) (defcustom gnus-level-zombie 8 "*Groups with this level are zombie groups." - :group 'gnus-start + :group 'gnus-group-levels :type 'integer) (defcustom gnus-level-killed 9 "*Groups with this level are killed." - :group 'gnus-start + :group 'gnus-group-levels :type 'integer) (defcustom gnus-level-default-subscribed 3 "*New subscribed groups will be subscribed at this level." - :group 'gnus-start + :group 'gnus-group-levels :type 'integer) (defcustom gnus-level-default-unsubscribed 6 "*New unsubscribed groups will be unsubscribed at this level." - :group 'gnus-start + :group 'gnus-group-levels :type 'integer) (defcustom gnus-activate-level (1+ gnus-level-subscribed) "*Groups higher than this level won't be activated on startup. Setting this variable to something low might save lots of time when you have many groups that you aren't interested in." - :group 'gnus-start + :group 'gnus-group-levels :type 'integer) (defcustom gnus-activate-foreign-newsgroups 4 @@ -193,7 +193,7 @@ might take a while. By setting this variable to nil, you'll save time, but you won't be told how many unread articles there are in the groups." - :group 'gnus-start + :group 'gnus-group-levels :type 'integer) (defcustom gnus-save-newsrc-file t @@ -203,7 +203,7 @@ be readily understood by other newsreaders. If you don't plan on using other newsreaders, set this variable to nil to save some time on exit." - :group 'gnus-start + :group 'gnus-newsrc :type 'boolean) (defcustom gnus-save-killed-list t @@ -218,7 +218,7 @@ This variable can also be a regexp. In that case, all groups that do not match this regexp will be removed before saving the list." - :group 'gnus-start + :group 'gnus-newsrc :type 'boolean) (defcustom gnus-ignored-newsgroups @@ -232,7 +232,7 @@ Any lines in the active file matching this regular expression are removed from the newsgroup list before anything else is done to it, thus making them effectively non-existent." - :group 'gnus-start + :group 'gnus-group-new :type 'regexp) (defcustom gnus-subscribe-newsgroup-method 'gnus-subscribe-zombies @@ -244,7 +244,7 @@ in hierarchical newsgroup order; `gnus-subscribe-interactively' asks for your decision; `gnus-subscribe-killed' kills all new groups; `gnus-subscribe-zombies' will make all new groups into zombies." - :group 'gnus-start + :group 'gnus-group-new :type '(radio (function-item gnus-subscribe-randomly) (function-item gnus-subscribe-alphabetically) (function-item gnus-subscribe-hierarchically) @@ -266,7 +266,7 @@ Gnus will the subscribe all new newsgroups in these hierarchies with the subscription method in this variable." - :group 'gnus-start + :group 'gnus-group-new :type '(radio (function-item gnus-subscribe-randomly) (function-item gnus-subscribe-alphabetically) (function-item gnus-subscribe-hierarchically) @@ -284,7 +284,7 @@ If the user pressed `d', Gnus will descend the hierarchy, `y' will subscribe to all newsgroups in the hierarchy and `s' will skip this hierarchy in its entirety." - :group 'gnus-start + :group 'gnus-group-new :type 'boolean) (defcustom gnus-auto-subscribed-groups @@ -296,7 +296,7 @@ New groups that match this regexp will not be handled by `gnus-subscribe-newsgroup-method'. Instead, they will be subscribed using `gnus-subscribe-options-newsgroup-method'." - :group 'gnus-start + :group 'gnus-group-new :type 'regexp) (defcustom gnus-options-subscribe nil @@ -307,7 +307,7 @@ New groups that match this regexp will not be handled by `gnus-subscribe-newsgroup-method'. Instead, they will be subscribed using `gnus-subscribe-options-newsgroup-method'." - :group 'gnus-start + :group 'gnus-group-new :type '(choice regexp (const :tag "none" nil))) @@ -315,7 +315,7 @@ "*All new groups matching this regexp will be ignored. Note that this variable deals only with new newsgroups. This variable does not affect old (already subscribed) newsgroups." - :group 'gnus-start + :group 'gnus-group-new :type '(choice regexp (const :tag "none" nil))) @@ -323,12 +323,12 @@ "*Non-nil means .newsrc should be deleted prior to save. Its use is due to the bogus appearance that .newsrc was modified on disc." - :group 'gnus-start + :group 'gnus-newsrc :type 'boolean) (defcustom gnus-check-bogus-groups-hook nil "A hook run after removing bogus groups." - :group 'gnus-start + :group 'gnus-start-server :type 'hook) (defcustom gnus-startup-hook nil @@ -339,31 +339,31 @@ (defcustom gnus-get-new-news-hook nil "A hook run just before Gnus checks for new news." - :group 'gnus-start + :group 'gnus-group-new :type 'hook) (defcustom gnus-after-getting-new-news-hook (when (gnus-boundp 'display-time-timer) '(display-time-event-handler)) "A hook run after Gnus checks for new news." - :group 'gnus-start + :group 'gnus-group-new :type 'hook) (defcustom gnus-save-newsrc-hook nil "A hook called before saving any of the newsrc files." - :group 'gnus-start + :group 'gnus-newsrc :type 'hook) (defcustom gnus-save-quick-newsrc-hook nil "A hook called just before saving the quick newsrc file. Can be used to turn version control on or off." - :group 'gnus-start + :group 'gnus-newsrc :type 'hook) (defcustom gnus-save-standard-newsrc-hook nil "A hook called just before saving the standard newsrc file. Can be used to turn version control on or off." - :group 'gnus-start + :group 'gnus-newsrc :type 'hook) ;;; Internal variables @@ -757,7 +757,7 @@ (set-file-modes dribble-file modes)) ;; Possibly eval the file later. (when (gnus-y-or-n-p - "Auto-save file exists. Do you want to read it? ") + "Gnus auto-save file exists. Do you want to read it? ") (setq gnus-dribble-eval-file t))))))) (defun gnus-dribble-eval-file () @@ -1216,7 +1216,7 @@ bogus group entry info) (gnus-message 5 "Checking bogus newsgroups...") (unless (gnus-read-active-file-p) - (gnus-read-active-file)) + (gnus-read-active-file t)) (when (gnus-read-active-file-p) ;; Find all bogus newsgroup that are subscribed. (while newsrc @@ -1541,7 +1541,7 @@ (gnus-dribble-touch)) ;; Get the active file(s) from the backend(s). -(defun gnus-read-active-file () +(defun gnus-read-active-file (&optional force) (gnus-group-set-mode-line) (let ((methods (append @@ -1574,7 +1574,8 @@ (gnus-request-scan nil method)) (cond ((and (eq gnus-read-active-file 'some) - (gnus-check-backend-function 'retrieve-groups (car method))) + (gnus-check-backend-function 'retrieve-groups (car method)) + (not force)) (let ((newsrc (cdr gnus-newsrc-alist)) (gmethod (gnus-server-get-method nil method)) groups info)
--- a/lisp/gnus/gnus-sum.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/gnus-sum.el Mon Aug 13 09:15:11 2007 +0200 @@ -159,7 +159,7 @@ (defcustom gnus-summary-default-score 0 "*Default article score level. If this variable is nil, scoring will be disabled." - :group 'gnus-score + :group 'gnus-score-default :type '(choice (const :tag "disable") integer)) @@ -489,7 +489,7 @@ "*Mark all articles with a score below this variable as read. This variable is local to each summary buffer and usually set by the score file." - :group 'gnus-score + :group 'gnus-score-default :type 'integer) (defcustom gnus-article-sort-functions '(gnus-article-sort-by-number) @@ -538,7 +538,7 @@ (defcustom gnus-summary-expunge-below nil "All articles that have a score less than this variable will be expunged." - :group 'gnus-score + :group 'gnus-score-default :type '(choice (const :tag "off" nil) integer)) @@ -547,7 +547,7 @@ See `gnus-thread-score-function' for en explanation of what a \"thread score\" is." :group 'gnus-treading - :group 'gnus-score + :group 'gnus-score-default :type '(choice (const :tag "off" nil) integer)) @@ -1037,30 +1037,6 @@ (equal s1 (gnus-simplify-subject-fully s2))))) -(defun gnus-offer-save-summaries () - "Offer to save all active summary buffers." - (save-excursion - (let ((buflist (buffer-list)) - buffers bufname) - ;; Go through all buffers and find all summaries. - (while buflist - (and (setq bufname (buffer-name (car buflist))) - (string-match "Summary" bufname) - (save-excursion - (set-buffer bufname) - ;; We check that this is, indeed, a summary buffer. - (and (eq major-mode 'gnus-summary-mode) - ;; Also make sure this isn't bogus. - gnus-newsgroup-prepared)) - (push bufname buffers)) - (setq buflist (cdr buflist))) - ;; Go through all these summary buffers and offer to save them. - (when buffers - (map-y-or-n-p - "Update summary buffer %s? " - (lambda (buf) (set-buffer buf) (gnus-summary-exit)) - buffers))))) - (defun gnus-summary-bubble-group () "Increase the score of the current group. This is a handy function to add to `gnus-summary-exit-hook' to @@ -3908,8 +3884,7 @@ (setq mode-string (format (format "%%-%ds" max-len) mode-string)))) ;; Update the mode line. (setq mode-line-buffer-identification - (gnus-mode-line-buffer-identification - (list mode-string))) + (gnus-mode-line-buffer-identification (list mode-string))) (set-buffer-modified-p t)))) (defun gnus-create-xref-hashtb (from-newsgroup headers unreads) @@ -5395,7 +5370,7 @@ (setq gnus-summary-buffer (current-buffer)) (gnus-set-global-variables) (let ((article (gnus-summary-article-number)) - (article-window (get-buffer-window gnus-article-buffer)) + (article-window (get-buffer-window gnus-article-buffer t)) (endp nil)) (gnus-configure-windows 'article) (if (eq (cdr (assq article gnus-newsgroup-reads)) gnus-canceled-mark) @@ -5431,7 +5406,7 @@ (interactive "P") (gnus-set-global-variables) (let ((article (gnus-summary-article-number)) - (article-window (get-buffer-window gnus-article-buffer))) + (article-window (get-buffer-window gnus-article-buffer t))) (gnus-configure-windows 'article) (if (or (null gnus-current-article) (null gnus-article-current) @@ -6688,7 +6663,7 @@ If SELECT-METHOD is non-nil, do not move to a specific newsgroup, but re-spool using this method." (interactive "P") - (gnus-summary-move-article n nil select-method 'copy)) + (gnus-summary-move-article n to-newsgroup select-method 'copy)) (defun gnus-summary-crosspost-article (&optional n) "Crosspost the current article to some other group." @@ -8276,7 +8251,12 @@ (funcall (if (string-match "%s" action) 'format 'concat) action - (mapconcat (lambda (f) f) files " "))))) + (mapconcat + (lambda (f) + (if (equal f " ") + f + (gnus-quote-arg-for-sh-or-csh f))) + files " "))))) (setq ps (cdr ps))))) (if (and gnus-view-pseudos (not not-view)) (while pslist @@ -8533,6 +8513,32 @@ (gnus-get-unread-articles-in-group info (gnus-active group)) t))) +(defun gnus-offer-save-summaries () + "Offer to save all active summary buffers." + (save-excursion + (let ((buflist (buffer-list)) + buffers bufname) + ;; Go through all buffers and find all summaries. + (while buflist + (and (setq bufname (buffer-name (car buflist))) + (string-match "Summary" bufname) + (save-excursion + (set-buffer bufname) + ;; We check that this is, indeed, a summary buffer. + (and (eq major-mode 'gnus-summary-mode) + ;; Also make sure this isn't bogus. + gnus-newsgroup-prepared + ;; Also make sure that this isn't a dead summary buffer. + (not gnus-dead-summary-mode))) + (push bufname buffers)) + (setq buflist (cdr buflist))) + ;; Go through all these summary buffers and offer to save them. + (when buffers + (map-y-or-n-p + "Update summary buffer %s? " + (lambda (buf) (switch-to-buffer buf) (gnus-summary-exit)) + buffers))))) + (provide 'gnus-sum) (run-hooks 'gnus-sum-load-hook)
--- a/lisp/gnus/gnus-topic.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/gnus-topic.el Mon Aug 13 09:15:11 2007 +0200 @@ -430,8 +430,7 @@ gnus-topic-tallied-groups))) (push (gnus-info-group info) gnus-topic-tallied-groups) (incf unread (car entry))) - (when (and (listp entry) - (numberp (car entry))) + (when (listp entry) (setq tick t))) (goto-char beg) ;; Insert the topic line. @@ -490,7 +489,8 @@ (gnus-topic-alist gnus-topic-active-alist) (gnus-group-list-mode (cons 5 t))) (gnus-topic-remove-topic - (or insert (not (gnus-topic-visible-p))) nil nil 9))))))) + (or insert (not (gnus-topic-visible-p))) nil nil 9) + (gnus-topic-enter-dribble))))))) (defun gnus-topic-insert-topic-line (name visiblep shownp level entries &optional unread) @@ -1280,7 +1280,8 @@ (let ((topic (gnus-group-topic-name))) (gnus-edit-form (gnus-topic-parameters topic) - "Editing the topic parameters." + (format "Editing the topic parameters for `%s'." + (or group topic)) `(lambda (form) (gnus-topic-set-parameters ,topic form)))))))
--- a/lisp/gnus/gnus-xmas.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/gnus-xmas.el Mon Aug 13 09:15:11 2007 +0200 @@ -741,22 +741,28 @@ (glyph (make-glyph file))) (when (and (featurep 'x) (file-exists-p file)) - (set-glyph-face glyph 'modeline-buffer-id)) - (set-glyph-property glyph 'image (cons 'tty "Gnus:")) - glyph))) + (set-glyph-face glyph 'modeline-buffer-id) + (set-glyph-property glyph 'image (cons 'tty "Gnus:")) + glyph)))) (defun gnus-xmas-mode-line-buffer-identification (line) (let ((line (car line)) chop) - (if (not (stringp line)) - (list line) - (when (string-match "^Gnus:" line) - (setq chop (match-end 0)) - (list - (if gnus-xmas-modeline-glyph - (cons gnus-xmas-modeline-left-extent gnus-xmas-modeline-glyph) - (cons gnus-xmas-modeline-left-extent (substring line 0 chop))) - (cons gnus-xmas-modeline-right-extent (substring line chop))))))) + (cond + ;; This is some weird type of id. + ((not (stringp line)) + (list line)) + ;; This is non-standard, so we just pass it through. + ((not (string-match "^Gnus:" line)) + (list line)) + ;; We have a standard line, so we colorize and glyphize it a bit. + (t + (setq chop (match-end 0)) + (list + (if gnus-xmas-modeline-glyph + (cons gnus-xmas-modeline-left-extent gnus-xmas-modeline-glyph) + (cons gnus-xmas-modeline-left-extent (substring line 0 chop))) + (cons gnus-xmas-modeline-right-extent (substring line chop))))))) (defun gnus-xmas-splash () (when (eq (device-type) 'x)
--- a/lisp/gnus/gnus.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/gnus.el Mon Aug 13 09:15:11 2007 +0200 @@ -39,6 +39,10 @@ "Starting your favorite newsreader." :group 'gnus) +(defgroup gnus-start-server nil + "Server options at startup." + :group 'gnus-start) + ;; These belong to gnus-group.el. (defgroup gnus-group nil "Group buffers." @@ -50,6 +54,10 @@ :link '(custom-manual "(gnus)Foreign Groups") :group 'gnus-group) +(defgroup gnus-group-new nil + "Automatic subscription of new groups." + :group 'gnus-group) + (defgroup gnus-group-levels nil "Group levels." :link '(custom-manual "(gnus)Group Levels") @@ -152,6 +160,18 @@ "Adaptive score files." :group 'gnus-score) +(defgroup gnus-score-default nil + "Default values for score files." + :group 'gnus-score) + +(defgroup gnus-score-expire nil + "Expiring score rules." + :group 'gnus-score) + +(defgroup gnus-score-decay nil + "Decaying score rules." + :group 'gnus-score) + (defgroup gnus-score-files nil "Score and kill file names." :group 'gnus-score @@ -166,14 +186,19 @@ "Options controling the visual fluff." :group 'gnus) -(defgroup gnus-mail-expire nil - "Expiring articles in mail backends." - :group 'gnus-mail) - (defgroup gnus-files nil "Files used by Gnus." :group 'gnus) +(defgroup gnus-dribble-file nil + "Auto save file." + :link '(custom-manual "(gnus)Auto Save") + :group 'gnus-files) + +(defgroup gnus-newsrc nil + "Storing Gnus state." + :group 'gnus-files) + (defgroup gnus-server nil "Options related to newsservers and other servers used by Gnus." :group 'gnus) @@ -198,7 +223,7 @@ :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) -(defconst gnus-version-number "5.4.12" +(defconst gnus-version-number "5.4.15" "Version number for this version of Gnus.") (defconst gnus-version (format "Gnus v%s" gnus-version-number) @@ -1174,7 +1199,7 @@ "*Groups in which to automatically mark read articles as expirable. If non-nil, this should be a regexp that should match all groups in which to perform auto-expiry. This only makes sense for mail groups." - :group 'gnus-mail-expire + :group 'nnmail-expire :type '(choice (const nil) regexp)) @@ -1184,7 +1209,7 @@ expiring - which means that all read articles will be deleted after \(say) one week. (This only goes for mail groups and the like, of course.)" - :group 'gnus-mail-expire + :group 'nnmail-expire :type '(choice (const nil) regexp)) @@ -1577,7 +1602,7 @@ gnus-uu-decode-uu-and-save-view gnus-uu-decode-unshar-view gnus-uu-decode-unshar-and-save-view gnus-uu-decode-save-view gnus-uu-decode-binhex-view) - ("gnus-uu" gnus-uu-delete-work-dir) + ("gnus-uu" gnus-uu-delete-work-dir gnus-quote-arg-for-sh-or-csh) ("gnus-msg" (gnus-summary-send-map keymap) gnus-article-mail gnus-copy-article-buffer gnus-extended-version) ("gnus-msg" :interactive t
--- a/lisp/gnus/message.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/message.el Mon Aug 13 09:15:11 2007 +0200 @@ -727,6 +727,8 @@ (eval-and-compile (autoload 'message-setup-toolbar "messagexmas") (autoload 'mh-send-letter "mh-comp") + (autoload 'gnus-point-at-eol "gnus-util") + (autoload 'gnus-point-at-bol "gnus-util") (autoload 'gnus-output-to-mail "gnus-util") (autoload 'gnus-output-to-rmail "gnus-util")) @@ -736,22 +738,6 @@ ;;; Utility functions. ;;; -(defun message-point-at-bol () - "Return point at the beginning of the line." - (let ((p (point))) - (beginning-of-line) - (prog1 - (point) - (goto-char p)))) - -(defun message-point-at-eol () - "Return point at the end of the line." - (let ((p (point))) - (end-of-line) - (prog1 - (point) - (goto-char p)))) - (defmacro message-y-or-n-p (question show &rest text) "Ask QUESTION, displaying the rest of the arguments in a temp. buffer if SHOW" `(message-talkative-question 'y-or-n-p ,question ,show ,@text)) @@ -1277,20 +1263,8 @@ ;; We build the table, if necessary. (when (or (not message-caesar-translation-table) (/= (aref message-caesar-translation-table ?a) (+ ?a n))) - (let ((i -1) - (table (make-string 256 0))) - (while (< (incf i) 256) - (aset table i i)) - (setq table - (concat - (substring table 0 ?A) - (substring table (+ ?A n) (+ ?A n (- 26 n))) - (substring table ?A (+ ?A n)) - (substring table (+ ?A 26) ?a) - (substring table (+ ?a n) (+ ?a n (- 26 n))) - (substring table ?a (+ ?a n)) - (substring table (+ ?a 26) 255))) - (setq message-caesar-translation-table table))) + (setq message-caesar-translation-table + (message-make-caesar-translation-table n))) ;; Then we translate the region. Do it this way to retain ;; text properties. (while (< b e) @@ -1299,6 +1273,21 @@ (aref message-caesar-translation-table (char-after b))) (incf b)))) +(defun message-make-caesar-translation-table (n) + "Create a rot table with offset N." + (let ((i -1) + (table (make-string 256 0))) + (while (< (incf i) 256) + (aset table i i)) + (concat + (substring table 0 ?A) + (substring table (+ ?A n) (+ ?A n (- 26 n))) + (substring table ?A (+ ?A n)) + (substring table (+ ?A 26) ?a) + (substring table (+ ?a n) (+ ?a n (- 26 n))) + (substring table ?a (+ ?a n)) + (substring table (+ ?a 26) 255)))) + (defun message-caesar-buffer-body (&optional rotnum) "Caesar rotates all letters in the current buffer by 13 places. Used to encode/decode possibly offensive messages (commonly in net.jokes). @@ -2523,7 +2512,7 @@ (forward-line -1)) ;; The value of this header was empty, so we clear ;; totally and insert the new value. - (delete-region (point) (message-point-at-eol)) + (delete-region (point) (gnus-point-at-eol)) (insert value)) ;; Add the deletable property to the headers that require it. (and (memq header message-deletable-headers) @@ -2928,7 +2917,7 @@ references message-id follow-to (inhibit-point-motion-hooks t) (message-this-is-news t) - followup-to distribution newsgroups gnus-warning) + followup-to distribution newsgroups gnus-warning posted-to) (save-restriction (narrow-to-region (goto-char (point-min)) @@ -2945,6 +2934,7 @@ message-id (message-fetch-field "message-id" t) followup-to (message-fetch-field "followup-to") newsgroups (message-fetch-field "newsgroups") + posted-to (message-fetch-field "posted-to") reply-to (message-fetch-field "reply-to") distribution (message-fetch-field "distribution") mct (message-fetch-field "mail-copies-to")) @@ -2983,7 +2973,9 @@ A typical situation where `Followup-To: poster' is used is when the poster does not read the newsgroup, so he wouldn't see any replies sent to it.")) - (cons 'To (or reply-to from "")) + (progn + (setq message-this-is-news nil) + (cons 'To (or reply-to from ""))) (cons 'Newsgroups newsgroups))) (t (if (or (equal followup-to newsgroups) @@ -3006,6 +2998,8 @@ responses here are directed to other newsgroups.")) (cons 'Newsgroups followup-to) (cons 'Newsgroups newsgroups)))))) + (posted-to + `((Newsgroups . ,posted-to))) (t `((Newsgroups . ,newsgroups)))) ,@(and distribution (list (cons 'Distribution distribution)))
--- a/lisp/gnus/messagexmas.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/messagexmas.el Mon Aug 13 09:15:11 2007 +0200 @@ -97,6 +97,27 @@ font-lock-auto-fontify) (turn-on-font-lock))) +(defun message-xmas-make-caesar-translation-table (n) + "Create a rot table with offset N." + (let ((i -1) + (table (make-string 256 0)) + (a (char-int ?a)) + (A (char-int ?A))) + (while (< (incf i) 256) + (aset table i i)) + (concat + (substring table 0 A) + (substring table (+ A n) (+ A n (- 26 n))) + (substring table A (+ A n)) + (substring table (+ A 26) a) + (substring table (+ a n) (+ a n (- 26 n))) + (substring table a (+ a n)) + (substring table (+ a 26) 255)))) + +(when (>= emacs-major-version 20) + (fset 'message-make-caesar-translation-table + 'message-xmas-make-caesar-translation-table)) + (add-hook 'message-mode-hook 'message-xmas-maybe-fontify) (provide 'messagexmas)
--- a/lisp/gnus/nnbabyl.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/nnbabyl.el Mon Aug 13 09:15:11 2007 +0200 @@ -218,7 +218,8 @@ (save-excursion (set-buffer nnbabyl-mbox-buffer) (save-buffer))) - nnbabyl-mbox-file group + (file-name-directory nnbabyl-mbox-file) + group (lambda () (save-excursion (let ((in-buf (current-buffer)))
--- a/lisp/gnus/nndoc.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/nndoc.el Mon Aug 13 09:15:11 2007 +0200 @@ -37,8 +37,8 @@ (defvoo nndoc-article-type 'guess "*Type of the file. One of `mbox', `babyl', `digest', `news', `rnews', `mmdf', `forward', -`mime-digest', `standard-digest', `slack-digest', `clari-briefs' or -`guess'.") +`rfc934', `mime-digest', `standard-digest', `slack-digest', +`clari-briefs' or `guess'.") (defvoo nndoc-post-type 'mail "*Whether the nndoc group is `mail' or `post'.") @@ -64,6 +64,10 @@ (article-begin . "^-+ Start of forwarded message -+\n+") (body-end . "^-+ End of forwarded message -+$") (prepare-body-function . nndoc-unquote-dashes)) + (rfc934 + (article-begin . "^-.*\n+") + (body-end . "^-.*$") + (prepare-body-function . nndoc-unquote-dashes)) (clari-briefs (article-begin . "^ \\*") (body-end . "^\t------*[ \t]^*\n^ \\*") @@ -407,6 +411,13 @@ (not (re-search-forward "^From:" nil t 2))) t)) +(defun nndoc-rfc934-type-p () + (when (and (re-search-forward "^-+ Start of forwarded.*\n+" nil t) + (not (re-search-forward "^Subject:.*digest" nil t)) + (not (re-search-backward "^From:" nil t 2)) + (not (re-search-forward "^From:" nil t 2))) + t)) + (defun nndoc-clari-briefs-type-p () (when (let ((case-fold-search nil)) (re-search-forward "^\t[^a-z]+ ([^a-z]+) --" nil t))
--- a/lisp/gnus/nnkiboze.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/nnkiboze.el Mon Aug 13 09:15:11 2007 +0200 @@ -314,7 +314,6 @@ (save-excursion (set-buffer buffer) (goto-char (point-max)) - (debug) (let ((xref (mail-header-xref header)) (prefix (gnus-group-real-prefix group)) (oheader (copy-sequence header))
--- a/lisp/gnus/nnmail.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/nnmail.el Mon Aug 13 09:15:11 2007 +0200 @@ -31,10 +31,43 @@ (eval-when-compile (require 'cl)) (require 'custom) -(defgroup gnus-mail nil - "Mailreading.." +(defgroup nnmail nil + "Reading mail with Gnus." :group 'gnus) +(defgroup nnmail-retrieve nil + "Retrieving new mail." + :group 'nnmail) + +(defgroup nnmail-prepare nil + "Preparing (or mangling) new mail after retrival." + :group 'nnmail) + +(defgroup nnmail-duplicate nil + "Handling of duplicate mail messages." + :group 'nnmail) + +(defgroup nnmail-split nil + "Organizing the incomming mail in folders." + :group 'nnmail) + +(defgroup nnmail-files nil + "Mail files." + :group 'gnus-files + :group 'nnmail) + +(defgroup nnmail-expire nil + "Expiring old mail." + :group 'nnmail) + +(defgroup nnmail-procmail nil + "Interfacing with procmail and other mail agents." + :group 'nnmail) + +(defgroup nnmail-various nil + "Various mail options." + :group 'nnmail) + (defcustom nnmail-split-methods '(("mail.misc" "")) "Incoming mail will be split according to this variable. @@ -62,7 +95,7 @@ The last element should always have \"\" as the regexp. This variable can also have a function as its value." - :group 'gnus-mail + :group 'nnmail-split :type '(choice (repeat :tag "Alist" (group (string :tag "Name") regexp)) (function-item nnmail-split-fancy) (function :tag "Other"))) @@ -71,7 +104,7 @@ (defcustom nnmail-crosspost t "If non-nil, do crossposting if several split methods match the mail. If nil, the first match found will be used." - :group 'gnus-mail + :group 'nnmail-split :type 'boolean) ;; Added by gord@enci.ucalgary.ca (Gordon Matzigkeit). @@ -79,19 +112,20 @@ "If non-nil, nnmail will never delete the last expired article in a directory. You may need to set this variable if other programs are putting new mail into folder numbers that Gnus has marked as expired." - :group 'gnus-mail + :group 'nnmail-procmail + :group 'nnmail-various :type 'boolean) (defcustom nnmail-use-long-file-names nil "If non-nil the mail backends will use long file and directory names. If nil, groups like \"mail.misc\" will end up in directories like \"mail/misc/\"." - :group 'gnus-mail + :group 'nnmail-files :type 'boolean) (defcustom nnmail-default-file-modes 384 "Set the mode bits of all new mail files to this integer." - :group 'gnus-mail + :group 'nnmail-files :type 'integer) (defcustom nnmail-expiry-wait 7 @@ -99,7 +133,7 @@ This variable can either be a number (which will be interpreted as a number of days) -- this doesn't have to be an integer. This variable can also be `immediate' and `never'." - :group 'gnus-mail + :group 'nnmail-expire :type '(choice (const immediate) (integer :tag "days") (const never))) @@ -119,7 +153,7 @@ ((string-match \"junk\" newsgroup) 1) ((string-match \"important\" newsgroup) 'never) (t 7))))" - :group 'gnus-mail + :group 'nnmail-expire :type '(choice (const :tag "nnmail-expiry-wait" nil) (function :format "%v" nnmail-))) @@ -133,41 +167,41 @@ used as incoming mailboxes. If this variable is a directory (i. e., it's name ends with a \"/\"), treat all files in that directory as incoming spool files." - :group 'gnus-mail + :group 'nnmail-files :type 'file) (defcustom nnmail-crash-box "~/.gnus-crash-box" "File where Gnus will store mail while processing it." - :group 'gnus-mail + :group 'nnmail-files :type 'file) (defcustom nnmail-use-procmail nil "*If non-nil, the mail backends will look in `nnmail-procmail-directory' for spool files. The file(s) in `nnmail-spool-file' will also be read." - :group 'gnus-mail + :group 'nnmail-procmail :type 'boolean) (defcustom nnmail-procmail-directory "~/incoming/" "*When using procmail (and the like), incoming mail is put in this directory. The Gnus mail backends will read the mail from this directory." - :group 'gnus-mail + :group 'nnmail-procmail :type 'directory) (defcustom nnmail-procmail-suffix "\\.spool" "*Suffix of files created by procmail (and the like). This variable might be a suffix-regexp to match the suffixes of several files - eg. \".spool[0-9]*\"." - :group 'gnus-mail + :group 'nnmail-procmail :type 'regexp) (defcustom nnmail-resplit-incoming nil "*If non-nil, re-split incoming procmail sorted mail." - :group 'gnus-mail + :group 'nnmail-procmail :type 'boolean) (defcustom nnmail-delete-file-function 'delete-file "Function called to delete files in some mail backends." - :group 'gnus-mail + :group 'nnmail-files :type 'function) (defcustom nnmail-crosspost-link-function 'add-name-to-file @@ -175,7 +209,7 @@ This is `add-name-to-file' by default, which means that crossposts will use hard links. If your file system doesn't allow hard links, you could set this variable to `copy-file' instead." - :group 'gnus-mail + :group 'nnmail-files :type '(radio (function-item add-name-to-file) (function-item copy-file) (function :tag "Other"))) @@ -187,12 +221,13 @@ This can also be a function. In that case, the function will be called with two parameters -- the name of the INBOX file, and the file to be moved to." - :group 'gnus-mail + :group 'nnmail-files + :group 'nnmail-retrieve :type 'string) (defcustom nnmail-pop-password-required nil "*Non-nil if a password is required when reading mail using POP." - :group 'gnus-mail + :group 'nnmail-retrieve :type 'boolean) (defcustom nnmail-read-incoming-hook @@ -224,43 +259,44 @@ ;; the flag that says you have mail. (when (eq (process-status \"display-time\") 'run) (display-time-filter display-time-process \"\"))))" - :group 'gnus-mail + :group 'nnmail-prepare :type 'hook) ;; Suggested by Erik Selberg <speed@cs.washington.edu>. (defcustom nnmail-prepare-incoming-hook nil "Hook called before treating incoming mail. The hook is run in a buffer with all the new, incoming mail." - :group 'gnus-mail + :group 'nnmail-prepare :type 'hook) (defcustom nnmail-prepare-incoming-header-hook nil "Hook called narrowed to the headers of each message. This can be used to remove excessive spaces (and stuff like that) from the headers before splitting and saving the messages." - :group 'gnus-mail + :group 'nnmail-prepare :type 'hook) (defcustom nnmail-prepare-incoming-message-hook nil "Hook called narrowed to each message." - :group 'gnus-mail + :group 'nnmail-prepare :type 'hook) (defcustom nnmail-list-identifiers nil "Regexp that matches list identifiers to be removed. This can also be a list of regexps." - :group 'gnus-mail - :type '(choice regexp + :group 'nnmail-prepare + :type '(choice (const :tag "none" nil) + regexp (repeat regexp))) (defcustom nnmail-pre-get-new-mail-hook nil "Hook called just before starting to handle new incoming mail." - :group 'gnus-mail + :group 'nnmail-retrieve :type 'hook) (defcustom nnmail-post-get-new-mail-hook nil "Hook called just after finishing handling new incoming mail." - :group 'gnus-mail + :group 'nnmail-retrieve :type 'hook) (defcustom nnmail-split-hook nil @@ -268,13 +304,15 @@ The functions in this hook are free to modify the buffer contents in any way they choose -- the buffer contents are discarded after running the split process." - :group 'gnus-mail + :group 'nnmail-split :type 'hook) ;; Suggested by Mejia Pablo J <pjm9806@usl.edu>. (defcustom nnmail-tmp-directory nil - "*If non-nil, use this directory for temporary storage when reading incoming mail." - :group 'gnus-mail + "*If non-nil, use this directory for temporary storage. +Used when reading incoming mail." + :group 'nnmail-files + :group 'nnmail-retrieve :type '(choice (const :tag "default" nil) (directory :format "%v"))) @@ -282,7 +320,7 @@ "*The number of the articles which indicates a large newsgroup. If the number of the articles is greater than the value, verbose messages will be shown to indicate the current status." - :group 'gnus-mail + :group 'nnmail-various :type 'integer) (defcustom nnmail-split-fancy "mail.misc" @@ -338,7 +376,7 @@ (any \"larsi@ifi\\\\.uio\\\\.no\" \"people.Lars Magne Ingebrigtsen\")) ;; Unmatched mail goes to the catch all group. \"misc.misc\"))" - :group 'gnus-mail + :group 'nnmail-split ;; Sigh! :type 'sexp) @@ -346,26 +384,27 @@ '((any . "from\\|to\\|cc\\|sender\\|apparently-to\\|resent-from\\|resent-to\\|resent-cc") (mail . "mailer-daemon\\|postmaster\\|uucp")) "Alist of abbreviations allowed in `nnmail-split-fancy'." - :group 'gnus-mail + :group 'nnmail-split :type '(repeat (cons :format "%v" symbol regexp))) (defcustom nnmail-delete-incoming t "*If non-nil, the mail backends will delete incoming files after splitting." - :group 'gnus-mail + :group 'nnmail-retrieve :type 'boolean) (defcustom nnmail-message-id-cache-length 1000 "*The approximate number of Message-IDs nnmail will keep in its cache. If this variable is nil, no checking on duplicate messages will be performed." - :group 'gnus-mail + :group 'nnmail-duplicate :type '(choice (const :tag "disable" nil) (integer :format "%v"))) (defcustom nnmail-message-id-cache-file "~/.nnmail-cache" "*The file name of the nnmail Message-ID cache." - :group 'gnus-mail + :group 'nnmail-duplicate + :group 'nnmail-files :type 'file) (defcustom nnmail-treat-duplicates 'warn @@ -378,7 +417,7 @@ This variable can also be a function. It will be called from a buffer narrowed to the article in question with the Message-ID as a parameter. It should return nil, `warn' or `delete'." - :group 'gnus-mail + :group 'nnmail-duplicate :type '(choice (const :tag "off" nil) (const warn) (const delete))) @@ -1473,8 +1512,9 @@ (if nnmail-tmp-directory (concat (file-name-as-directory nnmail-tmp-directory) - (file-name-nondirectory (concat temp "Incoming"))) - (concat temp "Incoming"))))) + (file-name-nondirectory + (concat (file-name-as-directory temp) "Incoming"))) + (concat (file-name-as-directory temp) "Incoming"))))) (rename-file nnmail-crash-box incoming t) (push incoming incomings)))) ;; If we did indeed read any incoming spools, we save all info. @@ -1632,7 +1672,14 @@ (setq found t his nil))) found)) - + +(defun nnmail-pop3-movemail (inbox crashbox) + "Function to move mail from INBOX on a pop3 server to file CRASHBOX." + (require 'pop3) + (let ((pop3-maildrop + (substring inbox (match-end (string-match "^po:" inbox))))) + (pop3-movemail crashbox))) + (run-hooks 'nnmail-load-hook) (provide 'nnmail)
--- a/lisp/gnus/nnmbox.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/nnmbox.el Mon Aug 13 09:15:11 2007 +0200 @@ -194,7 +194,8 @@ (save-excursion (set-buffer nnmbox-mbox-buffer) (save-buffer))) - nnmbox-mbox-file group + (file-name-directory nnmbox-mbox-file) + group (lambda () (save-excursion (let ((in-buf (current-buffer)))
--- a/lisp/gnus/nnmh.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/nnmh.el Mon Aug 13 09:15:11 2007 +0200 @@ -228,7 +228,8 @@ (deffoo nnmh-request-newgroups (date &optional server) (nnmh-request-list server)) -(deffoo nnmh-request-expire-articles (articles newsgroup &optional server force) +(deffoo nnmh-request-expire-articles (articles newsgroup + &optional server force) (nnmh-possibly-change-directory newsgroup server) (let* ((active-articles (mapcar
--- a/lisp/gnus/nnml.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/nnml.el Mon Aug 13 09:15:11 2007 +0200 @@ -159,7 +159,8 @@ (defun nnml-request-regenerate (server) (nnml-possibly-change-directory nil server) - (nnml-generate-nov-databases)) + (nnml-generate-nov-databases) + t) (deffoo nnml-request-article (id &optional group server buffer) (nnml-possibly-change-directory group server)
--- a/lisp/gnus/nnweb.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/gnus/nnweb.el Mon Aug 13 09:15:11 2007 +0200 @@ -70,7 +70,7 @@ (defvoo nnweb-search nil "Search string to feed to DejaNews.") -(defvoo nnweb-max-hits 30 +(defvoo nnweb-max-hits 100 "Maximum number of hits to display.") (defvoo nnweb-ephemeral-p nil
--- a/lisp/hm--html-menus/ANNOUNCEMENT Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hm--html-menus/ANNOUNCEMENT Mon Aug 13 09:15:11 2007 +0200 @@ -1,9 +1,9 @@ Hello, -I've written a new version (5.1) of my html package for the XEmacs +I've written a new version (5.2) of my html package for the XEmacs and the GNU Emacs 19. The name of the package is: - hm--html-menus-5.1.tar.gz + hm--html-menus-5.2.tar.gz With this package it is very easy to write html pages for the World Wide Web (WWW). Eg: In most cases the user gets help to construct a specific @@ -11,7 +11,8 @@ It is also possible to insert links and images by just clicking on its source and destination (drag and drop feature). -The biggest new features in this release are: +The biggest new features compared with release 5.0 are: +- commands to insert all elements, which are used by HTML 3.2. - a better drag and drop interface to insert links with the mouse - help feature for the drag and drop commands - there's now also a default drag and drop table for other modes @@ -24,7 +25,7 @@ - a lot of bug fixes Read the NEWS file to see news in detail... -You should find hm--html-menus-5.1.tar.gz on the following ftp server: +You should find hm--html-menus-5.2.tar.gz on the following ftp server: sunsite.unc.edu in /pub/Linux/apps/editors/emacs/ ftp.rrzn.uni-hannover.de in /pub/unix/editors/lemacs/contrib ftp.tnt.uni-hannover.de in /pub/editors/xemacs/contrib @@ -41,32 +42,35 @@ The package provides functions to insert the following stuff in html-pages: 1. Anchors: + relative links, general link; html link, info link, gopher link, file link; ftp link, news link, mail link, wais (direct) link, wais (gateway) link; - proggate link, local proggate link, general link; + proggate link, local proggate link, link target; 2. Frame elements: - full html frame with html, head, body, title, header and signature - elements or only the single elements; - link element; + full html frame with doctype, html, head, body, title, + header and signature elements or only the single elements; + meta, isindex, link and base element; html 'created'- and 'changed'- comments; the current date in the title; 3. Structure elements: menu or list item, menu, unordered list, ordered list, directory list; description list, description title, description entry; - new paragraph, new line, horizontal rule, table, table title, - table header, table row, table entry; + new paragraph, new line, horizontal rule, document division, + table, table title, table header, table row, table entry; 4. for formatting paragraphs: without links, with links, blockquote, listing, abstract; + basefont, font, center; 5. formatting: bold, italic, underline, typewriter, strikethru, super and subscript, - emphasized, strong, big, + emphasized, strong, small, big, definition, keyboard, variable, code, sample, citation, html comment; 6. include: - top aligned image, middle aligned image, bottom aligned image, - applet, parameter + top aligned image, middle aligned image, bottom aligned image; + general image element, map, area and all together; + applet, parameter; 7. forms: form; text, password, isindex, integer, float, date, url, scribble fields; @@ -95,7 +99,7 @@ expanded automatically; - preview html documents with the netscape - preview html documents with the xmosaic -- preview html documents with the w3 package for the lemacs and emacs +- preview html documents with the w3 package for the XEmacs and emacs You can insert links and images by clicking with Meta Button1 on its source and then on its destination. For this drag and drop interface
--- a/lisp/hm--html-menus/NEWS Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hm--html-menus/NEWS Mon Aug 13 09:15:11 2007 +0200 @@ -1,3 +1,21 @@ +18.02.97 + Fixed a compilation bug. + -- BUILDED the version 5.2 of the package +17.02.97 + Changed the function `hm--html-read-alignment' according to the + HTML version 3.2. + Added a more general command for adding images. + Added the HTML elements MAP and AREA. + Added a command for adding an image and a map. +15.02.97 + Fixed some bugs in the insert full frame stuff. + Added the DOCTYPE to the full frame stuff. + Added the HTML elements DIV, FONT and BASEFONT. +14.02.97 + Added the HTML elements DOCTYPE, ISINDEX, BASE, META. + Added all one tag elements used in HTML 3.2 to the list + `hm--html-tag-name-alist' to make the indentation happy. + Fixed a bug in the indentation after one tag elements. 12.02.97 Renamed command-description.tmpl to command-description.html.tmpl. The indentation stuff can now be disabled by setting the
--- a/lisp/hm--html-menus/README Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hm--html-menus/README Mon Aug 13 09:15:11 2007 +0200 @@ -1,4 +1,4 @@ -This README file describes the emacs lisp package hm--html-menus-5.1. +This README file describes the emacs lisp package hm--html-menus-5.2. The package provides functions and various popup and pulldown menus for a html mode called hm--html-mode, a mode for writing html pages. @@ -25,7 +25,7 @@ only UNIX ?) platforms. NOTE: The current release isn't tested with the Emacs 19 (5.0 is but -5.1 isn't). One of the next releases in the near future :-) will be a +5.1 and 5.2 are not). One of the next releases in the near future :-) will be a bug fix only release for the Emacs 19. So please report any bugs to muenkel@tnt.uni-hannover.de to shorten the time until the Emacs 19 related bugs are fixed. @@ -36,8 +36,8 @@ Thanks to Richard Stallman, who has helped me to port this package to the Emacs 19 and thanks to John Ladwig, who has corrected a lot of the text and comments in this package and to all the other people like -Jerry G. DeLapp, Andreas Ernst and so on, who had provided code, -ideas, bug fixes or bug reports for this package. +Jerry G. DeLapp, Andreas Ernst, Bob Weiner and so on, who had provided +code, ideas, bug fixes or bug reports for this package. The package consists of the following files: @@ -53,7 +53,7 @@ some of these functions are similar to functions of the html-mode.el; hm--html-indentation.el : provides the indentation stuff; -hm--html-keys.el : provides the new keybindings; +hm--html-keys.el : provides the keybindings; hm--html-menu.el : provides the menus; hm--html-mode.el : provides the functions for the definition of the hm--html-mode; this is now the
--- a/lisp/hm--html-menus/hm--html-configuration.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hm--html-menus/hm--html-configuration.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,6 +1,6 @@ ;;; hm--html-configuration.el - Configurationfile for the html-mode ;;; -;;; $Id: hm--html-configuration.el,v 1.2 1997/02/15 22:21:03 steve Exp $ +;;; $Id: hm--html-configuration.el,v 1.3 1997/02/24 01:13:26 steve Exp $ ;;; ;;; Copyright (C) 1993 - 1997 Heiko Muenkel ;;; email: muenkel@tnt.uni-hannover.de @@ -74,6 +74,11 @@ "*Your Name for the signature. For example: \"Heiko M�nkel\".") +;;; HTML Doctype +(defvar hm--html-html-doctype-version "-//W3C//DTD HTML 3.2 Final//EN" + "The HTML version. This is used in the doctype element.") + + ;;; Your favorite server (eg: the name of the host of your own http server) ;;; This is used in some other variables @@ -471,6 +476,10 @@ Linux : (setq html-sigusr1-signal-value 10))") +;;; Meta information +(defvar hm--html-meta-name-alist '(("Expires") ("Keys") ("Author")) + "*Alist with possible names for the name or http-equiv attribute of meta.") + ;;; indentation (defvar hm--html-disable-indentation nil @@ -489,6 +498,124 @@ (defvar hm--html-tag-name-alist '(("!--" (:hm--html-one-element-tag t)) + ("!doctype" (:hm--html-one-element-tag t)) + ("isindex" (:hm--html-one-element-tag t) + (:hm--html-optional-attributes (prompt))) + ("base" (:hm--html-one-element-tag t) + (:hm--html-required-attributes (href))) + ("meta" (:hm--html-one-element-tag t) + (:hm--html-required-attributes (content)) + (:hm--html-optional-attributes (http-equiv name))) + ("link" (:hm--html-one-element-tag t) + (:hm--html-optional-attributes (href rel rev title))) + ("hr" (:hm--html-one-element-tag t) + (:hm--html-optional-attributes (align noshade size width))) + ("input" (:hm--html-one-element-tag t) + (:hm--html-optional-attributes + (type name value checked size maxlength src align))) + ("img" (:hm--html-one-element-tag t) + (:hm--html-required-attributes (src)) + (:hm--html-optional-attributes + (alt align height width border hspace vspace usemap ismap))) + ("param" (:hm--html-one-element-tag t) + (:hm--html-required-attributes (name)) + (:hm--html-optional-attributes (value))) + ("br" (:hm--html-one-element-tag t) + (:hm--html-optional-attributes (clear))) + ("basefont" (:hm--html-one-element-tag t) + (:hm--html-optional-attributes size)) + ("area" (:hm--html-one-element-tag t) + (:hm--html-required-attributes (alt)) + (:hm--html-optional-attributes (shape coords href nohref))) + ("option" (:hm--html-one-element-tag t) + (:hm--html-optional-attributes (selected value))) + + ("html" (:hm--html-two-element-tag t)) + ("head" (:hm--html-two-element-tag t)) + ("body" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (bgcolor text link vlink alink background)) + ) + ("h1" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (align))) + ("h2" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (align))) + ("h3" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (align))) + ("h4" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (align))) + ("h5" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (align))) + ("h6" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (align))) + ("address" (:hm--html-two-element-tag t)) + ("p" (:hm--html-one-or-two-element-tag t) + (:hm--html-optional-attributes (align))) + ("ul" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (type compact))) + ("ol" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (type start compact))) + ("dl" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (compact))) + ("li" (:hm--html-one-or-two-element-tag t) + (:hm--html-optional-attributes (type (value "ol")))) + ("dt" (:hm--html-one-or-two-element-tag t)) + ("dd" (:hm--html-one-or-two-element-tag t)) + ("dir" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (compact))) + ("menu" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (compact))) + ("pre" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (width))) + ("div" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (align))) + ("center" (:hm--html-two-element-tag t)) + ("blockquote" (:hm--html-two-element-tag t)) + ("form" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (action method enctype))) + ("select" (:hm--html-two-element-tag t) + (:hm--html-required-attributes (name)) + (:hm--html-optional-attributes (size multiple))) + ("textarea" (:hm--html-two-element-tag t) + (:hm--html-required-attributes (name rows cols))) + ("table" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes + (align width border cellspacing cellpading))) + ("caption" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (align))) + ("tr" (:hm--html-one-or-two-element-tag t) + (:hm--html-optional-attributes (align valign))) + ("th" (:hm--html-one-or-two-element-tag t) + (:hm--html-optional-attributes + (nowrap rowspan colspan align valign width height))) + ("td" (:hm--html-one-or-two-element-tag t) + (:hm--html-optional-attributes + (nowrap rowspan colspan align valign width height))) + ("tt" (:hm--html-two-element-tag t)) + ("i" (:hm--html-two-element-tag t)) + ("b" (:hm--html-two-element-tag t)) + ("u" (:hm--html-two-element-tag t)) + ("strike" (:hm--html-two-element-tag t)) + ("big" (:hm--html-two-element-tag t)) + ("small" (:hm--html-two-element-tag t)) + ("sub" (:hm--html-two-element-tag t)) + ("sup" (:hm--html-two-element-tag t)) + ("em" (:hm--html-two-element-tag t)) + ("strong" (:hm--html-two-element-tag t)) + ("dfn" (:hm--html-two-element-tag t)) + ("code" (:hm--html-two-element-tag t)) + ("samp" (:hm--html-two-element-tag t)) + ("kbd" (:hm--html-two-element-tag t)) + ("var" (:hm--html-two-element-tag t)) + ("cite" (:hm--html-two-element-tag t)) + ("a" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (name href rel rev title))) + ("applet" (:hm--html-two-element-tag t) + (:hm--html-required-attributes (code width height)) + (:hm--html-optional-attributes (codebase alt name align hspace vspace))) + ("font" (:hm--html-two-element-tag t) + (:hm--html-optional-attributes (size color))) + ("map" (:hm--html-two-element-tag t) + (:hm--html-required-attributes (name))) ) "An alist with tag names known by the `hm--html-mode'. CURRENTLY THIS LIST CONTAINS NOT ALL TAGS!!!!. @@ -496,7 +623,9 @@ It is used to determine, if a tag is a one element tag or not. In the future it should also be used to get possible parameters of -the tag.") +the tag. + +Use lower case characters in this list!!!!") ;;; Announce the feature hm--html-configuration
--- a/lisp/hm--html-menus/hm--html-indentation.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hm--html-menus/hm--html-indentation.el Mon Aug 13 09:15:11 2007 +0200 @@ -151,7 +151,9 @@ (defun hm--html-is-one-element-tag-p (tag-name) "Returns t, if the tag with the tag-name is a one element tag." (assoc :hm--html-one-element-tag - (cdr (assoc* tag-name hm--html-tag-name-alist :test 'string=)))) + (cdr (assoc* (downcase tag-name) + hm--html-tag-name-alist + :test 'string=)))) (defun hm--html-calculate-indent-according-to-previous-tags () "Calculate the indent according to the previous tags in this line.
--- a/lisp/hm--html-menus/hm--html-keys.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hm--html-menus/hm--html-keys.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,4 +1,4 @@ -;;; $Id: hm--html-keys.el,v 1.2 1997/02/15 22:21:04 steve Exp $ +;;; $Id: hm--html-keys.el,v 1.3 1997/02/24 01:13:27 steve Exp $ ;;; ;;; Copyright (C) 1995, 1996, 1997 Heiko Muenkel ;;; email: muenkel@tnt.uni-hannover.de @@ -27,8 +27,6 @@ ;;; Put this file in one of your load path directories. ;;; -(require 'hm--html-configuration) - (if (adapt-emacs19p) (progn
--- a/lisp/hm--html-menus/hm--html-menu.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hm--html-menus/hm--html-menu.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,6 +1,6 @@ ;;; hm--html-menu --- A menu for the hm--html-mode. ;;; -;;; $Id: hm--html-menu.el,v 1.2 1997/02/15 22:21:04 steve Exp $ +;;; $Id: hm--html-menu.el,v 1.3 1997/02/24 01:13:27 steve Exp $ ;;; ;;; Copyright (C) 1993 - 1997 Heiko Muenkel ;;; email: muenkel@tnt.uni-hannover.de @@ -37,14 +37,6 @@ ;;; for further installation points. ;;; -;(provide 'hm--html-menu) -;(require 'hm--html-drag-and-drop) -;(require 'html-mode) -;(require 'hm--html-mode) -;(require 'hm--html) -;(require 'adapt) - - ;; ;; Menu "HTML" ;; @@ -88,6 +80,7 @@ (hm--html-insert-template hm--html-frame-template-file) (file-exists-p hm--html-frame-template-file)] "----" + ["Doctype" hm--html-add-doctype t] ["Html" hm--html-add-html t] ["Head" hm--html-add-head t] ["Body" hm--html-add-body t] @@ -95,10 +88,14 @@ ["Title and Header..." hm--html-add-title-and-header t] ["Title..." hm--html-add-title t] ["Header..." hm--html-add-header t] - ["Node Link..." hm--html-add-normal-node-link t] ["Address" hm--html-add-address t] ["Signature" hm--html-add-signature t] "----" + ["Meta information..." hm--html-add-meta t] + ["Node Link..." hm--html-add-normal-node-link t] + ["Isindex..." hm--html-add-isindex t] + ["Document Base..." hm--html-add-base t] + "----" ["Created comment" hm--html-insert-created-comment t] ["Changed comment" hm--html-insert-changed-comment t] ["New date in title" hm--html-new-date t] @@ -131,6 +128,7 @@ "----" ["Paragraph container" hm--html-add-paragraph t] ["Paragraph start tag" hm--html-add-paragraph-separator t] + ["Document division" hm--html-add-document-division t] ["New line" hm--html-add-line-break t] ["Horizontal rule" hm--html-add-horizontal-rule t] ) @@ -138,6 +136,8 @@ ["Without links" hm--html-add-plaintext t] ["With links" hm--html-add-preformated t] "----" + ["Basefont..." hm--html-add-basefont t] + ["Font..." hm--html-add-font t] ["Blockquote" hm--html-add-blockquote t] ["Listing" hm--html-add-listing t] ["Abstract" hm--html-add-abstract t] @@ -210,11 +210,16 @@ ["Top aligned image..." hm--html-add-image-top t] ["Middle aligned image..." hm--html-add-image-middle t] ["Bottom aligned image..." hm--html-add-image-bottom t] + ["Image as map? ..." hm--html-add-image t] ["Drag & Drop" idd-start-mouse-drag-and-drop :active t :keys "\\[idd-mouse-drag-and-drop]"] "----" + ["Image map..." hm--html-add-image-map t] + ["Map..." hm--html-add-map t] + ["Area..." hm--html-add-area t] + "----" ["Applet..." hm--html-add-applet t] ["Parameter..." hm--html-add-applet-parameter t] ; "----" @@ -345,11 +350,13 @@ ) "----" ["Paragraph container" hm--html-add-paragraph-to-region t] + ["Document division" hm--html-add-document-division-to-region t] ) ("Formatting Paragraphs" ["Without links" hm--html-add-plaintext-to-region t] ["With links" hm--html-add-preformated-to-region t] "----" + ["Font..." hm--html-add-font-to-region t] ["Blockquote" hm--html-add-blockquote-to-region t] ["Listing" hm--html-add-listing-to-region t] ["Abstract" hm--html-add-abstract-to-region t] @@ -418,6 +425,11 @@ "----" ["HTML Comment" hm--html-add-comment-to-region t] ) + ("Include" + ["Map..." hm--html-add-map-to-region t] + "----" + ["Applet..." hm--html-add-applet-to-region t] + ) ("Forms" ["Form..." hm--html-add-form-to-region t]) ))
--- a/lisp/hm--html-menus/hm--html-mode.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hm--html-menus/hm--html-mode.el Mon Aug 13 09:15:11 2007 +0200 @@ -2,7 +2,7 @@ ;;; ;;; Keywords: hypermedia languages help docs wp ;;; -;;; $Id: hm--html-mode.el,v 1.2 1997/02/15 22:21:04 steve Exp $ +;;; $Id: hm--html-mode.el,v 1.3 1997/02/24 01:13:27 steve Exp $ ;;; ;;; Copyright (C) 1996, 1997 Heiko Muenkel ;;; email: muenkel@tnt.uni-hannover.de @@ -63,11 +63,12 @@ (require 'adapt) (require 'hm--date) (require 'hm--html) +(eval-when-compile + (require 'hm--html-configuration)) (hm--html-load-config-files) (require 'hm--html-indentation) (require 'hm--html-menu) (require 'hm--html-drag-and-drop) -;(hm--html-load-config-files) ; Load the system and user configuration files (require 'hm--html-keys) @@ -76,7 +77,7 @@ (defconst hm--html-menus-package-name "hm--html-menus") -(defconst hm--html-menus-package-version "5.1") +(defconst hm--html-menus-package-version "5.2") ;;; Generate the help buffer faces @@ -136,9 +137,6 @@ (hm--install-html-menu hm--html-mode-pulldown-menu-name) (make-variable-buffer-local 'write-file-hooks) (add-hook 'write-file-hooks 'hm--html-maybe-new-date-and-changed-comment) -; (make-local-variable 'font-lock-keywords) -; (setq font-lock-keywords-case-fold-search t) -; (setq font-lock-keywords hm--html-font-lock-keywords) (put major-mode 'font-lock-defaults '((hm--html-font-lock-keywords hm--html-font-lock-keywords-1 hm--html-font-lock-keywords-2) @@ -204,30 +202,6 @@ ) -;(or (assq 'hm--html-region-mode minor-mode-alist) -; (setq minor-mode-alist -; (purecopy -; (append minor-mode-alist -; '((hm--html-region-mode " Region")))))) - - - -;(defun hm--html-region-mode (on) -; "Turns the minor mode hm--html-region-mode on or off. -;The function turns the hm--html-region-mode on, if ON is t and off otherwise." -; (if (eq major-mode 'hm--html-mode) -; ;;(string= mode-name "HTML") -; (if on -; ;; html-region-mode on -; (progn -; (setq hm--html-region-mode t) -; (use-local-map hm--html-region-mode-map)) -; ;; html-region-mode off -; (setq hm--html-region-mode nil) -; (use-local-map hm--html-mode-map)))) - - - ;;; hm--html-minor-mode
--- a/lisp/hm--html-menus/hm--html.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hm--html-menus/hm--html.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,4 +1,4 @@ -;;; $Id: hm--html.el,v 1.2 1997/02/15 22:21:04 steve Exp $ +;;; $Id: hm--html.el,v 1.3 1997/02/24 01:13:28 steve Exp $ ;;; ;;; Copyright (C) 1993 - 1997 Heiko Muenkel ;;; email: muenkel@tnt.uni-hannover.de @@ -27,10 +27,6 @@ ;;; Put this file in one of your load path directories. ;;; -;(require 'hm--date) -;(require 'adapt) - - (defun hm--html-set-marker-at-position (&optional position) "Creates a new marker and set the marker at the POSITION. If POSITION is nil, then the marker is set at the current point. @@ -156,6 +152,12 @@ (hm--html-add-tags-to-region 'hm--html-insert-start-tag "<LI> " 'hm--html-insert-end-tag " </LI>")) +(defun hm--html-add-basefont (size) + "Adds the HTML tag for a basefont." + (interactive (list (hm--html-read-font-size t))) + (hm--html-add-tags 'hm--html-insert-start-tag + (concate "<BASEFONT SIZE=" size ">"))) + (defun hm--html-add-line-break () "Adds the HTML tag for a line break." (interactive) @@ -191,6 +193,105 @@ (interactive) (hm--html-add-tags 'hm--html-insert-start-tag "<P>")) +(defun hm--html-add-doctype () + "Adds the tag with the doctype." + (interactive) + (goto-char (point-min)) + (hm--html-add-tags 'hm--html-insert-start-tag + (concat "<!DOCTYPE HTML PUBLIC \"" + hm--html-html-doctype-version + "\">")) + (newline)) + +(defun hm--html-search-place-for-element-in-head (end-point) + "Searches the point for inserting an element between the head tags." + (let ((point (point))) + (if (and end-point (< (point) end-point)) + (point) + (goto-char (point-min)) + (if (re-search-forward + (concat "\\(<title\\)\\|\\(<head\\)\\|\\(<html\\)\\|" + "\\(<isindex\\)\\|\\(<base\\)\\|\\(<link\\)\\|" + "\\(<meta") + end-point + t) + (beginning-of-line) + point)))) + +(defun hm--html-add-isindex (prompt) + "Inserts the isindex tag. PROMPT is the value of the prompt attribute." + (interactive "sPrompt: ") + (save-excursion + (let ((point (point)) + (case-fold-search t) + (head-end-point)) + (goto-char (point-min)) + (setq head-end-point (when (re-search-forward + "\\(</head\\)\\|\\(<body\\)\\|\\(</html\\)") + (beginning-of-line) + (point)))) + (cond ((re-search-forward "<isindex[^>]*>" head-end-point t) + (delete-region (match-beginning 0) (match-end 0))) + (t (goto-char point) + (hm--html-search-place-for-element-in-head head-end-point))) + (hm--html-add-tags 'hm--html-insert-start-tag + (concat "<ISINDEX " + (if (and prompt + (not (string= prompt ""))) + (concat " PROMPT=\"" prompt "\">") + ">"))))) + +(defun hm--html-add-base (href) + "Inserts the base tag. HREF is the value of the href attribute." + (interactive (list (hm--html-read-url "URL of this document: " + nil + nil + t + nil))) + (save-excursion + (let ((point (point)) + (case-fold-search t) + (head-end-point)) + (goto-char (point-min)) + (setq head-end-point (when (re-search-forward + "\\(</head\\)\\|\\(<body\\)\\|\\(</html\\)") + (beginning-of-line) + (point)))) + (cond ((re-search-forward "<base[^>]*>" head-end-point t) + (delete-region (match-beginning 0) (match-end 0))) + (t (goto-char point) + (hm--html-search-place-for-element-in-head head-end-point))) + (hm--html-add-tags 'hm--html-insert-start-tag + (concat "<BASE " + (if (and href + (not (string= href ""))) + (concat " HREF=\"" href "\">") + ">"))))) + +(defun hm--html-add-meta (name content &optional name-instead-of-http-equiv) + "Inserts the meta tag." + (interactive (list (completing-read "Name: " hm--html-meta-name-alist) + (read-string "Content: "))) + (save-excursion + (let ((point (point)) + (case-fold-search t) + (head-end-point)) + (goto-char (point-min)) + (setq head-end-point (when (re-search-forward + "\\(</head\\)\\|\\(<body\\)\\|\\(</html\\)") + (beginning-of-line) + (point)))) + (goto-char point) + (hm--html-search-place-for-element-in-head head-end-point) + (hm--html-add-tags 'hm--html-insert-start-tag + (concat "<META " + (if name-instead-of-http-equiv + "NAME=\"" + "HTTP-EQUIV=\"") + name + "\" CONTENT=\"" + content + "\">")))) ;;; Functions which include something in HTML- documents @@ -245,9 +346,7 @@ (let ((alttype (string-to-int (completing-read -; "0: No ALT atribute, 1: ALT=\"\", 2: ALT=Text, 3: ALT=External Viewer: " "0: No ALT atribute, 1: ALT=\"\", 2: ALT=Text: " -; '(("0") ("1") ("2") ("3")) '(("0") ("1") ("2")) nil t @@ -261,13 +360,121 @@ (string-match "\\." (file-name-nondirectory url))))) -; ((= alttype 3) (concat "<A HREF=\"" -; url -; "\">" -; (file-name-nondirectory url) -; "</A>")) ))) +(defun hm--html-read-alignment (prompt) + "Read the value for the align attribute." + (upcase (completing-read prompt + '(("left") ("right") ("top") ("bottom") ("middle")) + nil + t + "left"))) + +(defvar hm--html-shape-history nil + "History variable for reading the shape of an image map.") + +(defun hm--html-read-shape () + "Reads the shap for an area element." + (upcase(completing-read "The shape of the area: " + '(("rect") ("circle") ("poly")) + nil + t + (or (car hm--html-shape-history) "rect") + 'hm--html-shape-history))) + +(defun hm--html-read-rect-coords () + "Reads rectangle coordinates for the area element." + (concat (read-string "Left x position of the rectangle: ") ", " + (read-string "Top y position of the rectangle: ") ", " + (read-string "Right x position of the rectangle: ") ", " + (read-string "Bottom y position of the rectangle: "))) + +(defun hm--html-read-circle-coords () + "Reads circle coordinates for the area element." + (concat (read-string "x position of the center of the circle: ") ", " + (read-string "y position of the center of the circle: ") ", " + (read-string "Radius: "))) + +(defun hm--html-read-one-poly-coordinate (&optional empty-string-prompt) + "Reads one poly coordinate pair." + (let* ((x (read-string (concat "x coordinate" + (or empty-string-prompt "") + ": "))) + (y (unless (string= "" x) + (read-string "y coordinate: ")))) + (if (string= "" x) + "" + (concat x ", " y)))) + +(defun hm--html-read-more-poly-coordinates () + "Reads poly coordinates until an empty string is given." + (let ((coord (hm--html-read-one-poly-coordinate + " (Empty string for no further coords!)"))) + (cond ((string= "" coord) "") + (t (concat ", " coord (hm--html-read-more-poly-coordinates)))))) + +(defun hm--html-read-poly-coords () + "Reads poly coordinates for the area element." + (concat (hm--html-read-one-poly-coordinate) ", " + (hm--html-read-one-poly-coordinate) ", " + (hm--html-read-one-poly-coordinate) + (hm--html-read-more-poly-coordinates))) + +(defun hm--html-add-area (href alt shape coords) + "Adds the tags for an area at the current point." + (interactive (let* ((href (hm--html-read-url "Url for the image area: ")) + (alt (hm--html-read-altenate href)) + (shape (hm--html-read-shape)) + (coords (cond ((string= shape "RECT") + (hm--html-read-rect-coords)) + ((string= shape "CIRCLE") + (hm--html-read-circle-coords)) + ((string= shape "POLY") + (hm--html-read-poly-coords)) + (t (error "No function to read \"" + shape + "\" coordinates!"))))) + (list href alt shape coords))) + (hm--html-add-tags 'hm--html-insert-end-tag-with-newline + (concat "<AREA" + " HREF=\"" href "\"" + (if alt + (concat "\nALT=\"" alt "\"") + "") + "\nSHAPE=" shape + "\nCOORDS=\"" coords "\"" + ">"))) + +(defvar hm--html-use-image-as-map ':ask + "Internal variable of `hm--html-add-image'. +nil => insert the image element without an usemap attribute. +t => insert the image element with an usemap attribute. +:ask => ask, if the image element should have an usemap attribute.") + +(defun hm--html-add-image (href alt alignment mapname) + "Add an image." + (interactive (let* ((href (hm--html-read-url "Image URL: ")) + (alt (hm--html-read-altenate href)) + (alignment (hm--html-read-alignment + "Alignment of the image: ")) + (use-as-map (if (eq hm--html-use-image-as-map ':ask) + (y-or-n-p + "Use the image as a map with links? ") + hm--html-use-image-as-map)) + (mapname (and use-as-map (hm--html-read-mapname)))) + (list href alt alignment mapname))) + (hm--html-add-tags + 'hm--html-insert-start-tag + (concat "<IMG ALIGN=" alignment + "\nHREF=\"" href "\"" + (if alt + (concat "\nALT=\"" alt "\"") + "") + (if mapname + (concat "\nUSEMAP=\"#" mapname "\"") + "") + ">"))) + (defun hm--html-add-image-bottom (href alt) "Add an image, bottom aligned." @@ -679,6 +886,23 @@ " -->")) +(defun hm--html-add-document-division (alignment) + "Adds the HTML tags for document division at the current point." + (interactive (list (hm--html-read-alignment "Alignment of the division: "))) + (hm--html-add-tags 'hm--html-insert-start-tag-with-newline + (concat "<DIV ALIGN=\"" alignment "\">") + 'hm--html-insert-end-tag-with-newline + "</DIV>")) + + +(defun hm--html-add-document-division-to-region () + "Adds the HTML tags for document division to the region." + (interactive (list (hm--html-read-alignment "Alignment of the division: "))) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag-with-newline + (concat "<DIV ALIGN=\"" alignment "\">") + 'hm--html-insert-end-tag-with-newline + "</DIV>")) + (defun hm--html-add-preformated () "Adds the HTML tags for preformated text at the point in the current buffer." @@ -756,9 +980,9 @@ "Adds the HTML tags for Strikethru at the point in the current buffer." (interactive) (hm--html-add-tags 'hm--html-insert-start-tag - "<S>" + "<STRIKE>" 'hm--html-insert-end-tag - "</S>")) + "</STRIKE>")) (defun hm--html-add-strikethru-to-region () @@ -1111,8 +1335,77 @@ 'hm--html-insert-end-tag "</MARGIN>")) - - +(defun hm--html-read-font-size (&optional only-absolute-size) + "Reads the size for the FONT element. +It returns nil, if the size should not be changed." + (let ((size + (if only-absolute-size + (completing-read "The absolute font size (1 .. 7): " + '(("7") ("6") ("5") ("4") ("3") ("2") ("1")) + nil + t + "4") + (completing-read "The relative (+/-) or absolute font size: " + '(("-7") ("-6") ("-5") ("-4") ("-3") ("-2") ("-1") + ("+7") ("+6") ("+5") ("+4") ("+3") ("+2") ("+1") + ("7") ("6") ("5") ("4") ("3") ("2") ("1") + ("use-basefont")) + nil + t + "use-basefont-size")))) + (if (string= size "use-basefont-size") + nil + size))) + +(defun hm--html-read-font-color () + "Reads the size for the FONT element. +It returns nil, if the color should not be changed." + (let ((color + (completing-read "The font color: " + '(("Black") ("Silver") ("Gray") ("White") ("Maroon") + ("Green") ("Lime") ("Olive") ("Yellow") ("Navy") + ("Red") ("Purple") ("Fuchsia") ("Blue") ("Teal") + ("Aqua") ("dont-set-color")) + nil + nil + "dont-set-color"))) + (if (string= color "dont-set-color") + nil + color))) + + +(defun hm--html-add-font (size color) + "Adds the HTML tags for Font at the point in the current buffer." + (interactive (list (hm--html-read-font-size) + (hm--html-read-font-color))) + (hm--html-add-tags 'hm--html-insert-start-tag-with-newline + (concat "<FONT" + (if size + (concat " SIZE=" size) + "") + (if color + (concat " COLOR=" color) + "") + ">") + 'hm--html-insert-end-tag-with-newline + "</FONT>")) + + +(defun hm--html-add-font-to-region () + "Adds the HTML tags for Font to the region." + (interactive (list (hm--html-read-font-size) + (hm--html-read-font-color))) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag-with-newline + (concat "<FONT" + (if size + (concat " SIZE=" size) + "") + (if color + (concat " COLOR=" color) + "") + ">") + 'hm--html-insert-end-tag-with-newline + "</FONT>")) ;;; Lists @@ -1151,6 +1444,49 @@ 'hm--html-insert-end-tag-with-newline "</CENTER>")) + +(defvar hm--html-mapname-history nil + "The history variable for the function `hm--html-read-mapname'.") + +(defun hm--html-read-mapname () + "Reads the name of an image map." + (let ((name (read-string "The name of the image map: " + (or (car hm--html-mapname-history) + "map") + 'hm--html-mapname-history))) + name)) + +(defun hm--html-add-image-map () + "Adds an image and a map element." + (interactive) + (let* ((href (hm--html-read-url "Image URL: ")) + (alt (hm--html-read-altenate href)) + (alignment (hm--html-read-alignment + "Alignment of the image: ")) + (mapname (hm--html-read-mapname))) + (hm--html-add-image href alt alignment mapname) + (newline) + (hm--html-add-map mapname) + (call-interactively 'hm--html-add-area))) + +(defun hm--html-add-map (name) + "Adds the HTML tags for map at the current point." + (interactive (list (hm--html-read-mapname))) + (hm--html-add-tags 'hm--html-insert-start-tag-with-newline + (concat "<MAP NAME=\"" name "\">") + 'hm--html-insert-end-tag + "</MAP>") + (end-of-line 0)) + +(defun hm--html-add-map-to-region (name) + "Adds the HTML tags for map to the region." + (interactive (list (hm--html-read-mapname))) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag-with-newline + (concat "<MAP NAME=\"" name "\">") + 'hm--html-insert-end-tag-with-newline + "</MAP>")) + + (defun hm--html-add-numberlist () "Adds the HTML tags for a numbered list at the point in the current buffer." (interactive) @@ -1170,8 +1506,6 @@ "<OL>" 'hm--html-insert-end-tag-with-newline "</OL>")) -; 'hm--html-insert-start-tag -; "<LI> ")) (defun hm--html-add-directory-list () @@ -1193,8 +1527,6 @@ "<DIR>" 'hm--html-insert-end-tag-with-newline "</DIR>")) -; 'hm--html-insert-start-tag -; "<LI> ")) (defun hm--html-add-list () @@ -1217,19 +1549,6 @@ "<UL>" 'hm--html-insert-end-tag-with-newline "</UL>")) -; 'hm--html-insert-start-tag -; "<LI> ")) - - -;(defun hm--html-add-menu () -; "Adds the HTML tags for a menu." -; (interactive) -; (hm--html-add-tags 'hm--html-insert-start-tag-with-newline -; "<MENU>" -; 'hm--html-insert-end-tag-with-newline -; "</MENU>" -; 'hm--html-insert-start-tag -; "<LI> ")) (defun hm--html-add-menu () @@ -1253,9 +1572,6 @@ 'hm--html-insert-end-tag-with-newline "</MENU>")) -; 'hm--html-insert-start-tag -; "<LI> ")) - (defun hm--html-add-description-title-and-entry () "Adds a definition title and entry. @@ -1356,30 +1672,33 @@ (defun hm--html-make-signature-link-string (signature-file-name) "Returns a string which is a link to a signature file." (concat - "<A Name=" + "<A NAME=\"" hm--html-signature-reference-name - " HREF=\"" + "\"\nHREF=\"" signature-file-name "\">")) - + (defun hm--html-delete-old-signature () "Searches for the old signature and deletes it, if the user want it" (save-excursion (goto-char (point-min)) (let ((case-fold-search t)) - (if (search-forward (concat "<address> " - "<a name=" - hm--html-signature-reference-name - " href=\"") - nil - t) + (if (re-search-forward (concat "<address>[ \t\n]*" + "<a[ \t\n]+name=[ \t\n]*\"?" + hm--html-signature-reference-name + "\"?[ \t\n]+href=[ \t\n]*\"") + nil + t) (let ((signature-start (match-beginning 0)) (signature-end (progn - (search-forward "</address>" nil t) + (re-search-forward "</address>[ \t]*[\n]?" + nil + t) (point)))) - (if (yes-or-no-p "Delete the old signature (yes or no) ?") - (delete-region signature-start signature-end))))))) + (when (yes-or-no-p "Delete the old signature (yes or no) ?") + (delete-region signature-start signature-end) + (hm--html-indent-line))))))) (defun hm--html-set-point-for-signature () @@ -1392,7 +1711,7 @@ (cond ((search-backward "</body>" nil t) (end-of-line 0) (if (> (current-column) 0) - (newline 2))) + (newline 1))) ((search-backward "</html>" nil t) (end-of-line 0) (if (> (current-column) 0) @@ -1412,10 +1731,10 @@ (save-excursion (hm--html-delete-old-signature) (hm--html-set-point-for-signature) - (hm--html-add-tags 'hm--html-insert-start-tag - "<ADDRESS> " + (hm--html-add-tags 'hm--html-insert-start-tag-with-newline + "<ADDRESS>" 'hm--html-insert-end-tag - "</A></ADDRESS>" + "</A>\n</ADDRESS>" 'hm--html-insert-start-tag (hm--html-make-signature-link-string hm--html-signature-file) @@ -1459,9 +1778,9 @@ this tag or the beginning of the file otherwise." (goto-char (point-min)) (let ((case-fold-search t)) - (cond ((search-forward-regexp "<isindex>" nil t) (newline)) - ((search-forward-regexp "<head>" nil t) (newline)) - ((search-forward-regexp "<html>" nil t) (newline)) + (cond ((search-forward-regexp "<isindex[^>]*>" nil t) (newline)) + ((search-forward-regexp "<head[^>]*>" nil t) (newline)) + ((search-forward-regexp "<html[^>]*>" nil t) (newline)) (t)))) @@ -1522,7 +1841,8 @@ (defun hm--html-add-html () "Adds the HTML tags <HTML> and </HTML> in the buffer. -The tag <HTML> will be inserted at the beginning and </HTML> at the +The tag <HTML> will be inserted at the beginning (after the +<!DOCTYPE ...>, if it is already there.) and </HTML> at the end of the file." (interactive) (let ((new-cursor-position nil) @@ -1531,6 +1851,7 @@ (goto-char (point-min)) (if (search-forward "<html>" nil t) (error "There is an old tag <HTML> in the current buffer !") + (re-search-forward "<!DOCTYPE[^>]*>[ \t\n]*" nil t) (hm--html-add-tags 'hm--html-insert-start-tag-with-newline "<HTML>") ; (newline 1) ) @@ -1545,11 +1866,13 @@ (defun hm--html-add-head () "Adds the HTML tags <HEAD> and </HEAD> in the buffer. -The tags will be inserted after <HTML> or at the beginning of the file. +The tags will be inserted after <HTML> or at the beginning +of the file after <DOCTYPE...> (if it is already there). The function also looks for the tags <BODY> and </TITLE>." (interactive) (let ((case-fold-search t)) (goto-char (point-min)) + (re-search-forward "<!DOCTYPE[^>]*>[ \t\n]*" nil t) (if (search-forward "<html>" nil t) (if (search-forward "<head>" nil t) (error "There is an old tag <HEAD> in the current buffer !") @@ -1607,7 +1930,7 @@ (if (search-backward "<body>" nil t) (error "There is an old tag <BODY> in the current buffer !"))) (forward-char -1))) - (let ((end-tag-position (point))) + (let ((end-tag-position (set-marker (make-marker) (point)))) (if (search-backward "</head>" nil t) (progn (forward-char 7) @@ -1615,7 +1938,7 @@ (hm--html-add-tags 'hm--html-insert-start-tag-with-newline "<BODY>") (let ((cursor-position (point))) - (goto-char (+ end-tag-position 8)) + (goto-char end-tag-position) (hm--html-add-tags 'hm--html-insert-end-tag-with-newline "</BODY>") (goto-char cursor-position) @@ -1637,9 +1960,6 @@ (defun hm--html-add-title-and-header (title) "Adds the HTML tags for a title and a header in the current buffer." -; (interactive "sTitle and Header String: \nnHeader Size (1 .. 6): ") -; (if (> size 6) -; (message "The size must be a number from 1 to 6 !") (interactive "sTitle and Header String: ") (let ((case-fold-search t)) (hm--html-add-title title) @@ -1661,10 +1981,6 @@ (defun hm--html-add-title-and-header-to-region () "Adds the HTML tags for a title and a header to the region." -;The parameter 'size' spezifies the size of the header.";" -; (interactive "nSize (1 .. 6): ") -; (if (> size 6) -; (message "The size must be a number from 1 to 6 !") (interactive) (let ((title (buffer-substring (region-beginning) (region-end)))) (hm--html-add-header-to-region 1) @@ -1678,6 +1994,7 @@ title and the header of the document." (interactive "sTitle and Header String: ") (let ((case-fold-search t)) + (hm--html-add-doctype) (hm--html-add-html) (hm--html-add-head) (hm--html-add-body) @@ -1698,6 +2015,7 @@ the string for the title and the header of the document." (interactive) (hm--html-add-title-and-header-to-region) + (hm--html-add-doctype) (hm--html-add-html) (hm--html-add-head) (hm--html-add-body)
--- a/lisp/hyperbole/ChangeLog Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/ChangeLog Mon Aug 13 09:15:11 2007 +0200 @@ -1,12 +1,222 @@ -Sat Nov 4 04:41:49 1995 Bob Weiner <weiner@gnu.ai.mit.edu> +Fri Feb 21 17:49:01 1997 Bob Weiner <weiner@infodock.com> + +* hmouse-reg.el (hmouse-get-bindings): + (hmouse-setup): +* hmouse-sh.el (hmouse-get-bindings): + (hmouse-setup): +* hmouse-key.el (hmouse-set-bindings): +Modified to do nothing when running in batch mode (noninteractively). + + +============================================================================== +V4.021 changes ^^^^: +============================================================================== + +Tue Feb 18 18:57:27 1997 Bob Weiner <weiner@infodock.com> + +* hui-mini.el (hui:menus): Added "Doc/About" menu item +* hui-menu.el (infodock-hyperbole-menu): Added "About" menu item. +* hypb.el (hypb:ida-logo-keymap): + (hypb:ida-home-page): + (hypb:display-file-with-logo): Added to support About Hyperbole command. + +Mon Feb 17 15:27:21 1997 Bob Weiner <weiner@infodock.com> + +* hversion.el (hyperb:microcruft-os-p): Added. + +Sat Feb 15 16:03:42 1997 Bob Weiner <weiner@infodock.com> + +* hpath.el (hpath:find): Fixed bug that returned nil (now is 't) if file + was displayed using a specialized function. + (hpath:find-line): Added to handle displaying of all files at + specific lines (hpath:find does not work for this use since it + may call external display functions). +* hactypes.el (link-to-file-line): Rewrote to call hpath:find-line. + +Fri Feb 14 11:39:09 1997 Bob Weiner <weiner@infodock.com> + +* hrmail.el (rmail-forward): Updated to V19 compatibility. + +Sun Jan 26 14:32:28 1997 Bob Weiner <weiner@infodock.com> + +* hmouse-sh.el (hmouse-get-bindings): +* hmouse-reg.el (hmouse-get-bindings): Rearranged order of initial + conditional so that lemacs or emacs19 always takes precedence over + hyperb:window-system setting, which may be "xterm". + +* hmouse-key.el (or hyperb:xemacs-p hyperb:emacs19-p): Prevent any attempt + to load pre-dumped mouse libraries when running under X terms on these + versions of emacs. + +* hyperbole.el (hbut:key-src): Added this autoload to avert error if the + rolodex is loaded before the Hyperbole system and then a rolo-edit, {e}, + request is made within the match buffer. -* kotl/kfill.el (fill-paragraph): Fixed interface problem with Emacs 19 - which expected justify-flag = 'full. +* hgnus.el: Updated to support new Gnus gnus-msg.el replacement for gnuspost.el. + +* hversion.el (sm-window-sys-term): +* hbmap.el (hbmap:dir-user): Patched to support GNU Emacs running + natively under Windows NT. + +Tue Jan 14 15:45:14 1997 Bob Weiner <weiner@infodock.com> + +* ../../etc/hypb-mouse.txt (Special Modes): Added Objective-C, Java and + Fortran support documentation. + +Mon Jan 6 18:59:13 1997 Bob Weiner <weiner@infodock.com> + +* kotl/klink.el (klink:at-p): Eliminated matches to URLs for now. + +Wed Dec 25 22:01:05 1996 Bob Weiner <weiner@infodock.com> + +* hmouse-tag.el: Changed all opening quotes in comments from ' to `. + +Tue Dec 10 16:40:09 1996 Bob Weiner <weiner@infodock.com> + +* wrolo.el (wrolo-mode-syntax-table): Added to support syntactic selection + of delimited e-mail addresses. + +Fri Dec 6 12:34:31 1996 Bob Weiner <weiner@infodock.com> + +* hmail.el (hmail:region): Fixed bug that extracted region from the wrong + buffer. + +Thu Dec 5 15:34:55 1996 Bob Weiner <weiner@infodock.com> + +* hibtypes.el (annot-bib): Eliminated conflict with PPG-sw-process-id + ibtype. + +* hpath.el (hpath:is-p): Fixed error triggered when tried to format a path + with more than one %s. + +Wed Dec 4 13:39:09 1996 Bob Weiner <weiner@infodock.com> + +* kotl/kmenu.el (id-menubar-kotl): Fixed so this mode menu is properly + installed under InfoDock. + +Tue Nov 26 21:21:50 1996 Bob Weiner <weiner@infodock.com> + +* hui-menu.el (infodock-hyperbole-menu): Added Customization option that + sets the program used to display URLs. + +Thu Nov 14 18:11:36 1996 Bob Weiner <weiner@infodock.com> + +* hmouse-tag.el (smart-*-at-tag-p): Modified to flash tag as a hyperbutton + when pressed, if Hyperbole has been loaded and flashing is supported + on the current device. + +* hbut.el (ibut:label-set): Made this return its LABEL argument. Useful + when label has not yet been saved in a variable. -* hmail.el (hmail:region): Fixed bug with wrong current buffer that caused - outliner {C-c @} command to fail. +* kotl/klink.el (klink:at-p): Ignore HTML and SGML tags when looking for Klinks. + +Sun Nov 10 01:47:01 1996 Bob Weiner <weiner@infodock.com> + +* wrolo.el (rolo-sort-level): Made case-insensitive. + (rolo-add): Fixed bug caused by a call to widen that sometimes + failed to leave point at the newly added entry if the rolodex + buffer was already displayed when the rolo-add call was made. + +* hmouse-tag.el (smart-lisp): Display message and beep when tag is not found. + +* hibtypes.el (function-in-buffer): +* hactypes.el (function-in-buffer): Added to follow function references + that are defined in the same buffer as the reference. + (annot-bib): + (exec-shell-cmd): + (man-show): + (rfc-toc): Updated all of these to use hpath:display-where + output display setting. + (link-to-elisp-doc): Also modified to move point to the + documentation buffer. + +* hui.el (hui:hbut-current-act): Added. + +Fri Nov 8 21:37:34 1996 Bob Weiner <weiner@infodock.com> + +* hbut.el (ebut:act): Added for use when activating an explicit button + from a menu. + (ebut:list): Fixed bug that returned (nil) when no explicit + buttons were found. +* hui-menu.el (hui-menu-explicit-buttons): Added to display a list of + explicit buttons for activation via the Explicit-Button menu. +* hui-menu.el (hyperbole-gbut-menu): Added to display a list of existing + global buttons for activation via the Global-Button menu. + +Tue Nov 5 19:26:17 1996 Bob Weiner <weiner@infodock.com> + +* hibtypes.el (pathname): Modified to display Emacs Lisp libraries when + given as delimited filenames, without any path. + +Fri Nov 1 00:26:13 1996 Bob Weiner <weiner@infodock.com> + +* hui-mouse.el (hkey-alist): Moved OO-Browser handler to near bottom so + that it does not override mode-specific handlers. + +Thu Oct 31 20:01:34 1996 Bob Weiner <weiner@infodock.com> -Fri Nov 3 22:40:34 1995 Bob Weiner <weiner@gnu.ai.mit.edu> +* hui-mouse.el (hkey-alist): Added Action and Assist key support for Java + identifiers. +* hyperbole.el: Added Java autoloads. +* hmouse-tag.el (smart-java-package-dirs): Added this variable as the + setting of where Java package source code can be found when the + OO-Browser is not in use. Defaults to a single item list of + "${JAVA_HOME}/src/" if JAVA_HOME is set. + (smart-java-*): Added point and click identifier jumping for Java. + (smart-tags-file): Added optional argument NAME-OF-TAGS-FILE + so can search for OO-Browser lookup tables. + (smart-java-cross-reference): Added to follow @see cross-references. + +Sat Oct 26 01:05:29 1996 Bob Weiner <weiner@infodock.com> + +* hui-menu.el (infodock-hyperbole-menu): Added Customization submenu. +* hui-mini.el (hui:menus): Added Cust/ submenu. + +* hbut.el (hbut:source): Fixed bug that neglected to account for double + quotes around the name within the printed representation of + a buffer object. + +Fri Oct 25 13:52:51 1996 Bob Weiner <weiner@infodock.com> + +* hmouse-tag.el: Updated function to use with new buffer display protocol. +* hactypes.el: Updated many definitions here to use hpath:find and + hpath:display-buffer. +* hui-mouse.el (smart-dired): Changed call of hpath:find-other-window to + hpath:find to use new user-definable display location protocol. +* hpath.el (hpath:find): Expanded optional values of 2nd arg and made + default location of an internally displayed file be given by the + value of the hpath:display-where variable. +* hpath.el (hpath:display-buffer): + (hpath:display-buffer-other-frame): Added for linked to buffers. + (hpath:find-other-frame): Added for use in hpath:display-where-alist. +* hsite-ex.el (hpath:display-where): + (hpath:display-where-alist): + (hpath:display-buffer-alist): + Added these new variables to control where Hyperbole displays link referents. + The first one documents the possibilities and the second two specify + the function to call for each possibility. + +Tue Oct 22 01:21:53 1996 Bob Weiner <weiner@infodock.com> + +* kotl/kvspec.el (kvspec:update-modeline): Fixed to accomodate specialized + extents in the modeline introduced by XEmacs 19.14. + +* hui-mouse.el (hkey-alist): Added support for new id-edit-mode which + can be setup to activate whenever a region is highlighted with the + mouse. When id-edit-mode is active the Action Key (or the Assist Key) + will paste the region that was highlighted at point. The key {y} also + happens to do the same thing in this mode, but has the additional + property that it will cycle through previous entries in the kill-ring. + +Fri Sep 20 22:19:33 1996 Bob Weiner <weiner@infodock.com> + +* Changed `cs.uiuc.edu' to `xemacs.org', the new Hyperbole distribution site. + +============================================================================== +V4.02 changes ^^^^: +============================================================================== + +Fri Nov 3 22:40:34 1995 Bob Weiner <weiner@infodock.com> * hsys-w3.el: Renamed entries in this file and added action-key-url-function definition in "hyperbole.el", which can be @@ -14,18 +224,18 @@ the Action Key. Also, loaded this library by default instead of requiring that it be set up in "hsite.el". -Fri Nov 3 19:25:24 1995 Bob Weiner <weiner@gnu.ai.mit.edu> +Fri Nov 3 19:25:24 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode): Fixed so re-narrows a formatted koutline to just its cells when invoked. -Fri Nov 3 19:29:58 1995 Bob Weiner <weiner@gnu.ai.mit.edu> +Fri Nov 3 19:29:58 1995 Bob Weiner <weiner@infodock.com> * kotl/kvspec.el (kvspec:blank-lines): Modified to allow toggling blank lines in a read-only outline and to not change the modification status of the buffer when kvspec:toggle-blank-lines is used. -Fri Nov 3 01:28:44 1995 Bob Weiner <weiner@gnu.ai.mit.edu> +Fri Nov 3 01:28:44 1995 Bob Weiner <weiner@infodock.com> * man/hypb-mouse.txt: Updated to reflect new smart-scroll-proportional default setting. @@ -38,7 +248,7 @@ V4.01 changes ^^^^: ============================================================================== -Thu Nov 2 00:52:26 1995 Bob Weiner <weiner@mot.com> +Thu Nov 2 00:52:26 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:cell-help): Fixed this, the {C-c h} command to properly deal with a cell-ref = 0. In this case, always display @@ -47,7 +257,7 @@ * kotl/kview.el (kcell-view:previous): Fixed bug that moved to a hidden cell when visible-p flag was given. -Wed Nov 1 02:05:36 1995 Bob Weiner <weiner@mot.com> +Wed Nov 1 02:05:36 1995 Bob Weiner <weiner@infodock.com> * kotl/klink.el (klink:parse): Changed to require a common following any pathname in a link to prevent parsing, <3g |en>, as a pathname followed @@ -61,7 +271,7 @@ * kotl/kotl-mode.el: Fixed improper modification of global minor-mode-alist and mode-line-format values. -Tue Oct 31 00:45:44 1995 Bob Weiner <weiner@mot.com> +Tue Oct 31 00:45:44 1995 Bob Weiner <weiner@infodock.com> * wrolo.el (rolo-mail-to): Added to compose mail to current or next e-mail address when in a rolodex or mail buffer. Bound to {m} in rolodex @@ -73,7 +283,7 @@ * kotl/kotl-mode.el (kotl-mode:to-valid-position): Optimized a bit further. -Mon Oct 30 01:37:31 1995 Bob Weiner <weiner@mot.com> +Mon Oct 30 01:37:31 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:copy-to-buffer): Made the default buffer to copy to the buffer in the other window of this frame, if any. Also @@ -102,7 +312,7 @@ * kotl/kimport.el: Rewrote all of these functions to handle importation at an arbitrary level in an existing koutline. -Sun Oct 29 01:26:25 1995 Bob Weiner <weiner@mot.com> +Sun Oct 29 01:26:25 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:demote-tree): (kotl-mode:promote-tree): Fixed bug that could leave @@ -135,7 +345,7 @@ foreign text buffer when kotl-mode calls this function within a foreign format buffer. -Sat Oct 28 02:32:12 1995 Bob Weiner <weiner@mot.com> +Sat Oct 28 02:32:12 1995 Bob Weiner <weiner@infodock.com> * kotl/klink.el (klink:create): (link-to-kotl): @@ -148,7 +358,7 @@ character from : to |. Augment viewspec characters preceded by a colon are ignored, for now. -Fri Oct 27 15:16:11 1995 Bob Weiner <weiner@mot.com> +Fri Oct 27 15:16:11 1995 Bob Weiner <weiner@infodock.com> * kotl/kview.el (kview:set-label-separator): Rewrote so properly changes the separator in the current view. Made it interactive and removed @@ -161,7 +371,7 @@ * kotl/kprop-xe.el (kproperty:properties): Changed definition since text-properties-at did not return the list of kproperties. -Thu Oct 26 00:06:49 1995 Bob Weiner <weiner@mot.com> +Thu Oct 26 00:06:49 1995 Bob Weiner <weiner@infodock.com> * hui-mini.el (hui:menus): Simplified a number of documentation display entries. @@ -194,7 +404,7 @@ (kimport:text-cells): Added to import text paragraph as cells all at the same level. -Wed Oct 25 02:24:35 1995 Bob Weiner <weiner@mot.com> +Wed Oct 25 02:24:35 1995 Bob Weiner <weiner@infodock.com> * kotl/kfile.el (kfile:update): Added kotl-mode setting to the first line of koutline files so they are read in with the right mode even if they @@ -218,11 +428,11 @@ Hyperbole, installing it and filled out the whole Hyperbole Outliner chapter. -Tue Oct 24 03:52:40 1995 Bob Weiner <weiner@mot.com> +Tue Oct 24 03:52:40 1995 Bob Weiner <weiner@infodock.com> * man/hyperbole.texi (Configuration): Renamed from Initializing. -Mon Oct 23 01:00:54 1995 Bob Weiner <weiner@mot.com> +Mon Oct 23 01:00:54 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:top-cells): Simplified and fixed to utilize blank lines setting. @@ -260,7 +470,7 @@ * kotl/EXAMPLE.kotl: Updated to explain view spec handling. -Sun Oct 22 00:38:45 1995 Bob Weiner <weiner@mot.com> +Sun Oct 22 00:38:45 1995 Bob Weiner <weiner@infodock.com> * hbut.el (ebut:key-src): Fixed bug that prevented match to hbut:source-prefix line when in a collapsed outline line. @@ -281,7 +491,7 @@ wrolo-menu.el (wrolo-menubar-menu): Fixed bug when current-menubar was nil, would not display menubar entry under Emacs 19 even though it should. -Sat Oct 21 01:07:32 1995 Bob Weiner <weiner@mot.com> +Sat Oct 21 01:07:32 1995 Bob Weiner <weiner@infodock.com> * kotl/kview.el (kview:default-blank-lines): (kview:default-levels-to-show): @@ -307,23 +517,23 @@ * kotl/kfill.el (kfill:prefix-table): Generalized supercite citation prefix. -Tue Oct 17 01:21:37 1995 Bob Weiner <weiner@mot.com> +Tue Oct 17 01:21:37 1995 Bob Weiner <weiner@infodock.com> * hinit.el (hyperb:check-dir-user): Call make-directory function if available. -Mon Oct 16 01:02:19 1995 Bob Weiner <weiner@mot.com> +Mon Oct 16 01:02:19 1995 Bob Weiner <weiner@infodock.com> * wrolo.el (rolo-file-list): Set to c:/_rolodex.otl under MS-DOS and Windows. * hbmap.el (hbmap:dir-user): Set to c:/_hyperb/ under MS-DOS and Windows. * hbut.el (hattr:filename): Set to _hypb under MS-DOS and Windows. -Sun Oct 15 17:32:46 1995 Bob Weiner <weiner@mot.com> +Sun Oct 15 17:32:46 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:copy-region-as-kill): Don't trigger error when called in a read-only buffer. -Fri Oct 6 12:56:57 1995 Bob Weiner <weiner@mot.com> +Fri Oct 6 12:56:57 1995 Bob Weiner <weiner@infodock.com> * hui-mouse.el (hkey-alist): Moved Smart Menu display code closer to highest priority so that hkey-always-display-menu works as advertised. @@ -332,18 +542,18 @@ Emacs 19 when depress in a minibuffer window. This fixes the problem of the Action Key not properly selecting Hyperbole minibuffer menu items. -Thu Oct 5 14:31:56 1995 Bob Weiner <weiner@mot.com> +Thu Oct 5 14:31:56 1995 Bob Weiner <weiner@infodock.com> * hui-menu.el (hyperbole-menubar-menu): Added omitted (require 'lmenu) for Emacs 19 that prevented Hyperbole menubar from appearing under Emacs 19. -Wed Oct 4 12:41:24 1995 Bob Weiner <weiner@mot.com> +Wed Oct 4 12:41:24 1995 Bob Weiner <weiner@infodock.com> * hsite-ex.el (hkey-always-display-menu): Added this definition to prevent it from being unbound if smart-menu is invoked and the Smart Menu system is loaded under InfoDock. -Wed Sep 27 01:56:53 1995 Bob Weiner <weiner@mot.com> +Wed Sep 27 01:56:53 1995 Bob Weiner <weiner@infodock.com> * wrolo.el (rolo-edit): Modified to treat an empty string argument for NAME as a null argument, so one can just hit RET interactively. Also, @@ -354,7 +564,7 @@ within the rolodex match buffer. * man/hyperbole.texi (Rolo Keys): Documented {e} key. -Mon Sep 25 11:15:49 1995 Bob Weiner <weiner@mot.com> +Mon Sep 25 11:15:49 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:indent-line): (kotl-mode:indent-region): Added. Each signals an @@ -364,7 +574,7 @@ * hyperbole.el (hmail:msg-narrow): Added autoload. -Fri Sep 22 17:14:05 1995 Bob Weiner <weiner@mot.com> +Fri Sep 22 17:14:05 1995 Bob Weiner <weiner@infodock.com> * hsite-ex.el (hpath:display-alist): Fixed bug in handling info-suffix variable scoping that prevented Action Key from browsing info files in
--- a/lisp/hyperbole/ChangeLog.1 Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/ChangeLog.1 Mon Aug 13 09:15:11 2007 +0200 @@ -1,9 +1,9 @@ -Thu Sep 21 11:44:51 1995 Bob Weiner <weiner@mot.com> +Thu Sep 21 11:44:51 1995 Bob Weiner <weiner@infodock.com> * wrolo.el (rolo-name-and-email): Fixed bug that could cause current buffer to scroll. -Wed Sep 20 11:46:09 1995 Bob Weiner <weiner@mot.com> +Wed Sep 20 11:46:09 1995 Bob Weiner <weiner@infodock.com> * hypb.el (hypb:supercite-p): Fixed bug that returned nil when should have returned t. @@ -14,14 +14,14 @@ V3.19.09 changes ^^^^: ============================================================================== -Fri Sep 15 12:59:40 1995 Bob Weiner <weiner@mot.com> +Fri Sep 15 12:59:40 1995 Bob Weiner <weiner@infodock.com> * wrolo.el (rolo-name-and-email): Modified to work if point is in a mail or news summary listing buffer. * hui-window.el (assist-key-modeline): Simplified unburying of buffer. -Thu Sep 14 14:03:17 1995 Bob Weiner <weiner@mot.com> +Thu Sep 14 14:03:17 1995 Bob Weiner <weiner@infodock.com> * hmail.el (hmail:buffer): Modified to use logic in hmail:region. (hmail:region): @@ -43,7 +43,7 @@ * hactypes.el (link-to-Info-node): Removed hpath:validate call since that will cause some valid node references to not be accepted. -Wed Sep 13 13:23:24 1995 Bob Weiner <weiner@mot.com> +Wed Sep 13 13:23:24 1995 Bob Weiner <weiner@infodock.com> * kotl/kfill.el: Renamed most functions from filladapt- to kfill:, to avoid conflicts with the new minor mode filladapt. @@ -75,7 +75,7 @@ * hsite-ex.el: (hpath:display-alist): Modified to handle compressed info files. -Mon Sep 11 14:00:29 1995 Bob Weiner <weiner@mot.com> +Mon Sep 11 14:00:29 1995 Bob Weiner <weiner@infodock.com> * hmouse-tag.el (smart-c-include-file): (smart-asm-include-file): Fixed to display include file in @@ -86,7 +86,7 @@ * hargs.el (hargs:at-p): Return klink as a list, not a string. (hargs:read): Convert klink to a string after reading it. -Wed Aug 30 16:34:34 1995 Bob Weiner <weiner@mot.com> +Wed Aug 30 16:34:34 1995 Bob Weiner <weiner@infodock.com> * man/hyperbole.texi (Smart Keyboard Keys): Updated to describe URL and gomoku support. @@ -98,22 +98,22 @@ V3.19.08 changes ^^^^: ============================================================================== -Sun Aug 27 04:55:17 1995 Bob Weiner <weiner@mot.com> +Sun Aug 27 04:55:17 1995 Bob Weiner <weiner@infodock.com> * hibtypes.el (patch-msg): Jumps to source associated with patch output lines that begin with "Hunk" or "Patching". -Sat Aug 26 21:30:45 1995 Bob Weiner <weiner@mot.com> +Sat Aug 26 21:30:45 1995 Bob Weiner <weiner@infodock.com> * hibtypes.el (grep-msg): Added support for Perl5 error message parsing. -Fri Aug 25 00:30:08 1995 Bob Weiner <weiner@mot.com> +Fri Aug 25 00:30:08 1995 Bob Weiner <weiner@infodock.com> * kotl/kmenu.el (id-menubar-kotl): (id-popup-kotl-menu): Added Hide-Levels, Hide-Subtree, Show-Subtree menu items. Also enabled Copy-Before/After-Cell menu items. - hui-menus.el (hui:menus): Added 'Below' (same as {C-x $}) and 'Kill' + hui-menus.el (hui:menus): Added `Below' (same as {C-x $}) and `Kill' (same as {C-c C-k}) menu items to Outliner menu. ============================================================================== @@ -132,20 +132,20 @@ collapsed subtree but was not itself collapsed and point was not on the final line of the cell. -Thu Aug 24 23:32:28 1995 Bob Weiner <weiner@mot.com> +Thu Aug 24 23:32:28 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:hide-subtree): Added to hide the subtree, excluding root of a cell. Bound to {C-M-h}. (kotl-mode:show-subtree): Added to show the subtree, excluding root of a cell. -Wed Aug 23 12:34:48 1995 Bob Weiner <weiner@mot.com> +Wed Aug 23 12:34:48 1995 Bob Weiner <weiner@infodock.com> * hpath.el (hpath:url-at-p): (hpath:url-p): Fixed to handle more URL specifications and to delete trailing periods and other characters properly. -Tue Aug 22 12:08:53 1995 Bob Weiner <weiner@mot.com> +Tue Aug 22 12:08:53 1995 Bob Weiner <weiner@infodock.com> * hui-menu.el (hyperbole-menubar-menu): wrolo-menu.el (wrolo-menubar-menu): @@ -156,12 +156,12 @@ V3.19.06 changes ^^^^: ============================================================================== -Wed Aug 16 12:41:09 1995 Bob Weiner <weiner@mot.com> +Wed Aug 16 12:41:09 1995 Bob Weiner <weiner@infodock.com> * hibtypes.el (mail-address-regexp): Corrected omission of underscores in addresses. -Thu Aug 10 17:36:23 1995 Bob Weiner <weiner@mot.com> +Thu Aug 10 17:36:23 1995 Bob Weiner <weiner@infodock.com> * hpath.el (hpath:at-p): Modified to handle local file URLs like file://localhost/ just as other local file references. @@ -169,7 +169,7 @@ * hargs.el (hargs:delimited): Modified to accomodate long string delimiters where point might be in the middle of the opening delimiter. -Wed Aug 9 18:37:54 1995 Bob Weiner <weiner@mot.com> +Wed Aug 9 18:37:54 1995 Bob Weiner <weiner@infodock.com> * hactypes.el (hyp-config): Reversed order of listing of Editor: and Hyperbole: lines. @@ -178,14 +178,14 @@ V3.19.05 changes ^^^^: ============================================================================== -Tue Aug 8 10:53:38 1995 Bob Weiner <weiner@mot.com> +Tue Aug 8 10:53:38 1995 Bob Weiner <weiner@infodock.com> * hgnus.el hsmail.el (smail:comment-add): Add to front of hook if add-hook exists so that if the mail/news buffer headers are highlighted, so is this comment header. -Mon Jul 31 15:33:29 1995 Bob Weiner <weiner@mot.com> +Mon Jul 31 15:33:29 1995 Bob Weiner <weiner@infodock.com> * kotl/kview.el (kview:insert-contents): (kcell-view:create): Moved call to kfile:narrow-to-kcells @@ -193,7 +193,7 @@ Otherwise, this call would leave kotl data exposed when a cell was inserted at the end of an outline. -Tue Jul 25 16:26:16 1995 Bob Weiner <weiner@mot.com> +Tue Jul 25 16:26:16 1995 Bob Weiner <weiner@infodock.com> * hibtypes.el (mail-address): Prevented from triggering in a mail or news summary buffer. @@ -204,12 +204,12 @@ V3.19.04 changes ^^^^: ============================================================================== -Fri Jul 14 17:03:27 1995 Bob Weiner <weiner@mot.com> +Fri Jul 14 17:03:27 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode): Changed hook used to save koutline data from write-contents-hooks to local-write-file-hooks. -Thu Jul 13 16:37:30 1995 Bob Weiner <weiner@mot.com> +Thu Jul 13 16:37:30 1995 Bob Weiner <weiner@infodock.com> * hui-em19-b.el (hproperty:but-add): Under Emacs 19, modified to highlight explicit buttons when mouse passes over them if @@ -222,13 +222,13 @@ called when only hyperbole.el has been loaded by a site initialization but the individual user never uses Hyperbole. -Mon Jul 10 11:49:52 1995 Bob Weiner <weiner@mot.com> +Mon Jul 10 11:49:52 1995 Bob Weiner <weiner@infodock.com> * hui-mouse.el (hkey-alist): * hmouse-tag.el (smart-fortran): (smart-fortran-at-tag-p): Added Fortran tags browsing support. -Fri Jul 7 14:02:28 1995 Bob Weiner <weiner@mot.com> +Fri Jul 7 14:02:28 1995 Bob Weiner <weiner@infodock.com> * hsite-ex.el (hpath:display-alist): Modified to display files below an /info/ directory but with a non-info suffix, in whatever their normal @@ -259,12 +259,12 @@ separator search routines. Inheritance was already off by default for characters preceding this region. -Thu Jul 6 14:24:40 1995 Bob Weiner <weiner@mot.com> +Thu Jul 6 14:24:40 1995 Bob Weiner <weiner@infodock.com> * hmouse-drv.el (hkey-help-show): Fixed a bug that failed to properly check whether a help buffer was already displayed. -Sun Jun 25 17:16:21 1995 Bob Weiner <weiner@mot.com> +Sun Jun 25 17:16:21 1995 Bob Weiner <weiner@infodock.com> * kotl/kimport.el (kimport:star-outline): Modified to handle start outlines whose stars are preceded by whitespace. @@ -281,7 +281,7 @@ * kotl/kview.el (kview:add-cell): Added optional parameter no-fill to skip filling of any initial cell contents. -Fri Jun 23 11:58:24 1995 Bob Weiner <weiner@mot.com> +Fri Jun 23 11:58:24 1995 Bob Weiner <weiner@infodock.com> * hyperbole.el (Info-goto-node): Added autoload of this for Hyperbole menus. @@ -302,7 +302,7 @@ V3.19.02 changes ^^^^: ============================================================================== -Wed Jun 21 00:42:12 1995 Bob Weiner <weiner@mot.com> +Wed Jun 21 00:42:12 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:fill-tree): Modified to support filling 0 rooted tree, i.e. all cells in outline, when given a prefix argument. @@ -320,7 +320,7 @@ * MANIFEST: * Makefile (EL_KOTL, ELC_KOTL): Added references to new kprop-* files. -Tue Jun 20 10:54:18 1995 Bob Weiner <weiner@mot.com> +Tue Jun 20 10:54:18 1995 Bob Weiner <weiner@infodock.com> * kotl/kproperty.el (kproperty:put): Fixed XEmacs version of this function by using raw extents instead of text properties. @@ -333,7 +333,7 @@ * kotl/kproperty.el (kproperty:map): Added to map over a matching property in a buffer and to return the result. -Mon Jun 19 18:50:34 1995 Bob Weiner <weiner@mot.com> +Mon Jun 19 18:50:34 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:demote-tree): (kotl-mode:promote-tree): @@ -348,7 +348,7 @@ V3.19.01 changes ^^^^: ============================================================================== -Thu Jun 15 00:24:34 1995 Bob Weiner <weiner@mot.com> +Thu Jun 15 00:24:34 1995 Bob Weiner <weiner@infodock.com> * kotl/kview.el (kcell-view:previous): Expanded cases that will find previous cell. @@ -363,7 +363,7 @@ * kotl/kview.el (kcell-view:previous): (kcell-view:next): Optimized. -Wed Jun 14 01:49:45 1995 Bob Weiner <weiner@mot.com> +Wed Jun 14 01:49:45 1995 Bob Weiner <weiner@infodock.com> * kotl/kview.el (kview:goto-cell-id): Speeded up by up to 10x with optimized implementations for each Emacs variant. @@ -394,27 +394,27 @@ * kotl/kview.el (kview:move): Optimized to skip mapping over a tree to re-collapse cells if none were collapsed. -Tue Jun 13 16:35:42 1995 Bob Weiner <weiner@mot.com> - -* hmous-info.el (Info-handle-in-note): Added support for 'See' +Tue Jun 13 16:35:42 1995 Bob Weiner <weiner@infodock.com> + +* hmous-info.el (Info-handle-in-note): Added support for `See' cross-references used by XEmacs. ============================================================================== V3.19 changes ^^^^: ============================================================================== -Tue Jun 13 16:35:42 1995 Bob Weiner <weiner@mot.com> +Tue Jun 13 16:35:42 1995 Bob Weiner <weiner@infodock.com> * hinit.el (hyperb:init-menubar): * hui-menu.el (hyperbole-menubar-menu): Modified to re-install Hyperbole menu in InfoDock menubar after using the menu's Quit item. -Mon Jun 12 19:31:28 1995 Bob Weiner <weiner@mot.com> +Mon Jun 12 19:31:28 1995 Bob Weiner <weiner@infodock.com> * kotl/klabel.el (klabel-type:set-alpha): Optimized alpha and legal renumbering. Cut time by about 50% for multi-level outlines. -Tue Jun 6 12:34:47 1995 Bob Weiner <weiner@mot.com> +Tue Jun 6 12:34:47 1995 Bob Weiner <weiner@infodock.com> * kotl/klabel.el kview.el @@ -424,7 +424,7 @@ * kotl/kotl-mode.el (kotl-mode-map): Fixed to handle {M-q} bound to fill-paragraph-or-region in XEmacs. -Mon Jun 5 16:56:58 1995 Bob Weiner <weiner@mot.com> +Mon Jun 5 16:56:58 1995 Bob Weiner <weiner@infodock.com> * hui-menu.el (infodock-hyperbole-menu): Made "Quit" menu item remove Hyperbole comment from future outgoing mail and remove Hyperbole menu @@ -434,7 +434,7 @@ V3.18.13 changes ^^^^: ============================================================================== -Fri Jun 2 11:29:11 1995 Bob Weiner <weiner@mot.com> +Fri Jun 2 11:29:11 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:beginning-of-tree): Added and bound to {C-c ^}. (kotl-mode:end-of-tree): Addded and bound to {C-c $}. @@ -448,7 +448,7 @@ * man/hyperbole.texi (Outliner Keys): kotl/kotl-mode.el (kotl-mode:copy-to-buffer): Added and bound to {C-c M-c}. -Thu Jun 1 11:10:03 1995 Bob Weiner <weiner@mot.com> +Thu Jun 1 11:10:03 1995 Bob Weiner <weiner@infodock.com> * hui-window.el (smart-window-of-coords): (smart-coords-in-window-p): @@ -458,14 +458,14 @@ V3.18.12 changes ^^^^: ============================================================================== -Fri May 19 15:32:37 1995 Bob Weiner <weiner@mot.com> +Fri May 19 15:32:37 1995 Bob Weiner <weiner@infodock.com> * hui-menus.el (hyperbole): Added call to hyperb:init-menubar. * hinit.el (hyperb:init-menubar): Added to add Hyperbole menu to menubar. * hui-menu.el (infodock-hyperbole-menu): Added Quit menu item to delete the Hyperbole menu from the menubar. {C-h h} will bring it back again. -Thu May 18 12:23:01 1995 Bob Weiner <weiner@mot.com> +Thu May 18 12:23:01 1995 Bob Weiner <weiner@infodock.com> * Changed all cs.brown references to hub.ucsb.edu (for mail lists) and cs.uiuc.edu (for Hyperbole source). @@ -482,7 +482,7 @@ V3.18.11 changes ^^^^: ============================================================================== -Mon May 15 11:20:38 1995 Bob Weiner <weiner@mot.com> +Mon May 15 11:20:38 1995 Bob Weiner <weiner@infodock.com> * hmous-info.el (Info-handle-in-node-hdr): (Info-handle-in-menu): Fixed to handle Info references @@ -499,20 +499,20 @@ V3.18.10 changes ^^^^: ============================================================================== -Fri May 12 12:54:19 1995 Bob Weiner <weiner@mot.com> +Fri May 12 12:54:19 1995 Bob Weiner <weiner@infodock.com> * Makefile (dist): Updated to execute entire distribution build process. * hsite-ex.el (hyperb:lemacs-p): * hui-xe-but.el (hproperty:highlight-face): Fixed to highlight explicit - buttons and rolodex matches with the 'italic' face when used under + buttons and rolodex matches with the `italic' face when used under XEmacs on a tty. ============================================================================== V3.18.9 changes ^^^^: ============================================================================== -Tue May 9 12:45:21 1995 Bob Weiner <weiner@mot.com> +Tue May 9 12:45:21 1995 Bob Weiner <weiner@infodock.com> * Makefile (install): Changed to install documentation. @@ -534,7 +534,7 @@ assertion failure which looks like: assert_failed (file=0xf3c78 "eval.c", line=1412, -Mon May 8 14:30:56 1995 Bob Weiner <weiner@mot.com> +Mon May 8 14:30:56 1995 Bob Weiner <weiner@infodock.com> * man/hyperbole.texi (Operating Menus): * hui-menu.el (hyperbole-menubar-menu): @@ -554,10 +554,10 @@ V3.18.8 changes ^^^^: ============================================================================== -Fri May 5 14:33:51 1995 Bob Weiner <weiner@mot.com> +Fri May 5 14:33:51 1995 Bob Weiner <weiner@infodock.com> * Makefile: Removed building of Info and Postscript versions of the - Hyperbole manual from default 'make'. Use 'make info' and 'make ps', + Hyperbole manual from default `make'. Use `make info' and `make ps', respectively. * hui-xe-but.el: @@ -567,17 +567,17 @@ * kotl/kfile.el (kfile:update): Added (let ((debug-on-error nil)) so one can easily save koutlines while debugging Emacs Lisp code. -Tue May 2 11:08:53 1995 Bob Weiner <weiner@mot.com> +Tue May 2 11:08:53 1995 Bob Weiner <weiner@infodock.com> * Makefile (tags): Replaced all - with underscore in variable names to satisfy the AIX sh. -Mon May 1 15:50:33 1995 Bob Weiner <weiner@mot.com> +Mon May 1 15:50:33 1995 Bob Weiner <weiner@infodock.com> * hsite-ex.el (hpath:display-alist): Added display of top node when Action Key is pressed over an Info file name. -Fri Apr 28 19:18:13 1995 Bob Weiner <weiner@mot.com> +Fri Apr 28 19:18:13 1995 Bob Weiner <weiner@infodock.com> * hui-xe-but.el (hproperty:set-item-highlight): Fixed failure to set rolo-highlight-face when it is the same as the default font. @@ -586,28 +586,28 @@ V3.18.7 changes ^^^^: ============================================================================== -Mon Apr 24 10:49:30 1995 Bob Weiner <weiner@mot.com> +Mon Apr 24 10:49:30 1995 Bob Weiner <weiner@infodock.com> * hui-mouse.el (hkey-alist): Simplified support for view major and minor modes. -Sun Apr 23 13:21:20 1995 Bob Weiner <weiner@mot.com> +Sun Apr 23 13:21:20 1995 Bob Weiner <weiner@infodock.com> * hibtypes.el (debugger-source): Renamed from gdb-source and added dbx and xdb debugger support for jumping to source from a stack backtrace line. -Wed Apr 19 19:37:20 1995 Bob Weiner <weiner@mot.com> +Wed Apr 19 19:37:20 1995 Bob Weiner <weiner@infodock.com> * hmouse-tag.el (smart-tags-file-path): Added this function, used by ibtype gdb-source and actype link-to-file-line to find non-local, relative files. * hyperbole.el (smart-tags-file-path): Added autoload. -Tue Apr 18 11:49:27 1995 Bob Weiner <weiner@mot.com> +Tue Apr 18 11:49:27 1995 Bob Weiner <weiner@infodock.com> * hversion.el (id-tool-invoke): Fixed to handle interactive command calls. -Sun Apr 16 22:35:33 1995 Bob Weiner <weiner@mot.com> +Sun Apr 16 22:35:33 1995 Bob Weiner <weiner@infodock.com> * hversion.el (sm-window-sys-term): Support Emacs under OS/2 which uses the Presentation Manger window manager. @@ -621,37 +621,37 @@ V3.18.6 changes ^^^^: ============================================================================== -Fri Apr 14 15:31:17 1995 Bob Weiner <weiner@mot.com> +Fri Apr 14 15:31:17 1995 Bob Weiner <weiner@infodock.com> * man/hyperbole.ps: Removed from the distribution. Too large; users who need it can build it themselves. * man/hyperbole.texi (Action Types): Documented extension command - characters' use of '+' prefix. - -* hargs.el (hargs:iforms): Added basic support for new Emacs 19 'K' + characters' use of `+' prefix. + +* hargs.el (hargs:iforms): Added basic support for new Emacs 19 `K' command character. * *.el: Added KEYWORDS: header. -Wed Apr 12 11:26:03 1995 Bob Weiner <weiner@mot.com> +Wed Apr 12 11:26:03 1995 Bob Weiner <weiner@infodock.com> * hui-window.el (smart-coords-in-window-p): (smart-window-of-coords): Fixed to work with XEmacs 19.11 which can return nil for (event-window) if event is over a modeline. -Tue Apr 11 12:48:18 1995 Bob Weiner <weiner@mot.com> +Tue Apr 11 12:48:18 1995 Bob Weiner <weiner@infodock.com> * hargs.el (hargs:get): Added support for user extension interactive command characters that are being added to Emacs 19. Each such - character is preceded by a '+' character. + character is preceded by a `+' character. * hui-mouse.el (hkey-alist): Added Action/Assist key press support for OO-Browser listing buffers used when the full OO-Browser user interface is not displayed. -Mon Apr 10 17:41:54 1995 Bob Weiner <weiner@mot.com> +Mon Apr 10 17:41:54 1995 Bob Weiner <weiner@infodock.com> * Makefile (ELC-COMPILE): Added hsys-* files so they will be built. @@ -659,11 +659,11 @@ V3.18.5 changes ^^^^: ============================================================================== -Sat Apr 8 13:53:27 1995 Bob Weiner <weiner@mot.com> +Sat Apr 8 13:53:27 1995 Bob Weiner <weiner@infodock.com> * man/hyperbole.texi (Top): Added credits. -Fri Apr 7 17:21:04 1995 Bob Weiner <weiner@mot.com> +Fri Apr 7 17:21:04 1995 Bob Weiner <weiner@infodock.com> * kotl/kfile.el (kfile:update): kotl/kotl.el (kotl-data:create): Modified to repair invalid cells when @@ -671,7 +671,7 @@ (kotl-data:to-kcell-v3): Modified to repair invalid cells when trying to load them from a file. -Thu Apr 6 10:22:07 1995 Bob Weiner <weiner@mot.com> +Thu Apr 6 10:22:07 1995 Bob Weiner <weiner@infodock.com> * Makefile (PRELOADS): Added ref to $(SITE-PRELOADS) for customization of the Lisp libraries loaded before byte-compiling any files. @@ -681,7 +681,7 @@ * kotl/kmenu.el: Added this file of menus for the Koutliner from InfoDock and adapted for use under standard XEmacs. -Wed Apr 5 18:48:15 1995 Bob Weiner (weiner@mot.com) +Wed Apr 5 18:48:15 1995 Bob Weiner <weiner@infodock.com> * hinit.el (hyperb:init): Added setup of XEmacs pulldown menu for Hyperbole. * hui-menu.el: Added this file to provide a global pulldown menu of InfoDock @@ -690,7 +690,7 @@ and adapted for use under standard XEmacs. Also defines a rolodex menu which may be used independently of the Hyperbole menu. -Mon Apr 3 10:03:09 1995 Bob Weiner <weiner@mot.com> +Mon Apr 3 10:03:09 1995 Bob Weiner <weiner@infodock.com> * hyperbole.el (rolo-word): Autoloaded this command. @@ -698,17 +698,17 @@ V3.18.4 changes ^^^^: ============================================================================== -Tue Mar 28 12:22:27 1995 Bob Weiner <weiner@mot.com> +Tue Mar 28 12:22:27 1995 Bob Weiner <weiner@infodock.com> * hui-window.el (hmouse-release-left-edge): (hmouse-release-right-edge): Fixed bug which improperly - called 'window-event' when 'event-window' was intended. + called `window-event' when `event-window' was intended. Sun Mar 26 00:39:18 1995 Bob Weiner <weiner@meltdown.valhalla (Bob Weiner)> * man/hyperbole.texi: Renamed from hypb.texi. -Sat Mar 25 23:20:02 1995 Bob Weiner <weiner@mot.com> +Sat Mar 25 23:20:02 1995 Bob Weiner <weiner@infodock.com> * Makefile (elc): Cleaned up user output produced by this target. @@ -716,11 +716,11 @@ V3.18.3 changes ^^^^: ============================================================================== -Fri Mar 24 10:41:17 1995 Bob Weiner <weiner@mot.com> +Fri Mar 24 10:41:17 1995 Bob Weiner <weiner@infodock.com> * hibtypes.el (rfc): Updated to support efs too. * hpath.el (hpath:ange-ftp-p): - (hpath:ange-ftp-at-p): Added support for 'efs' package, the + (hpath:ange-ftp-at-p): Added support for `efs' package, the successor to ange-ftp. Also changed so can jump to remote pathnames if ange-ftp will be autoloaded via file-name-handler-alist under Emacs V19. @@ -728,7 +728,7 @@ * Makefile (elc): Rewrote in a portable manner so that one emacs invocation builds all elc files. -Thu Mar 23 03:23:51 1995 Bob Weiner <weiner@mot.com> +Thu Mar 23 03:23:51 1995 Bob Weiner <weiner@infodock.com> * kotl/klink.el (klink:at-p): Fixed so won't trigger in OO-Browser listing buffers, e.g. on a C++ <template> class. @@ -745,7 +745,7 @@ (link-to-regexp-match): Added a (widen) so matches are found when buffer happens to be narrowed to a particular part. -Wed Mar 22 03:18:39 1995 Bob Weiner <weiner@mot.com> +Wed Mar 22 03:18:39 1995 Bob Weiner <weiner@infodock.com> * hib-kbd.el (kbd-key:act): Fixed infinite recursion if used the Action Key on a {key sequence} that invokes the Action Key. @@ -754,7 +754,7 @@ * Renamed a bunch of Hyperbole functions and variables. -Tue Mar 21 17:11:23 1995 Bob Weiner <weiner@mot.com> +Tue Mar 21 17:11:23 1995 Bob Weiner <weiner@infodock.com> * Makefile: Fixed problems in a number of areas with different versions of make. @@ -766,7 +766,7 @@ V3.18.2 changes ^^^^: ============================================================================== -Mon Mar 20 11:49:42 1995 Bob Weiner <weiner@mot.com> +Mon Mar 20 11:49:42 1995 Bob Weiner <weiner@infodock.com> * hui-window.el: Rewrote to support XEmacs 19.12 new window-local mouse coordinate API. Mainly eliminated use of window-edges under XEmacs. @@ -780,17 +780,17 @@ (scroll-up-eol): Rewrote to not require knowledge of current frame line, only current window line. -Fri Mar 17 12:46:39 1995 Bob Weiner <weiner@mot.com> +Fri Mar 17 12:46:39 1995 Bob Weiner <weiner@infodock.com> * Makefile (elc): Rewrote to compile all out of date .elc files with one invocation of Emacs. -Thu Mar 16 13:07:48 1995 Bob Weiner <weiner@mot.com> +Thu Mar 16 13:07:48 1995 Bob Weiner <weiner@infodock.com> * hactypes.el (hyp-config): Added OO-Browser version number when it has been loaded. -Wed Mar 15 14:50:57 1995 Bob Weiner <weiner@mot.com> +Wed Mar 15 14:50:57 1995 Bob Weiner <weiner@infodock.com> * Changed all functions and variables named *-meta* to *-assist*. Meta was an old remnant of the Assist Key being bound to a meta-mouse key. @@ -799,12 +799,12 @@ XEmacs 19.12beta which does not set a default value for a variable when a make-variable-buffer-local is done without a preceding defvar. -Wed Mar 15 11:11:49 1995 Bob Weiner <weiner@footloose> +Wed Mar 15 11:11:49 1995 Bob Weiner <weiner@infodock.com> * hmouse-reg.el (sm-mouse-setup): Fixed problem with trying to add a key to a null valued Info-mode-map. -Tue Mar 14 01:30:54 1995 Bob Weiner <weiner@footloose> +Tue Mar 14 01:30:54 1995 Bob Weiner <weiner@infodock.com> * README: Changed ftp site to cs.uiuc.edu. hypb.texi (Initializing): Documented that one must now load @@ -822,11 +822,11 @@ V3.18.1 changes ^^^^: ============================================================================== -Mon Mar 6 23:14:34 1995 Bob Weiner <weiner@footloose> +Mon Mar 6 23:14:34 1995 Bob Weiner <weiner@infodock.com> * V3.18 is released. -Sun Mar 5 18:23:12 1995 Bob Weiner <weiner@avatar> +Sun Mar 5 18:23:12 1995 Bob Weiner <weiner@infodock.com> * hmouse-tag.el: Changed so that identifier tags within comments are no longer ignored. @@ -838,32 +838,32 @@ Key support under Objective-C. * man/hypb.texi (Smart Keyboard Keys): Documented these additions. -Fri Mar 3 14:50:31 1995 Bob Weiner <weiner@avatar> +Fri Mar 3 14:50:31 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:delete-blank-lines): If nothing but whitespace follows point until the end of a cell, delete all whitespace at the end of the cell. -Thu Mar 2 23:35:11 1995 Bob Weiner <weiner@footloose> +Thu Mar 2 23:35:11 1995 Bob Weiner <weiner@infodock.com> * hmouse-drv.el (smart-key-help): Fixed so selected window does not change if in the OO-Browser when this command is called. -Wed Mar 1 12:59:25 1995 Bob Weiner <weiner@footloose> +Wed Mar 1 12:59:25 1995 Bob Weiner <weiner@infodock.com> * hibtypes.el (grep-msg): Fixed bug in file name expansion when grep output is in a buffer with an attached file. -Tue Feb 28 16:11:46 1995 Bob Weiner <weiner@footloose> +Tue Feb 28 16:11:46 1995 Bob Weiner <weiner@infodock.com> * hibtypes.el (elisp-compiler-msg): Modified to handle makefiles which send byte-compiler messages to a shell or any other buffer. -Mon Feb 27 00:27:45 1995 Bob Weiner <weiner@meltdown> +Mon Feb 27 00:27:45 1995 Bob Weiner <weiner@infodock.com> * Updated all copyrights to reflect transfer to the FSF. -Sat Feb 25 12:11:19 1995 Bob Weiner <weiner@footloose> +Sat Feb 25 12:11:19 1995 Bob Weiner <weiner@infodock.com> * hpath.el (hpath:is-p): (hpath:at-p): Fixed so handles URL ftp:// paths as ange-ftp paths. @@ -871,7 +871,7 @@ * Makefile: Changed so that elc target just rebuilds out of date elc files, not all elc files. all-elc now does that. -Thu Feb 16 13:32:03 1995 Bob Weiner <weiner@footloose> +Thu Feb 16 13:32:03 1995 Bob Weiner <weiner@infodock.com> * man/hypb.texi (Implicit Buttons and Types): Added many new index entries and added new mail-address type. @@ -885,7 +885,7 @@ Also added support for sending e-mail to a specific address when called with point inside an e-mail address. -Wed Feb 15 14:41:33 1995 Bob Weiner <weiner@footloose> +Wed Feb 15 14:41:33 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:head-cell): Added to move point to first cell at same level as current cell. @@ -915,18 +915,18 @@ whitespace preceding point before splitting cell, so do not end up with excess whitespace at the end of the preceding cell. -Tue Feb 14 12:13:37 1995 Bob Weiner <weiner@footloose> +Tue Feb 14 12:13:37 1995 Bob Weiner <weiner@infodock.com> * kotl/kfill.el (filladapt-prefix-table): Tightened hanging indent pattern so does not match to lines whose first word happens to end with a paren and then a space, unless the word is 2 chars or less, then assume it is a label, e.g. A2) . -Mon Feb 13 10:26:20 1995 Bob Weiner (weiner@footloose) +Mon Feb 13 10:26:20 1995 Bob Weiner <weiner@infodock.com> * wrolo.el (rolo-next-match): (rolo-previous-match): Added (let ((case-fold-search t))) since - this is used in rolo-grep and 'looking-at' call may fail if not set. + this is used in rolo-grep and `looking-at' call may fail if not set. * wrolo.el (wrolo-mode): Don't load menus-rolo under tty InfoDock. * kotl/kfile.el (featurep 'menus-kotl): Don't load menus-kotl under tty InfoDock. @@ -939,39 +939,39 @@ this requires an X display right now, so added a (not (eq window-system 'tty) in this case. -Mon Jan 30 18:50:22 1995 Bob Weiner (weiner@footloose) +Mon Jan 30 18:50:22 1995 Bob Weiner <weiner@infodock.com> * hactypes.el (hyp-config): Updated to use system-configuration variable when available. -Wed Jan 25 17:33:26 1995 Bob Weiner (weiner@footloose) +Wed Jan 25 17:33:26 1995 Bob Weiner <weiner@infodock.com> * hibtypes.el (cscope): Tightened predicate to only match if in a Cscope output buffer, to avoid false regexp matches. -Fri Jan 20 15:19:08 1995 Bob Weiner (weiner@footloose) +Fri Jan 20 15:19:08 1995 Bob Weiner <weiner@infodock.com> * hpath.el (hpath:is-p): Modified to not allow whitespace within (pathname) component of Info node paths. -Mon Jan 9 13:59:28 1995 Bob Weiner <weiner@meltdown> +Mon Jan 9 13:59:28 1995 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:overview): hui-menus.el (hui:menus): man/hypb.texi (Outliner Keys): Renamed kotl-mode:hide-body to kotl-mode:overview, changed binding to {C-c C-o} and changed its function to show first line of all cells. Also added to Otl> menu as - 'Overview' command. + `Overview' command. Also added kotl-mode:top-cells bound to {C-c C-t} which does what kotl-mode:hide-body used to, show only top cells. -Fri Dec 30 14:12:02 1994 Bob Weiner <weiner@meltdown> +Fri Dec 30 14:12:02 1994 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:first-cell-p): (kotl-mode:last-cell-p): Fixed bug that invoked wrong subroutine. -Thu Dec 29 14:04:52 1994 Bob Weiner (weiner@meltdown) +Thu Dec 29 14:04:52 1994 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:shorten-all): (kotl-mode:extend-all): Added to remove and then add @@ -1014,10 +1014,10 @@ * hsite-ex.el (hpath:display-alist): Defined this new variable. * man/hypb.texi (Internal Viewers): Added this section to describe the new hpath:display-alist variable. -* hpath.el (hpath:find-program): Added use of 'hpath:display-alist' +* hpath.el (hpath:find-program): Added use of `hpath:display-alist' variable for file types which should be displayed a special way within Emacs, e.g. by running a Lisp program on the file. This differs form - 'hapth:find-alist' in that its entries are window-system independent. + `hapth:find-alist' in that its entries are window-system independent. Fri Dec 16 20:04:45 1994 Bob Weiner <bweiner@sun29> @@ -1151,11 +1151,11 @@ match to any rolodex search argument. README - Added a note about this feature. -* hsite-ex.el: Changed all 'le:' and 'ep:' to 'hproperty:' throughout +* hsite-ex.el: Changed all `le:' and `ep:' to `hproperty:' throughout Hyperbole. This changed a number of variable names, so be sure to recreate your hsite.el file from hsite-ex.el. - Renamed 'ep/le:style_highlight' to 'hproperty:highlight-style'. - Renamed 'ep/le:item-style' to 'hproperty:item-style'. + Renamed `ep/le:style_highlight' to `hproperty:highlight-style'. + Renamed `ep/le:item-style' to `hproperty:item-style'. Mon Oct 24 17:52:59 1994 Bob Weiner (bweiner@sun285) @@ -1172,13 +1172,13 @@ references. hmouse-tag.el (smart-emacs-lisp-mode-p): Updated to recognize Help buffers. -* hsite-ex.el (hpath:find-alist): Added 'mif' suffix, FrameMaker +* hsite-ex.el (hpath:find-alist): Added `mif' suffix, FrameMaker Interchange Format. Wed Oct 19 14:17:54 1994 Bob Weiner (bweiner@sun285) * hmous-info.el (Info-handle-in-note): Modified to handle clicks on cross-reference - labels whose '*Ref' header is on the prior line. + labels whose `*Ref' header is on the prior line. Tue Oct 18 23:25:16 1994 Bob Weiner (bweiner@sun285) @@ -1207,8 +1207,8 @@ Sat Oct 8 16:40:43 1994 Bob Weiner (bweiner@sun285) * (hmouse-drv.el) - (hib-doc-id.el): Renamed '*smart-key-screen-config*' to - '*smart-key-wconfig*'. + (hib-doc-id.el): Renamed `*smart-key-screen-config*' to + `*smart-key-wconfig*'. * (wrolo.el) rolo-display-matches: Added hyperb:xemacs-p conditional. * (hversion.el) hyperb:xemacs-p: Added to match "XEmacs", the new name for @@ -1233,7 +1233,7 @@ Thu Sep 22 11:53:04 1994 Bob Weiner (bweiner@sun29) -* htz.el (htz:date-parse): Modified to parse dates from an 'ls -l' command. +* htz.el (htz:date-parse): Modified to parse dates from an `ls -l' command. (htz:span-in-days): Added to compute time spans between dates. Wed Sep 21 18:46:30 1994 Bob Weiner (bweiner@sun29) @@ -1247,7 +1247,7 @@ Wed Sep 21 17:10:30 1994 Bob Weiner (bweiner@sun1) * hibtypes.el (elisp-compiler-msg): Fixed so that label is regexp-quoted - before being included in a regexp; otherwise, labels such as 'c++' will + before being included in a regexp; otherwise, labels such as `c++' will fail. Mon Sep 19 13:08:23 1994 Bob Weiner (bweiner@sun285) @@ -1273,7 +1273,7 @@ * README: hypb.texi: - DEMO: Changed references to 'Lucid Emacs' to 'XEmacs', the new name. + DEMO: Changed references to `Lucid Emacs' to `XEmacs', the new name. * hpath.el (hpath:is-p): A kotl link may be passed to this function. It may contain multiple components following a comma after the pathname, so @@ -1448,7 +1448,7 @@ pathname, don't try to cd to it before executing the shell command. * hpath.el (hpath:find): Fixed bug in handling pathnames that begin with - special character '&', which means execute the filename as a + special character `&', which means execute the filename as a window-based program. (hpath:find-program): Added copy of remote ange-ftp pathnames to local storage so that external viewer programs get a pathname that @@ -1484,7 +1484,7 @@ Mon Jun 13 12:44:18 1994 Bob Weiner (weiner@sun285) * README: - DEMO: Changed Hyperbole ftp location from 'wilma' to 'cs.uiuc.edu'. + DEMO: Changed Hyperbole ftp location from `wilma' to `cs.uiuc.edu'. ============================================================================== V3.13 changes ^^^^: @@ -1516,7 +1516,7 @@ * hyperbole.el: Moved message system hook settings here from hsite-ex.el so that they are activated if Hyperbole is autoloaded. -Sat Jun 4 17:12:15 1994 Bob Weiner (weiner@localhost) +Sat Jun 4 17:12:15 1994 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:exchange-cells) (kotl-mode:transpose-cells): Added. @@ -1532,7 +1532,7 @@ Thu Jun 2 19:40:56 1994 Bob Weiner (weiner@sun285) -* hargs.el (hargs:iform-read): Added support for '@' and '_' initial +* hargs.el (hargs:iform-read): Added support for `@' and `_' initial interactive specification characters. * kotl/kotl-mode.el (kotl-mode:copy-to-register): @@ -1584,7 +1584,7 @@ Wed May 18 19:35:23 1994 Bob Weiner (weiner@sun285) * hsite-ex.el (hpath:find-alist): Added display support for the following image - file formats using the 'xv' program: gif, tiff, xbm, pm, pbm, and jpeg. + file formats using the `xv' program: gif, tiff, xbm, pm, pbm, and jpeg. Added a blurb about this in "DEMO". Tue May 17 19:05:43 1994 Bob Weiner (weiner@sun285) @@ -1597,7 +1597,7 @@ * hmouse-drv.el: Added (require 'hypb) since hypb:window-list is called in here. -Sun May 8 14:16:34 1994 Bob Weiner (weiner@localhost) +Sun May 8 14:16:34 1994 Bob Weiner <weiner@infodock.com> * hversion.el (sm-window-sys-term): (hyperb:window-system): Moved from "hmouse-key.el" so would @@ -1662,8 +1662,8 @@ * hsys-wais.el: Changed load of wais library to an autoload. -* hypb.texi (Smart Keys): Added description of 'smart-key-other-mode-cmd' - and 'smart-key-meta-other-mode-cmd' variables. +* hypb.texi (Smart Keys): Added description of `smart-key-other-mode-cmd' + and `smart-key-meta-other-mode-cmd' variables. * hib-doc-id.el: hui-window.el: @@ -1688,11 +1688,11 @@ (hui:ebut-modify): Fixed bug when called interactively button label was not converted to a lbl-key. -* kotl/kview.el (kview:update-label): Fixed to remove '*' labels when +* kotl/kview.el (kview:update-label): Fixed to remove `*' labels when 'bullet label type has been selected. * kotl/kotl-mode.el (kotl-mode): Added keymap description to documentation. - (kotl-mode:kcell-help): Made 'cell-ref' arg optional. + (kotl-mode:kcell-help): Made `cell-ref' arg optional. * hmouse-key.el (sm-mouse-setup): Fixed typo in Emacs19 binding. Changed 2nd occurrence of double-mouse-2 to triple-mouse-2. @@ -1714,7 +1714,7 @@ (kcell-view:set-attr): Added these to get and set cell attributes within a view. -* kotl/kotl-mode.el (kotl-mode): Added a 'widen' call to ensure that +* kotl/kotl-mode.el (kotl-mode): Added a `widen' call to ensure that narrowed but unformatted kotl file is recognized, e.g. when switch a kotl buffer to another mode and then re-invoke kotl-mode. @@ -1783,12 +1783,12 @@ * hibtypes.el (elisp-compiler-msg): Added to jump to the source of an Emacs Lisp V19 byte-compiler error message. -Mon Mar 7 00:14:07 1994 Bob Weiner (weiner@localhost) +Mon Mar 7 00:14:07 1994 Bob Weiner <weiner@infodock.com> * hactypes.el (exec-shell-cmd): Modified to ensure that when a new shell is started, it is displayed in a window other than the current one. -Sun Mar 6 13:56:20 1994 Bob Weiner (weiner@localhost) +Sun Mar 6 13:56:20 1994 Bob Weiner <weiner@infodock.com> * kotl/kotl-mode.el (kotl-mode:delete-line): (kotl-mode:first-line-p): @@ -1836,7 +1836,7 @@ * hypb.el (hypb:window-list): Fixed bug under Emacs 19 that caused some window side drags to fail since windows in all frames were considered. Now considers only those in current frame. Use new function - 'hypb:window-list-all-frames' when you want all existing windows. + `hypb:window-list-all-frames' when you want all existing windows. Sun Feb 27 18:02:24 1994 Bob Weiner (weiner@sun285) @@ -1921,7 +1921,7 @@ * hui.el (hui:hbut-help): Made ibtypes with their own :help functions automatically flash their buttons when selected, if their type definitions indicate a button label. -* hbut.el (htype:names): Fixed bug in which arg 'sym' was handled +* hbut.el (htype:names): Fixed bug in which arg `sym' was handled improperly when it contained a type category prefix. This showed up when doc-id ibtypes did not show their card catalog entries as part of their doc-id:help command. @@ -1933,7 +1933,7 @@ * kotl/kfile.el (kfile:narrow-to-kcells): Conditionalized so is a no-op if called in a non-outline buffer. This allows it to be used in - 'after-save-hook'. + `after-save-hook'. * kotl/kotl-mode.el (kotl-mode:add-cell): Added 2nd optional argument, contents, so can fill in contents at create time. (kotl-mode:split-cell): Rewrote to not use kill ring. @@ -1953,10 +1953,10 @@ This will narrow the view properly. (kfile:narrow-to-kcells): Stopped this from moving point. -Wed Feb 2 00:43:33 1994 Bob Weiner (weiner@localhost) +Wed Feb 2 00:43:33 1994 Bob Weiner <weiner@infodock.com> * kotl/kimport.el: Added to import other tree-structured file formats into - outlines. Initial support for Emacs '*' outlines and Augment files + outlines. Initial support for Emacs `*' outlines and Augment files with cell numbering after each cell (post-cell numbering). kotl/MANIFEST: Added kimport.el entry. hyperbole.el: Added autoloads for kimport public functions. @@ -1985,7 +1985,7 @@ * kotl/kotl-mode.el (kotl-mode:split-cell): Added to split a cell in two and to move to new cell and bound to {C-c s}. - (kotl-mode-map): Moved 'kview:set-label-type' off {C-c + (kotl-mode-map): Moved `kview:set-label-type' off {C-c s} to {C-c C-l}. kotl/EXAMPLE.kotl: Changed references of {C-c s} and {C-c C-l}. hypb.texi: Changed same key bindings and added doc for @@ -2005,7 +2005,7 @@ (hpath:absolute-to): (hpath:substitute-var): (hpath:relative-to): Modified to only change paths for which - 'hpath:is-p' is true. + `hpath:is-p' is true. (hpath:validate): Modified to reject WWW link refs. * kotl/klink.el (klink:create): Fixed bug which removed directory before @@ -2013,7 +2013,7 @@ source. * hargs.el (hargs:at-p): Added use of default-dir when reading a klink arg. -Tue Feb 1 21:32:51 1994 Bob Weiner (weiner@localhost) +Tue Feb 1 21:32:51 1994 Bob Weiner <weiner@infodock.com> * kotl/kview.el (kview:idstamp-to-label): Added to convert idstamp to its relative label within current view. @@ -2057,7 +2057,7 @@ * hbut.el (ibut:label-set): Fixed bug that prevented setting of lbl-start and lbl-end when all args are sent as a single list, as the doc explains. (ibut:at-p): Fixed bug that prevented display of implicit button - help. (hattr:clear) was called when 'key-only' argument was t, in + help. (hattr:clear) was called when `key-only' argument was t, in which case new button attributes were not generated, leaving the button without any attributes. @@ -2119,8 +2119,8 @@ Wed Jan 19 15:50:16 1994 Bob Weiner (weiner@sun285) -* hactypes.el - exec-window-cmd - Changed 'save-excursion' to - 'save-window-excursion' so that shell buffer is not displayed. +* hactypes.el - exec-window-cmd - Changed `save-excursion' to + `save-window-excursion' so that shell buffer is not displayed. * hpath.el - hpath:prefix-regexp - Added so can add command prefix characters to pathnames. @@ -2180,39 +2180,39 @@ * hbut.el - htype:body - Fixed bug that triggered error when nil argument was sent. This prevented the use of regular Emacs Lisp functions in - Hyperbole actions (calls to 'hact'). + Hyperbole actions (calls to `hact'). - ibut:at-p - Fixed bug that assumed all actype args were Hyperbole action types. * hypb.texi - Action Types - Added description of Hyperbole interactive - command extension 'K', which takes a kcell identifier. + command extension `K', which takes a kcell identifier. ============================================================================== V3.11 changes ^^^^: ============================================================================== -Sun Nov 21 16:03:54 1993 Bob Weiner (weiner@localhost) +Sun Nov 21 16:03:54 1993 Bob Weiner <weiner@infodock.com> * hpath.el - hpath:find - hpath:find-other-window - Extended to support '-', '!', '&' + hpath:find-other-window - Extended to support `-', `!', `&' special prefix characters in front of pathnames. * hui.el - hui:link-directly - hui:htype-help - Changed use of 'variable-documentation' to - 'documentation' since Hyperbole types are now defined as functions. + hui:htype-help - Changed use of `variable-documentation' to + `documentation' since Hyperbole types are now defined as functions. This was visible as a bug when trying to display the doc for any type, no output would appear. * hypb.texi - Smart Keyboard Keys - Added Smart Key reference description for kotl-mode. -Sat Nov 20 16:54:21 1993 Bob Weiner (weiner@localhost) +Sat Nov 20 16:54:21 1993 Bob Weiner <weiner@infodock.com> * hargs.el - hargs:get - Fixed to allow interactive command characters to return nil without signalling an error, e.g. when reading the prefix argument. -Sun Nov 14 16:38:26 1993 Bob Weiner (weiner@localhost) +Sun Nov 14 16:38:26 1993 Bob Weiner <weiner@infodock.com> * hui.el - hui:link-possible-types - Added link-to-kcell context for use with kotl-mode. @@ -2224,7 +2224,7 @@ running with mouse support under the Display Postscript (DPS) window system, notably NEXTSTEP. -* hvm.el - Vm-Summ-goto - Changed from a 'defun' to an 'fset' which is +* hvm.el - Vm-Summ-goto - Changed from a `defun' to an `fset' which is what it should have been. This was visible as a bug when a primary Smart Key click in a VM summary buffer did nothing. - Vm-Summ-delete - Added call to (vm-follow-summary-cursor) so @@ -2241,8 +2241,8 @@ Wed Nov 10 18:17:38 1993 Bob Weiner (weiner@sun285) * hmouse-tag.el - smart-lisp-at-tag-p - Made more descrinating in its - matching of 'def' constructs. Prevented falses on terms like - 'define-key'. + matching of `def' constructs. Prevented falses on terms like + `define-key'. * hui-menus.el - hui:menu - Rewrote once again in a simpler fashion. Should solve problems of error messages sometimes showing up only as @@ -2255,7 +2255,7 @@ null argument (used to return 0 in this case which would just cover up timezone problems). -* hargs.el - hargs:iforms - Modified 'I' component to utilize +* hargs.el - hargs:iforms - Modified `I' component to utilize V19 Info-directory-list if bound. Tue Nov 9 19:08:05 1993 Bob Weiner (weiner@sun285) @@ -2265,12 +2265,12 @@ * hmouse-tag.el - smart-c smart-c++ - Fixed bug that caused immediate return if - non-nil 'identifier' was sent in when function was called. + non-nil `identifier' was sent in when function was called. smart-c smart-c++ - smart-lisp - Changed so that 'tags-file-name' is set - globally so that next 'find-tag' command uses the same tags file. + smart-lisp - Changed so that `tags-file-name' is set + globally so that next `find-tag' command uses the same tags file. Wed Oct 20 10:47:25 1993 Bob Weiner (weiner@sun285) @@ -2294,17 +2294,17 @@ action:params - Rewrote to handle autoload functions. * hypb.el - hypb:indirect-function - Added and replaced all calls to - 'symbol-function' in Hyperbole with this instead, so if symbol has + `symbol-function' in Hyperbole with this instead, so if symbol has more than one level of indirection, things will work. * hypb.el - hypb:debug - Updated to deal with V19 byte codes. -Wed Oct 6 11:41:23 1993 Bob Weiner (weiner@info) +Wed Oct 6 11:41:23 1993 Bob Weiner <weiner@infodock.com> * hactypes.el - hyp-config - Fixed bug that had wrong major mode for MH mail reader. -Sat Oct 3 18:03:11 1987 Bob Weiner (weiner@localhost) +Sat Oct 3 18:03:11 1987 Bob Weiner <weiner@infodock.com> * hargs.el - hargs:action-get hact.el - action:commandp - Fixed bug that prevented these from working @@ -2323,21 +2323,21 @@ - symset:get - Added to return a symbol set. hact.el - defact - Modified to use new version of htype:create. -Thu Sep 30 11:01:10 1993 Bob Weiner (weiner@info) +Thu Sep 30 11:01:10 1993 Bob Weiner <weiner@infodock.com> * hibtypes.el - grep-msg - Added support for Introl 68HC11 compiler and assembler errors. -Fri Sep 24 12:58:26 1993 Bob Weiner (weiner@info) - -* hui-epV4-b.el - ep:but-flash - Changed 'extent-at' to 'button-at' which is +Fri Sep 24 12:58:26 1993 Bob Weiner <weiner@infodock.com> + +* hui-epV4-b.el - ep:but-flash - Changed `extent-at' to `button-at' which is the right function for epoch. -Wed Sep 22 08:56:28 1993 Bob Weiner (weiner@info) +Wed Sep 22 08:56:28 1993 Bob Weiner <weiner@infodock.com> * hypb.el - hypb:mark-marker - Fixed definition for Emacs V19. -Tue Sep 21 12:23:36 1993 Bob Weiner (weiner@info) +Tue Sep 21 12:23:36 1993 Bob Weiner <weiner@infodock.com> * hui-em19-b.el - Added to support Hyperbole button highlighting and flashing under GNU Emacs V19. @@ -2351,7 +2351,7 @@ V3.10 changes ^^^^: ============================================================================== -Tue Sep 21 12:23:36 1993 Bob Weiner (weiner@info) +Tue Sep 21 12:23:36 1993 Bob Weiner <weiner@infodock.com> * hinit.el - Added require of 'hui since had removed this from hui-menus.el so that it could be loaded independently of hui.el. @@ -2359,7 +2359,7 @@ * hbut.el - htype:create - Updated to support byte-compiling of values within property-list which are functions. - ibtype:create - Changed to support modified htype:create. - - ibut:at-p - Changed 'eval' of at-p to 'funcall' to support + - ibut:at-p - Changed `eval' of at-p to `funcall' to support modified htype:create. hact.el - action:create - Quoted lambda expression with a 'function wrapper so that V19 byte compiler will compile action code. @@ -2377,13 +2377,13 @@ V3.09 changes ^^^^: ============================================================================== -Thu Sep 16 13:15:18 1993 Bob Weiner (weiner@info) +Thu Sep 16 13:15:18 1993 Bob Weiner <weiner@infodock.com> * hlvar.el - hack-local-variables - Fixed bug I had introduced which used improper (match-beginning 0) expression. Needed to save this value in a (let) instead. -Wed Sep 15 14:43:04 1993 Bob Weiner (weiner@info) +Wed Sep 15 14:43:04 1993 Bob Weiner <weiner@infodock.com> * hactypes.el - link-to-mail - Handled error where mail reader has not been invoked so link-to-mail does not know which mail reader to use to display @@ -2410,7 +2410,7 @@ emphasize explicit buttons when the mouse pointer moves over them, if set to non-nil. -Tue Sep 14 12:10:35 1993 Bob Weiner (weiner@info) +Tue Sep 14 12:10:35 1993 Bob Weiner <weiner@infodock.com> * hypb.texinfo - Renamed to hypb.texi. @@ -2428,12 +2428,12 @@ * hactypes.el - hyp-source - Fixed to accomodate new Lemacs buffer object print form, which includes double quotes around the buffer name. -Thu Aug 19 21:52:42 1993 Bob Weiner (weiner@info) +Thu Aug 19 21:52:42 1993 Bob Weiner <weiner@infodock.com> * h-skip-bytec.lsp - smart-key-mouse-set-point - Fixed to handle newer versions of Lemacs which return 0 for X and Y modeline event positions. -* hui-window.el - Replaced all references to 'screen' with 'frame'. +* hui-window.el - Replaced all references to `screen' with `frame'. - sm-mouse-modeline - Changed so Smart Menus would only display if the package is available and not running under a version of Emacs19 or Lemacs which supports popup menus. If Smart Menu is not @@ -2457,27 +2457,27 @@ * hmail.el - hmail:compose - Added to compose messages to Hyperbole mail lists. hui-menus.el - hui:menus - Changed Msg> menu code to use hmail:compose. -Tue Aug 10 15:59:42 1993 Bob Weiner (weiner@info) +Tue Aug 10 15:59:42 1993 Bob Weiner <weiner@infodock.com> * hargs.el - hargs:iform-read - Updated to use hargs:defaults as default - arg list if bound to a list and if no 'modifying' argument is given. + arg list if bound to a list and if no `modifying' argument is given. * hypb.el - hypb:v19-byte-code-p - Added to test for V19 bytecodes. hypb:function-copy - Updated to deal better with V19 bytecodes hargs.el - action:params - Updated to deal better with V19 bytecodes. -Mon Aug 9 11:52:39 1993 Bob Weiner (weiner@info) +Mon Aug 9 11:52:39 1993 Bob Weiner <weiner@infodock.com> * hypb.el - hypb:mark - Added to support common calling protocol to retrieve mark value under Emacs V18 and V19. -* hsmail.el - hypb:mark - Replaced calls of 'mark' with this. +* hsmail.el - hypb:mark - Replaced calls of `mark' with this. - mail-citation-hook - Added and used in mail-yank-original for V19 compatibility. - smail:comment-add - Updated to handle mh-e header separator. Also added (smail:comment-add) to mh-letter-mode-hook. * hypb.el - hypb:supercite-p - Updated to account for V19 mail-citation-hook. -Thu Aug 5 11:36:33 1993 Bob Weiner (weiner@info) +Thu Aug 5 11:36:33 1993 Bob Weiner <weiner@infodock.com> * hargs.el - Updated to handle new "K" interactive command parameter in hargs:read. This reads a kcell location for use within koutlines, which are tree structured @@ -2510,11 +2510,11 @@ * hui-mouse.el - smart-key-alist - Altered selective-display predicate to ignore outline-minor-mode when hyperb:lemacs-early-p is non-nil. -Tue Jul 20 13:25:26 1993 Bob Weiner (weiner@info) +Tue Jul 20 13:25:26 1993 Bob Weiner <weiner@infodock.com> * hgnus.el - Updated to support GNUS V3.15 symbol names. -Fri Jul 9 14:47:59 1993 Bob Weiner (weiner@info) +Fri Jul 9 14:47:59 1993 Bob Weiner <weiner@infodock.com> * hypb.el - hypb:function-overload - Added to allow simple prepending or appending to existing functions. @@ -2522,7 +2522,7 @@ hrmail.el hvm.el - Replaced manual overloads with calls to hypb:function-overload. -Thu Jul 8 16:11:23 1993 Bob Weiner (weiner@info) +Thu Jul 8 16:11:23 1993 Bob Weiner <weiner@infodock.com> * hui.el - hui:gbut-create - Added save-excursion to prevent movement of point from what may be a user-specified position when adding a global @@ -2532,12 +2532,12 @@ exec-window-cmd - Modified to set comint marker variables for use with CMU comint shell package. -Wed Jul 7 20:06:40 1993 Bob Weiner (weiner@info) +Wed Jul 7 20:06:40 1993 Bob Weiner <weiner@infodock.com> * hpath.el - hpath:is-p - Fixed to recognize Info paths which display whole files, e.g. "(emacs-ftrs)*". -Tue Jul 6 14:20:44 1993 Bob Weiner (weiner@info) +Tue Jul 6 14:20:44 1993 Bob Weiner <weiner@infodock.com> * hbut.el - ebut:operate hui.el - hui:ebut-create @@ -2551,7 +2551,7 @@ smart-coords-in-window-p - Changed hyperb:emacs19-p conditionals so works if Emacs19 is run under a non-X window system, e.g. NeXTSTEP. -Wed Jun 30 13:36:18 1993 Bob Weiner (weiner@info) +Wed Jun 30 13:36:18 1993 Bob Weiner <weiner@infodock.com> * set.el - set:union - Fixed missing setq bug in set:union. @@ -2560,18 +2560,18 @@ * hlvar.el - hack-local-variables - Adapted for use with Emacs V19. -Tue Jun 22 19:15:36 1993 Bob Weiner (weiner@info) +Tue Jun 22 19:15:36 1993 Bob Weiner <weiner@infodock.com> * hibtypes.el - gdb-source - Added to jump to source lines associated with gdb stack frame and breakpoint lines. -Mon Jun 7 11:03:24 1993 Bob Weiner (weiner@info) +Mon Jun 7 11:03:24 1993 Bob Weiner <weiner@infodock.com> * hpath.el - hpath:ange-ftp-p - Renamed to hpath:ange-ftp-at-p and changed use in "hargs.el". hpath:ange-ftp-p - Added, tests if argument is an ange-ftp path. -Sun Jun 6 16:24:02 1993 Bob Weiner (weiner@info) +Sun Jun 6 16:24:02 1993 Bob Weiner <weiner@infodock.com> * hpath.el - hpath:validate - Fixed so does not check readability of Info and ange-ftp pathnames. @@ -2583,13 +2583,13 @@ replaced by default-directory. See doc for exec-path and load-path for reason why. -Fri Jun 4 13:32:30 1993 Bob Weiner (weiner@info) +Fri Jun 4 13:32:30 1993 Bob Weiner <weiner@infodock.com> * hsite-ex.el hmouse-key.el - Redefined hyperb:emacs19-p so is not true when running Lucid Emacs. This was a bug. -Fri May 21 10:50:58 1993 Bob Weiner (weiner@info) +Fri May 21 10:50:58 1993 Bob Weiner <weiner@infodock.com> * hsite-ex.el - hpath:find-alist - Added "rtf" to "next". @@ -2597,26 +2597,26 @@ V3.08 changes ^^^^: ============================================================================== -* hactypes.el - Replaced all 'error' calls with 'hypb:error'. +* hactypes.el - Replaced all `error' calls with `hypb:error'. * hui-menus.el - In Msg> menu, use vm-mail if defined. * hui.el hypb.el - hui:error - Renamed to hypb:error and moved from hui.el to hypb.el. -Thu May 20 12:03:48 1993 Bob Weiner (weiner@info) +Thu May 20 12:03:48 1993 Bob Weiner <weiner@infodock.com> * hrmail.el - Fixed bug in overlay of rmail-new-summary function related to &rest which caused rmail-summary-by-recipients to fail. -Tue May 18 11:33:48 1993 Bob Weiner (weiner@info) +Tue May 18 11:33:48 1993 Bob Weiner <weiner@infodock.com> * hui.el - hui:ebut-delimit - Renamed to ebut:delimit so is part of ebut class. hui:ebut-operate - Renamed to ebut:operate so is part of ebut class and can be used to programmatically create buttons without use of "hui.el". hbut.el - Added ebut:delimit and ebut:operate. -Mon May 17 17:36:35 1993 Bob Weiner (weiner@infoserv) +Mon May 17 17:36:35 1993 Bob Weiner <weiner@infodock.com> * hpath.el - hpath:substitute-dir hpath:substitute-in-file-name @@ -2651,28 +2651,28 @@ keyboard. hsite-ex.el - Added {M-o} key binding for smart-key-operate. -Mon May 3 15:07:30 1993 Bob Weiner (weiner@info) +Mon May 3 15:07:30 1993 Bob Weiner <weiner@infodock.com> * hypb.el - hypb:function-copy - Fixed bug in error call, missing arg. Fixed to work with V19 byte-compiler. hypb:function-symbol-replace - Fixed to work with V19 byte-compiler. hypb:map-vector - Added. -Fri Mar 26 17:40:16 1993 Bob Weiner (weiner@info) +Fri Mar 26 17:40:16 1993 Bob Weiner <weiner@infodock.com> * hib-doc-id.el, hmouse-drv.el, hsite-ex.el, hui.el - Mirrored value of temp-buffer-show-hook in temp-buffer-show-function which is used instead under Lucid Emacs. -Wed Mar 24 20:21:25 1993 Bob Weiner (weiner@info) +Wed Mar 24 20:21:25 1993 Bob Weiner <weiner@infodock.com> * hlvar.el - hack-local-variables - Added support for V19 enable-local-variables flag. -Mon Mar 8 16:04:14 1993 Bob Weiner (weiner@infocomm) +Mon Mar 8 16:04:14 1993 Bob Weiner <weiner@infodock.com> * hmouse-key.el - sm-mouse-get-bindings - Fixed bug in NeXTSTEP portion. -Sat Feb 27 16:56:25 1993 Bob Weiner (weiner@info) +Sat Feb 27 16:56:25 1993 Bob Weiner <weiner@infodock.com> * DEMO hmouse-doc.txt @@ -2682,44 +2682,44 @@ * README - Updated What's New section for this release. -Fri Feb 12 17:56:08 1993 Bob Weiner (weiner@info) +Fri Feb 12 17:56:08 1993 Bob Weiner <weiner@infodock.com> * hactypes.el - exec-shell-command - exec-window-cmd - Added support for 'comint' package when + exec-window-cmd - Added support for `comint' package when it is loaded and Emacs V18 shell.el is not. -Wed Feb 3 15:32:32 1993 Bob Weiner (weiner@info) +Wed Feb 3 15:32:32 1993 Bob Weiner <weiner@infodock.com> * hmouse-info.el - Fixed bug in Info-handle-in-node-hdr/meta which had false matches on node names which contained key words. -Thu Jan 28 11:03:54 1993 Bob Weiner (weiner@info) +Thu Jan 28 11:03:54 1993 Bob Weiner <weiner@infodock.com> * hui-mouse.el - Added autoload of "hmous-info" when Info-handle-in-note is called since it may be called outside of the smart-info function. -Mon Jan 11 13:46:42 1993 Bob Weiner (ex594bw@msn25) +Mon Jan 11 13:46:42 1993 Bob Weiner <weiner@infodock.com> * hvm.el - Vm-Summ-goto - Redefined so would work properly. * hsys-www.el - Removed (require 'hinit). -Fri Jan 8 16:11:59 1993 Bob Weiner (ex594bw@msn25) +Fri Jan 8 16:11:59 1993 Bob Weiner <weiner@infodock.com> * hmous-info.el - Info-handle-in-node-hdr - Removed period as node reference termination character since it is not one. -Thu Dec 31 10:52:22 1992 Bob Weiner (ex594bw@msn25) +Thu Dec 31 10:52:22 1992 Bob Weiner <weiner@infodock.com> * hui-menus.el - hui:menu - Fixed error message display handling. -Wed Dec 30 11:23:28 1992 Bob Weiner (ex594bw@msn25) +Wed Dec 30 11:23:28 1992 Bob Weiner <weiner@infodock.com> * hmouse-drv.el - smart-key-help-show - Added optional second arg - 'current-window' so that help can be displayed within current window. - smart-key-summarize - Added optional arg 'current-window'. + `current-window' so that help can be displayed within current window. + smart-key-summarize - Added optional arg `current-window'. hui-window.el - sm-mouse-modeline-meta - Changed call of - 'smart-key-summarize' to use current window. + `smart-key-summarize' to use current window. * hui-menus.el - hui:menus - Modified Doc/ menu to bring up all files in read-only mode. @@ -2727,7 +2727,7 @@ * hmouse-tag.el - smart-tags-file - Fixed so works with UNIX ange-ftp pathnames. -Tue Dec 15 14:21:06 1992 Bob Weiner (ex594bw@msn25) +Tue Dec 15 14:21:06 1992 Bob Weiner <weiner@infodock.com> * hui.el - hui:hbut-label-default hui:hbut-label - Created these funcs from parts of @@ -2735,26 +2735,26 @@ - Also changed '(lambda ...) to (function (lambda ...)) throughout file. -Mon Dec 14 16:55:41 1992 Bob Weiner (ex594bw@msn25) +Mon Dec 14 16:55:41 1992 Bob Weiner <weiner@infodock.com> * hpath.el - hpath:is-p - Narrowed regexp match of Info paths, so will false infrequently. * hargs.el - hargs:at-p - Added optional argument NO-DEFAULT and fixed doc. -Wed Dec 9 11:38:08 1992 Bob Weiner (ex594bw@msn25) +Wed Dec 9 11:38:08 1992 Bob Weiner <weiner@infodock.com> * hib-doc-id.el - link-to-doc - Fixed so retrieved documents properly. wrolo.el - rolo-fgrep - rolo-grep - Added optional parameter 'no-display' which + rolo-grep - Added optional parameter `no-display' which retrieves rolo records but suppresses display of the matches. Used in "hib-doc-id.el". -Sun Dec 6 17:35:22 1992 Bob Weiner (ex594bw@msn25) +Sun Dec 6 17:35:22 1992 Bob Weiner <weiner@infodock.com> * hib-doc-id.el - link-to-doc action - Fixed bug where rolo-display-buffer pointed to wrong buffer causing document retrievals to fail. -Tue Dec 1 10:52:33 1992 Bob Weiner (ex594bw@msn25) +Tue Dec 1 10:52:33 1992 Bob Weiner <weiner@infodock.com> * hsite-ex.el - hypb:read-only-smart-keys hui-mouse.el - Removed smart-key read-only mode map key bindings since are @@ -2763,7 +2763,7 @@ have read-only smart key bindings but can use the global smart key bindings. -Mon Nov 23 19:51:21 1992 Bob Weiner (ex594bw@msn25) +Mon Nov 23 19:51:21 1992 Bob Weiner <weiner@infodock.com> * DEMO hypb.texinfo @@ -2784,7 +2784,7 @@ V3.07 changes ^^^^: ============================================================================== -Mon Nov 16 09:01:34 1992 Bob Weiner (ex594bw@msn25) +Mon Nov 16 09:01:34 1992 Bob Weiner <weiner@infodock.com> * hsmail.el - mail-yank-original - Added more support for various yank-hook configurations. @@ -2794,27 +2794,27 @@ hmouse-drv.el - Updated Apollo mouse key handling to work with V18.58 patches from lnz@lucid.com. -Fri Nov 13 11:48:51 1992 Bob Weiner (ex594bw@msn25) +Fri Nov 13 11:48:51 1992 Bob Weiner <weiner@infodock.com> * hsite-ex.el - hypb:read-only-smart-keys - Only define keys if object actually is a keymap. -* hargs.el - hargs:iforms - Modified 'M' command entry to return a single arg +* hargs.el - hargs:iforms - Modified `M' command entry to return a single arg to fix problem of improper arg display when editing mail links. hactypes.el - link-to-mail - Modified to accept either 1 (new style) or 2 (old style) args for mail links. -Thu Nov 12 10:52:06 1992 Bob Weiner (ex594bw@msn25) - -* sm-mouse-drag-window-side - Changed 'abs' to 'max' since abs is only +Thu Nov 12 10:52:06 1992 Bob Weiner <weiner@infodock.com> + +* sm-mouse-drag-window-side - Changed `abs' to `max' since abs is only defined in some Emacs versions if cl.el has been loaded. * hactypes.el - link-to-file hargs.el - hargs:iforms - Fixed typo. Was 'vms, now is 'vax-vms. -* hsmail.el - smail:comment-add - Fixed so works if 'mail' is given args. - -Wed Nov 11 17:22:17 1992 Bob Weiner (ex594bw@msn25) +* hsmail.el - smail:comment-add - Fixed so works if `mail' is given args. + +Wed Nov 11 17:22:17 1992 Bob Weiner <weiner@infodock.com> * hui-epV4-b.el - ep:but-clear - Added to clear just Hyperbole button zones. hui-le-but.el - le:but-clear - Made clear only Hyperbole button extents @@ -2838,7 +2838,7 @@ to return X,Y coords of mouse rather than press/release event. hui-window.el - sm-mouse-x/y-coord - Changed Epoch X,Y args. -Mon Nov 9 10:16:51 1992 Bob Weiner (ex594bw@msn25) +Mon Nov 9 10:16:51 1992 Bob Weiner <weiner@infodock.com> * hui-window - smart-key-alist - Fixed precedence bug which could register a drag between windows when in actuality a drag from a modeline was done. @@ -2857,21 +2857,21 @@ * hui-window.el - abs - Added conditional function def if not already defined. -Fri Nov 6 17:14:57 1992 Bob Weiner (ex594bw@msn25) +Fri Nov 6 17:14:57 1992 Bob Weiner <weiner@infodock.com> * hmh.el - mh-send-letter - Had been byte-compiled without access to "mh-e.el" macros loaded. Fixed. -Wed Nov 4 13:48:24 1992 Bob Weiner (ex594bw@msn25) +Wed Nov 4 13:48:24 1992 Bob Weiner <weiner@infodock.com> * hbmap.el - hbmap:dir-filename - Transposed args to expand-file-name which were backwards. -Tue Nov 3 15:56:08 1992 Bob Weiner (ex594bw@msn25) +Tue Nov 3 15:56:08 1992 Bob Weiner <weiner@infodock.com> * hui-mouse.el - smart-key-alist - Updated to support etags use under C++. -* hmouse-tag.el - smart-c++ - Renamed to 'smart-c++-oobr' and made a new - 'smart-c++' function like 'smart-c'. +* hmouse-tag.el - smart-c++ - Renamed to `smart-c++-oobr' and made a new + `smart-c++' function like `smart-c'. smart-c - Modified this and smart-c++ to take an argument of a tag to find, rather than just searching for the tag at point. @@ -2883,9 +2883,9 @@ * smart-clib-sym file-newer - Added for use by "hmouse-tag.el" smart-c function. MANIFEST - Updated. - hmouse-tag.el - smart-c - Changed 'sm-directory' to 'hypb:dir'. - -* hui-le-but.el - ep:set-item-highlight - Changed 'get-face' to 'find-face'. + hmouse-tag.el - smart-c - Changed `sm-directory' to `hypb:dir'. + +* hui-le-but.el - ep:set-item-highlight - Changed `get-face' to `find-face'. * DEMO - Clarified lack of modeline support for Lucid Emacs and fixed typo. @@ -2907,12 +2907,12 @@ * hypb.el - hypb:window-list - Added Lemacs support to return list of all windows on all screens. -Fri Oct 30 16:58:43 1992 Bob Weiner (ex594bw@msn25) +Fri Oct 30 16:58:43 1992 Bob Weiner <weiner@infodock.com> * DEMO - Added Smart Mouse Keys section demoing drag and modeline click capabilities. -Thu Oct 29 13:41:43 1992 Bob Weiner (ex594bw@msn25) +Thu Oct 29 13:41:43 1992 Bob Weiner <weiner@infodock.com> * hmous-info.el - smart-info smart-info-meta - Modified to utilize Gillespie's Info tree @@ -2926,7 +2926,7 @@ * hsmail.el - mail-yank-original - Fixed bug that could cause whole Rmail buffer to be yanked in if Hyperbole mail support was not fully loaded. -Wed Oct 28 11:18:13 1992 Bob Weiner (ex594bw@msn25) +Wed Oct 28 11:18:13 1992 Bob Weiner <weiner@infodock.com> * hui-window - sm-mouse-modeline - Made Smart Key click on right edge of modeline bury Info buffer if displayed already, so it acts as a display/ @@ -2934,11 +2934,11 @@ sm-mouse-modeline-meta - Did the same for the secondary Smart Key with the Smart Key summary display. -Thu Oct 22 17:05:35 1992 Bob Weiner (ex594bw@msn25) +Thu Oct 22 17:05:35 1992 Bob Weiner <weiner@infodock.com> * hypb.texinfo - Added Smart Key Reference appendix. -Wed Oct 21 14:33:21 1992 Bob Weiner (ex594bw@msn25) +Wed Oct 21 14:33:21 1992 Bob Weiner <weiner@infodock.com> * hmouse-drv.el - smart-key-help-show - Changed so help buffers come up in Emacs Lisp mode so symbols in help may be further browsed with @@ -2949,7 +2949,7 @@ * MANIFEST - Reorganized. -Fri Oct 16 10:29:58 1992 Bob Weiner (ex594bw@msn25) +Fri Oct 16 10:29:58 1992 Bob Weiner <weiner@infodock.com> * hui-mouse.el - smart-key-mouse-alist - Added def to handle smart key and smart key mouse actions. @@ -2971,7 +2971,7 @@ hui:menu - Updated to handle errors properly. hypb.texinfo - Explained changed. -Thu Oct 15 12:18:42 1992 Bob Weiner (ex594bw@msn25) +Thu Oct 15 12:18:42 1992 Bob Weiner <weiner@infodock.com> * smart-key-help - Made arg optional. smart-key-meta-help - Added so can call without sending an arg. @@ -2981,7 +2981,7 @@ hmouse-drv.el - smart-key-mouse-help - Added to handle help for context sensitive help for drags. -Wed Oct 14 11:55:15 1992 Bob Weiner (ex594bw@msn25) +Wed Oct 14 11:55:15 1992 Bob Weiner <weiner@infodock.com> * hbut.el - ebut:label-p - Made it handle labels with embedded open and close delimiters properly, e.g. {C-x @key{RET}}. @@ -3015,12 +3015,12 @@ hmouse-drv.el - smart-key-summarize - Updated. hui-menus.el - hui:menus - Updated. -Mon Oct 12 18:54:03 1992 Bob Weiner (ex594bw@msn25) +Mon Oct 12 18:54:03 1992 Bob Weiner <weiner@infodock.com> * hui-menus.el - hui:menus - Capitalized all top-level entries. hypb.texinfo - Reflected this change in menu. -Sun Oct 11 16:37:10 1992 Bob Weiner (ex594bw@msn25) +Sun Oct 11 16:37:10 1992 Bob Weiner <weiner@infodock.com> * hibtypes.el - hibtypes:begin-load-hook hibtypes:end-load-hook - Added to improve customizability @@ -3029,17 +3029,17 @@ hsite-ex.el - Used new hooks in loads of some ibtypes. README - Mentioned new hooks. -Thu Oct 8 17:22:33 1992 Bob Weiner (ex594bw at msn25) +Thu Oct 8 17:22:33 1992 Bob Weiner <weiner@infodock.com> * hmouse-key.el - sm-depress sm-depress-meta - Stopped from moving point, release action can do that when needed. hmouse-drv.el - smart-key-mouse - smart-key-mouse-meta - Moved 'smart-key-help' function + smart-key-mouse-meta - Moved `smart-key-help' function to Smart Key release event rather than depress, so that depress can be used more generally. -* hmouse-tag.el - smart-lisp-at-tag-p - Added '*' as valid symbol char. +* hmouse-tag.el - smart-lisp-at-tag-p - Added `*' as valid symbol char. * h-skip-bytec.lsp - Added for functions not to byte compile. hmouse-drv.el - smart-key-mouse-set-point - Moved to "h-skip-bytec.lsp" @@ -3047,31 +3047,31 @@ fails under X, at least. MANIFEST - Updated. -Tue Oct 6 12:24:48 1992 Bob Weiner (ex594bw at msn25) +Tue Oct 6 12:24:48 1992 Bob Weiner <weiner@infodock.com> * hyperbole.el - Added to autoload Hyperbole; provides main entry point. MANIFEST - Updated. -Mon Oct 5 19:13:07 1992 Bob Weiner (ex594bw at msn25) +Mon Oct 5 19:13:07 1992 Bob Weiner <weiner@infodock.com> * hui-mouse.el - smart-gnus-Subject - Fixed last-line-p condition which did not work because of GNUS code does not properly determine the current article regardless of point position within the subject buffer. -Sun Oct 4 14:36:13 1992 Bob Weiner (ex594bw at msn25) +Sun Oct 4 14:36:13 1992 Bob Weiner <weiner@infodock.com> * hmouse-key.el - apollo-mouse-move-point - Added definition which returns screen coordinates of point. smart-key-mouse-set-point - Called. hmouse-drv.el - smart-key-mouse-set-point - Added. -Thu Oct 1 18:14:29 1992 Bob Weiner (ex594bw at msn25) +Thu Oct 1 18:14:29 1992 Bob Weiner <weiner@infodock.com> * wrolo.el - rolo-grep-file - Added a save-excursion so that point does not change after a rolo search of a buffer already in use. -Wed Sep 30 17:41:58 1992 Bob Weiner (ex594bw at msn25) +Wed Sep 30 17:41:58 1992 Bob Weiner <weiner@infodock.com> * hib-doc-id.el - Added to display site-specific documents based on ID. You must load it explicitly or it is not used. See the DESCRIPTION @@ -3083,7 +3083,7 @@ hsite-ex.el - Added wconfig key bindings. hinit.el - Added wconfig autoloads. -Sat Sep 26 17:40:41 1992 Bob Weiner (ex594bw at msn25) +Sat Sep 26 17:40:41 1992 Bob Weiner <weiner@infodock.com> * wrolo.el - rolo-grep - Fixed bug in handling of negative max-matches argument which kept rolo-yank from working. @@ -3095,7 +3095,7 @@ hmouse-key.el - sm-depress sm-depress-meta - Set above variables. -Fri Sep 25 13:35:26 1992 Bob Weiner (ex594bw at msn25) +Fri Sep 25 13:35:26 1992 Bob Weiner <weiner@infodock.com> * hypb.el - hypb:screen-line - Added to determine screen line from point or marker. @@ -3114,7 +3114,7 @@ vars for use in mouse drag determinations and point restorations. hui.el - hui:ebut-edit - Removed use of smart-key-point-prev. -Wed Sep 23 19:17:07 1992 Bob Weiner (ex594bw at msn25) +Wed Sep 23 19:17:07 1992 Bob Weiner <weiner@infodock.com> * hmouse-drv.el - *smart-key-release-args* *smart-key-meta-release-args* - Added to provide other @@ -3126,7 +3126,7 @@ *smart-key-meta-depress-args* - Added as globals to hold args sent to smart key depress events for use by other functions. -Tue Sep 22 22:38:02 1992 Bob Weiner (ex594bw at msn25) +Tue Sep 22 22:38:02 1992 Bob Weiner <weiner@infodock.com> * hui-mouse.el - smart-key-alist - Fixed bug that kept end of line scrolling from working properly when selective-display @@ -3142,12 +3142,12 @@ hypb.texinfo - Added prop scrolling to Smart Key summary table. DEMO - Added demo of Smart Key end of line scrolling. -Sun Sep 20 01:43:32 1992 Bob Weiner (ex594bw at msn25) +Sun Sep 20 01:43:32 1992 Bob Weiner <weiner@infodock.com> * hmouse-tag.el - smart-c-include-regexp - Redefined to also handle #import used by Objective-C classes. -Sat Sep 19 17:56:14 1992 Bob Weiner (ex594bw at msn25) +Sat Sep 19 17:56:14 1992 Bob Weiner <weiner@infodock.com> * hinit.el - hyperb:version - Moved out of here to "hversion.el" file. Updated version number to 3.05. @@ -3163,31 +3163,31 @@ V3.05 changes ^^^^: ============================================================================== -Sun Sep 6 02:52:32 1992 Bob Weiner (ex594bw at msn25) +Sun Sep 6 02:52:32 1992 Bob Weiner <weiner@infodock.com> * hypb.texinfo hsite-ex.el - smart-key-help - Added {C-h S} key binding to make accessible whether or not one has a mouse. -Wed Sep 2 18:02:02 1992 Bob Weiner (ex594bw at msn25) +Wed Sep 2 18:02:02 1992 Bob Weiner <weiner@infodock.com> * hact.el - actype:act - Tried another fix for getting relative paths resolved properly without improperly setting default-directory. -Tue Sep 1 14:21:47 1992 Bob Weiner (ex594bw at msn25) +Tue Sep 1 14:21:47 1992 Bob Weiner <weiner@infodock.com> * hmouse-key.el - sm-depress sm-depress-meta - Fixed bug which kept depressed flag from being set if mouse handler function sends no args. -* hsite-ex.el - Uncommented key bindings for 'hui:ebut-rename' - and 'sm-mouse-toggle-bindings' and protected all key bindings +* hsite-ex.el - Uncommented key bindings for `hui:ebut-rename' + and `sm-mouse-toggle-bindings' and protected all key bindings so are not done if function is already bound to key or if key is already in use. hypb:rebind-smart-keys - Added to permit special smart key bindings in read-only modes. -Fri Aug 28 09:39:55 1992 Bob Weiner (ex594bw at msn25) +Fri Aug 28 09:39:55 1992 Bob Weiner <weiner@infodock.com> * hui-le-but.el - le:but-delete - Added missing (fset 'le:but-delete 'ep:but-delete). @@ -3202,7 +3202,7 @@ ep:cycle-but-color - Made flash-style foreground & background contrast as good as button highlighted style. -Tue Aug 25 15:21:14 1992 Bob Weiner (ex594bw at msn25) +Tue Aug 25 15:21:14 1992 Bob Weiner <weiner@infodock.com> * hui-le-but.el - Added. hmouse-key.el @@ -3217,30 +3217,30 @@ V3.05P changes ^^^^: ============================================================================== -Thu May 7 15:48:00 1992 Bob Weiner (rsw@flanger) +Thu May 7 15:48:00 1992 Bob Weiner <weiner@infodock.com> * hbdata.el - hbdata:apply-entry - Fixed bug that matched to C-l within a button data entry rather than at its end. -Mon Apr 27 02:15:53 1992 Bob Weiner (rsw@flanger) +Mon Apr 27 02:15:53 1992 Bob Weiner <weiner@infodock.com> * hbut.el - htype:create - Fixed improper use of macro form which caused emission of no code for ibtypes when compiled with the new, optimizing byte compiler. * hact.el - hact - Simplified. - action:create - Wrapped 'function' around action body + action:create - Wrapped `function' around action body so is byte-compiled. -Fri Apr 24 14:17:58 1992 Bob Weiner (rsw@flanger) +Fri Apr 24 14:17:58 1992 Bob Weiner <weiner@infodock.com> * hibtypes.el - rfc - Added to retrieve and display rfcs from references. hactypes.el - link-to-rfc - Added. -Tue Apr 21 22:11:06 1992 Bob Weiner (rsw@flanger) +Tue Apr 21 22:11:06 1992 Bob Weiner <weiner@infodock.com> * hui-menus.el - hui:menus - Added Ebut/Edit for consistency with other menus. -Thu Apr 16 17:06:32 1992 Bob Weiner (rsw@slate) +Thu Apr 16 17:06:32 1992 Bob Weiner <weiner@infodock.com> * hbut.el - ebut:next-occurrence - Added. ebut:get - Modified to use ebut:next-occurrence to correct bug @@ -3248,7 +3248,7 @@ button source is pointed to indirectly with @loc>, e.g. in search result (moccur) buffer. -Wed Apr 15 03:20:10 1992 Bob Weiner (rsw@delay) +Wed Apr 15 03:20:10 1992 Bob Weiner <weiner@infodock.com> * hpath.el - hpath:symlink-referent - Added to recursively resolve symlinks. hpath:symlink-expand @@ -3258,16 +3258,16 @@ hact.el - actype:act - Made default-directory relative to but src location, which may be complicated by symbolic links. -Tue Apr 14 08:53:11 1992 Bob Weiner (rsw@flanger) +Tue Apr 14 08:53:11 1992 Bob Weiner <weiner@infodock.com> * hui-mouse.el - smart-dired - Added call to dired-to-flagged-delete for Tree Dired compatibility. -Fri Apr 10 18:53:24 1992 Bob Weiner (rsw@flanger) +Fri Apr 10 18:53:24 1992 Bob Weiner <weiner@infodock.com> * DEMO - Started reworking to illustrate newer features. -Thu Apr 9 04:10:48 1992 Bob Weiner (rsw@delay) +Thu Apr 9 04:10:48 1992 Bob Weiner <weiner@infodock.com> * hmous-info.el - Info-handle-in-node-hdr - Fixed bug when (dir) entry appears in node header. @@ -3275,51 +3275,51 @@ * hmouse-doc - Reorganized for readability. -Tue Mar 31 20:34:21 1992 Bob Weiner (rsw@delay) +Tue Mar 31 20:34:21 1992 Bob Weiner <weiner@infodock.com> * hui-mouse.el hsite-ex.el - Made local smart key read-only mode bindings site configurable. -Mon Mar 30 01:11:28 1992 Bob Weiner (rsw@delay) +Mon Mar 30 01:11:28 1992 Bob Weiner <weiner@infodock.com> * hui-epV4-b.el - Added code to support item and line highlighting for Smart Menus and PIEmail, for example. -Sun Mar 29 21:04:39 1992 Bob Weiner (rsw@delay) +Sun Mar 29 21:04:39 1992 Bob Weiner <weiner@infodock.com> * hactypes.el - link-to-elisp-doc - Added. -Fri Mar 27 13:20:43 1992 Bob Weiner (rsw@flanger) +Fri Mar 27 13:20:43 1992 Bob Weiner <weiner@infodock.com> * hmouse-drv.el hsite-ex.el - Moved Smart Key global bindings here so are site customizable. -Thu Mar 26 14:40:57 1992 Bob Weiner (rsw at slate) +Thu Mar 26 14:40:57 1992 Bob Weiner <weiner@infodock.com> * hpath.el - hpath:ange-ftp-p - Tweaked to recognize path with user names properly so all forms shown in DEMO work. -Tue Mar 24 17:07:35 1992 Bob Weiner (rsw at planet) +Tue Mar 24 17:07:35 1992 Bob Weiner <weiner@infodock.com> * hmouse-key.el - Required sun-fns under SunView. -Sat Mar 21 19:04:58 1992 Bob Weiner (rsw at flanger) +Sat Mar 21 19:04:58 1992 Bob Weiner <weiner@infodock.com> * hui.el - hui:ebut-operate - Fixed bug caused by returning 't. -* hargs.el - hargs:iforms - Fixed bug in 'N' and 'n' cmd chars where +* hargs.el - hargs:iforms - Fixed bug in `N' and `n' cmd chars where arg value was not set. * hactypes.el - hyp-config - Added PIEmail descriptor and suppressed mailer entry if nil valued. -Thu Mar 19 02:10:11 1992 Bob Weiner (rsw at delay) +Thu Mar 19 02:10:11 1992 Bob Weiner <weiner@infodock.com> * hmouse-key.el - Added NeXTStep auto-configured mouse support. -Wed Mar 18 21:32:32 1992 Bob Weiner (rsw at delay) +Wed Mar 18 21:32:32 1992 Bob Weiner <weiner@infodock.com> * hmouse-key.el - sm-mouse-setup - Ensured Gillespie's new Info mouse support code is turned off since Hyperbole handles that and errors result if not. @@ -3334,11 +3334,11 @@ V3.04 changes ^^^^: ============================================================================== -Tue Mar 17 18:39:21 1992 Bob Weiner (rsw at flanger) +Tue Mar 17 18:39:21 1992 Bob Weiner <weiner@infodock.com> * hui-mouse.el - smart-key-alist - Added View mode scrolling support. -Mon Mar 16 13:59:07 1992 Bob Weiner (rsw at flanger) +Mon Mar 16 13:59:07 1992 Bob Weiner <weiner@infodock.com> * hypb.el - hypb:debug - Added to support more informative tracebacks. @@ -3348,7 +3348,7 @@ * hvm.el - Conditionalized load of "vm-edit", so for vm versions where all code is in vm.elc, works correctly. -Wed Mar 11 12:51:55 1992 Bob Weiner (rsw at icarus) +Wed Mar 11 12:51:55 1992 Bob Weiner <weiner@infodock.com> * hrmail.el hmv.el @@ -3361,10 +3361,10 @@ Eliminated local smart key binding of {RTN} in mail reader modes since would have to set in every mode map and may be used in some. -Mon Mar 9 05:43:06 1992 Bob Weiner (rsw at gano) - -* hpath.el - hpath:at-p - Added missing call to 'hpath:ange-ftp-p' - so that 'pathname' ibtype works as documented and so that remote pathnames +Mon Mar 9 05:43:06 1992 Bob Weiner <weiner@infodock.com> + +* hpath.el - hpath:at-p - Added missing call to `hpath:ange-ftp-p' + so that `pathname' ibtype works as documented and so that remote pathnames are not checked for existence. * hvm.el - Vm-msg-num - Fixed miscounting bug. @@ -3382,7 +3382,7 @@ V3.04P changes ^^^^: ============================================================================== -Mon Mar 9 01:51:54 1992 Bob Weiner (rsw at gano) +Mon Mar 9 01:51:54 1992 Bob Weiner <weiner@infodock.com> * hact.el - action:path-args-rel hui.el - hui:ebut-create @@ -3391,7 +3391,7 @@ so that always know which directory button path args should be made relative to. -Sat Mar 7 03:23:26 1992 Bob Weiner (rsw at barney) +Sat Mar 7 03:23:26 1992 Bob Weiner <weiner@infodock.com> * hmouse-tag.el - smart-c - Fixed so selecting #include files works by calling smart-c-include-file. @@ -3401,7 +3401,7 @@ smart-c-include-file - Added to support include selection. -Fri Mar 6 01:48:28 1992 Bob Weiner (rsw at angell) +Fri Mar 6 01:48:28 1992 Bob Weiner <weiner@infodock.com> * hui-mouse.el - smart-man-c-routine-ref - Made it use `man-path' variable from smart-man.el (not distributed because not needed) if available. @@ -3413,12 +3413,12 @@ V3.03P changes ^^^^: ============================================================================== -Wed Mar 4 02:00:28 1992 Bob Weiner (rsw at flanger) +Wed Mar 4 02:00:28 1992 Bob Weiner <weiner@infodock.com> * hactypes.el - hyp-config - Added system-type inclusion and removed tabs. hui-menus.el - Msg/ - Made Subject line for hyp-config more definitive. -Tue Mar 3 00:23:47 1992 Bob Weiner (rsw at fiddle) +Tue Mar 3 00:23:47 1992 Bob Weiner <weiner@infodock.com> * hui-mouse.el - unix-apropos-map - Fixed bug where badly written unix apropos mode does not define key map properly and we try to set keys in it. @@ -3439,7 +3439,7 @@ * hui-mouse.el - smart-buffer-menu smart-buffer-menu-meta - Added, were accidentally omitted. -Mon Mar 2 19:41:55 1992 Bob Weiner (rsw at fiddle) +Mon Mar 2 19:41:55 1992 Bob Weiner <weiner@infodock.com> * hypb.el - hypb:function-copy - Removed code that deleted &rest keyword since this could cause a wrong number of arguments error. @@ -3448,7 +3448,7 @@ V3.02P changes ^^^^: ============================================================================== -Wed Feb 26 02:00:07 1992 Bob Weiner (rsw at flanger) +Wed Feb 26 02:00:07 1992 Bob Weiner <weiner@infodock.com> * hypb.el - hypb:supercite-p - Added to test if supercite is in use. hsmail.el - mail-yank-original - Prevented removal of headers when @@ -3467,7 +3467,7 @@ V3.01P changes ^^^^: ============================================================================== -Tue Feb 25 00:42:24 1992 Bob Weiner (rsw at delay) +Tue Feb 25 00:42:24 1992 Bob Weiner <weiner@infodock.com> * hypb.texinfo hactypes.el - link-to-regexp-match @@ -3486,17 +3486,17 @@ hui-menus.el - hui:menus - Made ibtypes listing print in decreasing priority order, so user can see the priorities. -Mon Feb 24 20:10:46 1992 Bob Weiner (rsw at delay) +Mon Feb 24 20:10:46 1992 Bob Weiner <weiner@infodock.com> * hmouse-tag.el - Added, jumps to identifier definition locations. -Sun Feb 23 03:29:17 1992 Bob Weiner (rsw at icarus) - -* hargs.el - hargs:at-p - Fixed bug where if reading an 'ebut' argument +Sun Feb 23 03:29:17 1992 Bob Weiner <weiner@infodock.com> + +* hargs.el - hargs:at-p - Fixed bug where if reading an `ebut' argument could not select from completions buffer. Global buttons now need this behavior. -Sat Feb 22 03:57:24 1992 Bob Weiner (rsw at unnamed) +Sat Feb 22 03:57:24 1992 Bob Weiner <weiner@infodock.com> * hibtypes.el - hyp-address hactypes.el - hyp-config - Added to insert Hyperbole configuration info @@ -3506,7 +3506,7 @@ hui-menus.el - Added Msg/ menu providing quick access to hyp-config and hyp-request actions. -Wed Feb 19 00:37:37 1992 Bob Weiner (rsw at delay) +Wed Feb 19 00:37:37 1992 Bob Weiner <weiner@infodock.com> * hbut - gbut:act gbut:help @@ -3522,7 +3522,7 @@ reader buffers properly. hui:key-src - Added to support this change. -Tue Feb 18 02:27:05 1992 Bob Weiner (rsw at barney) +Tue Feb 18 02:27:05 1992 Bob Weiner <weiner@infodock.com> * hypb.texinfo hui-menus.el - Added Doc/ top-level menu. @@ -3532,16 +3532,16 @@ * hvm.el - Made whole VM support work. -Mon Feb 17 21:50:23 1992 Bob Weiner (rsw at barney) +Mon Feb 17 21:50:23 1992 Bob Weiner <weiner@infodock.com> * hmail.el - hmail:hbdata-to-p hsmail.el - mail-yank-original - Fixed placement of author ref line. hgnus.el - rnews:summ-msg-to - Added. - gnus-Article-prepare-hook - Changed from improper 'mode-hook'. + gnus-Article-prepare-hook - Changed from improper `mode-hook'. gnus-Subject-prepare-hook - Added. hbdata.el - hbdata:apply-entry - Made whole GNUS support work. -Mon Feb 3 03:06:15 1992 Bob Weiner (rsw at icarus) +Mon Feb 3 03:06:15 1992 Bob Weiner <weiner@infodock.com> * README - Rearranged sections. @@ -3549,39 +3549,39 @@ sm-depress-meta - Changed to take any number of arguments to support 3 arg calling convention under Sunview. -Sun Feb 2 16:52:05 1992 Bob Weiner (rsw at icarus) +Sun Feb 2 16:52:05 1992 Bob Weiner <weiner@infodock.com> * hui.el - hui:ebut-operate - Fixed bug that had crept in that did not use marked text during button create. -Fri Jan 24 10:36:19 1992 Bob Weiner (rsw at delay) +Fri Jan 24 10:36:19 1992 Bob Weiner <weiner@infodock.com> * set.el - set:add - Changed to always return current set, like set:remove. Use set:member to check if elt is in set. -Thu Jan 16 14:41:50 1992 Bob Weiner (rsw at icarus) - -* hui-mouse.el - Changed 'defconst' to 'defvar' throughout file so if +Thu Jan 16 14:41:50 1992 Bob Weiner <weiner@infodock.com> + +* hui-mouse.el - Changed `defconst' to `defvar' throughout file so if Smart Key package is loaded separately, defaults are not overwritten. ============================================================================== V3.0P changes ^^^^: ============================================================================== -Sat Jan 11 14:28:51 1992 Bob Weiner (rsw at icarus) - -* hypb.el - hypb:call-process-p - Made 'predicate' param optional to +Sat Jan 11 14:28:51 1992 Bob Weiner <weiner@infodock.com> + +* hypb.el - hypb:call-process-p - Made `predicate' param optional to conform to doc string. -Thu Jan 9 02:15:14 1992 Bob Weiner (rsw at flanger) +Thu Jan 9 02:15:14 1992 Bob Weiner <weiner@infodock.com> * hmouse-key.el - sm-mouse-set-bindings - Fixed conditional bug, missing paren. * hib* hsys* - Updated all ibtypes to new format. -* hbut.el - defib - Removed 'actype' param since ibtypes can perform any number +* hbut.el - defib - Removed `actype' param since ibtypes can perform any number of actions now. -* hact.el - actype:act - Added and aliased to 'hact'. This is the function +* hact.el - actype:act - Added and aliased to `hact'. This is the function new ibtypes call to perform actions. actype:action - Added support so any function can be called as an action. @@ -3594,7 +3594,7 @@ button recognition in other documents. When clicked on, it will become clear that such are not valid buttons. -Wed Jan 8 22:53:41 1992 Bob Weiner (rsw at flanger) +Wed Jan 8 22:53:41 1992 Bob Weiner <weiner@infodock.com> * hui-ep-but.el - ep:but-color - Changed "black" dflt to (epoch::foreground). @@ -3602,28 +3602,28 @@ V2.02.4 changes ^^^^: ============================================================================== -Sat Jan 4 17:48:12 1992 Bob Weiner (rsw at slate) - -* hbut.el - ebut:create - Removed 'save-excursion' call which conflicted with +Sat Jan 4 17:48:12 1992 Bob Weiner <weiner@infodock.com> + +* hbut.el - ebut:create - Removed `save-excursion' call which conflicted with function doc. hui.el - hui:ebut-create hui:ebut-modify - hui:ebut-rename - Added 'save-excursion' so buttons are always + hui:ebut-rename - Added `save-excursion' so buttons are always created in the proper buffer. hargs.el - hargs:read - hargs:read-match - Added 'save-excursion' so user buffer or window + hargs:read-match - Added `save-excursion' so user buffer or window switching during arg reading does not change current buffer. ============================================================================== V2.02.3 changes ^^^^: ============================================================================== -Fri Jan 3 17:51:42 1992 Bob Weiner (rsw at slate) +Fri Jan 3 17:51:42 1992 Bob Weiner <weiner@infodock.com> * hui-menus.el - hui:menu-select - Fixed bug in menus where if hit invalid key, could not enter a valid one any more. -Thu Jan 2 02:27:12 1992 Bob Weiner (rsw at tahiti) +Thu Jan 2 02:27:12 1992 Bob Weiner <weiner@infodock.com> * hpath.el - hpath:at-p hpath:is-p - Added recognition of ange-ftp pathnames, @@ -3632,17 +3632,17 @@ * wrolo.el wrolo-logic.el - Added rolodex system to distribution. -Wed Jan 1 01:52:41 1992 Bob Weiner (rsw at pebbles) +Wed Jan 1 01:52:41 1992 Bob Weiner <weiner@infodock.com> * hui-menus.el - hui:menus - Renamed Report/ menu to Help/ and placed under Ebut/ menu rather than top level, so could fit new Rolo/ menu. - Removed duplicative 'List' entry from Ebut/. + Removed duplicative `List' entry from Ebut/. * hactypes.el hibtypes.el hypb.texinfo - rfc-toc - Added ibtype-actype pair to display summary of Internet RFC contents for random access browsing. -Sun Dec 29 00:50:18 1991 Bob Weiner (rsw at pebbles) +Sun Dec 29 00:50:18 1991 Bob Weiner <weiner@infodock.com> * hmous-info.el - Info-handle-in-note - Updated to handle *Ref cross refs as used in Elisp manual. Maybe these are part of Texinfo V2? @@ -3653,7 +3653,7 @@ DEMO hypb.texinfo - Updated with new type. -Sat Dec 28 05:01:45 1991 Bob Weiner (rsw at pebbles) +Sat Dec 28 05:01:45 1991 Bob Weiner <weiner@infodock.com> * hargs.el - hargs:at-p - Fixed completion handling so does not eliminate prefix portion already in minibuffer when selecting a @@ -3661,7 +3661,7 @@ "hact.el" chosen, result is "~/h/hact.el". hargs:read-match - Made always ignore case in matches. -Thu Dec 26 00:57:39 1991 Bob Weiner (rsw at delay) +Thu Dec 26 00:57:39 1991 Bob Weiner <weiner@infodock.com> * hact.el - action:act - Added execution of action:act-hook before action. hypb.texinfo - action:act-hook - Documented. @@ -3670,7 +3670,7 @@ hbut:label-to-key - Added removal of fill prefixes within button labels. -Wed Dec 25 01:48:24 1991 Bob Weiner (rsw at delay) +Wed Dec 25 01:48:24 1991 Bob Weiner <weiner@infodock.com> * hbdata.el - hbdata:apply-entry - Added support for explicit buttons in newsreader summaries. @@ -3682,11 +3682,11 @@ MANIFEST hsite-ex.el hypb.texinfo - Updated for addition. - Also changed improper reference of 'hyperbole-admin' - mailing address to 'hyperbole-request' which is where changes to the + Also changed improper reference of `hyperbole-admin' + mailing address to `hyperbole-request' which is where changes to the Hyperbole code should be sent. -Mon Dec 23 02:10:41 1991 Bob Weiner (rsw at delay) +Mon Dec 23 02:10:41 1991 Bob Weiner <weiner@infodock.com> * hui-menus.el - hui:menu - Fixed problem common with mouse systems under which one could get multiple activations of Hyperbole menus. @@ -3710,7 +3710,7 @@ absolute when in outgoing mail messages, otherwise, relative paths would be mailed and misinterpreted. -Sun Dec 22 00:35:39 1991 Bob Weiner (rsw at delay) +Sun Dec 22 00:35:39 1991 Bob Weiner <weiner@infodock.com> * MANIFEST - Added "hvm.el" and "hmh.el" to distribution. hsite-ex.el - Added conditional configuration for Rmail, Mh or Vm setup. @@ -3718,10 +3718,10 @@ smail:send smail:yank - Unused, removed from mail interface. hsmail.el - Simplified and generalized to support use of - 'send-mail-function' variable from "sendmail.el" and to allow use + `send-mail-function' variable from "sendmail.el" and to allow use of the Emacs Lisp archive "mail-plus.el" package which allows multiple message composure within *mail* buffer. - smail:comment-add - Added to 'mail-setup-hook' to automatically + smail:comment-add - Added to `mail-setup-hook' to automatically add a comment indicating Hyperbole mail button acceptance on outgoing mail. smail:comment - Form to eval to get mail comment. @@ -3729,7 +3729,7 @@ hrmail.el - Moved mail reader specific settings of abstract mail interface variables and functions here from "hmail.el". hmh.el - Added to support MH mail reader. -* hinit.el - hyperb:init - Moved invocation of 'hyperb:init-hook' to +* hinit.el - hyperb:init - Moved invocation of `hyperb:init-hook' to front of init instead of end so hook can influence init sequence such as the selection of a mail reader to load Hyperbole support for. var:append - Rewrote to not append if all elements of list @@ -3737,36 +3737,36 @@ * hmail.el - rmail:msg-hdrs-full - Added to abstract interface. rmail:msg-id-get - Changed to call above func. -Sat Dec 21 21:11:30 1991 Bob Weiner (rsw at delay) +Sat Dec 21 21:11:30 1991 Bob Weiner <weiner@infodock.com> * hypb.texinfo - hsite-ex.el - Changed sample 'hui:ebut-rename' binding from {C-c r} to + hsite-ex.el - Changed sample `hui:ebut-rename' binding from {C-c r} to {C-c C-r}. -Fri Dec 20 14:28:14 1991 Bob Weiner (rsw at pebbles) +Fri Dec 20 14:28:14 1991 Bob Weiner <weiner@infodock.com> * hbut.el - ibut:at-p - Moved clear of hbut:current to start of function - so 'defib' bodies can set button 'args' attribute or others. - Also sets 'args' from any list elts after first 3 returned by 'defib' if + so `defib' bodies can set button `args' attribute or others. + Also sets `args' from any list elts after first 3 returned by `defib' if args is not already set. This permits the same argument flexibility as enjoyed by explicit buttons. ebut:label-to-key - Rewrote to simplify, remove leading and - trailing space, and to use 'hypb:replace-match-string'. + trailing space, and to use `hypb:replace-match-string'. hypb.texinfo - Updated manual to explain this change. -Thu Dec 19 00:00:11 1991 Bob Weiner (rsw at delay) - -* hmail.el - Conditionalized require of 'hrmail' and 'hsmail' so they - are only loaded if 'hmail:reader' and 'hmail:composer' values +Thu Dec 19 00:00:11 1991 Bob Weiner <weiner@infodock.com> + +* hmail.el - Conditionalized require of `hrmail' and `hsmail' so they + are only loaded if `hmail:reader' and `hmail:composer' values indicate that they are needed. * hmouse-key.el - Rewrote module so that mouse binding conditionals depend on window system values rather than terminal types so that when run within a terminal window without mouse support on a window system, mouse keys are not enabled. -Wed Dec 18 23:15:17 1991 Bob Weiner (rsw at delay) - -* hbut.el - ibut:at-p - Put key into 'lbl-key' attribute rather than label. +Wed Dec 18 23:15:17 1991 Bob Weiner <weiner@infodock.com> + +* hbut.el - ibut:at-p - Put key into `lbl-key' attribute rather than label. hibtypes.el - annot-bib - Changed in file doc and code so ibtypes always return label rather than key, as documented previously in the Hyperbole manual. @@ -3774,10 +3774,10 @@ * hui-menus.el - hui:menu-select - Added "no help" message to prevent menu items without help strings from quitting menu. -Sat Dec 14 02:02:36 1991 Bob Weiner (rsw at unnamed) +Sat Dec 14 02:02:36 1991 Bob Weiner <weiner@infodock.com> * hsite-ex.el - If hyperb:dir already set when loaded, then don't define it. - - Changed 'hui:menu' key binding to use whatever user's + - Changed `hui:menu' key binding to use whatever user's help-map prefix key is. * hmouse-key.el - Fixed improper placement of ELisp require clauses which caused load failure of code. @@ -3786,7 +3786,7 @@ V2.02.2 changes ^^^^: ============================================================================== -Fri Dec 13 01:11:59 1991 Bob Weiner (rsw at delay) +Fri Dec 13 01:11:59 1991 Bob Weiner <weiner@infodock.com> * All - Added final copyright. * hargs.el - hargs:iform-read - Bound free variable defaults for @@ -3807,7 +3807,7 @@ hui.el - hui:ebut-delete - Added error when no button is found. hui:hbut-act - Added invalid button error. hui:hbut-help - Added invalid button error. -* hsite-ex.el - Added note about binding 'sm-mouse-toggle-bindings' to a key. +* hsite-ex.el - Added note about binding `sm-mouse-toggle-bindings' to a key. * hmouse-key.el - sm-mouse-get-bindings sm-mouse-set-bindings sm-mouse-toggle-bindings @@ -3816,22 +3816,22 @@ sm-mouse-bindings-p sm-mouse-previous-bindings - Added these variables. -Thu Dec 12 19:42:15 1991 Bob Weiner (rsw at delay) +Thu Dec 12 19:42:15 1991 Bob Weiner <weiner@infodock.com> * hinit.el - Removed def of scroll-{up,down}-eol. hui-mouse.el - Removed def of scroll-{up,down}-eol. hmouse-drv.el - Moved def of scroll-{up,down}-eol here. * hui-mouse.el - smart-key-alist - Moved default context ops to variables designed to handle them. -* hinit.el - Conditionally required 'hmouse-drv' so that - 'smart-key-help-show' is always loaded. - -Wed Dec 11 08:24:17 1991 Bob Weiner (rsw at barney) +* hinit.el - Conditionally required `hmouse-drv' so that + `smart-key-help-show' is always loaded. + +Wed Dec 11 08:24:17 1991 Bob Weiner <weiner@infodock.com> * hui.el - hui:ebut-buf - Added exceptional handling of *post-news* buffer. * hui-mouse.el - smart-key-alist - Added general help buffer screen restore. * hmouse-drv.el - smart-key-help-show - Added for use with - 'temp-buffer-show-hook'. + `temp-buffer-show-hook'. smart-key-help - Modified to not handle special Smart Key Help buffer since no longer needed. *smart-key-help-buf* - Deleted. @@ -3841,13 +3841,13 @@ after any help buffer display by pressing either Smart Key at end of help buffer. -Tue Dec 10 18:22:47 1991 Bob Weiner (rsw at barney) +Tue Dec 10 18:22:47 1991 Bob Weiner <weiner@infodock.com> * hpath.el - hpath:at-p - hpath:is-p - Added 'non-exist' flag to allow non-existent paths. + hpath:is-p - Added `non-exist' flag to allow non-existent paths. * hargs.el - hargs:at-p - Added recognition of delimited pathnames. -Mon Dec 9 03:09:09 1991 Bob Weiner (rsw at icarus) +Mon Dec 9 03:09:09 1991 Bob Weiner <weiner@infodock.com> * hib-kbd.el - kbd-key:normalize - Added RET or RTN key code translation. * hypb - hypb:functionp - Added for use by hypb:replace-match-string. @@ -3858,7 +3858,7 @@ README refs-DEMO - Renamed to DEMO. -Sun Dec 8 02:22:08 1991 Bob Weiner (rsw at slate) +Sun Dec 8 02:22:08 1991 Bob Weiner <weiner@infodock.com> * hui-mouse.el - smart-key-alist - Added call to (smart-key-summarize). * MANIFEST - hmouse-doc - Added. @@ -3869,7 +3869,7 @@ * hact.el - actype:delete - Added. * hbut.el - ibtype:delete - Added. -Sat Dec 7 21:23:47 1991 Bob Weiner (rsw at cslab6a) +Sat Dec 7 21:23:47 1991 Bob Weiner <weiner@infodock.com> * hui-epV4-b.el - ep:cycle-but-color - Reset flash color also. * hui.el - hui:but-flash - Moved init of button flashing to hsite-ex.el @@ -3877,7 +3877,7 @@ easily. * hinit.el - hyperb:epoch-p - Moved to hsite-ex.el. -Thu Dec 5 00:19:35 1991 Bob Weiner (rsw at fiddle) +Thu Dec 5 00:19:35 1991 Bob Weiner <weiner@infodock.com> * hargs.el - hargs:at-p - Expanded filename recognition using hpath:at-p. * hibtypes - pathname - Modified to use hpath:at-p. @@ -3886,7 +3886,7 @@ hpath:is-p - Eliminated bug where default local path case was not checked for existence. -Wed Dec 4 19:16:02 1991 Bob Weiner (rsw at fiddle) +Wed Dec 4 19:16:02 1991 Bob Weiner <weiner@infodock.com> * hui-ep-but.el - Removed Epoch version-specific code. hui-epV3-b.el - Added to support Epoch V3 Hyperbole button highlighting. @@ -3895,7 +3895,7 @@ * hinit.el - hyperb:epoch-p - Added variable, enables Epoch support. Used in hinit.el, hui.el, and hsite-ex.el. -Tue Dec 3 20:03:42 1991 Bob Weiner (rsw at delay) +Tue Dec 3 20:03:42 1991 Bob Weiner <weiner@infodock.com> * hui-mouse.el - smart-key-alist - Adapted to support Hyperbole menu help. * hargs.el - hargs:select-p @@ -3904,22 +3904,22 @@ * hmouse-drv.el - smart-key-help - Changed so windows are stored only if help buffer is not on screen. -Mon Dec 2 17:08:50 1991 Bob Weiner (rsw at unnamed) - -* hbut.el - ebut:map - Added missing local binding of var 'quoted'. - -Sun Dec 1 19:06:09 1991 Bob Weiner (rsw at pebbles) +Mon Dec 2 17:08:50 1991 Bob Weiner <weiner@infodock.com> + +* hbut.el - ebut:map - Added missing local binding of var `quoted'. + +Sun Dec 1 19:06:09 1991 Bob Weiner <weiner@infodock.com> * hinit.el - hyperb:check-dir-user - Fixed error on some machines where - 'hbmap:dir-user' was not created because of trailing slash + `hbmap:dir-user' was not created because of trailing slash in directory name. -Sat Nov 30 03:00:09 1991 Bob Weiner (rsw at slate) +Sat Nov 30 03:00:09 1991 Bob Weiner <weiner@infodock.com> * hui-menus.el - hui:menu-help - Added this function to show menu help messages. hui:menus - Added help messages. Changed items that invoke - menus to return a cons cell whose car is the symbol 'menu' + menus to return a cons cell whose car is the symbol `menu' so no longer makes recursive calls while walking through menus. hui:menu-act - Added support for help display and added @@ -3929,7 +3929,7 @@ hui:menu-top - Changed binding from ESC to C-t so ESC could be used to enter meta movement keys. -Fri Nov 29 00:01:40 1991 Bob Weiner (rsw at pebbles) +Fri Nov 29 00:01:40 1991 Bob Weiner <weiner@infodock.com> * hargs.el - hargs:at-p - Added support for: symbol, buffer, character, key, and sexpression, @@ -3940,59 +3940,59 @@ * hui.el - hui:file-find - Documented. hui:hbut-help - Made error message more appropriate. * hbmap.el - hbmap:filename - Added this variable. -* hui-menus.el - hui:menus - Renamed 'LocalFileShow' to 'DirFile' and +* hui-menus.el - hui:menus - Renamed `LocalFileShow' to `DirFile' and show even if does not exist. - Renamed 'GlobalPersonalFileShow' to - 'PersonalFile' thus changing keys used + Renamed `GlobalPersonalFileShow' to + `PersonalFile' thus changing keys used to select. - Removed literal 'HYPB' from this menu and + Removed literal `HYPB' from this menu and made into a user settable variable, - 'hbmap:filename'. + `hbmap:filename'. * hinit.el hsite-ex.el - Moved Hyperbole initialization messages here from hinit.el so that they actually occur at the beginning and end of init sequence and can be more easily tailored locally. -Wed Nov 27 01:42:17 1991 Bob Weiner (rsw at delay) +Wed Nov 27 01:42:17 1991 Bob Weiner <weiner@infodock.com> * hbut.el - hattr:memq - Added, so can test for membership of nil-valued attributes. hattr:attributes - Added, so can cache list of attributes. - hattr:list - Changed arg name to 'obj-symbol' to generalize. - -Tue Nov 26 05:03:42 1991 Bob Weiner (rsw at pebbles) + hattr:list - Changed arg name to `obj-symbol' to generalize. + +Tue Nov 26 05:03:42 1991 Bob Weiner <weiner@infodock.com> * hbut.el - ibtype:create - Changed to allow associated action type to be defined after ibtype. This permits the existence of ibtypes with invalid actypes but avoids the hard to understand error of having a loaded ibtype end up undefined. ebut:map - Added support for ignoring quoted but delimiters. - ebut:label-p - Added '{' and '\' as characters that quote explicit + ebut:label-p - Added `{' and `\' as characters that quote explicit button delimiters, so they do not register as buttons, used with texinfo or other formatting. * hib-kbd.el - kbd-key:normalize - Eliminated use of tmp buffer, made more efficient, made handle most prefix arg syntax and {ESC ESC} key sequence. * hypb.el - hypb:replace-match-string - Added this function. Like - 'replace-match' but for strings rather than buffers. + `replace-match' but for strings rather than buffers. * hinit.el - hyperb:version - Updated to 2.02B. ============================================================================== V2.02 changes ^^^^: ============================================================================== -Tue Nov 26 00:54:17 1991 Bob Weiner (rsw at pebbles) +Tue Nov 26 00:54:17 1991 Bob Weiner <weiner@infodock.com> * README-BETA - Reworked for V2.01B. * hibtypes.el - dir-summary - Added this implicit button type which displays files from a list in a MANIFEST or DIR file. hyp-source - Fixed so lbl-key returned is always a - string and changed so uses 'hyp-source' actype. + string and changed so uses `hyp-source' actype. * hactypes.el - hyp-source - Added. -Mon Nov 25 01:13:52 1991 Bob Weiner (rsw at delay) +Mon Nov 25 01:13:52 1991 Bob Weiner <weiner@infodock.com> * hargs.el - hargs:iform-read - Fixed handling of null default values so are not converted to strings. This showed up as a @@ -4005,10 +4005,10 @@ used in newer versions of Info. * hpath.el - hpath:absolute-to - Modified to allow a list of directories to look for file in. -* hbut.el - ibut:at-p - Added setting of 'loc' attribute for display +* hbut.el - ibut:at-p - Added setting of `loc' attribute for display when reporting on implicit buttons. hbut:source - Corrected to handle quotes around file names. - hbut:label-p - Added optional 'pos-flag' parameter which + hbut:label-p - Added optional `pos-flag' parameter which when non-nil returns a list including button start and end positions rather than just the label or lbl-key. * hibtypes.el - annot-bib - Corrected so returns proper key. @@ -4019,14 +4019,14 @@ htype:delete - Added htype:delete-hook. * hbut.el - ebut:label-regexp - Added ^M as whitespace character. -Fri Nov 22 00:40:06 1991 Bob Weiner (rsw at betty) +Fri Nov 22 00:40:06 1991 Bob Weiner <weiner@infodock.com> * hsmail.el - sendmail-send-it - Removed code to delete sender from mail list and added conditional which calls - 'sendmail-delete-sender' to do this only if that + `sendmail-delete-sender' to do this only if that function has been defined. Thus, users of the standard sendmail.el package see no behavior change. -* hui.el - hui:ebut-buf - Modified to not drop '*mail*' mail composition +* hui.el - hui:ebut-buf - Modified to not drop `*mail*' mail composition buffer from list of potential button buffers. * hib-kbd.el - Added this file; makes brace delimited key sequences function as implicit buttons. @@ -4035,39 +4035,39 @@ for ebut: functions of same name since these are now used for more than explicit buttons. - ebut:label-p - modified doc to account for this change. -* hbut.el - ebut:label-p - Modified to allow '\' quoting of button delim +* hbut.el - ebut:label-p - Modified to allow `\' quoting of button delim chars for use in labels. Also fixed bug where if multiple open delimiters preceded an end delimiter, first open delimiter was chosen rather than innermost. Nesting of buttons is not allowed. -Thu Nov 21 17:03:17 1991 Bob Weiner (rsw at betty) - -* hbut.el - hattr:summarize - Renamed to 'hattr:report'. - - hbut:summarize - Renamed to 'hbut:report' +Thu Nov 21 17:03:17 1991 Bob Weiner <weiner@infodock.com> + +* hbut.el - hattr:summarize - Renamed to `hattr:report'. + - hbut:summarize - Renamed to `hbut:report' to conform to menu-level naming. Left original names intact for backward compatibility. Affected: hbut.el, hui-menus.el, and hui.el * hrmail.el - rmail-get-new-mail - Added missing interactive declaration to overlay. -Wed Nov 20 05:04:09 1991 Bob Weiner (rsw at delay) +Wed Nov 20 05:04:09 1991 Bob Weiner <weiner@infodock.com> * hargs.el - hargs:at-p - Fixed missing paren bug affecting dired and monkey-mode branches. * hui-mouse.el - smart-key-alist - Added smart relational DB handling. -Mon Nov 18 19:18:09 1991 Bob Weiner (rsw at delay) - -* set.el - Modified 'set:create' to allow a list of elements as input. -* hui-mouse.el - Added missing 'scroll-down-eol' and 'scroll-up-eol' functions. - -Sun Nov 17 07:45:21 1991 Bob Weiner (rsw at miles) +Mon Nov 18 19:18:09 1991 Bob Weiner <weiner@infodock.com> + +* set.el - Modified `set:create' to allow a list of elements as input. +* hui-mouse.el - Added missing `scroll-down-eol' and `scroll-up-eol' functions. + +Sun Nov 17 07:45:21 1991 Bob Weiner <weiner@infodock.com> * hui-mouse.el - smart-key-alist hargs.el - hargs:at-p - Added selection of completion item at point. -Mon Nov 11 19:06:09 1991 Bob Weiner (rsw at angell) +Mon Nov 11 19:06:09 1991 Bob Weiner <weiner@infodock.com> * htz.el - Added needed (require 'hypb) to prevent Hyperbole init failure. hinit.el - Moved (require 'hypb) earlier in list of requires.
--- a/lisp/hyperbole/DEMO Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/DEMO Mon Aug 13 09:15:11 2007 +0200 @@ -1,5 +1,13 @@ * Overview +InfoDock Associates, the developer of Hyperbole and InfoDock (an industrial +quality turn-key version of XEmacs), sells high quality commercial support, +training, books and custom package development for InfoDock, XEmacs or GNU +Emacs on a variety of platforms. Contact us at <info@infodock.com> or visit +our web site at http://www.infodock.com. + + ------------------ + This file demonstrates simple usage of the basic Hyperbole button-action types and shows how Hyperbole can support a style of self-documenting, interactive files. See the glossary in the Hyperbole Manual, @@ -23,7 +31,7 @@ with the Action Key. (Once you have Hyperbole installed, just press the Action Key on the word, <(factorial)>.) If you instead press the Assist Key, you get help for the preceding button. The help provides a summary report of -the button. You will see that it utilizes the 'eval-elisp' action type. You +the button. You will see that it utilizes the `eval-elisp' action type. You can also see who created it. Try it. Note that the create-time and mod-time are displayed using your own @@ -125,7 +133,7 @@ this file. While such commands are executing, you can perform other operations. If you create a button that runs a shell command which displays its own window system window, i.e. a window outside of Emacs, use -'exec-window-cmd' rather than 'exec-shell-cmd' as its action type. +`exec-window-cmd' rather than `exec-shell-cmd' as its action type. You can link to files such as your <(.login)> file. Or directories, like the <(tmp directory)>. When creating file links, if the file you @@ -136,11 +144,11 @@ when you activate file link buttons. Most basic Hyperbole action types display their results in this manner. -You can make a button an alias for another by using the 'link-to-ebut' +You can make a button an alias for another by using the `link-to-ebut' action type. This <(factorial alias)> button does whatever the earlier <(factorial)> button does. -The 'link-to-mail' action type allows you to reference mail messages +The `link-to-mail' action type allows you to reference mail messages that you have stored away. We can't demonstrate it here since we don't have the mail messages that you do. @@ -169,26 +177,26 @@ Any doubly quoted pathname acts as an implicit button that either displays the referenced path within a buffer, passes it to an external viewer program, or -runs a function that operates upon the path. These are 'pathname' implicit +runs a function that operates upon the path. These are `pathname' implicit buttons. For example, activate "README". Most pathnames simply link to the files that they name and so are simply -displayed for editing. The variable 'hpath:suffixes' is a list of filename +displayed for editing. The variable `hpath:suffixes' is a list of filename suffix strings that are added to or removed from pathnames when searching for a match. "So if "README.gz" existed, the pathname button "README" would display it. If you use the Emacs "crypt.el" package, then compressed files will be uncompressed before they are displayed. Activate "README.gz" and you'll see that the README file is displayed as desired. -The variable 'hpath:display-alist' contains pairs of pathname expressions and +The variable `hpath:display-alist' contains pairs of pathname expressions and edit functions. When a pathname matches an expression, the associated edit function is invoked upon the pathname. -The variable 'hpath:find-alist' determines the file suffixes which should be +The variable `hpath:find-alist' determines the file suffixes which should be viewed with external programs. It also specifies the associated viewer program for each different window system under which Hyperbole may be run. See its documentation for more details. Under the X window system, for -example, if you have the 'xv' program, all of the following file formats may +example, if you have the `xv' program, all of the following file formats may be displayed as images: gif, tiff, xbm, pm, pbm, and jpeg. Several prefix characters may be attached to pathnames to indicate that @@ -205,10 +213,10 @@ via anonymous ftp to: "/anonymous@alpha.gnu.ai.mit.edu:ange-ftp/ange-ftp.tar.gz"). -Once you have *loaded* the ange-ftp or the efs package (or you use a -version of Emacs 19 which autoloads ange-ftp), if you are on the -Internet, you can click on any of the following to browse the contents -of the Hyperbole distribution at the XEmacs Archive (limit the amount +Once you have *loaded* the ange-ftp or the efs package (or you use a version +of Emacs 19 which autoloads ange-ftp), if you are on the Internet, you can +click on any of the following to browse the contents of the Hyperbole +distribution at the University of Illinois at Urbana (limit the amount you do this so as not to deny others access to the archive): "/anonymous@ftp.xemacs.org:pub/infodock/" @@ -225,7 +233,7 @@ GNU Info (filename)node references such as "(hyperbole.info)Glossary" or -"(emacs)Glossary", work similarly, thanks to the 'Info-node' button type. +"(emacs)Glossary", work similarly, thanks to the `Info-node' button type. Try one of the Glossary buttons above. If you want to quickly learn how to create explicit buttons, see @@ -250,7 +258,7 @@ Hyperbole distribution. You could use the Emacs dired subsystem, "(emacs)Dired", but a faster way is to note that files named MANIFEST and DIR are used to summarize the files in a directory, so we can use -each of their entries as an implicit button (of 'dir-summary' type) to +each of their entries as an implicit button (of `dir-summary' type) to take us to the file. Let's look at "MANIFEST". Now click anywhere within a line in the MANIFEST @@ -270,19 +278,19 @@ First you must ensure that you load the Hyperbole library that supports URL viewing. Either your "hsite.el" file should require hsys-w3 as part of -'hibtypes:begin-load-hook' or you should move point after the following line +`hibtypes:begin-load-hook' or you should move point after the following line and hit {C-x C-e} to evaluate it. (progn (require 'w3) (require 'hsys-w3)) Now try using the Action Key on: - "http://www.ncsa.uiuc.edu" + "http://www.infodock.com" ** Grep, Occurrence, Debugger and Compiler Error Buttons, and Cscope Analyzer Lines -The output of 'grep -n', the UNIX line pattern matcher, can be +The output of `grep -n', the UNIX line pattern matcher, can be activated as buttons that jump to each matched line within its source file; use {M-x grep RET}. @@ -331,20 +339,20 @@ If you click on the buffer name, the buffer will be displayed just as a file buffer would. This type of implicit button is called a -'hyp-source' button. +`hyp-source' button. You can also activate any explicit buttons shown in a help buffer. ** UNIX Man Apropos Buttons -Below are some lines output by the UNIX 'apropos' command (with a little +Below are some lines output by the UNIX `apropos' command (with a little touchup for display purposes). A button activation anywhere within such a line recognizes the line as an apropos entry and tries to display the -man page for the entry. Try it. (If you happen to use the 'superman' +man page for the entry. Try it. (If you happen to use the `superman' package which fetches man pages in the background, you'll have to wait for the next version of superman which removes incompatibilities with the standard man page fetch command before you can use these -'man-apropos' implicit buttons.) +`man-apropos' implicit buttons.) grep, egrep, fgrep (1V) - search a file for a string or regular expression rm, rmdir (1) - remove (unlink) files or directories @@ -357,18 +365,18 @@ handling package for GNU Emacs, you can retrieve and browse RFC documents used in Internet standard-making. Simply use the Action Key on an RFC document identifier, like RFC-822. Rfc822 and rfc 822 work as well. The -'rfc' implicit button type provides this service. The 'hpath:rfc' variable +`rfc' implicit button type provides this service. The `hpath:rfc' variable specifies the location from which to retrieve RFCs. Once you have retrieved an RFC, an Action Key press most anywhere within a line typically will produce a table of contents summary of the RFC (via the -'rfc-toc' implicit button type). An Action Key press on any of the table of +`rfc-toc' implicit button type). An Action Key press on any of the table of contents lines then displays that section, for easy random access browsing. ** Site-specific Online Library Document IDs Hyperbole offers a powerful, yet easy to use facility for building online -libraries through the use of the 'doc-id' implicit button type. A document id +libraries through the use of the `doc-id' implicit button type. A document id is used just like a reference citation in traditional publications but it actually links to the document that it references and the card catalog (index) entry for the document. One can easily pass around doc ids to point @@ -414,7 +422,7 @@ and while holding it down, depress the Assist Key. Then release the keys in any order and the help display will pop up. It explains that there was no particular matching Smart Key context, so a default operation is performed -(the value of the variable 'action-key-default-function' determines the +(the value of the variable `action-key-default-function' determines the operation performed). ** Scrolling to the Beginning and End of Buffers
--- a/lisp/hyperbole/Makefile Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/Makefile Mon Aug 13 09:15:11 2007 +0200 @@ -4,7 +4,7 @@ # AUTHOR: Bob Weiner # # ORIG-DATE: 15-Jun-94 at 03:42:38 -# LAST-MOD: 3-Nov-95 at 23:57:26 by Bob Weiner +# LAST-MOD: 21-Feb-97 at 18:04:02 by Bob Weiner # # This file is part of Hyperbole. # Available for use and distribution under the same terms as GNU Emacs. @@ -47,6 +47,8 @@ datadir = ../../etc # Where to install the Info version of the Hyperbole manual. infodir = ../../info +# Where to find the .texi source for the Hyperbole manual. +mandir = ../../man # Where to install the Texinfo version of the Hyperbole manual. texidir = ../../man @@ -96,9 +98,7 @@ # NO CHANGES REQUIRED BELOW HERE. # ########################################################################## -HYPB_VERSION = 4.01 - -MAN_DIR = ../../man +HYPB_VERSION = 4.021 # Libraries that must be pre-loaded before trying to byte-compile anything. PRELOADS = $(SITE_PRELOADS) -l ./hversion.el -l ./hyperbole.el -l ./hsite.el @@ -155,7 +155,7 @@ doc: info ps install: elc doc - cd $(MAN_DIR); $(INSTALL) hypb-mouse.txt $(datadir); \ + cd $(mandir); $(INSTALL) hypb-mouse.txt $(datadir); \ $(INSTALL) hyperbole.info* $(infodir); \ $(INSTALL) hyperbole.texi $(texidir) @@ -172,7 +172,7 @@ || (echo "These files will be compiled: " \ && echo "`cat $(ELISP_TO_COMPILE)`" \ && $(EMACS) $(BATCHFLAGS) $(PRELOADS) \ - -l bytecomp -f batch-byte-compile `cat $(ELISP_TO_COMPILE)`) + -f batch-byte-compile `cat $(ELISP_TO_COMPILE)`) @ $(RM) $(ELISP_TO_COMPILE) elc-init: @@ -200,23 +200,23 @@ hsite.el: hsite-ex.el \test -f hsite.el || $(CP) hsite-ex.el hsite.el -dvi: $(MAN_DIR)/hyperbole.dvi +dvi: $(mandir)/hyperbole.dvi info: $(infodir)/hyperbole.info -ps: $(MAN_DIR)/hyperbole.ps +ps: $(mandir)/hyperbole.ps -$(MAN_DIR)/hyperbole.dvi: info - cd $(MAN_DIR); tex hyperbole.texi; \ +$(mandir)/hyperbole.dvi: info + cd $(mandir); tex hyperbole.texi; \ texindex hyperbole.??; tex hyperbole.texi -$(infodir)/hyperbole.info: $(MAN_DIR)/hyperbole.texi - cd $(MAN_DIR); $(MAKEINFO) hyperbole.texi +$(infodir)/hyperbole.info: $(mandir)/hyperbole.texi + cd $(mandir); $(MAKEINFO) hyperbole.texi -$(MAN_DIR)/hyperbole.ps: $(MAN_DIR)/hyperbole.texi - make $(MAN_DIR)/hyperbole.dvi - -$(RM) $(MAN_DIR)/hyperbole.ps - cd $(MAN_DIR); $(DVIPS) -o hyperbole.ps hyperbole.dvi +$(mandir)/hyperbole.ps: $(mandir)/hyperbole.texi + make $(mandir)/hyperbole.dvi + -$(RM) $(mandir)/hyperbole.ps + cd $(mandir); $(DVIPS) -o hyperbole.ps hyperbole.dvi tags: $(EL_TAGS) $(ETAGS) $(EL_TAGS) h-skip-bytec.lsp @@ -224,15 +224,15 @@ clean: -$(RM) core .place* .*~ *~ *\# *.orig *.rej .nfs* -cd kotl; $(RM) core .*~ *~ *\# *.orig *.rej .place* .nfs* - -cd $(MAN_DIR); $(RM) core .*~ *~ *\# *.orig *.rej .place* .nfs* + -cd $(mandir); $(RM) core .*~ *~ *\# *.orig *.rej .place* .nfs* version: fgrep $(HYPB_VERSION) Makefile README hversion.el \ - $(MAN_DIR)/hyperbole.texi; echo "" + $(mandir)/hyperbole.texi; echo "" # Don't use this target. bw-install: - cd /usr/local/infodock/lisp/; \ + cd /home/infodock/lisp/; \ tar zxvf /tmp/hyperbole-$(HYPB_VERSION).tar.gz; \ cd hyperbole/; \ mv man/hyperbole.info* ../../info/; mv man/hyperbole.texi ../../man/; \ @@ -241,11 +241,13 @@ dist: version elc info echo "Ensure version # in README, hversion.el, Makefile and man/hyperbole.texi is up to date." cd ..; $(TAR) clf $(DIST_DIR)/h.tar hyperbole; \ + $(CP) ../etc/ida-logo.xpm $(DIST_DIR); \ $(RM) -r $(DIST_DIR)/hman; mkdir $(DIST_DIR)/hman; \ $(CP) ../man/hyperbole.texi ../info/hyperbole.info* \ ../etc/hypb-mouse.txt $(DIST_DIR)/hman $(RM) -r $(DIST_DIR)/hyperbole - cd $(DIST_DIR); $(TAR) xf h.tar; $(MV) hman hyperbole/man + cd $(DIST_DIR); $(TAR) xf h.tar; \ + $(MV) hman hyperbole/man; $(MV) ida-logo.xpm hyperbole cd $(DIST_DIR)/hyperbole; make distclean # This ver setup won't work under SunOS for some reason. # ver="`head -3 hyperbole/hversion.el | tail -1 | sed -e 's/.*|//'`" @@ -254,5 +256,5 @@ # Don't run this target manually. Use 'make dist' instead. distclean: clean - -$(RM) TAGS hsite.el* kotl/TO-DO* $(MAN_DIR)/hyperbole.dvi \ - $(MAN_DIR)/hyperbole.?? + -$(RM) TAGS hsite.el* kotl/TO-DO* $(mandir)/hyperbole.dvi \ + $(mandir)/hyperbole.??
--- a/lisp/hyperbole/README Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/README Mon Aug 13 09:15:11 2007 +0200 @@ -1,17 +1,27 @@ +# See "hversion.el" for the Hyperbole lisp code directory entry. # # FILE: README -# SUMMARY: Intro information on Hyperbole. +# SUMMARY: Information Hyperbole users and maintainers should read. # # AUTHOR: Bob Weiner # +# ORG: InfoDock Associates. We sell corporate support and development +# contracts for InfoDock, Emacs and XEmacs. +# E-mail: <info@infodock.com> Web: http://www.infodock.com +# Tel: +1 408-243-3300 +# # ORIG-DATE: 19-Oct-91 at 03:27:47 -# LAST-MOD: 3-Nov-95 at 23:20:31 by Bob Weiner +# LAST-MOD: 21-Feb-97 at 18:04:41 by Bob Weiner +# +# See the Copyright section below for license information. -The author's work on this project has been sponsored by Motorola Inc. +We thank Motorola Inc. for sponsoring our initial development work on +Hyperbole. -We hope you enjoy using and developing with Hyperbole. Suggestions and bug -reports are welcome, as described later in this document. Feel free to -mail or post news containing this file wherever it may be of use. +We hope you enjoy using and developing with Hyperbole. Suggestions +and bug reports are welcome, as described later in this document. +Feel free to mail or post news containing this file wherever it may be +of use. =========================================================================== @@ -35,14 +45,14 @@ Hyperbole is an open, efficient, programmable information management and hypertext system. It is intended for everyday work on any UNIX platform supported by GNU Emacs. It works well with the versions of Emacs that -support multiple X or NEXTSTEP windows: GNU Emacs V19, XEmacs (formerly -called Lucid Emacs) and Epoch. Hyperbole allows hypertext buttons to be -embedded within unstructured and structured files, mail messages and -news articles. It offers intuitive mouse-based control of information -display within multiple windows. It also provides point-and-click -access to Info manuals, ftp archives, Wide-Area Information Servers -(WAIS), and the World-Wide Web (WWW) hypertext system through -encapsulations of software that support these protocols. +support MS-Windows, X or NEXTSTEP windows: XEmacs and GNU Emacs. + +Hyperbole allows hypertext buttons to be embedded within unstructured and +structured files, mail messages and news articles. It offers intuitive +mouse-based control of information display within multiple windows. It also +provides point-and-click access to Info manuals, ftp archives, Wide-Area +Information Servers (WAIS), and the World-Wide Web (WWW) hypertext system +through encapsulations of software that support these protocols. Hyperbole consists of four parts: @@ -155,178 +165,96 @@ =========================================================================== -* What's New in V4.00 and V4.01? +* What's New in V4.02 and V4.021 =========================================================================== (See "ChangeLog" for more complete details of changes.) ACTION AND ASSIST KEYS - - New variable, action-key-url-function, sets the function used to - display URLs which are activated as implicit buttons with the Action - Key. - - - Action or Assist Key presses at the end of a line now scroll - proportionally, by default. See the documentation for the variable, - smart-scroll-proportional, and the Smart Scrolling section of the - Hyperbole DEMO file, for more information. - - - Fixed bug that prevented browsing Info files in dired with the Action - Key. - - BUTTON TYPES + - Support for new ID-edit mode (a part of InfoDock) that allows rapid, + cutting, copying and yanking of regions plus fast display management. + In this mode, the Action and Assist keys yank the previously selected + region at point. - - "hsys-w3.el" is now automatically loaded so that the Action Key can - follow URLs by default. It defines the implicit button type, www-url. - - - New implicit button type, text-toc, makes table of contents entries in - README files jump to the associated section of the file. Try it with - this file once you have loaded the current version of Hyperbole. + - An Action Key press on a Java identifier jumps to its definition + (if an associated TAGS file or OO-Browser environment exists). The + same is true for an `@see' cross-reference within a Java comment. The + variable, `smart-java-package-dirs,' determines where Java package + source can be found when the OO-Browser is not in use. - DOCUMENTATION + - An Action Key press on a double or single quoted Emacs Lisp filename + (without any path) displays the file by looking for it among the + directories in the variable, `load-path'. - - A lot of work has gone into reorganizing and rewriting the Hyperbole - manual to improve its readability and completeness. A full chapter on - the Koutliner has been added. Please take some time to read the parts - of interest to you and send your feedback on what is good and what is - not to the mail list, <hyperbole@hub.ucsb.edu>. + - If the Action Key is pressed on a function identifier that is defined + in the same buffer as the reference clicked upon, it will now be + displayed faster, since the func-menu package will be used. The + reference identifier will also flash when pressed, if the display + device supports this. EMACS VERSIONS - - MS-DOS and Windows NT Emacs 19 or Win-Emacs: Made Hyperbole work under - all of these PC Emacs versions. + - Further support for MS-DOS, Windows NT Emacs 19, and Win-Emacs. - - Emacs 19: Fixed bug that prevented Action Key selection of minibuffer - menu items. - - - Emacs 19: Hyperbole menubar menus are now properly displayed. - - - Emacs 19: Action Key press on a filename that has a .info suffix - displays the Top node for that info file in the Info browser. + - Fixed configuration setup problem when running Emacs 19 on a dumb + terminal. KOUTLINER - - You can now view and edit koutlines with blank lines between cells - turned off. {C-c b} now toggles between showing or hiding blank lines. - - - Minibuffer menu item Otl/Below renamed to Otl/Downto so could add - Otl/Blanks which toggles blank lines on and off. - - - {C-c C-o} which displays one line per cell, for an overview, now also - turns off blank lines. - - - {C-c C-i} adds an attribute to the current cell. It changes the - attribute's value if it already exists. Completion on existing - attribute names from the cell is provided. - - - {C-c h}, which displays cell attributes, when given "0" as the cell id - now displays the zero cell's attributes in addition to any other - attributes shown. + - XEmacs 19.14 and above: Fixed display of current viewspec in the + modeline to accomodate modeline extents (specialized modeline regions). + This eliminated an error that occurred when reading in an Koutline file. - - By default, the outliner separates labels from cell contents by two - spaces. If you want to change the separator for the current outline, - use {C-c M-l}. {C-u C-c M-l} will additionally change the default - separator value used when new outlines are created. - - - If you invoke {M-x kotl-mode RET} on a non-read-only, non-koutline - buffer, it converts each paragraph in the buffer into a level 1 cell, - and thereby creates a koutline buffer. The conversion uses the - buffer-specific variable, `paragraph-start' to determine the paragraphs - in the buffer. + - Fixed bug that prevented installation of Koutliner mode-specific + menubar when running InfoDock. - - If you save a koutline to a file whose name does not end in .kotl, - e.g. with {C-x C-w} (kfile:write), it will still be treated as a valid - koutline when you read it in again. You can create a koutline file - without the standard suffix via {M-x kfile:find RET} or by converting a - buffer to a koutline via {M-x kotl-mode RET}. + MENUS - - Each koutline now maintains a current view setting that is saved with - the outline and restored when it is first displayed. View settings - include: show/hide blank lines, show a fixed number of lines per cell, - show a fixed number of levels in the outline, show all lines and cells, - show/hide ellipses after truncated outline entries, set cell numbering - (label) types. + - New Hyperbole/About menu item added. In minibuffer menus, this item is + found under the Doc/ menu. - - View settings are controlled by single character codes called view - specs. The current view spec setting for a koutline appears in the - modeline following the name of the outline. The current view spec - setting may be changed interactively with {C-c C-v}. - See <${hyperb:dir}/kotl/EXAMPLE.kotl, 2b16=048> for details on valid - view specs. - - - Minibuffer menu item Otl/View changed to Otl/Vspec to set a view - specification. Use {C-x C-r} to view a Koutline in read-only mode. - - - Added View menu to Koutliner popup and pulldown menus. Moved - view-related tree operations from Tree menu to View menu. - - - Fixed importation of star outline and Augment-style files. - - - The elements of a another buffer or file may be inserted into a - koutline as a set of cells by using the {C-x i} command. When prompted, - you may use a buffer name or file name from which to insert. + - New window system menu, Hyperbole/Customization (and minibuffer menu, + Cust/) added to set Hyperbole options, including where Hyperbole link + referents are displayed, where URLs are displayed and whether to use + proportional or windowful scrolling when a Smart Key is pressed at the + end of a line. - The cells will be inserted as the successors of the current cell unless - {C-u C-x i} is used and then they are inserted as the initial children - of the current cell. - - See the documentation for the variables, kimport:mode-alist and - kimport:suffix-alist, for information on mode and suffix-specific - conversions performed on files before they are inserted. - - Use {M-x kotl-mode:insert-file-contents RET} to insert the entire - contents of a file into the current cell at the location of point. + - The default setting of where Hyperbole link references are displayed + may be set in "hsite.el" via the variable, `hpath:display-where' + (after Hyperbole has been installed using `make install'). + See its documentation for detail. - - {M-x kimport:file RET} will prompt for a file and a new koutline file - to create and will insert the elements of the file in the new outline. - (You can also use buffer or buffer names as arguments instead of file - names.) See the documentation for the variables, kimport:mode-alist - and kimport:suffix-alist, for information on how the importation type - is determined. - - - {C-c +} appends the contents of one cell to the end of another. Added - this as Append-Cell to popup and pulldown menus. - - - {M-w}, copy-region, now works properly in read-only outlines. + - The Hyperbole/Global-Button menu now includes a menu item that will + activate each existing global button. The Hyperbole/Explicit-Button + menu does the same thing for explicit buttons in the current buffer. ROLODEX - - {e} within a rolodex match buffer edits the associated entry within your - rolodex source file. Fixed bug that caused {e} to fail when entries - are collapsed within the match buffer. - - - {C-h h r e}, rolo-edit, just displays your personal rolodex file if you - hit {RET} without specifying an entry name to edit. + - Rolo-edit, bound to {e} in the rolodex match buffer, now works properly + if the rolodex is loaded before the rest of the Hyperbole system. - - {m} within a rolodex match buffer composes mail to the e-mail - address at point or the first address following point. Also added as - Rolo/Mail minibuffer menu item and Rolodex/Mail-to-Address for window - system menus. - - - New variable, wrolo-yank-reformat-function permits reformatting of an - entry yanked into the current buffer with {C-h h r y}, rolo-yank. - - WINDOW CONFIGURATIONS - - - The minibuffer menu items, Win/PopRing and Win/YankRing now redisplay - the Win menu after performing their actions. This allows you to yank - or pop window configurations repeatedly until you get to the one you - want. =========================================================================== * How to Obtain =========================================================================== -Hyperbole is actually part of an integrated tool framework that we have -developed called InfoDock. InfoDock provides a modern user interface on top -of Emacs, information management, and powerful software development tools, -all in one package. Get it via anonymous ftp from host ftp.xemacs.org in -the /pub/infodock directory. +InfoDock Associates, the developer of Hyperbole and InfoDock (an industrial +quality turn-key version of XEmacs), is a firm dedicated to radical +productivity improvement in technical environments, whether in software +development or other knowledge intensive disciplines. Our initial offerings +include high quality commercial support, training, books and custom package +development for InfoDock, XEmacs or GNU Emacs on a variety of platforms. +InfoDock provides a modern user interface on top of Emacs, information +management, and powerful software development tools, all in one package. -Hyperbole is also available as a standalone package via anonymous ftp across -the Internet. Do not send requests to have it mailed to you since it won't -be. Instead have another party who has Internet access obtain it for the -both of you. +Contact us at <info@infodock.com> or visit our web site at +http://www.infodock.com. + +Hyperbole is available as part of InfoDock or XEmacs and also as a standalone +package via anonymous ftp across the Internet. Do not send requests to have +it mailed to you since it won't be. Instead have another party who has +Internet access obtain it for the both of you. Here is how to obtain Hyperbole as a standalone package on the Internet: @@ -338,7 +266,7 @@ Ftp to ftp.xemacs.org (Internet Host ID = 128.174.252.16): - prompt> ftp ftp.xemacs.org + prompt> ftp ftp.xemacs.org (If this doesn't work, try `ftp xemacs.org'.) Login as 'anonymous' with your own <user-id>@<site-name> as a password. @@ -349,7 +277,7 @@ Move to the Hyperbole directory: - ftp> cd pub/infodock + ftp> cd /pub/infodock Set your transfer mode to binary: @@ -514,8 +442,8 @@ There are several Hyperbole-related mail addresses. Learn what each is for before you mail to any of them. -<hyperbole-request@hub.ucsb.edu> -<hyperbole-announce-request@hub.ucsb.edu> +<hyperbole-request@infodock.com> +<hyperbole-announce-request@infodock.com> ALL mail concerning administration of the Hyperbole mailing lists should be sent to the appropriate one of these addresses. That includes @@ -524,27 +452,30 @@ that all Internet mail lists have a -request address for administrative requests. - Use the following formats on your subject line to execute requests, - where you substitute your own values for the <> delimited items. + Use the following formats in the *body* of your message to execute requests, + where you substitute your own values for the <> delimited items and items + enclosed in [] are optional. - Subject: Subscribe '<' <user@domain> '>' (<your name>). - Subject: Unsubscribe '<' <user@domain> '>'. - - To change your address, you must unsubscribe your old address in one - message and then subscribe your new address in another message. + subscribe <mail-list-name> [<your-email-address>] + or + unsubscribe <mail-list-name> [<your-email-address>] For example: - To: hyperbole-announce-request@hub.ucsb.edu - Subject: Unsubscribe <joe@any.com>. + To: hyperbole-request@infodock.com + Subject: Used if a human happens to read your mail. + + subscribe hyperbole joe@nowhere.gov - To: hyperbole-announce-request@hub.ucsb.edu - Subject: Subscribe <joe@any.com> (Joe Williams). + To change your address, you must unsubscribe your old address with + once command and subscribe your new address with another command, though + you can embed multiple commands on separate lines within a single message. + There are two Hyperbole-related mail lists. Subscribe to one or the other, not to both. -<hyperbole@hub.ucsb.edu> +<hyperbole@infodock.com> Mail list for discussion of all Hyperbole issues. Bug reports and suggestions may also be sent here. @@ -572,7 +503,7 @@ with Hyperbole. In this way, the list will not be overwhelmed by messages that ask for, but provide no information. -<hyperbole-announce@hub.ucsb.edu> +<hyperbole-announce@infodock.com> Those who don't want to participate in the discussion but want to hear about bug fixes and new releases of Hyperbole should subscribe @@ -600,6 +531,23 @@ Z-Code Software Corporation ------- + I've found Hyperbole (in conjunction with XEmacs) to be very useful + for signal processing algorithm development. + + For me, it has almost completely obsoleted the engineering notebook: + I keep a set of files with ideas, algorithms, and results, linked + together and to the implementation in C++ files. Using XEmacs' + support for embedding graphics, I've written a mode that accepts + image tags (formatted like HTML), and reads in GIF files to display + plots. I have another program that converts the file to HTML (not + perfect, but adequate), so I can put any aspect of development on + our internal web for others to see. + + -- Farzin Guilak + Protocol Systems, Inc., Engineer + +------- + I am blind and have been using Hyperbole since 1992. I used to use a PC as a talking terminal attached to a UNIX system, but then I developed Emacspeak which lets me use Emacs and Hyperbole from standard UNIX @@ -731,7 +679,7 @@ The following copyright applies to the Hyperbole system as a whole. -Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. +Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. Available for use and distribution under the terms of the GNU Public License, version 2 or higher. @@ -745,7 +693,11 @@ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +InfoDock Associates sells support and development services for this package +and most other aspects of Emacs or InfoDock. Contact information is at the +top of this file. + You should have received a copy of the GNU General Public License -along with GNU Emacs or XEmacs; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - +along with GNU Emacs, XEmacs or InfoDock; see the file COPYING. If +not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, +MA 02139, USA.
--- a/lisp/hyperbole/hactypes.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hactypes.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,10 +6,17 @@ ;; KEYWORDS: extensions, hypermedia ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates +;; +;; This file is part of Hyperbole. +;; Available for use and distribution under the same terms as GNU Emacs. +;; +;; Copyright (C) 1991-1997 Free Software Foundation, Inc. +;; Developed with support from Motorola Inc. ;; ;; ORIG-DATE: 23-Sep-91 at 20:34:36 -;; LAST-MOD: 28-Oct-95 at 02:33:45 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 11:16:36 by Bob Weiner + ;;; ************************************************************************ ;;; Other required Elisp libraries ;;; ************************************************************************ @@ -23,22 +30,19 @@ (defact annot-bib (key) "Follows internal ref KEY within an annotated bibliography, delimiters=[]." (interactive "sReference key (no []): ") - (let ((opoint (point))) - (goto-char 1) - (if (re-search-forward - (concat "^[*]*[ \t]*\\\[" (ebut:key-to-label key) "\\\]") nil t) - (progn - (beginning-of-line) - (delete-other-windows) - (split-window-vertically nil) - (goto-char opoint)) - (beep)) - (goto-char opoint))) + (let ((opoint (point)) + (key-regexp (concat "^[*]*[ \t]*\\\[" (ebut:key-to-label key) "\\\]"))) + (goto-char (point-min)) + (if (re-search-forward key-regexp nil t) + (progn (hpath:display-buffer (current-buffer)) + (beginning-of-line)) + (goto-char opoint) + (beep)))) (defact completion () - "Inserts completion at point into minibuffer or other window. -Unless at end of buffer or if completion has already been inserted, then -deletes completions window." + "Inserts completion at point into the minibuffer or a buffer. +Unless point is at the end of the buffer or if completion has already been +inserted, the completions window is deleted." (interactive) (if (eobp) (progn (bury-buffer nil) @@ -70,8 +74,8 @@ ((null last-kbd-macro) (hypb:error "(exec-kbd-macro): Define a keyboard macro first.")) - (t (fset 'zzz last-kbd-macro) - (setq macro 'zzz))) + (t (fset 'zzk last-kbd-macro) + (setq macro 'zzk))) (save-excursion (let ((standard-output (get-buffer-create "*macro-def*"))) (unwind-protect @@ -82,7 +86,7 @@ (goto-char (point-min)) (setq macro (car (cdr (cdr (read (current-buffer))))))) (kill-buffer standard-output)))) - (fmakunbound 'zzz) + (fmakunbound 'zzk) (setq repeat (hargs:read "Repeat count: " (function (lambda (repeat) @@ -99,7 +103,7 @@ (hypb:error "(exec-kbd-macro): Bad repeat count: %s" repeat-count))) (execute-kbd-macro kbd-macro repeat-count)) -;;; Support next two actypes on systems which use the 'comint' shell package +;;; Support next two actypes on systems which use the `comint' shell package ;;; rather than Emacs V18 shell.el. ;;; (if (or hyperb:lemacs-p hyperb:emacs19-p) @@ -115,14 +119,14 @@ "Executes a SHELL-CMD string asynchronously. Optional non-nil second argument INTERNAL-CMD means do not display the shell command line executed. Optional non-nil third argument KILL-PREV means -kill last output to shell buffer before executing SHELL-CMD." +kill the last output to the shell buffer before executing SHELL-CMD." (interactive (let ((default (car defaults)) (default1 (nth 1 defaults)) (default2 (nth 2 defaults))) (list (hargs:read "Shell cmd: " (function - (lambda (cmd) (not (string= cmd "")))) + (lambda (cmd) (not (string-equal cmd "")))) default "Enter a shell command." 'string) (y-or-n-p (format "Omit cmd from output (default = %s): " default1)) @@ -137,13 +141,7 @@ (concat "cd " default-directory "; " shell-cmd))) (if (not (get-buffer buf-name)) (save-excursion - ;; Ensure shell displays in other window unless in the - ;; OO-Browser, then use selected window. - (if (br-in-browser) - nil - (if (= (length (hypb:window-list)) 1) - (split-window-vertically)) - (other-window 1)) + (hpath:display-buffer (current-buffer)) (if (eq (minibuffer-window) (selected-window)) (other-window 1)) (shell) (rename-buffer buf-name) @@ -153,9 +151,7 @@ (setq comint-last-input-start last-input-start comint-last-input-end last-input-end) ))) - (or (equal (buffer-name (current-buffer)) buf-name) - (if (br-in-browser) (switch-to-buffer buf-name) - (pop-to-buffer buf-name))) + (hpath:display-buffer buf-name) (goto-char (point-max)) (and kill-prev last-input-end (not (equal last-input-start last-input-end)) @@ -167,12 +163,12 @@ (select-window owind)))) (defact exec-window-cmd (shell-cmd) - "Executes an external window-based SHELL-CMD string asynchronously." + "Asynchronously executes an external window-based SHELL-CMD string." (interactive (let ((default (car defaults))) (list (hargs:read "Shell cmd: " (function - (lambda (cmd) (not (string= cmd "")))) + (lambda (cmd) (not (string-equal cmd "")))) default "Enter a shell command." 'string)))) (let ((buf-name "*Hypb Shell*") (cmd (if (hpath:ange-ftp-p default-directory) @@ -206,53 +202,67 @@ (shell-send-input))) (message msg))) +(defact function-in-buffer (name pos) + "Displays the definition of function NAME found at POS in the current buffer." + (save-excursion + (goto-char pos) + (if (looking-at (regexp-quote name)) + nil + (let ((fume-scanning-message nil)) + (fume-rescan-buffer) + (setq pos (cdr-safe (assoc name fume-funclist)))))) + (if pos + (progn (hpath:display-buffer (current-buffer)) + (goto-char pos) + ;; Move to beginning of the line for compatibility with find-tag. + (beginning-of-line)))) + (defact hyp-config (&optional out-buf) - "Inserts Hyperbole configuration info at end of optional OUT-BUF or current." + "Inserts Hyperbole configuration info at end of current buffer or optional OUT-BUF." (hypb:configuration out-buf)) (defact hyp-request (&optional out-buf) - "Inserts Hyperbole mail list request help into optional OUT-BUF or current." + "Inserts Hyperbole mail list request help into current buffer or optional OUT-BUF." (save-excursion (and out-buf (set-buffer out-buf)) (goto-char (point-max)) (delete-blank-lines) (delete-blank-lines) - (insert "Use one of the following formats on your subject line:\n -Subject: Subscribe <joe@any.com> (Joe Williams). -Subject: Unsubscribe <joe@any.com>. + (insert "Use one of the following formats in the *body* of your message:\n +subscribe <mail-list-name> [<your-email-address>] + or +unsubscribe <mail-list-name> [<your-email-address>] -To change your address, first unsubscribe by sending an unsubscribe -request from your old address. Then subscribe by sending a subscribe -request from your new address. +where possible <mail-list-names> are: + hyperbole - discussion of Hyperbole + hyperbole-announce - Hyperbole announcements only -Possible mail lists are: - hyperbole - discussion of Hyperbole - hyperbole-announce - Hyperbole announcements only\n"))) +For example: subscribe hyperbole joe@nowhere.gov\n"))) (defact hyp-source (buf-str-or-file) - "Displays a buffer or file from a line beginning with 'hbut:source-prefix'." + "Displays a buffer or file from a line beginning with `hbut:source-prefix'." (interactive (list (prin1-to-string (get-buffer-create (read-buffer "Buffer to link to: "))))) (if (stringp buf-str-or-file) (cond ((string-match "\\`#<buffer \"?\\([^ \n\"]+\\)\"?>" buf-str-or-file) - (pop-to-buffer (substring buf-str-or-file - (match-beginning 1) (match-end 1)))) - (t (hpath:find-other-window buf-str-or-file))) + (hpath:display-buffer + (substring buf-str-or-file (match-beginning 1) (match-end 1)))) + (t (hpath:find buf-str-or-file))) (hypb:error "(hyp-source): Non-string argument: %s" buf-str-or-file))) (defact link-to-buffer-tmp (buffer) - "Displays a BUFFER in another window. + "Displays a BUFFER. Link is generally only good for current Emacs session. -Use 'link-to-file' instead for a permanent link." +Use `link-to-file' instead for a permanent link." (interactive "bBuffer to link to: ") (if (or (stringp buffer) (bufferp buffer)) - (pop-to-buffer buffer) + (hpath:display-buffer buffer) (hypb:error "(link-to-buffer-tmp): Not a current buffer: %s" buffer))) (defact link-to-directory (directory) - "Displays a DIRECTORY in Dired mode in another window." + "Displays a DIRECTORY in Dired mode." (interactive "DDirectory to link to: ") - (hpath:find-other-window directory)) + (hpath:find directory)) (defact link-to-ebut (key-file key) "Performs action given by another button, specified by KEY-FILE and KEY." @@ -261,16 +271,16 @@ (while (cond ((setq but-file (read-file-name "File of button to link to: " nil nil t)) - (if (string= but-file "") + (if (string-equal but-file "") (progn (beep) t))) ((not (file-readable-p but-file)) - (message "(link-to-ebut): You cannot read '%s'." + (message "(link-to-ebut): You cannot read `%s'." but-file) (beep) (sit-for 3)))) (list but-file (progn (find-file-noselect but-file) - (while (string= "" (setq but-lbl + (while (string-equal "" (setq but-lbl (hargs:read-match "Button to link to: " (ebut:alist but-file) @@ -281,26 +291,28 @@ (setq key-file (hpath:validate (hpath:substitute-value key-file)))) (let ((but (ebut:get key (find-file-noselect key-file)))) (if but (hbut:act but) - (hypb:error "(link-to-ebut): No button '%s' in '%s'." (ebut:key-to-label key) + (hypb:error "(link-to-ebut): No button `%s' in `%s'." (ebut:key-to-label key) key-file)))) (defact link-to-elisp-doc (func-symbol) "Displays documentation for FUNC-SYMBOL." (interactive "aFunction to display doc for: ") (cond ((not (symbolp func-symbol)) - (hypb:error "(link-to-elisp-doc): '%s' not a symbol." + (hypb:error "(link-to-elisp-doc): `%s' not a symbol." func-symbol)) ((not (fboundp func-symbol)) - (hypb:error "(link-to-elisp-doc): '%s' not defined as a function." + (hypb:error "(link-to-elisp-doc): `%s' not defined as a function." func-symbol)) ((not (documentation func-symbol)) - (hypb:error "(link-to-elisp-doc): '%s' has no documentation." + (hypb:error "(link-to-elisp-doc): `%s' has no documentation." func-symbol)) - ((describe-function func-symbol)))) + (t (let ((temp-buffer-show-function 'switch-to-buffer)) + (hpath:display-buffer (current-buffer)) + (describe-function func-symbol))))) (defact link-to-file (path &optional point) - "Displays a PATH in another window scrolled to optional POINT. -With POINT, buffer is displayed with POINT at the top of the window." + "Displays file given by PATH scrolled to optional POINT. +With POINT, buffer is displayed with POINT at window top." (interactive (let ((prev-reading-p hargs:reading-p)) (unwind-protect @@ -319,22 +331,19 @@ (list path))) (list path))) (setq hargs:reading-p prev-reading-p)))) - (and (hpath:find-other-window path) + (and (hpath:find path) (integerp point) (progn (goto-char (min (point-max) point)) (recenter 0)))) (defact link-to-file-line (path line-num) - "Displays a PATH in another window scrolled to LINE-NUM." + "Displays a file given by PATH scrolled to LINE-NUM." (interactive "fPath to link to: \nnDisplay at line number: ") - (and (setq path (smart-tags-file-path path)) - (hpath:find-other-window path) - (integerp line-num) - (progn (widen) - (goto-line line-num)))) + (if (setq path (smart-tags-file-path path)) + (hpath:find-line path line-num))) (defact link-to-Info-node (node) - "Displays an Info NODE in another window. + "Displays an Info NODE. NODE must be a string of the form `(file)nodename'." (interactive "+IInfo (file)nodename to link to: ") (require 'info) @@ -348,32 +357,33 @@ (if (and file (setq file (hpath:substitute-value file))) (let ((wind (get-buffer-window "*info*"))) (if wind (select-window wind) - (pop-to-buffer (other-buffer))) + (hpath:display-buffer (other-buffer))) (info) (Info-goto-node (concat "(" file ")" nodename))) - (hypb:error "(link-to-Info-node): Bad node spec: '%s'" node))))) + (hypb:error "(link-to-Info-node): Bad node spec: `%s'" node))))) (defact link-to-kcell (file cell-ref) - "Displays FILE with kcell given by CELL-REF at the top of the window. -See documentation for 'kcell:ref-to-id' for valid cell-ref formats. + "Displays FILE with kcell given by CELL-REF at window top. +See documentation for `kcell:ref-to-id' for valid cell-ref formats. If FILE is nil, the current buffer is used. If CELL-REF is nil, the first cell in the view is shown." (interactive "fKotl file to link to: \n+KKcell to link to: ") (require 'kfile) - (cond ((and (stringp cell-ref) (= ?| (aref cell-ref 0))) + (cond ((and (stringp cell-ref) (> (length cell-ref) 0) + (= ?| (aref cell-ref 0))) ;; Activate view spec in current window. (kotl-mode:goto-cell cell-ref)) ((if file - (hpath:find-other-window file) - (pop-to-buffer (current-buffer) t)) + (hpath:find file) + (hpath:display-buffer (current-buffer))) (if cell-ref (kotl-mode:goto-cell cell-ref) (kotl-mode:beginning-of-buffer)) (recenter 0)))) (defact link-to-mail (mail-msg-id &optional mail-file) - "Displays mail msg with MAIL-MSG-ID from optional MAIL-FILE in other window. -See documentation for the variable 'hmail:init-function' for information on + "Displays mail msg with MAIL-MSG-ID from optional MAIL-FILE. +See documentation for the variable `hmail:init-function' for information on how to specify a mail reader to use." (interactive "+MMail Msg: ") (if (not (fboundp 'rmail:msg-to-p)) @@ -381,11 +391,8 @@ (if (and (listp mail-msg-id) (null mail-file)) (setq mail-file (car (cdr mail-msg-id)) mail-msg-id (car mail-msg-id))) - (let ((wind (selected-window)) - (wconfig (current-window-configuration))) - (other-window 1) - (if (eq wind (selected-window)) - (progn (split-window-vertically nil) (other-window 1))) + (let ((wconfig (current-window-configuration))) + (hpath:display-buffer (current-buffer)) ;; Initialize user-specified mail reader if need be. (if (and (symbolp hmail:init-function) (fboundp hmail:init-function) @@ -396,7 +403,7 @@ nil ;; Couldn't find message, restore old window config, report error (set-window-configuration wconfig) - (hypb:error "(link-to-mail): No msg '%s' in file \"%s\"." + (hypb:error "(link-to-mail): No msg `%s' in file \"%s\"." mail-msg-id mail-file))))) (defact link-to-regexp-match (regexp n source &optional buffer-p) @@ -412,19 +419,19 @@ ;; Source is a pathname. (if (not (stringp source)) (hypb:error - "(link-to-regexp-match): Source parameter is not a filename: '%s'" + "(link-to-regexp-match): Source parameter is not a filename: `%s'" orig-src) (setq source (find-file-noselect (hpath:substitute-value source))))) (if (not (bufferp source)) (hypb:error - "(link-to-regexp-match): Invalid source parameter: '%s'" orig-src) - (switch-to-buffer-other-window source) + "(link-to-regexp-match): Invalid source parameter: `%s'" orig-src) + (hpath:display-buffer source) (widen) (goto-char (point-min)) (if (re-search-forward regexp nil t n) (progn (beginning-of-line) (recenter 0) t) (hypb:error - "(link-to-regexp-match): Pattern not found: '%s'" regexp))))) + "(link-to-regexp-match): Pattern not found: `%s'" regexp))))) (defact link-to-rfc (rfc-num) "Retrieves and displays an Internet rfc given by RFC-NUM. @@ -432,7 +439,7 @@ remote retrievals." (interactive "nRFC number to retrieve: ") (if (or (stringp rfc-num) (integerp rfc-num)) - (hpath:find-other-window (hpath:rfc rfc-num)))) + (hpath:find (hpath:rfc rfc-num)))) (defact link-to-string-match (string n source &optional buffer-p) "Finds STRING's Nth occurrence in SOURCE and displays location at window top. @@ -444,9 +451,13 @@ (regexp-quote string) n source buffer-p)) (defact man-show (topic) - "Displays man page on TOPIC, which may be of the form <command>(<section>)." + "Displays man page on TOPIC, which may be of the form <command>(<section>). +If using the Superman manual entry package, see the documentation for +`sm-notify' to control where the man page is displayed." (interactive "sManual topic: ") - (manual-entry topic)) + (let ((display-buffer-function + (function (lambda (buffer &rest unused) (hpath:display-buffer buffer))))) + (manual-entry topic))) (defact rfc-toc (&optional buf-name opoint) "Computes and displays summary of an Internet rfc in BUF-NAME. @@ -462,7 +473,9 @@ t)))) (t (if opoint (goto-char opoint)) (hypb:error "(rfc-toc): Invalid buffer name: %s" buf-name)))) - (let ((sect-regexp "^[ \t]*[1-9][0-9]*\\.[0-9.]*[ \t]+[^ \t\n]")) + (let ((sect-regexp "^[ \t]*[1-9][0-9]*\\.[0-9.]*[ \t]+[^ \t\n]") + (temp-buffer-show-function 'switch-to-buffer)) + (hpath:display-buffer (current-buffer)) (occur sect-regexp) (set-buffer "*Occur*") (rename-buffer (format "*%s toc*" buf-name))
--- a/lisp/hyperbole/hbmap.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hbmap.el Mon Aug 13 09:15:11 2007 +0200 @@ -9,7 +9,7 @@ ;; ORG: Brown U. ;; ;; ORIG-DATE: 6-Oct-91 at 06:34:05 -;; LAST-MOD: 24-Oct-95 at 18:32:30 by Bob Weiner +;; LAST-MOD: 17-Feb-97 at 15:30:16 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. @@ -114,7 +114,9 @@ ;;; ************************************************************************ (defvar hbmap:dir-user - (if (memq system-type '(ms-windows windows-nt ms-dos)) + (if (and hyperb:microcruft-os-p + (or (not (fboundp 'getenv)) + (not (getenv "HOME")))) "c:/_hyperb/" "~/.hyperb/") "Per user directory in which to store top level Hyperbole map data. Must end with a directory separator.
--- a/lisp/hyperbole/hbut.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hbut.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,15 +6,15 @@ ;; KEYWORDS: extensions, hypermedia ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 18-Sep-91 at 02:57:09 -;; LAST-MOD: 25-Oct-95 at 04:12:59 by Bob Weiner +;; LAST-MOD: 17-Feb-97 at 15:31:03 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. +;; Copyright (C) 1991-1996, Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: @@ -46,6 +46,17 @@ "Maximum length of a hyper-button label.") +(defun ebut:act (label) + "Activates Hyperbole explicit button with LABEL from the current buffer." + (interactive (list (hargs:read-match "Activate explicit button labeled: " + (ebut:alist) + nil t nil 'ebut))) + (let* ((lbl-key (hbut:label-to-key label)) + (but (ebut:get lbl-key))) + (if but + (hbut:act but) + (error "(ebut:act): No explicit button labeled: %s" label)))) + (defun ebut:alist (&optional file) "Returns alist with each element a list containing a button label. For use as a completion table. Gets labels from optional FILE or current @@ -337,7 +348,7 @@ ;; Normalize label spacing (ebut:key-to-label (ebut:label-to-key lbl)))))))) - (if loc-p buts (nreverse (set:create buts))))))) + (if loc-p buts (if buts (nreverse (set:create buts)))))))) (fset 'map-ebut 'ebut:map) (defun ebut:map (but-func &optional start-delim end-delim @@ -612,7 +623,7 @@ (defun gbut:act (label) "Activates Hyperbole global button with LABEL." (interactive (list (hargs:read-match "Activate global button labeled: " - (mapcar 'list (gbut:lbl-list)) + (mapcar 'list (gbut:label-list)) nil t nil 'ebut))) (let* ((lbl-key (hbut:label-to-key label)) (but (ebut:get lbl-key nil gbut:file))) @@ -623,7 +634,7 @@ (defun gbut:help (label) "Displays help for Hyperbole global button with LABEL." (interactive (list (hargs:read-match "Report on global button labeled: " - (mapcar 'list (gbut:lbl-list)) + (mapcar 'list (gbut:label-list)) nil t nil 'ebut))) (let* ((lbl-key (hbut:label-to-key label)) (but (ebut:get lbl-key nil gbut:file))) @@ -631,6 +642,10 @@ (hbut:report but) (error "(gbut:help): No global button labeled: %s" label)))) +(defun gbut:label-list () + "Returns list of global button labels." + (mapcar 'hbut:key-to-label (gbut:key-list))) + ;;; ------------------------------------------------------------------------ (defun gbut:key-list () "Returns list of global button label keys." @@ -646,10 +661,6 @@ (error nil)) gbuts))))) -(defun gbut:lbl-list () - "Returns list of global button labels." - (mapcar 'hbut:key-to-label (gbut:key-list))) - ;;; ======================================================================== ;;; hattr class ;;; ======================================================================== @@ -775,7 +786,7 @@ (fset 'hattr:summarize 'hattr:report) (defvar hattr:filename - (if (memq system-type '(ms-windows windows-nt ms-dos)) "_hypb" ".hypb") + (if hyperb:microcruft-os-p "_hypb" ".hypb") "Per directory file name in which explicit button attributes are stored. If you change its value, you will be unable to use buttons created by others who use a different value!") @@ -786,8 +797,8 @@ (defun hbut:act (hbut) "Performs action for explicit or implicit Hyperbole button symbol HBUT." - (and hbut (apply 'actype:act (hattr:get hbut 'actype) - (hattr:get hbut 'args)))) + (if hbut (apply 'actype:act (hattr:get hbut 'actype) + (hattr:get hbut 'args)))) (defun hbut:action (hbut) "Returns appropriate action for Hyperbole button symbol HBUT." @@ -965,7 +976,7 @@ "Returns Hyperbole source buffer or file given at point. If a file, always returns a full path if optional FULL is non-nil." (goto-char (match-end 0)) - (cond ((looking-at "#<buffer \\([^ \n]+\\)>") + (cond ((looking-at "#<buffer \"?\\([^ \n\"]+\\)\"?>") (get-buffer (buffer-substring (match-beginning 1) (match-end 1)))) ((looking-at "\".+\"") @@ -1113,9 +1124,10 @@ (defun ibut:label-set (label &optional start end) "Sets current implicit button attributes from LABEL and START, END position. -START and END are optional. When given, they specify the region in the buffer -to flash when this implicit button is activated or queried for its attributes. -If LABEL is a list, it is assumed to contain all arguments." +Returns label. START and END are optional. When given, they specify the +region in the buffer to flash when this implicit button is activated or +queried for its attributes. If LABEL is a list, it is assumed to contain all +arguments." (cond ((stringp label) (hattr:set 'hbut:current 'lbl-key (hbut:label-to-key label)) (and start (hattr:set 'hbut:current 'lbl-start start)) @@ -1125,7 +1137,7 @@ (hattr:set 'hbut:current 'lbl-start (nth 1 label)) (hattr:set 'hbut:current 'lbl-end (nth 2 label))) (t (error "(ibut:label-set): Invalid label arg: '%s'" label))) - t) + label) ;;; ======================================================================== ;;; ibtype class - Implicit button types
--- a/lisp/hyperbole/hgnus.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hgnus.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,15 +6,15 @@ ;; KEYWORDS: hypermedia, news ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 24-Dec-91 at 22:29:28 by Bob Weiner -;; LAST-MOD: 8-Aug-95 at 10:53:53 by Bob Weiner +;; LAST-MOD: 26-Jan-97 at 14:43:54 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. +;; Copyright (C) 1991-1996, Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: @@ -26,7 +26,7 @@ ;; Automatically configured for use in "hyperbole.el". ;; If hsite loading fails prior to initializing Hyperbole Gnus support, ;; -;; {M-x Gnus-init RTN} +;; {M-x Gnus-init RET} ;; ;; will do it. ;; @@ -42,8 +42,10 @@ (require 'hmail) (require 'hsmail) -;; This is not in Gnus 5.x -;(require 'gnuspost) +(cond ((or (featurep 'gnus-msg) + (featurep 'gnuspost))) + ((load "gnus-msg" t)) + (t (load "gnuspost" t))) ;;; ************************************************************************ ;;; Public variables
--- a/lisp/hyperbole/hib-doc-id.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hib-doc-id.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,15 +6,15 @@ ;; KEYWORDS: docs, extensions, hypermedia ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola, Inc., PWDG +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 30-Sep-92 at 19:39:59 -;; LAST-MOD: 14-Apr-95 at 15:58:21 by Bob Weiner +;; LAST-MOD: 12-Dec-96 at 15:15:28 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1992-1995, Free Software Foundation, Inc. +;; Copyright (C) 1992-1996, InfoDock Associates ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: @@ -34,13 +34,13 @@ ;; You must explicitly load this package in order to use it, since ;; Hyperbole does not load it by default. ;; -;; At this site, we use doc ids of the form, [Emacs-001], delimited by -;; brackets, starting with a subject name, followed by a -, followed by a +;; Motorola PPG uses doc ids of the form, [Emacs-001], delimited by +;; brackets, starting with a subject name, followed by a - and a ;; multi-digit numeric identifier. ;; ;; Typically an index entry should have links to all available forms of its ;; document, e.g. online, printed, source. Below is the index entry form -;; we use. The default variable settings herein work with our formats. If +;; we use. The default variable settings herein work with PPG's formats. If ;; you prefer different ones, you must change all of the variable values. ;; ;; -------------------------------------------------------------------------- @@ -82,12 +82,13 @@ (defact link-to-doc (doc-id) "Displays online version of a document given by DOC-ID (no delimiters), in other window. -If online version of document is not found in `doc-id-indices', an error is signalled." +If online version of document is not found in `doc-id-indices', an error is +signalled." (interactive "sID for document to link to (omit delimiters): ") (let ((rolo-display-buffer (hypb:help-buf-name "Doc ID")) (delim-doc-id (concat doc-id-start doc-id doc-id-end))) (cond ((null doc-id-indices) - (error "(doc-id-index-entry): You must set the 'doc-id-indices' variable first.")) + (error "(doc-id-index-entry): You must set the `doc-id-indices' variable first.")) ((let ((rolo-entry-regexp doc-id-index-entry-regexp)) (= 0 (rolo-grep (funcall doc-id-match doc-id) 1 doc-id-indices nil 'no-display))) @@ -107,15 +108,16 @@ (if ibut (progn (hbut:act ibut) (message "Displaying %s." delim-doc-id)) - (error "(link-to-doc): %s invalid online location: %s" - delim-doc-id doc-path)))) + (error + "(link-to-doc): %s online location is invalid: \"%s\"" + delim-doc-id doc-path)))) (error "(link-to-doc): %s is unavailable in online form." delim-doc-id))))))) (defib doc-id () "Displays an index entry for a site-specific document given its id. -Ids must be delimited by 'doc-id-start' and 'doc-id-end' and must -match the function given by 'doc-id-p'." +Ids must be delimited by `doc-id-start' and `doc-id-end' and must +match the function given by `doc-id-p'." (and (not (bolp)) (let* ((id-and-pos (hbut:label-p t doc-id-start doc-id-end t)) (id (car id-and-pos))) @@ -128,9 +130,10 @@ ;;; Displays a doc from SW Process Tree (Motorola Paging Products Specific) ;;; ======================================================================== -(if (file-exists-p "/proj/process/ppg/") +(if (and (boundp 'ppg-sw-process-directory) ppg-sw-process-directory + (file-exists-p ppg-sw-process-directory)) (defib ppg-sw-process () - "Display a Paging Products software process document from document id at point." + "Display a Paging Products software process document whose location is at point." (let ((path (hpath:at-p nil t))) (if (and path (string-match "/.+%s.+%s" path)) (progn (require 'sw-process) @@ -145,7 +148,10 @@ (goto-char (match-beginning 1)) (let ((path-but (ibut:at-p))) (if path-but - (hbut:act path-but))))))))))) + (hbut:act path-but) + (error + "(ppg-sw-process): \"%s\" does not exist." path) + )))))))))) ;;; ************************************************************************ ;;; Public variables @@ -154,7 +160,7 @@ (defvar doc-id-indices '() "List of pathnames in which to search for site-specific document index entries. Each file must utilize a wrolo record format, with each record start -delimited by 'doc-id-index-entry-regexp'.") +delimited by `doc-id-index-entry-regexp'.") ;;; ************************************************************************ ;;; Private functions @@ -176,8 +182,7 @@ (temp-buffer-show-hook (function (lambda (buffer) - (setq *hkey-wconfig* - (current-window-configuration))) + (setq *hkey-wconfig* (current-window-configuration))) (let ((wind (get-buffer-create buffer))) (setq minibuffer-scroll-window wind)))) (temp-buffer-show-function temp-buffer-show-hook)) @@ -216,7 +221,7 @@ (> (length str) 0) (= ?w (char-syntax (aref str 0))) (string-match "\\`\\w+-[0-9][0-9][0-9]+\\'" str)))) - "Boolean function to test whether arg 'str' is a doc id or not.") + "Function with a boolean result which tests whether or not arg `str' is a doc id.") (defvar doc-id-online-regexp "^Online-Loc:[ \t]*\"\\([^\"]+\\)\"" "Regexp whose 1st grouping matches an implicit button which displays an online document within an index entry.")
--- a/lisp/hyperbole/hibtypes.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hibtypes.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,10 +6,17 @@ ;; KEYWORDS: extensions, hypermedia ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates +;; +;; This file is part of Hyperbole. +;; Available for use and distribution under the same terms as GNU Emacs. +;; +;; Copyright (C) 1991-1997 Free Software Foundation, Inc. +;; Developed with support from Motorola Inc. ;; ;; ORIG-DATE: 19-Sep-91 at 20:45:31 -;; LAST-MOD: 3-Nov-95 at 22:49:12 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 11:17:04 by Bob Weiner + ;;; ************************************************************************ ;;; Other required Elisp libraries ;;; ************************************************************************ @@ -23,6 +30,39 @@ (run-hooks 'hibtypes:begin-load-hook) ;;; ======================================================================== +;;; Use func-menu.el to jump to a function referred to in the same file in +;;; which it is defined. Function references across files are handled +;;; separately be clauses within the `hkey-alist' variable. +;;; ======================================================================== + +(defib function-in-buffer () + "Return function name defined within this buffer that point is within or after, else nil. +This triggers only when the func-menu.el package has been loaded and the +current major mode is one handled by func-menu." + (if (and (boundp 'fume-function-name-regexp-alist) + (assq major-mode fume-function-name-regexp-alist) + (not (eq major-mode 'dired-mode)) + ;; Not sure if this is defined in early versions of Emacs. + (fboundp 'skip-syntax-backward)) + (save-excursion + (skip-syntax-backward "w_") + (if (looking-at "\\(\\sw\\|\\s_\\)+") + (let ((function-name (buffer-substring (point) (match-end 0))) + (start (point)) + (end (match-end 0)) + function-pos) + (if fume-funclist + nil + (fume-set-defaults) + (let ((fume-scanning-message nil)) + (fume-rescan-buffer))) + (setq function-pos (cdr-safe (assoc function-name fume-funclist))) + (if function-pos + (progn (ibut:label-set function-name start end) + (hact 'function-in-buffer function-name + function-pos)))))))) + +;;; ======================================================================== ;;; Follows URLs by invoking a browser. ;;; ======================================================================== @@ -41,6 +81,8 @@ buffer-file-name (let ((chr (aref (buffer-name) 0))) (not (or (= chr ? ) (= chr ?*)))) + ;; Force [PPG-sw-process-id], if defined, to take precedence. + (not (htype:names 'ibtypes 'ppg-sw-process)) (let* ((ref-and-pos (hbut:label-p t "[" "]" t)) (ref (car ref-and-pos))) (and ref (= ?w (char-syntax (aref ref 0))) @@ -196,11 +238,11 @@ See also the documentation for `actypes::hyp-config'." (if (memq major-mode (list hmail:composer hnews:composer)) (let ((addr (find-tag-default))) - (cond ((set:member addr (list "hyperbole" "hyperbole@hub.ucsb.edu")) + (cond ((set:member addr (list "hyperbole" "hyperbole@infodock.com")) (hact 'hyp-config)) ((set:member addr (list "hyperbole-request" - "hyperbole-request@hub.ucsb.edu")) + "hyperbole-request@infodock.com")) (hact 'hyp-request)) )))) @@ -252,15 +294,28 @@ (defib pathname () "Makes a delimited, valid pathname display the path entry. Also works for delimited and non-delimited ange-ftp and efs pathnames. +Emacs Lisp library files (filenames that end in .el and .elc) are looked up +using the load-path directory list. + See `hpath:at-p' function documentation for possible delimiters. See `hpath:suffixes' variable documentation for suffixes that are added to or removed from pathname when searching for a valid match. -See `hpath:find' function documentation and `hpath:display-alist' and -`hpath:find-alist' variable documentation for special file display options." +See `hpath:find' function documentation for special file display options." (let ((path (hpath:at-p))) - (if path - (progn (ibut:label-set path) - (hact 'link-to-file path))))) + (cond (path + (ibut:label-set path) + (hact 'link-to-file path)) + ((and (fboundp 'locate-file) + (setq path (or (hargs:delimited "\"" "\"") + ;; Filenames in Info docs + (hargs:delimited "\`" "\'") + ;; Filenames in TexInfo docs + (hargs:delimited "@file{" "}"))) + (string-match ".\\.el?c\\'" path)) + (ibut:label-set path) + (setq path (locate-file path load-path)) + (if path (hact 'link-to-file path)))))) + ;;; ======================================================================== ;;; Jumps to source line associated with debugger stack frame or breakpoint
--- a/lisp/hyperbole/hinit.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hinit.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,15 +6,15 @@ ;; KEYWORDS: hypermedia ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 1-Oct-91 at 02:32:51 -;; LAST-MOD: 22-Oct-95 at 00:27:13 by Bob Weiner +;; LAST-MOD: 17-Feb-97 at 16:03:46 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. +;; Copyright (C) 1991-1997, Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: @@ -25,7 +25,7 @@ ;;; ************************************************************************ (defvar hyperb:host-domain nil - "<@domain-name> for current host. Set automatically by 'hyperb:init'.") + "<@domain-name> for current host. Set automatically by `hyperb:init'.") ;;; ************************************************************************ ;;; Other required Elisp libraries @@ -56,7 +56,7 @@ (hyperb:act-set) ;; ;; Save button attribute file whenever same dir file is saved and - ;; 'ebut:hattr-save' is non-nil. + ;; `ebut:hattr-save' is non-nil. ;; (var:append 'write-file-hooks '(hattr:save)) ;; @@ -76,7 +76,7 @@ (defun hyperb:act-set () "COORDINATION IS NOT YET OPERATIONAL. hui-coord.el IS NOT INCLUDED. Sets Hyperbole action command to uncoordinated or coordinated operation. -Coordinated is used when 'hcoord:hosts' is a non-nil list. +Coordinated is used when `hcoord:hosts' is a non-nil list. See \"hui-coord.el\"." (interactive) (fset 'hyperb:act (if (and (boundp 'hcoord:hosts) hcoord:hosts) @@ -88,14 +88,14 @@ ;;; ************************************************************************ (defun hyperb:check-dir-user () - "Ensures 'hbmap:dir-user' exists and is writable or signals an error." + "Ensures `hbmap:dir-user' exists and is writable or signals an error." (if (or (null hbmap:dir-user) (not (stringp hbmap:dir-user)) (and (setq hbmap:dir-user (file-name-as-directory (expand-file-name hbmap:dir-user))) (file-directory-p hbmap:dir-user) (not (file-writable-p (directory-file-name hbmap:dir-user))))) (error - "(hyperb:init): 'hbmap:dir-user' must be a writable directory name.")) + "(hyperb:init): `hbmap:dir-user' must be a writable directory name.")) (let ((hbmap:dir-user (directory-file-name hbmap:dir-user))) (or (file-directory-p hbmap:dir-user) ;; Exists and is writable. (let* ((parent-dir (file-name-directory @@ -103,10 +103,10 @@ (cond ((not (file-directory-p parent-dir)) (error - "(hyperb:init): 'hbmap:dir-user' parent dir does not exist.")) + "(hyperb:init): `hbmap:dir-user' parent dir does not exist.")) ((not (file-writable-p parent-dir)) (error - "(hyperb:init): 'hbmap:dir-user' parent directory not writable.")) + "(hyperb:init): `hbmap:dir-user' parent directory not writable.")) ((or (if (fboundp 'make-directory) (progn (make-directory hbmap:dir-user) t)) (hypb:call-process-p "mkdir" nil nil hbmap:dir-user)) @@ -115,7 +115,7 @@ (file-writable-p hbmap:dir-user)) (error "(hyperb:init): Can't write to 'hbmap:dir-user'.") ))) - (t (error "(hyperb:init): 'hbmap:dir-user' create failed.")))))) + (t (error "(hyperb:init): `hbmap:dir-user' create failed.")))))) t) (provide 'hinit)
--- a/lisp/hyperbole/hmail.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hmail.el Mon Aug 13 09:15:11 2007 +0200 @@ -9,7 +9,7 @@ ;; ORG: Brown U. ;; ;; ORIG-DATE: 9-Oct-91 at 18:38:05 -;; LAST-MOD: 4-Nov-95 at 04:37:50 by Bob Weiner +;; LAST-MOD: 6-Dec-96 at 12:35:29 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs.
--- a/lisp/hyperbole/hmh.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hmh.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,15 +6,15 @@ ;; KEYWORDS: hypermedia, mail ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 21-May-91 at 17:06:36 -;; LAST-MOD: 19-May-95 at 15:09:30 by Bob Weiner +;; LAST-MOD: 31-Oct-96 at 22:34:01 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. +;; Copyright (C) 1991-1996, Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: @@ -22,7 +22,7 @@ ;; Automatically configured for use in "hsite.el". ;; If hsite loading fails prior to initializing Hyperbole Mh support, ;; -;; {M-x Mh-init RTN} +;; {M-x Mh-init RET} ;; ;; will do it. ;;
--- a/lisp/hyperbole/hmoccur.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hmoccur.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,22 +6,22 @@ ;; KEYWORDS: hypermedia, matching ;; ;; AUTHOR: Markus Freericks <mfx@cs.tu-berlin.de> / Bob Weiner -;; ORG: Technical University of Berlin / Brown U. +;; ORG: Technical University of Berlin / InfoDock Associates ;; ;; ORIG-DATE: 1-Aug-91 -;; LAST-MOD: 14-Apr-95 at 16:04:43 by Bob Weiner +;; LAST-MOD: 31-Oct-96 at 22:35:01 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; ;; Copyright (C) 1991, Markus Freericks -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. +;; Copyright (C) 1991-1996, Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: ;; ;; Modified by Bob Weiner to allow selection of a set of files within a -;; single directory to search. By default, {M-x moccur RTN} searches +;; single directory to search. By default, {M-x moccur RET} searches ;; current buffers with files attached. ;; ;; Date: 1 Aug 91 15:47:27 GMT
--- a/lisp/hyperbole/hmouse-drv.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hmouse-drv.el Mon Aug 13 09:15:11 2007 +0200 @@ -269,6 +269,7 @@ (bury-buffer buf) (setq *hkey-wconfig* nil))) +;;;###autoload (defun hkey-help-show (buffer &optional current-window) "Saves prior frame configuration if BUFFER displays help. Displays BUFFER.
--- a/lisp/hyperbole/hmouse-key.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hmouse-key.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,15 +6,15 @@ ;; KEYWORDS: hypermedia, mouse ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola, Inc., PPG +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 30-May-94 at 00:11:57 -;; LAST-MOD: 14-Sep-95 at 18:35:17 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 18:03:12 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1994-1995, Free Software Foundation, Inc. +;; Copyright (C) 1994-1995, 1997 Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: @@ -22,12 +22,12 @@ ;; Supports Epoch, Lucid Emacs, X, Sunview, NEXTSTEP, and Apollo DM ;; window systems. ;; -;; 'hmouse-shift-buttons' globally binds the Action and Assist Mouse Keys +;; `hmouse-shift-buttons' globally binds the Action and Assist Mouse Keys ;; to either shifted or unshifted mouse buttons. ;; -;; 'hmouse-toggle-bindings' may be bound to a key. It switches between +;; `hmouse-toggle-bindings' may be bound to a key. It switches between ;; the Hyperbole mouse bindings and previous mouse key bindings any time -;; after 'hmouse-shift-buttons' has been called. +;; after `hmouse-shift-buttons' has been called. ;; ;; DESCRIP-END. @@ -43,17 +43,18 @@ ;;; Public variables ;;; ************************************************************************ -(eval (cdr (assoc hyperb:window-system - '( - ;; XEmacs and Emacs 19 pre-load their mouse libraries, so - ;; we shouldn't have to require them here. - ;; - ("xterm" . (require 'x-mouse)) ; X - ("epoch" . (require 'mouse)) ; UofI Epoch - ("next" . (load "eterm-fns" t)) ; NeXTstep - ("sun" . (require 'sun-fns)) ; SunView - ("apollo" . (require 'apollo)) ; Display Manager - )))) +(if (or hyperb:xemacs-p hyperb:emacs19-p) + ;; XEmacs and Emacs 19 pre-load their mouse libraries, so + ;; we shouldn't have to require them here. + nil + (eval (cdr (assoc hyperb:window-system + '( + ("xterm" . (require 'x-mouse)) ; X + ("epoch" . (require 'mouse)) ; UofI Epoch + ("next" . (load "eterm-fns" t)) ; NeXTstep + ("sun" . (require 'sun-fns)) ; SunView + ("apollo" . (require 'apollo)) ; Display Manager + ))))) ;;; ************************************************************************ ;;; Public functions @@ -64,10 +65,11 @@ KEY-BINDING-LIST is the value returned by 'hmouse-get-bindings' prior to Smart Key setup." (cond + ;; Do nothing when running in batch mode. + (noninteractive) ;; ;; GNU Emacs 19, Lucid Emacs, XEmacs or InfoDock - ((or (if (not noninteractive) (or hyperb:xemacs-p hyperb:emacs19-p)) - (equal hyperb:window-system "lemacs")) + ((or hyperb:xemacs-p hyperb:emacs19-p (equal hyperb:window-system "lemacs")) (mapcar (function (lambda (key-and-binding)
--- a/lisp/hyperbole/hmouse-reg.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hmouse-reg.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,280 +6,293 @@ ;; KEYWORDS: hypermedia, mouse ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 3-Sep-91 at 21:40:58 -;; LAST-MOD: 14-Sep-95 at 18:39:04 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 18:02:33 by Bob Weiner +;; +;; This file is part of Hyperbole. +;; Available for use and distribution under the same terms as GNU Emacs. +;; +;; Copyright (C) 1991-1997, Free Software Foundation, Inc. +;; Developed with support from Motorola Inc. + ;;; ************************************************************************ ;;; Public functions ;;; ************************************************************************ (defun hmouse-get-bindings () "Returns list of bindings for mouse keys prior to their use as Smart Keys." - (eval - (cdr (assoc - ;; Get mouse bindings under Emacs 19 or XEmacs, even if not under a - ;; window system since it can have frames on ttys and windowed - ;; displays at the same time. - (or hyperb:window-system - (and (not noninteractive) hyperb:xemacs-p "lemacs") - (and (not noninteractive) hyperb:emacs19-p "emacs19")) - '(("emacs19" . - (mapcar (function - (lambda (key) (cons key (lookup-key global-map key)))) - (if (memq window-system '(ns dps)) - ;; NEXTSTEP offers only 2 mouse buttons which we use - ;; as the Smart Keys. We move the mouse-set-point - ;; command to shift-left. - '([down-mouse-1] [mouse-1] [down-mouse-2] [mouse-2] - [double-mouse-1] [triple-mouse-1] + ;; Do nothing when running in batch mode. + (if noninteractive + nil + (eval + (cdr (assoc + ;; Get mouse bindings under Emacs 19 or XEmacs, even if not under a + ;; window system since it can have frames on ttys and windowed + ;; displays at the same time. + (or (and hyperb:xemacs-p "lemacs") + (and hyperb:emacs19-p "emacs19") + hyperb:window-system) + '(("emacs19" . + (mapcar (function + (lambda (key) (cons key (lookup-key global-map key)))) + (if (memq window-system '(ns dps)) + ;; NEXTSTEP offers only 2 mouse buttons which we use + ;; as the Smart Keys. We move the mouse-set-point + ;; command to shift-left. + '([down-mouse-1] [mouse-1] [down-mouse-2] [mouse-2] + [double-mouse-1] [triple-mouse-1] + [double-mouse-2] [triple-mouse-2] + [vertical-line down-mouse-1] [vertical-line mouse-1] + [vertical-line down-mouse-2] [vertical-line mouse-2] + [mode-line down-mouse-1] [mode-line mouse-1] + [mode-line down-mouse-2] [mode-line mouse-2] + [S-mouse-1] + ) + ;; X + '([down-mouse-2] [mouse-2] [down-mouse-3] [mouse-3] [double-mouse-2] [triple-mouse-2] - [vertical-line down-mouse-1] [vertical-line mouse-1] + [double-mouse-3] [triple-mouse-3] [vertical-line down-mouse-2] [vertical-line mouse-2] - [mode-line down-mouse-1] [mode-line mouse-1] + [vertical-line down-mouse-3] [vertical-line mouse-3] [mode-line down-mouse-2] [mode-line mouse-2] - [S-mouse-1] - ) - ;; X - '([down-mouse-2] [mouse-2] [down-mouse-3] [mouse-3] - [double-mouse-2] [triple-mouse-2] - [double-mouse-3] [triple-mouse-3] - [vertical-line down-mouse-2] [vertical-line mouse-2] - [vertical-line down-mouse-3] [vertical-line mouse-3] - [mode-line down-mouse-2] [mode-line mouse-2] - [mode-line down-mouse-3] [mode-line mouse-3] - )))) - ("lemacs" . - (nconc - (mapcar (function - (lambda (key) - (cons key (lookup-key global-map key)))) - '([button2] [button2up] [button3] [button3up])) - (if (boundp 'mode-line-map) - (mapcar (function - (lambda (key) - (cons key (lookup-key mode-line-map key)))) - '([button3] [button3up]))))) - ("xterm" . - (mapcar (function - (lambda (key) (cons key (lookup-key mouse-map key)))) - (list x-button-middle x-button-middle-up - x-button-right x-button-right-up))) - ("epoch" . - (mapcar (function - (lambda (key) (cons key (aref mouse::global-map key)))) - (list (mouse::index mouse-middle mouse-down) - (mouse::index mouse-middle mouse-up) - (mouse::index mouse-right mouse-down) - (mouse::index mouse-right mouse-up) - ;; Modeline mouse map - (mouse::index mouse-mode-middle mouse-down) - (mouse::index mouse-mode-middle mouse-up) - (mouse::index mouse-mode-right mouse-down) - (mouse::index mouse-mode-right mouse-up) - ))) - ("next" . - (mapcar (function - (lambda (key) - (cons key (mousemap-get - (mouse-list-to-mouse-code key) - current-global-mousemap)))) - (apply 'nconc - (mapcar (function - (lambda (region) - (mapcar (function - (lambda (key) - (cons region key))) - '((left) (up left) (shift left) - (right) (up right) - )))) - '(text scrollbar modeline minibuffer))) - )) - ;; SunView - ("sun" . - (mapcar (function - (lambda (key) - (setq key (mouse-list-to-mouse-code key)) - (cons key (mousemap-get - key current-global-mousemap)))) - (apply 'nconc - (mapcar (function - (lambda (region) - (mapcar (function - (lambda (key) - (cons region key))) - '((middle) (up middle) - (right) (up right) - )))) - '(text scrollbar modeline minibuffer))) - )) - ("apollo" . - (mapcar (function - (lambda (key-str) (apollo-mouse-key-and-binding - key-str))) - '("M2D" "M2U" "M3D" "M3U"))) - ))))) + [mode-line down-mouse-3] [mode-line mouse-3] + )))) + ("lemacs" . + (nconc + (mapcar (function + (lambda (key) + (cons key (lookup-key global-map key)))) + '([button2] [button2up] [button3] [button3up])) + (if (boundp 'mode-line-map) + (mapcar (function + (lambda (key) + (cons key (lookup-key mode-line-map key)))) + '([button3] [button3up]))))) + ("xterm" . + (mapcar (function + (lambda (key) (cons key (lookup-key mouse-map key)))) + (list x-button-middle x-button-middle-up + x-button-right x-button-right-up))) + ("epoch" . + (mapcar (function + (lambda (key) (cons key (aref mouse::global-map key)))) + (list (mouse::index mouse-middle mouse-down) + (mouse::index mouse-middle mouse-up) + (mouse::index mouse-right mouse-down) + (mouse::index mouse-right mouse-up) + ;; Modeline mouse map + (mouse::index mouse-mode-middle mouse-down) + (mouse::index mouse-mode-middle mouse-up) + (mouse::index mouse-mode-right mouse-down) + (mouse::index mouse-mode-right mouse-up) + ))) + ("next" . + (mapcar (function + (lambda (key) + (cons key (mousemap-get + (mouse-list-to-mouse-code key) + current-global-mousemap)))) + (apply 'nconc + (mapcar (function + (lambda (region) + (mapcar (function + (lambda (key) + (cons region key))) + '((left) (up left) (shift left) + (right) (up right) + )))) + '(text scrollbar modeline minibuffer))) + )) + ;; SunView + ("sun" . + (mapcar (function + (lambda (key) + (setq key (mouse-list-to-mouse-code key)) + (cons key (mousemap-get + key current-global-mousemap)))) + (apply 'nconc + (mapcar (function + (lambda (region) + (mapcar (function + (lambda (key) + (cons region key))) + '((middle) (up middle) + (right) (up right) + )))) + '(text scrollbar modeline minibuffer))) + )) + ("apollo" . + (mapcar (function + (lambda (key-str) (apollo-mouse-key-and-binding + key-str))) + '("M2D" "M2U" "M3D" "M3U"))) + )))))) (defun hmouse-setup () "Binds mouse keys for use as Smart Keys." (interactive) - (or hmouse-bindings-flag hmouse-previous-bindings - (setq hmouse-previous-bindings (hmouse-get-bindings))) - ;; Ensure Gillespie's Info mouse support is off since - ;; Hyperbole handles that. - (setq Info-mouse-support nil) - ;; - (cond ;; GNU Emacs 19 - ((if (not noninteractive) hyperb:emacs19-p) - (setq hmouse-set-point-command 'mouse-set-point) - ;; Get rid of Info-mode [mouse-2] binding since Hyperbole performs - ;; a superset of what it does. - (add-hook 'Info-mode-hook - (function (lambda () (define-key Info-mode-map [mouse-2] nil)))) - ;; - (if (memq window-system '(ns dps)) - ;; NEXTSTEP offers only 2 mouse buttons which we use - ;; as the Smart Keys. We move the mouse-set-point - ;; command to shift-left. - (progn - (global-set-key [S-down-mouse-1] 'mouse-drag-region) - (global-set-key [S-mouse-1] 'mouse-set-point) - (global-set-key [down-mouse-1] 'action-key-depress-emacs19) - (global-set-key [mouse-1] 'action-mouse-key-emacs19) - (global-set-key [double-mouse-1] 'action-mouse-key-emacs19) - (global-set-key [triple-mouse-1] 'action-mouse-key-emacs19) - (global-set-key [down-mouse-2] 'assist-key-depress-emacs19) - (global-set-key [mouse-2] 'assist-mouse-key-emacs19) - (global-set-key [double-mouse-2] 'assist-mouse-key-emacs19) - (global-set-key [triple-mouse-2] 'assist-mouse-key-emacs19) - (global-set-key [vertical-line down-mouse-1] 'action-key-depress-emacs19) - (global-set-key [vertical-line mouse-1] 'action-mouse-key-emacs19) - (global-set-key [vertical-line down-mouse-2] 'assist-key-depress-emacs19) - (global-set-key [vertical-line mouse-2] 'assist-mouse-key-emacs19) - (global-set-key [mode-line down-mouse-2] 'action-key-depress-emacs19) - (global-set-key [mode-line mouse-2] 'action-mouse-key-emacs19) - (global-set-key [mode-line down-mouse-3] 'assist-key-depress-emacs19) - (global-set-key [mode-line mouse-3] 'assist-mouse-key-emacs19)) - ;; X - (global-set-key [down-mouse-2] 'action-key-depress-emacs19) - (global-set-key [mouse-2] 'action-mouse-key-emacs19) - (global-set-key [double-mouse-2] 'action-mouse-key-emacs19) - (global-set-key [triple-mouse-2] 'action-mouse-key-emacs19) - (global-set-key [down-mouse-3] 'assist-key-depress-emacs19) - (global-set-key [mouse-3] 'assist-mouse-key-emacs19) - (global-set-key [double-mouse-3] 'assist-mouse-key-emacs19) - (global-set-key [triple-mouse-3] 'assist-mouse-key-emacs19) - (global-set-key [vertical-line down-mouse-2] 'action-key-depress-emacs19) - (global-set-key [vertical-line mouse-2] 'action-mouse-key-emacs19) - (global-set-key [vertical-line down-mouse-3] 'assist-key-depress-emacs19) - (global-set-key [vertical-line mouse-3] 'assist-mouse-key-emacs19) - (global-set-key [mode-line down-mouse-2] 'action-key-depress-emacs19) - (global-set-key [mode-line mouse-2] 'action-mouse-key-emacs19) - (global-set-key [mode-line down-mouse-3] 'assist-key-depress-emacs19) - (global-set-key [mode-line mouse-3] 'assist-mouse-key-emacs19))) - ;; - ;; XEmacs - ((if (not noninteractive) hyperb:xemacs-p) - ;; Set mouse bindings under XEmacs, even if not under a window - ;; system since it can have frames on ttys and windowed displays at - ;; the same time. - (setq hmouse-set-point-command 'hmouse-move-point-xemacs) - ;; Get rid of Info-mode buttons 2 and 3 bindings since Hyperbole - ;; handles things in Info. - (add-hook 'Info-mode-hook - (function (lambda () - (define-key Info-mode-map 'button2 nil)))) + ;; Do nothing when running in batch mode. + (if noninteractive + nil + (or hmouse-bindings-flag hmouse-previous-bindings + (setq hmouse-previous-bindings (hmouse-get-bindings))) + ;; Ensure Gillespie's Info mouse support is off since + ;; Hyperbole handles that. + (setq Info-mouse-support nil) ;; - (global-set-key 'button2 'action-key-depress) - (global-set-key 'button2up 'action-mouse-key) - (if (fboundp 'infodock-set-mouse-bindings) - (infodock-set-mouse-bindings) - (let ((unbind-but3 - (function (lambda () - (define-key Info-mode-map 'button3 nil))))) - (if (and (boundp 'Info-mode-map) (keymapp Info-mode-map)) - (funcall unbind-but3) - (add-hook 'Info-mode-hook unbind-but3))) - (if (boundp 'mode-line-map) - (progn (define-key mode-line-map 'button3 'assist-key-depress) - (define-key mode-line-map 'button3up 'assist-mouse-key))) - (global-set-key 'button3 'assist-key-depress) - (global-set-key 'button3up 'assist-mouse-key))) - ;; - ;; X - ((equal hyperb:window-system "xterm") - (setq hmouse-set-point-command 'x-mouse-set-point) - (define-key mouse-map x-button-middle 'action-key-depress) - (define-key mouse-map x-button-middle-up 'action-mouse-key) - (define-key mouse-map x-button-right 'assist-key-depress) - (define-key mouse-map x-button-right-up 'assist-mouse-key) - ;; Use these instead of the above for a true META-BUTTON binding. - ;; (define-key mouse-map x-button-m-middle 'assist-key-depress) - ;; (define-key mouse-map x-button-m-middle-up 'assist-mouse-key) - ) - ;; - ;; Epoch - ((equal hyperb:window-system "epoch") - (setq hmouse-set-point-command 'mouse::set-point) - (global-set-mouse mouse-middle mouse-down 'action-key-depress) - (global-set-mouse mouse-middle mouse-up 'action-mouse-key) - (global-set-mouse mouse-right mouse-down 'assist-key-depress) - (global-set-mouse mouse-right mouse-up 'assist-mouse-key) - ;; Modeline mouse map - (global-set-mouse mouse-mode-middle mouse-down 'action-key-depress) - (global-set-mouse mouse-mode-middle mouse-up 'action-mouse-key) - (global-set-mouse mouse-mode-right mouse-down 'assist-key-depress) - (global-set-mouse mouse-mode-right mouse-up 'assist-mouse-key) - ) - ;; - ;; NeXT - ((equal hyperb:window-system "next") - (setq hmouse-set-point-command 'hmouse-move-point-eterm) - ;; Use shift-left button to set point. - ;; Use left button instead of non-existent middle as Smart Key. - (mapcar - (function - (lambda (region) - (global-set-mouse (cons region '(shift left)) 'mouse-move-point) - (global-set-mouse (cons region '(left)) 'action-key-depress) - (global-set-mouse (cons region '(up left)) 'action-mouse-key) - (global-set-mouse (cons region '(right)) 'assist-key-depress) - (global-set-mouse (cons region '(up right)) 'assist-mouse-key) - ;; Use these instead of the above for a true META-BUTTON binding. - ;; (global-set-mouse (cons region '(meta right)) 'assist-key-depress) - ;; (global-set-mouse (cons region '(meta up right)) 'assist-mouse-key) - )) - '(text scrollbar modeline minibuffer)) - ) - ;; - ;; SunView - ((equal hyperb:window-system "sun") - (setq hmouse-set-point-command 'hmouse-move-point-eterm) - (mapcar - (function - (lambda (region) - (global-set-mouse (cons region '(middle)) 'action-key-depress) - (global-set-mouse (cons region '(up middle)) 'action-mouse-key) - (global-set-mouse (cons region '(right)) 'assist-key-depress) - (global-set-mouse (cons region '(up right)) 'assist-mouse-key) - ;; Use these instead of the above for a true META-BUTTON binding. - ;; (global-set-mouse (cons region '(meta middle)) 'assist-key-depress) - ;; (global-set-mouse (cons region '(meta up middle)) 'assist-mouse-key) - )) - '(text scrollbar modeline minibuffer)) - ) - ;; - ;; Apollo DM - ((equal hyperb:window-system "apollo") - (setq hmouse-set-point-command 'apollo-mouse-move-point) - (bind-apollo-mouse-button "M2D" 'action-key-depress) - (bind-apollo-mouse-button "M2U" 'action-mouse-key) - (bind-apollo-mouse-button "M3D" 'assist-key-depress) - (bind-apollo-mouse-button "M3U" 'assist-mouse-key) - ;; Use these instead of the above for a true META-BUTTON binding. - ;; (bind-apollo-mouse-button "M2U" 'action-mouse-key - ;; 'assist-mouse-key) - ;; (bind-apollo-mouse-button "M2D" 'action-key-depress 'assist-key-depress) - )) - (setq hmouse-bindings (hmouse-get-bindings) - hmouse-bindings-flag t)) + (cond;; GNU Emacs 19 + (hyperb:emacs19-p + (setq hmouse-set-point-command 'mouse-set-point) + ;; Get rid of Info-mode [mouse-2] binding since Hyperbole performs + ;; a superset of what it does. + (add-hook 'Info-mode-hook + (function (lambda () (define-key Info-mode-map [mouse-2] nil)))) + ;; + (if (memq window-system '(ns dps)) + ;; NEXTSTEP offers only 2 mouse buttons which we use + ;; as the Smart Keys. We move the mouse-set-point + ;; command to shift-left. + (progn + (global-set-key [S-down-mouse-1] 'mouse-drag-region) + (global-set-key [S-mouse-1] 'mouse-set-point) + (global-set-key [down-mouse-1] 'action-key-depress-emacs19) + (global-set-key [mouse-1] 'action-mouse-key-emacs19) + (global-set-key [double-mouse-1] 'action-mouse-key-emacs19) + (global-set-key [triple-mouse-1] 'action-mouse-key-emacs19) + (global-set-key [down-mouse-2] 'assist-key-depress-emacs19) + (global-set-key [mouse-2] 'assist-mouse-key-emacs19) + (global-set-key [double-mouse-2] 'assist-mouse-key-emacs19) + (global-set-key [triple-mouse-2] 'assist-mouse-key-emacs19) + (global-set-key [vertical-line down-mouse-1] 'action-key-depress-emacs19) + (global-set-key [vertical-line mouse-1] 'action-mouse-key-emacs19) + (global-set-key [vertical-line down-mouse-2] 'assist-key-depress-emacs19) + (global-set-key [vertical-line mouse-2] 'assist-mouse-key-emacs19) + (global-set-key [mode-line down-mouse-2] 'action-key-depress-emacs19) + (global-set-key [mode-line mouse-2] 'action-mouse-key-emacs19) + (global-set-key [mode-line down-mouse-3] 'assist-key-depress-emacs19) + (global-set-key [mode-line mouse-3] 'assist-mouse-key-emacs19)) + ;; X + (global-set-key [down-mouse-2] 'action-key-depress-emacs19) + (global-set-key [mouse-2] 'action-mouse-key-emacs19) + (global-set-key [double-mouse-2] 'action-mouse-key-emacs19) + (global-set-key [triple-mouse-2] 'action-mouse-key-emacs19) + (global-set-key [down-mouse-3] 'assist-key-depress-emacs19) + (global-set-key [mouse-3] 'assist-mouse-key-emacs19) + (global-set-key [double-mouse-3] 'assist-mouse-key-emacs19) + (global-set-key [triple-mouse-3] 'assist-mouse-key-emacs19) + (global-set-key [vertical-line down-mouse-2] 'action-key-depress-emacs19) + (global-set-key [vertical-line mouse-2] 'action-mouse-key-emacs19) + (global-set-key [vertical-line down-mouse-3] 'assist-key-depress-emacs19) + (global-set-key [vertical-line mouse-3] 'assist-mouse-key-emacs19) + (global-set-key [mode-line down-mouse-2] 'action-key-depress-emacs19) + (global-set-key [mode-line mouse-2] 'action-mouse-key-emacs19) + (global-set-key [mode-line down-mouse-3] 'assist-key-depress-emacs19) + (global-set-key [mode-line mouse-3] 'assist-mouse-key-emacs19))) + ;; + ;; XEmacs + (hyperb:xemacs-p + ;; Set mouse bindings under XEmacs, even if not under a window + ;; system since it can have frames on ttys and windowed displays at + ;; the same time. + (setq hmouse-set-point-command 'hmouse-move-point-xemacs) + ;; Get rid of Info-mode buttons 2 and 3 bindings since Hyperbole + ;; handles things in Info. + (add-hook 'Info-mode-hook + (function (lambda () + (define-key Info-mode-map 'button2 nil)))) + ;; + (global-set-key 'button2 'action-key-depress) + (global-set-key 'button2up 'action-mouse-key) + (if (fboundp 'infodock-set-mouse-bindings) + (infodock-set-mouse-bindings) + (let ((unbind-but3 + (function (lambda () + (define-key Info-mode-map 'button3 nil))))) + (if (and (boundp 'Info-mode-map) (keymapp Info-mode-map)) + (funcall unbind-but3) + (add-hook 'Info-mode-hook unbind-but3))) + (if (boundp 'mode-line-map) + (progn (define-key mode-line-map 'button3 'assist-key-depress) + (define-key mode-line-map 'button3up 'assist-mouse-key))) + (global-set-key 'button3 'assist-key-depress) + (global-set-key 'button3up 'assist-mouse-key))) + ;; + ;; X + ((equal hyperb:window-system "xterm") + (setq hmouse-set-point-command 'x-mouse-set-point) + (define-key mouse-map x-button-middle 'action-key-depress) + (define-key mouse-map x-button-middle-up 'action-mouse-key) + (define-key mouse-map x-button-right 'assist-key-depress) + (define-key mouse-map x-button-right-up 'assist-mouse-key) + ;; Use these instead of the above for a true META-BUTTON binding. + ;; (define-key mouse-map x-button-m-middle 'assist-key-depress) + ;; (define-key mouse-map x-button-m-middle-up 'assist-mouse-key) + ) + ;; + ;; Epoch + ((equal hyperb:window-system "epoch") + (setq hmouse-set-point-command 'mouse::set-point) + (global-set-mouse mouse-middle mouse-down 'action-key-depress) + (global-set-mouse mouse-middle mouse-up 'action-mouse-key) + (global-set-mouse mouse-right mouse-down 'assist-key-depress) + (global-set-mouse mouse-right mouse-up 'assist-mouse-key) + ;; Modeline mouse map + (global-set-mouse mouse-mode-middle mouse-down 'action-key-depress) + (global-set-mouse mouse-mode-middle mouse-up 'action-mouse-key) + (global-set-mouse mouse-mode-right mouse-down 'assist-key-depress) + (global-set-mouse mouse-mode-right mouse-up 'assist-mouse-key) + ) + ;; + ;; NeXT + ((equal hyperb:window-system "next") + (setq hmouse-set-point-command 'hmouse-move-point-eterm) + ;; Use shift-left button to set point. + ;; Use left button instead of non-existent middle as Smart Key. + (mapcar + (function + (lambda (region) + (global-set-mouse (cons region '(shift left)) 'mouse-move-point) + (global-set-mouse (cons region '(left)) 'action-key-depress) + (global-set-mouse (cons region '(up left)) 'action-mouse-key) + (global-set-mouse (cons region '(right)) 'assist-key-depress) + (global-set-mouse (cons region '(up right)) 'assist-mouse-key) + ;; Use these instead of the above for a true META-BUTTON binding. + ;; (global-set-mouse (cons region '(meta right)) 'assist-key-depress) + ;; (global-set-mouse (cons region '(meta up right)) 'assist-mouse-key) + )) + '(text scrollbar modeline minibuffer)) + ) + ;; + ;; SunView + ((equal hyperb:window-system "sun") + (setq hmouse-set-point-command 'hmouse-move-point-eterm) + (mapcar + (function + (lambda (region) + (global-set-mouse (cons region '(middle)) 'action-key-depress) + (global-set-mouse (cons region '(up middle)) 'action-mouse-key) + (global-set-mouse (cons region '(right)) 'assist-key-depress) + (global-set-mouse (cons region '(up right)) 'assist-mouse-key) + ;; Use these instead of the above for a true META-BUTTON binding. + ;; (global-set-mouse (cons region '(meta middle)) 'assist-key-depress) + ;; (global-set-mouse (cons region '(meta up middle)) 'assist-mouse-key) + )) + '(text scrollbar modeline minibuffer)) + ) + ;; + ;; Apollo DM + ((equal hyperb:window-system "apollo") + (setq hmouse-set-point-command 'apollo-mouse-move-point) + (bind-apollo-mouse-button "M2D" 'action-key-depress) + (bind-apollo-mouse-button "M2U" 'action-mouse-key) + (bind-apollo-mouse-button "M3D" 'assist-key-depress) + (bind-apollo-mouse-button "M3U" 'assist-mouse-key) + ;; Use these instead of the above for a true META-BUTTON binding. + ;; (bind-apollo-mouse-button "M2U" 'action-mouse-key + ;; 'assist-mouse-key) + ;; (bind-apollo-mouse-button "M2D" 'action-key-depress 'assist-key-depress) + )) + (setq hmouse-bindings (hmouse-get-bindings) + hmouse-bindings-flag t)))
--- a/lisp/hyperbole/hmouse-sh.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hmouse-sh.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,15 +6,15 @@ ;; KEYWORDS: hypermedia, mouse ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 3-Sep-91 at 21:40:58 -;; LAST-MOD: 14-Sep-95 at 18:39:12 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 18:02:48 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. +;; Copyright (C) 1991-1997, Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: @@ -29,262 +29,268 @@ (defun hmouse-get-bindings () "Returns list of bindings for mouse keys prior to their use as Smart Keys." - (eval - (cdr (assoc - ;; Get mouse bindings under Emacs 19 or XEmacs, even if not under a - ;; window system since it can have frames on ttys and windowed - ;; displays at the same time. - (or hyperb:window-system - (and (not noninteractive) hyperb:xemacs-p "lemacs") - (and (not noninteractive) hyperb:emacs19-p "emacs19")) - '(("emacs19" . - (mapcar (function - (lambda (key) (cons key (lookup-key global-map key)))) - (if (memq window-system '(ns dps)) - ;; NEXTSTEP offers only 2 shift-mouse buttons which we use - ;; as the Smart Keys. - '([S-down-mouse-1] [S-mouse-1] [S-down-mouse-2] - [S-mouse-2] [S-double-mouse-1] [S-triple-mouse-1] - [S-double-mouse-2] [S-triple-mouse-2] - [vertical-line S-down-mouse-1] - [vertical-line S-mouse-1] + ;; Do nothing when running in batch mode. + (if noninteractive + nil + (eval + (cdr (assoc + ;; Get mouse bindings under Emacs 19 or XEmacs, even if not under a + ;; window system since it can have frames on ttys and windowed + ;; displays at the same time. + (or (and hyperb:xemacs-p "lemacs") + (and hyperb:emacs19-p "emacs19") + hyperb:window-system) + '(("emacs19" . + (mapcar (function + (lambda (key) (cons key (lookup-key global-map key)))) + (if (memq window-system '(ns dps)) + ;; NEXTSTEP offers only 2 shift-mouse buttons which we use + ;; as the Smart Keys. + '([S-down-mouse-1] [S-mouse-1] [S-down-mouse-2] + [S-mouse-2] [S-double-mouse-1] [S-triple-mouse-1] + [S-double-mouse-2] [S-triple-mouse-2] + [vertical-line S-down-mouse-1] + [vertical-line S-mouse-1] + [vertical-line S-down-mouse-2] + [vertical-line S-mouse-2] + [mode-line S-down-mouse-1] [mode-line S-mouse-1] + [mode-line S-down-mouse-2] [mode-line S-mouse-2] + ) + ;; X + '([S-down-mouse-2] [S-mouse-2] [S-down-mouse-3] + [S-mouse-3] [S-double-mouse-2] [S-triple-mouse-2] + [S-double-mouse-3] [S-triple-mouse-3] [vertical-line S-down-mouse-2] [vertical-line S-mouse-2] - [mode-line S-down-mouse-1] [mode-line S-mouse-1] + [vertical-line S-down-mouse-3] + [vertical-line S-mouse-3] [mode-line S-down-mouse-2] [mode-line S-mouse-2] - ) - ;; X - '([S-down-mouse-2] [S-mouse-2] [S-down-mouse-3] - [S-mouse-3] [S-double-mouse-2] [S-triple-mouse-2] - [S-double-mouse-3] [S-triple-mouse-3] - [vertical-line S-down-mouse-2] - [vertical-line S-mouse-2] - [vertical-line S-down-mouse-3] - [vertical-line S-mouse-3] - [mode-line S-down-mouse-2] [mode-line S-mouse-2] - [mode-line S-down-mouse-3] [mode-line S-mouse-3] - )))) - ("lemacs" . - (nconc - (mapcar (function - (lambda (key) - (cons key (lookup-key global-map key)))) - '([(shift button2)] [(shift button2up)] - [(shift button3)] [(shift button3up)])) - (if (boundp 'mode-line-map) - (mapcar (function - (lambda (key) - (cons key (lookup-key mode-line-map key)))) - '([(shift button3)] [(shift button3up)]))))) - ("xterm" . - (mapcar (function - (lambda (key) (cons key (lookup-key mouse-map key)))) - (list x-button-s-middle x-button-s-middle-up - x-button-s-right x-button-s-right-up))) - ("epoch" . - (mapcar (function - (lambda (key) (cons key (aref mouse::global-map key)))) - (list (mouse::index mouse-middle mouse-shift) - (mouse::index mouse-middle mouse-shift-up) - (mouse::index mouse-right mouse-shift) - (mouse::index mouse-right mouse-shift-up) - ;; Modeline mouse map - (mouse::index mouse-mode-middle mouse-shift) - (mouse::index mouse-mode-middle mouse-shift-up) - (mouse::index mouse-mode-right mouse-shift) - (mouse::index mouse-mode-right mouse-shift-up) - ))) - ("next" . - (mapcar (function - (lambda (key) - (cons key (mousemap-get - (mouse-list-to-mouse-code key) - current-global-mousemap)))) - (apply 'nconc - (mapcar (function - (lambda (region) - (mapcar (function - (lambda (key) - (cons region key))) - '((shift left) (shift up left) - (shift right) - (shift up right) - )))) - '(text scrollbar modeline minibuffer))) - )) - ;; SunView - ("sun" . - (mapcar (function - (lambda (key) - (setq key (mouse-list-to-mouse-code key)) - (cons key (mousemap-get - key current-global-mousemap)))) - (apply 'nconc - (mapcar (function - (lambda (region) - (mapcar (function - (lambda (key) - (cons region key))) - '((shift middle) - (shift up middle) - (shift right) - (shift up right) - )))) - '(text scrollbar modeline minibuffer))) - )) - ("apollo" . - (mapcar (function - (lambda (key-str) (apollo-mouse-key-and-binding - key-str))) - '("M2S" "M2U" "M3S" "M3U"))) - ))))) + [mode-line S-down-mouse-3] [mode-line S-mouse-3] + )))) + ("lemacs" . + (nconc + (mapcar (function + (lambda (key) + (cons key (lookup-key global-map key)))) + '([(shift button2)] [(shift button2up)] + [(shift button3)] [(shift button3up)])) + (if (boundp 'mode-line-map) + (mapcar (function + (lambda (key) + (cons key (lookup-key mode-line-map key)))) + '([(shift button3)] [(shift button3up)]))))) + ("xterm" . + (mapcar (function + (lambda (key) (cons key (lookup-key mouse-map key)))) + (list x-button-s-middle x-button-s-middle-up + x-button-s-right x-button-s-right-up))) + ("epoch" . + (mapcar (function + (lambda (key) (cons key (aref mouse::global-map key)))) + (list (mouse::index mouse-middle mouse-shift) + (mouse::index mouse-middle mouse-shift-up) + (mouse::index mouse-right mouse-shift) + (mouse::index mouse-right mouse-shift-up) + ;; Modeline mouse map + (mouse::index mouse-mode-middle mouse-shift) + (mouse::index mouse-mode-middle mouse-shift-up) + (mouse::index mouse-mode-right mouse-shift) + (mouse::index mouse-mode-right mouse-shift-up) + ))) + ("next" . + (mapcar (function + (lambda (key) + (cons key (mousemap-get + (mouse-list-to-mouse-code key) + current-global-mousemap)))) + (apply 'nconc + (mapcar (function + (lambda (region) + (mapcar (function + (lambda (key) + (cons region key))) + '((shift left) (shift up left) + (shift right) + (shift up right) + )))) + '(text scrollbar modeline minibuffer))) + )) + ;; SunView + ("sun" . + (mapcar (function + (lambda (key) + (setq key (mouse-list-to-mouse-code key)) + (cons key (mousemap-get + key current-global-mousemap)))) + (apply 'nconc + (mapcar (function + (lambda (region) + (mapcar (function + (lambda (key) + (cons region key))) + '((shift middle) + (shift up middle) + (shift right) + (shift up right) + )))) + '(text scrollbar modeline minibuffer))) + )) + ("apollo" . + (mapcar (function + (lambda (key-str) (apollo-mouse-key-and-binding + key-str))) + '("M2S" "M2U" "M3S" "M3U"))) + )))))) (defun hmouse-setup () "Binds mouse keys for use as Smart Keys." (interactive) - (or hmouse-bindings-flag hmouse-previous-bindings - (setq hmouse-previous-bindings (hmouse-get-bindings))) - ;; Ensure Gillespie's Info mouse support is off since - ;; Hyperbole handles that. - (setq Info-mouse-support nil) - ;; - (cond ;; GNU Emacs 19 - ((if (not noninteractive) hyperb:emacs19-p) - (setq hmouse-set-point-command 'mouse-set-point) - (if (memq window-system '(ns dps)) - ;; NEXTSTEP offers only 2 shift-mouse buttons which we use - ;; as the Smart Keys. - (progn - (global-set-key [S-down-mouse-1] 'action-key-depress-emacs19) - (global-set-key [S-mouse-1] 'action-mouse-key-emacs19) - (global-set-key [S-double-mouse-1] 'action-mouse-key-emacs19) - (global-set-key [S-triple-mouse-1] 'action-mouse-key-emacs19) - (global-set-key [S-down-mouse-2] 'assist-key-depress-emacs19) - (global-set-key [S-mouse-2] 'assist-mouse-key-emacs19) - (global-set-key [S-double-mouse-2] 'assist-mouse-key-emacs19) - (global-set-key [S-triple-mouse-2] 'assist-mouse-key-emacs19) - (global-set-key [vertical-line S-down-mouse-1] 'action-key-depress-emacs19) - (global-set-key [vertical-line S-mouse-1] 'action-mouse-key-emacs19) - (global-set-key [vertical-line S-down-mouse-2] - 'assist-key-depress-emacs19) - (global-set-key [vertical-line S-mouse-2] - 'assist-mouse-key-emacs19) - (global-set-key [mode-line S-down-mouse-1] 'action-key-depress-emacs19) - (global-set-key [mode-line S-mouse-1] 'action-mouse-key-emacs19) - (global-set-key [mode-line S-down-mouse-2] 'assist-key-depress-emacs19) - (global-set-key [mode-line S-mouse-2] 'assist-mouse-key-emacs19)) - ;; X - (global-set-key [S-down-mouse-2] 'action-key-depress-emacs19) - (global-set-key [S-mouse-2] 'action-mouse-key-emacs19) - (global-set-key [S-double-mouse-2] 'action-mouse-key-emacs19) - (global-set-key [S-triple-mouse-2] 'action-mouse-key-emacs19) - (global-set-key [S-down-mouse-3] 'assist-key-depress-emacs19) - (global-set-key [S-mouse-3] 'assist-mouse-key-emacs19) - (global-set-key [S-double-mouse-3] 'assist-mouse-key-emacs19) - (global-set-key [S-triple-mouse-3] 'assist-mouse-key-emacs19) - (global-set-key [vertical-line S-down-mouse-2] 'action-key-depress-emacs19) - (global-set-key [vertical-line S-mouse-2] 'action-mouse-key-emacs19) - (global-set-key [vertical-line S-down-mouse-3] - 'assist-key-depress-emacs19) - (global-set-key [vertical-line S-mouse-3] - 'assist-mouse-key-emacs19) - (global-set-key [mode-line S-down-mouse-2] 'action-key-depress-emacs19) - (global-set-key [mode-line S-mouse-2] 'action-mouse-key-emacs19) - (global-set-key [mode-line S-down-mouse-3] 'assist-key-depress-emacs19) - (global-set-key [mode-line S-mouse-3] 'assist-mouse-key-emacs19))) - ;; - ;; XEmacs - ((if (not noninteractive) hyperb:xemacs-p) - ;; Set mouse bindings under XEmacs, even if not under a window - ;; system since it can have frames on ttys and windowed displays at - ;; the same time. - (setq hmouse-set-point-command 'hmouse-move-point-xemacs) - (global-set-key '(shift button2) 'action-key-depress) - (global-set-key '(shift button2up) 'action-mouse-key) - (if (fboundp 'infodock-set-mouse-bindings) - (infodock-set-mouse-bindings) - (if (boundp 'mode-line-map) - (progn (define-key mode-line-map '(shift button3) - 'assist-key-depress) - (define-key mode-line-map '(shift button3up) - 'assist-mouse-key) - )) - (global-set-key '(shift button3) 'assist-key-depress) - (global-set-key '(shift button3up) 'assist-mouse-key))) - ;; - ;; X - ((equal hyperb:window-system "xterm") - (setq hmouse-set-point-command 'x-mouse-set-point) - (define-key mouse-map x-button-s-middle 'action-key-depress) - (define-key mouse-map x-button-s-middle-up 'action-mouse-key) - (define-key mouse-map x-button-s-right 'assist-key-depress) - (define-key mouse-map x-button-s-right-up 'assist-mouse-key) - ;; Use these instead of the above for a true META-BUTTON binding. - ;; (define-key mouse-map x-button-m-middle 'assist-key-depress) - ;; (define-key mouse-map x-button-m-middle-up 'assist-mouse-key) - ) - ;; - ;; Epoch - ((equal hyperb:window-system "epoch") - (setq hmouse-set-point-command 'mouse::set-point) - (global-set-mouse mouse-middle mouse-shift 'action-key-depress) - (global-set-mouse mouse-middle mouse-shift-up 'action-mouse-key) - (global-set-mouse mouse-right mouse-shift 'assist-key-depress) - (global-set-mouse mouse-right mouse-shift-up 'assist-mouse-key) - ;; Modeline mouse map - (global-set-mouse mouse-mode-middle mouse-shift 'action-key-depress) - (global-set-mouse mouse-mode-middle mouse-shift-up 'action-mouse-key) - (global-set-mouse mouse-mode-right mouse-shift 'assist-key-depress) - (global-set-mouse mouse-mode-right mouse-shift-up - 'assist-mouse-key) - ) - ;; - ;; NeXT - ((equal hyperb:window-system "next") - (setq hmouse-set-point-command 'hmouse-move-point-eterm) - ;; Use left button to set point. - ;; Use shift-left button instead of non-existent middle as Action Key. - (mapcar - (function - (lambda (region) - (global-set-mouse (cons region '(shift left)) 'action-key-depress) - (global-set-mouse (cons region '(shift up left)) 'action-mouse-key) - (global-set-mouse (cons region '(shift right)) 'assist-key-depress) - (global-set-mouse (cons region '(shift up right)) - 'assist-mouse-key) - ;; Use these instead of the above for a true META-BUTTON binding. - ;; (global-set-mouse (cons region '(meta right)) 'assist-key-depress) - ;; (global-set-mouse (cons region '(meta up right)) 'assist-mouse-key) - )) - '(text scrollbar modeline minibuffer)) - ) - ;; - ;; SunView - ((equal hyperb:window-system "sun") - (setq hmouse-set-point-command 'hmouse-move-point-eterm) - (mapcar - (function - (lambda (region) - (global-set-mouse (cons region '(shift middle)) 'action-key-depress) - (global-set-mouse (cons region '(shift up middle)) - 'action-mouse-key) - (global-set-mouse (cons region '(shift right)) 'assist-key-depress) - (global-set-mouse (cons region '(shift up right)) - 'assist-mouse-key) - ;; Use these instead of the above for a true META-BUTTON binding. - ;; (global-set-mouse (cons region '(meta middle)) 'assist-key-depress) - ;; (global-set-mouse (cons region '(meta up middle)) 'assist-mouse-key) - )) - '(text scrollbar modeline minibuffer)) - ) - ;; - ;; Apollo DM - ((equal hyperb:window-system "apollo") - (setq hmouse-set-point-command 'apollo-mouse-move-point) - (bind-apollo-mouse-button "M2S" 'action-key-depress) - (bind-apollo-mouse-button "M2U" 'action-mouse-key) - (bind-apollo-mouse-button "M3S" 'assist-key-depress) - (bind-apollo-mouse-button "M3U" 'assist-mouse-key) - )) - (setq hmouse-bindings (hmouse-get-bindings) - hmouse-bindings-flag t)) + ;; Do nothing when running in batch mode. + (if noninteractive + nil + (or hmouse-bindings-flag hmouse-previous-bindings + (setq hmouse-previous-bindings (hmouse-get-bindings))) + ;; Ensure Gillespie's Info mouse support is off since + ;; Hyperbole handles that. + (setq Info-mouse-support nil) + ;; + (cond;; GNU Emacs 19 + (hyperb:emacs19-p + (setq hmouse-set-point-command 'mouse-set-point) + (if (memq window-system '(ns dps)) + ;; NEXTSTEP offers only 2 shift-mouse buttons which we use + ;; as the Smart Keys. + (progn + (global-set-key [S-down-mouse-1] 'action-key-depress-emacs19) + (global-set-key [S-mouse-1] 'action-mouse-key-emacs19) + (global-set-key [S-double-mouse-1] 'action-mouse-key-emacs19) + (global-set-key [S-triple-mouse-1] 'action-mouse-key-emacs19) + (global-set-key [S-down-mouse-2] 'assist-key-depress-emacs19) + (global-set-key [S-mouse-2] 'assist-mouse-key-emacs19) + (global-set-key [S-double-mouse-2] 'assist-mouse-key-emacs19) + (global-set-key [S-triple-mouse-2] 'assist-mouse-key-emacs19) + (global-set-key [vertical-line S-down-mouse-1] 'action-key-depress-emacs19) + (global-set-key [vertical-line S-mouse-1] 'action-mouse-key-emacs19) + (global-set-key [vertical-line S-down-mouse-2] + 'assist-key-depress-emacs19) + (global-set-key [vertical-line S-mouse-2] + 'assist-mouse-key-emacs19) + (global-set-key [mode-line S-down-mouse-1] 'action-key-depress-emacs19) + (global-set-key [mode-line S-mouse-1] 'action-mouse-key-emacs19) + (global-set-key [mode-line S-down-mouse-2] 'assist-key-depress-emacs19) + (global-set-key [mode-line S-mouse-2] 'assist-mouse-key-emacs19)) + ;; X + (global-set-key [S-down-mouse-2] 'action-key-depress-emacs19) + (global-set-key [S-mouse-2] 'action-mouse-key-emacs19) + (global-set-key [S-double-mouse-2] 'action-mouse-key-emacs19) + (global-set-key [S-triple-mouse-2] 'action-mouse-key-emacs19) + (global-set-key [S-down-mouse-3] 'assist-key-depress-emacs19) + (global-set-key [S-mouse-3] 'assist-mouse-key-emacs19) + (global-set-key [S-double-mouse-3] 'assist-mouse-key-emacs19) + (global-set-key [S-triple-mouse-3] 'assist-mouse-key-emacs19) + (global-set-key [vertical-line S-down-mouse-2] 'action-key-depress-emacs19) + (global-set-key [vertical-line S-mouse-2] 'action-mouse-key-emacs19) + (global-set-key [vertical-line S-down-mouse-3] + 'assist-key-depress-emacs19) + (global-set-key [vertical-line S-mouse-3] + 'assist-mouse-key-emacs19) + (global-set-key [mode-line S-down-mouse-2] 'action-key-depress-emacs19) + (global-set-key [mode-line S-mouse-2] 'action-mouse-key-emacs19) + (global-set-key [mode-line S-down-mouse-3] 'assist-key-depress-emacs19) + (global-set-key [mode-line S-mouse-3] 'assist-mouse-key-emacs19))) + ;; + ;; XEmacs + (hyperb:xemacs-p + ;; Set mouse bindings under XEmacs, even if not under a window + ;; system since it can have frames on ttys and windowed displays at + ;; the same time. + (setq hmouse-set-point-command 'hmouse-move-point-xemacs) + (global-set-key '(shift button2) 'action-key-depress) + (global-set-key '(shift button2up) 'action-mouse-key) + (if (fboundp 'infodock-set-mouse-bindings) + (infodock-set-mouse-bindings) + (if (boundp 'mode-line-map) + (progn (define-key mode-line-map '(shift button3) + 'assist-key-depress) + (define-key mode-line-map '(shift button3up) + 'assist-mouse-key) + )) + (global-set-key '(shift button3) 'assist-key-depress) + (global-set-key '(shift button3up) 'assist-mouse-key))) + ;; + ;; X + ((equal hyperb:window-system "xterm") + (setq hmouse-set-point-command 'x-mouse-set-point) + (define-key mouse-map x-button-s-middle 'action-key-depress) + (define-key mouse-map x-button-s-middle-up 'action-mouse-key) + (define-key mouse-map x-button-s-right 'assist-key-depress) + (define-key mouse-map x-button-s-right-up 'assist-mouse-key) + ;; Use these instead of the above for a true META-BUTTON binding. + ;; (define-key mouse-map x-button-m-middle 'assist-key-depress) + ;; (define-key mouse-map x-button-m-middle-up 'assist-mouse-key) + ) + ;; + ;; Epoch + ((equal hyperb:window-system "epoch") + (setq hmouse-set-point-command 'mouse::set-point) + (global-set-mouse mouse-middle mouse-shift 'action-key-depress) + (global-set-mouse mouse-middle mouse-shift-up 'action-mouse-key) + (global-set-mouse mouse-right mouse-shift 'assist-key-depress) + (global-set-mouse mouse-right mouse-shift-up 'assist-mouse-key) + ;; Modeline mouse map + (global-set-mouse mouse-mode-middle mouse-shift 'action-key-depress) + (global-set-mouse mouse-mode-middle mouse-shift-up 'action-mouse-key) + (global-set-mouse mouse-mode-right mouse-shift 'assist-key-depress) + (global-set-mouse mouse-mode-right mouse-shift-up + 'assist-mouse-key) + ) + ;; + ;; NeXT + ((equal hyperb:window-system "next") + (setq hmouse-set-point-command 'hmouse-move-point-eterm) + ;; Use left button to set point. + ;; Use shift-left button instead of non-existent middle as Action Key. + (mapcar + (function + (lambda (region) + (global-set-mouse (cons region '(shift left)) 'action-key-depress) + (global-set-mouse (cons region '(shift up left)) 'action-mouse-key) + (global-set-mouse (cons region '(shift right)) 'assist-key-depress) + (global-set-mouse (cons region '(shift up right)) + 'assist-mouse-key) + ;; Use these instead of the above for a true META-BUTTON binding. + ;; (global-set-mouse (cons region '(meta right)) 'assist-key-depress) + ;; (global-set-mouse (cons region '(meta up right)) 'assist-mouse-key) + )) + '(text scrollbar modeline minibuffer)) + ) + ;; + ;; SunView + ((equal hyperb:window-system "sun") + (setq hmouse-set-point-command 'hmouse-move-point-eterm) + (mapcar + (function + (lambda (region) + (global-set-mouse (cons region '(shift middle)) 'action-key-depress) + (global-set-mouse (cons region '(shift up middle)) + 'action-mouse-key) + (global-set-mouse (cons region '(shift right)) 'assist-key-depress) + (global-set-mouse (cons region '(shift up right)) + 'assist-mouse-key) + ;; Use these instead of the above for a true META-BUTTON binding. + ;; (global-set-mouse (cons region '(meta middle)) 'assist-key-depress) + ;; (global-set-mouse (cons region '(meta up middle)) 'assist-mouse-key) + )) + '(text scrollbar modeline minibuffer)) + ) + ;; + ;; Apollo DM + ((equal hyperb:window-system "apollo") + (setq hmouse-set-point-command 'apollo-mouse-move-point) + (bind-apollo-mouse-button "M2S" 'action-key-depress) + (bind-apollo-mouse-button "M2U" 'action-mouse-key) + (bind-apollo-mouse-button "M3S" 'assist-key-depress) + (bind-apollo-mouse-button "M3U" 'assist-mouse-key) + )) + (setq hmouse-bindings (hmouse-get-bindings) + hmouse-bindings-flag t)))
--- a/lisp/hyperbole/hmouse-tag.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hmouse-tag.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,32 +6,17 @@ ;; KEYWORDS: c, hypermedia, mouse, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 24-Aug-91 -;; LAST-MOD: 11-Sep-95 at 18:19:48 by Bob Weiner -;; -;; This file is part of Hyperbole. -;; Available for use and distribution under the same terms as GNU Emacs. -;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. -;; Developed with support from Motorola Inc. -;; -;; DESCRIPTION: -;; -;; Supports C, C++, Objective-C, Lisp, Fortran, and Assembly. -;; See the GNU Emacs manual for information on how to create a TAGS file -;; from the `etags' program. -;; Does not support the `ctags' tags file format. -;; -;; YOU MUST APPROPRIATELY SET THE PUBLIC VARIABLES BELOW BEFORE USE. -;; -;; DESCRIP-END. - +;; LAST-MOD: 17-Feb-97 at 15:31:50 by Bob Weiner ;;; ************************************************************************ ;;; Other required Elisp libraries ;;; ************************************************************************ +(require 'hpath) +(require 'hbut) + (if (cond ((or (featurep 'etags) (featurep 'tags)) nil) ((or hyperb:lemacs-p hyperb:emacs19-p) @@ -71,11 +56,11 @@ "*Ordered list of directories to search for C/C++ include files. Each directory must end with a directory separator. Directories normally searched by the C/C++ pre-processor should be set instead in -'smart-c-cpp-include-dirs'.") +`smart-c-cpp-include-dirs'.") (defvar smart-c-use-lib-man nil - "When non-nil makes 'smart-c' and 'smart-c++' display man pages for recognized lib symbols. -When nil, 'smart-c' and 'smart-c++' look up only symbols defined in an etags + "When non-nil makes `smart-c' and `smart-c++' display man pages for recognized lib symbols. +When nil, `smart-c' and `smart-c++' look up only symbols defined in an etags TAGS file. Create the file ~/.CLIBS-LIST and populate it with the full pathnames (one per @@ -91,9 +76,20 @@ "[ \t/*]*#[ \t]*\\(include\\|import\\)[ \t]+\\([\"<]\\)\\([^\">]+\\)[\">]" "Regexp to match to C, C++, or Objective-C include file lines. Include keyword matched is grouping 1. Type of include, user-specified via -double quote, or system-related starting with '<' is given by grouping 2. +double quote, or system-related starting with `<' is given by grouping 2. File name is grouping 3.") +(defvar smart-java-package-dirs + (and (fboundp 'getenv) (getenv "JAVA_HOME") + (list (expand-file-name "src/" (file-name-as-directory (getenv "JAVA_HOME"))))) + "*Ordered list of directories to search for imported Java packages. +Each directory must end with a directory separator.") + +(defconst smart-java-package-regexp + "[ \t/*]*\\(package\\|import\\)[ \t]+\\([^; \t\n\r\f]+\\)" + "Regexp to match to Java `package' and `import' lines. +Keyword matched is grouping 1. Referent is grouping 2.") + (defvar smart-emacs-tags-file nil "*Full path name of etags file for GNU Emacs source.") @@ -110,26 +106,24 @@ If: (1) on an include statement, the include file is displayed; - Look for include file in directory list 'smart-asm-include-dirs'. + Look for include file in directory list `smart-asm-include-dirs'. (2) on an identifier, the identifier definition is displayed, - assuming the identifier is found within an 'etags' generated tag file + assuming the identifier is found within an `etags' generated tag file in the current directory or any of its ancestor directories." (interactive) (or (if identifier nil (smart-asm-include-file)) (let ((tag (or identifier (smart-asm-at-tag-p)))) - ;; Set free variable tags-file-name so that next 'find-tag' command uses + ;; Set free variable tags-file-name so that next `find-tag' command uses ;; whatever tags file is set here. (setq tags-file-name (smart-tags-file buffer-file-name)) - (message "Looking for '%s' in '%s'..." tag tags-file-name) + (message "Looking for `%s' in `%s'..." tag tags-file-name) (condition-case () (progn - (funcall (if (br-in-browser) - 'find-tag 'find-tag-other-window) - tag next) - (message "Found definition for '%s'." tag)) - (error (message "'%s' not found in '%s'." tag tags-file-name) + (smart-tags-display tag next) + (message "Found definition for `%s'." tag)) + (error (message "`%s' not found in `%s'." tag tags-file-name) (beep)))))) ;;;###autoload @@ -140,12 +134,422 @@ (save-excursion (skip-chars-backward identifier-chars) (if (looking-at identifier) - (buffer-substring (point) (match-end 0)))))) + (smart-flash-tag + (buffer-substring (point) (match-end 0)) + (point) (match-end 0)))))) + +(defun smart-c (&optional identifier next) + "Jumps to the definition of optional C IDENTIFIER or the one at point. +Optional second arg NEXT means jump to next matching C tag. + +It assumes that its caller has already checked that the key was pressed in an +appropriate buffer and has moved the cursor to the selected buffer. + +If: + (1) on a `#include' statement, the include file is displayed; + Look for include file in directory lists `smart-c-cpp-include-dirs' + and `smart-c-include-dirs'. + (2) on a C identifier, the identifier definition is displayed, + assuming the identifier is found within an `etags' generated tag file + in the current directory or any of its ancestor directories. + (3) if `smart-c-use-lib-man' is non-nil, the C identifier is + recognized as a library symbol, and a man page is found for the + identifier, then the man page is displayed." + + (interactive) + (or + (if identifier nil (smart-c-include-file)) + (let ((tag (or identifier (smart-c-at-tag-p)))) + ;; Set free variable tags-file-name so that next `find-tag' command uses + ;; whatever tags file is set here. + (setq tags-file-name (smart-tags-file buffer-file-name)) + (message "Looking for `%s' in `%s'..." tag tags-file-name) + (condition-case () + (progn + (smart-tags-display tag next) + (message "Found definition for `%s'." tag)) + (error + (if (not smart-c-use-lib-man) + (progn (message "`%s' not found in `%s'." tag tags-file-name) + (beep)) + (message "Checking if `%s' is a C library function..." tag) + (if (smart-library-symbol tag) + (progn (message "Displaying C library man page for `%s'." tag) + (manual-entry tag)) + (message "`%s' not found in `%s' or C libraries." + tag tags-file-name) + (beep)))))))) + +;;;###autoload +(defun smart-c-at-tag-p () + "Return C tag name that point is within, else nil." + (let* ((identifier-chars "_a-zA-Z0-9") + (identifier (concat "[_a-zA-Z][" identifier-chars "]*"))) + (save-excursion + (skip-chars-backward identifier-chars) + (if (looking-at identifier) + (smart-flash-tag + (buffer-substring (point) (match-end 0)) + (point) (match-end 0)))))) + +;;;###autoload +(defun smart-c++ (&optional identifier next) + "Jumps to the definition of optional C++ IDENTIFIER or the one at point. +Optional second arg NEXT means jump to next matching C++ tag. + +It assumes that its caller has already checked that the key was pressed in an +appropriate buffer and has moved the cursor to the selected buffer. + +If: + (1) on a `#include' statement, the include file is displayed; + Look for include file in directory lists `smart-c-cpp-include-dirs' + and `smart-c-include-dirs'. + (2) on a C++ identifier, the identifier definition is displayed, + assuming the identifier is found within an `etags' generated tag file + in the current directory or any of its ancestor directories. + (3) if `smart-c-use-lib-man' is non-nil, the C++ identifier is + recognized as a library symbol, and a man page is found for the + identifier, then the man page is displayed." + + (interactive) + (if (fboundp 'c++-to-definition) + ;; Only fboundp if OO-Browser has been loaded. + (smart-c++-oo-browser) + (or + (if identifier nil (smart-c-include-file)) + (let ((tag (or identifier (smart-c++-at-tag-p)))) + ;; Set free variable tags-file-name so that next `find-tag' command uses + ;; whatever tags file is set here. + (setq tags-file-name (smart-tags-file buffer-file-name)) + (message "Looking for `%s' in `%s'..." tag tags-file-name) + (condition-case () + (progn + (smart-tags-display tag next) + (message "Found definition for `%s'." tag)) + (error + (if (not smart-c-use-lib-man) + (progn (message "`%s' not found in `%s'." tag tags-file-name) + (beep)) + (message "Checking if `%s' is a C++ library function..." tag) + (if (smart-library-symbol tag) + (progn (message "Displaying C++ library man page for `%s'." tag) + (manual-entry tag)) + (message "`%s' not found in `%s' or C++ libraries." + tag tags-file-name) + (beep))))))))) + +;;; The following should be called only if the OO-Browser is available. +(defun smart-c++-oo-browser (&optional junk) + "Jumps to the definition of selected C++ construct via OO-Browser support. +Optional JUNK is ignored. Does nothing if the OO-Browser is not available. + +It assumes that its caller has already checked that the key was pressed in an +appropriate buffer and has moved the cursor to the selected buffer. + +If key is pressed: + (1) on a `#include' statement, the include file is displayed; + Look for include file in directory lists `smart-c-cpp-include-dirs' + and `smart-c-include-dirs'. + (2) within a method declaration, its definition is displayed; + (3) on a class name, the class definition is shown. + + (2) and (3) require that an OO-Browser Environment has been loaded with + the {M-x br-env-load RET} command." + + (interactive) + (c++-to-definition t)) + +(defun smart-c++-at-tag-p () + "Return C++ tag name that point is within, else nil." + (let* ((identifier-chars "_:~<>a-zA-Z0-9") + (identifier (concat "\\([_~:<a-zA-Z][" identifier-chars "]*" + "[ \t]*[^]) \t:;.,?~{}][^[( \t:;.,~^!|?{}]?[=*]?\\)[ \t\n]*("))) + (save-excursion + (skip-chars-backward identifier-chars) + (if (looking-at identifier) + (smart-flash-tag + (buffer-substring (match-beginning 1) (match-end 1)) + (match-beginning 1) (match-end 1)))))) + +(defun smart-emacs-lisp-mode-p () + "Return t if in a mode which uses Emacs Lisp symbols." + (or (memq major-mode '(emacs-lisp-mode lisp-interaction-mode debugger-mode)) + ;; Emacs Lisp symbols appear in Help buffers frequently. + (string-match "Help\\*$" (buffer-name)))) + +(defun smart-fortran (&optional identifier next) + "Jumps to the definition of optional Fortran IDENTIFIER or the one at point. +Optional second arg NEXT means jump to next matching Fortran tag. + +It assumes that its caller has already checked that the key was pressed in an +appropriate buffer and has moved the cursor to the selected buffer. + +If on a Fortran identifier, the identifier definition is displayed, +assuming the identifier is found within an `etags' generated tag file +in the current directory or any of its ancestor directories." + (interactive) + (let ((tag (or identifier (smart-fortran-at-tag-p)))) + ;; Set free variable tags-file-name so that next `find-tag' command uses + ;; whatever tags file is set here. + (setq tags-file-name (smart-tags-file buffer-file-name)) + (message "Looking for `%s' in `%s'..." tag tags-file-name) + (condition-case () + (progn + (smart-tags-display tag next) + (message "Found definition for `%s'." tag)) + (error + (message "`%s' not found in `%s'." tag tags-file-name) + (beep))))) + +;;;###autoload +(defun smart-fortran-at-tag-p () + "Return Fortran tag name that point is within, else nil." + (let* ((identifier-chars "_a-zA-Z0-9") + (identifier (concat "[_a-zA-Z][" identifier-chars "]*"))) + (save-excursion + (skip-chars-backward identifier-chars) + (if (looking-at identifier) + (smart-flash-tag + (buffer-substring (point) (match-end 0)) + (point) (match-end 0)))))) + +;;;###autoload +(defun smart-java (&optional identifier next) + "Jumps to the definition of optional Java IDENTIFIER or the one at point. +Optional second arg NEXT means jump to next matching Java tag. + +It assumes that its caller has already checked that the key was pressed in an +appropriate buffer and has moved the cursor to the selected buffer. + +If: + (1) within a commented @see cross-reference, the referent is displayed; + (2) on a `package' or `import' statement, the referent is displayed; + Look for referent files in the directory list `smart-java-package-dirs'. + (3) on an Java identifier, the identifier definition is displayed, + assuming the identifier is found within an `etags' generated tag file + in the current directory or any of its ancestor directories." + + (interactive) + (if (fboundp 'java-to-definition) + ;; Only fboundp if OO-Browser has been loaded. + (smart-java-oo-browser) + (or + (if identifier nil (or (smart-java-cross-reference) (smart-java-packages))) + (let ((tag (or identifier (smart-java-at-tag-p)))) + ;; Set free variable tags-file-name so that next `find-tag' command uses + ;; whatever tags file is set here. + (setq tags-file-name (smart-tags-file buffer-file-name)) + (message "Looking for `%s' in `%s'..." tag tags-file-name) + (condition-case () + (progn + (smart-tags-display tag next) + (message "Found definition for `%s'." tag)) + (error (progn (message "`%s' not found in `%s'." tag tags-file-name) + (beep)))))))) + +;;; The following should be called only if the OO-Browser is available. +(defun smart-java-oo-browser (&optional junk) + "Jumps to the definition of selected Java construct via OO-Browser support. +Optional JUNK is ignored. Does nothing if the OO-Browser is not available. + +It assumes that its caller has already checked that the key was pressed in an +appropriate buffer and has moved the cursor to the selected buffer. + +If key is pressed: + (1) within a commented @see cross-reference, the referent is displayed; + (2) on a `package' or `import' statement, the referent is displayed; + Look for referent files in the directory list `smart-java-package-dirs'. + (3) within a method declaration, its definition is displayed; + (4) on a class name, the class definition is shown." + + (interactive) + (or (smart-java-cross-reference) + (smart-java-packages) + (java-to-definition t))) + +;;;###autoload +(defun smart-java-at-tag-p () + "Return Java tag name that point is within, else nil." + (let* ((identifier-chars "_$.a-zA-Z0-9") + (identifier + (concat "[_$a-zA-Z][" identifier-chars "]*"))) + (save-excursion + (skip-chars-backward identifier-chars) + (if (looking-at identifier) + (smart-flash-tag + (buffer-substring (point) (match-end 0)) + (point) (match-end 0)))))) + +(defun smart-lisp (&optional next) + "Jumps to the definition of any selected Lisp construct. +If on an Emacs Lisp require, load, or autoload clause and `find-library' +from load-library package by Hallvard Furuseth (hallvard@ifi.uio.no) has +been loaded, jumps to library source, if possible. + +Otherwise, the construct must be found within an `etags' generated tag file +in the current directory or any of its ancestor directories in order for its +definition to be located. + +Optional NEXT means jump to next matching Lisp tag. When matching to an Emacs +Lisp tag using `wtags' (Bob Weiner's personal modifications to `etags'), +there is no next tag, so display documentation for current tag instead. + +This command assumes that its caller has already checked that the key was +pressed in an appropriate buffer and has moved the cursor to the selected +buffer." + + (interactive) + ;; Handle `require', `load', and `autoload' clauses in Emacs Lisp. + (or (and (fboundp 'find-library) + (smart-emacs-lisp-mode-p) + (let ((req) + (opoint (point))) + (setq req (and (search-backward "\(" nil t) + (looking-at (concat + "(\\(require\\|load\\|autoload\\)" + "[ \t]+.*['\"]" + "\\([^][() \t\n\^M`'\"]+\\)")))) + (goto-char opoint) + (if req (progn + (setq req (buffer-substring (match-beginning 2) + (match-end 2))) + (hpath:display-buffer (current-buffer)) + (find-library req) + t)))) + (let ((tag (smart-lisp-at-tag-p))) + ;; Set free variable tags-file-name so that next `find-tag' command + ;; uses whatever tags file is set here. + (setq tags-file-name (smart-tags-file default-directory)) + ;; This part only works properly for Emacs Lisp, so is conditionalized. + (if (and next (smart-emacs-lisp-mode-p) (featurep 'wtags)) + (progn (setq tag (intern tag)) + (cond ((fboundp tag) (describe-function tag)) + ((boundp tag) (describe-variable tag)) + (t (error "(smart-lisp): Unbound symbol: %s" tag)))) + (condition-case () + (smart-tags-display tag next) + (error (if (equal tags-file-name smart-emacs-tags-file) + (progn (message "`%s' not found in `%s'." + tag tags-file-name) + (beep)) + (setq tags-file-name smart-emacs-tags-file) + (smart-tags-display tag next)))))))) + +(defun smart-lisp-at-tag-p () + "Returns Lisp tag name that point is within, else nil. +Returns nil when point is within a Lisp `def' keyword." + (let* ((identifier-chars "-_*:+%$#!<>a-zA-Z0-9") + (identifier (concat "[-<*a-zA-Z][" identifier-chars "]*")) + (opoint (point))) + (save-excursion + (beginning-of-line) + (if (and (looking-at "\\(;*[ \t]*\\)?(def[^- \n\t]+") + (< opoint (match-end 0))) + nil + (goto-char opoint) + (skip-chars-backward identifier-chars) + (if (looking-at identifier) + (smart-flash-tag + (buffer-substring (point) (match-end 0)) + (point) (match-end 0))))))) + +;;;###autoload +(defun smart-lisp-mode-p () + "Return t if in a mode which uses Lisp symbols." + (or (smart-emacs-lisp-mode-p) + (memq major-mode '(lisp-mode scheme-mode)))) + +;;;###autoload +(defun smart-objc (&optional identifier next) + "Jumps to the definition of optional Objective-C IDENTIFIER or the one at point. +Optional second arg NEXT means jump to next matching Objective-C tag. + +It assumes that its caller has already checked that the key was pressed in an +appropriate buffer and has moved the cursor to the selected buffer. + +If: + (1) on a `#include' statement, the include file is displayed; + Look for include file in directory lists `smart-c-cpp-include-dirs' + and `smart-c-include-dirs'. + (2) on an Objective-C identifier, the identifier definition is displayed, + assuming the identifier is found within an `etags' generated tag file + in the current directory or any of its ancestor directories. + (3) if `smart-c-use-lib-man' is non-nil, the Objective-C identifier is + recognized as a library symbol, and a man page is found for the + identifier, then the man page is displayed." + + (interactive) + + (if (fboundp 'objc-to-definition) + ;; Only fboundp if OO-Browser has been loaded. + (smart-objc-oo-browser) + (or + (if identifier nil (smart-c-include-file)) + (let ((tag (or identifier (smart-objc-at-tag-p)))) + ;; Set free variable tags-file-name so that next `find-tag' command uses + ;; whatever tags file is set here. + (setq tags-file-name (smart-tags-file buffer-file-name)) + (message "Looking for `%s' in `%s'..." tag tags-file-name) + (condition-case () + (progn + (smart-tags-display tag next) + (message "Found definition for `%s'." tag)) + (error + (if (not smart-c-use-lib-man) + (progn (message "`%s' not found in `%s'." tag tags-file-name) + (beep)) + (message + "Checking if `%s' is an Objective-C library function..." tag) + (if (smart-library-symbol tag) + (progn + (message + "Displaying Objective-C library man page for `%s'." tag) + (manual-entry tag)) + (message "`%s' not found in `%s' or Objective-C libraries." + tag tags-file-name) + (beep))))))))) + +;;; The following should be called only if the OO-Browser is available. +(defun smart-objc-oo-browser (&optional junk) + "Jumps to the definition of selected Objective-C construct via OO-Browser support. +Optional JUNK is ignored. Does nothing if the OO-Browser is not available. + +It assumes that its caller has already checked that the key was pressed in an +appropriate buffer and has moved the cursor to the selected buffer. + +If key is pressed: + (1) on a `#include' statement, the include file is displayed; + Look for include file in directory lists `smart-c-cpp-include-dirs' + and `smart-c-include-dirs'. + (2) within a method declaration, its definition is displayed; + (3) on a class name, the class definition is shown. + + (2) and (3) require that an OO-Browser Environment has been loaded with + the {M-x br-env-load RET} command." + + (interactive) + (objc-to-definition t)) + +(defun smart-objc-at-tag-p () + "Return Objective-C tag name that point is within, else nil." + (let* ((identifier-chars "_a-zA-Z0-9") + (identifier + (concat "\\([-+][ \t]*\\)?\\([_a-zA-Z][" identifier-chars "]*\\)"))) + (save-excursion + (skip-chars-backward identifier-chars) + (if (looking-at identifier) + (smart-flash-tag + (buffer-substring (match-beginning 2) (match-end 2)) + (match-beginning 2) (match-end 2)))))) + +;;; ************************************************************************ +;;; Private functions +;;; ************************************************************************ (defun smart-asm-include-file () "If point is on an include file line, tries to display file. Returns non-nil iff on an include file line, even if file is not found. -Look for include file in 'smart-asm-include-dirs' and add suffix \".ins\" or +Look for include file in `smart-asm-include-dirs' and add suffix \".ins\" or \".inc\" to filename if it lacks a suffix." (let ((opoint (point))) ;; Some assemblers utilize the C preprocessor, so try that first. @@ -164,7 +568,7 @@ (while dir-list (setq dir-list (if (setq path (car (directory-files - (car dir-list) t file))) + (car dir-list) t file))) nil (cdr dir-list)))) ;; @@ -173,88 +577,32 @@ (if path (if (and (file-readable-p path) (progn - (if (br-in-browser) - (find-file path) - (find-file-other-window path)) + (hpath:find path) (cond ((featurep 'asm-mode) t) ((load "asm-mode" nil 'nomessage) (provide 'asm-mode)) (t - (beep) - (message - "(smart-asm-include-file): asm-mode undefined.") - nil - )))) + (beep) + (message + "(smart-asm-include-file): asm-mode undefined.") + nil + )))) nil (beep) - (message "(smart-asm-include-file): '%s' unreadable." path)) + (message "(smart-asm-include-file): `%s' unreadable." path)) (beep) - (message "(smart-asm-include-file): '%s' not found." file)) + (message "(smart-asm-include-file): `%s' not found." file)) path)) ;; not on an include file line (t (goto-char opoint) nil)))) -(defun smart-c (&optional identifier next) - "Jumps to the definition of optional C IDENTIFIER or the one at point. -Optional second arg NEXT means jump to next matching C tag. - -It assumes that its caller has already checked that the key was pressed in an -appropriate buffer and has moved the cursor to the selected buffer. - -If: - (1) on a '#include' statement, the include file is displayed; - Look for include file in directory lists 'smart-c-cpp-include-dirs' - and 'smart-c-include-dirs'. - (2) on a C identifier, the identifier definition is displayed, - assuming the identifier is found within an 'etags' generated tag file - in the current directory or any of its ancestor directories. - (3) if 'smart-c-use-lib-man' is non-nil, the C identifier is - recognized as a library symbol, and a man page is found for the - identifier, then the man page is displayed." - - (interactive) - (or - (if identifier nil (smart-c-include-file)) - (let ((tag (or identifier (smart-c-at-tag-p)))) - ;; Set free variable tags-file-name so that next 'find-tag' command uses - ;; whatever tags file is set here. - (setq tags-file-name (smart-tags-file buffer-file-name)) - (message "Looking for '%s' in '%s'..." tag tags-file-name) - (condition-case () - (progn - (funcall (if (br-in-browser) - 'find-tag 'find-tag-other-window) - tag next) - (message "Found definition for '%s'." tag)) - (error - (if (not smart-c-use-lib-man) - (progn (message "'%s' not found in '%s'." tag tags-file-name) - (beep)) - (message "Checking if '%s' is a C library function..." tag) - (if (smart-library-symbol tag) - (progn (message "Displaying C library man page for '%s'." tag) - (manual-entry tag)) - (message "'%s' not found in '%s' or C libraries." - tag tags-file-name) - (beep)))))))) - -;;;###autoload -(defun smart-c-at-tag-p () - "Return C tag name that point is within, else nil." - (let* ((identifier-chars "_a-zA-Z0-9") - (identifier (concat "[_a-zA-Z][" identifier-chars "]*"))) - (save-excursion - (skip-chars-backward identifier-chars) - (if (looking-at identifier) - (buffer-substring (point) (match-end 0)))))) - (defun smart-c-include-file () "If point is on an include file line, tries to display file. Returns non-nil iff on an include file line, even if file is not found. -Look for include file in 'smart-c-cpp-include-dirs' and in directory list -'smart-c-include-dirs'." +Look for include file in `smart-c-cpp-include-dirs' and in directory list +`smart-c-include-dirs'." (let ((opoint (point))) (beginning-of-line) (if (looking-at smart-c-include-regexp) @@ -281,9 +629,7 @@ (if found (if (and (file-readable-p path) (progn - (if (br-in-browser) - (find-file path) - (find-file-other-window path)) + (hpath:find path) (cond ((or (featurep 'cc-mode) (featurep 'c-mode)) t) @@ -298,298 +644,198 @@ )))) nil (beep) - (message "(smart-c-include-file): '%s' unreadable." path)) + (message "(smart-c-include-file): `%s' unreadable." path)) (beep) - (message "(smart-c-include-file): '%s' not found." file)) + (message "(smart-c-include-file): `%s' not found." file)) path) (goto-char opoint) nil))) - -;;;###autoload -(defun smart-c++ (&optional identifier next) - "Jumps to the definition of optional C++ IDENTIFIER or the one at point. -Optional second arg NEXT means jump to next matching C++ tag. - -It assumes that its caller has already checked that the key was pressed in an -appropriate buffer and has moved the cursor to the selected buffer. - -If: - (1) on a '#include' statement, the include file is displayed; - Look for include file in directory lists 'smart-c-cpp-include-dirs' - and 'smart-c-include-dirs'. - (2) on a C++ identifier, the identifier definition is displayed, - assuming the identifier is found within an 'etags' generated tag file - in the current directory or any of its ancestor directories. - (3) if 'smart-c-use-lib-man' is non-nil, the C++ identifier is - recognized as a library symbol, and a man page is found for the - identifier, then the man page is displayed." - - (interactive) - (or - (if identifier nil (smart-c-include-file)) - (let ((tag (or identifier (smart-c++-at-tag-p)))) - ;; Set free variable tags-file-name so that next 'find-tag' command uses - ;; whatever tags file is set here. - (setq tags-file-name (smart-tags-file buffer-file-name)) - (message "Looking for '%s' in '%s'..." tag tags-file-name) - (condition-case () - (progn - (funcall (if (br-in-browser) - 'find-tag 'find-tag-other-window) - tag next) - (message "Found definition for '%s'." tag)) - (error - (if (not smart-c-use-lib-man) - (progn (message "'%s' not found in '%s'." tag tags-file-name) - (beep)) - (message "Checking if '%s' is a C++ library function..." tag) - (if (smart-library-symbol tag) - (progn (message "Displaying C++ library man page for '%s'." tag) - (manual-entry tag)) - (message "'%s' not found in '%s' or C++ libraries." - tag tags-file-name) - (beep)))))))) - -;;; The following should be called only if the OO-Browser is available. -;;;###autoload -(defun smart-c++-oobr (&optional junk) - "Jumps to the definition of selected C++ construct via OO-Browser support. -Optional JUNK is ignored. Does nothing if the OO-Browser is not available. - -It assumes that its caller has already checked that the key was pressed in an -appropriate buffer and has moved the cursor to the selected buffer. - -If key is pressed: - (1) on a '#include' statement, the include file is displayed; - Look for include file in directory lists 'smart-c-cpp-include-dirs' - and 'smart-c-include-dirs'. - (2) within a method declaration, its definition is displayed; - (3) on a class name, the class definition is shown. - - (2) and (3) require that an OO-Browser Environment has been loaded with - the {M-x br-env-load RTN} command." - - (interactive) - (c++-to-definition 'other-win)) +(defun smart-flash-tag (tag start end) + "Tries to flash TAG at START to END in buffer, to indicate that it is serving as a hyperlink button. +Returns TAG." + ;; Button flashing code might not yet have been loaded if the whole + ;; Hyperbole system has not been started. + (if (fboundp 'hui:but-flash) + (progn + (ibut:label-set tag start end) + (hui:but-flash))) + tag) -(defun smart-c++-at-tag-p () - "Return C++ tag name that point is within, else nil." - (let* ((identifier-chars "_:~<>a-zA-Z0-9") - (identifier (concat "\\([_~:<a-zA-Z][" identifier-chars "]*" - "[ \t]*[^]) \t:;.,?~{}][^[( \t:;.,~^!|?{}]?[=*]?\\)[ \t\n]*("))) - (save-excursion - (skip-chars-backward identifier-chars) - (if (looking-at identifier) - (buffer-substring (point) (match-end 1)))))) - -(defun smart-emacs-lisp-mode-p () - "Return t if in a mode which uses Emacs Lisp symbols." - (or (eq major-mode 'emacs-lisp-mode) - (eq major-mode 'lisp-interaction-mode) - (eq major-mode 'debugger-mode) - ;; Emacs Lisp symbols appear in Help buffers frequently. - (string-match "Help\\*$" (buffer-name)))) - -(defun smart-fortran (&optional identifier next) - "Jumps to the definition of optional Fortran IDENTIFIER or the one at point. -Optional second arg NEXT means jump to next matching Fortran tag. - -It assumes that its caller has already checked that the key was pressed in an -appropriate buffer and has moved the cursor to the selected buffer. - -If on a Fortran identifier, the identifier definition is displayed, -assuming the identifier is found within an 'etags' generated tag file -in the current directory or any of its ancestor directories." - (interactive) - (let ((tag (or identifier (smart-fortran-at-tag-p)))) - ;; Set free variable tags-file-name so that next 'find-tag' command uses - ;; whatever tags file is set here. - (setq tags-file-name (smart-tags-file buffer-file-name)) - (message "Looking for '%s' in '%s'..." tag tags-file-name) - (condition-case () - (progn - (funcall (if (br-in-browser) - 'find-tag 'find-tag-other-window) - tag next) - (message "Found definition for '%s'." tag)) - (error - (message "'%s' not found in '%s'." tag tags-file-name) - (beep))))) - -;;;###autoload -(defun smart-fortran-at-tag-p () - "Return Fortran tag name that point is within, else nil." - (let* ((identifier-chars "_a-zA-Z0-9") - (identifier (concat "[_a-zA-Z][" identifier-chars "]*"))) - (save-excursion - (skip-chars-backward identifier-chars) - (if (looking-at identifier) - (buffer-substring (point) (match-end 0)))))) - -(defun smart-lisp (&optional next) - "Jumps to the definition of any selected Lisp construct. -If on an Emacs Lisp require, load, or autoload clause and 'find-library' -from load-library package by Hallvard Furuseth (hallvard@ifi.uio.no) has -been loaded, jumps to library source, if possible. - -Otherwise, the construct must be found within an 'etags' generated tag file -in the current directory or any of its ancestor directories in order for its -definition to be located. - -Optional NEXT means jump to next matching Lisp tag. When matching to an Emacs -Lisp tag using 'wtags' (Bob Weiner's personal modifications to 'etags'), -there is no next tag, so display documentation for current tag instead. - -This command assumes that its caller has already checked that the key was -pressed in an appropriate buffer and has moved the cursor to the selected -buffer." +(defun smart-java-cross-reference () + "If within a Java @see comment, displays the associated definition for editing and returns non-nil, else nil. +Non-nil is returned even if the @see referent cannot be found. - (interactive) - ;; Handle 'require', 'load', and 'autoload' clauses in Emacs Lisp. - (or (and (fboundp 'find-library) - (smart-emacs-lisp-mode-p) - (let ((req) - (opoint (point))) - (setq req (and (search-backward "\(" nil t) - (looking-at (concat - "(\\(require\\|load\\|autoload\\)" - "[ \t]+.*['\"]" - "\\([^][() \t\n\^M`'\"]+\\)")))) - (goto-char opoint) - (if req (progn - (setq req (buffer-substring (match-beginning 2) - (match-end 2))) - (pop-to-buffer nil t) - (find-library req) - t)))) - (let ((tag (smart-lisp-at-tag-p))) - ;; Set free variable tags-file-name so that next 'find-tag' command - ;; uses whatever tags file is set here. - (setq tags-file-name (smart-tags-file default-directory)) - ;; This part only works properly for Emacs Lisp, so is conditionalized. - (if (and next (smart-emacs-lisp-mode-p) (featurep 'wtags)) - (progn (setq tag (intern tag)) - (cond ((fboundp tag) (describe-function tag)) - ((boundp tag) (describe-variable tag)) - (t (error "(smart-lisp): Unbound symbol: %s" tag)))) - (condition-case () - (funcall (if (br-in-browser) - 'find-tag 'find-tag-other-window) - tag next) - (error (if (equal tags-file-name smart-emacs-tags-file) - nil - (setq tags-file-name smart-emacs-tags-file) - (funcall (if (br-in-browser) - 'find-tag 'find-tag-other-window) - tag next)))))))) - -(defun smart-lisp-at-tag-p () - "Returns Lisp tag name that point is within, else nil. -Returns nil when point is on the first line of a 'def' form past the first 4 -characters." - (let* ((identifier-chars "-_*:+%$#!<>a-zA-Z0-9") - (identifier (concat "[-<*a-zA-Z][" identifier-chars "]*")) - (opoint (point))) - (save-excursion - (beginning-of-line) - (if (and (looking-at "\\(;*[ \t]*\\)?(def[^- \n\t]+[ \n\t]") - (> opoint (match-end 0))) - nil - (goto-char opoint) - (skip-chars-backward identifier-chars) - (if (looking-at identifier) - (buffer-substring (point) (match-end 0))))))) - -(defun smart-lisp-mode-p () - "Return t if in a mode which uses Lisp symbols." - (or (smart-emacs-lisp-mode-p) - (eq major-mode 'lisp-mode) - (eq major-mode 'scheme-mode))) - -;;;###autoload -(defun smart-objc (&optional identifier next) - "Jumps to the definition of optional Objective-C IDENTIFIER or the one at point. -Optional second arg NEXT means jump to next matching Objective-C tag. - -It assumes that its caller has already checked that the key was pressed in an -appropriate buffer and has moved the cursor to the selected buffer. +Does nothing if the `oo-browser' command is undefined, since it requires that +package for class and feature lookups." + ;; + ;; Valid forms of @see cross-references are: + ;; * @see #getComponent - current class attribute + ;; * @see #waitForAll() - current class method, no arguments + ;; * @see #checkID(int, boolean) - current class method, with arguments + ;; * @see java.awt.ColorModel#getRGBdefault - library class method + ;; * @see Component#paintAll - class method + ;; * @see java.awt.GridBagLayout - library class + ;; * @see Container - class + ;; + ;; For simplicity sake, this code ignores the library path given with any + ;; class in favor of the OO-Browser's lookup tables. It also ignores any + ;; parameters associated with a method, and thus cannot distinguish between + ;; methods with the same name within a single class, which we believe to be + ;; fairly bad form anyway. + ;; + (let ((opoint (point))) + (if (and (eq major-mode 'java-mode) buffer-file-name + (fboundp 'br-env-load) + (or (looking-at "@see[ \t]+") + (and (re-search-backward "[@\n\r\f]" nil t) + (looking-at "@see[ \t]+")))) + (let ((class) (feature)) + ;; Ignore any library path preceding a classname (grouping 1) + (cond + ((looking-at + "@see[ \t]+\\(#\\)?\\([^][(){} \t\n\r\f#]+[.]\\)?\\([^][(){} \t\n\r\f#.]+\\)[][(){} \t\n\r\f]") + (if (match-beginning 1) + (setq class nil + feature (buffer-substring (match-beginning 3) + (match-end 3))) + (setq class (buffer-substring (match-beginning 3) (match-end 3)) + feature nil))) + ((looking-at + "@see[ \t]+\\([^][(){} \t\n\r\f#]+[.]\\)?\\([^][(){} \t\n\r\f#.]+\\)#\\([^][(){} \t\n\r\f#.]+\\)") + (setq class (buffer-substring (match-beginning 2) + (match-end 2)) + feature (buffer-substring (match-beginning 3) + (match-end 3))))) + ;; Return to original point. + (goto-char opoint) + ;; Lookup class / feature. + (cond + ((and (null class) (null feature)) + ;; Invalid or unrecognized @see format, so ignore. + (message "(smart-java-cross-reference): Invalid @see cross-reference format.") + (beep) + t) + ;; Ensure that a Java OO-Browser environment has been loaded. + (t (if (or (and (boundp 'br-lang-prefix) + (equal br-lang-prefix "java-") + (boundp 'br-env-file) (stringp br-env-file) + (null br-env-spec)) + ;; Load an existing Environment based on current + ;; buffer or prompt to build one. This also + ;; loads the "br-java.el" library in which the + ;; `java-class-def-regexp' variable used below + ;; is defined. + (and (br-env-load + (smart-tags-file + buffer-file-name + (if (boundp 'br-env-default-file) + br-env-default-file "OOBR"))) + (equal br-lang-prefix "java-"))) + (cond ((null feature) + (br-edit nil class)) + (t + (if (null class) + (if (save-excursion + (or (re-search-backward java-class-def-regexp nil t) + (re-search-forward java-class-def-regexp nil t))) + (setq class (buffer-substring + (match-beginning java-class-def-name-grpn) + (match-end java-class-def-name-grpn))) + (error "(smart-java-cross-reference): This @see must be in a class definition."))) + (br-edit-feature class feature t))) + (error "(smart-java-cross-reference): The OO-Browser failed to load a Java environment."))))) + ;; Return to original point. + (goto-char opoint) + nil))) -If: - (1) on a '#include' statement, the include file is displayed; - Look for include file in directory lists 'smart-c-cpp-include-dirs' - and 'smart-c-include-dirs'. - (2) on an Objective-C identifier, the identifier definition is displayed, - assuming the identifier is found within an 'etags' generated tag file - in the current directory or any of its ancestor directories. - (3) if 'smart-c-use-lib-man' is non-nil, the Objective-C identifier is - recognized as a library symbol, and a man page is found for the - identifier, then the man page is displayed." +(defun smart-java-library-path (library-name) + "Search up directory tree from current directory for a match to LIBRARY-NAME." + (let ((path default-directory) + (library-path) + (library-regexp (if (string-match "\\.\\|'//" library-name) + (regexp-quote + (concat (file-name-as-directory "") + (substring library-name 0 (match-beginning 0)) + (file-name-as-directory ""))))) + (start 0)) + ;; Return rightmost match to first part of library-name. + (if library-regexp + (while (string-match library-regexp path start) + (setq start (1+ (match-beginning 0)) + library-path (substring path 0 (match-beginning 0))))) + library-path)) - (interactive) - (or - (if identifier nil (smart-c-include-file)) - (let ((tag (or identifier (smart-objc-at-tag-p)))) - ;; Set free variable tags-file-name so that next 'find-tag' command uses - ;; whatever tags file is set here. - (setq tags-file-name (smart-tags-file buffer-file-name)) - (message "Looking for '%s' in '%s'..." tag tags-file-name) - (condition-case () - (progn - (funcall (if (br-in-browser) - 'find-tag 'find-tag-other-window) - tag next) - (message "Found definition for '%s'." tag)) - (error - (if (not smart-c-use-lib-man) - (progn (message "'%s' not found in '%s'." tag tags-file-name) - (beep)) - (message - "Checking if '%s' is an Objective-C library function..." tag) - (if (smart-library-symbol tag) - (progn - (message - "Displaying Objective-C library man page for '%s'." tag) - (manual-entry tag)) - (message "'%s' not found in '%s' or Objective-C libraries." - tag tags-file-name) - (beep)))))))) +(defun smart-java-packages () + "If point is on a `package' or `import' line, this tries to display the associated referent. +Returns non-nil iff on such a line, even if the referent is not found. +Look for packages in `smart-java-package-dirs'." + (let ((opoint (point))) + (beginning-of-line) + (if (looking-at smart-java-package-regexp) + (let ((keyword-type (buffer-substring + (match-beginning 1) (match-end 1))) + (referent (buffer-substring (match-beginning 2) (match-end 2))) + (found) + (subpath) + dir-list path subfile) + (goto-char opoint) + (if (string-equal keyword-type "package") + (let ((library-path (smart-java-library-path referent))) + (if library-path + (hpath:find (expand-file-name + (hypb:replace-match-string + "\\." referent (file-name-as-directory "") t) + library-path)) + ;; Show the current directory, which should contain this package. + (hpath:find default-directory))) + ;; This is an `import' statement. If it includes a *, show the + ;; associated library directory, otherwise, show the specific + ;; package. + (if (string-match "\\.\\*" referent) + (setq subfile (substring referent 0 (match-beginning 0)) + subfile (hypb:replace-match-string + "\\." subfile (file-name-as-directory "") t)) + (setq subpath (hypb:replace-match-string + "\\." referent (file-name-as-directory "") t) + subfile (concat subpath ".java"))) + ;; + ;; Try to find the path containing referent. + ;; + ;; Search up the current directory tree for a possible matching + ;; directory below which the referent library might live and add + ;; this to smart-java-package-dirs for searching. + (let ((library-path (smart-java-library-path referent))) + (if library-path + (setq dir-list (cons library-path smart-java-package-dirs)))) -;;; The following should be called only if the OO-Browser is available. -;;;###autoload -(defun smart-objc-oobr (&optional junk) - "Jumps to the definition of selected Objective-C construct via OO-Browser support. -Optional JUNK is ignored. Does nothing if the OO-Browser is not available. - -It assumes that its caller has already checked that the key was pressed in an -appropriate buffer and has moved the cursor to the selected buffer. - -If key is pressed: - (1) on a '#include' statement, the include file is displayed; - Look for include file in directory lists 'smart-c-cpp-include-dirs' - and 'smart-c-include-dirs'. - (2) within a method declaration, its definition is displayed; - (3) on a class name, the class definition is shown. - - (2) and (3) require that an OO-Browser Environment has been loaded with - the {M-x br-env-load RTN} command." - - (interactive) - (objc-to-definition 'other-win)) - -(defun smart-objc-at-tag-p () - "Return Objective-C tag name that point is within, else nil." - (let* ((identifier-chars "_a-zA-Z0-9") - (identifier - (concat "\\([-+][ \t]*\\)?\\([_a-zA-Z][" identifier-chars "]*\\)"))) - (save-excursion - (skip-chars-backward identifier-chars) - (if (looking-at identifier) - (buffer-substring (match-beginning 2) (match-end 2)))))) - -;;; ************************************************************************ -;;; Private functions -;;; ************************************************************************ + (while dir-list + (setq path (expand-file-name subfile (car dir-list)) + dir-list (if (setq found (file-exists-p path)) + nil + (cdr dir-list)))) + (if (and (not found) subpath hyperb:microcruft-os-p) + ;; Try .jav suffix. + (progn (setq subfile (concat subpath ".jav") + dir-list smart-java-package-dirs) + (while dir-list + (setq path (expand-file-name subfile (car dir-list)) + dir-list (if (setq found (file-exists-p path)) + nil + (cdr dir-list)))))) + ;; + ;; If found, display file + ;; + (if found + (if (file-readable-p path) + (hpath:find path) + (beep) + (message "(smart-java-packages): `%s' unreadable." path)) + (beep) + (message "(smart-java-packages): `%s' not found." referent)) + path)) + (goto-char opoint) + nil))) (defun smart-library-symbol (tag) "Return non-nil if TAG is a library symbol listed in cache of such symbols. @@ -607,6 +853,25 @@ (kill-buffer buf) found))) +(defun smart-tags-display (tag next) + (if next (setq tag nil)) + (let ((func (or (if (fboundp 'find-tag-internal) 'find-tag-internal) + (if (fboundp 'find-tag-noselect) 'find-tag-noselect))) + ;; For XEmacs + (tags-always-exact t) + ;; For Emacs 19 + (find-tag-tag-order (if (boundp 'find-tag-tag-order) + find-tag-tag-order))) + (if find-tag-tag-order + (if next nil (setq find-tag-tag-order '(tag-exact-match-p))) + ;; For InfoDock (XEmacs may also take this branch), force exact match. + (if (stringp tag) (setq tag (list tag)))) + (if (and func (funcall func tag)) + (hpath:display-buffer (current-buffer))) + ;; Signals an error if tag is not found which is caught by many callers + ;; of this function. + (find-tag tag))) + ;;;###autoload (defun smart-tags-file-path (file) "Expand relative FILE name by looking it up in the nearest tags file. @@ -628,8 +893,9 @@ file)) ;;;###autoload -(defun smart-tags-file (curr-filename) - "Return appropriate tags file name for CURR-FILENAME or 'tags-file-name'." +(defun smart-tags-file (curr-filename &optional name-of-tags-file) + "Return appropriate tags file name for CURR-FILENAME or `tags-file-name'. +Optional NAME-OF-TAGS-FILE is the literal filename for which to look." (let ((path curr-filename) (tags-file)) (while (and @@ -640,7 +906,7 @@ (not (string-match ":?/\\'" path)) ;; No tags file (not (file-exists-p - (setq tags-file (expand-file-name "TAGS" path))))) + (setq tags-file (expand-file-name (or name-of-tags-file "TAGS") path))))) (setq tags-file nil)) (if (and (not tags-file) (stringp curr-filename)
--- a/lisp/hyperbole/hpath.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hpath.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,19 +6,10 @@ ;; KEYWORDS: comm, hypermedia, unix ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 1-Nov-91 at 00:44:23 -;; LAST-MOD: 10-Oct-95 at 23:31:56 by Bob Weiner -;; -;; This file is part of Hyperbole. -;; Available for use and distribution under the same terms as GNU Emacs. -;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. -;; Developed with support from Motorola Inc. -;; -;; DESCRIPTION: -;; DESCRIP-END. +;; LAST-MOD: 16-Feb-97 at 02:34:35 by Bob Weiner ;;; ************************************************************************ ;;; Public variables @@ -26,7 +17,7 @@ (defvar hpath:rfc "/anonymous@ds.internic.net:rfc/rfc%s.txt" "*String to be used in the call: (hpath:rfc rfc-num) -to create an path to the RFC document for 'rfc-num'.") +to create an path to the RFC document for `rfc-num'.") (defvar hpath:suffixes '(".gz" ".Z") "*List of filename suffixes to add or remove within (hpath:exists-p) calls.") @@ -39,7 +30,7 @@ ;;; ************************************************************************ (defun hpath:absolute-to (path &optional default-dirs) - "Returns PATH as an absolute path relative to one directory from optional DEFAULT-DIRS or 'default-directory'. + "Returns PATH as an absolute path relative to one directory from optional DEFAULT-DIRS or `default-directory'. Returns PATH unchanged when it is not a valid path or when DEFAULT-DIRS is invalid. DEFAULT-DIRS when non-nil may be a single directory or a list of directories. The first one in which PATH is found is used." @@ -63,7 +54,7 @@ (defun hpath:ange-ftp-at-p () "Returns an ange-ftp pathname that point is within or nil. -See the 'ange-ftp' or 'efs' Elisp packages for pathname format details. +See the `ange-ftp' or `efs' Elisp packages for pathname format details. Always returns nil if (hpath:ange-ftp-available-p) returns nil." (if (hpath:ange-ftp-available-p) (let ((user (hpath:ange-ftp-default-user)) @@ -74,23 +65,23 @@ (cond ((hpath:url-at-p) (if (string-equal - (buffer-substring (match-beginning 1) (match-end 1)) + (buffer-substring (match-beginning 2) (match-end 2)) "ftp") (concat "/" ;; user - (if (match-beginning 2) + (if (match-beginning 3) (buffer-substring - (match-beginning 2) (match-end 2)) + (match-beginning 3) (match-end 3)) (concat user "@")) ;; domain (hpath:delete-trailer - (buffer-substring (match-beginning 3) (match-end 3))) + (buffer-substring (match-beginning 4) (match-end 4))) ":" ;; path - (if (match-beginning 5) - (buffer-substring (match-beginning 5) - (match-end 5)))) + (if (match-beginning 6) + (buffer-substring (match-beginning 6) + (match-end 6)))) ;; else ignore this other type of WWW path )) ;; user, domain and path @@ -120,7 +111,7 @@ (defun hpath:ange-ftp-p (path) "Returns non-nil iff PATH is an ange-ftp pathname. -See the 'ange-ftp' or 'efs' Elisp package for pathname format details. +See the `ange-ftp' or `efs' Elisp package for pathname format details. Always returns nil if (hpath:ange-ftp-available-p) returns nil." (and (stringp path) (or (featurep 'ange-ftp) (featurep 'efs)) @@ -130,22 +121,22 @@ (cond ((hpath:url-p path) (if (string-equal - (substring path (match-beginning 1) (match-end 1)) + (substring path (match-beginning 2) (match-end 2)) "ftp") (concat "/" ;; user - (if (match-beginning 2) - (substring path (match-beginning 2) (match-end 2)) + (if (match-beginning 3) + (substring path (match-beginning 3) (match-end 3)) (concat user "@")) ;; domain (hpath:delete-trailer - (substring path (match-beginning 3) (match-end 3))) + (substring path (match-beginning 4) (match-end 4))) ":" ;; path - (if (match-beginning 5) - (substring path (match-beginning 5) - (match-end 5)))) + (if (match-beginning 6) + (substring path (match-beginning 6) + (match-end 6)))) ;; else ignore this other type of WWW path )) ;; user, domain and path @@ -186,8 +177,8 @@ If optional TYPE is the symbol 'file or 'directory, then only that path type is accepted as a match. Only locally reachable paths are checked for existence. With optional NON-EXIST, nonexistent local paths are allowed. -Absolute pathnames must begin with a '/' or '~'. Relative pathnames -must begin with a './' or '../' to be recognized." +Absolute pathnames must begin with a `/' or `~'. Relative pathnames +must begin with a `./' or `../' to be recognized." (cond (;; Local file URLs (hpath:is-p (hargs:delimited "file://localhost" "[ \t\n\^M\"\'\}]" nil t))) @@ -200,10 +191,40 @@ (hargs:delimited "@file{" "}")) type non-exist)))) -(defun hpath:find (filename &optional other-window-p) - "Edit file FILENAME using program from hpath:find-alist if available. -Otherwise, switch to a buffer visiting file FILENAME, creating one if none -already exists. +(defun hpath:display-buffer (buffer &optional display-where) + "Displays BUFFER at optional DISPLAY-WHERE location or at hpath:display-where. +BUFFER may be a buffer or a buffer name. + +See documentation of `hpath:display-buffer-alist' for valid values of DISPLAY-WHERE. +Returns non-nil iff buffer is actually displayed." + (interactive "bDisplay buffer: ") + (if (stringp buffer) (setq buffer (get-buffer buffer))) + (if (null buffer) + nil + (if (null display-where) + (setq display-where hpath:display-where)) + (funcall (car (cdr (or (assq display-where + hpath:display-buffer-alist) + (assq 'other-window + hpath:display-buffer-alist)))) + buffer) + t)) + +(defun hpath:display-buffer-other-frame (buffer) + "Displays BUFFER, in another frame. +May create a new frame, or reuse an existing one. +See documentation of `hpath:display-buffer' for details. +Returns the dispalyed buffer." + (interactive "bDisplay buffer in other frame: ") + (if (= (length (frame-list)) 1) + (select-frame (make-frame)) + (other-frame 1)) + (if (br-in-browser) + (br-to-view-window)) + (switch-to-buffer buffer)) + +(defun hpath:find (filename &optional display-where) + "Edits file FILENAME using user customizable settings of display program and location. FILENAME may start with a special prefix character which is handled as follows: @@ -211,7 +232,14 @@ &filename - execute as a windowed program; -filename - load as an Emacs Lisp program. -Return non-nil iff file is displayed within a buffer (not with an external +Otherwise, if FILENAME matches a regular expression in the variable +`hpath:find-alist,' the associated external display program is invoked. +If not, `hpath:display-alist' is consulted for a specialized internal +display function to use. If no matches are found there, +`hpath:display-where-alist' is consulted using the optional argument, +DISPLAY-WHERE (a symbol) or if that is nil, the value of +`hpath:display-where', and the matching display function is used. +Returns non-nil iff file is displayed within a buffer (not with an external program)." (interactive "FFind file: ") (let (modifier) @@ -232,25 +260,62 @@ nil) ((hypb:functionp find-program) (funcall find-program filename) - nil) + t) (t (setq filename (hpath:validate filename)) - (funcall (if (and other-window-p - (not (br-in-browser))) - 'switch-to-buffer-other-window - 'switch-to-buffer) - (find-file-noselect filename)) + (if (null display-where) + (setq display-where hpath:display-where)) + (funcall (car (cdr (or (assq display-where + hpath:display-where-alist) + (assq 'other-window + hpath:display-where-alist)))) + filename) t))))))) +(defun hpath:find-line (filename line-num &optional display-where) + "Edits file FILENAME with point placed at LINE-NUM. + +`hpath:display-where-alist' is consulted using the optional argument, +DISPLAY-WHERE (a symbol) or if that is nil, the value of +`hpath:display-where', and the matching display function is used to determine +where to display the file, e.g. in another frame. +Always returns t." + (interactive "FFind file: ") + ;; Just delete any special characters preceding the filename, ignoring them. + (if (string-match hpath:prefix-regexp filename) + (setq filename (substring filename (match-end 0)))) + (setq filename (hpath:substitute-value filename) + filename (hpath:validate filename)) + (if (null display-where) + (setq display-where hpath:display-where)) + (funcall (car (cdr (or (assq display-where + hpath:display-where-alist) + (assq 'other-window + hpath:display-where-alist)))) + filename) + (if (integerp line-num) + (progn (widen) (goto-line line-num))) + t) + +(defun hpath:find-other-frame (filename) + "Edits file FILENAME, in another frame. +May create a new frame, or reuse an existing one. +See documentation of `hpath:find' for details. +Returns the buffer of displayed file." + (interactive "FFind file in other frame: ") + (if (= (length (frame-list)) 1) + (select-frame (make-frame)) + (other-frame 1)) + (if (br-in-browser) + (br-to-view-window)) + (find-file filename)) + (defun hpath:find-other-window (filename) - "Edit file FILENAME, in another window or using program from hpath:find-alist. + "Edits file FILENAME, in another window or using an external program. May create a new window, or reuse an existing one; see the function display-buffer. - -Alternatively, FILENAME may start with a prefix character to indicate special -handling. See documentation of `hpath:find' for details. - -Return non-nil iff file is displayed within a buffer." +See documentation of `hpath:find' for details. +Returns non-nil iff file is displayed within a buffer." (interactive "FFind file in other window: ") - (hpath:find filename t)) + (hpath:find filename 'other-window)) (defun hpath:is-p (path &optional type non-exist) "Returns PATH if PATH is a Unix path, else nil. @@ -275,7 +340,7 @@ (if (string-match hpath:prefix-regexp path) (setq path (substring path (match-end 0))) t) - (not (or (string= path "") + (not (or (string-equal path "") (string-match "\\`\\s \\|\\s \\'" path))) ;; Convert tabs and newlines to space. (setq path (hbut:key-to-label (hbut:label-to-key path))) @@ -310,19 +375,23 @@ (file-directory-p path)) (t))) ) - ;; Return path if non-nil return value - (if (stringp suffix) ;; suffix could = t, which we ignore - (if (string-match - (concat (regexp-quote suffix) "%s") rtn-path) - ;; remove suffix - (concat (substring rtn-path 0 (match-beginning 0)) - (substring rtn-path (match-end 0))) - ;; add suffix - (format rtn-path suffix)) - (format rtn-path ""))))))) + (progn + ;; Quote any but last %s within rtn-path. + (setq rtn-path (hypb:replace-match-string "%s" rtn-path "%%s") + rtn-path (hypb:replace-match-string "%%s\\'" rtn-path "%s")) + ;; Return path if non-nil return value. + (if (stringp suffix);; suffix could = t, which we ignore + (if (string-match + (concat (regexp-quote suffix) "%s") rtn-path) + ;; remove suffix + (concat (substring rtn-path 0 (match-beginning 0)) + (substring rtn-path (match-end 0))) + ;; add suffix + (format rtn-path suffix)) + (format rtn-path "")))))))) (defun hpath:relative-to (path &optional default-dir) - "Returns PATH relative to optional DEFAULT-DIR or 'default-directory'. + "Returns PATH relative to optional DEFAULT-DIR or `default-directory'. Returns PATH unchanged when it is not a valid path." (if (not (and (stringp path) (hpath:is-p path))) path @@ -349,7 +418,7 @@ (defun hpath:rfc (rfc-num) "Return pathname to textual rfc document indexed by RFC-NUM. -See the documentation of the 'hpath:rfc' variable." +See the documentation of the `hpath:rfc' variable." (format hpath:rfc rfc-num)) (defun hpath:substitute-value (path) @@ -374,7 +443,7 @@ t))) (defun hpath:substitute-var (path) - "Replaces up to one match in PATH with first matching variable from 'hpath:variables'." + "Replaces up to one match in PATH with first matching variable from `hpath:variables'." (if (not (and (stringp path) (string-match "/" path) (hpath:is-p path))) path (setq path (hpath:symlink-referent path)) @@ -396,7 +465,7 @@ (hpath:substitute-var-name var (car val) path)) (setq new-path result)) (setq val (cdr val)))) - (t (error "(hpath:substitute-var): '%s' has invalid value for hpath:variables" var)))))) + (t (error "(hpath:substitute-var): `%s' has invalid value for hpath:variables" var)))))) (or new-path path) ))) @@ -407,9 +476,9 @@ ;; /usr/local -> $(SERVER_LOCAL)/usr/local, /usr/bin -> ;; ../$(SYSTYPE)/usr/bin and /tmp -> `node_data/tmp. It also handles ;; relative links properly as in /usr/local/emacs -> gnu/emacs which must -;; be resolved relative to the '/usr/local' directory. -;; It will fail on Apollos if the '../' notation is used to move just -;; above the '/' directory level. This is fairly uncommon and so the +;; be resolved relative to the `/usr/local' directory. +;; It will fail on Apollos if the `../' notation is used to move just +;; above the `/' directory level. This is fairly uncommon and so the ;; problem has not been fixed. ;; (defun hpath:symlink-referent (linkname) @@ -478,35 +547,37 @@ "Return world-wide-web universal resource locator (url) that point immediately precedes or nil. Use buffer-substring with match-beginning and match-end on the following groupings: - 1 = access protocol - 2 = optional username - 3 = host and domain to connect to - 4 = optional port number to use - 5 = pathname to access." - ;; WWW URL format: <protocol>:/[<user>@]<domain>[:<port>]/<path> - ;; or <protocol>://[<user>@]<domain>[:<port>]<path> + 1 = optional `URL:' literal + 2 = access protocol + 4 = optional username + 4 = host and domain to connect to + 5 = optional port number to use + 6 = pathname to access." + ;; WWW URL format: [URL:]<protocol>:/[<user>@]<domain>[:<port>]/<path> + ;; or [URL:]<protocol>://[<user>@]<domain>[:<port>]<path> ;; Avoid [a-z]:/path patterns since these may be disk paths on OS/2, DOS or ;; Windows. - (if (looking-at "\\([a-zA-Z][a-zA-Z]+\\)://?\\([^@/: \t\n\^M]+@\\)?\\([^/:@ \t\n\^M\"`']+\\)\\(:[0-9]+\\)?\\([/~][^]@ \t\n\^M\"`'\)\}>]*\\)?") + (if (looking-at "\\(URL:\\)?\\([a-zA-Z][a-zA-Z]+\\)://?\\([^@/: \t\n\^M]+@\\)?\\([^/:@ \t\n\^M\"`']+\\)\\(:[0-9]+\\)?\\([/~][^]@ \t\n\^M\"`'\)\}>]*\\)?") (save-excursion - (goto-char (match-end 0)) + (goto-char (match-end 6)) (skip-chars-backward ".?#!*()") - (buffer-substring (match-beginning 0) (point))))) + (buffer-substring (match-beginning 2) (point))))) (defun hpath:url-p (obj) "Return t if OBJ is a world-wide-web universal resource locator (url) string, else nil. Use string-match with match-beginning and match-end on the following groupings: - 1 = access protocol - 2 = optional username - 3 = host and domain to connect to - 4 = optional port number to use - 5 = pathname to access." - ;; WWW URL format: <protocol>:/[<user>@]<domain>[:<port>]/<path> - ;; or <protocol>://[<user>@]<domain>[:<port>]<path> + 1 = optional `URL:' literal + 2 = access protocol + 3 = optional username + 4 = host and domain to connect to + 5 = optional port number to use + 6 = pathname to access." + ;; WWW URL format: [URL:]<protocol>:/[<user>@]<domain>[:<port>]/<path> + ;; or [URL:]<protocol>://[<user>@]<domain>[:<port>]<path> ;; Avoid [a-z]:/path patterns since these may be disk paths on OS/2, DOS or ;; Windows. (and (stringp obj) - (string-match "\\`<?\\([a-zA-Z][a-zA-Z]+\\)://?\\([^@/: \t\n\^M]+@\\)?\\([^/:@ \t\n\^M\"`']+\\)\\(:[0-9]+\\)?\\([/~][^]@ \t\n\^M\"`'\)\}>]*\\)?>?\\'" + (string-match "\\`<?\\(URL:\\)?\\([a-zA-Z][a-zA-Z]+\\)://?\\([^@/: \t\n\^M]+@\\)?\\([^/:@ \t\n\^M\"`']+\\)\\(:[0-9]+\\)?\\([/~][^]@ \t\n\^M\"`'\)\}>]*\\)?>?\\'" obj) t)) @@ -519,9 +590,9 @@ (cond ((not include-start-and-end-p) (hpath:url-at-p)) ((hpath:url-at-p) - (list (buffer-substring (match-beginning 0) (match-end 0)) - (match-beginning 0) - (match-end 0)))))) + (list (buffer-substring (match-beginning 2) (match-end 6)) + (match-beginning 2) + (match-end 6)))))) (defun hpath:www-p (path) "Returns non-nil iff PATH is a world-wide-web link reference." @@ -534,7 +605,7 @@ (defun hpath:ange-ftp-available-p () "Return t if the ange-ftp or efs package is available, nil otherwise. Either the package must have been loaded already or under versions of Emacs -19, it must be set for autoloading via 'file-name-handler-alist'." +19, it must be set for autoloading via `file-name-handler-alist'." (or (featurep 'ange-ftp) (featurep 'efs) (and (boundp 'file-name-handler-alist) ; v19 (or (rassq 'ange-ftp-hook-function file-name-handler-alist) @@ -595,7 +666,7 @@ (defun hpath:find-program (filename) "Return shell or Lisp command to execute to display FILENAME or nil. Return nil if FILENAME is a directory name. -See also documentation for 'hpath:find-alist' and 'hpath:display-alist'." +See also documentation for `hpath:find-alist' and `hpath:display-alist'." (let ((cmd)) (cond ((and (stringp filename) (file-directory-p filename)) nil) @@ -639,7 +710,7 @@ local pathname is returned." (let (sym val) (cond ((not (stringp var-name)) - (error "(hpath:substitute-dir): VAR-NAME arg, '%s', must be a string" var-name)) + (error "(hpath:substitute-dir): VAR-NAME arg, `%s', must be a string" var-name)) ((not (and (setq sym (intern-soft var-name)) (boundp sym))) (error "(hpath:substitute-dir): VAR-NAME arg, \"%s\", is not a bound variable"
--- a/lisp/hyperbole/hrmail.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hrmail.el Mon Aug 13 09:15:11 2007 +0200 @@ -9,7 +9,7 @@ ;; ORG: Brown U. ;; ;; ORIG-DATE: 9-May-91 at 04:22:02 -;; LAST-MOD: 19-May-95 at 15:09:04 by Bob Weiner +;; LAST-MOD: 14-Feb-97 at 11:38:57 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. @@ -22,7 +22,7 @@ ;; Automatically configured for use in "hyperbole.el". ;; If hsite loading fails prior to initializing Hyperbole Rmail support, ;; -;; {M-x Rmail-init RTN} +;; {M-x Rmail-init RET} ;; ;; will do it. ;; @@ -216,32 +216,47 @@ ;;; Overlay version of this function from "rmail.el" to include any ;;; Hyperbole button data. -(defun rmail-forward (&optional resend) - "Forward the current message to another user." - (interactive) - ;; Resend argument is ignored but for now but is there for Emacs V19 call - ;; compatibility. - ;;>> this gets set even if we abort. Can't do anything about it, though. - (rmail-set-attribute "forwarded" t) - (let ((forward-buffer (current-buffer)) - (subject (concat "[" - (mail-strip-quoted-names (mail-fetch-field "From")) - ": " (or (mail-fetch-field "Subject") "") "]"))) - (save-restriction - (Rmail-msg-widen) - ;; If only one window, use it for the mail buffer. - ;; Otherwise, use another window for the mail buffer - ;; so that the Rmail buffer remains visible - ;; and sending the mail will get back to it. - (if (if (one-window-p t) - (mail nil nil subject) - (mail-other-window nil nil subject)) - (save-excursion - (goto-char (point-max)) - (forward-line 1) - (insert-buffer forward-buffer) - (hmail:msg-narrow) - ))))) +(defun rmail-forward (resend) + "Forward the current message to another user. +With prefix argument, \"resend\" the message instead of forwarding it; +see the documentation of `rmail-resend'." + (interactive "P") + (if resend + (call-interactively 'rmail-resend) + (let ((forward-buffer (current-buffer)) + (subject (concat "[" + (let ((from (or (mail-fetch-field "From") + (mail-fetch-field ">From")))) + (if from + (concat (mail-strip-quoted-names from) ": ") + "")) + (or (mail-fetch-field "Subject") "") + "]"))) + (save-restriction + (Rmail-msg-widen) + ;; Turn off the usual actions for initializing the message body + ;; because we want to get only the text from the failure message. + (let (mail-signature mail-setup-hook) + ;; If only one window, use it for the mail buffer. + ;; Otherwise, use another window for the mail buffer + ;; so that the Rmail buffer remains visible + ;; and sending the mail will get back to it. + (if (funcall (if (one-window-p t) + (function mail) + (function mail-other-window)) + nil nil subject nil nil nil + (list (list (function (lambda (buf msgnum) + (save-excursion + (set-buffer buf) + (rmail-set-attribute + "forwarded" t msgnum)))) + (current-buffer) + rmail-current-message))) + (save-excursion + (goto-char (point-max)) + (forward-line 1) + (insert-buffer forward-buffer) + (hmail:msg-narrow)))))))) ;;; Overlay version of 'rmail-get-new-mail' from "rmail.el" to highlight ;;; Hyperbole buttons when possible.
--- a/lisp/hyperbole/hsite-ex.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hsite-ex.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,15 +6,15 @@ ;; KEYWORDS: hypermedia, local ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 15-Apr-91 at 00:48:49 -;; LAST-MOD: 3-Nov-95 at 22:51:43 by Bob Weiner +;; LAST-MOD: 17-Feb-97 at 18:34:17 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. +;; Copyright (C) 1991-1997, Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: @@ -38,6 +38,35 @@ (message "Initializing Hyperbole, please wait...") ;;; ************************************************************************ +;;; TIMEZONE SETTING +;;; ************************************************************************ + +;; The following section applies only to MS-DOS and MS-Windows OSs. +;; For such OSs, you must configure this section or you will receive +;; an error when starting Hyperbole. Users of other OSs may simply +;; ignore this section. + + +;; Microcruft OSs don't provide an automatically set timezone environment +;; variable. Nor do they include a UNIX-style date program. So follow +;; the commented instructions in the code below here. + +;; If you happened to have installed a UNIX-style date program (when you type +;; `date' at a shell, it simply spits out the date and time and then quits), +;; you may comment out the logic. +;; +(if (and hyperb:microcruft-os-p + (not (or (getenv "TZ") (getenv "TIMEZONE")))) + (progn + ;; Comment out the following `error' line... + (error "(hsite.el): Configure the TIMEZONE SETTING section in this file.") + ;; ... and uncomment the following line, substituting an appropriate + ;; timezone from the list in the variable, `htz:world-timezones' + ;; in the file, "htz.el". + ;; (setenv "TZ" "your-3char-timezone") + )) + +;;; ************************************************************************ ;;; SMART SETTINGS ;;; ************************************************************************ @@ -63,8 +92,8 @@ ;;; INTERNET SETTINGS ;;; ************************************************************************ -;; String to be used in the call: (hpath:rfc rfc-num) to create an ange-ftp -;; path to the RFC document for 'rfc-num'. Uncomment and alter this setting +;; String to be used in the call: (hpath:rfc rfc-num) to create a remote +;; path to the RFC document for `rfc-num'. Uncomment and alter this setting ;; if another site is closer for you. ;; (setq hpath:rfc "/anonymous@ds.internic.net:rfc/rfc%s.txt") @@ -77,7 +106,7 @@ ;; properly. If it is not, uncomment the following line and set it to the ;; proper value. -;; (setenv "DOMAINNAME" "mot.com") +;; (setenv "DOMAINNAME" "yourdomain.com") ;;; ************************************************************************ ;;; XEMACS, GNU EMACS 19, AND EPOCH CONFIGURATION @@ -176,19 +205,6 @@ (list (function (lambda () (mapcar 'require '(hib-doc-id)))))) ;;; ************************************************************************ -;;; HYPERBOLE INITIALIZATION -;;; ************************************************************************ - -;;; This call loads the whole Hyperbole system. -;;; You may want to look at this file just to see what it does. -;;; -(require 'hinit) -;;; -;;; This call initializes the Hyperbole system for use. -;;; -(hyperb:init) - -;;; ************************************************************************ ;;; FILE VIEWER COMMAND SETTINGS ;;; ************************************************************************ @@ -218,7 +234,68 @@ )) "*Alist of (FILENAME-REGEXP . EDIT-FUNCTION) elements for calling special functions to display particular file types within Emacs. See also -'hpath:file-alist' for external display program settings.") +`hpath:file-alist' for external display program settings.") + +(defvar hpath:display-buffer-alist + (list + (list 'this-window 'switch-to-buffer) + (list 'other-window (function (lambda (b) + (if (br-in-browser) + (progn (br-to-view-window) + (switch-to-buffer b)) + (switch-to-buffer-other-window b))))) + (list 'one-window (function (lambda (b) + (if (br-in-browser) (br-quit)) + (delete-other-windows) + (switch-to-buffer b)))) + (list 'new-frame (function (lambda (b) + (select-frame (make-frame)) + (switch-to-buffer b)))) + (list 'other-frame 'hpath:display-buffer-other-frame) + (list 'other-frame-one-window + (function (lambda (b) + (hpath:display-buffer-other-frame b) + (delete-other-windows))))) + "*Alist of (DISPLAY-WHERE-SYMBOL DISPLAY-BUFFER-FUNCTION) elements. +This permits fine-grained control of where Hyperbole displays linked to buffers. +The default value of DISPLAY-WHERE-SYMBOL is given by `hpath:display-where'. +Valid DISPLAY-WHERE-SYMBOLs are: + this-window - display in the current window + other-window - display in another window in the current frame + one-window - display in the current window, deleting other windows + new-frame - display in a new frame + other-frame - display in another, possibly existing, frame + other-frame-one-window - display in another frame, deleting other windows.") + +(defvar hpath:display-where 'other-window + "Symbol specifying the default method to use to display Hyperbole link referents. +See documentation of `hpath:display-where-alist' for valid values.") + +(defvar hpath:display-where-alist + (list + (list 'this-window 'find-file) + (list 'other-window (function (lambda (f) + (if (br-in-browser) + (progn (br-to-view-window) + (find-file f)) + (find-file-other-window f))))) + (list 'one-window (function (lambda (f) + (if (br-in-browser) (br-quit)) + (delete-other-windows) (find-file f)))) + (list 'new-frame 'find-file-new-frame) + (list 'other-frame 'hpath:find-other-frame) + (list 'other-frame-one-window + (function (lambda (f) (hpath:find-other-frame f) (delete-other-windows))))) + "*Alist of (DISPLAY-WHERE-SYMBOL DISPLAY-FILE-FUNCTION) elements. +This permits fine-grained control of where Hyperbole displays linked to files. +The default value of DISPLAY-WHERE-SYMBOL is given by `hpath:display-where'. +Valid DISPLAY-WHERE-SYMBOLs are: + this-window - display in the current window + other-window - display in another window in the current frame + one-window - display in the current window, deleting other windows + new-frame - display in a new frame + other-frame - display in another, possibly existing, frame + other-frame-one-window - display in another frame, deleting other windows.") ;;; `hyperb:window-system' variable from "hversion.el" must be defined ;;; prior to this variable definition. @@ -231,7 +308,8 @@ ("\\.xwd$" . "xwud -noclick -in") ("\\.ra?s$" . "snapshot -l") ("\\.xpm$" . "sxpm") - ("\\.\\(fm\\|frame\\|mif\\)$" . "maker") + ("\\.\\(fm\\|frame\\|mif\\)$" . + "frame.pl -vn -preader -c -f%s") ;; was "msgfm_driver" ("\\.\\(doc\\|boo\\)$" . "ileaf") ))) (if (memq window-system '(dps ns)) @@ -247,7 +325,7 @@ ))))) "*Alist of (FILENAME-REGEXP . EDIT-PROGRAM) elements for using window system dependent external programs to edit/display particular file types. See also -'hpath:display-alist' for internal, window-system independent display +`hpath:display-alist' for internal, window-system independent display settings.") ;;; ************************************************************************ @@ -269,6 +347,19 @@ Each variable value, if bound, must be either a pathname or a list of pathnames.") ;;; ************************************************************************ +;;; HYPERBOLE INITIALIZATION +;;; ************************************************************************ + +;;; This call loads the whole Hyperbole system. +;;; You may want to look at this file just to see what it does. +;;; +(require 'hinit) +;;; +;;; This call initializes the Hyperbole system for use. +;;; +(hyperb:init) + +;;; ************************************************************************ ;;; HYPERBOLE LOCAL VARIABLE SUPPORT ;;; ************************************************************************
--- a/lisp/hyperbole/hsite.el Mon Aug 13 09:13:58 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,291 +0,0 @@ -;;!emacs -;; -;; FILE: hsite.el -;; SUMMARY: Site-specific setup for Hyperbole -;; USAGE: GNU Emacs Lisp Library -;; KEYWORDS: hypermedia, local -;; -;; AUTHOR: Bob Weiner -;; ORG: Brown U. -;; -;; ORIG-DATE: 15-Apr-91 at 00:48:49 -;; LAST-MOD: 3-Nov-95 at 22:51:43 by Bob Weiner -;; -;; This file is part of Hyperbole. -;; Available for use and distribution under the same terms as GNU Emacs. -;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. -;; Developed with support from Motorola Inc. -;; -;; DESCRIPTION: -;; -;; See the "README" file for installation instructions. -;; -;; "hsite.el" may be byte-compiled if you like but normally it is not. -;; -;; Be sure to have users load any personal mail/news initializations -;; before they load this file if any of Hyperbole's mail or news -;; support features are enabled either herein or within their personal -;; Hyperbole initializations. Otherwise, the mail/news support may -;; not be configured properly. -;; -;; DESCRIP-END. - -;;; ************************************************************************ -;;; Read the comments and modify as desired. -;;; ************************************************************************ - -(message "Initializing Hyperbole, please wait...") - -;;; ************************************************************************ -;;; SMART SETTINGS -;;; ************************************************************************ - -(defvar hkey-always-display-menu nil - "*Non-nil means always display the Smart Menu window when the Action or Assist Key is pressed and the Smart Menu system has been loaded. -If a Smart Menu is already displayed, perform another Action or Assist Key -function.") - -(defvar smart-scroll-proportional t - "*Non-nil means Smart Keys should scroll relative to current line when pressed at the end of a line. -Action Key moves current line to top of window. Assist Key moves current -line to bottom of window. Repeated presses then scroll up or down a -windowful. Nil value instead ignores current line and always scrolls up or -down a windowful.") - -;;; ************************************************************************ -;;; HYPERBOLE DIRECTORY SETTING -;;; ************************************************************************ - -(require 'hyperbole) - -;;; ************************************************************************ -;;; INTERNET SETTINGS -;;; ************************************************************************ - -;; String to be used in the call: (hpath:rfc rfc-num) to create an ange-ftp -;; path to the RFC document for 'rfc-num'. Uncomment and alter this setting -;; if another site is closer for you. -;; (setq hpath:rfc "/anonymous@ds.internic.net:rfc/rfc%s.txt") - -;; When a user creates an explicit button, Hyperbole tries to store her -;; Internet e-mail address with the button by using the formula, email-id = -;; <user-id>@<domainname>. Not every system has its domainname set -;; up properly, however. If you do a {M-x load-file hypb.elc RET} and then -;; hit {C-x C-e} after the closing paren of the following function, -;; (hypb:domain-name), you will see whether or not yours is configured -;; properly. If it is not, uncomment the following line and set it to the -;; proper value. - -;; (setenv "DOMAINNAME" "mot.com") - -;;; ************************************************************************ -;;; XEMACS, GNU EMACS 19, AND EPOCH CONFIGURATION -;;; ************************************************************************ - -;; No-op unless set by one of the conditionals below. -(defun hui:but-flash ()) - -(if (and hyperb:emacs19-p window-system) - (progn - (require 'hui-em19-b) - ;; Highlight explicit buttons whenever a file is read in. - (var:append 'find-file-hooks '(hproperty:but-create)) - (fset 'hui:but-flash 'hproperty:but-flash) - ;; - ;; Substitute for the nil argument below a valid X color name with - ;; which to highlight buttons if the default highlighting does not - ;; appeal to you. See "hui-em19-b.el" for how this works. - (hproperty:cycle-but-color nil) - ;; - ;; Non-nil means visually emphasize that button under mouse cursor is - ;; selectable. - (setq hproperty:but-emphasize-p nil) - ;; - ;; If you find that the Hyperbole button flash time is too slow - ;; or too fast, adjust it here. - (setq hproperty:but-flash-time 1000) - )) - -(if (and hyperb:lemacs-p (not noninteractive)) - (progn - (require 'hui-xe-but) - ;; - ;; If running XEmacs 19.8 or below, don't highlight explicit buttons - ;; whenever a file is read in since this can cause a sporadic crash - ;; when find-files are done. - (if hyperb:kotl-p (var:append 'find-file-hooks '(hproperty:but-create))) - (fset 'hui:but-flash 'hproperty:but-flash) - ;; - ;; Substitute for the nil argument below a valid X color name with - ;; which to highlight buttons if the default highlighting does not - ;; appeal to you. See "hui-xe-but.el" for how this works. - (hproperty:cycle-but-color nil) - ;; - ;; Non-nil means visually emphasize that button under mouse cursor is - ;; selectable. - (setq hproperty:but-emphasize-p nil) - ;; - ;; If you find that the Hyperbole button flash time is too slow - ;; or too fast, adjust it here. - (setq hproperty:but-flash-time 1000) - )) - -(if (and hyperb:epoch-p (string= hyperb:epoch-p "V4")) - (progn - (require 'hui-epV4-b) - ;; Highlight explicit buttons whenever a file is read in. - (var:append 'find-file-hooks '(hproperty:but-create)) - (fset 'hui:but-flash 'hproperty:but-flash) - ;; Substitute for the nil argument below a valid X color name with - ;; which to highlight buttons if the default highlighting does not - ;; appeal to you. See "hui-epV4-b.el" for how this works. - (hproperty:cycle-but-color nil) - ;; If you use Epoch and find that the Hyperbole button flash time is - ;; too slow or too fast, adjust it here. - (defvar hproperty:but-flash-time 1000 - "Machine specific value for empty loop counter, Epoch but flash delay.") - )) - -;;; ************************************************************************ -;;; EXTERNAL SYSTEM ENCAPSULATIONS -;;; ************************************************************************ - -;;; Support for encapsulations of any of these external systems may be -;;; enabled here. You should be familiar with the external system before -;;; you try to use the Hyperbole support for it. -;;; Possible system encapsulations to include within the innermost set of -;;; parentheses are: -;;; hsys-wais hsys-hbase -;;; See files with the same name, e.g. "hsys-wais.el" for details on each -;;; system. -;;; -;;; Note: hsys-w3 is automatically loaded by default by Hyperbole. -(setq hibtypes:begin-load-hook - (list (function (lambda () (mapcar 'require '()))))) - -;;; ************************************************************************ -;;; ONLINE LIBRARY CONFIGURATION -;;; ************************************************************************ - -;;; Support for online library document id references is loaded here but -;;; requires some additional configuration before use. See the DESCRIPTION -;;; section in "hib-doc-id.el" for complete installation and use information. -;;; -(setq hibtypes:end-load-hook - (list (function (lambda () (mapcar 'require '(hib-doc-id)))))) - -;;; ************************************************************************ -;;; HYPERBOLE INITIALIZATION -;;; ************************************************************************ - -;;; This call loads the whole Hyperbole system. -;;; You may want to look at this file just to see what it does. -;;; -(require 'hinit) -;;; -;;; This call initializes the Hyperbole system for use. -;;; -(hyperb:init) - -;;; ************************************************************************ -;;; FILE VIEWER COMMAND SETTINGS -;;; ************************************************************************ - -(defvar hpath:display-alist - (let ((info-suffix "\\.info\\(-[0-9]+\\)?\\(\\.gz\\|\\.Z\\|-z\\)?$")) - (list - ;; Run the OO-Browser on OOBR or OOBR-FTR Environment files. - '("OOBR\\(-FTR\\)?$" . br-env-browse) - ;; Display the top node from Info online manuals. - (cons - (concat (` (, info-suffix)) "\\|/info/[^.]+$\\|/info-local/[^.]+$") - (` (lambda (file) - (if (and (string-match (, info-suffix) file) - (match-beginning 1)) - ;; Removed numbered trailer to get basic filename. - (setq file (concat (substring file 0 (match-beginning 1)) - (substring file (match-end 1))))) - (require 'info) - (condition-case () - (Info-find-node file "Top") - (error (if (and file (file-exists-p file)) - (progn - (if (get-buffer "*info*") - (kill-buffer "*info*")) - (Info-find-node file "*" nil t)) - (error "Invalid file"))))))) - )) - "*Alist of (FILENAME-REGEXP . EDIT-FUNCTION) elements for calling special -functions to display particular file types within Emacs. See also -'hpath:file-alist' for external display program settings.") - -;;; `hyperb:window-system' variable from "hversion.el" must be defined -;;; prior to this variable definition. -;;; -(defvar hpath:find-alist - (let ((nextstep-suffixes '(("\\.\\(adaptor\\|app\\|bshlf\\|clr\\|concur\\|create\\|diagram\\|dp\\|e?ps\\|frame\\|gif\\|locus\\|Mesa\\|nib\\|project\\|rtf\\|sense\\|tiff\\|tree\\)$" . "open"))) - (x-suffixes '(("\\.e?ps$" . "ghostview") - ("\\.ps\\.g?[zZ]$" . "zcat %s | ghostview -") - ("\\.\\(gif\\|tiff?\\|xbm\\|pm\\|pbm\\|jpe?g\\)" . "xv") - ("\\.xwd$" . "xwud -noclick -in") - ("\\.ra?s$" . "snapshot -l") - ("\\.xpm$" . "sxpm") - ("\\.\\(fm\\|frame\\|mif\\)$" . "maker") - ("\\.\\(doc\\|boo\\)$" . "ileaf") - ))) - (if (memq window-system '(dps ns)) - nextstep-suffixes - (cdr (assoc hyperb:window-system - (list (cons "emacs19" x-suffixes) ; GNU Emacs V19 under X - (cons "lemacs" x-suffixes) ; XEmacs under X - (cons "xterm" x-suffixes) ; GNU Emacs V18 under X - (cons "epoch" x-suffixes) ; UofI Epoch under X - '("sun" . nil) ; SunView - (cons "next" nextstep-suffixes) - '("apollo" . nil) ; Display Manager - ))))) - "*Alist of (FILENAME-REGEXP . EDIT-PROGRAM) elements for using window system -dependent external programs to edit/display particular file types. See also -'hpath:display-alist' for internal, window-system independent display -settings.") - -;;; ************************************************************************ -;;; LINK PATH VARIABLE SUBSTITUTION SETTINGS -;;; ************************************************************************ - -;;; The following variable permits sharing of links over wide areas, where -;;; links may contain variable references whose values may differ between -;;; link creator and link activator. -;;; -;;; When a link is created, if its path contains a match for any of the -;;; variable values in hpath:variables, then the variable's symbol is -;;; substituted for the literal value. Hyperbole then replaces the variable -;;; with a matching value when the link is resolved. -;;; -(defvar hpath:variables - '(hyperb:dir Info-directory Info-directory-list sm-directory load-path exec-path) - "*List of Emacs Lisp variable symbols to substitute within matching link paths. -Each variable value, if bound, must be either a pathname or a list of pathnames.") - -;;; ************************************************************************ -;;; HYPERBOLE LOCAL VARIABLE SUPPORT -;;; ************************************************************************ - -;;; Uncomment this if you really need to be able to use Hyperbole variables -;;; (and others with colons in their names) within file local variable lists. -;;; See the source file for more details. -;;; -;; (require 'hlvar) - -;;; ************************************************************************ -;;; SITE-SPECIFIC ADDITIONS - Add your Hyperbole configuration additions here. -;;; ************************************************************************ - -;;; ************************************************************************ -;;; END OF HYPERBOLE CONFIGURATION -;;; ************************************************************************ - -(provide 'hsite) - -(message "Hyperbole is ready for action.")
--- a/lisp/hyperbole/htz.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/htz.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,20 +6,20 @@ ;; KEYWORDS: calendar, hypermedia ;; ;; AUTHOR: Masanobu UMEDA / Bob Weiner -;; ORG: Fujitsu Laboratories LTD. / Brown U. +;; ORG: Fujitsu Laboratories LTD. / InfoDock Associates ;; ;; ORIG-DATE: 14-Oct-91 at 07:22:08 -;; LAST-MOD: 7-Jul-95 at 14:59:51 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 12:21:10 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. +;; Copyright (C) 1991-1995, 1997 Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; Adapted from Timezone package for GNU Emacs ;; Copyright(C) 1990 Masanobu UMEDA (umerin@mse.kyutech.ac.jp) -;; $Header: /afs/informatik.uni-tuebingen.de/local/web/xemacs/xemacs-cvs/XEmacs/xemacs/lisp/hyperbole/Attic/htz.el,v 1.1.1.1 1996/12/18 22:43:15 steve Exp $ +;; $Header: /afs/informatik.uni-tuebingen.de/local/web/xemacs/xemacs-cvs/XEmacs/xemacs/lisp/hyperbole/Attic/htz.el,v 1.2 1997/02/24 01:13:35 steve Exp $ ;; ;; DESCRIPTION: ;; @@ -72,7 +72,7 @@ (defun htz:date-parse (date &optional parsed-current-date) "Parse DATE string and return a vector [year month day time timezone]. 19 is prepended to year if necessary. Timezone in DATE is optional, it -defaults to the value of htz:local. +defaults to the value of `htz:local'. Recognizes the following styles: (1) 14 Apr 89 03:20[:12] [GMT] @@ -192,9 +192,8 @@ "Convert DATE or current date to a unix standard date. Optional 1st argument LOCAL specifies the local timezone of the DATE (default is the timezone embedded in the date or if there is none, then the value of -the variable, htz:local). Optional 2nd argument TIMEZONE specifies the -timezone in which the date is returned; it defaults to the value of -htz:local." +`htz:local'). Optional 2nd argument TIMEZONE specifies the timezone in which +the date is returned; it defaults to the value of `htz:local'." (or (vectorp date) (setq date (htz:date-parse (or date (current-time-string))))) (or local (setq local (or (aref date 4) htz:local)))
--- a/lisp/hyperbole/hui-menu.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hui-menu.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: hypermedia, mouse ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola, Inc., PPG +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 28-Oct-94 at 10:59:44 -;; LAST-MOD: 26-Oct-95 at 23:10:38 by Bob Weiner +;; LAST-MOD: 19-Feb-97 at 10:50:57 by Bob Weiner ;; -;; Copyright (C) 1994-1995 Free Software Foundation, Inc. +;; Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc. ;; ;; This file is part of Hyperbole. ;; @@ -47,15 +47,90 @@ ;;; Public variables ;;; ************************************************************************ +;; Ensure that this variable is defined to avert any error within +;; the Customization menu. +(defvar highlight-headers-follow-url-netscape-new-window nil + "*Whether to make Netscape create a new window when a URL is sent to it.") + +(defconst hui-menu-options + (append '("Display-Referents-in" + "----" + "----") + (mapcar (function (lambda (sym) + (vector + (capitalize (symbol-name sym)) + (` (setq hpath:display-where '(, sym))) + :style 'radio + :selected (` (eq hpath:display-where + '(, sym)))))) + (mapcar 'car hpath:display-where-alist)) + '("----" + "Display-URLs-in" + "----" + "----" + ["Here" + (setq action-key-url-function 'w3-fetch + highlight-headers-follow-url-function + action-key-url-function) + :style radio + :selected (eq action-key-url-function 'w3-fetch)] + ["Current-Netscape-Window" + (setq action-key-url-function + 'highlight-headers-follow-url-netscape + highlight-headers-follow-url-function + action-key-url-function + highlight-headers-follow-url-netscape-new-window + nil) + :style radio + :selected + (and (eq action-key-url-function + 'highlight-headers-follow-url-netscape) + (not highlight-headers-follow-url-netscape-new-window))] + ["New-Netscape-Window" + (setq action-key-url-function + 'highlight-headers-follow-url-netscape + highlight-headers-follow-url-function + action-key-url-function + highlight-headers-follow-url-netscape-new-window + t) + :style radio + :selected + (and (eq action-key-url-function + 'highlight-headers-follow-url-netscape) + highlight-headers-follow-url-netscape-new-window)] + ["Mosaic" + (setq action-key-url-function + 'highlight-headers-follow-url-mosaic + highlight-headers-follow-url-function + action-key-url-function) + :style radio + :selected (eq action-key-url-function + 'highlight-headers-follow-url-mosaic)] + ) + '("----" + "Smart-Key-Press-at-Eol" + "----" + "----" + ["Scrolls-a-Windowful" + (setq smart-scroll-proportional nil) + :style radio :selected (null smart-scroll-proportional)] + ["Scrolls-Proportionally" + (setq smart-scroll-proportional t) + :style radio :selected smart-scroll-proportional] + )) + "Untitled menu of Hyperbole options.") + ;;; Don't change this name; doing so will break the way InfoDock ;;; initializes the Hyperbole menu. (defconst infodock-hyperbole-menu (delq nil (list "Hyperbole" - '["Browse-Manual" (id-info "(hyperbole.info)Top") t] + '["About" (hypb:display-file-with-logo + (expand-file-name "ABOUT" hyperb:dir)) t] + '["Manual" (id-info "(hyperbole.info)Top") t] "----" - '["Activate-Button-at-Point" hui:hbut-act t] + '["Activate-Button-at-Point" hui:hbut-current-act t] '["Back-to-Prior-Location" (hhist:remove current-prefix-arg) t] '("Button-File" ["Manual" (id-info "(hyperbole.info)Button Files") t] @@ -65,6 +140,7 @@ (expand-file-name hbmap:filename hbmap:dir-user)) t] ) + (cons "Customization" hui-menu-options) '("Documentation" ["Manual" (id-info "(hyperbole.info)Top") t] "----" @@ -84,9 +160,8 @@ ["Smart-Key-Summary" (id-browse-file (hypb:mouse-help-file)) t] ) '("Explicit-Button" - ["Manual" (id-info "(hyperbole.info)Explicit Buttons") t] - "----" - ["Activate-at-Point" hui:hbut-act t] + :filter hui-menu-explicit-buttons + ["Activate" hui:hbut-act t] ["Create" hui:ebut-create t] ["Delete" hui:ebut-delete t] ["Edit" hui:ebut-modify t] @@ -102,9 +177,7 @@ ["Search" hui:ebut-search t] ) '("Global-Button" - ["Manual" (id-info "(hyperbole.info)Global Buttons") t] - "----" - ["Activate" gbut:act t] + :filter hui-menu-global-buttons ["Create" hui:gbut-create t] ["Edit" hui:gbut-modify t] ["Help" gbut:help t] @@ -113,7 +186,7 @@ '("Implicit-Button" ["Manual" (id-info "(hyperbole.info)Implicit Buttons") t] "----" - ["Activate-at-Point" hui:hbut-act t] + ["Activate-at-Point" hui:hbut-current-act t] ["Delete-Type" (hui:htype-delete 'ibtypes) t] ["Help" hui:hbut-help t] ["Types" (hui:htype-help 'ibtypes 'no-sort) t] @@ -123,13 +196,13 @@ t] "----" ["Change-Hyperbole-Address" - (hmail:compose "hyperbole-request@hub.ucsb.edu" + (hmail:compose "hyperbole-request@infodock.com" '(hact 'hyp-request)) t] ["Change-Hyperbole-Announce-Address" - (hmail:compose "hyperbole-request@hub.ucsb.edu" + (hmail:compose "hyperbole-request@infodock.com" '(hact 'hyp-request)) t] ["Mail-to-Hyperbole-List" - (hmail:compose "hyperbole@hub.ucsb.edu" '(hact 'hyp-config)) t] + (hmail:compose "hyperbole@infodock.com" '(hact 'hyp-config)) t] ) (if hyperb:kotl-p '("Outline" @@ -191,6 +264,71 @@ ))) ;;; ************************************************************************ +;;; Private functions +;;; ************************************************************************ + +(defvar hui-menu-max-list-length 24 + "Positive integer that caps the length of a dynamic menu list.") + +(defvar hui-menu-order-explicit-buttons t + "When non-nil (default), explicit button menu list is lexicographically ordered. +Otherwise, explicit buttons are listed in their order of appearance within +the current buffer.") + +;; List explicit buttons in the current buffer for menu activation. +(defun hui-menu-explicit-buttons (rest-of-menu) + (delq nil + (append + '(["Manual" (id-info "(hyperbole.info)Explicit Buttons") t] + "----") + (let ((labels (ebut:list)) + (cutoff)) + (if labels + (progn + ;; Cutoff list if too long. + (if (setq cutoff (nthcdr (1- hui-menu-max-list-length) labels)) + (setcdr cutoff nil)) + (delq nil + (append + '("----" + ["Alphabetize-List" + (setq hui-menu-order-explicit-buttons + (not hui-menu-order-explicit-buttons)) + :style toggle :selected hui-menu-order-explicit-buttons] + "Activate:") + (mapcar (function (lambda (label) + (vector label `(ebut:act ,label) t))) + (if hui-menu-order-explicit-buttons + (sort labels 'string-lessp) + labels)) + (if cutoff '(". . .")) + '("----" "----")))))) + rest-of-menu))) + +;; List existing global buttons for menu activation. +(defun hui-menu-global-buttons (rest-of-menu) + (delq nil + (append + '(["Manual" (id-info "(hyperbole.info)Global Buttons") t] + "----") + (let ((labels (gbut:label-list)) + (cutoff)) + (if labels + (progn + ;; Cutoff list if too long. + (if (setq cutoff (nthcdr (1- hui-menu-max-list-length) labels)) + (setcdr cutoff nil)) + (delq nil + (append + '("----" "Activate:") + (mapcar (function (lambda (label) + (vector label `(gbut:act ,label) t))) + (sort labels 'string-lessp)) + (if cutoff '(". . .")) + '("----" "----")))))) + rest-of-menu))) + +;;; ************************************************************************ ;;; Private variables ;;; ************************************************************************
--- a/lisp/hyperbole/hui-mini.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hui-mini.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,15 +6,15 @@ ;; KEYWORDS: hypermedia, mouse ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 15-Oct-91 at 20:13:17 -;; LAST-MOD: 3-Nov-95 at 04:02:02 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 11:30:44 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. +;; Copyright (C) 1991-1997, Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: @@ -60,6 +60,8 @@ "Activates button at point or prompts for explicit button.") '("Butfile/" (menu . butfile) "Quick access button files menus.") + '("Cust/" (menu . cust) + "Customizes Hyperbole by setting major options.") '("Doc/" (menu . doc) "Quick access to Hyperbole documentation.") '("Ebut/" (menu . ebut) @@ -91,8 +93,49 @@ (expand-file-name hbmap:filename hbmap:dir-user)) "Edits user-specific button file.") )) + '(cust . + (("Customize>") + ("Referent-Display/" (menu . cust-referents) + "Sets where referents are displayed.") + ("Smart-Key-at-Eol/" (menu . cust-eol) + "Sets how scrolling via end of line presses works.") + ("URL-Display/" (menu . cust-urls) "Sets where URLs are displayed."))) + '(cust-eol . + (("Smart Key press at eol scrolls>") + ("Proportionally" (setq smart-scroll-proportional t)) + ("Windowful" (setq smart-scroll-proportional nil)))) + '(cust-referents . + (("Ref display>") + ("Any-Frame" (setq hpath:display-where 'other-frame)) + ("Current-Win" (setq hpath:display-where 'this-window)) + ("Diff-Frame-One-Win" + (setq hpath:display-where 'other-frame-one-window)) + ("New-Frame" (setq hpath:display-where 'new-frame)) + ("Other-Win" (setq hpath:display-where 'other-window)) + ("Single-Win" (setq hpath:display-where 'one-window)))) + '(cust-urls . + (("URL display>") + ("Any-Netscape-Window" + (setq action-key-url-function 'highlight-headers-follow-url-netscape + highlight-headers-follow-url-function action-key-url-function + highlight-headers-follow-url-netscape-new-window nil)) + ("New-Netscape-Window" + (setq action-key-url-function 'highlight-headers-follow-url-netscape + highlight-headers-follow-url-function action-key-url-function + highlight-headers-follow-url-netscape-new-window t)) + ("Mosaic" (setq action-key-url-function + 'highlight-headers-follow-url-mosaic + highlight-headers-follow-url-function + action-key-url-function)) + ("W3-Browser" + (setq action-key-url-function 'w3-fetch + highlight-headers-follow-url-function + action-key-url-function)))) '(doc . (("Doc>") + ("About" (hypb:display-file-with-logo + (expand-file-name "ABOUT" hyperb:dir)) + "Overview of Hyperbole and InfoDock Associates.") ("Demo" (find-file-read-only (expand-file-name "DEMO" hyperb:dir)) "Demonstrates Hyperbole features.") @@ -157,7 +200,7 @@ )) '(ibut . (("IButton>") - ("Act" hui:hbut-act "Activates implicit button at point.") + ("Act" hui:hbut-current-act "Activates implicit button at point.") ("DeleteIButType" (hui:htype-delete 'ibtypes) "Deletes specified button type.") ("Help" hui:hbut-help "Reports on button's attributes.") @@ -169,14 +212,14 @@ '(msg . (("Msg>") ("Compose-Hypb-Mail" - (hmail:compose "hyperbole@hub.ucsb.edu" '(hact 'hyp-config)) + (hmail:compose "hyperbole@infodock.com" '(hact 'hyp-config)) "Send a message to the Hyperbole discussion list.") ("Edit-Hypb-List-Entry" - (hmail:compose "hyperbole-request@hub.ucsb.edu" + (hmail:compose "hyperbole-request@infodock.com" '(hact 'hyp-request)) "Add, remove or change your entry on a the Hyperbole mail list.") ("Modify-Hypb-Announce-Entry" - (hmail:compose "hyperbole-announce-request@hub.ucsb.edu" + (hmail:compose "hyperbole-announce-request@infodock.com" '(hact 'hyp-request)) "Add, remove or change your entry on the Hyperbole Announce mail list.") ))
--- a/lisp/hyperbole/hui-mouse.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hui-mouse.el Mon Aug 13 09:15:11 2007 +0200 @@ -8,10 +8,10 @@ ;; KEYWORDS: hypermedia, mouse ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 04-Feb-89 -;; LAST-MOD: 1-Nov-95 at 20:45:57 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 11:55:00 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. @@ -81,9 +81,16 @@ ((hargs:select-p hkey-value) . (hargs:select-p hkey-value 'assist))) ;; + ;; The ID-edit package supports rapid killing, copying, yanking and + ;; display management. It is available only as a part of InfoDock. + ;; It is not included with Hyperbole. + ((and (boundp 'id-edit-mode) id-edit-mode + (not buffer-read-only)) . + ((id-edit-yank) . (id-edit-yank))) + ;; ((if (not (eobp)) - (or (eolp) (if selective-display - (= (following-char) ?\^M)))) . + (or (eolp) (if selective-display + (= (following-char) ?\^M)))) . ((smart-scroll-up) . (smart-scroll-down))) ;; ((eq major-mode 'smart-menu-mode) . @@ -93,8 +100,9 @@ ((if (fboundp 'hbut:at-p) (or (hbut:at-p) (hbut:label-p))) . ((hui:hbut-act 'hbut:current) . (hui:hbut-help 'hbut:current))) ;; - ;; The Smart Menu system provides menus within Emacs running on a dumb - ;; terminal. It is part of InfoDock and is not available separately. + ;; The Smart Menu system provides menus within Emacs on a dumb terminal. + ;; It is a part of InfoDock, but may also be obtained as a separate + ;; package. It is not included with Hyperbole. ((and (fboundp 'smart-menu-choose-menu) (setq hkey-value (and hkey-always-display-menu (smart-menu-choose-menu))) @@ -120,8 +128,8 @@ ((eq major-mode 'kotl-mode) . ((kotl-mode:action-key) . (kotl-mode:help-key))) ;; - ;; Support direct selection and viewing on in-memory relational databases. - ;; Rdb-mode has not been publicly released. + ;; Rdb-mode Supports direct selection and viewing on in-memory relational + ;; databases. Rdb-mode is available only as a part of InfoDock. ;; It is not included with Hyperbole. ((eq major-mode 'rdb-mode) . ((smart-rdb) . (smart-rdb-assist))) ;; @@ -129,44 +137,38 @@ ((if (= (point) (point-max)) (string-match "Help\\*$" (buffer-name))) . ((hkey-help-hide) . (hkey-help-hide))) ;; - ;; Support the OO-Browser, a part of InfoDock, XEmacs, and soon to be a - ;; part of Emacs. - ((or (br-in-browser) (eq major-mode 'br-mode)) . - ((smart-br-dispatch) . (smart-br-assist-dispatch))) - ;; ((and (memq major-mode '(c-mode c++-c-mode)) - buffer-file-name (setq hkey-value (smart-c-at-tag-p))) . + buffer-file-name (smart-c-at-tag-p)) . ((smart-c) . (smart-c nil 'next-tag))) ;; ((and (eq major-mode 'asm-mode) - buffer-file-name (setq hkey-value (smart-asm-at-tag-p))) . + buffer-file-name (smart-asm-at-tag-p)) . ((smart-asm) . (smart-asm nil 'next-tag))) ;; ((if (smart-lisp-mode-p) (smart-lisp-at-tag-p)) . ((smart-lisp) . (smart-lisp 'next-tag))) ;; + ((and (eq major-mode 'java-mode) buffer-file-name + (or (smart-java-at-tag-p) + ;; Also handle Java @see cross-references. + (looking-at "@see[ \t]+") + (save-excursion + (and (re-search-backward "[@\n\r\f]" nil t) + (looking-at "@see[ \t]+"))))) . + ((smart-java) . (smart-java nil 'next-tag))) + ;; ((and (eq major-mode 'c++-mode) buffer-file-name ;; Don't use smart-c++-at-tag-p here since it will prevent #include ;; lines from matching. - (setq hkey-value (smart-c-at-tag-p))) . - ( ;; Only fboundp if OO-Browser has been loaded. - (if (fboundp 'c++-to-definition) - (smart-c++-oobr) (smart-c++)) . - (if (fboundp 'c++-to-definition) - (smart-c++-oobr) - (smart-c++ nil 'next-tag)))) + (smart-c-at-tag-p)) . + ((smart-c++) . (smart-c++ nil 'next-tag))) ;; ((and (eq major-mode 'objc-mode) buffer-file-name - (setq hkey-value (smart-objc-at-tag-p))) . - ( ;; Only fboundp if OO-Browser has been loaded. - (if (fboundp 'objc-to-definition) - (smart-objc-oobr) (smart-objc)) . - (if (fboundp 'objc-to-definition) - (smart-objc-oobr) - (smart-objc nil 'next-tag)))) + (smart-objc-at-tag-p)) . + ((smart-objc) . (smart-objc nil 'next-tag))) ;; ((and (eq major-mode 'fortran-mode) - buffer-file-name (setq hkey-value (smart-fortran-at-tag-p))) . + buffer-file-name (smart-fortran-at-tag-p)) . ((smart-fortran) . (smart-fortran nil 'next-tag))) ;; ((eq major-mode 'occur-mode) . @@ -226,6 +228,11 @@ ((eq major-mode 'gomoku-mode) . ((gomoku-human-plays) . (gomoku-human-takes-back))) ;; + ;; Support the OO-Browser, a part of InfoDock and XEmacs, and an add on + ;; to Emacs. It is not included with Hyperbole. + ((or (br-in-browser) (eq major-mode 'br-mode)) . + ((smart-br-dispatch) . (smart-br-assist-dispatch))) + ;; ;; Outline minor mode is on and usable. (selective-display . ((smart-outline) . (smart-outline-assist))) @@ -426,7 +433,7 @@ (dired-do-flagged-delete)) (t (error "(smart-dired): No Dired expunge function."))) (dired-quit)))) - (t (hpath:find-other-window (dired-get-filename))))) + (t (hpath:find (dired-get-filename))))) (defun smart-dired-assist () "Uses a single assist-key or mouse assist-key to manipulate directory entries.
--- a/lisp/hyperbole/hui.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hui.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,15 +6,15 @@ ;; KEYWORDS: hypermedia ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 19-Sep-91 at 21:42:03 -;; LAST-MOD: 25-Aug-95 at 02:26:56 by Bob Weiner +;; LAST-MOD: 10-Nov-96 at 01:51:13 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. +;; Copyright (C) 1991-1996, Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: @@ -287,7 +287,7 @@ (find-file-noselect gbut:file) "gbut-modify") (hbut:label-to-key (hargs:read-match "Global button to modify: " - (mapcar 'list (gbut:lbl-list)) + (mapcar 'list (gbut:label-list)) nil t nil 'ebut))))) (let ((lbl (hbut:key-to-label lbl-key)) (but-buf (find-file-noselect gbut:file)) @@ -342,6 +342,16 @@ (t (or but (setq but 'hbut:current)) (hui:but-flash) (hyperb:act but)))) +(defun hui:hbut-current-act () + "Activate Hyperbole button at point or signal an error if there is no such button." + (interactive) + (let ((but (hbut:at-p))) + (cond ((null but) + (hypb:error "(hbut-act): No current button to activate.")) + ((not (hbut:is-p but)) + (hypb:error "(hbut-act): Button is invalid; it has no attributes.")) + (t (hui:but-flash) (hyperb:act but))))) + (defun hui:hbut-help (&optional but) "Checks for and explains an optional button given by symbol, BUT. BUT defaults to the button whose label point is within." @@ -756,7 +766,7 @@ (names (htype:names htype-sym)) (term (hargs:read-match (concat (capitalize tstr) - " to describe (RTN for all): ") + " to describe (RET for all): ") (mapcar 'list (cons "" names)) nil t nil htype-sym)) nm-list
--- a/lisp/hyperbole/hversion.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hversion.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,6 +1,6 @@ ;;!emacs ;; -;; LCD-ENTRY: hyperbole|Bob Weiner|hyperbole@hub.ucsb.edu|Everyday Info Manager|03-Nov-95|4.01|ftp.cs.uiuc.edu:/pub/xemacs/infodock/ +;; LCD-ENTRY: hyperbole|Bob Weiner|hyperbole@infodock.com|Everyday Info Manager|21-Feb-97|4.021|ftp://ftp.xemacs.org/pub/infodock ;; ;; FILE: hversion.el ;; SUMMARY: Hyperbole version, system and load path information. @@ -8,15 +8,15 @@ ;; KEYWORDS: hypermedia ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 1-Jan-94 -;; LAST-MOD: 3-Nov-95 at 23:08:37 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 18:03:57 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1994, 1995 Free Software Foundation, Inc. +;; Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: @@ -26,7 +26,7 @@ ;;; Public variables ;;; ************************************************************************ -(defconst hyperb:version "04.01" "Hyperbole revision number.") +(defconst hyperb:version "04.021" "Hyperbole revision number.") ;;; Support button highlighting and flashing under XEmacs. ;;; @@ -60,7 +60,7 @@ (if (string< epoch::version "Epoch 4") "V3" "V4")) "Simplified version string under Epoch, e.g. \"V4\", or nil") -;; Koutlines work only with specific versions of Emacs 19 and XEmacs. +;;; Koutlines work only with specific versions of Emacs 19 and XEmacs. (defconst hyperb:kotl-p (if hyperb:lemacs-p ;; Only works for XEmacs 19.9 and above. @@ -70,23 +70,30 @@ hyperb:emacs19-p) "Non-nil iff this Emacs version supports the Hyperbole outliner.") +;;; Account for what rain all year round and working for two ex-Harvard guys +;;; will do to programmers. +(defvar hyperb:microcruft-os-p + (memq system-type '(ms-windows windows-nt ms-dos)) + "T iff Hyperbole is running under a Microcruft OS.") + (defun sm-window-sys-term () "Returns the first part of the term-type if running under a window system, else nil. Where a part in the term-type is delimited by a '-' or an '_'." - (let ((term (cond ((memq window-system '(x ns dps pm)) - ;; X11, NEXTSTEP (DPS), or OS/2 Presentation Manager (PM) - (cond (hyperb:emacs19-p "emacs19") - (hyperb:lemacs-p "lemacs") - (hyperb:epoch-p "epoch") - (t "xterm"))) - ((or (featurep 'eterm-fns) - (equal (getenv "TERM") "NeXT") - (equal (getenv "TERM") "eterm")) - ;; NEXTSTEP add-on support to Emacs - "next") - ((or window-system - (featurep 'sun-mouse) (featurep 'apollo)) - (getenv "TERM"))))) + (let* ((display-type (if (fboundp 'device-type) (device-type) window-system)) + (term (cond ((memq display-type '(x ns dps pm win32)) + ;; X11, NEXTSTEP (DPS), or OS/2 Presentation Manager (PM) + (cond (hyperb:emacs19-p "emacs19") + (hyperb:lemacs-p "lemacs") + (hyperb:epoch-p "epoch") + (t "xterm"))) + ((or (featurep 'eterm-fns) + (equal (getenv "TERM") "NeXT") + (equal (getenv "TERM") "eterm")) + ;; NEXTSTEP add-on support to Emacs + "next") + ((or display-type + (featurep 'sun-mouse) (featurep 'apollo)) + (getenv "TERM"))))) (and term (substring term 0 (string-match "[-_]" term)))))
--- a/lisp/hyperbole/hvm.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hvm.el Mon Aug 13 09:15:11 2007 +0200 @@ -9,7 +9,7 @@ ;; ORG: Brown U. ;; ;; ORIG-DATE: 10-Oct-91 at 01:51:12 -;; LAST-MOD: 23-Jun-95 at 14:55:05 by Bob Weiner +;; LAST-MOD: 31-Oct-96 at 22:36:19 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. @@ -22,7 +22,7 @@ ;; Automatically configured for use in "hyperbole.el". ;; If hsite loading fails prior to initializing Hyperbole Vm support, ;; -;; {M-x Vm-init RTN} +;; {M-x Vm-init RET} ;; ;; will do it. ;;
--- a/lisp/hyperbole/hypb.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hypb.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,15 +6,15 @@ ;; KEYWORDS: extensions, hypermedia ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 6-Oct-91 at 03:42:38 -;; LAST-MOD: 30-Oct-95 at 21:23:19 by Bob Weiner +;; LAST-MOD: 19-Feb-97 at 12:18:08 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. +;; Copyright (C) 1991-1995, 1997 Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: @@ -82,7 +82,7 @@ (concat "{" (if (string= keys "") (concat (funcall get-keys 'execute-extended-command nil) - " " (symbol-name cmd-sym) " RTN") + " " (symbol-name cmd-sym) " RET") keys) "}")) (error "(hypb:cmd-key-string): Invalid cmd-sym arg: %s." cmd-sym))) @@ -425,7 +425,7 @@ ) (defun hypb:replace-match-string (regexp str newtext &optional literal) - "Replaces all matches for REGEXP in STR with NEWTEXT string. + "Replaces all matches for REGEXP in STR with NEWTEXT string and returns the result. Optional LITERAL non-nil means do a literal replacement. Otherwise treat \\ in NEWTEXT string as special: \\& means substitute original matched text, @@ -535,6 +535,53 @@ (and (fboundp 'byte-code-function-p) (byte-code-function-p obj)))) ;;; ************************************************************************ +;;; About Hyperbole Setup +;;; ************************************************************************ + +;;;###autoload +(defun hypb:display-file-with-logo (&optional file) + "Display an optional text FILE with the InfoDock Associates logo prepended. +Without file, logo is prepended to the current buffer." + ;; + (if file + ;; This function is defined in hversion.el when needed. + (id-browse-file file)) + (if (next-extent (current-buffer)) + ;; Images have already been inserted, don't do it again. + nil + (let* ((ida-logo (make-glyph (expand-file-name "ida-logo.xpm" data-directory))) + (buffer-read-only) + extent) + (goto-char (point-min)) + (indent-to (startup-center-spaces ida-logo)) + (insert "\n\n") + (setq extent (make-extent (- (point) 3) (- (point) 2))) + (set-extent-end-glyph extent ida-logo) + (set-extent-property extent 'help-echo "Visit InfoDock Associates") + (set-extent-property extent 'keymap hypb:ida-logo-keymap)) + (goto-char (point-min)) + (skip-syntax-forward "-") + (set-window-start (selected-window) 1) + (set-buffer-modified-p nil))) + +(defvar hypb:ida-logo-keymap + (let ((map (make-sparse-keymap))) + (define-key map 'button1 'hypb:ida-home-page) + (define-key map 'button2 'hypb:ida-home-page) + (define-key map '(return) 'hypb:ida-home-page) + map) + "Keymap used when on the InfoDock Associates logo glyph.") + +(defun hypb:ida-home-page () + "Visit InfoDock Associates home web page." + (interactive) + (funcall + (if (boundp 'highlight-headers-follow-url-function) + highlight-headers-follow-url-function + 'w3-fetch) + "http://www.infodock.com/")) + +;;; ************************************************************************ ;;; Private functions ;;; ************************************************************************
--- a/lisp/hyperbole/hyperbole.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/hyperbole.el Mon Aug 13 09:15:11 2007 +0200 @@ -8,15 +8,15 @@ ;; KEYWORDS: hypermedia ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola, Inc., PWDG +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 6-Oct-92 at 11:52:51 -;; LAST-MOD: 3-Nov-95 at 23:14:52 by Bob Weiner +;; LAST-MOD: 19-Feb-97 at 10:57:44 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; -;; Copyright (C) 1992-1995, Free Software Foundation, Inc. +;; Copyright (C) 1992-1996, Free Software Foundation, Inc. ;; Developed with support from Motorola Inc. ;; ;; DESCRIPTION: @@ -314,15 +314,16 @@ ;;; Hyperbole system. ;; Action type definitions. -(autoload 'defact "hsite" +(autoload 'defact "hsite" "Creates an action TYPE (an unquoted symbol) with PARAMS, described by DOC." nil 'macro) ;; Implicit button type definitions. -(autoload 'defib "hsite" +(autoload 'defib "hsite" "Creates implicit button TYPE (unquoted sym) with PARAMS, described by DOC." nil 'macro) (autoload 'ebut:map "hsite" "Map over Hyperbole buffer buttons." nil) +(autoload 'hbut:key-src "hsite" "Called by {e} command in rolo match buffer.") (autoload 'hui:ebut-rename "hsite" "Rename a Hyperbole button." t) (autoload 'hyperbole "hsite" "Hyperbole info manager menus." t) @@ -354,12 +355,15 @@ "Make PATH absolute from optional DEFAULT-DIRS." nil) (autoload 'hpath:find "hsite" "Edit file FILENAME, possibly using a special command." t) +(autoload 'hpath:find-other-frame "hsite" + "Edit file FILENAME in other frame, possibly using a special command." t) (autoload 'hpath:find-other-window "hsite" "Edit file FILENAME in other window, possibly using a special command." t) ;;; Hyperbole entry points that trigger loading part of the system. (autoload 'hypb:functionp "hypb" "Return t iff OBJ is a function." nil) +(autoload 'hypb:display-file-with-logo "hypb" "Display FILE with IDA logo." nil) ;;; Hyperbole msg reader autoloads. (autoload 'Rmail-init "hrmail" "Initializes Hyperbole Rmail support." t) @@ -426,11 +430,10 @@ (autoload 'smart-lisp-mode-p "hmouse-tag" "Jumps to Lisp identifier definitions.") (autoload 'smart-c++ "hmouse-tag" "Jumps to C++ identifier definitions.") -;; Does nothing unless OO-Browser C++ support has been loaded. -(autoload 'smart-c++-oobr "hmouse-tag" "Jumps to C++ identifier definitions.") +(autoload 'smart-fortran-at-tag-p "hmouse-tag" "Jumps to Fortran identifier definitions.") +(autoload 'smart-java "hmouse-tag" "Jumps to Java identifier definitions.") +(autoload 'smart-java-at-tag-p "hmouse-tag" "Jumps to Java identifier definitions.") (autoload 'smart-objc "hmouse-tag" "Jumps to Objective-C identifier definitions.") -;; Does nothing unless OO-Browser Objective-C support has been loaded. -(autoload 'smart-objc-oobr "hmouse-tag" "Jumps to Objective-C identifier definitions.") (autoload 'smart-tags-file "hmouse-tag" "Determines nearest etags file.") (autoload 'smart-tags-file-path "hmouse-tag" "Expands a filename from TAGS file.") @@ -501,4 +504,8 @@ (intern-soft (concat "screen" func-name)))))) '("-width" "-height"))) +;;; ************************************************************************ +;;; Register Hyperbole Package +;;; ************************************************************************ + (provide 'hyperbole)
--- a/lisp/hyperbole/kotl/EXAMPLE.kotl Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/kotl/EXAMPLE.kotl Mon Aug 13 09:15:11 2007 +0200 @@ -1,26 +1,32 @@ ;; -*- Mode: kotl -*- "Kotl-4.0" ;; file-format - 1 The outliner is a part of the Hyperbole information management system. - It produces hierarchically structured files consisting of trees of - cells. + 1 The Koutliner is a part of the Hyperbole information management system. + InfoDock Associates, the developer of Hyperbole and InfoDock (an + industrial quality turn-key version of XEmacs), sells high quality + commercial support, training, books and custom package development for + InfoDock, XEmacs or GNU Emacs on a variety of platforms. Contact us at + <info@infodock.com> or visit our web site at http://www.infodock.com. - 1a A cell is an element of the outline which has its own display label + 2 The Koutliner produces hierarchically structured files consisting of + trees of cells. + + 2a A cell is an element of the outline which has its own display label and unique, permanent identifier (idstamp). - 1b Idstamps support the creation of hyperlinks to cells which are + 2b Idstamps support the creation of hyperlinks to cells which are maintained as the structure of an outline changes. - 2 Features implemented include: + 3 Features implemented include: - 2a Full on screen editing (just like a Macintosh). Click to type in a + 3a Full on screen editing (just like a Macintosh). Click to type in a node (we call them cells) and just enter text. Structure is automatically maintained for you. All of the standard Emacs editor command set is supported both through keyboard and mouse interaction. - 2b Advanced outline processing + 3b Advanced outline processing - 2b1 Autonumbering: Full auto-numbering in Augment (1a2) or legal + 3b1 Autonumbering: Full auto-numbering in Augment (1a2) or legal (1.1.2) formats. Augment style is the default. Single level autonumbering (only the last part of the level number is shown), as commonly seen in outliner products, is also available, though @@ -28,7 +34,7 @@ {C-c C-l ?} to see the full set of label types and to select a different label type. - 2b2 Label Separators: By default, the outliner separates labels from + 3b2 Label Separators: By default, the outliner separates labels from cell contents by two spaces. If you want to change the separator for the current outline, use {C-c M-l}. {C-u C-c M-l} will additionally change the default separator value used when new @@ -36,18 +42,18 @@ trailing period after each cell label. The separator must be at least two characters long. - 2b3 Cell Creation: {C-j} adds a new cell as a sibling following the + 3b3 Cell Creation: {C-j} adds a new cell as a sibling following the current cell. A non-negative prefix argument, {C-u C-j} or {C-c a} adds the cell as a child of the current cell. {C-c p} adds the cell as the sibling of the current cell's parent. - 2b4 Cell and Tree Deletion: {C-c C-k} kills the current cell and its + 3b4 Cell and Tree Deletion: {C-c C-k} kills the current cell and its entire subtree. {C-c k} kills the contents of a cell from point through the end of the cell. {C-u C-c k} kills the entire contents of the cell regardless of the location of point. You may then yank the contents into another cell with {C-y}. - 2b5 Tree Demotion and Promotion: Trees may be demoted or promoted by + 3b5 Tree Demotion and Promotion: Trees may be demoted or promoted by hitting {TAB} or {M-TAB} respectively, as in most outliners today (their sub-levels move with them). {M-0 TAB} and {M-0 M-TAB} will demote and promote trees and will additionally refill each cell @@ -56,7 +62,7 @@ You can also use a command line interface and either enter cell ids or select the cells to operate upon by using your mouse. - 2b6 Cell and Tree Filling: {M-q} or {M-j} refills a paragraph within a + 3b6 Cell and Tree Filling: {M-q} or {M-j} refills a paragraph within a cell so that its lines wrap within the current margin settings. {C-c M-q} or {C-c M-j} refills all paragraphs within a cell. {C-M-q} or {C-M-j} refills all cells within a tree. @@ -65,7 +71,7 @@ promoting, demoting, exchanging, splitting and appending cells to also automatically refill each cell. - 2b7 Cursor Movement: In addition to normal Emacs movement commands, + 3b7 Cursor Movement: In addition to normal Emacs movement commands, you can move within a cell or from one cell or tree to another. {C-c ,} - Move to the beginning of the current cell. @@ -87,7 +93,7 @@ {C-c ^} - Move to the level 1 root of the current tree. {C-c $} - Move to the last cell in the tree rooted at point. - 2b8 Tree Movement and Copying: Entire outline trees can be moved or + 3b8 Tree Movement and Copying: Entire outline trees can be moved or copied with single commands. Simply invoke the desired command and then double click with the Action Key on the desired root cell for each argument for which you are prompted. @@ -117,13 +123,13 @@ of the root cell of the tree to move and then double click within the body of the root cell of the tree you want it to follow. - 2b9 Cell Transposition: The move and copy commands rearrange entire + 3b9 Cell Transposition: The move and copy commands rearrange entire trees. The following two commands exchange the locations of two cells. - 2b9a {C-c e} prompts for two cell addresses and exchanges the cells. + 3b9a {C-c e} prompts for two cell addresses and exchanges the cells. - 2b9b {C-c t} does not prompt. It exchanges the current and + 3b9b {C-c t} does not prompt. It exchanges the current and preceding cells. If there is no preceding cell it exchanges the current and next cell. @@ -135,7 +141,7 @@ there are fewer visible, it makes the current cell the last cell in the outline. - 2b10 Cell Splitting: You can split one cell into two adjacent cells + 3b10 Cell Splitting: You can split one cell into two adjacent cells with {C-c s}. This leaves the cell contents preceding point in the current cell, minus any trailing whitespace, and moves the contents following point to a new sibling cell which is inserted @@ -145,15 +151,15 @@ All cell attributes in the original cell are propagated to the new one. - 2b11 Cell Appending: {C-c +} appends the contents of a specified cell + 3b11 Cell Appending: {C-c +} appends the contents of a specified cell to the end of another cell. - 2b12 Hiding and Showing: Individual cells, branches, or particular + 3b12 Hiding and Showing: Individual cells, branches, or particular levels in the outline may be hidden or shown. These commands work even when an outline buffer is read-only, e.g. when its file is not checked out of a version control system yet. - 2b12a {C-c C-h} - Hide (collapse) tree rooted at point. + 3b12a {C-c C-h} - Hide (collapse) tree rooted at point. {C-c C-s} - Show (expand) tree rooted at point. {C-c C-a} - Show (expand) all cells in the outline. @@ -168,11 +174,11 @@ {C-c C-t} - Top-level, hide all cells below level 1 and show only the first line of each level 1 cell. - 2b12b A click or press of the Action Key within a cell's body, but + 3b12b A click or press of the Action Key within a cell's body, but not on a button, toggles between hiding and showing the tree rooted at point. - 2b13 Cell Identifiers: Permanent ids are associated with each cell and + 3b13 Cell Identifiers: Permanent ids are associated with each cell and can be used in hyperlinks that are maintained as cells are reordered in a file. (These ids may also be displayed in place of the outline level relative ids. Use {C-c C-l id RET}.) Permanent @@ -181,7 +187,7 @@ Permanent ids always begin with a 0, as in 012, to distinguish them from relative ids. - 2b14 Cell Attributes: Each cell has its own attribute list. The + 3b14 Cell Attributes: Each cell has its own attribute list. The attribute lists for the cells in the tree rooted at point can be displayed by pressing the Assist Key. {C-c h} prompts for a kcell id and displays its attributes. {C-u C-c h} prompts for a kcell @@ -192,27 +198,27 @@ Use {C-c C-i} to add an attribute or to modify an existing attribute to the cell at point. - 2b15 File Insertion: The elements of another buffer or file may be + 3b15 File Insertion: The elements of another buffer or file may be inserted into a koutline as a set of cells by using the {C-x i} command. When prompted, you may use a buffer name or file name from which to insert. - 2b15a The cells will be inserted as the successors of the current + 3b15a The cells will be inserted as the successors of the current cell unless {C-u C-x i} is used and then they are inserted as the initial children of the current cell. - 2b15b See the documentation for the variables, kimport:mode-alist and + 3b15b See the documentation for the variables, kimport:mode-alist and kimport:suffix-alist, for information on mode and suffix-specific conversions performed on files before they are inserted. This same conversion process applies if you invoke {M-x kotl-mode RET} in a non-koutline buffer or if you perform a generic file import as described in <@ 2b16>. - 2b15c Use {M-x kotl-mode:insert-file-contents RET} to insert the + 3b15c Use {M-x kotl-mode:insert-file-contents RET} to insert the entire contents of a file into the current cell at the location of point. - 2b16 File Importation: The outliner presently supports conversion of + 3b16 File Importation: The outliner presently supports conversion of three types of files into koutline files. You can choose to import a file into an existing koutline, following the tree at point, or to create a new koutline of the imported file contents. @@ -221,13 +227,13 @@ the following commands if you want to control the type of importation explicitly. - 2b16a Text Files + 3b16a Text Files - 2b16a1 In a text buffer, use {M-x kotl-mode RET} to convert + 3b16a1 In a text buffer, use {M-x kotl-mode RET} to convert the buffer into a koutline in-place. You will lose the old format of the buffer when you do this. - 2b16a2 Use {M-x kimport:text RET} and you will be prompted for a + 3b16a2 Use {M-x kimport:text RET} and you will be prompted for a text buffer or file to import and the new koutline buffer or file to create from its text. It will also import the contents, attributes and level structure of cells from a @@ -235,13 +241,13 @@ With this command, your original file remains intact. - 2b16b Star Outline Files: Star outlines are standard Emacs outlines + 3b16b Star Outline Files: Star outlines are standard Emacs outlines where each entry begins with one or more asterisk characters. Use {M-x kimport:star-outline RET} and you will be prompted for the star outline buffer or file to import and the new koutline buffer or file to create. - 2b16c Augment Files Numbered on the Right-Side: (Skip this if you are + 3b16c Augment Files Numbered on the Right-Side: (Skip this if you are unfamiliar with this sort of file.) Files exported from the Augment system as text often have alphanumeric statement identifiers on the right side. @@ -250,36 +256,36 @@ for the augment buffer or file to import and the koutline to create. - 2b17 View Specification: Flexible views of outlines may be specified + 3b17 View Specification: Flexible views of outlines may be specified with succinct single character codes. - 2b17a The current view spec is shown in the modeline after the buffer + 3b17a The current view spec is shown in the modeline after the buffer name, delimited by <|>. - 2b17b The current view spec is saved whenever the outline is saved. + 3b17b The current view spec is saved whenever the outline is saved. The next time the outline is read in, this will be the initial view. The standard initial viewspec is <|ben>. - 2b17c {C-c C-v} prompts for a view spec string in which the following + 3b17c {C-c C-v} prompts for a view spec string in which the following codes are valid. Any invalid characters in a view spec are ignored. - 2b17c1 a: Show all cell levels and all lines in cells. + 3b17c1 a: Show all cell levels and all lines in cells. - 2b17c2 b: Turn on blank lines between cells. Without this code, + 3b17c2 b: Turn on blank lines between cells. Without this code, blank lines will be turned off. You can also use the {C-c b} key binding to toggle line numbers on and off independent of any other view settings. - 2b17c3 cN: Hide any lines greater than N in each cell. 0 means + 3b17c3 cN: Hide any lines greater than N in each cell. 0 means don't cutoff any lines. - 2b17c4 e: Show ellipses when some content is hidden. + 3b17c4 e: Show ellipses when some content is hidden. - 2b17c5 lN: Hide cells at levels deeper than N. 0 means don't hide + 3b17c5 lN: Hide cells at levels deeper than N. 0 means don't hide any cells. - 2b17c6 n: Turn on the default label type. + 3b17c6 n: Turn on the default label type. n0: Display idstamps. n1: Display alpha labels. n2: Display partial alpha labels (don't use this). @@ -287,35 +293,35 @@ n*: Display star labels. n~: Turn off labels. (n viewspec is removed from modeline). - 2b17d Try a view spec of 'c2l1' to turn off blank lines, to clip each + 3b17d Try a view spec of `c2l1' to turn off blank lines, to clip each cell after its second line, and to hide all cells below level one. - 2c Hyperlinks may be embedded in cells and may refer to other cells. + 3c Hyperlinks may be embedded in cells and may refer to other cells. Explicit Hyperbole buttons may be created as usual via mouse drags, see "(hyperbole.info)By Dragging". A klink is a special implicit link button that jumps to a specific outline cell. - 2c1 Here are three klink examples: + 3c1 Here are three klink examples: - 2c1a <@ 2b=06> jumps to the cell within this outline which has + 3c1a <@ 3b=06> jumps to the cell within this outline which has permanent id `06' and relative id `2b', namely the preceding sibling of this cell's parent. <@ 06> does the same thing, as does <@ 2b>, though this latter form will not maintain the link properly if the cell is moved elsewhere within the outline. - 2c1b <EXAMPLE.kotl, 3=012 |c1e> displays the named file, starting at + 3c1b <EXAMPLE.kotl, 4=012 |c1e> displays the named file, starting at the unimplemented features section whose permanent identifer is 012, with the view specification of: blank lines turned off, cutoff after one line per cell, and show ellipses for cells or trees which are clipped. - 2c1c <|ben> is a klink consisting of just a view specification. + 3c1c <|ben> is a klink consisting of just a view specification. When activated, it sets the view in the current outline to display blank lines, ellipses following collapsed lines and standard alphanumeric numbering. - 2c2 There are a number of easy ways to insert klinks into koutlines. + 3c2 There are a number of easy ways to insert klinks into koutlines. If you have mouse support under Hyperbole, simply click the Action Key within the indentation to the left of a cell text. If you then double click on some cell, a link to that cell will be @@ -323,31 +329,31 @@ a koutline or {C-h h o l} when not in a koutline to insert a klink. - 2d The outliner code runs on virtually any UNIX system. It supports dumb + 3d The outliner code runs on virtually any UNIX system. It supports dumb terminal, X window, and NEXTSTEP (Display Postscript) displays. - 3 Features remaining to be implemented: + 4 Features remaining to be implemented: - 3a Branch handling commands (all cells at same level). + 4a Branch handling commands (all cells at same level). - 3b Copying a single cell without its subtree. + 4b Copying a single cell without its subtree. - 3c Replacing one cell or one tree with another. + 4c Replacing one cell or one tree with another. - 3d Transposing two trees, rather than two cells. + 4d Transposing two trees, rather than two cells. - 3e A small amount of work remains to enable setting different per level + 4e A small amount of work remains to enable setting different per level fonts and colors, so that outline levels are visually easy to distinguish. - 3f Flexible view handling has been only partially implemented. + 4f Flexible view handling has been only partially implemented. - 3g The code to export from koutlines to other formats has not yet been + 4g The code to export from koutlines to other formats has not yet been written. Exporting to HTML, for example would be very useful. "ben" ;; kvspec:current -74 ;; id-counter +75 ;; id-counter alpha ;; label-type 3 ;; label-min-width " " ;; label-separator @@ -355,125 +361,127 @@ ;; depth-first kcell attributes [[0 - (creator "weiner@oakhill.sps.mot.com" create-time "19951102:11:15:03" id-counter 74 file "/usr1/dingus/weiner/hypb/kotl/EXAMPLE.kotl")] + (creator "weiner@infodock.com" create-time "19970219:03:24:19" id-counter 75 file "/home/infodock/lisp/hyperbole/kotl/EXAMPLE.kotl")] [20 - (creator "weiner" create-time "19940104:17:38:28")] + (creator "weiner@infodock.com" create-time "19940104:17:38:28" no-fill t)] + [75 + (idstamp 20 creator "weiner@infodock.com" create-time "19940104:17:38:28" no-fill t)] [34 - (creator "weiner@pts.mot.com" create-time "19940610:16:43:55")] + (creator "weiner@infodock.com" create-time "19940610:16:43:55")] [35 - (creator "weiner@pts.mot.com" create-time "19940610:16:44:03")] + (creator "weiner@infodock.com" create-time "19940610:16:44:03")] [4 - (creator "weiner" create-time "19940104:17:38:29")] + (creator "weiner@infodock.com" create-time "19940104:17:38:29")] [5 - (creator "weiner" create-time "19940104:17:38:29")] + (creator "weiner@infodock.com" create-time "19940104:17:38:29")] [6 - (creator "weiner" create-time "19940104:17:38:29")] + (creator "weiner@infodock.com" create-time "19940104:17:38:29")] [14 - (creator "weiner" create-time "19940104:17:38:29")] + (creator "weiner@infodock.com" create-time "19940104:17:38:29")] [67 - (creator "weiner@oakhill.sps.mot.com" create-time "19951028:04:29:13" no-fill t)] + (creator "weiner@infodock.com" create-time "19951028:04:29:13" no-fill t)] [15 - (creator "weiner" create-time "19940104:17:38:29")] + (creator "weiner@infodock.com" create-time "19940104:17:38:29")] [31 - (creator "weiner" create-time "19940306:18:11:43")] + (creator "weiner@infodock.com" create-time "19940306:18:11:43")] [7 - (creator "weiner" create-time "19940104:17:38:29")] + (creator "weiner@infodock.com" create-time "19940104:17:38:29")] [46 - (creator "weiner@oakhill.sps.mot.com" create-time "19950614:21:35:17")] + (creator "weiner@infodock.com" create-time "19950614:21:35:17")] [43 - (creator "weiner@pts.mot.com" create-time "19940610:22:00:46")] + (creator "weiner@infodock.com" create-time "19940610:22:00:46")] [22 - (creator "weiner" create-time "19940127:22:41:42")] + (creator "weiner@infodock.com" create-time "19940127:22:41:42")] [32 - (creator "weiner@pts.mot.com" create-time "19940610:16:31:28")] + (creator "weiner@infodock.com" create-time "19940610:16:31:28")] [41 - (creator "weiner@pts.mot.com" create-time "19940610:18:55:09")] + (creator "weiner@infodock.com" create-time "19940610:18:55:09")] [42 - (creator "weiner@pts.mot.com" create-time "19940610:18:55:57")] + (creator "weiner@infodock.com" create-time "19940610:18:55:57")] [33 - (creator "weiner@pts.mot.com" create-time "19940610:16:31:29")] + (creator "weiner@infodock.com" create-time "19940610:16:31:29")] [47 - (creator "weiner@oakhill.sps.mot.com" create-time "19951022:22:59:26" no-fill t)] + (creator "weiner@infodock.com" create-time "19951022:22:59:26" no-fill t)] [8 - (creator "weiner" create-time "19940104:17:38:29")] + (creator "weiner@infodock.com" create-time "19940104:17:38:29")] [28 - (creator "weiner" create-time "19940128:22:50:44")] + (creator "weiner@infodock.com" create-time "19940128:22:50:44")] [29 - (creator "weiner" create-time "19940128:22:50:54")] + (creator "weiner@infodock.com" create-time "19940128:22:50:54")] [10 - (creator "weiner" create-time "19940104:17:38:29")] + (creator "weiner@infodock.com" create-time "19940104:17:38:29")] [30 - (creator "weiner" create-time "19940129:00:27:59")] + (creator "weiner@infodock.com" create-time "19940129:00:27:59")] [62 - (creator "weiner@oakhill.sps.mot.com" create-time "19951026:08:32:57" no-fill t)] + (creator "weiner@infodock.com" create-time "19951026:08:32:57" no-fill t)] [70 - (creator "weiner@oakhill.sps.mot.com" create-time "19951030:19:18:49" no-fill t)] + (creator "weiner@infodock.com" create-time "19951030:19:18:49" no-fill t)] [71 - (creator "weiner@oakhill.sps.mot.com" create-time "19951030:19:19:40" no-fill t)] + (creator "weiner@infodock.com" create-time "19951030:19:19:40" no-fill t)] [73 - (creator "weiner@oakhill.sps.mot.com" create-time "19951030:19:23:09" no-fill t)] + (creator "weiner@infodock.com" create-time "19951030:19:23:09" no-fill t)] [63 - (creator "weiner@oakhill.sps.mot.com" create-time "19951026:19:31:34" no-fill t)] + (creator "weiner@infodock.com" create-time "19951026:19:31:34" no-fill t)] [64 - (creator "weiner@oakhill.sps.mot.com" create-time "19951026:19:33:01" no-fill t)] + (creator "weiner@infodock.com" create-time "19951026:19:33:01" no-fill t)] [69 - (creator "weiner@oakhill.sps.mot.com" create-time "19951029:06:24:35" no-fill t)] + (creator "weiner@infodock.com" create-time "19951029:06:24:35" no-fill t)] [68 - (creator "weiner@oakhill.sps.mot.com" create-time "19951029:06:24:27" no-fill t)] + (creator "weiner@infodock.com" create-time "19951029:06:24:27" no-fill t)] [65 - (creator "weiner@oakhill.sps.mot.com" create-time "19951026:19:33:08" no-fill t)] + (creator "weiner@infodock.com" create-time "19951026:19:33:08" no-fill t)] [66 - (creator "weiner@oakhill.sps.mot.com" create-time "19951026:19:33:15" no-fill t)] + (creator "weiner@infodock.com" create-time "19951026:19:33:15" no-fill t)] [48 - (creator "weiner@oakhill.sps.mot.com" create-time "19951023:05:55:19" no-fill t)] + (creator "weiner@infodock.com" create-time "19951023:05:55:19" no-fill t)] [57 - (creator "weiner@oakhill.sps.mot.com" create-time "19951023:10:07:06" no-fill t)] + (creator "weiner@infodock.com" create-time "19951023:10:07:06" no-fill t)] [58 - (creator "weiner@oakhill.sps.mot.com" create-time "19951023:10:07:26" no-fill t)] + (creator "weiner@infodock.com" create-time "19951023:10:07:26" no-fill t)] [49 - (creator "weiner@oakhill.sps.mot.com" create-time "19951023:05:55:55" no-fill t)] + (creator "weiner@infodock.com" create-time "19951023:05:55:55" no-fill t)] [55 - (creator "weiner@oakhill.sps.mot.com" create-time "19951023:08:56:41" no-fill t)] + (creator "weiner@infodock.com" create-time "19951023:08:56:41" no-fill t)] [50 - (creator "weiner@oakhill.sps.mot.com" create-time "19951023:05:57:26" no-fill t)] + (creator "weiner@infodock.com" create-time "19951023:05:57:26" no-fill t)] [51 - (creator "weiner@oakhill.sps.mot.com" create-time "19951023:05:58:31" no-fill t)] + (creator "weiner@infodock.com" create-time "19951023:05:58:31" no-fill t)] [56 - (creator "weiner@oakhill.sps.mot.com" create-time "19951023:08:57:09" no-fill t)] + (creator "weiner@infodock.com" create-time "19951023:08:57:09" no-fill t)] [52 - (creator "weiner@oakhill.sps.mot.com" create-time "19951023:05:59:59" no-fill t)] + (creator "weiner@infodock.com" create-time "19951023:05:59:59" no-fill t)] [53 - (creator "weiner@oakhill.sps.mot.com" create-time "19951023:06:00:48" no-fill t)] + (creator "weiner@infodock.com" create-time "19951023:06:00:48" no-fill t)] [54 - (creator "weiner@oakhill.sps.mot.com" create-time "19951023:06:05:50" no-fill t)] + (creator "weiner@infodock.com" create-time "19951023:06:05:50" no-fill t)] [26 - (creator "weiner" create-time "19940128:03:56:23")] + (creator "weiner@infodock.com" create-time "19940128:03:56:23")] [27 - (creator "weiner" create-time "19940128:22:36:54")] + (creator "weiner@infodock.com" create-time "19940128:22:36:54")] [59 - (creator "weiner@oakhill.sps.mot.com" create-time "19951024:03:40:05" no-fill t)] + (creator "weiner@infodock.com" create-time "19951024:03:40:05" no-fill t)] [60 - (creator "weiner@oakhill.sps.mot.com" create-time "19951024:03:40:13" no-fill t)] + (creator "weiner@infodock.com" create-time "19951024:03:40:13" no-fill t)] [61 - (creator "weiner@oakhill.sps.mot.com" create-time "19951024:03:40:42" no-fill t)] + (creator "weiner@infodock.com" create-time "19951024:03:40:42" no-fill t)] [1 - (creator "weiner" create-time "19940104:17:38:29")] + (creator "weiner@infodock.com" create-time "19940104:17:38:29")] [11 - (creator "weiner" create-time "19940104:17:38:29")] + (creator "weiner@infodock.com" create-time "19940104:17:38:29")] [12 - (creator "weiner" create-time "19940104:17:38:29")] + (creator "weiner@infodock.com" create-time "19940104:17:38:29")] [44 - (creator "bweiner@pts.mot.com" create-time "19940728:21:56:49")] + (creator "weiner@infodock.com" create-time "19940728:21:56:49")] [36 - (creator "weiner@pts.mot.com" create-time "19940610:16:49:34")] + (creator "weiner@infodock.com" create-time "19940610:16:49:34")] [37 - (creator "weiner@pts.mot.com" create-time "19940610:16:50:02")] + (creator "weiner@infodock.com" create-time "19940610:16:50:02")] [38 - (creator "weiner@pts.mot.com" create-time "19940610:16:50:13")] + (creator "weiner@infodock.com" create-time "19940610:16:50:13")] [13 - (creator "weiner" create-time "19940104:17:38:29")] + (creator "weiner@infodock.com" create-time "19940104:17:38:29")] [16 - (creator "weiner" create-time "19940104:17:38:29")] + (creator "weiner@infodock.com" create-time "19940104:17:38:29")] [74 - (creator "weiner@oakhill.sps.mot.com" create-time "19951101:21:56:21" no-fill t)] + (creator "weiner@infodock.com" create-time "19951101:21:56:21" no-fill t)] nil nil nil nil nil nil nil nil nil nil nil nil nil nil]
--- a/lisp/hyperbole/kotl/kfill.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/kotl/kfill.el Mon Aug 13 09:15:11 2007 +0200 @@ -7,7 +7,7 @@ ;; ;; AUTHOR: Bob Weiner ;; ORIG-DATE: 23-Jan-94 -;; LAST-MOD: 4-Nov-95 at 04:53:42 by Bob Weiner +;; LAST-MOD: 15-Jan-97 at 11:54:12 by Bob Weiner ;;; ************************************************************************ ;;; Public variables ;;; ************************************************************************
--- a/lisp/hyperbole/kotl/klink.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/kotl/klink.el Mon Aug 13 09:15:11 2007 +0200 @@ -8,7 +8,7 @@ ;; AUTHOR: Bob Weiner & Kellie Clark ;; ;; ORIG-DATE: 15-Nov-93 at 12:15:16 -;; LAST-MOD: 1-Nov-95 at 23:07:37 by Bob Weiner +;; LAST-MOD: 6-Jan-97 at 19:00:58 by Bob Weiner ;; ;; DESCRIPTION: ;; @@ -102,8 +102,8 @@ (defun klink:at-p () "Return non-nil iff point is within a klink. -See documentation for the `link-to-kotl' function for valid klink formats. -Value returned is a list of: link-label, link-start-position, and +See documentation for the `actypes::link-to-kotl' function for valid klink +formats. Value returned is a list of: link-label, link-start-position, and link-end-position, (including delimiters)." (let (bol klink referent) (if (and @@ -127,7 +127,17 @@ (setq klink (hbut:label-p t "<" ">" t)) (stringp (setq referent (car klink))) ;; Eliminate matches to e-mail address like, <user@domain>. - (not (string-match "[^<> \t\n][!&@]" referent))) + (not (string-match "[^<> \t\n][!&@]" referent)) + ;; Eliminate matches to URLs + (not (string-match "\\`[a-zA-Z]+:" referent)) + ;; Don't match to <HTML> and </SGML> tags. + (not (and (memq major-mode + (if (boundp 'id-select-markup-modes) + id-select-markup-modes + '(html-mode sgml-mode))) + ;; Assume , followed by a number is a klink. + (not (string-match ",\\s *[0-9]" referent)) + (string-match "\\`[a-zA-Z!/]" referent)))) klink))) ;;; ************************************************************************
--- a/lisp/hyperbole/kotl/kmenu.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/kotl/kmenu.el Mon Aug 13 09:15:11 2007 +0200 @@ -9,7 +9,7 @@ ;; ORG: Motorola, Inc., PPG ;; ;; ORIG-DATE: 28-Mar-94 at 11:22:09 -;; LAST-MOD: 26-Oct-95 at 18:47:41 by Bob Weiner +;; LAST-MOD: 22-Oct-96 at 01:30:50 by Bob Weiner ;; ;; Copyright (C) 1994-1995 Free Software Foundation, Inc. ;; @@ -26,7 +26,7 @@ (defconst id-menubar-kotl '( ("Koutline" - ["All-Cells-Attributes" (kotl-modecell-help nil -1) t] + ["All-Cells-Attributes" (kotl-mode:cell-help nil -1) t] ["Help" describe-mode t] ["Manual" (id-info "(hyperbole.info)Outliner") t] "----" @@ -101,7 +101,7 @@ ["Kill" kotl-mode:kill-tree t] ["Mail" kotl-mode:mail-tree t] ["Promote" kotl-mode:promote-tree t] - ["Show-Attributes" (kotl-modecell-help nil 2) t] + ["Show-Attributes" (kotl-mode:cell-help nil 2) t] "----" ["Copy-After-Cell" kotl-mode:copy-after t] ["Copy-Before-Cell" kotl-mode:copy-before t] @@ -113,9 +113,9 @@ ["Toggle-Blank-Lines" kvspec:toggle-blank-lines t] "----" ["Set-Cell-Attribute" kotl-mode:set-cell-attribute t] - ["Show-Cell-Attributes" (kotl-modecell-help) t] - ["All-Cells-Attributes" (kotl-modecell-help nil -1) t] - ["Show-Tree-Attributes" (kotl-modecell-help nil 2) t] + ["Show-Cell-Attributes" (kotl-mode:cell-help) t] + ["All-Cells-Attributes" (kotl-mode:cell-help nil -1) t] + ["Show-Tree-Attributes" (kotl-mode:cell-help nil 2) t] "----" ["Hide (Collapse)" kotl-mode:hide-tree t] ["Hide-Levels" kotl-mode:hide-sublevels t] @@ -132,7 +132,7 @@ ;;; This definition is used by InfoDock and XEmacs. (defconst id-popup-kotl-menu '("Koutline" - ["All-Cells-Attributes" (kotl-modecell-help nil -1) t] + ["All-Cells-Attributes" (kotl-mode:cell-help nil -1) t] ["Help" describe-mode t] ["Manual" (id-info "(hyperbole.info)Outliner") t] "----" @@ -199,7 +199,7 @@ ["Kill" kotl-mode:kill-tree t] ["Mail" kotl-mode:mail-tree t] ["Promote" kotl-mode:promote-tree t] - ["Show-Attributes" (kotl-modecell-help nil 2) t] + ["Show-Attributes" (kotl-mode:cell-help nil 2) t] "----" ["Copy-After-Cell" kotl-mode:copy-after t] ["Copy-Before-Cell" kotl-mode:copy-before t] @@ -211,9 +211,9 @@ ["Toggle-Blank-Lines" kvspec:toggle-blank-lines t] "----" ["Set-Cell-Attribute" kotl-mode:set-cell-attribute t] - ["Show-Cell-Attributes" (kotl-modecell-help) t] - ["All-Cells-Attributes" (kotl-modecell-help nil -1) t] - ["Show-Tree-Attributes" (kotl-modecell-help nil 2) t] + ["Show-Cell-Attributes" (kotl-mode:cell-help) t] + ["All-Cells-Attributes" (kotl-mode:cell-help nil -1) t] + ["Show-Tree-Attributes" (kotl-mode:cell-help nil 2) t] "----" ["Hide (Collapse)" kotl-mode:hide-tree t] ["Hide-Levels" kotl-mode:hide-sublevels t]
--- a/lisp/hyperbole/kotl/kotl-mode.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/kotl/kotl-mode.el Mon Aug 13 09:15:11 2007 +0200 @@ -8,7 +8,7 @@ ;; AUTHOR: Bob Weiner & Kellie Clark ;; ;; ORIG-DATE: 6/30/93 -;; LAST-MOD: 3-Nov-95 at 19:25:57 by Bob Weiner +;; LAST-MOD: 5-Dec-96 at 18:55:22 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. @@ -69,7 +69,7 @@ minor-mode-alist) minor-mode-alist (set:remove '(selective-display " Otl") minor-mode-alist) - ;; Remove indication that buffer is ;; narrowed. + ;; Remove indication that buffer is narrowed. mode-line-format (copy-sequence mode-line-format) mode-line-format (set:remove "%n" mode-line-format))) ;;
--- a/lisp/hyperbole/kotl/kprop-xe.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/kotl/kprop-xe.el Mon Aug 13 09:15:11 2007 +0200 @@ -29,11 +29,11 @@ ;;; Public functions ;;; ************************************************************************ -(defun kproperty:get (pos prop &optional object) - "Return the value of position POS's property PROP, in OBJECT. -OBJECT is optional and defaults to the current buffer. -If POSITION is at the end of OBJECT, the value is nil." - (extent-property (extent-at pos object) prop)) +;; (get-text-property (pos prop &optional object)) +;; Return the value of position POS's property PROP, in OBJECT. +;; OBJECT is optional and defaults to the current buffer. +;; If POSITION is at the end of OBJECT, the value is nil. +(fset 'kproperty:get 'get-text-property) (if (and hyperb:xemacs-p (or (>= emacs-minor-version 12) (> emacs-major-version 19)))
--- a/lisp/hyperbole/kotl/kvspec.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/kotl/kvspec.el Mon Aug 13 09:15:11 2007 +0200 @@ -8,7 +8,7 @@ ;; AUTHOR: Bob Weiner ;; ;; ORIG-DATE: 21-Oct-95 at 15:17:07 -;; LAST-MOD: 3-Nov-95 at 19:44:10 by Bob Weiner +;; LAST-MOD: 4-Dec-96 at 15:36:12 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. @@ -297,8 +297,22 @@ nil (setq mode-line-format (copy-sequence mode-line-format)) (let ((elt (or (memq 'mode-line-buffer-identification mode-line-format) - (memq 'modeline-buffer-identification mode-line-format)))) - (setcdr elt (cons 'kvspec:string (cdr elt)))))) + (memq 'modeline-buffer-identification + mode-line-format)))) + (if elt + (setcdr elt (cons 'kvspec:string (cdr elt))) + ;; + ;; XEmacs 19.14 introduced extents into the modeline that we + ;; must work around. + (if (and hyperb:xemacs-p (string-lessp "19.14" hyperb:xemacs-p)) + (let ((mf modeline-format) + elt) + (while mf + (setq elt (car mf)) + (if (and (consp elt) (eq (cdr elt) 'modeline-buffer-identification)) + (progn (setcdr mf (cons 'kvspec:string (cdr mf))) + (setq mf nil))) + (setq mf (cdr mf))))))))) (defun kvspec:update-view () "Update view according to current setting of local 'kvspec:current' variable."
--- a/lisp/hyperbole/wconfig.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/wconfig.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,10 +6,10 @@ ;; KEYWORDS: frames, hypermedia ;; ;; AUTHOR: Bob Weiner -;; ORG: Brown U. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 15-Mar-89 -;; LAST-MOD: 14-Apr-95 at 16:26:27 by Bob Weiner +;; LAST-MOD: 9-Dec-96 at 18:39:50 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. @@ -65,6 +65,15 @@ (defconst wconfig-ring-max 10 "*Maximum length of window configuration ring before oldest elements are deleted.") +(defvar wconfig-names (set:create) + "Set of (name . window-configuration) elements.") + +(defvar wconfig-ring nil + "List of window configurations saved in a ring.") + +(defvar wconfig-ring-yank-pointer nil + "The tail of the window configuration ring whose car is the last thing yanked.") + ;;; ************************************************************************ ;;; Public functions ;;; ************************************************************************ @@ -168,15 +177,6 @@ ;;; Private variables ;;; ************************************************************************ -(defvar wconfig-names (set:create) - "Set of (name . window-configuration) elements.") - -(defvar wconfig-ring nil - "List of window configurations saved in a ring.") - -(defvar wconfig-ring-yank-pointer nil - "The tail of the window configuration ring whose car is the last thing yanked.") - (run-hooks 'wconfig-load-hook) (provide 'wconfig)
--- a/lisp/hyperbole/wrolo.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/hyperbole/wrolo.el Mon Aug 13 09:15:11 2007 +0200 @@ -8,16 +8,20 @@ ;; KEYWORDS: hypermedia, matching ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; +;; ORG: InfoDock Associates. We sell corporate support and development +;; contracts for InfoDock, Emacs and XEmacs. +;; E-mail: <info@infodock.com> Web: http://www.infodock.com +;; Tel: +1 408-243-3300 ;; ;; ORIG-DATE: 7-Jun-89 at 22:08:29 -;; LAST-MOD: 31-Oct-95 at 18:39:54 by Bob Weiner +;; LAST-MOD: 17-Feb-97 at 15:32:20 by Bob Weiner ;; ;; This file is part of Hyperbole. ;; Available for use and distribution under the same terms as GNU Emacs. ;; ;; Copyright (C) 1989, '90, '91, '92, '95 Free Software Foundation, Inc. -;; Developed with support from Motorola Inc. +;; Copyright (C) 1996 InfoDock Associates ;; ;; DESCRIPTION: ;; @@ -223,7 +227,7 @@ %s indicating where to put the e-mail address.") (defvar rolo-file-list - (if (memq system-type '(ms-windows windows-nt ms-dos)) + (if hyperb:microcruft-os-p '("c:/_rolodex.otl") '("~/.rolodex.otl")) "*List of files containing rolodex entries. The first file should be a user-specific rolodex file, typically in the home @@ -346,11 +350,12 @@ (if (string= entry-spc "") " " entry-spc) name "\n") (backward-char 1)) - (widen) - (rolo-to-buffer (current-buffer)) - ;; Fixes non-display update bug when buf is on screen before - ;; interactive command invocation. - (goto-char (point)) + ;; Rolo-to-buffer may move point from its desired location, so + ;; restore it. + (let ((opoint (point))) + (widen) + (rolo-to-buffer (current-buffer)) + (goto-char opoint)) (if (interactive-p) (message "Edit entry at point."))))) @@ -421,9 +426,8 @@ (find-file-noselect (car file-list)))) (setq buffer-read-only nil)) (widen) - ;; Fixes display update bug in some Emacs versions. When buf is - ;; on screen before interactive command invocation, point is not - ;; moved to proper location. + ;; Rolo-to-buffer may have moved point from its desired location, so + ;; restore it. (if found-point (goto-char found-point))))) (defun rolo-edit-entry () @@ -671,11 +675,12 @@ example, might be (regexp-quote \"**\") to match level two. Returns number of groupings sorted." (interactive "sRolodex file to sort: \nRegexp for level's entries: \nP") - (rolo-map-level - (function (lambda (start end) (sort-lines nil start end))) - rolo-file - level-regexp - max-groupings)) + (let ((sort-fold-case t)) + (rolo-map-level + (function (lambda (start end) (sort-lines nil start end))) + rolo-file + level-regexp + max-groupings))) (defun rolo-toggle-narrow-to-entry () "Toggle between display of current entry and display of all matched entries. @@ -1116,6 +1121,8 @@ mode-name "Rolodex") (use-local-map wrolo-mode-map) ;; + (set-syntax-table wrolo-mode-syntax-table) + ;; ;; Loads menus under non-tty InfoDock, XEmacs or Emacs19; does nothing ;; otherwise. (and (not (featurep 'wrolo-menu)) hyperb:window-system @@ -1160,6 +1167,16 @@ (defvar *rolo-wconfig* nil "Saves frame's window configuration prior to a rolodex search.") +(defvar wrolo-mode-syntax-table nil + "Syntax table used while in wrolo match mode.") + +(if wrolo-mode-syntax-table + () + (setq wrolo-mode-syntax-table (make-syntax-table text-mode-syntax-table)) + ;; Support syntactic selection of delimited e-mail addresses. + (modify-syntax-entry ?< "(>" wrolo-mode-syntax-table) + (modify-syntax-entry ?> ")<" wrolo-mode-syntax-table)) + (defvar wrolo-mode-map nil "Keymap for the rolodex match buffer.")
--- a/lisp/modes/lisp-mode.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/modes/lisp-mode.el Mon Aug 13 09:15:11 2007 +0200 @@ -370,22 +370,31 @@ (eval (cons 'defconst (cdr expr))) (eval expr))) -(defun eval-last-sexp (eval-last-sexp-arg-internal) +;; XEmacs change, based on Bob Weiner suggestion +(defun eval-last-sexp (eval-last-sexp-arg-internal) ;dynamic scoping wonderment "Evaluate sexp before point; print value in minibuffer. With argument, print output into current buffer." (interactive "P") (let ((standard-output (if eval-last-sexp-arg-internal (current-buffer) t)) (opoint (point))) - (prin1 (let ((stab (syntax-table))) - ;; XEmacs change use eval-interactive not eval - (eval-interactive (unwind-protect - (save-excursion - (set-syntax-table emacs-lisp-mode-syntax-table) - (forward-sexp -1) - (save-restriction - (narrow-to-region (point-min) opoint) - (read (current-buffer)))) - (set-syntax-table stab))))))) + (prin1 (let ((stab (syntax-table)) + expr) + (eval-interactive + (unwind-protect + (save-excursion + (set-syntax-table emacs-lisp-mode-syntax-table) + (forward-sexp -1) + (save-restriction + (narrow-to-region (point-min) opoint) + (setq expr (read (current-buffer))) + (if (and (consp expr) + (eq (car expr) 'interactive)) + (list 'quote + (call-interactively + (eval (` (lambda (&rest args) + (, expr) args))))) + expr))) + (set-syntax-table stab))))))) (defun eval-defun (eval-defun-arg-internal) "Evaluate defun that point is in or before.
--- a/lisp/modes/outline.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/modes/outline.el Mon Aug 13 09:15:11 2007 +0200 @@ -313,12 +313,12 @@ (run-hooks 'outline-minor-mode-hook)) (setq selective-display nil)) ;; When turning off outline mode, get rid of any ^M's. - (or outline-minor-mode - (outline-flag-region (point-min) (point-max) ?\n)) - ;; XEmacs change - (set-buffer-modified-p (buffer-modified-p)) - ;; #+XEmacs - (outline-install-menubar 'remove) + (unless outline-minor-mode + (outline-flag-region (point-min) (point-max) ?\n) + ;; XEmacs change + (set-buffer-modified-p (buffer-modified-p)) + ;; #+XEmacs + (outline-install-menubar 'remove)) ;; XEmacs change (redraw-modeline))
--- a/lisp/modes/sh-script.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/modes/sh-script.el Mon Aug 13 09:15:11 2007 +0200 @@ -92,6 +92,12 @@ the name of the interpreter specified in the first line. If it matches, mode MODE is selected.") +(defvar sh-mode-hook nil + "*Hook run by `sh-mode'.") + +(defvar sh-set-shell-hook nil + "*Hook run by `sh-set-shell'.") + (defvar sh-ancestor-alist '((ash . sh) (bash . jsh)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/modes/whitespace-mode.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,565 @@ +;;; whitespace-mode.el -- minor mode for making whitespace visible + +;; Copyright (C) 1994, 1995, 1996 Heiko Muenkel + +;; Author: Heiko Muenkel <muenkel@tnt.uni-hannover.de> +;; Keywords: modes, extensions + +;; This file is part of XEmacs. + +;; XEmacs is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your +;; option) any later version. + +;; XEmacs is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with XEmacs; if not, write to the Free Software +;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +;; 02111-1307, USA. + +;;; Synched up with: FSF 19.34. + +;;; Commentary: + +;; $Id: whitespace-mode.el,v 1.2 1997/02/24 01:13:44 steve Exp $ +;; Description: +;; +;; This is a minor mode, which highlights whitespaces (blanks and +;; tabs) with different faces, so that it is easier to +;; distinguish between them. +;; Toggle the mode with: M-x whitespace-mode +;; or with: M-x whitespace-incremental-mode +;; The second one should be used in big files. +;; +;; If you want to know how the whitespaces are highlighted then +;; type: M-x whitespace-show-faces +;; +;; There are 2 hook variables `whitespace-incremental-mode-hook' +;; and `whitespace-mode-hook' to customize the mode. +;; +;; Look at the variable `whitespace-chars', if you only want to +;; highlight tabs or blanks and not both. +;; +;; Set `whitespace-install-toolbar-icon' to t, if you want a +;; toolbar icon for this mode. +;; +;; Set `whitespace-install-submenu' to t, if you want a submenu +;; for this mode. Sorry, at the moment there is no menu for the +;; Emacs 19. +;; +;; Thanks to Mike Scheidler for the toolbar icon code. +;; +;; Installation: +;; +;; Put the files whitespace-mode.el and adapt.el in one of your +;; load-path directories and the following lines (without the +;; comment signs) in your .emacs (adapt.el is already in the +;; XEmacs 19.12). +;; +;; (autoload 'whitespace-mode "whitespace-mode" +;; "Toggle whitespace mode. +;; With arg, turn whitespace mode on iff arg is positive. +;; In whitespace mode the different whitespaces (tab, blank return) +;; are highlighted with different faces. The faces are: +;; `whitespace-blank-face', `whitespace-tab-face' and +;; `whitespace-return-face'." +;; t) +;; +;; (autoload 'whitespace-incremental-mode "whitespace-mode" +;; "Toggle whitespace incremental mode. +;; With arg, turn whitespace incremental mode on iff arg is positive. +;; In whitespace incremental mode the different whitespaces (tab and +;; blank) are highlighted with different faces. The faces are: +;; `whitespace-blank-face' and `whitespace-tab-face'. +;; Use the command `whitespace-show-faces' to show their values. +;; In this mode only these tabs and blanks are highlighted, which are in +;; the region from (point) - (window-heigh) to (point) + (window-heigh)." + +;;; Code: + +(provide 'whitespace-mode) +(require 'adapt) + +;;; variables: + +(defvar whitespace-chars 'tabs-and-blanks + "*Determines, which whitespaces are highlighted. +Valid values are: +'tabs-and-blanks => tabs and blanks are highlighted; +'tabs => only tabs are highlighted; +'blanks => only blanks are highlighted;. + +Changing this variable during the whitespace-*-mode is active could lead +to wrong highlighted whitespaces.") + +(make-variable-buffer-local 'whitespace-chars) + +(defvar whitespace-mode-hook nil + "*Run after the `whitespace-mode' is switched on.") + +(defvar whitespace-incremental-mode-hook nil + "*Run after the `whitespace-incremental-mode' is switched on.") + + +(if (adapt-xemacsp) +(progn + +(defvar whitespace-install-toolbar-icon nil + "Set it to t, if a toolbar icon should be installed during loading this file. +The icon calls the function 'whitespace-toolbar-function'.") + +(defvar whitespace-install-submenu nil + "Set it to t, if a submenu should be installed during loading this file.") + +)) + + +(defvar whitespace-toolbar-function 'whitespace-incremental-mode + "*The toolbar icon for the whitespace mode calls this function. +Valid values are: 'whitespace--mode and 'whitespace-incremental-mode.") + +(defvar whitespace-blank-and-tab-search-string "\\( \\)\\|\\(\t\\)" + "The regexp used to search for tabs and blanks.") + +(defvar whitespace-tab-search-string "\t" + "The search string used to find tabs.") + +(defvar whitespace-blank-search-string " " + "The search string used to find blanks.") + +;;; Defining faces +(if (facep 'whitespace-blank-face) + nil + (make-face 'whitespace-blank-face) + (set-face-background 'whitespace-blank-face "LightBlue1")) + +(if (facep 'whitespace-tab-face) + nil + (make-face 'whitespace-tab-face) + (set-face-background 'whitespace-tab-face "yellow") + (set-face-underline-p 'whitespace-tab-face t)) + +(defun whitespace-show-faces () + "Shows the faces used by the `whitespace-mode'." + (interactive) + (save-excursion + (let ((actual-buffer-name (buffer-name (current-buffer))) + (actual-whitespace-chars whitespace-chars) + (whitespace-mode-active (or whitespace-mode + whitespace-incremental-mode)) + (buffer (get-buffer-create "*Help*"))) + (set-buffer buffer) + (setq whitespace-chars actual-whitespace-chars) + (delete-region (point-min) (point-max)) + (insert "In the whitespace minor mode\n" + " this \" ") + (whitespace-highlight-region (1- (point)) (point)) + (insert "\" is a blank, highlighted with `whitespace-blank-face' and\n" + " this \"\t") + (whitespace-highlight-region (1- (point)) (point)) + (insert "\" is a tab, highlighted with `whitespace-tab-face'.") + + (newline 2) + (if (eq whitespace-chars 'blanks) + (insert + "The highlighting of tabs is switched off.\n") + (if (eq whitespace-chars 'tabs) + (insert + "The highlighting of blanks is switched off.\n"))) + (newline) + (if whitespace-mode-active + (insert "A whitespace minor mode is active in the buffer\n " + actual-buffer-name + ".\n") + (insert "No whitespace minor mode is active in the buffer\n " + actual-buffer-name + ".\n")) + (show-temp-buffer-in-current-frame buffer) + ))) + +;;; +(defun whitespace-highlight-chars-in-region (char-string from to face) + "Highlights the CHAR-STRING in the region from FROM to TO with the FACE." + (while (search-forward char-string end t) + (let ((extent)) + (cond ((match-beginning 0) + (setq extent (make-extent (match-beginning 0) (match-end 0))) + (set-extent-face extent face) + )) + (set-extent-property extent 'start-open t) + (set-extent-property extent 'end-open t) + ))) + +(defun whitespace-highlight-region (from to) + "Highlights the whitespaces in the region from FROM to TO." + (let ((start (min from to)) + (end (max from to))) + (save-excursion + ;; (message "Highlighting tabs and blanks...") + (goto-char start) + (cond ((eq whitespace-chars 'tabs-and-blanks) + (while (search-forward-regexp + whitespace-blank-and-tab-search-string end t) + (let ((extent)) + (cond ((match-beginning 1) ; blanks ? + (setq extent (make-extent (match-beginning 1) + (match-end 1))) + (set-extent-face extent 'whitespace-blank-face) + ) + ((match-beginning 2) ; tabs ? + (setq extent (make-extent (match-beginning 2) + (match-end 2))) + (set-extent-face extent 'whitespace-tab-face) + ) + ) + (set-extent-property extent 'start-open t) + (set-extent-property extent 'end-open t) + ))) + ((eq whitespace-chars 'tabs) + (whitespace-highlight-chars-in-region whitespace-tab-search-string + from + to + 'whitespace-tab-face)) + ((eq whitespace-chars 'blanks) + (whitespace-highlight-chars-in-region + whitespace-blank-search-string + from + to + 'whitespace-blank-face)) + (t (error "ERROR: Bad value of whitespace-highlight-char"))) + ;; (message "") + ))) + +(defun whitespace-highlight-buffer () + "Highlights the whitespaces in the current buffer." + (whitespace-highlight-region (point-min) (point-max)) +) + +(defsubst whitespace-find-next-highlighted-region (from to) + "Returns nil or the next highlighted region." + (map-extents '(lambda (extent dummy) + (if (extent-property extent 'whitespace-highlighted-region) + extent)) + nil + from + to)) + +(defun whitespace-incremental-highlight (from to) + "Highligthts the region from FROM to TO incremental." + (save-excursion + (goto-char from) + (let ((extent (extent-at (point) nil 'whitespace-highlighted-region)) + (next-extent nil) + (start nil)) + (while (< (point) to) + (if extent + (goto-char (extent-end-position extent))) + (if (< (point) to) + (progn + (setq start (point)) + + (setq next-extent (whitespace-find-next-highlighted-region + start + to)) + (if extent + (if next-extent + (progn + (set-extent-endpoints extent + (extent-start-position extent) + (extent-end-position next-extent) + ) + (whitespace-highlight-region start + (1- + (extent-start-position + next-extent))) + (delete-extent next-extent)) + (set-extent-endpoints extent + (extent-start-position extent) + to) + (whitespace-highlight-region start to)) + (if next-extent + (progn + (setq extent next-extent) + (whitespace-highlight-region start + (1- (extent-start-position + next-extent))) + (set-extent-endpoints extent + start + (extent-end-position next-extent))) + (setq extent (make-extent start to)) + (set-extent-property extent 'whitespace-highlighted-region t) + (whitespace-highlight-region start to))) + )))))) + + +(defun whitespace-highlight-window () + "Highlights the whitespaces in the current window." + (whitespace-incremental-highlight (save-excursion + (forward-line (- (window-height))) + (point)) + (save-excursion + (forward-line (window-height)) + (point)))) + +(defun whitespace-dehighlight-region (start end) + "Dehighlights the whitespaces in the region from START to END." + (map-extents '(lambda (extent dummy) + (if (or (eq (extent-face extent) 'whitespace-blank-face) + (eq (extent-face extent) 'whitespace-tab-face) + (extent-property extent + 'whitespace-highlighted-region)) + (progn + (delete-extent extent) + nil))) + nil + start + end + ) + ) + +(defun whitespace-dehighlight-buffer () + "Dehighlights the whitespaces in the current buffer." + (whitespace-dehighlight-region (point-min) (point-max)) + ) + +(defun whitespace-highlight-after-change-function (beg end old-len) + "Called, when any modification is made to buffer text. Highlights +the whitespaces (blanks and tabs) in the region from BEG to +END. OLD-LEN isn't used, but provided from the after-change hook." + (if (or (eq beg end) + (null whitespace-mode)) + nil + (whitespace-dehighlight-region beg end) + (whitespace-highlight-region beg end))) + +(defvar whitespace-mode nil + "Non-nil, if the `whitespace-mode' is active.") + +(make-variable-buffer-local 'whitespace-mode) + +(defun whitespace-mode (&optional arg) + "Toggle whitespace mode. +With arg, turn whitespace mode on iff arg is positive. +In whitespace mode the different whitespaces (tab and blank) +are highlighted with different faces. The faces are: +`whitespace-blank-face' and `whitespace-tab-face'. +Use the command `whitespace-show-faces' to show their values." + (interactive "P") + (setq whitespace-mode + (if (null arg) (not whitespace-mode) + (> (prefix-numeric-value arg) 0))) + (if (and whitespace-mode whitespace-incremental-mode) + (progn + (whitespace-incremental-highlight (point-min) (point-max)) + (setq whitespace-incremental-mode nil) + (remove-hook 'post-command-hook 'whitespace-highlight-window) + (run-hooks 'whitespace-mode-hook) + ) + (setq whitespace-incremental-mode nil) + (remove-hook 'post-command-hook 'whitespace-highlight-window) + (redraw-modeline) ;(force-mode-line-update) + (if whitespace-mode + (progn + (whitespace-highlight-buffer) + (make-local-variable 'after-change-functions) + (add-hook 'after-change-functions + 'whitespace-highlight-after-change-function) + (run-hooks 'whitespace-mode-hook)) + (whitespace-dehighlight-buffer) + (remove-hook 'after-change-functions + 'whitespace-highlight-after-change-function) + (remove-hook 'post-command-hook 'whitespace-highlight-window) + ))) + +(defvar whitespace-incremental-mode nil + "Non-nil, if the `whitespace-incremental-mode' is active.") + +(make-variable-buffer-local 'whitespace-incremental-mode) + +(defun whitespace-incremental-mode (&optional arg) + "Toggle whitespace incremental mode. +With arg, turn whitespace incremental mode on iff arg is positive. +In whitespace incremental mode the different whitespaces (tab and blank) +are highlighted with different faces. The faces are: +`whitespace-blank-face' and `whitespace-tab-face'. +Use the command `whitespace-show-faces' to show their values. +In this mode only these tabs and blanks are highlighted, which are in +the region from (point) - (window-heigh) to (point) + (window-heigh)." + (interactive "P") + (setq whitespace-incremental-mode + (if (null arg) (not whitespace-incremental-mode) + (> (prefix-numeric-value arg) 0))) + (if (and whitespace-mode whitespace-incremental-mode) + (set-extent-property (make-extent (point-min) (point-max)) + 'whitespace-highlighted-region + t)) + (setq whitespace-mode nil) + (redraw-modeline) ;(force-mode-line-update) + ;(set-buffer-modified-p (buffer-modified-p)) ;No-op, but updates mode line. + (if whitespace-incremental-mode + (progn + (whitespace-highlight-window) + (make-local-variable 'post-command-hook) + (add-hook 'post-command-hook 'whitespace-highlight-window) + (make-local-variable 'after-change-functions) + (add-hook 'after-change-functions + 'whitespace-highlight-after-change-function) + (run-hooks 'whitespace-incremental-mode-hook)) + (whitespace-dehighlight-buffer) + (remove-hook 'after-change-functions + 'whitespace-highlight-after-change-function) + (remove-hook 'post-command-hook 'whitespace-highlight-window) + )) + + +;;; Add whitespace-mode and whitespace-incremental-mode to the minor-mode-alist + +(or (assq 'whitespace-mode minor-mode-alist) + (setq minor-mode-alist + (cons '(whitespace-mode " WSP") minor-mode-alist))) + +(or (assq 'whitespace-incremental-mode minor-mode-alist) + (setq minor-mode-alist + (cons '(whitespace-incremental-mode " WSPI") minor-mode-alist))) + + +;;; Menu for the whitespace mode + +(defun whitespace-set-whitespace-chars (new-whitespace-chars) + "Sets the variable `whitespace-chars' and activates the change." + (interactive (list (read (completing-read "Whitespaces to highlight: " + '(("tabs-and-blanks") + ("tabs") + ("blanks")) + nil + t + (symbol-name 'whitespace-chars))))) + (if (eq whitespace-chars new-whitespace-chars) + nil ; nothing to do + (setq whitespace-chars new-whitespace-chars) + (setq-default whitespace-chars new-whitespace-chars) + (cond (whitespace-mode (whitespace-mode) + (whitespace-mode)) + (whitespace-incremental-mode (whitespace-incremental-mode) + (whitespace-incremental-mode)) + ))) + +(defvar whitespace-menu nil + "A menu for the whitespace minor mode.") + +(setq whitespace-menu + '("Whitespace Menu" + ["Highlight Whitespaces" + whitespace-mode + :style toggle + :selected whitespace-mode] + ["Incremental Highlighting" + whitespace-incremental-mode + :style toggle + :selected whitespace-incremental-mode + ] + "---" + ["Show Whitespace Faces" whitespace-show-faces t] + "---" + ["Highlight Tabs & Blanks" + (whitespace-set-whitespace-chars 'tabs-and-blanks) + :style radio + :selected (eq whitespace-chars 'tabs-and-blanks)] + ["Highlight Only Tabs" + (whitespace-set-whitespace-chars 'tabs) + :style radio + :selected (eq whitespace-chars 'tabs)] + ["Highlight Only Blanks" + (whitespace-set-whitespace-chars 'blanks) + :style radio + :selected (eq whitespace-chars 'blanks)] + )) + +(if (and (boundp 'whitespace-install-submenu) whitespace-install-submenu) + (add-submenu '("Apps") whitespace-menu)) + +;;; Toolbar icon for the XEmacs + +(if (featurep 'toolbar) + +(defvar toolbar-wspace-icon + (toolbar-make-button-list + "/* XPM */ +static char * whitespace[] = { +\"28 28 4 1\", +\" c Gray75 s backgroundToolBarColor\", +\". c black\", +\"X c Gray60\", +\"o c white\", +\" \", +\" \", +\" \", +\" \", +\" .. . \", +\" XXX.XXXXXX . \", +\" Xoo.oooooXX . \", +\" .. .. ..o.o..oo..X... .. \", +\" . . X.o..o.ooX. X. . . \", +\" . . .oo.oo.ooX.XX. .... \", +\" ... .oo.oo.ooo.oo. . \", +\" . .Xoo.oo.ooo.oo. . . \", +\" . .Xo...o..o...o.. .. \", +\" XooooooooooooX \", +\" XooooooooooooX \", +\" .... ....ooo...ooo... .. \", +\" . . .oo.o.oo.oo.oX. . . \", +\" . .oo.ooo..oo.oX .... \", +\" .. .oo.o..o.oo.oX . \", +\" . . .oo.o.oo.oo.oX. . . \", +\" .... ...oo.....oo.. .. \", +\" .ooooooooooooX \", +\" .XXXXXXXXXXXXX \", +\" . \", +\" ... \", +\" \", +\" \", +\" \" +};") + "A whitespace icon.") +) + +(defun whitespace-toolbar-function () + "Calls the function determined by `whitespace-toolbar-function'." + (interactive) + (call-interactively whitespace-toolbar-function)) + +(if (and (adapt-xemacsp) + whitespace-install-toolbar-icon + (featurep 'toolbar) + (eq (device-type (selected-device)) 'x)) + (add-spec-list-to-specifier + default-toolbar + '((global + (nil + [toolbar-file-icon find-file t "Open a file" ] + [toolbar-folder-icon dired t "View directory"] + [toolbar-disk-icon save-buffer t "Save buffer" ] + [toolbar-printer-icon print-buffer t "Print buffer" ] + [toolbar-cut-icon x-kill-primary-selection t "Kill region"] + [toolbar-copy-icon x-copy-primary-selection t "Copy region"] + [toolbar-paste-icon + x-yank-clipboard-selection t "Paste from clipboard"] + [toolbar-undo-icon undo t "Undo edit" ] + [toolbar-replace-icon query-replace t "Replace text" ] + [toolbar-wspace-icon + whitespace-toolbar-function t "Toggle whitespace mode"] + nil + [toolbar-compile-icon toolbar-compile t "Compile" ] + [toolbar-debug-icon toolbar-debug t "Debug" ] + [toolbar-spell-icon toolbar-ispell t "Spellcheck" ] + [toolbar-mail-icon toolbar-mail t "Mail" ] + [toolbar-news-icon toolbar-news t "News" ] + [toolbar-info-icon toolbar-info t "Information" ] + ))))) + +;;; whitespace-mode.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/modes/winmgr-mode.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,165 @@ +;;; winmgr-mode.el --- generic window manager mode + +;; Author: ??? +;; Maintainer: David Konerding (rafael@cse.ucsc.edu) +;; Modifications by: Stefan Strobel <strobel@lia.univ-savoie.fr> +;; Barry A. Warsaw <bwarsaw@python.org> +;; Created: ??? +;; Keywords: languages + +;; Copyright (C) 199? Someone Claim It + +;; This file is part of XEmacs. + +;; XEmacs is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2 of the License, or +;; (at your option) any later version. + +;; XEmacs is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with XEmacs; if not, write to the Free Software +;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +;; 02111-1307, USA. + +;;; Synched up with: Not in FSF. + +;;; Commentary: + +;; This package is a major mode for editing window configuration files and +;; also defines font-lock keywords for such files. + +;; winmgr-mode mode will automatically get turned on if you visit a +;; a file whose name looks like that of a configuration file +;; (IE, .fvwmrc, .mwmrc, .tvtwmrc, etc) + +;; The current font-lock keywords are: + +;; any word of upper or lower case letters at the start of a line +;; followed by whitespace gets colored using +;; font-lock-function-name-face. + +;; any word of upper or lower case letters at the start of a line +;; followed by a "(" (IE, an m4 macro) gets colored using +;; font-lock-comment-face + +;; Put this in your .emacs : +;; +;;(setq auto-mode-alist +;; (append '(("\\.[A-Za-z]*wm$" . winmgr-mode) +;; ("\\.[A-Za-z]*wmrc" . winmgr-mode) +;; auto-mode-alist)) +;; +;;(autoload 'winmgr-mode "winmgr-mode" +;; "Mode for editing window manager config files") +;; +;;(add-hook 'winmgr-mode-hook +;; '(lambda () +;; (font-lock-mode t) +;; (setq font-lock-keywords winmgr-font-lock-keywords) +;; (font-lock-fontify-buffer))) +;; + + +;;; Code: +(defvar winmgr-mode-hook nil + "Hook to be run when `winmgr-mode' is entered.") + +(defvar winmgr-basic-offset 4 + "*Number of spaces per indentation level.") + + +;; font-lock-isms +(defvar font-lock-m4-face 'default + "New face for m4 macros.") + +(defun winmgr-init-font-lock () + ;; initialize font-lock faces for winmgr-mode + (condition-case nil + (progn + (copy-face 'default 'm4-face) + (set-face-foreground 'm4-face "blue") + (set-face-background 'm4-face "white") + (setq font-lock-m4-face 'm4-face)) + (error nil))) + +(defvar winmgr-font-lock-keywords + '(("^[A-Za-z]+[ \n\t]" . font-lock-function-name-face) + ;;("^#.*" . font-lock-comment-face) + ("^[A-Za-z]+(.*)" . font-lock-m4-face)) + "Default font-lock keywords.") + + + +;; major-mode stuff +(defvar winmgr-mode-abbrev-table nil + "Abbrev table used in `winmgr-mode' buffers.") +(define-abbrev-table 'winmgr-mode-abbrev-table ()) + + +(defvar winmgr-mode-syntax-table nil + "Syntax table used in `winmgr-mode' buffers.") +(if winmgr-mode-syntax-table + () + (setq winmgr-mode-syntax-table (make-syntax-table)) + (modify-syntax-entry ?\# "<" winmgr-mode-syntax-table) + (modify-syntax-entry ?\n ">" winmgr-mode-syntax-table)) + + +(defvar winmgr-mode-map () + "Keymap used in `winmgr-mode' buffers.") +(if winmgr-mode-map + () + (setq winmgr-mode-map (make-sparse-keymap)) + ;; So far there aren't any winmgr-mode specific functions + ) + + +(defun winmgr-mode () + "Major mode for editing winmgr config files." + (interactive) + (kill-all-local-variables) + (set-syntax-table winmgr-mode-syntax-table) + (setq major-mode 'winmgr-mode + mode-name "Winmgr" + local-abbrev-table winmgr-mode-abbrev-table) + (use-local-map winmgr-mode-map) + ;; local variables + (make-local-variable 'parse-sexp-ignore-comments) + (make-local-variable 'comment-start) + (make-local-variable 'comment-end) + (make-local-variable 'indent-line-function) + ;; now set their values + (setq parse-sexp-ignore-comments t + comment-start "# " + comment-end "" + indent-line-function 'winmgr-indent-line-function) + (run-hooks 'winmgr-mode-hook)) + + +;; indentation commands + +(defun winmgr-indent-line-function () + "Indent line based on depth in parentheses. +See the variable `winmgr-basic-offset.'" + ;; find the beginning of this construct + (let ((depth 0) + (here (point))) + (condition-case nil + (while t + (backward-up-list 1) + (setq depth (1+ depth))) + (error nil)) + (goto-char here) + (beginning-of-line) + (delete-horizontal-space) + (insert-char ?\040 (* depth winmgr-basic-offset)))) + + +(provide 'winmgr-mode) + +;;; winmgr-mode.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/modes/xrdb-mode.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,411 @@ +;;; xrdb-mode.el --- mode for editing X resource database files + +;; Author: 1994-1997 Barry A. Warsaw +;; Maintainer: tools-help@python.org +;; Created: May 1994 +;; Version: 1.17 +;; Last Modified: 1997/02/21 22:28:59 +;; Keywords: data languages + +;; Copyright (C) 1994 Barry A. Warsaw + +;; This file is not part of GNU Emacs. + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Commentary: +;; +;; In 1994 I wrote: +;; +;; "I used to be like you. I used to hack on X resource database files +;; all the time, and when I did, I found this mode to be fairly +;; useful. It's by no means perfect. At one time I had a collection +;; of hacks that did some nice indentation of resource lines, but +;; they were not organized in any way. This mode was my attempt to +;; congeal this mess into a proper major mode. I release it now, not +;; because it will change your life, but because I don't plan to do +;; anything more with it. +;; +;; I have since been enlightened and no longer have to cavort with +;; mere mortal X hackers anymore. I like my brain cells, so now I +;; use NEXTSTEP where all is glory. Or would you say I traded one +;; vice for another? Hmm... Anyway, if you are still down in the +;; trenches and would like to inherit this file, let me know. I +;; don't intend to do any work on it any more... unless I lose my +;; place in paradise. I promise to be good, Steve. :-) :-)" +;; +;; I have fallen from grace. + +;; Code: + + +;; These variables are available for your customization +(defvar xrdb-mode-hook nil + "*Hook to be run when `xrdb-mode' is entered.") + +(defvar xrdb-subdivide-by 'paragraph + "*Extent of alignment calculations. +Can be one of `buffer', `paragraph', `page', or `line'. Do a +\\[describe-function] xrdb-indent-buffer RET for more information.") + + + +;; no need to customize anything below this line +(defconst xrdb-comment-re "^[ \t]*[!]" + "Character which starts a comment.") +(defconst xrdb-separator-char ?: + "Character which separates resource specs from values.") + + +;; utilities +(defsubst xrdb-point (position) + ;; Returns the value of point at certain commonly referenced POSITIONs. + ;; POSITION can be one of the following symbols: + ;; + ;; bol -- beginning of line + ;; eol -- end of line + ;; bod -- beginning of defun + ;; boi -- back to indentation + ;; ionl -- indentation of next line + ;; iopl -- indentation of previous line + ;; bonl -- beginning of next line + ;; bopl -- beginning of previous line + ;; bop -- beginning of paragraph + ;; eop -- end of paragraph + ;; bopg -- beginning of page + ;; eopg -- end of page + ;; + ;; This function does not modify point or mark. + (let ((here (point))) + (cond + ((eq position 'bol) (beginning-of-line)) + ((eq position 'eol) (end-of-line)) + ((eq position 'boi) (back-to-indentation)) + ((eq position 'bonl) (forward-line 1)) + ((eq position 'bopl) (forward-line -1)) + ((eq position 'bop) (forward-paragraph -1)) + ((eq position 'eop) (forward-paragraph 1)) + ((eq position 'bopg) (forward-page -1)) + ((eq position 'eopg) (forward-page 1)) + (t + (error "unknown buffer position requested: %s" position))) + (prog1 + (point) + (goto-char here)) + )) + +(defsubst xrdb-skip-to-separator () + ;; skip forward from the beginning of the line to the separator + ;; character as given by xrdb-separator-char. Returns t if the + ;; char was found, otherwise, nil. + (beginning-of-line) + (skip-chars-forward + (concat "^" (char-to-string xrdb-separator-char)) + (xrdb-point 'eol)) + (= (following-char) xrdb-separator-char)) + + + +;; commands +(defun xrdb-electric-separator (arg) + "Insert the separator character. +Re-align the line unless an argument is given." + (interactive "P") + ;; first insert the character + (self-insert-command (prefix-numeric-value arg)) + ;; only do electric behavior if arg is not given + (if (not arg) + (xrdb-align-to (xrdb-point 'bol) + (xrdb-point 'bonl) + (save-excursion + (beginning-of-line) + (forward-comment (- (point-max))) + (beginning-of-line) + (xrdb-skip-to-separator) + (current-column))))) + +(defun xrdb-align-to (start end goalcolumn) + (interactive "r\nnAlign to column: ") + (save-excursion + (save-restriction + (narrow-to-region start end) + (beginning-of-buffer) + (while (< (point) (point-max)) + (if (and (not (looking-at xrdb-comment-re)) + (xrdb-skip-to-separator) + goalcolumn) + (indent-code-rigidly (xrdb-point 'bol) + (xrdb-point 'bonl) + (- goalcolumn (current-column)))) + (forward-line 1))))) + +(defun xrdb-indent-line (arg) + "Re-align current line." + (interactive "P") + ;; narrow to the region specified by xrdb-subdivide-by + (save-excursion + (save-restriction + (widen) + (cond + ((eq xrdb-subdivide-by 'buffer)) + ((eq xrdb-subdivide-by 'page) + (narrow-to-page)) + ((eq xrdb-subdivide-by 'paragraph) + (narrow-to-region (xrdb-point 'bop) (xrdb-point 'eop))) + (t + (narrow-to-region (xrdb-point 'bopl) (xrdb-point 'bonl)) + )) + ;; indent line + (xrdb-align-to (xrdb-point 'bol) (xrdb-point 'bonl) + (xrdb-region-goal-column)) + ))) + +(defun xrdb-indent-region (start end) + "Re-align region." + (interactive "r") + ;; narrow to region + (save-excursion + (save-restriction + (narrow-to-region start end) + (xrdb-align-to (point-min) (point-max) (xrdb-region-goal-column)) + ))) + +(defun xrdb-indent-page () + "Re-align the current page." + (interactive) + (save-excursion + (save-restriction + (narrow-to-page) + (xrdb-align-to (point-min) (point-max) (xrdb-region-goal-column)) + ))) + +(defun xrdb-indent-paragraph () + "Re-align the current paragraph." + (interactive) + (save-excursion + (save-restriction + (narrow-to-region (xrdb-point 'bop) (xrdb-point 'eop)) + (xrdb-align-to (point-min) (point-max) (xrdb-region-goal-column)) + ))) + +(defun xrdb-indent-buffer (arg) + "Re-align the entire buffer. +Alignment calculations are controlled by the variable +`xrdb-subdivide-by', which can take the values `buffer', `paragraph', +`page', or `line', with the following meanings: + + buffer - all non-comment lines are aligned with the longest line in + the buffer. Since every line must be scanned, this will + take the longest to perform. + + paragraph - alignment of lines spanning paragraphs. A paragraph is + defined as all contiguous lines between blank or comment + lines. + + page - alignment of lines spanning pages (i.e. separated by + page-delimiter, usually ^L). + + none - alignment of lines based on the previous line. + +With optional \\[universal-argument], queries for alignment subdivision." + (interactive "P") + (let ((align-by (if (not arg) + xrdb-subdivide-by + (completing-read + "Align by: " + '(("buffer" . buffer) + ("paragraph" . paragraph) + ("page" . page) + ("line" . line)) + nil t (format "%s" xrdb-subdivide-by))))) + (message "Aligning by %s..." align-by) + (save-excursion + (save-restriction + (widen) + (cond + ;; by buffer + ((eq align-by 'buffer) + (xrdb-align-to (point-min) (point-max) (xrdb-region-goal-column))) + ;; by paragraph + ((eq align-by 'paragraph) + (beginning-of-buffer) + (while (< (point) (point-max)) + (narrow-to-region (point) (xrdb-point 'eop)) + (xrdb-align-to (point-min) (point-max) (xrdb-region-goal-column)) + (beginning-of-buffer) + (widen) + (forward-paragraph 1) + )) + ;; by page + ((eq align-by 'page) + (beginning-of-buffer) + (while (< (point) (point-max)) + (narrow-to-region (point) (xrdb-point 'eopg)) + (xrdb-align-to (point-min) (point-max) (xrdb-region-goal-column)) + (beginning-of-buffer) + (widen) + (forward-page 1) + )) + ;; by line + (t + (beginning-of-buffer) + (let ((prev-goalcol 0)) + (while (< (point) (point-max)) + ;; skip comments and blank lines + (if (not (looking-at paragraph-start)) + (progn + (xrdb-align-to (xrdb-point 'bol) (xrdb-point 'bonl) + prev-goalcol) + (xrdb-skip-to-separator) + (setq prev-goalcol (- (point) (xrdb-point 'boi))) + )) + (forward-line 1)))) + ))) + (message "Aligning by %s... done." align-by) + )) + + +;; major-mode stuff +(defvar xrdb-mode-abbrev-table nil + "Abbrev table used in `xrdb-mode' buffers.") +(define-abbrev-table 'xrdb-mode-abbrev-table ()) + + +(defvar xrdb-mode-syntax-table nil + "Syntax table used in `xrdb-mode' buffers.") +(if xrdb-mode-syntax-table + () + (setq xrdb-mode-syntax-table (make-syntax-table)) + (modify-syntax-entry ?! "<" xrdb-mode-syntax-table) + (modify-syntax-entry ?\n ">" xrdb-mode-syntax-table)) + + +(defvar xrdb-mode-map () + "Keymap used in `xrdb-mode' buffers.") +(if xrdb-mode-map + () + (setq xrdb-mode-map (make-sparse-keymap)) + (let ((ekey (char-to-string xrdb-separator-char))) + ;; make the separator key electric + (define-key xrdb-mode-map ekey 'xrdb-electric-separator) + (define-key xrdb-mode-map "\t" 'xrdb-indent-line) + (define-key xrdb-mode-map "\C-c\C-a" 'xrdb-indent-paragraph) + (define-key xrdb-mode-map "\C-c\C-b" 'xrdb-submit-bug-report) + (define-key xrdb-mode-map "\C-c\C-p" 'xrdb-indent-page) + (define-key xrdb-mode-map "\C-c\C-r" 'xrdb-indent-region) + (define-key xrdb-mode-map "\C-c\C-u" 'xrdb-indent-buffer) + (define-key xrdb-mode-map "\C-c>" 'xrdb-align-to) + )) + +(defun xrdb-mode () + "Major mode for editing xrdb config files" + (interactive) + (kill-all-local-variables) + (set-syntax-table xrdb-mode-syntax-table) + (setq major-mode 'xrdb-mode + mode-name "xrdb" + local-abbrev-table xrdb-mode-abbrev-table) + (use-local-map xrdb-mode-map) + ;; local variables + (make-local-variable 'parse-sexp-ignore-comments) + (make-local-variable 'comment-start) + (make-local-variable 'comment-end) + (make-local-variable 'paragraph-start) + (make-local-variable 'paragraph-separate) + (make-local-variable 'paragraph-ignore-fill-prefix) + ;; now set their values + (setq parse-sexp-ignore-comments t + comment-start "! " + comment-end "") + (setq indent-region-function 'xrdb-indent-region + paragraph-ignore-fill-prefix t + paragraph-start (concat "^[ \t]*$\\|^[ \t]*[!]\\|" page-delimiter) + paragraph-separate paragraph-start) + (run-hooks 'xrdb-mode-hook)) + + + +;; faces and font-locking +(require 'font-lock) +(make-face 'xrdb-option-name-face) +(make-face 'xrdb-option-value-face) +(or (face-differs-from-default-p 'xrdb-option-name-face) + (copy-face 'font-lock-keyword-face 'xrdb-option-name-face)) +(or (face-differs-from-default-p 'xrdb-option-value-face) + (copy-face 'font-lock-string-face 'xrdb-option-value-face)) + +(defvar xrdb-font-lock-keywords + (list '("^[ \t]*\\([^\n:]*:\\)[ \t]*\\(.*\\)$" + (1 xrdb-option-name-face) + (2 xrdb-option-value-face))) + "Additional expressions to highlight in Xrdb mode.") + +(put 'xrdb-mode 'font-lock-defaults '(xrdb-font-lock-keywords nil)) + + + +;; commands +(defun xrdb-region-goal-column () + ;; Returns the goal column of the current region. Assumes the + ;; buffer has been narrowed to the region to scan. + (save-excursion + (beginning-of-buffer) + (let ((goalcol -1) + linecol) + (while (< (point) (point-max)) + ;; skip any comments + (if (and (not (looking-at xrdb-comment-re)) + (xrdb-skip-to-separator) + (< goalcol (setq linecol (current-column))) + ) + (setq goalcol linecol)) + (forward-line 1)) + (if (< goalcol 0) + nil + goalcol)))) + + + +;; submitting bug reports + +(defconst xrdb-version "1.17" + "xrdb-mode version number.") + +(defconst xrdb-mode-help-address "tools-help@python.org" + "Address for xrdb-mode bug reports.") + +(eval-when-compile + (require 'reporter)) + +(defun xrdb-submit-bug-report () + "Submit via mail a bug report on xrdb-mode." + (interactive) + ;; load in reporter + (let ((reporter-prompt-for-summary-p t) + (varlist '(xrdb-subdivide-by + xrdb-mode-hook + ))) + (and (if (y-or-n-p "Do you want to submit a report on xrdb-mode? ") + t + (message "") + nil) + (require 'reporter) + (reporter-submit-bug-report + xrdb-mode-help-address "xrdb-mode" varlist nil nil "Dear Barry,") + ))) + + +(provide 'xrdb-mode) +;; xrdb-mode.el ends here
--- a/lisp/oobr/BR-COPY Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/BR-COPY Mon Aug 13 09:15:11 2007 +0200 @@ -2,19 +2,51 @@ # SUMMARY: Copyright notice and license for the OO-Browser # # AUTHOR: Bob Weiner +# ORG: InfoDock Associates # # ORIG-DATE: 16-Dec-89 -# LAST-MOD: 21-Jun-95 at 12:52:56 by Bob Weiner +# LAST-MOD: 20-Feb-97 at 11:04:23 by Bob Weiner # # This file is part of the OO-Browser. -Copyright (C) 1989-1995 Free Software Foundation, Inc. +InfoDock Associates, the developer of the OO-Browser and InfoDock (an +industrial quality turn-key version of XEmacs), donates its work on +the OO-Browser to the Free Software Foundation and makes it freely +available for worldwide distribution. + +InfoDock Associates is a commercial firm dedicated to radical productivity +improvement in technical environments, whether in software development or +other knowledge intensive disciplines. Our initial offerings include high +quality commercial support, training, books and custom package development +for InfoDock, XEmacs or GNU Emacs on a variety of platforms. + +Contact us at <info@infodock.com> or visit our web site at +http://www.infodock.com. + + ------------------ + +Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. + Available for use and distribution under the terms of the GNU Public License, Version 2 or greater. -This software package, called the OO-Browser, including all associated -source, byte-compiled code and utilities are herein referred to as the -PROGRAM. +The OO-Browser is free software; you can use it, redistribute it +and/or modify it without fee under the terms of the GNU General Public +License as published by the Free Software Foundation; either version +2, or (at your option) any later version. + +The OO-Browser is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. -Motorola Inc. has donated the PROGRAM to the Free Software Foundation under -the terms of the GNU Public License. +InfoDock Associates sells support and development services for this +package and most other aspects of Emacs, XEmacs or InfoDock. Contact +information is at the top of the "BR-README" file. + +You should have received a copy of the GNU General Public License along with +GNU Emacs, XEmacs or InfoDock; see the file etc/COPYING below the root +directory of your editor source tree. If you do not have a copy, you can +write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, +USA to obtain one, <gnu@gnu.ai.mit.edu>. +
--- a/lisp/oobr/BR-FEATURES Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/BR-FEATURES Mon Aug 13 09:15:11 2007 +0200 @@ -4,7 +4,7 @@ # AUTHOR: Bob Weiner # # ORIG-DATE: 15-Oct-90 -# LAST-MOD: 3-May-96 at 21:30:00 by Harri Pasanen +# LAST-MOD: 21-Feb-97 at 16:37:30 by Bob Weiner # # Copyright (C) 1990-1995 Free Software Foundation, Inc. # See the file BR-COPY for license information. @@ -18,23 +18,25 @@ similar in use to the well-known Smalltalk browsers. It is unique in a number of respects foremost of which is that it works well with a multiplicity of object-oriented languages. It provides both textual -views within an editor and graphical views under the X window system. +views within an editor and graphical views under the X and NEXTSTEP window +systems. * Support for all popular OO Languages on UNIX ---------------------------------------------- - ** Contains support for Eiffel, C++, Objective-C, Common Lisp and its - Object System (CLOS), Java, Python, and Smalltalk class browsing. - Additionally, support for browsing large amounts of material in Info - format by node name (a popular online documentation format with cross - references and hierarchical structure) is included. + ** Support for C, C++, Common Lisp and its Object System (CLOS), Eiffel, + Java, Objective-C, Python and Smalltalk class browsing is included. + Additionally, support for browsing large amounts of material in Info + format by node name (a popular online documentation format with cross + references and hierarchical structure) is included. All languages + provide class browsing via either a textual or a graphical interface. - ** Method browsing is supported for C++, Objective-C, Eiffel, Java, - Python and CLOS. CLOS supports browsing all elements defined with - (def* constructs. In-source feature browsing is also supported for - all of these languages. One simply selects a feature name to jump to - its corresponding source. Method name overloading in C++ and inherited + ** Method and typically attribute browsing is supported for all languages + except Smalltalk. CLOS supports browsing all elements defined with + (def* constructs. In-source feature browsing is also supported for all + of these languages. One simply selects a feature name to jump to its + corresponding source. Method name overloading in C++ and inherited feature renaming in Eiffel are fully supported. ** C code browsing is supported for C++, Objective-C and C source code. @@ -43,6 +45,8 @@ ** C++ parameterized template classes and methods are supported. + ** Java abstract and native (externally defined) methods are supported. + ** Immediate switching among languages is allowed. One can switch from Eiffel browsing to C++ browsing in an instant, if so desired. Or simply run two OO-Browsers side by side. @@ -52,12 +56,10 @@ ** Statistics on classes and Environments may be displayed. ** Language-specific class information may be shown. Presently this - feature is supported only for Eiffel and Python. For Eiffel, a - listing of class parents, attributes, routines and best guess - (highly accurate) list of routine calls may be displayed. Outputs - from the Eiffel 'short' and 'flat' commands may also be shown. - For Python this feature is used to browse documentation strings in - classes and methods. + feature is supported only for Eiffel. A listing of class parents, + attributes, routines and best guess (highly accurate) list of + routine calls may be displayed. Outputs from the Eiffel `short' + and `flat' commands may also be shown. * For Serious Use @@ -69,8 +71,8 @@ Environment. There are no fixed limits on the number of classes per Environment nor on the number of Environments that may be browsed. - ** All source code, over 400 kilobytes, is included and is heavily - documented. + ** All source code, over 400 kilobytes, is included and is heavily + documented. * Ease of Use @@ -81,6 +83,7 @@ OO-Browser is pre-configured for use with the X window system, NEXTSTEP, Sunview or Apollo's DM window system under InfoDock, Emacs V19, XEmacs, Epoch, and Emacs V18. Online mouse usage help is always one key away. + (Don't try that level of platform independence with Java!) ** Popup and pulldown command menus are available under InfoDock, Emacs V19 and XEmacs. @@ -129,7 +132,9 @@ gain several views of classes in the same or in multiple environments. All graphical browsers can communicate with a single textual browser, so one can quickly display and edit classes from different environments - (even different languages). + (even different languages). Multiple inheritance is handled through + repetition of nodes throughout the tree; repeated nodes are followed by + ellipses to indicate multiple inheritance. ** The OO-Browser uses class source code only, hence no compiler is necessary for proper browser operation. This allows one to explore
--- a/lisp/oobr/BR-OBTAIN Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/BR-OBTAIN Mon Aug 13 09:15:11 2007 +0200 @@ -4,7 +4,7 @@ # AUTHOR: Bob Weiner # # ORIG-DATE: 5-Mar-95 -# LAST-MOD: 22-Aug-95 at 16:23:35 by Bob Weiner +# LAST-MOD: 21-Feb-97 at 18:56:17 by Bob Weiner # # Copyright (C) 1995 Free Software Foundation, Inc. # See the file BR-COPY for license information. @@ -17,8 +17,8 @@ all in one package. Get it via anonymous ftp from host ftp.xemacs.org in the /pub/infodock directory. -It is a standard part of the forthcoming XEmacs 19.12 release. The Free -Software Foundation also intends to add it to GNU Emacs. +It is a standard part of XEmacs versions 19.12 and above. The Free +Software Foundation also encourages its use with GNU Emacs. The OO-Browser is also available as a standalone package via anonymous ftp across the Internet. Do not send requests to have it mailed to you since it @@ -35,7 +35,7 @@ Ftp to ftp.xemacs.org (Internet Host ID = 128.174.252.16): - prompt> ftp ftp.xemacs.org + prompt> ftp ftp.xemacs.org (If this doesn't work, try `ftp xemacs.org'.) Login as 'anonymous' with your own <user-id>@<site-name> as a password.
--- a/lisp/oobr/BR-README Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/BR-README Mon Aug 13 09:15:11 2007 +0200 @@ -1,13 +1,18 @@ -# See "br-vers.el" for the OO-Browser Lisp Code Directory information. +# See "br-vers.el" for the OO-Browser lisp code directory entry. # # SUMMARY: OO-Browser overview and installation notes # # AUTHOR: Bob Weiner # +# ORG: InfoDock Associates. We sell corporate support and development +# contracts for InfoDock, Emacs and XEmacs. +# E-mail: <info@infodock.com> Web: http://www.infodock.com +# Tel: +1 408-243-3300 +# # ORIG-DATE: 16-Jun-90 -# LAST-MOD: 3-May-96 at 20:45:00 by Harri Pasanen +# LAST-MOD: 21-Feb-97 at 17:05:39 by Bob Weiner # -# Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. +# Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. # See the file BR-COPY for license information. # # This file is part of the OO-Browser. @@ -43,41 +48,43 @@ * Mail Lists =========================================================================== -<oo-browser@hub.ucsb.edu> - mail list -<oo-browser-request@hub.ucsb.edu> - administrative requests +<oo-browser@infodock.com> - mail list +<oo-browser-request@infodock.com> - add/change/delete requests - The oo-browser mail list is for discussion, bug reports and feature - requests concerning the OO-Browser multi-language code browser. - If your Emacs version supports menubars and popup menus, you can use the - Compose-Mail-to-List and Mail-List-Request menu items to access the - mail list and administrative address, respectively, when in the OO-Browser. + The oo-browser mail list is for public discussion, bug reports and feature + ideas concerning the OO-Browser multi-language code browser. If your + Emacs version supports menubars and popup menus, you can use the + Compose-Mail-to-List and Mail-List-Request menu items to access the mail + list and request address, respectively, when in the OO-Browser. + + If you ask questions, you should consider adding to the discussion by + telling people the kinds of work you are doing or contemplating doing + with the OO-Browser. In this way, the list will not be overwhelmed by + messages that ask for, but provide no information. ALL mail concerning administration of the OO-Browser mailing list should be sent to the -request address. That includes addition, change, or deletion requests. Don't EVER consider sending such a request to the oo-browser mail list. - Use the following formats on your subject line to execute requests, - where you substitute your own values for the <> delimited items. + Use the following formats in the *body* of your message to execute requests, + where you substitute your own values for the <> delimited items and items + enclosed in [] are optional. - Subject: Subscribe '<' <user@domain> '>' (<your name>). - Subject: Unsubscribe '<' <user@domain> '>'. - - To change your address, you must unsubscribe your old address in one - message and then subscribe your new address in another message. + subscribe oo-browser [<your-email-address>] + or + unsubscribe oo-browser [<your-email-address>] For example: - To: oo-browser-request@hub.ucsb.edu - Subject: Unsubscribe <joe@any.com>. + To: oo-browser-request@infodock.com + Subject: Used if a human happens to read your mail. - To: oo-browser-request@hub.ucsb.edu - Subject: Subscribe <joe@any.com> (Joe Williams). + subscribe oo-browser joe@nowhere.gov - If you ask questions, you should consider adding to the discussion by - telling people the kinds of work you are doing or contemplating doing - with the OO-Browser. In this way, the list will not be overwhelmed by - messages that ask for, but provide no information. + To change your address, you must unsubscribe your old address with + once command and subscribe your new address with another command, though + you can embed multiple commands on separate lines within a single message. =========================================================================== @@ -88,7 +95,7 @@ If you have the Hyperbole system installed, you must be using V3.18.4 or greater. Otherwise, you must upgrade. Get Hyperbole - from: /anonymous@ftp.xemacs.org:/pub/infodock. Get the h* + from: "ftp://ftp.xemacs.org/pub/infodock". Get the h* files in that directory. Once you have this version installed, you can safely delete the oobr/hypb/ directory, which duplicates a subset of the Hyperbole files to provide the OO-Browser with @@ -97,10 +104,10 @@ so that the OO-Browser Makefile can see the Hyperbole files it needs. Add the full path of either the Hyperbole code directory or the - "oobr/hypb/" subdirectory to your 'load-path' variable. + "oobr/hypb/" subdirectory to your `load-path' variable. - You may want to change the settings of 'c++-cpp-include-dirs' - and 'c++-include-dirs' at the bottom of "br-site.el". + You may want to change the settings of `c++-cpp-include-dirs' + and `c++-include-dirs' at the bottom of "br-site.el". If you prefer to use some non-GNU Emacs editor such as vi to view and edit your code, then modify to your taste the @@ -124,18 +131,6 @@ (global-set-key "\C-c\C-o" 'oo-browser) - It conceivable that you are not actively using all the languages that - OO-Browser supports. You can limit the list of offered languages by - providing your own definition of br-env-lang-avector, defined in - br-env.el. - - For example, to enable just C++ and Python browsing, add this to your - .emacs: - - (defvar br-env-lang-avector - '[("C++" . "c++-") - ("Python" . "python-")] - "Association vector of (LANGUAGE-NAME . LANGUAGE-PREFIX-STRING) elements of OO-Browser languages.") The OO-Browser's Emacs Lisp files are pre-byte-compiled for InfoDock, Emacs 19 and XEmacs, so if you run one of these versions, when you use @@ -146,7 +141,7 @@ "Makefile". You must set the EMACS variable to point to the Emacs executable that you want to use to byte-compile the OO-Browser Lisp files. You may also have to set SITE-PRELOADS; follow the instructions - that precede the 'SITE-PRELOADS =' line. Make these changes now and save + that precede the `SITE-PRELOADS =' line. Make these changes now and save the Makefile. If you are running Emacs V18 or Epoch, you must first rebuild all
--- a/lisp/oobr/BR-RELEASE Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/BR-RELEASE Mon Aug 13 09:15:11 2007 +0200 @@ -3,18 +3,81 @@ # # AUTHOR: Bob Weiner # +# ORG: InfoDock Associates. We sell corporate support and development +# contracts for InfoDock, Emacs and XEmacs. +# E-mail: <info@infodock.com> Web: http://www.infodock.com +# Tel: +1 408-243-3300 +# # ORIG-DATE: 15-Oct-90 -# LAST-MOD: 3-May-96 at 21:25:00 by Harri Pasanen +# LAST-MOD: 21-Feb-97 at 16:33:20 by Bob Weiner # -# Copyright (C) 1990-1995 Free Software Foundation, Inc. +# Copyright (C) 1990-1997 Free Software Foundation, Inc. # See the file BR-COPY for license information. # # This file is part of the OO-Browser. --------------------------------------------------------------------------- - VERSION 2.9.12 + VERSION 2.10 + +* OO-Browser Multi-language Changes + + ** Added Show-Inherited-Features toggle button to the OO-Browser Options + menu. This determines whether or not inherited features are shown + when listing class features. (The default is `on'.) + + ** Adding a single class to an Environment with the br-add-class command + now properly adds its features too. Similarly, the br-delete command + deletes associated features. + + ** X OO-Browser bug on some platforms that blackened the whole window after + drawing the tree may be eliminated on some platforms, but not all. + + ** br-edit-feature is now more flexible, permitting separate specification of + class and feature name arguments. + + ** Fixed br-find-file to never display a file in a browser listing window. + + ** Eliminated unnecessary execution of mode-specific hooks when scanning + class files. For example, invocation of syntax highlighting could + slow down scanning dramatically. + + ** Added InfoDock Associates contact info to version/credit screen that + appears on startup or when using the {C-c #} command in the browser + to make it easy for people to get commercial support or custom + develpment for the OO-Browser. + +* C++ OO-Browser -* Added support for Python language + ** Added support for multi-line virtual method declarations. + +* Java OO-Browser + + ** Attributes are now included as features of a class (you must rebuild + any existing Environment to have them included). They are prefaced + with "= " when shown in a browser listing buffer. + + ** Array return values from methods are now handled properly by the + OO-Browser scanner. + + ** Feature name completion now works properly, whenever the browser + prompts for a feature name. + + ** Added support for .jav files for 3-character suffix impaired users. + + ** Cleaned up a number of areas of the code that were improperly carried + over from the C++ OO-Browser. + + ** Removed support for threadsafe keyword since it has been deleted from + the language specification. + +* Objective-C OO-Browser + + ** objc-feature-matches can now take a regular expression and return + all matching features. + +* Python OO-Browser + + ** Included support for the Python object-oriented scripting language. --------------------------------------------------------------------------- VERSION 2.9.11
--- a/lisp/oobr/BR-VERSION Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/BR-VERSION Mon Aug 13 09:15:11 2007 +0200 @@ -1,13 +1,15 @@ - - The OO-Browser, Version <VERSION> + The OO-Browser, Version <VERSION> - Copyright (C) 1989-1995, Free Software Foundation, Inc. - Available for use and distribution under the terms of the GNU - Public License, version 2 or higher. + Bob Weiner designed and wrote the OO-Browser. + InfoDock Associates develops and maintains it for commercial use. + http://www.infodock.com <info@infodock.com> +1 408 243 3300 - Designed and written by Bob Weiner + Copyright (C) 1989-1997, Free Software Foundation, Inc. + Available for use and distribution under the terms of the GNU + Public License, version 2 or higher. - With thanks to Motorola, Inc. for funding and donating the work, - to Torgeir Veimo and Mark Stern for helping with the X OO-Browser - core, and to Don Yacktman for helping with the NEXTSTEP OO-Browser - core. + With thanks to Motorola, Inc. for helping fund initial development, + to Torgeir Veimo and Mark Stern for helping with the X OO-Browser + core, to Don Yacktman for helping with the NEXTSTEP OO-Browser + core, to Jeff Sparkes for help with Java language support and + to Harri Pasanen for help with Python language support.
--- a/lisp/oobr/ChangeLog Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/ChangeLog Mon Aug 13 09:15:11 2007 +0200 @@ -1,31 +1,185 @@ -Sat May 3 22:00:00 1996 Harri Pasanen <pa@tekla.fi> +Fri Feb 21 16:45:14 1997 Bob Weiner <weiner@infodock.com> + +* br-c-tags (etags): +* br-c-ft.el (c-build-element-tags): Added support for Microcruft OSs. + +* br-menu.el (id-popup-br-menu): + (id-menubar-br): Updated Mail-List-Request entries to new format. + +* br.el (br-in-browser): Tightened tests to require 3 or more windows to + be in the OO-Browser. This could eliminate a problem that prevents + restoration of the browser display if the variable, `br-in-browser', + is somehow left non-nil after the browser display is dismantled, + e.g. if a user simply deletes all other windows. + +Thu Feb 20 07:22:17 1997 Bob Weiner <weiner@infodock.com> + +* br-lib.el (br-scan-mode): Added this to eliminate execution of any + mode-specific hooks, such as syntax highlighting, when scanning files + to build Environments. + +Wed Feb 19 11:03:07 1997 Bob Weiner <weiner@infodock.com> + +* br-init.el (br-init-autoloads): Added autoload of hypb:display-file-with-logo. + +Thu Dec 5 17:51:43 1996 Bob Weiner <weiner@infodock.com> + +* Makefile: + MANIFEST: + oo-browser.texi: + python-browse.el: + br-python.el: + br-python-ft.el: + br-env.el (br-env-lang-avector): Added Python language support from + Harri Pasanen <pa@tekla.fi>, with a few modifications. + +Wed Nov 13 00:08:25 1996 Bob Weiner <weiner@infodock.com> + +* br-java-ft.el (java-type-modifier-keyword): Removed "threadsafe" since + deleted from java language. + +Tue Nov 12 15:12:28 1996 Bob Weiner <weiner@infodock.com> + +* java-brows.el (java-mode-setup): Added support for new Java mode in cc-mode.el. + +Mon Nov 11 17:23:57 1996 Bob Weiner <weiner@infodock.com> + +* br-menu.el (id-menubar-br): Added Show-Inherited-Features under Options. + +* br-c++-ft.el (c++-feature-def-p): Modified to handle multi-line virtual + method declarations. + +* br-java-ft.el (java-feature-locate-p): Eliminated unneeded C++ :: carryover logic. + (java-scan-features): + (java-feature-def-p): + (java-feature-name-to-regexp): + (java-feature-tree-command-p): + (java-feature-add-prefix): + (java-feature-def-p): + (java-feature-decl-or-def): Added attribute handling support. + +Sun Nov 3 19:49:26 1996 Bob Weiner <weiner@infodock.com> + +* br-env.el (br-env-load): Modified to load language-specific libraries if + not already loaded. + +Fri Nov 1 12:56:53 1996 Bob Weiner <weiner@infodock.com> -* added python-browse.el, br-python.el, br-python-ft.el, plus - modified the documentation in various places to reflect that addition. +* br-java.el (java-class-modifier-keyword): Removed `protected' which is + not a valid class modifier. +* br-java-ft.el (java-include-dirs): + (java-cpp-include-dirs): + (java-include-regexp): + (java-include-file): Deleted this stuff which never + should have been here, since Java doesn't use includes per se. + (java-code-file-regexp): Added support for 3-character + suffix-impaired users. + (java-feature-def-pat): Eliminated unneeded C++ carryover logic. + (java-type-modifier-keyword): Added `volatile' in + preparation for handling of attributes. + (java-abstract-method-regexp): Changed to original value in + preparation for handling of attributes. + +Thu Oct 31 14:25:02 1996 Bob Weiner <weiner@infodock.com> + +* br-lib.el (br-find-file): Fixed to ensure not to use listing windows + when in the OO-Browser. + +* br-ftr.el (br-edit-feature): + (br-feature-tag-and-file): Added to allow feature editing and + tag lookup by specifying class and feature name as separate arguments. + +* br-java-ft.el (java-feature-signature-to-name): Modified to use + java-type-tag-separator instead of "." as a separator between the class + and feature name, since this caused a failure when tried to do + completion on feature names with br-feature-complete. + (java-tag-fields-regexp): Made final occurrence of + java-type-tag-separator optional since it is not included if the + regexp came from a completion. + +* br-ftr.el (br-edit-feature-from-tag): Renamed from `br-edit-feature' so + can reuse that name with a simpler set of arguments. + +Wed Oct 30 19:50:34 1996 Bob Weiner <weiner@infodock.com> + +* br-lib.el (br-real-delete-class): Altered to also delete feature tags. + This is called by the br-delete command. + (br-setup-functions): Added "feature-map-class-tags" and + "feature-tag-regexp". +* br-*-ft.el (*-delete-features): Added to delete a class' features. + (*-feature-tag-regexp): Added to return a tag regexp from + class and feature name. + (*-feature-map-class-tags): Added to map over the feature + tags of a single class. -Wed Oct 25 04:49:51 1995 Bob Weiner <weiner@mot.com> +* br-objc-ft.el (objc-feature-matches): Modified to take a regexp to + conform with other languages. +* br-*-ft.el (*-feature-map-tags): Added this function to map over a set + of entries in a feature tags file and return the results. + (*-feature-matches): Fixed bug that failed to properly + delimit identifier character ranges with square brackets, causing all + but exact matches to fail. + +* br-java-ft.el (java-feature-display): Renamed from java-feature-tags-lookup. +* br-objc-ft.el (objc-feature-display): Renamed from objc-feature-tags-lookup. +* br-c++-ft.el (c++-feature-display): Renamed from c++-feature-tags-lookup. + +* br-lib.el (br-add-class): + (br-real-add-class): Fixed bug that did not add features of a + class when br-add-class was called interactively. Added the + optional add-features argument to handle this. + +* br-java-ft.el (java-return-type-identifier): Fixed bug that neglected + to allow the open square bracket of an array return identifier and + thus caused the scanner to miss methods with such return values. + +Tue Oct 22 23:16:02 1996 Bob Weiner <weiner@infodock.com> + +* tree-x/intf.c (InitializeInterface): Renabled use of backing store + in DBLcreate_double_buffer call to eliminate nasty bug on some + platforms that blackened the whole window after drawing the tree. + This may not have completely fixed the problem though. + +Fri Sep 20 22:21:30 1996 Bob Weiner <weiner@freya.yggdrasil.com (Bob Weiner)> + +* Changed `cs.uiuc.edu' to `xemacs.org', the new OO-Browser distribution site. + +============================================================================== +* V2.10 changes ^^^^: +============================================================================== + +This version was made by XEmacs maintainers to include Python support +and update a few documentation references. It was a separate branch +from the mainline development that we synchronized with in the next +release. + +============================================================================== +* V2.9.12 changes ^^^^: +============================================================================== + +Wed Oct 25 04:49:51 1995 Bob Weiner <weiner@infodock.com> * BR-README: Reformatted with a table of contents for easy viewing. Rewrote Installation / Configuration section. -Sun Oct 22 00:41:50 1995 Bob Weiner <weiner@mot.com> +Sun Oct 22 00:41:50 1995 Bob Weiner <weiner@infodock.com> * br-menu.el (br-menubar-menu): Fixed bug when current-menubar was nil, would not display menubar entry under Emacs 19 even though it should. -Sat Oct 21 02:02:27 1995 Bob Weiner <weiner@mot.com> +Sat Oct 21 02:02:27 1995 Bob Weiner <weiner@infodock.com> * br-c-tags (tags_file): Fixed bug that erased first comma in a structure or enum entries, preventing the browser from displaying the source for such entries. -* br-init.el (br-after-term-init): Changed call of 'hmouse-setup' to - 'hmouse-shift-buttons' which fixes bug of mouse keys not being +* br-init.el (br-after-term-init): Changed call of `hmouse-setup' to + `hmouse-shift-buttons' which fixes bug of mouse keys not being initialized properly and hmouse-setup function being undefined when a full Hyperbole distribution is not available. -Wed Oct 4 13:41:52 1995 Bob Weiner <weiner@mot.com> +Wed Oct 4 13:41:52 1995 Bob Weiner <weiner@infodock.com> * br-java-ft.el (java-feature-parens-grpn): (java-feature-decl-or-def): Added support for new @@ -33,7 +187,7 @@ public Connection(String host, int port) throws UnknownHostException, InputOutputException {} -Wed Sep 27 15:39:51 1995 Bob Weiner <weiner@mot.com> +Wed Sep 27 15:39:51 1995 Bob Weiner <weiner@infodock.com> * hasht.el (hash-delete): Modified to deal with XEmacs different handling of initially unbound symbols. @@ -44,12 +198,12 @@ * V2.9.11 changes ^^^^: ============================================================================== -Fri Sep 22 10:12:26 1995 Bob Weiner <weiner@mot.com> +Fri Sep 22 10:12:26 1995 Bob Weiner <weiner@infodock.com> * br-java.el (java-get-package-name): Fixed problem with nil package name being used as hash table key. -Thu Sep 21 12:16:48 1995 Bob Weiner <weiner@mot.com> +Thu Sep 21 12:16:48 1995 Bob Weiner <weiner@infodock.com> * br.el (br-add-class-file): Signal error if file is not readable. * br-lib.el (br-real-add-class): @@ -59,7 +213,7 @@ stop if encountered an unreadable file or invalid link. Now just displays a message. -Wed Sep 20 12:30:37 1995 Bob Weiner <weiner@mot.com> +Wed Sep 20 12:30:37 1995 Bob Weiner <weiner@infodock.com> * br.el (br-report-bug): Added to send a message to oo-browser discussion list and bound to {C-c C-b}. @@ -105,7 +259,7 @@ * V2.9.10 changes ^^^^: ============================================================================== -Thu Sep 14 11:37:40 1995 Bob Weiner <weiner@mot.com> +Thu Sep 14 11:37:40 1995 Bob Weiner <weiner@infodock.com> * br-env.el (br-env-browse): Modified to specify non-existing Environments, so can be called by {M-x oo-browser}. @@ -120,7 +274,7 @@ location. Immediately hitting {RET} when prompted browses the most recently browsed Environment, if any. -Wed Sep 13 11:21:17 1995 Bob Weiner <weiner@mot.com> +Wed Sep 13 11:21:17 1995 Bob Weiner <weiner@infodock.com> * man/oo-browser.texi (Customization): Documented br-skip-dir-regexps and br-file-dir-regexp variables. @@ -129,7 +283,7 @@ a language-specific one, since all languages had the same value. Also modified value to handle one character directory names. -Tue Sep 12 16:05:26 1995 Bob Weiner <weiner@mot.com> +Tue Sep 12 16:05:26 1995 Bob Weiner <weiner@infodock.com> * br.el (br-interrupt): Fixed bug that prevented burying of browser buffers when {q} is invoked. @@ -141,12 +295,12 @@ * V2.9.9 changes ^^^^: ============================================================================== -Mon Aug 28 18:16:57 1995 Bob Weiner <weiner@mot.com> +Mon Aug 28 18:16:57 1995 Bob Weiner <weiner@infodock.com> * tree-x/tree.c (MakeNode): Use memset when SYSV is defined instead of BSD bzero call. -Sat Aug 26 15:19:41 1995 Bob Weiner <weiner@mot.com> +Sat Aug 26 15:19:41 1995 Bob Weiner <weiner@infodock.com> * man/oo-browser.texi (Java Specifics): Added this section. @@ -154,7 +308,7 @@ * br-java-ft.el: Fixed comment handling for many routines, identifier regexp definition, and handling of / native method listing prefix. -Fri Aug 25 19:35:03 1995 Bob Weiner <weiner@mot.com> +Fri Aug 25 19:35:03 1995 Bob Weiner <weiner@infodock.com> * br-java-ft.el: Removed wrong references to :: scoping modifier left over from C++ code. @@ -163,11 +317,11 @@ * V2.9.8 changes ^^^^: ============================================================================== -Thu Aug 24 17:10:46 1995 Bob Weiner <weiner@mot.com> +Thu Aug 24 17:10:46 1995 Bob Weiner <weiner@infodock.com> * br-lib.el (br-delete-space): Fixed bug in handling multi-line strings. -Wed Aug 23 11:41:25 1995 Bob Weiner <weiner@mot.com> +Wed Aug 23 11:41:25 1995 Bob Weiner <weiner@infodock.com> * MANIFEST: Makefile: @@ -186,31 +340,31 @@ * V2.9.7 changes ^^^^: ============================================================================== -Fri Jul 14 15:28:17 1995 Bob Weiner <weiner@mot.com> +Fri Jul 14 15:28:17 1995 Bob Weiner <weiner@infodock.com> * Makefile (distclean): Modified to remove unneeded object and binary files from tree-x and tree-nx. -Thu Jul 13 11:30:57 1995 Bob Weiner <weiner@mot.com> +Thu Jul 13 11:30:57 1995 Bob Weiner <weiner@infodock.com> * br-lib.el (br-add-to-paths-htable): Don't add class if already in the table. -Wed Jul 12 14:33:44 1995 Bob Weiner <weiner@mot.com> +Wed Jul 12 14:33:44 1995 Bob Weiner <weiner@infodock.com> * br.el (br-add-class-file): Simplified and corrected errors when class already existed in Environment. -Tue Jul 11 14:18:23 1995 Bob Weiner <weiner@mot.com> +Tue Jul 11 14:18:23 1995 Bob Weiner <weiner@infodock.com> * tree-x/intf.c (NewTree_CB): Allocated an extra char for string terminator. -Fri Jun 2 10:14:19 1995 Bob Weiner <weiner@mot.com> +Fri Jun 2 10:14:19 1995 Bob Weiner <weiner@infodock.com> * br-c++.el (c++-identifier): Fixed to match to "class< template<T> >" expressions, i.e. nested <<>>. Only handles a single template parameter, however. -Thu Jun 1 10:26:38 1995 Bob Weiner <weiner@mot.com> +Thu Jun 1 10:26:38 1995 Bob Weiner <weiner@infodock.com> * tree-x/Makefile: Rewrote for increased configurability. @@ -218,7 +372,7 @@ * V2.9.6 changes ^^^^: ============================================================================== -Fri May 19 08:59:14 1995 Bob Weiner <weiner@mot.com> +Fri May 19 08:59:14 1995 Bob Weiner <weiner@infodock.com> * eif-calls.el (eif-reserved-words): Added new Eiffel V3 keywords. @@ -237,7 +391,7 @@ * V2.9.5 changes ^^^^: ============================================================================== -Tue May 16 11:54:33 1995 Bob Weiner <weiner@mot.com> +Tue May 16 11:54:33 1995 Bob Weiner <weiner@infodock.com> * br-env.el (br-env-lang-avector): Changed "CLOS" to "Lisp" since the browser can browse non-OO Lisp, too. @@ -246,7 +400,7 @@ * V2.9.4 changes ^^^^: ============================================================================== -Fri May 12 13:44:21 1995 Bob Weiner <weiner@mot.com> +Fri May 12 13:44:21 1995 Bob Weiner <weiner@infodock.com> * br-env.el (br-env-stats): (br-env-save): @@ -258,7 +412,7 @@ (br-env-load): Prompt to rebuild obsolete C++, Objective-C and Eiffel environments which do not have version numbers. -Thu May 11 11:11:04 1995 Bob Weiner <weiner@mot.com> +Thu May 11 11:11:04 1995 Bob Weiner <weiner@infodock.com> * br-c-ft.el (c-build-element-tags): Fixed to handle an empty buffer. @@ -271,7 +425,7 @@ * br-env.el (br-env-select-lang): Tightened check for use of dialog box so won't be even if popup-dialog-box is defined by lmenu.el under GNU Emacs. -* br.el (br-window-setup): Fixed to clear frame 'unsplittable' property if +* br.el (br-window-setup): Fixed to clear frame `unsplittable' property if set. * br-eif-ft.el (eif-feature-signature-to-regexp): Fixed bug which @@ -285,7 +439,7 @@ * Makefile (install): Changed to install documentation. -Mon May 8 18:21:33 1995 Bob Weiner <weiner@mot.com> +Mon May 8 18:21:33 1995 Bob Weiner <weiner@infodock.com> * man/oo-browser.texi (Using the Mouse): * br-init.el (br-after-term-init): @@ -296,10 +450,10 @@ * V2.9.2 changes ^^^^: ============================================================================== -Fri May 5 12:30:08 1995 Bob Weiner <weiner@mot.com> +Fri May 5 12:30:08 1995 Bob Weiner <weiner@infodock.com> * Makefile: Removed building of Info and Postscript versions of the - OO-Browser manual from default 'make'. Use 'make info' and 'make ps', + OO-Browser manual from default `make'. Use `make info' and `make ps', respectively. * br.el (br-toggle-c-tags): @@ -310,7 +464,7 @@ increased speed of feature listing by including feature name in tag lines. Also added in C element browsing. -Thu May 4 13:32:38 1995 Bob Weiner <weiner@mot.com> +Thu May 4 13:32:38 1995 Bob Weiner <weiner@infodock.com> * br-c++-ft.el (c++-feature-def-pat): * br-compl.el (br-class-completions): @@ -318,13 +472,13 @@ * br-c++-ft.el (c++-type-def-modifier): (c++-member-modifier-keyword): - (c++-type-modifier-keyword): Added 'mutable' keyword, for + (c++-type-modifier-keyword): Added `mutable' keyword, for objects which are never const. - (c++-type-modifier-keyword): Added 'explicit' keyword, for new + (c++-type-modifier-keyword): Added `explicit' keyword, for new constructors and operators which do not allow implicit argument conversions. -Wed May 3 11:06:13 1995 Bob Weiner <weiner@mot.com> +Wed May 3 11:06:13 1995 Bob Weiner <weiner@infodock.com> * br-lib.el (br-setup-constants): Added "type-tag-separator" so could be referenced outside of language-specific files. @@ -349,10 +503,10 @@ * br-c-tags: Added to build feature tags for default C construct classes. -Tue May 2 11:08:53 1995 Bob Weiner <weiner@mot.com> +Tue May 2 11:08:53 1995 Bob Weiner <weiner@infodock.com> * br-c++-ft.el (c++-operator-identifier): Added support for new C++ - 'delete' and 'new' array operators which end with []. + `delete' and `new' array operators which end with []. * br-lib.el (br-get-htable): * br-env.el (br-build-parents-htable): @@ -373,7 +527,7 @@ * Makefile (tags): Replaced all - with underscore in variable names to satisfy the AIX sh. -Fri Apr 28 12:02:01 1995 Bob Weiner <weiner@mot.com> +Fri Apr 28 12:02:01 1995 Bob Weiner <weiner@infodock.com> * br-c++-ft.el (c++-list-features): Rewrote to accomodate C construct browsing. (c++-element-type-alist): Added. @@ -389,7 +543,7 @@ * br-menu.el (br-menubar-menu): Fixed bug that prevented OO-Browser popup from coming up under XEmacs. -Thu Apr 27 17:36:06 1995 Bob Weiner <weiner@mot.com> +Thu Apr 27 17:36:06 1995 Bob Weiner <weiner@infodock.com> * br-c++-ft.el (c++-return-type-identifier): Allowed spaces between template parameters. @@ -398,11 +552,11 @@ no features. * br-c++-ft.el (c++-feature-decl-or-def): Updated to avoid undesired - matches to 'enum var {};' and related sorts of constructs for now + matches to `enum var {};' and related sorts of constructs for now since we don't deal with them and they would end up in the default [function] class improperly. -Wed Apr 26 11:32:07 1995 Bob Weiner <weiner@mot.com> +Wed Apr 26 11:32:07 1995 Bob Weiner <weiner@infodock.com> * br-lib.el (br-setup-functions): * br.el (br-mode-map): Added br-view-friend bound to {M-v}. For now, just @@ -430,18 +584,18 @@ br-c++.el: Rewrote to handle a wider variety of template-based definitions. -Tue Apr 25 14:35:54 1995 Bob Weiner <weiner@mot.com> +Tue Apr 25 14:35:54 1995 Bob Weiner <weiner@infodock.com> * br-c++-ft.el (c++-operator-identifier): Fixed to support overloading of operators [] and (). -Mon Apr 24 14:52:11 1995 Bob Weiner <weiner@mot.com> +Mon Apr 24 14:52:11 1995 Bob Weiner <weiner@infodock.com> * br-c++-ft.el: Rewrote to cache feature name within each tag entry, to speed up feature entry listings. br-c++-ft.el (c++-scan-features-in-class): Fixed to list this feature - 'operator int() { return i; }', as 'operator int' instead of just - 'int'. + `operator int() { return i; }', as `operator int' instead of just + `int'. * br-eif-ft.el (eif-type-tag-separator): br-objc-ft.el (objc-type-tag-separator): @@ -449,11 +603,11 @@ support inclusion of more information in feature tag entries. | could interfere with this in some languages. -Mon Apr 17 17:23:33 1995 Bob Weiner <weiner@mot.com> +Mon Apr 17 17:23:33 1995 Bob Weiner <weiner@infodock.com> * br-ftr.el (br-feature-clear-signatures): Fixed V19 version to use optional buf-nm parameter when given. - (br-feature-type-regexp): Added '>' character used by Eiffel + (br-feature-type-regexp): Added `>' character used by Eiffel deferred features. * br-eif.el: @@ -467,14 +621,14 @@ * V2.9 changes ^^^^: ============================================================================== -Fri Apr 14 15:31:17 1995 Bob Weiner <weiner@mot.com> +Fri Apr 14 15:31:17 1995 Bob Weiner <weiner@infodock.com> * man/oo-browser.ps: Removed from the distribution. Too large; users who need it can build it themselves. * *.el: Added KEYWORDS: header. -Thu Apr 13 14:30:30 1995 Bob Weiner <weiner@mot.com> +Thu Apr 13 14:30:30 1995 Bob Weiner <weiner@infodock.com> * br-c++.el (c++-get-classes-from-source): Made the scanner tolerate class definitions that don't end with a semicolon. @@ -492,26 +646,26 @@ (c++-pure-virtual-function-regexp): Added support for including pure virtual functions in class member listings. -Wed Apr 12 17:07:38 1995 Bob Weiner <weiner@mot.com> +Wed Apr 12 17:07:38 1995 Bob Weiner <weiner@infodock.com> * br-c++-ft.el (c++-type-identifier-group): (c++-feature-decl-or-def): Fixed bug in regexp that could cause a definition of "main()" to show up as "- n" in a listing buffer since the wrong group would grab "mai". -Tue Apr 11 12:55:11 1995 Bob Weiner <weiner@mot.com> +Tue Apr 11 12:55:11 1995 Bob Weiner <weiner@infodock.com> * br-clos-ft.el (clos-element-tag-list): Fixed to ignore any parameters following an &keyword since these cannot be specialized (given a specific type). Also assigned all methods which are not specialized to CLOS - default class 't'. + default class `t'. * BR-README: Clarified autoload directions. * br-c++-ft.el (c++-feature-decl-or-def): Allowed for whitespace following the :: scoping operator. Some people actually use it. -* br.el (br-feature-signature-regexp): Added a ':' to this expression +* br.el (br-feature-signature-regexp): Added a `:' to this expression since this is used by C++ feature completions. * hmouse-br.el (smart-br): @@ -525,16 +679,16 @@ * V2.8.6 changes ^^^^: ============================================================================== -Sat Apr 8 13:53:43 1995 Bob Weiner <weiner@mot.com> +Sat Apr 8 13:53:43 1995 Bob Weiner <weiner@infodock.com> * man/oo-browser.texi (Top): Added credits. -Fri Apr 7 11:57:20 1995 Bob Weiner <weiner@mot.com> +Fri Apr 7 11:57:20 1995 Bob Weiner <weiner@infodock.com> * man/oo-browser.texi: Changed name from oobr.texi so that filename need not be included in Info directory listings. -Thu Apr 6 10:20:07 1995 Bob Weiner <weiner@mot.com> +Thu Apr 6 10:20:07 1995 Bob Weiner <weiner@infodock.com> * man/oobr.texi (Using the Mouse): Added a paragraph on the InfoDock/XEmacs menus. @@ -547,7 +701,7 @@ (BATCHFLAGS): Removed -no-site-file so addition of the OO-Browser directory to load-path may be done in site-start.el. -Wed Apr 5 17:11:31 1995 Bob Weiner (weiner@mot.com) +Wed Apr 5 17:11:31 1995 Bob Weiner <weiner@infodock.com> * br-c++.el (c++-parent-regexp): Added an extra c++-comment-regexp so that class parents with following C++ comments are found: @@ -556,7 +710,7 @@ // silly set of comments {} -Wed Apr 5 09:07:35 1995 Bob Weiner <weiner@mot.com> +Wed Apr 5 09:07:35 1995 Bob Weiner <weiner@infodock.com> * br-tree.el (br-tree-x-load-tree-file): Coerced string to int for concat. @@ -564,24 +718,24 @@ * V2.8.5 changes ^^^^: ============================================================================== -Mon Apr 3 18:16:35 1995 Bob Weiner <weiner@mot.com> +Mon Apr 3 18:16:35 1995 Bob Weiner <weiner@infodock.com> * br.el (br-inherited-features): Added this command to show all features of a class. (br-inherited-features-flag): Added to control whether - 'br-features' displays all inherited features or just lexically + `br-features' displays all inherited features or just lexically included ones. Default is t, all inherited features. -Sun Apr 2 18:08:23 1995 Bob Weiner <weiner@mot.com> +Sun Apr 2 18:08:23 1995 Bob Weiner <weiner@infodock.com> * br-menu.el: Added this file of menus for the OO-Browser from InfoDock and adapted for use under standard XEmacs. -Sat Apr 1 14:43:00 1995 Bob Weiner <weiner@mot.com> +Sat Apr 1 14:43:00 1995 Bob Weiner <weiner@infodock.com> * br-c++-ft.el (c++-func-args-regexp): (c++-func-args-string): Modified to add optional spaces - between a C++ type and '*' or '&' characters since the spacing + between a C++ type and `*' or `&' characters since the spacing sometimes varies between declaration and definition, e.g. declaration is "func(const List<T>&);" and def is "func(const List<T> &id) {}". @@ -590,7 +744,7 @@ * br-ftr.el (br-find-feature): br-c++-ft.el (c++-feature-tags-lookup): Modified to call br-edit-feature. -Fri Mar 31 13:44:57 1995 Bob Weiner <weiner@mot.com> +Fri Mar 31 13:44:57 1995 Bob Weiner <weiner@infodock.com> * br-c++-ft.el (c++-class-decl-p): Fixed to properly match to template classes. @@ -604,7 +758,7 @@ * V2.8.4 changes ^^^^: ============================================================================== -Tue Mar 28 15:13:51 1995 Bob Weiner <weiner@mot.com> +Tue Mar 28 15:13:51 1995 Bob Weiner <weiner@infodock.com> * br-c++-ft.el (c++-type-identifier): br-c++.el (c++-identifier): Updated to handle C++ names with multiple @@ -617,7 +771,7 @@ Renamed sample TREE to TREE.objc. Added sample TREE.c++ file as example of browsing C++ template classes. -Mon Mar 27 01:07:18 1995 Bob Weiner <weiner@mot.com> +Mon Mar 27 01:07:18 1995 Bob Weiner <weiner@infodock.com> * br-start.el (br-member): Use builtin member function when available. @@ -630,7 +784,7 @@ (c++-get-parent-name): Added for template support. * br-c++-ft.el (c++-scan-features-in-class): Added for template support. -Sun Mar 26 14:06:10 1995 Bob Weiner <weiner@mot.com> +Sun Mar 26 14:06:10 1995 Bob Weiner <weiner@infodock.com> * br-c++-ft.el (c++-add-default-classes): Added. * c++-browse.el (c++-browse-setup): Added hook which calls @@ -655,7 +809,7 @@ * br.el (br-match-entries): Replaced invalid call to br-filter with br-match-entries. -Sat Mar 25 16:15:20 1995 Bob Weiner <weiner@mot.com> +Sat Mar 25 16:15:20 1995 Bob Weiner <weiner@infodock.com> * Makefile (elc): Cleaned up user output produced by this target. @@ -666,7 +820,7 @@ * V2.8.3 changes ^^^^: ============================================================================== -Fri Mar 24 10:42:11 1995 Bob Weiner <weiner@mot.com> +Fri Mar 24 10:42:11 1995 Bob Weiner <weiner@infodock.com> * br-c++-ft.el (c++-scan-features): Fixed so skips to end of a feature definition before looking for another. This prevents matches to things @@ -680,7 +834,7 @@ * Makefile (elc): Rewrote in a portable manner so that one emacs invocation builds all elc files. -Thu Mar 23 17:32:50 1995 Bob Weiner <weiner@mot.com> +Thu Mar 23 17:32:50 1995 Bob Weiner <weiner@infodock.com> * br.el (br-browse): Fixed so br-mode-hook and language-specific hook is run each time the browser is invoked, not just the first time in an @@ -698,13 +852,13 @@ Also fixed bug that failed to bury browser buffers when using this command. -Wed Mar 22 03:20:39 1995 Bob Weiner <weiner@mot.com> +Wed Mar 22 03:20:39 1995 Bob Weiner <weiner@infodock.com> * Makefile (EMACS): Changed default setting of this variable to XEMACS. * hmouse-br.el: Renamed a bunch of Hyperbole functions and variables. -Tue Mar 21 01:05:28 1995 Bob Weiner <weiner@mot.com> +Tue Mar 21 01:05:28 1995 Bob Weiner <weiner@infodock.com> * hasht.el (hash-replace): Fixed omission of argument to (error) call. This was causing {C-c C-d}, br-delete to fail. @@ -726,7 +880,7 @@ (br-env-rebuild): Added prompt to build in background when called interactively. -Mon Mar 20 00:16:46 1995 Bob Weiner <weiner@mot.com> +Mon Mar 20 00:16:46 1995 Bob Weiner <weiner@infodock.com> * br-eif.el (eif-get-parents-from-source): Rewrote to support Eiffel 3 inheritance clauses. @@ -749,34 +903,34 @@ (clos-feature-name-to-regexp): Rewrote to work properly. -Sun Mar 19 23:46:34 1995 Bob Weiner <weiner@mot.com> +Sun Mar 19 23:46:34 1995 Bob Weiner <weiner@infodock.com> * br-clos.el (clos-type-identifier-chars): Added back [] characters so that default class features will be shown properly in listing buffers. -Fri Mar 17 12:46:06 1995 Bob Weiner <weiner@mot.com> +Fri Mar 17 12:46:06 1995 Bob Weiner <weiner@infodock.com> * Makefile (elc): Rewrote to compile all out of date .elc files with one invocation of Emacs. -Thu Mar 16 12:33:24 1995 Bob Weiner <weiner@mot.com> +Thu Mar 16 12:33:24 1995 Bob Weiner <weiner@infodock.com> * br-init.el (br-after-term-init): Eliminated need to load set.el. Provides faster startup. -* br-vers.el: Added this file and 'br-version' variable so can get OO-Browser +* br-vers.el: Added this file and `br-version' variable so can get OO-Browser version number programmatically. -Wed Mar 15 14:13:19 1995 Bob Weiner <weiner@mot.com> +Wed Mar 15 14:13:19 1995 Bob Weiner <weiner@infodock.com> -* br-init.el (br-after-term-init): Renamed all 'smart-*-meta*' functions - to 'smart-*-assist*'. +* br-init.el (br-after-term-init): Renamed all `smart-*-meta*' functions + to `smart-*-assist*'. ============================================================================== * V2.8.1 changes ^^^^: ============================================================================== -Fri Mar 10 14:40:55 1995 Bob Weiner <weiner@footloose> +Fri Mar 10 14:40:55 1995 Bob Weiner <weiner@infodock.com> * OO-Browser V2.8 is released. @@ -791,7 +945,7 @@ (br-next-class-window): (br-prev-class-window): Renamed to br-*-listing-window. -Mon Mar 6 12:04:30 1995 Bob Weiner (weiner@footloose) +Mon Mar 6 12:04:30 1995 Bob Weiner <weiner@infodock.com> * br-lib.el (br-setup-constants): Removed br-show-features setting from here so that it is a global setting that applies to all languages. @@ -804,7 +958,7 @@ an invalid command. Also fixed bug in handling long feature signatures which come in as multiple output strings. -Sun Mar 5 12:24:28 1995 Bob Weiner <weiner@avatar> +Sun Mar 5 12:24:28 1995 Bob Weiner <weiner@infodock.com> * Makefile (tags): Added tree-x and tree-nx source tags into TAGS build. @@ -827,7 +981,7 @@ like when applied to a whole listing. This also makes producing graphical displays of a listing simpler. -Sat Mar 4 14:38:45 1995 Bob Weiner <weiner@avatar> +Sat Mar 4 14:38:45 1995 Bob Weiner <weiner@infodock.com> * br-objc-ft.el (objc-list-categories): (objc-list-protocols): Added to support category and @@ -835,7 +989,7 @@ * br-lib.el (br-setup-functions): Added per-language "list-features" and "list-protocols" functions. -Fri Mar 3 14:00:24 1995 Bob Weiner <weiner@avatar> +Fri Mar 3 14:00:24 1995 Bob Weiner <weiner@infodock.com> * br.el (br-mode-map): Added {C} = br-categories and {P} = br-protocols. (br-categories): Added to show class categories. @@ -856,7 +1010,7 @@ 'identity for all languages except Objective-C where protocols and class categories are filtered out. -Fri Mar 3 02:03:42 1995 Bob Weiner <weiner@footloose> +Fri Mar 3 02:03:42 1995 Bob Weiner <weiner@infodock.com> * br-lib.el (br-real-build-al) (br-search-directory): Modified scanning message to lead with @@ -867,7 +1021,7 @@ br-objc.el objc-brows.el: Numerous changes to support category and protocol browsing. -Thu Mar 2 00:16:49 1995 Bob Weiner <weiner@footloose> +Thu Mar 2 00:16:49 1995 Bob Weiner <weiner@infodock.com> * br.el (br-interrupt): (br-quit): Added test to ensure that are in the OO-Browser @@ -886,7 +1040,7 @@ * br.el (br-sort-options): Added to control the way listing buffers are sorted. -Wed Mar 1 10:40:54 1995 Bob Weiner <weiner@footloose> +Wed Mar 1 10:40:54 1995 Bob Weiner <weiner@infodock.com> * br-compl.el (br-all-classes): Rewrote to omit sort in most cases, since many functions that call this will do their own sorting. @@ -903,14 +1057,14 @@ br-find Use br-edit-entry instead. {C-u e} br-routines br-features r f -Tue Feb 28 10:11:04 1995 Bob Weiner <weiner@footloose> +Tue Feb 28 10:11:04 1995 Bob Weiner <weiner@infodock.com> * hasht.el (hash-length): (hash-size): Changed these 2 functions to return size of the hash-table structure rather than number of elements. (hash-count): Added this to return number of elements in hash-table. -* br-clos-ft.el (clos-element-tag-list): Renamed from 'clos-element-tag' and +* br-clos-ft.el (clos-element-tag-list): Renamed from `clos-element-tag' and changed to return a list of tags since one method definition may generate features in many classes. @@ -920,12 +1074,12 @@ vectors, so that copy routines know how to copy symbol values from the hash table obarray. -Sun Feb 26 17:03:37 1995 Bob Weiner <weiner@footloose> +Sun Feb 26 17:03:37 1995 Bob Weiner <weiner@infodock.com> * man/oobr.texi (Browsing Implementors): (Browsing Elements): Added these two sections. -Sat Feb 25 12:10:29 1995 Bob Weiner <weiner@footloose> +Sat Feb 25 12:10:29 1995 Bob Weiner <weiner@infodock.com> * br.el (br-find): Added support for CLOS element lookup. @@ -938,13 +1092,13 @@ * Makefile: Changed so that elc target just rebuilds out of date elc files, not all elc files. all-elc now does that. -Fri Feb 24 17:19:37 1995 Bob Weiner (weiner@footloose) +Fri Feb 24 17:19:37 1995 Bob Weiner <weiner@infodock.com> * br-compl.el (br-buffer-menu): Rewrote to handle case where filename is stripped from path listed under File section in Buffer-menu. Use buffer names instead. Slower, but correct in more cases. -Thu Feb 23 10:51:53 1995 Bob Weiner <weiner@footloose> +Thu Feb 23 10:51:53 1995 Bob Weiner <weiner@infodock.com> * man/oobr.texi (Glossary): Added a number of OO terms. @@ -963,7 +1117,7 @@ (objc-feature-matches): Fixed these functions so that br-implementors works properly for Objective-C. -Wed Feb 22 14:31:55 1995 Bob Weiner <weiner@footloose> +Wed Feb 22 14:31:55 1995 Bob Weiner <weiner@infodock.com> * br-lib.el (br-build-lib-htable): Added (run-hooks 'br-after-build-lib-hook). (br-build-sys-htable): Added (run-hooks 'br-after-build-sys-hook). @@ -974,14 +1128,14 @@ classes, since the elements in these classes change as the system evolves. -Tue Feb 21 14:38:47 1995 Bob Weiner <weiner@footloose> +Tue Feb 21 14:38:47 1995 Bob Weiner <weiner@infodock.com> * br-tree.el man/oobr.texi br-help - br.el (br-mode-map): Renamed 'br-tree-routines-toggle' to - 'br-tree-features-toggle' and moved key binding from {M-r} to {M-f}. - Renamed 'br-show-routines' to 'br-show-features'. + br.el (br-mode-map): Renamed `br-tree-routines-toggle' to + `br-tree-features-toggle' and moved key binding from {M-r} to {M-f}. + Renamed `br-show-routines' to `br-show-features'. * *.el: Changed all -ftr- to -feature-. * br*[fr]t.el: Clarified many symbol names within these files. @@ -990,42 +1144,42 @@ br-clos-rt.el: Added these 2 files to support feature browsing in CLOS and BWlib, my own object system which looks like CLOS. -Fri Feb 17 00:12:37 1995 Bob Weiner <weiner@footloose> +Fri Feb 17 00:12:37 1995 Bob Weiner <weiner@infodock.com> * br-objc-rt.el (objc-scan-routines-in-class): * br-c++-rt.el (c++-scan-routines-in-class): Fixed bug that failed to save normalized form of routine for return. -Mon Feb 13 11:18:46 1995 Bob Weiner (weiner@footloose) +Mon Feb 13 11:18:46 1995 Bob Weiner <weiner@infodock.com> * br-init.el (br-after-term-init): Don't load menus-oobr under tty InfoDock. -Sun Feb 12 16:09:29 1995 Bob Weiner <weiner@footloose> +Sun Feb 12 16:09:29 1995 Bob Weiner <weiner@infodock.com> * br-clos.el (clos-src-file-regexp): Updated to scan .el files, so will-read CLOS-like definitions in Emacs Lisp code. Normal CLOS code directories will not contain any such code, so will not be affected. -Thu Feb 9 13:19:38 1995 Bob Weiner <weiner@footloose> +Thu Feb 9 13:19:38 1995 Bob Weiner <weiner@infodock.com> * hasht.el (hash-make): Modified to accept an integer as the first argument, meaning create an empty hash table with that minimum size. -Mon Jan 9 12:00:40 1995 Bob Weiner <weiner@meltdown> +Mon Jan 9 12:00:40 1995 Bob Weiner <weiner@infodock.com> * br-c++.el (c++-in-c-comment-p): (c++-to-comments-begin): Fixed to avoid treating //*** comments as multi-line comments. -* br-env.el (br-env-copy): Changed 'intern-soft' to 'intern' to avert bug +* br-env.el (br-env-copy): Changed `intern-soft' to `intern' to avert bug that appears when try to set an as yet undefined symbol. -Tue Jan 3 16:49:44 1995 Bob Weiner (weiner@meltdown) +Tue Jan 3 16:49:44 1995 Bob Weiner <weiner@infodock.com> * br-c++.el (c++-src-file-regexp): Modified to handle .cpp and .hpp suffixes used by someone on OS/2. -Wed Dec 21 16:30:27 1994 Bob Weiner <bweiner@sun29> +Wed Dec 21 16:30:27 1994 Bob Weiner <weiner@infodock.com> * br-mouse.el MAKE-DIST @@ -1037,19 +1191,19 @@ add of oobr/hypb/ directory to load-path when full Hyperbole system is not available. -Fri Dec 16 19:15:51 1994 Bob Weiner (weiner@meltdown) +Fri Dec 16 19:15:51 1994 Bob Weiner <weiner@infodock.com> * br-env.el (br-env-browse): Added this function to invoke the appropriate language OO-Browser given an Environment as an argument. This can be used to support OO-Browser invocation by mouse clicking on Env file names. -Fri Dec 16 19:58:24 1994 Bob Weiner <bweiner@sun29> +Fri Dec 16 19:58:24 1994 Bob Weiner <weiner@infodock.com> * br-init.el (br-after-term-init2): Changed so menus are only loaded under XEmacs-based InfoDock. -Thu Dec 15 22:26:15 1994 Bob Weiner <bweiner@sun29> +Thu Dec 15 22:26:15 1994 Bob Weiner <weiner@infodock.com> * tree-x/intf.c: Added (XtPointer) coercions for 4th arg of XtAddCallback calls to suppress compiler warnings. @@ -1061,7 +1215,7 @@ clicking on a declaration in a .h file jumps to the associated definition in a source file. -Thu Dec 15 12:37:31 1994 Bob Weiner (bweiner@sun29) +Thu Dec 15 12:37:31 1994 Bob Weiner <weiner@infodock.com> * tree-x/intf.c: Rewrote to handle X displays of varying sizes. @@ -1069,10 +1223,10 @@ br-c++-ft.el (c++-feature-def-pat): Rewrote to simplify and to eliminate call to read-from-string, which may be unreliable in this usage. -* tree-x/input.c (GetNextToken): Changed 'char c' to 'int c', otherwise, +* tree-x/input.c (GetNextToken): Changed `char c' to `int c', otherwise, cannot detect EOF and all possible chars. -Fri Dec 9 18:05:50 1994 Bob Weiner (bweiner@sun29) +Fri Dec 9 18:05:50 1994 Bob Weiner <weiner@infodock.com> * br-objc-rt.el (objc-routine-normalize): Rewrote to reduce strings of spaces to one space. @@ -1095,7 +1249,7 @@ * br-env.el (br-env-force-load): Fixed paren bug which caused use of wrong file name for Envir when default was accepted. -Thu Dec 1 13:44:25 1994 Bob Weiner (bweiner@sun468) +Thu Dec 1 13:44:25 1994 Bob Weiner <weiner@infodock.com> * br.el: br-listing-window-p br-non-listing-window-p - Added these predicate macros to centralize @@ -1107,33 +1261,33 @@ * BR-README: Updated installation and build directions. * Makefile: Added HYPERBOLE mouse support file dependencies and changed - 'dist' target so it actually produces a standalone tar file + `dist' target so it actually produces a standalone tar file distribution of the OO-Browser. ============================================================================== * V2.8 changes ^^^^: ============================================================================== -Mon Oct 24 21:28:09 1994 Bob Weiner (bweiner@sun285) +Mon Oct 24 21:28:09 1994 Bob Weiner <weiner@infodock.com> * Makefile: Added for automated building of the OO-Browser. See the documentation at the top of this file for instructions on usage. -Sun Oct 23 20:28:37 1994 Bob Weiner (weiner@sun166) +Sun Oct 23 20:28:37 1994 Bob Weiner <weiner@infodock.com> * br-lib.el (br-relative-path): Added so that relative pathnames do not come out longer than absolute ones. -Sun Oct 23 15:45:28 1994 Bob Weiner (bweiner@sun285) +Sun Oct 23 15:45:28 1994 Bob Weiner <weiner@infodock.com> * man/br-user.texi: Renamed to oobr.texi, along with oobr.info. -Thu Oct 20 15:47:15 1994 Bob Weiner (bweiner@sun285) +Thu Oct 20 15:47:15 1994 Bob Weiner <weiner@infodock.com> * br-env.el (br-env-select-lang): Added popup-dialog box for language selection under XEmacs when command is invoked via the mouse. -Wed Oct 19 18:21:45 1994 Bob Weiner (bweiner@sun285) +Wed Oct 19 18:21:45 1994 Bob Weiner <weiner@infodock.com> * br-env.el (br-env-lang-var): Changed Environment file name from: (concat br-env-dir ".br-" lang-prefix "env") @@ -1144,17 +1298,17 @@ * br-ftr.el (br-ftr-tags-init): Changed br-ftr-tags-file from using "-m" suffix to using "-FTR" suffix. -Wed Sep 21 14:52:39 1994 Bob Weiner (weiner@sun166) +Wed Sep 21 14:52:39 1994 Bob Weiner <weiner@infodock.com> * br-ftr.el (br-ftr-found-p): Fixed bug that could cause return value of nil when feature was found and source file of feature definition was read from disk the first time. -Wed Sep 21 11:45:26 1994 Bob Weiner (bweiner@sun1) +Wed Sep 21 11:45:26 1994 Bob Weiner <weiner@infodock.com> * br.el (br-mode): Added (run-hooks 'br-mode-hook). -Wed Mar 30 21:07:37 1994 Bob Weiner (weiner@sun285) +Wed Mar 30 21:07:37 1994 Bob Weiner <weiner@infodock.com> * br.el (br-feature): Fixed to trigger an error if can't find match within source code for a feature declaration tag. @@ -1173,32 +1327,32 @@ * c++-browse.el (c++-browse-setup): Added conditional for cc-mode, new name for C++ mode under Emacs. -Thu Aug 19 21:05:00 1993 Bob Weiner (weiner@info) +Thu Aug 19 21:05:00 1993 Bob Weiner <weiner@infodock.com> -* br-lib.el: Fixed 'br-real-build-alists-br' to not erase routine tags file +* br-lib.el: Fixed `br-real-build-alists-br' to not erase routine tags file when called. This would lead to an empty routine file if sys paths had methods but lib paths was built after and it did not have methods. - br-env.el: Updated 'br-env-build' to delete br-ftr-tags-file and its - buffer before doing build since is no longer done in 'br-real-build-alist-br'. + br-env.el: Updated `br-env-build' to delete br-ftr-tags-file and its + buffer before doing build since is no longer done in `br-real-build-alist-br'. -Sat Apr 24 15:29:46 1993 Bob Weiner (weiner at localhost) +Sat Apr 24 15:29:46 1993 Bob Weiner <weiner@infodock.com> * br-xbr.el: Renamed to br-tree.el. xbr: Renamed to tree-x tree-nx: Added for NEXTSTEP graphical browsing. -Fri Apr 23 12:34:32 1993 Bob Weiner (weiner@info) +Fri Apr 23 12:34:32 1993 Bob Weiner <weiner@infodock.com> -* br-init.el, br-lib.el: Added 'br-skip-dir-regexps' to make list of +* br-init.el, br-lib.el: Added `br-skip-dir-regexps' to make list of directories skipped by browser file scans programmable. -Sat May 4 07:02:58 1991 Bob Weiner (rsw at barney) +Sat May 4 07:02:58 1991 Bob Weiner <weiner@infodock.com> * br-lib.el, br-eif.el: Added (let ((inhibit-local-variables nil)) to prevent setting from prompting user when files are read in. -Mon Dec 24 07:21:37 1990 Bob Weiner (rsw at tahiti) +Mon Dec 24 07:21:37 1990 Bob Weiner <weiner@infodock.com> * br.el: Modified (br-help) to remove local keymap so normal movement commands work within help buffers. @@ -1207,7 +1361,7 @@ V2.6 changes ^^^^: ============================================================================== -Thu Dec 20 19:04:32 1990 Bob Weiner (rsw at slate) +Thu Dec 20 19:04:32 1990 Bob Weiner <weiner@infodock.com> ** br.el, br-lib.el, br-init.el: Added full support for use of non-Emacs browser viewers and editors. All such tools are handled as @@ -1222,62 +1376,62 @@ ** br-xtree.el: Renamed to br-xbr.el. -Wed Dec 19 15:24:55 1990 Bob Weiner (rsw at delay) +Wed Dec 19 15:24:55 1990 Bob Weiner <weiner@infodock.com> ** br-xtree.el: Added support for multiple simultaneous xtree browsing sessions and optimized context time maximally when outside of OO-Browser UI and pretty well when in UI (just have to sort classes in order to display). -Mon Dec 17 01:16:49 1990 Bob Weiner (rsw at tahiti) +Mon Dec 17 01:16:49 1990 Bob Weiner <weiner@infodock.com> ** br.el: Added {H} (br-help-ms) command to display mouse help. - br-lib.el: Added 'br-keep-viewed-classes' flag which if nil + br-lib.el: Added `br-keep-viewed-classes' flag which if nil deletes each class file as a new one is viewed. By default, is nil. t value leaves viewed classes around for further manipulation. -Wed Oct 17 22:12:00 1990 Bob Weiner (rsw at slate) +Wed Oct 17 22:12:00 1990 Bob Weiner <weiner@infodock.com> ** br.el: Improved ordering of large class lists by using UNIX "sort". -Mon Oct 15 01:26:56 1990 Bob Weiner (rsw at tahiti) +Mon Oct 15 01:26:56 1990 Bob Weiner <weiner@infodock.com> -** eif-calls.el: br-info-class did not work since 'eif-try-for-routine-call' +** eif-calls.el: br-info-class did not work since `eif-try-for-routine-call' used the wrong parameters for string matching. Fixed. -Sat Oct 6 15:12:36 1990 Bob Weiner (rsw at betty) +Sat Oct 6 15:12:36 1990 Bob Weiner <weiner@infodock.com> ** br-eif-ft.el: Created this file. Allows selection of a feature name in a class export clause and moves point to feature definition if within the same source file. Also goes to class def when class name is selected. -Mon Oct 1 18:13:46 1990 Bob Weiner (rsw at tahiti) +Mon Oct 1 18:13:46 1990 Bob Weiner <weiner@infodock.com> -** hash.el: Removed sorting of value elements in 'hash-make' function. - br-eif.el: Sorted class list elements in 'eif-real-build-paths-alist'. - br-lib.el: Removed list reversal from 'br-real-build-parents-alist' - and 'br-real-build-alists-br'. +** hash.el: Removed sorting of value elements in `hash-make' function. + br-eif.el: Sorted class list elements in `eif-real-build-paths-alist'. + br-lib.el: Removed list reversal from `br-real-build-parents-alist' + and `br-real-build-alists-br'. Sorted each set of classes in path list construction in - 'br-real-build-al'. + `br-real-build-al'. These changes fixed display of parents so that they are listed in the same order as they are in the source file. -** br-env.el: Eliminated use of 'br-use-children-htable'; now assume always +** br-env.el: Eliminated use of `br-use-children-htable'; now assume always true. This option added virtually no value. -Wed Sep 26 14:07:34 1990 Bob Weiner (rsw at tahiti) +Wed Sep 26 14:07:34 1990 Bob Weiner <weiner@infodock.com> -** br.el: Fixed 'br-narrow-to-class' to work with info-browse class names. - Added error handling into 'br-view' for when class which is +** br.el: Fixed `br-narrow-to-class' to work with info-browse class names. + Added error handling into `br-view' for when class which is referenced but not defined in environment is selected. -** br-env.el: Modified 'br-env-set-htables' function to add class +** br-env.el: Modified `br-env-set-htables' function to add class names that are referenced but not defined into the library part of the environment. -Tue Sep 25 13:22:57 1990 Bob Weiner (rsw at tahiti) +Tue Sep 25 13:22:57 1990 Bob Weiner <weiner@infodock.com> -** br-c++-ft.el: Added 'c++-include-dirs' variable used to set extra include +** br-c++-ft.el: Added `c++-include-dirs' variable used to set extra include directories to search. ** br-c++-ft.el: Created this file. Allows selection of a class declaration @@ -1290,7 +1444,7 @@ searching of sets of Info manuals. ** br-lib.el: - br.el: Modified 'br-view' and 'br-find-class' slightly to accomodate + br.el: Modified `br-view' and `br-find-class' slightly to accomodate special needs of the Info browser. ** br-clos.el: @@ -1298,59 +1452,59 @@ br-smt.el smt-browse.el: Tested and added CLOS and Smalltalk browser support. -Fri Sep 21 00:26:17 1990 Bob Weiner (rsw at tahiti) +Fri Sep 21 00:26:17 1990 Bob Weiner <weiner@infodock.com> -** br.el: Stored current window line in '*br-level-hist*' in order to make - 'br-exit-level' position all lines in buffer exited to, exactly as they +** br.el: Stored current window line in `*br-level-hist*' in order to make + `br-exit-level' position all lines in buffer exited to, exactly as they were before. -** br.el: Switched default at browser startup 'br-browse' and when refresh - screen 'br-refresh' or rebuild environments 'br-sys-rebuild' and - 'br-lib-rebuild' to display all classes rather than just the top-level +** br.el: Switched default at browser startup `br-browse' and when refresh + screen `br-refresh' or rebuild environments `br-sys-rebuild' and + `br-lib-rebuild' to display all classes rather than just the top-level classes as they did before. This prevents novice confusion over where his classes are and allows easier access to all users. -Tue Sep 18 16:37:59 1990 Bob Weiner (rsw at delay) +Tue Sep 18 16:37:59 1990 Bob Weiner <weiner@infodock.com> -** br-c++.el: Fixed def of 'c++-identifier' to allow '~' as first identifier +** br-c++.el: Fixed def of `c++-identifier' to allow `~' as first identifier character to account for destructor functions. -** br.el: Added 'br-interrupt' function. Is used by 'br-quit' and - 'br-view-full-screen' to bury all browser buffers. +** br.el: Added `br-interrupt' function. Is used by `br-quit' and + `br-view-full-screen' to bury all browser buffers. -Fri Sep 14 03:04:31 1990 Bob Weiner (rsw at tahiti) +Fri Sep 14 03:04:31 1990 Bob Weiner <weiner@infodock.com> ** br-c++.el: Kept from matching translated C source files that end in ..[cC]. ** br-init.el: Made browser Lisp files autoload when needed, so eliminated - conditional flags which enabled each language, e.g. 'br-use-eif'. + conditional flags which enabled each language, e.g. `br-use-eif'. Put browser invocation key bindings at top of file so user can easily change them. -Mon Sep 3 16:32:16 1990 Bob Weiner (rsw at tahiti) +Mon Sep 3 16:32:16 1990 Bob Weiner <weiner@infodock.com> -** br-mouse.el: Modified 'smart-br' to display browser help when a blank class +** br-mouse.el: Modified `smart-br' to display browser help when a blank class listing buffer is clicked in. - Added 'smart-br-cmd-select' function. Make note in user manual that + Added `smart-br-cmd-select' function. Make note in user manual that messages will disappear from minibuffer once release the mouse button under some window systems, to see message, simply hold the button down until you have read the message. -** br-init.el: Changed 'br-mouse-setup' to use 'smart-key-mouse' rather than - 'smart-key' under SunView and Apollo DM. +** br-init.el: Changed `br-mouse-setup' to use `smart-key-mouse' rather than + `smart-key' under SunView and Apollo DM. -** br.el: Changed 'br-help' function so that it uses 'br-mode' as the major +** br.el: Changed `br-help' function so that it uses `br-mode' as the major mode for the browser help buffer. This is necessary to support the direct selection of commands from the help buffer. -Sat Sep 1 19:49:25 1990 Bob Weiner (rsw at tahiti) +Sat Sep 1 19:49:25 1990 Bob Weiner <weiner@infodock.com> -** br.el: Made 'br-mode' function interactive. +** br.el: Made `br-mode' function interactive. -Thu Aug 30 23:41:02 1990 Bob Weiner (rsw at tahiti) +Thu Aug 30 23:41:02 1990 Bob Weiner <weiner@infodock.com> ** br-mouse.el: Fixed so would work properly with X windows. Changed - 'smart-key' and 'smart-key-meta' so they take a single optional arg + `smart-key' and `smart-key-meta' so they take a single optional arg list rather than individual args that end up grouped into a list. This works better for X and is unused by most other window systems. @@ -1361,35 +1515,35 @@ * Changes for version 1.2.4 -Wed Aug 29 18:03:12 1990 Bob Weiner (rsw at tahiti)) +Wed Aug 29 18:03:12 1990 Bob Weiner <weiner@infodock.com> -** Fixed problem with 'br-add-class-file' in "br.el" that set +** Fixed problem with `br-add-class-file' in "br.el" that set children-htable values improperly. -Thu Aug 16 03:31:54 1990 Bob Weiner (rsw at tahiti) +Thu Aug 16 03:31:54 1990 Bob Weiner <weiner@infodock.com> -** Modified 'br-find-class' in "br-lib.el" in the case when - 'br-narrow-view-to-class' is set to nil. Previously, it just moved +** Modified `br-find-class' in "br-lib.el" in the case when + `br-narrow-view-to-class' is set to nil. Previously, it just moved point to the beginning of the file in which the desired class was found. Now places point at the start of the class. -** Changed default value of '<lang>-narrow-view-to-class' to nil for all +** Changed default value of `<lang>-narrow-view-to-class' to nil for all languages. * Changes for version 1.2.3 -Mon Aug 6 00:58:29 1990 Bob Weiner (rsw at tahiti) +Mon Aug 6 00:58:29 1990 Bob Weiner <weiner@infodock.com> ** Changed all filenames to be 14 or fewer chars. * Changes for version 1.2.2, from 1.2.1 -Wed Jul 25 1990 Bob Weiner (rsw at tahiti) +Wed Jul 25 1990 Bob Weiner <weiner@infodock.com> -** Fixed 'br-where' bound to {w} in "br.el" so when called with a prefix +** Fixed `br-where' bound to {w} in "br.el" so when called with a prefix argument, displays class path properly. ** Added (require 'compile) to "eif-ise-er.el" so that key definition in @@ -1397,11 +1551,11 @@ was autoloaded. Without this change, error parsing failed the first time it was invoked in each Emacs session. -** Added 'eiffel-find-feature' and 'eif-find-feature' to "br-eif.el". Not yet +** Added `eiffel-find-feature' and `eif-find-feature' to "br-eif.el". Not yet bound to keys, more work must be done in order to do this. ** Changed get parents code in Eiffel to support comments between class - names in 'inherit' clause (also changed 'eif-parent-regexp' for same + names in `inherit' clause (also changed `eif-parent-regexp' for same reason).
--- a/lisp/oobr/Makefile Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/Makefile Mon Aug 13 09:15:11 2007 +0200 @@ -4,7 +4,7 @@ # AUTHOR: Bob Weiner # # ORIG-DATE: 6-Oct-94 at 03:42:38 -# LAST-MOD: 1-Nov-95 at 22:22:45 by Bob Weiner +# LAST-MOD: 21-Feb-97 at 18:37:04 by Bob Weiner # # Copyright (C) 1994-1995 Free Software Foundation, Inc. # See the file BR-COPY for license information. @@ -65,11 +65,17 @@ # Emacs version used to byte-compile .el files into .elc's. EMACS = $(XEMACS) +# Where to install IDA logo image. +datadir = ../../etc # Where to install the Info version of the OO-Browser manual. -infodir = ../info +infodir = ../../info +# Where to find the doc for the OO-Browser manual before installation. +tar_mandir = man +# Where to find the .texi source for the OO-Browser manual after installation. +mandir = ../../man # Where to install the Texinfo version of the OO-Browser manual # along with its im/ directory of images. -texidir = ../man +texidir = ../../man # Site-specific Emacs Lisp libraries to load before byte-compiling any files # from this package. Typically the only reason to set this is to get Emacs @@ -118,9 +124,7 @@ # NO CHANGES REQUIRED BELOW HERE # ########################################################################## -OOBR_VERSION = 2.9.11 - -MAN_DIR = man +OOBR_VERSION = 2.10 # Libraries that must be pre-loaded before trying to byte-compile anything. PRELOADS = $(SITE_PRELOADS) -l ./br-start.el @@ -158,8 +162,7 @@ br-eif-ft.el br-eif.el br-env.el br-ftr.el br-info.el \ br-init.el br-java.el br-java-ft.el \ br-lib.el br-menu.el br-objc-ft.el \ - br-objc.el br-python.elc br-python-ft.elc \ - br-site.el br-vers.el \ + br-objc.el br-python.el br-python-ft.el br-site.el br-vers.el \ br-smt.el br-start.el br-tree.el br.el c++-browse.el \ clos-brows.el eif-browse.el eif-calls.el eif-ise-er.el \ hasht.el hmouse-br.el info-brows.el java-brows.el \ @@ -171,7 +174,7 @@ br-init.elc br-java.elc br-java-ft.elc \ br-lib.elc br-menu.elc br-objc-ft.elc \ br-objc.elc br-python.elc br-python-ft.elc \ - br-site.elc br-vers.elc \ + br-site.elc br-vers.elc \ br-smt.elc br-start.elc br-tree.elc br.elc c++-browse.elc \ clos-brows.elc eif-browse.elc eif-calls.elc eif-ise-er.elc \ hasht.elc hmouse-br.elc info-brows.elc java-brows.elc \ @@ -192,9 +195,10 @@ install: xoobr + $(MV) ida-logo.xpm $(datadir) # Install the X OO-Browser in its executable directory. cd tree-x; make install - cd $(MAN_DIR); $(INSTALL) oo-browser.info* $(infodir); \ + cd $(tar_mandir); $(INSTALL) oo-browser.info* $(infodir); \ $(INSTALL) oo-browser.texi $(texidir); \ $(INSTALL) im $(texidir) @@ -229,22 +233,22 @@ oobr-env: cd $(OOBR_DIR); $(EMACS) $(BATCHFLAGS) $(PRELOADS) ${OOBR_ENV} -f br-env-batch-build -dvi: $(MAN_DIR)/oo-browser.dvi +dvi: $(mandir)/oo-browser.dvi -info: $(MAN_DIR)/oo-browser.info +info: $(infodir)/oo-browser.info -ps: $(MAN_DIR)/oo-browser.ps +ps: $(mandir)/oo-browser.ps -$(MAN_DIR)/oo-browser.dvi: $(MAN_DIR)/oo-browser.info - cd $(MAN_DIR); tex oo-browser.texi; texindex oo-browser.??; tex oo-browser.texi +$(mandir)/oo-browser.dvi: $(mandir)/oo-browser.info + cd $(mandir); tex oo-browser.texi; texindex oo-browser.??; tex oo-browser.texi -$(MAN_DIR)/oo-browser.info: $(MAN_DIR)/oo-browser.texi - cd $(MAN_DIR); $(MAKEINFO) oo-browser.texi +$(infodir)/oo-browser.info: $(mandir)/oo-browser.texi + cd $(mandir); $(MAKEINFO) oo-browser.texi -$(MAN_DIR)/oo-browser.ps: $(MAN_DIR)/oo-browser.texi - make $(MAN_DIR)/oo-browser.dvi - -$(RM) $(MAN_DIR)/oo-browser.ps - cd $(MAN_DIR); $(DVIPS) -o oo-browser.ps oo-browser.dvi +$(mandir)/oo-browser.ps: $(mandir)/oo-browser.texi + make $(mandir)/oo-browser.dvi + -$(RM) $(mandir)/oo-browser.ps + cd $(mandir); $(DVIPS) -o oo-browser.ps oo-browser.dvi tags: $(EL_TAGS) $(ETAGS) $(EL_TAGS) tree-x/*.[ch] tree-nx/*.[mh] @@ -256,32 +260,35 @@ $(RM) *.elc version: - fgrep $(OOBR_VERSION) BR-RELEASE br-vers.el man/oo-browser.texi + fgrep $(OOBR_VERSION) BR-RELEASE br-vers.el $(mandir)/oo-browser.texi echo "" # Don't use this target. bw-install: - cd /usr/local/infodock/lisp/; \ + cd /home/infodock/lisp/; \ tar zxvf /tmp/oo-browser-$(OOBR_VERSION).tar.gz; \ cd oobr/; mv man/*.info* ../../info/; mv man/*.texi ../../man/; \ - rm -rf man + mv ida-logo.xpm $(datadir); rm -rf hypb man dist: version elc info - echo "Ensure version # in br-vers.el and man/oo-browser.texi is up to date." + echo "Ensure version # in br-vers.el and oo-browser.texi is up to date." $(RM) -r $(DIST_DIR)/oobr cd ..; $(TAR) clf $(DIST_DIR)/br.tar oobr cd $(DIST_DIR); $(TAR) xf br.tar cd $(DIST_DIR)/oobr; $(RM) -r hypb man/im; make distclean; \ - mkdir hypb man/im; chmod 755 hypb man/im; \ - $(CP) /usr/local/infodock/info-local/im/oobr-* man/im - $(CP) $(HYPERBOLE) $(DIST_DIR)/oobr/hypb + mkdir hypb man man/im; chmod 755 hypb man man/im; \ + $(CP) /home/infodock/man/im/oobr-* man/im/; \ + $(CP) /home/infodock/man/oo-browser.texi man/; \ + $(CP) /home/infodock/info/oo-browser.info* man/ + $(CP) $(HYPERBOLE) $(DIST_DIR)/oobr/hypb/ + $(CP) $(datadir)/ida-logo.xpm $(DIST_DIR)/oobr/ # This ver setup won't work under SunOS for some reason. # ver="`head -3 oobr/br-vers.el | tail -1 | sed -e 's/.*|//'`" cd $(DIST_DIR); $(RM) br.tar; \ - $(TAR) --gzip -clf oo-browser-$(OOBR_VERSION).tar.gz oobr + $(TAR) -czlf oo-browser-$(OOBR_VERSION).tar.gz oobr distclean: -$(RM) TAGS core .place* .*~ *~ *\# *.orig *.rej .nfs* -cd tree-x; $(RM) .*~ *~ *\# *.orig *.rej *.o xoobr .nfs* -cd tree-nx; $(RM) -r .*~ *~ *\# *.orig *.rej obj* TreeView.app .nfs* - -cd $(MAN_DIR); $(RM) oo-browser.?? oo-browser.dvi .*~ *~ *\# *.orig *.rej .nfs* + -cd $(tar_mandir); $(RM) oo-browser.?? oo-browser.dvi .*~ *~ *\# *.orig *.rej .nfs*
--- a/lisp/oobr/br-c++-ft.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-c++-ft.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: c, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 03-Oct-90 -;; LAST-MOD: 5-May-95 at 15:59:53 by Bob Weiner +;; LAST-MOD: 11-Nov-96 at 17:29:58 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1996 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -163,6 +163,22 @@ (goto-char start) t)))) +(defun c++-feature-map-class-tags (function class) + "Apply FUNCTION to all feature tags from CLASS and return a list of the results. +Feature tags come from the file named by br-feature-tags-file." + (let ((obuf (current-buffer)) + (class-tag (concat "\n" class c++-type-tag-separator)) + (results)) + (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) + (goto-char 1) + (while (search-forward class-tag nil t) + (setq results (cons (funcall function) results)) + ;; Might have deleted current tag and would miss next tag unless point + ;; is moved backwards. + (backward-char)) + (set-buffer obuf) + results)) + (defun c++-feature-name-to-regexp (name) "Converts routine NAME into a regular expression matching the routine's name tag." (setq name (c++-feature-signature-to-regexp name)) @@ -219,6 +235,12 @@ i (1+ i))) (setq pat (concat prefix-info pat))))) +(defun c++-feature-tag-regexp (class feature-name) + "Return a regexp that matches to the feature tag entry for CLASS' FEATURE-NAME." + (concat "^" (regexp-quote class) c++-type-tag-separator + br-feature-type-regexp " " + (regexp-quote feature-name) c++-type-tag-separator)) + (defun c++-feature-tree-command-p (class-or-signature) "Display definition of CLASS-OR-SIGNATURE if a signature and return t, else return nil." (if (c++-routine-p class-or-signature) @@ -228,7 +250,10 @@ class-or-signature)))) (defun c++-list-features (class &optional indent) - "Return sorted list of C++ feature tags lexically defined in CLASS." + "Return sorted list of C++ feature tags lexically defined in CLASS. +Optional INDENT if > 2 indicates that this is a listing of inherited +features, in which case, friend features, which are never inherited, are +omitted from the returned list." (let ((obuf (current-buffer)) (features) (class-tag (concat "\n" class c++-type-tag-separator)) @@ -246,6 +271,8 @@ (or (string-match friend-regexp feature) (setq features (cons feature features)))))) (set-buffer obuf) + ;; Use nreverse here so that stable sort ends up leaving same named + ;; features in the order they were defined in the source file. (c++-sort-features (nreverse features)))) (defun c++-routine-p (str) @@ -430,35 +457,32 @@ Commented member definitions also return nil. Leaves point at start of statement for visual clarity." (c++-skip-to-statement) - (save-excursion - (and (not (c-within-comment-p)) - (save-excursion (beginning-of-line) - (not (looking-at "[ \t]*//"))) - (not (looking-at c++-class-decl)) - (looking-at (concat c++-at-feature-regexp "[{;,]")) - (let ((end-punct)) - (or (= ?{ - (setq end-punct (save-excursion (goto-char (match-end 0)) - (preceding-char)))) - ;; If ends with a '[;,]' then must not have func parens - ;; nor simply be a scoped name in order to be a def. - ;; If it begins with 'virtual', ends with "= 0" and has - ;; parens, then is a deferred virtual function declaration. - (if (match-end c++-feature-parens-grpn) - (save-restriction - (narrow-to-region (match-beginning 0) (match-end 0)) - (if (looking-at - "\\(^\\|[ \t]+\\)virtual[ \t].*=[ \t]*0[ \t]*[,;]") - (progn (message "(OO-Browser): Pure virtual function, definition deferred to descendants.") - t))) - (or (null (match-end c++-feature-scope-grpn)) - (not (equal (concat - (buffer-substring - (match-beginning c++-feature-scope-grpn) - (match-end c++-feature-name-grpn)) - (char-to-string end-punct)) - (buffer-substring (match-beginning 0) - (match-end 0))))))))))) + (and (not (c-within-comment-p)) + (save-excursion (beginning-of-line) + (not (looking-at "[ \t]*//"))) + (not (looking-at c++-class-decl)) + (looking-at (concat c++-at-feature-regexp "[{;,]")) + (let ((end-punct)) + (or (= ?\{ (setq end-punct (char-after (1- (match-end 0))))) + ;; If ends with a '[;,]' then must not have func parens + ;; nor simply be a scoped name in order to be a def. + ;; If it begins with 'virtual', ends with "= 0" and has + ;; parens, then is a deferred virtual function declaration. + (if (match-end c++-feature-parens-grpn) + (save-restriction + (narrow-to-region (match-beginning 0) (match-end 0)) + (if (looking-at + "\\s *\\<virtual\\>[^;{}]+=[ \t]*0[ \t]*[,;]") + (progn (message "(OO-Browser): Pure virtual function, definition deferred to descendants.") + t))) + (or (null (match-end c++-feature-scope-grpn)) + (not (equal (concat + (buffer-substring + (match-beginning c++-feature-scope-grpn) + (match-end c++-feature-name-grpn)) + (char-to-string end-punct)) + (buffer-substring (match-beginning 0) + (match-end 0)))))))))) (defun c++-feature-def-pat () "Return (list <feature-def-pat> <feature-class> <feature-name>) associated with declaration at point." @@ -597,31 +621,66 @@ (, post-member-regexp)))) class member-name))))) +(defun c++-feature-display (class-list ftr-pat &optional other-win) + "Display routine definition derived from CLASS-LIST, matching FTR-PAT. +Use routine tags table to locate a match. Caller must use 'set-buffer' +to restore prior buffer when a match is not found." + (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) + (let ((classes class-list) + (found-ftr) + (ftr-regexp) + (class) + (ftr-path)) + (if (or (null class-list) (equal class-list '(nil))) + nil + (while (and (not found-ftr) classes) + (setq class (car classes) + ftr-regexp (funcall ftr-pat class) + ftr-path (br-feature-def-file ftr-regexp) + found-ftr (if ftr-path + (br-edit-feature-from-tag (br-feature-current) + ftr-path other-win)) + classes (if found-ftr nil (cdr classes)))) + (if found-ftr + (or class t) + (c++-feature-display + (apply 'append (mapcar (function (lambda (cl) (br-get-parents cl))) + class-list)) + ftr-pat))))) + (defun c++-feature-lessp (routine1 routine2) (string-lessp (c++-feature-signature-to-name routine1) (c++-feature-signature-to-name routine2))) +(defun c++-feature-map-tags (function regexp) + "Apply FUNCTION to all current feature tags that match REGEXP and return a list of the results. +Feature tags come from the file named by br-feature-tags-file." + (let ((identifier-chars (concat "[" c++-identifier-chars "]*")) + (results)) + ;; Ensure match to feature names only; also handle "^" and "$" meta-chars + (setq regexp + (concat (format "^[^%s \n]+%s%s " + c++-type-tag-separator c++-type-tag-separator + br-feature-type-regexp) + (if (equal (substring regexp 0 1) "^") + (progn (setq regexp (substring regexp 1)) nil) + identifier-chars) + (if (equal (substring regexp -1) "$") + (substring regexp 0 -1) + (concat regexp identifier-chars)) + c++-type-tag-separator)) + (save-excursion + (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) + (goto-char 1) + (while (re-search-forward regexp nil t) + (setq results (cons (funcall function) results)))) + results)) + (defun c++-feature-matches (regexp) - "Return an unsorted list of feature tags whose names match in part or whole to REGEXP." - ;; Ensure match to feature names only; also handle "^" and "$" meta-chars - (setq regexp - (concat (format "^[^%s \n]+%s%s " - c++-type-tag-separator c++-type-tag-separator - br-feature-type-regexp) - (if (equal (substring regexp 0 1) "^") - (progn (setq regexp (substring regexp 1)) nil) - c++-identifier-chars) - (if (equal (substring regexp -1) "$") - (substring regexp 0 -1) - (concat regexp c++-identifier-chars)) - c++-type-tag-separator)) - (save-excursion - (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) - (goto-char 1) - (let ((features)) - (while (re-search-forward regexp nil t) - (setq features (cons (br-feature-current) features))) - features))) + "Return an unsorted list of feature tags whose names match in part or whole to REGEXP. +^ and $ characters may be used to match to the beginning and end of a feature name, +respectively." + (c++-feature-map-tags 'br-feature-current regexp)) (defun c++-feature-normalize (routine class name &optional friend-flag) (setq class (br-delete-space class) @@ -668,33 +727,6 @@ (substring signature (match-beginning 1) (match-end 1))) (t ""))) -(defun c++-feature-tags-lookup (class-list ftr-pat &optional other-win) - "Display routine definition derived from CLASS-LIST, matching FTR-PAT. -Use routine tags table to locate a match. Caller must use 'set-buffer' -to restore prior buffer when a match is not found." - (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) - (let ((classes class-list) - (found-ftr) - (ftr-regexp) - (class) - (ftr-path)) - (if (or (null class-list) (equal class-list '(nil))) - nil - (while (and (not found-ftr) classes) - (setq class (car classes) - ftr-regexp (funcall ftr-pat class) - ftr-path (br-feature-def-file ftr-regexp) - found-ftr (if ftr-path - (br-edit-feature (br-feature-current) - ftr-path other-win)) - classes (if found-ftr nil (cdr classes)))) - (if found-ftr - (or class t) - (c++-feature-tags-lookup - (apply 'append (mapcar (function (lambda (cl) (br-get-parents cl))) - class-list)) - ftr-pat))))) - (defun c++-files-with-source (class) "Use CLASS to compute set of files that match to a C++ source file regexp. Return as a list." @@ -716,7 +748,7 @@ (if (and br-feature-tags-file (file-exists-p br-feature-tags-file) (file-readable-p br-feature-tags-file)) - (c++-feature-tags-lookup class-list ftr-pat other-win) + (c++-feature-display class-list ftr-pat other-win) ;; Only works if features are in same directory as class def. (c++-scan-ancestors-feature class-list ftr-pat other-win)) (set-buffer obuf))))
--- a/lisp/oobr/br-c++.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-c++.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: c, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 7-Dec-89 -;; LAST-MOD: 21-Sep-95 at 12:28:56 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 17:21:28 by Bob Weiner ;; -;; Copyright (C) 1989-1995 Free Software Foundation, Inc. +;; Copyright (C) 1989-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser.
--- a/lisp/oobr/br-c-ft.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-c-ft.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: c, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola, Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 3-May-95 at 16:47:05 -;; LAST-MOD: 21-Oct-95 at 04:30:51 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 17:31:44 by Bob Weiner ;; -;; Copyright (C) 1995 Free Software Foundation, Inc. +;; Copyright (C) 1995, 1996 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -20,10 +20,6 @@ ;; DESCRIP-END. ;;; ************************************************************************ -;;; Other required Elisp libraries -;;; ************************************************************************ - -;;; ************************************************************************ ;;; Public variables ;;; ************************************************************************ @@ -69,14 +65,24 @@ ; (mapcar 'expand-file-name ; (delq nil (append br-sys-search-dirs ; br-lib-search-dirs)))) - (apply 'call-process (expand-file-name "br-c-tags" br-directory) - nil nil nil - ;; If no etags program in exec-directory, use one in user's $PATH. - (let ((etags (expand-file-name "etags" exec-directory))) - (if (file-executable-p etags) etags "etags")) - br-tags-file - (mapcar 'expand-file-name - (delq nil (append br-sys-search-dirs br-lib-search-dirs)))) + (if hyperb:microcruft-os-p + (apply 'call-process "bash" + nil nil nil + (expand-file-name "br-c-tags" br-directory) + ;; If no etags program in exec-directory, use one in user's $PATH. + (let ((etags (expand-file-name "etags" exec-directory))) + (if (file-executable-p etags) etags "etags")) + br-tags-file + (mapcar 'expand-file-name + (delq nil (append br-sys-search-dirs br-lib-search-dirs)))) + (apply 'call-process (expand-file-name "br-c-tags" br-directory) + nil nil nil + ;; If no etags program in exec-directory, use one in user's $PATH. + (let ((etags (expand-file-name "etags" exec-directory))) + (if (file-executable-p etags) etags "etags")) + br-tags-file + (mapcar 'expand-file-name + (delq nil (append br-sys-search-dirs br-lib-search-dirs))))) (goto-char (point-max)) (let ((c-tags-start (point))) (insert-file-contents br-tags-file) @@ -100,12 +106,4 @@ (and (re-search-backward "\\(^\\|[^/]\\)/\\*\\|\\*/" nil t) (not (looking-at "\\*/"))))) -;;; ************************************************************************ -;;; Private functions -;;; ************************************************************************ - -;;; ************************************************************************ -;;; Private variables -;;; ************************************************************************ - (provide 'br-c-ft)
--- a/lisp/oobr/br-c-tags Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-c-tags Mon Aug 13 09:15:11 2007 +0200 @@ -4,19 +4,27 @@ # USAGE: <script-name> <etags-program> <tags-file-to-build> <root-dir-to-search> [... <root-dir-to-search>] # # AUTHOR: Bob Weiner -# ORG: Motorola, Inc. +# ORG: InfoDock Associates +# # ORIG-DATE: 3-May-95 at 10:39:37 -# LAST-MOD: 21-Oct-95 at 04:20:41 by Bob Weiner +# LAST-MOD: 21-Feb-97 at 17:39:07 by Bob Weiner +# # DESCRIPTION: # DESCRIP-END. +# A claim has been made that under NT, one must remove the -h option from the +# following call, but it is unclear to the author of this script how the +# script will then work properly, although once again, the claim is made that +# it does. +EGREP=\egrep -h + etags=$1 tags_file=$2 shift 2 \find $* -name SCCS -prune -o -name RCS -prune \ -o -name "*.[mchMCH]" -print -o -name "*.[chCH][chpCHP]" -print \ -o -name "*.[chCH][chpCHPx][pPx]" -print | ${etags} - -o- | tr '\014' '@' \ - | \egrep -h '^[^ ]*\.[^ ]*$|@|^(#define|struct|union|typedef|enum)[ \t]' \ + | $EGREP '^[^ ]*\.[^ ]*$|@|^(#define|struct|union|typedef|enum)[ \t]' \ | tr '@\177\001' '\014@@' \ | sed -e 's/^\([^ \n][^ \n]*\)\([^@]*\)@\([^@]*\)@.*/\1^^- \3^^\1\2/' \ -e 's/^\(\([^ \n][^ \n]*\)[^@]*[ ][*&]*\([^ \n(){};&*][^ \n(){};&*]*\).*\)@.*/\2^^- \3^^\1/' \
--- a/lisp/oobr/br-clos-ft.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-clos-ft.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: lisp, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 03-Oct-90 -;; LAST-MOD: 6-Aug-95 at 01:52:28 by Bob Weiner +;; LAST-MOD: 31-Oct-96 at 17:04:54 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1996 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -37,8 +37,8 @@ (defconst clos-def-form-match "\([^ \t\n\r]+[ \t\n\r]+") -(defconst clos-feature-tag-regexp - (concat "\\(" clos-type-identifier "\\)" +(defconst clos-tag-fields-regexp + (concat "\\`\\(" clos-type-identifier "\\)" clos-type-tag-separator clos-def-form-match "['\(]?" "\\((setf[^\)]+)\\|[^\(;,]+\\)\\( *(.*)\\)?") @@ -106,6 +106,24 @@ (goto-char start) t))) +(defun clos-feature-map-class-tags (function class) + "Apply FUNCTION to all feature tags from CLASS and return a list of the results. +Feature tags come from the file named by br-feature-tags-file." + (let ((obuf (current-buffer)) + (class-tag (concat "\n" class clos-type-tag-separator)) + (results)) + (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) + (goto-char 1) + ;; Feature defs (methods) for a single class could occur in any file, + ;; according to Common Lisp rules. + (while (search-forward class-tag nil t) + (setq results (cons (funcall function) results)) + ;; Might have deleted current tag and would miss next tag unless point + ;; is moved backwards. + (backward-char)) + (set-buffer obuf) + results)) + (defun clos-feature-name-to-regexp (name) "Converts feature NAME into a regular expression matching the feature's name tag." (if (string-match (concat "^" br-feature-type-regexp " ") name) @@ -138,6 +156,12 @@ (if (= ?\( (elt signature (match-end 0))) (substring signature (match-beginning 3))))))) +(defun clos-feature-tag-regexp (class feature-name) + "Return a regexp that matches to the feature tag entry for CLASS' FEATURE-NAME." + (concat "^" (regexp-quote class) clos-type-tag-separator + clos-def-form-match "['\(]?" + (regexp-quote feature-name) "\\( *(.*)\\)?")) + (defun clos-feature-tree-command-p (class-or-signature) "Display definition of CLASS-OR-SIGNATURE if a signature and return t, else return nil." (if (br-in-browser) (br-to-view-window)) @@ -145,18 +169,12 @@ class-or-signature)) (defun clos-list-features (class &optional indent) - "Return sorted list of clos feature names lexically defined in CLASS." - (let ((obuf (current-buffer)) - (class-tag (concat "\n" class clos-type-tag-separator)) - (features)) - (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) - (goto-char 1) - ;; Feature defs (methods) for a single class could occur in any file, - ;; according to Common Lisp rules. - (while (search-forward class-tag nil t) - (setq features (cons (br-feature-current) features))) - (set-buffer obuf) - (clos-sort-features (nreverse features)))) + "Return sorted list of Clos feature tags lexically defined in CLASS. +Optional INDENT is unused but is required for multi-language OO-Browser conformance." + ;; Use nreverse here so that stable sort ends up leaving same named + ;; features in the order they were defined in the source file. + (clos-sort-features + (nreverse (clos-feature-map-class-tags 'br-feature-current class)))) (defun clos-scan-features () "Return reverse ordered list of clos feature definitions in current buffer. @@ -256,7 +274,7 @@ "Extract the feature name without its class name from feature SIGNATURE. If optional WITH-CLASS is non-nil, class name and 'clos-type-tag-separator' are prepended to the name returned." - (if (string-match clos-feature-tag-regexp signature) + (if (string-match clos-tag-fields-regexp signature) (let ((class (substring signature (match-beginning 1) (match-end 1))) (name (substring signature (match-beginning 2) @@ -273,28 +291,40 @@ (string-lessp (clos-feature-partial-name routine1) (clos-feature-partial-name routine2))) +(defun clos-feature-map-tags (function regexp) + "Apply FUNCTION to all current feature tags that match REGEXP and return a list of the results. +Feature tags come from the file named by br-feature-tags-file." + (let ((identifier-chars (concat "[" clos-identifier-chars "]*")) + (results)) + ;; Ensure match to feature names only; also handle "^" and "$" meta-chars + (setq regexp + (concat "^\\(" clos-type-identifier "\\)" + clos-type-tag-separator + clos-def-form-match "['\(]?" + (if (equal (substring regexp 0 1) "^") + (progn (setq regexp (substring regexp 1)) nil) + identifier-chars) + (if (equal (substring regexp -1) "$") + (substring regexp 0 -1) + (concat regexp identifier-chars)) + "[ \t\n\r\f]")) + (save-excursion + (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) + (goto-char 1) + (while (re-search-forward regexp nil t) + (setq results (cons (funcall function) results)))) + results)) + (defun clos-feature-matches (regexp) - "Return an unsorted list of feature tags whose names match in part or whole to REGEXP." - ;; Ensure match to feature names only; also handle "^" and "$" meta-chars - (setq regexp - (concat "^\\(" clos-type-identifier "\\)" - clos-type-tag-separator - clos-def-form-match "['\(]?" - (if (equal (substring regexp 0 1) "^") - (progn (setq regexp (substring regexp 1)) nil) - (concat "[" clos-identifier-chars "]*")) - (if (equal (substring regexp -1) "$") - (substring regexp 0 -1) - (concat regexp "[" clos-identifier-chars "]*")) - "[ \t\n\r]")) - (save-excursion - (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) - (goto-char 1) - (let ((features)) - (while (re-search-forward regexp nil t) - (backward-char) ;; Might have moved past newline. - (setq features (cons (br-feature-current) features))) - features))) + "Return an unsorted list of feature tags whose names match in part or whole to REGEXP. +^ and $ characters may be used to match to the beginning and end of a feature name, +respectively." + (clos-feature-map-tags + ;; Backward-char is necessary in this next function since point might have + ;; moved past a newline. + (function (lambda () (backward-char) (br-feature-current))) + regexp)) + (defun clos-feature-normalize (routine) (let* ((len (length routine))
--- a/lisp/oobr/br-clos.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-clos.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: lisp, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 29-Jul-90 -;; LAST-MOD: 21-Sep-95 at 12:29:40 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 17:22:13 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser.
--- a/lisp/oobr/br-compl.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-compl.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: matching, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 27-Mar-90 -;; LAST-MOD: 4-May-95 at 17:08:48 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 06:58:31 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser.
--- a/lisp/oobr/br-eif-ft.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-eif-ft.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 03-Oct-90 -;; LAST-MOD: 11-May-95 at 11:24:33 by Bob Weiner +;; LAST-MOD: 31-Oct-96 at 17:05:31 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1996 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -19,27 +19,52 @@ ;; DESCRIPTION: ;; DESCRIP-END. -;; ************************************************************************ -;; Other required Elisp libraries -;; ************************************************************************ +;;; ************************************************************************ +;;; Other required Elisp libraries +;;; ************************************************************************ (require 'eif-calls) -;; ************************************************************************ -;; Public variables -;; ************************************************************************ +;;; ************************************************************************ +;;; Public variables +;;; ************************************************************************ (defconst eif-type-tag-separator "," "String that separates a tags type from its normalized definition form.") -;; ************************************************************************ -;; Public functions -;; ************************************************************************ +;;; ************************************************************************ +;;; Public functions +;;; ************************************************************************ (defun eif-feature-implementors (ftr-name) "Return unsorted list of Eiffel feature tags which implement FTR-NAME." (eif-feature-matches (concat "^" (regexp-quote ftr-name) "$"))) +(defun eif-feature-map-class-tags (function class) + "Apply FUNCTION to all feature tags from CLASS and return a list of the results. +Feature tags come from the file named by br-feature-tags-file." + (let ((obuf (current-buffer)) + (class-tag (concat "\n" class eif-type-tag-separator)) + (results) + start end) + (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) + (goto-char 1) + (if (not (search-forward class-tag nil t)) + nil + (setq start (match-beginning 0) + end (if (search-forward "\^L\n" nil t) + (match-beginning 0) + (point-max))) + (goto-char start) + ;; Feature defs can occur only within a single file. + (while (search-forward class-tag end t) + (setq results (cons (funcall function) results)) + ;; Might have deleted current tag and would miss next tag unless point + ;; is moved backwards. + (backward-char))) + (set-buffer obuf) + results)) + (defun eif-feature-name-to-regexp (name) "Converts feature NAME into a regular expression matching the feature's name tag." (if (string-match (concat "^" br-feature-type-regexp " ") name) @@ -52,7 +77,7 @@ (defun eif-feature-signature-to-regexp (signature) "Given an Eiffel class or feature SIGNATURE, return regexp to match its definition." - (let ((regexp) class name type) + (let ((regexp) name type) (setq regexp (cond ((string-match (concat eif-type-tag-separator "\\(" br-feature-type-regexp "\\) ") @@ -75,31 +100,18 @@ (error "(eif-feature-signature-to-regexp): Invalid format, '%s'" signature)))) +(defun eif-feature-tag-regexp (class feature-name) + "Return a regexp that matches to the feature tag entry for CLASS' FEATURE-NAME." + (concat "^" (regexp-quote class) eif-type-tag-separator + br-feature-type-regexp " " + (regexp-quote feature-name) "[ \n]")) + (defun eif-feature-tree-command-p (class-or-signature) "Display definition of CLASS-OR-SIGNATURE if a signature and return t, else return nil." (if (br-in-browser) (br-to-view-window)) (br-feature-found-p (br-feature-file class-or-signature) class-or-signature)) -(defun eif-list-features (class &optional indent) - "Return sorted list of Eiffel feature names lexically defined in CLASS." - (let ((class-tag (concat "\n" class eif-type-tag-separator)) - (features) start end) - (save-excursion - (set-buffer - (funcall br-find-file-noselect-function br-feature-tags-file)) - (goto-char 1) - (if (not (search-forward class-tag nil t)) - nil - (setq start (match-beginning 0) - end (if (search-forward "\^L\n" nil t) - (match-beginning 0) - (point-max))) - (goto-char start) - ;; Feature defs can occur only within a single file. - (while (search-forward class-tag end t) - (setq features (cons (br-feature-current) features))) - (eif-sort-features features))))) (defun eif-get-feature-tags (feature-file feature-list) "Save Eiffel feature tags defined in FEATURE-FILE to 'br-feature-tags-file'. @@ -124,6 +136,14 @@ feature-list))) (set-buffer obuf))) +(defun eif-list-features (class &optional indent) + "Return sorted list of Eiffel feature names lexically defined in CLASS. +Optional INDENT is unused but is required for multi-language OO-Browser conformance." + ;; Use nreverse here so that stable sort ends up leaving same named + ;; features in the order they were defined in the source file. + (eif-sort-features + (eif-feature-map-class-tags 'br-feature-current class))) + (defun eif-scan-features-in-class (class start end) "Return unordered list of Eiffel feature definitions in CLASS. START and END give buffer region to search." @@ -161,9 +181,9 @@ nil)) ))) -;; ************************************************************************ -;; Private functions -;; ************************************************************************ +;;; ************************************************************************ +;;; Private functions +;;; ************************************************************************ (defun eif-export-feature-p () "Return nil unless point is within a class export clause." @@ -225,41 +245,44 @@ (goto-char opoint) nil))) -(defun eif-feature-matches (regexp) - "Return an unsorted list of feature tags whose names match in part or whole to REGEXP." - ;; Ensure match to feature names only; also handle "^" and "$" meta-chars - (setq regexp - (concat "^\\(" eif-identifier "\\)" - eif-type-tag-separator - br-feature-type-regexp " " - (if (equal (substring regexp 0 1) "^") - (progn (setq regexp (substring regexp 1)) nil) - (concat "[" eif-identifier-chars "]*")) - (if (equal (substring regexp -1) "$") - (substring regexp 0 -1) - (concat regexp "[" eif-identifier-chars "]*")) - "[ \t\n\r]")) - (save-excursion - (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) - (goto-char 1) - (let ((features) start end) - (if (not (re-search-forward regexp nil t)) - nil - (setq start (match-beginning 0) - end (if (search-forward "\^L\n" nil t) - (match-beginning 0) - (point-max))) - (goto-char start) - ;; Feature defs can occur only within a single file. - (while (re-search-forward regexp end t) - (backward-char) ;; Might have moved past newline. - (setq features (cons (br-feature-current) features)))) - features))) - (defun eif-feature-lessp (feature1 feature2) (string-lessp (eif-feature-partial-name feature1) (eif-feature-partial-name feature2))) +(defun eif-feature-map-tags (function regexp) + "Apply FUNCTION to all current feature tags that match REGEXP and return a list of the results. +Feature tags come from the file named by br-feature-tags-file." + (let ((identifier-chars (concat "[" eif-identifier-chars "]*")) + (results)) + ;; Ensure match to feature names only; also handle "^" and "$" meta-chars + (setq regexp + (concat "^\\(" eif-identifier "\\)" + eif-type-tag-separator + br-feature-type-regexp " " + (if (equal (substring regexp 0 1) "^") + (progn (setq regexp (substring regexp 1)) nil) + identifier-chars) + (if (equal (substring regexp -1) "$") + (substring regexp 0 -1) + (concat regexp identifier-chars)) + "[ \t\n\r\f]")) + (save-excursion + (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) + (goto-char 1) + (while (re-search-forward regexp nil t) + (setq results (cons (funcall function) results)))) + results)) + +(defun eif-feature-matches (regexp) + "Return an unsorted list of feature tags whose names match in part or whole to REGEXP. +^ and $ characters may be used to match to the beginning and end of a feature name, +respectively." + (eif-feature-map-tags + ;; Backward-char is necessary in this next function since point might have + ;; moved past a newline. + (function (lambda () (backward-char) (br-feature-current))) + regexp)) + (defun eif-feature-partial-name (signature &optional with-class for-display) "Extract the feature name without its class name from feature SIGNATURE. If optional WITH-CLASS is non-nil, class name and 'eif-type-tag-separator' @@ -319,21 +342,6 @@ ;; feature in buffers whose major mode is 'eiffel-mode'. It is used by the ;; browser but may also be used standalone. ;; -(defun eiffel-find-feature (feature-name) - "Move point to start of feature named FEATURE-NAME in current buffer. -Display feature including all preceding comments at the top of the window. -Move point and return non-nil iff FEATURE-NAME is found." - (interactive "sFeature to find: ") - (cond ((eif-locate-feature - feature-name (eif-routine-to-regexp feature-name))) - ((eif-to-attribute feature-name) - (let ((opoint (point))) - (eif-to-comments-begin) - (recenter 0) - (goto-char opoint) - (back-to-indentation) - t)))) - (defun eif-find-class-name () "Return class name that point is within, else nil." (if (= (point) (point-max)) (skip-chars-backward " \t\n")) @@ -474,9 +482,24 @@ (buffer-substring (match-beginning 0) (match-end 0)))) -;; ************************************************************************ -;; Private variables -;; ************************************************************************ +(defun eiffel-find-feature (feature-name) + "Move point to start of feature named FEATURE-NAME in current buffer. +Display feature including all preceding comments at the top of the window. +Move point and return non-nil iff FEATURE-NAME is found." + (interactive "sFeature to find: ") + (cond ((eif-locate-feature + feature-name (eif-routine-to-regexp feature-name))) + ((eif-to-attribute feature-name) + (let ((opoint (point))) + (eif-to-comments-begin) + (recenter 0) + (goto-char opoint) + (back-to-indentation) + t)))) + +;;; ************************************************************************ +;;; Private variables +;;; ************************************************************************ (defconst eif-feature-name (concat
--- a/lisp/oobr/br-eif.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-eif.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 7-Dec-89 -;; LAST-MOD: 21-Sep-95 at 14:13:50 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 17:22:26 by Bob Weiner ;; -;; Copyright (C) 1989-1995 Free Software Foundation, Inc. +;; Copyright (C) 1989-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser.
--- a/lisp/oobr/br-env.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-env.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 8-Jun-90 -;; LAST-MOD: 20-Sep-95 at 14:59:03 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 17:22:39 by Bob Weiner ;; -;; Copyright (C) 1989-1995 Free Software Foundation, Inc. +;; Copyright (C) 1989-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -181,7 +181,7 @@ (interactive) (if env-file (read-string - (format "Please specify the \"%s\" Environment (Hit RTN to begin)." + (format "Please specify the \"%s\" Environment (Hit RET to begin)." (file-name-nondirectory env-file))) (setq env-file (br-env-default-file) env-file (read-file-name @@ -192,7 +192,7 @@ (setq env-file (expand-file-name env-file)) ;; Display Env spec if previous one existed (and (equal env-file br-env-file) (file-readable-p env-file) (br-env-stats)) - (let ((prompt "System search dir #%d (RTN to end): ") + (let ((prompt "System search dir #%d (RET to end): ") (br-env-spec t) br-sys-search-dirs br-lib-search-dirs br-lang-prefix @@ -206,7 +206,7 @@ (br-env-create-htables) (setq br-lang-prefix (or lang-prefix (br-env-select-lang)) br-sys-search-dirs (br-env-get-dirs prompt) - prompt "Library search dir #%d (RTN to end): " + prompt "Library search dir #%d (RET to end): " br-lib-search-dirs (br-env-get-dirs prompt)) ;; Now since user has not aborted, set real variables (setq br-env-spec t) @@ -286,6 +286,19 @@ env-file (if prompt "Environment file format is obsolete, rebuild it? "))))) + ;; Ensure that OO-Browser support libraries for the current + ;; language are loaded, since this function may be called without + ;; invoking the OO-Browser user interface. + (let ((lang-symbol (intern-soft (concat br-lang-prefix "browse"))) + lang-setup-symbol + lang-function) + (if lang-symbol + (progn (setq lang-function (symbol-function lang-symbol)) + (and (listp lang-function) (eq (car lang-function) 'autoload) + (load (car (cdr lang-function))) + ;; Initialize language-specific browser variables. + (setq lang-setup-symbol (intern-soft (concat br-lang-prefix "browse-setup"))) + (funcall lang-setup-symbol))))) nil) (if (file-exists-p env-file) (progn (beep) @@ -359,7 +372,7 @@ (if arg (message "Envir \"%s\": %s" env-file (br-env-totals)) (br-funcall-in-view-window - (concat br-buffer-prefix-info "Info") + (concat br-buffer-prefix-info "Info*") (function (lambda () (insert (format "Environment: \"%s\"" env-file)) @@ -566,7 +579,7 @@ value of 'br-env-default-file'. All return values are expanded to absolute paths before being returned." (let ((path directory) - (oobr-file)) + (oo-browser-file)) (while (and (stringp path) (setq path (file-name-directory path)) (setq path (directory-file-name path)) @@ -574,10 +587,10 @@ (not (string-match ":?/\\'" path)) ;; No environment file (not (file-exists-p - (setq oobr-file (expand-file-name + (setq oo-browser-file (expand-file-name br-env-default-file path))))) - (setq oobr-file nil)) - (expand-file-name (or oobr-file br-env-file br-env-default-file)))) + (setq oo-browser-file nil)) + (expand-file-name (or oo-browser-file br-env-file br-env-default-file)))) (defun br-env-file-sym-val (symbol-name) "Given a SYMBOL-NAME, a string, find its value in the current Environment file. @@ -675,7 +688,7 @@ "Display values of internal data structures in viewer buffer." (interactive) (br-funcall-in-view-window - (concat br-buffer-prefix-info "Info") + (concat br-buffer-prefix-info "Info*") (function (lambda () (let ((standard-output (current-buffer))) @@ -871,7 +884,7 @@ updating. Value is language-specific.") (defvar br-env-lang-avector - '[("C++" . "c++-") + '[("C++/C" . "c++-") ("Eiffel" . "eif-") ("Info" . "info-") ("Java" . "java-")
--- a/lisp/oobr/br-ftr.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-ftr.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 20-Aug-91 at 18:16:36 -;; LAST-MOD: 25-Aug-95 at 16:54:53 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 07:02:51 by Bob Weiner ;; -;; Copyright (C) 1991-1995, Free Software Foundation, Inc. +;; Copyright (C) 1991-1996, Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -24,29 +24,30 @@ ;;; ************************************************************************ (defconst br-feature-type-regexp "[-+=@%>1/]" - "Regular expression which matches the first non-whitespace characters in an OO-Browser feature listing.") + "Regular expression which matches the first non-whitespace character in an OO-Browser feature listing.") ;;; ************************************************************************ ;;; Public functions ;;; ************************************************************************ -(defun br-find-feature (&optional feature-entry view-only other-win) - "Display feature definition for FEATURE-ENTRY in VIEW-ONLY mode if non-nil. -Return feature path if FEATURE-ENTRY is successfully displayed, nil -otherwise. Can also signal an error when called interactively." - (interactive) - (and (interactive-p) (setq view-only current-prefix-arg)) - (let ((feature-path)) - (setq feature-entry - (br-feature-signature-and-file - (or feature-entry - (br-feature-complete 'must-match "Show feature definition:"))) - feature-path (cdr feature-entry) - feature-entry (car feature-entry)) - (br-edit-feature feature-entry feature-path other-win view-only))) +(defun br-edit-feature (class feature-name &optional other-win view-only) + "Edit the definition of CLASS' FEATURE-NAME, optionally in some OTHER-WIN if non-nil. +With optional VIEW-ONLY non-nil, view the feature definition instead of editing it. +Return the pathname of the feature definition if found, else nil." + (interactive + (list nil (br-feature-complete 'must-match "Edit feature definition:") + nil nil)) + (let ((tag-and-file (br-feature-tag-and-file + (if (null class) + ;; Assume feature-name includes prepended class in + ;; proper format, e.g. when called interactively. + (regexp-quote feature-name) + (br-feature-tag-regexp class feature-name))))) + (if tag-and-file (br-edit-feature-from-tag + (car tag-and-file) (cdr tag-and-file) other-win view-only)))) -(defun br-edit-feature (tag-entry feature-path &optional other-win view-only) - "Edit feature for OO-Browser TAG-ENTRY of file FEATURE-PATH, optionally in OTHER-WIN. +(defun br-edit-feature-from-tag (tag-entry feature-path &optional other-win view-only) + "Edit feature for OO-Browser TAG-ENTRY of file FEATURE-PATH, optionally in OTHER-WIN if non-nil. With optional VIEW-ONLY, view feature definition instead of editing it. Return FEATURE-PATH if feature definition is found, else nil." (let ((err)) @@ -65,18 +66,36 @@ ((interactive-p) (setq err (format - "(OO-Browser): No '%s' feature defined in Environment." + "(OO-Browser): No `%s' feature defined in Environment." tag-entry) feature-path nil)))) ((interactive-p) (setq err (format - "(OO-Browser): '%s' - src file not found or not readable, %s" + "(OO-Browser): `%s' - src file not found or not readable, %s" tag-entry feature-path) feature-path nil))) (if err (error err)) feature-path)) +(defun br-find-feature (&optional feature-entry view-only other-win) + "Display feature definition for FEATURE-ENTRY in VIEW-ONLY mode if non-nil. +Return feature path if FEATURE-ENTRY is successfully displayed, nil +otherwise. Can also signal an error when called interactively." + (interactive) + (and (interactive-p) (setq view-only current-prefix-arg)) + (let ((feature-path)) + (setq feature-entry + (br-feature-signature-and-file + (or feature-entry + (br-feature-complete 'must-match + (if view-only + "View feature definition:" + "Edit feature definition:")))) + feature-path (cdr feature-entry) + feature-entry (car feature-entry)) + (br-edit-feature-from-tag feature-entry feature-path other-win view-only))) + (defun br-find-feature-entry () "Return feature entry that point is within or nil." (if (= (point) (point-max)) (skip-chars-backward " \t\n")) @@ -143,7 +162,7 @@ (not (looking-at "\^L\\|\\'"))) (setq ftr-alist (cons (cons (br-feature-signature-to-name (br-feature-current) - t) + t t) nil) ftr-alist))))) (kill-buffer ftr-buf) @@ -194,7 +213,7 @@ (goto-char (point-min)) (setq found-def (cond (deferred-class - (br-feature-locate-p feature-tag deferred-class)) + (br-feature-locate-p feature-tag deferred-class)) (regexp-flag (br-feature-locate-p feature-tag regexp-flag)) (t (br-feature-locate-p feature-tag)))) @@ -341,7 +360,7 @@ ;;; ************************************************************************ (defun br-feature-tags-init () - "Set up 'br-feature-tags-file' for writing." + "Set up `br-feature-tags-file' for writing." (setq br-feature-tags-completions nil br-feature-tags-file (br-feature-tags-file-name br-env-file) br-tags-file (concat br-env-file "-TAGS")) @@ -352,7 +371,7 @@ (concat env-file "-FTR")) (defun br-feature-tags-save () - "Filter out extraneous lines and save 'br-feature-tags-file'." + "Filter out extraneous lines and save `br-feature-tags-file'." (let ((obuf (current-buffer))) (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) (goto-char (point-min)) @@ -402,6 +421,19 @@ (end-of-line) (buffer-substring start (point))))) +(defun br-feature-tag-and-file (feature-tag-regexp) + "Return a cons (FEATURE-TAG . FEATURE-DEF-FILENAME) for the first tag match of FEATURE-TAG-REGEXP, or nil. +Use br-feature-tag-regexp to create FEATURE-TAG-REGEXP. +Feature tags come from the file named by br-feature-tags-file." + (let ((obuf (current-buffer)) + result) + (unwind-protect + (progn + (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) + (setq result (br-feature-def-file feature-tag-regexp)) + (if result (cons (br-feature-current) result))) + (set-buffer obuf)))) + ;;; ************************************************************************ ;;; Private variables ;;; ************************************************************************
--- a/lisp/oobr/br-help Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-help Mon Aug 13 09:15:11 2007 +0200 @@ -7,7 +7,7 @@ {m} / {M} match classes/entries {H} mouse help {h} this help {i} class info {w} where class {M-c} class stat -{q} exit browser {C-u q} quit browser {M-e} Env stat +{q} exit OO-Browser {C-u q} quit OO-Browser {M-e} Env stat {x} exit level {b} list buffers, select one to display --- Viewing ---- @@ -49,7 +49,7 @@ --- Miscellaneous --- {C-c ^} add file to Env -{C-c C-d} delete Env class {C-c #} browser version number +{C-c C-d} delete Env class {C-c #} OO-Browser version and credits {C-c C-w} write browser buffer {C-c C-k} kill viewer buffer, show help {C-x -} narrow windows by 10 {C-x +} widen windows by 10
--- a/lisp/oobr/br-help-ms Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-help-ms Mon Aug 13 09:15:11 2007 +0200 @@ -28,13 +28,9 @@ or C++ File func or method declaration show definition include file show include file -Python module name in import open the module.py file - statement - OO-Browser mouse support is available for the X window system, OpenWindows, NEXTSTEP, SunView and Apollo's Display Manager. By default, the shift-middle (or shift-left button on a 2 button mouse) and the shift-right button are used as the Action and Assist Keys, respectively. Under InfoDock, the middle mouse button also serves as the Action Key. -
--- a/lisp/oobr/br-info.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-info.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,19 +6,19 @@ ;; KEYWORDS: docs, help, hypermedia ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 7-Dec-89 -;; LAST-MOD: 21-Sep-95 at 12:29:58 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 07:01:43 by Bob Weiner ;; -;; Copyright (C) 1989-1995 Free Software Foundation, Inc. +;; Copyright (C) 1989-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. ;; ;; DESCRIPTION: ;; -;; See 'info-class-def-regexp' for regular expression that matches class +;; See `info-class-def-regexp' for regular expression that matches class ;; definitions. ;; ;; DESCRIP-END. @@ -155,16 +155,16 @@ (defvar info-children-htable nil "Htable whose elements are of the form: (LIST-OF-CHILD-CLASSES . CLASS-NAME). -Used to traverse Info inheritance graph. 'br-build-children-htable' builds +Used to traverse Info inheritance graph. `br-build-children-htable' builds this list.") (defvar info-parents-htable nil "Htable whose elements are of the form: (LIST-OF-PARENT-CLASSES . CLASS-NAME). -Used to traverse Info inheritance graph. 'br-build-parents-htable' builds +Used to traverse Info inheritance graph. `br-build-parents-htable' builds this list.") (defvar info-paths-htable nil "Htable whose elements are of the form: (LIST-OF-CLASS-NAMES . FILE-PATH). FILE-PATH gives the location of classes found in LIST-OF-CLASS-NAMES. -'br-build-paths-htable' builds this list.") +`br-build-paths-htable' builds this list.") (defvar info-lib-parents-htable nil @@ -185,9 +185,9 @@ list.") (defvar info-lib-prev-search-dirs nil - "Used to check if 'info-lib-classes-htable' must be regenerated.") + "Used to check if `info-lib-classes-htable' must be regenerated.") (defvar info-sys-prev-search-dirs nil - "Used to check if 'info-sys-classes-htable' must be regenerated.") + "Used to check if `info-sys-classes-htable' must be regenerated.") (defvar info-env-spec nil "Non-nil value means Environment specification has been given but not yet built.
--- a/lisp/oobr/br-init.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-init.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 18-May-90 -;; LAST-MOD: 1-Nov-95 at 20:22:46 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 07:02:16 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -24,7 +24,7 @@ ;;; ************************************************************************ ;; >>> If you wish to edit classes displayed by the browser in an editor -;; other than Emacs, set the 'br-editor-cmd' variable to the command you +;; other than Emacs, set the `br-editor-cmd' variable to the command you ;; want to edit with. Arguments to the command should be placed in ;; 'br-ed[1-9], with one string argument per variable'. Keep in ;; mind that the command must generate a new window under your @@ -36,7 +36,7 @@ ;; ;; This editor will only be used when the browser is run under a window ;; system external to Emacs, like X. (In such a case, the variable -;; 'hyperb:window-system' will be non-nil). +;; `hyperb:window-system' will be non-nil). ;; ;; (defvar br-editor-cmd nil @@ -49,7 +49,7 @@ ;; ;; >>> If you want to view classes in a read-only fashion outside of Emacs, -;; set the following 'br-viewer-cmd' and 'br-vw[1-9]' variables in a +;; set the following `br-viewer-cmd' and `br-vw[1-9]' variables in a ;; similar manner as you did for the editor variables above. ;; ;; For example, to use "xmore", an X-compatible version of more, as your @@ -111,7 +111,7 @@ (interactive "P") (if arg (assist-key) (action-key))) ;; - ;; A value of t for 'hkey-init' below will cause the + ;; A value of t for `hkey-init' below will cause the ;; Smart Keys to be bound to keyboard keys in addition to any ;; mouse key bindings. Comment it out or set it to nil if you ;; don't want these bindings. Or change the bindings in the @@ -198,16 +198,16 @@ (autoload 'hmail:compose "hmail" "Compose mail with ADDRESS and evaluation of EXPR." t) (autoload 'hypb:configuration "hypb" - "Insert Emacs configuration information into OUT-BUF or current buffer.") + "Insert Emacs configuration information into OUT-BUF or current buffer." nil) + (autoload 'hypb:display-file-with-logo "hypb" "Display FILE with IDA logo." nil) ;; - (autoload 'c++-browse "c++-browse" "C++ OO-Browser" t) + (autoload 'c++-browse "c++-browse" "C++/C OO-Browser" t) (autoload 'clos-browse "clos-brows" "Common Lisp OO-Browser" t) (autoload 'eif-browse "eif-browse" "Eiffel OO-Browser" t) (autoload 'info-browse "info-brows" "Info OO-Browser" t) (autoload 'java-browse "java-brows" "Java OO-Browser" t) (autoload 'objc-browse "objc-brows" "Objective-C OO-Browser" t) (autoload 'smt-browse "smt-browse" "Smalltalk OO-Browser" t) - (autoload 'python-browse "python-browse" "Python OO-Browser" t) ) ;;; ************************************************************************
--- a/lisp/oobr/br-java-ft.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-java-ft.el Mon Aug 13 09:15:11 2007 +0200 @@ -3,15 +3,15 @@ ;; FILE: br-java-ft.el ;; SUMMARY: Java OO-Browser class and member functions. ;; USAGE: GNU Emacs Lisp Library -;; KEYWORDS: java, oop, tools +;; KEYWORDS: c, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 01-Aug-95 -;; LAST-MOD: 4-Oct-95 at 13:41:34 by Bob Weiner +;; LAST-MOD: 13-Nov-96 at 00:08:46 by Bob Weiner ;; -;; Copyright (C) 1995 Free Software Foundation, Inc. +;; Copyright (C) 1995, 1996 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -29,25 +29,13 @@ ;;; Public variables ;;; ************************************************************************ -(defvar java-cpp-include-dirs '("/usr/include/") - "*Ordered list of include directories by default searched by C preprocessor. -Each directory must end with a directory separator. See also -'java-include-dirs'.") - -(defvar java-include-dirs nil - "*Ordered list of directories to search for java include files. -Each directory must end with a directory separator. Directories normally -searched by the java pre-processor should be set instead in -'java-cpp-include-dirs'.") - (defconst java-return-type-identifier - (concat "\\([\[a-zA-Z]" - "\\|[\[a-zA-Z][]" java-return-type-chars "]*" - "[]" java-return-type-chars "]+\\)" + (concat "\\([\[a-zA-Z][][" java-return-type-chars "]*" + "[][" java-return-type-chars "]+\\|[\[a-zA-Z]\\)" "[ \t\n\^M]*")) (defconst java-type-identifier - (concat "\\([\[a-zA-Z][]" java-identifier-chars "]*[ \t\n\^M]+\\)")) + (concat "\\([\[a-zA-Z][][" java-identifier-chars "]*[ \t\n\^M]+\\)")) (defconst java-type-tag-separator "@" "String that separates a tag's type from its normalized definition form. @@ -58,7 +46,7 @@ ;; The \\\\? below is necessary because we sometimes use this expression to ;; test against a string that has been regexp-quoted and some of the ;; characters in br-feature-type-regexp will then be preceded by \\. - (format "\\`\\([^%s \n]+\\)%s\\\\?\\(%s \\)\\([^%s\n]+\\)%s" + (format "\\`\\([^%s \n]+\\)%s\\\\?\\(%s \\)\\([^%s\n]+\\)%s?" java-type-tag-separator java-type-tag-separator br-feature-type-regexp java-type-tag-separator java-type-tag-separator) @@ -112,43 +100,64 @@ ;; Match to function definitions, not declarations, except for abstract ;; methods which are declared, not defined, and so end with a ';'. ;; - ;; First move to the proper class implementation if feature-tag does not - ;; include a <class>:: part and this is not a [default-class], so that if - ;; two classes in the same file have the same feature signature, we still - ;; end up at the right one. - (if (string-match java-tag-fields-regexp feature-tag) - (let ((class (substring feature-tag (match-beginning 1) (match-end 1)))) - (setq feature-tag (substring feature-tag (match-end 0))) - (if regexp-flag - (if (not (string-match "\\`\\\\\\[\\|::" feature-tag)) - (re-search-forward (java-class-definition-regexp class t) - nil t)) - (if (not (string-match "\\`\\[\\|::" feature-tag)) - (re-search-forward (java-class-definition-regexp class) - nil t))))) - ;; Now look for feature expression. - (let ((found) (start)) - (or regexp-flag (setq feature-tag - (java-feature-signature-to-regexp feature-tag))) - (while (and (re-search-forward feature-tag nil t) - (setq start (match-beginning 0)) - (not (setq found (not - (if (c-within-comment-p) - (progn (search-forward "*/" nil t) - t))))))) - (if found - (progn (goto-char start) - (skip-chars-forward " \t\n") - (java-to-comments-begin) - (recenter 0) - (goto-char start) - t)))) + ;; First move to the proper class implementation if this is not a + ;; [default-class], so that if two classes in the same file have the same + ;; feature signature, we still end up at the right one. + (let ((found t) (start)) + (if (string-match java-tag-fields-regexp feature-tag) + (let ((class (substring feature-tag (match-beginning 1) (match-end 1)))) + (setq feature-tag (substring feature-tag (match-end 0)) + found (re-search-forward + (java-class-definition-regexp class regexp-flag) nil t)))) + + ;; If class was searched for and not found, return nil. + (if (not found) + nil + ;; Otherwise, look for feature expression. + (or regexp-flag (setq feature-tag + (java-feature-signature-to-regexp feature-tag))) + (while (and (re-search-forward feature-tag nil t) + (setq start (match-beginning 0)) + (not (setq found (not + (if (c-within-comment-p) + (progn (search-forward "*/" nil t) + t))))))) + (if found + (progn (goto-char start) + (skip-chars-forward " \t\n\^M") + (java-to-comments-begin) + (recenter 0) + (goto-char start) + t))))) + +(defun java-feature-map-class-tags (function class) + "Apply FUNCTION to all feature tags from CLASS and return a list of the results. +Feature tags come from the file named by br-feature-tags-file." + (let ((obuf (current-buffer)) + (class-tag (concat "\n" class java-type-tag-separator)) + (results) + start end) + (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) + (goto-char 1) + (if (not (search-forward class-tag nil t)) + nil + (setq start (match-beginning 0) + end (if (search-forward "\^L\n" nil t) + (match-beginning 0) + (point-max))) + (goto-char start) + ;; Feature defs can occur only within a single file. + (while (search-forward class-tag end t) + (setq results (cons (funcall function) results)) + ;; Might have deleted current tag and would miss next tag unless point + ;; is moved backwards. + (backward-char))) + (set-buffer obuf) + results)) (defun java-feature-name-to-regexp (name) "Converts routine NAME into a regular expression matching the routine's name tag." - (setq name (java-feature-signature-to-regexp name)) - (aset name (1- (length name)) ?\() ;; Match only to functions - name) + (java-feature-signature-to-regexp name)) (defun java-feature-signature-to-name (signature &optional with-class for-display) "Extracts the feature name from SIGNATURE. @@ -164,7 +173,7 @@ (if with-class (setq name (concat (substring signature (match-beginning 1) (match-end 1)) - "." name))) + java-type-tag-separator name))) ;; Remove any trailing whitespace. (br-delete-space name)) ;; @@ -193,37 +202,31 @@ i (1+ i))) (setq pat (concat prefix-info pat))))) +(defun java-feature-tag-regexp (class feature-name) + "Return a regexp that matches to the feature tag entry for CLASS' FEATURE-NAME." + (concat "^" (regexp-quote class) java-type-tag-separator + br-feature-type-regexp " " + (regexp-quote feature-name) java-type-tag-separator)) + (defun java-feature-tree-command-p (class-or-signature) "Display definition of CLASS-OR-SIGNATURE if a signature and return t, else return nil." - (if (java-routine-p class-or-signature) + ;; A class name won't contain a space. + (if (string-match " " class-or-signature) (progn (if (br-in-browser) (br-to-view-window)) (br-feature-found-p (br-feature-file class-or-signature) class-or-signature)))) (defun java-list-features (class &optional indent) - "Return sorted list of java feature tags lexically defined in CLASS." - (let ((obuf (current-buffer)) - (features) - (class-tag (concat "\n" class java-type-tag-separator)) - feature) - (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) - (goto-char 1) - (if (or (null indent) (<= indent 2)) - ;; Include all features. - (while (search-forward class-tag nil t) - (setq features (cons (br-feature-current) features))) - (while (search-forward class-tag nil t) - (setq feature (br-feature-current)) - (setq features (cons feature features)))) - (set-buffer obuf) - (java-sort-features (nreverse features)))) + "Return sorted list of Java feature tags lexically defined in CLASS. +Optional INDENT is unused but is required for multi-language OO-Browser conformance." + ;; Use nreverse here so that stable sort ends up leaving same named + ;; features in the order they were defined in the source file. + (java-sort-features + (nreverse (java-feature-map-class-tags 'br-feature-current class)))) -(defun java-routine-p (str) - (string-match "([^\)]*)" str)) - -(defun java-sort-features (routine-list) - (sort routine-list 'java-feature-lessp)) +(defun java-sort-features (feature-list) + (sort feature-list 'java-feature-lessp)) (defun java-to-definition (&optional other-win) "If point is within a declaration, try to move to its definition. @@ -231,7 +234,6 @@ (interactive) (let ((opoint (point))) (cond - ((java-include-file other-win)) ((br-check-for-class (java-class-decl-p) other-win)) ((java-feature other-win)) ((and (goto-char opoint) @@ -265,14 +267,12 @@ (defun java-feature (&optional other-win) "Move point to definition of member given by declaration at point. Return nil if point is not within a member declaration." - ;; If '{' follows the feature declaration, then feature is defined right - ;; here, within the class definition. (interactive) (let ((feature-def) (ftr) (class) (ftr-pat)) (cond ((java-feature-def-p) (recenter 0) t) - ;; Now look for feature definition in code (non-header) files. + ;; Now look for feature definition in ancestor classes. ((progn (setq feature-def (java-feature-def-pat) ftr (car (cdr (cdr feature-def))) class (car (cdr feature-def)) @@ -289,9 +289,14 @@ "/ ") ((string-match java-abstract-method-regexp signature) "> ") + ;; constructors and destructors ((or (string-equal feature-name class) (string-equal feature-name "finalize")) "+ ") + ;; attributes + ((string-match "[=;,]\\'" signature) + "= ") + ;; regular methods (t "- ")) feature-name)) @@ -301,28 +306,30 @@ (looking-at java-feature-decl))) (defun java-feature-def-p () - "Return nil unless point is within a member definition. -Commented member definitions also return nil. + "Return nil unless point is within a member declaration. +Commented member declarations also return nil. Leaves point at start of statement for visual clarity." (java-skip-to-statement) - (save-excursion - (and (not (c-within-comment-p)) - (save-excursion (beginning-of-line) - (not (looking-at "[ \t]*//"))) - (not (looking-at java-class-decl)) - (looking-at (concat java-at-feature-regexp "[{;,]")) - (or (= ?\{ - (save-excursion (goto-char (match-end 0)) - (preceding-char))) - ;; If ends with a '[;,]' then it must be a native or abstract - ;; method to be a definition. - (if (match-end java-feature-parens-grpn) - (save-restriction - (narrow-to-region (match-beginning 0) (match-end 0)) - (if (looking-at - "\\(^\\|[ \t\n\^M]\\)\\(abstract\\|native\\)[ \t\n\^M][^;{}]+;") - (progn (message "(OO-Browser): Abstract function, definition deferred to descendants.") - t)))))))) + (and (not (c-within-comment-p)) + (save-excursion (beginning-of-line) + (not (looking-at "[ \t]*//"))) + (not (looking-at java-class-decl)) + (looking-at (concat java-at-feature-regexp "[=;,{]")) + (or (= ?\{ (char-after (1- (match-end 0)))) + (if (not (match-end java-feature-parens-grpn)) + ;; This is an attribute. + t + ;; If this is a native or abstract method, alert user that + ;; its definition is elsewhere. + (save-restriction + (narrow-to-region (match-beginning 0) (match-end 0)) + (cond ((looking-at "\\s *\\<abstract\\>[^;{}]+;") + (message "(OO-Browser): Abstract method, definition deferred to descendants.") + t) + ((looking-at "\\s *\\<native\\>[^;{}]+;") + (message "(OO-Browser): Native method, defined in an external language.") + t))))))) + (defun java-feature-def-pat () "Return (list <feature-def-pat> <feature-class> <feature-name>) associated with declaration at point." @@ -346,8 +353,7 @@ java-feature-type-grpn))))) (func-args (if (match-end java-feature-parens-grpn) (cons (match-beginning java-feature-parens-grpn) - (match-end java-feature-parens-grpn)))) - (base-cl-args (match-end java-feature-parens-grpn))) + (match-end java-feature-parens-grpn))))) (and member-type (string-match "[ \t]+$" member-type) (setq member-type (substring member-type 0 @@ -390,13 +396,7 @@ (concat "\\(" (java-func-args-regexp func-args) "\\|" (java-func-args-string func-args) "\\)")) - ;; If is a constructor member function, then can have some - ;; arguments for base class constructors after a ':' - ;; but preceding the '{'. - "[ \t\n]*" - (and base-cl-args - (equal member-name class) - "\\(:[^;{}]*\\)?")))) + "[ \t\n]*"))) (list (` (lambda (class) (concat "^" (br-regexp-quote class) @@ -410,80 +410,9 @@ (, post-member-regexp)))) class member-name))))) -(defun java-feature-lessp (routine1 routine2) - (string-lessp (java-feature-signature-to-name routine1) - (java-feature-signature-to-name routine2))) - -(defun java-feature-matches (regexp) - "Return an unsorted list of feature tags whose names match in part or whole to REGEXP." - ;; Ensure match to feature names only; also handle "^" and "$" meta-chars - (setq regexp - (concat (format "^[^%s \n]+%s%s " - java-type-tag-separator java-type-tag-separator - br-feature-type-regexp) - (if (equal (substring regexp 0 1) "^") - (progn (setq regexp (substring regexp 1)) nil) - java-identifier-chars) - (if (equal (substring regexp -1) "$") - (substring regexp 0 -1) - (concat regexp java-identifier-chars)) - java-type-tag-separator)) - (save-excursion - (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) - (goto-char 1) - (let ((features)) - (while (re-search-forward regexp nil t) - (setq features (cons (br-feature-current) features))) - features))) - -(defun java-feature-normalize (routine class name) - (setq class (br-delete-space class) - name (java-feature-add-prefix name class routine) - routine (concat class java-type-tag-separator - name java-type-tag-separator - (br-delete-space routine))) - (let* ((len (length routine)) - (normal-feature (make-string len ?\ )) - (n 0) (i 0) - (space-list '(?\ ?\t ?\n ?\^M)) - (space-regexp "[ \t\n\^M]+") - chr) - (while (< i len) - (setq chr (aref routine i)) - (cond - ;; Convert sequences of space characters to a single space. - ((memq chr space-list) - (aset normal-feature n ?\ ) - (if (string-match space-regexp routine i) - (setq i (match-end 0) - n (1+ n)) - (setq i (1+ i) - n (1+ n)))) - ;; - ;; Remove // style comments - ((and (= chr ?/) - (< (1+ i) len) - (= (aref routine (1+ i)) ?/)) - (setq i (+ i 2)) - (while (and (< i len) (/= (aref routine i) ?\n)) - (setq i (1+ i)))) - (t ;; Normal character - (aset normal-feature n chr) - (setq i (1+ i) - n (1+ n))))) - (substring normal-feature 0 n))) - -(defun java-feature-tag-class (signature) - "Extract the class name from SIGNATURE." - (cond ((string-match java-type-tag-separator signature) - (substring signature 0 (match-beginning 0))) - ((string-match "\\([^ \t]+\\)\." signature) - (substring signature (match-beginning 1) (match-end 1))) - (t ""))) - -(defun java-feature-tags-lookup (class-list ftr-pat &optional other-win) - "Display routine definition derived from CLASS-LIST, matching FTR-PAT. -Use routine tags table to locate a match. Caller must use 'set-buffer' +(defun java-feature-display (class-list ftr-pat &optional other-win) + "Display feature declaration derived from CLASS-LIST, matching FTR-PAT. +Use feature tags table to locate a match. Caller must use 'set-buffer' to restore prior buffer when a match is not found." (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) (let ((classes class-list) @@ -498,16 +427,96 @@ ftr-regexp (funcall ftr-pat class) ftr-path (br-feature-def-file ftr-regexp) found-ftr (if ftr-path - (br-edit-feature (br-feature-current) - ftr-path other-win)) + (br-edit-feature-from-tag (br-feature-current) + ftr-path other-win)) classes (if found-ftr nil (cdr classes)))) (if found-ftr (or class t) - (java-feature-tags-lookup + (java-feature-display (apply 'append (mapcar (function (lambda (cl) (br-get-parents cl))) class-list)) ftr-pat))))) +(defun java-feature-lessp (routine1 routine2) + (string-lessp (java-feature-signature-to-name routine1) + (java-feature-signature-to-name routine2))) + +(defun java-feature-map-tags (function regexp) + "Apply FUNCTION to all current feature tags that match REGEXP and return a list of the results. +Feature tags come from the file named by br-feature-tags-file." + ;; Ensure match to feature names only; also handle "^" and "$" meta-chars + (let ((identifier-chars (concat "[" java-identifier-chars "]*")) + (results)) + (setq regexp + (concat (format "^[^%s \n]+%s%s " + java-type-tag-separator java-type-tag-separator + br-feature-type-regexp) + (if (equal (substring regexp 0 1) "^") + (progn (setq regexp (substring regexp 1)) nil) + identifier-chars) + (if (equal (substring regexp -1) "$") + (substring regexp 0 -1) + (concat regexp identifier-chars)) + java-type-tag-separator)) + (save-excursion + (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) + (goto-char 1) + (while (re-search-forward regexp nil t) + (setq results (cons (funcall function) results)))) + results)) + +(defun java-feature-matches (regexp) + "Return an unsorted list of feature tags whose names match in part or whole to REGEXP. +^ and $ characters may be used to match to the beginning and end of a feature name, +respectively." + (java-feature-map-tags 'br-feature-current regexp)) + +(defun java-feature-normalize (feature class name) + (setq class (br-delete-space class) + name (java-feature-add-prefix name class feature) + feature (concat class java-type-tag-separator + name java-type-tag-separator + (br-delete-space feature))) + (let* ((len (length feature)) + (normal-feature (make-string len ?\ )) + (n 0) (i 0) + (space-list '(?\ ?\t ?\n ?\^M)) + (space-regexp "[ \t\n\^M]+") + chr) + (while (< i len) + (setq chr (aref feature i)) + (cond + ;; Convert sequences of space characters to a single space. + ((memq chr space-list) + (aset normal-feature n ?\ ) + (if (string-match space-regexp feature i) + (setq i (match-end 0) + n (1+ n)) + (setq i (1+ i) + n (1+ n)))) + ;; + ;; Remove // style comments + ((and (= chr ?/) + (< (1+ i) len) + (= (aref feature (1+ i)) ?/)) + (setq i (+ i 2)) + (while (and (< i len) (/= (aref feature i) ?\n)) + (setq i (1+ i)))) + ;; + (t ;; Normal character + (aset normal-feature n chr) + (setq i (1+ i) + n (1+ n))))) + (substring normal-feature 0 n))) + +(defun java-feature-tag-class (signature) + "Extract the class name from SIGNATURE." + (cond ((string-match java-type-tag-separator signature) + (substring signature 0 (match-beginning 0))) + ((string-match "\\([^ \t]+\\)\." signature) + (substring signature (match-beginning 1) (match-end 1))) + (t ""))) + (defun java-files-with-source (class) "Use CLASS to compute set of files that match to a java source file regexp. Return as a list." @@ -529,7 +538,7 @@ (if (and br-feature-tags-file (file-exists-p br-feature-tags-file) (file-readable-p br-feature-tags-file)) - (java-feature-tags-lookup class-list ftr-pat other-win) + (java-feature-display class-list ftr-pat other-win) ;; Only works if features are in same directory as class def. (java-scan-ancestors-feature class-list ftr-pat other-win)) (set-buffer obuf)))) @@ -544,7 +553,7 @@ (skip-chars-backward ignore) (skip-chars-backward pat) (setq start (point)) - (skip-chars-forward (concat pat ":")) + (skip-chars-forward pat) (buffer-substring start (point))))) (defun java-func-args-regexp (func-args) @@ -702,84 +711,31 @@ (and (> (point) opoint) class)))))) -(defun java-get-feature-tags (routine-file &optional routine-list) - "Scan java ROUTINE-FILE and hold routine tags in 'br-feature-tags-file'. -Assume ROUTINE-FILE has already been read into a buffer and that -'br-feature-tags-init' has been called. Optional ROUTINE-LIST can be +(defun java-get-feature-tags (feature-file &optional feature-list) + "Scan java FEATURE-FILE and hold feature tags in 'br-feature-tags-file'. +Assume FEATURE-FILE has already been read into a buffer and that +'br-feature-tags-init' has been called. Optional FEATURE-LIST can be provided so that a non-standard scan function can be used before calling this function." (interactive) (let ((obuf (current-buffer))) (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) (goto-char 1) - ;; Delete any prior routine tags associated with routine-file - (if (search-forward routine-file nil 'end) + ;; Delete any prior feature tags associated with feature-file + (if (search-forward feature-file nil 'end) (progn (forward-line -1) (let ((start (point))) (search-forward "\^L" nil 'end 2) (backward-char 1) (delete-region start (point)) ))) - (if routine-list - (progn (insert "\^L\n" routine-file "\n") + (if feature-list + (progn (insert "\^L\n" feature-file "\n") (mapcar (function (lambda (tag) (insert tag "\n"))) - routine-list) + feature-list) )) (set-buffer obuf))) -(defun java-include-file (&optional other-win) - "If point is on an include file line, try to display file. -Return non-nil iff an include file line, even if file is not found. -Look for include file in 'java-cpp-include-dirs' and in directory list -'java-include-dirs'." - (let ((opoint (point))) - (beginning-of-line) - (if (looking-at java-include-regexp) - (let ((incl-type (string-to-char - (buffer-substring (match-beginning 1) - (1+ (match-beginning 1))))) - (file (buffer-substring (match-beginning 2) (match-end 2))) - (path) - (dir-list java-include-dirs) - (found)) - (goto-char opoint) - (setq dir-list (if (= incl-type ?<) - (append dir-list java-cpp-include-dirs) - (cons (file-name-directory buffer-file-name) - dir-list))) - (while dir-list - (setq path (concat (car dir-list) file) - dir-list (if (setq found (file-exists-p path)) - nil - (cdr dir-list)))) - ;; - ;; If not found in normal include dirs, check all Env paths also. - ;; - (if (not found) - (let ((paths (delq nil (hash-map 'cdr br-paths-htable)))) - (while paths - (setq path (car paths)) - (if (string-equal (file-name-nondirectory path) file) - (setq found t paths nil) - (setq paths (cdr paths)))))) - ;; - ;; If found, display file - ;; - (if found - (if (file-readable-p path) - (progn - (funcall br-edit-file-function path other-win) - (if (not (fboundp 'br-lang-mode)) - (java-mode-setup)) - (br-major-mode)) - (beep) - (message "(OO-Browser): Include file '%s' unreadable." path)) - (beep) - (message "(OO-Browser): Include file '%s' not found." file)) - path) - (goto-char opoint) - nil))) - (defun java-locate-feature (ftr class ftr-pat &optional other-win) ;; 'class' may = nil, implying non-member function (or class (setq class "[function]")) @@ -795,7 +751,7 @@ t)))) (defun java-scan-ancestors-feature (class-list ftr-pat &optional other-win) - "Display routine definition derived from CLASS-LIST, matching FTR-PAT. + "Display feature definition derived from CLASS-LIST, matching FTR-PAT. Scan files with same base name as class file." (let ((classes class-list) (found-ftr) @@ -823,43 +779,47 @@ ftr-pat))))) (defun java-scan-features (class start end) - "Return reverse ordered list of java routine definitions within CLASS def. -START and END give buffer region to search." + "Return reverse ordered list of java feature declarations within CLASS def. +START and END give buffer region to search. + +Multiple declarations with only one type, e.g. float a, b; +are missed, because that would require too much effort right now. +Use the clearer style with a type keyword for each feature defined." (setq class (br-delete-space class)) (save-excursion (save-restriction (narrow-to-region start end) (goto-char start) - (let ((routines) rout name) + (let ((features) ftr name) ;; ;; Get member definitions and abstract method declarations. - ;; - (while (re-search-forward java-routine-def nil t) + (while (re-search-forward java-feature-decl nil t) (setq start (match-beginning 0) name (buffer-substring (match-beginning java-feature-name-grpn) (match-end java-feature-name-grpn)) - rout (buffer-substring (match-beginning 0) (match-end 0))) + ftr (buffer-substring (match-beginning 0) (match-end 0))) ;; This is necessary to remove a possible double expression match ;; where there is a blank line within the match. - (if (string-match "[\n\^M]\\([ \t]*[\n\^M]\\)+" rout) - (progn (setq rout (substring rout (match-end 0))) + (if (string-match "[\n\^M]\\([ \t]*[\n\^M]\\)+" ftr) + (progn (setq ftr (substring ftr (match-end 0))) (goto-char (+ start (match-end 0)))) (if (c-within-comment-p) (search-forward "*/" nil t) - ;; Move point to precede feature opening brace or abstract - ;; method declaration semicolon. + ;; Move point to precede the feature match termination character. (backward-char) - (if (= (following-char) ?\{) - (condition-case () - ;; Move to end of feature but ignore any error if braces - ;; are unbalanced. Let the compiler tell the user about - ;; this. - (forward-sexp) - (error nil))) - (setq rout (java-feature-normalize rout class name) - routines (cons rout routines))))) - routines)))) + (cond ((= (following-char) ?\{) + (condition-case () + ;; Move to end of feature but ignore any error if braces + ;; are unbalanced. Let the compiler tell the user about + ;; this. + (forward-sexp) + (error nil))) + ((= (following-char) ?=) + (skip-chars-forward "^;"))) + (setq ftr (java-feature-normalize ftr class name) + features (cons ftr features))))) + features)))) (defun java-skip-to-statement () (if (re-search-backward "\\(^\\|[;{}]\\)[ \t]*" nil t) @@ -871,22 +831,16 @@ ;;; Private variables ;;; ************************************************************************ -(defconst java-code-file-regexp "\\.java$" - "Regular expression matching a unique part of java source (non-header) file name and no others.") - -(defconst java-include-regexp - "[ \t/*]*import[ \t]+\\([^;]+\\)" - "Regexp to match to java include file lines. File name is grouping 2. Type -of include, user-specified via double quote, or system-related starting with -'<' is given by grouping 1.") +(defconst java-code-file-regexp "\\.java?$" + "Regular expression matching a unique part of a Java source file name and no others.") (defconst java-type-def-modifier "\\(const\\|final\\|static\\|abstract\\|public\\|protected\\|private\\)") (defconst java-type-modifier-keyword (concat "\\(\\(public\\|protected\\|private\\|const\\|abstract\\|" - "synchronized\\|final\\|static\\|threadsafe\\|transient\\|" - "native\\)[ \t\n\^M]+\\)")) + "synchronized\\|final\\|static\\|transient\\|" + "native\\|volatile\\)[ \t\n\^M]+\\)")) (defconst java-type-identifier-group (concat "\\(\\(" java-return-type-identifier "\\)[ \t\n\^M]+\\)")) @@ -904,11 +858,11 @@ java-type-identifier-group "\\)?" "\\(" java-type-identifier "[ \t\n\^M]*\\)?" "\\(" java-function-identifier "\\|" java-identifier "\\)" - ;; It's hard to tell arguments from parenthesized initializing + ;; It is hard to tell arguments from parenthesized initializing ;; expressions. - "[ \t\n\^M]*(\\([^);{}]*\\))\\([][]*\\)" - ;; Optional exceptions that a feature can throw. - "\\([ \t\n\^M]+throws[ \t\n\^M]+\\(" + "[ \t\n\^M]*\\(([^\);{}]*)\\)?\\([][ \t]*\\)" + ;; Optional exceptions that a method can throw. + "\\([ \t\n\^M]*\\<throws\\>[ \t\n\^M]*\\(" java-identifier "[, \t\n\^M]*\\)+\\)?" ) "Regexp matching a java member declaration or definition. @@ -923,23 +877,24 @@ (defconst java-feature-name-grpn 9) (defconst java-feature-parens-grpn 11) (defconst java-feature-exceptions-grpn 14) +(defconst java-feature-terminator-grpn 15) (defconst java-at-feature-regexp (concat java-feature-decl-or-def "[ \t\n]*") "See documentation of 'java-feature-decl-or-def' for grouping expressions.") (defconst java-feature-decl - (concat java-at-feature-regexp "[;{]") - "See documentation of 'java-feature-decl-or-def' for grouping expressions.") - -(defconst java-routine-def-terminator-regexp - ;; Also matches to abstract method declarations. - ;; Only native and abstract functions end with a semi-colon. - "\\({\\|;\\)") + (concat java-at-feature-regexp "\\([=;{]\\)") + "See documentation of 'java-feature-decl-or-def' for grouping expressions. +'java-feature-terminator-grpn' holds the equal-sign, semi-color or opening brace +that triggers the end of the match.") (defconst java-routine-def - (concat java-at-feature-regexp java-routine-def-terminator-regexp) - "See documentation of 'java-feature-decl-or-def' for grouping expressions.") + (concat java-at-feature-regexp "\\([;{]\\)") + "See documentation of 'java-feature-decl-or-def' for grouping expressions. +'java-feature-terminator-grpn' holds the opening brace that terminates the +feature declaration or the semi-colon that terminates native and abstract +method declarations.") (defconst java-class-decl (concat java-class-modifier-keyword @@ -949,11 +904,10 @@ (defconst java-class-name-grpn 4) -;; Old def was: "\\(^\\|[ \t\n\^M]\\)abstract[ \t\n\^M][^;{}]+;" -(defconst java-abstract-method-regexp ";\\'" +(defconst java-abstract-method-regexp "\\<abstract\\>[^;{}]+;" "Regexp matching a Java abstract method signature.") -(defconst java-native-method-regexp "\\(^\\|[ \t\n\^M]\\)native[ \t\n\^M][^;{}]+;" +(defconst java-native-method-regexp "\\<native\\>[^;{}]+;" "Regexp matching a Java native method signature, one implemented in another language.") (provide 'br-java-ft)
--- a/lisp/oobr/br-java.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-java.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: c, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 01-Aug-95 -;; LAST-MOD: 4-Oct-95 at 13:31:43 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 07:33:18 by Bob Weiner ;; -;; Copyright (C) 1995 Free Software Foundation, Inc. +;; Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -68,11 +68,6 @@ (if no-kill (set-buffer no-kill) (funcall br-view-file-function filename)) - ;; Don't bother saving anything for this temporary buffer - (buffer-disable-undo (current-buffer)) - (setq buffer-auto-save-file-name nil) - ;; Make life simpler - (br-lang-mode) ;; Static initializers confuse the parser and don't define anything ;; that we need, so remove them. (java-strip-static-code) @@ -162,8 +157,8 @@ (hash-add words java-package-name java-package-htable)))) (defun java-normalize-class-name (name) - "Convert class NAME to make it globally unique using current package." - ;; Currently incomplete. THe defined class has a package name, but + "Normalize class NAME to include the package name that defines it." + ;; Currently incomplete. The defined class has a package name, but ;; the parents do not. How do we match the parents to the correct ;; class if there are multiple matches? (or (car (java-split-identifier name)) @@ -289,7 +284,7 @@ ;;; ************************************************************************ (defconst java-class-modifier-keyword - "\\(public\\|protected\\|final\\|abstract\\|[ \t\n\^M]+\\)*") + "\\(public\\|final\\|abstract\\|[ \t\n\^M]+\\)*") (defconst java-class-name-before (concat "^[ \t]*" java-class-modifier-keyword java-class-keyword)
--- a/lisp/oobr/br-lib.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-lib.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 22-Mar-90 -;; LAST-MOD: 21-Sep-95 at 14:30:36 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 10:55:11 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -96,7 +96,7 @@ (if count (cons count sorted-strings) sorted-strings)) (defun br-member-sorted-strings (elt list) - "Return non-nil if ELT is an element of LIST. Comparison done with 'string-equal'. + "Return non-nil if ELT is an element of LIST. Comparison done with `string-equal'. All ELTs must be strings and the list must be sorted in ascending order. The value returned is actually the tail of LIST whose car is ELT." (while (and list (not (string-equal (car list) elt))) @@ -116,7 +116,7 @@ (defun br-rassoc (elt list) "Return non-nil if ELT is the cdr of an element of LIST. -Comparison done with 'equal'. The value is actually the tail of LIST +Comparison done with `equal'. The value is actually the tail of LIST starting at the element whose cdr is ELT." (while (and list (not (equal (cdr (car list)) elt))) (setq list (cdr list))) @@ -138,7 +138,7 @@ (defmacro br-set-cons (set elt) "Add to SET element ELT. Returns nil iff ELT is already in SET. -Uses 'equal' for comparison." +Uses `equal' for comparison." (` (if (br-member (, elt) (, set)) nil (setq (, set) (cons (, elt) (, set)))))) @@ -159,7 +159,7 @@ CLASS-PATH is nil, defaults to current buffer file as CLASS-PATH. If optional LIB-TABLE-P is non-nil, add to Library Environment, otherwise add to System Environment. If optional SAVE-FILE is t, the Environment is then -stored to filename given by 'br-env-file'. If SAVE-FILE is non-nil and +stored to filename given by `br-env-file'. If SAVE-FILE is non-nil and not t, its string value is used as the file to which to save the Environment. Does not update children lookup table." (interactive @@ -179,15 +179,15 @@ ;; If function called interactively ;; Query whether should overwrite class-name in tables ;; If yes - ;; Replace entry + ;; Replace class and its features ;; else ;; Don't add class; do nothing ;; end ;; else - ;; Store class in all necessary tables + ;; Store class without its features in all necessary tables ;; end ;; else - ;; Store class under key in all necessary tables + ;; Store class and its features under key in all necessary tables ;; end ;; (or class-path (setq class-path buffer-file-name) @@ -195,15 +195,14 @@ (if (or (string-equal class-name "") (not (or (equal class-path br-null-path) (file-exists-p class-path)))) - (error (format "Invalid class specified, '%s', in: %s" class-name class-path))) + (error (format "Invalid class specified, `%s', in: %s" class-name class-path))) ;; Is class already in Environment? (if (hash-key-p class-name (br-get-htable (if lib-table-p "lib-parents" "sys-parents"))) - (if (interactive-p) - (if (y-or-n-p (format "Overwrite existing '%s' entry? " class-name)) - (br-real-add-class lib-table-p class-name class-path 'replace) - (setq save-file nil)) - (br-real-add-class lib-table-p class-name class-path)) + (if (or (not (interactive-p)) + (y-or-n-p (format "Overwrite existing `%s' entry? " class-name))) + (br-real-add-class lib-table-p class-name class-path t) + (setq save-file nil)) (br-real-add-class lib-table-p class-name class-path)) (cond ((eq save-file nil)) ((eq save-file t) (br-env-save)) @@ -260,7 +259,7 @@ "Return full path, if any, to CLASS-NAME. With optional prefix argument INSERT non-nil, insert path at point. Only the first matching class is returned, so each CLASS-NAME should be -unique. Set 'br-lib/sys-search-dirs' properly before use." +unique. Set `br-lib/sys-search-dirs' properly before use." (interactive (list (br-complete-class-name))) (setq class-name (if class-name (br-set-case class-name))) (let* ((class-path) @@ -280,7 +279,7 @@ (message (or class-path (format - "(OO-Browser): No '%s' class found in 'br-lib/sys-search-dirs'." + "(OO-Browser): No `%s' class found in `br-lib/sys-search-dirs'." class-name))))) class-path)) @@ -321,7 +320,7 @@ (goto-char (point-min)) (if br-narrow-view-to-class ;; Display file narrowed to definition of - ;; 'class-name'. + ;; `class-name'. (if (re-search-forward class-def nil t) ;; Narrow display to this class (progn (narrow-to-region @@ -337,7 +336,7 @@ (goto-char (point-min))) (goto-char opoint) (narrow-to-region pmin pmax) - (setq err (format "(OO-Browser): No '%s' in %s" class-name + (setq err (format "(OO-Browser): No `%s' in %s" class-name class-path)) ) (if (re-search-forward class-def nil t) @@ -346,17 +345,17 @@ (recenter 0)) (goto-char opoint) (narrow-to-region pmin pmax) - (setq err (format "(OO-Browser): No '%s' in %s" class-name + (setq err (format "(OO-Browser): No `%s' in %s" class-name class-path)) ))) (setq class-path t)) - (setq err (format "(OO-Browser): '%s' - src file not found or not readable, %s" + (setq err (format "(OO-Browser): `%s' - src file not found or not readable, %s" class-name class-path) class-path nil) ) (if (interactive-p) (setq err - (format "(OO-Browser): No '%s' class defined in Environment." + (format "(OO-Browser): No `%s' class defined in Environment." class-name)) ))) (if err (error err)) @@ -367,6 +366,16 @@ (or (eq major-mode (symbol-function 'br-lang-mode)) (br-lang-mode))) +(defun br-scan-mode () + "Invoke language-specific major mode for current buffer without running its hooks. +This is used when scanning source files to build Environments." + (let ((mode-hook-sym + (intern-soft (concat (symbol-name (symbol-function 'br-lang-mode)) + "-hook")))) + (if mode-hook-sym + (eval (` (let ((, mode-hook-sym)) (br-lang-mode)))) + (br-lang-mode)))) + (defun br-show-children (class-name) "Return children of CLASS-NAME from current Environment." (interactive (list (br-complete-class-name t))) @@ -487,9 +496,9 @@ (beep) (message (if (br-class-in-table-p class) - (format "(OO-Browser): Class '%s' referenced but not defined in Environment." + (format "(OO-Browser): Class `%s' referenced but not defined in Environment." class) - (format "(OO-Browser): Class '%s' not defined in Environment." + (format "(OO-Browser): Class `%s' not defined in Environment." class))) nil))) @@ -501,10 +510,19 @@ (progn (beep) (message - (format "(OO-Browser): Class '%s' referenced but not defined in Environment." + (format "(OO-Browser): Class `%s' referenced but not defined in Environment." cl)) t)))) +(defun br-delete-features (class) + "Delete all feature tags lexically defined in CLASS." + (br-feature-map-class-tags + (function (lambda () + (beginning-of-line) + (delete-region (point) (progn (forward-line 1) (point))))) + class) + nil) + (defun br-get-children (class-name) "Return list of children of CLASS-NAME from child lookup table. Those which directly inherit from CLASS-NAME." @@ -518,15 +536,15 @@ (br-set-of-strings (hash-get class-name (br-get-parents-htable)))) (defun br-get-children-htable () - "Loads or builds 'br-children-htable' if necessary and returns value." + "Loads or builds `br-children-htable' if necessary and returns value." (br-get-htable "children")) (defun br-get-paths-htable () - "Loads or builds 'br-paths-htable' if necessary and returns value." + "Loads or builds `br-paths-htable' if necessary and returns value." (br-get-htable "paths")) (defun br-get-parents-htable () - "Loads or builds 'br-parents-htable' if necessary and returns value." + "Loads or builds `br-parents-htable' if necessary and returns value." (br-get-htable "parents")) (defun br-get-children-from-parents-htable (class-name) @@ -707,7 +725,7 @@ (message "")))))) (defun br-real-add-class (lib-table-p class-name class-path &optional replace) - "Add or replace class in current Environment. + "Add or replace class and its features within the current Environment. If LIB-TABLE-P is non-nil, add to Library Environment, otherwise add to System Environment. Add class CLASS-NAME located in CLASS-PATH to Environment. If CLASS-PATH is nil, use current buffer file as CLASS-PATH. @@ -734,7 +752,7 @@ ;; Signal error if class-name is invalid. (if (null class-name) (if replace - (error "(br-real-add-class): '%s' not found in %s classes, so cannot replace it." + (error "(br-real-add-class): `%s' not found in %s classes, so cannot replace it." class (if lib-table-p "Library" "System")) (error "(br-real-add-class): Attempt to add null class to %s classes." @@ -747,12 +765,15 @@ (path-htable (br-get-htable (concat type "paths")))) (funcall func par-list class-name par-htable) (br-add-to-paths-htable class-name paths-key path-htable)))) - (list (if lib-table-p "lib-" "sys-") "")))) + (list (if lib-table-p "lib-" "sys-") "")) + (and (stringp class-path) (file-readable-p class-path) + (br-get-classes-from-source class-path)))) (defun br-real-delete-class (class-name) "Delete class CLASS-NAME from current Environment. No error occurs if the class is undefined in the Environment." (require 'set) + (br-delete-features class-name) (let ((paths-key (br-class-path class-name)) htable) (setq class-name @@ -809,7 +830,7 @@ (br-get-parents-htable)))) (defun br-real-build-alists (search-dirs) - "Use SEARCH-DIRS to build 'br-paths-alist' and 'br-parents-alist'." + "Use SEARCH-DIRS to build `br-paths-alist' and `br-parents-alist'." (setq br-paths-alist nil br-parents-alist nil) (br-feature-tags-init) (br-real-build-al search-dirs) @@ -821,7 +842,7 @@ (defvar br-parents-alist nil) (defun br-skip-dir-p (dir-name) - "Returns non-nil iff DIR-NAME is matched by a member of 'br-skip-dir-regexps'." + "Returns non-nil iff DIR-NAME is matched by a member of `br-skip-dir-regexps'." (delq nil (mapcar (function (lambda (dir-regexp) @@ -836,12 +857,12 @@ (fset 'abbreviate-file-name 'identity)) (defun br-real-build-al (search-dirs) - "Descend SEARCH-DIRS and build 'br-paths-alist' and 'br-parents-alist'. -Does not initialize 'br-paths-alist' or 'br-parents-alist' to nil." + "Descend SEARCH-DIRS and build `br-paths-alist' and `br-parents-alist'. +Does not initialize `br-paths-alist' or `br-parents-alist' to nil." (let ((inhibit-local-variables nil) (enable-local-variables t) (files) - ;; These are used in the 'br-search-directory' function. + ;; These are used in the `br-search-directory' function. classes parents paths-parents-cons) (mapcar (function @@ -911,8 +932,8 @@ files)))) (defun br-real-build-parents-alist (paths-htable) - "Build and return 'br-parents-alist' of (parent-list . class) elements built from PATHS-HTABLE. -Initializes 'br-parents-alist' to nil." + "Build and return `br-parents-alist' of (parent-list . class) elements built from PATHS-HTABLE. +Initializes `br-parents-alist' to nil." (let ((inhibit-local-variables nil) (enable-local-variables t) (br-view-file-function 'br-insert-file-contents)) @@ -941,7 +962,7 @@ (defun br-set-lang-env (func sym-list val) "Use FUNC to set each element in SYM-LIST. -If VAL is non-nil, set 'br' element to value of current OO-Browser language +If VAL is non-nil, set `br' element to value of current OO-Browser language element with the same name, otherwise set to symbol." (let ((br) (lang)) (mapcar (function @@ -967,9 +988,10 @@ "select-path" "feature-implementors" "feature-locate-p" - "feature-name-to-regexp" "feature-signature-to-name" + "feature-name-to-regexp" "feature-map-class-tags" + "feature-signature-to-name" "feature-signature-to-regexp" "feature-tag-class" - "feature-tree-command-p" + "feature-tag-regexp" "feature-tree-command-p" "list-categories" "list-features" "list-protocols" "view-friend" "view-protocol") nil)) @@ -999,10 +1021,10 @@ language-specific.") (defvar br-lib-prev-search-dirs nil - "Used to check if 'br-lib-paths-htable' must be regenerated. + "Used to check if `br-lib-paths-htable' must be regenerated. Value is language-specific.") (defvar br-sys-prev-search-dirs nil - "Used to check if 'br-sys-paths-htable' must be regenerated. + "Used to check if `br-sys-paths-htable' must be regenerated. Value is language-specific.") (defun br-find-file (filename &optional other-win read-only) @@ -1011,9 +1033,12 @@ already exists. Optional OTHER-WIN means show in other window. Optional READ-ONLY means make buffer read-only." (interactive "FFind file: ") + (if (br-in-browser) + (progn (br-to-view-window) + (setq other-win nil))) (funcall (if other-win 'switch-to-buffer-other-window 'switch-to-buffer) (find-file-noselect filename)) - (and read-only (setq buffer-read-only t))) + (if read-only (setq buffer-read-only t))) (defun br-find-file-read-only (filename &optional other-win) "Display file FILENAME read-only. @@ -1039,33 +1064,37 @@ (defun br-insert-file-contents (filename) "Insert FILENAME contents into a temporary buffer and select buffer. -Does not run any find-file hooks. Marks buffer read-only to prevent -any accidental editing. +Does not run any find-file or mode specific hooks. Marks buffer read-only to +prevent any accidental editing. -Set 'br-view-file-function' to this function when parsing OO-Browser source +Set `br-view-file-function' to this function when parsing OO-Browser source files for fast loading of many files." (let ((buf (get-buffer-create *br-tmp-buffer*))) (switch-to-buffer buf) + ;; Don't bother saving anything for this temporary buffer (buffer-disable-undo buf) - (setq buffer-read-only nil) + (setq buffer-auto-save-file-name nil + buffer-read-only nil) (erase-buffer) - (insert-file-contents filename t))) + (insert-file-contents filename t) + (br-scan-mode) + (setq buffer-read-only t))) (defvar br-lang-prefix nil "Prefix string that starts language-specific symbol names.") (defvar br-children-htable nil "Htable whose elements are of the form: (LIST-OF-CHILD-CLASSES . CLASS-NAME). -Used to traverse class inheritance graph. 'br-build-children-htable' builds +Used to traverse class inheritance graph. `br-build-children-htable' builds this list. Value is language-specific.") (defvar br-parents-htable nil "Htable whose elements are of the form: (LIST-OF-PARENT-CLASSES . CLASS-NAME). -Used to traverse class inheritance graph. 'br-build-parents-htable' builds +Used to traverse class inheritance graph. `br-build-parents-htable' builds this list. Value is language-specific.") (defvar br-paths-htable nil "Htable whose elements are of the form: (LIST-OF-CLASS-NAMES . DIRECTORY). DIRECTORY gives the location of classes found in LIST-OF-CLASS-NAMES. -'br-build-paths-htable' builds this list. Value is language-specific.") +`br-build-paths-htable' builds this list. Value is language-specific.") (defvar br-lib-parents-htable nil "Htable whose elements are of the form: (LIST-OF-PARENT-CLASSES . CLASS-NAME).
--- a/lisp/oobr/br-menu.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-menu.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: mouse, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 27-Oct-93 at 21:13:36 -;; LAST-MOD: 22-Oct-95 at 00:41:44 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 16:58:26 by Bob Weiner ;; -;; Copyright (C) 1994, 1995 Free Software Foundation, Inc. +;; Copyright (C) 1994, 1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -36,18 +36,21 @@ "----" ["Compose-Mail-to-List" (progn (br-quit) - (mail nil "oo-browser@hub.ucsb.edu" + (mail nil "oo-browser@infodock.com" "Replace this line with a descriptive sentence.") (goto-char (point-min)) (search-forward "Subject: " nil t)) t] ["Mail-List-Request" (progn (br-quit) - (mail nil "oo-browser-request@hub.ucsb.edu") - (insert "Use a subject line like one of the following:\n" - " Subject: Subscribe <joe@any.com> (Joe Williams).\n" - " Subject: Unsubscribe <joe@any.com>.\n") - (goto-char (point-min)) - (search-forward "Subject: " nil t)) t] + (mail nil "oo-browser-request@infodock.com") + (insert "The subject line of this message will not be used.\n" + "Remove everything in the body of this message except one\n" + "or more lines of the following form:\n\n" + " subscribe oo-browser [<your-email-address>]\n" + " or\n" + " unsubscribe oo-browser [<your-email-address>]\n\n" + "For example: subscribe oo-browser joe@nowhere.gov\n")) + t] "----" ["Reinitialize" br-refresh t] ["Exit-Temporarily" (id-tool-quit '(br-quit)) t] @@ -127,8 +130,12 @@ ("Options" ["Keep-Viewed-Classes" br-toggle-keep-viewed :style toggle :selected br-keep-viewed-classes] - ["Graphical-Show-Features" br-tree-features-toggle + ["Graphical-Add-Features" br-tree-features-toggle :style toggle :selected br-show-features] + ["Show-Inherited-Features" + (setq br-inherited-features-flag + (not br-inherited-features-flag)) + :style toggle :selected br-inherited-features-flag] ) ("View-Window" ["Full-Frame" br-view-full-frame t] @@ -149,18 +156,21 @@ "----" ["Compose-Mail-to-List" (progn (br-quit) - (mail nil "oo-browser@hub.ucsb.edu" + (mail nil "oo-browser@infodock.com" "Replace this line with a descriptive sentence.") (goto-char (point-min)) (search-forward "Subject: " nil t)) t] ["Mail-List-Request" (progn (br-quit) - (mail nil "oo-browser-request@hub.ucsb.edu") - (insert "Use a subject line like one of the following:\n" - " Subject: Subscribe <joe@any.com> (Joe Williams).\n" - " Subject: Unsubscribe <joe@any.com>.\n") - (goto-char (point-min)) - (search-forward "Subject: " nil t)) t] + (mail nil "oo-browser-request@infodock.com") + (insert "The subject line of this message will not be used.\n" + "Remove everything in the body of this message except one\n" + "or more lines of the following form:\n\n" + " subscribe oo-browser [<your-email-address>]\n" + " or\n" + " unsubscribe oo-browser [<your-email-address>]\n\n" + "For example: subscribe oo-browser joe@nowhere.gov\n")) + t] "----" ("Class" ["Edit-Current" br-edit-entry t] @@ -234,8 +244,12 @@ ("Options" ["Keep-Viewed-Classes" br-toggle-keep-viewed :style toggle :selected br-keep-viewed-classes] - ["Graphical-Show-Features" br-tree-features-toggle + ["Graphical-Add-Features" br-tree-features-toggle :style toggle :selected br-show-features] + ["Show-Inherited-Features" + (setq br-inherited-features-flag + (not br-inherited-features-flag)) + :style toggle :selected br-inherited-features-flag] ) ("View-Window" ["Full-Frame" br-view-full-frame t]
--- a/lisp/oobr/br-objc-ft.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-objc-ft.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: c, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 03-Oct-90 -;; LAST-MOD: 5-May-95 at 15:57:14 by Bob Weiner +;; LAST-MOD: 31-Oct-96 at 17:03:48 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1996 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -104,7 +104,7 @@ (defun objc-feature-implementors (ftr-name) "Return unsorted list of Objective-C feature tags which implement FTR-NAME." - (objc-feature-matches ftr-name)) + (objc-feature-matches (regexp-quote ftr-name))) (defun objc-feature-locate-p (feature-tag &optional regexp-flag) "Leaves point at the start of FEATURE-TAG's definition in the current buffer. @@ -149,6 +149,32 @@ (goto-char start) t)))) +(defun objc-feature-map-class-tags (function class) + "Apply FUNCTION to all feature tags from CLASS and return a list of the results. +Feature tags come from the file named by br-feature-tags-file." + (let ((obuf (current-buffer)) + (class-tag (concat "\n" class objc-type-tag-separator)) + (results) + search-function) + (if (= (aref class 0) ?\[) + ;; Default class of protocols or categories. Use a string match + ;; for speed. + (setq search-function 'search-forward + class-tag (concat "\n" class objc-type-tag-separator)) + (setq search-function 're-search-forward + class-tag + ;; Include methods defined in any of the class' categories. + (concat "^" class "\\(([^\)]*)\\)?" objc-type-tag-separator))) + (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) + (goto-char 1) + (while (funcall search-function class-tag nil t) + (setq results (cons (funcall function) results)) + ;; Might have deleted current tag and would miss next tag unless point + ;; is moved backwards. + (backward-char)) + (set-buffer obuf) + results)) + (defun objc-feature-name-to-regexp (name) "Converts feature NAME into a regular expression matching the feature's name tag." (cond @@ -290,6 +316,12 @@ "\\([ \t\n]*//.*[\n]\\)*[ \t\n]*{")) pat))))) +(defun objc-feature-tag-regexp (class feature-name) + "Return a regexp that matches to the feature tag entry for CLASS' FEATURE-NAME." + (concat "^" (regexp-quote class) objc-type-tag-separator + br-feature-type-regexp " " + (regexp-quote feature-name) "\\(" objc-type-tag-separator "\\|\\'\\)")) + (defun objc-feature-tree-command-p (class-or-signature) "Display definition of CLASS-OR-SIGNATURE if a signature and return t, else return nil." (if (br-in-browser) (br-to-view-window)) @@ -318,26 +350,10 @@ (objc-sort-features (nreverse categories)))))) (defun objc-list-features (class &optional indent) - "Return sorted list of Objective-C features lexically defined in CLASS." - (let ((obuf (current-buffer)) - (features) - class-tag - search-function) - (if (= (aref class 0) ?\[) - ;; Default class of protocols or categories. Use a string match - ;; for speed. - (setq search-function 'search-forward - class-tag (concat "\n" class objc-type-tag-separator)) - (setq search-function 're-search-forward - class-tag - ;; Include methods defined in any of the class' categories. - (concat "^" class "\\(([^\)]*)\\)?" objc-type-tag-separator))) - (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) - (goto-char 1) - (while (funcall search-function class-tag nil t) - (setq features (cons (br-feature-current) features))) - (set-buffer obuf) - (objc-sort-features (nreverse features)))) + "Return sorted list of Objective-C feature tags lexically defined in CLASS. +Optional INDENT is unused but is required for multi-language OO-Browser conformance." + (objc-sort-features + (nreverse (objc-feature-map-class-tags 'br-feature-current class)))) (defun objc-list-protocols (class) "Return sorted list of Objective-C CLASS protocols." @@ -550,29 +566,56 @@ (= ?\{ (save-excursion (goto-char (match-end 0)) (preceding-char)))))) -(defun objc-feature-partial-name (feature-tag) - "Extract the feature name without its class name from FEATURE-TAG." - (objc-feature-signature-to-name feature-tag)) +(defun objc-feature-display (class-list signature ftr-regexp &optional other-win) + "Display routine definition derived from CLASS-LIST, matching SIGNATURE (string) and FTR-REGEXP (regexp matching SIGNATURE). +Use routine tags table to locate a match. Caller must use 'set-buffer' +to restore prior buffer when a match is not found." + (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) + (let ((classes class-list) + (found-ftr) + (class)) + (if (null class-list) + nil + (while (and (not found-ftr) classes) + (setq class (car classes) + found-ftr (br-feature-found-p + (br-feature-file signature) + ftr-regexp nil other-win t) + classes (if found-ftr nil (cdr classes)))) + (if found-ftr + (or class t) + (objc-feature-display + (apply 'append (mapcar (function (lambda (cl) (br-get-parents cl))) + class-list)) + signature + ftr-regexp + other-win))))) (defun objc-feature-lessp (tag1 tag2) (string-lessp (objc-feature-partial-name tag1) (objc-feature-partial-name tag2))) -(defun objc-feature-matches (name) - "Return an unsorted list of feature tags whose names match in whole to NAME." - ;; Ensure match to feature names only. - (let ((regexp (format "^[^%s \n]+%s%s %s%s" objc-type-tag-separator - objc-type-tag-separator br-feature-type-regexp - (regexp-quote name) objc-type-tag-separator)) - (features)) +(defun objc-feature-map-tags (function regexp) + "Apply FUNCTION to all current feature tags that match REGEXP and return a list of the results. +Feature tags come from the file named by br-feature-tags-file." + (let ((identifier-chars (concat "[" objc-identifier-chars "]*")) + (results)) + (setq regexp (format "^[^%s \n]+%s%s %s%s" objc-type-tag-separator + objc-type-tag-separator br-feature-type-regexp + regexp objc-type-tag-separator)) + ;; Ensure match to feature names only; also handle "^" and "$" meta-chars (save-excursion - (set-buffer - (funcall br-find-file-noselect-function br-feature-tags-file)) + (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) (goto-char 1) (while (re-search-forward regexp nil t) - (save-excursion - (setq features (cons (br-feature-current) features)))) - features))) + (setq results (cons (funcall function) results)))) + results)) + +(defun objc-feature-matches (regexp) + "Return an unsorted list of feature tags whose names match in part or whole to REGEXP. +^ and $ characters may be used to match to the beginning and end of a feature name, +respectively." + (objc-feature-map-tags 'br-feature-current regexp)) (defun objc-feature-normalize (routine class) (let* ((len (length routine)) @@ -610,37 +653,16 @@ objc-type-tag-separator normal-feature))) +(defun objc-feature-partial-name (feature-tag) + "Extract the feature name without its class name from FEATURE-TAG." + (objc-feature-signature-to-name feature-tag)) + (defun objc-feature-tag-class (feature-signature) "Extract the class name from FEATURE-SIGNATURE." (if (string-match objc-type-tag-separator feature-signature) (substring feature-signature 0 (match-beginning 0)) "")) -(defun objc-feature-tags-lookup (class-list signature ftr-regexp &optional other-win) - "Display routine definition derived from CLASS-LIST, matching SIGNATURE (string) and FTR-REGEXP (regexp matching SIGNATURE). -Use routine tags table to locate a match. Caller must use 'set-buffer' -to restore prior buffer when a match is not found." - (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file)) - (let ((classes class-list) - (found-ftr) - (class)) - (if (null class-list) - nil - (while (and (not found-ftr) classes) - (setq class (car classes) - found-ftr (br-feature-found-p - (br-feature-file signature) - ftr-regexp nil other-win t) - classes (if found-ftr nil (cdr classes)))) - (if found-ftr - (or class t) - (objc-feature-tags-lookup - (apply 'append (mapcar (function (lambda (cl) (br-get-parents cl))) - class-list)) - signature - ftr-regexp - other-win))))) - (defun objc-files-with-source (class) "Use CLASS to compute set of files that match to an Objective-C source file regexp. Return as a list." @@ -663,7 +685,7 @@ (if (and br-feature-tags-file (file-exists-p br-feature-tags-file) (file-readable-p br-feature-tags-file)) - (objc-feature-tags-lookup + (objc-feature-display class-list signature ftr-regexp other-win) ;; Only works if features are in same directory as class def. (objc-scan-ancestors-feature class-list ftr-regexp other-win))
--- a/lisp/oobr/br-objc.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-objc.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: c, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 7-Dec-89 -;; LAST-MOD: 21-Sep-95 at 12:31:05 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 17:22:55 by Bob Weiner ;; -;; Copyright (C) 1989-1995 Free Software Foundation, Inc. +;; Copyright (C) 1989-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser.
--- a/lisp/oobr/br-python-ft.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-python-ft.el Mon Aug 13 09:15:11 2007 +0200 @@ -10,9 +10,9 @@ ;; ORG: Tekla Oy ;; ;; ORIG-DATE: 5-Apr-96 -;; LAST-MOD: 1-May-96 +;; LAST-MOD: 23-Dec-96 at 22:09:00 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1996 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -60,7 +60,7 @@ (defun python-add-default-classes () ;; Add to 'system' class table. ;; Add this default class for global functions - (br-add-class "[functions]" br-null-path nil)) + (br-add-class "[function]" br-null-path nil)) (defun python-feature-implementors (name) "Return unsorted list of Python feature tags which implement feature NAME. @@ -126,12 +126,11 @@ (defun python-scan-features () "Return reverse ordered list of Python function definitions in current -buffer. Assume point is at beginning of widened buffer. -'[functions]@- foo@foo(arguments)'" +buffer. Assume point is at the beginning of a widened buffer." (save-excursion (let ((routines) class name rout) (while (re-search-forward python-routine-def nil t) - (setq class "[functions]" + (setq class "[function]" name (buffer-substring (match-beginning python-feature-name-grpn) (match-end python-feature-name-grpn)) rout (python-feature-normalize @@ -494,7 +493,7 @@ (defun python-locate-feature (ftr class ftr-pat &optional other-win) ;; 'class' may = nil, implying non-member function - (or class (setq class "[functions]")) + (or class (setq class "[function]")) (let ((def-class)) (if (and ftr-pat (setq def-class
--- a/lisp/oobr/br-site.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-site.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: local, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 18-May-90 -;; LAST-MOD: 28-Jul-95 at 15:11:17 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 06:59:49 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -30,12 +30,12 @@ ) "*Alist of (FILENAME-REGEXP . EDIT-FUNCTION) elements for calling special functions to display particular file types within Emacs. See also -'hpath:find-alist' for external display program settings.") +`hpath:find-alist' for external display program settings.") (defvar hpath:find-alist nil "*Alist of (FILENAME-REGEXP . EDIT-PROGRAM) elements for using window system dependent external programs to edit/display particular file types. See also -'hpath:display-alist' for internal, window-system independent display +`hpath:display-alist' for internal, window-system independent display settings.") (defvar smart-scroll-proportional nil
--- a/lisp/oobr/br-smt.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-smt.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,19 +6,19 @@ ;; KEYWORDS: oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 26-Jul-90 -;; LAST-MOD: 21-Sep-95 at 12:31:20 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 07:00:21 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. ;; ;; DESCRIPTION: ;; -;; See 'smt-class-def-regexp' for regular expression that matches class +;; See `smt-class-def-regexp' for regular expression that matches class ;; definitions. ;; ;; DESCRIP-END. @@ -143,7 +143,7 @@ (defconst smt-class-def-regexp (concat smt-class-name-before smt-identifier smt-class-name-after) "Regular expression used to match to class definitions in source text. -Class name identifier is grouped expression 3. 'subclass:' inheritance +Class name identifier is grouped expression 3. `subclass:' inheritance indicator is grouped expression 2. Parent identifier is grouped expression 1.") @@ -156,16 +156,16 @@ (defvar smt-children-htable nil "Htable whose elements are of the form: (LIST-OF-CHILD-CLASSES . CLASS-NAME). -Used to traverse Smalltalk inheritance graph. 'br-build-children-htable' builds +Used to traverse Smalltalk inheritance graph. `br-build-children-htable' builds this list.") (defvar smt-parents-htable nil "Htable whose elements are of the form: (LIST-OF-PARENT-CLASSES . CLASS-NAME). -Used to traverse Smalltalk inheritance graph. 'br-build-parents-htable' builds +Used to traverse Smalltalk inheritance graph. `br-build-parents-htable' builds this list.") (defvar smt-paths-htable nil "Htable whose elements are of the form: (LIST-OF-CLASS-NAMES . FILE-PATH). FILE-PATH gives the location of classes found in LIST-OF-CLASS-NAMES. -'br-build-paths-htable' builds this list.") +`br-build-paths-htable' builds this list.") (defvar smt-lib-parents-htable nil @@ -186,9 +186,9 @@ list.") (defvar smt-lib-prev-search-dirs nil - "Used to check if 'smt-lib-classes-htable' must be regenerated.") + "Used to check if `smt-lib-classes-htable' must be regenerated.") (defvar smt-sys-prev-search-dirs nil - "Used to check if 'smt-sys-classes-htable' must be regenerated.") + "Used to check if `smt-sys-classes-htable' must be regenerated.") (defvar smt-env-spec nil "Non-nil value means Environment specification has been given but not yet built.
--- a/lisp/oobr/br-start.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-start.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 5-Sep-92 at 23:31:03 -;; LAST-MOD: 25-Oct-95 at 01:38:41 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 06:59:33 by Bob Weiner ;; -;; Copyright (C) 1992-19945 Free Software Foundation, Inc. +;; Copyright (C) 1992, 1993, 1994, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -44,7 +44,7 @@ (if (fboundp 'member) (fset 'br-member 'member) (defun br-member (elt list) - "Return non-nil if ELT is an element of LIST. Comparison done with 'equal'. + "Return non-nil if ELT is an element of LIST. Comparison done with `equal'. The value is actually the tail of LIST whose car is ELT." (while (and list (not (equal (car list) elt))) (setq list (cdr list)))
--- a/lisp/oobr/br-tree.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-tree.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: mouse, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 12-Oct-90 -;; LAST-MOD: 5-Jun-95 at 12:00:10 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 07:01:02 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -106,14 +106,14 @@ (format "(OO-Browser): Illegal command: %s" cmd))))) (defun br-tree-features-toggle () - "Toggle between showing and hiding features when 'br-tree' is invoked to display descendants graphically." + "Toggle between showing and hiding features when `br-tree' is invoked to display descendants graphically." (interactive) (setq br-show-features (not br-show-features)) (message "New graphical OO-Browsers will %sshow features." (if br-show-features "" "not "))) (defun br-tree-kill () - "Kill all current 'Tree' sub-processes." + "Kill all current `Tree' sub-processes." (interactive) (if (br-kill-process-group br-tree-name br-tree-num "Tree displays") @@ -224,7 +224,7 @@ (defun br-tree-build-features (c expand-subtree indent offset) "Each language under which this function is called must define its own -version of 'br-list-features' and 'br-feature-signature-to-name'." +version of `br-list-features' and `br-feature-signature-to-name'." (let ((features) (ch)) (and expand-subtree (setq features @@ -281,7 +281,7 @@ (br-tree-do-cmd br-lang-px br-env-nm br-cmd-nm br-node-nm)) (beep) - (message "'%s': invalid command from graphical browser" + (message "`%s': invalid command from graphical browser" br-cmd-str) (setq br-cmd-str nil)))))
--- a/lisp/oobr/br-vers.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br-vers.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,19 +1,19 @@ ;;!emacs ;; -;; LCD-ENTRY: oo-browser|Bob Weiner|oo-browser@hub.ucsb.edu|Multi-Language Object-oriented Browser|02-Nov-95|2.9.11|ftp.cs.uiuc.edu:/pub/xemacs/infodock/ +;; LCD-ENTRY: oo-browser|Bob Weiner|oo-browser@infodock.com|Multi-Language Object-oriented Browser|21-Feb-97|2.10|ftp://ftp.xemacs.org/pub/infodock ;; ;; FILE: br-vers.el -;; SUMMARY: OO-Browser revision number as 'br-version' variable. +;; SUMMARY: OO-Browser revision number as `br-version' variable. ;; USAGE: GNU Emacs Lisp Library ;; KEYWORDS: oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola, Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 16-Mar-95 at 12:31:05 -;; LAST-MOD: 2-Nov-95 at 05:54:53 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 17:07:53 by Bob Weiner ;; -;; Copyright (C) 1995, Free Software Foundation, Inc. +;; Copyright (C) 1995, 1997, Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -25,4 +25,5 @@ ;;; Public variables ;;; ************************************************************************ -(defconst br-version "02.09.12" "The OO-Browser revision number.") +(defconst br-version "02.10" "The OO-Browser revision number.") +
--- a/lisp/oobr/br.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/br.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: matching, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 12-Dec-89 -;; LAST-MOD: 21-Sep-95 at 12:39:17 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 16:45:11 by Bob Weiner ;; -;; Copyright (C) 1989-1995 Free Software Foundation, Inc. +;; Copyright (C) 1989-1996 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -61,8 +61,8 @@ "*Minimum width of a browser class list window. This together with the frame width determines the number of such windows.") -;; -f treats upper and lower case the same in sorting, also makes 'a' sort -;; list before '[a]', so default classes appear at the end of the list, +;; -f treats upper and lower case the same in sorting, also makes `a' sort +;; list before `[a]', so default classes appear at the end of the list, ;; typically. ;; -u leaves only unique elements in the sorted list (defvar br-sort-options "-fu" @@ -114,10 +114,10 @@ (if br-inhibit-version (br-top-classes t) (br-version) - (message "Press {h} for for help.") + (message "Press {h} for help; use {C-c #} to see version and credits again.") ;; Display all classes. (br-top-classes t) - (message "Press {h} for for help.") + (message "Press {h} for help; use {C-c #} to see version and credits again.") ;; Wait for 60 seconds or until a single key sequence is given. (sit-for 60) (message "")) @@ -132,7 +132,7 @@ current buffer file pathname. If optional LIB-TABLE-P is non-nil, add to Library Environment, otherwise add to System Environment. If optional SAVE-FILE is t, the Environment is then stored to the filename given by -'br-env-file'. If SAVE-FILE is non-nil and not t, its string value is used +`br-env-file'. If SAVE-FILE is non-nil and not t, its string value is used as the file to which to save the Environment." (interactive (list (read-file-name (concat "Class file name to add" @@ -191,10 +191,10 @@ (defun br-ancestors (&optional arg features-flag) "Display ancestor tree whose root is the current class. With optional prefix ARG, display all ancestor trees whose roots are in the -current listing. If ARG = -1 or 'br-invert-ancestors' is t, the current +current listing. If ARG = -1 or `br-invert-ancestors' is t, the current class ancestry tree is inverted. That is, it shows branches going down towards the root class, so that parents appear above children. If ARG < -1 or -'br-invert-ancestors' is t and ARG > 1, then the ancestry trees of all +`br-invert-ancestors' is t and ARG > 1, then the ancestry trees of all classes in the current listing are inverted. Optional second argument, FEATURES-FLAG non-nil means display features under @@ -288,7 +288,7 @@ (cons class class-and-categories))) class-list))) (cond ((not class-list) - (message "(OO-Browser): Apply 'br-categories' to a class.") (beep)) + (message "(OO-Browser): Apply `br-categories' to a class.") (beep)) ((not has-categories) (message "No class categories.") (beep)) (t @@ -332,7 +332,7 @@ (cons parent children))) class-list))) (cond ((not children-list) - (message "(OO-Browser): Apply 'br-children' to a class.") + (message "(OO-Browser): Apply `br-children' to a class.") (beep)) ((not has-children) (message "No children.") (beep)) @@ -469,7 +469,8 @@ (defun br-edit (&optional prompt class) "Edit a class in the viewer window. Select viewer window. With optional prefix arg PROMPT, prompt for class -name. Optional CLASS is the one to edit." +name. Optional CLASS is the one to edit. Return t if class is displayed or +sent to an external viewer, else nil." (interactive "P") (or br-editor-cmd (br-in-view-window-p) @@ -478,7 +479,7 @@ (defun br-edit-ext (editor-cmd file) "Invoke a non-standard EDITOR-CMD on FILE. -See also 'br-editor-cmd'." +See also `br-editor-cmd'." (interactive "fFile to edit: ") (or editor-cmd (setq editor-cmd br-editor-cmd)) (if (not (stringp editor-cmd)) ;; must be a Lisp function that takes a @@ -509,12 +510,12 @@ (let ((class-name (br-find-class-name))) (if class-name (progn - (message "Building '%s' class info..." class-name) - ; (sit-for 2) ; Why should we pause here? + (message "Building `%s' class info..." class-name) + (sit-for 2) (br-store-class-info class-name) - (message "Building '%s' class info...Done" class-name) + (message "Building `%s' class info...Done" class-name) (br-funcall-in-view-window - (concat br-buffer-prefix-info "Info") + (concat br-buffer-prefix-info "Info*") 'br-insert-class-info)) (error "Move point to a class name line."))) (beep) @@ -568,10 +569,10 @@ (defun br-features (arg) "Display features/elements of the current class (prefix ARG = 1) or of the current listing if ARG is other than 0 or 1. -With ARG = 0, the value of the variable, 'br-inherited-features-flag', is +With ARG = 0, the value of the variable, `br-inherited-features-flag', is toggled and no other action is taken. -If 'br-inherited-features-flag' is t, all features of each class are shown. +If `br-inherited-features-flag' is t, all features of each class are shown. If nil, only lexically included features are shown and if the features of a single class are requested and none are defined, the class definition is displayed so that its feature declarations may be browsed." @@ -596,7 +597,7 @@ (br-find-feature element) (br-find-class element)))) element - (error "(OO-Browser): '%s' definition not found." element))) + (error "(OO-Browser): `%s' definition not found." element))) (defun br-help (&optional file) "Display browser operation help information in viewer window." @@ -633,7 +634,7 @@ (list (br-find-feature-entry))))))) (if (or (null ftr-list) (null (car ftr-list))) (error - "(OO-Browser): 'br-implementors' must be applied to a feature.") + "(OO-Browser): `br-implementors' must be applied to a feature.") (message "Computing implementors...") (br-add-level-hist) (br-next-listing-window -1) @@ -706,7 +707,7 @@ class-list))) (cond ((not class-list) (beep) - (message "(OO-Browser): Apply 'br-features' to a class.")) + (message "(OO-Browser): Apply `br-features' to a class.")) ((not has-features) (if (and (= (length class-list) 1) (br-class-path (car class-list))) @@ -768,7 +769,7 @@ (if arg "Find Environment class string matches" "Find Environment class regular expression matches") - (if again " (RTN to end): " ": "))))) + (if again " (RET to end): " ": "))))) (if (and again (equal expr "")) nil (let* ((match-expr (if arg (regexp-quote expr) expr)) @@ -804,7 +805,7 @@ (if arg "Find string matches in listing" "Find regular expression matches in listing") - (if again " (RTN to end): " ": "))))) + (if again " (RET to end): " ": "))))) (if (and again (equal expr "")) nil (let* ((match-expr (if arg (regexp-quote expr) expr)) @@ -893,7 +894,7 @@ (cons class parents))) class-list))) (cond ((not parents-list) - (message "(OO-Browser): Apply 'br-parents' to a class.") (beep)) + (message "(OO-Browser): Apply `br-parents' to a class.") (beep)) ((not has-parents) (message "No parents.") (beep)) (t @@ -955,7 +956,7 @@ class-list))) (cond ((not class-list) (beep) - (message "(OO-Browser): Apply 'br-protocols' to a class.")) + (message "(OO-Browser): Apply `br-protocols' to a class.")) ((not has-protocols) (message "No class protocols.") (beep)) (t @@ -1005,7 +1006,7 @@ "Send a message to the OO-Browser discussion list." (interactive) (if (br-in-browser) (br-to-view-window)) - (hmail:compose "oo-browser@hub.ucsb.edu" '(hypb:configuration))) + (hmail:compose "oo-browser@infodock.com" '(hypb:configuration))) (defun br-sys-rebuild () "Rescan System components of the current Environment." @@ -1042,14 +1043,14 @@ (br-to-view-window))) (defun br-toggle-c-tags () - "Toggle the value of the 'br-c-tags-flag' flag." + "Toggle the value of the `br-c-tags-flag' flag." (interactive) (setq br-c-tags-flag (not br-c-tags-flag)) (message "C constructs will %sbe added to C-based language Environments." (if br-c-tags-flag "" "not "))) (defun br-toggle-keep-viewed () - "Toggle the value of the 'br-keep-viewed-classes' flag." + "Toggle the value of the `br-keep-viewed-classes' flag." (interactive) (setq br-keep-viewed-classes (not br-keep-viewed-classes)) (message "Viewed classes will no%s be kept after use." @@ -1094,15 +1095,15 @@ (defun br-version () "Display browser version number and credits." (interactive) - (br-file-to-viewer "BR-VERSION") (br-funcall-in-view-window - (concat br-buffer-prefix-info "Help") + (concat br-buffer-prefix-info "Help*") (function (lambda () + (insert-file-contents (br-pathname "BR-VERSION")) + (hypb:display-file-with-logo) (if (re-search-forward "<VERSION>" nil t) (replace-match br-version t t)) (center-line) - (set-buffer-modified-p nil))) - t)) + (set-buffer-modified-p nil))))) (defun br-view-entry (&optional prompt) "Displays source for any browser listing entry. @@ -1129,9 +1130,7 @@ "Displays class file in viewer window. Optional prefix arg PROMPT means prompt for class name. Non-nil WRITABLE means allow editing, otherwise display in read-only mode. Non-nil CLASS is class to -display. - -Return t if class is displayed or sent to an external viewer, else nil." +display. Return t if class is displayed or sent to an external viewer, else nil." (interactive "P") (or class (setq class (if prompt (br-complete-class-name) (br-find-class-name)))) @@ -1172,7 +1171,7 @@ (defun br-view-ext (viewer-cmd file) "Invoke a non-standard VIEWER-CMD on FILE. -See also 'br-viewer-cmd'." +See also `br-viewer-cmd'." (interactive "fFile to view: ") (or viewer-cmd (setq viewer-cmd br-viewer-cmd)) (if (not (stringp viewer-cmd)) ;; must be a Lisp function that takes a @@ -1356,7 +1355,7 @@ (equal 0 (string-match (concat br-buffer-prefix-inher "\\|" br-buffer-prefix-categ "\\|" br-buffer-prefix-blank - "\\|" br-buffer-prefix-info) + "\\|" (regexp-quote br-buffer-prefix-info)) (buffer-name buffer)))) (defun br-buffer-level () @@ -1502,7 +1501,7 @@ "Display FILENAME from OO-Browser source directory in browser viewer window. FILENAME should not contain any path information." (br-funcall-in-view-window - (concat br-buffer-prefix-info "Help") + (concat br-buffer-prefix-info "Help*") (function (lambda () (insert-file-contents (br-pathname filename)) (set-buffer-modified-p nil))))) @@ -1510,7 +1509,9 @@ (defun br-in-browser () "Return selected frame if the OO-Browser is active in it, else return nil." (cond ((not (eq br-in-browser (selected-frame))) nil) - ((one-window-p 'nomini) + ((or (one-window-p 'nomini) + (and (fboundp 'window-list) + (< (length (window-list)) 3))) (setq br-in-browser nil)) (t br-in-browser))) @@ -1580,14 +1581,14 @@ ((br-find-class-name) (narrow-to-region (match-beginning 0) (match-end 0))) (t (error - "(OO-Browser): 'br-narrow-to-class', current entry is not a class")))) + "(OO-Browser): `br-narrow-to-class', current entry is not a class")))) (defun br-narrow-to-feature () "Narrow buffer to current feature entry." (if (br-feature-at-p) (narrow-to-region (match-beginning 0) (match-end 0)) (error - "(OO-Browser): 'br-narrow-to-feature' no current feature."))) + "(OO-Browser): `br-narrow-to-feature' no current feature."))) (defun br-feature-at-p () "Returns t iff point is on a feature listing line." @@ -1631,7 +1632,7 @@ "Return full pathname for FILENAME in browser Elisp directory." (if br-directory (expand-file-name filename br-directory) - (error "The 'br-directory' variable must be set to a string value."))) + (error "The `br-directory' variable must be set to a string value."))) (defun br-protocol-entry-p () "Return non-nil if point is within a protocol listing entry line." @@ -1888,13 +1889,13 @@ "List of directories below which OO source files and other library directories are found. A library is a stable group of OO classes. Do not set this variable directly. Each OO language library which invokes -'br-browse' should set it.") +`br-browse' should set it.") (defvar br-sys-search-dirs nil "List of directories below which OO source files and other system directories are found. A system is a group of OO classes that are likely to change. Do not set this variable directly. Each OO language library which -invokes 'br-browse' should set it.") +invokes `br-browse' should set it.") (defvar *br-level-hist* nil "Internal history of visited listing windows and buffers.") @@ -1912,7 +1913,7 @@ (defconst br-buffer-prefix-categ "Categ-Lvl-") (defconst br-buffer-prefix-inher "Inher-Lvl-") (defconst br-buffer-prefix-blank "Blank-") -(defconst br-buffer-prefix-info "OO-Browser ") +(defconst br-buffer-prefix-info "*OO-Browser ") (defvar br-buffer-prefix br-buffer-prefix-inher "Browser buffer name prefix.") @@ -1935,21 +1936,21 @@ (define-key br-mode-map "\C-c\C-c" 'br-env-create) (define-key br-mode-map "d" 'br-descendants) (define-key br-mode-map "\C-c\C-d" 'br-delete) - ;; {M-d} is used down below for 'br-tree' + ;; {M-d} is used down below for `br-tree' (define-key br-mode-map "e" 'br-edit-entry) (define-key br-mode-map "\M-e" 'br-env-stats) (define-key br-mode-map "\C-c\C-e" 'br-env-rebuild) (define-key br-mode-map "f" 'br-features) (define-key br-mode-map "F" 'br-feature-signature) - ;; {M-f} is used down below for 'br-tree-features-toggle' - ;; {M-g} is used down below for 'br-tree-graph' + ;; {M-f} is used down below for `br-tree-features-toggle' + ;; {M-g} is used down below for `br-tree-graph' (define-key br-mode-map "?" 'br-help) (define-key br-mode-map "h" 'br-help) (define-key br-mode-map "H" 'br-help-ms) ;; mouse help (define-key br-mode-map "i" 'br-entry-info) (define-key br-mode-map "I" 'br-implementors) (define-key br-mode-map "\C-c\C-k" 'br-kill) - ;; {M-k} is used down below for 'br-tree-kill' + ;; {M-k} is used down below for `br-tree-kill' (define-key br-mode-map "l" 'br-lib-top-classes) (define-key br-mode-map "L" 'br-lib-rebuild) (define-key br-mode-map "\C-c\C-l" 'br-env-load) @@ -1996,6 +1997,6 @@ (defvar br-tmp-class-set nil "Set of classes created for temporary use by br-*-trees functions.") (defvar br-tmp-depth 0 - "Temporary variable indicating inheritance depth of class in 'br-ancestor-trees'.") + "Temporary variable indicating inheritance depth of class in `br-ancestor-trees'.") (provide 'br)
--- a/lisp/oobr/c++-browse.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/c++-browse.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,19 +6,19 @@ ;; KEYWORDS: c, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 12-Dec-89 -;; LAST-MOD: 20-Sep-95 at 14:18:40 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 16:14:24 by Bob Weiner ;; -;; Copyright (C) 1989-1995 Free Software Foundation, Inc. +;; Copyright (C) 1989-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. ;; ;; DESCRIPTION: ;; -;; Use 'c++-browse' to invoke the C++ OO-Browser. Prefix arg prompts for +;; Use `c++-browse' to invoke the C++ OO-Browser. Prefix arg prompts for ;; name of Environment file. ;; ;; DESCRIP-END. @@ -85,7 +85,7 @@ (fset 'c++-class-list-filter 'identity) (defun c++-mode-setup () - "Load best available C++ major mode and set 'br-lang-mode' to the function that invokes it." + "Load best available C++ major mode and set `br-lang-mode' to the function that invokes it." (fset 'br-lang-mode (cond ((or (featurep 'cc-mode) (featurep 'c++-mode)) 'c++-mode)
--- a/lisp/oobr/clos-brows.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/clos-brows.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: lisp, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 29-Jul-90 -;; LAST-MOD: 20-Sep-95 at 14:21:17 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 17:23:09 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser.
--- a/lisp/oobr/eif-browse.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/eif-browse.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 12-Dec-89 -;; LAST-MOD: 20-Sep-95 at 14:24:36 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 17:23:21 by Bob Weiner ;; -;; Copyright (C) 1989-1995 Free Software Foundation, Inc. +;; Copyright (C) 1989-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser.
--- a/lisp/oobr/eif-calls.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/eif-calls.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 7-Dec-89 at 19:32:47 -;; LAST-MOD: 30-Aug-95 at 15:22:33 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 17:23:33 by Bob Weiner ;; -;; Copyright (C) 1989-1995 Free Software Foundation, Inc. +;; Copyright (C) 1989-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser.
--- a/lisp/oobr/eif-ise-er.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/eif-ise-er.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 7-Dec-89 at 00:17:18 -;; LAST-MOD: 17-Apr-95 at 12:39:18 by Bob Weiner +;; LAST-MOD: 31-Oct-96 at 22:39:09 by Bob Weiner ;; -;; Copyright (C) 1989-1995 Free Software Foundation, Inc. +;; Copyright (C) 1989-1996 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -42,7 +42,7 @@ ;; ;; To reset the {C-x `} key to parse non-Eiffel error messages, use: ;; -;; {M-x load-lib RTN compile RTN} +;; {M-x load-lib RET compile RET} ;; ;; DESCRIP-END. @@ -140,7 +140,7 @@ (message "Rebuilding Eiffel system class locations table...Done") (setq filename (br-class-path class-name)) (if (null filename) - (error (format "'%s' not in lookup table, use {M-x br-build-paths-htable RTN} to update." + (error (format "'%s' not in lookup table, use {M-x br-build-paths-htable RET} to update." class-name))))) ;; Locate the erring file and line. (if (and (equal filename last-filename)
--- a/lisp/oobr/hash-test.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/hash-test.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: extensions, maint, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 16-Mar-90 at 03:38:48 -;; LAST-MOD: 14-Apr-95 at 15:37:49 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 07:04:19 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -76,7 +76,7 @@ ; => ("b1" "b2") (hash-make -3) -; => (error ("(hash-make): Initializer must be >= 0, not '-3'")) +; => (error ("(hash-make): Initializer must be >= 0, not `-3'")) (hash-replace '("e11" "e22") "e" hs3) ; => ("e11" "e22")
--- a/lisp/oobr/hasht.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/hasht.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: extensions, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 16-Mar-90 at 03:38:48 -;; LAST-MOD: 27-Sep-95 at 21:31:20 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 07:04:56 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -20,11 +20,11 @@ ;; ;; Featureful set of hash table operators for use in personal programs. ;; -;; 'hash-make' creates a hash table from an association list, 'hash-add' -;; adds a value-key pair to a hash table, and 'hash-lookup' finds the value +;; `hash-make' creates a hash table from an association list, `hash-add' +;; adds a value-key pair to a hash table, and `hash-lookup' finds the value ;; associated with a given key in a hash table, if any. ;; -;; 'hash-map' does the same thing as 'mapcar' but operates on hash tables +;; `hash-map' does the same thing as `mapcar' but operates on hash tables ;; instead. ;; ;; For a list of 300 items, these hash tables improve lookup times by a @@ -57,7 +57,7 @@ (defun hash-copy (hash-table) "Return a copy of HASH-TABLE, list and vector elements are shared across both tables." (if (not (hashp hash-table)) - (error "(hash-copy): Invalid hash-table: '%s'" hash-table)) + (error "(hash-copy): Invalid hash-table: `%s'" hash-table)) (let ((htable-copy (hash-make (length (hash-obarray hash-table))))) (hash-map (function (lambda (elt) (hash-add (car elt) (cdr elt) htable-copy))) @@ -102,7 +102,7 @@ (vconcat (mapcar 'hash-deep-copy obj))) ((atom obj) obj) ((nlistp obj) - (error "(hash-deep-copy): Invalid type, '%s'" obj)) + (error "(hash-deep-copy): Invalid type, `%s'" obj)) (t ;; list (cons (hash-deep-copy (car obj)) (hash-deep-copy (cdr obj)))))) @@ -117,7 +117,7 @@ (defun hash-lookup (key hash-table) "Lookup KEY in HASH-TABLE and return associated value. If value is nil, this function does not tell you whether or not KEY is in the -hash table. Use 'hash-key-p' instead for that function." +hash table. Use `hash-key-p' instead for that function." (if (hashp hash-table) (let* ((obarray (hash-obarray hash-table)) (sym (intern-soft key obarray))) @@ -133,7 +133,7 @@ (if (integerp initializer) (if (>= initializer 0) (cons 'hasht (make-vector (hash-next-prime initializer) 0)) - (error "(hash-make): Initializer must be >= 0, not '%s'" + (error "(hash-make): Initializer must be >= 0, not `%s'" initializer)) (let* ((vlen (hash-next-prime (length initializer))) (obarray (make-vector vlen 0)) @@ -154,7 +154,7 @@ (defun hash-map (func hash-table) "Return result of application of FUNC to each (<value> . <key>) element of HASH-TABLE." (if (not (hashp hash-table)) - (error "(hash-map): Invalid hash-table: '%s'" hash-table)) + (error "(hash-map): Invalid hash-table: `%s'" hash-table)) (let ((result)) (mapatoms (function (lambda (sym) @@ -232,7 +232,7 @@ (make-obsolete 'hash-new 'hash-make) (defun hash-new (size) "Return a new hash table of SIZE elements. -This is obsolete. Use 'hash-make' instead." +This is obsolete. Use `hash-make' instead." (hash-make size)) (defun hash-prin1 (hash-table &optional stream) @@ -259,12 +259,12 @@ (sym (intern-soft key obarray))) (if (and (boundp sym) sym) (set sym value) - (error "(hash-replace): '%s' key not found in hash table." key))))) + (error "(hash-replace): `%s' key not found in hash table." key))))) (defun hash-resize (hash-table new-size) "Resize HASH-TABLE to NEW-SIZE without losing any elements and return new table. NEW-SIZE must be greater than 0. Hashing works best if NEW-SIZE is a prime -number. See also 'hash-next-prime'." +number. See also `hash-next-prime'." (if (< new-size 1) (error "(hash-resize): Cannot resize hash table to size %d" new-size)) (let ((htable (hash-make new-size)))
--- a/lisp/oobr/hmouse-br.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/hmouse-br.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: mouse, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: Sep-04-90 -;; LAST-MOD: 1-Nov-95 at 20:32:56 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 07:05:21 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser.
--- a/lisp/oobr/info-brows.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/info-brows.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,19 +6,19 @@ ;; KEYWORDS: docs, help, hypermedia ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 7-Dec-89 -;; LAST-MOD: 20-Sep-95 at 14:33:33 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 07:05:47 by Bob Weiner ;; -;; Copyright (C) 1989-1995 Free Software Foundation, Inc. +;; Copyright (C) 1989-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. ;; ;; DESCRIPTION: ;; -;; Use 'info-browse' to invoke the Info OO-Browser. Prefix arg prompts for +;; Use `info-browse' to invoke the Info OO-Browser. Prefix arg prompts for ;; name of Environment file. ;; ;; DESCRIP-END.
--- a/lisp/oobr/java-brows.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/java-brows.el Mon Aug 13 09:15:11 2007 +0200 @@ -3,15 +3,15 @@ ;; FILE: java-brows.el ;; SUMMARY: Java source code browser. ;; USAGE: GNU Emacs Lisp Library -;; KEYWORDS: java, oop, tools +;; KEYWORDS: c, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 01-Aug-95 -;; LAST-MOD: 20-Sep-95 at 14:18:44 by Bob Weiner +;; LAST-MOD: 12-Nov-96 at 15:20:24 by Bob Weiner ;; -;; Copyright (C) 1995 Free Software Foundation, Inc. +;; Copyright (C) 1995, 1996 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. @@ -87,14 +87,18 @@ (defun java-mode-setup () "Load best available java major mode and set 'br-lang-mode' to the function that invokes it." (fset 'br-lang-mode - (cond ((or (featurep 'java-mode) - (load "java-mode" 'missing-ok 'nomessage)) + (cond ((and (or (fboundp 'java-mode) + (featurep 'cc-mode) + (load "cc-mode" 'missing-ok 'nomessage)) + (fboundp 'java-mode)) 'java-mode) - ((featurep 'cc-mode) + ((load "java-mode" 'missing-ok 'nomessage) + 'java-mode) + ((fboundp 'c++-mode) + (provide 'c++-mode) 'c++-mode) - ((load "cc-mode" 'missing-ok 'nomessage) - (provide 'c++-mode)) - (t (error "(java-mode-setup): Can't load major mode for Java code."))))) + (t (error + "(java-mode-setup): Can't load major mode for Java code."))))) ;;; ************************************************************************ ;;; Internal functions
--- a/lisp/oobr/objc-brows.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/objc-brows.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,12 +6,12 @@ ;; KEYWORDS: c, oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 12-Dec-89 -;; LAST-MOD: 20-Sep-95 at 14:31:42 by Bob Weiner +;; LAST-MOD: 21-Feb-97 at 17:23:48 by Bob Weiner ;; -;; Copyright (C) 1989-1995 Free Software Foundation, Inc. +;; Copyright (C) 1989-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser.
--- a/lisp/oobr/smt-browse.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/smt-browse.el Mon Aug 13 09:15:11 2007 +0200 @@ -6,19 +6,19 @@ ;; KEYWORDS: oop, tools ;; ;; AUTHOR: Bob Weiner -;; ORG: Motorola Inc. +;; ORG: InfoDock Associates ;; ;; ORIG-DATE: 26-Jul-90 -;; LAST-MOD: 20-Sep-95 at 14:29:43 by Bob Weiner +;; LAST-MOD: 20-Feb-97 at 07:06:19 by Bob Weiner ;; -;; Copyright (C) 1990-1995 Free Software Foundation, Inc. +;; Copyright (C) 1990-1995, 1997 Free Software Foundation, Inc. ;; See the file BR-COPY for license information. ;; ;; This file is part of the OO-Browser. ;; ;; DESCRIPTION: ;; -;; Use 'smt-browse' to invoke the Smalltalk OO-Browser. Prefix arg +;; Use `smt-browse' to invoke the Smalltalk OO-Browser. Prefix arg ;; prompts for name of Environment file. ;; ;; DESCRIP-END.
--- a/lisp/oobr/tree-x/Makefile Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/tree-x/Makefile Mon Aug 13 09:15:11 2007 +0200 @@ -1,46 +1,62 @@ # -# SUMMARY: What's new in this version of the OO-Browser? +# SUMMARY: Makefile for the OO-Browser # # AUTHOR: Bob Weiner / Mark Stern +# ORG: InfoDock Associates / Brown U. # # ORIG-DATE: 15-Oct-90 -# LAST-MOD: 14-Sep-95 at 10:20:41 by Bob Weiner +# LAST-MOD: 19-Oct-96 at 00:53:29 by Bob Weiner # -# Copyright (C) 1990-1995 Free Software Foundation, Inc. +# Copyright (C) 1990-1996 Free Software Foundation, Inc. # See the file BR-COPY for license information. # # This file is part of the OO-Browser. -# Use -DHAVE_USLEEP if usleep() is a valid system call. Otherwise, comment -# out this line or set its value to be empty, in which case the definition in -# "usleep.c" will be used.. +# If the usleep () system call exists on your system, uncomment the following line. DEFINES = -DHAVE_USLEEP -# Use the line below instead under Solaris. -# DEFINES = -DSYSV # Root directory of your X distribution. Note how this is used in succeeding # variables. -XROOT = /usr/moto/X11R5 +XROOT = /usr/X11 LD_LIBRARY_PATH = $(XROOT)/lib INCLUDEDIRS = -I$(XROOT)/include LIBDIRS = -L$(XROOT)/lib +# Use this for the standard Athena widgets. +XAW = -lXaw +# Use this instead for the 3D Athena widget library. +XAW3D = -lXaw3d +# Set this to one of the 2 above variable names. +DEFXAW = XAW +# Set this to one of the 2 above variable values. +LIBXAW = $(XAW) + # C compiler CC = gcc # Compiler flags -CFLAGS = -g -O $(INCLUDEDIRS) $(DEFINES) +CFLAGS = -g -O $(INCLUDEDIRS) $(DEFINES) -D$(DEFXAW) + +# Set XVERSION to the proper relase of X11 for your system. +# Use X11R5 if you system is not on X11R6 or above. +X11R5 = +X11R6 = -lSM -lICE +XVERSION = $(X11R6) -# Linker flags. Remove the -static for dynamic linking, e.g. under Linux. -# LDFLAGS = -static $(LIBDIRS) -lXaw -lXmu -lXt -lX11 -lXext -# Use the line below instead under Solaris. -# LDFLAGS = $(LIBDIRS) -lXaw -lXmu -lXt -lX11 -lXext -lsocket -LDFLAGS = $(LIBDIRS) -lXaw -lXmu -lXt -lX11 -lXext +# X11 libraries used by all system configurations. +XCOMMON = -lXmu -lXt -lX11 -lXext + +# This is used for static linking on a generic platform such as SunOS 4. +LD_STATIC = -static $(LIBDIRS) $(LIBXAW) $(XCOMMON) $(XVERSION) +# This is used for dynamic linking under Solaris. +LD_SOLARIS = $(LIBDIRS) $(LIBXAW) $(XCOMMON) -lsocket $(XVERSION) +# This is used for dynamic linking under Linux. +LD_LINUX = $(LIBDIRS) $(LIBXAW) $(XCOMMON) $(XVERSION) # Set this to be the directory in which to install the X OO-Browser # executable. This should be a directory in all users' search paths or the # value of the Emacs variable, exec-directory. # Use 'make install' to install the binary. -BINDIR = /usr/local/infodock/bin +BINDIR = /home/infodock/lib-bin-linux-elf NAME = xoobr C_FILES = draw.c tree.c input.c dissolve.c dbl.c intf.c usleep.c @@ -48,8 +64,17 @@ INC_FILES = defs.h tree.h input.h dissolve.h dbl.h rsrc.h intf.h help.h SRC_FILES = $(INC_FILES) $(C_FILES) -$(NAME): $(O_FILES) - $(CC) $(CFLAGS) -o $(NAME) $(O_FILES) $(LDFLAGS) +$(NAME): linux + +static: $(O_FILES) + $(CC) $(CFLAGS) -o $(NAME) $(O_FILES) $(LD_STATIC) + +solaris: $(O_FILES) + $(CC) $(CFLAGS) -DSYSV -o $(NAME) $(O_FILES) $(LD_SOLARIS) + +linux: $(O_FILES) + $(CC) $(CFLAGS) -o $(NAME) $(O_FILES) $(LD_LINUX) + install: $(NAME) chmod 755 $(NAME)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/oobr/tree-x/OOBR Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,48 @@ + +(setq +br-env-version +"02.09.11" + +br-sys-search-dirs +'(".") + +br-lib-search-dirs +'nil + +br-lang-prefix +'"c++-" + +br-env-spec +'nil + +br-children-alist +'( +) + +br-sys-paths-alist +'( +(("line" "tnode") . "/home/infodock/lisp/oobr/tree-x/tree.h") +(("[constant]" "[enumeration]" "[function]" "[macro]" "[structure]" "[type]" "[union]") . "<none>") +) + +br-lib-paths-alist +'( +) + +br-sys-parents-alist +'( +(nil . "[union]") +(nil . "[type]") +(nil . "[structure]") +(nil . "[macro]") +(nil . "[function]") +(nil . "[enumeration]") +(nil . "[constant]") +(nil . "line") +(nil . "tnode") +) + +br-lib-parents-alist +'( +) +)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/oobr/tree-x/OOBR-FTR Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,25 @@ + +/home/infodock/lisp/oobr/tree-x/draw.c +[function]@- BeginFrame@void BeginFrame() { +[function]@- EndFrame@void EndFrame() { + +/home/infodock/lisp/oobr/tree-x/intf.c +[function]@- Pause@void Pause() { +[function]@- UserEventLoop@void UserEventLoop() { + +/home/infodock/lisp/oobr/tree-x/tree.c +[function]@- MakeNode@Tree* MakeNode() { + +/home/infodock/lisp/oobr/tree-x/usleep.c +[function]@- usleep@int usleep( unsigned long int microSeconds ) { + +/home/infodock/lisp/oobr/tree-x/intf.c +#defi@- GLOBALS@#define GLOBALS +#defi@- gray_width@#define gray_width +#defi@- gray_height@#define gray_height +#defi@- check_width@#define check_width +#defi@- check_height@#define check_height +#defi@- slider_pixmap_width@#define slider_pixmap_width +#defi@- slider_pixmap_height@#define slider_pixmap_height +#defi@- shell_tra@#define shell_translations +
--- a/lisp/oobr/tree-x/README Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/tree-x/README Mon Aug 13 09:15:11 2007 +0200 @@ -5,6 +5,6 @@ Bob Weiner adapted the program for use as the X OO-Browser. He and Torgeir Veimo maintain the current version. -Send comments and issues to the mail list, <oo-browser@hub.ucsb.edu>. +Send comments and issues to the mail list, <oo-browser@infodock.com>. The program is freely redistributable.
--- a/lisp/oobr/tree-x/intf.c Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/tree-x/intf.c Mon Aug 13 09:15:11 2007 +0200 @@ -10,27 +10,47 @@ #include <string.h> #include <fcntl.h> -#include "X11/IntrinsicP.h" +#include <X11/IntrinsicP.h> #include <X11/ShellP.h> #include <X11/Intrinsic.h> #include <X11/StringDefs.h> -#include <X11/Xaw/Box.h> -#include <X11/Xaw/Simple.h> -#include <X11/Xaw/MenuButton.h> -#include <X11/Xaw/SimpleMenu.h> -#include <X11/Xaw/SmeBSB.h> -#include <X11/Xaw/SmeLine.h> -#include <X11/Xaw/Form.h> -#include <X11/Xaw/Label.h> -#include <X11/Xaw/Dialog.h> -#include <X11/Xaw/AsciiText.h> -#include <X11/Xaw/AsciiSrc.h> -#include <X11/Xaw/Viewport.h> -#include <X11/Xaw/Scrollbar.h> -#include <X11/Xaw/Paned.h> -#include <X11/Xaw/Panner.h> -#include <X11/Xaw/Reports.h> + +#ifdef XAW3D + #include <X11/Xaw3d/Box.h> + #include <X11/Xaw3d/Simple.h> + #include <X11/Xaw3d/MenuButton.h> + #include <X11/Xaw3d/SimpleMenu.h> + #include <X11/Xaw3d/SmeBSB.h> + #include <X11/Xaw3d/SmeLine.h> + #include <X11/Xaw3d/Form.h> + #include <X11/Xaw3d/Label.h> + #include <X11/Xaw3d/Dialog.h> + #include <X11/Xaw3d/AsciiText.h> + #include <X11/Xaw3d/AsciiSrc.h> + #include <X11/Xaw3d/Viewport.h> + #include <X11/Xaw3d/Scrollbar.h> + #include <X11/Xaw3d/Paned.h> + #include <X11/Xaw3d/Panner.h> + #include <X11/Xaw3d/Reports.h> +#else + #include <X11/Xaw/Box.h> + #include <X11/Xaw/Simple.h> + #include <X11/Xaw/MenuButton.h> + #include <X11/Xaw/SimpleMenu.h> + #include <X11/Xaw/SmeBSB.h> + #include <X11/Xaw/SmeLine.h> + #include <X11/Xaw/Form.h> + #include <X11/Xaw/Label.h> + #include <X11/Xaw/Dialog.h> + #include <X11/Xaw/AsciiText.h> + #include <X11/Xaw/AsciiSrc.h> + #include <X11/Xaw/Viewport.h> + #include <X11/Xaw/Scrollbar.h> + #include <X11/Xaw/Paned.h> + #include <X11/Xaw/Panner.h> + #include <X11/Xaw/Reports.h> + #endif #include "defs.h" #include "tree.h" @@ -1166,7 +1186,7 @@ TreeDrawingAreaDB = DBLcreate_double_buffer(TreeDisplay, - XtWindow(TreeDrawingArea), FALSE, + XtWindow(TreeDrawingArea), TRUE, colors, NUM_COLORS); ASSERT(TreeDrawingAreaDB, "could not create double buffer");
--- a/lisp/oobr/tree-x/rsrc.h Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/oobr/tree-x/rsrc.h Mon Aug 13 09:15:11 2007 +0200 @@ -16,10 +16,10 @@ #define TrDefaultBackgroundColor "white" #define TrDefaultTreeColor "black" -#define TrDefaultContourColor "MediumSlateBlue" -#define TrDefaultSplitColor "goldenrod" -#define TrDefaultHighlightColor "OrangeRed" -#define TrDefaultActionColor "OrangeRed" +#define TrDefaultContourColor "Blue" +#define TrDefaultSplitColor "brown" +#define TrDefaultHighlightColor "red" +#define TrDefaultActionColor "red" #define TrDefaultContourWidth 2 typedef struct {
--- a/lisp/packages/auto-save.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/packages/auto-save.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,96 +1,101 @@ -;;; auto-save.el --- safer auto saving with support for ange-ftp and /tmp - -(defconst auto-save-version "cvs ate me") - -;;;; Copyright (C) 1992, 1993, 1994 by Sebastian Kremer <sk@thp.uni-koeln.de> -;;;; Modified by jwz +;; -*- Emacs-Lisp -*- +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; File: auto-save.el +;; Version: $Revision: 1.2 $ +;; RCS: +;; Description: Safer autosaving with support for efs and /tmp. +;; This version of auto-save is designed to work with efs, +;; instead of ange-ftp. +;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>, +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; This file is part of XEmacs. - -;; XEmacs is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. +(defconst auto-save-version (substring "$Revision: 1.2 $" 11 -2) + "Version number of auto-save.") -;; XEmacs is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. +;;; Copyright (C) 1992 by Sebastian Kremer <sk@thp.uni-koeln.de> + +;;; This program is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 1, or (at your option) +;;; any later version. -;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. -;;; Synched up with: Not in FSF. - -;;;; LISPDIR ENTRY for the Elisp Archive =============================== -;;;; LCD Archive Entry: -;;;; auto-save|Sebastian Kremer|sk@thp.uni-koeln.de -;;;; |safer auto saving with support for ange-ftp and /tmp +;;; You should have received a copy of the GNU General Public License +;;; along with this program; if not, write to the Free Software +;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ;;;; OVERVIEW ========================================================== -;;;; Combines autosaving for ange-ftp (to a local or remote directory) -;;;; with the ability to do autosaves to a fixed directory on a local -;;;; disk, in case NFS is slow. The auto-save file used for -;;;; /usr/foo/bar/baz.txt -;;;; will be -;;;; AUTOSAVE/#\!usr\!foo\!bar\!baz.txt# -;;;; assuming AUTOSAVE is the non-nil value of the variable -;;;; `auto-save-directory'. +;;; Combines autosaving for efs (to a local or remote directory) +;;; with the ability to do autosaves to a fixed directory on a local +;;; disk, in case NFS is slow. The auto-save file used for +;;; /usr/foo/bar/baz.txt +;;; will be +;;; AUTOSAVE/#\!usr\!foo\!bar\!baz.txt# +;;; assuming AUTOSAVE is the non-nil value of the variable +;;; `auto-save-directory'. -;;;; Takes care that autosave files for non-file-buffers (e.g. *mail*) -;;;; from two simultaneous Emacses don't collide. +;;; Takes care that autosave files for non-file-buffers (e.g. *mail*) +;;; from two simultaneous Emacses don't collide. -;;;; Autosaves even if the current directory is not writable. +;;; Autosaves even if the current directory is not writable. -;;;; Can limit autosave names to 14 characters using a hash function, -;;;; see `auto-save-hash-p'. +;;; Can limit autosave names to 14 characters using a hash function, +;;; see `auto-save-hash-p'. -;;;; See `auto-save-directory' and `make-auto-save-file-name' and -;;;; references therein for complete documentation. +;;; See `auto-save-directory' and `make-auto-save-file-name' and +;;; references therein for complete documentation. -;;;; Meta-x recover-all-files will effectively do recover-file on all -;;;; files whose autosave file is newer (one of the benefits of having -;;;; all autosave files in the same place). +;;; Meta-x recover-all-files will effectively do recover-file on all +;;; files whose autosave file is newer (one of the benefits of having +;;; all autosave files in the same place). ;;;; INSTALLATION ====================================================== -;;;; Put this file into your load-path and the following in your ~/.emacs: +;;; Put this file into your load-path and the following in your ~/.emacs: -;;;; If you want to autosave in the fixed directory /tmp/USER-autosave/ -;;;; (setq auto-save-directory -;;;; (concat "/tmp/" (user-login-name) "-autosave/")) +;;; If you want to autosave in the fixed directory /tmp/USER-autosave/ +;;; (setq auto-save-directory +;;; (concat "/tmp/" (user-login-name) "-autosave/")) -;;;; If you don't want to save in /tmp (e.g., because it is swap -;;;; mounted) but rather in ~/autosave/ -;;;; (setq auto-save-directory (expand-file-name "~/autosave/")) +;;; If you don't want to save in /tmp (e.g., because it is swap +;;; mounted) but rather in ~/autosave/ +;;; (setq auto-save-directory (expand-file-name "~/autosave/")) -;;;; If you want to save each file in its own directory (the default) -;;;; (setq auto-save-directory nil) -;;;; You still can take advantage of autosaving ange-ftp remote files -;;;; in a fixed local directory, `auto-save-directory-fallback' will -;;;; be used. +;;; If you want to save each file in its own directory (the default) +;;; (setq auto-save-directory nil) +;;; You still can take advantage of autosaving efs remote files +;;; in a fixed local directory, `auto-save-directory-fallback' will +;;; be used. -;;;; If you want to use 14 character hashed autosave filenames -;;;; (setq auto-save-hash-p t) +;;; If you want to use 14 character hashed autosave filenames +;;; (setq auto-save-hash-p t) -;;;; Finally, put this line after the others in your ~/.emacs: -;;;; (require 'auto-save) +;;; Finally, put this line after the others in your ~/.emacs: +;;; (require 'auto-save) ;;;; ACKNOWLEDGEMENT =================================================== -;;;; This code is loosely derived from autosave-in-tmp.el by Jamie -;;;; Zawinski <jwz@lucid.com> (the version I had was last modified 22 -;;;; dec 90 jwz) and code submitted to ange-ftp-lovers on Sun, 5 Apr -;;;; 92 23:20:47 EDT by drw@BOURBAKI.MIT.EDU (Dale R. Worley). -;;;; auto-save.el tries to cover the functionality of those two -;;;; packages. +;;; This code is loosely derived from autosave-in-tmp.el by Jamie +;;; Zawinski <jwz@lucid.com> (the version I had was last modified 22 +;;; dec 90 jwz) and code submitted to ange-ftp-lovers on Sun, 5 Apr +;;; 92 23:20:47 EDT by drw@BOURBAKI.MIT.EDU (Dale R. Worley). +;;; auto-save.el tries to cover the functionality of those two +;;; packages. -;;;; Valuable comments and help from Dale Worley, Andy Norman, Jamie -;;;; Zawinski and Sandy Rutherford are gratefully acknowledged. +;;; Valuable comments and help from Dale Worley, Andy Norman, Jamie +;;; Zawinski and Sandy Rutherford are gratefully acknowledged. + +;;;; PROVISION ======================================================== + +(provide 'auto-save) ;;;; CUSTOMIZATION ===================================================== @@ -119,8 +124,8 @@ and thus vanishes after a reboot, or if your system is particularly thorough when cleaning up /tmp, clearing even non-empty subdirectories. -It should never be an ange-ftp remote filename because that would -defeat `ange-ftp-auto-save-remotely'. +It should never be an efs remote filename because that would +defeat `efs-auto-save-remotely'. Unless you set `auto-save-hash-p', you shouldn't set this to a directory in a filesystem that does not support long filenames, since @@ -134,8 +139,8 @@ as auto save file. -See also variables `auto-save-directory-fallback', `auto-save-hash-p', -`ange-ftp-auto-save' and `ange-ftp-auto-save-remotely'.") +See also variables `auto-save-directory-fallback', +`efs-auto-save' and `efs-auto-save-remotely'.") (defvar auto-save-hash-p nil "If non-nil, hashed autosave names of length 14 are used. @@ -145,26 +150,15 @@ Hashing defeats `recover-all-files', you have to recover files individually by doing `recover-file'.") -;;; This defvar is in ange-ftp.el now, but for older versions it -;;; doesn't hurt to give it here as well so that loading auto-save.el -;;; does not abort. -(defvar ange-ftp-auto-save 0 - "If 1, allows ange-ftp files to be auto-saved. -If 0, suppresses auto-saving of ange-ftp files. -Don't use any other value.") +;;; This defvar is in efs.el now, but doesn't hurt to give it here as +;;; well so that loading first auto-save.el does not abort. +(or (boundp 'efs-auto-save) (defvar efs-auto-save 0)) +(or (boundp 'efs-auto-save-remotely) (defvar efs-auto-save-remotely nil)) -(defvar ange-ftp-auto-save-remotely nil - "*If non-nil, causes the auto-save file for an ange-ftp file to be written in -the remote directory containing the file, rather than in a local directory. - -For remote files, this being true overrides a non-nil -`auto-save-directory'. Local files are unaffected. - -If you want to use this feature, you probably only want to set this -true in a few buffers, rather than globally. You might want to give -each buffer its own value using `make-variable-buffer-local'. - -See also variable `ange-ftp-auto-save'.") +(defvar auto-save-offer-delete nil + "*If non-nil, `recover-all-files' offers to delete autosave files +that are out of date or were dismissed for recovering. +Special value 'always deletes those files silently.") ;;;; end of customization @@ -174,7 +168,7 @@ (defvar auto-save-directory-fallback (expand-file-name "~/autosave/") ;; not user-variable-p, see above "Directory used for local autosaving of remote files if -both `auto-save-directory' and `ange-ftp-auto-save-remotely' are nil. +both `auto-save-directory' and `efs-auto-save-remotely' are nil. Also used if a working directory to be used for autosaving is not writable. This *must* always be the name of directory that exists or can be created by you, never nil.") @@ -198,10 +192,6 @@ (if (fboundp 'make-directory) ; V19 or tree dired (make-directory dir) (call-process "mkdir" nil nil nil dir)) - ;; This is 1300, aka "d-wx-----T" - ;; The sticky bit means that you can only delete your own files, - ;; even if you have write permission in the directory (which is - ;; moot, since the directory is only writable by owner.) (set-file-modes dir (* 7 8 8)))))) (mapcar (function auto-save-check-directory) @@ -224,11 +214,15 @@ autosave files can then be recovered at once with function `recover-all-files'. -Takes care to make autosave files for files accessed through ange-ftp -be local files if variable `ange-ftp-auto-save-remotely' is nil. +Takes care to make autosave files for files accessed through efs +be local files if variable `efs-auto-save-remotely' is nil. Takes care of slashes in buffer names to prevent autosave errors. +Takes care that autosave files for buffers not visiting any file (such +as `*mail*') from two simultaneous Emacses don't collide by prepending +the Emacs pid. + Uses 14 character autosave names if `auto-save-hash-p' is true. Autosaves even if the current directory is not writable, using @@ -242,9 +236,12 @@ ;; would fail for each new file). (condition-case error-data - (let* ((file-name (or (and (boundp 'buffer-file-truename) ; From jwz, - buffer-file-truename) ; for Emacs 19? - buffer-file-name)) + (let* ((file-name (or (and (boundp 'buffer-file-truename) + buffer-file-truename + ;; Make sure that the file name is expanded. + (expand-file-name buffer-file-name)) + (and buffer-file-name + (expand-file-name buffer-file-name)))) ;; So autosavename looks like #%...#, roughly as with the ;; old make-auto-save-file-name function. The ;; make-temp-name inserts the pid of this Emacs: this @@ -253,42 +250,32 @@ ;; the next Emacs session (the one after the crash) the ;; pid will be different, but file-less buffers like ;; *mail* must be recovered manually anyway. - - ;; jwz: putting the emacs PID in the auto-save file name is bad - ;; news, because that defeats auto-save-recovery of *mail* - ;; buffers -- the (sensible) code in sendmail.el calls - ;; (make-auto-save-file-name) to determine whether there is - ;; unsent, auto-saved mail to recover. If that mail came from a - ;; previous emacs process (far and away the most likely case) - ;; then this can never succeed as the pid differs. -;; (name-prefix (if file-name nil (make-temp-name "#%"))) - (name-prefix (if file-name nil "#%")) - + (name-prefix (if file-name nil (make-temp-name "#%"))) (save-name (or file-name ;; Prevent autosave errors. Buffername ;; (to become non-dir part of filename) will ;; be unslashified twice. Don't care. (auto-save-unslashify-name (buffer-name)))) (remote-p (and (stringp file-name) - (fboundp 'ange-ftp-ftp-path) - (ange-ftp-ftp-path file-name)))) + (fboundp 'efs-ftp-path) + (efs-ftp-path file-name)))) ;; Return the appropriate auto save file name: (expand-file-name;; a buffername needs this, a filename not (if remote-p - (if ange-ftp-auto-save-remotely + (if efs-auto-save-remotely (auto-save-name-in-same-directory save-name) ;; We have to use the `fixed-directory' now since the ;; `same-directory' would be remote. ;; It will use the fallback if needed. (auto-save-name-in-fixed-directory save-name)) ;; Else it is a local file (or a buffer without a file, hence - ;; the name-prefix). + ;; the name-prefix). ;; Hashed files always go into the special hash dir, never ;; in the same directory, to make recognizing reliable. (if (or auto-save-directory auto-save-hash-p) (auto-save-name-in-fixed-directory save-name name-prefix) (auto-save-name-in-same-directory save-name name-prefix))))) - + ;; If any error occurs in the above code, return what the old ;; version of this function would have done. It is not ok to ;; return nil, e.g., when after-find-file tests @@ -396,15 +383,16 @@ (defun auto-save-cyclic-hash-14 (s) ;; "Hash string S into a string of length 14. + ;; A 7-bytes cyclic code for burst correction is calculated on a + ;; byte-by-byte basis. The polynomial used is D^7 + D^6 + D^3 +1. ;; The resulting string consists of hexadecimal digits [0-9a-f]. ;; In particular, it contains no slash, so it can be used as autosave name." - (let ((crc (make-string 8 0)) + (let ((crc (make-string 7 0)) result) (mapcar (function (lambda (new) - (setq new (+ new (aref crc 7))) - (aset crc 7 (aref crc 6)) + (setq new (+ new (aref crc 6))) (aset crc 6 (+ (aref crc 5) new)) (aset crc 5 (aref crc 4)) (aset crc 4 (aref crc 3)) @@ -420,22 +408,55 @@ (aref crc 3) (aref crc 4) (aref crc 5) - (aref crc 6) - (aref crc 7))) + (aref crc 6))) result)) +;; This leaves two characters that could be used to wrap it in `#' or +;; make two filenames from it: one for autosaving, and another for a +;; file containing the name of the autosaved filed, to make hashing +;; reversible. +(defun auto-save-cyclic-hash-12 (s) + "Outputs the 12-characters ascii hex representation of a 6-bytes +cyclic code for burst correction calculated on STRING on a +byte-by-byte basis. The used polynomial is D^6 + D^5 + D^4 + D^3 +1." + (let ((crc (make-string 6 0))) + (mapcar + (function + (lambda (new) + (setq new (+ new (aref crc 5))) + (aset crc 5 (+ (aref crc 4) new)) + (aset crc 4 (+ (aref crc 3) new)) + (aset crc 3 (+ (aref crc 2) new)) + (aset crc 2 (aref crc 1)) + (aset crc 1 (aref crc 0)) + (aset crc 0 new))) + s) + (format "%02x%02x%02x%02x%02x%02x" + (aref crc 0) + (aref crc 1) + (aref crc 2) + (aref crc 3) + (aref crc 4) + (aref crc 5)))) + ;;; Recovering files -;; jwz: changed this to also offer to recover auto-saved buffers which -;; had no associated file name (such as sendmail buffers.) -(defun recover-all-files () +(defun recover-all-files (&optional silent) "Do recover-file for all autosave files which are current. Only works if you have a non-nil `auto-save-directory'. + +Optional prefix argument SILENT means to be silent about non-current +autosave files. This is useful if invoked automatically at Emacs +startup. + +If `auto-save-offer-delete' is t, this function will offer to delete +old or rejected autosave files. + Hashed files (see `auto-save-hash-p') are not understood, use `recover-file' to recover them individually." - (interactive) + (interactive "P") (let ((savefiles (directory-files auto-save-directory t "^#")) afile ; the auto save file file ; its original file @@ -455,10 +476,10 @@ (t (setq total (1+ total)) (with-output-to-temp-buffer "*Directory*" - (apply 'call-process "ls" nil standard-output nil - "-l" afile (if file (list file)))) + (call-process "ls" nil standard-output nil + "-l" afile (if file (list file)))) (if (yes-or-no-p (format "Recover %s from auto save file? " - (or file "non-file buffer"))) + file)) (let* ((obuf (current-buffer)) (buf (set-buffer (if file @@ -476,10 +497,17 @@ Auto-save off in buffer \"%s\" till you do M-x auto-save-mode." (buffer-name)) (set-buffer obuf) - (sit-for 1)))))) + (sit-for 1)) + ;; If not used for recovering, offer to delete + ;; autosave file + (and auto-save-offer-delete + (or (eq 'always auto-save-offer-delete) + (yes-or-no-p + (format "Delete autosave file for `%s'? " file))) + (delete-file afile)))))) (if (zerop total) - (message "Nothing to recover.") + (or silent (message "Nothing to recover.")) (message "%d/%d file%s recovered." count total (if (= count 1) "" "s")))) (if (get-buffer "*Directory*") (kill-buffer "*Directory*"))) -(provide 'auto-save) +;;; end of auto-save.el
--- a/lisp/packages/column.el Mon Aug 13 09:13:58 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,124 +0,0 @@ -;;; column.el --- display line and column in the mode line - -;; Copyright (C) 1993 Per Abrahamsen. -;; Copyright abandoned. This file is donated to the public domain. - -;; Author: Per Abrahamsen <abraham@iesd.auc.dk> -;; Hacked for XEmacs by Richard Lee <rlee@vienna.itd.sterling.com> -;; Version: 0.2 -;; Bogus-Bureaucratic-Cruft: How 'bout ESR and the LCD people agreed -;; on a common format? - -;;; Synched up with: Not in FSF. - -;;; Commentary: - -;; LCD Archive Entry: -;; column|Per Abrahamsen|abraham@iesd.auc.dk| -;; Display line and column in the mode line| -;; 1993-12-31|0.2|~/misc/column.el.Z| - -;; Requires FSF Emacs 19. ***** or Lucid Emacs 19.6+ -- Richard Lee - -;;; Change Log: -;; -;; Tue Jan 04 19:51:15 1994 Richard Lee ***** -;; * Hacks for Lemacs: -;; changed display-column-after from ")%--" to ")%----" -;; defined current-line (function and variable) -;; changed display-column-format to use current-line instead of %l -;; Fri Dec 31 13:46:41 1993 -;; * Change mode-line-format directly instead of using a minor mode. -;; Thu Dec 16 14:57:15 1993 -;; * Removed (require 'lucid) as unnecessary. -;; Fri Aug 13 02:06:18 1993 Per Abrahamsen -;; * Made current-column buffer local. -;; Tue Aug 10 10:00:00 1993 Per Abrahamsen -;; * Created. - -;; This version should display column and line number the same place as -;; line-number-mode. Activate with - -;; M-x display-column-mode RET - -;; For FSF Emacs 19 only. You can get line+.el or linenumber.el from the -;; emacs lisp archive if you have another version of Emacs. Not tested. - -;;; Code: - -;; String containing current column as last evaluated. -(defvar current-column "0") -(defvar current-line "0") -(make-variable-buffer-local 'current-column) -(make-variable-buffer-local 'current-line) - -;; Returns the vertical position of point _relative to beginning of buffer_ -;; (as opposed to the current-line example in the gnu-emacs 19 info page on -;; Text Lines, which does it relative to top of screen.) ***** -- Richard Lee -;; ben: lines begin at 1, not 0! -(defun current-line () - "Return the vertical position of point in the selected window. - First line in the buffer is 1." - (1+ (+ (count-lines 1 (point)) - (if (= (current-column) 0) 1 0) - -1))) - -;; Function updating the string containing the current column. -(defvar update-column-function - (lambda () - (setq current-column - (int-to-string (if (and (boundp 'column-number-start-at-one) - column-number-start-at-one) - (1+ (current-column)) - (current-column)))) - (setq current-line (int-to-string (current-line))) - (set-buffer-modified-p (buffer-modified-p)))) - -(defvar display-column-mode nil - "Show current column and line in mode line if non-nil.") - -(defvar display-column-format '(current-line "/" current-column "--") - "Format for displaying the line and column in the mode line.") - -;; Entry for column mode in mode line. -(defconst display-column-entry - (list 'display-column-mode (cons "" display-column-format))) - -(defvar display-column-after ")%]----" - "Display column after this element in the mode line.") - -;; Add display-column-format to mode-line-format after display-column-after. -(or (member display-column-entry mode-line-format) - (let ((entry (member display-column-after mode-line-format))) - (setcdr entry (cons display-column-entry (cdr entry))))) - -(defun remove (it list) - (cond ((null list) nil) - ((eq it (car list)) (cdr list)) - (t (setcdr list (remove it (cdr list))) list))) - -;;;###autoload -(defun display-column-mode (&optional arg) - "Toggle display column mode. -With prefix arg, turn display column mode on iff arg is positive. - -When display column mode is on, the current column and line number are -displayed in the mode line." - (interactive "P") - (if (or (and (null arg) display-column-mode) - (<= (prefix-numeric-value arg) 0)) - ;; Turn it off - (if display-column-mode - (progn - (remove-hook 'post-command-hook update-column-function) - (setq display-column-mode nil) - (set-buffer-modified-p (buffer-modified-p)))) - ;;Turn it on - (if display-column-mode - () - (add-hook 'post-command-hook update-column-function) - (setq display-column-mode t)))) - -(provide 'column) - -;;; column.el ends here
--- a/lisp/packages/diff.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/packages/diff.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,305 +1,311 @@ -;;; diff.el --- Run `diff' in compilation-mode. - -;; Copyright (C) 1992, 1994 Free Software Foundation, Inc. - -;; Keywords: unix, tools - -;; This file is part of XEmacs. +;; -*-Emacs-Lisp-*- +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; File: diff.el +;; Version: $Revision: 1.2 $ +;; Author: This file is based on diff.el by +;; sunpitt!wpmstr!fbresz@Sun.COM 1/27/89. +;; It has been completely rewritten in July 1994 by +;; Sandy Rutherford <sandy@ibm550.sissa.it> +;; RCS: +;; Description: diff-mode for handling output from unix diff utility. +;; Modified: Wed Jul 17 10:26:57 1996 (Andy Norman) ange@hplb.hpl.hp.com +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; XEmacs is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. +;;; Copyright (C) 1990 Free Software Foundation, Inc. +;;; Copyright (C) 1994 Sandy Rutherford -;; XEmacs is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. +;;; This file is based on diff.el by sunpitt!wpmstr!fbresz@Sun.COM 1/27/89. +;;; It has been completely rewritten in July 1994 by +;;; Sandy Rutherford <sandy@ibm550.sissa.it> -;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the Free -;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -;; 02111-1307, USA. - -;;; Synched up with: FSF 19.34. - -;;; Commentary: +;;; This program is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 1, or (at your option) +;;; any later version. +;;; +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; A copy of the GNU General Public License can be obtained from this +;;; program's author (send electronic mail to sandy@ibm550.sissa.it) or +;;; from the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, +;;; MA 02139, USA. -;; This package helps you explore differences between files, using the -;; UNIX command diff(1). The commands are `diff' and `diff-backup'. -;; You can specify options with `diff-switches'. +(provide 'diff) -;;; Code: - -(require 'compile) +;;; User Variables -;;; This is duplicated in vc.el. -;;;###autoload -(defvar diff-switches (purecopy "-c") - "*A string or list of strings specifying switches to be passed to diff.") +;; should be in to loaddefs.el now. +(defvar diff-switches nil + "*A list of switches (strings) to pass to the diff program.") -(defvar diff-command "diff" - "*The command to use to run diff.") +(defvar diff-do-narrow nil + "*If non-nil diff buffers are initialized narrowed to each difference.") -(defvar diff-regexp-alist - '( - ;; -u format: @@ -OLDSTART,OLDEND +NEWSTART,NEWEND @@ - ("^@@ -\\([0-9]+\\),[0-9]+ \\+\\([0-9]+\\),[0-9]+ @@$" 1 2) +(defvar diff-load-hooks nil + "Hooks to run after loading diff.el") + +;;; Internal variables - ;; -c format: *** OLDSTART,OLDEND **** - ("^\\*\\*\\* \\([0-9]+\\),[0-9]+ \\*\\*\\*\\*$" 1 nil) - ;; --- NEWSTART,NEWEND ---- - ("^--- \\([0-9]+\\),[0-9]+ ----$" nil 1) +(defconst diff-emacs-19-p + (let ((ver (string-to-int (substring emacs-version 0 2)))) + (>= ver 19))) - ;; plain diff format: OLDSTART[,OLDEND]{a,d,c}NEWSTART[,NEWEND] - ("^\\([0-9]+\\)\\(,[0-9]+\\)?[adc]\\([0-9]+\\)\\(,[0-9]+\\)?$" 1 3) - - ;; -e (ed) format: OLDSTART[,OLDEND]{a,d,c} - ("^\\([0-9]+\\)\\(,[0-9]+\\)?[adc]$" 1) +(or diff-emacs-19-p (require 'emacs-19)) - ;; -f format: {a,d,c}OLDSTART[ OLDEND] - ;; -n format: {a,d,c}OLDSTART LINES-CHANGED - ("^[adc]\\([0-9]+\\)\\( [0-9]+\\)?$" 1) - ) - "Alist (REGEXP OLD-IDX NEW-IDX) of regular expressions to match difference -sections in \\[diff] output. If REGEXP matches, the OLD-IDX'th -subexpression gives the line number in the old file, and NEW-IDX'th -subexpression gives the line number in the new file. If OLD-IDX or NEW-IDX -is nil, REGEXP matches only half a section.") +(defvar diff-old-file nil) +;; A list whose car is the name of the old file, and whose cdr indicates +;; whether we should delete the buffer on quit. +(defvar diff-new-file nil) +;; Same as diff-old-file, except for the new file. +(defvar diff-total-differences "0") +;; Total number of difference hunks as a string. +(defvar diff-current-difference "0") +;; Current difference hunk as a string. +(defvar diff-current-hunk 0) +;; Current difference hunk as an integer. +(defvar diff-total-hunks 0) +;; Total number of difference hunks as an integer. +(defvar diff-hunk-vector (vector 0)) +;; Vector storing the starting positions of the difference hunks. +(defvar diff-old-file-pattern nil) +(defvar diff-new-file-pattern nil) +(defvar diff-hunk-pattern nil) +;; Regexps to use when parsing file lines in difference hunks. -(defvar diff-old-file nil - "This is the old file name in the comparison in this buffer.") -(defvar diff-new-file nil - "This is the new file name in the comparison in this buffer.") -(defvar diff-old-temp-file nil - "This is the name of a temp file to be deleted after diff finishes.") -(defvar diff-new-temp-file nil - "This is the name of a temp file to be deleted after diff finishes.") + +(defvar diff-search-pattern-alist + (list + (list ?e "^[0-9]\\(,[0-9]+\\)?[acd]$" "^\\([0-9]+\\)" nil) + (list ?c "^\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\n" + "^\\*+ \\([0-9]+\\)" "^-+ \\([0-9]+\\)") + (list ?u "^@@ " "^@@ -\\([0-9]+\\)" "^@@ -[0-9,]+ \\+\\([0-9]+\\)") + (list nil "^[0-9]+" "^\\([0-9]+\\)" "^[0-9,]+[acd]\\([0-9]+\\)"))) -;; See compilation-parse-errors-function (compile.el). -(defun diff-parse-differences (limit-search find-at-least) - (setq compilation-error-list nil) - (message "Parsing differences...") +(defvar diff-keymap-grokked nil) + +(defvar diff-temp-template "/tmp/diff") - ;; Don't reparse diffs already seen at last parse. - (if compilation-parsing-end (goto-char compilation-parsing-end)) +;; Initialize the keymap if it isn't already + +(defvar diff-mode-map nil + "Keymap used in diff mode.") - ;; Construct in REGEXP a regexp composed of all those in dired-regexp-alist. - (let ((regexp (mapconcat #'(lambda (elt) - (concat "\\(" (car elt) "\\)")) - diff-regexp-alist - "\\|")) - ;; (GROUP-IDX OLD-IDX NEW-IDX) - (groups (let ((subexpr 1)) - (mapcar #'(lambda (elt) - (prog1 - (cons subexpr - (mapcar #'(lambda (n) - (and n - (+ subexpr n))) - (cdr elt))) - (setq subexpr (+ subexpr 1 - ;;#### undefined?? - (count-regexp-groupings - (car elt)))))) - diff-regexp-alist))) +(if diff-mode-map + nil + (setq diff-mode-map (make-keymap)) + (suppress-keymap diff-mode-map) + (define-key diff-mode-map "?" 'describe-mode) + (define-key diff-mode-map "." 'diff-display-file) + (define-key diff-mode-map "N" 'diff-narrow) + (define-key diff-mode-map "W" 'widen) + (define-key diff-mode-map "f" 'diff-find-file) + (define-key diff-mode-map "h" 'diff-show-header) + (define-key diff-mode-map "j" 'diff-show-difference) + (define-key diff-mode-map "n" 'diff-next-difference) + (define-key diff-mode-map "o" 'diff-find-file-other-window) + (define-key diff-mode-map "p" 'diff-previous-difference) + (define-key diff-mode-map "q" 'diff-quit) + (define-key diff-mode-map "w" 'diff-find-file-other-frame) + (define-key diff-mode-map "\C-c\C-c" 'diff-find-file-other-window) + (define-key diff-mode-map " " 'diff-advertised-scroll-up) + (define-key diff-mode-map "\177" 'diff-advertised-scroll-down) + (define-key diff-mode-map "\C-n" 'diff-next-line) + (define-key diff-mode-map "\C-p" 'diff-previous-line) + (define-key diff-mode-map "\M->" 'diff-end-of-buffer) + (define-key diff-mode-map "\M-<" 'diff-beginning-of-buffer)) + +;;; Internal functions - (new-error - (function (lambda (file subexpr) - (setq compilation-error-list - (cons - (cons (save-excursion - ;; Report location of message - ;; at beginning of line. - (goto-char - (match-beginning subexpr)) - (beginning-of-line) - (point-marker)) - ;; Report location of corresponding text. - (let ((line (string-to-int - (buffer-substring - (match-beginning subexpr) - (match-end subexpr))))) - (save-excursion - (save-match-data - (set-buffer (find-file-noselect file))) - (save-excursion - (goto-line line) - (point-marker))))) - compilation-error-list))))) +(defun diff-grok-keys (to-command from-command) + ;; Assigns to TO-COMMAND the keys for the global binding of FROM-COMMAND. + ;; Does not clobber anything in the local keymap. + (let ((keys (where-is-internal from-command))) + (while keys + (condition-case nil + (if (eq (global-key-binding (car keys)) (key-binding (car keys))) + (local-set-key (car keys) to-command)) + (error nil)) + (setq keys (cdr keys))))) + +(defun diff-grok-keymap () + (if diff-keymap-grokked + () + (if (and term-setup-hook (boundp 'command-line-args-left)) + (progn + (if diff-emacs-19-p + (run-hooks term-setup-hook) + (funcall term-setup-hook)) + (setq term-setup-hook nil))) + (setq diff-keymap-grokked t) + (diff-grok-keys 'diff-next-line 'next-line) + (diff-grok-keys 'diff-previous-line 'previous-line) + (diff-grok-keys 'diff-forward-char 'forward-char) + (diff-grok-keys 'diff-backward-char 'backward-char) + (diff-grok-keys 'diff-scroll-up 'scroll-up) + (diff-grok-keys 'diff-scroll-down 'scroll-down) + (diff-grok-keys 'diff-beginning-of-buffer 'beginning-of-buffer) + (diff-grok-keys 'diff-end-of-buffer 'end-of-buffer))) - (found-desired nil) - (num-loci-found 0) - g) - - (while (and (not found-desired) - ;; We don't just pass LIMIT-SEARCH to re-search-forward - ;; because we want to find matches containing LIMIT-SEARCH - ;; but which extend past it. - (re-search-forward regexp nil t)) +(defun diff-buffer-narrowed-p () + ;; Returns t if the current buffer is narrowed + (save-restriction + (let ((min (point-min)) + (max (point-max))) + (widen) + (not (and (= min (point-min)) (= max (point-max))))))) - ;; Find which individual regexp matched. - (setq g groups) - (while (and g (null (match-beginning (car (car g))))) - (setq g (cdr g))) - (setq g (car g)) +(defun diff-current-hunk () + ;; Returns the current diff hunk. + (let ((pt (point)) + (start 0) + (end (1+ diff-total-hunks)) + m) + (while (> (- end start) 1) + (setq m (/ (+ start end) 2)) + (if (>= pt (aref diff-hunk-vector m)) + (setq start m) + (setq end m))) + (if (>= pt (aref diff-hunk-vector end)) + (setq m end) + (setq m start)) + ;; Don't treat end of buffer as start of next hunk + (if (eobp) (1- m) m))) - (if (nth 1 g) ;OLD-IDX - (funcall new-error diff-old-file (nth 1 g))) - (if (nth 2 g) ;NEW-IDX - (funcall new-error diff-new-file (nth 2 g))) +(defun diff-hunk-min (n) + ;; Returns the start of the current diff hunk. + (aref diff-hunk-vector n)) + +(defun diff-hunk-max (n) + ;; Returns the end of the current diff hunk. + (aref diff-hunk-vector (1+ n))) - (setq num-loci-found (1+ num-loci-found)) - (if (or (and find-at-least - (>= num-loci-found find-at-least)) - (and limit-search (>= (point) limit-search))) - ;; We have found as many new loci as the user wants, - ;; or the user wanted a specific diff, and we're past it. - (setq found-desired t))) - (if found-desired - (setq compilation-parsing-end (point)) - ;; Set to point-max, not point, so we don't perpetually - ;; parse the last bit of text when it isn't a diff header. - (setq compilation-parsing-end (point-max))) - (message "Parsing differences...done")) - (setq compilation-error-list (nreverse compilation-error-list))) +(defun diff-parse-hunks () + ;; Parses a buffer of diff output. + (save-excursion + (save-restriction + (message "Parsing differences...") + (widen) + (goto-char (point-min)) + (let ((hunks (list 1))) + (while (re-search-forward diff-hunk-pattern nil t) + (setq hunks (cons (match-beginning 0) hunks))) + (setq diff-total-hunks (1- (length hunks)) + diff-hunk-vector (apply 'vector + (nreverse (cons (point-max) hunks))))))) + (message "Parsing differences...done")) -;;;###autoload -(defun diff (old new &optional switches) - "Find and display the differences between OLD and NEW files. -Interactively the current buffer's file name is the default for NEW -and a backup file for NEW is the default for OLD. -With prefix arg, prompt for diff switches." - (interactive - (nconc - (let (oldf newf) - (nreverse - (list - (setq newf (buffer-file-name) +(defun diff-update-modeline () + ;; Updates the mode line to show current diff hunk. + (if (or (< (point) (diff-hunk-min diff-current-hunk)) + (>= (point) (diff-hunk-max diff-current-hunk))) + (progn + (setq diff-current-hunk (diff-current-hunk) + diff-current-difference (int-to-string diff-current-hunk)) + (set-buffer-modified-p (buffer-modified-p))))) + +(defun diff-read-args (oldprompt newprompt switchprompt + &optional file-for-backup) + ;; Grab the args for diff. OLDPROMPT and NEWPROMPT are the prompts + ;; for the old & new filenames, SWITCHPROMPT for the list of + ;; switches. If FILE_FOR_BACKUP is provided (it must be a string if + ;; so), then it will be used to try & work out a file & backup to + ;; diff, & in this case the prompting order is backwards. %s in a + ;; prompt has a guess substituted into it. This is nasty. + (let (oldf newf) + (if file-for-backup + (setq newf file-for-backup newf (if (and newf (file-exists-p newf)) (read-file-name - (concat "Diff new file: (" - (file-name-nondirectory newf) ") ") + (format newprompt (file-name-nondirectory newf)) nil newf t) - (read-file-name "Diff new file: " nil nil t))) - (setq oldf (file-newest-backup newf) + (read-file-name (format newprompt "") nil nil t)) + oldf (file-newest-backup newf) oldf (if (and oldf (file-exists-p oldf)) (read-file-name - (concat "Diff original file: (" - (file-name-nondirectory oldf) ") ") - (file-name-directory oldf) oldf t) - (read-file-name "Diff original file: " - (file-name-directory newf) nil t)))))) - (if current-prefix-arg - (list (read-string "Diff switches: " - (if (stringp diff-switches) - diff-switches - (mapconcat 'identity diff-switches " ")))) - nil))) - (setq new (expand-file-name new) - old (expand-file-name old)) - ;; XEmacs addition -- allow (diff "../old/" "new-file.el") to work - (cond ((file-directory-p old) - (or (file-directory-p new) - (setq old (expand-file-name (file-name-nondirectory new) - (file-name-as-directory old))))) - ((file-directory-p new) - (setq new (expand-file-name (file-name-nondirectory old) - (file-name-as-directory new))))) - (let ((old-alt (file-local-copy old)) - (new-alt (file-local-copy new)) - buf) - (unwind-protect - (let ((command - (mapconcat 'identity - (append (list diff-command) - ;; Use explicitly specified switches - (if switches - (if (consp switches) - switches (list switches)) - ;; If not specified, use default. - (if (consp diff-switches) - diff-switches - (list diff-switches))) - (if (or old-alt new-alt) - (list "-L" old "-L" new)) - (list - (shell-quote-argument (or old-alt old))) - (list - (shell-quote-argument (or new-alt new)))) - " "))) - (setq buf - (compile-internal command - "No more differences" "Diff" - 'diff-parse-differences)) - (pop-to-buffer buf) - ;; Avoid frightening people with "abnormally terminated" - ;; if diff finds differences. - (set (make-local-variable 'compilation-exit-message-function) - (lambda (status code msg) - (cond ((not (eq status 'exit)) - (cons msg code)) - ((zerop code) - '("finished (no differences)\n" . "no differences")) - ((= code 1) - '("finished\n" . "differences found")) - (t - (cons msg code))))) - (set (make-local-variable 'diff-old-file) old) - (set (make-local-variable 'diff-new-file) new) - (set (make-local-variable 'diff-old-temp-file) old-alt) - (set (make-local-variable 'diff-new-temp-file) new-alt) - (set (make-local-variable 'compilation-finish-function) - (function (lambda (buff msg) - (if diff-old-temp-file - (delete-file diff-old-temp-file)) - (if diff-new-temp-file - (delete-file diff-new-temp-file))))) - buf)))) + (format oldprompt (file-name-nondirectory oldf)) + nil oldf t) + (read-file-name (format oldprompt "") + (file-name-directory newf) nil t))) + ;; Else we aren't trying to be bright... + (setq oldf (read-file-name (format oldprompt "") nil nil t) + newf (read-file-name + (format newprompt (file-name-nondirectory oldf)) + nil (file-name-directory oldf) t))) + (list oldf newf (diff-read-switches switchprompt)))) + +(defun diff-read-switches (switchprompt) + ;; Read and return a list of switches + (if current-prefix-arg + (let ((default (if (listp diff-switches) + (mapconcat 'identity diff-switches " ") + diff-switches))) + (diff-fix-switches + (read-string (format switchprompt default) default))))) + +(defun diff-fix-switches (switch-spec) + ;; Parse a string into a list of switches or leave it be if it's + ;; not a string + (if (stringp switch-spec) + (let (result (start 0)) + (while (string-match "\\(\\S-+\\)" switch-spec start) + (setq result (cons (substring switch-spec (match-beginning 1) + (match-end 1)) + result) + start (match-end 0))) + (nreverse result)) + switch-spec)) -;;;###autoload -(defun diff-backup (file &optional switches) - "Diff this file with its backup file or vice versa. -Uses the latest backup, if there are several numerical backups. -If this file is a backup, diff it with its original. -The backup file is the first file given to `diff'." - (interactive (list (read-file-name "Diff (file with backup): ") - (if current-prefix-arg - (read-string "Diff switches: " - (if (stringp diff-switches) - diff-switches - (mapconcat 'identity - diff-switches " "))) - nil))) - (let (bak ori) - (if (backup-file-name-p file) - (setq bak file - ori (file-name-sans-versions file)) - (setq bak (or (diff-latest-backup-file file) - (error "No backup found for %s" file)) - ori file)) - (diff bak ori switches))) +(defun diff-get-file-buffer (file) + ;; Returns \(BUFFER . DEL-P\), where DEL-P is t if diff is expected + ;; to delete the buffer, and nil otherwise. + (let* ((buff (get-file-buffer file)) + (del-p (null buff))) + (if (and buff (buffer-modified-p buff)) + (progn + (message + "Buffer %s is modified. Diffing against buffer contents." + (buffer-name buff)) + (sit-for 1))) + ;; Call find-file-noselect even if we already have the buffer, + ;; as it will run verify-buffer-file-modtime. + (cons (find-file-noselect file) del-p))) -(defun diff-latest-backup-file (fn) ; actually belongs into files.el +(defun diff-cleanup-buffers () + ;; Cleans up diff buffers by deleting buffers that we don't expect + ;; the user to care about. + (let ((files (list diff-old-file diff-new-file))) + (while files + (let ((ent (car files)) + buff) + (and (cdr ent) + (setq buff (get-file-buffer (car ent))) + (not (buffer-modified-p buff)) + (kill-buffer buff))) + (setq files (cdr files))) + (if (get-buffer "*Diff Header*") + (kill-buffer "*Diff Header*")))) + +(defun diff-latest-backup-file (file) "Return the latest existing backup of FILE, or nil." - (let ((handler (find-file-name-handler fn 'diff-latest-backup-file))) + ;; First try simple backup, then the highest numbered of the + ;; numbered backups. + ;; Ignore the value of version-control because we look for existing + ;; backups, which maybe were made earlier or by another user with + ;; a different value of version-control. + (let* ((file (expand-file-name file)) + (handler (find-file-name-handler file 'diff-latest-backup-file))) (if handler - (funcall handler 'diff-latest-backup-file fn) - ;; First try simple backup, then the highest numbered of the - ;; numbered backups. - ;; Ignore the value of version-control because we look for existing - ;; backups, which maybe were made earlier or by another user with - ;; a different value of version-control. - (setq fn (file-chase-links (expand-file-name fn))) + (funcall handler 'diff-latest-backup-file file) (or - (let ((bak (make-backup-file-name fn))) + (let ((bak (make-backup-file-name file))) (if (file-exists-p bak) bak)) - ;; We use BACKUPNAME to cope with backups stored in a different dir. - (let* ((backupname (car (find-backup-file-name fn))) - (dir (file-name-directory backupname)) - (base-versions (concat (file-name-sans-versions - (file-name-nondirectory backupname)) - ".~")) + (let* ((dir (file-name-directory file)) + (base-versions (concat (file-name-nondirectory file) ".~")) (bv-length (length base-versions))) (concat dir (car (sort @@ -310,6 +316,375 @@ (> (backup-extract-version fn1) (backup-extract-version fn2)))))))))))) -(provide 'diff) +(defun diff-file-line (&optional old-file-p) + "Return line number of current hunk in `diff-new-file'. +With optional argument OLD-FILE-P, use `diff-old-file' instead." + (save-excursion + (let ((min (diff-hunk-min diff-current-hunk)) + (max (diff-hunk-max diff-current-hunk)) + (regexp (if old-file-p diff-old-file-pattern diff-new-file-pattern))) + (goto-char min) + (or (and regexp (re-search-forward regexp max t)) + (error "Unable to locate a file line for %s file." + (if old-file-p "old" "new"))) + (string-to-int (buffer-substring (match-beginning 1) (match-end 1)))))) + +(defun diff-run-diff (switches old old-temp new new-temp) + ;; Actually run the diff process with SWITCHES on OLD and NEW. + ;; OLD-TEMP and NEW-TEMP are names of temp files that can be used + ;; to dump the data out to. + (insert "diff " (mapconcat 'identity switches " ") " " old + " " new "\n") + (apply 'call-process "diff" nil t nil + (append switches (list old-temp new-temp)))) + + +(defun diff-fix-file-names (old old-temp new new-temp pattern) + ;; Replaces any temp file names with the real names of files. + (save-excursion + (save-restriction + (let ((files (list old new)) + (temps (list old-temp new-temp)) + buffer-read-only case-fold-search) + (goto-char (point-min)) + (if (re-search-forward pattern nil t) + (narrow-to-region (point-min) (match-beginning 0))) + (while files + (let ((regexp (concat "[ \t\n]\\(" + (regexp-quote (car temps)) + "\\)[ \t\n]"))) + (goto-char (point-min)) + (forward-line 1) + (while (re-search-forward regexp nil t) + (goto-char (match-beginning 1)) + (delete-region (point) (match-end 1)) + (insert (car files)))) + (setq files (cdr files) + temps (cdr temps))))))) + +;;;; User commands + +(defun diff-mode () + "Diff Mode is used by \\[diff] for perusing the output from the diff program. +All normal editing commands are turned off. Instead, these are available: +\\<diff-mode-map> +\\[diff-advertised-scroll-up] Scroll to next screen of this difference. +\\[diff-advertised-scroll-down] Scroll to previous screen of this difference. +\\[diff-next-difference] Move to Next Difference. +\\[diff-previous-difference] Move to Previous Difference. +\\[diff-show-difference] Jump to difference specified by numeric position. +\\[diff-find-file] Find current diff in file +\\[diff-find-file-other-window] Find current diff in file in other window +\\[diff-display-file] Display file in other window +\\[diff-narrow] Narrow diff buffer to current difference +\\[widen] Widen diff buffer +\\[diff-show-header] Show diff header describing file name etc. +\\[diff-quit] Quit diff +" + (interactive) + (use-local-map diff-mode-map) + (diff-grok-keymap) + (setq buffer-read-only t + major-mode 'diff-mode + mode-name "Diff" + mode-line-modified "--- " + mode-line-process + '(" " diff-current-difference "/" diff-total-differences)) + (diff-parse-hunks) + (setq diff-total-differences (int-to-string diff-total-hunks))) + +;;; Motion commands + +(defun diff-next-difference (n) + "In diff-mode go the the beginning of the next difference hunk." + (interactive "p") + (if (zerop n) + (goto-char (diff-hunk-min diff-current-hunk)) + (let ((narrow (diff-buffer-narrowed-p)) + (max (point-max)) + (min (point-min))) + (unwind-protect + (progn + (widen) + (setq diff-current-hunk (+ n diff-current-hunk)) + (cond ((> diff-current-hunk diff-total-hunks) + (setq diff-current-hunk diff-total-hunks) + (message "No following difference hunks.")) + ((< diff-current-hunk 0) + (setq diff-current-hunk 0) + (message "No preceding difference hunks."))) + (setq diff-current-difference (int-to-string diff-current-hunk) + min (goto-char (diff-hunk-min diff-current-hunk)) + max (diff-hunk-max diff-current-hunk))) + (if narrow (narrow-to-region min max)))) + (set-buffer-modified-p (buffer-modified-p)))) + +(defun diff-previous-difference (n) + "In diff-mode go the the beginning of the previous difference hunk." + (interactive "p") + (diff-next-difference (- n))) + +(defun diff-next-line (n) + "In diff-mode go to the next line." + (interactive "p") + (condition-case nil + (next-line n) + (error (if (> n 0) (message "End of difference hunk")))) + (diff-update-modeline)) + +(defun diff-previous-line (n) + "In diff-mode go to the previous line." + (interactive "p") + (diff-next-line (- n))) + +(defun diff-forward-char (n) + "In diff-mode move the point forward." + (interactive "p") + (forward-char n) + (diff-update-modeline)) + +(defun diff-backward-char (n) + "In diff-mode move the point backward." + (interactive "p") + (backward-char n) + (diff-update-modeline)) + +(defun diff-scroll-up (n) + "In diff-mode scroll the buffer up." + (interactive "P") + (scroll-up n) + (diff-update-modeline)) + +(fset 'diff-advertised-scroll-up 'diff-scroll-up) + +(defun diff-scroll-down (n) + "In diff-mode scroll the buffer down." + (interactive "P") + (scroll-down n) + (diff-update-modeline)) + +(fset 'diff-advertised-scroll-down 'diff-scroll-down) + +(defun diff-beginning-of-buffer (n) + "In diff-mode go to the beginning of the buffer." + (interactive "P") + (beginning-of-buffer n) + (diff-update-modeline)) + +(defun diff-end-of-buffer (n) + "In diff-mode go to the end of the buffer." + (interactive "P") + (end-of-buffer n) + (diff-update-modeline)) + +;;; The main command. -;;; diff.el ends here +(defun diff (old new &optional switches) + "Find and display the differences between OLD and NEW files. +Interactively you are prompted with the current buffer's file name for NEW +and what appears to be its backup for OLD." + ;; Support for diffing directories is rather limited. It needs work. + (interactive (diff-read-args "Diff original file (%s) " + "Diff new file (%s) " + "Switches for diff (%s) " + (buffer-file-name))) + (setq switches (diff-fix-switches (or switches diff-switches)) + old (expand-file-name old) + new (expand-file-name new)) + (let ((curr-buff (current-buffer)) + doing-dirs old-temp new-temp old-buffer new-buffer flag) + (let ((fdp-old (file-directory-p old)) + (fdp-new (file-directory-p new))) + (cond + ((null (or fdp-new fdp-old))) + ((null fdp-new) + (setq old (expand-file-name (file-name-nondirectory new) old))) + ((null fdp-old) + (setq new (expand-file-name (file-name-nondirectory old) new))) + (t (setq doing-dirs t)))) +;; (message "diff %s %s %s..." +;; (mapconcat (function identity) switches " ") new old) + (message "diff %s %s %s..." + (mapconcat (function identity) switches " ") old new) + (if doing-dirs + (setq diff-old-file nil + diff-new-file nil) + (setq old-temp (make-temp-name (concat diff-temp-template "1")) + new-temp (make-temp-name (concat diff-temp-template "2")) + old-buffer (diff-get-file-buffer old) + new-buffer (diff-get-file-buffer new) + diff-old-file (cons old (cdr old-buffer)) + diff-new-file (cons new (cdr new-buffer)))) + (let (case-fold-search) + (mapcar (function + (lambda (x) + (if (string-match "[ecu]" x) + (setq flag (aref x (match-beginning 0)))))) + switches)) + (unwind-protect + (let ((patterns (assq flag diff-search-pattern-alist))) + (set-buffer (get-buffer-create "*Diff Output*")) + (setq default-directory (file-name-directory new) + diff-old-file-pattern (nth 2 patterns) + diff-new-file-pattern (nth 3 patterns) + diff-hunk-pattern (nth 1 patterns)) + (let (buffer-read-only) + (if (fboundp 'buffer-disable-undo) + (buffer-disable-undo (current-buffer)) + ;; old style (Emacs 18.55 and earlier) + (buffer-disable-undo (current-buffer))) + (widen) + (erase-buffer) + (if doing-dirs + (progn + (diff-run-diff switches old old new new) + (setq diff-hunk-pattern (concat diff-hunk-pattern + "\\|^Only in "))) + (save-excursion + (set-buffer (car old-buffer)) + (write-region (point-min) (point-max) old-temp nil 'quiet) + (set-buffer (car new-buffer)) + (write-region (point-min) (point-max) new-temp nil 'quiet)) + (diff-run-diff switches old old-temp new new-temp)) + ;; Need to replace file names + (if (and (not doing-dirs) (memq flag '(?c ?u))) + (diff-fix-file-names old old-temp new new-temp + diff-hunk-pattern)) + (diff-mode) + (goto-char (point-min)) + (setq diff-current-difference "0" + diff-current-hunk 0) + (if (zerop diff-total-hunks) + (progn + (diff-cleanup-buffers) + (message "No differences")) + (if diff-do-narrow (narrow-to-region (point) (diff-hunk-max 0))) + (display-buffer (current-buffer)) + (message "%s difference hunk%s" diff-total-differences + (if (= diff-total-hunks 1) "" "s"))))) + (condition-case nil + (delete-file old-temp) + (error nil)) + (condition-case nil + (delete-file new-temp) + (error nil)) + (set-buffer curr-buff)))) + +(defun diff-backup (file &optional switches) + "Diff this file with its backup file or vice versa. +Uses the latest backup, if there are several numerical backups. +If this file is a backup, diff it with its original. +The backup file is the first file given to `diff'." + (interactive (list (read-file-name "Diff (file with backup): ") + (and current-prefix-arg + (diff-read-switches "Diff switches: ")))) + (let (bak ori) + (if (backup-file-name-p file) + (setq bak file + ori (file-name-sans-versions file)) + (setq bak (or (diff-latest-backup-file file) + (error "No backup found for %s" file)) + ori file)) + (diff bak ori switches))) + +(defun diff-show-difference (n) + "Show difference number N (prefix argument)." + (interactive "p") + (let ((narrowedp (diff-buffer-narrowed-p)) + (min (diff-hunk-min diff-current-hunk)) + (max (diff-hunk-max diff-current-hunk))) + (unwind-protect + (progn + (widen) + (cond + ((< n 0) + (message "No negative hunks.") + (setq n 0)) + ((> n diff-total-hunks) + (message "No hunk %d." n) + (setq n diff-total-hunks))) + (setq diff-current-hunk n + diff-current-difference (int-to-string diff-current-hunk) + min (diff-hunk-min n) + max (diff-hunk-max n)) + (goto-char min)) + (if narrowedp (narrow-to-region min max)) + (set-buffer-modified-p (buffer-modified-p))))) + +(defun diff-show-header () + "Show `diff-header'." + (interactive) + (with-output-to-temp-buffer "*Diff Header*" + (princ (save-restriction + (widen) + (buffer-substring (diff-hunk-min 0) (diff-hunk-max 0)))))) + + +(defun diff-find-file (old-file-p) + "Visit diffed file, at the point corresponding to the current hunk. +Default is to visit the new file; prefix means visit old file instead." + (interactive "P") + (let ((line (diff-file-line old-file-p))) + (find-file + (if old-file-p + (car diff-old-file) + (car diff-new-file))) + (goto-line line) + (recenter 0))) + +(defun diff-find-file-other-window (old-file-p) + "Visit the diffed file in other window, with the point at the current hunk. +Default is to visit the new file; prefix means visit the old file instead." + (interactive "P") + (let ((line (diff-file-line old-file-p))) + (find-file-other-window + (if old-file-p + (car diff-old-file) + (car diff-new-file))) + (goto-line line) + (recenter 0))) + +(defun diff-find-file-other-frame (old-file-p) + "Visit the diffed file in other frame, with point at the current hunk. +Default is to visit the new file; prefix means visit the old file instead." + (interactive "P") + (let ((line (diff-file-line old-file-p))) + (find-file-other-frame + (if old-file-p + (car diff-old-file) + (car diff-new-file))) + (goto-line line) + (recenter 0))) + +(defun diff-display-file (old-file-p) + "Display the diffed file in other window, with point at the current hunk. +Default is to visit the new file; prefix means visit the old file instead." + (interactive "P") + (let ((line (diff-file-line old-file-p)) + (wind (display-buffer (find-file-noselect (if old-file-p + (car diff-old-file) + (car diff-new-file))))) + (curr-wind (selected-window))) + (unwind-protect + (progn + (select-window wind) + (goto-line line) + (recenter 0)) + (select-window curr-wind)))) + +(defun diff-quit () + "Quit diff by killing the diff buffer." + (interactive) + (kill-buffer "*Diff Output*") + (diff-cleanup-buffers)) + +(defun diff-narrow () + "Narrow diff buffer to current difference hunk." + (interactive) + (narrow-to-region (diff-hunk-min diff-current-hunk) + (diff-hunk-max diff-current-hunk))) + +;;; Run any load hooks +(run-hooks 'diff-load-hook) + +;;; end of diff.el
--- a/lisp/packages/fast-lock.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/packages/fast-lock.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,10 +1,10 @@ ;;; fast-lock.el --- Automagic text properties caching for fast Font Lock mode. -;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. +;; Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc. ;; Author: Simon Marshall <simon@gnu.ai.mit.edu> ;; Keywords: faces files -;; Version: 3.10.02 +;; Version: 3.11.01 ;;; This file is part of GNU Emacs. @@ -25,10 +25,9 @@ ;;; Commentary: -;; Purpose: -;; -;; To make visiting a file in `font-lock-mode' faster by restoring its face -;; text properties from automatically saved associated Font Lock cache files. +;; Lazy Lock mode is a Font Lock support mode. +;; It makes visiting a file in Font Lock mode faster by restoring its face text +;; properties from automatically saved associated Font Lock cache files. ;; ;; See caveats and feedback below. ;; See also the lazy-lock package. (But don't use the two at the same time!) @@ -53,7 +52,7 @@ ;; ;; Version control packages are likely to stamp all over file modification ;; times. Therefore the act of checking out may invalidate a cache. -;;;;;^L + ;; History: ;; ;; 0.02--1.00: @@ -160,7 +159,11 @@ ;; - Made `fast-lock-get-face-properties' cope with face lists ;; - Added `fast-lock-verbose' ;; - XEmacs: Add `font-lock-value-in-major-mode' if necessary -;;;;;^L +;; - Removed `fast-lock-submit-bug-report' and bade farewell +;; 3.10--3.11: + +;;; Code: + (require 'font-lock) ;; Make sure fast-lock.el is supported. @@ -192,40 +195,36 @@ ;; ;; We use this to verify that a face should be saved. (defmacro fast-lock-save-facep (face) - "Return non-nil if FACE matches `fast-lock-save-faces'." + "Return non-nil if FACE is one of `fast-lock-save-faces'." (` (or (null fast-lock-save-faces) (if (symbolp (, face)) (memq (, face) fast-lock-save-faces) - (let ((list (, face)) found) - (while list - (if (memq (car list) fast-lock-save-faces) - (setq list nil found t) - (setq list (cdr list)))) - found)))))) + (let ((faces (, face))) + (while (unless (memq (car faces) fast-lock-save-faces) + (setq faces (cdr faces)))) + faces)))))) -(defun fast-lock-submit-bug-report () - "Submit via mail a bug report on fast-lock.el." - (interactive) - (let ((reporter-prompt-for-summary-p t)) - (reporter-submit-bug-report "simon@gnu.ai.mit.edu" "fast-lock 3.10.02" - '(fast-lock-cache-directories fast-lock-minimum-size - fast-lock-save-others fast-lock-save-events fast-lock-save-faces - fast-lock-verbose) - nil nil - (concat "Hi Si., +;(defun fast-lock-submit-bug-report () +; "Submit via mail a bug report on fast-lock.el." +; (interactive) +; (let ((reporter-prompt-for-summary-p t)) +; (reporter-submit-bug-report "simon@gnu.ai.mit.edu" "fast-lock 3.11.01" +; '(fast-lock-cache-directories fast-lock-minimum-size +; fast-lock-save-others fast-lock-save-events fast-lock-save-faces +; fast-lock-verbose) +; nil nil +; (concat "Hi Si., +; +;I want to report a bug. I've read the `Bugs' section of `Info' on Emacs, so I +;know how to make a clear and unambiguous report. To reproduce the bug: +; +;Start a fresh editor via `" invocation-name " -no-init-file -no-site-file'. +;In the `*scratch*' buffer, evaluate:")))) -I want to report a bug. I've read the `Bugs' section of `Info' on Emacs, so I -know how to make a clear and unambiguous report. To reproduce the bug: - -Start a fresh editor via `" invocation-name " -no-init-file -no-site-file'. -In the `*scratch*' buffer, evaluate:")))) - -;; XEmacs menu system requires this to be autoloaded -;;;###autoload -(defvar fast-lock-mode nil) -(defvar fast-lock-cache-timestamp nil) ; for saving/reading -(defvar fast-lock-cache-filename nil) ; for deleting -;;;;;^L +(defvar fast-lock-mode nil) ; Whether we are turned on. +(defvar fast-lock-cache-timestamp nil) ; For saving/reading. +(defvar fast-lock-cache-filename nil) ; For deleting. + ;; User Variables: (defvar fast-lock-cache-directories '("." "~/.emacs-flc") @@ -279,7 +278,7 @@ (defvar fast-lock-verbose font-lock-verbose "*If non-nil, means show status messages for cache processing. If a number, only buffers greater than this size have processing messages.") -;;;;;^L + ;; User Functions: ;;;###autoload @@ -295,9 +294,9 @@ buffer's file, and its `font-lock-keywords' match those that you are using. Font Lock caches may be saved: - - When you save the file's buffer. - - When you kill an unmodified file's buffer. - - When you exit Emacs, for all unmodified or saved buffers. +- When you save the file's buffer. +- When you kill an unmodified file's buffer. +- When you exit Emacs, for all unmodified or saved buffers. Depending on the value of `fast-lock-save-events'. See also the commands `fast-lock-read-cache' and `fast-lock-save-cache'. @@ -328,11 +327,11 @@ "Read the Font Lock cache for the current buffer. The following criteria must be met for a Font Lock cache file to be read: - - Fast Lock mode must be turned on in the buffer. - - The buffer must not be modified. - - The buffer's `font-lock-keywords' must match the cache's. - - The buffer file's timestamp must match the cache's. - - Criteria imposed by `fast-lock-cache-directories'. +- Fast Lock mode must be turned on in the buffer. +- The buffer must not be modified. +- The buffer's `font-lock-keywords' must match the cache's. +- The buffer file's timestamp must match the cache's. +- Criteria imposed by `fast-lock-cache-directories'. See `fast-lock-mode'." (interactive) @@ -361,15 +360,15 @@ "Save the Font Lock cache of BUFFER or the current buffer. The following criteria must be met for a Font Lock cache file to be saved: - - Fast Lock mode must be turned on in the buffer. - - The event must be one of `fast-lock-save-events'. - - The buffer must be at least `fast-lock-minimum-size' bytes long. - - The buffer file must be owned by you, or `fast-lock-save-others' must be t. - - The buffer must contain at least one `face' text property. - - The buffer must not be modified. - - The buffer file's timestamp must be the same as the file's on disk. - - The on disk file's timestamp must be different than the buffer's cache. - - Criteria imposed by `fast-lock-cache-directories'. +- Fast Lock mode must be turned on in the buffer. +- The event must be one of `fast-lock-save-events'. +- The buffer must be at least `fast-lock-minimum-size' bytes long. +- The buffer file must be owned by you, or `fast-lock-save-others' must be t. +- The buffer must contain at least one `face' text property. +- The buffer must not be modified. +- The buffer file's timestamp must be the same as the file's on disk. +- The on disk file's timestamp must be different than the buffer's cache. +- Criteria imposed by `fast-lock-cache-directories'. See `fast-lock-mode'." (interactive) @@ -414,7 +413,7 @@ (defun turn-on-fast-lock () "Unconditionally turn on Fast Lock mode." (fast-lock-mode t)) -;;;;;^L + ;;; API Functions: (defun fast-lock-after-fontify-buffer () @@ -428,7 +427,7 @@ (defalias 'fast-lock-after-unfontify-buffer 'ignore) -;;;;;^L + ;; Miscellaneous Functions: (defun fast-lock-save-cache-after-save-file () @@ -507,7 +506,7 @@ (file-name-as-directory (expand-file-name directory)) (mapconcat 'char-to-string (apply 'append (mapcar mapchars bufile)) "") ".flc")))) -;;;;;^L + ;; Font Lock Cache Processing Functions: (defun fast-lock-save-cache-1 (file timestamp) @@ -572,10 +571,10 @@ (t "done"))))) (setq font-lock-fontified (eq loaded t) fast-lock-cache-timestamp (and (eq loaded t) timestamp)))) -;;;;;^L + ;; Text Properties Processing Functions: -;; This is faster, but fails if adjacent characters have different `face' text +;; This is fast, but fails if adjacent characters have different `face' text ;; properties. Maybe that's why I dropped it in the first place? ;(defun fast-lock-get-face-properties () ; "Return a list of all `face' text properties in the current buffer. @@ -595,8 +594,8 @@ ; (setq start (next-single-property-change end 'face))) ; properties))) -;; This copes if adjacent characters have different `face' text properties, but -;; fails if they are lists. +;; This is slow, but copes if adjacent characters have different `face' text +;; properties, but fails if they are lists. ;(defun fast-lock-get-face-properties () ; "Return a list of all `face' text properties in the current buffer. ;Each element of the list is of the form (VALUE START1 END1 START2 END2 ...) @@ -624,18 +623,16 @@ (save-restriction (widen) (let ((start (text-property-not-all (point-min) (point-max) 'face nil)) - (limit (point-max)) end properties value cell) + end properties value cell) (while start - (setq end (next-single-property-change start 'face nil limit) + (setq end (next-single-property-change start 'face nil (point-max)) value (get-text-property start 'face)) ;; Make, or add to existing, list of regions with same `face'. (cond ((setq cell (assoc value properties)) (setcdr cell (cons start (cons end (cdr cell))))) ((fast-lock-save-facep value) (push (list value start end) properties))) - (setq start (if (get-text-property end 'face) - end - (next-single-property-change end 'face)))) + (setq start (text-property-not-all end (point-max) 'face nil))) properties))) (defun fast-lock-set-face-properties (properties) @@ -654,7 +651,7 @@ (while regions (set-text-properties (nth 0 regions) (nth 1 regions) plist) (setq regions (nthcdr 2 regions))))))) -;;;;;^L + ;; Functions for XEmacs: (when (save-match-data (string-match "XEmacs" (emacs-version))) @@ -719,7 +716,7 @@ (unless (fboundp 'font-lock-compile-keywords) (defalias 'font-lock-compile-keywords 'identity)) -;;;;;^L + ;; Install ourselves: (add-hook 'after-save-hook 'fast-lock-save-cache-after-save-file) @@ -727,7 +724,9 @@ (add-hook 'kill-emacs-hook 'fast-lock-save-caches-before-kill-emacs) ;;;###autoload -(if (fboundp 'add-minor-mode) (add-minor-mode 'fast-lock-mode nil)) +(when (fboundp 'add-minor-mode) + (defvar fast-lock-mode nil) + (add-minor-mode 'fast-lock-mode nil)) ;;;###dont-autoload (unless (assq 'fast-lock-mode minor-mode-alist) (setq minor-mode-alist (append minor-mode-alist '((fast-lock-mode nil)))))
--- a/lisp/packages/func-menu.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/packages/func-menu.el Mon Aug 13 09:15:11 2007 +0200 @@ -450,7 +450,15 @@ "Used to tune the frequency of automatic checks on the buffer. The function fume-rescan-buffer-trigger only works whenever the value of the variable fume-rescan-trigger-counter reaches zero, whereupon it gets reset to -buffer-size/fume-rescan-trigger-counter-buffer-size.") +the maximum of a) buffer-size/fume-rescan-trigger-counter-buffer-size + or b) fume-rescan-trigger-counter-min") + +(defvar fume-rescan-trigger-counter-min 50 + "Used to tune the frequency of automatic checks on the buffer. +The function fume-rescan-buffer-trigger only works whenever the value of the +variable fume-rescan-trigger-counter reaches zero, whereupon it gets reset to +the maximum of a) buffer-size/fume-rescan-trigger-counter-buffer-size + or b) fume-rescan-trigger-counter-min") (fume-defvar-local fume-sort-function 'fume-sort-by-name @@ -1779,7 +1787,8 @@ (if (> fume-rescan-trigger-counter 0) (setq fume-rescan-trigger-counter (1- fume-rescan-trigger-counter)) (setq fume-rescan-trigger-counter - (/ (buffer-size) fume-rescan-trigger-counter-buffer-size)) + (max fume-rescan-trigger-counter-min + (/ (buffer-size) fume-rescan-trigger-counter-buffer-size))) (if (or fume-funclist-dirty-p (save-excursion (let (find fnam)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/packages/igrep.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,800 @@ +;;;; igrep.el --- An improved interface to `grep`. + +;;; Description: +;;; +;;; Define the \[igrep] command, which is like \[grep] except that it +;;; takes three required arguments (PROGRAM, EXPRESSION, and FILES) and +;;; an optional argument (OPTIONS) instead of just one argument (COMMAND). +;;; Also define the analogous \[egrep] and \[fgrep] commands for convenience. +;;; +;;; Define the \[igrep-find] command, which is like \[igrep] except that +;;; it uses `find` to recursively `grep` a directory. Also define the +;;; analogous \[egrep-find] and \[fgrep-find] commands for convenience. +;;; +;;; \[igrep] and \[igrep-find] (and their analogues) provide defaults +;;; for the EXPRESSION and FILES arguments when called interactively, +;;; and there are global variables that control the syntax of the `grep` +;;; and `find` shell commands that are executed. A user option controls +;;; whether the corresponding GNU (gzip) "zPROGRAM" script is used, to +;;; `grep` compressed files. +;;; +;;; \[agrep] and \[agrep-find] are also defined as convenient interfaces +;;; to the approximate `grep` utility, which is distributed with the +;;; `glimpse' indexing and query tool (available from +;;; <URL:http://glimpse.cs.arizona.edu:1994/>). +;;; +;;; \[grep] itself is advised to provide the \[igrep] interface when +;;; called interactively (when called programmatically, it still uses +;;; the original argument list). \[grep-find] is defined as an alias +;;; for \[igrep-find]. +;;; +;;; When run interactively from Dired mode, the various \[igrep] +;;; commands provide defaults for the EXPRESSION and FILES arguments +;;; that are based on the visited directory (including any inserted +;;; subdirectories) and the current file. In addition, the +;;; \[dired-do-igrep] and \[dired-do-igrep-find] commands are defined +;;; that respect the `dired-do-*' command calling conventions: a prefix +;;; argument is interpreted as the number of succeeding files to `grep`, +;;; otherwise all the marked files are `grep`ed. \[dired-do-grep] and +;;; \[dired-do-grep-find] are defined as aliases for \[dired-do-igrep] +;;; and \[dired-do-igrep-find]. + +;;; Copyright: +;;; +;;; Copyright � 1994,1995,1996,1997 Kevin Rodgers +;;; +;;; This program is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 2 of the License, or +;;; at your option) any later version. +;;; +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program; if not, write to the Free Software +;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +;;; +;;; Neither my former nor current employer (Martin Marietta and +;;; Information Handling Services, respectively) has disclaimed any +;;; copyright interest in igrep.el. +;;; +;;; Kevin Rodgers <kevinr@ihs.com> Project Engineer +;;; Information Handling Services Electronic Systems Development +;;; 15 Inverness Way East, M/S A201 +;;; Englewood CO 80112 USA (303)397-2807[voice]/-2779[fax] + +;;; Installation: +;;; +;;; 1. Put this file in a directory that is a member of load-path, and +;;; byte-compile it (e.g. with `M-x byte-compile-file') for better +;;; performance. You can ignore any warnings about references to free +;;; variables and "not known to be defined" functions. +;;; 2. Put these forms in default.el or ~/.emacs: +;;; (autoload (function igrep) "igrep" +;;; "*Run `grep` PROGRAM to match EXPRESSION in FILES..." t) +;;; (autoload (function igrep-find) "igrep" +;;; "*Run `grep` via `find`..." t) +;;; (autoload (function dired-do-igrep) "igrep" +;;; "*Run `grep` on the marked (or next prefix ARG) files." t) +;;; (autoload (function dired-do-igrep-find) "igrep" +;;; "*Run `grep` via `find` on the marked (or next prefix ARG) directories." t) +;;; 2. a. For completeness, you can add these forms as well: +;;; (autoload (function grep) "igrep" +;;; "*Run `grep` PROGRAM to match EXPRESSION in FILES..." t) +;;; (autoload (function egrep) "igrep" +;;; "*Run `egrep`..." t) +;;; (autoload (function fgrep) "igrep" +;;; "*Run `fgrep`..." t) +;;; (autoload (function agrep) "igrep" +;;; "*Run `agrep`..." t) +;;; (autoload (function grep-find) "igrep" +;;; "*Run `grep` via `find`..." t) +;;; (autoload (function egrep-find) "igrep" +;;; "*Run `egrep` via `find`..." t) +;;; (autoload (function fgrep-find) "igrep" +;;; "*Run `fgrep` via `find`..." t) +;;; (autoload (function agrep-find) "igrep" +;;; "*Run `agrep` via `find`..." t) +;;; (autoload (function dired-do-grep) "igrep" +;;; "*Run `grep` on the marked (or next prefix ARG) files." t) +;;; (autoload (function dired-do-grep-find) "igrep" +;;; "*Run `grep` via `find` on the marked (or next prefix ARG) directories." t) +;;; 3. If you are running Windows 95/NT, you should install findutils +;;; and grep from release 17.1 (or higher) of the Cygnus GNU-Win32 +;;; distribution. See <URL:http://www.cygnus.com/misc/gnu-win32/>. + +;;; Usage: +;;; +;;; M-x igrep M-x igrep-find +;;; M-x grep M-x grep-find +;;; M-x egrep M-x egrep-find +;;; M-x fgrep M-x fgrep-find +;;; M-x agrep M-x agrep-find +;;; M-x dired-do-igrep M-x dired-do-igrep-find +;;; M-x dired-do-grep M-x dired-do-grep-find +;;; (Each of the 10 igrep commands accepts 1, 2, or 3 `C-u' prefix arguments. +;;; The 2 Dired commands interpret a prefix argument like the regular `dired-do' +;;; commands.) +;;; C-x ` (M-x next-error) C-c C-c (M-x compile-goto-error) [in *igrep*] + +;;; Customization examples: +;;; +;;; To ignore case by default: +;;; (setq igrep-options "-i") +;;; To search subdirectories by default: +;;; (setq igrep-find t) +;;; To search files with the GNU (gzip) zgrep script: +;;; (setq igrep-use-zgrep t) +;;; or define new igrep commands (this works for zegrep and zfgrep as well): +;;; (igrep-define zgrep) ; M-x zgrep +;;; (igrep-find-define zgrep) ; M-x zgrep-find +;;; To avoid exceeding some shells' limit on command argument length +;;; (this only works when grep'ing files in the current directory): +;;; (setq igrep-find t +;;; igrep-find-prune-option "\\! -name .") + +;;; To do: +;;; +;;; 1. Delete the *-program variables (except for igrep-program) and +;;; replace igrep-options with a table that maps igrep-program to the +;;; appropriate options. +;;; 2. Generalize support for the -prune find clause (e.g. -fstype nfs). +;;; 3. Provide support for `glimpse`. +;;; 4. Add a menu interface. + +;;; LCD Archive Entry: +;;; +;;; igrep|Kevin Rodgers|kevinr@ihs.com| +;;; An improved interface to grep/egrep/fgrep; plus recursive `find` versions.| +;;; 97/02/10|2.56|~/misc/igrep.el.Z| + + +;;; Package interface: + +(provide 'igrep) + +(require 'backquote) ; igrep-with-default-in-history +(require 'compile) ; compile-internal and grep-regexp- + ; alist + +(defconst igrep-version "2.56" + "Version of igrep.el") + + +;;; User options: + +(defvar igrep-options nil + "*The options passed by \\[igrep] to `igrep-program', or nil. + +`-n' will automatically be passed to `igrep-program', to generate the +output expected by \\[next-error] and \\[compile-goto-error]. +`-e' will automatically be passed to `igrep-program', if it supports +that option.") + +(defvar igrep-read-options nil + "*If non-nil, `\\[igrep]' always prompts for options; +otherwise, it only prompts when 1 or 3 `C-u's are given as a prefix arg.") + +(defvar igrep-read-multiple-files nil + "*If non-nil, `\\[igrep]' always prompts for multiple-files; +otherwise, it only prompts when 2 or 3 `C-u's are given as a prefix arg.") + +(defvar igrep-verbose-prompts t + "*If t, \\[igrep] prompts for arguments verbosely; +if not t but non-nil, \\[igrep] prompts for arguments semi-verbosely; +if nil, \\[igrep] prompts for arguments tersely.") + +(defvar igrep-save-buffers 'query + "*If t, \\[igrep] first saves each modified file buffer; +if not t but non-nil, \\[igrep] offers to save each modified file buffer.") + +(defvar igrep-program-table ; referenced by igrep-use-zgrep + (let ((exec-directories exec-path) + (program-obarray (make-vector 11 0))) + (while exec-directories + (if (and (car exec-directories) + (file-directory-p (car exec-directories))) + (let ((grep-programs + (directory-files (car exec-directories) + nil "grep\\(\\.exe\\)?\\'"))) + (while grep-programs + ;; Check `(file-executable-p (car grep-programs))'? + (if (save-match-data + (string-match "\\.exe\\'" (car grep-programs))) + (intern (substring (car grep-programs) 0 -4) program-obarray) + (intern (car grep-programs) program-obarray)) + (setq grep-programs (cdr grep-programs))))) + (setq exec-directories (cdr exec-directories))) + program-obarray) + "An obarray of available `grep` programs, passed by `igrep-read-program' +to `completing-read' when `igrep-program' is nil.") + +(defvar igrep-use-zgrep + (if (intern-soft "zgrep" igrep-program-table) + 'files) + "If t, \\[igrep] searches files using the GNU (gzip) `zPROGRAM` script; +If not t but non-nil, \\[igrep] searches compressed FILES using `zPROGRAM`; +if nil, \\[igrep] searches files with `PROGRAM`.") + + +;;; User variables: + +(defvar igrep-program "grep" + "The default shell program run by \\[igrep] and \\[igrep-find]. +It must take a `grep` expression argument and one or more file names. +If nil, \\[igrep] prompts for the program to run.") + +(defvar igrep-expression-quote-char + (if (memq system-type '(ms-dos windows-95 windows-nt emx)) + ?\" + ?') + "The character used to delimit the EXPRESSION argument to \\[igrep], +to protect it from shell filename expansion.") + +(defvar igrep-expression-option + (if (or (eq system-type 'berkeley-unix) + (save-match-data + (string-match "-sco" system-configuration))) + "-e") + "If non-nil, the option used to specify the EXPRESSION argument to \\[igrep], +to protect an initial `-' from option processing.") + +(defvar igrep-parenthesis-escape-char + (if (memq system-type '(ms-dos windows-95 windows-nt emx)) + nil + ?\\) + "If non-nil, the character used by \\[igrep] to escape parentheses, +to protect them from shell interpretation.") + +(defvar igrep-find nil + "If non-nil, \\[igrep] searches directories using `find`. +See \\[igrep-find].") + +(defvar igrep-find-prune-options + (if (not (save-match-data + (string-match "-sco" system-configuration))) + "-name SCCS -o -name RCS") + "The `find` clause used to prune directories, or nil; +see \\[igrep-find].") + +(defvar igrep-find-file-options "-type f -o -type l" + "The `find` clause used to filter files passed to `grep`, or nil; +see \\[igrep-find].") + +(defvar igrep-find-use-xargs + (if (equal (call-process "find" nil nil nil + (if (boundp 'grep-null-device) + grep-null-device + "/dev/null") + "-print0") + 0) + 'gnu) + "If `gnu', \\[igrep-find] executes + `find ... -print0 | xargs -0 -e grep ...`; +if not `gnu' but non-nil, \\[igrep-find] executes + `find ... -print | xargs -e grep ...`; +if nil, \\[igrep-find] executes + `find ... -exec grep ...`.") + +(defvar igrep-program-default nil + "The default `grep` program, passed by `igrep-read-program' +to `completing-read' when `igrep-program' is nil.") + +(defvar igrep-expression-history '() + "The minibuffer history list for \\[igrep]'s EXPRESSION argument.") + +(defvar igrep-files-history '() + "The minibuffer history list for \\[igrep]'s FILES argument.") + + +;;; Commands: + +;; ;;;###autoload Not ready to replace compile.el's grep yet. -sb +(defadvice grep (around igrep-interface first (&rest grep-args) activate) + "If called interactively, use the \\[igrep] interface instead, +where GREP-ARGS is (PROGRAM EXPRESSION FILES OPTIONS); +if called programmatically, GREP-ARGS is still (COMMAND)." + (interactive (igrep-read-args)) + (if (interactive-p) + (apply (function igrep) grep-args) + ad-do-it)) + +(defalias 'grep-find 'igrep-find) + +;;;###autoload +(defun igrep (program expression files &optional options) + "*Run `grep` PROGRAM to match EXPRESSION in FILES. +The output is displayed in the *igrep* buffer, which \\[next-error] and +\\[compile-goto-error] parse to find each line of matched text. + +PROGRAM may be nil, in which case it defaults to `igrep-program'. + +EXPRESSION is automatically delimited by `igrep-expression-quote-char'. + +FILES is either a file name pattern (expanded by the shell named by +`shell-file-name') or a list of file name patterns. + +Optional OPTIONS is also passed to PROGRAM; it defaults to `igrep-options'. + +If a prefix argument \ +\(\\[universal-argument]\) \ +is given when called interactively, +or if `igrep-read-options' is set, OPTIONS is read from the minibuffer. + +If two prefix arguments \ +\(\\[universal-argument] \\[universal-argument]\) \ +are given when called interactively, +or if `igrep-read-multiple-files' is set, FILES is read from the minibuffer +multiple times. + +If three prefix arguments \ +\(\\[universal-argument] \\[universal-argument] \\[universal-argument]\) \ +are given when called interactively, +or if `igrep-read-options' and `igrep-read-multiple-files' are set, +OPTIONS is read and FILES is read multiple times. + +If `igrep-find' is non-nil, the directory or directories +containing FILES is recursively searched for files whose name matches +the file name component of FILES \(and whose contents match +EXPRESSION\)." + (interactive + (igrep-read-args)) + (if (null program) + (setq program (or igrep-program "grep"))) + (if (null options) + (setq options igrep-options)) + (if (not (listp files)) ; (stringp files) + (setq files (list files))) + (if (string-match "^[rj]?sh$" (file-name-nondirectory shell-file-name)) + ;; (restricted, job-control, or standard) Bourne shell doesn't expand ~: + (setq files + (mapcar 'expand-file-name files))) + (let* ((win32-quote-process-args nil) ; work around NT Emacs hack + (use-zgrep (cond ((eq igrep-use-zgrep t)) + (igrep-use-zgrep + (let ((files files) + (compressed-p nil)) + (while (and files (not compressed-p)) + (if (save-match-data + (string-match "\\.g?[zZ]\\'" (car files))) + (setq compressed-p t)) + (setq files (cdr files))) + compressed-p)) + (t nil))) + (command (format "%s -n %s %s %c%s%c %s %s" + (if (and use-zgrep + (save-match-data + (not (string-match "\\`z" program)))) + (setq program (concat "z" program)) + program) + (or options "") + (or igrep-expression-option + (progn + (if (save-match-data + (string-match "\\`-" expression)) + (setq expression (concat "\\" expression))) + "")) + igrep-expression-quote-char + expression + igrep-expression-quote-char + (if igrep-find + (if igrep-find-use-xargs + "" + "\"{}\"") + (mapconcat (function identity) files " ")) + (if (boundp 'grep-null-device) + grep-null-device + "/dev/null")))) + (if igrep-find + (setq command + (igrep-format-find-command command files))) + (cond ((eq igrep-save-buffers t) (save-some-buffers t)) + (igrep-save-buffers (save-some-buffers))) + (compile-internal command + (format "No more %c%s%c matches" + igrep-expression-quote-char + program + igrep-expression-quote-char) + "igrep" nil grep-regexp-alist))) + +;; Analogue commands: + +;;;###autoload +(defmacro igrep-define (analogue-command &rest igrep-bindings) + "Define ANALOGUE-COMMAND as an `igrep' analogue command. +Optional (VARIABLE VALUE) arguments specify temporary bindings for the command." +;;; (interactive "SCommand: ") ; C-u => read bindings? + (let ((analogue-program (symbol-name analogue-command))) + (` (defun (, analogue-command) (&rest igrep-args) + (, (format "*Run `%s` via \\[igrep]. +All arguments \(including prefix arguments, when called interactively\) +are handled by `igrep'." + analogue-program)) + (interactive + (let ((igrep-program (if igrep-program (, analogue-program))) + (igrep-program-default (, analogue-program))) + (igrep-read-args))) + (let ( (,@ igrep-bindings)) + (apply (function igrep) + (cond ((interactive-p) (car igrep-args)) + ((car igrep-args)) + (t (, analogue-program))) + (cdr igrep-args))))))) + +(igrep-define egrep) +(igrep-define fgrep) +(igrep-define agrep + (igrep-use-zgrep nil) + (igrep-expression-option "-e")) + + +;; Recursive (`find`) commands: + +;;;###autoload +(defun igrep-find (&rest igrep-args) + "*Run `grep` via `find`; see \\[igrep] and `igrep-find'. +All arguments \(including prefix arguments, when called interactively\) +are handled by `igrep'." + (interactive + (let ((igrep-find t)) + (igrep-read-args))) + (let ((igrep-find t)) + (apply (function igrep) igrep-args))) + +;; Analogue recursive (`find`) commands: + +;;;###autoload +(defmacro igrep-find-define (analogue-command &rest igrep-bindings) + "Define ANALOGUE-COMMAND-find as an `igrep' analogue `find` command. +Optional (VARIABLE VALUE) arguments specify temporary bindings for the command." +;;; (interactive "SCommand: ") ; C-u => read bindings? + (let ((analogue-program (symbol-name analogue-command))) + (setq analogue-command + (intern (format "%s-find" analogue-command))) + (` (defun (, analogue-command) (&rest igrep-args) + (, (format "*Run `%s` via \\[igrep-find]. +All arguments \(including prefix arguments, when called interactively\) +are handled by `igrep'." + analogue-program)) + (interactive + (let ((igrep-program (if igrep-program (, analogue-program))) + (igrep-program-default (, analogue-program)) + (igrep-find t)) + (igrep-read-args))) + (let ( (,@ igrep-bindings)) + (apply (function igrep-find) + (cond ((interactive-p) (car igrep-args)) + ((car igrep-args)) + (t (, analogue-program))) + (cdr igrep-args))))))) + +(igrep-find-define egrep) +(igrep-find-define fgrep) +(igrep-find-define agrep + (igrep-use-zgrep nil) + (igrep-expression-option "-e")) + + +;; Dired commands: + +;;;###autoload +(defun dired-do-igrep (program expression &optional options arg) + "*Run `grep` PROGRAM to match EXPRESSION (with optional OPTIONS) +on the marked (or next prefix ARG) files." + (interactive + (let* ((current-prefix-arg nil) + (igrep-args (igrep-read-args t))) + ;; Delete FILES: + (setcdr (nthcdr 1 igrep-args) (nthcdr 3 igrep-args)) + ;; Append ARG: + (nconc igrep-args (list current-prefix-arg)))) + (igrep program + expression + (funcall (cond ((fboundp 'dired-get-marked-files) ; GNU Emacs + 'dired-get-marked-files) + ((fboundp 'dired-mark-get-files) ; XEmacs + 'dired-mark-get-files)) + t arg) + options)) + +;;;###autoload +(defalias 'dired-do-grep 'dired-do-igrep) + +;; Dired recursive (`find`) commands: + +;;;###autoload +(defun dired-do-igrep-find (program expression &optional options arg) + "*Run `grep` PROGRAM to match EXPRESSION (with optional OPTIONS) +on the marked (or next prefix ARG) directories." + (interactive + (let* ((current-prefix-arg nil) + (igrep-find t) + (igrep-args (igrep-read-args t))) + ;; Delete FILES: + (setcdr (nthcdr 1 igrep-args) (nthcdr 3 igrep-args)) + ;; Append ARG: + (nconc igrep-args (list current-prefix-arg)))) + (let ((igrep-find t)) + (dired-do-igrep program expression options arg))) + +;;;###autoload +(defalias 'dired-do-grep-find 'dired-do-igrep-find) + + +;;; Utilities: + +(defsubst igrep-file-directory (name) + ;; Return the directory component of NAME, or "." if it has no + ;; directory component. + (directory-file-name (or (file-name-directory name) + (file-name-as-directory ".")))) + +(defsubst igrep-file-pattern (name) + ;; Return the file component of NAME, or "*" if it has no file + ;; component. + (let ((pattern (file-name-nondirectory name))) + (if (string= pattern "") + "*" + pattern))) + +(defun igrep-format-find-command (command files) + ;; Format `grep` COMMAND to be invoked via `find` on FILES. + (let ((directories '()) + (patterns '())) + (while files + (let ((dir (igrep-file-directory (car files))) + (pat (igrep-file-pattern (car files)))) + (if (and (not (string= dir ".")) + (file-symlink-p dir)) + (setq dir (concat dir "/."))) + (if (not (member dir directories)) + (setq directories (cons dir directories))) + (cond ((equal pat "*") + (setq patterns t)) + ((and (listp patterns) + (not (member pat patterns))) + (setq patterns (cons pat patterns))))) + (setq files (cdr files))) + (format (cond ((eq igrep-find-use-xargs 'gnu) + ;; | \\\n + "find %s %s %s %s -print0 | xargs -0 -e %s") + (igrep-find-use-xargs + ;; | \\\n + "find %s %s %s %s -print | xargs -e %s") +;;; ((memq system-type '(ms-dos windows-95 windows-nt emx)) +;;; "find %s %s %s %s -exec %s ;") + (t + "find %s %s %s %s -exec %s \\;")) + (mapconcat (function identity) (nreverse directories) + " ") + (if igrep-find-prune-options + (format "-type d %c( %s %c) -prune -o" + (or igrep-parenthesis-escape-char ? ) + igrep-find-prune-options + (or igrep-parenthesis-escape-char ? )) + "") + (if igrep-find-file-options + (format "%c( %s %c)" + (or igrep-parenthesis-escape-char ? ) + igrep-find-file-options + (or igrep-parenthesis-escape-char ? )) + "") + (if (listp patterns) + (if (cdr patterns) ; (> (length patterns) 1) + (format "%c( %s %c)" + (or igrep-parenthesis-escape-char " ") + (mapconcat (function (lambda (pat) + (format "-name \"%s\"" pat))) + (nreverse patterns) + " -o ") + (or igrep-parenthesis-escape-char " ")) + (format "-name \"%s\"" (car patterns))) + "") + command))) + +(defun igrep-read-args (&optional no-files) + ;; Read and return a list: (PROGRAM EXPRESSION FILES OPTIONS). + ;; If NO-FILES is non-nil, then FILES is not read and nil is returned + ;; in its place. + (let* ((program (igrep-read-program (if igrep-verbose-prompts + (if igrep-find + "[find] ")))) + (prompt-prefix (if igrep-verbose-prompts + (apply (function concat) + (if igrep-find + "[find] ") + (if (eq igrep-verbose-prompts t) + (list program " "))))) + (options (igrep-read-options prompt-prefix))) + (if (eq igrep-verbose-prompts t) + (setq prompt-prefix + (concat prompt-prefix options " "))) + (list program + (igrep-read-expression prompt-prefix) + (if (not no-files) + (igrep-read-files prompt-prefix)) + options))) + +(defsubst igrep-prefix (prefix string) + ;; If PREFIX is non-nil, concatenate it and STRING; otherwise, return STRING. + (if prefix + (concat prefix string) + string)) + +(defun igrep-read-program (&optional prompt-prefix) + ;; If igrep-program is nil, read and return a program name from the + ;; minibuffer; otherwise, return igrep-program. + ;; Optional PROMPT-PREFIX is prepended to the "Program: " prompt. + (or igrep-program + (let ((prompt "Program: ")) + (completing-read (igrep-prefix prompt-prefix prompt) igrep-program-table + nil t (or igrep-program-default "grep"))))) + +(defun igrep-read-options (&optional prompt-prefix) + ;; If current-prefix-arg is '(4) or '(64), read and return an options + ;; string from the minibuffer; otherwise, return igrep-options. + ;; Optional PROMPT-PREFIX is prepended to the "Options: " prompt. + (if (or igrep-read-options + (and (consp current-prefix-arg) + (memq (prefix-numeric-value current-prefix-arg) + '(4 64)))) + (let ((prompt "Options: ")) + (read-string (igrep-prefix prompt-prefix prompt) + (or igrep-options "-"))) + igrep-options)) + +(defun igrep-read-expression (&optional prompt-prefix) + ;; Read and return a `grep` expression string from the minibuffer. + ;; Optional PROMPT-PREFIX is prepended to the "Expression: " prompt. + (let ((default-expression (igrep-default-expression))) + (if (string= default-expression "") + (read-from-minibuffer (igrep-prefix prompt-prefix "Expression: ") + nil nil nil 'igrep-expression-history) + (let ((expression + (igrep-read-string-with-default-in-history + (igrep-prefix prompt-prefix (format "Expression (default %s): " + default-expression)) + default-expression + 'igrep-expression-history))) + (if (string= expression "") + default-expression + expression))))) + +(defun igrep-default-expression () + (if (eq major-mode 'dired-mode) + (let ((dired-file (dired-get-filename nil t))) + (save-excursion + (set-buffer (or (and dired-file (get-file-buffer dired-file)) + (other-buffer (current-buffer) t))) + (current-word))) + (current-word))) + +(defsubst igrep-default-key () + ;; Return the key bound to `exit-minibuffer', preferably "\r". + (if (eq (lookup-key minibuffer-local-completion-map "\r") + (function exit-minibuffer)) + "\r" + (where-is-internal (function exit-minibuffer) + minibuffer-local-completion-map + t))) + +(defun igrep-read-files (&optional prompt-prefix) + ;; Read and return a file name pattern from the minibuffer. If + ;; current-prefix-arg is '(16) or '(64), read multiple file name + ;; patterns and return them in a list. Optional PROMPT-PREFIX is + ;; prepended to the "File(s): " prompt. + (let* ((dired-subdirectory (if (eq major-mode 'dired-mode) + (dired-current-directory t))) + (default-files (concat dired-subdirectory + (igrep-default-file-pattern))) + (prompt (format "File(s) (default %s): " default-files)) + (insert-default-directory nil) ; use relative path names + (file (igrep-read-file-name-with-default-in-history + (igrep-prefix prompt-prefix prompt) + default-files + nil + 'igrep-files-history))) + (if (or igrep-read-multiple-files + (and (consp current-prefix-arg) + (memq (prefix-numeric-value current-prefix-arg) + '(16 64)))) + (let ((files (list file))) + (setq prompt + (igrep-prefix prompt-prefix + (if igrep-verbose-prompts + (format "File(s): [Type `%s' when done] " + (key-description (igrep-default-key))) + "File(s): "))) + (while (not (string= (setq file + (igrep-read-file-name prompt + nil "" nil nil + 'igrep-files-history)) + "")) + (setq files (cons file files))) + (nreverse files)) + file))) + +(defmacro igrep-with-default-in-history (default history &rest body) + ;; Temporarily append DEFAULT to HISTORY, and execute BODY forms. + (` (progn + ;; Append default to history: + (set history + (cons (, default) + (if (boundp (, history)) + (symbol-value (, history)) + '()))) + (unwind-protect ; Make sure the history is restored. + ;; Execute body: + (progn (,@ body)) + ;; Delete default from history (undo the append above): + (setcdr (symbol-value (, history)) + (nthcdr 2 (symbol-value (, history)))))))) + +(defun igrep-read-string-with-default-in-history (prompt default history) + ;; Read a string from the minibuffer, prompting with string PROMPT. + ;; DEFAULT can be inserted into the minibuffer with `previous- + ;; history-element'; HISTORY is a symbol whose value (if bound) is a + ;; list of previous results, most recent first. + (let ((string (igrep-with-default-in-history default history + (read-from-minibuffer prompt nil nil nil history)))) + ;; Replace empty string in history with default: + (if (string= string "") + (setcar (symbol-value history) default)) + string)) + +(defun igrep-read-file-name-with-default-in-history + (prompt &optional default initial history) + ;; Read a file name from the minibuffer, prompting with string PROMPT. + ;; DEFAULT can be inserted into the minibuffer with `previous- + ;; history-element'; HISTORY is a symbol whose value (if any) is a + ;; list of previous results, most recent first. + (igrep-with-default-in-history default history + (igrep-read-file-name prompt nil default nil initial history))) + +(defun igrep-read-file-name (prompt + &optional directory default existing initial history) + ;; Just like read-file-name, but with optional HISTORY. + ;; Also: convert DIRECTORY to DIRECTORY/* file name pattern. + (let ((file-name + (if history + (let ((file-name-history (symbol-value history))) + (prog1 (read-file-name prompt directory default existing initial) + (set history file-name-history))) + (read-file-name prompt directory default existing initial)))) + (if (and (not (string-equal file-name "")) + (file-directory-p file-name)) + (expand-file-name "*" file-name) + file-name))) + +(defun igrep-default-file-pattern () + ;; Return a shell file name pattern that matches files with the same + ;; extension as the file being visited in the current buffer. + ;; (Based on other-possibly-interesting-files in ~/as-is/unix.el, by + ;; Wolfgang Rupprecht <wolfgang@mgm.mit.edu>.) + (if (eq major-mode 'dired-mode) + (cond ((stringp dired-directory) + (if (file-directory-p dired-directory) + "*" + (file-name-nondirectory dired-directory))) ; wildcard + ((consp dired-directory) ; (DIR FILE ...) + (mapconcat 'identity (cdr dired-directory) " "))) + (if buffer-file-name + (let ((file-name (file-name-nondirectory buffer-file-name))) + (concat "*" + (save-match-data + (if (string-match "\\.[^.]+\\(\\.g?[zZ]\\)?$" file-name) + (substring file-name + (match-beginning 0) (match-end 0)))))) + "*"))) + +;;; Local Variables: +;;; eval: (put 'igrep-with-default-in-history 'lisp-indent-hook 2) +;;; eval: (put 'igrep-define 'lisp-indent-hook 1) +;;; eval: (put 'igrep-find-define 'lisp-indent-hook 1) +;;; End: + +;;;; igrep.el ends here +
--- a/lisp/packages/ispell.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/packages/ispell.el Mon Aug 13 09:15:11 2007 +0200 @@ -1270,7 +1270,8 @@ (enlarge-window 2) ;; Make sure we display the minibuffer ;; in this window, not some other. - (set-minibuffer-window (selected-window)) + (if (fboundp 'set-minibuffer-window) + (set-minibuffer-window (selected-window))) (insert (concat help-1 "\n" help-2 "\n" help-3)))) (sit-for 5) (erase-buffer)))))
--- a/lisp/packages/lazy-lock.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/packages/lazy-lock.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,17 +1,10 @@ ;;; lazy-lock.el --- Lazy demand-driven fontification for fast Font Lock mode. -;; Copyright (C) 1994, 1995 Free Software Foundation, Inc. +;; Copyright (C) 1994, 1995, 1997 Free Software Foundation, Inc. ;; Author: Simon Marshall <simon@gnu.ai.mit.edu> ;; Keywords: faces files -;; Version: 1.15 - -;; LCD Archive Entry: -;; lazy-lock|Simon Marshall|simon@gnu.ai.mit.edu| -;; Lazy Font Lock mode (with fast demand-driven fontification).| -;; 13-Nov-95|1.15|~/modes/lazy-lock.el.Z| - -;; The archive is archive.cis.ohio-state.edu in /pub/gnu/emacs/elisp-archive. +;; Version: 1.16 ;;; This file is part of GNU Emacs. @@ -26,8 +19,9 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. ;;; Commentary: @@ -106,8 +100,107 @@ ;; These kinds of things with `advice' aren't done automatically because they ;; cause large packages (advice.el plus bytecomp.el and friends) to be loaded. +;; Implementation differences with version 2: +;; +;; - Version 1 of lazy-lock.el is a bit of a hack. Version 1 demand-driven +;; fontification, the core feature of lazy-lock.el, is implemented by placing a +;; function on `post-command-hook'. This function fontifies where necessary, +;; i.e., where a window scroll has occurred. However, there are a number of +;; problems with using `post-command-hook': +;; +;; (a) As the name suggests, `post-command-hook' is run after every command, +;; i.e., frequently and regardless of whether scrolling has occurred. +;; (b) Scrolling can occur during a command, when `post-command-hook' is not +;; run, i.e., it is not necessarily run after scrolling has occurred. +;; (c) When `post-command-hook' is run, there is nothing to suggest where +;; scrolling might have occurred, i.e., which windows have scrolled. +;; +;; Thus lazy-lock.el's function is called almost as often as possible, usually +;; when it need not be called, yet it is not always called when it is needed. +;; Also, lazy-lock.el's function must check each window to see if a scroll has +;; occurred there. Worse still, lazy-lock.el's function must fontify a region +;; twice as large as necessary to make sure the window is completely fontified. +;; Basically, `post-command-hook' is completely inappropriate for lazy-lock.el. +;; +;; Ideally, we want to attach lazy-lock.el's function to a hook that is run +;; only when scrolling occurs, e.g., `window-start' has changed, and tells us +;; as much information as we need, i.e., the window and its new buffer region. +;; Richard Stallman implemented a `window-scroll-functions' for Emacs 19.30. +;; Functions on it are run when `window-start' has changed, and are supplied +;; with the window and the window's new `window-start' position. (It would be +;; better if it also supplied the window's new `window-end' position, but that +;; is calculated as part of the redisplay process, and the functions on +;; `window-scroll-functions' are run before redisplay has finished.) Thus, the +;; hook deals with the above problems (a), (b) and (c). +;; +;; If only life was that easy. Version 2 demand-driven fontification is mostly +;; implemented by placing a function on `window-scroll-functions'. However, +;; not all scrolling occurs when `window-start' has changed. A change in +;; window size, e.g., via C-x 1, or a significant deletion, e.g., of a number +;; of lines, causes text previously invisible (i.e., after `window-end') to +;; become visible without changing `window-start'. Arguably, these events are +;; not scrolling events, but fontification must occur for lazy-lock.el to work. +;; Hooks `window-size-change-functions' and `redisplay-end-trigger-functions' +;; were added for these circumstances. +;; +;; (Ben Wing thinks these hooks are "horribly horribly kludgy", and implemented +;; a `pre-idle-hook', a `mother-of-all-post-command-hooks', for XEmacs 19.14. +;; He then hacked up a version 1 lazy-lock.el to use `pre-idle-hook' rather +;; than `post-command-hook'. Whereas functions on `post-command-hook' are +;; called almost as often as possible, functions on `pre-idle-hook' really are +;; called as often as possible, even when the mouse moves and, on some systems, +;; while XEmacs is idle. Thus, the hook deals with the above problem (b), but +;; unfortunately it makes (a) worse and does not address (c) at all. +;; +;; I freely admit that `redisplay-end-trigger-functions' and, to a much lesser +;; extent, `window-size-change-functions' are not pretty. However, I feel that +;; a `window-scroll-functions' feature is cleaner than a `pre-idle-hook', and +;; the result is faster and smaller, less intrusive and more targeted, code. +;; Since `pre-idle-hook' is pretty much like `post-command-hook', there is no +;; point in making this version of lazy-lock.el work with it. Anyway, that's +;; Lit 30 of my humble opinion. +;; +;; Steve Baur reverted to a non-hacked version 1 lazy-lock.el for XEmacs 19.15 +;; and 20.0. Obviously, the above `post-command-hook' problems still apply.) +;; +;; - Version 1 stealth fontification is also implemented by placing a function +;; on `post-command-hook'. This function waits for a given amount of time, +;; and, if Emacs remains idle, fontifies where necessary. Again, there are a +;; number of problems with using `post-command-hook': +;; +;; (a) Functions on `post-command-hook' are run sequentially, so this function +;; can interfere with other functions on the hook, and vice versa. +;; (b) This function waits for a given amount of time, so it can interfere with +;; various features that are dealt with by Emacs after a command, e.g., +;; region highlighting, asynchronous updating and keystroke echoing. +;; (c) Fontification may be required during a command, when `post-command-hook' +;; is not run. (Version 2 deferred fontification only.) +;; +;; Again, `post-command-hook' is completely inappropriate for lazy-lock.el. +;; Richard Stallman and Morten Welinder implemented internal Timers and Idle +;; Timers for Emacs 19.31. Functions can be run independently at given times +;; or after given amounts of idle time. Thus, the feature deals with the above +;; problems (a), (b) and (c). Version 2 deferral and stealth are implemented +;; by functions on Idle Timers. (A function on XEmacs' `pre-idle-hook' is +;; similar to an Emacs Idle Timer function with a fixed zero second timeout.) +;; +;; - Version 1 has the following problems (relative to version 2): +;; +;; (a) It is slow when it does its job. +;; (b) It does not always do its job when it should. +;; (c) It slows all interaction (when it doesn't need to do its job). +;; (d) It interferes with other package functions on `post-command-hook'. +;; (e) It interferes with Emacs things within the read-eval loop. +;; +;; Ben's hacked-up lazy-lock.el 1.14 almost solved (b) but made (c) worse. +;; +;; - Version 2 has the following additional features (relative to version 1): +;; +;; (a) It can defer fontification (both on-the-fly and on-scrolling). +;; (b) It can fontify contextually (syntactically true on-the-fly). + ;; Caveats: -;; + ;; Lazy Lock mode does not work efficiently with Outline mode. This is because ;; when in Outline mode, although text may be hidden (not visible in the ;; window), the text is visible to Emacs Lisp code (not surprisingly) and Lazy @@ -160,201 +253,179 @@ ;; ;; For XEmacs 19.11 and Lucid Emacs 19.10 users, lazy-lock sort-of works. ;; There are bugs in text property and point/window primatives. Upgrade! - -;; Feedback: ;; -;; Feedback is welcome. -;; To submit a bug report (or make comments) please use the mechanism provided: -;; -;; M-x lazy-lock-submit-bug-report RET +;; Currently XEmacs does not have the features to support version 2 of +;; lazy-lock.el. Maybe it will one day. ;; History: ;; ;; 0.01--1.00: ;; - Changed name from fore-lock to lazy-lock. Shame though. ;; - Dropped `advice'-wrapping completely. Ask me if you're interested in it. -;; - Made `lazy-lock-mode' ignore `post-command-hook' and `buffer-file-name'. -;; - Made `lazy-lock-fontify-window' check `lazy-lock-mode' and `this-command'. -;; - Made `lazy-lock-fontify-window' redisplay via `sit-for'. -;; - Added `lazy-lock-minimum-size' to control `lazy-lock-mode'. +;; - Made `lazy-lock-mode' ignore `post-command-hook' and `buffer-file-name' +;; - Made `lazy-lock-fontify-window' check `lazy-lock-mode' and `this-command' +;; - Made `lazy-lock-fontify-window' redisplay via `sit-for' +;; - Added `lazy-lock-minimum-size' to control `lazy-lock-mode' ;; 1.00--1.01: -;; - Added `lazy-lock-fontify-buffer'. -;; - Made `lazy-lock-fontify-window' ignore `lazy-lock-mode'. -;; - Made `lazy-lock-fontify-window' suspicious of `window-' favourites again. -;; - Added `lazy-lock-delay-commands' (idea from William G. Dubuque). -;; - Added `lazy-lock-ignore-commands' for completeness. -;; - Added `lazy-lock-continuity-time' for normal input delay. +;; - Added `lazy-lock-fontify-buffer' +;; - Made `lazy-lock-fontify-window' ignore `lazy-lock-mode' +;; - Made `lazy-lock-fontify-window' suspicious of `window-' favourites again +;; - Added `lazy-lock-delay-commands' (idea from William G. Dubuque) +;; - Added `lazy-lock-ignore-commands' for completeness +;; - Added `lazy-lock-continuity-time' for normal input delay ;; 1.01--1.02: -;; - Made `lazy-lock-fontify-window' cope with multiple unfontified regions. -;; - Made `lazy-lock-mode' remove `fontified' properties if turned off. -;; - Made `lazy-lock-fontify-window' fontify by lines. -;; - Added `lazy-lock-cache-position' buffer local to detect visibility change. -;; - Added `lazy-lock-post-command-hook' to do the waiting. -;; - Made `lazy-lock-fontify-window' just do the fontification. -;; - Made `lazy-lock-mode' append `lazy-lock-post-command-hook'. -;; - Added `lazy-lock-walk-windows' to hack multi-window motion. -;; - Made `lazy-lock-post-command-hook' `walk-windows' if variable is non-nil. -;; - Removed `lazy-lock-ignore-commands' since insertion may change window. -;; - Added `lazy-lock-fontify-stealthily' and `lazy-lock-stealth-time'. -;; - Made `lazy-lock-post-command-hook' use them. +;; - Made `lazy-lock-fontify-window' cope with multiple unfontified regions +;; - Made `lazy-lock-mode' remove `fontified' properties if turned off +;; - Made `lazy-lock-fontify-window' fontify by lines +;; - Added `lazy-lock-cache-position' buffer local to detect visibility change +;; - Added `lazy-lock-post-command-hook' to do the waiting +;; - Made `lazy-lock-fontify-window' just do the fontification +;; - Made `lazy-lock-mode' append `lazy-lock-post-command-hook' +;; - Added `lazy-lock-walk-windows' to hack multi-window motion +;; - Made `lazy-lock-post-command-hook' `walk-windows' if variable is non-nil +;; - Removed `lazy-lock-ignore-commands' since insertion may change window +;; - Added `lazy-lock-fontify-stealthily' and `lazy-lock-stealth-time' +;; - Made `lazy-lock-post-command-hook' use them ;; 1.02--1.03: -;; - Made `lazy-lock-fontify-stealthily' do `forward-line' not `previous-line'. -;; - Made `lazy-lock-fontify-stealthily' `move-to-window-line' first. -;; - Made `lazy-lock-fontify-stealthily' use `text-property-any' for region. -;; - Made `lazy-lock-post-command-hook' loop on `lazy-lock-fontify-stealthily'. +;; - Made `lazy-lock-fontify-stealthily' do `forward-line' not `previous-line' +;; - Made `lazy-lock-fontify-stealthily' `move-to-window-line' first +;; - Made `lazy-lock-fontify-stealthily' use `text-property-any' for region +;; - Made `lazy-lock-post-command-hook' loop on `lazy-lock-fontify-stealthily' ;; 1.03--1.04: -;; - Made `lazy-lock-mode' reset `lazy-lock-cache-position'. -;; - Made `lazy-lock-post-command-hook' `widen' for `if' `text-property-any'. -;; - Made `lazy-lock-fontify-stealthily' return `text-property-any'. -;; - Added `lazy-lock-percent-fontified' for a/be-musement. -;; - Made `lazy-lock-post-command-hook' use it. -;; - Made `lazy-lock-mode' use `make-local-hook' etc. if available. -;; - Made `lazy-lock-mode' use `before-revert-hook' and `after-revert-hook'. -;; - Made `lazy-lock-post-command-hook' protect `deactivate-mark'. -;; - Adds `lazy-lock-post-command-hook' globally to `post-command-hook'. +;; - Made `lazy-lock-mode' reset `lazy-lock-cache-position' +;; - Made `lazy-lock-post-command-hook' `widen' for `if' `text-property-any' +;; - Made `lazy-lock-fontify-stealthily' return `text-property-any' +;; - Added `lazy-lock-percent-fontified' for a/be-musement +;; - Made `lazy-lock-post-command-hook' use it +;; - Made `lazy-lock-mode' use `make-local-hook' etc. if available +;; - Made `lazy-lock-mode' use `before-revert-hook' and `after-revert-hook' +;; - Made `lazy-lock-post-command-hook' protect `deactivate-mark' +;; - Adds `lazy-lock-post-command-hook' globally to `post-command-hook' ;; 1.04--1.05: -;; - Made `lazy-lock-mode' test `make-local-hook' not `emacs-minor-version'. +;; - Made `lazy-lock-mode' test `make-local-hook' not `emacs-minor-version' ;; 1.05--1.06: -;; - Added `lazy-lock-ignore-commands' for commands that leave no event but do. -;; - Made `lazy-lock-post-command-hook' check `lazy-lock-ignore-commands'. +;; - Added `lazy-lock-ignore-commands' for commands that leave no event but do +;; - Made `lazy-lock-post-command-hook' check `lazy-lock-ignore-commands' ;; 1.06--1.07: -;; - Removed `before-revert-hook' and `after-revert-hook' use. +;; - Removed `before-revert-hook' and `after-revert-hook' use ;; 1.07--1.08: -;; - Added `lazy-lock-submit-bug-report'. -;; - Made `lazy-lock-post-command-hook' check `executing-macro'. -;; - Made it sort-of/almost work for XEmacs (help from Jonas Jarnestrom). -;; - XEmacs: Fix `text-property-not-all' (fix based on fast-lock.el 3.05 fix). -;; - XEmacs: Set `font-lock-no-comments' and alias `frame-parameters'. -;; - Made `byte-compile-warnings' omit `unresolved' on compilation. -;; - Made `lazy-lock-post-command-hook' protect `buffer-undo-list'. -;; - Moved `deactivate-mark' and `buffer-undo-list' protection to functions. -;; - Added `lazy-lock-invisible-foreground' (idea from Boris Goldowsky). -;; - XEmacs: Fix to use `text-property-not-all' t, not `text-property-any' nil. -;; - Made `lazy-lock-percent-fontified' return `round' to an integer. -;; - XEmacs: Fix `text-property-any' (fix and work around for a bug elsewhere). -;; - XEmacs: Fix `lazy-lock-submit-bug-report' for reporter.el & vm-window.el. -;; - XEmacs: Made `lazy-lock-fontify-window' loop `while' `<' not `/='. -;; - Use `font-lock-after-change-function' to do the fontification. +;; - Added `lazy-lock-submit-bug-report' +;; - Made `lazy-lock-post-command-hook' check `executing-macro' +;; - Made it sort-of/almost work for XEmacs (help from Jonas Jarnestrom) +;; - XEmacs: Fix `text-property-not-all' (fix based on fast-lock.el 3.05 fix) +;; - XEmacs: Set `font-lock-no-comments' and alias `frame-parameters' +;; - Made `byte-compile-warnings' omit `unresolved' on compilation +;; - Made `lazy-lock-post-command-hook' protect `buffer-undo-list' +;; - Moved `deactivate-mark' and `buffer-undo-list' protection to functions +;; - Added `lazy-lock-invisible-foreground' (idea from Boris Goldowsky) +;; - XEmacs: Fix to use `text-property-not-all' t, not `text-property-any' nil +;; - Made `lazy-lock-percent-fontified' return `round' to an integer +;; - XEmacs: Fix `text-property-any' (fix and work around for a bug elsewhere) +;; - XEmacs: Fix `lazy-lock-submit-bug-report' for reporter.el & vm-window.el +;; - XEmacs: Made `lazy-lock-fontify-window' loop `while' `<' not `/=' +;; - Use `font-lock-after-change-function' to do the fontification ;; 1.08--1.09: -;; - Made `lazy-lock-post-command-hook' protect with `condition-case'. -;; - Made `lazy-lock-cache-start' to cache `window-start'. -;; - Made `lazy-lock-fontify-window' check and cache `lazy-lock-cache-start'. -;; - Renamed `lazy-lock-cache-position' to `lazy-lock-cache-end'. -;; - XEmacs: Fix for `font-lock-after-change-function'. -;; - Adds `lazy-lock-post-command-hook' globally to `window-setup-hook'. +;; - Made `lazy-lock-post-command-hook' protect with `condition-case' +;; - Made `lazy-lock-cache-start' to cache `window-start' +;; - Made `lazy-lock-fontify-window' check and cache `lazy-lock-cache-start' +;; - Renamed `lazy-lock-cache-position' to `lazy-lock-cache-end' +;; - XEmacs: Fix for `font-lock-after-change-function' +;; - Adds `lazy-lock-post-command-hook' globally to `window-setup-hook' ;; 1.09--1.10: -;; - Made `buffer-file-name' be `let' to prevent supersession (Kevin Broadey). -;; - Made `lazy-lock-submit-bug-report' `require' reporter (Ilya Zakharevich). -;; - Made `lazy-lock-mode' and `turn-on-lazy-lock' succeed `autoload' cookies. -;; - Added `lazy-lock-fontify-walk-windows' for walking window fontification. -;; - Added `lazy-lock-fontify-walk-stealthily' for walking stealth. -;; - Removed `move-to-window-line' from `lazy-lock-fontify-stealthily'. -;; - Made `lazy-lock-percent-fontified' use `truncate' rather than `round'. -;; - Added other `*-argument' to `lazy-lock-ignore-commands' (Kevin Broadey). -;; - Made `lazy-lock-fontify-stealthily' not assume buffer is part `fontified'. -;; - Emacs: Fix for `font-lock-fontify-region'. -;; - Made `lazy-lock-post-command-hook' check for minibuffer (Kevin Broadey). -;; - Added `lazy-lock-stealth-nice' for niceness during stealth fontification. -;; - Added `lazy-lock-stealth-lines' for chunks of stealth fontification. +;; - Made `buffer-file-name' be `let' to prevent supersession (Kevin Broadey) +;; - Made `lazy-lock-submit-bug-report' `require' reporter (Ilya Zakharevich) +;; - Made `lazy-lock-mode' and `turn-on-lazy-lock' succeed `autoload' cookies +;; - Added `lazy-lock-fontify-walk-windows' for walking window fontification +;; - Added `lazy-lock-fontify-walk-stealthily' for walking stealth +;; - Removed `move-to-window-line' from `lazy-lock-fontify-stealthily' +;; - Made `lazy-lock-percent-fontified' use `truncate' rather than `round' +;; - Added other `*-argument' to `lazy-lock-ignore-commands' (Kevin Broadey) +;; - Made `lazy-lock-fontify-stealthily' not assume buffer is part `fontified' +;; - Emacs: Fix for `font-lock-fontify-region' +;; - Made `lazy-lock-post-command-hook' check for minibuffer (Kevin Broadey) +;; - Added `lazy-lock-stealth-nice' for niceness during stealth fontification +;; - Added `lazy-lock-stealth-lines' for chunks of stealth fontification ;; 1.10--1.11: incorporated hack by Ben Wing from William Dubuque's fontifly.el -;; - Made `lazy-lock-fontify-stealthily' see a non `fontified' preceding line. -;; - XEmacs: Fix `text-property-any' and `text-property-not-all' (Ben Wing). -;; - XEmacs: Fix `lazy-lock-continuity-time' (Ben Wing). -;; - Added awful `lazy-lock-running-xemacs-p' (Ben Wing). -;; - Made loading set `emacs-minor-version' if it's not bound. -;; - Added `lazy-lock-hide-invisible' to control redisplay. -;; - Made `lazy-lock-post-command-hook' use it in `sit-for' (Ben Wing). -;; - Made `lazy-lock-fontify-window' move relative to `end-of-line' if non-nil. -;; - Added `lazy-lock-fontify-region' so packages can ensure fontification. -;; - Made `lazy-lock-fontify-walk-stealthily' do stealth widening. -;; - Made `lazy-lock-fontify-stealthily' always do adjacent preceding regions. -;; - Added `lazy-lock-after-fontify-buffer'. -;; - XEmacs: Removed `font-lock-no-comments' incompatibility code. -;; - Removed `lazy-lock-delay-time' and `lazy-lock-delay-commands'. -;; - Removed `lazy-lock-post-command' and split the functionality. -;; - Adds `lazy-lock-post-command-fontify-windows' on first. -;; - Adds `lazy-lock-post-command-fontify-stealthily' on last. -;; - Made `lazy-lock-mode' ensure both first and last on `post-command-hook'. -;; - Made `lazy-lock-mode' ensure `font-lock-mode' is on. -;; - Wrap `lazy-lock-post-command-fontify-stealthily' for errors (David Karr). -;; - Added `calcDigit-key' to `lazy-lock-ignore-commands' (Bob Glickstein). -;; - Wrap `lazy-lock-running-xemacs-p' with `eval-and-compile' (Erik Naggum). -;; - XEmacs: Fix use of `previous-single-property-change' (Jim Thompson). -;; - XEmacs: Fix `next-single-property-change' fix for 19.11 (Jim Thompson). -;; - Added `lazy-lock-post-resize-fontify-windows' to fontify on resizing. -;; - Adds globally to `window-size-change-functions'. -;; - Added `lazy-lock-post-setup-fontify-windows' to fontify after start up. -;; - Adds globally to `window-setup-hook'. -;; - Made `lazy-lock-post-command-fontify-windows' check for `input-pending-p'. -;; - Made `save-selected-window' to restore the `selected-window'. -;; - Use `save-selected-window' rather than `save-window-excursion'. +;; - Made `lazy-lock-fontify-stealthily' see a non `fontified' preceding line +;; - XEmacs: Fix `text-property-any' and `text-property-not-all' (Ben Wing) +;; - XEmacs: Fix `lazy-lock-continuity-time' (Ben Wing) +;; - Added awful `lazy-lock-running-xemacs-p' (Ben Wing) +;; - Made loading set `emacs-minor-version' if it's not bound +;; - Added `lazy-lock-hide-invisible' to control redisplay +;; - Made `lazy-lock-post-command-hook' use it in `sit-for' (Ben Wing) +;; - Made `lazy-lock-fontify-window' move relative to `end-of-line' if non-nil +;; - Added `lazy-lock-fontify-region' so packages can ensure fontification +;; - Made `lazy-lock-fontify-walk-stealthily' do stealth widening +;; - Made `lazy-lock-fontify-stealthily' always do adjacent preceding regions +;; - Added `lazy-lock-after-fontify-buffer' +;; - XEmacs: Removed `font-lock-no-comments' incompatibility code +;; - Removed `lazy-lock-delay-time' and `lazy-lock-delay-commands' +;; - Removed `lazy-lock-post-command' and split the functionality +;; - Adds `lazy-lock-post-command-fontify-windows' on first +;; - Adds `lazy-lock-post-command-fontify-stealthily' on last +;; - Made `lazy-lock-mode' ensure both first and last on `post-command-hook' +;; - Made `lazy-lock-mode' ensure `font-lock-mode' is on +;; - Wrap `lazy-lock-post-command-fontify-stealthily' for errors (David Karr) +;; - Added `calcDigit-key' to `lazy-lock-ignore-commands' (Bob Glickstein) +;; - Wrap `lazy-lock-running-xemacs-p' with `eval-and-compile' (Erik Naggum) +;; - XEmacs: Fix use of `previous-single-property-change' (Jim Thompson) +;; - XEmacs: Fix `next-single-property-change' fix for 19.11 (Jim Thompson) +;; - Added `lazy-lock-post-resize-fontify-windows' to fontify on resizing +;; - Adds globally to `window-size-change-functions' +;; - Added `lazy-lock-post-setup-fontify-windows' to fontify after start up +;; - Adds globally to `window-setup-hook' +;; - Made `lazy-lock-post-command-fontify-windows' check for `input-pending-p' +;; - Made `save-selected-window' to restore the `selected-window' +;; - Use `save-selected-window' rather than `save-window-excursion' ;; 1.11--1.12: -;; - Made `lazy-lock-post-command-fontify-windows' do `set-buffer' first. -;; - Made `lazy-lock-fontify-stealthily' respect narrowing before point. -;; - Added `lazy-lock-post-setup-ediff-control-frame' for Ediff control frame. -;; - Adds globally to `ediff-after-setup-control-frame-hooks'. -;; - Wrap `save-selected-window' with `save-excursion' for `current-buffer'. +;; - Made `lazy-lock-post-command-fontify-windows' do `set-buffer' first +;; - Made `lazy-lock-fontify-stealthily' respect narrowing before point +;; - Added `lazy-lock-post-setup-ediff-control-frame' for Ediff control frame +;; - Adds globally to `ediff-after-setup-control-frame-hooks' +;; - Wrap `save-selected-window' with `save-excursion' for `current-buffer' ;; 1.12--1.13: -;; - XEmacs: Add `lazy-lock-after-fontify-buffer' to the Font Lock hook. -;; - Made `buffer-file-truename' also wrapped for supersession (Rick Sladkey). -;; - Made `font-lock-beginning-of-syntax-function' wrapped for fontification. -;; - Added `lazy-lock-stealth-verbose' (after harassment from Ben Wing). -;; - XEmacs: Made `font-lock-verbose' wrapped for stealth fontification. +;; - XEmacs: Add `lazy-lock-after-fontify-buffer' to the Font Lock hook +;; - Made `buffer-file-truename' also wrapped for supersession (Rick Sladkey) +;; - Made `font-lock-beginning-of-syntax-function' wrapped for fontification +;; - Added `lazy-lock-stealth-verbose' (after harassment from Ben Wing) +;; - XEmacs: Made `font-lock-verbose' wrapped for stealth fontification ;; 1.13--1.14: -;; - Wrap `lazy-lock-colour-invisible' for `set-face-foreground' (Jari Aalto). +;; - Wrap `lazy-lock-colour-invisible' for `set-face-foreground' (Jari Aalto) ;; 1.14--1.15: -;; - Made `lazy-lock-post-command-setup'; may add to `post-command-idle-hook'. +;; - Made `lazy-lock-post-command-setup'; may add to `post-command-idle-hook' +;; 1.15--1.16: +;; - Test `emacs-major-version' as well as `emacs-minor-version' +;; - Barf if Emacs 19.30 or up is running +;; - Adds globally to `ediff-after-setup-control-frame-hook' too +;; - Renamed `lazy-lock-running-xemacs-p' to `lazy-lock-running-xemacs' +;; - Removed `lazy-lock-submit-bug-report' and bade farewell +;;; Code: + (require 'font-lock) -(eval-when-compile - ;; Only `require' so `ediff-multiframe-setup-p' is expanded at compile time. - (condition-case nil (require 'ediff) (file-error)) - ;; Well, shouldn't Lazy Lock be as lazy as possible? - ;(setq byte-compile-dynamic t byte-compile-dynamic-docstrings t) - ;; Shut Emacs' byte-compiler up (cf. stop me getting mail from users). - (setq byte-compile-warnings '(free-vars callargs redefine))) +;; Make sure lazy-lock.el isn't depreciated. +(if (if (save-match-data (string-match "Lucid\\|XEmacs" (emacs-version))) + nil + (or (> emacs-major-version 19) (> emacs-minor-version 29))) + (error "`lazy-lock' version 2 should be used for Emacs 19.30 or later")) -(defun lazy-lock-submit-bug-report () - "Submit via mail a bug report on lazy-lock.el." - (interactive) - (require 'reporter) - (let ((reporter-prompt-for-summary-p t)) - (reporter-submit-bug-report "simon@gnu.ai.mit.edu" "lazy-lock 1.15" - '(lazy-lock-walk-windows lazy-lock-continuity-time - lazy-lock-stealth-time lazy-lock-stealth-nice - lazy-lock-stealth-lines lazy-lock-stealth-verbose - lazy-lock-hide-invisible lazy-lock-invisible-foreground - lazy-lock-minimum-size lazy-lock-ignore-commands) - nil nil - (concat "Hi Si., +(eval-when-compile + ;; + ;; We don't do this at the top-level as we only use non-autoloaded macros. + (require 'cl) + ;; + ;; Well, shouldn't Lazy Lock be as lazy as possible? + (setq byte-compile-dynamic t byte-compile-dynamic-docstrings t)) -I want to report a bug. I've read the `Bugs' section of `Info' on Emacs, so I -know how to make a clear and unambiguous report. To reproduce the bug: - -Start a fresh Emacs via `" invocation-name " -no-init-file -no-site-file'. -In the `*scratch*' buffer, evaluate:")))) - -;; Let's define `emacs-minor-version' if no-one else has. -(if (not (boundp 'emacs-minor-version)) - (eval-and-compile - (defconst emacs-minor-version - (save-match-data - (string-match "^[0-9]+\\.\\([0-9]+\\)" emacs-version) - (string-to-int - (substring emacs-version (match-beginning 1) (match-end 1))))))) - -;; Yuck, but we make so much use of this variable it's probably worth it. (eval-and-compile - (defconst lazy-lock-running-xemacs-p + ;; Yuck, but we make so much use of this variable it's probably worth it. + (defconst lazy-lock-running-xemacs (not (null (save-match-data (string-match "Lucid" emacs-version)))))) (defvar lazy-lock-cache-start nil) ; for window fontifiction (defvar lazy-lock-cache-end nil) ; for window fontifiction (defvar lazy-lock-cache-continue nil) ; for stealth fontifiction - -;; XEmacs change -;;;###autoload (defvar lazy-lock-mode nil) ; for modeline ;; User Variables: @@ -371,9 +442,12 @@ ;; XEmacs 19.11 and below exercise a bug in the Xt event loop. (defvar lazy-lock-continuity-time - (if (or (not lazy-lock-running-xemacs-p) (> emacs-minor-version 11)) - 0 - (if (featurep 'lisp-float-type) 0.001 1)) + (cond ((not lazy-lock-running-xemacs) + 0) + ((and (= emacs-major-version 19) (< emacs-minor-version 12)) + (if (featurep 'lisp-float-type) (/ (float 1) (float 1000)) 1)) + (t + 0)) "*Time in seconds to delay before normal window fontification. Window fontification occurs if there is no input within this time.") @@ -381,25 +455,28 @@ ;; `text-property-any', `text-property-not-all' and ;; `next-single-property-change' up to XEmacs 19.11 are too broke. (defvar lazy-lock-stealth-time - (if (> emacs-minor-version (if lazy-lock-running-xemacs-p 11 25)) 30) + (when (or (> emacs-major-version 19) + (and (not lazy-lock-running-xemacs) (> emacs-minor-version 25)) + (and lazy-lock-running-xemacs (> emacs-minor-version 11))) + 30) "*Time in seconds to delay before beginning stealth fontification. Stealth fontification occurs if there is no input within this time. If nil, means no fontification by stealth.") (defvar lazy-lock-stealth-lines - (cond ((boundp 'font-lock-maximum-decoration) - (if font-lock-maximum-decoration 75 150)) - ((boundp 'font-lock-use-maximal-decoration) - (if font-lock-use-maximal-decoration 50 100)) - (t - 50)) + (if lazy-lock-running-xemacs + (if font-lock-maximum-decoration 50 100) + (if font-lock-maximum-decoration 100 250)) "*If non-nil, the maximum size of a chunk of stealth fontification. Each iteration of stealth fontification can fontify this number of lines. To speed up input response during stealth fontification, at the cost of stealth taking longer to fontify, you could reduce the value of this variable. If nil, means use `window-height' for the maximum chunk size.") -(defvar lazy-lock-stealth-nice (if (featurep 'lisp-float-type) 0.125 1) +(defvar lazy-lock-stealth-nice + (if lazy-lock-running-xemacs + (if (featurep 'lisp-float-type) (/ (float 1) (float 4)) 1) + (if (featurep 'lisp-float-type) (/ (float 1) (float 8)) 1)) "*Time in seconds to pause during chunks of stealth fontification. To reduce machine load during stealth fontification, at the cost of stealth taking longer to fontify, you could increase the value of this variable.") @@ -418,7 +495,7 @@ To speed up typing response, at the cost of Lazy Lock not fontifying when insertion causes scrolling, you could add `self-insert-command' to this list.") -(defvar lazy-lock-hide-invisible lazy-lock-running-xemacs-p +(defvar lazy-lock-hide-invisible lazy-lock-running-xemacs "*If non-nil, hide invisible text while it is fontified. If non-nil, redisplay is delayed until after fontification occurs. If nil, text is shown (in `lazy-lock-invisible-foreground') while it is fontified. @@ -484,12 +561,13 @@ "Unconditionally turn on Lazy Lock mode." (lazy-lock-mode 1)) -(if (< emacs-minor-version (if lazy-lock-running-xemacs-p 12 29)) - ;; We don't need this in Emacs 19.29 or XEmacs 19.12. - (defun lazy-lock-fontify-buffer () - "Fontify the current buffer where necessary." - (interactive) - (lazy-lock-fontify-region (point-min) (point-max)))) +(when (and (= emacs-major-version 19) + (< emacs-minor-version (if lazy-lock-running-xemacs 12 29))) + ;; We don't need this in Emacs 19.29 or XEmacs 19.12. + (defun lazy-lock-fontify-buffer () + "Fontify the current buffer where necessary." + (interactive) + (lazy-lock-fontify-region (point-min) (point-max)))) ;; API Functions: @@ -513,14 +591,13 @@ ;; Just a cleaner-looking way of coping with Emacs' and XEmacs' `sit-for'. (defmacro lazy-lock-sit-for (seconds &optional nodisp) - (if lazy-lock-running-xemacs-p + (if lazy-lock-running-xemacs (` (sit-for (, seconds) (, nodisp))) (` (sit-for (, seconds) 0 (, nodisp))))) ;; Using `save-window-excursion' provokes `window-size-change-functions'. ;; I prefer `save-walking-excursion', of course, because I have a warped mind. -(if (fboundp 'save-selected-window) - nil +(unless (fboundp 'save-selected-window) (eval-and-compile (defmacro save-selected-window (&rest body) "Execute the BODY forms, restoring the selected window. @@ -536,7 +613,7 @@ (defun lazy-lock-post-command-fontify-windows () ;; We might not be where we think we are, since `post-command-hook' is run ;; before `command_loop_1' makes sure we have the correct buffer selected. - (set-buffer (window-buffer)) +; (set-buffer (window-buffer)) ;; Do groovy things if (a) not in a macro, (b) no input pending, (c) got a ;; real command, (d) not in the minibuffer, and (e) no input after waiting ;; for `lazy-lock-continuity-time'. @@ -596,14 +673,15 @@ (defun lazy-lock-fontify-window () ;; Fontify the visible part of the buffer where necessary. - (let ((ws (if lazy-lock-hide-invisible - (save-excursion - (end-of-line) (forward-line (- (window-height))) (point)) - (min (max (window-start) (point-min)) (point-max)))) - (we (if lazy-lock-hide-invisible - (save-excursion - (end-of-line) (forward-line (window-height)) (point)) - (min (max (1- (window-end)) (point-min)) (point-max))))) + (let (ws we wh) + ;; Find the bounds of the visible part exactly or conservatively. + (if (not lazy-lock-hide-invisible) + (setq ws (min (max (window-start) (point-min)) (point-max)) + we (min (max (1- (window-end)) (point-min)) (point-max))) + (setq wh (window-height) ; Buggy: (window-displayed-height) + ws (save-excursion (forward-line (- wh)) (point)) + we (save-excursion (forward-line wh) (point)))) + ;; Find whether bounds have changed since previous fontification. (if (or (/= ws lazy-lock-cache-start) (/= we lazy-lock-cache-end)) ;; Find where we haven't `fontified' before. (let* ((start (or (text-property-not-all ws we 'fontified t) ws)) @@ -732,8 +810,8 @@ (setq end (or (text-property-not-all start max 'fontified t) max) size (+ size (- end start)) start end)) - ;; Saying "99% done" is probably better than "100% done" when it isn't. - (truncate (/ (* size 100.0) (buffer-size)))))) + ;; Float because using integer multiplication will frequently overflow. + (truncate (* (/ (float size) (point-max)) 100))))) (defun lazy-lock-colour-invisible () ;; Fontify the current buffer in `lazy-lock-invisible-face'. @@ -758,183 +836,183 @@ ;; Functions for Emacs: ;; This fix is for a number of bugs in the function in Emacs 19.28. -(if (and (not lazy-lock-running-xemacs-p) (< emacs-minor-version 29)) - (defun font-lock-fontify-region (start end &optional loudly) - "Put proper face on each string and comment between START and END." - (save-excursion - (save-restriction - (widen) - (goto-char start) - (beginning-of-line) - (if loudly (message "Fontifying %s... (syntactically...)" (buffer-name))) - (let ((inhibit-read-only t) (buffer-undo-list t) - buffer-file-name buffer-file-truename - (modified (buffer-modified-p)) - (old-syntax (syntax-table)) - (synstart (if comment-start-skip - (concat "\\s\"\\|" comment-start-skip) - "\\s\"")) - (comstart (if comment-start-skip - (concat "\\s<\\|" comment-start-skip) - "\\s<")) - (startline (point)) - state prev prevstate) - (unwind-protect - (progn - (if font-lock-syntax-table - (set-syntax-table font-lock-syntax-table)) - ;; Find the state at the line-beginning before START. - (if (eq startline font-lock-cache-position) - (setq state font-lock-cache-state) - ;; Find outermost containing sexp. - (beginning-of-defun) - ;; Find the state at STARTLINE. - (while (< (point) startline) - (setq state (parse-partial-sexp (point) startline 0))) - (setq font-lock-cache-state state - font-lock-cache-position (point))) - ;; Now find the state precisely at START. - (setq state (parse-partial-sexp (point) start nil nil state)) - ;; If the region starts inside a string, show the extent of it. - (if (nth 3 state) - (let ((beg (point))) - (while (and (re-search-forward "\\s\"" end 'move) - (nth 3 (parse-partial-sexp beg (point) nil nil - state)))) - (put-text-property beg (point) 'face font-lock-string-face) - (setq state (parse-partial-sexp beg (point) - nil nil state)))) - ;; Likewise for a comment. - (if (or (nth 4 state) (nth 7 state)) - (let ((beg (point))) - (save-restriction - (narrow-to-region (point-min) end) - (condition-case nil - (progn - (re-search-backward comstart (point-min) 'move) - (forward-comment 1) - ;; forward-comment skips all whitespace, - ;; so go back to the real end of the comment. - (skip-chars-backward " \t")) - (error (goto-char end)))) - (put-text-property beg (point) 'face - font-lock-comment-face) - (setq state (parse-partial-sexp beg (point) - nil nil state)))) - ;; Find each interesting place between here and END. - (while (and (< (point) end) - (setq prev (point) prevstate state) - (re-search-forward synstart end t) - (progn - ;; Clear out the fonts of what we skip over. - (remove-text-properties prev (point) '(face nil)) - ;; Verify the state at that place - ;; so we don't get fooled by \" or \;. - (setq state (parse-partial-sexp prev (point) - nil nil state)))) - (let ((here (point))) - (if (or (nth 4 state) (nth 7 state)) - ;; We found a real comment start. +(when (and (not lazy-lock-running-xemacs) + (= emacs-major-version 19) (< emacs-minor-version 28)) + (defun font-lock-fontify-region (start end &optional loudly) + "Put proper face on each string and comment between START and END." + (save-excursion + (save-restriction + (widen) + (goto-char start) + (beginning-of-line) + (if loudly (message "Fontifying %s... (syntactically...)" (buffer-name))) + (let ((inhibit-read-only t) (buffer-undo-list t) + buffer-file-name buffer-file-truename + (modified (buffer-modified-p)) + (old-syntax (syntax-table)) + (synstart (if comment-start-skip + (concat "\\s\"\\|" comment-start-skip) + "\\s\"")) + (comstart (if comment-start-skip + (concat "\\s<\\|" comment-start-skip) + "\\s<")) + (startline (point)) + state prev prevstate) + (unwind-protect + (progn + (if font-lock-syntax-table + (set-syntax-table font-lock-syntax-table)) + ;; Find the state at the line-beginning before START. + (if (eq startline font-lock-cache-position) + (setq state font-lock-cache-state) + ;; Find outermost containing sexp. + (beginning-of-defun) + ;; Find the state at STARTLINE. + (while (< (point) startline) + (setq state (parse-partial-sexp (point) startline 0))) + (setq font-lock-cache-state state + font-lock-cache-position (point))) + ;; Now find the state precisely at START. + (setq state (parse-partial-sexp (point) start nil nil state)) + ;; If the region starts inside a string, show the extent of it. + (if (nth 3 state) + (let ((beg (point))) + (while (and (re-search-forward "\\s\"" end 'move) + (nth 3 (parse-partial-sexp beg (point) nil nil + state)))) + (put-text-property beg (point) 'face font-lock-string-face) + (setq state (parse-partial-sexp beg (point) + nil nil state)))) + ;; Likewise for a comment. + (if (or (nth 4 state) (nth 7 state)) + (let ((beg (point))) + (save-restriction + (narrow-to-region (point-min) end) + (condition-case nil + (progn + (re-search-backward comstart (point-min) 'move) + (forward-comment 1) + ;; forward-comment skips all whitespace, + ;; so go back to the real end of the comment. + (skip-chars-backward " \t")) + (error (goto-char end)))) + (put-text-property beg (point) 'face + font-lock-comment-face) + (setq state (parse-partial-sexp beg (point) + nil nil state)))) + ;; Find each interesting place between here and END. + (while (and (< (point) end) + (setq prev (point) prevstate state) + (re-search-forward synstart end t) + (progn + ;; Clear out the fonts of what we skip over. + (remove-text-properties prev (point) '(face nil)) + ;; Verify the state at that place + ;; so we don't get fooled by \" or \;. + (setq state (parse-partial-sexp prev (point) + nil nil state)))) + (let ((here (point))) + (if (or (nth 4 state) (nth 7 state)) + ;; We found a real comment start. + (let ((beg (match-beginning 0))) + (goto-char beg) + (save-restriction + (narrow-to-region (point-min) end) + (condition-case nil + (progn + (forward-comment 1) + ;; forward-comment skips all whitespace, + ;; so go back to the real end of the comment. + (skip-chars-backward " \t")) + (error (goto-char end)))) + (put-text-property beg (point) 'face + font-lock-comment-face) + (setq state (parse-partial-sexp here (point) + nil nil state))) + (if (nth 3 state) (let ((beg (match-beginning 0))) - (goto-char beg) - (save-restriction - (narrow-to-region (point-min) end) - (condition-case nil - (progn - (forward-comment 1) - ;; forward-comment skips all whitespace, - ;; so go back to the real end of the comment. - (skip-chars-backward " \t")) - (error (goto-char end)))) + (while (and (re-search-forward "\\s\"" end 'move) + (nth 3 (parse-partial-sexp + here (point) nil nil state)))) (put-text-property beg (point) 'face - font-lock-comment-face) + font-lock-string-face) (setq state (parse-partial-sexp here (point) - nil nil state))) - (if (nth 3 state) - (let ((beg (match-beginning 0))) - (while (and (re-search-forward "\\s\"" end 'move) - (nth 3 (parse-partial-sexp - here (point) nil nil state)))) - (put-text-property beg (point) 'face - font-lock-string-face) - (setq state (parse-partial-sexp here (point) - nil nil state)))))) - ;; Make sure PREV is non-nil after the loop - ;; only if it was set on the very last iteration. - (setq prev nil))) - (set-syntax-table old-syntax) - (and prev - (remove-text-properties prev end '(face nil))) - (and (buffer-modified-p) - (not modified) - (set-buffer-modified-p nil)))))))) + nil nil state)))))) + ;; Make sure PREV is non-nil after the loop + ;; only if it was set on the very last iteration. + (setq prev nil))) + (set-syntax-table old-syntax) + (and prev + (remove-text-properties prev end '(face nil))) + (and (buffer-modified-p) + (not modified) + (set-buffer-modified-p nil)))))))) ;; Functions for XEmacs: ;; These fix bugs in `text-property-any' and `text-property-not-all'. They may ;; not work perfectly in 19.11 and below because `next-single-property-change' ;; is also broke and not easily fixable in Lisp. -(if (and lazy-lock-running-xemacs-p - (= emacs-major-version 19) - (< emacs-minor-version 12)) - (progn - ;; Loop through property changes until found. This fix includes a work - ;; around which prevents a bug in `window-start' causing a barf here. - (defun text-property-any (start end prop value &optional buffer) - "Check text from START to END to see if PROP is ever `eq' to VALUE. +(when (and lazy-lock-running-xemacs + (= emacs-major-version 19) (< emacs-minor-version 12)) + ;; Loop through property changes until found. This fix includes a work + ;; around which prevents a bug in `window-start' causing a barf here. + (defun text-property-any (start end prop value &optional buffer) + "Check text from START to END to see if PROP is ever `eq' to VALUE. If so, return the position of the first character whose PROP is `eq' to VALUE. Otherwise return nil." - (let ((start (min start end)) (end (max start end))) - (while (and start (not (eq (get-text-property start prop buffer) value))) - (setq start (next-single-property-change start prop buffer end))) - start)) - ;; No need to loop here; if it's not at START it's at the next change. - ;; However, `next-single-property-change' sometimes returns LIMIT, or - ;; `point-max', if no change is found and sometimes returns nil. - (defun text-property-not-all (start end prop value &optional buffer) - "Check text from START to END to see if PROP is ever not `eq' to VALUE. + (let ((start (min start end)) (end (max start end))) + (while (and start (not (eq (get-text-property start prop buffer) value))) + (setq start (next-single-property-change start prop buffer end))) + start)) + ;; No need to loop here; if it's not at START it's at the next change. + ;; However, `next-single-property-change' sometimes returns LIMIT, or + ;; `point-max', if no change is found and sometimes returns nil. + (defun text-property-not-all (start end prop value &optional buffer) + "Check text from START to END to see if PROP is ever not `eq' to VALUE. If so, return the position of the first character whose PROP is not `eq' to VALUE. Otherwise, return nil." - (if (not (eq value (get-text-property start prop buffer))) - start - (let ((next (next-single-property-change start prop buffer end)) - (end (or end (save-excursion (and buffer (set-buffer buffer)) - (point-max))))) - (and next (< next end) next)))))) + (if (not (eq value (get-text-property start prop buffer))) + start + (let ((next (next-single-property-change start prop buffer end)) + (end (or end (save-excursion (and buffer (set-buffer buffer)) + (point-max))))) + (and next (< next end) next))))) ;; XEmacs 19.11 function `font-lock-any-extents-p' looks for `text-prop' rather ;; than `face'. Since `font-lock-unfontify-region' only removes `face', and we ;; have non-font-lock properties hanging about, `text-prop' never gets removed. ;; Unfortunately `font-lock-any-extents-p' is inlined so we can't redefine it. -(if (and lazy-lock-running-xemacs-p - (= emacs-major-version 19) - (< emacs-minor-version 12)) - (add-hook 'font-lock-mode-hook - (function (lambda () - (remove-hook 'after-change-functions 'font-lock-after-change-function) - (add-hook 'after-change-functions - (function (lambda (beg end old-len) - (let ((a-c-beg beg) (a-c-end end)) - (save-excursion - ;; First set `text-prop' to nil for `font-lock-any-extents-p'. - (goto-char end) (forward-line 1) (setq end (point)) - (goto-char beg) (beginning-of-line) (setq beg (point)) - (put-text-property beg end 'text-prop nil) - ;; Then do the real `font-lock-after-change-function'. - (font-lock-after-change-function a-c-beg a-c-end old-len) - ;; Now set `fontified' to t to stop `lazy-lock-fontify-window'. - (put-text-property beg end 'fontified t)))))))))) +(when (and lazy-lock-running-xemacs + (= emacs-major-version 19) (< emacs-minor-version 12)) + (add-hook 'font-lock-mode-hook + (function (lambda () + (remove-hook 'after-change-functions 'font-lock-after-change-function) + (add-hook 'after-change-functions + (function (lambda (beg end old-len) + (let ((a-c-beg beg) (a-c-end end)) + (save-excursion + ;; First set `text-prop' to nil for `font-lock-any-extents-p'. + (goto-char end) (forward-line 1) (setq end (point)) + (goto-char beg) (beginning-of-line) (setq beg (point)) + (put-text-property beg end 'text-prop nil) + ;; Then do the real `font-lock-after-change-function'. + (font-lock-after-change-function a-c-beg a-c-end old-len) + ;; Now set `fontified' to t to stop `lazy-lock-fontify-window'. + (put-text-property beg end 'fontified t)))))))))) -(if (and lazy-lock-running-xemacs-p - (or (> emacs-major-version 19) - (>= emacs-minor-version 12))) - ;; XEmacs 19.12 font-lock.el's `font-lock-fontify-buffer' runs a hook. - (add-hook 'font-lock-after-fontify-buffer-hook - 'lazy-lock-after-fontify-buffer)) +;; XEmacs 19.12 font-lock.el's `font-lock-fontify-buffer' runs a hook. +(when lazy-lock-running-xemacs + (add-hook 'font-lock-after-fontify-buffer-hook + 'lazy-lock-after-fontify-buffer)) -;; Cope with the differences between Emacs and [LX]Emacs. -(or (fboundp 'frame-parameters) - (defalias 'frame-parameters 'screen-parameters)) +;; Cope with the differences between Emacs and earlier [LX]Emacs. +(unless (fboundp 'frame-parameters) + (defalias 'frame-parameters 'screen-parameters)) + +;; Cope with the differences between Emacs and earlier [LX]Emacs. Buggy. +;(unless (fboundp 'window-displayed-height) +; (defalias 'window-displayed-height 'window-height)) ;; Install ourselves: @@ -947,26 +1025,26 @@ ;; After some relevant event. (add-hook 'window-setup-hook 'lazy-lock-post-setup-emacs-fontify-windows) -;Not needed in XEmacs 19.15: -;(add-hook 'window-size-change-functions 'lazy-lock-post-resize-fontify-windows) +(add-hook 'window-size-change-functions 'lazy-lock-post-resize-fontify-windows) ;; Package-specific. -(add-hook 'ediff-after-setup-control-frame-hooks +(add-hook 'ediff-after-setup-control-frame-hooks ; Emacs 19.29, Ediff 2.26. + 'lazy-lock-post-setup-ediff-control-frame) +(add-hook 'ediff-after-setup-control-frame-hook ; Emacs 19.30, Ediff 2.47. 'lazy-lock-post-setup-ediff-control-frame) ;; Might as well uninstall too. Package-local symbols would be nice... -(and (fboundp 'unintern) (unintern 'lazy-lock-running-xemacs-p)) -(and (fboundp 'unintern) (unintern 'lazy-lock-sit-for)) - -;; Maybe save on the modeline? -;;(setcdr (assq 'font-lock-mode minor-mode-alist) '(" Lazy")) +(when (fboundp 'unintern) + (unintern 'lazy-lock-running-xemacs) + (unintern 'lazy-lock-sit-for)) -;(or (assq 'lazy-lock-mode minor-mode-alist) -; (setq minor-mode-alist (cons '(lazy-lock-mode " Lazy") minor-mode-alist))) - -;; XEmacs change: do it the right way. This works with modeline mousing. ;;;###autoload -(add-minor-mode 'lazy-lock-mode " Lazy") +(when (fboundp 'add-minor-mode) + (defvar lazy-lock-mode nil) + (add-minor-mode 'lazy-lock-mode nil)) +;;;###dont-autoload +(unless (assq 'lazy-lock-mode minor-mode-alist) + (setq minor-mode-alist (append minor-mode-alist '((lazy-lock-mode nil))))) ;; Provide ourselves:
--- a/lisp/packages/man-xref.el Mon Aug 13 09:13:58 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,166 +0,0 @@ -;;; man-xref.el --- cross reference selection functions for man mode - -;; Author: Mark Hood <hood@eng.sun.com> -;; @(#)man-xref.el 1.15 - -;; This file is part of XEmacs. - -;; XEmacs is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; XEmacs is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the Free -;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -;; 02111-1307, USA. - -;;; Synched up with: FSF 19.35. - -;;; Commentary: - -;; This package is an add-on to the man.el that comes with Emacs -;; 19.34. It renders manpage cross references in bold, sets them up -;; for mouse highlighting, and allows selection via keystrokes or -;; mouse. All strings matching Man-reference-regexp in the text of -;; the man page are set up, in addition to the ones in the See Also -;; section. - -;; To use this package, put something like the following in your Emacs -;; initialization file. This example causes tab and M-tab to go to -;; the next and previous manual cross references, causes carriage -;; return to display a man page for the reference under point, and -;; allows mouse button 2 to invoke a man page display. - -;; (add-hook 'Man-mode-hook -;; '(lambda () -;; (Man-mouseify-xrefs) -;; (define-key Man-mode-map "\r" 'Man-do-manual-reference) -;; (define-key Man-mode-map "\t" 'Man-next-manual-reference) -;; (define-key Man-mode-map "\e\t" 'Man-prev-manual-reference) -;; (define-key Man-mode-map [mouse-2] 'Man-mouse-manual-reference) -;; )) -;; -;; (autoload 'Man-mouseify-xrefs "~/emacs/man-xref") - -(eval-when-compile (require 'cl)) - -(defvar Man-word-syntax "w_()" "Syntax for words in a man buffer.") - -(defun Man-current-word () - "Return word under point, using `Man-word-syntax' for word syntax." - (save-excursion - (let ((s (+ (point) (skip-syntax-backward Man-word-syntax)))) - (skip-syntax-forward Man-word-syntax) - (buffer-substring s (point))))) - -(defun Man-prev-word-hyphen-p () - "Return nil if previous word is not hyphenated. -Non-nil value is the buffer position of the beginning of the hyphenated word." - (save-excursion - (skip-syntax-backward Man-word-syntax) - (skip-chars-backward " \t") - (cond ((and (> (point) (1+ (point-min))) - (string-equal "-\n" (buffer-substring (- (point) 2) (point)))) - (backward-char) - (skip-syntax-backward Man-word-syntax) - (point))))) - -(defun Man-next-manual-reference () - "Move point to the beginning of the next manual reference." - (interactive) - (let ((current (point)) - (end (re-search-forward (concat "[ \t]" Man-reference-regexp) nil t)) - (start (or (Man-prev-word-hyphen-p) (1+ (match-beginning 0))))) - (cond ((eq end nil)) - ((> start current) - (goto-char start)) - ;; current is in the pre-hyphen portion of a hyphenated reference - ((re-search-forward Man-reference-regexp nil t) - (goto-char (or (Man-prev-word-hyphen-p) (match-beginning 0)))) - ((goto-char current))))) - -(defun Man-prev-manual-reference () - "Move point to the beginning of the previous manual reference." - (interactive) - (if (re-search-backward (concat "[ \t]" Man-reference-regexp) nil t) - (goto-char (or (Man-prev-word-hyphen-p) (1+ (match-beginning 0)))))) - -(defun Man-mouseify-xrefs () - "Render man cross references in bold font and set up mouse highlighting. -Add these cross references to `Man-refpages-alist'." - (let (start end xref hyphen alist) - (goto-char (point-min)) - (forward-line 1) - (while (re-search-forward Man-reference-regexp nil t) - (setq start (match-beginning 0)) - (setq end (match-end 0)) - (setq xref (buffer-substring start end)) - (cond ((setq hyphen (Man-prev-word-hyphen-p)) - (setq start hyphen) - (goto-char hyphen) - (setq xref (concat (substring (Man-current-word) 0 -1) xref)) - (goto-char end))) - (setq Man-refpages-alist (cons (list xref) Man-refpages-alist)) - (Man-boldify-mouse-region start end)) - (setq Man-refpages-alist - (sort Man-refpages-alist - (function (lambda (a b) (string< (car a) (car b)))))) - ;; delete duplicate entries in the alist - (setq alist Man-refpages-alist) - (while alist - (cond ((string= (car (car alist)) (car (car (cdr alist)))) - (setcdr alist (cdr (cdr alist)))) - ((setq alist (cdr alist))))) - (goto-char (point-min)) - (forward-line 1))) - -(defun Man-mouse-manual-reference (mouse) - "Move point to mouse position and run `Man-getpage-in-background' there." - (interactive "e") - (select-window (car (car (cdr mouse)))) - (goto-char (car (cdr (car (cdr mouse))))) - (Man-do-manual-reference)) - -(defun Man-do-manual-reference () - "Run `Man-getpage-in-background' on cross reference under point. -Word under point is checked for a match with `Man-reference-regexp'. -If point is not over a word, try to use previous word for a match." - (interactive) - (save-excursion - (let ((xref (Man-current-word)) (hyphen (Man-prev-word-hyphen-p))) - (if (and (zerop (length xref)) - (setq xref " ") - (skip-syntax-backward " ") - (not (eq (point) (point-min)))) - (Man-do-manual-reference) - (cond ((string-equal "-" (substring xref -1)) - (skip-syntax-forward Man-word-syntax) - (skip-syntax-forward " ") - (setq xref (concat (substring xref 0 -1) (Man-current-word)))) - (hyphen - (goto-char hyphen) - (setq xref (concat (substring (Man-current-word) 0 -1) xref)))) - (if (string-match Man-reference-regexp xref) - (Man-getpage-in-background - (Man-translate-references - (substring xref (match-beginning 0) (match-end 0)))) - (message "No cross reference found under point.")))))) - -(eval-and-compile - (when (string-match "XEmacs\\|Lucid" emacs-version) - (fset 'make-overlay 'make-extent) - (fset 'overlay-put 'set-extent-property))) - -(defun Man-boldify-mouse-region (beg end) - "Render region text in bold with mouse highlighting." - (let ((overlay (make-overlay beg end))) - (overlay-put overlay 'face 'bold) - (overlay-put overlay 'mouse-face 'highlight) - (overlay-put overlay 'hilit t))) -
--- a/lisp/packages/man.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/packages/man.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,7 +1,7 @@ ;;; man.el --- browse UNIX manual pages ;; Keywords: help -;; Copyright (C) 1985, 1993, 1994 Free Software Foundation, Inc. +;; Copyright (C) 1985, 1993, 1994, 1996 Free Software Foundation, Inc. ;; ;; This file is part of XEmacs. @@ -19,157 +19,35 @@ ;; along with XEmacs; see the file COPYING. If not, write to the Free ;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -;; Mostly rewritten by Alan K. Stebbens <aks@hub.ucsb.edu> 11-apr-90. -;; -;; o Match multiple man pages using TOPIC as a simple pattern -;; o Search unformatted pages, even when formatted matches are found -;; o Query the user as to which pages are desired -;; o Use of the prefix arg to toggle/bypass the above features -;; o Buffers named by the first topic in the buffer -;; o Automatic uncompress for compressed man pages (.Z, .z, and .gz) -;; o View the resulting buffer using M-x view mode -;; -;; Modified 16-mar-91 by Jamie Zawinski <jwz@lucid.com> to default the -;; manual topic to the symbol at point, just like find-tag does. -;; -;; Modified 22-mar-93 by jwz to use multiple fonts and follow xrefs with mouse. -;; -;; Modified 16-apr-93 by Dave Gillespie <daveg@synaptics.com> to make -;; apropos work nicely; work correctly when bold or italic is unavailable; -;; reuse old buffer if topic is re-selected (in Manual-topic-buffer mode). -;; -;; Modified 4-apr-94 by jwz: merged in Tibor Polgar's code for manpath.conf. -;; -;; Modified 19-apr-94 by Tibor Polgar <tlp00@spg.amdahl.com> to add support for -;; $PAGER variable to be emacsclient and properly process man pages (assuming -;; the man pages were built by man in /tmp. also fixed bug with man list being -;; backwards. -;; -;; Modified 23-aug-94 by Tibor Polgar <tlp00@spg.amdahl.com> to add support for -;; displaying only one instance of a man page (Manual-unique-man-sections-only) -;; Fixed some more man page ordering bugs, bug with Manual-query-multiple-pages. -;; -;; Modified 29-nov-94 by Ben Wing <wing@spg.amdahl.com>: small fixes -;; that should hopefully make things work under HPUX and IRIX.; -;; -;; Modified 15-jul-95 by Dale Atems <atems@physics.wayne.edu>: -;; some extensive rewriting to make things work right (more or less) -;; under IRIX. -;; ;; This file defines "manual-entry", and the remaining definitions all ;; begin with "Manual-". This makes the autocompletion on "M-x man" work. -;; -;; Variables of interest: +;; +;; Eviscerated 26-Jun-96 by Jamie Zawinski <jwz@netscape.com>. +;; All that stuff about looking at $MANPATH and building up lists of +;; directories was bullshit. Now we just invoke "man" and format the +;; output, end of story. ;; -;; Manual-program -;; Manual-topic-buffer -;; Manual-buffer-view-mode -;; Manual-directory-list -;; Manual-formatted-directory-list -;; Manual-match-topic-exactly -;; Manual-query-multiple-pages -;; Manual-page-history -;; Manual-subdirectory-list -;; Manual-man-page-section-ids -;; Manual-formatted-page-prefix -;; Manual-unformatted-page-prefix -;; Manual-use-full-section-ids +;; [ older changelog entries removed, since they're all about code that +;; I've deleted. ] (defvar Manual-program "man" "\ *Name of the program to invoke in order to format the source man pages.") -(defvar Manual-section-switch (if (eq system-type 'usg-unix-v) "-s" nil) - "SysV needs this to work right.") - -(defvar Manual-topic-buffer t "\ -*Non-nil means \\[Manual-entry] should output the manual entry for TOPIC into -a buffer named *man TOPIC*, otherwise, it should name the buffer -*Manual Entry*.") - (defvar Manual-buffer-view-mode t "\ *Whether manual buffers should be placed in view-mode. nil means leave the buffer in fundamental-mode in another window. t means use `view-buffer' to display the man page in the current window. Any other value means use `view-buffer-other-window'.") -(defvar Manual-match-topic-exactly t "\ -*Non-nil means that \\[manual-entry] will match the given TOPIC exactly, rather -apply it as a pattern. When this is nil, and \"Manual-query-multiple-pages\" -is non-nil, then \\[manual-entry] will query you for all matching TOPICs. -This variable only has affect on the preformatted man pages (the \"cat\" files), -since the \"man\" command always does exact topic matches.") - -(defvar Manual-query-multiple-pages nil "\ -*Non-nil means that \\[manual-entry] will query the user about multiple man -pages which match the given topic. The query is done using the function -\"y-or-n-p\". If this variable is nil, all man pages with topics matching the -topic given to \\[manual-entry] will be inserted into the temporary buffer. -See the variable \"Manual-match-topic-exactly\" to control the matching.") - -(defvar Manual-unique-man-sections-only nil - "*Only present one man page per section. This variable is useful if the same or -up/down level man pages for the same entry are present in mulitple man paths. -When set to t, only the first entry found in a section is displayed, the others -are ignored without any messages or warnings. Note that duplicates can occur if -the system has both formatted and unformatted version of the same page.") - (defvar Manual-mode-hook nil "Function or functions run on entry to Manual-mode.") -(defvar Manual-directory-list nil "\ -*A list of directories used with the \"man\" command, where each directory -contains a set of \"man?\" and \"cat?\" subdirectories. If this variable is nil, -it is initialized by \\[Manual-directory-list-init].") - -(defvar Manual-formatted-directory-list nil "\ -A list of directories containing formatted man pages. Initialized by -\\[Manual-directory-list-init].") - -(defvar Manual-unformatted-directory-list nil "\ -A list of directories containing the unformatted (source) man pages. -Initialized by \\[Manual-directory-list-init].") - (defvar Manual-page-history nil "\ A list of names of previously visited man page buffers.") -(defvar Manual-manpath-config-file "/usr/lib/manpath.config" - "*Location of the manpath.config file, if any.") - -(defvar Manual-apropos-switch "-k" - "*Man apropos switch") ;; New variables. -(defvar Manual-subdirectory-list nil "\ -A list of all the subdirectories in which man pages may be found. -Iniialized by Manual-directory-list-init.") - -;; This is for SGI systems; don't know what it should be otherwise. -(defvar Manual-man-page-section-ids "1nl6823457poD" "\ -String containing all suffix characters for \"cat\" and \"man\" -that identify valid sections of the Un*x manual.") - -(defvar Manual-formatted-page-prefix "cat" "\ -Prefix for directories where formatted man pages are to be found. -Defaults to \"cat\".") - -(defvar Manual-unformatted-page-prefix "man" "\ -Prefix for directories where unformatted man pages are to be found. -Defaults to \"man\".") - -(defvar Manual-leaf-signature "" "\ -Regexp for identifying \"leaf\" subdirectories in the search path. -If empty, initialized by Manual-directory-list-init.") - -(defvar Manual-use-full-section-ids t "\ -If non-nil, pass full section ids to Manual-program, otherwise pass -only the first character. Defaults to 't'.") - -(defvar Manual-use-subdirectory-list (eq system-type 'irix) "\ -This makes manual-entry work correctly on SGI machines but it -imposes a large startup cost which is why it is not simply on by -default on all systems.") - (defvar Manual-use-rosetta-man (not (null (locate-file "rman" exec-path))) "\ If non-nil, use RosettaMan (rman) to filter man pages. This makes man-page cleanup virtually instantaneous, instead of @@ -258,108 +136,17 @@ (or (face-differs-from-default-p 'man-xref) (set-face-underline-p 'man-xref t)) -;; Manual-directory-list-init -;; Initialize the directory lists. - -(defun Manual-directory-list-init (&optional arg) - "Initialize the Manual-directory-list variable from $MANPATH -if it is not already set, or if a prefix argument is provided." - (interactive "P") - (if arg (setq Manual-directory-list nil)) - (if (null Manual-directory-list) - (let ((manpath (getenv "MANPATH")) - (global (Manual-manpath-config-contents)) - (dirlist nil) - dir) - (cond ((and manpath global) - (setq manpath (concat manpath ":" global))) - (global - (setq manpath global)) - ((not manpath) - ;; XEmacs - (bpw/stig) Unix-specifix hack for lusers w/ no manpath - (setq manpath "/usr/local/man:/usr/share/man:/usr/contrib/man:/usr/X11/man:/usr/man:/usr/catman"))) - ;; Make sure that any changes we've made internally are seen by man. - (setenv "MANPATH" manpath) - (while (string-match "\\`:*\\([^:]+\\)" manpath) - (setq dir (substring manpath (match-beginning 1) (match-end 1))) - (and (not (member dir dirlist)) - (setq dirlist (cons dir dirlist))) - (setq manpath (substring manpath (match-end 0)))) - (setq dirlist (nreverse dirlist)) - (setq Manual-directory-list dirlist) - (setq Manual-subdirectory-list nil) - (setq Manual-formatted-directory-list nil) - (setq Manual-unformatted-directory-list nil))) - (if (string-equal Manual-leaf-signature "") - (setq Manual-leaf-signature - (concat "/\\(" - Manual-formatted-page-prefix - "\\|" Manual-unformatted-page-prefix - "\\)" - "[" Manual-man-page-section-ids - "].?/."))) - (if Manual-use-subdirectory-list - (progn - (if (null Manual-subdirectory-list) - (setq Manual-subdirectory-list - (Manual-all-subdirectories Manual-directory-list - Manual-leaf-signature nil))) - (if (null Manual-formatted-directory-list) - (setq Manual-formatted-directory-list - (Manual-filter-subdirectories Manual-subdirectory-list - Manual-formatted-page-prefix))) - (if (null Manual-unformatted-directory-list) - (setq Manual-unformatted-directory-list - (Manual-filter-subdirectories Manual-subdirectory-list - Manual-unformatted-page-prefix)))) - (if (null Manual-formatted-directory-list) - (setq Manual-formatted-directory-list - (Manual-select-subdirectories Manual-directory-list - Manual-formatted-page-prefix))) - (if (null Manual-unformatted-directory-list) - (setq Manual-unformatted-directory-list - (Manual-select-subdirectories Manual-directory-list - Manual-unformatted-page-prefix))))) - - -(defun Manual-manpath-config-contents () - "Parse the `Manual-manpath-config-file' file, if any. -Returns a string like in $MANPATH." - (if (and Manual-manpath-config-file - (file-readable-p Manual-manpath-config-file)) - (let ((buf (get-buffer-create " *Manual-config*")) - path) - (set-buffer buf) - (buffer-disable-undo buf) - (erase-buffer) - (insert-file-contents Manual-manpath-config-file) - (while (re-search-forward "^\\(MANDATORY_MANPATH\\|MANPATH_MAP\\)" - nil t) - (and (re-search-forward "\\(/[^ \t\n]+\\)[ \t]*$") - (setq path (concat path (buffer-substring (match-beginning 1) - (match-end 1)) - ":")))) - (kill-buffer buf) - path))) -;; -;; manual-entry -- The "main" user function -;; +(defvar Manual-mode-map + (let ((m (make-sparse-keymap))) + (set-keymap-name m 'Manual-mode-map) + (define-key m "l" 'Manual-last-page) + (define-key m 'button2 'Manual-follow-xref) + (define-key m 'button3 'Manual-popup-menu) + m)) ;;;###autoload (defun manual-entry (topic &optional arg silent) - "Display the Unix manual entry (or entries) for TOPIC. -If prefix arg is given, modify the search according to the value: - 2 = complement default exact matching of the TOPIC name; - exact matching default is specified by `Manual-match-topic-exactly' - 3 = force a search of the unformatted man directories - 4 = both 2 and 3 -The manual entries are searched according to the variable -Manual-directory-list, which should be a list of directories. If -Manual-directory-list is nil, \\[Manual-directory-list-init] is -invoked to create this list from the MANPATH environment variable. -See the variable Manual-topic-buffer which controls how the buffer -is named. See also the variables Manual-match-topic-exactly, -Manual-query-multiple-pages, and Manual-buffer-view-mode." + "Display the Unix manual entry (or entries) for TOPIC." (interactive (list (let* ((fmh "-A-Za-z0-9_.") (default (save-excursion @@ -375,18 +162,11 @@ (prefix-numeric-value current-prefix-arg))) ;;(interactive "sManual entry (topic): \np") (or arg (setq arg 1)) - (Manual-directory-list-init nil) - (let ((exact (if (or (= arg 2) (= arg 4)) - (not Manual-match-topic-exactly) - Manual-match-topic-exactly)) - (force (if (>= arg 3) - t - nil)) - section fmtlist manlist apropos-mode) + (let (section apropos-mode) (let ((case-fold-search nil)) (if (and (null section) - (string-match - "\\`[ \t]*\\([^( \t]+\\)[ \t]*(\\(.+\\))[ \t]*\\'" topic)) + (string-match "\\`[ \t]*\\([^( \t]+\\)[ \t]*(\\(.+\\))[ \t]*\\'" + topic)) (setq section (substring topic (match-beginning 2) (match-end 2)) topic (substring topic (match-beginning 1) @@ -394,210 +174,79 @@ (if (string-match "\\`[ \t]*-k[ \t]+\\([^ \t]+\\)\\'" topic) (setq section "-k" topic (substring topic (match-beginning 1)))))) + + ;; jwz: turn section "3x11" and "3n" into "3". + (if (and section (string-match "\\`\\([0-9]+\\)[^0-9]" section)) + (setq section (substring section 0 (match-end 1)))) (if (equal section "-k") - (setq apropos-mode t) - (or silent - (message "Looking for formatted entry for %s%s..." - topic (if section (concat "(" section ")") ""))) - (setq fmtlist (Manual-select-man-pages - Manual-formatted-directory-list - topic section exact '())) - (if (or force (not section) (null fmtlist)) - (progn - (or silent - (message "%sooking for unformatted entry for %s%s..." - (if fmtlist "L" "No formatted entry, l") - topic (if section (concat "(" section ")") ""))) - (setq manlist (Manual-select-man-pages - Manual-unformatted-directory-list - topic section exact (if force '() fmtlist)))))) - - ;; Delete duplicate man pages (a file of the same name in multiple - ;; directories.) - (or nil ;force - (let ((rest (append fmtlist manlist))) - (while rest - (let ((rest2 (cdr rest))) - (while rest2 - (if (equal (file-name-nondirectory (car rest)) - (file-name-nondirectory (car rest2))) - (setq fmtlist (delq (car rest2) fmtlist) - manlist (delq (car rest2) manlist))) - (setq rest2 (cdr rest2)))) - (setq rest (cdr rest))))) + (setq apropos-mode t)) - (if (not (or fmtlist manlist apropos-mode)) - (progn - (message "No entries found for %s%s" topic - (if section (concat "(" section ")") "")) - nil) - (let ((bufname (cond ((not Manual-topic-buffer) - ;; What's the point of retaining this? - (if apropos-mode - "*Manual Apropos*" - "*Manual Entry*")) - (apropos-mode - (concat "*man apropos " topic "*")) - (t - (concat "*man " - (cond (exact - (if section - (concat topic "." section) - topic)) - ((or (cdr fmtlist) (cdr manlist) - (and fmtlist manlist)) - ;; more than one entry found - (concat topic "...")) - (t - (file-name-nondirectory - (car (or fmtlist manlist))))) - "*")))) - (temp-buffer-show-function - (cond ((eq 't Manual-buffer-view-mode) 'view-buffer) - ((eq 'nil Manual-buffer-view-mode) - temp-buffer-show-function) - (t 'view-buffer-other-window)))) + (let ((bufname (cond (apropos-mode + (concat "*man apropos " topic "*")) + (t + (concat "*man " topic + (if section (concat "." section) "") + "*")))) + (temp-buffer-show-function + (cond ((eq 't Manual-buffer-view-mode) + 'view-buffer) + ((eq 'nil Manual-buffer-view-mode) + temp-buffer-show-function) + (t + 'view-buffer-other-window)))) - (if apropos-mode - (setq manlist (list (format "%s.%s" topic section)))) - - (cond - ((and Manual-topic-buffer (get-buffer bufname)) - ;; reselect an old man page buffer if it exists already. - (save-excursion - (set-buffer (get-buffer bufname)) - (Manual-mode)) - (if temp-buffer-show-function - (funcall temp-buffer-show-function (get-buffer bufname)) - (display-buffer bufname))) - (t - (with-output-to-temp-buffer bufname - (buffer-disable-undo standard-output) - (save-excursion - (set-buffer standard-output) - (setq buffer-read-only nil) - (erase-buffer) - (Manual-insert-pages fmtlist manlist apropos-mode) - (set-buffer-modified-p nil) - (Manual-mode) - )))) - (setq Manual-page-history - (cons (buffer-name) - (delete (buffer-name) Manual-page-history))) - (message nil) - t)))) + (cond ((get-buffer bufname) + ;; reselect an old man page buffer if it exists already. + (save-excursion + (set-buffer (get-buffer bufname)) + (Manual-mode)) + (if temp-buffer-show-function + (funcall temp-buffer-show-function (get-buffer bufname)) + (display-buffer bufname))) + (t + (with-output-to-temp-buffer bufname + (buffer-disable-undo standard-output) + (save-excursion + (set-buffer standard-output) + (setq buffer-read-only nil) + (erase-buffer) -(defun Manpage-apropos (topic &optional arg silent) - "Apropos on Unix manual pages for TOPIC. -It calls the function `manual-entry'. Look at this function for -further description. Look also at the variable `Manual-apropos-switch', -if this function doesn't work on your system." - (interactive - (list (let* ((fmh "-A-Za-z0-9_.") - (default (save-excursion - (buffer-substring - (progn - (re-search-backward "\\sw" nil t) - (skip-chars-backward fmh) (point)) - (progn (skip-chars-forward fmh) (point))))) - (thing (read-string - (if (equal default "") "Manual entry: " - (concat "Manual entry: (default " default ") "))))) - (if (equal thing "") default thing)) - (prefix-numeric-value current-prefix-arg))) - (manual-entry (concat Manual-apropos-switch " " topic) arg silent)) + (let ((args (list topic)) + args-string) + (if section + (setq args + (if (eq system-type 'usg-unix-v) + (cons "-s" (cons section args)) + (cons section args)))) + (setq args-string + (mapconcat 'identity (cons Manual-program args) " ")) + (if (string-match "\\`\\([^ \t/]*/\\)+" args-string) + (setq args-string + (substring args-string (match-end 0)))) -(defun Manual-insert-pages (fmtlist manlist apropos-mode) - (let ((sep (make-string 65 ?-)) - name start end topic section) - (while fmtlist ; insert any formatted files - (setq name (car fmtlist)) - (goto-char (point-max)) - (setq start (point)) - ;; In case the file can't be read or uncompressed or - ;; something like that. - (condition-case () - (Manual-insert-man-file name) - (file-error nil)) - (goto-char (point-max)) - (setq end (point)) - (save-excursion - (save-restriction - (message "Cleaning manual entry for %s..." - (file-name-nondirectory name)) - (narrow-to-region start end) - (Manual-nuke-nroff-bs) - (goto-char (point-min)) - (insert "File: " name "\n") - (goto-char (point-max)) - )) - (if (or (cdr fmtlist) manlist) - (insert "\n\n" sep "\n")) - (setq fmtlist (cdr fmtlist))) + (message "%s (running...)" args-string) + (apply 'call-process Manual-program nil t nil args) - (while manlist ; process any unformatted files - (setq name (car manlist)) - (or (string-match "\\([^/]+\\)\\.\\([^./]+\\)\\(\\.gz\\'\\)" name) - (string-match "\\([^/]+\\)\\.\\([^./]+\\)\\'" name)) - (setq topic (substring name (match-beginning 1) (match-end 1))) - (setq section (substring name (match-beginning 2) (match-end 2))) - ;; This won't work under IRIX, because SGI man accepts only the - ;; "main" (one-character) section id, not full section ids - ;; like 1M, 3X, etc. Put (setq Manual-use-full-section-ids nil) - ;; in your .emacs to work around this problem. - (if (not (or Manual-use-full-section-ids (string-equal section ""))) - (setq section (substring section 0 1))) - (message "Invoking man %s%s %s..." - (if Manual-section-switch - (concat Manual-section-switch " ") - "") - section topic) - (setq start (point)) - (Manual-run-formatter name topic section) - (setq end (point)) - (save-excursion - (save-restriction - (message "Cleaning manual entry for %s(%s)..." topic section) - (narrow-to-region start end) - (Manual-nuke-nroff-bs apropos-mode) - (goto-char (point-min)) - (insert "File: " name "\n") - (goto-char (point-max)) - )) - (if (cdr manlist) - (insert "\n\n" sep "\n")) - (setq manlist (cdr manlist)))) - (if (< (buffer-size) 200) - (progn - (goto-char (point-min)) - (if (looking-at "^File: ") - (forward-line 1)) - (error (buffer-substring (point) (progn (end-of-line) (point)))))) - nil) + (if (< (buffer-size) 200) + (progn + (goto-char (point-min)) + (error (buffer-substring (point) + (progn (end-of-line) + (point)))))) -(defvar Manual-entry-switches nil - "Switches for `manual-entry' including switch for section (at the end).") -(defvar Manual-apropos-switches nil - "Additional switches for `Manpage-apropos' excluding switch `-k'.") - -(defun Manual-run-formatter (name topic section) - (cond ((string-match "roff\\'" Manual-program) - ;; kludge kludge - (call-process Manual-program nil t nil "-Tman" "-man" name)) - (t - (apply 'call-process Manual-program nil t nil - (append (if apropos-mode - Manual-apropos-switches - Manual-entry-switches) - (list section topic)))))) + (message "%s (cleaning...)" args-string) + (Manual-nuke-nroff-bs apropos-mode) + (message "%s (done.)" args-string) + ) -(defvar Manual-mode-map - (let ((m (make-sparse-keymap))) - (set-keymap-name m 'Manual-mode-map) - (define-key m "l" 'Manual-last-page) - (define-key m 'button2 'Manual-follow-xref) - (define-key m 'button3 'Manual-popup-menu) - m)) + (set-buffer-modified-p nil) + (Manual-mode) + )))) + (setq Manual-page-history + (cons (buffer-name) + (delete (buffer-name) Manual-page-history))))) + (message nil) + t) (defun Manual-mode () (kill-all-local-variables) @@ -610,8 +259,7 @@ ;; overran by a couple of chars. (setq truncate-lines t) ;; turn off horizontal scrollbars in this buffer - (when (featurep 'scrollbar) - (set-specifier scrollbar-height (cons (current-buffer) 0))) + (set-specifier scrollbar-height (cons (current-buffer) 0)) (run-hooks 'Manual-mode-hook)) (defun Manual-last-page () @@ -623,225 +271,6 @@ (switch-to-buffer (car Manual-page-history))) -;; Manual-select-subdirectories -;; Given a DIRLIST and a SUBDIR name, return all subdirectories of the former which -;; match the latter. - -(defun Manual-select-subdirectories (dirlist subdir) - (let ((dirs '()) - (case-fold-search nil) - (match (concat "\\`" (regexp-quote subdir))) - d) - (while dirlist - (setq d (car dirlist) dirlist (cdr dirlist)) - (if (file-directory-p d) - (let ((files (directory-files d t match nil 'dirs-only)) - (dir-temp '())) - (while files - (if (file-executable-p (car files)) - (setq dir-temp (cons (file-name-as-directory (car files)) - dir-temp))) - (setq files (cdr files))) - (and dir-temp - (setq dirs (append dirs (nreverse dir-temp))))))) - dirs)) - - -;; Manual-filter-subdirectories -;; Given a DIRLIST and a SUBDIR name, return all members of the former -;; which match the latter. - -(defun Manual-filter-subdirectories (dirlist subdir) - (let ((match (concat - "/" - (regexp-quote subdir) - "[" Manual-man-page-section-ids "]")) - slist dir) - (while dirlist - (setq dir (car dirlist) dirlist (cdr dirlist)) - (if (and (file-executable-p dir) (string-match match dir)) - (setq slist (cons dir slist)))) - (nreverse slist))) - - -(defun Manual-all-subdirectories (dirlist leaf-signature dirs &optional silent) "\ -Given a DIRLIST, return a backward-sorted list of all subdirectories -thereof, prepended to DIRS if non-nil. This function calls itself -recursively until subdirectories matching LEAF-SIGNATURE are reached, -or the hierarchy has been thoroughly searched. This code is a modified -version of a function written by Tim Bradshaw (tfb@ed.ac.uk)." - (Manual-all-subdirectories-noloop dirlist leaf-signature dirs nil silent)) - -(defun Manual-all-subdirectories-noloop (dirlist leaf-signature dirs been &optional silent) "\ -Does the job of manual-all-subdirectories and keeps track of where it -has been to avoid loops." - (let (dir) - (while dirlist - (setq dir (car dirlist) dirlist (cdr dirlist)) - (if (file-directory-p dir) - (let ((dir-temp (cons (file-name-as-directory dir) dirs))) - ;; Without feedback the user might wonder about the delay! - (or silent (message - "Building list of search directories... %s" - (car dir-temp))) - (if (member (file-truename dir) been) - () ; Ignore. We have been here before - (setq been (cons (file-truename dir) been)) - (setq dirs - (if (string-match leaf-signature dir) - dir-temp - (Manual-all-subdirectories-noloop - (directory-files dir t "[^.]$" nil 'dirs-only) - leaf-signature dir-temp been silent)))))))) - dirs) - - -(defvar Manual-bogus-file-pattern "\\.\\(lpr\\|ps\\|PS\\)\\'" - "Some systems have files in the man/man*/ directories which aren't man pages. -This pattern is used to prune those files.") - -;; Manual-select-man-pages -;; -;; Given a DIRLIST, discover all filenames which complete given the TOPIC -;; and SECTION. - -;; ## Note: BSD man looks for .../man1/foo.1 and .../man1/$MACHINE/foo.1 - -;; ## Fixed for SGI IRIX 5.x on Sat Jul 15 1995 by Dale Atems -;; (atems@physics.wayne.edu). - -(defun Manual-select-man-pages (dirlist topic section exact shadow) - (let ((case-fold-search nil)) - (and section - (let ((l '()) - ;;(match (concat (substring section 0 1) "/?\\'")) - ;; ^^^ - ;; We'll lose any pages inside subdirectories of the "standard" - ;; ones if we insist on this! The following regexp should - ;; match any directory ending with the full section id or - ;; its first character, or any direct subdirectory thereof: - (match (concat "\\(" - (regexp-quote section) - "\\|" - (substring section 0 1) - "\\)/?")) - d) - (while dirlist - (setq d (car dirlist) dirlist (cdr dirlist)) - (if (string-match match d) - (setq l (cons d l)))) - (setq dirlist l))) - (if shadow - (setq shadow (concat "/\\(" - (mapconcat #'(lambda (n) - (regexp-quote - (file-name-nondirectory n))) - shadow - "\\|") - "\\)\\'"))) - (let ((manlist '()) - (match (concat "\\`" - (regexp-quote topic) - ;; **Note: on IRIX the preformatted pages - ;; are packed, so they end with ".z". This - ;; way you miss them if you specify a - ;; section. I don't see any point to it here - ;; even on BSD systems since we're looking - ;; one level down already, but I can't test - ;; this. More thought needed (???) - - (cond ((and section - (not Manual-use-subdirectory-list)) - (concat "\\." (regexp-quote section))) - (exact - ;; If Manual-match-topic-exactly is - ;; set, then we must make sure the - ;; completions are exact, except for - ;; trailing weird characters after - ;; the section. - "\\.") - (t - "")))) - dir) - (while dirlist - (setq dir (car dirlist) dirlist (cdr dirlist)) - (if (not (file-directory-p dir)) - (progn - (message "warning: %s is not a directory" dir) - ;;(sit-for 1) - ) - (let ((files (directory-files dir t match nil t)) - f) - (while files - (setq f (car files) files (cdr files)) - (cond ((string-match Manual-bogus-file-pattern f) - ;(message "Bogus fule %s" f) (sit-for 2) - ) - ((and shadow (string-match shadow f)) - ;(message "Shadowed %s" f) (sit-for 2) - ) - ((not (file-readable-p f)) - ;(message "Losing with %s" f) (sit-for 2) - ) - (t - (setq manlist (cons f manlist)))))))) - (setq manlist (nreverse manlist)) - (and Manual-unique-man-sections-only - (setq manlist (Manual-clean-to-unique-pages-only manlist))) - (if (and manlist Manual-query-multiple-pages) - (apply #'append - (mapcar #'(lambda (page) - (and page - (y-or-n-p (format "Read %s? " page)) - (list page))) - manlist)) - manlist)))) - -(defun Manual-clean-to-unique-pages-only (manlist) - "Prune the current list of pages down to a unique set." - (let (page-name unique-pages) - (apply 'append - (mapcar '(lambda (page) - (cond (page - (and (string-match ".*/\\(.*\\)" page) - (setq page-name (substring page (match-beginning 1) - (match-end 1))) - ;; try to clip off .Z, .gz suffixes - (and (string-match "\\(.*\\)\\.\\(.+\\)\\.\\(.+\\)" - page-name) - (setq page-name - (substring page-name (match-beginning 1) - (match-end 2))))) - ;; add Manual-unique-pages if it isn't there - ;; and return file - (if (and unique-pages - page-name - (string-match (concat "\\b" page-name "\\b") - unique-pages)) - nil - (setq unique-pages (concat unique-pages - page-name - " ")) - (list page))))) - manlist)))) - - - -(defun Manual-insert-man-file (name) - ;; Insert manual file (unpacked as necessary) into buffer - (cond ((equal (substring name -3) ".gz") - (call-process "gunzip" nil t nil "--stdout" name)) - ((or (equal (substring name -2) ".Z") - ;; HPUX uses directory names that end in .Z and compressed - ;; files that don't. How gratuitously random. - (let ((case-fold-search nil)) - (string-match "\\.Z/" name))) - (call-process "zcat" name t nil)) ;; XEmacs change for HPUX - ((equal (substring name -2) ".z") - (call-process "pcat" nil t nil name)) - (t - (insert-file-contents name)))) - (defmacro Manual-delete-char (n) ;; in v19, delete-char is compiled as a function call, but delete-region ;; is byte-coded, so it's much faster. (We were spending 40% of our time @@ -858,9 +287,10 @@ ;; (goto-char (point-min)) (while (search-forward "_\b" nil t) - ;; searching for underscore-backspace and then comparing the following - ;; chars until the sequence ends turns out to be much faster than searching - ;; for a regexp which matches the whole sequence. + ;; searching for underscore-backspace and then comparing the + ;; following chars until the sequence ends turns out to be much + ;; faster than searching for a regexp which matches the whole + ;; sequence. (let ((s (match-beginning 0))) (goto-char s) (while (and (= (following-char) ?_) @@ -931,7 +361,7 @@ (goto-char (point-min)) (while (re-search-forward "\e[789]" nil t) (replace-match ""))) - + ;; Nuke blanks lines at start. ;; (goto-char (point-min)) ;; (skip-chars-forward "\n") @@ -1039,53 +469,6 @@ (delete-region (point) p)) )) -;(defun Manual-nuke-nroff-bs-footers () -; ;; Nuke headers: "MORE(1) UNIX Programmer's Manual MORE(1)" -; (goto-char (point-min)) -; (while (re-search-forward "^ *\\([A-Za-z][-_A-Za-z0-9]*([0-9A-Za-z]+)\\).*\\1$" nil t) -; (replace-match "")) -; -; ;; -; ;; it would appear that we have a choice between sometimes introducing -; ;; an extra blank line when a paragraph was broken by a footer, and -; ;; sometimes not putting in a blank line between two paragraphs when -; ;; a footer appeared right between them. FMH; I choose the latter. -; ;; -; -; ;; Nuke footers: "Printed 12/3/85 27 April 1981 1" -; ;; Sun appear to be on drugz: -; ;; "Sun Release 3.0B Last change: 1 February 1985 1" -; ;; HP are even worse! -; ;; " Hewlett-Packard -1- (printed 12/31/99)" FMHWA12ID!! -; ;; System V (well WICATs anyway): -; ;; "Page 1 (printed 7/24/85)" -; ;; Who is administering PCP to these corporate bozos? -; (goto-char (point-min)) -; (while (re-search-forward -; (cond -; ((eq system-type 'hpux) -; "\n\n?[ \t]*Hewlett-Packard\\(\\| Company\\)[ \t]*- [0-9]* -.*\n") -; ((eq system-type 'dgux-unix) -; "\n\n?[ \t]*Licensed material--.*Page [0-9]*\n") -; ((eq system-type 'usg-unix-v) -; "\n\n? *Page [0-9]*.*(printed [0-9/]*)\n") -; (t -; "\n\n?\\(Printed\\|Sun Release\\) [0-9].*[0-9]\n")) -; nil t) -; (replace-match "")) -; -; ;; Also, hack X footers: -; ;; "X Version 11 Last change: Release 5 1" -; (goto-char (point-min)) -; (while (re-search-forward "\n\n?X Version [^\n]+\n" nil t) -; (replace-match "")) -; -; ;; Crunch blank lines -; (goto-char (point-min)) -; (while (re-search-forward "\n\n\n\n*" nil t) -; (replace-match "\n\n")) -; ) - (defun Manual-mouseify-xrefs () (goto-char (point-min)) (forward-line 1) @@ -1134,20 +517,18 @@ (if (eq (car-safe data) 'Manual-follow-xref) (eval data) (error "no manual cross-reference there."))) - (let ((Manual-match-topic-exactly t) - (Manual-query-multiple-pages nil)) - (or (manual-entry name-or-event) - ;; If that didn't work, maybe it's in a different section than the - ;; man page writer expected. For example, man pages tend assume - ;; that all user programs are in section 1, but X tends to generate - ;; makefiles that put things in section "n" instead... - (and (string-match "[ \t]*([^)]+)\\'" name-or-event) - (progn - (message "No entries found for %s; checking other sections..." - name-or-event) - (manual-entry - (substring name-or-event 0 (match-beginning 0)) - nil t))))))) + (or (manual-entry name-or-event) + ;; If that didn't work, maybe it's in a different section than the + ;; man page writer expected. For example, man pages tend assume + ;; that all user programs are in section 1, but X tends to generate + ;; makefiles that put things in section "n" instead... + (and (string-match "[ \t]*([^)]+)\\'" name-or-event) + (progn + (message "No entries found for %s; checking other sections..." + name-or-event) + (manual-entry + (substring name-or-event 0 (match-beginning 0)) + nil t)))))) (defun Manual-popup-menu (&optional event) "Pops up a menu of cross-references in this manual page. @@ -1188,9 +569,8 @@ (defun pager-cleanup-hook () "cleanup man page if called via $PAGER" (let ((buf-name (or buffer-file-name (buffer-name)))) - (if (and (or (string-match "^/tmp/man[0-9]+" buf-name) - (string-match ".*/man/\\(man\\|cat\\)[1-9a-z]/" buf-name)) - (not (string-match Manual-bogus-file-pattern buf-name))) + (if (or (string-match "^/tmp/man[0-9]+" buf-name) + (string-match ".*/man/\\(man\\|cat\\)[1-9a-z]/" buf-name)) (let (buffer manpage) (require 'man) (goto-char (point-min)) @@ -1200,7 +580,8 @@ (if (re-search-forward "[^ \t]") (goto-char (- (point) 1))) (if (looking-at "\\([a-zA-Z0-9]+\\)[ \t]*(") - (setq manpage (buffer-substring (match-beginning 1) (match-end 1))) + (setq manpage (buffer-substring (match-beginning 1) + (match-end 1))) (setq manpage "???")) (setq buffer (rename-buffer
--- a/lisp/packages/mic-paren.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/packages/mic-paren.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,8 +1,8 @@ ;;; mic-paren.el --- highlight matching paren. ;;; Version 1.2 - 96-09-19 -;;; Copyright (C) 1996 Mikael Sj,Av(Bdin (mic@docs.uu.se) +;;; Copyright (C) 1996 Mikael Sj�din (mic@docs.uu.se) ;;; -;;; Author: Mikael Sj,Av(Bdin -- mic@docs.uu.se +;;; Author: Mikael Sj�din -- mic@docs.uu.se ;;; Keywords: languages, faces ;;; ;;; This file is NOT part of GNU Emacs. @@ -318,7 +318,7 @@ (input-pending-p) ;[This might cause trouble since the ; function is unreliable] (condition-case paren-error - (mic-paren-highligt) + (mic-paren-highlight) (error (if (not (window-minibuffer-p (selected-window))) (message "mic-paren catched error (please report): %s" @@ -326,14 +326,14 @@ (defun mic-paren-command-idle-hook () (condition-case paren-error - (mic-paren-highligt) + (mic-paren-highlight) (error (if (not (window-minibuffer-p (selected-window))) (message "mic-paren catched error (please report): %s" paren-error))))) -(defun mic-paren-highligt () +(defun mic-paren-highlight () "The main-function of mic-paren. Does all highlighting, dinging, messages, cleaning-up." ;; Remove any old highlighting @@ -375,7 +375,7 @@ (char-after open))) (visible (pos-visible-in-window-p open))) ;; If highlight is appropriate - ;; highligt + ;; highlight ;; else ;; remove any old highlight (if (or visible paren-highlight-offscreen paren-sexp-mode) @@ -460,7 +460,7 @@ (char-after (1- close)))) (visible (pos-visible-in-window-p close))) ;; If highlight is appropriate - ;; highligt + ;; highlight ;; else ;; remove any old highlight (if (or visible paren-highlight-offscreen paren-sexp-mode)
--- a/lisp/packages/paren.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/packages/paren.el Mon Aug 13 09:15:11 2007 +0200 @@ -263,6 +263,7 @@ (and (/= (char-syntax (char-after beg)) ?\\) (/= (char-syntax (char-after beg)) ?\$) ;; XEmacs change + (matching-paren (char-after beg)) (/= (char-after (1- end)) (matching-paren (char-after beg))))) (if (eq paren-mode 'sexp)
--- a/lisp/packages/ps-print.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/packages/ps-print.el Mon Aug 13 09:15:11 2007 +0200 @@ -2561,7 +2561,9 @@ (defun ps-build-reference-face-lists () (if ps-auto-font-detect - (let ((faces (face-list)) + (let ((faces (if (eq ps-print-emacs-type 'xemacs) + (face-list 5) + (face-list))) the-face) (setq ps-ref-bold-faces nil ps-ref-italic-faces nil
--- a/lisp/packages/reportmail.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/packages/reportmail.el Mon Aug 13 09:15:11 2007 +0200 @@ -21,9 +21,6 @@ ;; file named COPYING. Among other things, the copyright notice ;; and this notice must be preserved on all copies. -;;; Synched up with: Not in FSF. -;;; #### Appears to duplicate time.el. Perhaps should be nuked. - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Installation @@ -121,20 +118,20 @@ ; ; HISTORY ; -; 19 dec 93 Jamie Zawinski <jwz@netscape.com> +; 19 dec 93 Jamie Zawinski <jwz@lucid.com> ; Protected it from edits of the *reportmail* buffer; made the process ; filters not interfere with the match data. ; -; 15 dec 93 Jamie Zawinski <jwz@netscape.com> +; 15 dec 93 Jamie Zawinski <jwz@lucid.com> ; Kyle renamed timer.el to itimer.el; made this use the new names. ; -; 27 aug 93 Jamie Zawinski <jwz@netscape.com> +; 27 aug 93 Jamie Zawinski <jwz@lucid.com> ; Use mail-extr to parse addresses if it is loadable. ; ; 15 oct 92 Benjamin Pierce (bcp@cs.cmu.edu) ; Merged recent changes ; -; 14 oct 92 Jamie Zawinski <jwz@netscape.com> +; 14 oct 92 Jamie Zawinski <jwz@lucid.com> ; Added support for xbiff++. ; ; 17 sep 92 Benjamin Pierce (bcp@cs.cmu.edu) @@ -143,16 +140,16 @@ ; 15 sep 92 Benjamin Pierce (bcp@cs.cmu.edu) ; Minor bug fixes. ; -; 1 may 92 Jamie Zawinski <jwz@netscape.com> +; 1 may 92 Jamie Zawinski <jwz@lucid.com> ; Converted to work with Kyle Jones' timer.el package. ; -; 3 may 91 Jamie Zawinski <jwz@netscape.com> +; 3 may 91 Jamie Zawinski <jwz@lucid.com> ; Made the display-time-sentinel make a fuss when the process dies. ; -; 26 mar 91 Jamie Zawinski <jwz@netscape.com> +; 26 mar 91 Jamie Zawinski <jwz@lucid.com> ; Merged with BCP's latest posted version ; -; 5 mar 91 Jamie Zawinski <jwz@netscape.com> +; 5 mar 91 Jamie Zawinski <jwz@lucid.com> ; Added compatibility with Emacs 18.57. ; ; 25 Jan 91 Benjamin Pierce (bcp@cs.cmu.edu) @@ -161,7 +158,7 @@ ; display-time-process-new-mail to prevent letterbombs ; (suggested by jwz). ; -; 15 feb 91 Jamie Zawinski <jwz@netscape.com> +; 15 feb 91 Jamie Zawinski <jwz@lucid.com> ; Made the values of display-time-message-separator and ; display-time-incoming-mail-file be initialized when this code ; starts, instead of forcing the user to do it. This means that @@ -171,7 +168,7 @@ ; messages be persistent (not go away at the first key). I wish ; GC messages didn't destroy it, though... ; -; 20 Dec 90 Jamie Zawinski <jwz@netscape.com> +; 20 Dec 90 Jamie Zawinski <jwz@lucid.com> ; Added new variables: display-time-no-file-means-no-mail, ; display-time-wait-hard, and display-time-junk-mail-ring-bell. ; Made display-time-message-separator be compared case-insensitively. @@ -208,8 +205,13 @@ ; Added facility for reporting incoming mail (modeled after gosmacs ; reportmail.ml package written by Benjamin Pierce). -(require 'itimer) ; this is xemacs, so why conditionalize? -(require 'mail-extr) + +(if (string-match "XEmacs" emacs-version) + (require 'itimer)) + +(condition-case () + (require 'mail-extr) + (error nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; User Variables ;;; @@ -357,6 +359,15 @@ (list 'display-time-debug-mesg (append (list 'format mesg) args)))) +(defmacro display-time-save-match-data (&rest body) + ;; Execute the BODY forms, restoring the global value of the match data. + ;; We need this because it's antisocial for process filters to change + ;; the regexp match registers. + (list 'let '((_match_data_ (match-data))) + (list 'unwind-protect + (cons 'progn body) + '(store-match-data _match_data_)))) + (defun display-time-init () ;; If the mail-file isn't set, figure it out. (or display-time-incoming-mail-file @@ -425,12 +436,29 @@ (append global-mode-string '(display-time-string)))) (setq display-time-string "time and load") - (let ((old (get-itimer "display-time"))) - (if old (delete-itimer old)) - (start-itimer "display-time" 'display-time-timer-function - display-time-interval display-time-interval) - (display-time-timer-function)) - + (if (featurep 'itimer) + (let ((old (get-itimer "display-time"))) + (if old (delete-itimer old)) + (start-itimer "display-time" 'display-time-timer-function + display-time-interval display-time-interval) + (display-time-timer-function)) + ;; if we don't have timers, then use one of the process mechanisms. + (setq display-time-loadst-process + (if (string-match "18\\.5[0-5]" (emacs-version)) + (start-process "display-time-loadst" nil + "loadst" + "-n" (int-to-string display-time-interval)) + (start-process "display-time-wakeup" nil + (concat exec-directory "wakeup") + (int-to-string display-time-interval)))) + (process-kill-without-query display-time-loadst-process) + (set-process-sentinel display-time-loadst-process + 'display-time-sentinel) + (set-process-filter display-time-loadst-process + (if (string-match "^18\\.5[0-5]" (emacs-version)) + 'display-time-filter-18-55 + 'display-time-filter-18-57))) + (if display-time-use-xbiff (progn (display-time-del-file display-time-mail-arrived-file) @@ -445,58 +473,124 @@ (error "Display time: xbiff failed. Check xbiff-arg-list")))))) (display-time-total-reset)) -(defun display-time-timer-function () - ;; was: (defun display-time-filter-18-57 (proc string) ; args are ignored - ;; but we're not supporting version 18 here and I'm trimming excess - (save-match-data - (display-time-debug "display-time-timer-function") - (if display-time-flush-echo-area - (progn - (display-time-debug "flush echo area") - (display-time-message ""))) - (let ((mailp (and (file-exists-p display-time-incoming-mail-file) - (not (eq 0 (nth 7 (file-attributes - display-time-incoming-mail-file))))))) - (if display-time-announce-mail - (if mailp - (display-time-process-new-mail) + +(defun display-time-sentinel (proc reason) + (display-time-save-match-data + ;; notice if the process has died an untimely death... + (display-time-debug "display-time-sentinel") + (cond ((memq (process-status proc) '(stop exit closed signal)) + (if (and (stringp reason) (string-match "\n?\n*\\'" reason)) + (setq reason (substring reason 0 (match-beginning 0)))) + (beep) + (setq display-time-string (format "%s" reason)) + (display-time-message "") + (message "process %s: %s (%s)" proc reason (process-status proc)))) + (display-time-force-redisplay))) + +(defun display-time-filter-18-55 (proc string) + (display-time-save-match-data + (if display-time-flush-echo-area (display-time-message "")) + ;; Desired data can't need more than the last 30 chars, + ;; so save time by flushing the rest. + ;; This way, if we have many different times all collected at once, + ;; we can discard all but the last few very fast. + (display-time-debug "display-time-filter-18-55") + (if (> (length string) 30) (setq string (substring string -30))) + ;; Now discard all but the very last one. + (while (and (> (length string) 4) + (string-match "[0-9]+:[0-9][0-9].." string 4)) + (setq string (substring string (match-beginning 0)))) + (if (string-match "[^0-9][0-9]+:" string) + (setq string (substring string 0 (1+ (match-beginning 0))))) + ;; If we're announcing mail and mail has come, process any new messages + (if display-time-announce-mail + (if (string-match "Mail" string) + (display-time-process-new-mail) + (display-time-total-reset))) + ;; Format the mode line time display + (let ((time-string (if (string-match "Mail" string) + (if display-time-announce-mail + display-time-mail-modeline + "Mail ")))) + (if (and display-time-time (string-match "[0-9]+:[0-9][0-9].." string)) + (setq time-string + (concat time-string + (substring string (match-beginning 0) (match-end 0)) + " "))) + (if display-time-day-and-date + (setq time-string + (concat time-string + (substring (current-time-string) 0 11)))) + (if (and display-time-load (string-match "[0-9]+\\.[0-9][0-9]" string)) + (setq time-string + (concat time-string + (substring string (match-beginning 0) (match-end 0)) + " "))) + ;; Install the new time for display. + (setq display-time-string time-string) + (display-time-force-redisplay)))) + +(defun display-time-filter-18-57 (proc string) ; args are ignored + (display-time-save-match-data + (display-time-debug "display-time-filter-18-57") + (if display-time-flush-echo-area + (progn + (display-time-debug "flush echo area") + (display-time-message ""))) + (let ((mailp (and (file-exists-p display-time-incoming-mail-file) + (not (eq 0 (nth 7 (file-attributes + display-time-incoming-mail-file))))))) + (if display-time-announce-mail + (if mailp + (display-time-process-new-mail) (display-time-total-reset))) - ;; Format the mode line time display - (let ((time-string (if mailp - (if display-time-announce-mail - display-time-mail-modeline + ;; Format the mode line time display + (let ((time-string (if mailp + (if display-time-announce-mail + display-time-mail-modeline "Mail ")))) - (if display-time-time - (let* ((time (current-time-string)) - (hour (read (substring time 11 13))) - (pm (>= hour 12))) - (if (> hour 12) (setq hour (- hour 12))) - (if (= hour 0) (setq hour 12)) - (setq time-string - (concat time-string - (format "%d" hour) (substring time 13 16) - (if pm "pm " "am "))))) - (if display-time-day-and-date + (if display-time-time + (let* ((time (current-time-string)) + (hour (read (substring time 11 13))) + (pm (>= hour 12))) + (if (> hour 12) (setq hour (- hour 12))) + (if (= hour 0) (setq hour 12)) (setq time-string (concat time-string - (substring (current-time-string) 0 11)))) - (if display-time-load - (setq time-string - (concat time-string - (condition-case () - (let* ((la (car (load-average))) - (load (if (zerop la) - nil - (format "%03d" la)))) - (if load - (concat (substring load 0 -2) - "." (substring load -2)) - "")) - (error "load-error")) - " "))) - ;; Install the new time for display. - (setq display-time-string time-string) - (force-mode-line-update t))))) + (format "%d" hour) (substring time 13 16) + (if pm "pm " "am "))))) + (if display-time-day-and-date + (setq time-string + (concat time-string + (substring (current-time-string) 0 11)))) + (if display-time-load + (setq time-string + (concat time-string + (condition-case () + (let* ((la (car (load-average))) + (load (if (zerop la) + nil + (format "%03d" la)))) + (if load + (concat (substring load 0 -2) + "." (substring load -2)) + "")) + (error "load-error")) + " "))) + ;; Install the new time for display. + (setq display-time-string time-string) + + (display-time-force-redisplay))))) + +(defun display-time-timer-function () + (display-time-filter-18-57 nil nil)) + +(defun display-time-force-redisplay () + "Force redisplay of all buffers' mode lines to be considered." + (save-excursion (set-buffer (other-buffer))) + (set-buffer-modified-p (buffer-modified-p)) + ;; Do redisplay right now, if no input pending. + (sit-for 0)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Mail processing ;;; @@ -563,6 +657,9 @@ (display-time-message "") ; clear the echo-area. ) +(or (fboundp 'buffer-disable-undo) + (fset 'buffer-disable-undo 'buffer-flush-undo)) + (defun display-time-process-new-mail () (setq display-time-may-need-to-reset t) (let ((mail-buffer (get-buffer display-time-mail-buffer-name)) @@ -693,8 +790,7 @@ ;; clear the thing, like, don't bother, that's annoying. (if (and in-echo-area-already (string= "" str)) nil - ;; XEmacs version fix - (if (and (string= str "") (not (string-match "^18" emacs-version))) + (if (and (string= str "") (string-match "^19" emacs-version)) (message nil) (message "%s" str))))) @@ -761,6 +857,8 @@ "" (concat " (" subject ")"))) (print-from (display-time-truncate from display-time-max-from-length)) + (short-from (display-time-truncate + (display-time-extract-short-addr from) 25)) (print-to (if (display-time-member to display-time-my-addresses) "" (display-time-truncate @@ -873,7 +971,7 @@ "When non-NIL, reportmail displays status messages in real time.") (defun display-time-debug-mesg (mesg) - (save-match-data + (display-time-save-match-data (if display-time-debugging-messages (progn (message "Reportmail: %s" mesg)
--- a/lisp/packages/scroll-in-place.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/packages/scroll-in-place.el Mon Aug 13 09:15:11 2007 +0200 @@ -1556,8 +1556,9 @@ ;; recover. (setq scroll-boundary-error-command this-command scroll-boundary-error-point initial-point) - (signal (if (< lines 0) 'beginning-of-buffer 'end-of-buffer) - nil)) + (when signal-error-on-buffer-boundary + (signal (if (< lines 0) 'beginning-of-buffer 'end-of-buffer) + nil))) ;;; Some convenience redefinitions for modes that don't like scroll-in-place
--- a/lisp/packages/vc.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/packages/vc.el Mon Aug 13 09:15:11 2007 +0200 @@ -114,8 +114,9 @@ "Maximum number of saved comments in the comment ring.") ;;; XEmacs - This is dumped into loaddefs.el already. -;; (defvar diff-switches "-c" -;; "*A string or list of strings specifying switches to be passed to diff.") +;; Not any more! -sb +(defvar diff-switches "-c" + "*A string or list of strings specifying switches to be passed to diff.") ;;;###autoload (defvar vc-checkin-hook nil @@ -2020,7 +2021,7 @@ file (vc-do-command 0 "prs" file 'MASTER) (vc-do-command 0 "rlog" file 'MASTER) - (vc-do-command 0 "cvs" file 'WORKFILE "rlog") + (vc-do-command 0 "cvs" file 'WORKFILE "log") (vc-do-command 0 "cleartool" file 'WORKFILE "lshistory"))) (defun vc-backend-assign-name (file name)
--- a/lisp/prim/about.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/prim/about.el Mon Aug 13 09:15:11 2007 +0200 @@ -155,7 +155,7 @@ (toggle-read-only 0) (let ((rest (if who-to-load (list who-to-load) - '(steve mrb cthomp wing stig jwz mly vladimir baw piper bw wmperry))) + '(steve mrb cthomp wing stig jwz mly vladimir baw piper bw wmperry kyle))) (got-error nil)) (while rest (let* ((who (car rest)) @@ -205,7 +205,7 @@ (goto-char (point-max)) (insert "\n ") - (let ((rest '(steve mrb cthomp wing stig linebreak jwz mly vladimir linebreak baw piper bw linebreak wmperry)) + (let ((rest '(steve mrb cthomp wing stig linebreak jwz mly vladimir linebreak baw piper bw linebreak wmperry kyle)) (got-error nil)) (while rest (if (eq (car rest) 'linebreak) @@ -290,6 +290,7 @@ ('stig "About Jonathan Stigelman") ('steve "About Steve Baur") ('mrb "About Martin Buchholz") + ('kyle "About Kyle Jones") ('others "About Everyone") ('features "New XEmacs Features") ('history "XEmacs History") @@ -681,7 +682,7 @@ framework for software engineers. It runs atop XEmacs and is available from his firm, InfoDock Associates, which offers custom development and support packages for corporate users of XEmacs, - GNU Emacs and InfoDock. See \"http://www.infodock.com>\". + GNU Emacs and InfoDock. See \"http://www.infodock.com\". His interests include user interfaces, information management, CASE tools, communications and enterprise integration.") @@ -737,6 +738,23 @@ (insert " to go back to the previous page.\n") ) + ((eq xref 'kyle) + (about-face "Kyle Jones" 'bold) + (insert " <kyle_jones@wonderworks.com> + + Author of VM, a mail-reading package that is included in + the standard XEmacs distribution, and contributor of many + improvements and bug fixes. Unlike RMAIL and MH-E, VM + uses the standard UNIX mailbox format for its folders; + thus, you can use VM concurrently with other UNIX mail + readers such as Berkeley Mail and ELM. + See \"http://www.wonderworks.com/kyle/\".") + + (insert "\n\n\tClick ") + (about-xref "here" prev-page "Return to previous page") + (insert " to go back to the previous page.\n") + ) + ((eq xref 'others) (insert "Click ") (about-xref "here" 'about "Return to previous page") @@ -779,7 +797,7 @@ framework for software engineers. It runs atop XEmacs and is available from his firm, InfoDock Associates, which offers custom development and support packages for corporate users of XEmacs, - GNU Emacs and InfoDock. See \"http://www.infodock.com>\". + GNU Emacs and InfoDock. See \"http://www.infodock.com\". His interests include user interfaces, information management, CASE tools, communications and enterprise integration. @@ -789,13 +807,14 @@ the PNG support, some of the GIF/JPEG support, the strikethru face attribute support). - Kyle Jones <kyle@crystal.wonderworks.com> - Author of VM (View Mail), a mail-reading package that is - included in the standard XEmacs distribution, and - contributor of many improvements and bug fixes. Unlike most - other mail-reading packages, VM uses the standard Unix-mail - format for its mailboxes; thus, you can use VM concurrently - with standard mail readers such as Unix mail and ELM. + ") (about-xref "Kyle Jones" 'kyle "Find out more about Kyle Jones") (insert " <kyle_jones@wonderworks.com> + Author of VM, a mail-reading package that is included in + the standard XEmacs distribution, and contributor of many + improvements and bug fixes. Unlike RMAIL and MH-E, VM + uses the standard UNIX mailbox format for its folders; + thus, you can use VM concurrently with other UNIX mail + readers such as Berkeley Mail and ELM. + See \"http://www.wonderworks.com/kyle/\" Darrell Kindred <Darrell.Kindred@cmu.edu> Unofficial maintainer of the xemacs-beta list of extant bugs @@ -838,6 +857,24 @@ Author of the code used to connect XEmacs with ToolTalk, and of an early client of the external Emacs widget. + David Moore <dmoore@UCSD.EDU> + David has contributed greatly to the quest to speed up XEmacs. + He is a student in the Computer Systems Laboratory at UCSD. + When he manages to have free time, he usually spends it on 200 + mile bicycle rides, learning german or showing people the best + mail & news environment he's found in 10 years. (That'd be + XEmacs, Gnus and bbdb, of course.) He can be found at + `druidmuck.egbt.org 4201' at various hours of the day. + + Hrvoje Niksic <hniksic@srce.hr> + Hrvoje is currently a student at the Faculty of Electrical + Engineering and Computing in Zagreb, Croatia. He works part- + time at SRCE, where he helps run the network machines. + In his free time he is helping develop free software (especially + XEmacs, as well as GNU software) and is writing his own -- he has + written a small network mirroring utility Wget, see + \"ftp://gnjilux.cc.fer.hr/pub/unix/util/wget/\". + In addition to those just mentioned, the following people have spent a great deal of effort providing feedback, testing beta versions of XEmacs, providing patches to the source code, or @@ -944,14 +981,13 @@ Ketil Z Malde <ketil@ii.uib.no> Steve March <smarch@quaver.urbana.mcd.mot.com> Pekka Marjola <pema@iki.fi> - Simon Marshall <Simon.Marshall@mail.esrin.esa.it> + Simon Marshall <simon@gnu.ai.mit.edu> Dave Mason <dmason@plg.uwaterloo.ca> Jaye Mathisen <mrcpu@cdsnet.net> Michael Meissner <meissner@osf.org> David M. Meyer <meyer@ns.uoregon.edu> Brad Miller <bmiller@cs.umn.edu> Jeff Miller <jmiller@bay1.bayserve.net> - David Moore <dmoore@UCSD.EDU> John Morey <jmorey@crl.com> Rob Mori <rob.mori@sun.com> Heiko Muenkel <muenkel@tnt.uni-hannover.de> @@ -960,7 +996,6 @@ Lynn D. Newton <lynn@ives.phx.mcd.mot.com> Casey Nielson <knielson@joule.elee.calpoly.edu> Georg Nikodym <Georg.Nikodym@canada.sun.com> - Hrvoje Niksic <hniksic@srce.hr> Andy Norman <ange@hplb.hpl.hp.com> Joseph J. Nuspl Jr. <nuspl@cc.purdue.edu> Kim Nyberg <kny@tekla.fi>
--- a/lisp/prim/advocacy.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/prim/advocacy.el Mon Aug 13 09:15:11 2007 +0200 @@ -18,7 +18,7 @@ ;; You should have received a copy of the GNU General Public License ;; along with XEmacs; see the file COPYING. If not, write to the -;; Free Software Foundation, 59 Temple Place - Suite 330, +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;;###autoload @@ -69,7 +69,7 @@ (defun praise-be-unto-emacs (&optional arg) (interactive "_p") (error "Obsolete function. Use `praise-be-unto-xemacs'.")) -(make-obsolete 'praise-be-unto-emacs "use praise-be-unto-xemacs") +(make-compatible 'praise-be-unto-emacs "use praise-be-unto-xemacs") ;;;###autoload (defun all-hail-xemacs (&optional arg) @@ -81,4 +81,6 @@ (defun all-hail-emacs (&optional arg) (interactive "_p") (error "Obsolete function. Use `all-hail-xemacs'.")) -(make-obsolete 'all-hail-emacs "use all-hail-xemacs") +(make-compatible 'all-hail-emacs "use all-hail-xemacs") + +;;; advocacy.el ends here
--- a/lisp/prim/auto-autoloads.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/prim/auto-autoloads.el Mon Aug 13 09:15:11 2007 +0200 @@ -3,6 +3,62 @@ ;;; See update-autoloads.sh and autoload.el for more details. +;;;### (autoloads (BibTeX-auto-store) "latex" "auctex/latex.el") + +(autoload 'BibTeX-auto-store "latex" "\ +This function should be called from bibtex-mode-hook. +It will setup BibTeX to store keys in an auto file." nil nil) + +;;;*** + +;;;### (autoloads nil "tex-info" "auctex/tex-info.el") + +;;;*** + +;;;### (autoloads (japanese-latex-mode japanese-plain-tex-mode) "tex-jp" "auctex/tex-jp.el") + +(autoload 'japanese-plain-tex-mode "tex-jp" "\ +Major mode for editing files of input for Japanese plain TeX. +Set japanese-TeX-mode to t, and enters plain-tex-mode." t nil) + +(autoload 'japanese-latex-mode "tex-jp" "\ +Major mode for editing files of input for Japanese plain TeX. +Set japanese-TeX-mode to t, and enters latex-mode." t nil) + +;;;*** + +;;;### (autoloads (TeX-submit-bug-report TeX-insert-quote TeX-auto-generate-global TeX-auto-generate ams-tex-mode) "tex" "auctex/tex.el") + +(autoload 'ams-tex-mode "tex" "\ +Major mode for editing files of input for AmS TeX. +See info under AUC TeX for documentation. + +Special commands: +\\{TeX-mode-map} + +Entering AmS-tex-mode calls the value of text-mode-hook, +then the value of TeX-mode-hook, and then the value +of AmS-TeX-mode-hook." t nil) + +(autoload 'TeX-auto-generate "tex" "\ +Generate style file for TEX and store it in AUTO. +If TEX is a directory, generate style files for all files in the directory." t nil) + +(autoload 'TeX-auto-generate-global "tex" "\ +Create global auto directory for global TeX macro definitions." t nil) + +(autoload 'TeX-insert-quote "tex" "\ +Insert the appropriate quote marks for TeX. +Inserts the value of `TeX-open-quote' (normally ``) or `TeX-close-quote' +\(normally '') depending on the context. If `TeX-quote-after-quote' +is non-nil, this insertion works only after \". +With prefix argument, always inserts \" characters." t nil) + +(autoload 'TeX-submit-bug-report "tex" "\ +Submit via mail a bug report on AUC TeX" t nil) + +;;;*** + ;;;### (autoloads (batch-byte-recompile-directory batch-byte-recompile-directory-norecurse batch-byte-compile display-call-tree byte-compile-sexp byte-compile compile-defun byte-compile-file byte-recompile-file byte-recompile-directory byte-force-recompile) "bytecomp" "bytecomp/bytecomp.el") (autoload 'byte-force-recompile "bytecomp" "\ @@ -995,25 +1051,6 @@ ;;;*** -;;;### (autoloads (define-widget) "widget" "custom/widget.el") - -(autoload 'define-widget "widget" "\ -Define a new widget type named NAME from CLASS. - -NAME and CLASS should both be symbols, CLASS should be one of the -existing widget types, or nil to create the widget from scratch. - -After the new widget has been defined, the following two calls will -create identical widgets: - -* (widget-create NAME) - -* (apply 'widget-create CLASS ARGS) - -The third argument DOC is a documentation string for the widget." nil nil) - -;;;*** - ;;;### (autoloads (edebug-eval-top-level-form def-edebug-spec) "edebug" "edebug/edebug.el") (autoload 'def-edebug-spec "edebug" "\ @@ -2427,7 +2464,17 @@ ;;;*** -;;;### (autoloads (smart-tags-file smart-tags-file-path smart-objc-oobr smart-objc smart-fortran-at-tag-p smart-c++-oobr smart-c++ smart-c-at-tag-p smart-asm-at-tag-p) "hmouse-tag" "hyperbole/hmouse-tag.el") +;;;### (autoloads (hkey-help-show) "hmouse-drv" "hyperbole/hmouse-drv.el") + +(autoload 'hkey-help-show "hmouse-drv" "\ +Saves prior frame configuration if BUFFER displays help. Displays BUFFER. + +Optional second arg CURRENT-WINDOW non-nil forces display of buffer within +the current window. By default, it is displayed in another window." nil nil) + +;;;*** + +;;;### (autoloads (smart-tags-file smart-tags-file-path smart-objc smart-lisp-mode-p smart-java-at-tag-p smart-java smart-fortran-at-tag-p smart-c++ smart-c-at-tag-p smart-asm-at-tag-p) "hmouse-tag" "hyperbole/hmouse-tag.el") (autoload 'smart-asm-at-tag-p "hmouse-tag" "\ Return assembly tag name that point is within, else nil." nil nil) @@ -2443,35 +2490,39 @@ appropriate buffer and has moved the cursor to the selected buffer. If: - (1) on a '#include' statement, the include file is displayed; - Look for include file in directory lists 'smart-c-cpp-include-dirs' - and 'smart-c-include-dirs'. + (1) on a `#include' statement, the include file is displayed; + Look for include file in directory lists `smart-c-cpp-include-dirs' + and `smart-c-include-dirs'. (2) on a C++ identifier, the identifier definition is displayed, - assuming the identifier is found within an 'etags' generated tag file + assuming the identifier is found within an `etags' generated tag file in the current directory or any of its ancestor directories. - (3) if 'smart-c-use-lib-man' is non-nil, the C++ identifier is + (3) if `smart-c-use-lib-man' is non-nil, the C++ identifier is recognized as a library symbol, and a man page is found for the identifier, then the man page is displayed." t nil) -(autoload 'smart-c++-oobr "hmouse-tag" "\ -Jumps to the definition of selected C++ construct via OO-Browser support. -Optional JUNK is ignored. Does nothing if the OO-Browser is not available. +(autoload 'smart-fortran-at-tag-p "hmouse-tag" "\ +Return Fortran tag name that point is within, else nil." nil nil) + +(autoload 'smart-java "hmouse-tag" "\ +Jumps to the definition of optional Java IDENTIFIER or the one at point. +Optional second arg NEXT means jump to next matching Java tag. It assumes that its caller has already checked that the key was pressed in an appropriate buffer and has moved the cursor to the selected buffer. -If key is pressed: - (1) on a '#include' statement, the include file is displayed; - Look for include file in directory lists 'smart-c-cpp-include-dirs' - and 'smart-c-include-dirs'. - (2) within a method declaration, its definition is displayed; - (3) on a class name, the class definition is shown. - - (2) and (3) require that an OO-Browser Environment has been loaded with - the {M-x br-env-load RTN} command." t nil) - -(autoload 'smart-fortran-at-tag-p "hmouse-tag" "\ -Return Fortran tag name that point is within, else nil." nil nil) +If: + (1) within a commented @see cross-reference, the referent is displayed; + (2) on a `package' or `import' statement, the referent is displayed; + Look for referent files in the directory list `smart-java-package-dirs'. + (3) on an Java identifier, the identifier definition is displayed, + assuming the identifier is found within an `etags' generated tag file + in the current directory or any of its ancestor directories." t nil) + +(autoload 'smart-java-at-tag-p "hmouse-tag" "\ +Return Java tag name that point is within, else nil." nil nil) + +(autoload 'smart-lisp-mode-p "hmouse-tag" "\ +Return t if in a mode which uses Lisp symbols." nil nil) (autoload 'smart-objc "hmouse-tag" "\ Jumps to the definition of optional Objective-C IDENTIFIER or the one at point. @@ -2481,40 +2532,24 @@ appropriate buffer and has moved the cursor to the selected buffer. If: - (1) on a '#include' statement, the include file is displayed; - Look for include file in directory lists 'smart-c-cpp-include-dirs' - and 'smart-c-include-dirs'. + (1) on a `#include' statement, the include file is displayed; + Look for include file in directory lists `smart-c-cpp-include-dirs' + and `smart-c-include-dirs'. (2) on an Objective-C identifier, the identifier definition is displayed, - assuming the identifier is found within an 'etags' generated tag file + assuming the identifier is found within an `etags' generated tag file in the current directory or any of its ancestor directories. - (3) if 'smart-c-use-lib-man' is non-nil, the Objective-C identifier is + (3) if `smart-c-use-lib-man' is non-nil, the Objective-C identifier is recognized as a library symbol, and a man page is found for the identifier, then the man page is displayed." t nil) -(autoload 'smart-objc-oobr "hmouse-tag" "\ -Jumps to the definition of selected Objective-C construct via OO-Browser support. -Optional JUNK is ignored. Does nothing if the OO-Browser is not available. - -It assumes that its caller has already checked that the key was pressed in an -appropriate buffer and has moved the cursor to the selected buffer. - -If key is pressed: - (1) on a '#include' statement, the include file is displayed; - Look for include file in directory lists 'smart-c-cpp-include-dirs' - and 'smart-c-include-dirs'. - (2) within a method declaration, its definition is displayed; - (3) on a class name, the class definition is shown. - - (2) and (3) require that an OO-Browser Environment has been loaded with - the {M-x br-env-load RTN} command." t nil) - (autoload 'smart-tags-file-path "hmouse-tag" "\ Expand relative FILE name by looking it up in the nearest tags file. Return FILE unchanged if it exists relative to the current directory or cannot be expanded via a tags file." nil nil) (autoload 'smart-tags-file "hmouse-tag" "\ -Return appropriate tags file name for CURR-FILENAME or 'tags-file-name'." nil nil) +Return appropriate tags file name for CURR-FILENAME or `tags-file-name'. +Optional NAME-OF-TAGS-FILE is the literal filename for which to look." nil nil) ;;;*** @@ -2527,11 +2562,15 @@ ;;;*** -;;;### (autoloads (hypb:configuration) "hypb" "hyperbole/hypb.el") +;;;### (autoloads (hypb:display-file-with-logo hypb:configuration) "hypb" "hyperbole/hypb.el") (autoload 'hypb:configuration "hypb" "\ Insert Emacs configuration information at the end of optional OUT-BUF or the current buffer." nil nil) +(autoload 'hypb:display-file-with-logo "hypb" "\ +Display an optional text FILE with the InfoDock Associates logo prepended. +Without file, logo is prepended to the current buffer." nil nil) + ;;;*** ;;;### (autoloads nil "hyperbole" "hyperbole/hyperbole.el") @@ -3696,7 +3735,7 @@ ;;;### (autoloads (ksh-mode) "ksh-mode" "modes/ksh-mode.el") (autoload 'ksh-mode "ksh-mode" "\ -ksh-mode $Revision: 1.8 $ - Major mode for editing (Bourne, Korn or Bourne again) +ksh-mode $Revision: 1.10 $ - Major mode for editing (Bourne, Korn or Bourne again) shell scripts. Special key bindings and commands: \\{ksh-mode-map} @@ -5048,7 +5087,7 @@ (autoload 'vhdl-mode "vhdl-mode" "\ Major mode for editing VHDL code. -vhdl-mode $Revision: 1.8 $ +vhdl-mode $Revision: 1.10 $ To submit a problem report, enter `\\[vhdl-submit-bug-report]' from a vhdl-mode buffer. This automatically sets up a mail buffer with version information already added. You just need to add a description of the @@ -5214,7 +5253,7 @@ current buffer file pathname. If optional LIB-TABLE-P is non-nil, add to Library Environment, otherwise add to System Environment. If optional SAVE-FILE is t, the Environment is then stored to the filename given by -'br-env-file'. If SAVE-FILE is non-nil and not t, its string value is used +`br-env-file'. If SAVE-FILE is non-nil and not t, its string value is used as the file to which to save the Environment." t nil) (autoload 'br-to-from-viewer "br" "\ @@ -5738,17 +5777,6 @@ ;;;*** -;;;### (autoloads (display-column-mode) "column" "packages/column.el") - -(autoload 'display-column-mode "column" "\ -Toggle display column mode. -With prefix arg, turn display column mode on iff arg is positive. - -When display column mode is on, the current column and line number are -displayed in the mode line." t nil) - -;;;*** - ;;;### (autoloads (compare-windows) "compare-w" "packages/compare-w.el") (autoload 'compare-windows "compare-w" "\ @@ -5903,25 +5931,6 @@ ;;;*** -;;;### (autoloads (diff-backup diff) "diff" "packages/diff.el") - -(defvar diff-switches (purecopy "-c") "\ -*A string or list of strings specifying switches to be passed to diff.") - -(autoload 'diff "diff" "\ -Find and display the differences between OLD and NEW files. -Interactively the current buffer's file name is the default for NEW -and a backup file for NEW is the default for OLD. -With prefix arg, prompt for diff switches." t nil) - -(autoload 'diff-backup "diff" "\ -Diff this file with its backup file or vice versa. -Uses the latest backup, if there are several numerical backups. -If this file is a backup, diff it with its original. -The backup file is the first file given to `diff'." t nil) - -;;;*** - ;;;### (autoloads (edit-faces) "edit-faces" "packages/edit-faces.el") (autoload 'edit-faces "edit-faces" "\ @@ -6139,8 +6148,6 @@ ;;;### (autoloads (turn-on-fast-lock fast-lock-mode) "fast-lock" "packages/fast-lock.el") -(defvar fast-lock-mode nil) - (autoload 'fast-lock-mode "fast-lock" "\ Toggle Fast Lock mode. With arg, turn Fast Lock mode on if and only if arg is positive and the buffer @@ -6153,9 +6160,9 @@ buffer's file, and its `font-lock-keywords' match those that you are using. Font Lock caches may be saved: - - When you save the file's buffer. - - When you kill an unmodified file's buffer. - - When you exit Emacs, for all unmodified or saved buffers. +- When you save the file's buffer. +- When you kill an unmodified file's buffer. +- When you exit Emacs, for all unmodified or saved buffers. Depending on the value of `fast-lock-save-events'. See also the commands `fast-lock-read-cache' and `fast-lock-save-cache'. @@ -6169,7 +6176,7 @@ (autoload 'turn-on-fast-lock "fast-lock" "\ Unconditionally turn on Fast Lock mode." nil nil) -(if (fboundp 'add-minor-mode) (add-minor-mode 'fast-lock-mode nil)) +(when (fboundp 'add-minor-mode) (defvar fast-lock-mode nil) (add-minor-mode 'fast-lock-mode nil)) ;;;*** @@ -6624,6 +6631,65 @@ ;;;*** +;;;### (autoloads (dired-do-igrep-find dired-do-igrep igrep-find-define igrep-find igrep-define igrep) "igrep" "packages/igrep.el") + +(autoload 'igrep "igrep" "\ +*Run `grep` PROGRAM to match EXPRESSION in FILES. +The output is displayed in the *igrep* buffer, which \\[next-error] and +\\[compile-goto-error] parse to find each line of matched text. + +PROGRAM may be nil, in which case it defaults to `igrep-program'. + +EXPRESSION is automatically delimited by `igrep-expression-quote-char'. + +FILES is either a file name pattern (expanded by the shell named by +`shell-file-name') or a list of file name patterns. + +Optional OPTIONS is also passed to PROGRAM; it defaults to `igrep-options'. + +If a prefix argument (\\[universal-argument]) is given when called interactively, +or if `igrep-read-options' is set, OPTIONS is read from the minibuffer. + +If two prefix arguments (\\[universal-argument] \\[universal-argument]) are given when called interactively, +or if `igrep-read-multiple-files' is set, FILES is read from the minibuffer +multiple times. + +If three prefix arguments (\\[universal-argument] \\[universal-argument] \\[universal-argument]) are given when called interactively, +or if `igrep-read-options' and `igrep-read-multiple-files' are set, +OPTIONS is read and FILES is read multiple times. + +If `igrep-find' is non-nil, the directory or directories +containing FILES is recursively searched for files whose name matches +the file name component of FILES (and whose contents match +EXPRESSION)." t nil) + +(autoload 'igrep-define "igrep" "\ +Define ANALOGUE-COMMAND as an `igrep' analogue command. +Optional (VARIABLE VALUE) arguments specify temporary bindings for the command." nil 'macro) + +(autoload 'igrep-find "igrep" "\ +*Run `grep` via `find`; see \\[igrep] and `igrep-find'. +All arguments (including prefix arguments, when called interactively) +are handled by `igrep'." t nil) + +(autoload 'igrep-find-define "igrep" "\ +Define ANALOGUE-COMMAND-find as an `igrep' analogue `find` command. +Optional (VARIABLE VALUE) arguments specify temporary bindings for the command." nil 'macro) + +(autoload 'dired-do-igrep "igrep" "\ +*Run `grep` PROGRAM to match EXPRESSION (with optional OPTIONS) +on the marked (or next prefix ARG) files." t nil) + +(defalias 'dired-do-grep 'dired-do-igrep) + +(autoload 'dired-do-igrep-find "igrep" "\ +*Run `grep` PROGRAM to match EXPRESSION (with optional OPTIONS) +on the marked (or next prefix ARG) directories." t nil) + +(defalias 'dired-do-grep-find 'dired-do-igrep-find) + +;;;*** + ;;;### (autoloads (Info-elisp-ref Info-emacs-key Info-goto-emacs-key-command-node Info-goto-emacs-command-node Info-emacs-command Info-search Info-visit-file Info-goto-node Info-query info) "info" "packages/info.el") (autoload 'info "info" "\ @@ -6909,8 +6975,6 @@ ;;;### (autoloads (turn-on-lazy-lock lazy-lock-mode) "lazy-lock" "packages/lazy-lock.el") -(defvar lazy-lock-mode nil) - (autoload 'lazy-lock-mode "lazy-lock" "\ Toggle Lazy Lock mode. With arg, turn Lazy Lock mode on if and only if arg is positive and the buffer @@ -6937,7 +7001,7 @@ (autoload 'turn-on-lazy-lock "lazy-lock" "\ Unconditionally turn on Lazy Lock mode." nil nil) -(add-minor-mode 'lazy-lock-mode " Lazy") +(when (fboundp 'add-minor-mode) (defvar lazy-lock-mode nil) (add-minor-mode 'lazy-lock-mode nil)) ;;;*** @@ -7007,19 +7071,7 @@ ;;;### (autoloads (manual-entry) "man" "packages/man.el") (autoload 'manual-entry "man" "\ -Display the Unix manual entry (or entries) for TOPIC. -If prefix arg is given, modify the search according to the value: - 2 = complement default exact matching of the TOPIC name; - exact matching default is specified by `Manual-match-topic-exactly' - 3 = force a search of the unformatted man directories - 4 = both 2 and 3 -The manual entries are searched according to the variable -Manual-directory-list, which should be a list of directories. If -Manual-directory-list is nil, \\[Manual-directory-list-init] is -invoked to create this list from the MANPATH environment variable. -See the variable Manual-topic-buffer which controls how the buffer -is named. See also the variables Manual-match-topic-exactly, -Manual-query-multiple-pages, and Manual-buffer-view-mode." t nil) +Display the Unix manual entry (or entries) for TOPIC." t nil) ;;;*** @@ -7805,7 +7857,7 @@ ;;;*** -;;;### (autoloads nil "itimer" "prim/itimer.el") +;;;### (autoloads nil "itimer-autosave" "prim/itimer-autosave.el") ;;;*** @@ -8981,7 +9033,7 @@ Otherwise, this command specifies the face for the next character inserted. Moving point or switching buffers before -typing a character to insert cancels the specification." nil nil) +typing a character to insert cancels the specification." t nil) (autoload 'facemenu-set-size-default "facemenu" nil t nil) @@ -9459,6 +9511,16 @@ ;;;*** +;;;### (autoloads (speedbar-frame-mode) "speedbar" "utils/speedbar.el") + +(autoload 'speedbar-frame-mode "speedbar" "\ +Enable or disable use of a speedbar. Positive number means turn +on, negative turns speedbar off, and nil means toggle. Once the +speedbar frame is activated, a buffer in `speedbar-mode' will be +displayed. Currently, only one speedbar is supported at a time." t nil) + +;;;*** + ;;;### (autoloads nil "timezone" "utils/timezone.el") (define-error 'invalid-date "Invalid date string")
--- a/lisp/prim/faces.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/prim/faces.el Mon Aug 13 09:15:11 2007 +0200 @@ -1343,7 +1343,7 @@ (let ((fg (face-foreground 'modeline-buffer-id 'global)) (font (face-font 'modeline-buffer-id 'global))) (when (and (null fg) (featurep 'x)) - (set-face-foreground 'modeline-buffer-id "blue" 'global '(color x))) + (set-face-foreground 'modeline-buffer-id "blue4" 'global '(color x))) (unless font (when (featurep 'x) (set-face-font 'modeline-buffer-id [bold-italic] nil '(mono x)) @@ -1357,7 +1357,7 @@ (let ((fg (face-foreground 'modeline-mousable 'global)) (font (face-font 'modeline-mousable 'global))) (when (and (null fg) (featurep 'x)) - (set-face-foreground 'modeline-mousable "red" 'global '(color x))) + (set-face-foreground 'modeline-mousable "firebrick" 'global '(color x))) (unless font (when (featurep 'x) (set-face-font 'modeline-mousable [bold] nil '(mono x)) @@ -1370,7 +1370,7 @@ (when (and (null fg) (featurep 'x)) (set-face-foreground 'modeline-mousable-minor-mode '(((color x) . "green4") - ((color x) . "green")) 'global)))) + ((color x) . "forestgreen")) 'global)))) (set-face-parent 'modeline-mousable-minor-mode 'modeline-mousable nil nil 'append) )
--- a/lisp/prim/files.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/prim/files.el Mon Aug 13 09:15:11 2007 +0200 @@ -144,8 +144,9 @@ nil means make them for files that have some already. `never' means do not make them.") -(defvar dired-kept-versions 2 - "*When cleaning directory, number of versions to keep.") +;; This is now defined in efs. +;(defvar dired-kept-versions 2 +; "*When cleaning directory, number of versions to keep.") (defvar delete-old-versions nil "*If t, delete excess backup versions silently. @@ -1409,7 +1410,7 @@ ;; Set the variable. "Variables" mode and eval are funny. (hack-one-local-variable var val)))))))) - +;; jwz - New Version 20.1/19.15 (defun hack-local-variables-prop-line (&optional force) ;; Set local variables specified in the -*- line. ;; Returns t if mode was set. @@ -1430,7 +1431,7 @@ ;; Parse the -*- line into the `result' alist. (cond ((not (search-forward "-*-" end t)) ;; doesn't have one. - (setq force t)) + nil) ((looking-at "[ \t]*\\([^ \t\n\r:;]+\\)\\([ \t]*-\\*-\\)") ;; Antiquated form: "-*- ModeName -*-". (setq result @@ -1465,23 +1466,22 @@ (setq result (cons (cons key val) result)) (skip-chars-forward " \t;"))) (setq result (nreverse result)))))) - - (if result - (let ((set-any-p (or force (hack-local-variables-p t))) - (mode-p nil)) - (while result - (let ((key (car (car result))) - (val (cdr (car result)))) - (cond ((eq key 'mode) - (setq mode-p t) - (funcall (intern (concat (downcase (symbol-name val)) - "-mode")))) - (set-any-p - (hack-one-local-variable key val)) - (t - nil))) - (setq result (cdr result))) - mode-p)))) + + (let ((set-any-p (or force (hack-local-variables-p t))) + (mode-p nil)) + (while result + (let ((key (car (car result))) + (val (cdr (car result)))) + (cond ((eq key 'mode) + (setq mode-p t) + (funcall (intern (concat (downcase (symbol-name val)) + "-mode")))) + (set-any-p + (hack-one-local-variable key val)) + (t + nil))) + (setq result (cdr result))) + mode-p))) (defconst ignored-local-variables (list 'enable-local-eval) @@ -2944,8 +2944,8 @@ "Test whether file resides on the local system. The special value 'unknown is returned if no remote file access package has been loaded." - (cond ((fboundp 'efs-ftp-path) (efs-ftp-path name)) - ((fboundp 'ange-ftp-ftp-name) (ange-ftp-ftp-name name)) - (t 'unknown))) + (cond ((featurep 'ange-ftp) (ange-ftp-ftp-path file-name)) + (t (require 'efs) + (efs-ftp-path file-name)))) ;;; files.el ends here
--- a/lisp/prim/help.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/prim/help.el Mon Aug 13 09:15:11 2007 +0200 @@ -780,6 +780,19 @@ (car obsolete) (format "use `%s' instead." (car obsolete))))))) +(defun function-compatible-p (function) + "Return non-nil if FUNCTION is present for Emacs compatibility." + (not (null (get function 'byte-compatible-info)))) + +(defun function-compatibility-doc (function) + "If FUNCTION is Emacs compatible, return a string describing this." + (let ((compatible (get function 'byte-compatible-info))) + (if compatible + (format "Emacs Compatible; %s" + (if (stringp (car compatible)) + (car compatible) + (format "use `%s' instead." (car compatible))))))) + ;Here are all the possibilities below spelled out, for the benefit ;of the I18N3 snarfer. ; @@ -894,12 +907,18 @@ ;; If the function is obsolete and is aliased, don't ;; even bother to report the documentation, as a further ;; encouragement to use the new function. - (let ((obsolete (function-obsoleteness-doc function))) + (let ((obsolete (function-obsoleteness-doc function)) + (compatible (function-compatibility-doc function))) (if obsolete (progn (princ obsolete stream) (terpri stream) (terpri stream))) + (if compatible + (progn + (princ compatible stream) + (terpri stream) + (terpri stream))) (if (not (and obsolete aliases)) (progn (princ doc stream) @@ -955,6 +974,19 @@ obsolete (format "use `%s' instead." obsolete)))))) +(defun variable-compatible-p (variable) + "Return non-nil if VARIABLE is Emacs compatible." + (not (null (get variable 'byte-compatible-variable)))) + +(defun variable-compatibility-doc (variable) + "If VARIABLE is Emacs compatible, return a string describing this." + (let ((compatible (get variable 'byte-compatible-variable))) + (if compatible + (format "Emacs Compatible; %s" + (if (stringp compatible) + compatible + (format "use `%s' instead." compatible)))))) + (defun built-in-variable-doc (variable) "Return a string describing whether VARIABLE is built-in." (let ((type (built-in-variable-type variable))) @@ -1045,12 +1077,18 @@ (princ "Documentation:") (terpri) (let ((doc (documentation-property variable 'variable-documentation)) - (obsolete (variable-obsoleteness-doc origvar))) + (obsolete (variable-obsoleteness-doc origvar)) + (compatible (variable-compatibility-doc origvar))) (if obsolete (progn (princ obsolete) (terpri) (terpri))) + (if compatible + (progn + (princ compatible) + (terpri) + (terpri))) ;; don't bother to print anything if variable is obsolete and aliased. (if (or (not obsolete) (not aliases)) (if doc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/prim/itimer-autosave.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,109 @@ +;;; itimer-autosave.el --- Autosave functions with itimers + +;; Copyright status unknown + +;; This file is part of XEmacs. + +;; XEmacs is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; XEmacs is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with XEmacs; see the file COPYING. If not, write to the Free +;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +;; 02111-1307, USA. + +;;; Synched up with: Not in FSF. + +;;; Commentary: + +;; itimer-driven auto-saves + +;;; Code: + +;jwz: this is preloaded so don't ;;;###autoload +(defvar auto-save-timeout 960 + "*Number of seconds idle time before auto-save. +Zero or nil means disable auto-saving due to idleness. + +The actual amount of idle time between auto-saves is logarithmically related +to the size of the current buffer. This variable is the number of seconds +after which an auto-save will happen when the current buffer is 50k or less; +the timeout will be 2 1/4 times this in a 200k buffer, 3 3/4 times this in a +1000k buffer, and 4 1/2 times this in a 2000k buffer. + +See also the variable `auto-save-interval', which controls auto-saving based +on the number of characters typed.") + +;jwz: this is preloaded so don't ;;;###autoload +(defvar auto-gc-threshold (/ gc-cons-threshold 3) + "*GC when this many bytes have been consed since the last GC, +and the user has been idle for `auto-save-timeout' seconds.") + +(defun auto-save-itimer () + "For use as a itimer callback function. +Auto-saves and garbage-collects based on the size of the current buffer +and the value of `auto-save-timeout', `auto-gc-threshold', and the current +keyboard idle-time." + (if (or (null auto-save-timeout) + (<= auto-save-timeout 0) + (eq (minibuffer-window) (selected-window))) + nil + (let ((buf-size (1+ (ash (buffer-size) -8))) + (delay-level 0) + (now (current-time)) + delay) + (while (> buf-size 64) + (setq delay-level (1+ delay-level) + buf-size (- buf-size (ash buf-size -2)))) + (if (< delay-level 4) + (setq delay-level 4)) + ;; delay_level is 4 for files under around 50k, 7 at 100k, 9 at 200k, + ;; 11 at 300k, and 12 at 500k, 15 at 1 meg, and 17 at 2 meg. + (setq delay (/ (* delay-level auto-save-timeout) 4)) + (let ((idle-time (if (or (not (consp last-input-time)) + (/= (car now) (car last-input-time))) + (1+ delay) + (- (car (cdr now)) (cdr last-input-time))))) + (and (> idle-time delay) + (do-auto-save)) + (and (> idle-time auto-save-timeout) + (> (consing-since-gc) auto-gc-threshold) + (garbage-collect))))) + ;; Look at the itimer that's currently running; if the user has changed + ;; the value of auto-save-timeout, modify this itimer to have the correct + ;; restart time. There will be some latency between when the user changes + ;; this variable and when it takes effect, but it will happen eventually. + (let ((self (get-itimer "auto-save"))) + (or self (error "auto-save-itimer can't find itself")) + (if (and auto-save-timeout (> auto-save-timeout 4)) + (or (= (itimer-restart self) (/ auto-save-timeout 4)) + (set-itimer-restart self (/ auto-save-timeout 4))))) + nil) + +(defun itimer-init-auto-gc () + (or noninteractive ; may be being run from after-init-hook in -batch mode. + (get-itimer "auto-save") + ;; the time here is just the first interval; if the user changes it + ;; later, it will adjust. + (let ((time (max 2 (/ (or auto-save-timeout 30) 4)))) + (start-itimer "auto-save" 'auto-save-itimer time time)))) + +(cond (purify-flag + ;; This file is being preloaded into an emacs about to be dumped. + ;; So arrange for the auto-save itimer to be started once emacs + ;; is launched. + (add-hook 'after-init-hook 'itimer-init-auto-gc)) + (t + ;; Otherwise, this file is being loaded into a normal, interactive + ;; emacs. Start the auto-save timer now. + (itimer-init-auto-gc))) + + +;;; itimer-autosave.el ends here
--- a/lisp/prim/itimer.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/prim/itimer.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,9 +1,11 @@ -;;; Interval timers for XEmacs -;;; Copyright (C) 1988, 1991, 1993 Kyle E. Jones -;;; Modified 5 Feb 91 by Jamie Zawinski <jwz@lucid.com> for Lucid Emacs -;;; And again, 15 Dec 93. -;;; -;; This file is part of XEmacs. +;;; itimer.el -- Interval timers for XEmacs + +;; Copyright (C) 1988, 1991, 1993, 1997 Kyle E. Jones + +;; Author: Kyle Jones <kyle_jones@wonderworks.com> +;; Keywords: extensions + +;; This file is part of XEmacs ;; XEmacs is free software; you can redistribute it and/or modify it ;; under the terms of the GNU General Public License as published by @@ -15,53 +17,76 @@ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. -;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the -;; Free Software Foundation, 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; A copy of the GNU General Public License can be obtained from this +;; program's author (send electronic mail to kyle@uunet.uu.net) or +;; from the Free Software Foundation, Inc., 59 Temple Place - Suite +;; 330, Boston, MA 02111-1307, USA. + +;;; Synched up with: Not in FSF -;;; Synched up with: Not in FSF. +;;; Commentary: + +;; Send bug reports to kyle_jones@wonderworks.com -;;; -;;; Send bug reports to kyle@uunet.uu.net. +;;; Code: + +(provide 'itimer) -;; The original v18 version of this file worked by having an external program -;; wake up once a second to generate an interrupt for emacs; then an emacs -;; process filter was used to schedule timers. -;; -;; This version works by associating with each timer a "timeout" object, -;; since the XEmacs/Lucid Emacs event loop has the concept of timers built -;; in to it. There is no single scheduler function; instead, each timer -;; re-sets itself as it is invoked. - -;; `itimer' feature means Emacs-Lisp programers get: -;; itimerp, itimer-value, itimer-restart, itimer-function, -;; set-itimer-value, set-itimer-restart, set-itimer-function -;; get-itimer, start-itimer, read-itimer, delete-itimer +;; `itimer' feature means Emacs-Lisp programmers get: +;; itimerp +;; itimer-value +;; itimer-restart +;; itimer-function +;; itimer-function-argument +;; set-itimer-value +;; set-itimer-restart +;; set-itimer-function +;; set-itimer-uses-argument +;; set-itimer-function-argument +;; get-itimer +;; start-itimer +;; read-itimer +;; delete-itimer ;; ;; Interactive users get these commands: -;; edit-itimers, list-itimers, start-itimer +;; edit-itimers +;; list-itimers +;; start-itimer ;; ;; See the doc strings of these functions for more information. -(defvar itimer-version "1.00" +(defvar itimer-version "1.01" "Version number of the itimer package.") (defvar itimer-list nil "List of all active itimers.") -;; not needed in XEmacs -;(defvar itimer-process nil -; "Process that drives all itimers.") +(defvar itimer-process nil + "Process that drives all itimers, if a subprocess is being used.") + +(defvar itimer-timer nil + "Emacs internal timer that drives the itimer system, if a subprocess +is not being used to drive the system.") + +(defvar itimer-timer-last-wakeup nil + "The time the timer driver function last ran.") -;; This value is maintained internally; it does not determine itimer -;; granularity. Itimer granularity is 1 second, plus delays due to -;; system and Emacs internal activity that delay dealing with process -;; output. -;; not needed in XEmacs -;(defvar itimer-process-next-wakeup 1 -; "Itimer process will wakeup to service running itimers within this -;many seconds.") +(defvar itimer-short-interval (if (featurep 'lisp-float-type) 1e-3 1) + "Interval used for scheduling an event a very short time in the future. +Used internally to make the scheduler wake up early. +Unit is seconds.") + +;; This value is maintained internally; it does not determine +;; itimer granularity. Itimer granularity is 1 second if your +;; Emacs doens't support floats or your system doesn't have a +;; clock with microsecond granularity. Otherwise granularity is +;; to the microsend, although you can't possibly get timers to be +;; executed with this kind of accuracy in practice. There will +;; be delays due to system and Emacs internal activity that delay +;; dealing with syunchronous events and process output. +(defvar itimer-next-wakeup itimer-short-interval + "Itimer process will wakeup to service running itimers within this +many seconds.") (defvar itimer-edit-map nil "Keymap used when in Itimer Edit mode.") @@ -85,10 +110,10 @@ ;; macros must come first... or byte-compile'd code will throw back its ;; head and scream. -(defmacro itimer-decf (variable) +(defmacro itimer-decrement (variable) (list 'setq variable (list '1- variable))) -(defmacro itimer-incf (variable) +(defmacro itimer-increment (variable) (list 'setq variable (list '1+ variable))) (defmacro itimer-signum (n) @@ -118,15 +143,19 @@ (list t (list 'signal ''wrong-type-argument (list 'list ''string-or-itimer-p var)))))) -(defmacro itimer-check-natnum (var) - "If VAR is not bound to a non-negative number, signal wrong-type-argument. +(defmacro check-nonnegative-number (var) + "If VAR is not bound to a number, signal wrong-type-argument. +If VAR is not bound to a positive number, signal args-out-of-range. This is a macro." (list 'setq var - (list 'if (list 'natnump var) var + (list 'if (list 'not (list 'numberp var)) (list 'signal ''wrong-type-argument - (list 'list ''natnump var))))) + (list 'list ''natnump var)) + (list 'if (list '< var 0) + (list 'signal ''args-out-of-range (list 'list var)) + var)))) -(defmacro itimer-check-string (var) +(defmacro check-string (var) "If VAR is not bound to a string, signal wrong-type-argument. This is a macro." (list 'setq var @@ -138,10 +167,7 @@ (defun itimerp (obj) "Returns non-nil iff OBJ is an itimer." - (and (consp obj) (stringp (car obj)) (eq (length obj) - 5 ; for XEmacs - ;4 ; original version - ))) + (and (consp obj) (stringp (car obj)) (eq (length obj) 6))) (defun itimer-name (itimer) "Returns the name of ITIMER." @@ -165,66 +191,57 @@ (check-itimer itimer) (nth 3 itimer)) -;; XEmacs-specific -(defun itimer-id (itimer) - "Returns the timeout-id of ITIMER." +(defun itimer-uses-argument (itimer) + "Returns non-nil if the function of ITIMER will be called with an argment. +ITIMER's function is called with this argument each timer ITIMER expires." (check-itimer itimer) (nth 4 itimer)) -(defun set-itimer-value (itimer value - ;; XEmacs doesn't need this - ;; &optional nowakeup - ) +(defun itimer-function-argument (itimer) + "Returns the function argument of ITIMER. +ITIMER's function is called with this argument each timer ITIMER expires." + (check-itimer itimer) + (nth 5 itimer)) + +(defun set-itimer-value (itimer value) "Set the timeout value of ITIMER to be VALUE. Itimer will expire is this many seconds. +If your version of Emacs supports floating point numbers then +VALUE can be a floating point number. Otherwise it +must be an integer. Returns VALUE." -;; Optional third arg NOWAKEUP non-nil means do not wakeup the itimer -;; process to recompute a correct wakeup time, even if it means this -;; itimer will expire late. itimer-process-filter uses this option. -;; This is not meant for ordinary usage, which is why it is not -;; mentioned in the doc string. (check-itimer itimer) - (itimer-check-natnum value) + (check-nonnegative-number value) (let ((inhibit-quit t)) + ;; If the itimer is in the active list, and under the new + ;; timeout value would expire before we would normally + ;; wakeup, wakeup now and recompute a new wakeup time. + (or (and (< value itimer-next-wakeup) + (get-itimer (itimer-name itimer)) + (progn (itimer-driver-wakeup) + (setcar (cdr itimer) value) + (itimer-driver-wakeup) + t )) + (setcar (cdr itimer) value)) + value)) -; ;; If we're allowed to wakeup the itimer process, -; ;; and the itimer process's next wakeup needs to be recomputed, -; ;; and the itimer is running, then we wakeup the itimer process. -; (or (and (not nowakeup) (< value itimer-process-next-wakeup) -; (get-itimer (itimer-name itimer)) -; (progn (itimer-process-wakeup) -; (setcar (cdr itimer) value) -; (itimer-process-wakeup))) -; (setcar (cdr itimer) value)) - - ;; the XEmacs way: - (if (itimer-id itimer) - (deactivate-itimer itimer)) - (setcar (cdr itimer) value) - (activate-itimer itimer) - - value)) +;; Same as set-itimer-value but does not wakeup the driver. +;; Only should be used by the drivers when processing expired timers. +(defun set-itimer-value-internal (itimer value) + (check-itimer itimer) + (check-nonnegative-number value) + (setcar (cdr itimer) value)) (defun set-itimer-restart (itimer restart) "Set the restart value of ITIMER to be RESTART. If RESTART is nil, ITIMER will not restart when it expires. +If your version of Emacs supports floating point numbers then +RESTART can be a floating point number. Otherwise it +must be an integer. Returns RESTART." (check-itimer itimer) - (if restart (itimer-check-natnum restart)) - (and restart (< restart 1) (signal 'args-out-of-range (list restart))) -;; (setcar (cdr (cdr itimer)) restart) - ;; the XEmacs way - (let ((was-active (itimer-id itimer)) - (inhibit-quit t)) - (if was-active - (deactivate-itimer itimer)) - (setcar (cdr (cdr itimer)) restart) - (if was-active - (progn - (setcar (cdr itimer) restart) - (if restart - (activate-itimer itimer))))) - restart) + (if restart (check-nonnegative-number restart)) + (setcar (cdr (cdr itimer)) restart)) (defun set-itimer-function (itimer function) "Set the function of ITIMER to be FUNCTION. @@ -233,14 +250,25 @@ (check-itimer itimer) (setcar (cdr (cdr (cdr itimer))) function)) -;; XEmacs-specific -(defun set-itimer-id (itimer id) +(defun set-itimer-uses-argument (itimer flag) + "Sets when the function of ITIMER is called with an argument. +If FLAG is non-nil, then the function will be called with one argument, +otherwise the function will be called with no arguments. +Returns FLAG." (check-itimer itimer) - (setcar (cdr (cdr (cdr (cdr itimer)))) id)) + (setcar (nthcdr 4 itimer) flag)) + +(defun set-itimer-function-argument (itimer argument) + "Set the function of ITIMER to be ARGUMENT. +The function of ITIMER will be called with ARGUMENT as its solt argument +when itimer expires. +Returns ARGUMENT." + (check-itimer itimer) + (setcar (nthcdr 5 itimer) argument)) (defun get-itimer (name) "Return itimer named NAME, or nil if there is none." - (itimer-check-string name) + (check-string name) (assoc name itimer-list)) (defun read-itimer (prompt &optional initial-input) @@ -253,20 +281,26 @@ (defun delete-itimer (itimer) "Deletes ITIMER. ITIMER may be an itimer or the name of one." (check-itimer-coerce-string itimer) - (deactivate-itimer itimer) ;; for XEmacs (setq itimer-list (delq itimer itimer-list))) -;jwz: this is preloaded so don't ;;;###autoload -(defun start-itimer (name function value &optional restart) +(defun start-itimer (name function value &optional restart + with-arg function-argument) "Start an itimer. -Args are NAME, FUNCTION, VALUE &optional RESTART. +Args are NAME, FUNCTION, VALUE &optional RESTART, WITH-ARG, FUNCTION-ARGUMENT. NAME is an identifier for the itimer. It must be a string. If an itimer already exists with this name, NAME will be modified slightly to until it is unique. -FUNCTION should be a function (or symbol naming one) of no arguments. It - will be called each time the itimer expires. The function can access - itimer that invoked it through the variable `current-itimer'. +FUNCTION should be a function (or symbol naming one) of one argument. It + will be called each time the itimer expires with an argument of + FUNCTION-ARGUMENT. The function can access the itimer that + invoked it through the variable `current-itimer'. If WITH-ARG + is nil then FUNCTION is called with no arguments. This is for + backward compatibility with older versions of the itimer + package which always called FUNCTION with no arguments. VALUE is the number of seconds until this itimer expires. + If your version of Emacs supports floating point numbers then + you can VALUE can be a floating point number. Otherwise it + must be an integer. Optional fourth arg RESTART non-nil means that this itimer should be restarted automatically after its function is called. Normally an itimer is deleted at expiration after its function has returned. @@ -277,41 +311,42 @@ (list (completing-read "Start itimer: " itimer-list) (read (completing-read "Itimer function: " obarray 'fboundp)) (let (value) - (while (not (natnump value)) + (while (or (not (numberp value)) (< value 0)) (setq value (read-from-minibuffer "Itimer value: " nil nil t))) value) (let ((restart t)) - (while (and restart (not (natnump restart))) - (setq restart (read-from-minibuffer "Itimer restart: " nil nil t))) - restart))) - (itimer-check-string name) - (itimer-check-natnum value) - (if restart (itimer-check-natnum restart)) + (while (and restart (or (not (numberp restart)) (< restart 0))) + (setq restart (read-from-minibuffer "Itimer restart: " + nil nil t))) + restart) + ;; hard to imagine the user specifying these interactively + nil + nil )) + (check-string name) + (check-nonnegative-number value) + (if restart (check-nonnegative-number restart)) ;; Make proposed itimer name unique if it's not already. (let ((oname name) (num 2)) (while (get-itimer name) (setq name (concat oname "<" num ">")) - (itimer-incf num))) -; ;; If there's no itimer process, start one now. -; ;; Otherwise wake up the itimer process so that seconds slept before -; ;; the new itimer is created won't be counted against it. -; (if itimer-process -; (itimer-process-wakeup) -; (itimer-process-start)) + (itimer-increment num))) + ;; If there's no itimer process, start one now. + ;; Otherwise wake up the itimer process so that seconds slept before + ;; the new itimer is created won't be counted against it. + (if (or itimer-process itimer-timer) + (itimer-driver-wakeup) + (itimer-driver-start)) (let ((inhibit-quit t)) ;; add the itimer to the global list (setq itimer-list - (cons (list name value restart function nil) ; extra slot for XEmacs + (cons (list name value restart function with-arg function-argument) itimer-list)) -; ;; If the itimer process is scheduled to wake up too late for the itimer -; ;; we wake it up to calculate a correct wakeup value giving consideration -; ;; to the newly added itimer. -; (if (< value itimer-process-next-wakeup) -; (itimer-process-wakeup))) - ;; for XEmacs - (activate-itimer (car itimer-list)) - ) + ;; If the itimer process is scheduled to wake up too late for the itimer + ;; we wake it up to calculate a correct wakeup value giving consideration + ;; to the newly added itimer. + (if (< value itimer-next-wakeup) + (itimer-driver-wakeup))) (car itimer-list)) ;; User level functions to list and modify existing itimers. @@ -331,19 +366,27 @@ (itimer-edit-mode) (setq buffer-read-only nil) (erase-buffer) - (insert "Name Value Restart Function\n" - "---- ----- ------- --------") + (insert +"Name Value Restart Function Argument\n" +"---- ----- ------- -------- --------") (if (null itimer-edit-start-marker) (setq itimer-edit-start-marker (point))) (while itimers (newline 1) (prin1 (itimer-name (car itimers))) (tab-to-tab-stop) - (prin1 (itimer-value (car itimers))) + (insert (itimer-truncate-string + (format "%5.5s" (itimer-value (car itimers))) 5)) + (tab-to-tab-stop) + (insert (itimer-truncate-string + (format "%5.5s" (itimer-restart (car itimers))) 5)) (tab-to-tab-stop) - (prin1 (itimer-restart (car itimers))) + (insert (itimer-truncate-string + (format "%.26s" (itimer-function (car itimers))) 26)) (tab-to-tab-stop) - (prin1 (itimer-function (car itimers))) + (if (itimer-uses-argument (car itimers)) + (prin1 (itimer-function-argument (car itimers))) + (prin1 'NONE)) (setq itimers (cdr itimers))) ;; restore point (goto-char opoint) @@ -359,8 +402,8 @@ for `itimer-edit-mode' for more information." (interactive) ;; since user is editing, make sure displayed data is reasonably up-to-date -; (if itimer-process -; (itimer-process-wakeup)) + (if (or itimer-process itimer-timer) + (itimer-driver-wakeup)) (list-itimers) (select-window (get-buffer-window "*Itimer List*")) (goto-char itimer-edit-start-marker) @@ -389,12 +432,12 @@ (setq major-mode 'itimer-edit-mode mode-name "Itimer Edit" truncate-lines t - tab-stop-list '(22 32 42)) + tab-stop-list '(22 32 40 67)) (abbrev-mode 0) (auto-fill-mode 0) - (buffer-disable-undo (current-buffer)) + (buffer-flush-undo (current-buffer)) (use-local-map itimer-edit-map) - (and lisp-mode-syntax-table (set-syntax-table lisp-mode-syntax-table))) + (set-syntax-table emacs-lisp-mode-syntax-table)) (put 'itimer-edit-mode 'mode-class 'special) @@ -435,30 +478,34 @@ ;; and use this info to determine which field the user ;; wants to modify. (beginning-of-line) - (while (and (>= opoint (point)) (< n 4)) + (while (and (>= opoint (point)) (< n 5)) (forward-sexp 2) (backward-sexp) - (itimer-incf n)) + (itimer-increment n)) (cond ((eq n 1) (error "Cannot change itimer name.")) ((eq n 2) 'value) ((eq n 3) 'restart) - ((eq n 4) 'function))))) + ((eq n 4) 'function) + (t 'function-argument))))) (cond ((eq field 'value) - ;; XEmacs: rewritten for I18N3 snarfing - (while (not (natnump field-value)) - (setq field-value (read-from-minibuffer "Set itimer value: " - nil nil t)))) + (let ((prompt "Set itimer value: ")) + (while (not (natnump field-value)) + (setq field-value (read-from-minibuffer prompt nil nil t))))) ((eq field 'restart) - (while (and field-value (not (natnump field-value))) - (setq field-value (read-from-minibuffer "Set itimer restart: " - nil nil t)))) + (let ((prompt "Set itimer restart: ")) + (while (and field-value (not (natnump field-value))) + (setq field-value (read-from-minibuffer prompt nil nil t))))) ((eq field 'function) - (while (not (or (and (symbolp field-value) (fboundp field-value)) - (and (consp field-value) - (memq (car field-value) '(lambda macro))))) - (setq field-value - (read (completing-read "Set itimer function: " - obarray 'fboundp nil)))))) + (let ((prompt "Set itimer function: ")) + (while (not (or (and (symbolp field-value) (fboundp field-value)) + (and (consp field-value) + (memq (car field-value) '(lambda macro))))) + (setq field-value + (read (completing-read prompt obarray 'fboundp nil)))))) + ((eq field 'function-argument) + (let ((prompt "Set itimer function argument: ")) + (setq field-value (read-expression prompt)) + (set-itimer-uses-argument itimer t)))) ;; set the itimer field (funcall (intern (concat "set-itimer-" (symbol-name field))) itimer field-value) @@ -503,7 +550,7 @@ (progn (forward-sexp 2) (backward-sexp))) - (itimer-decf count))) + (itimer-decrement count))) ((< (itimer-signum count) 0) (while (not (zerop count)) (backward-sexp) @@ -515,7 +562,7 @@ (progn (goto-char (point-max)) (backward-sexp))) - (itimer-incf count))))) + (itimer-increment count))))) (defun itimer-edit-previous-field (count) (interactive "p") @@ -528,210 +575,166 @@ ((eq forw-back (point)) t) (t (backward-sexp))))) +(defun itimer-truncate-string (str len) + (if (<= (length str) len) + str + (substring str 0 len))) ;; internals of the itimer implementation. +(defun itimer-run-expired-timers (time-elapsed) + (let ((itimers (copy-sequence itimer-list)) + (itimer) + (next-wakeup 600) + ;; process filters can be hit by stray C-g's from the user, + ;; so we must protect this stuff appropriately. + ;; Quit's are allowed from within itimer functions, but we + ;; catch them and print a message. + (inhibit-quit t)) + (setq next-wakeup 600) + (while itimers + (setq itimer (car itimers)) + (set-itimer-value-internal itimer (max 0 (- (itimer-value itimer) + time-elapsed))) + (if (> (itimer-value itimer) 0) + (setq next-wakeup + (min next-wakeup (itimer-value itimer))) + ;; itimer has expired, we must call its function. + ;; protect our local vars from the itimer function. + ;; allow keyboard quit to occur, but catch and report it. + ;; provide the variable `current-itimer' in case the function + ;; is interested. + (condition-case condition-data + (save-match-data + (let* ((current-itimer itimer) + (quit-flag nil) + (inhibit-quit nil) + itimer itimers time-elapsed) + (if (itimer-uses-argument current-itimer) + (funcall (itimer-function current-itimer) + (itimer-function-argument current-itimer)) + (funcall (itimer-function current-itimer))))) + (error (message "itimer \"%s\" signaled: %s" (itimer-name itimer) + (prin1-to-string condition-data))) + (quit (message "itimer \"%s\" quit" (itimer-name itimer)))) + ;; restart the itimer if we should, otherwise delete it. + (if (null (itimer-restart itimer)) + (delete-itimer itimer) + (set-itimer-value-internal itimer (itimer-restart itimer)) + (setq next-wakeup (min next-wakeup (itimer-value itimer))))) + (setq itimers (cdr itimers))) + ;; if user is editing itimers, update displayed info + (if (eq major-mode 'itimer-edit-mode) + (list-itimers)) + next-wakeup )) + (defun itimer-process-filter (process string) - (error "itimer-process-filter is not used in XEmacs") -; ;; If the itimer process dies and generates output while doing -; ;; so, we may be called before the process-sentinel. Sanity -; ;; check the output just in case... -; (if (not (string-match "^[0-9]" string)) -; (progn (message "itimer process gave odd output: %s" string) -; ;; it may be still alive and waiting for input -; (process-send-string itimer-process "3\n")) -; ;; if there are no active itimers, return quickly. -; (if itimer-list -; (let ((time-elapsed (string-to-int string)) -; (itimers itimer-list) -; (itimer) -; ;; process filters can be hit by stray C-g's from the user, -; ;; so we must protect this stuff appropriately. -; ;; Quit's are allowed from within itimer functions, but we -; ;; catch them. -; (inhibit-quit t)) -; (setq itimer-process-next-wakeup 600) -; (while itimers -; (setq itimer (car itimers)) -; (set-itimer-value itimer (max 0 (- (itimer-value itimer) time-elapsed)) t) -; (if (> (itimer-value itimer) 0) -; (setq itimer-process-next-wakeup -; (min itimer-process-next-wakeup (itimer-value itimer))) -; ;; itimer has expired, we must call its function. -; ;; protect our local vars from the itimer function. -; ;; allow keyboard quit to occur, but catch and report it. -; ;; provide the variable `current-itimer' in case the function -; ;; is interested. -; (condition-case condition-data -; (let* ((current-itimer itimer) -; itimer itimers time-elapsed -; quit-flag inhibit-quit) -; (funcall (itimer-function current-itimer))) -; (error (message "itimer \"%s\" signaled: %s" (itimer-name itimer) -; (prin1-to-string condition-data))) -; (quit (message "itimer \"%s\" quit" (itimer-name itimer)))) -; ;; restart the itimer if we should, otherwise delete it. -; (if (null (itimer-restart itimer)) -; (delete-itimer itimer) -; (set-itimer-value itimer (itimer-restart itimer) t) -; (setq itimer-process-next-wakeup -; (min itimer-process-next-wakeup (itimer-value itimer))))) -; (setq itimers (cdr itimers))) -; ;; if user is editing itimers, update displayed info -; (if (eq major-mode 'itimer-edit-mode) -; (list-itimers))) -; (setq itimer-process-next-wakeup 600)) -; ;; tell itimer-process when to wakeup again -; (process-send-string itimer-process -; (concat (int-to-string itimer-process-next-wakeup) -; "\n"))) - ) + ;; If the itimer process dies and generates output while doing + ;; so, we may be called before the process-sentinel. Sanity + ;; check the output just in case... + (if (not (string-match "^[0-9]" string)) + (progn (message "itimer process gave odd output: %s" string) + ;; it may be still alive and waiting for input + (process-send-string itimer-process "3\n")) + ;; if there are no active itimers, return quickly. + (if itimer-list + (setq itimer-next-wakeup + (itimer-run-expired-timers (string-to-int string))) + (setq itimer-next-wakeup 600)) + ;; tell itimer-process when to wakeup again + (process-send-string itimer-process + (concat (int-to-string itimer-next-wakeup) + "\n")))) (defun itimer-process-sentinel (process message) - (error "itimer-process-sentinel is not used in XEmacs") -; (let ((inhibit-quit t)) -; (if (eq (process-status process) 'stop) -; (continue-process process) -; ;; not stopped, so it must have died. -; ;; cleanup first... -; (delete-process process) -; (setq itimer-process nil) -; ;; now, if there are any active itimers then we need to immediately -; ;; start another itimer process, otherwise we can wait until the next -; ;; start-itimer call, which will start one automatically. -; (if (null itimer-list) -; () -; ;; there may have been an error message in the echo area; -; ;; give the user at least a little time to read it. -; (sit-for 2) -; (message "itimer process %s... respawning." (substring message 0 -1)) -; (itimer-process-start)))) - ) + (let ((inhibit-quit t)) + (if (eq (process-status process) 'stop) + (continue-process process) + ;; not stopped, so it must have died. + ;; cleanup first... + (delete-process process) + (setq itimer-process nil) + ;; now, if there are any active itimers then we need to immediately + ;; start another itimer process, otherwise we can wait until the next + ;; start-itimer call, which will start one automatically. + (if (null itimer-list) + () + ;; there may have been an error message in the echo area; + ;; give the user at least a little time to read it. + (sit-for 2) + (message "itimer process %s... respawning." (substring message 0 -1)) + (itimer-process-start))))) (defun itimer-process-start () - (error "itimer-process-start is not used in XEmacs") -; (let ((inhibit-quit t) -; (process-connection-type nil)) -; (setq itimer-process (start-process "itimer" nil "itimer")) -; (process-kill-without-query itimer-process) -; (set-process-filter itimer-process 'itimer-process-filter) -; (set-process-sentinel itimer-process 'itimer-process-sentinel) -; ;; Tell itimer process to wake up quickly, so that a correct wakeup -; ;; time can be computed. Zero instead of one here loses because of -; ;; underlying itimer implementations that use 0 to mean `disable the -; ;; itimer'. -; (setq itimer-process-next-wakeup 1) -; (process-send-string itimer-process "1\n")) - ) + (let ((inhibit-quit t) + (process-connection-type nil)) + (setq itimer-process (start-process "itimer" nil "itimer")) + (process-kill-without-query itimer-process) + (set-process-filter itimer-process 'itimer-process-filter) + (set-process-sentinel itimer-process 'itimer-process-sentinel) + ;; Tell itimer process to wake up quickly, so that a correct + ;; wakeup time can be computed. Zero loses because of + ;; underlying itimer implementations that use 0 to mean + ;; `disable the itimer'. + (setq itimer-next-wakeup itimer-short-interval) + (process-send-string itimer-process + (format "%s\n" itimer-next-wakeup)))) (defun itimer-process-wakeup () - (error "itimer-process-wakeup is not used in XEmacs") -; (interrupt-process itimer-process) -; (accept-process-output) - ) - - -;; XEmacs-specific code - -(defun activate-itimer (itimer) - (let ((inhibit-quit t)) - (set-itimer-id itimer - (add-timeout (itimer-value itimer) - 'itimer-callback - itimer - (itimer-restart itimer)))) - itimer) - -(defun deactivate-itimer (itimer) - (let ((inhibit-quit t) - (id (itimer-id itimer))) - (and id (disable-timeout id)) - (set-itimer-id itimer nil)) - itimer) + (interrupt-process itimer-process) + (accept-process-output)) -(defun itimer-callback (current-itimer) - (funcall (itimer-function current-itimer))) - - -;;; itimer-driven auto-saves - -;jwz: this is preloaded so don't ;;;###autoload -(defvar auto-save-timeout 30 - "*Number of seconds idle time before auto-save. -Zero or nil means disable auto-saving due to idleness. +(defun itimer-timer-start () + (let ((inhibit-quit t)) + (setq itimer-next-wakeup itimer-short-interval + itimer-timer-last-wakeup (current-time) + itimer-timer (add-timeout itimer-short-interval + 'itimer-timer-driver nil nil)))) -The actual amount of idle time between auto-saves is logarithmically related -to the size of the current buffer. This variable is the number of seconds -after which an auto-save will happen when the current buffer is 50k or less; -the timeout will be 2 1/4 times this in a 200k buffer, 3 3/4 times this in a -1000k buffer, and 4 1/2 times this in a 2000k buffer. - -See also the variable `auto-save-interval', which controls auto-saving based -on the number of characters typed.") - -;jwz: this is preloaded so don't ;;;###autoload -(defvar auto-gc-threshold (/ gc-cons-threshold 3) - "*GC when this many bytes have been consed since the last GC, -and the user has been idle for `auto-save-timeout' seconds.") +(defun itimer-timer-wakeup () + (let ((inhibit-quit t)) + (cond ((fboundp 'cancel-timer) + (cancel-timer itimer-timer)) + ((fboundp 'disable-timeout) + (disable-timeout itimer-timer))) + (setq itimer-timer (add-timeout itimer-short-interval + 'itimer-timer-driver nil nil)))) -(defun auto-save-itimer () - "For use as a itimer callback function. -Auto-saves and garbage-collects based on the size of the current buffer -and the value of `auto-save-timeout', `auto-gc-threshold', and the current -keyboard idle-time." - (if (or (null auto-save-timeout) - (<= auto-save-timeout 0) - (eq (minibuffer-window) (selected-window))) - nil - (let ((buf-size (1+ (ash (buffer-size) -8))) - (delay-level 0) - (now (current-time)) - delay) - (while (> buf-size 64) - (setq delay-level (1+ delay-level) - buf-size (- buf-size (ash buf-size -2)))) - (if (< delay-level 4) - (setq delay-level 4)) - ;; delay_level is 4 for files under around 50k, 7 at 100k, 9 at 200k, - ;; 11 at 300k, and 12 at 500k, 15 at 1 meg, and 17 at 2 meg. - (setq delay (/ (* delay-level auto-save-timeout) 4)) - (let ((idle-time (if (or (not (consp last-input-time)) - (/= (car now) (car last-input-time))) - (1+ delay) - (- (car (cdr now)) (cdr last-input-time))))) - (and (> idle-time delay) - (do-auto-save)) - (and (> idle-time auto-save-timeout) - (> (consing-since-gc) auto-gc-threshold) - (garbage-collect))))) - ;; Look at the itimer that's currently running; if the user has changed - ;; the value of auto-save-timeout, modify this itimer to have the correct - ;; restart time. There will be some latency between when the user changes - ;; this variable and when it takes effect, but it will happen eventually. - (let ((self (get-itimer "auto-save"))) - (or self (error "auto-save-itimer can't find itself")) - (if (and auto-save-timeout (> auto-save-timeout 4)) - (or (= (itimer-restart self) (/ auto-save-timeout 4)) - (set-itimer-restart self (/ auto-save-timeout 4))))) - nil) +(defun itimer-time-difference (t1 t2) + ;; ignore high 16 bits since we will never be dealing with + ;; times that long. + (setq t1 (cdr t1) + t2 (cdr t2)) + (let ((usecs (- (nth 1 t1) (nth 1 t2))) + (secs (- (car t1) (car t2)))) + (if (< usecs 0) + (setq secs (1- secs) + usecs (+ usecs 1000000))) + (+ secs (/ usecs (if (featurep 'lisp-float-type) 1e6 1000000))))) -(defun itimer-init-auto-gc () - (or noninteractive ; may be being run from after-init-hook in -batch mode. - (get-itimer "auto-save") - ;; the time here is just the first interval; if the user changes it - ;; later, it will adjust. - (let ((time (max 2 (/ (or auto-save-timeout 30) 4)))) - (start-itimer "auto-save" 'auto-save-itimer time time)))) +(defun itimer-timer-driver (&rest ignored) + ;; inhibit quit because if the user quits at an inopportune + ;; time, the timer process won't bne launched again and the + ;; system stops working. itimer-run-expired-timers allows + ;; individual timer function to be aborted, so the user can + ;; escape a feral timer function. + (let* ((inhibit-quit t) + (now (current-time)) + (elapsed (itimer-time-difference now itimer-timer-last-wakeup)) + sleep) + (setq itimer-timer-last-wakeup now + sleep (itimer-run-expired-timers elapsed) + itimer-next-wakeup sleep + itimer-timer (add-timeout sleep 'itimer-timer-driver nil nil)))) -(cond (purify-flag - ;; This file is being preloaded into an emacs about to be dumped. - ;; So arrange for the auto-save itimer to be started once emacs - ;; is launched. - (add-hook 'after-init-hook 'itimer-init-auto-gc)) - (t - ;; Otherwise, this file is being loaded into a normal, interactive - ;; emacs. Start the auto-save timer now. - (itimer-init-auto-gc))) +(defun itimer-driver-start () + (if (fboundp 'add-timeout) + (itimer-timer-start) + (itimer-process-start))) - -(provide 'itimer) +(defun itimer-driver-wakeup () + (if (fboundp 'add-timeout) + (itimer-timer-wakeup) + (itimer-process-wakeup))) + +;;; itimer.el ends here
--- a/lisp/prim/loadup.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/prim/loadup.el Mon Aug 13 09:15:11 2007 +0200 @@ -108,10 +108,10 @@ ;; After fixing, eos/loaddefs-eos and loaddefs appear identical?!! ;; So just make loaddefs-eos go away... ;;(load-gc (if (featurep 'sparcworks) "eos/loaddefs-eos" "loaddefs")) - (load-gc "font") ; required by widget (load-gc "widget") (load-gc "custom") ; Before loaddefs so that defcustom exists - (load-gc "loaddefs") + (load-gc "custom-xmas") + (load-gc "loaddefs") ; <=== autoloads get put here (load-gc "misc") (load-gc "profile") (load-gc "help") @@ -158,6 +158,7 @@ (when (featurep 'lisp-float-type) (load-gc "float-sup")) (load-gc "itimer") ; for vars auto-save-timeout and auto-gc-threshold + (load-gc "itimer-autosave") (if (featurep 'toolbar) (load-gc "toolbar") ;; else still define a few functions.
--- a/lisp/prim/minibuf.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/prim/minibuf.el Mon Aug 13 09:15:11 2007 +0200 @@ -403,6 +403,7 @@ (if minibuffer-exit-hook (run-hooks 'minibuffer-exit-hook)) (buffer-string))) + (histval val) (err nil)) (if readp (condition-case e @@ -424,12 +425,12 @@ (let ((list (symbol-value minibuffer-history-variable))) (or (eq list t) (null val) - (and list (equal val (car list))) + (and list (equal histval (car list))) (and (stringp val) minibuffer-history-minimum-string-length (< (length val) minibuffer-history-minimum-string-length)) - (set minibuffer-history-variable (cons val list))))) + (set minibuffer-history-variable (cons histval list))))) (if err (signal (car err) (cdr err))) val)))) ;; stupid display code requires this for some reason @@ -1704,9 +1705,7 @@ ;; complete? (if (not orig) nil - (and (file-directory-p string) - ;; So "foo" is ambiguous between "foo/" and "foobar/" - (equal string (file-name-as-directory string))))) + (file-directory-p string))) ((eq action 't) ;; all completions (funcall dirs #'(lambda (n)
--- a/lisp/prim/obsolete.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/prim/obsolete.el Mon Aug 13 09:15:11 2007 +0200 @@ -330,13 +330,13 @@ (defun keymap-parent (keymap) "Returns the first parent of the given keymap." (car (keymap-parents keymap))) -(make-obsolete 'keymap-parent 'keymap-parents) +(make-compatible 'keymap-parent 'keymap-parents) (defun set-keymap-parent (keymap parent) "Makes the given keymap have (only) the given parent." (set-keymap-parents keymap (if parent (list parent) '())) parent) -(make-obsolete 'set-keymap-parent 'set-keymap-parents) +(make-compatible 'set-keymap-parent 'set-keymap-parents) ;;;;;;;;;;;;;;;;;;;;;;;;;;;; menu stuff @@ -596,3 +596,16 @@ (define-obsolete-function-alias 'set-pixmap-contributes-to-line-height 'set-glyph-contrib-p) +;; the functionality of column.el has been moved into C +(defalias 'display-column-mode 'column-number-mode) + +(defun x-color-values (color &optional frame) + "Return a description of the color named COLOR on frame FRAME. +The value is a list of integer RGB values--(RED GREEN BLUE). +These values appear to range from 0 to 65280 or 65535, depending +on the system; white is (65280 65280 65280) or (65535 65535 65535). +If FRAME is omitted or nil, use the selected frame." + (color-instance-rgb-components (make-color-instance color))) +(make-compatible 'x-color-values 'color-instance-rgb-components) + +;;; obsolete.el ends here
--- a/lisp/prim/replace.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/prim/replace.el Mon Aug 13 09:15:11 2007 +0200 @@ -581,7 +581,8 @@ (let ((aborted t)) (unwind-protect (progn - (isearch-highlight (match-beginning 0) (match-end 0)) + (if (match-beginning 0) + (isearch-highlight (match-beginning 0) (match-end 0))) (next-command-event event) (setq aborted nil)) (isearch-dehighlight aborted))) @@ -735,6 +736,7 @@ (if (not replaced) (progn (replace-match next-replacement nocasify literal) + (store-match-data nil) (setq replaced t)))) ((eq def 'automatic) (or replaced
--- a/lisp/prim/simple.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/prim/simple.el Mon Aug 13 09:15:11 2007 +0200 @@ -1619,7 +1619,7 @@ (eval-when-compile (defvar inhibit-point-motion-hooks)) -(defvar line-move-ignore-invisible t +(defvar line-move-ignore-invisible nil "*Non-nil means \\[next-line] and \\[previous-line] ignore invisible lines. Outline mode sets this.")
--- a/lisp/psgml/psgml-html.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/psgml/psgml-html.el Mon Aug 13 09:15:11 2007 +0200 @@ -28,6 +28,12 @@ ; Parts were taken from html-helper-mode and from code by Alastair Burt. +; Feb 18 1997, Heiko Muenkel: Added the hook variable html-mode-hook. +; With that you can now use the hm--html-minor-mode together +; with this mode. For that you've to add the following line +; to your ~/.emacs: +; (add-hook 'html-mode-hook 'hm--html-minor-mode) + ;;; Code: (defvar html-auto-sgml-entity-conversion nil @@ -105,6 +111,9 @@ If you want to not install some type of tag, override this variable. Order is significant: menus go in this order.") +(defvar html-mode-hook nil + "*Hook called by `html-mode'.") + ;;}}} end of user variables ;;{{{ type based keymap and menu variable and function setup @@ -213,7 +222,8 @@ ; sigh ... need to call this now to get things working. (sgml-build-custom-menus) (add-submenu nil sgml-html-menu "SGML") - (delete-menu-item '("SGML"))) + (delete-menu-item '("SGML")) + (run-hooks 'html-mode-hook)) (defun html-helper-add-type-to-alist (type) "Add a type specification to the alist.
--- a/lisp/tl/emu-e19.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/tl/emu-e19.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,9 +1,9 @@ ;;; emu-e19.el --- emu module for Emacs 19 and XEmacs 19 -;; Copyright (C) 1995,1996 Free Software Foundation, Inc. +;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc. ;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp> -;; Version: $Id: emu-e19.el,v 1.2 1996/12/28 21:03:08 steve Exp $ +;; Version: $Id: emu-e19.el,v 1.3 1997/02/24 01:14:16 steve Exp $ ;; Keywords: emulation, compatibility, mule, Latin-1 ;; This file is part of emu. @@ -135,6 +135,11 @@ (,@ body) ))) +(defmacro as-binary-output-file (&rest body) + (` (let ((emx-binary-mode t)) ; Stop CRLF to LF conversion in OS/2 + (,@ body) + ))) + ;;; @@ for old MULE emulation ;;; @@ -152,6 +157,21 @@ t) +;;; @ binary access +;;; + +(defun insert-binary-file-contents-literally + (filename &optional visit beg end replace) + "Like `insert-file-contents-literally', q.v., but don't code conversion. +A buffer may be modified in several ways after reading into the buffer due +to advanced Emacs features, such as file-name-handlers, format decoding, +find-file-hooks, etc. + This function ensures that none of these modifications will take place." + (let ((emx-binary-mode t)) + (insert-file-contents-literally filename visit beg end replace) + )) + + ;;; @ MIME charset ;;;
--- a/lisp/utils/autoload.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/utils/autoload.el Mon Aug 13 09:15:11 2007 +0200 @@ -155,7 +155,8 @@ (save-excursion (unwind-protect (progn - (set-buffer (or visited (find-file-noselect file))) + (let ((find-file-hooks nil)) + (set-buffer (or visited (find-file-noselect file)))) (save-excursion (save-restriction (widen) @@ -343,8 +344,9 @@ (trim-name (autoload-trim-file-name file)) section-begin form) (save-excursion - (set-buffer (or (get-file-buffer generated-autoload-file) - (find-file-noselect generated-autoload-file))) + (let ((find-file-hooks nil)) + (set-buffer (or (get-file-buffer generated-autoload-file) + (find-file-noselect generated-autoload-file)))) ;; First delete all sections for this file. (goto-char (point-min)) (while (search-forward generate-autoload-section-header nil t) @@ -434,7 +436,8 @@ (directory-file-name dir)))) (enable-local-eval nil)) (save-excursion - (set-buffer (find-file-noselect generated-autoload-file)) + (let ((find-file-hooks nil)) + (set-buffer (find-file-noselect generated-autoload-file))) (goto-char (point-min)) (while (search-forward generate-autoload-section-header nil t) (let* ((begin (match-beginning 0))
--- a/lisp/utils/browse-cltl2.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/utils/browse-cltl2.el Mon Aug 13 09:15:11 2007 +0200 @@ -2,13 +2,13 @@ ;;; browse-cltl2.el --- browse the hypertext-version of ;;; "Common Lisp the Language, 2nd. Edition" -;; Revision 1.1.1 -;; last edited on 29.1.1997 +;; Revision 1.1.2 +;; last edited on 18.2.1997 ;; Copyright (C) 1997 Holger Schauer ;; Author: Holger Schauer <Holger.Schauer@gmd.de> -;; Keywords: utils lisp ilisp +;; Keywords: utils lisp ilisp www ;; This file is not part of Emacs. @@ -93,7 +93,13 @@ ;; Suggested by Simon Marshall <Simon.Marshall@esrin.esa.it>. ;; Included new variable *cltl2-use-url* with which one can ;; specify if he has url.el or not. Introduced variable -;; *cltl2-old-find-file-noselect*. +;; *cltl2-old-find-file-noselect*. +;; +;; 05-02-97 HS: added two variables for the key-bindings, +;; *cltl2-vfd-key* *cltl2-vi-key*. +;; +;; 18-02-97 HS: use compatible keybindings that work on Gnu Emacs and XEmacs. +;; Made cltl2-lisp-mode-install an interactive function. (defvar *cltl2-use-url* 'nil "Enables or disables retrieval of the index-file via WWW (or more exactly by the use of the function url-retrieve from url.el). @@ -168,6 +174,20 @@ other useless stuff on the buffer in which the index is fetched. If you don't use a local copy (of the index) this won't bother you.") +(defvar *cltl2-vfd-key* + (if (featurep 'ilisp) + '[(control z) h] + '[(control c) b]) + "Shortcut for accessing cltl2-view-function-definition. Use meaningful + setting with Ilisp.") + +(defvar *cltl2-vi-key* + (if (featurep 'ilisp) + '[(control z) H] + '[(control c) B]) + "Shortcut for accessing cltl2-view-index. Use meaningful + setting with Ilisp.") + (defvar *browse-cltl2-ht* (make-hash-table 0)) (defconst *cltl2-search-regexpr* "<a href=\"\\(.+\\)\"><code>\\(.+\\)</code></a>" @@ -344,29 +364,32 @@ ;;; Hooking into lisp mode and ilisp-mode ;;; ****************************** (defun cltl2-lisp-mode-install () - "Not to be called by the user - just for lisp-mode-hook and ilisp-mode-hook. - - Adds browse-cltl2 to lisp-mode. If you use ilisp (installed via a hook - on lisp-mode) add browse-cltl2 to ilisp. Under Ilisp we use C-zb and C-zB - and without Ilisp we use C-cb and C-cB for calling the cltl2-view-functions. - Under XEmacs we will add ourself to the corresponding menus if there exists - one.." + "Adds browse-cltl2 to lisp-mode. If you use ilisp (installed via a hook + on lisp-mode) add browse-cltl2 to ilisp. Check the variables *cltl2-vfd-key* + and *cltl2-vi-key* for the keybindings. Under XEmacs we will add ourself to + the corresponding menus if there exists one." + (interactive) ; set key bindings - (cond ((featurep 'ilisp) - (local-set-key "\C-zb" 'cltl2-view-function-definition) - (local-set-key "\C-zB" 'cltl2-view-index)) - (t - (local-set-key "\C-cb" 'cltl2-view-function-definition) - (local-set-key "\C-cB" 'cltl2-view-index))) + (local-set-key *cltl2-vfd-key* 'cltl2-view-function-definition) + (local-set-key *cltl2-vi-key* 'cltl2-view-index) ; under XEmacs hook ourself into the menu if there is one (when (string-match "XEmacs\\|Lucid" emacs-version) - ; this is for the menu as provided by ilisp-easy-menu - (cond ((not (null (car (find-menu-item current-menubar '("ILisp"))))) + (cond ((and (featurep 'ilisp-easy-menu) + ; this is for the menu as provided by ilisp-easy-menu + (not (null (car (find-menu-item current-menubar '("ILisp")))))) (add-submenu '("ILisp" "Documentation") '("Browse CLtL2" [ "View entry" cltl2-view-function-definition t] [ "View index" cltl2-view-index t] ))) + ; perhaps an other Ilisp-Menu is there ? + ((not (null (car (find-menu-item current-menubar '("ILisp"))))) + (add-submenu + '("Lisp") + '("Browse CLtL2" + [ "View entry" cltl2-view-function-definition t] + [ "View index" cltl2-view-index t] ))) + ; or at least a Lisp-Menu ? ((not (null (car (find-menu-item current-menubar '("Lisp"))))) (add-submenu '("Lisp")
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/utils/detached-minibuf.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,145 @@ +;;; detached-minibuf.el -- Support a detached minibuffer for XEmacs. + +;; Copyright (C) 1997 Alvin C. Shelton + +;; Author: Alvin Shelton <acs@acm.org> +;; Keywords: extensions + +;; This file is part of XEmacs. + +;; XEmacs is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your +;; option) any later version. + +;; XEmacs is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with XEmacs; if not, write to the Free Software Foundation, +;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +;;; Synched up with: not in FSF. + +;;; Commentary: + +;; WARNING. DANGER. This file reportedly crashes 19.14, use it only with a +;; recent XEmacs. + +;; Version: 1.1 + +;;; Code: + +;; +;; Variable definitions + +(defvar add-minibuf-options t + "*If nil, prevent minibuffer options from being added to the Options menu.\ +This must be set before detached-minibuf is loaded.") +(defvar minibuf-frame-height 1 + "*The height in lines of the minibuffer frame created by make-detached-minibuf") +(defvar minibuf-frame-width (frame-width (selected-frame)) + "*The width in chars of the minibuffer frame created by make-detached-minibuf") +(defvar minibuf-frame-pos-y -2 + "*The y position of the minibuffer frame as created by make-detached-minibuf") +(defvar minibuf-frame-pos-x -2 + "*The x position of the minibuffer frame as created by make-detached-minibuf") + +;; +;; Add minibuffer options to the Options menu +(if add-minibuf-options + (progn + (defun toggle-minibuf () + (interactive) + (if (equal (frame-property (selected-frame) 'minibuffer) t) + + ;; This frame already has a minibuffer, so remove the minibuffer. + ;; Unfortunately, we must delete and redraw the frame + (let ((fp (frame-properties (selected-frame))) + (buf (current-buffer)) + (orig (selected-frame))) + + ;; Create and select the new frame; + ;; we have to do this before we delete the old frame. + (setq fp (plist-remprop fp 'window-id) + fp (plist-remprop fp 'minibuffer)) + (select-frame + (make-frame (plist-put fp 'minibuffer nil))) + (switch-to-buffer buf) + + (set-frame-properties + orig (list 'minibuffer default-minibuffer-frame)) + (delete-frame orig t)) + + ;; This frame does not have a minibuffer, so add one + (set-frame-property (selected-frame) 'minibuffer t))) + + (add-menu-button '("Options" "Frame Appearance") + ["------" nil nil] + nil) + (add-menu-button '("Options" "Frame Appearance") + ["Toggle minibuffer" + (toggle-minibuf) + :style toggle + :active (not (equal (selected-frame) + default-minibuffer-frame)) + :selected (equal + (frame-property (selected-frame) 'minibuffer) + t)] + nil) + (add-menu-button '("Options" "Frame Appearance") + ["Default minibuffer here" + (setq default-minibuffer-frame (selected-frame)) + :style toggle + :active (let ((mbf (frame-property + (selected-frame) 'minibuffer))) + (or (equal mbf (selected-frame)) + (equal mbf t))) + :selected (equal (selected-frame) + default-minibuffer-frame)] + nil) + (add-menu-button '("Options" "Frame Appearance") + ["Make a detached minibuffer" + (make-detached-minibuf) + :style nil] + nil))) + +;; +;; Create a minibuffer-only frame. +;; +;; This function creates a frame named "minibuffer". +;; You will likely want this frame not to have a titlebar. +;; In order to do this for gwm, uncomment the following line +;; and add it to your .profile.gwm: +;; (set-window Emacs.minibuffer no-frame) +;; +(defun make-detached-minibuf () + "Create a standalone minibuffer" + (interactive) + (if (console-on-window-system-p) + (progn + (setq initial-frame-plist + (list 'minibuffer nil + 'width (frame-width (selected-frame)) + 'height (frame-height (selected-frame)))) + (setq default-minibuffer-frame + (make-frame + (list 'minibuffer 'only + 'width minibuf-frame-width + 'height minibuf-frame-height + 'menubar-visible-p nil + 'default-toolbar-visible-p nil + 'name "minibuffer" + 'top minibuf-frame-pos-y + 'left minibuf-frame-pos-x + 'has-modeline-p nil))) + + ;; Bogus! But it avoids annoying screen flash at startup + (if (not command-line-args-left) + (frame-notice-user-settings))))) + +(provide 'detached-minibuf) + +;;; detached-minibuf.el ends here
--- a/lisp/utils/edmacro.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/utils/edmacro.el Mon Aug 13 09:15:11 2007 +0200 @@ -3,26 +3,29 @@ ;; Copyright (C) 1993, 1994 Free Software Foundation, Inc. ;; Author: Dave Gillespie <daveg@synaptics.com> -;; Maintainer: Dave Gillespie <daveg@synaptics.com> -;; Version: 2.01 +;; Hrvoje Niksic <hniksic@srce.hr> -- XEmacs port +;; Maintainer: Hrvoje Niksic <hniksic@srce.hr> +;; Version: 3.05 ;; Keywords: abbrev -;; This file is part of GNU Emacs. +;; This file is part of XEmacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; XEmacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. +;; XEmacs is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; along with XEmacs; see the file COPYING. If not, write to the Free +;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +;; 02111-1307, USA. + +;;; Synched up with: FSF 19.34. ;;; Commentary: @@ -68,12 +71,12 @@ ;; Emacs 19.18.) This package does not work with Emacs 18 or ;; Lucid Emacs. -;; You bet it does. -hniksic +;; But it works with XEmacs. At least the modified version. -hniksic ;;; Code: (eval-when-compile - (require 'cl)) + (require 'cl)) ;;; The user-level commands for editing macros. @@ -104,13 +107,16 @@ With a prefix argument, format the macro in a more concise way." (interactive "kKeyboard macro to edit (C-x e, M-x, C-h l, or keys): \nP") (when keys + (setq keys (edmacro-events-to-keys keys)) (let ((cmd (if (arrayp keys) (key-binding keys) keys)) (mac nil)) (cond (store-hook (setq mac keys) (setq cmd nil)) ((or (eq cmd 'call-last-kbd-macro) - (member keys '("\r" [return]))) + (and (arrayp keys) + (= 1 (length keys)) + (eq ?\r (aref keys 0)))) (or last-kbd-macro (y-or-n-p "No keyboard macro defined. Create one? ") (keyboard-quit)) @@ -245,8 +251,8 @@ (let ((key (edmacro-parse-keys (buffer-substring (match-beginning 1) (match-end 1))))) - (unless (equal key "") - (if (equal key "none") + (unless (equal key []) + (if (equal key [?n ?o ?n ?e]) (setq no-keys t) (push key keys) (let ((b (key-binding key))) @@ -291,7 +297,7 @@ (fset cmd mac))) (if no-keys (when cmd - (loop for key in (where-is-internal cmd '(keymap)) do + (loop for key in (where-is-internal cmd) do (global-unset-key key))) (when keys (if (= (length mac) 0) @@ -432,18 +438,18 @@ (if match (cdr (assoc (cdr match) word-to-sym)) arg)))) - (force-sym nil) - res word found) + res) (while (and (< pos (length string)) (string-match "[^ \t\n\f]+" string pos)) (let ((word (substring string (match-beginning 0) (match-end 0))) (times 1) + (force-sym nil) (add nil)) (setq pos (match-end 0)) (when (string-match "\\([0-9]+\\)\\*." word) (setq times (string-to-int (substring word 0 (match-end 1)))) (setq word (substring word (1+ (match-end 1))))) - (when (string-match "^<\\([^>]+\\)>$" word) + (when (string-match "^<\\([^<>]+\\)>$" word) (setq word (match-string 1 word)) (setq force-sym t)) (setq match (assoc word word-to-sym)) @@ -452,7 +458,8 @@ ;; Octal value of character. (setq add (list - (edmacro-int-char (string-to-int (substring word 1)))))) + (edmacro-int-char + (edmacro-octal-string-to-integer (substring word 1)))))) ((string-match "^<<.+>>$" word) ;; Extended command. (setq add @@ -465,18 +472,18 @@ 'execute-extended-command)) '(meta x)))) (mapcar conv-chars (concat (substring word 2 -2) "\r"))) - )) + )) ((or (equal word "REM") (string-match "^;;" word)) ;; Comment. (setq pos (string-match "$" string pos))) (match - ;; Convert to symbol. - (setq add (list (cdr match)))) + ;; Convert to symbol. + (setq add (list (cdr match)))) ((string-match "^\\^" word) ;; ^X == C-x (if (/= (length word) 2) (error "^ must be followed by one character")) - (setq add `((control ,(aref word 0))))) + (setq add (list 'control (aref word 0)))) ((string-match "^[MCSsAH]-" word) ;; Parse C-* (setq @@ -512,17 +519,18 @@ (loop repeat times do (setq new (append new add))) (setq add new)) (setq res (nconc res add)))) - (mapvector 'identity res))) + (mapvector 'identity res))) (defun edmacro-conv (char-or-sym add-<>) (let ((char-to-word '((?\0 . "NUL") - (?\r . "RET") - (?\n . "LFD") - (?\t . "TAB") - (?\e . "ESC") - (?\ . "SPC") - (?\C-? . "DEL"))) + (?\r . "RET") + (?\n . "LFD") + (?\t . "TAB") + (?\e . "ESC") + (?\ . "SPC") + (?\C-? . "DEL"))) (symbol-to-char '((return . ?\r) + (linefeed . ?\n) (space . ?\ ) (delete . ?\C-?) (tab . ?\t) @@ -540,9 +548,12 @@ (concat "<" (symbol-name char-or-sym) ">") (symbol-name char-or-sym)) (let ((found (assq char-or-sym char-to-word))) - (if found - (cdr found) - (single-key-description char-or-sym))))))) + (cond (found + (cdr found)) + ((< char-or-sym 128) + (single-key-description char-or-sym)) + (t + (format "\\%o" (edmacro-int-char char-or-sym))))))))) (defun edmacro-format-1 (keys command times togetherp) (let ((res "") @@ -589,62 +600,108 @@ (if togetherp (format " * %d" (length start)))))) res)) -(defun edmacro-format-keys (macro &optional verbose) - (let ((cnt 0) - (res "")) - ;; XEmacs: - ;; If we're dealing with events, convert them to symbols first. - (and (fboundp 'events-to-keys) - (eventp (aref macro 0)) - (setq macro (events-to-keys macro t))) +;; Convert the keypress events in vector x to keys, and return a +;; vector of keys. If a list element is not a keypress event, ignore +;; it. +(defun edmacro-events-to-keys (x) + (if (or (not (fboundp 'events-to-keys)) + (not (arrayp x))) + x + (let ((cnt 0) + (len (length x)) + new el) + (while (< cnt len) + (setq el (aref x cnt)) + (cond ((eventp el) + (if (mouse-event-p el) + (setq el nil) + (setq el (aref (events-to-keys (vector el)) 0)))) + (t + nil)) ; leave it be. + (if el + (setq new (nconc new (list el)))) + (incf cnt)) + (mapvector 'identity new)))) - ;; I'm not sure I understand the original code, but this seems to - ;; work. - (and (eq verbose 1) - (setq verbose nil)) - - ;; Oh come on -- I want a list! Much easier to process... - (setq macro (mapcar 'identity macro)) +;; Collapse a list of keys into a list of function keys, where +;; applicable. +(defun edmacro-fkeys (keys) + (let (new k) + (while keys + (setq k (nconc k (list (car keys)))) + (setq lookup (lookup-key function-key-map (mapvector 'identity k))) + (cond ((vectorp lookup) + (setq new (nconc new (mapcar 'identity lookup))) + (setq k nil)) + ((keymapp lookup) + nil) + ((null lookup) + (setq new (nconc new k)) + (setq k nil)) + (t + (setq k nil))) + (setq keys (cdr keys))) + (if (keymapp lookup) + (setq new (nconc new k))) + new)) - (while macro - (let (key lookup (times 1) self-insert-p) - (loop do - (setq key (nconc key (list (car macro))) - macro (cdr macro) - lookup (lookup-key global-map (mapvector 'identity key))) - while - (and lookup (not (commandp lookup)))) - (if (and (eq lookup 'self-insert-command) - (= (length key) 1) - (not (memq (car key) - '(?\ ?\r ?\n space return linefeed tab)))) - (while (and (< (length key) 23) - (eq (lookup-key global-map (car macro)) - 'self-insert-command) - (not (memq (car macro) - '(?\ ?\r ?\n space return linefeed tab)))) - (setq key (nconc key (list (car macro))) - macro (cdr macro) - self-insert-p t)) - (while (edmacro-seq-equal key macro) - (setq macro (nthcdr (length key) macro)) - (incf times))) - (if (or self-insert-p - (null (cdr key)) - (= times 1)) - (callf concat res (edmacro-format-1 key (if verbose lookup - nil) - times self-insert-p) - (if verbose "\n" " ")) - (loop repeat times - do - (callf concat res - (edmacro-format-1 key (if verbose lookup - nil) - 1 self-insert-p) - (if verbose "\n" " ")))) - )) - res)) +(defun edmacro-format-keys (macro &optional verbose) + ;; XEmacs: + ;; If we're dealing with events, convert them to symbols first. + (setq macro (edmacro-events-to-keys macro)) + (if (zerop (length macro)) + "" + (let ((res "")) + ;; I'm not sure I understand the original code, but this seems to + ;; work. + (and (eq verbose 1) + (setq verbose nil)) + + ;; Oh come on -- I want a list! Much easier to process... + (setq macro (mapcar 'identity macro)) + (setq macro (edmacro-fkeys macro)) + (while macro + (let (key lookup (times 1) self-insert-p) + (loop do + (setq key (nconc key (list (car macro))) + macro (cdr macro) + lookup (lookup-key global-map (mapvector 'identity key))) + while + (and lookup (not (commandp lookup)))) + ;; (lookup-key [?\C-x ?e]) seems to return a vector! + (if (vectorp lookup) + (setq lookup nil)) + (if (and (eq lookup 'self-insert-command) + (= (length key) 1) + (not (memq (car key) + '(?\ ?\r ?\n space return linefeed tab)))) + (while (and (< (length key) 23) + (eq (lookup-key global-map (car macro)) + 'self-insert-command) + (not (memq + (car macro) + '(?\ ?\r ?\n space return linefeed tab)))) + (setq key (nconc key (list (car macro))) + macro (cdr macro) + self-insert-p t)) + (while (edmacro-seq-equal key macro) + (setq macro (nthcdr (length key) macro)) + (incf times))) + (if (or self-insert-p + (null (cdr key)) + (= times 1)) + (callf concat res (edmacro-format-1 key (if verbose lookup + nil) + times self-insert-p) + (and macro (if verbose "\n" " "))) + (loop repeat times + do + (callf concat res + (edmacro-format-1 key (if verbose lookup + nil) + 1 self-insert-p) + (and macro (if verbose "\n" " "))))))) + res))) (defun edmacro-seq-equal (seq1 seq2) (while (and seq1 seq2 @@ -653,11 +710,31 @@ seq2 (cdr seq2))) (not seq1)) +(defsubst edmacro-oct-char-to-integer (character) + "Take a char and return its value as if it was a octal digit." + (if (and (>= character ?0) (<= character ?7)) + (- character ?0) + (error (format "Invalid octal digit `%c'." character)))) + +(defun edmacro-octal-string-to-integer (octal-string) + "Return decimal integer for OCTAL-STRING." + (interactive "sOctal number: ") + (let ((oct-num 0)) + (while (not (equal octal-string "")) + (setq oct-num (+ (* oct-num 8) + (edmacro-oct-char-to-integer + (string-to-char octal-string)))) + (setq octal-string (substring octal-string 1))) + oct-num)) + + (defun edmacro-fix-menu-commands (macro) (when (vectorp macro) (let ((i 0) ev) (while (< i (length macro)) - (when (consp (setq ev (aref macro i))) + (when (and (consp (setq ev (aref macro i))) + (not (memq (car ev) ; ha ha + '(hyper super control meta alt control shift)))) (cond ((equal (cadadr ev) '(menu-bar)) (setq macro (vconcat (edmacro-subseq macro 0 i) (vector 'menu-bar (car ev)) @@ -705,7 +782,7 @@ (prin1 definition (current-buffer)) (insert "))\n") (if keys - (let ((keys (where-is-internal macroname '(keymap)))) + (let ((keys (where-is-internal macroname))) (while keys (insert (format "(global-set-key %S '%s)\n" (car keys) macroname)) (setq keys (cdr keys)))))))
--- a/lisp/utils/eldoc.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/utils/eldoc.el Mon Aug 13 09:15:11 2007 +0200 @@ -7,7 +7,7 @@ ;; Keywords: extensions ;; Created: 1995-10-06 -;; $Id: eldoc.el,v 1.1 1997/02/14 19:59:51 steve Exp $ +;; $Id: eldoc.el,v 1.2 1997/02/24 01:14:18 steve Exp $ ;; This file is part of GNU Emacs. @@ -43,6 +43,7 @@ ;; (autoload 'turn-on-eldoc-mode "eldoc" nil t) ;; (add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode) ;; (add-hook 'lisp-interaction-mode-hook 'turn-on-eldoc-mode) +;; (add-hook 'ielm-mode-hook 'turn-on-eldoc-mode) ;;; Code: @@ -91,41 +92,30 @@ Actually, any name of a function which takes a string as an argument and returns another string is acceptable.") +;; No user options below here. + (defvar eldoc-message-commands nil - "*Commands after which it is appropriate to print in the echo area. + "Commands after which it is appropriate to print in the echo area. Eldoc does not try to print function arglists, etc. after just any command, because some commands print their own messages in the echo area and these functions would instantly overwrite them. But self-insert-command as well as most motion commands are good candidates. -This variable contains an obarray of symbols; it is probably best to -manipulate this data structure with the commands `eldoc-add-command' and +This variable contains an obarray of symbols; do not manipulate it +directly. Instead, use the functions `eldoc-add-command' and `eldoc-remove-command'.") -(cond ((null eldoc-message-commands) - ;; If you increase the number of buckets, keep it a prime number. - (setq eldoc-message-commands (make-vector 31 0)) - (let ((list '("self-insert-command" - "next-" "previous-" - "forward-" "backward-" - "beginning-of-" "end-of-" - "goto-" - "recenter" - "scroll-" - "mouse-set-point")) - (syms nil)) - (while list - (setq syms (all-completions (car list) obarray 'fboundp)) - (setq list (cdr list)) - (while syms - (set (intern (car syms) eldoc-message-commands) t) - (setq syms (cdr syms))))))) +;; This is used by eldoc-add-command to initialize eldoc-message-commands +;; as an obarray. +;; If you increase the number of buckets, keep it a prime number. +(defconst eldoc-message-commands-table-size 31) ;; Bookkeeping; the car contains the last symbol read from the buffer. ;; The cdr contains the string last displayed in the echo area, so it can ;; be printed again if necessary without reconsing. (defvar eldoc-last-data '(nil . nil)) +(defvar eldoc-last-message nil) ;; Idle timers are supported in Emacs 19.31 and later. (defconst eldoc-use-idle-timer-p (fboundp 'run-with-idle-timer)) @@ -137,16 +127,6 @@ ;; This is used to determine if eldoc-idle-delay is changed by the user. (defvar eldoc-current-idle-delay eldoc-idle-delay) -;; In emacs 19.29 and later, and XEmacs 19.13 and later, all messages are -;; recorded in a log. Do not put eldoc messages in that log since -;; they are Legion. -(defmacro eldoc-message (&rest args) - (if (fboundp 'display-message) - ;; XEmacs 19.13 way of preventing log messages. - (list 'display-message '(quote no-log) (apply 'list 'format args)) - (list 'let (list (list 'message-log-max 'nil)) - (apply 'list 'message args)))) - ;;;###autoload (defun eldoc-mode (&optional prefix) @@ -158,23 +138,26 @@ If called with a positive or negative prefix argument, enable or disable the mode, respectively." (interactive "P") - + (setq eldoc-last-message nil) (cond (eldoc-use-idle-timer-p - (add-hook 'post-command-hook 'eldoc-schedule-timer)) + (add-hook 'post-command-hook 'eldoc-schedule-timer) + (add-hook 'pre-command-hook 'eldoc-pre-command-refresh-echo-area)) (t ;; Use post-command-idle-hook if defined, otherwise use ;; post-command-hook. The former is only proper to use in Emacs ;; 19.30; that is the first version in which it appeared, but it ;; was obsolesced by idle timers in Emacs 19.31. (add-hook (if (boundp 'post-command-idle-hook) - 'post-command-idle-hook - 'post-command-hook) - 'eldoc-print-current-symbol-info))) - + 'post-command-idle-hook + 'post-command-hook) + 'eldoc-print-current-symbol-info) + ;; quick and dirty hack for seeing if this is XEmacs + (and (fboundp 'display-message) + (add-hook 'pre-command-hook + 'eldoc-pre-command-refresh-echo-area)))) (setq eldoc-mode (if prefix (>= (prefix-numeric-value prefix) 0) (not eldoc-mode))) - (and (interactive-p) (if eldoc-mode (message "eldoc-mode is enabled") @@ -187,38 +170,6 @@ (interactive) (eldoc-mode 1)) -(defun eldoc-add-command (cmd) - "Add COMMAND to the list of commands which causes function arg display. -If called interactively, completion on defined commands is available. - -When point is in a sexp, the function args are not reprinted in the echo -area after every possible interactive command because some of them print -their own messages in the echo area; the eldoc functions would instantly -overwrite them unless it is more restrained." - (interactive "CAdd function to eldoc message commands list: ") - (and (fboundp cmd) - (set (intern (symbol-name cmd) eldoc-message-commands) t))) - -(defun eldoc-remove-command (cmd) - "Remove COMMAND from the list of commands which causes function arg display. -If called interactively, completion matches only those functions currently -in the list. - -When point is in a sexp, the function args are not reprinted in the echo -area after every possible interactive command because some of them print -their own messages in the echo area; the eldoc functions would instantly -overwrite them unless it is more restrained." - (interactive (list (completing-read - "Remove function from eldoc message commands list: " - eldoc-message-commands 'boundp t))) - (and (symbolp cmd) - (setq cmd (symbol-name cmd))) - (if (fboundp 'unintern) - (unintern cmd eldoc-message-commands) - (let ((s (intern-soft cmd eldoc-message-commands))) - (and s - (makunbound s))))) - ;; Idle timers are part of Emacs 19.31 and later. (defun eldoc-schedule-timer () (or (and eldoc-timer @@ -232,17 +183,65 @@ (setq eldoc-current-idle-delay eldoc-idle-delay) (timer-set-idle-time eldoc-timer eldoc-idle-delay t)))) +;; This function goes on pre-command-hook for XEmacs or when using idle +;; timers in Emacs. Motion commands clear the echo area for some reason, +;; which make eldoc messages flicker or disappear just before motion +;; begins. This function reprints the last eldoc message immediately +;; before the next command executes, which does away with the flicker. +;; This doesn't seem to be required for Emacs 19.28 and earlier. +(defun eldoc-pre-command-refresh-echo-area () + (and eldoc-last-message + (if (eldoc-display-message-no-interference-p) + (eldoc-message eldoc-last-message) + (setq eldoc-last-message nil)))) + +(defun eldoc-message (&rest args) + (let ((omessage eldoc-last-message)) + (cond ((eq (car args) eldoc-last-message)) + ((or (null args) + (null (car args))) + (setq eldoc-last-message nil)) + (t + (setq eldoc-last-message (apply 'format args)))) + ;; In emacs 19.29 and later, and XEmacs 19.13 and later, all messages + ;; are recorded in a log. Do not put eldoc messages in that log since + ;; they are Legion. + (if (fboundp 'display-message) + ;; XEmacs 19.13 way of preventing log messages. + (if eldoc-last-message + (display-message 'no-log eldoc-last-message) + (and omessage + (clear-message 'no-log))) + (let ((message-log-max nil)) + (if eldoc-last-message + (message "%s" eldoc-last-message) + (and omessage + (message nil)))))) + eldoc-last-message) + (defun eldoc-print-current-symbol-info () - (and eldoc-mode - (not executing-kbd-macro) + (and (eldoc-display-message-p) + (let ((current-symbol (eldoc-current-symbol)) + (current-fnsym (eldoc-fnsym-in-current-sexp))) + (or (cond ((eq current-symbol current-fnsym) + (or (eldoc-print-fnsym-args current-fnsym) + (eldoc-print-var-docstring current-symbol))) + (t + (or (eldoc-print-var-docstring current-symbol) + (eldoc-print-fnsym-args current-fnsym)))) + (eldoc-message nil))))) - ;; Having this mode operate in an active minibuffer makes it - ;; impossible to see what you're doing. - (not (eq (selected-window) (minibuffer-window))) - +;; Decide whether now is a good time to display a message. +(defun eldoc-display-message-p () + (and (eldoc-display-message-no-interference-p) (cond (eldoc-use-idle-timer-p - (and (symbolp last-command) + ;; If this-command is non-nil while running via an idle + ;; timer, we're still in the middle of executing a command, + ;; e.g. a query-replace where it would be annoying to + ;; overwrite the echo area. + (and (not this-command) + (symbolp last-command) (intern-soft (symbol-name last-command) eldoc-message-commands))) (t @@ -253,21 +252,21 @@ (and (symbolp this-command) (intern-soft (symbol-name this-command) eldoc-message-commands) - (sit-for eldoc-idle-delay)))) + (sit-for eldoc-idle-delay)))))) - (let ((current-symbol (eldoc-current-symbol)) - (current-fnsym (eldoc-fnsym-in-current-sexp))) - (cond ((eq current-symbol current-fnsym) - (eldoc-print-fnsym-args current-fnsym)) - (t - (or (eldoc-print-var-docstring current-symbol) - (eldoc-print-fnsym-args current-fnsym))))))) +(defun eldoc-display-message-no-interference-p () + (and eldoc-mode + (not executing-kbd-macro) + ;; Having this mode operate in an active minibuffer/echo area causes + ;; interference with what's going on there. + (not cursor-in-echo-area) + (not (eq (selected-window) (minibuffer-window))))) -(defun eldoc-print-fnsym-args (&optional symbol) +(defun eldoc-print-fnsym-args (sym) (interactive) - (let ((sym (or symbol (eldoc-fnsym-in-current-sexp))) - (args nil)) - (cond ((not (and (symbolp sym) + (let ((args nil)) + (cond ((not (and sym + (symbolp sym) (fboundp sym)))) ((eq sym (car eldoc-last-data)) (setq args (cdr eldoc-last-data))) @@ -284,24 +283,40 @@ (eldoc-message "%s: %s" sym args)))) (defun eldoc-fnsym-in-current-sexp () - (let* ((p (point)) - (sym (progn - (while (and (eldoc-forward-sexp-safe -1) - (> (point) (point-min)))) - (cond ((or (= (point) (point-min)) - (memq (or (char-after (point)) 0) - '(?\( ?\")) - ;; If we hit a quotation mark before a paren, we - ;; are inside a specific string, not a list of - ;; symbols. - (eq (or (char-after (1- (point))) 0) ?\")) - nil) - (t (condition-case nil - (read (current-buffer)) - (error nil))))))) - (goto-char p) - (and (symbolp sym) - sym))) + (let ((p (point))) + (eldoc-beginning-of-sexp) + (prog1 + ;; Don't do anything if current word is inside a string. + (if (= (or (char-after (1- (point))) 0) ?\") + nil + (eldoc-current-symbol)) + (goto-char p)))) + +(defun eldoc-beginning-of-sexp () + (let ((parse-sexp-ignore-comments t)) + (condition-case err + (while (progn + (forward-sexp -1) + (or (= (or (char-after (1- (point)))) ?\") + (> (point) (point-min))))) + (error nil)))) + +;; returns nil unless current word is an interned symbol. +(defun eldoc-current-symbol () + (let ((c (char-after (point)))) + (and c + (memq (char-syntax c) '(?w ?_)) + (intern-soft (current-word))))) + +;; Do indirect function resolution if possible. +(defun eldoc-symbol-function (fsym) + (let ((defn (and (fboundp fsym) + (symbol-function fsym)))) + (and (symbolp defn) + (condition-case err + (setq defn (indirect-function fsym)) + (error (setq defn nil)))) + defn)) (defun eldoc-function-argstring (fn) (let* ((prelim-def (eldoc-symbol-function fn)) @@ -339,8 +354,7 @@ (concat "(" (mapconcat 'identity arglist " ") ")")) -(defun eldoc-print-var-docstring (&optional sym) - (or sym (setq sym (eldoc-current-symbol))) +(defun eldoc-print-var-docstring (sym) (eldoc-print-docstring sym (documentation-property sym 'variable-documentation t))) @@ -463,6 +477,20 @@ (string-match "^Args are +\\([^\n]+\\)$" doc))) (function (lambda (doc) (substring doc (match-beginning 1) (match-end 1))))) + + ;; These subrs don't have arglists in their docstrings. + ;; This is cheating. + (list (function (lambda (doc fn) + (memq fn '(and or list + -)))) + (function (lambda (doc) + ;; The value nil is a placeholder; otherwise, the + ;; following string may be compiled as a docstring, + ;; and not a return value for the function. + ;; In interpreted lisp form they are + ;; indistinguishable; it only matters for compiled + ;; forms. + nil + "&rest args"))) )) (defun eldoc-function-argstring-from-docstring (fn) @@ -497,36 +525,64 @@ (concat "(" (funcall eldoc-argument-case doc) ")")))))) -;; forward-sexp calls scan-sexps, which returns an error if it hits the -;; beginning or end of the sexp. This returns nil instead. -(defun eldoc-forward-sexp-safe (&optional count) - "Move forward across one balanced expression (sexp). -With argument, do it that many times. Negative arg -COUNT means -move backward across COUNT balanced expressions. -Return distance in buffer moved, or nil." - (or count (setq count 1)) - (condition-case err - (- (- (point) (progn - (let ((parse-sexp-ignore-comments t)) - (forward-sexp count)) - (point)))) - (error nil))) +;; When point is in a sexp, the function args are not reprinted in the echo +;; area after every possible interactive command because some of them print +;; their own messages in the echo area; the eldoc functions would instantly +;; overwrite them unless it is more restrained. +;; These functions do display-command table management. + +(defun eldoc-add-command (&rest cmds) + (or eldoc-message-commands + (setq eldoc-message-commands + (make-vector eldoc-message-commands-table-size 0))) + + (let (name sym) + (while cmds + (setq name (car cmds)) + (setq cmds (cdr cmds)) + + (cond ((symbolp name) + (setq sym name) + (setq name (symbol-name sym))) + ((stringp name) + (setq sym (intern-soft name)))) + + (and (symbolp sym) + (fboundp sym) + (set (intern name eldoc-message-commands) t))))) -;; Do indirect function resolution if possible. -(defun eldoc-symbol-function (fsym) - (let ((defn (and (fboundp fsym) - (symbol-function fsym)))) - (and (symbolp defn) - (condition-case err - (setq defn (indirect-function fsym)) - (error (setq defn nil)))) - defn)) +(defun eldoc-add-command-completions (&rest names) + (while names + (apply 'eldoc-add-command + (all-completions (car names) obarray 'fboundp)) + (setq names (cdr names)))) + +(defun eldoc-remove-command (&rest cmds) + (let (name) + (while cmds + (setq name (car cmds)) + (setq cmds (cdr cmds)) + + (and (symbolp name) + (setq name (symbol-name name))) -(defun eldoc-current-symbol () - (let ((c (char-after (point)))) - (and c - (memq (char-syntax c) '(?w ?_)) - (intern-soft (current-word))))) + (if (fboundp 'unintern) + (unintern name eldoc-message-commands) + (let ((s (intern-soft name eldoc-message-commands))) + (and s + (makunbound s))))))) + +(defun eldoc-remove-command-completions (&rest names) + (while names + (apply 'eldoc-remove-command + (all-completions (car names) eldoc-message-commands)) + (setq names (cdr names)))) + +;; Prime the command list. +(eldoc-add-command-completions + "backward-" "beginning-of-" "delete-other-windows" "delete-window" + "end-of-" "forward-" "goto-" "mouse-set-point" "next-" "other-window" + "previous-" "recenter" "scroll-" "self-insert-command" "split-window-") (provide 'eldoc)
--- a/lisp/utils/facemenu.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/utils/facemenu.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,5 +1,5 @@ ;;; facemenu.el --- create a face menu for interactively adding fonts to text -;; Copyright (c) 1994, 1995 Free Software Foundation, Inc. +;; Copyright (c) 1994, 1995, 1996 Free Software Foundation, Inc. ;; XEmacs version: Mike Sperber <sperber@informatik.uni-tuebingen.de> ;; Original author: Boris Goldowsky <boris@gnu.ai.mit.edu> @@ -22,9 +22,10 @@ ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ;; 02111-1307, USA. -;;; Synched up with: FSF 19.30. +;;; Synched up with: FSF 19.34. ;;; Commentary: + ;; This file defines a menu of faces (bold, italic, etc) which allows you to ;; set the face used for a region of the buffer. Some faces also have ;; keybindings, which are shown in the menu. Faces with names beginning with @@ -38,11 +39,6 @@ ;; The menu also contains submenus for indentation and justification-changing ;; commands. -;;; Installation: -;; Just do a (require 'facemenu). -;; If you want the menu bound to a mouse button under XEmacs, do -;; (define-key global-map '(control button2) 'facemenu-menu) - ;;; Usage: ;; Selecting a face from the menu or typing the keyboard equivalent will ;; change the region to use that face. If you use transient-mark-mode and the @@ -54,6 +50,28 @@ ;; The standard keybindings are M-g (or ESC g) + letter: ;; M-g i = "set italic", M-g b = "set bold", etc. +;;; Customization: +;; An alternative set of keybindings that may be easier to type can be set up +;; using "Alt" or "Hyper" keys. This requires that you either have or create +;; an Alt or Hyper key on your keyboard. On my keyboard, there is a key +;; labeled "Alt", but to make it act as an Alt key I have to put this command +;; into my .xinitrc: +;; xmodmap -e "add Mod3 = Alt_L" +;; Or, I can make it into a Hyper key with this: +;; xmodmap -e "keysym Alt_L = Hyper_L" -e "add Mod2 = Hyper_L" +;; Check with local X-perts for how to do it on your system. +;; Then you can define your keybindings with code like this in your .emacs: +;; (setq facemenu-keybindings +;; '((default . [?\H-d]) +;; (bold . [?\H-b]) +;; (italic . [?\H-i]) +;; (bold-italic . [?\H-l]) +;; (underline . [?\H-u]))) +;; (setq facemenu-keymap global-map) +;; (setq facemenu-key nil) +;; (define-key global-map [?\H-c] 'facemenu-set-foreground) ; set fg color +;; (define-key global-map [?\H-C] 'facemenu-set-background) ; set bg color +;; (require 'facemenu) ;; ;; The order of the faces that appear in the menu and their keybindings can be ;; controlled by setting the variables `facemenu-keybindings' and @@ -79,6 +97,7 @@ (provide 'facemenu) +;; XEmacs (require 'easymenu) ;;; Provide some binding for startup: @@ -112,6 +131,7 @@ This should be nil to put them at the top of the menu, or t to put them just before \"Other\" at the end.") +;; XEmacs -- additional faces (defvar facemenu-unlisted-faces '(modeline region secondary-selection highlight scratch-face gui-button-face isearch hyperlink @@ -215,6 +235,22 @@ requested in `facemenu-keybindings'.") (defalias 'facemenu-keymap facemenu-keymap) + +(defvar facemenu-add-face-function nil + "Function called at beginning of text to change or `nil'. +This function is passed the FACE to set and END of text to change, and must +return a string which is inserted. It may set `facemenu-end-add-face'.") + +(defvar facemenu-end-add-face nil + "String to insert or function called at end of text to change or `nil'. +This function is passed the FACE to set, and must return a string which is +inserted.") + +(defvar facemenu-remove-face-function nil + "When non-`nil' function called to remove faces. +This function is passed the START and END of text to change. +May also be `t' meaning to use `facemenu-add-face-function'.") + ;;; Internal Variables (defvar facemenu-color-alist nil @@ -260,10 +296,10 @@ inserted. Moving point or switching buffers before typing a character to insert cancels the specification." (interactive (list (read-face-name "Use face: "))) - (setq zmacs-region-stays t) + (setq zmacs-region-stays t) ; XEmacs (barf-if-buffer-read-only) (facemenu-add-new-face face) - (facemenu-update-facemenu-menu) + (facemenu-update-facemenu-menu) ; XEmacs (if (and (facemenu-region-active-p) (not current-prefix-arg)) (let ((start (or start (region-beginning))) @@ -304,7 +340,7 @@ (facemenu-set-face face start end))) ;;;###autoload -(defun facemenu-set-face-from-menu (face) +(defun facemenu-set-face-from-menu (face start end) "Set the face of the region or next character typed. This function is designed to be called from a menu; the face to use is the menu item's name. @@ -315,19 +351,21 @@ Otherwise, this command specifies the face for the next character inserted. Moving point or switching buffers before typing a character to insert cancels the specification." - (let ((start (if (and (facemenu-region-active-p) - (not current-prefix-arg)) - (region-beginning))) - (end (if (and (facemenu-region-active-p) - (not current-prefix-arg)) - (region-end)))) - (barf-if-buffer-read-only) - (setq zmacs-region-stays t) - (facemenu-get-face face) - (if start - (facemenu-add-face face start end) - (facemenu-self-insert-face face)))) + (interactive (list last-command-event + (if (and (facemenu-region-active-p) + (not current-prefix-arg)) + (region-beginning)) + (if (and (facemenu-region-active-p) + (not current-prefix-arg)) + (region-end)))) + (barf-if-buffer-read-only) + (setq zmacs-region-stays t) ; XEmacs + (facemenu-get-face face) + (if start + (facemenu-add-face face start end) + (facemenu-self-insert-face face))) ; XEmacs +;; XEmacs (defun facemenu-self-insert-face (face) (setq self-insert-face (cond ((null self-insert-face) face) @@ -417,7 +455,8 @@ (facemenu-sized-face (facemenu-face-strip-size face) size)) face)) - (t (facemenu-sized-face face size)))) + ;;[BV 9-Feb-97] strip-face from this face too, please! + (t (facemenu-sized-face (facemenu-face-strip-size face) size)))) (defun facemenu-adjust-size (from to) "Adjust the size of the text between FROM and TO according @@ -460,7 +499,7 @@ "Make the region invisible. This sets the `invisible' text property; it can be undone with `facemenu-remove-special'." - (interactive "r") + (interactive "_r") (put-text-property start end 'invisible t)) ;;;###autoload @@ -468,7 +507,7 @@ "Make the region intangible: disallow moving into it. This sets the `intangible' text property; it can be undone with `facemenu-remove-special'." - (interactive "r") + (interactive "_r") (put-text-property start end 'intangible t)) ;;;###autoload @@ -476,7 +515,7 @@ "Make the region unmodifiable. This sets the `read-only' text property; it can be undone with `facemenu-remove-special'." - (interactive "r") + (interactive "_r") (put-text-property start end 'read-only t)) ;;;###autoload @@ -501,15 +540,35 @@ (defun list-text-properties-at (p) "Pop up a buffer listing text-properties at LOCATION." (interactive "d") - (let ((props (text-properties-at p))) + (let ((props (text-properties-at p)) + category + str) (if (null props) (message "None") - (with-output-to-temp-buffer "*Text Properties*" - (princ (format "Text properties at %d:\n\n" p)) - (while props - (princ (format "%-20s %S\n" - (car props) (car (cdr props)))) - (setq props (cdr (cdr props)))))))) + (if (and (not (cdr (cdr props))) + (not (eq (car props) 'category)) + (< (length (setq str (format "Text property at %d: %s %S" + p (car props) (car (cdr props))))) + (frame-width))) + (message "%s" str) + (with-output-to-temp-buffer "*Text Properties*" + (princ (format "Text properties at %d:\n\n" p)) + (while props + (if (eq (car props) 'category) + (setq category (car (cdr props)))) + (princ (format "%-20s %S\n" + (car props) (car (cdr props)))) + (setq props (cdr (cdr props)))) + (if category + (progn + (setq props (symbol-plist category)) + (princ (format "\nCategory %s:\n\n" category)) + (while props + (princ (format "%-20s %S\n" + (car props) (car (cdr props)))) + (if (eq (car props) 'category) + (setq category (car (cdr props)))) + (setq props (cdr (cdr props))))))))))) ;;;###autoload (defun facemenu-read-color (&optional prompt) @@ -596,7 +655,7 @@ ((and (equal (facemenu-color-values a) (facemenu-color-values b)))))) -(defun facemenu-add-face (face start end) +(defun facemenu-add-face (face &optional start end) "Add FACE to text between START and END. For each section of that region that has a different face property, FACE will be consed onto it, and other faces that are completely hidden by that will be @@ -606,22 +665,48 @@ text property. Otherwise, selecting the default face would not have any effect." (interactive "*_xFace:\nr") - (if (eq face 'default) - (remove-text-properties start end '(face default)) - (let ((part-start start) part-end) - (while (not (= part-start end)) - (setq part-end (next-single-property-change part-start 'face nil end)) - (let* ((prev (get-text-property part-start 'face)) - (size (get-text-property part-start 'size)) - (face (if size (facemenu-sized-face face size) face))) - (put-text-property part-start part-end 'face - (if (null prev) - face - (facemenu-active-faces - (cons face - (if (listp prev) prev (list prev))))))) - (setq part-start part-end))))) + (if (and (eq face 'default) + (not (eq facemenu-remove-face-function t))) + (if facemenu-remove-face-function + (funcall facemenu-remove-face-function start end) + (if (and start (< start end)) + (remove-text-properties start end '(face default)) + (setq self-insert-face 'default + self-insert-face-command this-command))) + (if facemenu-add-face-function + (save-excursion + (if end (goto-char end)) + (save-excursion + (if start (goto-char start)) + (insert-before-markers + (funcall facemenu-add-face-function face end))) + (if facemenu-end-add-face + (insert (if (stringp facemenu-end-add-face) + facemenu-end-add-face + (funcall facemenu-end-add-face face))))) + (if (and start (< start end)) + (let ((part-start start) part-end) + (while (not (= part-start end)) + (setq part-end (next-single-property-change part-start 'face + nil end)) + (let ((prev (get-text-property part-start 'face))) + (put-text-property part-start part-end 'face + (if (null prev) + face + (facemenu-active-faces + (cons face + (if (listp prev) + prev + (list prev))))))) + (setq part-start part-end))) + (setq self-insert-face (if (eq last-command self-insert-face-command) + (cons face (if (listp self-insert-face) + self-insert-face + (list self-insert-face))) + face) + self-insert-face-command this-command))))) +;; XEmacs (defun facemenu-face-attributes (face) "Create a vector of the relevant face attributes of face FACE." (if (string-match "XEmacs" emacs-version)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/utils/frame-icon.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,216 @@ +;; frame-icon.el - set up mode-specific icons for each frame under XEmacs + +;; Author: Michael Lamoureux <lamour@engin.umich.edu> +;; Keywords: lisp, extensions +;; date created: 8/3/93 + +;; This file is part of XEmacs. + +;; XEmacs is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; XEmacs is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with XEmacs; see the file COPYING. If not, write to the Free +;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +;; 02111-1307, USA. + +;;; Synched up with: Not in FSF. + +;;; Commentary: + +;; Modified by Bob Weiner <weiner@infodock.com>, 1/13/94 +;; Handle XEmacs 19.8 pixmaps properly. +;; Also added in more mode settings and added many new bitmaps. +;; Renamed from icon.el to frame-icon.el. +;; Made all definitions start with the same prefix, 'icon-'. +;; Added a provide clause. +;; +;; Modified by Bob Weiner, 2/24/95, to handle XEmacs 19.12. +;; Added set of unmap-frame-hook. +;; +;; Modified by Bob Weiner, 7/17/95, to handle XEmacs 19.12. +;; Changed to use new image-handling protocols and added backwards +;; compatibility functions for new image functions. +;; +;; Modified by Bob Weiner, 7/18/95. +;; Added icon-suffix variable so can use .xbm or .xpm icons. +;; +;; Most Icons were extracted from: /export.lcs.mit.edu:/contrib/AIcons +;; + +;;; Code: + +(defvar icon-directory (concat data-directory "frame-icon/") + "Directory of icons used by frame-icon.el.") + +(defvar icon-suffix ".xbm" + "Must be .xbm or .xpm, depending on the format of the icons in icon-directory.") + +(defconst icon-mode-alist + '( + (default . "question") + ;; For testing + (fundamental-mode . "match") + ;; + (archie-mode . "archie") + (asm-mode . "nuke") + (bbdb-mode . "eye") + (bookmark-menu-mode . "finder") + (Buffer-menu-mode . "help") + (c++-mode . "c++") + (c++-c-mode . "escherknot") + (c-mode . "c") + (awk-mode . "escherknot") + (cvs-mode . "tree") + (f90-mode . "wizard") + (xrdb-mode . "RIP") + ;; + (calc-edit-mode . "cray") + (calc-keypad . "cray") + (calc-mode . "cray") + (calc-trail-mode . "cray") + (MacEdit-mode . "cray") + ;; + (calendar-mode . "calendar") + (comint-mode . "terminal") + (perl-mode . "perl") + (csh-mode . "manpage2") + (db-edit-mode . "filing") + (db-view-mode . "filing") + (dired-mode . "filing") + (doctor-mode . "ying-yang-48") + (edit-faces-mode . "eye") + (Edit-options-mode . "swissknife") + (emacs-lisp-mode . "elisp") + (fortran-mode . "RIP") + (gdb-mode . "bug-48") + (gud-mode . "bug-48") + (gnus-article-mode . "news") + (gnus-group-mode . "news") + (gnus-summary-mode . "news") + (gopher-mode . "gopher") + (html-mode . "xmosaic") + (indented-text-mode . "page") + (Info-mode . "help") + (java-mode . "coffee") + (kotl-mode . "kotl") + (lisp-interaction-mode . "swissknife") + (lisp-mode . "lisp") + (lock-mode . "termlock") + (mail-mode . "scroll2") + (Manual-mode . "manpage") + (man-mode . "manpage") + (news-reply-mode . "match") + (outline-mode . "outline") + (perl-mode . "perl") + (edit-picture . "splat") + (pm-fdr-mode . "mail") + (pm-group-mode . "news") + (pm-msg-edit-mode . "mail") + (pm-msgsumm-mode . "mail") + (pm-mode . "mail") + (rdb-mode . "question") + (rmail-mode . "mail") + (rmail-edit-mode . "mail") + (rmail-summary-mode . "mail") + (scheme-interaction-mode . "swissknife") + (scheme-mode . "lisp") + (shell-mode . "terminal") + (sm-manual-mode . "manpage") + (sql-mode . "sql") + (tcl-mode . "radioactive") + (telnet-mode . "rlogin") + (texinfo-mode . "texinfo") + (text-mode . "page") + (unix-apropos-mode . "manpage") + (ups-mode . "hourglass") ; process listing mode + (vi-mode . "stopsign") + (vip-mode . "stopsign") + (vkill-mode . "load") + (vrml-mode . "drawing") + (vm-mode . "scroll2") + (vm-summary-mode . "scroll2") + (w3-mode . "world") + (waisq-mode . "library") + (wordstar-mode . "words") + (wrolo-mode . "phone") + ;; + (ams-tex-mode . "tex-48") + (foiltex-mode . "tex-48") + (latex-mode . "tex-48") + (LaTeX-mode . "tex-48") + (plain-tex-mode . "tex-48") + (plain-TeX-mode . "tex-48") + (slitex-mode . "tex-48") + (tex-mode . "tex-48") + ) + "Alist of (major-mode . non-suffixed-icon-file-name) elements. +Used to set frame icons based upon the current major mode. +For use with icon-set-frame. See also the variable, 'icon-suffix'.") + +(or (fboundp 'image-instance-p) (fset 'image-instance-p 'pixmapp)) +(or (fboundp 'image-instance-file-name) + (fset 'image-instance-file-name 'pixmap-file-name)) +(or (fboundp 'make-glyph) (fset 'make-glyph 'make-pixmap)) + +(defun icon-set-frame (iconified-frame) + "Set icon for selected frame according to the values in icon-mode-alist." + (save-excursion + (if (framep iconified-frame) + (select-frame iconified-frame)) + (let* ((icon-sym (intern (concat "icon-" (symbol-name major-mode)))) + (pix (and (boundp icon-sym) (symbol-value icon-sym))) + (image (or (cdr (assq major-mode icon-mode-alist)) + (cdr (assq 'default icon-mode-alist)))) + (image-file (expand-file-name (concat image icon-suffix) + icon-directory))) + (cond ((and (image-instance-p pix) + (equal image-file (image-instance-file-name pix))) + nil) + (t + ;; Ensure we don't create a copy of a pixmap already in + ;; icon-list due to use in a different major-mode. + (setq pix (set icon-sym + (car (delq + nil + (mapcar + (function + (lambda (pixmap) + (if (equal (image-instance-file-name + pixmap) + image-file) + pixmap))) + icon-list))))) + ;; If pix is nil, there was no entry in icon-list, so create a + ;; new one. + (or (image-instance-p pix) + (setq pix + (glyph-image-instance + (set icon-sym (make-glyph image-file))) + icon-list (cons pix icon-list))))) + (x-set-frame-icon-pixmap + (if (framep iconified-frame) + iconified-frame + ;; unpatched XEmacs 19.6 + (selected-frame)) + pix)))) + +(defvar icon-list nil + "List of existing pixmap objects used as frame icons by frame-icon.el.") + +;; Hook in so icons will be selected at iconify time +(if (string-match "XEmacs" emacs-version) + (add-hook 'unmap-frame-hook 'icon-set-frame) ;; XEmacs 19.12 + (add-hook 'unmap-screen-hook 'icon-set-frame)) ;; Lemacs 19.10 + + +(provide 'frame-icon) + +;;; frame-icon.el ends here
--- a/lisp/utils/passwd.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/utils/passwd.el Mon Aug 13 09:15:11 2007 +0200 @@ -17,12 +17,9 @@ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. -;;; Synched up with: Not in FSF. - ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; along with XEmacs; see the file COPYING. If not, write to the Free +;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ;;; Change Log: ;; @@ -186,9 +183,7 @@ (passwd-ungrab-keyboard) (passwd-insecure-display) (passwd-kill-buffer input) - (if (fboundp 'clear-message) ;XEmacs - (clear-message) - (message "")) + (message "") )))) @@ -372,9 +367,7 @@ (let ((inhibit-quit t) str) (while (or (null str) (keymapp (key-binding str))) - (if (fboundp 'display-message) - (display-message 'prompt prompt) - (message prompt)) + (message prompt) (setq str (concat str (char-to-string (read-char))))) (setq quit-flag nil) str))
--- a/lisp/utils/redo.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/utils/redo.el Mon Aug 13 09:15:11 2007 +0200 @@ -63,13 +63,15 @@ (provide 'redo) -(defvar redo-version "1.00" +(defvar redo-version "1.01" "Version number for the Redo package.") (defvar last-buffer-undo-list nil "The head of buffer-undo-list at the last time an undo or redo was done.") (make-variable-buffer-local 'last-buffer-undo-list) +(make-variable-buffer-local 'pending-undo-list) + (defun redo (&optional count) "Redo the the most recent undo. Prefix arg COUNT means redo the COUNT most recent undos. @@ -94,7 +96,7 @@ (old-undo-list buffer-undo-list) (p (cdr buffer-undo-list)) (records-between 0)) - ;; count the number of undo records between the head of teh + ;; count the number of undo records between the head of the ;; undo chain and the pointer to the next change. Note that ;; by `record' we mean clumps of change records, not the ;; boundary records. The number of records will always be a
--- a/lisp/utils/shadowfile.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/utils/shadowfile.el Mon Aug 13 09:15:11 2007 +0200 @@ -25,7 +25,7 @@ ;; LCD Archive Entry: ;; shadowfile|Boris Goldowsky|boris@gnu.ai.mit.edu| ;; Helps you keep identical copies of files in multiple places.| -;; $Date: 1996/12/18 22:43:01 $ |$Revision: 1.1.1.1 $|~/misc/shadowfile.el.Z| +;; $Date: 1997/02/24 01:14:19 $ |$Revision: 1.2 $|~/misc/shadowfile.el.Z| ;;; Synched up with: FSF 19.30. @@ -84,7 +84,7 @@ ;;; Code: (provide 'shadowfile) -(require 'ange-ftp) +(require 'efs-auto) (setq find-file-visit-truename t) ; makes life easier with symbolic links @@ -297,7 +297,7 @@ (defun shadow-get-user (site) "Returns the default username for a site." - (ange-ftp-get-user (shadow-site-primary site))) + (efs-get-user (shadow-site-primary site))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Filename manipulation @@ -306,21 +306,21 @@ (defun shadow-parse-fullpath (fullpath) "Parse PATH into \(site user path) list, or leave it alone if it already is one. Returns nil if the argument is not a -full ange-ftp pathname." +full efs ftp pathname." (if (listp fullpath) fullpath - (ange-ftp-ftp-name fullpath))) + (efs-ftp-name fullpath))) (defun shadow-parse-path (path) "Parse any PATH into \(site user path) list. -Argument can be a simple path, full ange-ftp path, or already a hup list." +Argument can be a simple path, full efs ftp path, or already a hup list." (or (shadow-parse-fullpath path) (list shadow-system-name (user-login-name) path))) (defsubst shadow-make-fullpath (host user path) - "Make an ange-ftp style fullpath out of HOST, USER (optional), and PATH. + "Make an efs style fullpath out of HOST, USER (optional), and PATH. This is probably not as general as it ought to be." (concat "/" (if user (concat user "@")) @@ -385,7 +385,7 @@ (defun shadow-same-site (pattern file) "True if the site of PATTERN and of FILE are on the same site. If usernames are supplied, they must also match exactly. PATTERN and FILE may -be lists of host, user, path, or ange-ftp pathnames. FILE may also be just a +be lists of host, user, path, or efs ftp pathnames. FILE may also be just a local filename." (let ((pattern-sup (shadow-parse-fullpath pattern)) (file-sup (shadow-parse-path file))) @@ -398,7 +398,7 @@ "Returns t if PATTERN matches FILE. If REGEXP is supplied and nonnil, the pathname part of the pattern is a regular expression, otherwise it must match exactly. The sites and usernames must -match---see shadow-same-site. The pattern must be in full ange-ftp format, but +match---see shadow-same-site. The pattern must be in full efs ftp format, but the file can be any valid filename. This function does not do any filename expansion or contraction, you must do that yourself first." (let* ((pattern-sup (shadow-parse-fullpath pattern)) @@ -552,7 +552,7 @@ (defun shadow-make-group (regexp sites usernames) "Makes a description of a file group--- -actually a list of regexp ange-ftp file names---from REGEXP \(name of file to +actually a list of regexp efs ftp file names---from REGEXP \(name of file to be shadowed), list of SITES, and corresponding list of USERNAMES for each site." (if sites @@ -793,14 +793,14 @@ ;(shadow-when (string-match "Lucid" emacs-version) ; (require 'symlink-fix) -; (require 'ange-ftp) +; (require 'efs-auto) ; (require 'map-ynp) ; (if (not (fboundp 'file-truename)) ; (fset 'shadow-expand-file-name ; (symbol-function 'symlink-expand-file-name))) -; (if (not (fboundp 'ange-ftp-ftp-name)) -; (fset 'ange-ftp-ftp-name -; (symbol-function 'ange-ftp-ftp-path)))) +; (if (not (fboundp 'efs-ftp-name)) +; (fset 'efs-ftp-name +; (symbol-function 'efs-ftp-path)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Hook us up
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/utils/speedbar.el Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,1394 @@ +;;; speedbar - quick access to files and tags +;;; +;;; Copyright (C) 1996 Eric M. Ludlam +;;; +;;; Author: Eric M. Ludlam <zappo@gnu.ai.mit.edu> +;;; RCS: $Id: speedbar.el,v 1.1 1997/02/17 06:40:14 steve Exp $ +;;; Version: 0.3.1 +;;; Keywords: file, tags, tools +;;; +;;; This program is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 2, or (at your option) +;;; any later version. +;;; +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program; if not, you can either send email to this +;;; program's author (see below) or write to: +;;; +;;; The Free Software Foundation, Inc. +;;; 675 Mass Ave. +;;; Cambridge, MA 02139, USA. +;;; +;;; Please send bug reports, etc. to zappo@gnu.ai.mit.edu. +;;; + +;;; Commentary: +;;; +;;; The speedbar provides a frame in which files, and locations in +;;; files are displayed. These items can be clicked on with mouse-2 +;;; in order to make the last active frame display that file location. +;;; +;;; If you want to choose it from a menu or something, do this: +;;; +;;; (autoload 'speedbar-frame-mode "speedbar" "Popup a speedbar frame" t) +;;; (define-key-after (lookup-key global-map [menu-bar tools]) +;;; [speedbar] '("Speedbar" . speedbar-frame-mode) [calendar]) +;;; +;;; To activate speedbar without the menu, type: M-x speedbar-frame-mode RET +;;; +;;; Once a speedbar frame is active, it takes advantage of idle time +;;; to keep it's contents updated. The contents is usually a list of +;;; files in the directory of the currently active buffer. When +;;; applicable, tags in the active file can be expanded. +;;; +;;; Speedbar uses multiple methods for creating tags to jump to. +;;; When the variable `speedbar-use-imenu-package' is set, then +;;; speedbar will first try to use imenu to get tags. If the mode of +;;; the buffer doesn't support imenu, then etags is used. Using Imenu +;;; has the advantage that tags are cached, so opening and closing +;;; tags lists is faster. Speedbar-imenu will also load the file into +;;; a non-selected buffer so clicking the file later will be faster. +;;; +;;; To add new files types into the speedbar, modify +;;; `speedbar-file-regexp' to include the extension of the file type +;;; you wish to include. If speedbar complains that the file type is +;;; not supported, that means there is no built in support from imenu, +;;; and the etags part wasn't set up right. +;;; +;;; To add new file types to imenu, see the documentation in the +;;; file imenu.el that comes with emacs. To add new file types which +;;; etags supports, you need to modify the variable +;;; `speedbar-fetch-etags-parse-list'. This variable is an +;;; association list with each element of the form: (extension-regex +;;; . parse-one-line) The extension-regex would be something like +;;; "\\.c$" for a .c file, and the parse-one-line would be either a +;;; regular expression where match tag 1 is the element you wish +;;; displayed as a tag. If you need to do something more complex, +;;; then you can also write a function which parses one line, and put +;;; its symbol there instead. +;;; +;;; If the updates are going to slow for you, modify the variable +;;; `speedbar-update-speed' to a longer idle time before updates. +;;; +;;; If you navigate directories, you will probably notice that you +;;; will navigate to a directory which is eventually replaced after +;;; you go back to editing a file (unless you pull up a new file.) +;;; The delay time before this happens is in +;;; `speedbar-navigating-speed', and defaults to 20 seconds. +;;; +;;; XEmacs users may want to change the default timeouts for +;;; `speedbar-update-speed' to something longer as XEmacs doesn't have +;;; idle timers, the speedbar timer keeps going off arbitrarilly while +;;; you're typing. It's quite pesky. +;;; +;;; To get speedbar-configure-faces to work, you will need to +;;; download my eieio package from my ftp site. +;;; +;;; EIEIO is NOT required when using speedbar. It is ONLY needed +;;; if you want to use a fancy dialog face editor for speedbar. + +;;; Speedbar updates can be found at: +;;; ftp://ftp.ultranet.com/pub/zappo/speedbar.*.el +;;; + +;;; HISTORY: +;;; 0.1 Initial Revision +;;; 0.2 Fixed problem with x-pointer-shape causing future frames not +;;; to be created. +;;; Fixed annoying habit of `speedbar-update-contents' to make +;;; it possible to accidentally kill the speedbar buffer. +;;; Clicking directory names now only changes the contents of +;;; the speedbar, and does not cause a dired mode to appear. +;;; Clicking the <+> next to the directory does cause dired to +;;; be run. +;;; Added XEmacs support, which means timer support moved to a +;;; platform independant call. +;;; Added imenu support. Now modes are supported by imenu +;;; first, and etags only if the imenu call doesn't work. +;;; Imenu is a little faster than etags, and is more emacs +;;; friendly. +;;; Added more user control variables described in the commentary. +;;; Added smart recentering when nodes are opened and closed. +;;; 0.3 x-pointer-shape fixed for emacs 19.35, so I put that check in. +;;; Added invisible codes to the beginning of each line. +;;; Added list aproach to node expansion for easier addition of new +;;; types of things to expand by +;;; Added multi-level path name support +;;; Added multi-level tag name support. +;;; Only mouse-2 is now used for node expansion +;;; Added keys e + - to edit expand, and contract node lines +;;; Added longer legal file regexp for all those modes which support +;;; imenu. (pascal, fortran90, ada, pearl) +;;; Fixed centering algorithm +;;; Tried to choose background independent colors. Made more robust. +;;; Rearranged code into a more logical order +;;; 0.3.1 Fixed doc & broken keybindings +;;; Added mode hooks. +;;; Improved color selection to be background mode smart +;;; `nil' passed to `speedbar-frame-mode' now toggles the frame as +;;; advertised in the doc string +;;; +;;; TODO: +;;; 1) Rember contents of directories when leaving them so it's faster +;;; when returning. +;;; 2) List of directories to never visit. (User might be browsing +;;; there temporarilly such as info files, documentation and the +;;; like) +;;; 3) Implement SHIFT-mouse2 to rescan buffers with imenu. +;;; 4) Better XEmacs support of menus and button-bar +;;; 5) More functions to create buttons and options +;;; 6) filtering algoritms to reduce the number of tags/files +;;; displayed. +;;; 7) Build `speedbar-file-regexp' on the fly. +;;; 8) More intelligent current file highlighting. + +(defvar speedbar-xemacsp (string-match "XEmacs" emacs-version)) + +(defvar speedbar-initial-expansion-list + '(speedbar-directory-buttons speedbar-default-directory-list) + "*List of functions to call to fill in the speedbar buffer whenever +a top level update is issued. These functions will allways get the +default directory to use passed in as the first parameter, and a 0 as +the second parameter. They must assume that the cursor is at the +postion where they start inserting buttons.") + +(defvar speedbar-show-unknown-files nil + "*Non-nil shows files with a ? in the expansion tag for files we can't +expand. `nil' means don't show the file in the list.") + +;; Xemacs timers aren't based on idleness. Therefore tune it down a little +;; or suffer mightilly! +(defvar speedbar-update-speed (if speedbar-xemacsp 5 1) + "*Time in seconds of idle time needed before speedbar will update +it's buffer to match what you've been doing in your other frame.") +(defvar speedbar-navigating-speed 10 + "*Idle time to wait before re-running the timer proc to pick up any new +activity if the user has started navigating directories in the speedbar.") + +(defvar speedbar-width 20 + "*Initial size of the speedbar window") + +(defvar speedbar-scrollbar-width 10 + "*Initial sizeo of the speedbar scrollbar. The thinner, the more +display room you will have.") + +(defvar speedbar-raise-lower t + "*Non-nil means speedbar will auto raise and lower itself. When this +is set, you can have only a tiny strip visible under your main emacs, +and it will raise and lower itself when you put the pointer in it.") + +(defvar speedbar-use-imenu-package (not speedbar-xemacsp) + "*Optionally use the imenu package instead of etags for parsing. This +is experimental for performace testing.") + +(defvar speedbar-before-delete-hook nil + "*Hooks called before deletiing the speedbar frame.") + +(defvar speedbar-mode-hook nil + "*Hooks called after creating a speedbar buffer") + +(defvar speedbar-timer-hook nil + "*Hooks called after running the speedbar timer function") + +(defvar speedbar-file-unshown-regexp + (let ((nstr "") (noext completion-ignored-extensions)) + (while noext + (setq nstr (concat nstr (regexp-quote (car noext)) "$" + (if (cdr noext) "\\|" "")) + noext (cdr noext))) + (concat nstr "\\|#[^#]+#$\\|\\.\\.?$")) + "*Regular expression matching files we don't want to display in a +speedbar buffer") + +(defvar speedbar-file-regexp + (if speedbar-use-imenu-package + "\\(\\.\\([CchH]\\|c\\(++\\|pp\\)\\|f90\\|ada\\|pl?\\|el\\|t\\(ex\\(i\\(nfo\\)?\\)?\\|cl\\)\\|emacs\\)$\\)\\|[Mm]akefile\\(\\.in\\)?" + "\\.\\([CchH]\\|c\\(++\\|pp\\)\\|p\\|el\\|tex\\(i\\(nfo\\)?\\)?\\|emacs\\)$") + "*Regular expresson matching files we know how to expand.") + +(defvar speedbar-syntax-table nil + "Syntax-table used on the speedbar") + +(if speedbar-syntax-table + nil + (setq speedbar-syntax-table (make-syntax-table)) + ;; turn off paren matching around here. + (modify-syntax-entry ?\' " " speedbar-syntax-table) + (modify-syntax-entry ?\" " " speedbar-syntax-table) + (modify-syntax-entry ?( " " speedbar-syntax-table) + (modify-syntax-entry ?) " " speedbar-syntax-table) + (modify-syntax-entry ?[ " " speedbar-syntax-table) + (modify-syntax-entry ?] " " speedbar-syntax-table)) + + +(defvar speedbar-key-map nil + "Keymap used in speedbar buffer.") +(defvar speedbar-menu-map nil + "Keymap used in speedbar menu buffer.") + +(if speedbar-key-map + nil + (setq speedbar-key-map (make-keymap)) + (suppress-keymap speedbar-key-map t) + + (define-key speedbar-key-map "e" 'speedbar-edit-line) + (define-key speedbar-key-map "+" 'speedbar-expand-line) + (define-key speedbar-key-map "-" 'speedbar-contract-line) + + (if (string-match "XEmacs" emacs-version) + (progn + ;; bind mouse bindings so we can manipulate the items on each line + (define-key speedbar-key-map 'button2 'speedbar-click) + + ;; Xemacs users. You probably want your own toolbar for + ;; the speedbar frame or mode or whatever. Make some buttons + ;; and mail me how to do it! + ;; Also, how do you disable all those menu items? Email me that too + ;; as it would be most helpful. + ) + ;; bind mouse bindings so we can manipulate the items on each line + (define-key speedbar-key-map [mouse-2] 'speedbar-click) + (define-key speedbar-key-map [down-mouse-2] 'speedbar-quick-mouse) + + ;; this was meant to do a rescan or something + ;;(define-key speedbar-key-map [shift-mouse-2] 'speedbar-hard-click) + + ;; disable all menus - we don't have a lot of space to play with + ;; in such a skinny frame. + (define-key speedbar-key-map [menu-bar buffer] 'undefined) + (define-key speedbar-key-map [menu-bar files] 'undefined) + (define-key speedbar-key-map [menu-bar tools] 'undefined) + (define-key speedbar-key-map [menu-bar edit] 'undefined) + (define-key speedbar-key-map [menu-bar search] 'undefined) + (define-key speedbar-key-map [menu-bar help-menu] 'undefined) + + ;; This lets the user scroll as if we had a scrollbar... well maybe not + (define-key speedbar-key-map [mode-line mouse-2] 'speedbar-mouse-hscroll) + + ;; Create a menu for speedbar + (setq speedbar-menu-map (make-sparse-keymap)) + (define-key speedbar-key-map [menu-bar speedbar] + (cons "Speedbar" speedbar-menu-map)) + (define-key speedbar-menu-map [close] + (cons "Close" 'speedbar-close-frame)) + (define-key speedbar-menu-map [clonfigure] + (cons "Configure Faces" 'speedbar-configure-faces)) + (define-key speedbar-menu-map [configopt] + (cons "Configure Options" 'speedbar-configure-options)) + (define-key speedbar-menu-map [Update] + (cons "Update" 'speedbar-update-contents)) + )) + +(put 'speedbar-configure-faces 'menu-enable '(featurep 'dialog)) +(put 'speedbar-configure-options 'menu-enable '(featurep 'dialog)) + +(defvar speedbar-buffer nil + "The buffer displaying the speedbar.") +(defvar speedbar-frame nil + "The frame displaying speedbar.") +(defvar speedbar-timer nil + "The speedbar timer used for updating the buffer.") +(defvar speedbar-attached-frame nil + "The frame which started speedbar mode. This is the frame from +which all data displayed in the speedbar is gathered, and in which files +and such are displayed.") + +(defvar speedbar-last-selected-file nil + "The last file which was selected in speedbar buffer") + +(defvar speedbar-shown-directories nil + "Used to maintain list of directories simultaneously open in the current +speedbar.") + + +;;; +;;; Mode definitions/ user commands +;;; +;;;###autoload +(defun speedbar-frame-mode (&optional arg) + "Enable or disable use of a speedbar. Positive number means turn +on, negative turns speedbar off, and nil means toggle. Once the +speedbar frame is activated, a buffer in `speedbar-mode' will be +displayed. Currently, only one speedbar is supported at a time." + (interactive "P") + (if (not window-system) + (error "Speedbar is not useful outside of a windowing environement")) + ;; toggle frame on and off. + (if (not arg) (if speedbar-frame (setq arg -1) (setq arg 1))) + ;; turn the frame off on neg number + (if (and (numberp arg) (< arg 0)) + (progn + (run-hooks 'speedbar-before-delete-hook) + (if (and speedbar-frame (frame-live-p speedbar-frame)) + (delete-frame speedbar-frame)) + (speedbar-set-timer nil) + (setq speedbar-frame nil) + (if (bufferp speedbar-buffer) + (kill-buffer speedbar-buffer))) + ;; Set this as our currently attached frame + (setq speedbar-attached-frame (selected-frame)) + ;; Get the buffer to play with + (speedbar-mode) + ;; Get the frame to work in + (if (and speedbar-frame (frame-live-p speedbar-frame)) + (raise-frame speedbar-frame) + (let ((params (list + ;; Xemacs fails to delete speedbar + ;; if minibuffer is off. + ;; JTL <<<< Seems to be OK for 19.15. + ;; removed tool- & menubar. + ;; <<<< JTL + (cons 'minibuffer nil) + (cons 'width speedbar-width) + (cons 'height (frame-height)) + (cons 'scroll-bar-width speedbar-scrollbar-width) + (cons 'auto-raise speedbar-raise-lower) + (cons 'auto-lower speedbar-raise-lower) + '(modeline . nil) + '(border-width . 0) + '(unsplittable . t) + '(default-toolbar-visible-p . nil) + '(menubar-visible-p . nil)))) + (setq speedbar-frame + (if (< emacs-minor-version 35) + (make-frame params) + (let ((x-pointer-shape x-pointer-top-left-arrow) + (x-sensitive-text-pointer-shape x-pointer-hand2)) + (make-frame params))))) + ;; reset the selection variable + (setq speedbar-last-selected-file nil) + ;; Put the buffer into the frame + (save-window-excursion + (select-frame speedbar-frame) + (switch-to-buffer speedbar-buffer) + (setq default-minibuffer-frame speedbar-attached-frame)) + (speedbar-set-timer speedbar-update-speed) + ))) + +(defun speedbar-close-frame () + "Turn off speedbar mode" + (interactive) + (speedbar-frame-mode -1)) + +(defun speedbar-mode () + "Create and return a SPEEDBAR buffer. The speedbar buffer allows +the user to manage a list of directories and paths at different +depths. The first line represents the default path of the speedbar +frame. Each directory segment is a button which jumps speedbar's +default directory to that path. Buttons are activated by clicking +mouse-2. + +Each line starting with <+> represents a directory. Click on the <+> +to insert the directory listing into the current tree. Click on the +<-> to retract that list. Click on the directory name to go to that +directory as the default. + +Each line starting with [+] is a file. If the variable +`speedbar-show-unknown-files' is t, the lines starting with [?] are +files which don't have imenu support, but are not expressly ignored. +Files are completely ignored if they match `speedbar-file-unshown-regexp' +which is generated from `completion-ignored-extensions'. + +Click on the [+] to display a list of tags from that file. Click on +the [-] to retract the list. Click on the file name to edit the file +in the attached frame. + +If you open tags, you might find a node starting with {+}, which is a +category of tags. Click the {+} to expand the category. Jumpable +tags start with >. Click the name of the tag to go to that position +in the selected file. + +Keybindings: \\<speedbar-key-map> +\\[speedbar-click] Activate the button under the mouse. +\\[speedbar-edit-line] Edit the file/directory on this line. Same as clicking + on the name on the selected line.) +\\[speedbar-expand-line] Expand the current line. Same as clicking on the + on a line. +\\[speedbar-contract-line] Contract the current line. Same as clicking on the - on a line." + (setq speedbar-buffer (set-buffer (get-buffer-create "SPEEDBAR"))) + (kill-all-local-variables) + (setq major-mode 'speedbar-mode) + (setq mode-name "SB") + (use-local-map speedbar-key-map) + (set-syntax-table speedbar-syntax-table) + (setq mode-line-format + '("<< SPEEDBAR " (line-number-mode " %3l ") " >>")) + (setq font-lock-keywords nil) ;; no font-locking please + (setq truncate-lines t) + (if (not speedbar-xemacsp) (setq auto-show-mode nil)) ;no auto-show for FSF + (run-hooks 'speedbar-mode-hook) + (speedbar-update-contents) + ) + +(defun speedbar-mouse-hscroll (e) + "Read a mouse event from the mode line, and horizontally scroll if the +mouse is being clicked on the far left, or far right of the modeline." + (interactive "e") + (let* ((xp (car (nth 2 (car (cdr e))))) + (cpw (/ (frame-pixel-width) + (frame-width))) + (oc (1+ (/ xp cpw))) + ) + (cond ((< oc 3) + (scroll-left 2)) + ((> oc (- (window-width) 3)) + (scroll-right 2)) + (t (message "Click on the edge of the modeline to scroll left/right"))) + ;;(message "X: Pixel %d Char Pixels %d On char %d" xp cpw oc) + )) + + +;;; +;;; Utility functions +;;; +(defun speedbar-set-timer (timeout) + "Unset an old timer (if there is one) and activate a new timer with the +given timeout value." + (cond + ;; Xemacs + (speedbar-xemacsp + (if speedbar-timer + (progn (delete-itimer speedbar-timer) + (setq speedbar-timer nil))) + (if timeout + (setq speedbar-timer (start-itimer "speedbar" + 'speedbar-timer-fn + timeout + nil)))) + ;; GNU emacs + (t + (if speedbar-timer + (progn (cancel-timer speedbar-timer) + (setq speedbar-timer nil))) + (if timeout + (setq speedbar-timer + (run-with-idle-timer timeout nil 'speedbar-timer-fn)))) + )) + +(defmacro speedbar-with-writable (&rest forms) + "Allow the buffer to be writable and evaluate forms. Turn read-only back +on when done." + (list 'let '((speedbar-with-writable-buff (current-buffer))) + '(toggle-read-only -1) + (cons 'progn forms) + '(save-excursion (set-buffer speedbar-with-writable-buff) + (toggle-read-only 1)))) +(put 'speedbar-with-writable 'lisp-indent-function 0) + +(defun speedbar-make-button (start end face mouse function &optional token) + "Create a button from START to END, with FACE as the display face +and MOUSE and the mouse face. When this button is clicked on FUNCTION +will be run with the token parameter of TOKEN (any lisp object)" + (put-text-property start end 'face face) + (put-text-property start end 'mouse-face mouse) + (put-text-property start end 'invisible nil) + (if function (put-text-property start end 'speedbar-function function)) + (if token (put-text-property start end 'speedbar-token token)) + ) + +(defun speedbar-file-lists (directory) + "Create file lists for DIRECTORY. The car is the list of +directories, the cdr is list of files not matching ignored headers." + (let ((default-directory directory) + (dir (directory-files directory nil)) + (dirs nil) + (files nil)) + (while dir + (if (not (string-match speedbar-file-unshown-regexp (car dir))) + (if (file-directory-p (car dir)) + (setq dirs (cons (car dir) dirs)) + (setq files (cons (car dir) files)))) + (setq dir (cdr dir))) + (cons (nreverse dirs) (list (nreverse files)))) + ) + +(defun speedbar-directory-buttons (directory index) + "Inserts a single button group at point for DIRECTORY. Each directory +path part is a different button. If part of the path matches the user +directory ~, then it is replaced with a ~" + (let* ((tilde (expand-file-name "~")) + (dd (expand-file-name directory)) + (junk (string-match (regexp-quote tilde) dd)) + (displayme (if junk + (concat "~" (substring dd (match-end 0))) + dd)) + (p (point))) + (if (string-match "^~/?$" displayme) (setq displayme (concat tilde "/"))) + (insert displayme) + (save-excursion + (goto-char p) + (while (re-search-forward "\\([^/]+\\)/" nil t) + (speedbar-make-button (match-beginning 1) (match-end 1) + 'speedbar-directory-face + 'speedbar-highlight-face + 'speedbar-directory-buttons-follow + (if (= (match-beginning 1) p) + (expand-file-name "~/") ;the tilde + (buffer-substring-no-properties + p (match-end 0)))))) + (if (string-match "^/[^/]+/$" displayme) + (progn + (insert " ") + (let ((p (point))) + (insert "<root>") + (speedbar-make-button p (point) + 'speedbar-directory-face + 'speedbar-highlight-face + 'speedbar-directory-buttons-follow + "/")))) + (insert-char ?\n 1 nil))) + +(defun speedbar-make-tag-line (exp-button-type + exp-button-char exp-button-function + exp-button-data + tag-button tag-button-function tag-button-data + tag-button-face depth) + "Creates a tag line with BUTTON-TYPE for the small button that +expands or contracts a node (if applicable), and BUTTON-CHAR the +character in it (+, -, ?, etc). BUTTON-FUNCTION is the function to +call if it's clicked on. Button types are 'bracket, 'angle, 'curly, or nil. + +Next, TAG-BUTTON is the text of the tag. TAG-FUNCTION is the function +to call if clicked on, and TAG-DATA is the data to attach to the text +field (such a tag positioning, etc). TAG-FACE is a face used for this +type of tag. + +Lastly, DEPTH shows the depth of expansion. + +This function assumes that the cursor is in the speecbar window at the +position to insert a new item, and that the new item will end with a CR" + (let ((start (point)) + (end (progn + (insert (int-to-string depth) ":") + (point)))) + (put-text-property start end 'invisible t) + ) + (insert-char ? depth nil) + (put-text-property (- (point) depth) (point) 'invisible nil) + (let* ((exp-button (cond ((eq exp-button-type 'bracket) "[%c]") + ((eq exp-button-type 'angle) "<%c>") + ((eq exp-button-type 'curly) "{%c}") + (t ">"))) + (buttxt (format exp-button exp-button-char)) + (start (point)) + (end (progn (insert buttxt) (point))) + (bf (if exp-button-type 'speedbar-button-face nil)) + (mf (if exp-button-function 'speedbar-highlight-face nil)) + ) + (speedbar-make-button start end bf mf exp-button-function exp-button-data) + ) + (insert-char ? 1 nil) + (put-text-property (1- (point)) (point) 'invisible nil) + (let ((start (point)) + (end (progn (insert tag-button) (point)))) + (insert-char ?\n 1 nil) + (put-text-property (1- (point)) (point) 'invisible nil) + (speedbar-make-button start end tag-button-face + (if tag-button-function 'speedbar-highlight-face nil) + tag-button-function tag-button-data)) +) + +(defun speedbar-change-expand-button-char (char) + "Change the expanson button character to CHAR for the current line." + (save-excursion + (beginning-of-line) + (if (re-search-forward ":\\s-*.\\([-+?]\\)" (save-excursion (end-of-line) + (point)) t) + (speedbar-with-writable + (goto-char (match-beginning 1)) + (delete-char 1) + (insert-char char 1 t))))) + + +;;; +;;; Build button lists +;;; +(defun speedbar-insert-files-at-point (files level) + "Insert list of FILES starting at point, and indenting all files to LEVEL +depth. Tag exapndable items with a +, otherwise a ?. Don't highlight ? as +we don't know how to manage them. The input parameter FILES is a cons +cell of the form ( 'dir-list . 'file-list )" + ;; Start inserting all the directories + (let ((dirs (car files))) + (while dirs + (speedbar-make-tag-line 'angle ?+ 'speedbar-dired (car dirs) + (car dirs) 'speedbar-dir-follow nil + 'speedbar-directory-face level) + (setq dirs (cdr dirs)))) + (let ((lst (car (cdr files)))) + (while lst + (let* ((known (string-match speedbar-file-regexp (car lst))) + (expchar (if known ?+ ??)) + (fn (if known 'speedbar-tag-file nil))) + (if (or speedbar-show-unknown-files (/= expchar ??)) + (speedbar-make-tag-line 'bracket expchar fn (car lst) + (car lst) 'speedbar-find-file nil + 'speedbar-file-face level))) + (setq lst (cdr lst))))) + +(defun speedbar-default-directory-list (directory index) + "Inserts files for DIRECTORY with level INDEX at point" + (speedbar-insert-files-at-point + (speedbar-file-lists directory) index) + ) + +(defun speedbar-insert-generic-list (level lst expand-fun find-fun) + "At LEVEL, inserts a generic multi-level alist LIST. Associations with +lists get {+} tags (to expand into more nodes) and those with positions +just get a > as the indicator. {+} buttons will have the function +EXPAND-FUN and the token is the CDR list. The token name will have the +function FIND-FUN and not token." + ;; Remove imenu rescan button + (if (string= (car (car lst)) "*Rescan*") + (setq lst (cdr lst))) + ;; insert the parts + (while lst + (cond ((null (car-safe lst)) nil) ;this would be a separator + ((numberp (cdr-safe (car-safe lst))) + (speedbar-make-tag-line nil nil nil nil ;no expand button data + (car (car lst)) ;button name + find-fun ;function + (cdr (car lst)) ;token is position + 'speedbar-tag-face + (1+ level))) + ((listp (cdr-safe (car-safe lst))) + (speedbar-make-tag-line 'curly ?+ expand-fun (cdr (car lst)) + (car (car lst)) ;button name + nil nil 'speedbar-tag-face + (1+ level))) + (t (message "Ooops!"))) + (setq lst (cdr lst)))) + +;;; +;;; Timed functions +;;; +(defun speedbar-update-contents () + "Update the contents of the speedbar buffer." + (interactive) + (setq speedbar-last-selected-file nil) + (setq speedbar-shown-directories (list (expand-file-name default-directory))) + (let ((cbd default-directory) + (funclst speedbar-initial-expansion-list)) + (save-excursion + (set-buffer speedbar-buffer) + (speedbar-with-writable + (setq default-directory cbd) + (delete-region (point-min) (point-max)) + (while funclst + (funcall (car funclst) cbd 0) + (setq funclst (cdr funclst))))))) + +(defun speedbar-timer-fn () + "Run whenever emacs is idle to update the speedbar item" + (if (not (and speedbar-frame + (frame-live-p speedbar-frame) + speedbar-attached-frame + (frame-live-p speedbar-attached-frame))) + (speedbar-set-timer nil) + (unwind-protect + (if (frame-visible-p speedbar-frame) + (let ((af (selected-frame))) + (save-window-excursion + (select-frame speedbar-attached-frame) + ;; make sure we at least choose a window to + ;; get a good directory from + (if (string-match "\\*Minibuf-[0-9]+\\*" (buffer-name)) + (other-window 1)) + ;; Update all the contents if directories change! + (if (or (member (expand-file-name default-directory) + speedbar-shown-directories) + (eq af speedbar-frame) + (not (buffer-file-name)) + ) + nil + (message "Updating speedbar to: %s..." default-directory) + (speedbar-update-contents) + (message "Updating speedbar to: %s...done" default-directory))))) + ;; Reset the timer + (speedbar-set-timer speedbar-update-speed) + ;; Ok, un-underline old file, underline current file + (speedbar-update-current-file))) + (run-hooks 'speedbar-timer-hook) + ) + +(defun speedbar-update-current-file () + "Find out what the current file is, and update our visuals to indicate +what it is. This is specific to file names." + (let* ((lastf (selected-frame)) + (newcf (save-excursion + (select-frame speedbar-attached-frame) + (let ((rf (if (buffer-file-name) + (file-name-nondirectory (buffer-file-name)) + nil))) + (select-frame lastf) + rf))) + (lastb (current-buffer))) + (if (and newcf (not (string= newcf speedbar-last-selected-file))) + (progn + (select-frame speedbar-frame) + (set-buffer speedbar-buffer) + (speedbar-with-writable + (goto-char (point-min)) + (if (and + speedbar-last-selected-file + (re-search-forward + (concat " \\(" (regexp-quote speedbar-last-selected-file) "\\)\n") + nil t)) + (put-text-property (match-beginning 1) + (match-end 1) + 'face + 'speedbar-file-face)) + (goto-char (point-min)) + (if (re-search-forward + (concat " \\(" (regexp-quote newcf) "\\)\n") nil t) + (put-text-property (match-beginning 1) + (match-end 1) + 'face + 'speedbar-selected-face)) + (setq speedbar-last-selected-file newcf)) + (forward-line -1) + (speedbar-position-cursor-on-line) + (set-buffer lastb) + (select-frame lastf))))) + +;;; +;;; Clicking Activity +;;; +(defun speedbar-quick-mouse (e) + "Since mouse events are strange, this will keep the mouse nicely +positioned." + (interactive "e") + (mouse-set-point e) + (beginning-of-line) + (forward-char 3) + ) + +(defun speedbar-position-cursor-on-line () + "Position the cursor on a line." + (beginning-of-line) + (re-search-forward "[]>}]" (save-excursion (end-of-line) (point)) t)) + +(defun speedbar-line-path (depth) + "Retrieve the pathname associated with the current line. This may +require traversing backwards and combinding the default directory with +these items." + (save-excursion + (let ((path nil)) + (setq depth (1- depth)) + (while (/= depth -1) + (if (not (re-search-backward (format "^%d:" depth) nil t)) + (error "Error building path of tag") + (cond ((looking-at "[0-9]+:\\s-*<->\\s-+\\([^\n]+\\)$") + (setq path (concat (buffer-substring-no-properties + (match-beginning 1) (match-end 1)) + "/" + path))) + ((looking-at "[0-9]+:\\s-*[-]\\s-+\\([^\n]+\\)$") + ;; This is the start of our path. + (setq path (buffer-substring-no-properties + (match-beginning 1) (match-end 1)))))) + (setq depth (1- depth))) + (concat default-directory path)))) + +(defun speedbar-edit-line () + "Edit whatever tag or file is on the current speedbar line." + (interactive) + (beginning-of-line) + (re-search-forward "[]>}] [a-zA-Z0-9]" (save-excursion (end-of-line) (point))) + (speedbar-do-function-pointer)) + +(defun speedbar-expand-line () + "Expand the line under the cursor." + (interactive) + (beginning-of-line) + (re-search-forward ":\\s-*.\\+. " (save-excursion (end-of-line) (point))) + (forward-char -2) + (speedbar-do-function-pointer)) + +(defun speedbar-contract-line () + "Expand the line under the cursor." + (interactive) + (beginning-of-line) + (re-search-forward ":\\s-*.-. " (save-excursion (end-of-line) (point))) + (forward-char -2) + (speedbar-do-function-pointer)) + +(defun speedbar-click (e) + "When the user clicks mouse 1 on our speedbar, we must decide what +we want to do! The entire speedbar has functions attached to +buttons. All we have to do is extract from the buffer the information +we need. See `speedbar-mode' for the type of behaviour we want to achieve" + (interactive "e") + (mouse-set-point e) + (speedbar-do-function-pointer)) + +(defun speedbar-do-function-pointer () + "Look under the cursor and examine the text properties. From this extract +the file/tag name, token, indentation level and call a function if apropriate" + (let* ((fn (get-text-property (point) 'speedbar-function)) + (tok (get-text-property (point) 'speedbar-token)) + ;; The 1-,+ is safe because scaning starts AFTER the point + ;; specified. This lets the search include the character the + ;; cursor is on. + (tp (previous-single-property-change + (if (get-text-property (1+ (point)) 'speedbar-function) + (1+ (point)) (point)) 'speedbar-function)) + (np (next-single-property-change + (if (and (> (point) 1) (get-text-property (1- (point)) 'speedbar-function)) + (1- (point)) (point)) 'speedbar-function)) + (txt (buffer-substring-no-properties (or tp (point-min)) + (or np (point-max)))) + (dent (save-excursion (beginning-of-line) + (string-to-number + (if (looking-at "[0-9]+") + (buffer-substring-no-properties + (match-beginning 0) (match-end 0)) + "0"))))) + ;;(message "%S:%S:%S:%s" fn tok txt dent) + (and fn (funcall fn txt tok dent))) + (speedbar-position-cursor-on-line)) + +(defun speedbar-find-file (text token indent) + "Speedbar click handler for filenames. Clicking the filename loads +that file into the attached buffer." + (let ((cdd (speedbar-line-path indent))) + (select-frame speedbar-attached-frame) + (find-file (concat cdd text)) + (speedbar-update-current-file) + ;; Reset the timer with a new timeout when cliking a file + ;; in case the user was navigating directories, we can cancel + ;; that other timer. + (speedbar-set-timer speedbar-update-speed))) + +(defun speedbar-dir-follow (text token indent) + "Speedbar click handler for directory names. Clicking a directory will +cause the speedbar to list files in the selected subdirectory." + (setq default-directory + (concat (expand-file-name (concat (speedbar-line-path indent) text)) + "/")) + ;; Because we leave speedbar as the current buffer, + ;; update contents will change directory without + ;; having to touch the attached frame. + (speedbar-update-contents) + (speedbar-set-timer speedbar-navigating-speed) + (setq speedbar-last-selected-file nil) + (speedbar-update-current-file)) + + +(defun speedbar-dired (text token indent) + "Speedbar click handler for filenames. Clicking the filename loads +that file into the attached buffer." + (cond ((string-match "+" text) ;we have to expand this file + (setq speedbar-shown-directories + (cons (expand-file-name + (concat (speedbar-line-path indent) token "/")) + speedbar-shown-directories)) + (speedbar-change-expand-button-char ?-) + (save-excursion + (end-of-line) (forward-char 1) + (speedbar-with-writable + (speedbar-default-directory-list + (concat (speedbar-line-path indent) token "/") + (1+ indent))))) + ((string-match "-" text) ;we have to contract this node + (let ((oldl speedbar-shown-directories) + (newl nil) + (td (expand-file-name + (concat (speedbar-line-path indent) token)))) + (while oldl + (if (not (string-match (concat "^" (regexp-quote td)) (car oldl))) + (setq newl (cons (car oldl) newl))) + (setq oldl (cdr oldl))) + (setq speedbar-shown-directories newl)) + (speedbar-change-expand-button-char ?+) + (save-excursion + (end-of-line) (forward-char 1) + (speedbar-with-writable + (if (save-excursion (re-search-forward (format "^%d:" indent) nil t)) + (delete-region (point) (match-beginning 0)) + (delete-region (point) (point-max))))) + ) + (t (error "Ooops... not sure what to do."))) + (speedbar-center-buffer-smartly) + (setq speedbar-last-selected-file nil) + (save-excursion (speedbar-update-current-file))) + +(defun speedbar-directory-buttons-follow (text token ident) + "Speedbar click handler for default directory buttons." + (setq default-directory token) + ;; Because we leave speedbar as the current buffer, + ;; update contents will change directory without + ;; having to touch the attached frame. + (speedbar-update-contents) + (speedbar-set-timer speedbar-navigating-speed)) + +(defun speedbar-tag-file (text token indent) + "The cursor is on a selected line. Expand the tags in the specified +file. The parameter TXT and TOK are required, where TXT is the button +clicked, and TOK is the file to expand." + (cond ((string-match "+" text) ;we have to expand this file + (let* ((fn (expand-file-name (concat (speedbar-line-path indent) + token))) + (lst (if speedbar-use-imenu-package + (let ((tim (speedbar-fetch-dynamic-imenu fn))) + (if (eq tim t) + (speedbar-fetch-dynamic-etags fn) + tim)) + (speedbar-fetch-dynamic-etags fn)))) + ;; if no list, then remove expando button + (if (not lst) + (speedbar-change-expand-button-char ??) + (speedbar-change-expand-button-char ?-) + (speedbar-with-writable + (save-excursion + (end-of-line) (forward-char 1) + (speedbar-insert-generic-list indent + lst 'speedbar-tag-expand + 'speedbar-tag-find)))))) + ((string-match "-" text) ;we have to contract this node + (speedbar-change-expand-button-char ?+) + (speedbar-with-writable + (save-excursion + (end-of-line) (forward-char 1) + (if (save-excursion (re-search-forward (format "^%d:" indent) nil t)) + (delete-region (point) (match-beginning 0)) + (delete-region (point) (point-max)))))) + (t (error "Ooops... not sure what to do."))) + (speedbar-center-buffer-smartly)) + +(defun speedbar-tag-find (text token indent) + "For the tag in a file, goto that position" + (let ((file (speedbar-line-path indent))) + (select-frame speedbar-attached-frame) + (find-file file) + (save-excursion (speedbar-update-current-file)) + ;; Reset the timer with a new timeout when cliking a file + ;; in case the user was navigating directories, we can cancel + ;; that other timer. + (speedbar-set-timer speedbar-update-speed) + (goto-char token))) + +(defun speedbar-tag-expand (text token indent) + "For the tag in a file which is really a list of tags of a certain type, +expand or contract that list." + (cond ((string-match "+" text) ;we have to expand this file + (speedbar-change-expand-button-char ?-) + (speedbar-with-writable + (save-excursion + (end-of-line) (forward-char 1) + (speedbar-insert-generic-list indent + token 'speedbar-tag-expand + 'speedbar-tag-find)))) + ((string-match "-" text) ;we have to contract this node + (speedbar-change-expand-button-char ?+) + (speedbar-with-writable + (save-excursion + (end-of-line) (forward-char 1) + (if (save-excursion (re-search-forward (format "^%d:" indent) nil t)) + (delete-region (point) (match-beginning 0)))))) + (t (error "Ooops... not sure what to do."))) + (speedbar-center-buffer-smartly)) + +;;; +;;; Centering Utility +;;; +(defun speedbar-center-buffer-smartly () + "Look at the buffer, and center it so that which the user is most +interested in (as far as we can tell) is all visible. This assumes +that the cursor is on a file, or tag of a file which the user is +interested in." + (if (<= (count-lines (point-min) (point-max)) + (window-height (selected-window))) + ;; whole buffer fits + (let ((cp (point))) + (goto-char (point-min)) + (recenter 0) + (goto-char cp)) + ;; too big + (let (depth start end exp p) + (save-excursion + (beginning-of-line) + (setq depth (if (looking-at "[0-9]+") + (string-to-int (buffer-substring-no-properties + (match-beginning 0) (match-end 0))) + 0)) + (setq exp (format "^%d:\\s-*[[{<]\\([?+-]\\)[]>}]" depth))) + (save-excursion + (end-of-line) + (if (re-search-backward exp nil t) + (setq start (point)) + (error "Center error")) + (save-excursion ;Not sure about this part. + (end-of-line) + (setq p (point)) + (while (and (not (re-search-forward exp nil t)) + (>= depth 0)) + (setq depth (1- depth)) + (setq exp (format "^%d:\\s-*[[{<]\\([?+-]\\)[]>}]" depth))) + (if (/= (point) p) + (setq end (point)) + (setq end (point-max))))) + ;; Now work out the details of centering + (let ((nl (count-lines start end)) + (cp (point))) + (if (> nl (window-height (selected-window))) + ;; We can't fit it all, so just center on cursor + (progn (goto-char start) + (recenter 1)) + ;; we can fit everything on the screen, but... + (if (and (pos-visible-in-window-p start (selected-window)) + (pos-visible-in-window-p end (selected-window))) + ;; we are all set! + nil + ;; we need to do something... + (goto-char start) + (let ((newcent (/ (- (window-height (selected-window)) nl) 2)) + (lte (count-lines start (point-max)))) + (if (and (< (+ newcent lte) (window-height (selected-window))) + (> (- (window-height (selected-window)) lte 1) + newcent)) + (setq newcent (- (window-height (selected-window)) + lte 1))) + (recenter newcent)))) + (goto-char cp))))) + + +;;; +;;; Tag Management -- Imenu +;;; +(defun speedbar-fetch-dynamic-imenu (file) + "Use the imenu package to load in file, and extract all the items +tags we wish to display in the speedbar package." +;; (eval-when-compile (require 'imenu)) + (save-excursion + (set-buffer (find-file-noselect file)) + (condition-case nil + (imenu--make-index-alist t) + (error t)))) + + +;;; +;;; Tag Management -- etags (Not useful for FSF emacs) +;;; +(defvar speedbar-fetch-etags-parse-list + '(("\\.\\([cChH]\\|c++\\|cpp\\|cc\\)$" . speedbar-parse-c-or-c++tag) + ("\\.el\\|\\.emacs" . + "defun\\s-+\\(\\(\\w\\|[-_]\\)+\\)\\s-*\C-?") + ("\\.tex$" . speedbar-parse-tex-string) + ("\\.p" . + "\\(\\(FUNCTION\\|function\\|PROCEDURE\\|procedure\\)\\s-+\\([a-zA-Z0-9_.:]+\\)\\)\\s-*(?^?") + + ) + "*Alist matching extension vs an expression which will extract the +symbol name we wish to display as match 1. To add a new file type, you +would want to add a new association to the list, where the car +is the file match, and the cdr is the way to extract an element from +the tags output. If the output is complex, use a function symbol +instead of regexp. The function should expect to be at the beginning +of a line in the etags buffer. + +This variable is ignored if `speedbar-use-imenu-package' is `t'") + +(defvar speedbar-fetch-etags-command "etags" + "*Command used to create an etags file. + +This variable is ignored if `speedbar-use-imenu-package' is `t'") + +(defvar speedbar-fetch-etags-arguments '("-D" "-I" "-o" "-") + "*List of arguments to use with `speedbar-fetch-etags-command' to create +an etags output buffer. + +This variable is ignored if `speedbar-use-imenu-package' is `t'") + +(defun speedbar-fetch-dynamic-etags (file) + "For the complete file definition FILE, run etags as a subprocess, +fetch it's output, and create a list of symbols extracted, and their +position in FILE." + (let ((newlist nil)) + (unwind-protect + (save-excursion + (if (get-buffer "*etags tmp*") + (kill-buffer "*etags tmp*")) ;kill to clean it up + (set-buffer (get-buffer-create "*etags tmp*")) + (apply 'call-process speedbar-fetch-etags-command nil + (current-buffer) nil + (append speedbar-fetch-etags-arguments (list file))) + (goto-char (point-min)) + (let ((expr + (let ((exprlst speedbar-fetch-etags-parse-list) + (ans nil)) + (while (and (not ans) exprlst) + (if (string-match (car (car exprlst)) file) + (setq ans (car exprlst))) + (setq exprlst (cdr exprlst))) + (cdr ans)))) + (if expr + (let (tnl) + (while (not (save-excursion (end-of-line) (eobp))) + (save-excursion + (setq tnl (speedbar-extract-one-symbol expr))) + (if tnl (setq newlist (cons tnl newlist))) + (forward-line 1))) + (message "Sorry, no support for a file of that extension")))) + ) + (reverse newlist))) + +(defun speedbar-extract-one-symbol (expr) + "At point in current buffer, return nil, or one alist of the form +of a dotted pair: ( symbol . position ) from etags output. Parse the +output using the regular expression EXPR" + (let* ((sym (if (stringp expr) + (if (save-excursion + (re-search-forward expr (save-excursion + (end-of-line) + (point)) t)) + (buffer-substring-no-properties (match-beginning 1) + (match-end 1))) + (funcall expr))) + (pos (let ((j (re-search-forward "[\C-?\C-a]\\([0-9]+\\),\\([0-9]+\\)" + (save-excursion + (end-of-line) + (point)) + t))) + (if (and j sym) + (1+ (string-to-int (buffer-substring-no-properties + (match-beginning 2) + (match-end 2)))) + 0)))) + (if (/= pos 0) + (cons sym pos) + nil))) + +(defun speedbar-parse-c-or-c++tag () + "Parse a c or c++ tag, which tends to be a little complex." + (save-excursion + (let ((bound (save-excursion (end-of-line) (point)))) + (cond ((re-search-forward "\C-?\\([^\C-a]+\\)\C-a" bound t) + (buffer-substring-no-properties (match-beginning 1) + (match-end 1))) + ((re-search-forward "\\<\\([^ \t]+\\)\\s-+new(" bound t) + (buffer-substring-no-properties (match-beginning 1) + (match-end 1))) + ((re-search-forward "\\<\\([^ \t(]+\\)\\s-*(\C-?" bound t) + (buffer-substring-no-properties (match-beginning 1) + (match-end 1))) + (t nil)) + ))) + +(defun speedbar-parse-tex-string () + "Parse a tex string. Only find data which is relevant" + (save-excursion + (let ((bound (save-excursion (end-of-line) (point)))) + (cond ((re-search-forward "\\(section\\|chapter\\|cite\\)\\s-*{[^\C-?}]*}?" bound t) + (buffer-substring-no-properties (match-beginning 0) + (match-end 0))) + (t nil))))) + + +;;; +;;; configuration scripts (optional) +;;; +(defun speedbar-configure-options () + "Configure variable options for the speedbar program using dlg-config" + (interactive) + (require 'dlg-config) + (save-excursion + (select-frame speedbar-attached-frame) + (dlg-init) + (let ((oframe (create-widget "Speedbar Options" widget-frame + widget-toplevel-shell + :x 2 :y -3 + :frame-label "Speedbar Options")) + ) + (create-widget "show-unknown" widget-toggle-button oframe + :x 1 :y 1 :label-value "Show files that are not supported by imenu" + :state (data-object-symbol "speedbar-show-unknown-files" + :value speedbar-show-unknown-files + :symbol 'speedbar-show-unknown-files)) + + (create-widget "raiselower" widget-toggle-button oframe + :x 1 :y -1 :label-value "Use frame auto raise/lower property" + :state (data-object-symbol "speedbar-raise-lower" + :value speedbar-raise-lower + :symbol 'speedbar-raise-lower)) + + (create-widget "update-speed" widget-label oframe + :x 1 :y -2 :label-value "Update Delay :") + (create-widget "update-speed-txt" widget-text-field oframe + :width 5 :height 1 :x -2 :y t + :value (data-object-symbol-string-to-int + "update-speed" + :symbol 'speedbar-update-speed + :value (int-to-string speedbar-update-speed))) + (create-widget "update-speed-unit" widget-label oframe + :x -3 :y t :label-value "Seconds") + + (create-widget "navigating-speed" widget-label oframe + :x 1 :y -1 :label-value "Navigating Delay:") + (create-widget "navigating-speed-txt" widget-text-field oframe + :width 5 :height 1 :x -2 :y t + :value (data-object-symbol-string-to-int + "navigating-speed" + :symbol 'speedbar-navigating-speed + :value (int-to-string speedbar-navigating-speed))) + (create-widget "navigating-speed-unit" widget-label oframe + :x -3 :y t :label-value "Seconds") + + (create-widget "width" widget-label oframe + :x 1 :y -2 :label-value "Display Width :") + (create-widget "width-txt" widget-text-field oframe + :width 5 :height 1 :x -2 :y t + :value (data-object-symbol-string-to-int + "width" + :symbol 'speedbar-width + :value (int-to-string speedbar-width))) + (create-widget "width-unit" widget-label oframe + :x -3 :y t :label-value "Characters") + + (create-widget "scrollbar-width" widget-label oframe + :x 1 :y -1 :label-value "Scrollbar Width :") + (create-widget "scrollbar-width-txt" widget-text-field oframe + :width 5 :height 1 :x -2 :y t + :value (data-object-symbol-string-to-int + "width" + :symbol 'speedbar-width + :value (int-to-string speedbar-scrollbar-width))) + (create-widget "scrollbar-width-unit" widget-label oframe + :x -3 :y t :label-value "Pixels") + + + ) + (dlg-end) + (dialog-refresh) + )) + +(defun speedbar-configure-faces () + "Configure faces for the speedbar program using dlg-config." + (interactive) + (require 'dlg-config) + (save-excursion + (select-frame speedbar-attached-frame) + (dlg-faces '(speedbar-button-face + speedbar-file-face + speedbar-directory-face + speedbar-tag-face + speedbar-highlight-face + speedbar-selected-face)))) + +;;; +;;; Color loading section This is message *Blech!* +;;; +(defun speedbar-load-color (sym l-fg l-bg d-fg d-bg &optional bold italic underline) + "Create a color for SYM with a L-FG and L-BG color, or D-FG and +D-BG. Optionally make BOLD, ITALIC, or UNDERLINED if applicable. If +the background attribute of the current frame is determined to be +light (white, for example) then L-FG and L-BG is used. If not, then +D-FG and D-BG is used. This will allocate the colors in the best +possible mannor. This will allow me to store multiple defaults and +dynamically determine which colors to use." + (let* ((params (frame-parameters)) + (disp-res (if (fboundp 'x-get-resource) + (if speedbar-xemacsp + (x-get-resource ".displayType" "DisplayType" 'string) + (x-get-resource ".displayType" "DisplayType")) + nil)) + (display-type + (cond (disp-res (intern (downcase disp-res))) + ((and (fboundp 'x-display-color-p) (x-display-color-p)) 'color) + (t 'mono))) + (bg-res (if (fboundp 'x-get-resource) + (if speedbar-xemacsp + (x-get-resource ".backgroundMode" "BackgroundMode" 'string) + (x-get-resource ".backgroundMode" "BackgroundMode")) + nil)) + (bgmode + (cond (bg-res (intern (downcase bg-res))) + ((and params + (fboundp 'x-color-values) + (< (apply '+ (x-color-values + (cdr (assq 'background-color params)))) + (/ (apply '+ (x-color-values "white")) 3))) + 'dark) + (t 'light))) ;our default + (set-p (function (lambda (face-name resource) + (if speedbar-xemacsp + (x-get-resource + (concat face-name ".attribute" resource) + (concat "Face.Attribute" resource) + 'string) + (x-get-resource + (concat face-name ".attribute" resource) + (concat "Face.Attribute" resource))) + ))) + (nbg (cond ((eq bgmode 'dark) d-bg) + (t l-bg))) + (nfg (cond ((eq bgmode 'dark) d-fg) + (t l-fg)))) + + (if (not (eq display-type 'color)) + ;; we need a face of some sort, so just make due with default + (progn + (copy-face 'default sym) + (if bold (condition-case nil + (make-face-bold sym) + (error (message "Cannot make face %s bold!" + (symbol-name sym))))) + (if italic (condition-case nil + (make-face-italic sym) + (error (message "Cannot make face %s italic!" + (symbol-name sym))))) + (set-face-underline-p sym underline) + ) + ;; make a colorized version of a face. Be sure to check Xdefaults + ;; for possible overrides first! + (let ((newface (make-face sym))) + ;; For each attribute, check if it might already be set by Xdefaults + (if (and nfg (not (funcall set-p (symbol-name sym) "Foreground"))) + (set-face-foreground sym nfg)) + (if (and nbg (not (funcall set-p (symbol-name sym) "Background"))) + (set-face-background sym nbg)) + + (if bold (condition-case nil + (make-face-bold sym) + (error (message "Cannot make face %s bold!" + (symbol-name sym))))) + (if italic (condition-case nil + (make-face-italic sym) + (error (message "Cannot make face %s italic!" + (symbol-name sym))))) + (set-face-underline-p sym underline) + )))) + + ;; JTL <<<< +(if nil ;;(x-display-color-p) ;; just a quick hack so it will run. + ;; we can use customize for this. + ;; <<<< JTL + (progn + (speedbar-load-color 'speedbar-button-face "green4" "default" "green3" "default") + (speedbar-load-color 'speedbar-file-face "cyan4" nil "cyan" nil nil nil nil) + (speedbar-load-color 'speedbar-directory-face "blue4" nil "light blue" nil nil nil nil) + (speedbar-load-color 'speedbar-tag-face "brown" nil "yellow" nil nil nil nil) + (speedbar-load-color 'speedbar-selected-face "red" nil "red" nil nil nil t) + (speedbar-load-color 'speedbar-highlight-face nil "green" nil "sea green" nil nil nil) + ) ; color + (make-face 'speedbar-button-face) + ;;(make-face 'speedbar-file-face) + (copy-face 'bold 'speedbar-file-face) + (make-face 'speedbar-directory-face) + (make-face 'speedbar-tag-face) + ;;(make-face 'speedbar-selected-face) + (copy-face 'underline 'speedbar-selected-face) + ;;(make-face 'speedbar-highlight-face) + (copy-face 'highlight 'speedbar-highlight-face) + + ) ;; monochrome + +;;; end of lisp +(provide 'speedbar) + +;;; speedbar.el ends here
--- a/lisp/version.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/version.el Mon Aug 13 09:15:11 2007 +0200 @@ -25,7 +25,7 @@ (defconst emacs-version "20.1" "Version numbers of this version of Emacs.") -(setq emacs-version (purecopy (concat emacs-version " XEmacs Lucid (beta1)"))) +(setq emacs-version (purecopy (concat emacs-version " XEmacs Lucid (beta2)"))) (defconst emacs-major-version (progn (or (string-match "^[0-9]+" emacs-version)
--- a/lisp/viper/viper-keym.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/viper/viper-keym.el Mon Aug 13 09:15:11 2007 +0200 @@ -441,6 +441,10 @@ (define-key vip-dired-modifier-map ":" 'vip-ex) (define-key vip-dired-modifier-map "/" 'vip-search-forward) +(defvar vip-help-modifier-map (make-sparse-keymap) + "This map modifies Help mode behavior.") +(define-key vip-help-modifier-map "q" (if vip-xemacs-p 'help-mode-quit)) + ;;; Code
--- a/lisp/viper/viper.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/viper/viper.el Mon Aug 13 09:15:11 2007 +0200 @@ -8,7 +8,7 @@ ;; Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc. -(defconst viper-version "2.92 of January 10, 1997" +(defconst viper-version "2.93 of February 13, 1997" "The current version of Viper") ;; This file is part of GNU Emacs. @@ -1308,7 +1308,7 @@ (let (value func) ;; read while number (while (and (vip-characterp event) (>= event ?0) (<= event ?9)) - (setq value (+ (* (if (vip-characterp value) value 0) 10) (- event ?0))) + (setq value (+ (* (if (integerp value) value 0) 10) (- event ?0))) (setq event (vip-read-event-convert-to-char))) (setq prefix-arg value) @@ -1331,7 +1331,7 @@ ;; the user typed, say, d2. In this case, `com' would be `d', `w', ;; etc. ;; If vip-digit-argument was invoked by vip-escape-to-vi (which is - ;; indicated by the fact that the current state is not vi-state, + ;; indicated by the fact that the current state is not vi-state), ;; then `event' represents the vi command to be executed (e.g., `d', ;; `w', etc). Again, last-command-char must make emacs believe that ;; this is the command we typed. @@ -1393,10 +1393,11 @@ (while (= char ?U) (vip-describe-arg cmd-info) (setq char (read-char))) - ;; `char' is a movement command or a digit arg command---so we execute - ;; it at the very end + ;; `char' is a movement cmd, a digit arg cmd, or a register cmd---so we + ;; execute it at the very end (or (vip-movement-command-p char) (vip-digit-command-p char) + (vip-regsuffix-command-p char) (error "")) (setq mv-or-digit-cmd (vip-exec-form-in-vi @@ -3893,18 +3894,38 @@ (defadvice find-file (before vip-add-suffix-advice activate) "Use `read-file-name' for reading arguments." - (interactive (list (read-file-name "Find file: " - nil default-directory)))) + (interactive (cons (read-file-name "Find file: " nil default-directory) + ;; if Mule and prefix argument, ask for coding system + (if (or (boundp 'MULE) ; mule integrated Emacs 19 + (featurep 'mule)) ; mule integrated XEmacs 20 + (list + (and current-prefix-arg + (read-coding-system "Coding-system: ")))) + ))) (defadvice find-file-other-window (before vip-add-suffix-advice activate) "Use `read-file-name' for reading arguments." - (interactive (list (read-file-name "Find file in other window: " - nil default-directory)))) + (interactive (cons (read-file-name "Find file in other window: " + nil default-directory) + ;; if Mule and prefix argument, ask for coding system + (if (or (boundp 'MULE) ; mule integrated Emacs 19 + (featurep 'mule)) ; mule integrated XEmacs 20 + (list + (and current-prefix-arg + (read-coding-system "Coding-system: ")))) + ))) (defadvice find-file-other-frame (before vip-add-suffix-advice activate) "Use `read-file-name' for reading arguments." - (interactive (list (read-file-name "Find file in other frame: " - nil default-directory)))) + (interactive (cons (read-file-name "Find file in other frame: " + nil default-directory) + ;; if Mule and prefix argument, ask for coding system + (if (or (boundp 'MULE) ; mule integrated Emacs 19 + (featurep 'mule)) ; mule integrated XEmacs 20 + (list + (and current-prefix-arg + (read-coding-system "Coding-system: ")))) + ))) (defadvice read-file-name (around vip-suffix-advice activate) "Tell `exit-minibuffer' to run `vip-file-add-suffix' as a hook." @@ -4996,6 +5017,7 @@ (defvar help-mode-hook) (add-hook 'help-mode-hook 'viper-mode) + (vip-modify-major-mode 'help-mode 'vi-state vip-help-modifier-map) (defvar awk-mode-hook) (add-hook 'awk-mode-hook 'viper-mode)
--- a/lisp/vm/Makefile Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/Makefile Mon Aug 13 09:15:11 2007 +0200 @@ -72,7 +72,7 @@ vm: vm.elc -vm.elc: autoload +vm.elc: noautoload noautoload: $(OBJECTS) tapestry.elc @echo "building vm.elc (with all modules included)..." @@ -101,7 +101,7 @@ vm.info: vm.texinfo @echo "making vm.info..." - @$(EMACS) $(BATCHFLAGS) vm.texinfo -l texinfmt -f texinfo-format-buffer -f save-buffer + @$(EMACS) $(BATCHFLAGS) -insert vm.texinfo -l texinfmt -f texinfo-format-buffer -f save-buffer vm-autoload.elc: $(SOURCES) @echo scanning sources to build autoload definitions...
--- a/lisp/vm/vm-delete.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-delete.el Mon Aug 13 09:15:11 2007 +0200 @@ -147,7 +147,7 @@ (t (setq arg 0))) (if vm-move-after-killing (let ((vm-circular-folders (and vm-circular-folders - (eq vm-move-after-deleting t)))) + (eq vm-move-after-killing t)))) (vm-next-message arg t executing-kbd-macro)))) (defun vm-expunge-folder (&optional shaddap)
--- a/lisp/vm/vm-digest.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-digest.el Mon Aug 13 09:15:11 2007 +0200 @@ -416,20 +416,35 @@ (delete-char -1)) ;; put one back (insert ?\n))) - ;; insert a trailing message separator - ;; delete the digest separator - ;; insert the leading separator - (if prev-sep - (progn - (delete-region (match-beginning 0) (match-end 0)) - (insert (vm-trailing-message-separator folder-type)))) - (setq prev-sep (point)) - (insert (vm-leading-message-separator folder-type)) - (setq after-prev-sep (point)) - ;; eat trailing newlines - (while (= (following-char) ?\n) - (delete-char 1)) - (insert ident-header) + ;; there should be at least one valid header at + ;; the beginning of an encapsulated message. If + ;; there isn't a valid header, then assume that + ;; the digest was packed improperly and that this + ;; isn't a real boundary. + (if (not + (save-excursion + (save-match-data + (skip-chars-forward "\n") + (and (vm-match-header) + (or (vm-digest-get-header-contents "From") + (not (re-search-forward separator-regexp + nil t))))))) + (setq prev-sep (point) + after-prev-sep (point)) + ;; insert a trailing message separator + ;; delete the digest separator + ;; insert the leading separator + (if prev-sep + (progn + (delete-region (match-beginning 0) (match-end 0)) + (insert (vm-trailing-message-separator folder-type)))) + (setq prev-sep (point)) + (insert (vm-leading-message-separator folder-type)) + (setq after-prev-sep (point)) + ;; eat trailing newlines + (while (= (following-char) ?\n) + (delete-char 1)) + (insert ident-header)) ;; try to match message separator and repeat. (setq match (re-search-forward separator-regexp nil t))) ;; from the last separator to eof is the digest epilogue. @@ -595,3 +610,16 @@ (cond ((search-forward "\n----------------------------------------------------------------------\n" (vm-text-end-of m) t) "rfc1153") (t "rfc934")))))) + +(defun vm-digest-get-header-contents (header-name-regexp) + (let ((contents nil) + regexp) + (setq regexp (concat "^\\(" header-name-regexp "\\)\\|\\(^$\\)")) + (save-excursion + (let ((case-fold-search t)) + (if (and (re-search-forward regexp nil t) + (match-beginning 1) + (progn (goto-char (match-beginning 0)) + (vm-match-header))) + (vm-matched-header-contents) + nil )))))
--- a/lisp/vm/vm-folder.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-folder.el Mon Aug 13 09:15:11 2007 +0200 @@ -306,6 +306,7 @@ 'vm-virtual-mirror 'vm-ml-sort-keys 'vm-ml-labels + 'vm-spooled-mail-waiting 'vm-message-list) (set-buffer vm-summary-buffer) (set-buffer-modified-p modified)))) @@ -330,6 +331,7 @@ 'vm-virtual-folder-definition 'vm-virtual-mirror 'vm-ml-labels + 'vm-spooled-mail-waiting 'vm-message-list) (set-buffer vm-presentation-buffer) (set-buffer-modified-p modified)))) @@ -506,7 +508,8 @@ (set-buffer temp-buffer) (if (file-readable-p file) (condition-case nil - (insert-file-contents file nil 0 4096) + (let ((overriding-file-coding-system 'binary)) + (insert-file-contents file nil 0 4096)) (wrong-number-of-arguments (call-process "sed" file temp-buffer nil "-n" "1,/^$/p"))))))) @@ -2142,7 +2145,8 @@ (defun vm-start-itimers-if-needed () (cond ((and (not (natnump vm-flush-interval)) - (not (natnump vm-auto-get-new-mail)))) + (not (natnump vm-auto-get-new-mail)) + (not (natnump vm-mail-check-interval)))) ((condition-case data (progn (require 'itimer) t) (error nil)) @@ -2151,7 +2155,11 @@ vm-flush-interval nil)) (and (natnump vm-auto-get-new-mail) (not (get-itimer "vm-get-mail")) (start-itimer "vm-get-mail" 'vm-get-mail-itimer-function - vm-auto-get-new-mail nil))) + vm-auto-get-new-mail nil)) + (and (natnump vm-mail-check-interval) + (not (get-itimer "vm-check-mail")) + (start-itimer "vm-check-mail" 'vm-check-mail-itimer-function + vm-mail-check-interval nil))) ((condition-case data (progn (require 'timer) t) (error nil)) @@ -2161,6 +2169,12 @@ 'vm-flush-itimer-function nil)) (timer-set-function timer 'vm-flush-itimer-function (list timer))) + (and (natnump vm-mail-check-interval) + (setq timer (run-at-time vm-mail-check-interval + vm-mail-check-interval + 'vm-check-mail-itimer-function nil)) + (timer-set-function timer 'vm-check-mail-itimer-function + (list timer))) (and (natnump vm-auto-get-new-mail) (setq timer (run-at-time vm-auto-get-new-mail vm-auto-get-new-mail @@ -2171,10 +2185,40 @@ (setq vm-flush-interval t vm-auto-get-new-mail t)))) +;; support for vm-mail-check-interval +;; if timer argument is present, this means we're using the Emacs +;; 'timer package rather than the 'itimer package. +(defun vm-check-mail-itimer-function (&optional timer) + ;; FSF Emacs sets this non-nil, which means the user can't + ;; interrupt the check. Bogus. + (setq inhibit-quit nil) + (if (integerp vm-mail-check-interval) + (if timer + (timer-set-time timer (current-time) vm-mail-check-interval) + (set-itimer-restart current-itimer vm-mail-check-interval))) + (let ((b-list (buffer-list)) + oldval) + (while (and (not (input-pending-p)) b-list) + (save-excursion + (set-buffer (car b-list)) + (if (and (eq major-mode 'vm-mode) + (not vm-block-new-mail)) + (progn + (setq oldval vm-spooled-mail-waiting) + (vm-check-for-spooled-mail nil) + (if (not (eq oldval vm-spooled-mail-waiting)) + (progn + (intern (buffer-name) vm-buffers-needing-display-update) + (vm-update-summary-and-mode-line)))))) + (setq b-list (cdr b-list))))) + ;; support for numeric vm-auto-get-new-mail ;; if timer argument is present, this means we're using the Emacs ;; 'timer package rather than the 'itimer package. (defun vm-get-mail-itimer-function (&optional timer) + ;; FSF Emacs sets this non-nil, which means the user can't + ;; interrupt mail retrieval. Bogus. + (setq inhibit-quit nil) (if (integerp vm-auto-get-new-mail) (if timer (timer-set-time timer (current-time) vm-auto-get-new-mail) @@ -2191,7 +2235,7 @@ buffer-file-name))) (not vm-block-new-mail) (not vm-folder-read-only) - (vm-get-spooled-mail) + (vm-get-spooled-mail nil) (vm-assimilate-new-messages t)) (progn ;; don't move the message pointer unless the folder @@ -2469,7 +2513,8 @@ ;; force user notification of file variables for v18 Emacses ;; enable-local-variables == nil disables them for newer Emacses (let ((inhibit-local-variables t) - (enable-local-variables nil)) + (enable-local-variables nil) + (overriding-file-coding-system 'no-conversion)) (find-file-noselect crash-box))) (save-excursion (set-buffer crash-buf) @@ -2520,42 +2565,27 @@ (set-buffer crash-buf) (widen) (buffer-size)))) - (write-region opoint-max (point-max) buffer-file-name t t) - (vm-increment vm-modification-counter) (setq got-mail (/= opoint-max (point-max))) - (set-buffer-modified-p old-buffer-modified-p) - (kill-buffer crash-buf) - (if (not (stringp vm-keep-crash-boxes)) - (vm-error-free-call 'delete-file crash-box) - (rename-file crash-box - (concat (expand-file-name vm-keep-crash-boxes) - (if (not - (= (aref vm-keep-crash-boxes - (1- (length vm-keep-crash-boxes))) - ?/)) - "/" - "") - "Z" - (substring - (timezone-make-date-sortable - (current-time-string)) - 4))) - ;; guarantee that each new saved crashbox will have a - ;; different name, assuming time doesn't reverse. - (sleep-for 1)) + (if (not got-mail) + nil + (write-region opoint-max (point-max) buffer-file-name t t) + (vm-increment vm-modification-counter) + (set-buffer-modified-p old-buffer-modified-p) + (kill-buffer crash-buf) + (if (not (stringp vm-keep-crash-boxes)) + (vm-error-free-call 'delete-file crash-box) + (let (name) + (setq name (expand-file-name (format "Z%d" (vm-abs (random))) + vm-keep-crash-boxes)) + (while (file-exists-p name) + (setq name (expand-file-name (format "Z%d" (vm-abs (random))) + vm-keep-crash-boxes))) + (rename-file crash-box name)))) got-mail )))) -(defun vm-get-spooled-mail () - (if vm-block-new-mail - (error "Can't get new mail until you save this folder.")) - (let ((triples nil) - ;; since we could accept-process-output here (POP code), - ;; a timer process might try to start retrieving mail - ;; before we finish. block these attempts. - (vm-block-new-mail t) - (fallback-triples nil) - crash in maildrop popdrop - (got-mail nil)) +(defun vm-compute-spool-files () + (let ((fallback-triples nil) + triples) (cond ((and buffer-file-name (consp vm-spool-file-suffixes) (stringp vm-crash-box-suffix)) @@ -2570,7 +2600,7 @@ (cond ((and buffer-file-name vm-make-spool-file-name vm-make-crash-box-name) (setq fallback-triples - (ncons fallback-triples + (nconc fallback-triples (list (list buffer-file-name (save-excursion (funcall vm-make-spool-file-name @@ -2591,12 +2621,80 @@ ((consp (car (vm-spool-files))) (setq triples (vm-spool-files)))) (setq triples (append triples fallback-triples)) + triples )) + +(defun vm-spool-check-mail (source) + (let ((handler (and (fboundp 'find-file-name-handler) + (condition-case () + (find-file-name-handler source 'vm-spool-check-mail) + (wrong-number-of-arguments + (find-file-name-handler source)))))) + (if handler + (funcall handler 'vm-spool-check-mail source) + (and (not (equal 0 (nth 7 (file-attributes source)))) + (file-readable-p source))))) + +(defun vm-check-for-spooled-mail (&optional interactive) + (if vm-block-new-mail + nil + (let ((triples (vm-compute-spool-files)) + ;; since we could accept-process-output here (POP code), + ;; a timer process might try to start retrieving mail + ;; before we finish. block these attempts. + (vm-block-new-mail t) + (vm-pop-ok-to-ask interactive) + (done nil) + crash in maildrop popdrop + (mail-waiting nil)) + (while (and triples (not done)) + (setq in (expand-file-name (nth 0 (car triples)) vm-folder-directory) + maildrop (nth 1 (car triples)) + crash (nth 2 (car triples))) + (if (eq (current-buffer) (vm-get-file-buffer in)) + (progn + (if (file-exists-p crash) + (progn + (setq mail-waiting t + done t)) + (setq popdrop (and vm-recognize-pop-maildrops + (string-match vm-recognize-pop-maildrops + maildrop))) + (if (not interactive) + ;; allow no error to be signaled + (condition-case nil + (setq mail-waiting + (or mail-waiting + (if popdrop + (vm-pop-check-mail maildrop) + (vm-spool-check-mail maildrop)))) + (error nil)) + (setq mail-waiting (or mail-waiting + (if popdrop + (vm-pop-check-mail maildrop) + (vm-spool-check-mail maildrop))))) + (if mail-waiting + (setq done t))))) + (setq triples (cdr triples))) + (setq vm-spooled-mail-waiting mail-waiting) + mail-waiting ))) + +(defun vm-get-spooled-mail (&optional interactive) + (if vm-block-new-mail + (error "Can't get new mail until you save this folder.")) + (let ((triples (vm-compute-spool-files)) + ;; since we could accept-process-output here (POP code), + ;; a timer process might try to start retrieving mail + ;; before we finish. block these attempts. + (vm-block-new-mail t) + (vm-pop-ok-to-ask interactive) + crash in maildrop popdrop + (got-mail nil)) (while triples (setq in (expand-file-name (nth 0 (car triples)) vm-folder-directory) maildrop (nth 1 (car triples)) crash (nth 2 (car triples))) (if (eq (current-buffer) (vm-get-file-buffer in)) - (progn + (let (retrieval-function) (if (file-exists-p crash) (progn (message "Recovering messages from %s..." crash) @@ -2613,16 +2711,42 @@ (progn (setq crash (expand-file-name crash vm-folder-directory)) (if (not popdrop) - (setq maildrop (expand-file-name maildrop))) - (if (if popdrop - (vm-pop-move-mail maildrop crash) - (vm-spool-move-mail maildrop crash)) + (setq maildrop (expand-file-name maildrop) + retrieval-function 'vm-spool-move-mail) + (setq retrieval-function 'vm-pop-move-mail)) + (if (if got-mail + ;; don't allow errors to be signaled unless no + ;; mail has been appended to the incore + ;; copy of the folder. otherwise the + ;; user will wonder where the mail is, + ;; since it is not in the crash box or + ;; the spool file and doesn't _appear_ to + ;; be in the folder either. + (condition-case error-data + (funcall retrieval-function maildrop crash) + (error (message "%s signaled: %s" + (if popdrop + 'vm-pop-move-mail + 'vm-spool-move-mail) + error-data) + (sleep-for 2) + ;; we don't know if mail was + ;; put into the crash box or + ;; not, so return t just to be + ;; safe. + t )) + (funcall retrieval-function maildrop crash)) (if (vm-gobble-crash-box crash) (progn (setq got-mail t) (message "Got mail from %s." (or popdrop maildrop))))))))) (setq triples (cdr triples))) + ;; not really correct, but it is what the user expects to see. + (if got-mail + (setq vm-spooled-mail-waiting nil)) + (intern (buffer-name) vm-buffers-needing-display-update) + (vm-update-summary-and-mode-line) (if got-mail (run-hooks 'vm-retrieved-spooled-mail-hook)) got-mail )) @@ -2662,7 +2786,7 @@ (or buffer-file-name (buffer-name))) (vm-unsaved-message "Checking for new mail...")) (let (totals-blurb) - (if (and (vm-get-spooled-mail) (vm-assimilate-new-messages t)) + (if (and (vm-get-spooled-mail t) (vm-assimilate-new-messages t)) (progn ;; say this NOW, before the non-previewers read ;; a message, alter the new message count and @@ -2691,7 +2815,8 @@ (vm-save-restriction (widen) (goto-char (point-max)) - (insert-file-contents folder))) + (let ((overriding-file-coding-system 'binary)) + (insert-file-contents folder)))) (setq mcount (length vm-message-list)) (if (vm-assimilate-new-messages) (progn @@ -2882,6 +3007,8 @@ (vm-display nil nil '(vm-toggle-read-only) '(vm-toggle-read-only)) (vm-update-summary-and-mode-line)) +(defvar scroll-in-place) + ;; this does the real major mode scutwork. (defun vm-mode-internal () (widen) @@ -2927,12 +3054,15 @@ (add-hook 'kill-buffer-hook 'vm-garbage-collect-folder) (add-hook 'kill-buffer-hook 'vm-garbage-collect-message) ;; avoid the XEmacs file dialog box. - (defvar should-use-dialog-box) - (make-local-variable 'should-use-dialog-box) - (setq should-use-dialog-box nil) + (defvar use-dialog-box) + (make-local-variable 'use-dialog-box) + (setq use-dialog-box nil) ;; mail folders are precious. protect them by default. (make-local-variable 'file-precious-flag) (setq file-precious-flag t) + ;; scroll in place messes with scroll-up and this loses + (make-local-variable 'scroll-in-place) + (setq scroll-in-place nil) (run-hooks 'vm-mode-hook) ;; compatibility (run-hooks 'vm-mode-hooks))
--- a/lisp/vm/vm-menu.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-menu.el Mon Aug 13 09:15:11 2007 +0200 @@ -841,7 +841,18 @@ ;; (cons "Mail" vm-menu-fsfemacs-mail-menu)) (if vm-popup-menu-on-mouse-3 (define-key vm-mail-mode-map [down-mouse-3] - 'vm-menu-popup-mode-menu))))) + 'vm-menu-popup-mode-menu)) + ;; replace some FSF Emacs menubar menu commands so the + ;; user gets the VM version. Catch errors; we don't + ;; care enough about this to make VM crash if the + ;; menubar entry names change. + (condition-case nil + (progn + (define-key vm-mail-mode-map [menubar mail send] + 'vm-mail-send-and-exit) + (define-key vm-mail-mode-map [menubar mail send-stay] + 'vm-mail-send)) + (error nil))))) (defun vm-menu-install-menus () (cond ((consp vm-use-menus)
--- a/lisp/vm/vm-mime.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-mime.el Mon Aug 13 09:15:11 2007 +0200 @@ -27,17 +27,19 @@ (put 'vm-mime-error 'error-message "MIME error")) (defun vm-mm-layout-type (e) (aref e 0)) -(defun vm-mm-layout-encoding (e) (aref e 1)) -(defun vm-mm-layout-id (e) (aref e 2)) -(defun vm-mm-layout-description (e) (aref e 3)) -(defun vm-mm-layout-disposition (e) (aref e 4)) -(defun vm-mm-layout-header-start (e) (aref e 5)) -(defun vm-mm-layout-body-start (e) (aref e 6)) -(defun vm-mm-layout-body-end (e) (aref e 7)) -(defun vm-mm-layout-parts (e) (aref e 8)) -(defun vm-mm-layout-cache (e) (aref e 9)) +(defun vm-mm-layout-qtype (e) (aref e 1)) +(defun vm-mm-layout-encoding (e) (aref e 2)) +(defun vm-mm-layout-id (e) (aref e 3)) +(defun vm-mm-layout-description (e) (aref e 4)) +(defun vm-mm-layout-disposition (e) (aref e 5)) +(defun vm-mm-layout-qdisposition (e) (aref e 6)) +(defun vm-mm-layout-header-start (e) (aref e 7)) +(defun vm-mm-layout-body-start (e) (aref e 8)) +(defun vm-mm-layout-body-end (e) (aref e 9)) +(defun vm-mm-layout-parts (e) (aref e 10)) +(defun vm-mm-layout-cache (e) (aref e 11)) -(defun vm-set-mm-layout-cache (e c) (aset e 8 c)) +(defun vm-set-mm-layout-cache (e c) (aset e 11 c)) (defun vm-mm-layout (m) (or (vm-mime-layout-of m) @@ -74,21 +76,10 @@ (defun vm-mime-Q-encode-region (start end) (let ((buffer-read-only nil)) (subst-char-in-region start end (string-to-char " ") ?_ t) - (vm-mime-qp-encode-region start end))) - -(fset 'vm-mime-B-encode-region 'vm-mime-base64-encode-region) - -(defun vm-mime-Q-decode-string (string) - (vm-with-string-as-region string 'vm-mime-Q-decode-region)) + (vm-mime-qp-encode-region start end t))) -(defun vm-mime-B-decode-string (string) - (vm-with-string-as-region string 'vm-mime-B-decode-region)) - -(defun vm-mime-Q-encode-string (string) - (vm-with-string-as-region string 'vm-mime-Q-encode-region)) - -(defun vm-mime-B-encode-string (string) - (vm-with-string-as-region string 'vm-mime-B-encode-region)) +(defun vm-mime-B-encode-region (start end) + (vm-mime-base64-encode-region start end nil t)) (defun vm-mime-crlf-to-lf-region (start end) (let ((buffer-read-only nil)) @@ -111,13 +102,41 @@ (insert "\r\n")))))) (defun vm-mime-charset-decode-region (charset start end) - (let ((buffer-read-only nil) - (cell (vm-mime-charset-internally-displayable-p charset)) - (opoint (point))) - (cond ((and cell (vm-xemacs-mule-p) (eq (device-type) 'x)) - (decode-coding-region start end (car cell)))) - ;; In XEmacs 20.0 beta93 decode-coding-region moves point. - (goto-char opoint))) + (or (markerp end) (setq end (vm-marker end))) + (cond ((vm-xemacs-mule-p) + (if (eq (device-type) 'x) + (let ((buffer-read-only nil) + (cell (cdr (vm-string-assoc + charset + vm-mime-mule-charset-to-coding-alist))) + (oend (marker-position end)) + (opoint (point))) + (if cell + (progn + (set-marker end (+ start + (or (decode-coding-region + start end (car cell)) + (- oend start)))) + (put-text-property start end 'vm-string t) + (put-text-property start end 'vm-charset charset) + (put-text-property start end 'vm-coding (car cell)))) + ;; In XEmacs 20.0 beta93 decode-coding-region moves point. + (goto-char opoint)))) + ((not (vm-multiple-fonts-possible-p)) nil) + ((vm-string-member charset vm-mime-default-face-charsets) nil) + (t + (let ((font (cdr (vm-string-assoc + charset + vm-mime-charset-font-alist))) + (face (make-face (make-symbol "temp-face"))) + (e (vm-make-extent start end))) + (put-text-property start end 'vm-string t) + (put-text-property start end 'vm-charset charset) + (if font + (condition-case data + (progn (set-face-font face font) + (vm-set-extent-property e 'face face)) + (error nil))))))) (defun vm-mime-transfer-decode-region (layout start end) (let ((case-fold-search t) (crlf nil)) @@ -202,8 +221,9 @@ (and work-buffer (kill-buffer work-buffer)))) (vm-unsaved-message "Decoding base64... done")) -(defun vm-mime-base64-encode-region (start end &optional crlf) - (vm-unsaved-message "Encoding base64...") +(defun vm-mime-base64-encode-region (start end &optional crlf B-encoding) + (and (> (- end start) 200) + (vm-unsaved-message "Encoding base64...")) (let ((work-buffer nil) (counter 0) (cols 0) @@ -240,8 +260,9 @@ work-buffer) (setq cols (+ cols 4)) (cond ((= cols 72) - (vm-insert-char ?\n 1 nil work-buffer) - (setq cols 0))) + (setq cols 0) + (if (not B-encoding) + (vm-insert-char ?\n 1 nil work-buffer)))) (setq bits 0 counter 0)) (t (setq bits (lsh bits 8)))) (vm-increment inputpos)) @@ -263,12 +284,15 @@ (or (markerp end) (setq end (vm-marker end))) (goto-char start) (insert-buffer-substring work-buffer) - (delete-region (point) end)) - (and work-buffer (kill-buffer work-buffer)))) - (vm-unsaved-message "Encoding base64... done")) + (delete-region (point) end) + (and (> (- end start) 200) + (vm-unsaved-message "Encoding base64... done")) + (- end start)) + (and work-buffer (kill-buffer work-buffer))))) (defun vm-mime-qp-decode-region (start end) - (vm-unsaved-message "Decoding quoted-printable...") + (and (> (- end start) 200) + (vm-unsaved-message "Decoding quoted-printable...")) (let ((work-buffer nil) (buf (current-buffer)) (case-fold-search nil) @@ -329,10 +353,12 @@ (insert-buffer-substring work-buffer) (delete-region (point) end)) (and work-buffer (kill-buffer work-buffer)))) - (vm-unsaved-message "Decoding quoted-printable... done")) + (and (> (- end start) 200) + (vm-unsaved-message "Decoding quoted-printable... done"))) -(defun vm-mime-qp-encode-region (start end) - (vm-unsaved-message "Encoding quoted-printable...") +(defun vm-mime-qp-encode-region (start end &optional Q-encoding) + (and (> (- end start) 200) + (vm-unsaved-message "Encoding quoted-printable...")) (let ((work-buffer nil) (buf (current-buffer)) (cols 0) @@ -365,16 +391,20 @@ (t (vm-insert-char char 1 nil work-buffer) (vm-increment cols))) (cond ((> cols 70) - (vm-insert-char ?= 1 nil work-buffer) - (vm-insert-char ?\n 1 nil work-buffer) - (setq cols 0))) + (setq cols 0) + (if Q-encoding + nil + (vm-insert-char ?= 1 nil work-buffer) + (vm-insert-char ?\n 1 nil work-buffer)))) (vm-increment inputpos)) (or (markerp end) (setq end (vm-marker end))) (goto-char start) (insert-buffer-substring work-buffer) - (delete-region (point) end)) - (and work-buffer (kill-buffer work-buffer)))) - (vm-unsaved-message "Encoding quoted-printable... done")) + (delete-region (point) end) + (and (> (- end start) 200) + (vm-unsaved-message "Encoding quoted-printable... done")) + (- end start)) + (and work-buffer (kill-buffer work-buffer))))) (defun vm-decode-mime-message-headers (m) (let ((case-fold-search t) @@ -430,13 +460,55 @@ (vm-mime-charset-decode-region charset start end) (delete-region match-start start)))))) -(defun vm-decode-mime-encoded-words-maybe (string) +(defun vm-decode-mime-encoded-words-in-string (string) (if (and vm-display-using-mime (string-match vm-mime-encoded-word-regexp string)) (vm-with-string-as-temp-buffer string 'vm-decode-mime-encoded-words) string )) -(defun vm-mime-parse-content-header (string &optional sepchar) +(defun vm-reencode-mime-encoded-words () + (let ((charset nil) + start coding pos q-encoding + old-size + (case-fold-search t) + (done nil)) + (save-excursion + (setq start (point-min)) + (while (not done) + (setq charset (get-text-property start 'vm-charset)) + (setq pos (next-single-property-change start 'vm-charset)) + (or pos (setq pos (point-max) done t)) + (if charset + (progn + (message " pos = %d start = %d" pos start) + (if (setq coding (get-text-property start 'vm-coding)) + (progn + (setq old-size (buffer-size)) + (encode-coding-region start pos coding) + (setq pos (+ pos (- (buffer-size) old-size))))) + (message " pos = %d start = %d" pos start) + (setq pos + (+ start + (if (setq q-encoding + (string-match "^iso-8859-\\|^us-ascii" + charset)) + (vm-mime-Q-encode-region start pos) + (vm-mime-B-encode-region start pos)))) + (message " pos = %d start = %d" pos start) + (goto-char pos) + (insert "?=") + (setq pos (point)) + (goto-char start) + (insert "=?" charset "?" (if q-encoding "Q" "B") "?"))) + (setq start pos))))) + +(defun vm-reencode-mime-encoded-words-in-string (string) + (if (and vm-display-using-mime + (text-property-any 0 (length string) 'vm-string t string)) + (vm-with-string-as-temp-buffer string 'vm-reencode-mime-encoded-words) + string )) + +(defun vm-mime-parse-content-header (string &optional sepchar keep-quotes) (if (null string) () (let ((work-buffer nil)) @@ -474,23 +546,40 @@ ((looking-at " \t\n\r\f") (skip-chars-forward " \t\n\r\f")) ((= char ?\") - (delete-char 1) - (cond ((= (char-after (point)) ?\") - (delete-char 1)) - ((re-search-forward "[^\\]\"" nil 0) - (delete-char -1)))) + (let ((done nil)) + (if keep-quotes + (forward-char 1) + (delete-char 1)) + (while (not done) + (if (null (re-search-forward "[\\\"]" nil t)) + (setq done t) + (setq char (char-after (1- (point)))) + (cond ((char-equal char ?\\) + (delete-char -1) + (if (eobp) + (setq done t) + (forward-char 1))) + (t (if (not keep-quotes) + (delete-char -1)) + (setq done t))))))) ((= char ?\() - (let ((parens 1) - (pos (point))) + (let ((done nil) + (pos (point)) + (parens 1)) (forward-char 1) - (while (and (not (eobp)) (not (zerop parens))) - (re-search-forward "[()]" nil 0) - (cond ((or (eobp) - (= (char-after (- (point) 2)) ?\\))) - ((= (preceding-char) ?\() - (setq parens (1+ parens))) - (t - (setq parens (1- parens))))) + (while (not done) + (if (null (re-search-forward "[\\()]" nil t)) + (setq done t) + (setq char (char-after (1- (point)))) + (cond ((char-equal char ?\\) + (if (eobp) + (setq done t) + (forward-char 1))) + ((char-equal char ?\() + (setq parens (1+ parens))) + (t + (setq parens (1- parens) + done (zerop parens)))))) (delete-region pos (point)))))) (setq s (buffer-substring start (point))) (if (and (null (string-match "^[\t\f\n\r ]+$" s)) @@ -513,8 +602,8 @@ nil ))))) (defun vm-mime-parse-entity (&optional m default-type default-encoding) - (let ((case-fold-search t) version type encoding id description - disposition boundary boundary-regexp start + (let ((case-fold-search t) version type qtype encoding id description + disposition qdisposition boundary boundary-regexp start multipart-list c-t c-t-e done p returnval) (and m (vm-unsaved-message "Parsing MIME message...")) (prog1 @@ -531,6 +620,7 @@ (setq version (vm-get-header-contents m "MIME-Version:") version (car (vm-mime-parse-content-header version)) type (vm-get-header-contents m "Content-Type:") + qtype (vm-mime-parse-content-header type ?\; t) type (vm-mime-parse-content-header type ?\;) encoding (or (vm-get-header-contents m "Content-Transfer-Encoding:") @@ -547,6 +637,9 @@ description)) disposition (vm-get-header-contents m "Content-Disposition:") + qdisposition (and disposition + (vm-mime-parse-content-header + disposition ?\; t)) disposition (and disposition (vm-mime-parse-content-header disposition ?\;))) @@ -554,6 +647,8 @@ (narrow-to-region (vm-headers-of m) (vm-text-end-of m))) (goto-char (point-min)) (setq type (vm-mime-get-header-contents "Content-Type:") + qtype (or (vm-mime-parse-content-header type ?\; t) + default-type) type (or (vm-mime-parse-content-header type ?\;) default-type) encoding (or (vm-mime-get-header-contents @@ -570,6 +665,9 @@ description)) disposition (vm-mime-get-header-contents "Content-Disposition:") + qdisposition (and disposition + (vm-mime-parse-content-header + disposition ?\; t)) disposition (and disposition (vm-mime-parse-content-header disposition ?\;)))) @@ -581,7 +679,9 @@ (cond ((and m (null type)) (throw 'return-value (vector '("text/plain" "charset=us-ascii") - encoding id description disposition + '("text/plain" "charset=us-ascii") + encoding id description + disposition qdisposition (vm-headers-of m) (vm-text-of m) (vm-text-end-of m) @@ -590,7 +690,9 @@ (goto-char (point-min)) (or (re-search-forward "^\n\\|\n\\'" nil t) (vm-mime-error "MIME part missing header/body separator line")) - (vector default-type encoding id description disposition + (vector default-type default-type + encoding id description + disposition qdisposition (vm-marker (point-min)) (vm-marker (point)) (vm-marker (point-max)) @@ -617,21 +719,24 @@ (or (re-search-forward "^\n\\|\n\\'" nil t) (vm-mime-error "MIME part missing header/body separator line")) (throw 'return-value - (vector type encoding id description disposition + (vector type qtype encoding id description + disposition qdisposition (vm-marker (point-min)) (vm-marker (point)) (vm-marker (point-max)) (list (save-restriction (narrow-to-region (point) (point-max)) - (vm-mime-parse-entity nil c-t c-t-e))) + (vm-mime-parse-entity-safe nil c-t + c-t-e))) nil ))) (t (goto-char (point-min)) (or (re-search-forward "^\n\\|\n\\'" nil t) (vm-mime-error "MIME part missing header/body separator line")) (throw 'return-value - (vector type encoding id description disposition + (vector type qtype encoding id description + disposition qdisposition (vm-marker (point-min)) (vm-marker (point)) (vm-marker (point-max)) @@ -647,8 +752,13 @@ (vm-mime-error "Boundary parameter missing in %s type specification" (car type))) - (setq boundary-regexp (regexp-quote boundary) - boundary-regexp (concat "^--" boundary-regexp "\\(--\\)?\n")) + ;; the \' in the regexp is to "be liberal" in the + ;; face of broken software that does not add a line + ;; break after the final boundary of a nested + ;; multipart entity. + (setq boundary-regexp + (concat "^--" (regexp-quote boundary) + "\\(--\\)?[ \t]*\\(\n\\|\\'\\)")) (goto-char (point-min)) (setq start nil multipart-list nil @@ -671,7 +781,8 @@ (goto-char (point-min)) (or (re-search-forward "^\n\\|\n\\'" nil t) (vm-mime-error "MIME part missing header/body separator line")) - (vector type encoding id description disposition + (vector type qtype encoding id description + disposition qdisposition (vm-marker (point-min)) (vm-marker (point)) (vm-marker (point-max)) @@ -699,14 +810,14 @@ (text-end (if m (vm-text-end-of m) (vm-marker (point-max))))) - (vector c-t + (vector c-t c-t (vm-determine-proper-content-transfer-encoding text text-end) nil ;; cram the error message into the description slot - (car error-data) + (car (cdr error-data)) ;; mark as an attachment to improve the chance that the user ;; will see the description. - '("attachment") + '("attachment") '("attachment") header text text-end))))) @@ -766,8 +877,13 @@ mode-popup-menu (and vm-use-menus vm-popup-menu-on-mouse-3 (vm-menu-support-possible-p) (vm-menu-mode-menu)) + ;; Default to binary file type for DOS/NT. + buffer-file-type t + ;; Tell XEmacs/MULE not to mess with the text on writes. buffer-read-only t mode-line-format vm-mode-line-format) + (and (fboundp 'set-file-coding-system) + (set-file-coding-system 'binary t)) (cond ((vm-fsfemacs-19-p) ;; need to do this outside the let because ;; loading disp-table initializes @@ -785,14 +901,6 @@ (and (vm-menu-support-possible-p) (vm-menu-install-menus))) (setq vm-presentation-buffer-handle b))) - ;; do this (widen) outside save-restricton intentionally. since - ;; we're using the presentation buffer, make the folder - ;; buffer unpretty so maybe the user gets the idea. - ;;(widen) - ;; widening isn't enough. users just complain that "I'm - ;; looking at the wrong message." Curse their miserable hides. - ;; bury the buffer so they'll have a tough time finding it. - (bury-buffer (current-buffer)) (setq b vm-presentation-buffer-handle vm-presentation-buffer vm-presentation-buffer-handle vm-mime-decoded nil) @@ -839,15 +947,33 @@ (fset 'vm-presentation-mode 'vm-mode) (put 'vm-presentation-mode 'mode-class 'special) +(defvar file-coding-system) + (defun vm-determine-proper-charset (beg end) (save-excursion (save-restriction (narrow-to-region beg end) (catch 'done (goto-char (point-min)) - (and (re-search-forward "[^\000-\177]" nil t) - (throw 'done (or vm-mime-8bit-composition-charset "iso-8859-1"))) - (throw 'done "us-ascii"))))) + (if (vm-xemacs-mule-p) + (let ((charsets (delq 'ascii (charsets-in-region beg end)))) + (cond ((null charsets) + "us-ascii") + ((cdr charsets) + (or (car (cdr + (assoc (coding-system-name file-coding-system) + vm-mime-mule-coding-to-charset-alist))) + "iso-2022-jp")) + (t + (or (car (cdr + (vm-string-assoc + (car charsets) + vm-mime-mule-charset-to-charset-alist))) + "unknown")))) + (and (re-search-forward "[^\000-\177]" nil t) + (throw 'done (or vm-mime-8bit-composition-charset + "iso-8859-1"))) + (throw 'done "us-ascii")))))) (defun vm-determine-proper-content-transfer-encoding (beg end) (save-excursion @@ -923,11 +1049,15 @@ (let ((charset (or (vm-mime-get-parameter layout "charset") "us-ascii"))) (vm-mime-charset-internally-displayable-p charset))) - ((vm-mime-types-match "text/html" type) - (condition-case () - (progn (require 'w3) - (fboundp 'w3-region)) - (error nil))) +;; commented out until I decide whether W3 is safe to use in +;; light of the porposed javascript extension and the possibility +;; of executing arbitrary Emacs-Lisp code embedded in a page. +;; +;; ((vm-mime-types-match "text/html" type) +;; (condition-case () +;; (progn (require 'w3) +;; (fboundp 'w3-region)) +;; (error nil))) (t nil)))) (defun vm-mime-can-convert (type) @@ -969,10 +1099,12 @@ (car (vm-mm-layout-type layout)) (nth 1 ooo)) (vector (list (nth 1 ooo)) + (list (nth 1 ooo)) "binary" (vm-mm-layout-id layout) (vm-mm-layout-description layout) (vm-mm-layout-disposition layout) + (vm-mm-layout-qdisposition layout) (vm-marker (point-min)) (vm-marker (point)) (vm-marker (point-max)) @@ -1097,6 +1229,9 @@ ;; maybe user killed it (error "No presentation buffer.")) (set-buffer vm-presentation-buffer) + (if (and (interactive-p) (eq vm-system-state 'previewing)) + (let ((vm-display-using-mime nil)) + (vm-show-current-message))) (setq m (car vm-message-pointer)) (vm-save-restriction (widen) @@ -1180,29 +1315,33 @@ (defun vm-mime-display-button-text (layout) (vm-mime-display-button-xxxx layout t)) -(defun vm-mime-display-internal-text/html (layout) - (let ((buffer-read-only nil) - (work-buffer nil)) - (vm-unsaved-message "Inlining text/html, be patient...") - ;; w3-region is not as tame as we would like. - ;; make sure the yoke is firmly attached. - (unwind-protect - (progn - (save-excursion - (set-buffer (setq work-buffer - (generate-new-buffer " *workbuf*"))) - (vm-mime-insert-mime-body layout) - (vm-mime-transfer-decode-region layout (point-min) (point-max)) - (save-excursion - (save-window-excursion - (w3-region (point-min) (point-max))))) - (insert-buffer-substring work-buffer)) - (and work-buffer (kill-buffer work-buffer))) - (vm-unsaved-message "Inlining text/html... done") - t )) +;; commented out until I decide whether W3 is safe to use in +;; light of the proposed javascript extension and the possibility +;; of executing arbitrary Emacs-Lisp code embedded in a page. +;; +;;(defun vm-mime-display-internal-text/html (layout) +;; (let ((buffer-read-only nil) +;; (work-buffer nil)) +;; (vm-unsaved-message "Inlining text/html, be patient...") +;; ;; w3-region is not as tame as we would like. +;; ;; make sure the yoke is firmly attached. +;; (unwind-protect +;; (progn +;; (save-excursion +;; (set-buffer (setq work-buffer +;; (generate-new-buffer " *workbuf*"))) +;; (vm-mime-insert-mime-body layout) +;; (vm-mime-transfer-decode-region layout (point-min) (point-max)) +;; (save-excursion +;; (save-window-excursion +;; (w3-region (point-min) (point-max))))) +;; (insert-buffer-substring work-buffer)) +;; (and work-buffer (kill-buffer work-buffer))) +;; (vm-unsaved-message "Inlining text/html... done") +;; t )) (defun vm-mime-display-internal-text/plain (layout &optional ignore-urls) - (let ((start (point)) end + (let ((start (point)) end old-size (buffer-read-only nil) (charset (or (vm-mime-get-parameter layout "charset") "us-ascii"))) (if (not (vm-mime-charset-internally-displayable-p charset)) @@ -1210,8 +1349,11 @@ (vm-mime-insert-mime-body layout) (setq end (point-marker)) (vm-mime-transfer-decode-region layout start end) + (setq old-size (buffer-size)) (vm-mime-charset-decode-region charset start end) + (set-marker end (+ end (- (buffer-size) old-size))) (or ignore-urls (vm-energize-urls-in-message-region start end)) + (goto-char end) t ))) (defun vm-mime-display-internal-text/enriched (layout) @@ -1250,9 +1392,17 @@ (setq end (point-marker)) (vm-mime-transfer-decode-region layout start end) (setq tempfile (vm-make-tempfile-name)) - ;; Tell DOS/Windows NT whether the file is binary - (setq buffer-file-type (not (vm-mime-text-type-p layout))) - (write-region start end tempfile nil 0) + (let ((buffer-file-type buffer-file-type) + file-coding-system) + ;; Tell DOS/Windows NT whether the file is binary + (setq buffer-file-type (not (vm-mime-text-type-p layout))) + ;; Tell XEmacs/MULE not to mess with the bits unless + ;; this is a text type. + (if (fboundp 'set-file-coding-system) + (if (vm-mime-text-type-p layout) + (set-file-coding-system 'no-conversion nil) + (set-file-coding-system 'binary t))) + (write-region start end tempfile nil 0)) (delete-region start end) (save-excursion (vm-select-folder-buffer) @@ -1283,7 +1433,7 @@ (let ((buffer-read-only nil) (description (vm-mm-layout-description layout))) (vm-mime-insert-button - (format "%-35s [%s to save to a file]" + (format "%-35.35s [%s to save to a file]" (vm-mime-layout-description layout) (if (vm-mouse-support-possible-p) "Click mouse-2" @@ -1367,7 +1517,7 @@ (defun vm-mime-display-button-multipart/parallel (layout) (vm-mime-insert-button - (format "%-35s [%s to display in parallel]" + (format "%-35.35s [%s to display in parallel]" (vm-mime-layout-description layout) (if (vm-mouse-support-possible-p) "Click mouse-2" @@ -1386,7 +1536,7 @@ (if (vectorp layout) (let ((buffer-read-only nil)) (vm-mime-insert-button - (format "%-35s [%s to display]" + (format "%-35.35s [%s to display]" (vm-mime-layout-description layout) (if (vm-mouse-support-possible-p) "Click mouse-2" @@ -1418,7 +1568,7 @@ (if (vectorp layout) (let ((buffer-read-only nil)) (vm-mime-insert-button - (format "%-35s [%s to display]" + (format "%-35.35s [%s to display]" (vm-mime-layout-description layout) (if (vm-mouse-support-possible-p) "Click mouse-2" @@ -1455,7 +1605,7 @@ (number (vm-mime-get-parameter layout "number")) (total (vm-mime-get-parameter layout "total"))) (vm-mime-insert-button - (format "%-35s [%s to attempt assembly]" + (format "%-35.35s [%s to attempt assembly]" (concat (vm-mime-layout-description layout) (and number (concat ", part " number)) (and number total (concat " of " total))) @@ -1595,6 +1745,7 @@ (setq end (point-marker)) (vm-mime-transfer-decode-region layout start end) (setq tempfile (vm-make-tempfile-name)) + ;; coding system for presentation buffer is binary (write-region start end tempfile nil 0) (vm-unsaved-message "Creating %s glyph..." name) (setq g (make-glyph @@ -1646,6 +1797,7 @@ (setq end (point-marker)) (vm-mime-transfer-decode-region layout start end) (setq tempfile (vm-make-tempfile-name)) + ;; coding system for presentation buffer is binary (write-region start end tempfile nil 0) (vm-set-mm-layout-cache layout tempfile) (save-excursion @@ -1663,7 +1815,7 @@ (defun vm-mime-display-button-xxxx (layout disposable) (let ((description (vm-mime-layout-description layout))) (vm-mime-insert-button - (format "%-35s [%s to display]" + (format "%-35.35s [%s to display]" description (if (vm-mouse-support-possible-p) "Click mouse-2" "Press RETURN")) (function @@ -1698,6 +1850,44 @@ ;; for the karking compiler (defvar vm-menu-mime-dispose-menu) +(defun vm-mime-set-extent-glyph-for-layout (e layout) + (if (and (vm-xemacs-p) (fboundp 'make-glyph) + (eq (device-type) 'x) (> (device-bitplanes) 15)) + (let ((type (car (vm-mm-layout-type layout))) + (dir vm-image-directory) + glyph) + (setq glyph + (cond ((vm-mime-types-match "text" type) + (make-glyph (vector + 'xpm ':file + (expand-file-name "document.xpm" dir)))) + ((vm-mime-types-match "image" type) + (make-glyph (vector + 'gif ':file + (expand-file-name "mona_stamp.gif" dir)))) + ((vm-mime-types-match "audio" type) + (make-glyph (vector + 'xpm ':file + (expand-file-name "audio_stamp.xpm" dir)))) + ((vm-mime-types-match "video" type) + (make-glyph (vector + 'xpm ':file + (expand-file-name "film.xpm" dir)))) + ((vm-mime-types-match "message" type) + (make-glyph (vector + 'xpm ':file + (expand-file-name "message.xpm" dir)))) + ((vm-mime-types-match "application" type) + (make-glyph (vector + 'xpm ':file + (expand-file-name "gear.xpm" dir)))) + ((vm-mime-types-match "multipart" type) + (make-glyph (vector + 'xpm ':file + (expand-file-name "stuffed_box.xpm" dir)))) + (t nil))) + (and glyph (set-extent-begin-glyph e glyph))))) + (defun vm-mime-insert-button (caption action layout disposable) (let ((start (point)) e (keymap (make-sparse-keymap)) @@ -1720,6 +1910,7 @@ (setq e (make-extent start (point))) (set-extent-property e 'start-open t) (set-extent-property e 'end-open t)) + (vm-mime-set-extent-glyph-for-layout e layout) ;; for emacs (vm-set-extent-property e 'mouse-face 'highlight) (vm-set-extent-property e 'local-map keymap) @@ -1742,17 +1933,30 @@ (and default-filename (setq default-filename (file-name-nondirectory default-filename))) (let ((work-buffer nil) - ;; evade the XEmacs dialox box, yeccch. - (should-use-dialog-box nil) + ;; evade the XEmacs dialog box, yeccch. + (use-dialog-box nil) + (dir vm-mime-attachment-save-directory) + (done nil) file) - (setq file - (read-file-name - (if default-filename - (format "Write MIME body to file (default %s): " - default-filename) - "Write MIME body to file: ") - vm-mime-attachment-save-directory default-filename) - file (expand-file-name file vm-mime-attachment-save-directory)) + (while (not done) + (setq file + (read-file-name + (if default-filename + (format "Write MIME body to file (default %s): " + default-filename) + "Write MIME body to file: ") + dir default-filename) + file (expand-file-name file dir)) + (if (not (file-directory-p file)) + (setq done t) + (if default-filename + (message "%s is a directory" file) + (error "%s is a directory" file)) + (sit-for 2) + (setq dir file + default-filename (if (string-match "/$" file) + (concat file default-filename) + (concat file "/" default-filename))))) (save-excursion (unwind-protect (progn @@ -1761,6 +1965,12 @@ (set-buffer work-buffer) ;; Tell DOS/Windows NT whether the file is binary (setq buffer-file-type (not (vm-mime-text-type-p layout))) + ;; Tell XEmacs/MULE not to mess with the bits unless + ;; this is a text type. + (if (fboundp 'set-file-coding-system) + (if (vm-mime-text-type-p layout) + (set-file-coding-system 'no-conversion nil) + (set-file-coding-system 'binary t))) (vm-mime-insert-mime-body layout) (vm-mime-transfer-decode-region layout (point-min) (point-max)) (or (not (file-exists-p file)) @@ -1878,9 +2088,9 @@ (or (not (vectorp o)) (and (vm-mime-types-match "text/plain" (car (vm-mm-layout-type o))) - (string-match "^\\(us-ascii\\|iso-8859-1\\)$" - (or (vm-mime-get-parameter o "charset") - "us-ascii")) + (let* ((charset (or (vm-mime-get-parameter o "charset") + "us-ascii"))) + (vm-string-member charset vm-mime-default-face-charsets)) (string-match "^\\(7bit\\|8bit\\|binary\\)$" (vm-mm-layout-encoding o)))))))) @@ -1890,11 +2100,12 @@ (defun vm-mime-charset-internally-displayable-p (name) (cond ((and (vm-xemacs-mule-p) (eq (device-type) 'x)) - (cdr (assoc (downcase name) vm-mime-xemacs-mule-charset-alist))) - ((vm-xemacs-p) - (vm-member (downcase name) '("us-ascii" "iso-8859-1"))) - ((vm-fsfemacs-19-p) - (vm-member (downcase name) '("us-ascii" "iso-8859-1"))))) + (vm-string-assoc name vm-mime-mule-charset-to-coding-alist)) + ((vm-multiple-fonts-possible-p) + (or (vm-string-member name vm-mime-default-face-charsets) + (vm-string-assoc name vm-mime-charset-font-alist))) + (t + (vm-string-member name vm-mime-default-face-charsets)))) (defun vm-mime-find-message/partials (layout id) (let ((list nil) @@ -1933,7 +2144,7 @@ (vm-increment i)) boundary )) -(defun vm-mime-attach-file (file type &optional charset) +(defun vm-mime-attach-file (file type &optional charset description) "Attach a file to a VM composition buffer to be sent along with the message. The file is not inserted into the buffer and MIME encoded until you execute vm-mail-send or vm-mail-send-and-exit. A visible tag @@ -1945,8 +2156,9 @@ First argument, FILE, is the name of the file to attach. Second argument, TYPE, is the MIME Content-Type of the file. Optional third argument CHARSET is the character set of the attached -document. This argument is only used for text types, and it -is ignored for other types. +document. This argument is only used for text types, and it is +ignored for other types. Optional fourth argument DESCRIPTION +should be a one line description of the file. When called interactively all arguments are read from the minibuffer. @@ -1961,7 +2173,7 @@ (let ((last-command last-command) (this-command this-command) (charset nil) - file default-type type) + description file default-type type) (if (null vm-send-using-mime) (error "MIME attachments disabled, set vm-send-using-mime non-nil to enable.")) (setq file (vm-read-file-name "Attach file: " nil nil t) @@ -1976,7 +2188,10 @@ (setq charset (completing-read "Character set (default US-ASCII): " vm-mime-charset-completion-alist) charset (if (> (length charset) 0) charset))) - (list file type charset))) + (setq description (read-string "One line description: ")) + (if (string-match "^[ \t]*$" description) + (setq description nil)) + (list file type charset description))) (if (null vm-send-using-mime) (error "MIME attachments disabled, set vm-send-using-mime non-nil to enable.")) (if (file-directory-p file) @@ -1986,7 +2201,8 @@ (if (not (file-readable-p file)) (error "You don't have permission to read %s" file)) (and charset (setq charset (list (concat "charset=" charset)))) - (vm-mime-attach-object file type charset nil)) + (and description (setq description (vm-mime-scrub-description description))) + (vm-mime-attach-object file type charset description nil)) (defun vm-mime-attach-mime-file (file) "Attach a MIME encoded file to a VM composition buffer to be sent @@ -2024,29 +2240,92 @@ (error "No such file: %s" file)) (if (not (file-readable-p file)) (error "You don't have permission to read %s" file)) - (vm-mime-attach-object file "MIME file" nil t)) + (vm-mime-attach-object file nil nil nil t)) -(defun vm-mime-attach-object (object type params mimed) +(defun vm-mime-attach-object (object type params description mimed) (if (not (eq major-mode 'mail-mode)) (error "Command must be used in a VM Mail mode buffer.")) - (let ((start (point)) - e tag-string) - (setq tag-string (format "[ATTACHMENT %s, %s]" object type)) + (let (start end e tag-string disposition) + (if (< (point) (save-excursion (mail-text) (point))) + (mail-text)) + (setq start (point) + tag-string (format "[ATTACHMENT %s, %s]" object + (or type "MIME file"))) (insert tag-string "\n") - (cond ((fboundp 'make-overlay) - (setq e (make-overlay start (point) nil t nil)) - (overlay-put e 'face vm-mime-button-face)) + (setq end (1- (point))) + ;; attach default filename for recipient if currently + ;; non-MIME. if already MIME'd don't do this because it + ;; would override any content-disposition header already in + ;; the attachment. + (if (and (stringp object) (not mimed)) + (progn + (if (or (vm-mime-types-match "application" type) + (vm-mime-types-match "model" type)) + (setq disposition (list "attachment")) + (setq disposition (list "inline"))) + (setq disposition (nconc disposition + (list + (concat "filename=\"" + (file-name-nondirectory object) + "\"")))))) + (cond ((vm-fsfemacs-19-p) + (put-text-property start end 'front-sticky nil) + (put-text-property start end 'rear-nonsticky t) + (put-text-property start end 'intangible object) + (put-text-property start end 'face vm-mime-button-face) + (put-text-property start end 'vm-mime-type type) + (put-text-property start end 'vm-mime-object object) + (put-text-property start end 'vm-mime-parameters params) + (put-text-property start end 'vm-mime-description description) + (put-text-property start end 'vm-mime-disposition disposition) + (put-text-property start end 'vm-mime-encoded mimed) + (put-text-property start end 'vm-mime-object object)) ((fboundp 'make-extent) - (setq e (make-extent start (1- (point)))) + (setq e (make-extent start end)) (set-extent-property e 'start-open t) - (set-extent-property e 'face vm-mime-button-face))) - (vm-set-extent-property e 'duplicable t) -;; crashes XEmacs -;; (vm-set-extent-property e 'replicating t) - (vm-set-extent-property e 'vm-mime-type type) - (vm-set-extent-property e 'vm-mime-object object) - (vm-set-extent-property e 'vm-mime-params params) - (vm-set-extent-property e 'vm-mime-encoded mimed))) + (set-extent-property e 'face vm-mime-button-face) + (vm-set-extent-property e 'duplicable t) + (vm-set-extent-property e 'vm-mime-type type) + (vm-set-extent-property e 'vm-mime-object object) + (vm-set-extent-property e 'vm-mime-parameters params) + (vm-set-extent-property e 'vm-mime-description description) + (vm-set-extent-property e 'vm-mime-disposition disposition) + (vm-set-extent-property e 'vm-mime-encoded mimed))))) + +(defun vm-disallow-overlay-endpoint-insertion (overlay after start end + &optional old-size) + (cond ((null after) nil) + ((= start (overlay-start overlay)) + (move-overlay overlay end (overlay-end overlay))) + ((= start (overlay-end overlay)) + (move-overlay overlay (overlay-start overlay) start)))) + +(defun vm-mime-fake-attachment-overlays (start end) + (let ((o-list nil) + (done nil) + (pos start) + object pos props o) + (save-excursion + (save-restriction + (narrow-to-region start end) + (while (not done) + (setq object (get-text-property pos 'vm-mime-object)) + (setq pos (next-single-property-change pos 'vm-mime-object)) + (or pos (setq pos (point-max) done t)) + (if object + (progn + (setq o (make-overlay start pos)) + (overlay-put o 'insert-in-front-hooks + '(vm-disallow-overlay-endpoint-insertion)) + (overlay-put o 'insert-behind-hooks + '(vm-disallow-overlay-endpoint-insertion)) + (setq props (text-properties-at start)) + (while props + (overlay-put o (car props) (car (cdr props))) + (setq props (cdr (cdr props)))) + (setq o-list (cons o o-list)))) + (setq start pos)) + o-list )))) (defun vm-mime-default-type-from-filename (file) (let ((alist vm-mime-attachment-auto-type-alist) @@ -2101,6 +2380,7 @@ (vm-mm-layout-body-start layout) (vm-mm-layout-body-end layout) nil))) + (defun vm-mime-encode-composition () "MIME encode the current buffer. Attachment tags added to the buffer with vm-mime-attach-file are expanded @@ -2116,11 +2396,12 @@ (just-one nil) (boundary-positions nil) already-mimed layout e e-list boundary - type encoding charset params object opoint-min) + type encoding charset params description disposition object + opoint-min) (mail-text) (setq e-list (if (fboundp 'extent-list) (extent-list nil (point) (point-max)) - (overlays-in (point) (point-max))) + (vm-mime-fake-attachment-overlays (point) (point-max))) e-list (vm-delete (function (lambda (e) (vm-extent-property e 'vm-mime-object))) @@ -2145,6 +2426,9 @@ (narrow-to-region (point) (point-max)) (setq charset (vm-determine-proper-charset (point-min) (point-max))) + (if (fboundp 'encode-coding-region) + (encode-coding-region (point-min) (point-max) + file-coding-system)) (setq encoding (vm-determine-proper-content-transfer-encoding (point-min) (point-max)) @@ -2179,21 +2463,31 @@ (insert "Content-Type: text/plain; charset=" charset "\n") (insert "Content-Transfer-Encoding: " encoding "\n\n") (widen)) - (goto-char (vm-extent-end-position e)) + (goto-char (vm-extent-start-position e)) (narrow-to-region (point) (point)) (setq object (vm-extent-property e 'vm-mime-object)) + ;; insert the object (cond ((bufferp object) (insert-buffer-substring object)) ((stringp object) - (insert-file-contents-literally object))) + (let ((overridding-file-coding-system 'no-conversion)) + (insert-file-contents-literally object)))) + ;; gather information about the object from the extent. (if (setq already-mimed (vm-extent-property e 'vm-mime-encoded)) (setq layout (vm-mime-parse-entity nil (list "text/plain" "charset=us-ascii") "7bit") - type (car (vm-mm-layout-type layout)) - params (cdr (vm-mm-layout-type layout))) + type (or (vm-extent-property e 'vm-mime-type) + (car (vm-mm-layout-type layout))) + params (or (vm-extent-property e 'vm-mime-parameters) + (cdr (vm-mm-layout-qtype layout))) + description (vm-extent-property e 'vm-mime-description) + disposition (or (vm-extent-property e 'vm-mime-disposition) + (vm-mm-layout-qdisposition layout))) (setq type (vm-extent-property e 'vm-mime-type) - params (vm-extent-property e 'vm-mime-parameters))) + params (vm-extent-property e 'vm-mime-parameters) + description (vm-extent-property e 'vm-mime-description) + disposition (vm-extent-property e 'vm-mime-disposition))) (cond ((vm-mime-types-match "text" type) (setq encoding (vm-determine-proper-content-transfer-encoding @@ -2262,7 +2556,11 @@ nil ;; trim headers (vm-reorder-message-headers - nil '("Content-Description:" "Content-ID:") nil) + nil (nconc (list "Content-Disposition:" "Content-ID:") + (if description + (list "Content-Description:") + nil)) + nil) ;; remove header/text separator (goto-char (1- (vm-mm-layout-body-start layout))) (if (looking-at "\n") @@ -2273,12 +2571,24 @@ (insert "; " (mapconcat 'identity params "; ") "\n") (insert ";\n\t" (mapconcat 'identity params ";\n\t") "\n")) (insert "\n")) + (and description + (insert "Content-Description: " description "\n")) + (if disposition + (progn + (insert "Content-Disposition: " (car disposition)) + (if (cdr disposition) + (insert ";\n\t" (mapconcat 'identity + (cdr disposition) + ";\n\t"))) + (insert "\n"))) (insert "Content-Transfer-Encoding: " encoding "\n\n")) (goto-char (point-max)) (widen) (delete-region (vm-extent-start-position e) (vm-extent-end-position e)) (vm-detach-extent e) + (if (looking-at "\n") + (delete-char 1)) (setq e-list (cdr e-list))) ;; handle the remaining chunk of text after the last ;; extent, if any. @@ -2286,6 +2596,9 @@ nil (setq charset (vm-determine-proper-charset (point) (point-max))) + (if (fboundp 'encode-coding-region) + (encode-coding-region (point-min) (point-max) + file-coding-system)) (setq encoding (vm-determine-proper-content-transfer-encoding (point) (point-max)) @@ -2346,6 +2659,17 @@ (insert ";\n\t" (mapconcat 'identity params ";\n\t")))) (insert "\n")) (if just-one + (and description + (insert "Content-Description: " description "\n"))) + (if (and just-one disposition) + (progn + (insert "Content-Disposition: " (car disposition)) + (if (cdr disposition) + (insert ";\n\t" (mapconcat 'identity + (cdr disposition) + ";\n\t"))) + (insert "\n"))) + (if just-one (insert "Content-Transfer-Encoding: " encoding "\n") (if 8bit (insert "Content-Transfer-Encoding: 8bit\n") @@ -2448,12 +2772,13 @@ ;; so vm-mime-encode-composition won't complain (setq major-mode 'mail-mode) (vm-insert-region-from-buffer mail-buffer) - (mapcar 'vm-copy-extent e-list) + (if (vm-fsfemacs-19-p) + (mapcar 'vm-copy-extent e-list)) (goto-char (point-min)) (or (vm-mail-mode-get-header-contents "From") (insert "From: " (or user-mail-address (user-login-name)) "\n")) (or (vm-mail-mode-get-header-contents "Message-ID") - (insert "Message-ID: <fake@fake.com>\n")) + (insert "Message-ID: <fake@fake.fake>\n")) (or (vm-mail-mode-get-header-contents "Date") (insert "Date: " (format-time-string "%a, %d %b %Y %H%M%S %Z"
--- a/lisp/vm/vm-minibuf.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-minibuf.el Mon Aug 13 09:15:11 2007 +0200 @@ -262,8 +262,8 @@ (if (not multi-word) (define-key minibuffer-local-map "\r" 'vm-minibuffer-complete-word-and-exit)) - ;; evade the XEmacs dialox box, yeccch. - (let ((should-use-dialog-box nil)) + ;; evade the XEmacs dialog box, yeccch. + (let ((use-dialog-box nil)) (read-string prompt)))) (defvar last-nonmenu-event) @@ -361,8 +361,8 @@ must-match initial history) "Like read-file-name, except HISTORY's value is unaltered." (let ((oldvalue (symbol-value history)) - ;; evade the XEmacs dialox box, yeccch. - (should-use-dialog-box nil)) + ;; evade the XEmacs dialog box, yeccch. + (use-dialog-box nil)) (unwind-protect (condition-case nil (read-file-name prompt dir default must-match initial history)
--- a/lisp/vm/vm-misc.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-misc.el Mon Aug 13 09:15:11 2007 +0200 @@ -104,6 +104,12 @@ (setq temp-buffer (generate-new-buffer "*vm-work*")) (set-buffer temp-buffer) (insert string) + ;; correct for VM's uses of this function--- + ;; writing out message separators + (setq buffer-file-type nil) + ;; Tell XEmacs/MULE to pick the correct newline conversion. + (and (fboundp 'set-file-coding-system) + (set-file-coding-system 'no-conversion nil)) (write-region (point-min) (point-max) where t 'quiet)) (and temp-buffer (kill-buffer temp-buffer)))))) @@ -269,6 +275,7 @@ (if hack-addresses (nth 1 (funcall vm-chop-full-name-function (car list))) (car list)) + sym-string (or sym-string "-unparseable-garbage-") sym (intern sym-string hashtable)) (if (boundp sym) (and all (setcar (symbol-value sym) nil)) @@ -376,6 +383,11 @@ (vm-multiple-frames-possible-p) (featurep 'toolbar))) +(defun vm-multiple-fonts-possible-p () + (or (eq window-system 'x) + (and (fboundp 'device-type) + (eq (device-type) 'x)))) + (defun vm-run-message-hook (message &optional hook-variable) (save-excursion (set-buffer (vm-buffer-of message)) @@ -559,7 +571,7 @@ (vm-extent-end-position e)))) (while props (vm-set-extent-property ee (car props) (car (cdr props))) - (setq props (cdr props))))) + (setq props (cdr (cdr props)))))) (defun vm-make-tempfile-name () (let ((done nil) (pid (emacs-pid)) filename) @@ -599,6 +611,11 @@ (set-buffer buffer) (set var value))) +(defun vm-buffer-variable-value (buffer var) + (save-excursion + (set-buffer buffer) + (symbol-value var))) + (defsubst vm-with-string-as-temp-buffer (string function) (let ((work-buffer nil)) (unwind-protect @@ -609,3 +626,54 @@ (funcall function) (buffer-string)) (and work-buffer (kill-buffer work-buffer))))) + +(defmacro vm-with-virtual-selector-variables (&rest forms) + (append '(let ((any 'vm-vs-any) + (and 'vm-vs-and) + (or 'vm-vs-or) + (not 'vm-vs-not) + (header 'vm-vs-header) + (label 'vm-vs-label) + (text 'vm-vs-text) + (recipient 'vm-vs-recipient) + (author 'vm-vs-author) + (subject 'vm-vs-subject) + (sent-before 'vm-vs-sent-before) + (sent-after 'vm-vs-sent-after) + (more-chars-than 'vm-vs-more-chars-than) + (less-chars-than 'vm-vs-less-chars-than) + (more-lines-than 'vm-vs-more-lines-than) + (less-lines-than 'vm-vs-less-lines-than) + (new 'vm-vs-new) + (unread 'vm-vs-unread) + (read 'vm-vs-read) + (deleted 'vm-vs-deleted) + (replied 'vm-vs-replied) + (forwarded 'vm-vs-forwarded) + (filed 'vm-vs-filed) + (written 'vm-vs-written) + (edited 'vm-vs-edited) + (marked 'vm-vs-marked))) + forms)) + +(defun vm-string-assoc (elt list) + (let ((case-fold-search t) + (found nil) + (elt (regexp-quote elt))) + (while (and list (not found)) + (if (and (equal 0 (string-match elt (car (car list)))) + (= (match-end 0) (length (car (car list))))) + (setq found t) + (setq list (cdr list)))) + (car list))) + +(defun vm-string-member (elt list) + (let ((case-fold-search t) + (found nil) + (elt (regexp-quote elt))) + (while (and list (not found)) + (if (and (equal 0 (string-match elt (car list))) + (= (match-end 0) (length (car list)))) + (setq found t) + (setq list (cdr list)))) + list))
--- a/lisp/vm/vm-mouse.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-mouse.el Mon Aug 13 09:15:11 2007 +0200 @@ -213,6 +213,11 @@ (erase-buffer) (insert (if new-window "newwin" "goto") ?\n) (insert url ?\n) + ;; newline convention used should be the local + ;; one, whatever that is. + (setq buffer-file-type nil) + (and (fboundp 'set-file-coding-system) + (set-file-coding-system 'no-conversion nil)) (write-region (point-min) (point-max) (concat "/tmp/Mosaic." pid) nil 0) @@ -328,13 +333,14 @@ (let ((vm-mutable-frames t)) (vm-delete-windows-or-frames-on (current-buffer)))) (setq vm-mouse-read-file-name-return-value - (vm-keyboard-read-file-name - vm-mouse-read-file-name-prompt - vm-mouse-read-file-name-dir - vm-mouse-read-file-name-default - vm-mouse-read-file-name-must-match - vm-mouse-read-file-name-initial - vm-mouse-read-file-name-history)) + (save-excursion + (vm-keyboard-read-file-name + vm-mouse-read-file-name-prompt + vm-mouse-read-file-name-dir + vm-mouse-read-file-name-default + vm-mouse-read-file-name-must-match + vm-mouse-read-file-name-initial + vm-mouse-read-file-name-history))) (vm-mouse-read-file-name-quit-handler t)) (quit (vm-mouse-read-file-name-quit-handler)))) ((file-directory-p string)
--- a/lisp/vm/vm-page.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-page.el Mon Aug 13 09:15:11 2007 +0200 @@ -116,13 +116,19 @@ (let ((direction (prefix-numeric-value arg)) (w (selected-window))) (condition-case error-data - (progn - (if (and (> direction 0) - (pos-visible-in-window-p - (vm-text-end-of (car vm-message-pointer)))) - (signal 'end-of-buffer nil) - (scroll-up arg)) - nil ) + (progn (scroll-up arg) nil) +;; this looks like it should work, but doesn't because the +;; redisplay code is schizophrenic when it comes to updates. A +;; window position may no longer be visible but +;; pos-visible-in-window-p will still say it is because it was +;; visible before some window size change happened. +;; (progn +;; (if (and (> direction 0) +;; (pos-visible-in-window-p +;; (vm-text-end-of (car vm-message-pointer)))) +;; (signal 'end-of-buffer nil) +;; (scroll-up arg)) +;; nil ) (error (if (or (and (< direction 0) (> (point-min) (vm-text-of (car vm-message-pointer)))) @@ -551,7 +557,9 @@ (defun vm-show-current-message () (and vm-display-using-mime vm-auto-decode-mime-messages - (not vm-mime-decoded) + (if vm-mail-buffer + (not (vm-buffer-variable-value vm-mail-buffer 'vm-mime-decoded)) + (not vm-mime-decoded)) (not (vm-mime-plain-message-p (car vm-message-pointer))) (vm-decode-mime-message)) (vm-save-buffer-excursion
--- a/lisp/vm/vm-pop.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-pop.el Mon Aug 13 09:15:11 2007 +0200 @@ -24,19 +24,125 @@ (let ((process nil) (folder-type vm-folder-type) (saved-password t) + (m-per-session vm-pop-messages-per-session) + (b-per-session vm-pop-bytes-per-session) (handler (and (fboundp 'find-file-name-handler) (condition-case () (find-file-name-handler source 'vm-pop-move-mail) (wrong-number-of-arguments (find-file-name-handler source))))) (popdrop (vm-safe-popdrop-string source)) - greeting timestamp n message-count - host port auth user pass source-list process-buffer) + mailbox-count mailbox-size message-size response + n retrieved retrieved-bytes process-buffer) (unwind-protect (catch 'done (if handler (throw 'done (funcall handler 'vm-pop-move-mail source destination))) + (setq process (vm-pop-make-session source)) + (or process (throw 'done nil)) + (setq process-buffer (process-buffer process)) + (save-excursion + (set-buffer process-buffer) + (setq vm-folder-type (or folder-type vm-default-folder-type)) + ;; find out how many messages are in the box. + (vm-pop-send-command process "STAT") + (setq response (vm-pop-read-stat-response process) + mailbox-count (nth 0 response) + mailbox-size (nth 1 response)) + ;; forget it if the command fails + ;; or if there are no messages present. + (if (or (null mailbox-count) + (< mailbox-count 1)) + (throw 'done nil)) + ;; loop through the maildrop retrieving and deleting + ;; messages as we go. + (setq n 1 retrieved 0 retrieved-bytes 0) + (while (and (<= n mailbox-count) + (or (not (natnump m-per-session)) + (< retrieved m-per-session)) + (or (not (natnump b-per-session)) + (< retrieved-bytes b-per-session))) + (if (or vm-pop-max-message-size + b-per-session) + (progn + (vm-pop-send-command process (format "LIST %d" n)) + (setq message-size + (vm-pop-read-list-response process)))) + (if (and (integerp vm-pop-max-message-size) + (> message-size vm-pop-max-message-size) + (progn + (setq response + (if vm-pop-ok-to-ask + (vm-pop-ask-about-large-message process + message-size + n) + 'skip)) + (not (eq response 'retrieve)))) + (if (eq response 'delete) + (progn + (message "Deleting message %d..." n) + (vm-pop-send-command process (format "DELE %d" n)) + (and (null (vm-pop-read-response process)) + (throw 'done (not (equal retrieved 0))))) + (if vm-pop-ok-to-ask + (message "Skipping message %d..." n) + (message "Skipping message %d in %s, too large (%d > %d)..." + n popdrop message-size vm-pop-max-message-size))) + (message "Retrieving message %d (of %d) from %s..." + n mailbox-count popdrop) + (vm-pop-send-command process (format "RETR %d" n)) + (and (null (vm-pop-read-response process)) + (throw 'done (not (equal retrieved 0)))) + (and (null (vm-pop-retrieve-to-crashbox process destination)) + (throw 'done (not (equal retrieved 0)))) + (vm-increment retrieved) + (and b-per-session + (setq retrieved-bytes (+ retrieved-bytes message-size))) + (vm-pop-send-command process (format "DELE %d" n)) + ;; DELE can't fail but Emacs or this code might + ;; blow a gasket and spew filth down the + ;; connection, so... + (and (null (vm-pop-read-response process)) + (throw 'done (not (equal retrieved 0))))) + (vm-increment n)) + (not (equal retrieved 0)) )) + (if process + (vm-pop-end-session process))))) + +(defun vm-pop-check-mail (source) + (let ((process nil) + (handler (and (fboundp 'find-file-name-handler) + (condition-case () + (find-file-name-handler source 'vm-pop-check-mail) + (wrong-number-of-arguments + (find-file-name-handler source))))) + response) + (unwind-protect + (save-excursion + (catch 'done + (if handler + (throw 'done + (funcall handler 'vm-pop-check-mail source))) + (setq process (vm-pop-make-session source)) + (or process (throw 'done nil)) + (set-buffer (process-buffer process)) + (vm-pop-send-command process "STAT") + (setq response (vm-pop-read-stat-response process)) + (if (null response) + nil + (not (equal 0 (car response)))))) + (and process (vm-pop-end-session process))))) + +(defun vm-pop-make-session (source) + (let ((process-to-shutdown nil) + process + (saved-password t) + (popdrop (vm-safe-popdrop-string source)) + greeting timestamp + host port auth user pass source-list process-buffer) + (unwind-protect + (catch 'done ;; parse the maildrop (setq source-list (vm-parse source "\\([^:]+\\):?") host (nth 0 source-list) @@ -67,16 +173,22 @@ (progn (setq pass (car (cdr (assoc source vm-pop-passwords)))) (if (null pass) - (setq pass - (vm-read-password - (format "POP password for %s: " - popdrop)) - vm-pop-passwords (cons (list source pass) - vm-pop-passwords) - saved-password t)))) + (if (null vm-pop-ok-to-ask) + (progn (message "Need password for %s" popdrop) + (throw 'done nil)) + (setq pass + (vm-read-password + (format "POP password for %s: " + popdrop)) + vm-pop-passwords (cons (list source pass) + vm-pop-passwords) + saved-password t))))) ;; get the trace buffer (setq process-buffer (get-buffer-create (format "trace of POP session to %s" host))) + ;; Tell XEmacs/MULE not to mess with the text. + (and (fboundp 'set-file-coding-system) + (set-file-coding-system 'binary t)) ;; clear the trace buffer of old output (save-excursion (set-buffer process-buffer) @@ -84,14 +196,15 @@ ;; open the connection to the server (setq process (open-network-stream "POP" process-buffer host port)) (and (null process) (throw 'done nil)) - (set-process-filter process 'vm-pop-process-filter) + (process-kill-without-query process) (save-excursion (set-buffer process-buffer) (make-local-variable 'vm-pop-read-point) - (setq vm-pop-read-point (point-min) - vm-folder-type (or folder-type vm-default-folder-type)) - (and (null (setq greeting (vm-pop-read-response process t))) - (throw 'done nil)) + (setq vm-pop-read-point (point-min)) + (if (null (setq greeting (vm-pop-read-response process t))) + (progn (delete-process process) + (throw 'done nil))) + (setq process-to-shutdown process) ;; authentication (cond ((equal auth "pass") (vm-pop-send-command process (format "USER %s" user)) @@ -118,7 +231,7 @@ (if (null timestamp) (progn (goto-char (point-max)) - (insert "<<< ooops, no timestamp found in greeting! >>>\n") + (insert-before-markers "<<< ooops, no timestamp found in greeting! >>>\n") (throw 'done nil))) (vm-pop-send-command process @@ -128,51 +241,25 @@ (and (null (vm-pop-read-response process)) (throw 'done nil))) (t (error "Don't know how to authenticate with %s" auth))) - ;; find out how many messages are in the box. - (vm-pop-send-command process "STAT") - (setq message-count (vm-pop-read-stat-response process)) - ;; forget it if the command fails - ;; or if there are no messages present. - (if (or (null message-count) - (< message-count 1)) - (throw 'done nil)) - ;; loop through the maildrop retrieving and deleting - ;; messages as we go. - (setq n 1) - (while (<= n message-count) - (vm-unsaved-message "Retrieving message %d (of %d) from %s..." - n message-count popdrop) - (vm-pop-send-command process (format "RETR %d" n)) - (and (null (vm-pop-read-response process)) - (throw 'done (not (equal n 1)))) - (and (null (vm-pop-retrieve-to-crashbox process destination)) - (throw 'done (not (equal n 1)))) - (vm-pop-send-command process (format "DELE %d" n)) - ;; DELE can't fail but Emacs or this code might - ;; blow a gasket and spew filth down the - ;; connection, so... - (and (null (vm-pop-read-response process)) - (throw 'done (not (equal n 1)))) - (vm-increment n)) - t )) - (if process - (save-excursion - (set-buffer (process-buffer process)) - (vm-pop-send-command process "QUIT") - (vm-pop-read-response process) - (delete-process process)))))) + (setq process-to-shutdown nil) + process )) + (if process-to-shutdown + (vm-pop-end-session process-to-shutdown))))) -(defun vm-pop-process-filter (process output) +(defun vm-pop-end-session (process) (save-excursion (set-buffer (process-buffer process)) - (goto-char (point-max)) - (insert output))) + (vm-pop-send-command process "QUIT") + (vm-pop-read-response process) + (if (fboundp 'add-async-timeout) + (add-async-timeout 2 'delete-process process) + (run-at-time 2 nil 'delete-process process)))) (defun vm-pop-send-command (process command) (goto-char (point-max)) (if (= (aref command 0) ?P) - (insert "PASS <omitted>\r\n") - (insert command "\r\n")) + (insert-before-markers "PASS <omitted>\r\n") + (insert-before-markers command "\r\n")) (setq vm-pop-read-point (point)) (process-send-string process command) (process-send-string process "\r\n")) @@ -193,16 +280,72 @@ (buffer-substring (point) match-end) t )))) +(defun vm-pop-read-past-dot-sentinel-line (process) + (let ((case-fold-search nil)) + (goto-char vm-pop-read-point) + (while (not (search-forward "^.\r\n" nil 0)) + (beginning-of-line) + ;; save-excursion doesn't work right + (let ((opoint (point))) + (accept-process-output process) + (goto-char opoint))) + (setq vm-pop-read-point (point)))) + (defun vm-pop-read-stat-response (process) + (let ((response (vm-pop-read-response process t)) + list) + (setq list (vm-parse response "\\([^ ]+\\) *")) + (list (string-to-int (nth 1 list)) (string-to-int (nth 2 list))))) + +(defun vm-pop-read-list-response (process) (let ((response (vm-pop-read-response process t))) - (string-to-int (nth 1 (vm-parse response "\\([^ ]+\\) *"))))) + (string-to-int (nth 2 (vm-parse response "\\([^ ]+\\) *"))))) + +(defun vm-pop-ask-about-large-message (process size n) + (let ((work-buffer nil) + (pop-buffer (current-buffer)) + start end) + (unwind-protect + (save-excursion + (save-window-excursion + (vm-pop-send-command process (format "TOP %d %d" n 0)) + (if (vm-pop-read-response process) + (progn + (setq start vm-pop-read-point) + (vm-pop-read-past-dot-sentinel-line process) + (setq end vm-pop-read-point) + (setq work-buffer (generate-new-buffer "*pop-glop*")) + (set-buffer work-buffer) + (insert-buffer-substring pop-buffer start end) + (forward-line -1) + (delete-region (point) (point-max)) + (vm-pop-cleanup-region (point-min) (point-max)) + (vm-display-buffer work-buffer) + (setq minibuffer-scroll-window (selected-window)) + (goto-char (point-min)) + (if (re-search-forward "^Received:" nil t) + (progn + (goto-char (match-beginning 0)) + (vm-reorder-message-headers + nil vm-visible-headers + vm-invisible-header-regexp))) + (set-window-point (selected-window) (point)))) + (if (y-or-n-p (format "Message %d, size = %d, retrieve? " n size)) + 'retrieve + (if (y-or-n-p (format "Delete message %d from popdrop? " n size)) + 'delete + 'skip)))) + (and work-buffer (kill-buffer work-buffer))))) (defun vm-pop-retrieve-to-crashbox (process crash) (let ((start vm-pop-read-point) end) (goto-char start) - (while (not (re-search-forward "^\\.\r\n" nil t)) - (accept-process-output process) - (goto-char start)) + (while (not (re-search-forward "^\\.\r\n" nil 0)) + (beginning-of-line) + ;; save-excursion doesn't work right + (let ((opoint (point))) + (accept-process-output process) + (goto-char opoint))) (setq vm-pop-read-point (point-marker)) (goto-char (match-beginning 0)) (setq end (point-marker))
--- a/lisp/vm/vm-reply.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-reply.el Mon Aug 13 09:15:11 2007 +0200 @@ -291,7 +291,7 @@ (vm-headers-of message) (vm-text-of message)) (cond ((vm-mime-types-match "multipart" type) - (setq parts (vm-mm-layout-parts o))) + (setq parts (copy-sequence (vm-mm-layout-parts o)))) (t (setq parts (list o)))) (while parts (cond ((vm-mime-text-type-p (car parts)) @@ -301,8 +301,15 @@ ;; just dump the raw bits (vm-mime-insert-mime-body (car parts)) (vm-mime-transfer-decode-region (car parts) - start (point))))) - (setq parts (cdr parts))) + start (point))) + (setq parts (cdr parts))) + ((vm-mime-composite-type-p + (car (vm-mm-layout-type (car parts)))) + (setq parts (nconc (copy-sequence + (vm-mm-layout-parts + (car parts))) + (cdr parts)))) + (t (setq parts (cdr parts))))) (setq end (point-marker))) (set-buffer (vm-buffer-of message)) (save-restriction @@ -650,7 +657,7 @@ (mail-text) (vm-mime-attach-object b "multipart/digest" (list (concat "boundary=\"" - boundary "\"")) t) + boundary "\"")) nil t) (add-hook 'kill-buffer-hook (list 'lambda () (list 'if (list 'eq mail-buffer '(current-buffer)) @@ -862,7 +869,7 @@ (mail-text) (vm-mime-attach-object b "multipart/digest" (list (concat "boundary=\"" - boundary "\"")) t) + boundary "\"")) nil t) (add-hook 'kill-buffer-hook (list 'lambda () (list 'if (list 'eq mail-buffer '(current-buffer)) @@ -955,7 +962,8 @@ ;; do it only once. (if (not vm-mail-mode-map-parented) (cond ((fboundp 'set-keymap-parents) - (set-keymap-parents vm-mail-mode-map (list mail-mode-map))) + (set-keymap-parents vm-mail-mode-map (list mail-mode-map)) + (setq vm-mail-mode-map-parented t)) ((consp mail-mode-map) (nconc vm-mail-mode-map mail-mode-map) (setq vm-mail-mode-map-parented t))))
--- a/lisp/vm/vm-save.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-save.el Mon Aug 13 09:15:11 2007 +0200 @@ -35,7 +35,8 @@ (let (header alist tuple-list) (setq alist auto-folder-alist) (while alist - (setq header (vm-get-header-contents (car mp) (car (car alist)))) + (setq header (vm-get-header-contents (car mp) (car (car alist)) + ", ")) (if (null header) () (setq tuple-list (cdr (car alist)))
--- a/lisp/vm/vm-startup.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-startup.el Mon Aug 13 09:15:11 2007 +0200 @@ -61,7 +61,9 @@ (expand-file-name vm-folder-directory)) default-directory)) (inhibit-local-variables t) - (enable-local-variables nil)) + (enable-local-variables nil) + ;; for XEmacs/Mule + (overriding-file-coding-system 'no-conversion)) (vm-unsaved-message "Reading %s..." file) (prog1 (find-file-noselect file) ;; update folder history @@ -71,6 +73,27 @@ (cons item vm-folder-history)))) (vm-unsaved-message "Reading %s... done" file)))))))) (set-buffer folder-buffer) + ;; for XEmacs/MULE + ;; + ;; If the file coding system is not a no-conversion variant, + ;; make it so by encoding all the text, then setting + ;; the file coding system and decoding it. + ;; This is only possible if a file is visited and vm-mode + ;; is run on it afterwards. + (defvar file-coding-system) + (if (and (fboundp 'get-coding-system) + (not (eq file-coding-system + (get-coding-system 'no-conversion-unix))) + (not (eq file-coding-system + (get-coding-system 'no-conversion-dos))) + (not (eq file-coding-system + (get-coding-system 'no-conversion-mac))) + (not (eq file-coding-system + (get-coding-system 'binary)))) + (progn + (encode-coding-region (point-min) (point-max) file-coding-system) + (set-file-coding-system 'no-conversion nil) + (decode-coding-region (point-min) (point-max) file-coding-system))) (vm-check-for-killed-summary) (vm-check-for-killed-presentation) ;; If the buffer's not modified then we know that there can be no @@ -200,7 +223,7 @@ (progn (vm-unsaved-message "Checking for new mail for %s..." (or buffer-file-name (buffer-name))) - (if (and (vm-get-spooled-mail) (vm-assimilate-new-messages t)) + (if (and (vm-get-spooled-mail t) (vm-assimilate-new-messages t)) (progn (setq totals-blurb (vm-emit-totals-blurb)) (if (vm-thoughtfully-select-message) @@ -210,12 +233,7 @@ ;; Display copyright and copying info unless ;; user says no. - ;; Check this-command so we don't make the user wait if - ;; they call vm non-interactively from some other program. - (if (and (not vm-startup-message-displayed) - (or (memq this-command '(vm vm-visit-folder)) - ;; for emacs -f vm - (null last-command))) + (if (and (interactive-p) (not vm-startup-message-displayed)) (progn (vm-display-startup-message) (if (not (input-pending-p)) @@ -251,7 +269,7 @@ (defun vm-mode (&optional read-only) "Major mode for reading mail. -This is VM 6.13. +This is VM 6.15. Commands: h - summarize folder contents @@ -419,6 +437,7 @@ vm-highlighted-header-face vm-highlighted-header-regexp vm-honor-page-delimiters + vm-image-directory vm-in-reply-to-format vm-included-text-attribution-format vm-included-text-discard-header-regexp @@ -429,6 +448,7 @@ vm-jump-to-unread-messages vm-keep-crash-boxes vm-keep-sent-messages + vm-mail-check-interval vm-mail-header-from vm-mail-mode-hook vm-make-crash-box-name @@ -444,6 +464,8 @@ vm-mime-base64-encoder-program vm-mime-base64-encoder-switches vm-mime-button-face + vm-mime-charset-font-alist + vm-mime-default-face-charsets vm-mime-digest-discard-header-regexp vm-mime-digest-headers vm-mime-display-function @@ -459,7 +481,10 @@ vm-mutable-frames vm-mutable-windows vm-netscape-program + vm-pop-bytes-per-session + vm-pop-max-message-size vm-pop-md5-program + vm-pop-messages-per-session vm-popup-menu-on-mouse-3 vm-preferences-file vm-preview-lines @@ -490,8 +515,8 @@ vm-send-using-mime vm-skip-deleted-messages vm-skip-read-messages + vm-spool-file-suffixes vm-spool-files - vm-spool-file-suffixes vm-startup-with-summary vm-strip-reply-headers vm-summary-arrow @@ -501,8 +526,8 @@ vm-summary-redo-hook vm-summary-show-threads vm-summary-thread-indent-level + vm-tale-is-an-idiot vm-temp-file-directory - vm-tale-is-an-idiot vm-trust-From_-with-Content-Length vm-undisplay-buffer-hook vm-unforwarded-header-regexp @@ -629,6 +654,8 @@ will not do anything. The entry point to vm-virtual-mode is vm-visit-virtual-folder.") +(defvar scroll-in-place) + (defun vm-visit-virtual-folder (folder-name &optional read-only) (interactive (let ((last-command last-command) @@ -661,6 +688,9 @@ vm-label-obarray (make-vector 29 0) vm-virtual-folder-definition (assoc folder-name vm-virtual-folder-alist)) + ;; scroll in place messes with scroll-up and this loses + (make-local-variable 'scroll-in-place) + (setq scroll-in-place nil) (vm-build-virtual-message-list nil) (use-local-map vm-mode-map) (and (vm-menu-support-possible-p) @@ -850,6 +880,7 @@ 'vm-highlight-url-face 'vm-highlighted-header-regexp 'vm-honor-page-delimiters + 'vm-image-directory 'vm-in-reply-to-format 'vm-included-text-attribution-format 'vm-included-text-discard-header-regexp @@ -865,6 +896,7 @@ 'vm-mail-hook 'vm-make-crash-box-name 'vm-make-spool-file-name + 'vm-mail-check-interval 'vm-mail-mode-hook 'vm-mime-8bit-composition-charset 'vm-mime-8bit-text-transfer-encoding @@ -877,6 +909,8 @@ 'vm-mime-base64-encoder-program 'vm-mime-base64-encoder-switches 'vm-mime-button-face + 'vm-mime-charset-font-alist + 'vm-mime-default-face-charsets 'vm-mime-digest-discard-header-regexp 'vm-mime-digest-headers 'vm-mime-display-function @@ -893,6 +927,9 @@ 'vm-mutable-frames 'vm-mutable-windows 'vm-netscape-program + 'vm-pop-bytes-per-session + 'vm-pop-max-message-size + 'vm-pop-messages-per-session 'vm-pop-md5-program 'vm-popup-menu-on-mouse-3 'vm-preferences-file @@ -988,8 +1025,21 @@ (error "VM %s must be run on Emacs 19.34 or a later version." vm-version)))) +(defun vm-set-debug-flags () + (or stack-trace-on-error + debug-on-error + (setq stack-trace-on-error + '( + wrong-type-argument + wrong-number-of-arguments + args-out-of-range + void-function + void-variable + )))) + (defun vm-session-initialization () (vm-check-emacs-version) + (vm-set-debug-flags) ;; If this is the first time VM has been run in this Emacs session, ;; do some necessary preparations. (if (or (not (boundp 'vm-session-beginning))
--- a/lisp/vm/vm-summary.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-summary.el Mon Aug 13 09:15:11 2007 +0200 @@ -295,7 +295,7 @@ (set-extent-endpoints vm-summary-overlay start end) (setq vm-summary-overlay (make-extent start end)) ;; the reason this isn't needed under FSF Emacs is - ;; that insert-before-marker also inserts before + ;; that insert-before-markers also inserts before ;; overlays! so a summary update of an entry just ;; before this overlay in the summary buffer won't ;; leak into the overlay, but it _will_ leak into an @@ -327,7 +327,9 @@ (while tokens (setq token (car tokens)) (cond ((stringp token) - (insert token)) + (if vm-display-using-mime + (insert (vm-decode-mime-encoded-words-in-string token)) + (insert token))) ((eq token 'number) (insert (vm-padded-number-of message))) ((eq token 'mark) @@ -444,6 +446,10 @@ (setq token ''mark) (setq sexp (cons (list 'vm-su-mark 'vm-su-message) sexp))))) + (cond ((and (not token) vm-display-using-mime) + (setcar sexp + (list 'vm-decode-mime-encoded-words-in-string + (car sexp))))) (cond ((and (not token) (match-beginning 1)) (setcar sexp (list 'vm-left-justify-string (car sexp) @@ -465,6 +471,10 @@ (substring format (match-beginning 4) (match-end 4))))))) + (cond ((and (not token) vm-display-using-mime) + (setcar sexp + (list 'vm-reencode-mime-encoded-words-in-string + (car sexp))))) (setq sexp-fmt (cons (if token "" "%s") (cons (substring format @@ -527,7 +537,20 @@ (concat (make-string (- width (length string)) ?\ ) string))) (defun vm-truncate-string (string width) - (cond ((<= (length string) width) + (cond +;; doesn't work because the width of wide chars such as the Kanji +;; glyphs as not even multiples of the default face's font width. +;; ((fboundp 'char-width) +;; (let ((i 0) +;; (lim (length string)) +;; (total 0)) +;; (while (and (< i lim) (<= total width)) +;; (setq total (+ total (char-width (aref string i))) +;; i (1+ i))) +;; (if (<= total width) +;; string +;; (substring string 0 (1- i))))) + ((<= (length string) width) string) ((< width 0) (substring string width)) @@ -811,7 +834,6 @@ (if (string-match "\\`\"\\([^\"]+\\)\"\\'" full-name) (setq full-name (substring full-name (match-beginning 1) (match-end 1)))) - (setq full-name (vm-decode-mime-encoded-words-maybe full-name)) (while (setq i (string-match "\n" full-name i)) (aset full-name i ?\ )) (vm-set-full-name-of m full-name) @@ -889,7 +911,6 @@ (if (string-match "\\`\"\\([^\"]+\\)\"\\'" full-name) (setq full-name (substring full-name (match-beginning 1) (match-end 1)))) - (setq full-name (vm-decode-mime-encoded-words-maybe full-name)) (while (setq i (string-match "\n" full-name i)) (aset full-name i ?\ )) (setq names (cons full-name names)) @@ -943,7 +964,6 @@ m (let ((subject (or (vm-get-header-contents m "Subject:" " ") "")) (i nil)) - (setq subject (vm-decode-mime-encoded-words-maybe subject)) (while (setq i (string-match "\n" subject i)) (aset subject i ?\ )) subject ))))
--- a/lisp/vm/vm-toolbar.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-toolbar.el Mon Aug 13 09:15:11 2007 +0200 @@ -66,6 +66,19 @@ (or (fboundp 'vm-toolbar-file-command) (fset 'vm-toolbar-file-command 'vm-save-message)) +(defvar vm-toolbar-getmail-button + [vm-toolbar-getmail-icon vm-toolbar-getmail-command + (vm-toolbar-mail-waiting-p) + "Retrieve spooled mail for the current folder.\n +The command `vm-toolbar-getmail-command' is run, which is normally +bound to `vm-get-new-mail'. +You can make this button run some other command by using a Lisp +s-expression like this one in your .vm file: + (fset 'vm-toolbar-getmail-command 'some-other-command)"]) +(defvar vm-toolbar-getmail-icon nil) +(or (fboundp 'vm-toolbar-getmail-command) + (fset 'vm-toolbar-getmail-command 'vm-get-new-mail)) + (defvar vm-toolbar-print-button [vm-toolbar-print-icon vm-toolbar-print-command @@ -254,6 +267,12 @@ (vm-select-folder-buffer) (memq major-mode '(vm-mode vm-virtual-mode)))) +(defun vm-toolbar-mail-waiting-p () + (save-excursion + (vm-check-for-killed-folder) + (vm-select-folder-buffer) + vm-spooled-mail-waiting)) + (fset 'vm-toolbar-can-help-p 'vm-toolbar-can-quit-p) (defun vm-toolbar-update-toolbar () @@ -263,6 +282,9 @@ (cond ((vm-toolbar-can-recover-p) (setq vm-toolbar-helper-command 'recover-file vm-toolbar-helper-icon vm-toolbar-recover-icon)) + ((vm-toolbar-mail-waiting-p) + (setq vm-toolbar-helper-command 'vm-get-new-mail + vm-toolbar-helper-icon vm-toolbar-getmail-icon)) ((vm-toolbar-can-decode-mime-p) (setq vm-toolbar-helper-command 'vm-decode-mime-message vm-toolbar-helper-icon vm-toolbar-decode-mime-icon)) @@ -386,6 +408,7 @@ "undelete-dn.xpm") '(vm-toolbar-autofile-icon "autofile-up.xpm" "autofile-dn.xpm" "autofile-dn.xpm") + '(vm-toolbar-getmail-icon "getmail-up.xpm" "getmail-dn.xpm" "getmail-dn.xpm") '(vm-toolbar-file-icon "file-up.xpm" "file-dn.xpm" "file-dn.xpm") '(vm-toolbar-reply-icon "reply-up.xpm" "reply-dn.xpm" "reply-dn.xpm") '(vm-toolbar-compose-icon "compose-up.xpm" "compose-dn.xpm" "compose-dn.xpm") @@ -405,6 +428,7 @@ "undelete-xx.xbm") (vm-toolbar-autofile-icon "autofile-up.xbm" "autofile-dn.xbm" "autofile-xx.xbm") + (vm-toolbar-getmail-icon "getmail-up.xbm" "getmail-dn.xbm" "getmail-xx.xbm") (vm-toolbar-file-icon "file-up.xbm" "file-dn.xbm" "file-xx.xbm") (vm-toolbar-reply-icon "reply-up.xbm" "reply-dn.xbm" "reply-xx.xbm") (vm-toolbar-compose-icon "compose-up.xbm" "compose-dn.xbm" "compose-xx.xbm")
--- a/lisp/vm/vm-vars.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-vars.el Mon Aug 13 09:15:11 2007 +0200 @@ -172,6 +172,35 @@ "*Program that reads a message on its standard input and writes an MD5 digest on its output.") +(defvar vm-pop-max-message-size nil + "*If VM is about to retrieve via POP a message larger than this size +(in bytes) it will ask the you whether it should retrieve the message. + +If VM is retrieving mail automatically because vm-auto-get-new-mail is +set to a numeric value then you will not be prompted about large messages. +This is to avoid prompting you while you're typing in another buffer. +In this case the large message will be skipped with a warning +message. + +A nil value for vm-pop-max-message-size means no size limit.") + +(defvar vm-pop-messages-per-session nil + "*Non-nil value should be a integer specifying how many messages to +retrieve per POP session. When you type 'g' to get new mail, VM +will only retrieve that many messages from any particular POP maildrop. +To retrieve more messages, type 'g' again. + +A nil value means there's no limit.") + +(defvar vm-pop-bytes-per-session nil + "*Non-nil value should be a integer specifying how many bytes to +retrieve per POP session. When you type 'g' to get new mail, VM +will only retrieve messages until the byte limit is reached on +any particular POP maildrop. To retrieve more messages, type 'g' +again. + +A nil value means there's no limit.") + (defvar vm-recognize-pop-maildrops "^[^:]+:[^:]+:[^:]+:[^:]+:[^:]+" "*Value if non-nil should be a regular expression that matches spool names found in vm-spool-files that should be considered POP @@ -189,6 +218,18 @@ other files. It should not disturb your editing, except perhaps for a pause while the check is being done.") +(defvar vm-mail-check-interval 300 + "*Numeric value specifies the number of seconds between checks +for new mail. The maildrops for all visited folders are checked. +The buffer local variable vm-spooled-mail-waiting is set non-nil +in the buffers of those folders that have mail waiting.") + +(defvar vm-spooled-mail-waiting nil + "Value is non-nil if there is mail waiting for the current folder. +This variable's value is local in all buffers. +VM maintains this variable, you should not set it.") +(make-variable-buffer-local 'vm-spooled-mail-waiting) + (defvar vm-default-folder-type (cond ((not (boundp 'system-configuration)) 'From_) @@ -514,6 +555,40 @@ If none of the parts can be displayed internally, behavior reverts to that of 'best.") +(defvar vm-mime-default-face-charsets '("us-ascii" "iso-8859-1") + "*List of character sets that can use the `default' face. +For other characters sets VM will have to create a new face and assign +a font to it that can be used to display that character set.") + +(defvar vm-mime-charset-font-alist nil + "*Assoc list of character sets and fonts that can be used to display them. +The format of the list is: + + ( (CHARSET . FONT) ...) + +CHARSET is a string naming a MIME registered character set such +as \"iso-8859-5\". Character set names should be specified in +lower case. + +FONT is a string naming a font that can be used to display CHARSET. + +An example setup might be: + + (setq vm-mime-charset-font-alist + '( + (\"iso-8859-7\" . \"-*-*-medium-r-normal--16-160-72-72-c-80-iso8859-7\") + ) + ) + +This variable is only useful for character sets whose characters +can all be encoded in single 8-bit bytes. Also multiple fonts +can only be displayed if you're running under a window system +e.g. X windows. So this variable will have no effect if you're +running Emacs on a tty. + +Note that under FSF Emacs any fonts you use must be the same size +as your default font. XEmacs does not have this limitation.") + (defvar vm-mime-button-face (cond ((fboundp 'find-face) (or (and (not (eq (device-type) 'tty)) (find-face 'gui-button-face) @@ -529,7 +604,12 @@ in a composition buffer. Composition buffers are assumed to use US-ASCII unless the buffer contains a byte with the high bit set. This variable specifies what character set VM should assume if -such a character is found.") +such a character is found. + +This variable is unused in XEmacs/MULE. Since multiple character +sets can be displayed in a single buffer under MULE, VM will map +the file coding system of the buffer to a single MIME character +that can display all the buffer's characters.") (defvar vm-mime-8bit-text-transfer-encoding 'quoted-printable "*Symbol specifying what kind of transfer encoding to use on 8bit @@ -537,8 +617,8 @@ through all mail gateways and mail transport software. MIME has two transfer encodings that convert 8-bit data to 7-bit for same transport. Quoted-printable leaves the text mostly readable even -if the recipent does not have a MIME-capable mail reader. BASE64 -is unreadable with a MIME-capable mail reader, unless your name +if the recipient does not have a MIME-capable mail reader. BASE64 +is unreadable without a MIME-capable mail reader, unless your name is U3BvY2s=. A value of 'quoted-printable, means to use quoted-printable encoding. @@ -557,8 +637,8 @@ ("\\.jpe?g" . "image/jpeg") ("\\.gif" . "image/gif") ("\\.png" . "image/png") - ("\\.tiff" . "image/tiff") - ("\\.htm?l" . "text/html") + ("\\.tiff?" . "image/tiff") + ("\\.html?" . "text/html") ("\\.au" . "audio/basic") ("\\.mpe?g" . "video/mpeg") ("\\.ps" . "application/postscript") @@ -728,7 +808,7 @@ A value of nil means never remove empty folders. A value that's not t or nil means ask before removing empty folders.") -(defvar vm-flush-interval t +(defvar vm-flush-interval 90 "*Non-nil value specifies how often VM flushes its cached internal data. A numeric value gives the number of seconds between flushes. A value of t means flush every time there is a change. @@ -1663,18 +1743,23 @@ when looking for a window that is already displaying a buffer that VM wants to display or undisplay.") +(defvar vm-image-directory + (expand-file-name (concat data-directory "vm/")) + "*Value specifies the directory VM should find its artwork.") + (defvar vm-use-toolbar '(next previous delete/undelete autofile file reply compose print visit quit nil help) "*Non-nil value causes VM to provide a toolbar interface. Value should be a list of symbols that will determine which -toolbar buttons will appears and in what order. Valid symbol +toolbar buttons will appear and in what order. Valid symbol value within the list are: autofile compose delete/undelete file + getmail help mime next @@ -1687,7 +1772,7 @@ If nil appears in the list, it should appear exactly once. All buttons after nil in the list will be displayed flushright in -top/bottom toolbars and flush bottom in left/right toolbars. +top/bottom toolbars and flushbottom in left/right toolbars. This variable only has meaning under XEmacs 19.12 and beyond. See also vm-toolbar-orientation to control where the toolbar is placed.") @@ -1699,8 +1784,7 @@ This variable only has meaning under XEmacs 19.12 and beyond.") -(defvar vm-toolbar-pixmap-directory - (expand-file-name (concat data-directory "vm/")) +(defvar vm-toolbar-pixmap-directory vm-image-directory "*Value specifies the directory VM should find its toolbar pixmaps.") (defvar vm-toolbar nil @@ -2336,14 +2420,6 @@ (define-key map "\C-c\C-y" 'vm-yank-message) (define-key map "\C-c\C-s" 'vm-mail-send) (define-key map "\C-c\C-c" 'vm-mail-send-and-exit) - (define-key map "\C-c\C-w" 'mail-signature) - (define-key map "\C-c\C-t" 'mail-text) - (define-key map "\C-c\C-q" 'mail-fill-yanked-message) - (define-key map "\C-c\C-f\C-t" 'mail-to) - (define-key map "\C-c\C-f\C-b" 'mail-bcc) - (define-key map "\C-c\C-f\C-s" 'mail-subject) - (define-key map "\C-c\C-f\C-c" 'mail-cc) - (define-key map "\C-c\C-f\C-f" 'mail-fcc) map ) "Keymap for VM Mail mode buffers.") @@ -2436,7 +2512,11 @@ (make-variable-buffer-local 'vm-saved-buffer-modified-p) (defvar vm-kept-mail-buffers nil) (defvar vm-inhibit-write-file-hook nil) -(defvar vm-chop-full-name-function 'vm-choose-chop-full-name-function) +;; used to choose between the default and +;; mail-extract-address-components but I don't see the utility of +;; it anymore. It tries to be too smart. +;;(defvar vm-chop-full-name-function 'vm-choose-chop-full-name-function) +(defvar vm-chop-full-name-function 'vm-default-chop-full-name) (defvar vm-session-beginning t) (defvar vm-init-file-loaded nil) (defvar vm-window-configurations nil) @@ -2698,6 +2778,7 @@ (vm-folder-type " (unrecognized folder type)" " (no messages)"))) + (vm-spooled-mail-waiting " Mail") (vm-message-list (" %[ " vm-ml-message-attributes-alist (vm-ml-labels ("; " vm-ml-labels)) " %] ") @@ -2753,6 +2834,7 @@ (make-variable-buffer-local 'vm-ml-message-marked) ;; to make the tanjed compiler shut up (defvar vm-pop-read-point nil) +(defvar vm-pop-ok-to-ask nil) (defvar vm-reply-list nil) (defvar vm-forward-list nil) (defvar vm-redistribute-list nil) @@ -2854,7 +2936,7 @@ (defvar vm-folder-garbage-alist nil) (make-variable-buffer-local 'vm-folder-garbage-alist) (defconst vm-mime-header-list '("MIME-Version:" "Content-")) -(defconst vm-mime-xemacs-mule-charset-alist +(defconst vm-mime-mule-charset-to-coding-alist '( ("us-ascii" no-conversion) ("iso-8859-1" no-conversion) @@ -2873,6 +2955,30 @@ ("iso-2022-kr" iso-2022-kr) ("euc-kr" iso-2022-kr) )) +(defvar vm-mime-mule-charset-to-charset-alist + '( + (latin-iso8859-1 "iso-8859-1") + (latin-iso8859-2 "iso-8859-2") + (latin-iso8859-3 "iso-8859-3") + (latin-iso8859-4 "iso-8859-4") + (cyrillic-iso8859-5 "iso-8859-5") + (arabic-iso8859-6 "iso-8859-6") + (greek-iso8859-7 "iso-8859-7") + (hebrew-iso8859-8 "iso-8859-8") + (latin-iso8859-9 "iso-8859-9") + (japanese-jisx0208 "iso-2022-jp") + (korean-ksc5601 "iso-2022-kr") + (chinese-gb2312 "iso-2022-jp") + (sisheng "iso-2022-jp") + (thai-tis620 "iso-2022-jp") + )) +(defvar vm-mime-mule-coding-to-charset-alist + '( + (iso-2022-8 "iso-2022-jp") + (iso-2022-7-unix "iso-2022-jp") + (iso-2022-7-dos "iso-2022-jp") + (iso-2022-7-mac "iso-2022-jp") + )) (defconst vm-mime-charset-completion-alist '( ("us-ascii")
--- a/lisp/vm/vm-version.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-version.el Mon Aug 13 09:15:11 2007 +0200 @@ -2,7 +2,7 @@ (provide 'vm-version) -(defconst vm-version "6.13" +(defconst vm-version "6.15" "Version number of VM.") (defun vm-version ()
--- a/lisp/vm/vm-virtual.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-virtual.el Mon Aug 13 09:15:11 2007 +0200 @@ -31,223 +31,195 @@ ;; ;; The messages in new-messages must all be in the same real folder. (defun vm-build-virtual-message-list (new-messages) - (let ((clauses (cdr vm-virtual-folder-definition)) - - (message-set (make-vector 311 0)) - (vbuffer (current-buffer)) - (mirrored vm-virtual-mirror) - (case-fold-search t) - (tail-cons (vm-last vm-message-list)) - (new-message-list nil) - - ;; selectors - (any 'vm-vs-any) - (and 'vm-vs-and) - (or 'vm-vs-or) - (not 'vm-vs-not) - (header 'vm-vs-header) - (label 'vm-vs-label) - (text 'vm-vs-text) - (recipient 'vm-vs-recipient) - (author 'vm-vs-author) - (subject 'vm-vs-subject) - (sent-before 'vm-vs-sent-before) - (sent-after 'vm-vs-sent-after) - (more-chars-than 'vm-vs-more-chars-than) - (less-chars-than 'vm-vs-less-chars-than) - (more-lines-than 'vm-vs-more-lines-than) - (less-lines-than 'vm-vs-less-lines-than) - (new 'vm-vs-new) - (unread 'vm-vs-unread) - (read 'vm-vs-read) - (deleted 'vm-vs-deleted) - (replied 'vm-vs-replied) - (forwarded 'vm-vs-forwarded) - (filed 'vm-vs-filed) - (written 'vm-vs-written) - (edited 'vm-vs-edited) - (marked 'vm-vs-marked) - - virtual location-vector - message mp folders folder - selectors sel-list selector arglist i - real-buffers-used) - ;; Since there is at most one virtual message in the folder - ;; buffer of a virtual folder, the location data vector (and - ;; the markers in it) of all virtual messages in a virtual - ;; folder is shared. We initialize the vector here if it - ;; hasn't been created already. - (if vm-message-list - (setq location-vector (vm-location-data-of (car vm-message-pointer))) - (setq i 0 - location-vector (make-vector vm-location-data-vector-length nil)) - (while (< i vm-location-data-vector-length) - (aset location-vector i (vm-marker nil)) - (vm-increment i))) - ;; To keep track of the messages in a virtual folder to - ;; prevent duplicates we create and maintain a set that - ;; contain all the real messages. - (setq mp vm-message-list) - (while mp - (intern (vm-message-id-number-of (vm-real-message-of (car mp))) - message-set) - (setq mp (cdr mp))) - ;; now select the messages - (save-excursion - (while clauses - (setq folders (car (car clauses)) - selectors (cdr (car clauses))) - (while folders - (setq folder (car folders)) - (and (stringp folder) - (setq folder (expand-file-name folder vm-folder-directory))) - (and (listp folder) - (setq folder (eval folder))) - (cond - ((null folder) - ;; folder was a s-expr which returned nil - ;; skip it - nil ) - ((and (stringp folder) (file-directory-p folder)) - (setq folders (nconc folders - (vm-delete-backup-file-names - (vm-delete-auto-save-file-names - (vm-delete-directory-file-names - (directory-files folder t nil))))))) - ((or (null new-messages) - ;; If we're assimilating messages into an - ;; existing virtual folder, only allow selectors - ;; that would be normally applied to this folder. - (and (bufferp folder) - (eq (vm-buffer-of (car new-messages)) folder)) - (and (stringp folder) - (eq (vm-buffer-of (car new-messages)) - ;; letter bomb protection - ;; set inhibit-local-variables to t for v18 Emacses - ;; set enable-local-variables to nil for newer Emacses - (let ((inhibit-local-variables t) - (enable-local-variables nil)) - (find-file-noselect folder))))) - (set-buffer (or (and (bufferp folder) folder) - (vm-get-file-buffer folder) - (find-file-noselect folder))) - (if (eq major-mode 'vm-virtual-mode) - (setq virtual t - real-buffers-used - (append vm-real-buffers real-buffers-used)) - (setq virtual nil) - (if (not (memq (current-buffer) real-buffers-used)) - (setq real-buffers-used (cons (current-buffer) - real-buffers-used))) - (if (not (eq major-mode 'vm-mode)) - (vm-mode))) - ;; change (sexpr) into ("/file" "/file2" ...) - ;; this assumes that there will never be (sexpr sexpr2) - ;; in a virtual folder spec. - (if (bufferp folder) - (if virtual - (setcar (car clauses) - (delq nil - (mapcar 'buffer-file-name vm-real-buffers))) - (if buffer-file-name - (setcar (car clauses) (list buffer-file-name))))) - ;; if new-messages non-nil use it instead of the - ;; whole message list - (setq mp (or new-messages vm-message-list)) - (while mp - (if (and (not (intern-soft - (vm-message-id-number-of - (vm-real-message-of (car mp))) - message-set)) - (if virtual - (save-excursion - (set-buffer - (vm-buffer-of - (vm-real-message-of - (car mp)))) - (apply 'vm-vs-or (car mp) selectors)) - (apply 'vm-vs-or (car mp) selectors))) - (progn - (intern - (vm-message-id-number-of - (vm-real-message-of (car mp))) + (vm-with-virtual-selector-variables + (let ((clauses (cdr vm-virtual-folder-definition)) + (message-set (make-vector 311 0)) + (vbuffer (current-buffer)) + (mirrored vm-virtual-mirror) + (case-fold-search t) + (tail-cons (vm-last vm-message-list)) + (new-message-list nil) + virtual location-vector + message mp folders folder + selectors sel-list selector arglist i + real-buffers-used) + ;; Since there is at most one virtual message in the folder + ;; buffer of a virtual folder, the location data vector (and + ;; the markers in it) of all virtual messages in a virtual + ;; folder is shared. We initialize the vector here if it + ;; hasn't been created already. + (if vm-message-list + (setq location-vector (vm-location-data-of (car vm-message-pointer))) + (setq i 0 + location-vector (make-vector vm-location-data-vector-length nil)) + (while (< i vm-location-data-vector-length) + (aset location-vector i (vm-marker nil)) + (vm-increment i))) + ;; To keep track of the messages in a virtual folder to + ;; prevent duplicates we create and maintain a set that + ;; contain all the real messages. + (setq mp vm-message-list) + (while mp + (intern (vm-message-id-number-of (vm-real-message-of (car mp))) + message-set) + (setq mp (cdr mp))) + ;; now select the messages + (save-excursion + (while clauses + (setq folders (car (car clauses)) + selectors (cdr (car clauses))) + (while folders + (setq folder (car folders)) + (and (stringp folder) + (setq folder (expand-file-name folder vm-folder-directory))) + (and (listp folder) + (setq folder (eval folder))) + (cond + ((null folder) + ;; folder was a s-expr which returned nil + ;; skip it + nil ) + ((and (stringp folder) (file-directory-p folder)) + (setq folders (nconc folders + (vm-delete-backup-file-names + (vm-delete-auto-save-file-names + (vm-delete-directory-file-names + (directory-files folder t nil))))))) + ((or (null new-messages) + ;; If we're assimilating messages into an + ;; existing virtual folder, only allow selectors + ;; that would be normally applied to this folder. + (and (bufferp folder) + (eq (vm-buffer-of (car new-messages)) folder)) + (and (stringp folder) + (eq (vm-buffer-of (car new-messages)) + ;; letter bomb protection + ;; set inhibit-local-variables to t for v18 Emacses + ;; set enable-local-variables to nil + ;; for newer Emacses + (let ((inhibit-local-variables t) + (enable-local-variables nil)) + (find-file-noselect folder))))) + (set-buffer (or (and (bufferp folder) folder) + (vm-get-file-buffer folder) + (find-file-noselect folder))) + (if (eq major-mode 'vm-virtual-mode) + (setq virtual t + real-buffers-used + (append vm-real-buffers real-buffers-used)) + (setq virtual nil) + (if (not (memq (current-buffer) real-buffers-used)) + (setq real-buffers-used (cons (current-buffer) + real-buffers-used))) + (if (not (eq major-mode 'vm-mode)) + (vm-mode))) + ;; change (sexpr) into ("/file" "/file2" ...) + ;; this assumes that there will never be (sexpr sexpr2) + ;; in a virtual folder spec. + (if (bufferp folder) + (if virtual + (setcar (car clauses) + (delq nil + (mapcar 'buffer-file-name vm-real-buffers))) + (if buffer-file-name + (setcar (car clauses) (list buffer-file-name))))) + ;; if new-messages non-nil use it instead of the + ;; whole message list + (setq mp (or new-messages vm-message-list)) + (while mp + (if (and (not (intern-soft + (vm-message-id-number-of + (vm-real-message-of (car mp))) + message-set)) + (if virtual + (save-excursion + (set-buffer + (vm-buffer-of + (vm-real-message-of + (car mp)))) + (apply 'vm-vs-or (car mp) selectors)) + (apply 'vm-vs-or (car mp) selectors))) + (progn + (intern + (vm-message-id-number-of + (vm-real-message-of (car mp))) message-set) - (setq message (copy-sequence - (vm-real-message-of (car mp)))) - (if mirrored - () - (vm-set-mirror-data-of - message - (make-vector vm-mirror-data-vector-length nil)) - (vm-set-virtual-messages-sym-of - message (make-symbol "<v>")) - (vm-set-virtual-messages-of message nil) - (vm-set-attributes-of - message - (make-vector vm-attributes-vector-length nil))) - (vm-set-location-data-of message location-vector) - (vm-set-softdata-of - message - (make-vector vm-softdata-vector-length nil)) - (vm-set-real-message-sym-of - message - (vm-real-message-sym-of (car mp))) - (vm-set-message-type-of message vm-folder-type) - (vm-set-message-id-number-of message - vm-message-id-number) - (vm-increment vm-message-id-number) - (vm-set-buffer-of message vbuffer) - (vm-set-reverse-link-sym-of message (make-symbol "<--")) - (vm-set-reverse-link-of message tail-cons) - (if (null tail-cons) - (setq new-message-list (list message) - tail-cons new-message-list) - (setcdr tail-cons (list message)) - (if (null new-message-list) - (setq new-message-list (cdr tail-cons))) - (setq tail-cons (cdr tail-cons))))) - (setq mp (cdr mp))))) - (setq folders (cdr folders))) - (setq clauses (cdr clauses)))) -; this doesn't need to work currently, but it might someday -; (if virtual -; (setq real-buffers-used (vm-delete-duplicates real-buffers-used))) - (vm-increment vm-modification-counter) - ;; Until this point the user doesn't really have a virtual - ;; folder, as the virtual messages haven't been linked to the - ;; real messages, virtual buffers to the real buffers, and no - ;; message list has been installed. - ;; - ;; Now we tie it all together, with this section of code being - ;; uninterruptible. - (let ((inhibit-quit t) - (label-obarray vm-label-obarray)) - (if (null vm-real-buffers) - (setq vm-real-buffers real-buffers-used)) - (save-excursion - (while real-buffers-used - (set-buffer (car real-buffers-used)) - ;; inherit the global label lists of all the associated - ;; real folders. - (mapatoms (function (lambda (x) (intern (symbol-name x) - label-obarray))) - vm-label-obarray) - (if (not (memq vbuffer vm-virtual-buffers)) - (setq vm-virtual-buffers (cons vbuffer vm-virtual-buffers))) - (setq real-buffers-used (cdr real-buffers-used)))) - (setq mp new-message-list) - (while mp - (vm-set-virtual-messages-of - (vm-real-message-of (car mp)) - (cons (car mp) (vm-virtual-messages-of (car mp)))) - (setq mp (cdr mp))) - (if vm-message-list - (progn - (vm-set-summary-redo-start-point new-message-list) - (vm-set-numbering-redo-start-point new-message-list)) - (vm-set-summary-redo-start-point t) - (vm-set-numbering-redo-start-point t) - (setq vm-message-list new-message-list))))) + (setq message (copy-sequence + (vm-real-message-of (car mp)))) + (if mirrored + () + (vm-set-mirror-data-of + message + (make-vector vm-mirror-data-vector-length nil)) + (vm-set-virtual-messages-sym-of + message (make-symbol "<v>")) + (vm-set-virtual-messages-of message nil) + (vm-set-attributes-of + message + (make-vector vm-attributes-vector-length nil))) + (vm-set-location-data-of message location-vector) + (vm-set-softdata-of + message + (make-vector vm-softdata-vector-length nil)) + (vm-set-real-message-sym-of + message + (vm-real-message-sym-of (car mp))) + (vm-set-message-type-of message vm-folder-type) + (vm-set-message-id-number-of message + vm-message-id-number) + (vm-increment vm-message-id-number) + (vm-set-buffer-of message vbuffer) + (vm-set-reverse-link-sym-of message (make-symbol "<--")) + (vm-set-reverse-link-of message tail-cons) + (if (null tail-cons) + (setq new-message-list (list message) + tail-cons new-message-list) + (setcdr tail-cons (list message)) + (if (null new-message-list) + (setq new-message-list (cdr tail-cons))) + (setq tail-cons (cdr tail-cons))))) + (setq mp (cdr mp))))) + (setq folders (cdr folders))) + (setq clauses (cdr clauses)))) + ;; this doesn't need to work currently, but it might someday + ;; (if virtual + ;; (setq real-buffers-used (vm-delete-duplicates real-buffers-used))) + (vm-increment vm-modification-counter) + ;; Until this point the user doesn't really have a virtual + ;; folder, as the virtual messages haven't been linked to the + ;; real messages, virtual buffers to the real buffers, and no + ;; message list has been installed. + ;; + ;; Now we tie it all together, with this section of code being + ;; uninterruptible. + (let ((inhibit-quit t) + (label-obarray vm-label-obarray)) + (if (null vm-real-buffers) + (setq vm-real-buffers real-buffers-used)) + (save-excursion + (while real-buffers-used + (set-buffer (car real-buffers-used)) + ;; inherit the global label lists of all the associated + ;; real folders. + (mapatoms (function (lambda (x) (intern (symbol-name x) + label-obarray))) + vm-label-obarray) + (if (not (memq vbuffer vm-virtual-buffers)) + (setq vm-virtual-buffers (cons vbuffer vm-virtual-buffers))) + (setq real-buffers-used (cdr real-buffers-used)))) + (setq mp new-message-list) + (while mp + (vm-set-virtual-messages-of + (vm-real-message-of (car mp)) + (cons (car mp) (vm-virtual-messages-of (car mp)))) + (setq mp (cdr mp))) + (if vm-message-list + (progn + (vm-set-summary-redo-start-point new-message-list) + (vm-set-numbering-redo-start-point new-message-list)) + (vm-set-summary-redo-start-point t) + (vm-set-numbering-redo-start-point t) + (setq vm-message-list new-message-list)))))) (defun vm-create-virtual-folder (selector &optional arg read-only) "Create a new virtual folder from messages in the current folder.
--- a/lisp/vm/vm-window.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/vm/vm-window.el Mon Aug 13 09:15:11 2007 +0200 @@ -131,6 +131,9 @@ (unwind-protect (progn (set-buffer (setq work-buffer (get-buffer-create "*vm-wconfig*"))) + ;; for XEmacs/MULE + (and (fboundp 'set-file-coding-system) + (set-file-coding-system 'no-conversion)) (erase-buffer) (print vm-window-configurations (current-buffer)) (write-region (point-min) (point-max) file nil 0))
--- a/lisp/w3/ChangeLog Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/w3/ChangeLog Mon Aug 13 09:15:11 2007 +0200 @@ -1,5 +1,20 @@ +Sat Feb 15 15:35:15 1997 William M. Perry <wmperry@aventail.com> + +* w3-display.el (w3-display-node): use it. + +* w3-vars.el (w3-display-frames): New variable for whether to show 'frame' + documents as a list of the subelements. + +* w3.txi (Speech Properties): finished this chapter. +(Media Selection): ditto +(Time Units): ditto +(Angle Units): ditto +(Properties): Explanatory text at beginnign of section + Fri Feb 14 09:34:35 1997 William M. Perry <wmperry@aventail.com> +* Emacs-W3 3.0.59 released + * w3.txi: Lots of documentation about stylesheets, chapter layout changes.
--- a/lisp/w3/w3-display.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/w3/w3-display.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-display.el --- display engine v99999 ;; Author: wmperry -;; Created: 1997/02/14 17:51:17 -;; Version: 1.127 +;; Created: 1997/02/15 23:38:28 +;; Version: 1.128 ;; Keywords: faces, help, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -456,7 +456,7 @@ (progn (push (cons tag args) w3-display-open-element-stack) (push content content-stack) - (setq content (nth 2 node))))) + (setq content (nth 2 (, node)))))) (defmacro w3-display-handle-list-type () (` @@ -559,6 +559,10 @@ ) ) + (defmacro w3-display-progress-meter () + (` + (url-lazy-message "Drawing... %c" (aref "/|\\-" (random 4))))) + (defmacro w3-display-handle-end-break () (` (case (pop break-style) @@ -1216,7 +1220,7 @@ (save-restriction (narrow-to-region (point) (point)) (setq fill-column avgwidth - ;; inhibit-read-only t + inhibit-read-only t w3-last-fill-pos (point-min) i 0) ;; skip over columns that have leftover content @@ -1492,7 +1496,7 @@ (content-stack (list (list node))) (right-margin-stack (list fill-column)) (left-margin-stack (list 0)) - ;; (inhibit-read-only t) + (inhibit-read-only t) node insert-before insert-after @@ -1509,6 +1513,7 @@ (setq content (pop content-stack)) (pop w3-active-faces) (pop w3-active-voices) + (w3-display-progress-meter) (case (car (pop w3-display-open-element-stack)) ;; Any weird, post-display-of-content stuff for specific tags ;; goes here. Couldn't think of any better way to do this when we @@ -1541,6 +1546,7 @@ (w3-pop-all-face-info) ;; Handle the element's content (while content + (w3-display-progress-meter) (if (stringp (car content)) (w3-handle-string-content (pop content)) (setq node (pop content) @@ -1640,6 +1646,32 @@ (img ; inlined image (w3-handle-image) (w3-handle-empty-tag)) + (frameset + (if w3-display-frames + (w3-handle-content node) + (w3-handle-empty-tag))) + (frame + (let* ((href (or (w3-get-attribute 'src) + (w3-get-attribute 'href))) + (name (or (w3-get-attribute 'name) + (w3-get-attribute 'title) + (w3-get-attribute 'alt) + "Unknown frame name"))) + (w3-handle-content + (list tag args + (list + (list 'p nil + (list + (list 'a + (cons (cons 'href href) + args) + (list + "Fetch frame: " + name))))))))) + (noframes + (if w3-display-frames + (w3-handle-empty-tag) + (w3-handle-content node))) (script ; Scripts (w3-handle-empty-tag)) ((embed object) ; Embedded images/content @@ -1763,8 +1795,7 @@ (or w3-maximum-line-length (window-width))) fill-prefix "") - ;; (set (make-local-variable 'inhibit-read-only) t) - ) + (set (make-local-variable 'inhibit-read-only) t)) (w3-handle-content node) ) (*invisible
--- a/lisp/w3/w3-vars.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/w3/w3-vars.el Mon Aug 13 09:15:11 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-vars.el,v --- All variable definitions for emacs-w3 ;; Author: wmperry -;; Created: 1997/02/14 17:57:21 -;; Version: 1.89 +;; Created: 1997/02/15 23:38:52 +;; Version: 1.91 ;; Keywords: comm, help, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -30,7 +30,7 @@ ;;; Variable definitions for w3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defconst w3-version-number - (let ((x "p3.0.59")) + (let ((x "p3.0.60")) (if (string-match "State:[ \t\n]+.\\([^ \t\n]+\\)" x) (setq x (substring x (match-beginning 1) (match-end 1))) (setq x (substring x 1))) @@ -38,7 +38,7 @@ (function (lambda (x) (if (= x ?-) "." (char-to-string x)))) x "")) "Version # of w3-mode.") -(defconst w3-version-date (let ((x "1997/02/14 17:57:21")) +(defconst w3-version-date (let ((x "1997/02/15 23:38:52")) (if (string-match "Date: \\([^ \t\n]+\\)" x) (substring x (match-beginning 1) (match-end 1)) x)) @@ -80,6 +80,9 @@ (defvar w3-default-stylesheet nil "*The filename of the users default stylesheet.") +(defvar w3-display-frames nil + "*Fetch frames - not optimal.") + (defvar w3-do-incremental-display nil "*Whether to do incremental display of pages or not.")
--- a/lisp/x11/x-menubar.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/x11/x-menubar.el Mon Aug 13 09:15:11 2007 +0200 @@ -394,7 +394,7 @@ (redraw-modeline))))) :active font-lock-mode :style toggle - :selected fast-lock-mode] + :selected (and (boundp 'fast-lock-mode) fast-lock-mode)] ) ("Paren Highlighting" ["None" (paren-set-mode -1)
--- a/lisp/x11/x-misc.el Mon Aug 13 09:13:58 2007 +0200 +++ b/lisp/x11/x-misc.el Mon Aug 13 09:15:11 2007 +0200 @@ -75,5 +75,4 @@ (x-bogosity-check-resource name class type)) (x-get-resource name class type locale nil t)) - - +;;; x-misc.el ends here
--- a/man/ChangeLog Mon Aug 13 09:13:58 2007 +0200 +++ b/man/ChangeLog Mon Aug 13 09:15:11 2007 +0200 @@ -1,3 +1,7 @@ +Wed Feb 19 17:57:27 1997 Steven L Baur <steve@altair.xemacs.org> + + * Makefile (auctex): New subdirectory target. + Wed Feb 12 12:30:27 1997 Yotam Medini <yotam_medini@tmai.com> * mule/languages.texi: Correct typo.
--- a/man/Makefile Mon Aug 13 09:13:58 2007 +0200 +++ b/man/Makefile Mon Aug 13 09:15:11 2007 +0200 @@ -26,7 +26,7 @@ .SUFFIXES: .info .texi .dvi # Subdirectories to make recursively. -SUBDIR = xemacs lispref new-users-guide internals tm +SUBDIR = xemacs lispref new-users-guide internals tm auctex ../info/%.info : %.texi makeinfo -o $@ $< @@ -54,6 +54,8 @@ cd $@ && $(MAKE) $(MFLAGS) tm: FORCE cd $@ && $(MAKE) $(MFLAGS) +auctex: FORCE + cd $@ && $(MAKE) $(MFLAGS) FORCE : PERL = perl
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/auctex/Makefile Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,76 @@ + +infodir=../../info +TEX=tex + +info: $(infodir)/auctex.info + +$(infodir)/auctex.info: auc-tex.texi install.texi intro.texi changes.texi + makeinfo auc-tex.texi -o $(infodir)/auctex.info + +all: auc-tex.dvi tex-ref.dvi math-ref.dvi auctex + +dist: auctex INSTALLATION README CHANGES auc-tex_toc.html auc-tex.ps + +auc-tex_toc.html: auc-tex.texi + texi2html -split_node auc-tex.texi + +math-ref.dvi: math-ref.tex + $(TEX) math-ref + @echo "**********************************************************" + @echo "** doc/math-ref.dvi may now be printed (1 page)" + @echo "**********************************************************" + +tex-ref.dvi: tex-ref.tex + $(TEX) tex-ref + @echo "**********************************************************" + @echo "** doc/tex-ref.dvi may now be printed (1 page)" + @echo "**********************************************************" + +auc-tex.dvi: auc-tex.texi + -$(TEX) "\nonstopmode\input auc-tex.texi" + -texindex auc-tex.ky + -texindex auc-tex.fn + -texindex auc-tex.vr + -texindex auc-tex.cp + -$(TEX) "\nonstopmode\input auc-tex.texi" + @echo "**********************************************************" + @echo "** If this gave trouble, maybe you need to install" + @echo "** a newer version of texinfo?" + @echo "** doc/auc-tex.dvi may now be printed (70+ pages)" + @echo "**********************************************************" + +auc-tex.ps: auc-tex.dvi + dvips auc-tex.dvi > auc-tex.ps + +auctex: auc-tex.texi install.texi intro.texi changes.texi + -makeinfo auc-tex.texi + @echo "**********************************************************" + @echo "** If this gave trouble, maybe you need to install" + @echo "** a newer version of texinfo?" + @echo "**********************************************************" + +INSTALLATION: install.texi + -makeinfo --no-headers install.texi --output INSTALLATION + +README: intro.texi + -makeinfo --no-headers intro.texi --output README + +CHANGES: changes.texi + -makeinfo --no-headers changes.texi --output CHANGES + +HISTORY: history.texi + -makeinfo --no-headers history.texi --output HISTORY + +install: auctex + cp auctex auctex-* $(infodir) + @echo "**********************************************************" + @echo "** The \`auctex' info files are now installed." + @echo "** Edit \`$(infodir)/dir'" + @echo "** to add an entry for file \`auctex'" + @echo "**********************************************************" + +clean: allways + rm -f *.dvi *.ps *.aux *.cp *.fn *.info *.ky *.log *~ \#*\# *.tp *.vr *.pg *.toc *.tp *.bak *.cps *.kys *.tps *.fns *.vrs *.pgs auctex auctex-? *.html INSTALLATION README CHANGES + + +allways:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/auctex/auc-tex.texi Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,2702 @@ +\input texinfo +@setfilename auctex +@settitle AUC TeX +@c footnotestyle separate +@c paragraphindent 2 +@comment %**end of header +@iftex +@tolerance 10000 +@end iftex + +@c $Id: auc-tex.texi,v 1.1 1997/02/20 02:05:18 steve Exp $ + +@finalout +@titlepage +@title AUC @TeX{} +@subtitle A much enhanced La@TeX{} mode for GNU Emacs. +@subtitle Version 9.7 + +@author by Kresten Krab Thorup +@author updated for 6.1 to 9.7 by Per Abrahamsen +@page +@vskip 0pt plus 1filll +Copyright @copyright{} 1992 Kresten Krab Thorup @* +Copyright @copyright{} 1993, 1994,1995 Per Abrahamsen + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). +@end ignore + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that the +section entitled ``Copying'' is included exactly as in the original, and +provided that the entire resulting derived work is distributed under the +terms of a permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that this permission notice may be stated in a translation +approved by the Free Software Foundation. +@end titlepage +@page + +@ifinfo +@node top, Copying, (dir), (dir) +@top AUC @TeX{} + +AUC @TeX{} is an integrated environment for editing La@TeX{} and +@TeX{} files.@refill + +This file documents AUC @TeX{} version 9.7. + +Although AUC @TeX{} contains a large number of features, there are no +reasons to despair. You can continue to write @TeX{} and La@TeX{} +documents the way you are used to, and only start using the multiple +features in small steps. AUC @TeX{} is not monolithic, each feature +described in this manual is useful by itself, but together they provide +an environment where you will make very few LaTeX errors, and makes it +easy to find the errors that may slip through anyway. + +If you want to make AUC TeX aware of style files and multi-file +documents right away, insert the following in your @file{.emacs} file. +@lisp +(setq TeX-auto-save t) +(setq TeX-parse-self t) +(setq-default TeX-master nil) +@end lisp + +NOTE: This documentation is preliminary. It should however cover most +important points. Corrections or perhaps rewrites of sections +are VERY WELCOME.@refill + +Kresten Krab Thorup (6.0) @* +Per Abrahamsen (later updates) + +There is a mailing list for discussion about AUC @TeX{} and announcement +of alpha releases, write to @samp{auc-tex-request@@sunsite.auc.dk} to join +it. Send contributions to @samp{auc-tex@@sunsite.auc.dk}. + +Bug reports, suggestions for new features, and pleas for help should go +to either @samp{auc-tex_mgr@@iesd.auc.dk} (the AUC @TeX{} managers), or +to @samp{auc-tex@@sunsite.auc.dk} (the mailing list) if they might have +general interest. Please use the command @kbd{M-x +TeX-submit-bug-report} to report bugs if possible.@refill + +@end ifinfo + +@menu +* Copying:: Copying +* Introduction:: Why AUC @TeX{} is good for you. +* Frequently Used Commands:: Inserting Frequently Used Commands +* Advanced Features:: Advanced Editing Features +* Formatting:: Formatting and Printing +* Multifile:: Multifile Documents +* Parsing Files:: Automatic Parsing of @TeX{} files. +* I18n:: Internationalization +* Automatic:: Automatic Customization +* Style Files:: Writing Your own Style Support +* Installation:: How to install AUC @TeX{} +* History:: The History of AUC @TeX{} +* Projects:: Wishlist +* Credit:: Credit +* Key Index:: Key Index +* Function Index:: Function Index +* Variable Index:: Variable Index +* Concept Index:: Concept Index + +@end menu + +@node Copying, Introduction, top, top +@unnumbered Copying +@cindex Copying +@cindex Copyright +@cindex GPL +@cindex General Public License +@cindex License +@cindex Free +@cindex Free software +@cindex Distribution +@cindex Right +@cindex Warranty + +(This text stolen from the @TeX{}info 2.16 distribution). + +The programs currently being distributed that relate to AUC @TeX{} +include lisp files for GNU Emacs. These programs are @dfn{free}; this +means that everyone is free to use them and free to redistribute them on +a free basis. The AUC @TeX{} related programs are not in the public +domain; they are copyrighted and there are restrictions on their +distribution, but these restrictions are designed to permit everything +that a good cooperating citizen would want to do. What is not allowed +is to try to prevent others from further sharing any version of these +programs that they might get from you.@refill + + Specifically, we want to make sure that you have the right to give +away copies of the programs that relate to AUC @TeX{}, that you receive +source code or else can get it if you want it, that you can change these +programs or use pieces of them in new free programs, and that you know +you can do these things.@refill + + To make sure that everyone has such rights, we have to forbid you to +deprive anyone else of these rights. For example, if you distribute +copies of the AUC @TeX{} related programs, you must give the recipients all +the rights that you have. You must make sure that they, too, receive or +can get the source code. And you must tell them their rights.@refill + + Also, for our own protection, we must make certain that everyone finds +out that there is no warranty for the programs that relate to AUC @TeX{}. +If these programs are modified by someone else and passed on, we want +their recipients to know that what they have is not what we distributed, +so that any problems introduced by others will not reflect on our +reputation.@refill + + The precise conditions of the licenses for the programs currently +being distributed that relate to AUC @TeX{} are found in the General +Public Licenses that accompany them.@refill + +@node Introduction, Frequently Used Commands, Copying, top +@include intro.texi + +@node Frequently Used Commands, Advanced Features, Introduction, top +@chapter Inserting Frequently Used Commands + +The most commonly used commands/macros of AUC @TeX{} are those which +simply insert templates for often used @TeX{} and/or La@TeX{} +constructs, like font changes, handling of environments, etc. +These features are very simple, and easy to learn, and help you +avoiding stupid mistakes like mismatched braces, or +@samp{\begin@{@}}-@samp{\end@{@}} pairs.@refill + +@menu +* Quotes:: Inserting double quotes +* Font Specifiers:: Inserting Font Specifiers +* Sectioning:: Inserting chapters, sections, etc. +* Environments:: Inserting Environment Templates +@end menu + +@node Quotes, Font Specifiers, Frequently Used Commands, Frequently Used Commands +@section Insertion of Quotes, Dollars, and Braces + +@cindex Quotes +@cindex Double quotes +@cindex Braces +@cindex Brackets +@cindex Dollars +@cindex Math mode delimiters +@cindex Matching dollar signs +@cindex Display math mode + +In @TeX{} literal double quotes @samp{"like this"} are seldom used, +instead two single quotes are used @samp{``like this''}. To help you +insert these efficiently, AUC @TeX{} allows you to continue to press +@kbd{"} to insert two single quotes. To get a literal double quote, +press @kbd{"} twice. + +@deffn Command TeX-insert-quote @var{count} +@kindex " +(@kbd{"}) Insert the appropriate quote marks for TeX. + +Inserts the value of @code{TeX-open-quote} (normally @samp{``}) or +@code{TeX-close-quote} (normally @samp{''}) depending on the context. +With prefix argument, always inserts @samp{"} characters.@refill +@end deffn + +@defopt TeX-open-quote +String inserted by typing @kbd{"} to open a quotation. +@end defopt + +@defopt TeX-close-quote +String inserted by typing @kbd{"} to open a quotation. +@end defopt + +If you include the style file @file{german} @code{TeX-open-quote} and +@code{TeX-close-quote} will both be set to @samp{"}. + +In AUC @TeX{}, dollar signs should match like they do in @TeX{}. This +has been partially implemented, we assume dollar signs always match +within a paragraph. The first @samp{$} you insert in a paragraph will +do nothing special. The second @samp{$} will match the first. This +will be indicated by moving the cursor temporarily over the first dollar +sign. If you enter a dollar sign that matches a double dollar sign +@samp{$$} AUC @TeX{} will automatically insert two dollar signs. If you +enter a second dollar sign that matches a single dollar sign, the single +dollar sign will automatically be converted to a double dollar sign. + +@deffn Command TeX-insert-dollar @var{arg} +@kindex $ +(@kbd{$}) Insert dollar sign. + +Show matching dollar sign if this dollar sign end the @TeX{} math mode. +Ensure double dollar signs match up correctly by inserting extra +dollar signs when needed. + +With optional @var{arg}, insert that many dollar signs. +@end deffn + +To avoid unbalanced braces, it is useful to insert them pairwise. You +can do this by typing @kbd{C-c @{}. + +@deffn Command TeX-insert-braces +@kindex C-c @{ +(@kbd{C-c @{}) Make a pair of braces and position the cursor +to type inside of them. +@end deffn + +@node Font Specifiers, Sectioning, Quotes, Frequently Used Commands +@section Inserting Font Specifiers + +@cindex Fonts +@cindex Font macros +@cindex Changing font +@cindex Specifying a font + +Perhaps the most used keyboard commands of AUC @TeX{} are the short-cuts +available for easy insertion of font changing macros. They all put the +font change inside a @TeX{} group, a practice that help preventing +subtle errors. The most significant advantage of using these command +instead of typing it in yourself, is that the braces will always match +correctly. + +If you give an argument (that is, type @kbd{C-u}) to the font command, +the innermost font will be replaced, i.e. the font in the @TeX{} group +around point will be changed. The following table shows the available +commands, with @code{@point{}} indicating the position where the text +will be inserted.@refill + +@table @kbd +@item C-c C-f C-r +@kindex C-c C-f C-r +@cindex @code{\textrm} +Insert roman @r{@{\textrm @point{}@}} text. + +@item C-c C-f C-b +@kindex C-c C-f C-b +@cindex @code{\textbf} +Insert @b{bold face} @samp{@{\textbf @point{}@}} text. + +@item C-c C-f C-i +@kindex C-c C-f C-i +@cindex @code{\textit} +Insert @i{italics} @samp{@{\textit @point{}\/@}} text. + +@item C-c C-f C-e +@kindex C-c C-f C-e +@cindex @code{\emph} +Insert @i{emphasized} @samp{@{\emph @point{}\/@}} text. + +@item C-c C-f C-s +@kindex C-c C-f C-s +@cindex @code{\textsl} +Insert @i{slanted} @samp{@{\textsl @point{}\/@}} text. + +@item C-c C-f C-t +@kindex C-c C-f C-t +@cindex @code{\texttt} +Insert @t{typewriter} @samp{@{\texttt @point{}@}} text. + +@item C-c C-f C-c +@kindex C-c C-f C-c +@cindex @code{\textsc} +Insert @sc{small caps} @samp{@{\textsc @point{}@}} text. + +@item C-c C-f C-d +@kindex C-c C-f C-c +@cindex Deleting fonts +Delete the innermost font specification containing point. + +@end table + +@deffn Command TeX-font @var{arg} +@kindex C-c C-f +(@kbd{C-c C-f}) Insert template for font change command. + +If @var{replace} is not nil, replace current font. @var{what} +determines the font to use, as specified by @code{TeX-font-list}. +@end deffn + +@defopt TeX-font-list +List of fonts used by TeX-font. + +Each entry is a list with three elements. The first element is the +key to activate the font. The second element is the string to insert +before point, and the third element is the string to insert after +point. An optional fourth element means always replace if not nil. +@end defopt + +@node Sectioning, Environments, Font Specifiers, Frequently Used Commands +@section Inserting chapters, sections, etc. +@cindex Sectioning +@cindex Sections +@cindex Chapters +@cindex @code{\chapter} +@cindex @code{\section} +@cindex @code{\subsection} +@cindex @code{\label} + +Insertion of sectioning macros, that is @samp{\chapter}, +@samp{\section}, @samp{\subsection}, etc. and accompanying +@samp{\label}'s may be eased by using @kbd{C-c C-s}. This command is +highly customizable, the following describes the default behavior. + +When invoking you will be asked for a section macro to insert. An +appropriate default is automatically selected by AUC @TeX{}, that is +either: at the top of the document; the top level sectioning for that +document style, and any other place: The same as the last occurring +sectioning command. + +Next, you will be asked for the actual name of that section, and +last you will be asked for a label to be associated with that section. +The label will be prefixed by the value specified in +@code{LaTeX-section-hook}. + +@deffn Command LaTeX-section @var{arg} +@kindex C-c C-s +(@kbd{C-c C-s}) Insert a sectioning command. + +Determine the type of section to be inserted, by the argument +@var{arg}.@refill + +@itemize @bullet +@item +If @var{arg} is nil or missing, use the current level. +@item +If @var{arg} is a list (selected by C-u), go downward one level. +@item +If @var{arg} is negative, go up that many levels. +@item +If @var{arg} is positive or zero, use absolute level: +@itemize + +@item +0 : part +@item +1 : chapter +@item +2 : section +@item +3 : subsection +@item +4 : subsubsection +@item +5 : paragraph +@item +6 : subparagraph +@end itemize +@end itemize + +The following variables can be set to customize the function. + +@vtable @code +@item LaTeX-section-hook +Hooks to be run when inserting a section. +@item LaTeX-section-label +Prefix to all section references. +@end vtable + +@end deffn + +The precise behavior of @code{LaTeX-section} is defined by the contents +of @code{LaTeX-section-hook}. + +@defopt LaTeX-section-hook +List of hooks to run when a new section is inserted. + +The following variables are set before the hooks are run + +@table @var +@item level +Numeric section level, default set by prefix arg to @code{LaTeX-section}. +@item name +Name of the sectioning command, derived from @var{level}. +@item title +The title of the section, default to an empty string. +@item toc +Entry for the table of contents list, default nil. +@item done-mark +Position of point afterwards, default nil meaning after the inserted +text. +@end table + +A number of hooks are already defined. Most likely, you will be able to +get the desired functionality by choosing from these hooks. + +@ftable @code +@item LaTeX-section-heading +Query the user about the name of the sectioning command. Modifies +@var{level} and @var{name}. +@item LaTeX-section-title +Query the user about the title of the section. Modifies @var{title}. +@item LaTeX-section-toc +Query the user for the toc entry. Modifies @var{toc}. +@item LaTeX-section-section +Insert La@TeX{} section command according to @var{name}, @var{title}, +and @var{toc}. If @var{toc} is nil, no toc entry is inserted. If +@var{toc} or @var{title} are empty strings, @var{done-mark} will be +placed at the point they should be inserted. +@item LaTeX-section-label +Insert a label after the section command. Controlled by the variable +@code{LaTeX-section-label}. +@end ftable + +To get a full featured @code{LaTeX-section} command, insert + +@lisp +(setq LaTeX-section-hook + '(LaTeX-section-heading + LaTeX-section-title + LaTeX-section-toc + LaTeX-section-section + LaTeX-section-label)) +@end lisp + +in your @file{.emacs} file. +@end defopt + +The behavior of @code{LaTeX-section-label} is determined by the +variable @code{LaTeX-section-label}.@refill + +@defopt LaTeX-section-label +Default prefix when asking for a label. + +If it is a string, it is used unchanged for all kinds of sections. +If it is nil, no label is inserted. +If it is a list, the list is searched for a member whose car is equal +to the name of the sectioning command being inserted. The cdr is then +used as the prefix. If the name is not found, or if the cdr is nil, +no label is inserted. + +@cindex Prefix for labels +@cindex Label prefix +@cindex Labels +By default, chapters have a prefix of @samp{cha:} while sections and +subsections have a prefix of @samp{sec:}. Labels are not automatically +inserted for other types of sections. +@end defopt + +@node Environments, , Sectioning, Frequently Used Commands +@section Inserting Environment Templates +@cindex Environments +@cindex @samp{\begin} +@cindex @samp{\end} + +A large apparatus is available that supports insertions of environments, +that is @samp{\begin@{@}} --- @samp{\end@{@}} pairs. + +AUC @TeX{} is aware of most of the actual environments available in a +specific document. This is achieved by examining your +@samp{\documentstyle} command, and consulting a precompiled list of +environments available in a large number of styles. + +You insert an environment with @kbd{C-c C-e}, and select an environment +type. Depending on the environment, AUC @TeX{} may ask more questions +about the optional parts of the selected environment type. With +@kbd{C-u C-c C-e} you will change the current environment. + +@deffn Command LaTeX-environment @var{arg} +@kindex C-c C-e +(@kbd{C-c C-e}) AUC @TeX{} will prompt you for an environment +to insert. At this prompt, you may press @key{TAB} or @key{SPC} to +complete a partially written name, and/or to get a list of available +environments. After selection of a specific environment AUC @TeX{} may +prompt you for further specifications. + +If the optional argument @var{arg} is not-nil (i.e. you have given a +prefix argument), the current environment is modified and no new +environment is inserted. +@end deffn + +As a default selection, AUC @TeX{} will suggest the environment last +inserted or, as the first choice the value of the variable +@code{LaTeX-default-environment}. + +@defopt LaTeX-default-environment +Default environment to insert when invoking @samp{LaTeX-environment} +first time. +@end defopt + +If the document is empty, or the cursor is placed at the top of the +document, AUC @TeX{} will default to insert a `document' environment. + +Most of these are described further in the following sections, and you +may easily specify more, as described in `Customizing environments'. + +@menu +* Floats:: Floats +* Itemize-like:: Itemize-like +* Tabular-like:: Tabular-like +* Customizing environments:: Customizing environments +@end menu + +You can close the current environment with @kbd{C-c ]}, but we suggest +that you use @kbd{C-c C-e} to insert complete environments instead. + +@deffn Command LaTeX-close-environment +@kindex C-c ] +(@kbd{C-c ]}) Insert an @samp{\end} that matches the current environment. +@end deffn + +@node Floats, Itemize-like, Environments, Environments +@subsection Floats +@cindex Floats +@cindex Figures +@cindex Figure environment +@cindex Tables +@cindex Table environment + +Figures and tables (i.e., floats) may also be inserted using AUC @TeX{}. +After choosing either `figure' or `table' in the environment list +described above, you will be prompted for a number of additional things. + +@table @var +@item float-to +This field is the option of float environments that controls how they are +placed in the final document. In La@TeX{} this is a sequence of the +letters @samp{htbp} as described in the La@TeX{} manual. The value will +default to the value of @code{LaTeX-float}. +@vindex LaTeX-float + +@item caption +This is the caption of the float. + +@item label +The label of this float. The label will have a default prefix, which is +controlled by the variables @code{LaTeX-figure-label} and +@code{LaTeX-table-label}. +@vindex LaTeX-figure-label +@vindex LaTeX-table-label +@cindex Prefix for labels +@cindex Label prefix +@cindex Labels +@end table + +Moreover, in the case of a `figure' environment, you will be asked if +you want to insert a `center' environment inside the figure. + +@defopt LaTeX-float +Default placement for floats. +@end defopt + +@defopt LaTeX-figure-label +Prefix to use for figure labels. +@end defopt + +@defopt LaTeX-table-label +Prefix to use for table labels. +@end defopt + +@node Itemize-like, Tabular-like, Floats, Environments +@subsection Itemize-like +@cindex Itemize +@cindex Enumerates +@cindex Descriptions +@cindex Items +@cindex \item + +In an itemize-like environment, nodes (i.e., @samp{\item}s) may be +inserted using @kbd{C-c @key{LFD}}. + +@deffn Command LaTeX-insert-item +@kindex C-c @key{LFD} +(@kbd{C-c @key{LFD}}) Close the current item, move to the next line and +insert an appropriate @samp{\item} for the current environment. That is, +`itemize' and `enumerate' will have @samp{\item } inserted, while +`description' will have @samp{\item[]} inserted. +@end deffn + +@node Tabular-like, Customizing environments, Itemize-like, Environments +@subsection Tabular-like + +When inserting Tabular-like environments, that is, `tabular' `array' +etc., you will be prompted for a template for that environment. + +@node Customizing environments, , Tabular-like, Environments +@subsection Customizing environments + +@xref{Adding Environments}, for how to customize the list of known +environments. + +@node Advanced Features, Formatting, Frequently Used Commands, top +@chapter Advanced Editing Features +@cindex Advanced features + +The previous chapter described how to write the main body of the text +easily and with a minimum of errors. In this chapter we will describe +some features for entering more specialized sorts of text, and for +indenting and navigating through the document. + +@menu +* Mathematics:: Entering Mathematics +* Completion:: Completion +* Commenting:: Commenting +* Marking and formatting:: Marking, Formatting and Indenting +* Outline:: Hiding text +@end menu + +@node Mathematics, Completion, Advanced Features, Advanced Features +@section Entering Mathematics +@cindex Mathematics +@cindex Symbols +@cindex Abbreviations + +@TeX{} is written by a mathematician, and has always contained good +support for formatting mathematical text. AUC @TeX{} supports this +tradition, by offering a special minor mode for entering text with many +mathematic symbols. You can enter this mode by typing @kbd{C-c +~}.@refill + +@deffn Command LaTeX-math-mode +@kindex C-c ~ +(@kbd{C-c ~}) Toggle LaTeX-math-mode. This is a minor mode rebinding +the key @code{LaTeX-math-abbrev-prefix} to allow easy typing of +mathematical symbols. @kbd{`} will read a character from the keyboard, +and insert the symbol as specified in @code{LaTeX-math-list}. If given a +prefix argument, the symbol will be surrounded by dollar signs.@refill +@end deffn + +You can use another prefix key (instead of @kbd{`}) by setting the +variable LaTeX-math-abbrev-prefix. + +@defopt LaTeX-math-abbrev-prefix +A string containing the prefix of @code{LaTeX-math-mode} commands; +This value defaults to @kbd{`}. @refill +@end defopt + +The variable @code{LaTeX-math-list} holds the actual mapping. + +@defopt LaTeX-math-list +A list containing key command mappings to use in @code{LaTeX-math-mode}. +The car of each element is the key and the cdr is the macro name. +@end defopt + +The AUC @TeX{} distributions includes a reference card for +@code{LaTeX-math-mode} with a list of all math mode commands. + +@node Completion, Commenting, Mathematics, Advanced Features +@section Completion +@cindex Completion +@cindex Expansion +@cindex Macro expansion +@cindex Macro completion +@cindex Macro arguments +@cindex Arguments to @TeX{} macros + +Emacs lisp programmers probably know the @code{lisp-complete-symbol} +command, usually bound to @kbd{M-@key{TAB}}. Users of the wonderful +ispell mode know and love the @code{ispell-complete-word} command from +that package. Similarly, AUC @TeX{} has a @code{TeX-complete-symbol} +command, usually bound to @kbd{M-@key{TAB}}. Using +@code{LaTeX-complete-symbol} makes it easier to type and remember the +names of long La@TeX{} macros. + +In order to use @code{TeX-complete-symbol}, you should write a backslash +and the start of the macro. Typing @kbd{M-@key{TAB}} will now +complete as much of the macro, as it unambiguously can. For example, if +you type `@samp{\renewc}' and then `@kbd{M-@key{TAB}}, it will expand +to `@samp{\renewcommand}'. + +@deffn Command TeX-complete-symbol +@kindex M-@key{TAB} +(@kbd{M-@key{TAB}}) Complete @TeX{} symbol before point. +@end deffn + +A more direct way to insert a macro is with @code{TeX-insert-macro}, +bound to @kbd{C-c C-m}. It has the advantage over completion that it +knows about the argument of most standard La@TeX{} macros, and will +prompt for them. It also knows about the type of the arguments, so it +will for example give completion for the argument to @samp{\include}. +Some examples are listed below. + +@deffn Command TeX-insert-macro +@kindex C-c C-m +(@kbd{C-c C-m}) Prompt (with completion) for the name of a @TeX{} macro, +and if AUC @TeX{} knows the macro, prompt for each argument. +@end deffn + +As a default selection, AUC @TeX{} will suggest the macro last inserted +or, as the first choice the value of the variable +@code{TeX-default-macro}. + +@defopt TeX-default-macro +Default macro to insert when invoking @code{TeX-insert-macro} first time. +@end defopt + +A faster alternative is to bind the function @code{TeX-electric-macro} +to @samp{\}. This can be done by setting the variable @code{TeX-electric-escape} + +@defopt TeX-electric-escape +If this is non-nil when AUC @TeX{} is loaded, the @TeX{} escape +character @samp{\} will be bound to @code{TeX-electric-macro} +@end defopt + +The difference between @code{TeX-insert-macro} and +@code{TeX-electric-macro} is that space will complete and exit from the +minibuffer in @code{TeX-electric-macro}. Use @key{TAB} if you merely +want to complete. + +@deffn Command TeX-electric-macro +Prompt (with completion) for the name of a @TeX{} macro, +and if AUC @TeX{} knows the macro, prompt for each argument. +Space will complete and exit. +@end deffn + +By default AUC @TeX{} will put an empty set braces @samp{@{@}} after a +macro with no arguments to stop it from eating the next whitespace. +This can be stopped by entering @code{LaTeX-math-mode}, +@pxref{Mathematics}, or by setting @code{TeX-insert-braces} to nil + +@defopt TeX-insert-braces +If non-nil, append a empty pair of braces after inserting a macro. +@end defopt + +Completions work because AUC @TeX{} can analyze @TeX{} files, and store +symbols in emacs lisp files for later retrieval. @xref{Automatic}, for +more information. + +@cindex \cite, completion of +@cindex Bib@TeX{}, completion +@cindex cite, completion of +@cindex bibliography, completion +@cindex citations, completion of +@cindex \label, completion +@cindex \ref, completion +@cindex labels, completion of +AUC @TeX{} will also make completion for many macro arguments, for +example existing labels when you enter a @samp{\ref} macro with +@code{TeX-insert-macro} or @code{TeX-electric-macro}, and Bib@TeX{} +entries when you enter a @samp{\cite} macro. For this kind of +completion to work, parsing must be enabled as described in +@pxref{Parsing Files}. For @samp{\cite} you must also make sure that +the Bib@TeX{} files have been saved at least once after you enabled +automatic parsing on save, and that the basename of the Bib@TeX{} file +does not conflict with the basename of one of @TeX{} files. + +@node Commenting, Marking and formatting, Completion, Advanced Features +@section Commenting + +It is often necessary to comment out temporarily a region of @TeX{} or +La@TeX{} code. This can be done with the commands @kbd{C-c ;} and +@kbd{C-c %}. @kbd{C-c ;} will comment out all lines in the current +region, while @kbd{C-c %} will comment out the current paragraph. To +uncomment, simply type @kbd{C-u - C-c ;} to uncomment all lines in the +region, or @kbd{C-u - C-c %} uncomment all comment lines around point. + +By default, these commands will insert or remove a single @samp{%}. To +insert more than one, give an argument. @kbd{C-u 5 C-c %} will add five +@samp{%} to each line, while @kbd{C-u - 5 C-c %} will remove up to 5 +@samp{%} from each line. + +@deffn Command TeX-comment-region @var{count} +@kindex C-c ; +(@kbd{C-c ;}) Add or remove @samp{%} from the beginning of each line in +the current region, as specified by @var{count}. +@end deffn + +@deffn Command TeX-comment-paragraph @var{count} +@kindex C-c % +(@kbd{C-c %}) Add or remove @samp{%} from the beginning of each line in +the current paragraph, as specified by @var{count}. When removing +@samp{%}'s the paragraph is considered to consist of all preceding and +succeeding lines starting with a @samp{%}, until the first non-comment +line. +@end deffn + +@node Marking and formatting, Outline, Commenting, Advanced Features +@section Marking, Formatting and Indenting +@cindex Formatting +@cindex Filling +@cindex Indenting +@cindex Reformatting +@cindex Reindenting + +AUC @TeX{} contains very advanced handling of indentation and +reformatting of the La@TeX{} source. If you have already tried AUC +@TeX{} with @code{auto-fill-mode} enabled, you may have noted that the +source is automatically indented and formatted as you write it. More +over, AUC @TeX{} is able to format sections of text on demand. + +It is important to realize, that AUC @TeX{} comes with `formatting' in +two fashions. Either letting @TeX{} format the file, or letting AUC +@TeX{} make the ASCII document look better. + +Indentation is done by La@TeX{} environments and by @TeX{} groups, that +is the body of an environment is indented by the value of +@code{LaTeX-indent-level} (default 2). Also, items of an `itemize-like' +environment are indented by the value of @code{LaTeX-item-indent}, +default @minus{}2. This indentation makes it easier to see the +structure of the document, and to catch errors such as a missing close +brace. Thus, the indentation is done for precisely the same reasons +that you would indent ordinary computer programs. +@vindex LaTeX-indent-level +@vindex LaTeX-item-indent + +The following is a short sample of an itemize environment indented by +AUC @TeX{}. If more environment are nested, they are indented +`accumulated' just like most programming languages usually are seen +indented in nested constructs. + +@example +\begin@{itemize@} +\item Insertion of templates for logical-structural compositions such as + environments and sections. +\item Hot-keys for easy access to certain often used constructs, e.g., + font changes, accented letters, and mathematical symbols. +\item Running application programs (such as \TeX), and then parsing + the output so that errors in the document may be located + easily. +\item Support for multi-file documents. +\item Online help for \AllTeX\ error messages. +\item Outlining\Dash i.e., manipulating the document as a composition + of nested/sequential logical constructs. +\item Instant formatting and indentation of the \ascii-document in + order to make it easier to read. +\item `Completion' (and thereby spell-checking) of partially written + control sequences. +\end@{itemize@} +@end example + +You can format and indent single lines, paragraphs, environments, or +sections. + +@table @kbd +@item @key{TAB} +@kindex @key{TAB} +@findex LaTeX-indent-line +@code{LaTeX-indent-line} will indent the current line. + +@item @key{LFD} +@kindex @key{LFD} +@code{reindent-then-newline-and-indent} indents the current line, and +then inserts a new line (much like @key{RET}) and move the cursor to an +appropriate position by the left margin. + +@item M-q +@kindex M-q +Alias for @kbd{C-c C-q C-p} + +@item C-c C-q C-p +@kindex C-c C-q C-p +@findex LaTeX-fill-paragraph +@code{LaTeX-fill-paragraph} will reformat or `fill' the current +paragraph. + +@item C-c C-q C-e +@kindex C-c C-q C-e +@findex LaTeX-fill-environment +@code{LaTeX-fill-environment} will reformat or `fill' the current +environment. This may e.g. be the `document' environment, in which case +the entire document will be formatted. + +@item C-c C-q C-s +@kindex C-c C-q C-s +@findex LaTeX-fill-section +@code{LaTeX-fill-section} will reformat or `fill' the current +logical sectional unit. + +@item M-g +@kindex M-g +Alias for @kbd{C-c C-q C-r} + +@item C-c C-q C-r +@kindex C-c C-q C-r +@findex LaTeX-fill-region +@code{LaTeX-fill-region} will format or `fill' the current region. +@end table + +@strong{Warning:} The formatting cannot handle tabular-like +environments. Those will be completely messed-up if you try to format +them. + +@defopt LaTeX-indent-level +Number of spaces to add to the indentation for each @samp{\begin} not +matched by a @samp{\end}.@refill +@end defopt + +@defopt LaTeX-item-indent +Number of spaces to add to the indentation for @samp{\item}'s in list +environments.@refill +@end defopt + +@defopt TeX-brace-indent-level +Number of spaces to add to the indentation for each @samp{@{} not +matched by a @samp{@}}.@refill +@end defopt + +@node Outline, , Marking and formatting, Advanced Features +@section Outlining the Document +@cindex Outlining +@cindex Headers +@cindex Sections +@cindex Overview +@cindex Folding + +GNU Emacs earlier than version 19.19 does not have a useful outline +mode. If you want to use outlines with old versions of emacs, please +get the file @file{outln-18.el} from +@file{sunsite.auc.dk:/packages/auctex/outln-18.el}. It is a port of the +Emacs 19.19 outline mode to Emacs 18 and Lucid Emacs.@refill + +AUC @TeX{} supports the standard outline minor mode using La@TeX{} +sectioning commands as header lines. @xref{Outline Mode, , Outline +Mode, emacs, GNU Emacs Manual}. By default +@code{outline-minor-mode} will use the prefix key @kbd{C-c} which is +also used by AUC @TeX{}, so it is suggested that you choose another +prefix key by inserting + +@lisp + (setq outline-minor-mode-prefix "\C-c\C-o") ; Or whatever... +@end lisp + +in your @file{.emacs} file. + +You can add your own headings by setting the variable +@code{TeX-outline-extra}. + +@defvar TeX-outline-extra +List of extra @TeX{} outline levels. + +Each element is a list with two entries. The first entry is the regular +expression matching a header, and the second is the level of the header. +A @samp{^} is automatically prepended to the regular expressions in the +list, so they must match text at the beginning of the line. + +See @code{LaTeX-section-list} for existing header levels. +@end defvar + +The following example add @samp{\item} and @samp{\bibliography} headers, +with @samp{\bibliography} at the same outline level as @samp{\section}, +and @samp{\item} being below @samp{\subparagraph}. + +@example +(setq TeX-outline-extra + '(("[ \t]*\\\\\\(bib\\)?item\\b" 7) + ("\\\\bibliography\\b" 2))) +@end example + +You may want to check out the unbundled @file{out-xtra} package for even +better outline support. It is available from your favorite emacs lisp +archive. + +@node Formatting, Multifile, Advanced Features, top +@chapter Formatting and Printing + +The most powerful features of AUC @TeX{} may be those allowing you to +run (La)@TeX{} and other external commands like Bib@TeX{} and +@code{makeindex} from within Emacs, viewing and printing the results, +and moreover allowing you to @emph{debug} your documents. + +@menu +* Commands:: Invoking external commands. +* Debugging:: Debugging @TeX{} and La@TeX{} output. +* Checking:: Checking the document. +* Control:: Controlling the processes. +@end menu + +@node Commands, Debugging, Formatting, Formatting +@section Executing Commands +@cindex Formatting +@cindex Running La@TeX{} +@cindex Running @TeX{} +@cindex La@TeX{} +@cindex @TeX{} +@cindex Running commands +@cindex Default command +@cindex Header +@cindex Trailer +@cindex Setting the header +@cindex Setting the trailer +@cindex Region +@cindex Region file +@cindex Setting the default command +@cindex Commands +@cindex External Commands +@cindex Indexing +@cindex Making an index +@cindex Running @code{makeindex} +@cindex @code{makeindex} +@cindex Bib@TeX{} +@cindex Bibliography +@cindex Literature +@cindex Running Bib@TeX{} +@cindex Making a bibliography +@cindex Printing +@cindex Writing to a printer +@cindex Viewing +@cindex Previewing +@cindex Starting a previewer + +Formatting the document with @TeX{} or La@TeX{}, viewing with a +previewer, printing the document, running Bib@TeX{}, making an index, or +checking the document with @code{lacheck} or @code{chktex} all require +running an external command. + +There are two ways to run an external command, you can either run it on +all of the current documents with @code{TeX-command-master}, or on the +current region with @code{TeX-command-region}.@refill + +@deffn Command TeX-command-master +@kindex C-c C-c +(@kbd{C-c C-c}) Query the user for a command, and run it on the master +file associated with the current buffer. The name of the master file is +controlled by the variable @code{TeX-master}. The available commands are +controlled by the variable @code{TeX-command-list}.@refill +@vindex TeX-master +@vindex TeX-command-list +@end deffn + +@xref{Installation} for a discussion about @code{TeX-command-list} and +@ref{Multifile} for a discussion about @code{TeX-master}. + +@deffn Command TeX-command-region +@kindex C-c C-r +(@kbd{C-c C-r}) Query the user for a command, and run it on the ``region +file''. Some commands (typically those invoking @TeX{} or La@TeX{}) +will write the current region into the region file, after extracting the +header and tailer from the master file. If mark is not active, use the +old region. The name of the region file is controlled by the variable +@code{TeX-region}. The name of the master file is controlled by the +variable @code{TeX-master}. The header is all text up to the line +matching the regular expression @code{TeX-header-end}. The trailer is +all text from the line matching the regular expression +@code{TeX-trailer-start}. The available commands are controlled by the +variable @code{TeX-command-list}.@refill +@vindex TeX-region +@vindex TeX-header-end +@vindex TeX-trailer-start +@vindex TeX-master +@vindex TeX-command-list +@end deffn + +AUC @TeX{} will allow one process for each document, plus one process +for the region file to be active at the same time. Thus, if you are +editing @var{n} different documents, you can have @var{n} plus one +processes running at the same time. If the last process you started was +on the region, the commands described in @ref{Debugging} and +@ref{Control} will work on that process, otherwise they will work on the +process associated with the current document. + +@defopt TeX-region +The name of the file for temporarily storing the text when formatting +the current region. +@end defopt + +@defopt TeX-header-end +A regular expression matching the end of the header. By default, this +is @samp{\begin@{document@}} in La@TeX{} mode and @samp{%**end of +header} in @TeX{} mode.@refill +@end defopt + +@defopt TeX-trailer-start +A regular expression matching the start of the trailer. By default, +this is @samp{\end@{document@}} in La@TeX{} mode and @samp{\bye} in +@TeX{} mode.@refill +@end defopt + +AUC @TeX{} will try to guess what command you want to invoke, but by +default it will assume that you want to run @TeX{} in @TeX{} mode and +La@TeX{} in La@TeX{} mode. You can overwrite this by setting the +variable @code{TeX-command-default}. + +@defopt TeX-command-default +The default command to run in this buffer. Must be an entry in +@code{TeX-command-list}. +@end defopt + +If you want to overwrite the values of @code{TeX-header-end}, +@code{TeX-trailer-start}, or @code{TeX-command-default}, you can do that +for all files by setting them in either @code{TeX-mode-hook}, +@code{plain-TeX-mode-hook}, or @code{LaTeX-mode-hook}. To overwrite +them for a single file, define them as file variables (@pxref{File +Variables,,,emacs,The Emacs Editor}). You do this by putting special +formatted text near the end of the file. +@cindex Variables +@cindex File Variables +@cindex Local Variables + +@example +% Local Variables: +% TeX-header-end: "% End-Of-Header" +% TeX-trailer-start: "% Start-Of-Trailer" +% TeX-command-default: "SliTeX" +% End: +@end example + +AUC @TeX{} will try to save any buffers related to the document, and +check if the document needs to be reformatted. If the variable +@code{TeX-save-query} is non-nil, AUC @TeX{} will query before saving +each file. By default AUC @TeX{} will check emacs buffers associated +with files in the current directory, in one of the +@code{TeX-macro-private} directories, and in the @code{TeX-macro-global} +directories. You can change this by setting the variable +@code{TeX-check-path}.@refill + +@defopt TeX-check-path +Directory path to search for dependencies. + +If nil, just check the current file. +Used when checking if any files have changed. +@end defopt + +@node Debugging, Checking, Commands, Formatting +@section Catching the errors +@cindex Debugging +@cindex Errors +@cindex Parsing errors +@cindex Parsing TeX output +@cindex Next error +@cindex Parsing LaTeX errors +@cindex Overfull boxes +@cindex Bad boxes +@cindex Wonderful boxes + +Once you've formatted your document you may `debug' it, i.e. browse +through the errors (La)@TeX{} reported. + +@deffn Command TeX-next-error +@kindex C-c ` +(@kbd{C-c `}) Go to the next error reported by @TeX{}. The view will +be split in two, with the cursor placed as close as possible to the +error in the top view. In the bottom view, the error message will be +displayed along with some explanatory text. +@end deffn + +Normally AUC @TeX{} will only report real errors, but you may as well +ask it to report `bad boxes' as well. + +@deffn Command TeX-toggle-debug-bad-boxes +@kindex C-c C-w +(@kbd{C-c C-w}) Toggle whether AUC @TeX{} should stop at bad boxes +(i.e. over/under full boxes) as well as at normal errors. +@end deffn + +As default, AUC @TeX{} will display that special @samp{*help*} buffer +containing the error reported by @TeX{} along with the documentation. +There is however an `expert' option, which allows you to display the +real @TeX{} output. + +@defopt TeX-display-help +When non-nil AUC @TeX{} will automatically display a help text whenever +an error is encountered using @code{TeX-next-error} (@kbd{C-c `}). +@end defopt + +@node Checking, Control, Debugging, Formatting +@section Checking for problems +@cindex Checking +@cindex @code{lacheck} +@cindex @code{chktex} +@cindex Finding errors +@cindex Running @code{lacheck} +@cindex Running @code{chktex} +@cindex Style +@cindex Problems + +Running @TeX{} or La@TeX{} will only find regular errors in the +document, not examples of bad style. Furthermore, description of the +errors may often be confusing. The utility @code{lacheck} can be used +to find style errors, such as forgetting to escape the space after an +abbreviation or using @samp{...} instead of @samp{\ldots} and many other +problems like that. You start @code{lacheck} with @kbd{C-c C-c C h e c +k @key{RET}}. The result will be a list of errors in the +@samp{*compilation*} buffer. You can go through the errors with +@kbd{C-x `} (@code{next-error}, @pxref{Compilation,,,emacs,The Emacs +Editor}), which will move point to the location of the next +error.@refill + +Another newer program which can be used to find errors is @code{chktex}. +It is much more configurable than @code{lacheck}, but doesn't find all +the problems @code{lacheck} does, at least in its default configuration. +You must install the programs before using them, and for @code{chktex} +you must also modify @code{TeX-command-list}. You can get +@code{lacheck} from @file{<URL:ftp://sunsite.auc.dk/pub/text/lacheck/>} +or alternatively @code{chktex} from +@file{<URL:ftp://ftp.dante.de/pub/tex/support/chktex/>}. Search for +`chktex' in @file{tex.el} to see how to switch between them.@refill They +are + +@node Control, , Checking, Formatting +@section Controlling the output +@cindex Controlling the output +@cindex Output +@cindex Redisplay output +@cindex Processes +@cindex Killing a process +@cindex Finding the master file +@cindex Master file +@cindex Stopping a process +@cindex Current file +@cindex Finding the current file + +A number of commands are available for controlling the output of an +application running under AUC @TeX{} + +@deffn Command TeX-kill-job +@kindex C-c C-k +(@kbd{C-c C-k}) Kill currently running external application. +This may be either of @TeX{}, La@TeX{}, previewer Bib@TeX{} etc. +@end deffn + +@deffn Command TeX-recenter-output-buffer +@kindex C-c C-l +(@kbd{C-c C-l}) Recenter the output buffer so that the bottom line is +visible. +@end deffn + +@deffn Command TeX-home-buffer +@kindex C-c ^ +(@kbd{C-c ^}) Go to the `master' file in the document associated with +the current buffer, or if already there, to the file where the current +process was started. +@end deffn + +@node Multifile, Parsing Files, Formatting, top +@chapter Multifile Documents +@cindex Multifile Documents +@cindex Documents +@cindex Documents with multiple files +@cindex Multiple Files +@cindex Many Files +@cindex Including +@cindex \include +@cindex Inputing +@cindex \input +@cindex Master file + +You may wish spread a document over many files (as you are likely to do if +there are multiple authors, or if you have not yet discovered the power +of the outline commands (@pxref{Outline})). This can be done by having a +``master'' file in which you include the various files with the @TeX{} +macro @samp{\input} or the La@TeX{} macro @samp{\include}. These +files may also include other files themselves. However, to format the +document you must run the commands on the top level master file.@refill + +When you, for example, ask AUC @TeX{} to run a command on the master file, +it has no way of knowing the name of the master file. By default, +it will assume that the current file is the master file. If you insert +the following in your @file{.emacs} file AUC @TeX{} will use a more +advanced algorithm. + +@lisp +(setq-default TeX-master nil) ; Query for master file. +@end lisp + +If AUC @TeX{} finds the line indicating the end of the header in a +master file (@code{TeX-header-end}), it can figure out for itself that +this is a master file. Otherwise, it will ask for the name of the +master file associated with the buffer. To avoid asking you again, AUC +@TeX{} will automatically insert the name of the master file as a file +variable (@pxref{File Variables,,,emacs,The Emacs Editor}). You can +also insert the file variable yourself, by putting the following text at +the end of your files.@refill +@findex TeX-header-end + +@example +% Local Variables: +% TeX-master: "master" +% End: +@end example + +You should always set this variable to the name of the top level document. If +you always use the same name for your top level documents, you can set +@code{TeX-master} in your @file{.emacs} file. + +@lisp +(setq-default TeX-master "master") ; All master files called "master". +@end lisp + +@defopt TeX-master +The master file associated with the current buffer. If the file being +edited is actually included from another file, then you can tell AUC @TeX{} +the name of the master file by setting this variable. If there are +multiple levels of nesting, specify the top level file.@refill + +If this variable is @code{nil}, AUC @TeX{} will query you for the +name.@refill + +If the variable is @code{t}, then AUC @TeX{} will assume the file is a master +file itself.@refill + +If the variable is @code{shared}, then AUC @TeX{} will query for the name, +but will not change the file.@refill + +It is suggested that you use the File Variables (@pxref{File +Variables,,,emacs,The Emacs Editor}) to set this variable permanently +for each file.@refill +@end defopt + +@defopt TeX-one-master +Regular expression matching ordinary TeX files. + +You should set this variable to match the name of all files, for which +it is a good idea to append a @code{TeX-master} file variable entry +automatically. When AUC @TeX{} adds the name of the master file as a +file variable, it does not need to ask next time you edit the file. + +If you dislike AUC @TeX{} automatically modifying your files, you can +set this variable to @samp{"<none>"}. By default, AUC @TeX{} will modify +any file with an extension of @samp{.tex}.@refill +@end defopt + +AUC @TeX{} keeps track of macros, environments, labels, and style +files that are used in a given document. For this to work with +multifile documents, AUC @TeX{} has to have a place to put the +information about the files in the document. This is done by having an +@file{auto} subdirectory placed in the directory where your document is +located. Each time you save a file, AUC @TeX{} will write information +about the file into the @file{auto} directory. When you load a file, +AUC @TeX{} will read the information in the @file{auto} directory +about the file you loaded @emph{and the master file specified by +@code{TeX-master}}. Since the master file (perhaps indirectly) includes +all other files in the document, AUC @TeX{} will get information from +all files in the document. This means that you will get from each file, +for example, completion for all labels defined anywhere in the document. + +AUC TeX will create the @file{auto} directory automatically if +@code{TeX-auto-save} is non-nil. Without it, the files in the document +will not know anything about each other, except for the name of the +master file. @xref{Automatic Local}. + +@deffn Command TeX-save-document +@kindex C-c C-d +(@kbd{C-c C-d}) Save all buffers known to belong to the current document. +@end deffn + +@defopt TeX-save-query +If non-nil, then query the user before saving each file with +@code{TeX-save-document}. +@end defopt + + +@node Parsing Files, I18n, Multifile, top +@chapter Automatic Parsing of @TeX{} files. +@cindex Parsing @TeX{} +@cindex Automatic Parsing +@cindex Tabs +@cindex Tabify +@cindex Untabify + +AUC @TeX{} depends heavily on being able to extract information from the +buffers by parsing them. Since parsing the buffer can be somewhat slow, +the parsing is initially disabled. You are encouraged to enable them by +adding the following lines to your @file{.emacs} file. + +@lisp +(setq TeX-parse-self t) ; Enable parse on load. +(setq TeX-auto-save t) ; Enable parse on save. +@end lisp + +The later command will make AUC @TeX{} store the parsed information in +an @file{auto} subdirectory in the directory each time the @TeX{} files +are stored, @pxref{Automatic Local}. If AUC @TeX{} finds the pre-parsed +information when loading a file, it will not need to reparse the buffer. +The information in the @file{auto} directory is also useful for +multifile documents @pxref{Multifile}, since it allows each file to +access the parsed information from all the other files in the document. +This is done by first reading the information from the master file, and +then recursively the information from each file stored in the master +file.@refill + +The variables can also be done on a per file basis, by changing the file +local variables. + +@example +% Local Variables: +% TeX-parse-self: t +% TeX-auto-save: t +% End: +@end example + +Even when you have disabled the automatic parsing, you can force the +generation of style information by pressing @kbd{C-c C-n}. This is +often the best choice, as you will be able to decide when it is +necessary to reparse the file. + +@defopt TeX-parse-self +Parse file after loading it if no style hook is found for it. +@end defopt + +@defopt TeX-auto-save +Automatically save style information when saving the buffer. +@end defopt + +@deffn Command TeX-normal-mode @var{arg} +@kindex C-c C-n +(@kbd{C-c C-n}) Remove all information about this buffer, and apply the +style hooks again. Save buffer first including style information. With +optional argument, also reload the style hooks. +@end deffn + +When AUC TeX saves your buffer, it will by default convert all tabs in +your buffer into spaces. To disable this behaviour, insert the +following in your @file{.emacs} file. + +@lisp +(setq TeX-auto-untabify nil) +@end lisp + +@defopt TeX-auto-untabify +Automatically remove all tabs from a file before saving it. +@end defopt + +Instead of disabling the parsing entirely, you can also speed it +significantly up by limiting the information it will search for (and +store) when parsing the buffer. You can do this by setting the default +values for the buffer local variables @code{TeX-auto-regexp-list} and +@code{TeX-auto-parse-length} in your @file{.emacs} file. + +@lisp +;; Only parse \documentstyle information. +(setq-default TeX-auto-regexp-list 'LaTeX-auto-minimal-regexp-list) +;; The documentstyle command is usually near the beginning. +(setq-default TeX-auto-parse-length 2000) +@end lisp + +This example will speed the parsing up significantly, but AUC @TeX{} +will no longer be able to provide completion for labels, macros, +environments, or bibitems specified in the document, nor will it know +what files belong to the document. + +These variables can also be specified on a per file basis, by changing +the file local variables. + +@example +% Local Variables: +% TeX-auto-regexp-list: TeX-auto-full-regexp-list +% TeX-auto-parse-length: 999999 +% End: +@end example + +@defopt TeX-auto-regexp-list +List of regular expressions used for parsing the current file. +@end defopt + +@defopt TeX-auto-parse-length +Maximal length of TeX file that will be parsed. +@end defopt + +The pre-specified lists of regexps are defined below. You can use these +before loading AUC @TeX{} by quoting them, as in the example above. + +@defvr Constant TeX-auto-empty-regexp-list +Parse nothing +@end defvr + +@defvr Constant LaTeX-auto-minimal-regexp-list +Only parse documentstyle. +@end defvr + +@defvr Constant LaTeX-auto-label-regexp-list +Only parse La@TeX{} labels. +@end defvr + +@defvr Constant LaTeX-auto-regexp-list +Parse common La@TeX{} commands. +@end defvr + +@defvr Constant plain-TeX-auto-regexp-list +Parse common plain @TeX{} commands. +@end defvr + +@defvr Constant TeX-auto-full-regexp-list +Parse all @TeX{} and La@TeX{} commands that AUC @TeX{} can use. +@end defvr + +@node I18n, Automatic, Parsing Files, top +@chapter Internationalization +@cindex Internationalization +@cindex Character set +@cindex National letters + +There are several problems associated with editing non-English @TeX{} +with GNU Emacs. Modern versions of GNU Emacs and @TeX{} are usable for +European (Latin, Cyrillic, Greek) based languages, but special versions +of TeX and Emacs are needed for Korean, Japanese, and Chinese. + +@menu +* European:: Using AUC @TeX{} for European languages. +* Japanese:: Japanese @TeX{} +@end menu + +@node European, Japanese, I18n, I18n +@section Using AUC @TeX{} for European languages. +@cindex Europe +@cindex European Characters +@cindex ISO 8859 Latin 1 +@cindex Latin 1 +@cindex ISO 8859 Latin 2 +@cindex Latin 2 +@cindex ANSI +@cindex Denmark +@cindex Danish +@cindex Holland +@cindex Dutch +@cindex Germany +@cindex Poland + +First you will need a way to write non-ASCII characters. You can either +use macros, or teach @TeX{} about the ISO character sets. I prefer the +later, it has the advantage that the usual the standard emacs word +movement and case change commands will work. + + +With LaTeX2e, just add @samp{\usepackage[latin1]@{inputenc@}}. With older +LaTeX versions, try: + +@table @file +@item isolatin1.sty +Support for ISO 8859 Latin 1. Available by ftp from the host +@t{ftp.uni-stuttgart.de} as +@file{/pub/tex/macros/latex/contrib/misc/isolatin1.sty}. + +@item latin2.sty +Support for ISO 8859 Latin 2. Available by ftp from the host +@t{ftp.uni-stuttgart.de} as +@file{/pub/tex/macros/latex/contrib/latin2.sty}. +@end table + +To be able to display non-ASCII characters you will need an appropriate +font and a version of GNU Emacs capable of displaying 8-bit characters. +I believe all emacs versions except plain Emacs 18 are capable of this. +For GNU Emacs 19, @pxref{European Display,,,emacs, The GNU Emacs +Editor}. Other relevant packages are: + +@table @file +@item remap +Supports lots of different 7-bit and 8-bit character sets for GNU Emacs +19. Mostly useful if you have seldomly used character sets, or need to +use different character set for keyboard, buffer, and display. An +overkill if you just need ISO 8859 Latin 1. Currently in alpha test, +but available by ftp from the host @t{ftp.iesd.auc.dk} in +@file{/packages/auctex/}. + +To get dead keys for @TeX{}, install remap and insert the following in +your @file{.emacs} or @file{site-start.el} file. + +@lisp +(require 'remap) + +(defvar all-dead-keys "~'`^" + "Dead keys used by remap") + +(remap-define-map "Dead Key" + (apply 'append (mapcar 'remap-dead-map all-dead-keys))) + +(remap-define-map "TeX Dead Key" + (remap-map "Dead Key" (remap-add "Ascii" "~TeX"))) + +(setq remap-setup-alist + '(("7-bit" "Raw" "L1" "US" "Ctrl" "~TeX") + ("8-bit" "Raw" "L1" "L1" "Ctrl" "Raw") + ("Dead/7" "Dead Key" "L1" "US" "Ctrl" "~TeX") + ("Dead/8" "Dead Key" "L1" "L1" "Ctrl" "Raw") + ("TeX" "TeX Dead Key" "L1" "US" "Ctrl" "Raw"))) +@end lisp + +You can now enable TeX dead keys with +@example +@kbd{M-x remap-setup-choose RET TeX RET} +@end example +@end table + +A compromise is to use use an European character set when editing the +file, and convert to @TeX{} macros when reading and writing the files. + +@table @file +@item iso-tex.el +@cindex @file{iso-tex.el} +This file automatically converts between ISO 8859 Latin 1 encoding and +La@TeX{} encodings of West European characters. It is available by ftp +from @t{aida.intellektik.informatik.th-darmstadt.de} in the directory +@file{/pub/gene/Emacs}. +@item iso-cvt.el +@cindex @file{iso-cvt.el} +Much like @file{iso-tex.el} but is bundled with Emacs 19.23 and later. + +@item x-compose.el +@cindex @file{x-compose.el} +Similar package bundled with new versions of XEmacs. + +@end table + +AUC @TeX{} supports style files for several languages. Each style file +may modify some AUC @TeX{} to better support the language, and will run +a language specific hook that will allow you to for example change +ispell dictionary, or run code to change the keyboard remapping. The +following will for example choose a Danish dictionary for documents +including the @file{dk.sty} file. This requires parsing to be enabled, +@pxref{Parsing Files}. + +@lisp +(add-hook 'TeX-language-dk-hook + (function (lambda () (ispell-change-dictionary "danish")))) +@end lisp + +The following style files are recognized. +@table @file +@item dk +Runs style hook @code{TeX-language-dk-hook}. + +@item dutch +Runs style hook @code{TeX-language-nl-hook}. + +@item german +Runs style hook @code{TeX-language-de-hook}. +Gives @samp{"} word syntax and makes the @key{"} key insert a literal +@samp{"}. + +@item plfonts +@itemx plhb +Runs style hook @code{TeX-language-pl-hook}. +Gives @samp{"} word syntax and makes the @key{"} key insert a literal +@samp{"}. Pressing @key{"} twice will insert @samp{"<} or @samp{">} +depending on context. +@end table + +@node Japanese, , European, I18n +@section Japanese @TeX{} +@cindex Japan +@cindex Japanese +@cindex Nippon +@cindex NEMACS +@cindex MULE +@cindex j@TeX{} +@cindex jLa@TeX{} + +To write Japanese text with AUC @TeX{} you need to have versions of +@TeX{} and Emacs that support Japanese. There exist at least two +variants of @TeX{} for Japanese text, and AUC @TeX{} can be used with +both, as well as with the two Japanese-aware Emacses, NEMACS and MULE. + +To use the Japanese TeX variants, simply enter @code{japanese-tex-mode}, +@code{japanese-latex-mode}, or @code{japanese-slitex-mode}, and +everything should work. If not, send mail to Shinji Kobayashi +(@samp{<koba@@flab.fujitsu.co.jp>}, who kindly donated the code for +supporting Japanese in AUC @TeX{}. None of the primary AUC @TeX{} +maintainers understand Japanese, so they can not help you. + +@node Automatic, Style Files, I18n, top +@chapter Automatic Customization +@cindex Automatic Customization +@cindex Extracting @TeX{} symbols +@cindex Automatic +@cindex @file{auto} directories. +@cindex Parsing @TeX{} +@cindex @TeX{} parsing +@cindex Generating symbols + +Since AUC @TeX{} is so highly customizable, it makes sense that it is able +to customize itself. The automatic customization consists of scanning +@TeX{} files and extracting symbols, environments, and things like that. + +The automatic customization is done on three different levels. The +global level is the level shared by all users at your site, and consists +of scanning the standard @TeX{} style files, and any extra styles added +locally for all users on the site. The private level deals with those +style files you have written for your own use, and use in different +documents. You may have a @file{~/lib/TeX/} directory where you store +useful style files for your own use. The local level is for a specific +directory, and deals with writing customization for the files for your +normal @TeX{} documents. + +If compared with the environment variable @code{TEXINPUTS}, the +global level corresponds to the directories built into @TeX{}. The +private level corresponds to the directories you add yourself, except for +@file{.}, which is the local level. + +@menu +* Automatic Global:: Automatic Customization for the Site +* Automatic Private:: Automatic Customization for a User +* Automatic Local:: Automatic Customization for a Directory +@end menu + +By default AUC @TeX{} will search for customization files in all the +global, private, and local style directories, but you can also set the +path directly. This is useful if you for example want to add another +person's style hooks to your path. Please note that all matching files +found in @code{TeX-style-path} are loaded, and all hooks defined in the +files will be executed. + +@defopt TeX-style-path +List of directories to search for AUC @TeX{} style files. +Each must end with a slash. +@end defopt + +By default, when AUC @TeX{} searches a directory for files, it will +recursively search through subdirectories. + +@defopt TeX-file-recurse +If not nil, search @TeX{} directories recursively. +@end defopt + +By default, AUC @TeX{} will ignore files name @file{.}, @file{..}, +@file{SCCS}, @file{RCS}, and @file{CVS}. + +@defopt TeX-ignore-file +Regular expression matching file names to ignore. + +These files or directories will not be considered when searching for +@TeX{} files in a directory. +@end defopt + +@node Automatic Global, Automatic Private, Automatic, Automatic +@section Automatic Customization for the Site +@cindex Global style hook directory +@cindex Global macro directory +@cindex Site macro directory +@cindex Global @TeX{} macro directory +@cindex Site @TeX{} macro directory +@cindex Global directories +@cindex Site information + +Assuming that the automatic customization at the global level was done +when AUC @TeX{} was installed, your choice is now: will you use it? If +you use it, you will benefit by having access to all the symbols and +environments available for completion purposes. The drawback is slower +load time when you edit a new file and perhaps too many confusing +symbols when you try to do a completion. + +You can disable the automatic generated global style hooks by setting +the variable @code{TeX-auto-global} to nil. + +@defopt TeX-macro-global +Directories containing the site's @TeX{} style files. +@end defopt + +@defopt TeX-style-global +Directory containing hand generated @TeX{} information. +Must end with a slash. + +These correspond to @TeX{} macros shared by all users of a site. +@end defopt + +@defopt TeX-auto-global +Directory containing automatically generated information. + +For storing automatic extracted information about the @TeX{} macros +shared by all users of a site. +@end defopt + +@node Automatic Private, Automatic Local, Automatic Global, Automatic +@section Automatic Customization for a User +@cindex Private style hook directory +@cindex Private macro directory +@cindex Personal macro directory +@cindex Private @TeX{} macro directory +@cindex Personal @TeX{} macro directory +@cindex Private directories +@cindex Personal information + +You should specify where you store your private @TeX{} macros, so AUC +@TeX{} can extract their information. The extracted information will go +to the directories listed in @code{TeX-auto-private} + +Use @kbd{M-x TeX-auto-generate} to extract the information. + +@defopt TeX-macro-private +Directories where you store your personal @TeX{} macros. +Each must end with a slash. + +This defaults to the directories listed in the @samp{TEXINPUTS} and +@samp{BIBINPUTS} environment variables. +@end defopt + +@defopt TeX-auto-private +List of directories containing automatically generated information. +Must end with a slash. + +These correspond to the personal @TeX{} macros. +@end defopt + +@deffn Command TeX-auto-generate @var{TEX} @var{AUTO} +(@kbd{M-x TeX-auto-generate}) Generate style hook for @var{TEX} and +store it in @var{AUTO}. If @var{TEX} is a directory, generate style +hooks for all files in the directory.@refill +@end deffn + +@defopt TeX-style-private +List of directories containing hand generated information. +Must end with a slash. + +These correspond to the personal @TeX{} macros. +@end defopt + +@node Automatic Local, , Automatic Private, Automatic +@section Automatic Customization for a Directory +@cindex Local style hooks +@cindex Updating style hooks +@cindex Automatic updating style hooks +@cindex Local style hooks +@cindex Local style directory + +AUC @TeX{} can update the style information about a file each time you +save it, and it will do this if the directory @code{TeX-auto-local} +exist. @code{TeX-auto-local} is by default set to @samp{"auto/"}, so +simply creating an @file{auto} directory will enable automatic saving of +style information. + +The advantage of doing this is that macros, labels, etc. defined in any +file in a multifile document will be known in all the files in the +document. The disadvantage is that saving will be slower. To disable, +set @code{TeX-auto-local} to nil. + +@defopt TeX-style-local +Directory containing hand generated @TeX{} information. +Must end with a slash. + +These correspond to @TeX{} macros found in the current directory. +@end defopt + +@defopt TeX-auto-local +Directory containing automatically generated @TeX{} information. +Must end with a slash. + +These correspond to @TeX{} macros found in the current directory. +@end defopt + +@node Style Files, Installation, Automatic, top +@chapter Writing Your own Style Support +@cindex Style files +@cindex Style hooks +@cindex @file{style} + +@xref{Automatic} for a discussion about automatically generated global, +private, and local style files. The hand generated style files are +equivalent, except that they by default are found in @file{style} +directories instead of @file{auto} directories. + +@menu +* Simple Style:: A Simple Style File +* Adding Macros:: Adding Support for Macros +* Adding Environments:: Adding Support for Environments +* Adding Other:: Adding Other Information +* Hacking the Parser:: Automatic Extraction of New Things +@end menu + +If you write some useful support for a public @TeX{} style file, please +send it to us. + +@node Simple Style, Adding Macros, Style Files, Style Files +@section A Simple Style File +@cindex @file{book.el} +@cindex Sample style file +@cindex Style file +@cindex Example of a style file. +@cindex Style hook +@cindex Adding a style hook + +Here is a simple example of a style file. + +@lisp +;;; book.el - Special code for book style. + +(TeX-add-style-hook "book" + (function (lambda () (setq LaTeX-largest-level + (LaTeX-section-level ("chapter")))))) + +@end lisp + +This file specifies that the largest kind of section in a LaTeX document +using the book document style is chapter. The interesting thing to +notice is that the style file defines an (anonymous) function, and adds it +to the list of loaded style hooks by calling @code{TeX-add-style-hook}. + +The first time the user indirectly tries to access some style specific +information, such as the largest sectioning command available, the style +hooks for all files directly or indirectly read by the current document +is executed. The actual files will only be evaluated once, but the +hooks will be called for each buffer using the style file. + +@defun TeX-add-style-hook @var{style} @var{hook} +Add @var{hook} to the list of functions to run when we use the @TeX{} +file @var{style}. +@end defun + +@node Adding Macros, Adding Environments, Simple Style, Style Files +@section Adding Support for Macros +@cindex Adding macros +@cindex Macros, adding +@cindex Defining macros in style hooks + +The most common thing to define in a style hook is new symbols (@TeX{} +macros). Most likely along with a description of the arguments to the +function, since the symbol itself can be defined automatically. + +Here are a few examples from @file{latex.el}. + +@lisp +(TeX-add-style-hook "latex" + (function + (lambda () + (TeX-add-symbols + '("arabic" TeX-arg-counter) + '("label" TeX-arg-define-label) + '("ref" TeX-arg-label) + '("newcommand" TeX-arg-define-macro [ "Number of arguments" ] t) + '("newtheorem" TeX-arg-define-environment + [ TeX-arg-environment "Numbered like" ] + t [ TeX-arg-counter "Within counter" ]))))) +@end lisp + +@defun TeX-add-symbols @var{symbol} @dots{} +Add each @var{symbol} to the list of known symbols. +@end defun + +Each argument to @code{TeX-add-symbols} is a list describing one symbol. +The head of the list is the name of the symbol, the remaining elements +describe each argument. + +If there are no additional elements, the symbol will be inserted with +point inside braces. Otherwise, each argument of this function should +match an argument of the @TeX{} macro. What is done depends on the argument +type. + +If a macro is defined multiple times, AUC @TeX{} will chose the one with +the longest definition (i.e. the one with the most arguments). + +Thus, to overwrite +@example + '("tref" 1) ; one argument +@end example +you can specify +@example + '("tref" TeX-arg-label ignore) ; two arguments +@end example + +@code{ignore} is a function that does not do anything, so when you +insert a @samp{tref} you will be prompted for a label and no more. + +@table @code +@item string +Use the string as a prompt to prompt for the argument. + +@item number +Insert that many braces, leave point inside the first. + +@item nil +Insert empty braces. + +@item t +Insert empty braces, leave point between the braces. + +@item other symbols +Call the symbol as a function. You can define your +own hook, or use one of the predefined argument hooks. + +@item list +If the car is a string, insert it as a prompt and the next +element as initial input. Otherwise, call the car of the list with +the remaining elements as arguments. + +@item vector +Optional argument. If it has more than one element, parse it +as a list, otherwise parse the only element as above. Use square +brackets instead of curly braces, and is not inserted on empty user +input. +@end table + +A lot of argument hooks have already been defined. The first argument to +all hooks is a flag indicating if it is an optional argument. It is up +to the hook to determine what to do with the remaining arguments, if +any. Typically the next argument is used to overwrite the default +prompt. + +@ftable @code +@item TeX-arg-conditional +Implements if EXPR THEN ELSE. If EXPR evaluates to true, parse THEN as an +argument list, else parse ELSE as an argument list. + +@item TeX-arg-literal +Insert its arguments into the buffer. Used for specifying extra syntax +for a macro. + +@item TeX-arg-free +Parse its arguments but use no braces when they are inserted. + +@item TeX-arg-eval +Evaluate arguments and insert the result in the buffer. + +@item TeX-arg-file +Prompt for a tex or sty filename, and use it without the extension. Run +the file hooks defined for it. + +@item TeX-arg-label +Prompt for a label completing with known labels. + +@item TeX-arg-macro +Prompt for a @TeX{} macro with completion. + +@item TeX-arg-environment +Prompt for a La@TeX{} environment with completion. + +@item TeX-arg-cite +Prompt for a Bib@TeX{} citation. + +@item TeX-arg-counter +Prompt for a La@TeX{} counter. + +@item TeX-arg-savebox +Prompt for a La@TeX{} savebox. + +@item TeX-arg-file +Prompt for a filename in the current directory, and use it without the +extension. + +@item TeX-arg-input-file +Prompt for a filename in the current directory, and use it without the +extension. Run the style hooks for the file. + +@item TeX-arg-define-label +Prompt for a label completing with known labels. Add label to list of +defined labels. + +@item TeX-arg-define-macro +Prompt for a @TeX{} macro with completion. Add macro to list of defined +macros. + +@item TeX-arg-define-environment +Prompt for a La@TeX{} environment with completion. Add environment to +list of defined environments. + +@item TeX-arg-define-cite +Prompt for a Bib@TeX{} citation. + +@item TeX-arg-define-counter +Prompt for a La@TeX{} counter. + +@item TeX-arg-define-savebox +Prompt for a La@TeX{} savebox. + +@item TeX-arg-corner +Prompt for a La@TeX{} side or corner position with completion. + +@item TeX-arg-lr +Prompt for a La@TeX{} side with completion. + +@item TeX-arg-tb +Prompt for a La@TeX{} side with completion. + +@item TeX-arg-pagestyle +Prompt for a La@TeX{} pagestyle with completion. + +@item TeX-arg-verb +Prompt for delimiter and text. + +@item TeX-arg-pair +Insert a pair of numbers, use arguments for prompt. The numbers are +surrounded by parentheses and separated with a comma. + +@item TeX-arg-size +Insert width and height as a pair. No arguments. + +@item TeX-arg-coordinate +Insert x and y coordinates as a pair. No arguments. +@end ftable + +If you add new hooks, you can assume that point is placed directly after +the previous argument, or after the macro name if this is the first +argument. Please leave point located after the argument you are +inserting. If you want point to be located somewhere else after all +hooks have been processed, set the value of @code{exit-mark}. It will +point nowhere, until the argument hook sets it.@refill + +@node Adding Environments, Adding Other, Adding Macros, Style Files +@section Adding Support for Environments +@cindex Adding environments +@cindex Environments, adding +@cindex Defining environments in style hooks + +Adding support for environments is very much like adding support for +@TeX{} macros, except that each environment normally only takes one +argument, an environment hook. The example is again a short version of +@file{latex.el}. + +@lisp +(TeX-add-style-hook "latex" + (function + (lambda () + (LaTeX-add-environments + '("document" LaTeX-env-document) + '("enumerate" LaTeX-env-item) + '("itemize" LaTeX-env-item) + '("list" LaTeX-env-list))))) +@end lisp + +@findex LaTeX-env-item +The only hook that is generally useful is @code{LaTeX-env-item}, which is +used for environments that contain items. It is completely up to the +environment hook to insert the environment, but the function +@code{LaTeX-insert-environment} may be of some help. The hook will be +called with the name of the environment as its first argument, and extra +arguments can be provided by adding them to a list after the hook. + +For simple environments with arguments, for example defined with +@samp{\newenvironment}, you can make AUC @TeX{} prompt for the arguments +by giving the prompt strings in the call to +@code{LaTeX-add-environments}. For example, if you have defined a +@code{loop} environment with the three arguments @var{from}, @var{to}, +and @var{step}, you can add support for them in a style file. + +@example +%% loop.sty + +\newenvironment@{loop@}[3]@{...@}@{...@} +@end example + +@lisp +;; loop.el + +(TeX-add-style-hook "loop" + (function + (lambda () + (LaTeX-add-environments + '("loop" "From" "To" "Step"))))) +@end lisp + +If an environment is defined multiple times, AUC @TeX{} will chose the +one with the longest definition. Thus, if you have an enumerate style +file, and want it to replace the standard La@TeX{} enumerate hook above, +you could define an @file{enumerate.el} file as follows, and place it in +the appropriate style directory. + +@lisp +(TeX-add-style-hook "latex" + (function + (lambda () + (LaTeX-add-environments + '("enumerate" LaTeX-env-enumerate foo))))) + +(defun LaTeX-env-enumerate (environment &optional ignore) ...) +@end lisp + +The symbol @code{foo} will be passed to @code{LaTeX-env-enumerate} as +the second argument, but since we only added it to overwrite the +definition in @file{latex.el} it is just ignored. + +@defun LaTeX-add-environments @var{env} @dots{} +Add each @var{env} to list of loaded environments. +@end defun + +@defun LaTeX-insert-environment @var{env} [ @var{extra} ] +Insert environment of type @var{env}, with optional argument @var{extra}. +@end defun + +@node Adding Other, Hacking the Parser, Adding Environments, Style Files +@section Adding Other Information +@cindex Adding bibliographies +@cindex Bibliographies, adding +@cindex Defining bibliographies in style hooks +@cindex Adding labels +@cindex Labels, adding +@cindex Defining labels in style hooks +@cindex Adding other information +@cindex Other information, adding +@cindex Defining other information in style hooks + +You can also specify bibliographical databases and labels in the style +file. This is probably of little use, since this information will +usually be automatically generated from the @TeX{} file anyway. + +@defun LaTeX-add-bibliographies @var{bibliography} @dots{} +Add each @var{bibliography} to list of loaded bibliographies. +@end defun + +@defun LaTeX-add-labels @var{label} @dots{} +Add each @var{label} to the list of known labels. +@end defun + +@node Hacking the Parser, , Adding Other, Style Files +@section Automatic Extraction of New Things +@cindex Parsing new macros +@cindex @file{macro.tex} +@cindex @file{macro.el} +@cindex Changing the parser + +The automatic @TeX{} information extractor works by searching for +regular expressions in the @TeX{} files, and storing the matched +information. You can add support for new constructs to the parser, +something that is needed when you add new commands to define symbols. + +For example, in the file @file{macro.tex} I define the following macro. + +@example +\newcommand@{\newmacro@}[5]@{% +\def#1@{#3\index@{#4@@#5~cite@{#4@}@}\nocite@{#4@}@}% +\def#2@{#5\index@{#4@@#5~cite@{#4@}@}\nocite@{#4@}@}% +@} +@end example + +AUC @TeX{} will automatically figure out that @samp{newmacro} is a macro +that takes five arguments. However, it is not smart enough to +automatically see that each time we use the macro, two new macros are +defined. We can specify this information in a style hook file. + +@lisp +;;; macro.el - Special code for my own macro file. + +;;; Code: + +(defvar TeX-newmacro-regexp + '("\\\\newmacro@{\\\\\\([a-zA-Z]+\\)@}@{\\\\\\([a-zA-Z]+\\)@}" + (1 2) TeX-auto-multi) + "Matches \newmacro definitions.") + +(defvar TeX-auto-multi nil + "Temporary for parsing \\newmacro definitions.") + +(defun TeX-macro-cleanup () + ;; Move symbols from `TeX-auto-multi' to `TeX-auto-symbol'. + (mapcar (function (lambda (list) + (mapcar (function (lambda (symbol) + (setq TeX-auto-symbol + (cons symbol TeX-auto-symbol)))) + list))) + TeX-auto-multi)) + +(defun TeX-macro-prepare () + ;; Clear `Tex-auto-multi' before use. + (setq TeX-auto-multi nil)) + +(add-hook 'TeX-auto-prepare-hook 'TeX-macro-prepare) +(add-hook 'TeX-auto-cleanup-hook 'TeX-macro-cleanup) + +(TeX-add-style-hook "macro" + (function + (lambda () + (TeX-auto-add-regexp TeX-newmacro-regexp) + (TeX-add-symbols '("newmacro" + TeX-arg-macro + (TeX-arg-macro "Capitalized macro: \\") + t + "BibTeX entry: " + nil))))) + +;;; macro.el ends here +@end lisp + +When this file is first loaded, it adds a new entry to +@code{TeX-newmacro-regexp}, and defines a function to be called before +the parsing starts, and one to be called after the parsing is done. It +also declares a variable to contain the data collected during parsing. +Finally, it adds a style hook which describes the @samp{newmacro} macro, +as we have seen it before. + +So the general strategy is: Add a new entry to @code{TeX-newmacro-regexp}. +Declare a variable to contain intermediate data during parsing. Add hook +to be called before and after parsing. In this case, the hook before +parsing just initializes the variable, and the hook after parsing +collects the data from the variable, and adds them to the list of symbols +found. + +@defvar TeX-auto-regexp-list +List of regular expressions matching @TeX{} macro definitions. + +The list has the following format ((REGEXP MATCH TABLE) @dots{}), that +is, each entry is a list with three elements. + +REGEXP. Regular expression matching the macro we want to parse. + +MATCH. A number or list of numbers, each representing one +parenthesized subexpression matched by REGEXP. + +TABLE. The symbol table to store the data. This can be a function, in +which case the function is called with the argument MATCH. Use +@code{TeX-match-buffer} to get match data. If it is not a function, it +is presumed to be the name of a variable containing a list of match +data. The matched data (a string if MATCH is a number, a list of +strings if MATCH is a list of numbers) is put in front of the table. +@end defvar + +@defvar TeX-auto-prepare-hook nil +List of functions to be called before parsing a @TeX{} file. +@end defvar + +@defvar TeX-auto-cleanup-hook nil +List of functions to be called after parsing a @TeX{} file. +@end defvar + +@node Installation, History, Style Files, top +@include install.texi + +@node History, Projects, Installation, top +@comment node-name, next, previous, up +@appendix The History of AUC @TeX{} + +See the file @file{history.texi} for older changes. + +@include changes.texi + +@node Projects, Credit, History, top +@comment node-name, next, previous, up +@appendix Wishlist + +This is a list of projects for AUC @TeX{}. Bug reports and requests we +can not fix or honor right away will be added to this list. If you have +some time for emacs lisp hacking, you are encouraged to try to provide a +solution to one of the following problems. It might be a good idea to +mail me first, though. + +@itemize @bullet +@item + +Filling messes up comments, but only at the end of the file. Reported +by uergen Reiss <psy3022@@rzbox.uni-wuerzburg.de>. +@item +@kbd{C-c C-q C-e} doesn't work properly on nested itemize environments. +Reported by "Robert B. Love" <rlove@@raptor.rmNUG.ORG>. + +@item +One suggestion for AUC-TeX: I think that the font command C-c C-f C-r, +which produces \textrm@{@} in a LaTeX file, should instead produce +either \textrm@{@} or \mathrm@{@}, depending on whether one is in math +mode or not. --- John Palmieri <palmieri@@math.mit.edu> + +@item +A way to add and overwrite math mode entries in style files, and to +decide where they should be. Suggested by Remo Badii <Remo.Badii@@psi.ch>. + +@item +Create template for (first) line of tabular environment. + +@item +I think prompting for the master is the intended behaviour. It +corresponds to a `shared' value for TeX-master. + +There should probably be a `none' value which wouldn't query for the +master, but instead disable all features that relies on TeX-master. + +This default value for TeX-master could then be controled with mapping +based on the extension. + +@item +@kbd{C-c '} should alway stay in the current window, also when it find a +new file. + +@item +@code{LaTeX-fill-environment} does not indent the closing @samp{\end}. + +@item +Rewrite @file{ltx-help.el} and put it in @file{latex.el}. Fix also: +@example +From: Denby Wong <DnB@@slip224.qlink.QueensU.CA> + + 1) change documentation regarding where to get the + latest version (at CTAN at pip.shsu.edu for me) + under info/latex2e-help-texinfo/ + + 2) change or provide choice over which version to + use. There are three references to the info + node "(latex)" in the file which should be + "(latex2e)" for the new file. + +From: Piet van Oostrum <piet@@cs.ruu.nl> + +One of the annoying things of latex-help is that if you ask for \LARGE, you +get \large if you have case-fold-search=t. This is really info's problem as +it doesn't reset it for a search of the node, but it would be easy to stick +a (let (case-fold-search) in latex-help. +@end example + +@item +It should be possible to insert a default preamble containing +e.g. @code{usepackage} declarations, perhaps depending on the document +class. + +@item +Multiple argument completion for @samp{\bibliography}. In general, I +ought to make @kbd{,} special for these kind of completions. + +@item +Do not overwrite emacs warnings about existing auto-save files when +loading a new file. + +@item +Suggest @samp{makindex} when appropriate. + +@item +Maybe the regexp for matching a TeX symbol during parsing should be +@samp{"\\\\\\([a-zA-Z]+\\|.\\)"} --- +@samp{<thiemann@@informatik.uni-tuebingen.de>} Peter Thiemann. + +@item +AUC TeX should be able to parse La@TeX{}2e @file{.cls} files. Here are +the regexps by @samp{<thiemann@@informatik.uni-tuebingen.de>} Peter +Thiemann. + +@example + ("\\\\DeclareRobustCommand@{?\\\\\\([a-zA-Z]+\\)@}?\\[\\([0-9]+\\)\\]\ +\\[\\([^\]\\\\\n\r]+\\)\\]" + (1 2 3) LaTeX-auto-optional) + ("\\\\DeclareRobustCommand@{?\\\\\\([a-zA-Z]+\\)@}?\\[\\([0-9]+\\)\\]" + (1 2) LaTeX-auto-arguments) + ("\\\\DeclareRobustCommand@{?\\\\\\([a-zA-Z]+\\)@}?" 1 TeX-auto-symbol) + ("\\\\DeclareFixedFont@{?\\\\\\([a-zA-Z]+\\)@}?" + 1 TeX-auto-symbol) + ("\\\\Declare\\(Text\\|Old\\)FontCommand@{?\\\\\\([a-zA-Z]+\\)@}?" + 2 TeX-auto-symbol) + ("\\\\DeclareMath\\(Symbol\\|Delimiter\\|Accent\\|Radical\\)@{?\\\\\\([a-zA-Z]+\\)@}?" + 2 TeX-auto-symbol) + ;;; it is also valid to declare just a single symbol, e.g. <, + ;;; with \DeclareMathSymbol but it is not necessary to register that here + ("\\\\DeclareText\\(Command\\|Symbol\\|Accent\\|Composite\\)@{?\\\\\\([a-zA-Z]+\\)@}?" + 2 TeX-auto-symbol) +@end example + +@item +Use index files (when available) to speed up @kbd{C-c C-m include +@key{RET}}. + +@item +Option not to calculate very slow completions like for +@kbd{C-c C-m include @key{RET}}.@refill + +@item +AUC @TeX{} should not parse verbatim environments. + +@item +Font menu should be created from @code{TeX-font-list}. + +@item +Installation procedure written purely in emacs lisp. + +@item +Format La@TeX{} comment blocks. + +@item +Included PostScript files should also be counted as part of the +document. + +@item +The argument to @samp{\verb} may be broken when filling if it contains a +space. This should be fixed or documented. Suggested by several +people. + +@item +The parser should catch warnings about undefined crossreferences. +Suggested by Richard Hirsch @samp{i3080501@@ws.rz.tu-bs.de}. + +@item +A nice hierarchical by-topic organization of all officially documented +LaTeX macros, available from the menu bar. + +@item +Make @samp{`} check for math context in @code{LaTeX-math-mode}. and +simply self insert if not in a math context. + +@item +Make @code{TeX-insert-dollar} more robust. Currently it can be fooled +by @samp{\mbox}'es and escaped double dollar for example. + +@item +La@TeX{} formatting should skip @code{verbatim} environments. + +@item +@code{TeX-command-default} should be set from the master file, if not +set locally. Suggested by Peter Whaite @samp{<peta@@cim.mcgill.ca>}. + +@item +Make AUC @TeX{} work with @samp{crypt++}. Suggested by Chris Moore +@samp{<Chris.Moore@@src.bae.co.uk>}. + +@item +Fix bug with @code{TeX-show-environment} from hidden document +environment. + +@item +Function to check if you are in math mode (between two dollar signs). +Suggested by Jan Erik Odegard @samp{<odegard@@dsp.rice.edu>} + +@item +The @samp{Spell} command should apply to all files in a document. Maybe +it could try to restrict to files that have been modified since last +spell check? Suggested by Ravinder Bhumbla @samp{<rbhumbla@@ucsd.edu>}. + +@item +Make @key{.} check for abbreviations and sentences ending with capital +letters. + +@item +Use Emacs 19 minibuffer history to choose between previewers, and other +stuff. Suggested by John Interrante +@samp{<interran@@uluru.Stanford.EDU>}. + +@item +Make features. + +A new command @code{TeX-update} (@kbd{C-c C-u}) could be used to create +an up-to-date dvi file by repeatedly running Bib@TeX{}, MakeIndex and +(La)@TeX{}, until an error occurs or we are done. + +An alternative is to have an @samp{Update} command that ensures the +@samp{dvi} file is up to date. This could be called before printing and +previewing. + +@item +Documentation of variables that can be set in a style hook. + +We need a list of what can safely be done in an ordinary style hook. +You can not set a variable that AUC TeX depends on, unless AUC TeX knows +that it has to run the style hooks first. + +Here is the start of such a list. +@table @code + +@item LaTeX-add-environments + +@item TeX-add-symbols + +@item LaTeX-add-labels + +@item LaTeX-add-bibliographies + +@item LaTeX-largest-level + +@end table + +@item +Correct indentation for tabular, tabbing, table, math, and array +environments. + +@item +Optional special indentation after an @samp{\item}. + +@example +\begin@{itemize@} +\item blabalaskdfjlas lajf adf + lkfjl af jasl lkf jlsdf jlf +\item f lk jldjf lajflkas flf af +\end@{itemize@} +@end example + +@item +Completion for counters and sboxes. + +@item +Outline should be (better) supported in @TeX{} mode. + +At least, support headers, trailers, as well as TeX-outline-extra. + +@item +@code{TeX-header-start} and @code{TeX-trailer-end}. + +We might want these, just for fun (and outlines) + +@item +Plain @TeX{} and La@TeX{} specific header and trailer expressions. + +We should have a way to globally specify the default value of the header +and trailer regexps. + +@item +Add support for original @code{TeX-mode} keybindings. + +A third initialization file (@file{tex-mode.el}) containing an emulator +of the standard @code{TeX-mode} would help convince some people to +change to AUC @TeX{}.@refill + +@item +Make @code{TeX-next-error} parse ahead and store the results in a list, +using markers to remember buffer positions in order to be more robust +with regard to line numbers and changed files. This is what +@code{next-error} does. (Or did, until Emacs 19). + +@item +When @code{LaTeX-environment} is given an argument, change the current +environment. Be smart about @samp{\item[]} versus @samp{\item } and +labels like @samp{fig:} versus @samp{tab:}. + +@item +Check out if lightning completion from Ultra @TeX{} is anything for us. + +@item +Finish the @TeX{}info mode. For one thing, many @TeX{}info mode +commands do not accept braces around their arguments. + +@item +BibTeX mode. + +@item +Support for AMSLaTeX style files. + +@item +Hook up the letter environment with `bbdb.el'. + +@item +Make the letter environment hook produce `documentstyle' too. + +@end itemize + +@node Credit, Key Index, Projects, top +@comment node-name, next, previous, up +@appendix Credit + +A big smile and thanks should go to all the folks who cheered me up, +during the long hours of programming@dots{} sorry folks, but I can't help +including the list below, of comments I've got@dots{} + +Kresten Krab Thorup + +@table @samp +@item <monheit@@psych.stanford.edu> +I'd like to say that I'm very much enjoying using auc-tex. Thanks for +the great package! +@item <georgiou@@rex.cs.tulane.edu> +I really enjoy working with auc-tex. +@item <toy@@soho.crd.ge.com> +Thanks for your great package. It's indispensable now! Thanks! +@item <ascott@@gara.une.oz.au> +Thanks for your time and for what appears to be a great and useful +package. Thanks again +@item <hal@@alfred.econ.lsa.umich.edu> +Thanks for providing auc-tex. +@item <simons@@ibiza.karlsruhe.gmd.de> +I really enjoy using the new emacs TeX-mode you wrote. I think you did +a great job. +@item <clipper@@csd.uwo.ca> +I am having fun with auc-tex already. +@item <ibekhaus@@athena.mit.edu> +Thanks for your work on auc-tex, especially the math-minor mode. +@item <burt@@dfki.uni-kl.de> +I like your auc-tex elisp package for writing LaTeX files - I am +especially impressed by the help with error correction. +@item <goncal@@cnmvax.uab.es> +Thanks so much! +@item <bond@@sce.carleton.ca> +I >really< like the macro, particularly the hooks for previewing and the +error parsing! +@item <ascott@@gara.une.oz.au> +All in all I am pleased with your package. Thanks a lot. +@end table + +@node Key Index, Function Index, Credit, top +@comment node-name, next, previous, up +@unnumbered Key Index + +@printindex ky + +@node Function Index, Variable Index, Key Index, top +@comment node-name, next, previous, up +@unnumbered Function Index + +@printindex fn + +@node Variable Index, Concept Index, Function Index, top +@comment node-name, next, previous, up +@unnumbered Variable Index + +@printindex vr + +@node Concept Index, , Variable Index, top +@comment node-name, next, previous, up +@unnumbered Concept Index + +@printindex cp + +@summarycontents +@contents +@bye + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/auctex/changes.texi Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,9 @@ +@section News in 9.7 + +@itemize @bullet +@item +Added minimal support for @code{sentence-end-double-space}. + +@end itemize + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/auctex/history.texi Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,1682 @@ +@section News in 9.6 + +@itemize @bullet +@item +NT installation instructions added. + +@item +@file{func-doc.el} unbundled, as @file{word-help.el} will be added to +the standard Emacs distribution. See @url{http://www.ifi.uio.no/~jensthi/}. + +@item +@samp{$} is now of the syntax class `matched pair', suggested by Mats +Bengtsson @samp{<matsb@@s3.kth.se>}. + +@item +Now use @kbd{,} to enter multiple arguments to a @samp{\cite} or +@samp{\bibliography} command instead of @kbd{@key{ret}}. + +@item +Installation procedure is changed, read the @file{INSTALLATION} file. + +@item +LaCheck is unbundled. You can get @code{lacheck} from +@file{<URL:ftp://sunsite.auc.dk/pub/text/lacheck/>} or alternatively +@code{chktex} from +@file{<URL:ftp://ftp.dante.de/pub/tex/support/chktex/>}. Search for +`chktex' in @file{tex.el} to see how to switch between them.@refill + +@item +Insert @code{(require 'font-latex)} to get better font lock support. + +@item +Bug fixes. + +@item +Better handling of subdirectories, suggested by Frederic Devernay +<Frederic.Devernay@@sophia.inria.fr> and many others. +@end itemize + +@section News in 9.5 + +@itemize @bullet +@item Use the @file{func-doc.el} package to get context senstive help. +This is not autoloaded, you must load it explicitly with: + +@lisp +(require 'func-doc) +@end lisp + +@item +Bug fixes. + +@end itemize + +@section News in 9.4 + +@itemize @bullet +@item There is now a menu in @code{LaTeX-math-minor-mode}. + +@item +Bug fixes. +@end itemize + +@section News in 9.3 + +@itemize @bullet +@item +Bug fixes. +@end itemize + +@section News in 9.2 + +@itemize @bullet +@item +Bug fixes. + +@item +New file @file{bib-cite.el} contributed by Peter S. Galbraith +@samp{<rhogee@@bathybius.meteo.mcgill.ca>}. This file is not installed +or enabled by default and is not part of the basic AUC @TeX{} +package. If you have problems, questions, or suggestions, please direct +them to Peter. + +@item +New file @file{hilit-LaTeX.el} contributed by Peter S. Galbraith +@samp{<rhogee@@bathybius.meteo.mcgill.ca>}. This file is not installed +or enabled by default and is not part of the basic AUC @TeX{} +package. If you have problems, questions, or suggestions, please direct +them to Peter. + +@item +AUC @TeX{} is now less likely to suggest running Bib@TeX{} when it is +not needed. + +@item +Press @kbd{M-x LaTeX-209-to-2e @key{ret}} to make a stab at converting a +La@TeX{} 2.09 header to La@TeX{}2e. + +@item +@kbd{C-c C-m input @key{ret}} should be faster now on second try. + +@item +New variable @code{LaTeX-left-right-indent-level} controls the +indentation added by @samp{\left}. + +@item +@samp{\begin}, @samp{\end}, @samp{\left}, and @samp{\right} no longer +need to be at the beginning of the line to take effect. + +@item +You can now delete and replace La@TeX{}2e style fonts. + +@item +Moved external commands to new menu. + +@item +@kbd{C-c C-m cite @key{ret}} will prompt for multiple keys. + +@item +Better handling of @samp{"} with @file{german.sty}. + +@item +New variable @code{LaTeX-paragraph-commands} lists La@TeX{} commands +that shouldn't be formatted as part of a paragraph. + +@item +Older news moved to @file{HISTORY}. It is not @TeX{}info able, but you +can get a plaintext version with @samp{make HISTORY}. + +@item +See the new @file{ChangeLog} file for a more detailed list of changes. +The history section will now only contain user level changes. If you +send me a patch, please also provide a ChangeLog entry. +@end itemize + +@node Version 9.1, Version 9.0, Version 9.2, History +@section News in 9.1 + +Coordinater: Per Abrahamsen, 1994. + +Alpha testers (in order of appearance): +Bernt Guldbrandtsen @samp{<bernt@@weinberg.pop.bio.aau.dk>}, +Kevin Scott @samp{<scottkj@@prl.philips.co.uk>}, +Lawrence R. Dodd @samp{<dodd@@roebling.poly.edu>}, +Michelangelo Grigni @samp{<mic@@cs.ucsd.edu>}, +David Aspinall @samp{<da@@dcs.edinburgh.ac.uk>}, +Frederic Devernay @samp{<Frederic.Devernay@@sophia.inria.fr>}, +Robert Estes @samp{<estes@@ece.ucdavis.edu>}, +Peter Whaite @samp{<peta@@cim.mcgill.ca>}, +Karl Eichwalder @samp{<karl@@pertron.central.de>}, +John Interrante @samp{<interran@@uluru.Stanford.EDU>}, +James A. Robinson @samp{<jimr@@simons-rock.edu>}, +Tim Carlson @samp{<imsgtcar@@mathfs.math.montana.edu>}, +Michelangelo Grigni @samp{<mic@@cs.ucsd.edu>}, +Manoj Srivastava @samp{<srivasta@@pilgrim.umass.edu>}, +Richard Stanton @samp{<stanton@@haas.berkeley.edu>}, +Kobayashi Shinji @samp{<koba@@flab.fujitsu.co.jp>}, +and probably more.@refill + +@itemize @bullet +@item +La@TeX{}2e is now default. Set @code{LaTeX-version} to @samp{"2"} to +disable this. + +@item +Better handling of @samp{*TeX background*} buffer. Suggested by John +Interrante @samp{<interran@@uluru.Stanford.EDU>}. + +@item +Parser did not recognise the use of @samp{\def} to create La@TeX{} +environments. Reported by Frederic Devernay +@samp{<Frederic.Devernay@@sophia.inria.fr>}. + +@item +Minor cleanup in some error messages. + +@item +Fixed bug in @code{TeX-comment-paragraph} when called with a negative +argument. Reported by Markus Kramer @samp{<kramer@@inf.fu-berlin.de>}. + +@item +Don't move point in master file when running a command on the region in +an included file. Thanks to Karl Wilhelm Langenberger +@samp{<wlang@@rs6000.mri.akh-wien.ac.at>} for the patch. + +@item +@code{LaTeX-math-mode} no longer works on Emacs 18 or older Lucid +versions. This change allowed me to unbundle @file{min-map.el}. + +@item +Made @kbd{C-c C-e} more robust, especially when applied on an empty +active region. Reported by Andrew Senior @samp{<aws@@eng.cam.ac.uk>}. + +@item +@kbd{C-c C-m section RET} and @kbd{M-@key{tab}} should work now in +@TeX{}info mode. @kbd{C-c C-b} and @kbd{C-c C-r} removed, since they +did not work. Reported by Karl Eichwalder +@samp{<karl@@pertron.central.de>}. + +@item +Made @kbd{M-q} skip block comments. Sugested by Peter Whaite +@samp{<peta@@cim.mcgill.ca>}. + +@item +Code cleanup: Renamed @samp{-format-} functions to @samp{-fill-}. + +@item +Made @kbd{,} and @kbd{.} remove any preceding italic correction. + +@item +Changes in math mode: @samp{setminus} moved to @key{\}, @samp{not} moved +to @key{/}, and @samp{wedge}, @samp{vee}, and @samp{neg} installed on +@key{&}, @kbd{|}, and @kbd{!} to make writing logic easier for C +programmers. + +@item +Renamed @file{auc-tex.el} to @file{auc-old.el} to make it less likely +that new users load it by mistake. + +@item +Changed name of @file{easymenu.el} to @file{auc-menu.el} to avoid +conflict with RMS's version. Updated it to handle the Lucid +@code{:keys} keyword argument. Defines a popup menu for both FSF and +Lucid emacs, although it is only installed in Lucid Emacs. Added David +Aspinall's @samp{<da@@dcs.edinburgh.ac.uk>} patch to handle an empty +menu bar under Lucid Emacs. The interface is still a superset of +@file{easymenu.el}. This version should no longer prevent the sharing +of byte compiled files between FSF and Lucid emacs. + +@item +Marking a section or environment now highlight it in Lucid Emacs. It +already worked in GNU Emacs. Thanks to Andreas Ernst +@samp{ernst_a@@maths.uwa.edu.au}. + +@item +Font support for La@TeX{}2e. Many people suggested this. +Automatically activated for all documents defined with +@samp{\documentclass}. + +@item +Outline support for La@TeX{}2e fixed by Robert Estes +@samp{<estes@@ece.ucdavis.edu>}. + +@item +@samp{bibliography} macro now works. Thanks to Frederic Devernay +@samp{<Frederic.Devernay@@sophia.inria.fr>}. + +@item +Fixes to @file{psfig} support by Thomas Graichen +@samp{<graichen@@sirius.physik.fu-berlin.de>}. + +@item +Fixed position of @samp{\label} in environments. Reported by Richard +Stanton @samp{<stanton@@haas.berkeley.edu>}. + +@item +Made the name of the AUC @TeX{} menu mode specific. + +@item +More reliable guesses with @kbd{C-c C-r}. Thanks to Lawrence R. Dodd +@samp{<dodd@@roebling.poly.edu>}. + +@item +Insert newline before inserting local variable section. Thanks to +Rajeev Gore' @samp{<rpg@@cs.man.ac.uk>}. + +@item +Fixes to Japanese version. Thanks to Kobayashi Shinji +@samp{<koba@@flab.fujitsu.co.jp>}. + +@item +Fixed bug in @samp{put} and @samp{multiput} macros. Thanks to Kobayashi +Shinji @samp{<koba@@flab.fujitsu.co.jp>} and Masayuki Kuwada +<kuwada@@axion-gw.ee.uec.ac.jp>. + +@item +Display number of pages after end of La@TeX{} compilation. Thanks to +Lawrence R. Dodd @samp{<dodd@@roebling.poly.edu>}. + +@item +Only update section and environment menus when the lists have changed. + +@item +New variables @code{LaTeX-header-end} and @code{LaTeX-trailer-start}. + +@item +Some Emacs 18 compatibility changes. Thanks to Fran E. Burstall +@samp{<F.E.Burstall@@maths.bath.ac.uk>}. + +@item +Use nonrecursive function to determine the current environment. This +should solve problems with exceeding lisp max depth. Contributed by +David Aspinall @samp{<da@@dcs.edinburgh.ac.uk>}. + +@item +Fixed documentation for @kbd{` ~} in @file{math-ref.tex}. Thanks to +Morten Welinder @samp{<terra@@diku.dk>}. + +@item +Made @code{LaTeX-math-mode} work better with FSF Emacs 19 in the case +where you press something undefined, in particular function keys. +Requested by several. + +@item +Inserting an itemize environment around the active region now insert the +first item inside the environment. Thanks to Berwin A. Turlach +@samp{<berwin@@core.ucl.ac.be>} for reporting this. + +@item +Fixed bug in right button menu under Lucid. Reported by Frederic +Devernay @samp{<Frederic.Devernay@@sophia.inria.fr>}. +@end itemize + +@node Version 9.0, Version 8.0, Version 9.1, History +@section News in 9.0 + +Coordinator: Per Abrahamsen, 1994. + +Alpha testers (in order of appearance): +Volker Dobler @samp{<dobler@@etu.wiwi.uni-karlsruhe.de>}, +Piet van Oostrum @samp{<piet@@cs.ruu.nl>}, +Frederic Devernay @samp{<Frederic.Devernay@@sophia.inria.fr>}, +Robert Estes @samp{<estes@@ece.ucdavis.edu>}, +Berwin Turlach @samp{<berwin@@core.ucl.ac.be>}, +Tim Carlson @samp{<imsgtcar@@mathfs.math.montana.edu>}, +Peter Thiemann @samp{<thiemann@@provence.informatik.uni-tuebingen.de>}, +Kevin Scott @samp{<scottkj@@prl.philips.co.uk>}, +Lawrence R. Dodd @samp{<dodd@@roebling.poly.edu>}, +Johan Van Biesen @samp{<vbiesen@@wins.uia.ac.be>}, +Marc Gemis @samp{<makke@@wins.uia.ac.be>}, +Michelangelo Grigni @samp{<mic@@cs.ucsd.edu>}, +Kevin Scott @samp{<scottkj@@prl.philips.co.uk>}, +Peter Paris @samp{<pparis@@bass.gmu.edu>}, +Peter Barth @samp{<barth@@mpi-sb.mpg.de>}, +Andy Piper @samp{<ajp@@eng.cam.ac.uk>}, +Richard Stanton @samp{<stanton@@haas.berkeley.edu>}, +Christoph Wedler @samp{<wedler@@fmi.uni-passau.de>}, +Graham Gough @samp{<graham@@cs.man.ac.uk>}, +and probably more.@refill + +@itemize @bullet +@item +Fixed problem with @file{filladapt} defeating La@TeX{} mode's own +indentation algorithm. Thanks to Piet van Oostrum +@samp{<piet@@cs.ruu.nl>}. + +@item +Made environments and sections selectable from the menu bar. + +@item +Support Emacs comment conventions. Comments starting with a single +@samp{%} are indented at @code{comment-column}. Comments starting with +@samp{%%%} are indented at column 0. Comments starting with +@samp{%%} are indented like ordinary text. You can set the variables +@code{LaTeX-right-comment-regexp} and @code{LaTeX-left-comment-regexp} +to nil to disable this. See also @code{LaTeX-ignore-comment-regexp}. +Rewrote it from Christoph Wedler @samp{<wedler@@fmi.uni-passau.de>} from +original code. + +@item +@key{tab} and @key{lfd} will not indent code in @samp{verbatim} +environment if you set @code{LaTeX-indent-environment-check} to non-nil. +This was also first implemented by Christoph Wedler +@samp{<wedler@@fmi.uni-passau.de>}. + +@item +You can now get get custom indentation for various environments. See +@code{LaTeX-indent-environment-list}. + +@item +@kbd{C-c C-m left @key{ret}} new automatically inserts a matching +@samp{\right}. See variables @code{TeX-left-right-braces}, +@code{TeX-braces-default-association}, and +@code{TeX-braces-user-association}. This feature was suggested by Jesse +@samp{<jes@@math.msu.edu>} and implemented by Berwin Turlach +@samp{<berwin@@core.ucl.ac.be>}. + +@item +Don't automatically display the compilation buffer unless +@code{TeX-show-compilation} in non-nil. Suggested by Stefan Schoef +@samp{Stefan.Schoef@@arbi.informatik.uni-oldenburg.de}. + +@item +Bundled @file{ltx-help.el}. Press @kbd{C-h C-l} to get the +documentation for a LaTeX command. + +@item +Fixed indentation of @samp{\left} and @samp{\right}. Thanks to +Christoph Wedler @samp{<wedler@@fmi.uni-passau.de>}. + +@item +Installation procedure changed. @file{tex-site.el} is now intended to +survive AUC @TeX{} upgraded. The distribution version only contains +autoloads (eliminating the need for @file{tex-load.el} , the +customization variables are moved to @file{tex.el}. You should copy +those variables you need to customize from @file{tex.el} to +@file{tex-site.el}. + +@item +Made it possible to use absolute paths when including bibliographies or +style files. + +@item +Fixed problem with parsing errors after running La@TeX{} on the region +from the menu. Thanks to Peter Barth @samp{<barth@@mpi-sb.mpg.de>} for +finding this one. + +@item +The file @file{doc/ref-card.texi} has been renamed to +@file{doc/tex-ref.texi} to avoid confusion with the reference card for +GNU Emacs. Suggested by Michelangelo Grigni @samp{<mic@@cs.ucsd.edu>}. + +@item +The @file{README}, @file{CHANGES} and @file{INSTALLATION} files are now +generated from chapters of this manual, to ensure they stay in sync. + +@item +@kbd{M-@key{tab}} will now complete some macro arguments in addition to +macro names. In particular, if you press @kbd{M-@key{tab}} after +@samp{\cite@{} or @samp{\ref@{} you will get completion for bibitems and +labels, respectively. + +@item +Merged a number of files. The major files are now @file{tex.el} for +plain @TeX{} and common support, @file{tex-buf.el} for running external +commands, and @file{latex.el} for La@TeX{} support. + +@item +Unbundled @file{outln-18.el}. Users of Emacs 18 or Lucid Emacs 19.9 or +earlier must get @file{outln-18.el} and install it as @file{outline.el} +if they want the outline commands to work. + +@item +No longer bind @kbd{C-c @key{tab}} to @code{TeX-complete-symbol}. Use +@kbd{M-@key{tab}} instead. + +@item +Cleaned up the parser and parameterizedd it. Now you can add now types +of information to be maintained by the parser simply by calling +@code{TeX-auto-add-type}. You still need to install the regexps with +@code{TeX-auto-add-regexp}. + +@item +Disable the automatic insertion of empty braces after macros with no +arguments in @code{LaTeX-math-mode}. Added a variable +@code{TeX-insert-braces} to disable it everywhere. + +@item +Now complete with existing labels when asking for a label in a La@TeX{} +environment. Suggested by Berwin Turlach +@samp{<berwin@@core.ucl.ac.be>}. + +@item +The variables @code{TeX-private-macro}, @code{TeX-private-auto}, and +@code{TeX-private-style} are now initialized from the @samp{TEXINPUTS} +and @samp{BIBINPUTS} environment variables. + +@item +@kbd{C-c C-f} and @kbd{C-c C-e} will now put the template around the +region if the region is active. + +@item +Fixed @kbd{C-u C-c C-e} to handle environments ending with a star +(@samp{*}). Reported by Berwin Turlach +@samp{<berwin@@core.ucl.ac.be>}. + +@item +Don't use @code{with-output-to-temp-buffer} for compilation buffer. +Fixed by Frederic Devernay @samp{<Frederic.Devernay@@sophia.inria.fr>}. + +@item +New function @code{TeX-command-buffer} (@kbd{C-c C-b}) to run a command +on the (visible part of) the current buffer. Requested by several +people. + +@item +Bundled the latest @file{reporter.el}, added +@code{TeX-submit-bug-report} to menus. + +@item +@code{TeX-insert-braces} now takes an argument like +@code{insert-parentheses}. Thanks to Lawrence R. Dodd +@samp{<dodd@@roebling.poly.edu>}. + +@item +Fixed bug in @samp{\put} and @samp{\multiput} macros. Thanks to Kevin +Scott @samp{<scottkj@@prl.philips.co.uk>}. + +@item +Deleted @code{ams-latex-mode}, @code{slitex-mode}, and +@code{foiltex-mode}. Instead, use @code{LaTeX-command-style} to +determine the name of the external command to use. + +@item +Deleted @code{latex2e-mode}. Instead set the @code{LaTeX-version} +variable. This may be done automatically if you use +@samp{\documentclass} in the future. + +@item +Fixed Lucid Emacs menu for @TeX{}info mode. Thanks to Frederic Devernay +@samp{<Frederic.Devernay@@sophia.inria.fr>}, + +@item +Added support for @file{harvard.sty} by Berwin Turlach +@samp{<berwin@@core.ucl.ac.be>}. + +@item +Filling will not let display math equations @samp{\[ ... \]} be on a +line by themselves. Reported by Matthew Morley +@samp{<Matthew.Morley@@gmd.de>}. + +@item +Made @code{words-include-escapes} default to nil. + +@item +Made @code{TeX-expand-list} expansions case sensitive. Thanks to Havard +Rue @samp{<Havard.Rue@@sima.sintef.no>}. + +@item +Fixed error in calculating indentation for lines starting with a brace. +Thanks to Piet van Oostrum @samp{<piet@@cs.ruu.nl>}. + +@item +Fixed bug in the @samp{addcontentsline}, @samp{newtheorem}, and +@samp{pagenumbering} macros reported by Berwin Turlach +@samp{<berwin@@core.ucl.ac.be>}. + +@item +Doc fixes by Lawrence R. Dodd @samp{<dodd@@roebling.poly.edu>}. + +@item +Indentation no longer fooled by @samp{\\@{}, Thanks to Peter Thiemann +@samp{<thiemann@@provence.informatik.uni-tuebingen.de>}. + +@item +Bind @kbd{M-C-e} and @kbd{M-c-a} to @code{LaTeX-find-matching-end} and +@code{LaTeX-find-matching-begin}. Suggested by Lawrence R. Dodd +@samp{<dodd@@roebling.poly.edu>}. + +@item +Added variable @code{TeX-quote-after-quote} which causes +@code{TeX-insert-quote} to insert literal @samp{"} except when after +another @samp{"}, in which case it will expand to @code{TeX-open-quote} +or @code{TeX-close-quote}. This code was contributed by Piotr Filip +Sawicki @samp{<pfs@@mimuw.edu.pl>}. + +@item +Added support for Polish style files @file{plfonts.sty} and +@file{plhb.sty}, contributed by Piotr Filip +Sawicki @samp{<pfs@@mimuw.edu.pl>}. + +@item +Added section with suggestions for how to handle European +character sets. + +@item +Created workaround for bug in the regexp handler in some Emacs 18 +versions and older versions of Lucid Emacs. The workaround +means you cannot use space in the documentstyle command in Emacs and +Lucid Emacs earlier than version 19.9. + +@item +@file{powerkey.el} is removed since the functionality is integrated in +GNU Emacs + +@item +@kbd{C-u "} now inserts four literal @samp{"}, not just one. To insert +a single @samp{"} either press @key{"} twice or use @kbd{C-q "}. + +@item +Allow non-string value for @code{outline-minor-map-prefix}. Reported by +David Smith @samp{<maa507@@comp.lancs.ac.uk>}. + +@item +Make the use of @code{write-file-hooks} more safe, and use +@code{local-write-file-hooks} when possible. Suggested by David Smith +@samp{<maa507@@comp.lancs.ac.uk>}. + +@item +Don't indent @samp{\begin@{verbatim@}} and @samp{\end@{verbatim@}}, +since any space before @samp{\end@{verbatim@}} is significant. Thanks to +Peter Thiemann @samp{<thiemann@@informatik.uni-tuebingen.de>} for the +patch. + +@item +Show available fonts when you try to insert an non-existing font. +Suggested by David Smith @samp{<maa507@@comp.lancs.ac.uk>}. + +@item +The @code{member} function in @file{tex-18.el} does not depend on +@code{TeX-member} now. Thanks to Piet van Oostrum +@samp{<piet@@cs.ruu.nl>}. + +@item +Do not overwrite any global binding of @kbd{M-@kbd{ret}}. Suggested by +Jens Petersen @samp{<J.Petersen@@qmw.ac.uk>}. + +@item +Major modes for writing text are supposed to rebind @kbd{M-@kbd{tab}} to +@code{ispell-complete-word}. Reported by Jens Petersen +@samp{<J.Petersen@@qmw.ac.uk>}. + +@item +Fixed problems with @TeX{}info menus. Thanks to David Smith +@samp{<maa507@@comp.lancs.ac.uk>} for reporting this. + +@item +Code cleanup. Removed the @file{format} directory, as it did not make +it easier to add new @TeX{} modes, quite the contrary. + +@item +Fixed name conflict in @file{auc-tex.el}, reported by Rik Faith +@samp{<faith@@cs.unc.edu>}. + +@item +Fixed some spelling errors. Thanks to Lawrence R. Dodd +@samp{<dodd@@roebling.poly.edu>}. + +@item +Fixed bug prohibiting non-standard file extensions. Now recognize +@file{.ltx} by default. Suggested by Lawrence R. Dodd +@samp{<dodd@@roebling.poly.edu>}. + +@item +Name of the AUC @TeX{} info files changes once again to be usable under +DOS. This time simply to @file{auctex}. + +@item +Documented @code{TeX-outline-extra}. + +@item +Could not select command on region from the menu before loading +@file{tex-buf}. Reported by Uwe Bonnes +@samp{<bon@@lte.e-technik.uni-erlangen.de>}. + +@item +Make the hilit19 interface more robust. Thanks to William Dean Norris +II @samp{<wdn@@dragonfly.cis.ufl.edu>}. + +@item +More OS/2 Makefile fixes by Bodo Huckestein +@samp{<bodo@@eu10.mpi-hd.mpg.de>}. + +@item +Reimplemented comment support on top of @code{comment-region}, giving +slightly different semantics. +@end itemize + + +@node Version 8.0, Version 7.3, Version 9.0, History +@comment node-name, next, previous, up +@section News in 8.0 + +Coordinator: Per Abrahamsen, 1993. + +Alpha testers (in order of appearance): Marc Gemis +@samp{<makke@@wins.uia.ac.be>}, Shinji Kobayashi +@samp{<koba@@flab.fujitsu.co.jp>}, Philippe Defert +@samp{<defert@@gnuisance.cern.ch>}, Richard Stanton +@samp{<stanton@@haas.berkeley.edu>}, Norbert Kiesel +@samp{<norbert@@i3.informatik.rwth-aachen.de>}, Roberto Cecchini +@samp{<CECCHINI@@fi.infn.it>}, Hanno Wirth @samp{<wirth@@igd.fhg.de>}, +Tim Carlson @samp{<tim@@math.montana.edu>}, John Daschbach +@samp{<dasch@@darkwing.uoregon.edu>}, Bob Fields +@samp{<bob@@minster.york.ac.uk>}, Peter Whaite +@samp{<peta@@cim.mcgill.ca>}, Volker Dobler +@samp{<dobler@@etu.wiwi.uni-karlsruhe.de>}, Phil Austin +@samp{<phil@@geog.ubc.ca>}, Martin Maechler +@samp{<maechler@@stat.math.ethz.ch>}, Havard Rue +@samp{<Havard.Rue@@sima.sintef.no>}, Tim Geisler +@samp{<tmgeisle@@faui80.informatik.uni-erlangen.de>}, Tim Carlson +@samp{<imsgtcar@@mathfs.math.montana.edu>}, Sridhar Anandakrishnan +@samp{<sak@@essc.psu.edu>}, Peter Thiemann +@samp{<thiemann@@provence.informatik.uni-tuebingen.de>}, Pedro Quaresma +@samp{<pedro@@mat.uc.pt>}, Christian Lynbech +@samp{<lynbech@@daimi.aau.dk>}, Kevin Scott +@samp{<scottkj@@prl.philips.co.uk>}, Bodo Huckestein +@samp{<bodo@@eu10.mpi-hd.mpg.de>}, Cengiz Alaettinoglu +@samp{<ca@@cs.UMD.EDU>}, Jakob Schiotz +@samp{<schiotz@@fysik.dth.dk>}, and probably more.@refill + +@itemize @bullet +@item +New variable @code{LaTeX-letter-sender-address} contains default address +for use with the letter style. Set it to the address of your +organization in @file{tex-site.el}. Thanks to Sridhar Anandakrishnan +@samp{<sak@@essc.psu.edu>}. + +@item +Makefile now works under OS/2 with GNU Make. Thanks to Bodo Huckestein +@samp{bodo@@eu10.mpi-hd.mpg.de}. + +@item +Made it possible to install global auto files without having Bib@TeX{} +mode installed. Thanks to Christian Lynbech +@samp{<lynbech@@daimi.aau.dk>}. + +@item +Minor documentation fixes. Thanks to Martin Maechler +@samp{<maechler@@stat.math.ethz.ch>}. + +@item +Added support for @samp{eqref} for the @samp{amsart} style. Thanks to +Peter Whaite @samp{<peta@@cim.mcgill.ca>}. + +@item +Use @samp{-c} as the default shell command option under @samp{emx}. +Eberhard Mattes @samp{<mattes@@azu.informatik.uni-stuttgart.de>} says +it is better than @samp{/c}. + +@item +Made powerkey in the menus work better under OS/2. Thanks to Eberhard +Mattes @samp{<mattes@@azu.informatik.uni-stuttgart.de>}. + +@item +Made the reference cards print correctly on US letter format paper. +Thanks to Magnus Nordborg @samp{<magnus@@fisher.Stanford.EDU>}. + +@item +@code{LaTeX-dead-mode} removed. Read the file `ISO-TEX' for alternative +solutions. + +@item +All minor modes unbundled. You can find them from ftp at +@samp{ftp.iesd.auc.dk} in the directory @file{/pub/emacs-lisp}. Removed +information about minor modes from this document. + +@item +New hooks for changing ispell directory, see @file{tex-site.el} for +details. + +@item +La@TeX{}2e mode now supported. Insert + +@lisp + (setq TeX-default-mode 'latex2e-mode) +@end lisp + +in your @file{.emacs} file to get documentclass instead of documentstyle +per default. The parser recognizes documentclass, usepackage, and +newcommand with a default argument. There are also templates for all of +them. + +@item +Added Jakob Schiotz's @samp{<schiotz@@fysik.dth.dk>} help file for +installing AUC @TeX{} on OEMACS. It will probably also be of interest +for DEMACS users. + +@item +Minor changes to be more friendly for OEMACS, thanks to Jakob Schiotz +@samp{<schiotz@@fysik.dth.dk>}. + +@item +The control key bindings in @code{LaTeX-math-mode} now works, thanks to +Frederic Devernay @samp{<Frederic.Devernay@@sophia.inria.fr>}. + +@item +La@TeX{} outlines no longer matches @samp{\partial} or other commands +with a sectioning command as prefix. Thanks to Jakob Schiotz +@samp{<schiotz@@fysik.dth.dk>}. + +@item +@code{LaTeX-fill-paragraph} now handles the case where the previous line +both contain an @samp{\item} and an unmatched open brace. Thanks to +Piet van Oostrum @samp{<piet@@cs.ruu.nl>}. + +@item +Use abbreviated file name for @TeX{} output buffers in Emacs 19. Thanks +to Jens Gustedt @samp{<gustedt@@math.tu-berlin.de>}. + +@item +Added lowercase alias for @code{LaTeX-math-mode} for use with Emacs file +mode commands. Thanks to Olaf Burkart +@samp{<burkart@@zeus.informatik.rwth-aachen.de>}. + +@item +Added code to reuse old region in @code{TeX-command-region} if mark is +not active. Thanks to Cengiz Alaettinoglu @samp{<ca@@cs.UMD.EDU>}. + +@item +Now get keyboard accelerators on all menus rather than only AUC @TeX{} +menus, thanks to the @file{powerkey.el} file by Lars Lindberg +@samp{<lli@@sypro.cap.se>}. + +@item +Added @code{TeX-electric-macro} for faster completion of @TeX{} macros. +@xref{Completion}. + +@item +Comparing printer names are now case incentive. Thanks to Richard +Stanton @samp{<stanton@@haas.berkeley.edu>}. + +@item +Default shell fixed for OS/2. Thanks to Richard Stanton +@samp{<stanton@@haas.berkeley.edu>}. + +@item +Added functions to hide (@code{LaTeX-hide-environment}) and show +(@code{LaTeX-show-environment}) the current environment. + +@item +@kbd{C-u C-c C-e} will now modify the current environment instead of +inserting a new environment. This is like the optional argument to the +font commands. + +@item +Added nabla to LaTeX Math Mode. Suggested by Bill Reynolds +@samp{<bill@@goshawk.lanl.gov>}. + +@item +Added commands for running @TeX{} and La@TeX{} interactively. Thanks to +David Carlisle @samp{<carlisle@@computer-science.manchester.ac.uk>}. + +@item +The external commands will now insert there output @emph{before} point +in the output buffers. This allows you to follow the progress by +putting point at the end of the file. Suggested by Jak Kirman +@samp{<jak@@cs.brown.edu>}. + +@item +When invoking an external command from a menu, the document will be +automatically saved. + +@item +There are now a printer menu for emacs 19. + +@item +Redesigned dependency checking. Now only checks dependencies for files +loaded in the current emacs session. This is much faster, but will not +catch files that are edited outside this emacs session, or files edited +in killed buffers. @strong{@code{TeX-check-path} must at least contain +@file{.} for saving to work}. If you have set @samp{TeX-check-path} +in your @file{.emacs} file, remove it. The default value is fast enough +now. + +@item +New variable @code{TeX-save-query} control if AUC @TeX{} will query you +for each modified buffer when you save the document. Set it to nil to +get rid of these questions. Setting this variable also affect the +automatic saving of the document that happens each time you start an +external command. + +@item +New command @code{TeX-save-document} will save all files in the current +document, i.e. the document associated with the current buffer. + +@item +Cleaned up all minor modes, also made them use @file{min-map.el} or +@file{min-mode.el} instead of @file{min-bind.el}. + +@item +Cleaned up release management. + +@item +AUC TeX will not longer be confused when you rewrite a file under a new +name. + +@item +Lots of code cleanup, involving reformatting the source and renaming all +@samp{-hook} variables and functions to conform with the Emacs 19 +guidelines. + +@item +Can now parse Japanese characters in labels and macros when you use +Japanese @TeX{}. Thanks to Shinji Kobayashi +@samp{<koba@@flab.fujitsu.co.jp>}. + +@item +Made it safe to quit when AUC @TeX{} asks for the name of the master +file. It will simply assume the file itself is the master, and continue +without inserting any file local variables. + +@item +Support for @code{epsf} and @code{psfig} style files. Thanks to Marc +Gemis @samp{<makke@@wins.uia.ac.be>}. + +@item +Support for La@TeX{}info. Thanks to Marc Gemis +@samp{<makke@@wins.uia.ac.be>}. + +@item +Only examine the first 10000 bytes to find out what @TeX{} mode to use. + +@item +Added @code{TeX-submit-bug-report} command to submit bug reports. It +uses the @file{reporter.el} distributed with SuperCite, so it may not be +available in some Emacs 18 installations. + +@item +Speeded up parsing significantly by using a simpler regexp. + +@item +Added variable @code{TeX-auto-untabify}. Set it to nil to prevent +untabifying the buffer when it is saved. Several people wanted this. + +@item +Changed defaults to @emph{not} do any automatic parsing, nor prompt for +a master file. @xref{Parsing Files}, @ref{Multifile}, for information +about how ot correct this. In short, insert the following in your +@file{.emacs} file. + +@lisp +(setq TeX-auto-save t) +(setq TeX-parse-self t) +(setq-default TeX-master nil) +@end lisp + +@item +Some grammatical fixes to the @file{PROBLEMS} file. Thanks to Lawrence +R. Dodd @samp{<dodd@@roebling.poly.edu>}. + +@item +No longer install a separate @code{outline-minor-mode} by default, as +the FSF Emacs 19.19 @code{outline-minor-mode} is adequate. The included +file @file{outln-18.el} emulates the FSF Emacs 19.19 mode under Emacs 18. + +The FSF Emacs 19.19 @code{outline-minor-mode} use the @kbd{C-c} prefix +instead of @kbd{C-c C-o} by default, and does not bind as many keys as +the @code{outline-minor-mode} distributed with earlier versions of AUC +@TeX{} did. You can get the keybindings back together with other +goodies by inserting +@example +(require 'out-xtra) +@end example +in your @file{.emacs} file. @file{out-xtra.el} will probably be +unbundled from AUC @TeX{} in the future. + +@item +Some fixes to AmS-@TeX{} mode by Ulf Juergens +@samp{<ulf@@mathematik.uni-bielefeld.de>}. + +@item +Make @samp{plain-TeX-mode-menu} work in Lucid Emacs. Thanks to Anthony +Rossini @samp{rossini@@hsph.harvard.edu} for reporting this. + +@item +First cut on a @TeX{}info mode. + +@item +More strict about parsing @samp{\bibitem}'s and Bib@TeX{} entries. + +@item +Made it easier to write style files for environments that takes +arguments and documented it. Suggested by Martin +Wunderli @samp{<wunderli@@inf.ethz.ch>}. + +@item +Parse optional argument to @samp{\newenvironment}. Suggested by Martin +Wunderli @samp{<wunderli@@inf.ethz.ch>}. + +@item +Fixed @samp{parbox} macro. Thanks to Shinji Kobayashi +@samp{<koba@@flab.fujitsu.co.jp>}. + +@item +Made the parser work better in outline minor mode. Thanks to Salvador +Pinto Abreu @samp{<spa@@khosta.fct.unl.pt>}. + +@item +Also save style information with @code{TeX-normal-mode} when buffer not +modified. + +@item +Use @code{$(MAKE)} instead of @samp{make} to invoke @code{make} from the +@file{Makefile}. Thanks to John Interrante +@samp{<interran@@uluru.Stanford.EDU>}. + +@item +Make last value default for @code{TeX-insert-macro}. Suggested by Matt +Fairtlough @samp{<M.Fairtlough@@dcs.sheffield.ac.uk>}. + +@item +Renamed info file to @samp{auc-info} in order to fill DOS file limits. +Please remember to update your @file{dir} file to reflect this change. + +@item +Delete auto file instead of saving an empty file. +@end itemize + +@node Version 7.3, Version 7.2, Version 8.0, History +@comment node-name, next, previous, up +@section News in 7.3 + +Coordinator: Per Abrahamsen, 1993. + +@itemize @bullet +@item +More robust installation, especially for Lucid Emacs (I hope). Many +people reported problems with this. + +@item +Make `easymenu' work when byte-compiled. Many people reported this +bug. + +@item +Minimally updated the @file{README} file from version 6.0 (sigh). +Thanks to Boris Goldowsky @samp{<boris@@cs.rochester.edu>} for reporting +this. + +@item +Added @samp{@@finalout} to manual. Reported by Henrik Drabol +@samp{<hvd@@ens004.ens.min.dk>}. + +@item +Fixed @kbd{M-q} to work after an @samp{\end@{@dots{}@}}. It will not +work at the end of the buffer, but there are usually the local variables +so it should (hopefully) not matter. Thanks to Shinji Kobayashi +@samp{<koba@@flab.fujitsu.co.jp>} again. + +@item +New variables @code{TeX-open-quote} and @code{TeX-close-quote} determine +what is inserted by @code{TeX-insert-quote}. The @file{german} style +file now use those variables instead of changing the keymap. + +@item +Changes to the default settings in @file{tex-site.el}, in particular a +@samp{Queue} command is added to display the print queue. Thanks to +John Interrante @samp{<interran@@uluru.Stanford.EDU>} for code, and +other members of the @samp{auc-tex@@iesd.auc.dk} mailing list for +ideas. + +@item +Make sure all outline mode commands are bound in +@code{outline-minor-mode}. + +@item +Added autoload for @code{TeX-command}. Thanks to Hanno Wirth +@samp{<wirth@@igd.fhg.de>} for reporting this. + +@item +Added support for AmS@TeX{} and AmSLa@TeX{}. Currently they are +identical to @TeX{} and La@TeX{} except for another default command. + +@item +Added Vor@TeX{} style matching of dollar sign. The style is guaranteed +to be Vor@TeX{}, since I lifted the code directly from Vor@TeX{}. +Thanks to Pehong Chen @samp{<phc@@renoir.berkeley.edu>} for writing the +Vor@TeX{} code. Thanks to Jak Kirman @samp{<jak@@cs.brown.edu>} for +pointing out this nice Vor@TeX{} feature. + +@item +Added information about AUC @TeX{} mail addresses to the manual. Thanks +to Dave Smith @samp{<maa507@@computing.lancaster.ac.uk>}. + +@item +Added menu to for plain @TeX{}. Suggested by Tim Carlson +@samp{<imsgtcar@@math.montana.edu>}. + +@item +Made the menus depend on @code{TeX-command-list}. + +@item +Made it possible to specify @code{TeX-auto-regexp-list} in the local +variable section of each file. + +@item +Added variable @code{TeX-auto-parse-length} to specify maximal length of +text that will be parsed. + +@item +Added automatic parsing of Bib@TeX{} files and @samp{bibitem} entries in +order to get completion in @samp{cite}. This was inspired by an add on +made by Sridhar Anandakrishnan @samp{<sak@@essc.psu.edu>}. + +@item +Added variable @code{TeX-byte-compile} to disable automatic byte +compilation of style files when loaded. This is needed when using +different Emacs versions. + +@item +Added variable @code{TeX-translate-location-hook} to translate file and +line information before showing an error, as requested by Thorbjoern +Ravn Andersen @samp{<ravn@@imada.ou.dk>}. + +@item +Added variable @code{TeX-auto-save} to allow disabling the automatic +saving of style information, either per file in the file local +variables, or globally by using @code{setq-default}. Use +@code{TeX-normal-mode} to force style information to be saved. + +@item +Try to create @file{auto} directory if it does not exists. + +@item +Added chapter describing how to tune the @TeX{} parsing. + +@item +Allow (but do not encourage) a string value for +@code{LaTeX-default-options}. + +@item +Give @samp{"} word syntax when german.sty is loaded. Suggested by Tim +Geisler @samp{<tmgeisle@@immd8.informatik.uni-erlangen.de>}. + +@item +Many corrections to the grammar in the manual. Thanks to Manfred +Weichel @samp{<Manfred.Weichel@@sto.mchp.sni.de>}. + +@item +Bind @code{TeX-home-buffer} to @kbd{C-c ^} instead of @kbd{C-c C-h} +which are reserved in Emacs 19. Suggested by Chris Moore +@samp{<Chris.Moore@@src.bae.co.uk>}. +@end itemize + +@node Version 7.2, Version 7.1, Version 7.3, History +@comment node-name, next, previous, up +@section News in 7.2 + +Coordinator: Per Abrahamsen, 1993. + +@itemize @bullet +@item +@code{LaTeX-dead-mode} works again. Thanks to Patrick O'Callaghan +@samp{<poc@@usb.ve>} for fixing it. + +@item +Minor fixes to the documentation. Thanks to Shinji Kobayashi +@samp{<koba@@flab.fujitsu.co.jp>}. + +@item +Add @samp{Compiling} to the mode line of all buffers, while there is a +AUC @TeX{} compilation process running. This is similar to the behavior +of @code{compile} in Emacs 19. + +@item +@code{TeX-normal-mode} will now save the buffer first to make sure it +gets reparsed. + +@item +Labels with underscores are now recognized. Thanks to Wolfgang Franzki +@samp{<W.Franzki@@kfa-juelich.de>} + +@item +Fix to `ghostview' printer specification. Thanks to Masayuki Kuwada +@samp{<kuwada@@soliton.ee.uec.ac.jp>}. + +@item +Recognize @samp{abstract}, @samp{center}, @samp{titlepage}, +@samp{verse}, and @samp{theindex} environments. Thanks to Masayuki Kuwada +@samp{<kuwada@@soliton.ee.uec.ac.jp>}. + +@item +Fix to @samp{newsavebox} macro. Thanks to Shinji Kobayashi +@samp{<koba@@flab.fujitsu.co.jp>} for reporting this. + +@item +Menu support for GNU Emacs 19 and Lucid Emacs. Thanks to Alastair Burt +@samp{<burt@@dfki.uni-kl.de>} for the initial Lucid Emacs version. + +@item +@kbd{C-c C-f C-d} now deletes the current font. The current font is +defined to be the innermost @TeX{} group starting with a @TeX{} macro +that is terminated by a space. + +@item +Giving @kbd{C-c C-f} a prefix argument will replace the current font, +i.e. @kbd{C-u C-c C-f C-b} will change the current font to bold. + +The old functionality (putting the font around the region) has been +removed. To make the region bold, type @kbd{C-w C-c C-f C-b C-y} +instead. + +@item +Chapter recognized as largest heading in the report style. Thanks to +Shinji Kobayashi @samp{<koba@@flab.fujitsu.co.jp>} for reporting +this. + +@item +More support for Japanese style files. Thanks to Shinji Kobayashi +@samp{<koba@@flab.fujitsu.co.jp>}. + +@item +No longer put @samp{Outline} in the mode line whenever +@code{selective-display} is set. Thanks to Lawrence R. Dodd +@samp{<dodd@@roebling.poly.edu>} for reporting this. + +@item +Support for inserting calligraphic letters in @code{TeX-math-mode} with +@kbd{` c @key{letter}}. Thanks to Olaf Burkart +@samp{<burkart@@zeus.informatik.rwth-aachen.de>}. + +@item +@code{set-docstring} in @file{tex-math.el} should work better now. +Thanks to Alastair Burt @samp{<burt@@dfki.uni-kl.de>} and Olaf Burkart +@samp{<burkart@@zeus.informatik.rwth-aachen.de>}. + +@item +Support for dviout preview on PC-9801. Thanks to Shinji Kobayashi +@samp{<koba@@flab.fujitsu.co.jp>}. + +@item +Inserting environment in empty buffer should work now. Thanks to +Alastair Burt @samp{<burt@@dfki.uni-kl.de>}. + +@item +Default float for figures changed from @samp{tbp} to @samp{htbp}. + +@item +@code{LaTeX-format-environment} may work now. Thanks to Shinji +Kobayashi @samp{<koba@@flab.fujitsu.co.jp>}. + +@item +Better @code{LaTeX-close-environment}. Thanks to Thorbjoern Hansen +@samp{<thansen@@diku.dk>}. + +@item +Some support for Ispell 4.0. + +@item +Bib@TeX{} in Emacs 19 need @code{tex-insert-quote}, make it autoload +from AUC @TeX{} instead of the standard @code{tex-mode}. + +@item +@code{TeX-auto-generate} failed when repeated. Thanks to Peter Whaite +@samp{<peta@@Thunder.McRCIM.McGill.EDU>} for reporting this. +@end itemize + +@node Version 7.1, Version 7.0, Version 7.2, History +@comment node-name, next, previous, up +@section News in 7.1 + +Coordinator: Per Abrahamsen, 1993. + +@itemize @bullet +@item +Allow multiple @samp{%p} in print commands. + +Suggested by Cliff Krumvieda @samp{<cliff@@cs.cornell.edu>}. + +@item +Improved backward compatibility in @file{auc-tex.el}. Thanks to Ralf +Handl @samp{<handl@@cs.uni-sb.de>}. + +@item +New style hook for @file{german.sty}. + +Disable smart quotes. Press @kbd{C-c C-n} to make it take effect. + +@item +Allow files to have other extensions than ``tex''. + +But no longer allow files to have multiple dots. Sigh. + +@item +Will no longer parse the buffer if it can use the saved state. + +@item +New variable @code{TeX-parse-self}. + +Set it to nil if you never want to parse the buffer when you load it. + +@item +Only offer to save files that belongs to the document. + +When you format the document with @kbd{C-c C-c}, AUC @TeX{} will no +longer offer to save your @file{RMAIL}, @file{.newsrc}, or other files +that does not belong to the document. Suggested by Jim Hetrick +@samp{<hetrick@@phys.uva.nl>}. + +@item +Foil@TeX{} support. + +Thanks to Sven Mattisson @samp{<sven@@tde.lth.se>} + +@item +Smarter about when you need to reformat. + +Thanks to Chris Callsen @samp{<chris@@iesd.auc.dk>}. + +@item +Japanese @TeX{} + +Now supports Japanese @TeX{}. Thanks to Shinji Kobayashi +@samp{<koba@@keisu-s.t.u-tokyo.ac.jp>}. + +@item +Works again under OS/2 and other case insensitive file systems. + +@item +DEMACS support. + +Thanks to Shinji Kobayashi @samp{<koba@@keisu-s.t.u-tokyo.ac.jp>}. + +@item +Better @code{LaTeX-close-environment}. + +Thanks to Piet van Oostrum @samp{<piet@@cs.ruu.nl>}. + +@item +Ispell support. + +Thanks to Piet van Oostrum @samp{<piet@@cs.ruu.nl>}. + +@item +Support for Russian letters. + +Thanks to Justin R. Smith @samp{<jsmith@@king.mcs.drexel.edu>}. + +@item +Sli@TeX{} fixes. + +Many people. + +@item +Fixes for spelling errors. + +Many people. + +@end itemize + +@node Version 7.0, Version 6.1, Version 7.1, History +@comment node-name, next, previous, up +@section Version 7.0 + +Coordinator: Per Abrahamsen, 1993. + +Alpha testers (in order of appearance): Piet van Oostrum +@samp{<piet@@cs.ruu.nl>}, Sven Mattisson @samp{<sven@@tde.lth.se>}, Tim +Geisler @samp{<tmgeisle@@immd8.informatik.uni-erlangen.de>}, Fran E. +Burstall @samp{<F.E.Burstall@@maths.bath.ac.uk>}, Alastair Burt +@samp{<burt@@dfki.uni-kl.de>}, Sridhar Anandakrishnan +@samp{<sak@@essc.psu.edu>}, Kjell Gustafsson +@samp{<kjell@@sccm.Stanford.EDU>}, Uffe Kjaerulff +@samp{<uk@@iesd.auc.dk>}, Kurt Swanson @samp{Kurt.Swanson@@dna.lth.se}, +Mark Utting @samp{<marku@@cs.uq.oz.au>}, Per Norman Oma +@samp{perno@@itk.unit.no}, Naji Mouawad +@samp{<nmouawad@@math.uwaterloo.ca>}, Bo Nygaard Bai +@samp{<bai@@iesd.auc.dk>}, and probably more. + +@itemize @bullet +@item +New keymap. + +The keymap has been changed in order to make it more intuitive to new +users, and because the old bindings did not work well with the new +buffer manipulation commands in tex-buf.el. To use the new bindings, +load @file{tex-init.el} instead of @file{auc-tex.el}. + +The file @file{auc-tex.el} is still available and implements the old +keybindings on top of the new code. + +Print out the reference card (@file{doc/tex-ref.tex}) to see the new +bindings. + +@item +Completely redesigned the buffer handling. + +No part of the interface or the customization variables remain the same, +unless you use the compatibility functions in @file{auc-tex.el}. In +that case the interactive commands remain similar in spirit, but the +customization interface is still changed. + +The file @file{tex-buf.el} has been completely rewritten, and there are +major cleanup in @file{tex-dbg.el}, however the basic functionality +remains the same in this file. The code for both @file{tex-buf.el} and +@file{tex-dbg.el} should be much simpler now and easier to extent. + +@file{auc-tex.el} and @file{tex-site.el} was updated to support the new +interface. I actually believe the moral equivalent to @code{TeX-region} +to work now @t{:-)}, at least I understand the code now. + +The two major functions are now @code{TeX-command-master} and +@code{TeX-command-region}. Each function will prompt you for the +command to execute. AUC @TeX{} will make an educated guess on what +command you want to run, and make that the default. The available +commands are defined in the variable @code{TeX-command-list}. + +@code{TeX-command-master} will run the specified command on the buffers +master file. You can have one command running for each master file. +@code{TeX-command-region} will run the specified command on the current +region, getting the header on trailer from the master file. + +You can have exactly one region command running, independent on how many +master file commands that are running. Commands that operate on the +active process (like @code{TeX-next-error}) will chose the process +associated with buffers master file, unless the last region process is +more recent than all master file processes. + +AUC @TeX{} now insist on knowing the master file for a buffer. If you +do not specify it in the file variable section, and it is not obviously +a master file itself, it will ask you. It will also add the master file +name to the file variables, unless you disable this feature by setting +@code{TeX-add-local} to nil. Furthermore, it will convert @samp{%% +Master:} lines to file variables, unless you disable it by setting +@code{TeX-convert-master} to nil. +@vindex TeX-convert-master + +Functionality removed (for now, it might appear again latter) include +all other functions to start a command (e.g. @code{LaTeX-BibTeX}), and +alternative ways to specify headers and trailers. The only place to get +the header and trailer is from the master file (I can easily change +that, if anyone have such needs). + +@item +Style specific code isolated. + +You can now add style specific information to AUC TeX by writing a +style file somewhere in TeX-style-path. + +The main code is now organized around this principle. + +@item +Automatically generate style files. + +AUC @TeX{} can now automatically extract information from a @TeX{} file, +and will do this when you save a buffer. + +@item +Sli@TeX{} mode. + +Just like La@TeX{} mode, except that the default command to format run +on the buffer is @samp{slitex}. + +@item +@code{LaTeX-section} completely general. + +Rewrote @file{ltx-sec.el}. + +@itemize @minus +@item +Sectioning level, toc, and title queries can be individually turned off. +@item +Label query can be turned on or off for selected sectioning levels. +@item +Label prefix can be different for different sectioning levels. +@item +If the title (or toc) is empty, point will be positioned there. +@item +Users can add new hooks +@end itemize + +@item +@code{TeX-insert-macro} much smarter. + +It will now prompt for the symbol with completions, and for many symbols +it will also prompt for each argument. There are also completion on +some of the arguments. + +@item +Fixed center in figure environment. + +Thanks to Thomas Koenig @samp{<ig25@@rz.uni-karlsruhe.de>}. + +@item +Changed @code{\M-} to @code{\e} in all keybindings in order to better +support 8-bit input on some GNU Emacs. Thanks to Peter Dalgaard +@samp{<pd@@kubism.ku.dk>}. + +Please, implementors of 8-bit input extensions to GNU Emacs. +@code{\M-x} does @emph{not} means @dfn{@kbd{x} with the 8-bit set}. It +means @dfn{pressing @kbd{x} while holding down the @key{meta} key}. +Some systems (such as X11) are able to tell the different. Thus, even +if you implement 256 byte keymaps, @code{\M-x} should still expand +@code{meta-prefix-char} followed by an @kbd{x} in the keymap. This +allows you to distinguish pressing @kbd{x} while holding down the +@key{meta} key from entering a literal 8-bit character. + +@item +Made the outline commands aware of the document style. + +That is, if the document style is @samp{article}, @samp{\section} will +be one level below the @samp{\documentstyle}, while if the style is +@samp{book}, @samp{\section} will be three levels below +@samp{\documentstyle}. This will make @code{show-children} work better +at the top level. + +@item +The makefiles are closer to GNU coding standard. + +They now understand `prefix' and some other macros. + +@item +Added hooks to be run after list of environments or list of completion +names are updated, and also added a hook to be called after each file +has been loaded. Thanks to Piet van Oostrum @samp{<piet@@cs.ruu.nl>}. + +@item +Added @samp{*} to lot of @code{(interactive)} declarations. + +@item +The outline commands are now always accessible from La@TeX{} mode. + +@item +Generalized the keyboard remapping and double modes. + +These are found in the file @file{min-key.el}. + +@item +Smart Comments. + +Not really, but there are now two comment functions which use their +arguments to determine what to do, instead of four functions ignoring +their arguments. + +@item +Add outline headers. + +It is now possible to add extra outline headers, by setting the variable +@code{TeX-outline-extra}. + +@item +Smart quotes even smarter. + +If you press @kbd{"} twice, it will insert an real double quote instead +of two (or four) single quotes. This is consistent with how remapping +in @file{min-key.el} is done. + +@item +Automatically untabify buffer when you save it. + +Hands up, everyone who have produced a `last revision' paper containing +an unreadable list of data in the back, because @TeX{} does not +understands tabs. + +@item +Call show-all when you change major mode. + +Thanks to Inge Frick's @samp{<inge@@nada.kth.se>} @file{kill-fix.el} +enhancement, outline minor mode can now guarantee that all text is shown +when you leave the minor mode, even if you leave the minor mode by +changing the major mode. + +@item +Updated documentation for 7.0. + +Also added key, variable, function, and concept indexes, as well as this +history section and a new chapter on multifile documents +(@pxref{Multifile}).@refill + +@end itemize + +@node Version 6.1, Version 6.0, Version 7.0, History +@comment node-name, next, previous, up +@section Version 6.1 + +Coordinator: Per Abrahamsen, 1992. + +@itemize @bullet +@item +@code{TeX-region} might work now (heard that before?). + +Many people reported this one. Especially thanks to Fran Burstall +@samp{<F.E.Burstall@@maths.bath.ac.uk>} and Bill Schworm +@samp{<bill@@schworm.econ.ubc.ca>}.@refill + +@item +The specification format for the @TeX{} command is more general. + +See the documentation for @code{LaTeX-command} and +@code{plain-TeX-command}. + +@item +The specification format for the preview commands is more general. + +See their respective documentation. + +@item +The specification format for the print command is more general. + +See the documentation for @code{TeX-print-command}. + +@item +@code{TeX-args} is marked as obsolete. + +@item +The @samp{"Emergency stop ..."} error. + +Some users of old @TeX{} installations got might might be fixed now. +Thanks to Philip Sterne @samp{<sterne@@dublin.llnl.gov>}. + +@item +It is now possible to change the preview command. + +@dots{} without loading TeX-site first. Thanks to Tim Bradshaw +@samp{<tim.bradshaw@@edinburgh.ac.uk>}. + +@item +New variable TeX-smart-quotes. + +Allow @file{german.sty} users (and others) to disable the mapping of +double quote (@kbd{"} to @samp{``} or @samp{''}). Thanks to Daniel +Hernandez @samp{<danher@@informatik.tu-muenchen.de>}. + +@item +Many minor corrections to the documentation. + +Thanks to Mainhard E. Mayer @samp{<hardy@@golem.ps.uci.edu>}. + +@item +Make test for @code{HOSTTYPE} case insensitive. + +Thanks to Gisli Ottarsson @samp{<gisli@@liapunov.eecs.umisc.edu>}. + +@item +@code{TeX-force-default-mode} + +Set to avoid AUC @TeX{}'s attempts to infer the mode of the file by +itself. + +@end itemize + +@node Version 6.0, Ancient History, Version 6.1, History +@comment node-name, next, previous, up +@section Version 6.0 + +Coordinator: Kresten Krab Thorup, 1992. + +Preliminary documentation is available in the directory @file{doc}. It +isn't very well written, but I believe it covers most interesting points. +Comments, suggestions, or even rewrites of sections are VERY +WELCOME@dots{} + +LaCheck has been incorporated in the package. The source code for it is +available in the directory @file{lacheck} along with the documentation +for it. Lacheck may also be used from the command line. It is bound to +@kbd{C-c $}. + +Some minor changes in: + +@table @code +@item TeX-region +Should work better with @samp{Master:} option. + +@item LaTeX-environment +Numerous new hooks added by Masayuki Kuwada. + +@item TeX-command-on-region +Removed. @kbd{C-c C-o} used for @code{outline-minor-mode} instead. + +@end table + +And some additional minor fixes... + +@node Ancient History, , Version 6.0, History +@comment node-name, next, previous, up +@section Ancient History + +The origin of AUC @TeX{} is @file{tex-mode.el} from Emacs 16. Lars +Peter Fischer @samp{<fischer@@iesd.auc.dk>} wrote the first functions to +insert font macros and Danish characters back in 1986. Per Abrahamsen +@samp{<abraham@@iesd.auc.dk>} wrote the functions to insert environments +and sections, to indent the text, and the outline minor mode in 1987. +Kresten Krab Thorup @samp{<krab@@iesd.auc.dk>} wrote the buffer handling +and debugging functions, the macro completion, and much more, including +much improved indentation and text formatting functions. He also made +the first public release in 1991, and was the main author and +coordinator of every release up to and including 6.0. + +Thanks should also go to all the people who have been a great help +developing the AUC @TeX{} system. Especially all the people on the +@samp{auc-tex} mailing list, who have been very helpful commenting and +pointing out weak points and errors. + +Some of the contributors are listed below. Others are mentioned in the +lisp files or in the History section. + +@table @samp +@item <dduchier@@csi.UOttawa.CA> +Denys Duchier +@item <ferguson@@cs.rochester.edu> +George Ferguson +@item <simons@@ibiza.karlsruhe.gmd.de> +Martin Simons +@item <smith@@pell.anu.edu.au> +Michael Smith +@item <per@@iesd.auc.dk> +Per Hagen +@item <handl@@cs.uni-sb.de> +Ralf Handl +@item <sven@@tde.lth.se> +Sven Mattisson +@item <kuwada@@soliton.ee.uec.ac.jp> +Masayuki Kuwada +@item <tb06@@pl118f.cc.lehigh.edu> +Terrence Brannon +@item <roseman@@hustat.harvard.edu> +Leonard Roseman +@end table + +Special thanks to Leslie Lamport for supplying the source for the LaTeX +error messages in the @file{tex-dbg.el} file. +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/auctex/install.texi Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,144 @@ +@chapter Installation of AUC @TeX{} +@cindex Installation +@cindex Make +@cindex @file{Makefile} +@cindex @file{.emacs} +@cindex Site initialization +@cindex Initialization +@cindex @file{tex-site.el} +@cindex Personal customization +@cindex Site customization +@cindex Customization +@cindex Customization, personal +@cindex Customization, site + +@section Compiling + +The following describes how to install AUC @TeX{} under Unix. You may +also be able to do use these instructions under some other operating +systems, if you have already installed the proper GNU tools, such as +@file{make}. + +To install AUC @TeX{} for an entire site (which may just be your own +personal Linux box), issue the following two commands as root: + +@example +make +make lispdir=/usr/local/share/emacs/site-lisp install +@end example + +except that instead of @t{/usr/local/...} you should use the location of +your sites emacs installation. AUC @TeX{} will then be installed in a +subdirectory named @file{auctex} of the @file{site-lisp} directory, and +the file @file{tex-site.el} will be stored directly in the +@file{site-lisp}. You can now tell your users to enable AUC @TeX{} by +adding + +@example +(require 'tex-site) +@end example + +to their @file{.emacs} file. + +If you use xemacs instead, or if your emacs binary is named something +else than @file{emacs}, specify this by using the commands + +@example +make EMACS=xemacs +make lispdir=/usr/local/share/emacs/site-lisp install +@end example + +to install. + +If you want to install AUC @TeX{} in your personal account, you should +chose a directory for all your emacs add-ons, for example an +@file{elisp} subdirectory in your home directory. You can then install +AUC @TeX{} with the commands + +@example +make +make lispdir=$HOME/elisp install +@end example + +You will then need to add the following lines to your @file{.emacs} +file: + +@example +(setq load-path (cons "~/elisp" load-path)) +(require 'tex-site) +@end example + +@section Customizing + +Next, you should edit the file @file{tex-site.el} to fit your local +site. You do this by looking at the customization section in the +beginning of @file{tex.el} and copy the definitions that are wrong for +your site to @file{tex-site.el}. Do @emph{not} edit @file{tex.el} +directly, or you will have to do all the work over again when you +upgrade AUC @TeX{}. AUC @TeX{} will not overwrite your old +@file{tex-site.el} file next time you install, so you will be able to +keep all your customizations. + +There are two variables with a special significance. + +@defopt TeX-lisp-directory +The directory where you want to install the AUC @TeX{} lisp files. +@end defopt + +This variable is set automatically by the @code{make install} command. +If you don't issue a @code{make install}, for example if you don't want +to install AUC @TeX{} in a different place, you will have to set this +variable manually to the location of the compiled files. + +@defopt TeX-macro-global +Directories containing the site's @TeX{} style files. +@end defopt + +Normally, AUC @TeX{} will only allow you to complete a short list of +build-in macros and environments and on the macros you define yourself. +If you issue the @kbd{M-x TeX-auto-generate-global} command after +loading AUC @TeX{}, you will be able to complete on all macros available +in the standard style files used by your document. To do this, you must +set this variable to a list of directories where the standard style +files are located. The directories will be searched recursively, so +there is no reason to list subsirectories explicitly. + +You probably also need to change @code{TeX-command-list} to make sure +that the commands used for starting @TeX{}, printing, etc. work on your +system. Copy the definition from @file{tex.el} to @file{tex-site.el} +and edit the command names appropriately. +@vindex TeX-command-list + +Finally, copy and edit @code{TeX-printer-list} to contain the printers +available at your site. +@vindex TeX-printer-list + +To extract information from your sites @TeX{} macros, type @kbd{M-x +TeX-auto-generate-global} in your emacs. This will only work if you +have set @code{TeX-macro-global} correctly in @file{tex-site.el}. + +@section Contributed files + +There are several files that are not part of AUC @TeX{} proper, but +included in the distribution in case they are useful. + +@table @file +@item hilit-LaTeX.el +Better highlighting for the obsolete @file{hilit19} package. + +@item font-latex.el +Better highlighting for the @sc{font-lock} package. + +@item bib-cite.el +Better support for bibliographies and much more. + +@item tex-jp.el +Support for Japanese. + +@item func-doc.el +Support for context sensitive online help for various languages. + +@end table + +Read the comments in the start of each file for more information about +how to install, what they do, and who wrote and maintains them.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/auctex/intro.texi Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,174 @@ +@chapter Introduction to AUC TeX + +This section of the AUC @TeX{} manual gives a brief overview of what AUC +@TeX{} is, and the section is also available as a @file{README} file. +It is @strong{not} an attempt to document AUC @TeX{}. Real +documentation for AUC @TeX{} is available in the rest of the manual, +which you can find in the @file{doc} directory. + +Read the @file{INSTALLATION} file for information about how to install +AUC @TeX{}. It is identical to the Installation chapter in the AUC +@TeX{} manual. + +If you are upgrading from the previous version of AUC @TeX{}, the +latest changes can be found in the @file{CHANGES} file. If you are +upgrading from an older version, read the History chapter in the AUC +@TeX{} manual. + +AUC @TeX{} is a comprehensive customizable integrated environment for +writing input files for La@TeX{} using GNU Emacs. + +AUC @TeX{} lets you run @TeX{}/La@TeX{} and other La@TeX{}-related +tools, such as a output filters or post processor from inside Emacs. +Especially `running La@TeX{}' is interesting, as AUC @TeX{} lets you +browse through the errors @TeX{} reported, while it moves the cursor +directly to the reported error, and displays some documentation for that +particular error. This will even work when the document is spread over +several files. + +AUC @TeX{} automatically indents your `La@TeX{}-source', not only as you +write it --- you can also let it indent and format an entire document. +It has a special outline feature, which can greatly help you `getting an +overview' of a document. + +Apart from these special features, AUC @TeX{} provides an large range of +handy Emacs macros, which in several different ways can help you write +your La@TeX{} documents fast and painless. + +All features of AUC @TeX{} are documented using the GNU Emacs online +documentation system. That is, documentation for any command is just +a key click away! + +AUC @TeX{} is written entirely in Emacs-Lisp, and hence you can easily +add new features for your own needs. It was not made as part of any +particular employment or project (apart from the AUC @TeX{} project +itself). AUC @TeX{} is distributed under the `GNU Emacs General Public +License' and may therefore almost freely be copied and redistributed. + +The next sections are a short introduction to some `actual' features. +For further information, refer to the build-in online documentation of +AUC @TeX{}. + +@section Indentation and formatting + +AUC @TeX{} may automatically indent your document as you write it. By +pressing @key{lfd} instead of @key{ret} at the end of a line, the +current line is indented by two spaces according to the current +environment level, and the cursor is moved down one line. By pressing +@key{tab}, the current line is indented, and the cursor stays where it +is. The well-known Emacs feature @code{format-paragraph} (@kbd{M-q}) is +reimplemented especially for AUC @TeX{} to follow the indentation. A +special command @code{LaTeX-fill-buffer} lets you indent an entire +document like the well-known C utility indent (this time, only according +to the La@TeX{} structure @t{:-)}. + +@section Completion + +By studying your @samp{\documentstyle} command (in the top of your +document), and consulting a precompiled list of (La)@TeX{} symbols from +a large number of @TeX{} and La@TeX{} files, AUC @TeX{} is aware of the +La@TeX{} commands you should able to use in this particular document. +This `knowledge' of AUC @TeX{} is used for two purposes. + +@enumerate +@item +To make you able to `complete' partly written La@TeX{} commands. You may +e.g. write @kbd{\renew} and press @kbd{M-@key{tab}} +(@code{TeX-complete-symbol}), and then AUC @TeX{} will complete the word +@samp{\renewcommand} for you. In case of ambiguity it will display a +list of possible completions. +@item +To aid you inserting environments, that is \begin - \end pairs. This is +done by pressing C-c C-e (La@TeX{}-environment), and you will be +prompted for which `environment' to insert. +@end enumerate + +@section Editing your document + +A number of more or less intelligent keyboard macros have been defined +to aid you editing your document. The most important are listed here +below. + +@table @code +@item LaTeX-environment +(@kbd{C-c C-e}) Insert a @samp{\begin@{@}} --- @samp{\end@{@}} pair as +described above. +@item LaTeX-section +(@kbd{C-c C-s}) Insert one of @samp{\chapter}, @samp{\section}, etc. +@item TeX-font +(@kbd{C-c C-f C-r}, @kbd{C-c C-f C-i}, @kbd{C-c C-f C-b}) Insert one of +@samp{@{\textrm @}}), @samp{@{\textit \/@}} @samp{@{\textbf @}} etc. +@end table + +A number of additional functions are available. But it would be far too +much to write about here. Refer to the rest of the AUC @TeX{} +documentation for further information. + +@section Running La@TeX{} + +When invoking on of the commands @code{TeX-command-master} (@kbd{C-c +C-c}) or @code{TeX-command-region} (@kbd{C-c C-r}) La@TeX{} is run on +either the entire current document or a given region of it. The Emacs +view is split in two, and the output of @TeX{} is printed in the second +half of the screen, as you may simultaneously continue editing your +document. In case @TeX{} found any errors when processing your input +you can call the function @code{TeX-next-error} (@kbd{C-c `}) which will +move the cursor to the first given error, and display a short +explanatory text along with the message @TeX{} gave. This procedure may +be repeated until all errors have been displayed. By pressing @kbd{C-c +C-w} (@code{TeX-toggle-debug-boxes}) you can toggle whether the browser +also should notify over-full/under-full boxes or not. + +Once you've successfully formatted your document, you may preview or +print it by invoking @code{TeX-command-master} again. + +@section Outlines + +Along with AUC @TeX{} comes support for outline mode for Emacs, which +lets you browse the sectioning structure of your document, while you +will still be able to use the full power of the rest of the AUC @TeX{} +functionality. + +@section Availability + +The most recent version is always available by ftp at + +@flushright +@samp{ftp://ftp.iesd.auc.dk/pub/emacs-lisp/auctex.tar.gz} +@end flushright + +In case you don't have access anonymous ftp, you can get it by email +requests to @samp{<ftpmail@@decwrl.dec.com>}. + +WWW users may want to check out the AUC @TeX{} page at + +@flushright +@samp{http://www.iesd.auc.dk/~amanda/auctex/} +@end flushright + +@section Contacts + +There has been established a mailing list for help, bug reports, feature +requests and general discussion about AUC @TeX{}. You're very welcome +to join. Traffic average at an article by day, but they come in bursts. +If you are only interested in information on updates, you could refer to +the newsgroups @samp{comp.text.tex} and @samp{gnu.emacs.sources}. + +If you want to contact the AUC @TeX{} mailing list, send mail to +@samp{<auc-tex-request@@iesd.auc.dk>} in order to join. Articles should +be send to @samp{<auc-tex@@iesd.auc.dk>}. + +To contact the current maintainers of auc-@TeX{} directly, email +@samp{<auc-tex_mgr@@iesd.auc.dk>}. + +@example + AUC @TeX{} development + c/o Kresten Krab Thorup + + Mathematics and Computer Science + University of Aalborg + DK 9000 Aalborg + Denmark +@end example + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/auctex/math-ref.tex Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,289 @@ +% -*- plain-tex -*- +% $Id: math-ref.tex,v 1.1 1997/02/20 02:05:18 steve Exp $ +% Reference Card for LaTeX Math Minor Mode +%**start of header +\newcount\columnsperpage + +% This file can be printed with 1, 2, or 3 columns per page (see below). +% Specify how many you want here. Nothing else needs to be changed. + +\columnsperpage=2 + +% This file is intended to be processed by plain TeX (TeX82). +% compile-command: "tex auc-tex-ref.tex" + +% Original author of Auc-TeX Reference Card: +% +% Terrence Brannon, PO Box 5027, Bethlehem, PA 18015 , USA +% internet: tb06@pl118f.cc.lehigh.edu (215) 758-1720 (215) 758-2104 +% +% Kresten Krab Thorup updated the reference card to 6.* +% Per Abrahamsen updated the reference card to 7.* +% +% Thanks to Stephen Gildea +% Paul Rubin, Bob Chassell, Len Tower, and Richard Mlynarik +% for creating the GNU Emacs Reference Card from which this was mutated + +\def\versionnumber{5.2} +\def\year{1993} +\def\version{February \year\ v\versionnumber} + +\def\shortcopyrightnotice{\vskip 1ex plus 2 fill + \centerline{\small \copyright\ \year\ Free Software Foundation, Inc. + Permissions on back. v\versionnumber}} + +\def\copyrightnotice{ +\vskip 1ex plus 2 fill\begingroup\small +\centerline{Copyright \copyright\ 1987 Free Software Foundation, Inc.} +\centerline{Copyright \copyright\ 1992 Kresten Krab Thorup} +\centerline{Copyright \copyright\ \year\ Per Abrahamsen} + +Permission is granted to make and distribute copies of +this card provided the copyright notice and this permission notice +are preserved on all copies. + +\endgroup} + +% make \bye not \outer so that the \def\bye in the \else clause below +% can be scanned without complaint. +\def\bye{\par\vfill\supereject\end} + +\newdimen\intercolumnskip +\newbox\columna +\newbox\columnb + +\def\ncolumns{\the\columnsperpage} + +\message{[\ncolumns\space + column\if 1\ncolumns\else s\fi\space per page]} + +\def\scaledmag#1{ scaled \magstep #1} + +% This multi-way format was designed by Stephen Gildea +% October 1986. +\if 1\ncolumns + \hsize 4in + \vsize 10in + \voffset -.7in + \font\titlefont=\fontname\tenbf \scaledmag3 + \font\headingfont=\fontname\tenbf \scaledmag2 + \font\smallfont=\fontname\sevenrm + \font\smallsy=\fontname\sevensy + + \footline{\hss\folio} + \def\makefootline{\baselineskip10pt\hsize6.5in\line{\the\footline}} +\else + \hsize 3.2in + \vsize 7.95in +% \hoffset -.75in +% \voffset -.745in + \font\titlefont=cmbx10 \scaledmag2 + \font\headingfont=cmbx10 \scaledmag1 + \font\smallfont=cmr6 + \font\smallsy=cmsy6 + \font\eightrm=cmr8 + \font\eightbf=cmbx8 + \font\eightit=cmti8 + \font\eighttt=cmtt8 + \font\eightsy=cmsy8 + \textfont0=\eightrm + \textfont2=\eightsy + \def\rm{\eightrm} + \def\bf{\eightbf} + \def\it{\eightit} + \def\tt{\eighttt} + \normalbaselineskip=.8\normalbaselineskip + \normallineskip=.8\normallineskip + \normallineskiplimit=.8\normallineskiplimit + \normalbaselines\rm %make definitions take effect + + \if 2\ncolumns + \let\maxcolumn=b + \footline{\hss\rm\folio\hss} + \def\makefootline{\vskip 2in \hsize=6.86in\line{\the\footline}} + \else \if 3\ncolumns + \let\maxcolumn=c + \nopagenumbers + \else + \errhelp{You must set \columnsperpage equal to 1, 2, or 3.} + \errmessage{Illegal number of columns per page} + \fi\fi + + \intercolumnskip=.46in + \def\abc{a} + \output={% + % This next line is useful when designing the layout. + %\immediate\write16{Column \folio\abc\space starts with \firstmark} + \if \maxcolumn\abc \multicolumnformat \global\def\abc{a} + \else\if a\abc + \global\setbox\columna\columnbox \global\def\abc{b} + %% in case we never use \columnb (two-column mode) + \global\setbox\columnb\hbox to -\intercolumnskip{} + \else + \global\setbox\columnb\columnbox \global\def\abc{c}\fi\fi} + \def\multicolumnformat{\shipout\vbox{\makeheadline + \hbox{\box\columna\hskip\intercolumnskip + \box\columnb\hskip\intercolumnskip\columnbox} + \makefootline}\advancepageno} + \def\columnbox{\leftline{\pagebody}} + + \def\bye{\par\vfill\supereject + \if a\abc \else\null\vfill\eject\fi + \if a\abc \else\null\vfill\eject\fi + \end} +\fi + +% we won't be using math mode much, so redefine some of the characters +% we might want to talk about +\catcode`\^=12 +\catcode`\_=12 + +\chardef\\=`\\ +\chardef\{=`\{ +\chardef\}=`\} + +\hyphenation{mini-buf-fer} + +\parindent 0pt +\parskip 1ex plus .5ex minus .5ex + +\def\small{\smallfont\textfont2=\smallsy\baselineskip=.8\baselineskip} + +\outer\def\newcolumn{\vfill\eject} + +\outer\def\title#1{{\titlefont\centerline{#1}}\vskip 1ex plus .5ex} + +\outer\def\section#1{\par\filbreak + \vskip 3ex plus 2ex minus 2ex {\headingfont #1}\mark{#1}% + \vskip 2ex plus 1ex minus 1.5ex} + +\newdimen\keyindent + +\def\beginindentedkeys{\keyindent=1em} +\def\endindentedkeys{\keyindent=0em} +\endindentedkeys + +\def\paralign{\vskip\parskip\halign} + +\def\<#1>{$\langle${\rm #1}$\rangle$} + +\def\kbd#1{{\tt#1}\null} %\null so not an abbrev even if period follows + +\def\beginexample{\par\leavevmode\begingroup + \obeylines\obeyspaces\parskip0pt\tt} +{\obeyspaces\global\let =\ } +\def\endexample{\endgroup} + +\def\key#1#2{\leavevmode\hbox to \hsize{\vtop + {\hsize=.75\hsize\rightskip=1em + \hskip\keyindent\relax#1}\kbd{#2}\hfil}} + +\newbox\metaxbox +\setbox\metaxbox\hbox{\kbd{M-x }} +\newdimen\metaxwidth +\metaxwidth=\wd\metaxbox + +\def\metax#1#2{\leavevmode\hbox to \hsize{\hbox to .75\hsize + {\hskip\keyindent\relax#1\hfil}% + \hskip -\metaxwidth minus 1fil + \kbd{#2}\hfil}} + +\def\threecol#1#2#3{\hskip\keyindent\relax#1\hfil&\kbd{#2}\quad + &\kbd{#3}\quad\cr} + +%**end of header + + +\title{Math Mode Reference Card} + +\section{Variables} + +All math mode commands are under the prefix key specified by +LaTeX-math-abbrev-prefix, default is "`". + +You can define your own math mode commands by setting the variable +LaTeX-math-list before loading LaTeX-math-mode. + +\section{Greek Letters} + +\def\disp#1{\hbox to 6ex{$#1$\hfill}} +\key{\disp{\alpha} (alpha)}{a} +\key{\disp{\beta} (beta)}{b} +\key{\disp{\delta} (delta)}{d} +\key{\disp{\epsilon} (epsilon)}{e} +\key{\disp{\phi} (phi)}{f} +\key{\disp{\gamma} (gamma)}{g} +\key{\disp{\eta} (eta)}{h} +\key{\disp{\kappa} (kappa)}{k} +\key{\disp{\lambda} (lambda)}{l} +\key{\disp{\mu} (mu)}{m} +\key{\disp{\nabla} (nabla)}{N} +\key{\disp{\nu} (nu)}{n} +\key{\disp{\omega} (omega)}{o} +\key{\disp{\pi} (pi)}{p} +\key{\disp{\theta} (theta)}{q} +\key{\disp{\rho} (rho)}{r} +\key{\disp{\sigma} (sigma)}{s} +\key{\disp{\tau} (tau)}{t} +\key{\disp{\upsilon} (upsilon)}{u} +\key{\disp{\chi} (chi)}{x} +\key{\disp{\psi} (psi)}{y} +\key{\disp{\zeta} (zeta)}{z} +\key{\disp{\Delta} (Delta)}{D} +\key{\disp{\Phi} (Phi)}{F} +\key{\disp{\Gamma} (Gamma)}{G} +\key{\disp{\Theta} (Theta)}{Q} +\key{\disp{\Lambda} (Lambda)}{L} +\key{\disp{\Psi} (Psi)}{Y} +\key{\disp{\Pi} (Pi)}{P} +\key{\disp{\Sigma} (Sigma)}{S} +\key{\disp{\Upsilon} (Upsilon)}{U} +\key{\disp{\Omega} (Omega)}{O} + +\section{Symbols} + +\key{\disp{\rightarrow} (rightarrow)}{C-f} +\key{\disp{\leftarrow} (leftarrow)}{C-b} +\key{\disp{\uparrow} (uparrow)}{C-p} +\key{\disp{\downarrow} (downarrow)}{C-n} +\key{\disp{\leq} (leq)}{<} +\key{\disp{\geq} (geq)}{>} +\key{\disp{\tilde{ }} (tilde)}{$\tilde{ }$} +\key{\disp{\infty} (infty)}{I} +\key{\disp{\forall} (forall)}{A} +\key{\disp{\exists} (exists)}{E} +\key{\disp{\not } (not)}{!} +\key{\disp{\in} (in)}{i} +\key{\disp{\times} (times)}{*} +\key{\disp{\cdot} (cdot)}{.} +\key{\disp{\subset} (subset)}{\{} +\key{\disp{\supset} (supset)}{\}} +\key{\disp{\subseteq} (subseteq)}{[} +\key{\disp{\supseteq} (supseteq)}{]} +\key{\disp{\backslash} (backslash)}{\\} +\key{\disp{\setminus} (setminus)}{/} +\key{\disp{\cup} (cup)}{+} +\key{\disp{\cap} (cap)}{-} +\key{\disp{\langle} (langle)}{(} +\key{\disp{\rangle} (rangle)}{)} +\key{\disp{\exp} (exp)}{C-e} +\key{\disp{\sin} (sin)}{C-s} +\key{\disp{\cos} (cos)}{C-c} +\key{\disp{\sup} (sup)}{C-^} +\key{\disp{\inf} (inf)}{C-_} +\key{\disp{\det} (det)}{C-d} +\key{\disp{\lim} (lim)}{C-l} +\key{\disp{\tan} (tan)}{C-t} +\key{\disp{\hat{ }} (hat)}{^} +\key{\disp{\vee} (vee)}{v} + +\section{Miscellaneous} + +\key{cal letters}{c {\rm LETTER}} + +\copyrightnotice + +\bye + +% End: +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/auctex/tex-ref.tex Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,295 @@ ++% -*- plain-tex -*- +% $Id: tex-ref.tex,v 1.1 1997/02/20 02:05:18 steve Exp $ +% Reference Card for Auc TeX version 7 +%**start of header +\newcount\columnsperpage + +% This file can be printed with 1, 2, or 3 columns per page (see below). +% Specify how many you want here. Nothing else needs to be changed. + +\columnsperpage=2 + +% This file is intended to be processed by plain TeX (TeX82). +% compile-command: "tex ref-card.tex" +% +% Original author of Auc-TeX Reference Card: +% +% Terrence Brannon, PO Box 5027, Bethlehem, PA 18015 , USA +% internet: tb06@pl118f.cc.lehigh.edu (215) 758-1720 (215) 758-2104 +% +% Kresten Krab Thorup updated the reference card to 6. +% Per Abrahamsen updated the reference card to 7, 8, and 9. +% +% Thanks to Stephen Gildea +% Paul Rubin, Bob Chassell, Len Tower, and Richard Mlynarik +% for creating the GNU Emacs Reference Card from which this was mutated + +\def\versionnumber{9} +\def\year{1993} +\def\version{February \year\ v\versionnumber} + +\def\shortcopyrightnotice{\vskip 1ex plus 2 fill + \centerline{\small \copyright\ \year\ Free Software Foundation, Inc. + Permissions on back. v\versionnumber}} + +\def\copyrightnotice{ +\vskip 1ex plus 2 fill\begingroup\small +\centerline{Copyright \copyright\ 1987 Free Software Foundation, Inc.} +\centerline{Copyright \copyright\ 1992 Kresten Krab Thorup} +\centerline{Copyright \copyright\ \year\ Per Abrahamsen} +\centerline{for AUC \TeX\ version \versionnumber} + +Permission is granted to make and distribute copies of +this card provided the copyright notice and this permission notice +are preserved on all copies. + + +\endgroup} + +% make \bye not \outer so that the \def\bye in the \else clause below +% can be scanned without complaint. +\def\bye{\par\vfill\supereject\end} + +\newdimen\intercolumnskip +\newbox\columna +\newbox\columnb + +\def\ncolumns{\the\columnsperpage} + +\message{[\ncolumns\space + column\if 1\ncolumns\else s\fi\space per page]} + +\def\scaledmag#1{ scaled \magstep #1} + +% This multi-way format was designed by Stephen Gildea +% October 1986. +\if 1\ncolumns + \hsize 4in + \vsize 10in + \voffset -.7in + \font\titlefont=\fontname\tenbf \scaledmag3 + \font\headingfont=\fontname\tenbf \scaledmag2 + \font\smallfont=\fontname\sevenrm + \font\smallsy=\fontname\sevensy + + \footline{\hss\folio} + \def\makefootline{\baselineskip10pt\hsize6.5in\line{\the\footline}} +\else + \hsize 3.2in + \vsize 7.95in +% \hoffset -.75in +% \voffset -.745in + \font\titlefont=cmbx10 \scaledmag2 + \font\headingfont=cmbx10 \scaledmag1 + \font\smallfont=cmr6 + \font\smallsy=cmsy6 + \font\eightrm=cmr8 + \font\eightbf=cmbx8 + \font\eightit=cmti8 + \font\eighttt=cmtt8 + \font\eightsy=cmsy8 + \textfont0=\eightrm + \textfont2=\eightsy + \def\rm{\eightrm} + \def\bf{\eightbf} + \def\it{\eightit} + \def\tt{\eighttt} + \normalbaselineskip=.8\normalbaselineskip + \normallineskip=.8\normallineskip + \normallineskiplimit=.8\normallineskiplimit + \normalbaselines\rm %make definitions take effect + + \if 2\ncolumns + \let\maxcolumn=b + \footline{\hss\rm\folio\hss} + \def\makefootline{\vskip 2in \hsize=6.86in\line{\the\footline}} + \else \if 3\ncolumns + \let\maxcolumn=c + \nopagenumbers + \else + \errhelp{You must set \columnsperpage equal to 1, 2, or 3.} + \errmessage{Illegal number of columns per page} + \fi\fi + + \intercolumnskip=.46in + \def\abc{a} + \output={% + % This next line is useful when designing the layout. + %\immediate\write16{Column \folio\abc\space starts with \firstmark} + \if \maxcolumn\abc \multicolumnformat \global\def\abc{a} + \else\if a\abc + \global\setbox\columna\columnbox \global\def\abc{b} + %% in case we never use \columnb (two-column mode) + \global\setbox\columnb\hbox to -\intercolumnskip{} + \else + \global\setbox\columnb\columnbox \global\def\abc{c}\fi\fi} + \def\multicolumnformat{\shipout\vbox{\makeheadline + \hbox{\box\columna\hskip\intercolumnskip + \box\columnb\hskip\intercolumnskip\columnbox} + \makefootline}\advancepageno} + \def\columnbox{\leftline{\pagebody}} + + \def\bye{\par\vfill\supereject + \if a\abc \else\null\vfill\eject\fi + \if a\abc \else\null\vfill\eject\fi + \end} +\fi + +% we won't be using math mode much, so redefine some of the characters +% we might want to talk about +\catcode`\^=12 +\catcode`\_=12 + +\chardef\\=`\\ +\chardef\{=`\{ +\chardef\}=`\} + +\hyphenation{mini-buf-fer} + +\parindent 0pt +\parskip 1ex plus .5ex minus .5ex + +\def\small{\smallfont\textfont2=\smallsy\baselineskip=.8\baselineskip} + +\outer\def\newcolumn{\vfill\eject} + +\outer\def\title#1{{\titlefont\centerline{#1}}\vskip 1ex plus .5ex} + +\outer\def\section#1{\par\filbreak + \vskip 3ex plus 2ex minus 2ex {\headingfont #1}\mark{#1}% + \vskip 2ex plus 1ex minus 1.5ex} + +\newdimen\keyindent + +\def\beginindentedkeys{\keyindent=1em} +\def\endindentedkeys{\keyindent=0em} +\endindentedkeys + +\def\paralign{\vskip\parskip\halign} + +\def\<#1>{$\langle${\rm #1}$\rangle$} + +\def\kbd#1{{\tt#1}\null} %\null so not an abbrev even if period follows + +\def\beginexample{\par\leavevmode\begingroup + \obeylines\obeyspaces\parskip0pt\tt} +{\obeyspaces\global\let =\ } +\def\endexample{\endgroup} + +\def\key#1#2{\leavevmode\hbox to \hsize{\vtop + {\hsize=.75\hsize\rightskip=1em + \hskip\keyindent\relax#1}\kbd{#2}\hfil}} + +\newbox\metaxbox +\setbox\metaxbox\hbox{\kbd{M-x }} +\newdimen\metaxwidth +\metaxwidth=\wd\metaxbox + +\def\metax#1#2{\leavevmode\hbox to \hsize{\hbox to .75\hsize + {\hskip\keyindent\relax#1\hfil}% + \hskip -\metaxwidth minus 1fil + \kbd{#2}\hfil}} + +\def\threecol#1#2#3{\hskip\keyindent\relax#1\hfil&\kbd{#2}\quad + &\kbd{#3}\quad\cr} + +%**end of header + + +\title{AUC \TeX\ Reference Card} + +\centerline{(for version \versionnumber)} + +\section{Conventions Used} + +\key{Carriage Return}{RET} +\key{Tabular}{TAB} +\key{Linefeed}{LFD} + +Mode variables: You want to change the variables found in the file +`{\tt tex-site.el}' in the AUC-\TeX\ distribution for your site. The +other variables should be set by the individual user. + +Entering LaTeX mode calls the value of text-mode-hook, then the value +of TeX-mode-hook, and then the value of LaTeX-mode-hook. + +\section{Shell Interaction} + +\key{Save Document}{C-c C-d} +\key{Run a command on the master file}{C-c C-c} +\key{Run a command on the buffer}{C-c C-b} +\key{Run a command on the region}{C-c C-r} +\key{Kill job}{C-c C-k} +\key{Recenter output buffer}{C-c C-l} +\key{Next error in \TeX/LaTeX session}{C-c `} +\key{Toggle debug of wonderful boxes}{C-c C-w} +\key{Switch to master file or active buffer}{C-c ^} + +Commands you can run on the master file (with C-c C-c) or the region +(with C-c C-r) include the following. + +\key{\TeX}{TeX} +\overfullrule=0pt %The next line is too wide. +\key{Run \TeX{} Interactively}{TeX Interactive} +\key{LaTeX}{LaTeX} +\key{Run LaTeX Interactively}{LaTeX Interactive} +\key{SliTeX}{SliTeX} +\key{A previewer}{View} +\key{Printing the DVI file}{Print} +\key{Bib\TeX}{BibTeX} +\key{MakeIndex}{Index} +\key{LaCheck}{Check} +\key{(PostScript) File}{File} +\key{Ispell}{Spell} + +\section{Command Insertion} + +\key{Insert Section}{C-c C-s} +\key{Insert LaTeX environment}{C-c C-e} +\key{Insert item}{C-c LFD} +\key{Close LaTeX environment}{C-c ]} +\key{Insert \TeX\ macro \kbd{\\\{\}} }{C-c C-m} +\key{Insert double brace}{C-c \{} +\key{Complete \TeX\ macro}{M-TAB} +\key{Smart ``quote''}{"} +\key{Smart ``dollar''}{\$} + +\section{Font Selection} + +\key{Insert {\bf bold} text}{C-c C-f C-b} +\key{Insert {\it italics\/} text}{C-c C-f C-i} +\key{Insert {\rm roman} text}{C-c C-f C-r} +\key{Insert {\it emphasized} text}{C-c C-f C-e} +\key{Insert {\tt typewriter} text}{C-c C-f C-t} +\key{Insert {\sl slanted\/} text}{C-c C-f C-s} +\key{Delete font}{C-c C-f C-d} +\key{Change font}{C-u C-c C-f <KEY>} + +\section{Source Formatting} + +\key{Indent current line}{TAB} +\key{Indent next line}{LFD} + +\key{Format a paragraph}{M-q} +\key{Format a region}{C-c C-q C-r} +\key{Format a section}{C-c C-q C-s} +\key{Format an environment}{C-c C-q C-e} + +\key{Mark an environment}{C-c .} +\key{Mark a section}{C-c *} + +\key{Comment region}{C-c ;} +\key{Comment paragraph}{C-c \%} +\key{Uncomment region}{C-u - C-c ;} +\key{Uncomment paragraph}{C-u - C-c \%} + +\section{Miscellaneous} + +\key{Math Mode}{C-c \~{}} +\key{Reset AUC TeX}{C-c C-n} + +\copyrightnotice + +\bye + +% End:
--- a/man/custom.texi Mon Aug 13 09:13:58 2007 +0200 +++ b/man/custom.texi Mon Aug 13 09:15:11 2007 +0200 @@ -13,7 +13,7 @@ @comment node-name, next, previous, up @top The Customization Library -Version: 1.40 +Version: 1.44 @menu * Introduction::
--- a/man/ediff.texi Mon Aug 13 09:13:58 2007 +0200 +++ b/man/ediff.texi Mon Aug 13 09:15:11 2007 +0200 @@ -2198,7 +2198,7 @@ Ken Laprade (laprade@@dw3f.ess.harris.com), Will C Lauer (wcl@@cadre.com), Richard Levitte (levitte@@e.kth.se), Mike Long (mike.long@@analog.com), Martin Maechler (maechler@@stat.math.ethz.ch), -Simon Marshall (Simon.Marshall@@mail.esrin.esa.it), +Simon Marshall (Simon.Marshall@@gnu.ai.mit.edu), Richard Mlynarik (mly@@adoc.xerox.com), Chris Murphy (murphycm@@sun.aston.ac.uk), Erik Naggum (erik@@naggum.no),
--- a/man/gnus.texi Mon Aug 13 09:13:58 2007 +0200 +++ b/man/gnus.texi Mon Aug 13 09:15:11 2007 +0200 @@ -1805,9 +1805,9 @@ (@code{gnus-group-make-doc-group}). If you give a prefix to this command, you will be prompted for a file name and a file type. Currently supported types are @code{babyl}, @code{mbox}, @code{digest}, -@code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs}, and -@code{forward}. If you run this command without a prefix, Gnus will -guess at the file type. @xref{Document Groups}. +@code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs}, +@code{rfc934} and @code{forward}. If you run this command without a +prefix, Gnus will guess at the file type. @xref{Document Groups}. @item G w @kindex G w (Group) @@ -4313,9 +4313,9 @@ @cindex threading @cindex article threading -Gnus threads articles by default. @dfn{To thread} is to put replies to -articles directly after the articles they reply to---in a hierarchical -fashion. +Gnus threads articles by default. @dfn{To thread} is to put responses +to articles directly after the articles they respond to---in a +hierarchical fashion. @menu * Customizing Threading:: Variables you can change to affect the threading. @@ -7931,6 +7931,7 @@ * Server Commands:: Commands to manipulate servers. * Example Methods:: Examples server specifications. * Creating a Virtual Server:: An example session. +* Server Variables:: Which variables to set. * Servers and Methods:: You can use server names as select methods. * Unavailable Servers:: Some servers you try to contact may be down. @end menu @@ -8147,6 +8148,33 @@ buffer, and you should be able to enter any of the groups displayed. +@node Server Variables +@subsection Server Variables + +One sticky point when defining variables (both on backends and in Emacs +in general) is that some variables are typically initialized from other +variables when the definition of the variables is being loaded. If you +change the "base" variable after the variables have been loaded, you +won't change the "derived" variables. + +This typically affects directory and file variables. For instance, +@code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml} +directory variables are initialized from that variable, so +@code{nnml-active-file} will be @file{~/Mail/active}. If you define a +new virtual @code{nnml} server, it will @emph{not} suffice to set just +@code{nnml-directory}---you have to explicitly set all the file +variables to be what you want them to be. For a complete list of +variables for each backend, see each backend's section later in this +manual, but here's an example @code{nnml} definition: + +@lisp +(nnml "public" + (nnml-directory "~/my-mail/") + (nnml-active-file "~/my-mail/active") + (nnml-newsgroups-file "~/my-mail/newsgroups")) +@end lisp + + @node Servers and Methods @subsection Servers and Methods @@ -8774,8 +8802,11 @@ @cindex incoming mail files @cindex deleting incoming files If non-@code{nil}, the mail backends will delete the temporary incoming -file after splitting mail into the proper groups. This is @code{nil} by -default for reasons of security. +file after splitting mail into the proper groups. This is @code{t} by +default. + +@c This is @code{nil} by +@c default for reasons of security. @c Since Red Gnus is an alpha release, it is to be expected to lose mail. (No Gnus release since (ding) Gnus 0.10 (or something like that) have @@ -9703,7 +9734,7 @@ @item nndoc-article-type @vindex nndoc-article-type This should be one of @code{mbox}, @code{babyl}, @code{digest}, -@code{mmdf}, @code{forward}, @code{news}, @code{rnews}, +@code{mmdf}, @code{forward}, @code{rfc934}, @code{news}, @code{rnews}, @code{mime-digest}, @code{clari-briefs}, or @code{guess}. @item nndoc-post-type @@ -12553,8 +12584,8 @@ @code{browse}, @code{message}, @code{pick}, @code{info}, @code{summary-faq}, @code{edit-group}, @code{edit-server}, @code{edit-score}, @code{post}, @code{reply}, @code{forward}, -@code{reply-yank}, @code{mail-bounce}, @code{draft}, -@code{pipe}, @code{bug}, @code{compose-bounce}. +@code{reply-yank}, @code{mail-bounce}, @code{draft}, @code{pipe}, +@code{bug}, @code{compose-bounce}. Note that the @code{message} key is used for both @code{gnus-group-mail} and @code{gnus-summary-mail-other-window}. If
--- a/man/hyperbole.texi Mon Aug 13 09:13:58 2007 +0200 +++ b/man/hyperbole.texi Mon Aug 13 09:15:11 2007 +0200 @@ -1,14 +1,18 @@ \input texinfo @c -@c FILE: hypb.texi -@c SUMMARY: The Hyperbole User Manual for V3 -@c USAGE: Hardcopy man from TeX; Info man from 'texinfo-format-buffer'. +@c FILE: hyperbole.texi +@c SUMMARY: The Hyperbole User Manual for V4 +@c USAGE: Hardcopy man from TeX; Info man from `texinfo-format-buffer'. @c @c AUTHOR: Bob Weiner -@c ORG: Brown U. +@c +@c ORG: InfoDock Associates. We sell corporate support and +@c development contracts for InfoDock, Emacs and XEmacs. +@c E-mail: <info@infodock.com> Web: http://www.infodock.com +@c Tel: +1 408-243-3300 @c @c ORIG-DATE: 6-Nov-91 at 11:18:03 -@c LAST-MOD: 3-Nov-95 at 23:55:27 by Bob Weiner +@c LAST-MOD: 20-Feb-97 at 12:36:16 by Bob Weiner @c %**start of header (This is for running Texinfo on a region.) @setfilename ../info/hyperbole.info @@ -27,19 +31,38 @@ @center Everyday Information Management @sp 5 @center Bob Weiner +@center InfoDock Associates @sp 1 -@center E-mail: <hyperbole@@hub.ucsb.edu> (This is a mail list.) +@center E-mail: <hyperbole@@infodock.com> (This is a mailing list.) @sp 2 -@center Edition 4.01 +@center Edition 4.02 @sp 2 -@center November 3, 1995 +@center February 19, 1997 @page @vskip 0pt plus 1filll -Copyright @copyright{} 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. +Copyright @copyright{} 1991, 1992, 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. All trademarks referenced herein are trademarks of their respective holders. + +InfoDock Associates, the developer of Hyperbole and InfoDock (an industrial +quality turn-key version of XEmacs), donates its work on Hyperbole to the +Free Software Foundation and makes it freely available for worldwide +distribution. + +InfoDock Associates is a commercial firm dedicated to radical productivity +improvement in technical environments, whether in software development or +other knowledge intensive disciplines. Our initial offerings include high +quality commercial support, training, books and custom package development +for InfoDock, XEmacs or GNU Emacs on a variety of platforms. + +@example + E-mail: <info@@infodock.com> + Web: http://www.infodock.com + Tel: +1 408-243-3300 +@end example + @setchapternewpage odd @end titlepage @page @@ -50,13 +73,30 @@ @ifinfo @noindent -Copyright @copyright{} 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. +Copyright @copyright{} 1991, 1992, 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. All trademarks referenced herein are trademarks of their respective holders. +InfoDock Associates, the developer of Hyperbole and InfoDock (an industrial +quality turn-key version of XEmacs), donates its work on Hyperbole to the +Free Software Foundation and makes it freely available for worldwide +distribution. + +InfoDock Associates is a commercial firm dedicated to radical productivity +improvement in technical environments, whether in software development or +other knowledge intensive disciplines. Our initial offerings include high +quality commercial support, training, books and custom package development +for InfoDock, XEmacs or GNU Emacs on a variety of platforms. + +@example + E-mail: <info@@infodock.com> + Web: http://www.infodock.com + Tel: +1 408-243-3300 +@end example + @end ifinfo This edition of the Hyperbole User Manual is for use with any version -4.01 or greater of Hyperbole. +4.02 or greater of Hyperbole. Hyperbole is free software; you can use it, redistribute it and/or modify it without fee under the terms of the GNU General Public License as published by @@ -75,11 +115,9 @@ @cindex InfoDock, obtaining @cindex Hyperbole, obtaining @cindex anonymous ftp -Hyperbole was designed and written by Bob Weiner. Motorola, -Inc@. funded and donated this work for free redistribution as part of -the InfoDock integrated software engineering and productivity toolset. -For information on how to obtain Hyperbole, @ref{Obtaining}. InfoDock -can be found at the same location. +Hyperbole was designed and written by Bob Weiner of InfoDock Associates. +Motorola, Inc@. helped fund early work. For information on how to +obtain Hyperbole, @ref{Obtaining}. This manual explains user operation and summarizes basic developer facilities of Hyperbole. This major release of Hyperbole concentrates @@ -93,19 +131,17 @@ @cindex Emacs 19 @cindex Epoch @cindex XEmacs -@cindex Lucid Emacs -Hyperbole (pronounced Hi-purr-boe-lee) is an open, efficient, -programmable information management and hypertext system. It is -intended for everyday work on any UNIX platform supported by GNU Emacs. -It works well with the versions of Emacs that support multiple X or -NEXTSTEP windows: Emacs 19, XEmacs (formerly called Lucid Emacs) and -Epoch. Hyperbole allows hypertext buttons to be embedded within -unstructured and structured files, mail messages and news articles. It -offers intuitive mouse-based control of information display within -multiple windows. It also provides point-and-click access to Info -manuals, ftp archives, Wide-Area Information Servers (WAIS), and the -World-Wide Web (WWW) hypertext system through encapsulations of software -that support these protocols. +Hyperbole (pronounced Hi-per-bo-lee) is an open, efficient, programmable +information management and hypertext system. It is intended for +everyday work on any UNIX platform supported by GNU Emacs. It works +well with the versions of Emacs that support multiple X or NEXTSTEP +windows: Emacs 19, XEmacs and Epoch. Hyperbole allows hypertext buttons +to be embedded within unstructured and structured files, mail messages +and news articles. It offers intuitive mouse-based control of +information display within multiple windows. It also provides +point-and-click access to Info manuals, ftp archives, Wide-Area +Information Servers (WAIS), and the World-Wide Web (WWW) hypertext +system through encapsulations of software that support these protocols. @noindent Hyperbole consists of four parts: @@ -442,8 +478,8 @@ @section Mail Lists If you maintain or use Hyperbole, you should consider joining one of the -two Hyperbole interest mailing lists. @xref{Menus}, and the description -of the Msg/ menu item, for a convenient means of joining and mailing +two Hyperbole mailing lists. @xref{Menus}, and the description +of the the Msg/ menu item, for a convenient means of joining and mailing to these lists. @cindex mail lists @@ -456,8 +492,8 @@ @cindex subscribing to a mail list @cindex unsubscribing from a mail list @format -<hyperbole-request@@hub.ucsb.edu> -<hyperbole-announce-request@@hub.ucsb.edu> +<hyperbole-request@@infodock.com> +<hyperbole-announce-request@@infodock.com> @end format @display @@ -468,22 +504,24 @@ don't know that all Internet mail lists have a -request address for administrative requests.@refill -Use the following formats on your subject line to execute requests, -where you substitute your own values for the <> delimited items.@refill - - Subject: Subscribe '<' <user@@domain> '>' (<your name>). - Subject: Unsubscribe '<' <user@@domain> '>'. - -To change your address, you must unsubscribe your old address in one -message and then subscribe your new address in another message.@refill +Use the following formats in the @emph{body} of your message to execute requests, +where you substitute your own values for the <> delimited items and items +enclosed in [] are optional. + + subscribe <mail-list-name> [<your-email-address>] + or + unsubscribe <mail-list-name> [<your-email-address>] For example: - To: hyperbole-announce-request@@hub.ucsb.edu - Subject: Unsubscribe <joe@@any.com>. - - To: hyperbole-announce-request@@hub.ucsb.edu - Subject: Subscribe <joe@@any.com> (Joe Williams). + To: hyperbole-request@@infodock.com + Subject: Used if a human happens to read your mail. + + subscribe hyperbole joe@@nowhere.gov + + To change your address, you must unsubscribe your old address with + once command and subscribe your new address with another command, though + you can embed multiple commands on separate lines within a single message. @end display @noindent @@ -492,17 +530,15 @@ @cindex hyperbole mail list @format -<hyperbole@@hub.ucsb.edu> +<hyperbole@@infodock.com> @end format @display Mail list for discussion of all Hyperbole issues. Bug reports and suggestions may also be sent here.@refill -@end display @cindex e-mail, effective communication @cindex effective communication -@display Always use your Subject and/or Summary: lines to state the position that your message takes on the topic that it addresses. @@ -518,12 +554,10 @@ and high energy, high impact declarations with exclamation points. This simple rule makes all e-mail communication much easier for recipients to handle appropriately.@refill -@end display @cindex Hyperbole version @cindex Emacs version @vindex emacs-version -@display If you ask a question, your subject line should end with a ?, e.g@. "Subject: How can man page SEE ALSOs be made implicit buttons?" A "Subject: Re: How can ..." then indicates an answer to the question. @@ -541,7 +575,7 @@ @cindex hyperbole-announce mail list @format -<hyperbole-announce@@hub.ucsb.edu> +<hyperbole-announce@@infodock.com> @end format @display @@ -639,14 +673,9 @@ @node Obtaining, Building, Installation, Installation @section Obtaining -@cindex InfoDock @cindex ftp @cindex anonymous ftp -Hyperbole is actually part of an integrated tool framework that we have -developed called InfoDock. InfoDock provides a modern user interface on top -of Emacs, information management, and powerful software development tools, -all in one package. Hyperbole or InfoDock can be obtained via anonymous -ftp on the Internet from: +Hyperbole can be obtained via anonymous ftp on the Internet from: @file{ftp://ftp.xemacs.org/pub/infodock}. @@ -668,7 +697,7 @@ Ftp to ftp.xemacs.org (Internet Host ID = 128.174.252.16): @example - prompt> ftp ftp.xemacs.org + prompt> ftp ftp.xemacs.org (If this doesn't work, try `ftp xemacs.org'.) @end example @noindent @@ -687,7 +716,7 @@ Move to the Hyperbole directory: @example - ftp> cd pub/infodock + ftp> cd pub/xemacs/infodock @end example @noindent @@ -935,12 +964,18 @@ @node Configuring, , Installing, Installation @section Configuring +@cindex menu, Cust +@cindex customization +Major Hyperbole user options can be set from the window-system-based +Customization submenu below the Hyperbole menu. Alternatively, the +minibuffer-based menu, Cust/ may be used. + @cindex configuration @vindex file, hyperbole.el @vindex file, hsite.el -There are many Hyperbole configuration options that may be changed by -editing the @file{hyperbole.el} and @file{hsite.el} files in the -@file{hyperbole/} directory. The following sections discuss the +There are many additional Hyperbole configuration options that may be +changed by editing the @file{hyperbole.el} and @file{hsite.el} files in +the @file{hyperbole/} directory. The following sections discuss the configuration options most likely to be of interest to users. @menu @@ -1168,44 +1203,47 @@ @cindex ibtypes, list of @noindent See @file{hibtypes.el} for complete examples. Standard implicit button -types include (in alphabetical order): +types are listed below in the order in which Hyperbole tries to match +to the types when looking for an implicit button. @table @code -@item annot-bib -@findex ibtypes::annot-bib -@cindex bibliography -@cindex reference -Displays annotated bibliography entries referenced internally, delimeters = []. -References must be delimited by square brackets, must begin with a -word constituent character, and must not be in buffers whose -names begin with a ' ' or '*' character. - -@item completion -@findex ibtypes::completion -@cindex completion -Inserts completion at point into minibuffer or other window. - -@item dir-summary -@findex ibtypes::dir-summary -@vindex file, MANIFEST -@vindex file, DIR -Detects filename buttons in files named "MANIFEST" or "DIR". -Displays selected files. -Each file name must be at the beginning of the line and must be followed -by one or more spaces and then another non-space, non-parenthesis, non-brace -character. - @item doc-id @findex ibtypes::doc-id @cindex online library @cindex document identifier Displays an index entry for a site-specific document given its id. Ids -must be delimited by 'doc-id-start' and 'doc-id-end' and must match the -function given by 'doc-id-p'. This permits creation of catalogued +must be delimited by `doc-id-start' and `doc-id-end' and must match the +function given by `doc-id-p'. This permits creation of catalogued online libraries. See @file{$@{hyperb:dir@}/hib-doc-id.el} for more information.@refill +@item completion +@findex ibtypes::completion +@cindex completion +Inserts completion at point into minibuffer or other window. + +@item Info-node +@findex ibtypes::Info-node +@cindex Info node +Makes "(file)node" buttons display the associated Info node. + +@item mail-address +@findex ibtypes::mail-address +@cindex e-mail address +@cindex rolodex address +@cindex address +If on an e-mail address in a specific buffer type, mail to that address +in another window. Applies to the rolodex match buffer, any buffer +attached to a file in @var{rolo-file-list}, or any buffer with @file{mail} +or @file{rolo} (case-insensitive) within its name. + +@item patch-msg +@findex ibtypes::patch-msg +@cindex patch output +Jumps to source code associated with output from the @code{patch} +program. Patch applies diffs to source code. + @item elisp-compiler-msg @findex ibtypes::elisp-compiler-msg @cindex byte compiler error @@ -1214,6 +1252,13 @@ Jumps to source code for definition associated with byte-compiler error message. Works when activated anywhere within an error line. +@item grep-msg +@findex ibtypes::grep-msg +@cindex grep +@cindex compiler error +Jumps to line associated with grep or compilation error msgs. +Messages are recognized in any buffer. + @item debugger-source @findex ibtypes::debugger-source @cindex gdb @@ -1225,70 +1270,6 @@ Jumps to source line associated with debugger stack frame or breakpoint lines. This works with gdb, dbx, and xdb. Such lines are recognized in any buffer. -@item grep-msg -@findex ibtypes::grep-msg -@cindex grep -@cindex compiler error -Jumps to line associated with grep or compilation error msgs. -Messages are recognized in any buffer. - -@item hyp-address -@findex ibtypes::hyp-address -@cindex Hyperbole mail list -Turns a Hyperbole e-mail list address into an implicit button which -inserts Hyperbole environment information. -Useful when sending mail to a Hyperbole mail list. See also the -documentation for @code{actypes::hyp-config}. - -@item hyp-source -@findex ibtypes::hyp-source -@cindex Hyperbole report -Turns source location entries in Hyperbole reports into buttons that jump to the associated location. - -@item Info-node -@findex ibtypes::Info-node -@cindex Info node -Makes "(file)node" buttons display the associated Info node. - -@item kbd-key -@findex ibtypes::kbd-key -@cindex key sequence -Executes a key sequence delimited by curly braces. -Key sequences should be in human readable form, e.g@. @{@kbd{C-b}@}. -Forms such as @{@}, @{@}, and @{^b@} will not be recognized. - -@item klink -@findex ibtypes::klink -@cindex klink -@cindex koutline link -@cindex kcell link -Follows a link delimited by <> to a koutline cell. -See documentation for @code{actypes::link-to-kotl} for valid link -specifiers. - -@item mail-address -@findex ibtypes::mail-address -@cindex e-mail address -@cindex rolodex address -@cindex address -If on an e-mail address in a specific buffer type, mail to that address -in another window. Applies to the rolodex match buffer, any buffer -attached to a file in @var{rolo-file-list}, or any buffer with @file{mail} -or @file{rolo} (case-insensitive) within its name. - -@item man-apropos -@findex ibtypes::man-apropos -@item UNIX manual -@item man pages -@item man apropos -Makes man apropos entries display associated man pages when selected. - -@item patch-msg -@findex ibtypes::patch-msg -@cindex patch output -Jumps to source code associated with output from the @code{patch} -program. Patch applies diffs to source code. - @item pathname @findex ibtypes::pathname @findex hpath:at-p @@ -1302,12 +1283,45 @@ @cindex link, pathname Makes a delimited, valid pathname display the path entry. Also works for delimited and non-delimited ange-ftp and efs pathnames. +Also works for delimited and non-delimited ange-ftp and efs pathnames. +Emacs Lisp library files (filenames that end in .el and .elc) are looked up +using the load-path directory list. + +@noindent See @code{hpath:at-p} function documentation for possible delimiters. See @var{hpath:suffixes} variable documentation for suffixes that are added to or removed from pathname when searching for a valid match. -See @code{hpath:find} function documentation and -@var{hpath:display-alist} and @var{hpath:find-alist} variable -documentation for special file display options. +See @code{hpath:find} function documentation for special file +display options. + +@item klink +@findex ibtypes::klink +@cindex klink +@cindex koutline link +@cindex kcell link +Follows a link delimited by <> to a koutline cell. +See documentation for @code{actypes::link-to-kotl} for valid link +specifiers. + +@item man-apropos +@findex ibtypes::man-apropos +@item UNIX manual +@item man pages +@item man apropos +Makes man apropos entries display associated man pages when selected. + +@item hyp-source +@findex ibtypes::hyp-source +@cindex Hyperbole report +Turns source location entries in Hyperbole reports into buttons that jump to the associated location. + +@item hyp-address +@findex ibtypes::hyp-address +@cindex Hyperbole mail list +Turns a Hyperbole e-mail list address into an implicit button which +inserts Hyperbole environment information. +Useful when sending mail to a Hyperbole mail list. See also the +documentation for @code{actypes::hyp-config}. @item rfc @findex ibtypes::rfc @@ -1322,14 +1336,22 @@ @var{hpath:rfc} variable specifies the location from which to retrieve RFCs." -@item rfc-toc -@findex ibtypes::rfc-toc -@cindex Internet RFC -@cindex Request For Comment -@cindex RFC -@cindex table of contents -Summarizes contents of an Internet rfc from anywhere within rfc buffer. -Each line in summary may be selected to jump to section. +@item kbd-key +@findex ibtypes::kbd-key +@cindex key sequence +Executes a key sequence delimited by curly braces. +Key sequences should be in human readable form, e.g@. @{@kbd{C-b}@}. +Forms such as @{@}, @{@}, and @{^b@} will not be recognized. + +@item dir-summary +@findex ibtypes::dir-summary +@vindex file, MANIFEST +@vindex file, DIR +Detects filename buttons in files named "MANIFEST" or "DIR". +Displays selected files. +Each file name must be at the beginning of the line and must be followed +by one or more spaces and then another non-space, non-parenthesis, non-brace +character. @item text-toc @findex ibtypes::text-toc @@ -1343,6 +1365,34 @@ characters. Each file section name line must start with one or more asterisk characters at the very beginning of the line. +@item cscope +@findex ibtypes::cscope +@cindex C/C++ call trees +@cindex C/C++ cross-reference +@cindex Cscope +Jumps to C/C++ source line associated with Cscope C analyzer output line. +Requires pre-loading of the cscope.el Lisp library available from the Emacs +Lisp archives and the commercial cscope program available from UNIX System +Laboratories. Otherwise, does nothing. + +@item rfc-toc +@findex ibtypes::rfc-toc +@cindex Internet RFC +@cindex Request For Comment +@cindex RFC +@cindex table of contents +Summarizes contents of an Internet rfc from anywhere within rfc buffer. +Each line in summary may be selected to jump to section. + +@item annot-bib +@findex ibtypes::annot-bib +@cindex bibliography +@cindex reference +Displays annotated bibliography entries referenced internally, delimeters = []. +References must be delimited by square brackets, must begin with a +word constituent character, and must not be in buffers whose +names begin with a ` ' or `*' character. + @item www-url @findex ibtypes::www-url @cindex URL @@ -1354,6 +1404,15 @@ When not in a w3 browser buffer, follow any non-ftp url (link) at point. The variable, @var{action-key-url-function}, can be used to customize the url browser that is used. + +@item function-in-buffer +@findex ibtypes::function-in-buffer +@cindex functions +@cindex func-menu +Return function name defined within this buffer that point is within or +after, else nil. This triggers only when the func-menu.el package has +been loaded and the current major mode is one handled by func-menu. + @end table The Hyperbole Smart Keys offer extensive additional context-sensitive @@ -1412,15 +1471,15 @@ @item hyp-config @findex actypes::hyp-config -Inserts Hyperbole configuration info at end of optional OUT-BUF or current. +Inserts Hyperbole configuration info at end of current buffer or optional OUT-BUF. @item hyp-request @findex actypes::hyp-request -Inserts Hyperbole mail list request help into optional OUT-BUF or current. +Inserts Hyperbole mail list request help into current buffer or optional OUT-BUF. @item hyp-source @findex actypes::hyp-source -Displays a buffer or file from a line beginning with 'hbut:source-prefix'. +Displays a buffer or file from a line beginning with `hbut:source-prefix'. @item kbd-key @findex actypes::kbd-key @@ -1431,7 +1490,7 @@ @findex actypes::link-to-buffer-tmp Displays a BUFFER in another window. Link is generally only good for current Emacs session. -Use 'link-to-file' instead for a permanent link. +Use `link-to-file' instead for a permanent link. @item link-to-directory @findex actypes::link-to-directory @@ -1458,12 +1517,14 @@ @item link-to-file-line @findex actypes::link-to-file-line -Displays a PATH in another window scrolled to LINE-NUM. +Displays a file given by PATH scrolled to LINE-NUM. @item link-to-kcell @findex actypes::link-to-kcell -Displays FILE with kcell given by CELL-REF at the top of the window. -CELL-REF may be a kcell's display label or its permanant idstamp. +Displays FILE with kcell given by CELL-REF at window top. +See documentation for `kcell:ref-to-id' for valid cell-ref formats. + +@noindent If FILE is nil, the current buffer is used. If CELL-REF is nil, the first cell in the view is shown. @@ -1480,11 +1541,10 @@ @noindent See documentation for @code{kcell:ref-to-id} for valid cell-ref formats. - @item link-to-Info-node @findex actypes::link-to-Info-node Displays an Info NODE in another window. -NODE must be a string of the form '(file)nodename'. +NODE must be a string of the form `(file)nodename'. @item link-to-mail @findex actypes::link-to-mail @@ -2114,17 +2174,17 @@ @cindex menubar, Hyperbole menu Under InfoDock, XEmacs, and Emacs 19, pulldown and popup menus are available to invoke Hyperbole commands, including those from the rolodex -and the outliner. These menus operate like any other X window menus. -Use the Quit command on the Hyperbole menubar menu to get rid of the -menu if you do not need it. Invoking Hyperbole again will add the menu -back to the menubar. +and the outliner. These menus operate like any other application menus +and are fairly self-explanatory. Use the Quit command on the Hyperbole +menubar menu to get rid of the menu if you do not need it. Invoking +Hyperbole again will add the menu back to the menubar. @cindex minibuffer menus This section discusses only the specialized @dfn{minibuffer menus} that -appear in the minibuffer window and that work with all Emacs versions. -Minibuffer menu items may be selected from either the keyboard or via -mouse clicks. When used with the keyboard, they provide rapid command -access similar to key bindings. +appear in the minibuffer window and that work with all Emacs versions on +all display devices. Minibuffer menu items may be selected from either +the keyboard or via mouse clicks. When used with the keyboard, they +provide rapid command access similar to key bindings. @kindex C-h h @vindex action-key-default-function @@ -2136,7 +2196,7 @@ @noindent @example -Hy4> Act Butfile/ Doc/ Ebut/ Gbut/ Hist Ibut/ Msg/ Otl/ Rolo/ Win/ +Hy4> Act Butfile/ Cust/ Doc/ Ebut/ Gbut/ Hist Ibut/ Msg/ Otl/ Rolo/ Win/ @end example @noindent @@ -2156,20 +2216,34 @@ @file{HYPB} for a local button file and @file{~/.hyperb/HYPB} for your global file. These are good places to start your button creation testing. +@cindex menu, Cust +@cindex customization +@cindex option settings +@item Cust/ +Customizes Hyperbole by setting major options. +This includes where Hyperbole link referents are displayed, where URLs +are displayed and whether to use proportional or windowful scrolling +when a Smart Key is pressed at the end of a line. @xref{Configuring}. + @cindex menu, EBut @item Ebut/ -All explicit button commands. +All explicit button commands. The window-system-based Hyperbole +menu includes a menu item that activates each explicit button found +in the current buffer. @cindex menu, Doc @cindex menu, Types @item Doc/ -Hyperbole documentation quick access. Contains Types/ submenu for -documentation on Hyperbole implicit button and action types. +Hyperbole documentation quick access. Contains About item describing +Hyperbole and a Demo item which demonstrates a number of Hyperbole +features. It also contains the Types/ submenu for documentation on +Hyperbole implicit button and action types. @cindex menu, Global Buttons @item Gbut/ All global button commands. Global buttons are accessed by name -rather than by direct selection. +rather than by direct selection. The window-system-based Hyperbole +menu also includes a menu item that activates each global button. @cindex menu, History @cindex history @@ -2182,9 +2256,9 @@ @cindex menu, Message @item Msg/ -Hyperbole-specific mail and news messaging support commands. -Use this to send mail to the Hyperbole discussion list or to -add/modify your entry on a Hyperbole mail list. +Hyperbole-specific mail and news messaging support commands. Use this +to send mail to a Hyperbole mail list or to add/modify/delete your entry +on a list. @cindex menu, Outliner @item Otl/ @@ -3003,7 +3077,7 @@ The current view spec is saved whenever the outline is saved. The next time the outline is read in, this will be the initial view. -The rest of this section documents the view spec characters that are +The rest of this section documents the the view spec characters that are presently supported and explains how to invoke a view spec. There is no user-level way to add your own view spec characters, so all character codes are reserved for future use. @@ -3482,7 +3556,7 @@ Move to the previous entry at any level. @kindex u @item u -Move to the previous entry one level up. +Move the the previous entry one level up. @kindex . @kindex < @item . @@ -3594,14 +3668,14 @@ @cindex wconfig commands @cindex window configuration commands -@example -@group @findex wconfig-add-by-name @findex wconfig-delete-by-name @findex wconfig-restore-by-name @findex wconfig-delete-pop @findex wconfig-ring-save @findex wconfig-yank-pop +@example +@group Menu Item Command Description ==================================================================== AddName wconfig-add-by-name Name current wconfig @@ -4591,9 +4665,9 @@ @end group @end format -@cindex drag, between windows @format @group +@cindex drag, between windows If dragged from inside one window to another: ACTION Creates a new link button at the drag start location, linked to the @@ -4633,7 +4707,7 @@ modeline clicked belongs to a window displaying Info, the Info buffer is hidden; (3) clicked anywhere in the middle of a window's modeline, - the functions listed in 'assist-key-modeline-hook' are + the functions listed in `assist-key-modeline-hook' are called; (4) dragged vertically from modeline to within a window, the modeline is moved to point of key release, thereby resizing @@ -4711,6 +4785,15 @@ @end group @end format +@format +@group +If in ID-edit mode (a package from InfoDock Associates that supports +rapid killing, copying, ynaking and display-management): + ACTION or ASSIST + Yanks (pastes) last selected region at point. +@end group +@end format + @vindex smart-scroll-proportional @cindex proportional scrolling @cindex scrolling @@ -4734,6 +4817,16 @@ @end group @end format +@format +@group +When pressed on a Smart Menu item: + ACTION + Activates item. + ASSIST + Displays help for item. +@end group +@end format + @cindex click, button @cindex button click @format @@ -4748,6 +4841,16 @@ @format @group +If Smart Menu package has been loaded and `hkey-always-display-menu' is +non-nil: + ACTION or ASSIST + Pops up a window with a Smart Menu of commands. + Menu displayed is selected by (smart-menu-choose-menu). +@end group +@end format + +@format +@group If pressed within a buffer in View major or minor mode: ACTION Scrolls buffer forward a windowful and quits from view mode when at @@ -4782,16 +4885,6 @@ @end group @end format -@format -@group -When pressed on a Smart Menu item: - ACTION - Activates item. - ASSIST - Displays help for item. -@end group -@end format - @page @format @group @@ -4803,66 +4896,16 @@ @format @group -When pressed within an OO-Browser listing window: - ACTION - (1) in a blank buffer or at the end of a buffer, browser help - information is displayed in the viewer window; - (2) at the beginning of a (non-single char) class name, the class' - ancestors are listed; - (3) at the end of an entry line, scrolls listing up; - (4) on the '...', following a class name, point is moved to the class - descendency expansion; - (5) before an element name, the implementor classes of the name are - listed; - (6) anywhere else on an entry line, the source is displayed for editing. - ASSIST - (1) in a blank buffer, a selection list of buffer files is displayed; - (2) at the beginning of a (non-single char) entry, the class' - descendants are listed; - (3) at the end of an entry line, scrolls listing down; - (4) on the '...', following a class name, point is moved to the class - expansion; - (5) anywhere else on a class entry line, lists the class' elements; - (6) anywhere else on an element line, lists the element's implementor - classes; - (7) on a blank line following all entries, the current listing buffer - is exited. -@end group -@end format - -@format -@group -When pressed within an OO-Browser Command Help Menu buffer: - ACTION - Executes an OO-Browser command whose key binding is at point. - ASSIST - Displays help for an OO-Browser command whose key binding is at point. -@end group -@end format - -@format -@group -When pressed on an identifier within an OO-Browser source file: - ACTION - Tries to display identifier definition. - ASSIST - Not applicable. -@end group -@end format - -@page -@format -@group When pressed within a C source code file: ACTION Jumps to the definition of selected C construct: - (1) on a '#include' statement, the include file is displayed; + (1) on a `#include' statement, the include file is displayed; Look for include file in directory lists - 'smart-c-cpp-include-dirs' and 'smart-c-include-dirs'. + `smart-c-cpp-include-dirs' and `smart-c-include-dirs'. (2) on a C identifier, the identifier definition is displayed, - assuming the identifier is found within an 'etags' generated tag file + assuming the identifier is found within an `etags' generated tag file in the current directory or any of its ancestor directories. - (3) if 'smart-c-use-lib-man' is non-nil, the C identifier is + (3) if `smart-c-use-lib-man' is non-nil, the C identifier is recognized as a library symbol, and a man page is found for the identifier, then the man page is displayed. ASSIST @@ -4877,9 +4920,9 @@ Jumps to the definition of selected assembly construct: (1) on an include statement, the include file is displayed; Look for include file in directory list - 'smart-asm-include-dirs'. + `smart-asm-include-dirs'. (2) on an identifier, the identifier definition is displayed, - assuming the identifier is found within an 'etags' generated + assuming the identifier is found within an `etags' generated tag file in the current directory or any of its ancestor directories. ASSIST @@ -4890,49 +4933,10 @@ @page @format @group -When pressed within a C++ source code file: - ACTION - Jumps to the definition of selected C+ construct: - (1) on a '#include' statement, the include file is displayed; - Look for include file in directory lists - 'smart-c-cpp-include-dirs' and 'smart-c-include-dirs'. - (2) on a C++ identifier, the identifier definition is displayed, - assuming the identifier is found within an 'etags' generated tag file - in the current directory or any of its ancestor directories. - (3) if 'smart-c-use-lib-man' is non-nil, the C++ identifier is - recognized as a library symbol, and a man page is found for the - identifier, then the man page is displayed. - ASSIST - Jumps to the next tag matching an identifier at point. -@end group -@end format - -@format -@group -When pressed within a Objective-C source code file: - ACTION - Jumps to the definition of selected C+ construct: - (1) on a '#include' statement, the include file is displayed; - Look for include file in directory lists - 'smart-c-cpp-include-dirs' and 'smart-c-include-dirs'. - (2) on an Objective-C identifier, the identifier definition is displayed, - assuming the identifier is found within an 'etags' generated tag file - in the current directory or any of its ancestor directories. - (3) if 'smart-c-use-lib-man' is non-nil, the Objective-C identifier is - recognized as a library symbol, and a man page is found for the - identifier, then the man page is displayed. - ASSIST - Jumps to the next tag matching an identifier at point. -@end group -@end format - -@page -@format -@group When pressed on a Lisp symbol within a Lisp code buffer: ACTION Jumps to the definition of any selected Lisp construct. - If on an Emacs Lisp require, load, or autoload clause and 'find-library' + If on an Emacs Lisp require, load, or autoload clause and `find-library' from load-library package by Hallvard Furuseth <hallvard@@ifi.uio.no> has been loaded, jumps to library source, if possible. ASSIST @@ -4942,14 +4946,53 @@ @end group @end format +@page +@format +@group +When pressed within a Java source code file: + ACTION + Jumps to the definition of selected Java construct: + (1) within a commented @@see cross-reference, the referent is + displayed; + (2) on a `package' or `import' statement, the referent is + displayed; Look for referent files in the directory list + `smart-java-package-dirs'. + (3) on an Java identifier, the identifier definition is displayed, + assuming the identifier is found within an `etags' generated + tag file in the current directory or any of its ancestor + directories." + ASSIST + Jumps to the next tag matching an identifier at point. +@end group +@end format + +@format +@group +When pressed within a C++ source code file: + ACTION + Jumps to the definition of selected C++ construct: + (1) on a `#include' statement, the include file is displayed; + Look for include file in directory lists + `smart-c-cpp-include-dirs' and `smart-c-include-dirs'. + (2) on a C++ identifier, the identifier definition is displayed, + assuming the identifier is found within an `etags' generated tag file + in the current directory or any of its ancestor directories. + (3) if `smart-c-use-lib-man' is non-nil, the C++ identifier is + recognized as a library symbol, and a man page is found for the + identifier, then the man page is displayed. + ASSIST + Jumps to the next tag matching an identifier at point. +@end group +@end format + @format @group When the OO-Browser has been loaded and the press is within a C++ buffer: ACTION or ASSIST Jumps to the definition of selected C++ construct via OO-Browser support. - (1) on a '#include' statement, the include file is displayed; + (1) on a `#include' statement, the include file is displayed; Look for include file in directory lists - 'smart-c-cpp-include-dirs' and 'smart-c-include-dirs'. + `smart-c-cpp-include-dirs' and `smart-c-include-dirs'. (2) within a method declaration, its definition is displayed; (3) on a class name, the class definition is shown. @end group @@ -4957,14 +5000,33 @@ @format @group +When pressed within a Objective-C source code file: + ACTION + Jumps to the definition of selected C+ construct: + (1) on a `#include' statement, the include file is displayed; + Look for include file in directory lists + `smart-c-cpp-include-dirs' and `smart-c-include-dirs'. + (2) on an Objective-C identifier, the identifier definition is displayed, + assuming the identifier is found within an `etags' generated tag file + in the current directory or any of its ancestor directories. + (3) if `smart-c-use-lib-man' is non-nil, the Objective-C identifier is + recognized as a library symbol, and a man page is found for the + identifier, then the man page is displayed. + ASSIST + Jumps to the next tag matching an identifier at point. +@end group +@end format + +@format +@group When the OO-Browser has been loaded and the press is within a Objective-C buffer: ACTION or ASSIST Jumps to the definition of selected Objective-C construct via OO-Browser support. - (1) on a '#include' statement, the include file is displayed; + (1) on a `#include' statement, the include file is displayed; Look for include file in directory lists - 'smart-c-cpp-include-dirs' and 'smart-c-include-dirs'. + `smart-c-cpp-include-dirs' and `smart-c-include-dirs'. (2) within a method declaration, its definition is displayed; (3) on a class name, the class definition is shown. @end group @@ -4972,6 +5034,14 @@ @format @group +When pressed within a Fortran source code file: + ACTION or ASSIST + Jumps to the next tag matching an identifier at point. +@end group +@end format + +@format +@group When pressed within an occur-mode or moccur-mode buffer: ACTION or ASSIST Jumps to the source buffer and line of the current occurrence. @@ -5012,20 +5082,60 @@ @end group @end format +@page @format @group -If Smart Menu package has been loaded and 'hkey-always-display-menu' is -non-nil: - ACTION or ASSIST - Pops up a window with a Smart Menu of commands. - Menu displayed is selected by (smart-menu-choose-menu). +When pressed within an OO-Browser listing window: + ACTION + (1) in a blank buffer or at the end of a buffer, browser help + information is displayed in the viewer window; + (2) at the beginning of a (non-single char) class name, the class' + ancestors are listed; + (3) at the end of an entry line, scrolls listing up; + (4) on the `...', following a class name, point is moved to the class + descendency expansion; + (5) before an element name, the implementor classes of the name are + listed; + (6) anywhere else on an entry line, the source is displayed for editing. + ASSIST + (1) in a blank buffer, a selection list of buffer files is displayed; + (2) at the beginning of a (non-single char) entry, the class' + descendants are listed; + (3) at the end of an entry line, scrolls listing down; + (4) on the `...', following a class name, point is moved to the class + expansion; + (5) anywhere else on a class entry line, lists the class' elements; + (6) anywhere else on an element line, lists the element's implementor + classes; + (7) on a blank line following all entries, the current listing buffer + is exited. +@end group +@end format + +@format +@group +When pressed within an OO-Browser Command Help Menu buffer: + ACTION + Executes an OO-Browser command whose key binding is at point. + ASSIST + Displays help for an OO-Browser command whose key binding is at point. +@end group +@end format + +@format +@group +When pressed on an identifier within an OO-Browser source file: + ACTION + Tries to display identifier definition. + ASSIST + Not applicable. @end group @end format @page @format @group -If pressed within an outline-mode buffer or when 'selective-display' is +If pressed within an outline-mode buffer or when `selective-display' is non-nil: ACTION Collapses, expands, and moves outline entries. @@ -5061,9 +5171,9 @@ (2) the Up,Next,or Previous entries of a Node Header (first line), the desired node is found; (3) the File entry of a Node Header (first line), - the 'Top' node within that file is found; + the `Top' node within that file is found; (4) at the end of the current node, the Next node is found (this will - descend subtrees if the function 'Info-global-next' is bound); + descend subtrees if the function `Info-global-next' is bound); (5) anywhere else (e.g@. at the end of a line), the current node entry is scrolled up a windowful. ASSIST @@ -5072,7 +5182,7 @@ (2) the Up,Next,or Previous entries of a Node Header (first line), the last node in the history list is found; (3) the File entry of a Node Header (first line), - the 'DIR' root-level node is found; + the `DIR' root-level node is found; (4) at the end of the current node, the Previous node is found (this will return from subtrees if the function 'Info-global-prev is bound); (5) anywhere else (e.g@. at the end of a line), the current node entry is @@ -5083,8 +5193,8 @@ @page @format @group -If pressed within a Hyperbole-supported mail reader, 'hmail:reader', or mail -summary mode, 'hmail:lister', buffer at: +If pressed within a Hyperbole-supported mail reader, `hmail:reader', or mail +summary mode, `hmail:lister', buffer at: ACTION (1) a msg buffer, within the first line or at the end of a message, the next undeleted message is displayed; @@ -5200,9 +5310,9 @@ performed, they are executed after user verification, otherwise, this dired invocation is quit. ASSIST - (1) on a '~' character, all backup files in the directory are marked for + (1) on a `~' character, all backup files in the directory are marked for deletion; - (2) on a '#' character, all auto-save files in the directory are marked + (2) on a `#' character, all auto-save files in the directory are marked for deletion; (3) anywhere else within an entry line, the current entry is marked for deletion; @@ -5236,7 +5346,7 @@ @group If pressed on a cross reference within a man page entry section labeled NAME, SEE ALSO, or PACKAGES USED, or within a man page C routine -specification (see 'smart-man-c-routine-ref') and man page buffer +specification (see `smart-man-c-routine-ref') and man page buffer has either an attached file or else a @var{man-path} local variable containing its pathname: ACTION or ASSIST @@ -5535,7 +5645,7 @@ @findex kotl-mode:goto-cell @item kotl-mode:goto-cell @{@kbd{C-c g}@} -Move point to start of cell given by CELL-REF. (See 'kcell:ref-to-id'.) +Move point to start of cell given by CELL-REF. (See `kcell:ref-to-id'.) Return point iff CELL-REF is found within current view. With a prefix argument, CELL-REF is assigned the argument value for use as an idstamp. @@ -5829,7 +5939,7 @@ @cindex Hyperbole version If you find any errors in Hyperbole's operation or documentation, feel free to report them to the Hyperbole discussion list: -<hyperbole@@hub.ucsb.edu>. Be sure to use the Msg/Compose-Hypb-Mail +<hyperbole@@infodock.com>. Be sure to use the Msg/Compose-Hypb-Mail minibuffer menu item whenever you send a message to the mail list since it will insert important system version information for you.
--- a/man/message.texi Mon Aug 13 09:13:58 2007 +0200 +++ b/man/message.texi Mon Aug 13 09:15:11 2007 +0200 @@ -299,6 +299,7 @@ * Insertion:: Inserting things into message buffers. * Various Commands:: Various things. * Sending:: Actually sending the message. +* Mail Aliases:: How to use mail aliases. @end menu @@ -555,6 +556,30 @@ @end table + +@node Mail Aliases +@section Mail Aliases +@cindex mail aliases +@cindex aliases + +Message uses @code{mailabbrev} to handle mail aliases. +@code{mailabbrev} works by parsing the @file{/etc/mailrc} and +@file{~/.mailrc} files. These files look like: + +@example +alias lmi "Lars Magne Ingebrigtsen <larsi@@ifi.uio.no>" +alias ding "ding@@ifi.uio.no (ding mailing list)" +@end example + +After adding lines like this to your @file{~/.mailrc} file, you should +be able to just write @samp{lmi} in the @code{To} or @code{Cc} (and so +on) headers and press @kbd{SPC} to expand the alias. + +No expansion will be performed upon sending of the message---all +expansions have to be done explicitly. + + + @node Variables @chapter Variables @@ -661,6 +686,13 @@ @code{message-send-mail-with-sendmail}. If you prefer using MH instead, set this variable to @code{message-send-mail-with-mh}. +@item message-mh-deletable-headers +@vindex message-mh-deletable-headers +Most versions of MH doesn't like being fed messages that contain the +headers in this variable. If this variable is non-@code{nil} (which is +the default), these headers will be removed before mailing. Set it to +@code{nil} if your MH can handle these headers. + @end table @@ -696,8 +728,10 @@ @cindex organization This optional header will be filled out depending on the @code{message-user-organization} variable. -@code{message-user-organization-file} will be used if that variable is -@code{t}. +@code{message-user-organization-file} will be used if this variable is +@code{t}. This variable can also be a string (in which case this string +will be used), or it can be a function (which will be called with no +parameters and should return a string to be used). @item Lines @cindex Lines @@ -890,6 +924,22 @@ @vindex message-header-setup-hook Hook called narrowed to the headers after initializing the headers. +For instance, if you're running Gnus and wish to insert a +@samp{Mail-Copies-To} header in all your news articles and all messages +you send to mailing lists, you could do something like the following: + +@lisp +(defun my-message-header-setup-hook () + (when (or (message-fetch-field "newsgroups") + (gnus-group-find-parameter + gnus-newsgroup-name 'to-address) + (gnus-group-find-parameter + gnus-newsgroup-name 'to-list)) + (insert "Mail-Copies-To: never\n"))) + +(add-hook 'message-header-setup-hook 'my-message-header-setup-hook) +@end lisp + @item message-send-hook @vindex message-send-hook Hook run before sending messages.
--- a/man/oo-browser.texi Mon Aug 13 09:13:58 2007 +0200 +++ b/man/oo-browser.texi Mon Aug 13 09:15:11 2007 +0200 @@ -3,12 +3,17 @@ @c @c SUMMARY: The OO-Browser User Manual for V2 -@c USAGE: Hardcopy man from TeX; Info man from 'texinfo-format-buffer'. +@c USAGE: Hardcopy man from TeX; Info man from `texinfo-format-buffer'. @c @c AUTHOR: Bob Weiner -@c ORG: Motorola Inc., PPG +@c +@c ORG: InfoDock Associates. We sell corporate support and +@c development contracts for InfoDock, Emacs and XEmacs. +@c E-mail: <info@infodock.com> Web: http://www.infodock.com +@c Tel: +1 408-243-3300 +@c @c ORIG-DATE: 10-Apr-90 -@c LAST-MOD: 2-May-96 at 23:36:02 by Harri Pasanen +@c LAST-MOD: 21-Feb-97 at 18:36:33 by Bob Weiner @c @c DESCRIPTION: @c DESCRIP-END. @@ -30,19 +35,38 @@ @center The Multi-language Object-Oriented Code Browser @sp 5 @center Bob Weiner -@center Motorola Inc. -@center E-mail: <oo-browser@@hub.ucsb.edu> (This is a mailing list.) +@center InfoDock Associates +@sp 1 +@center E-mail: <oo-browser@@infodock.com> (This is a mailing list.) @sp 2 -@center Edition 2.9.12 +@center Edition 2.10 @sp 2 -@center May 1996 +@center February 19, 1997 @page @vskip 0pt plus 1filll -Copyright @copyright{} 1989-1995 Free Software Foundation, Inc. +Copyright @copyright{} 1989-1997 Free Software Foundation, Inc. All trademarks referenced herein are trademarks of their respective holders. + +InfoDock Associates, the developer of the OO-Browser and InfoDock (an +industrial quality turn-key version of XEmacs), donates its work on +the OO-Browser to the Free Software Foundation and makes it freely +available for worldwide distribution. + +InfoDock Associates is a commercial firm dedicated to radical productivity +improvement in technical environments, whether in software development or +other knowledge intensive disciplines. Our initial offerings include high +quality commercial support, training, books and custom package development +for InfoDock, XEmacs or GNU Emacs on a variety of platforms. + +@example + E-mail: <info@@infodock.com> + Web: http://www.infodock.com + Tel: +1 408-243-3300 +@end example + @setchapternewpage on @end titlepage @page @@ -53,13 +77,31 @@ @ifinfo @noindent -Copyright @copyright{} 1989-1996 Free Software Foundation, Inc. +Copyright @copyright{} 1989-1997 Free Software Foundation, Inc. All trademarks referenced herein are trademarks of their respective holders. +InfoDock Associates, the developer of the OO-Browser and InfoDock (an +industrial quality turn-key version of XEmacs), donates its work on +the OO-Browser to the Free Software Foundation and makes it freely +available for worldwide distribution. + +InfoDock Associates is a commercial firm dedicated to radical productivity +improvement in technical environments, whether in software development or +other knowledge intensive disciplines. Our initial offerings include high +quality commercial support, training, books and custom package development +for InfoDock, XEmacs or GNU Emacs on a variety of platforms. + +@example + E-mail: <info@@infodock.com> + Web: http://www.infodock.com + Tel: +1 408-243-3300 +@end example + @end ifinfo + This edition of the OO-Browser User Manual is for use with any version -2.9.12 or greater of the OO-Browser. The OO-Browser is available for +2.10 or greater of the OO-Browser. The OO-Browser is available for free use, distribution, and modification under the terms of version 2 or later of the GNU Public License (GPL). No representations are made about the suitability of this software for any purpose. It is provided @@ -69,19 +111,18 @@ @cindex InfoDock, obtaining @cindex OO-Browser, obtaining @cindex anonymous ftp -The OO-Browser was designed and written by Bob Weiner. Motorola, -Inc. funded and donated this work for free redistribution as part of the -InfoDock integrated productivity toolset. Torgeir Veimo and Mark Stern -helped write the X OO-Browser core. Don Yacktman helped write the -NEXTSTEP OO-Browser core. Jeff Sparkes helped with the Java language -support. Harri Pasanen implemented the Python language support, and -updated the documentation to reflect that addition. +The OO-Browser was designed and written by Bob Weiner of InfoDock +Associates. Motorola, Inc@. help fund early work. Torgeir Veimo and +Mark Stern helped write the X OO-Browser core. Don Yacktman helped +write the NEXTSTEP OO-Browser core. Jeff Sparkes helped with the Java +language support. Harri Pasanen helped with the Python language +support. @vindex file, BR-README @cindex README file @cindex installation The OO-Browser and InfoDock can be obtained via anonymous ftp on the -Internet from: @file{/anonymous@@ftp.xemacs.org:/pub/infodock}. +Internet from: @file{ftp://ftp.xemacs.org/pub/infodock}. Installation instructions for the OO-Browser can be found in the @file{BR-README} file in the OO-Browser distribution. @@ -162,6 +203,8 @@ OO-Browser Options * External Viewing:: Using An External Viewer or Editor +* Inherited Features:: Toggling Inherited Feature Display +* Graphical Add Features:: Add Features to a Graphical View * Keep Viewed Classes:: * Inhibit Version:: Inhibit Version Screen * Invert Ancestors:: Invert Ancestor Trees @@ -215,10 +258,10 @@ @cindex OO-Browser @cindex Smalltalk -The @dfn{OO-Browser} is a multi-windowed, interactive, object-oriented -class browser designed for professional use. Its user interface is -similar to the well-known Smalltalk browsers @cite{[Goldberg 83]}, yet -it is much more flexible and easy to use. +The @dfn{OO-Browser} (pronounced owe-owe-browse-er) is a multi-windowed, +interactive, object-oriented class browser designed for professional +use. Its user interface is similar to the well-known Smalltalk browsers +@cite{[Goldberg 83]}, yet it is much more flexible and easy to use. @cindex Eiffel @cindex C++ @@ -232,9 +275,10 @@ The OO-Browser is unique in several respects: @itemize @bullet @item -It currently supports seven object-oriented languages (Eiffel, C++, -Objective-C, CLOS (Lisp), Java, Python and Smalltalk), one non-object-oriented -language (C), and one documentation language, (GNU Info). +It currently supports seven object-oriented languages (C++, CLOS (Lisp), +Eiffel, Java, Objective-C, Python and Smalltalk), one +non-object-oriented language (C), and one documentation language, (GNU +Info). @item It may be used for both system exploration and for browsing purposes as @@ -282,7 +326,7 @@ @end iftex @ifinfo Mouse click on the following filename to view a picture of -the textual OO-Browser: "im/oobr-text.eps". Under InfoDock, use the +the textual OO-Browser: @file{im/oobr-text.eps}. Under InfoDock, use the middle mouse button. Under Emacs with the Hyperbole system loaded, use the shift-middle mouse button or shift-left on a two button mouse. Otherwise, there is no built-in way to view the picture. @@ -558,7 +602,8 @@ language. The language-specific browser invocation commands are: @{@kbd{M-x eif-browse @key{RET}}@}, @{@kbd{M-x c++-browse @key{RET}}@}, @{@kbd{M-x info-browse @key{RET}}@}, @{@kbd{M-x clos-browse -@key{RET}}@}, @{@kbd{M-x objc-browse @key{RET}}@}, @{@kbd{M-x python-browse @key{RET}}@}.@refill +@key{RET}}@}, @{@kbd{M-x objc-browse @key{RET}}@}, +@{@kbd{M-x python-browse @key{RET}}@}.@refill @cindex Environment file @cindex prefix argument @@ -1216,7 +1261,7 @@ will match to all classes referenced in the Environment. If you want a regular expression to match to whole class names -exclusively, begin it with a '^' and end it with a '$' character which +exclusively, begin it with a `^' and end it with a `$' character which match to beginning of name and end of name, respectively. Thus, "^....$" would match to class names with exactly four characters. A string match always matches to any class name that contains the matching @@ -1252,7 +1297,7 @@ will match to all entries in the listing, so no filtering will be done. If you want a regular expression to match to whole entries -exclusively, begin it with a '^' and end it with a '$' character which +exclusively, begin it with a `^' and end it with a `$' character which match to beginning of line and end of line, respectively. Thus, "^....$" would match to entry lines with exactly four characters. A string match always matches to any entry that contains the matching string. @@ -1330,10 +1375,10 @@ @cindex Eiffel, short @cindex Eiffel, flat @{@kbd{M-x eif-info-use-short}@} will instead cause the -@code{(br-entry-info)} command to run the Eiffel 'short' command on a +@code{(br-entry-info)} command to run the Eiffel `short' command on a class, thereby displaying its specification. @{@kbd{M-x eif-info-use-flat}@}, will cause the command to run -the Eiffel 'flat' command on a class, thereby displaying its complete +the Eiffel `flat' command on a class, thereby displaying its complete feature set. Use @{@kbd{M-x eif-info-use-calls}@} to reset this command to its default behavior. @@ -1412,7 +1457,7 @@ The X interface to the OO-Browser is called, @dfn{xoobr}. It provides a simple but effective means of navigating through OO-Browser hierarchy and element relations. (The NEXTSTEP OO-Browser is very similar to the -X version, so use the documentation herein if you need any help with it.) +X version, so the documentation herein also applies to it.) Any number of xoobr sessions may be established at the same time. Each one is used to gain a particular view on an Environment. The textual @@ -1430,9 +1475,21 @@ @end iftex @ifinfo If running under the X window system, Action Key click on the following -filename to view a picture of the X OO-Browser: "im/oobr-x.xwd". +filename to view a picture of the X OO-Browser: @file{im/oobr-x.xwd}. @end ifinfo +@kindex M-f +@findex br-tree-features-toggle +@cindex xoobr, displaying features +@cindex descendancy view +@{@kbd{M-f}@} @code{(br-tree-features-toggle)} or the menu item, +@emph{Options/Graphical-Add-Features}, is used before creating a +graphical descendency view to determine whether or not to include the +features of each class in the listing as child nodes of the class. +It toggles between showing features and not showing them in descendancy +views. The setting applies across all OO-Browser languages. The +default setting is not to add features to the view. + @kindex M-g @findex br-tree-graph @cindex xoobr, graphical view @@ -1446,22 +1503,11 @@ @cindex xoobr, descendants @{@kbd{M-d}@} @code{(br-tree)} selects the current class and displays its descendancy graph in tree-form by starting a new xoobr session. -With a prefix argument, @{@kbd{C-u M-d}@}, displays descendancy trees +With a prefix argument, @{@kbd{C-u M-d}@}, it displays descendancy trees for all classes at the current browser level. They are all grouped -under some imaginary joining node so as to maintain the concept of one +under an imaginary root node so as to maintain the concept of one tree per xoobr view. -@kindex M-f -@findex br-tree-features-toggle -@cindex xoobr, displaying features -@cindex descendancy view -@{@kbd{M-f}@} @code{(br-tree-features-toggle)} is used before creating a -graphical descendency view to determine whether or not to include the -features of each class in the listing as child nodes of the class. -It toggles between showing features and not showing them in descendancy -views. The setting applies across all OO-Browser languages. The -default setting is to not add features to the view. - @cindex xoobr, view Xoobr views are meant to complement the textual browser interface. Therefore, the two most common actions used in the text browser are @@ -1511,6 +1557,8 @@ @menu * External Viewing:: Using An External Viewer or Editor +* Inherited Features:: Toggling Inherited Features Display +* Graphical Add Features:: Add Features to a Graphical View * Keep Viewed Classes:: * Inhibit Version:: Inhibit Version Screen * Invert Ancestors:: Invert Ancestor Trees @@ -1519,7 +1567,7 @@ * Sort Options:: Controlling Class Listing Order @end menu -@node External Viewing, Keep Viewed Classes, Options, Options +@node External Viewing, Inherited Features, Options, Options @comment node-name, next, previous, up @section Using an External Viewer or Editor @@ -1573,7 +1621,34 @@ @end display -@node Keep Viewed Classes, Inhibit Version, External Viewing, Options +@node Inherited Features, Graphical Add Features, External Viewing, Options +@comment node-name, next, previous, up +@section Toggling Inherited Features Display + +@cindex inherited features +@cindex feature options +By default, when the OO-Browser lists features of a class, it shows both +the ones lexically defined within the class source text and the ones +inherited from ancestor classes. Each feature is listed below the class +in which it is originally defined, for clarity. Sometimes it is useful +to see only the lexically defined features of a class. In such cases, +the menu item, @emph{Options/Show-Inherited-Features}, toggles this +setting. If you want this on by default, you can add the following +line to a personal initialization file: + +@display + @code{(setq br-inherited-features-flag nil)} +@end display + + +@node Graphical Add Features, Keep Viewed Classes, Inherited Features, Options +@comment node-name, next, previous, up +@section Add Features to a Graphical View + +@xref{Graphical Browsing, , Graphical OO-Browser Interfaces}. + + +@node Keep Viewed Classes, Inhibit Version, Graphical Add Features, Options @comment node-name, next, previous, up @section Keep Viewed Classes @@ -1591,19 +1666,20 @@ @findex br-toggle-keep-viewed @vindex br-keep-viewed-classes -The value of the @var{br-keep-viewed-classes} flag may be easily -toggled with the @code{(br-toggle-keep-viewed)} command bound to -@{@kbd{V}@}. +The value of the @var{br-keep-viewed-classes} flag may be easily toggled +with the @code{(br-toggle-keep-viewed)} command or with the menu item, +@emph{Options/Keep-Viewed-Classes}. @node Inhibit Version, Invert Ancestors, Keep Viewed Classes, Options @section Inhibit Version Screen @vindex br-inhibit-version -After you are familiar with the opening OO-Browser version screen, you may -want to disable its display each time the browser is started. This is done by -setting @var{br-inhibit-version} non-nil, as in the following line that -would go in your personal OO-Browser initialization file: +After you are familiar with the opening OO-Browser version and credits +screen, you may want to disable its display each time the browser is +started. This is done by setting @var{br-inhibit-version} non-nil, as +in the following line that would go in your personal OO-Browser +initialization file: @example @code{(setq br-inhibit-version t)} @@ -1615,8 +1691,8 @@ @cindex support @noindent This option has no effect on the display of the help screen which -follows the version screen. Even with this option set, you may display -the version screen at any time from within a browser listing +is displayed after the version screen. Even with this option set, you +may display the version screen at any time from within a browser listing window by using @{@kbd{C-c #}@} @code{(br-version)}. @@ -1960,7 +2036,7 @@ current environment. The variable @var{c++-cpp-include-dirs} should hold a list of the standard directories searched by your C++ pre-processor. Each directory entry must end with a directory separator. On UNIX -systems, this is the '/' character. +systems, this is the `/' character. @node C++ Settings, , C++ Element Selection, C++ Specifics @subsection C++ Settings @@ -2067,7 +2143,7 @@ Eiffel support has now been updated to Eiffel version 3, to the best of our knowledge. If you find any problems, please report them -to <oo-browser@@hub.ucsb.edu> (this is a public mailing list). +to <oo-browser@@infodock.com> (this is a public mailing list). @menu * Eiffel Listings:: @@ -2132,11 +2208,11 @@ @subsection Eiffel Settings @findex eif-get-parents-from-source -Be sure that the 'inherit' and 'feature' clauses in your classes begin in +Be sure that the `inherit' and `feature' clauses in your classes begin in column 0; otherwise the browser parser will not work properly. If you prefer some other indentation style, you will need to slightly alter @code{(eif-get-parents-from-source)} in @file{br-eif.el}; specifically, -the lines that contain '^inherit' and '^feature'. +the lines that contain `^inherit' and `^feature'. @cindex Eiffel, error parsing @cindex error parsing @@ -2158,6 +2234,10 @@ @section Java Specifics @cindex Java feature listings +@cindex Java attribute +@cindex attribute, Java +Java attribute names are precededed by @code{"= "} in feature listings. + @cindex abstract method @cindex method, abstract @cindex deferred function @@ -2281,7 +2361,7 @@ current environment. The variable @var{objc-cpp-include-dirs} should hold a list of the standard directories searched by your Objective-C pre-processor. Each directory entry must end with a directory -separator. On UNIX systems, this is the '/' character. +separator. On UNIX systems, this is the `/' character. @node Objective-C Settings, Python Specifics, Objective-C Element Selection, Objective-C Specifics @subsection Objective-C Settings @@ -2302,18 +2382,20 @@ @node Python Specifics, Python Module Lookup, Objective-C Settings, Languages @section Python Specifics -The OO-Browser supports browsing Python classes, methods, and -documentation strings for both. The class info key 'i' is used to -display class or method documentation string, if that is available. - -Python methods appear in class feature listings. The method -name is preceded by the @code{"- "} string. - -Global functions are grouped under the imaginary class @code{[functions]} to +@cindex Python doc strings +The OO-Browser supports browsing Python classes and methods. +Documentation strings for classes or methods may be displayed +from a listing buffer with the @{@kbd{i}@} key. + +Python method names are preceded by the @code{"- "} string in listing +buffers. + +@cindex Python functions +Global functions are grouped under the default class @code{[function]} to distinguish them from classes or class methods. -Known bugs: nested classes are not recognized. As browsing is based on -analyzing the source code, run-time modifications are lost. +Nested classes are not recognized by the browser, nor are run-time +modifications to classes. @menu * Python Module Lookup:: Source Code Element Selection @@ -2323,24 +2405,26 @@ @node Python Module Lookup, Python Settings , Python Specifics, Python Specifics @subsection Python Module Lookup -The @file{br-help-ms} file uses a table format to summarize mouse -control within the browser, it may be displayed within the browser via -the @{@kbd{H}@} @code{(br-help-ms)} command. - -Clicking on a module name in an import statement using the Action Key -will open the specified module, if it is found in the search path. +The @file{br-help-ms} file summarizes mouse key operation within the +browser. Use @{@kbd{H}@}, the @code{(br-help-ms)} command, to display +this help when point is within a listing window. + +@cindex Python import statement +An Action Key press on a module name within a Python import statement +will display the source for the module, if it is found within the +current Environment. @node Python Settings, , Python Module Lookup, Python Specifics @subsection Python Settings + @vindex python-import-dirs -@cindex class definition keywords -When a module name in an import statement is clicked using -the Action Key, OO-Browser tries to open the module.py file. By default, -it looks for the module file in the environment directories, and from the path -@code{/usr/local/lib/python}. If you have installed Python libraries -elsewhere, or wish to include other modules in the search path, you will -need to modify the definition of @var{python-import-dirs} in -@file{br-python-ft.el}. +A press of the Action Key on an import statement, tries to display the +module to be imported. First, the module is looked up within the +current Environment directories. If not found, the path +@file{/usr/local/lib/python} is searched. Modify +the variable, @var{python-import-dirs}, to alter the set of paths +searched after the Environment directories.. + @c *************************** @c Appendices @@ -2354,23 +2438,24 @@ @itemize @bullet @item -Support for Eiffel, C++, Objective-C, Smalltalk, Java and Common Lisp -and its Object System (CLOS) is included. Additionally, support for -browsing large amounts of material in Info format by node name (a -popular online documentation format with cross references and -hierarchical structure) is include. All languages provide class -browsing via either a textual or a graphical interface. +Support for C, C++, Common Lisp and its Object System (CLOS), Eiffel, +Java, Objective-C, Python and Smalltalk class browsing is included. +Additionally, support for browsing large amounts of material in Info +format by node name (a popular online documentation format with cross +references and hierarchical structure) is included. All languages +provide class browsing via either a textual or a graphical interface. @item -Method browsing is supported for C++, Objective-C, Eiffel and CLOS. -CLOS supports browsing all elements defined with (def* constructs. -In-source feature browsing is also supported for all of these languages. -One simply selects a feature name to jump to its corresponding source. -Method name overloading in C++ and inherited feature renaming in Eiffel -are fully supported. +Method and typically attribute browsing is supported for all languages +except Smalltalk. CLOS supports browsing all elements defined with +(def* constructs. In-source feature browsing is also supported for all +of these languages. One simply selects a feature name to jump to its +corresponding source. Method name overloading in C++ and inherited +feature renaming in Eiffel are fully supported. @item C code browsing is supported for C++, Objective-C and C source code. + @item Objective-C category and formal protocol browsing are supported. @@ -2378,6 +2463,9 @@ C++ parameterized template classes and methods are supported. @item +Java abstract and native (externally defined) methods are supported. + +@item Building Environments is fast compared to many other tools and browser startup once an Environment has been built is very fast. Response times on workstations are excellent; for example, in one test case, less than @@ -2408,8 +2496,9 @@ found, including those in subdirectories. @item -The browser uses class source code only, hence no compiler is necessary for -proper browser operation. +The OO-Browser uses class source code only, hence no compiler is +necessary for proper browser operation. This allows one to explore +class libraries without the need for additional tools. @item Library (stable) and System (in development) classes may be maintained and @@ -2429,7 +2518,7 @@ Language-specific class information may be shown. Presently this feature is supported only for Eiffel. A listing of class parents, attributes, routines and best guess (highly accurate) list of routine calls may be -displayed. Outputs from the Eiffel 'short' and 'flat' commands may also be +displayed. Outputs from the Eiffel `short' and `flat' commands may also be shown. @item @@ -2437,6 +2526,21 @@ intuitive point and click interface. The OO-Browser is pre-configured for use with the X window system, NEXTSTEP, Sunview or Apollo's DM window system under InfoDock, Emacs V19, XEmacs, Epoch, and Emacs V18. +Online mouse usage help is always one key away. (Don't try that level +of platform independence with Java!) + +@item +X and NEXTSTEP hierarchy display browsers are included. They provide +views of class inheritance structure and lexically included elements, +which allows for quick random access to entire Environments. A click on +a class or element name immediately jumps to it in the editor, providing +rapid, visual browsing. One can pop up several graphical browsers to +gain several views of classes in the same or in multiple environments. +All graphical browsers can communicate with a single textual browser, so +one can quickly display and edit classes from different environments +(even different languages). Multiple inheritance is handled through +repetition of nodes throughout the tree; repeated nodes are followed by +ellipses to indicate multiple inheritance. @item Popup and pulldown command menus are available under InfoDock, Emacs V19 @@ -2577,11 +2681,11 @@ ENV-FILE. Interactively prompt for the Environment language to use or use optional LANG-PREFIX as language indicator. Return the name of the Envir spec file created. Do not build the Environment. Use -'br-env-build' to construct an Environment from its specification. +`br-env-build' to construct an Environment from its specification. @findex br-env-load @item br-env-load @{@kbd{C-c C-l}@} -Load browser Environment or spec from optional ENV-FILE or 'br-env-file'. +Load browser Environment or spec from optional ENV-FILE or `br-env-file'. Non-nil PROMPT means prompt user before building tables. Non-nil NO-BUILD means skip build of Environment entirely. Return t if load is successful, else nil. @@ -2593,7 +2697,7 @@ @findex br-env-save @item br-env-save @{@kbd{C-c C-s}@} Save changed Environment to file given by optional SAVE-FILE or -'br-env-file'. +`br-env-file'. @findex br-env-stats @item br-env-stats @{@kbd{M-e}@} @@ -2883,7 +2987,8 @@ an Environment.@refill @item Feature -An element (method/attribute/component) of a class. +An method, attribute, or other component of a class. Features may be +public or private and in some languages, non-inheritable. @item Formal Protocol See @code{Protocol}.@refill
--- a/man/viper.texi Mon Aug 13 09:13:58 2007 +0200 +++ b/man/viper.texi Mon Aug 13 09:15:11 2007 +0200 @@ -2968,7 +2968,8 @@ jobrien@@hchp.org (John O'Brien), mrb@@Eng.Sun.COM (Martin Buchholz), kwzh@@gnu.ai.mit.edu (Karl Heuer), -sudish@@MindSpring.COM (Sudish Joseph) +sudish@@MindSpring.COM (Sudish Joseph), +paulk@@summit.esg.apertus.com (Paul Keusemann) @end example
--- a/man/w3.texi Mon Aug 13 09:13:58 2007 +0200 +++ b/man/w3.texi Mon Aug 13 09:15:11 2007 +0200 @@ -2,7 +2,7 @@ @c @c Please note that this file uses some constructs not supported by earlier @c versions of TeXinfo. You must be running one of the newer TeXinfo -@c releases (I currently use version 3.9 from ftp://prep.ai.mit.edu/pub/gnu +@c releases (I currently use version 3.9 from ftp://prep.ai.mit.edu/pub/gnu/) @c @c Please do not send in bug reports about not being able to format the @c document with 'makeinfo' or 'tex', just upgrade your installation. @@ -596,7 +596,7 @@ @findex w3-lynx-emulation-minor-mode @vindex w3-mode-hook :: WORK :: Document lynx emulation -@table @key +@table @bullet @item Down arrow Highlight next topic @item Up arrow @@ -1200,15 +1200,75 @@ declaration in the 'STYLE' attribute will override the one in the 'STYLE' element because of cascading rule number 5. -The UA may choose to honor other stylistic HTML attributes, for example -'ALIGN'. If so, these attributes are translated to the corresponding CSS -rules with specificity equal to 1. The rules are assumed to be at the -start of the author style sheet and may be overridden by subsequent -style sheet rules. In a transition phase, this policy will make it -easier for stylistic attributes to coexist with style sheets. +The @sc{ua} may choose to honor other stylistic @sc{html} attributes, +for example 'ALIGN'. If so, these attributes are translated to the +corresponding @sc{css} rules with specificity equal to 1. The rules are +assumed to be at the start of the author style sheet and may be +overridden by subsequent style sheet rules. In a transition phase, this +policy will make it easier for stylistic attributes to coexist with +style sheets. @node Properties, Font Properties, The Cascade, Stylesheets @section Properties + +In the text below, the allowed values for each property are listed +with a syntax like the following: + +@example + Value: N | NW | NE + Value: [ <length> | thick | thin ]@{1,4@} + Value: <uri>? <color> [ / <color> ]? + Value: <uri> || <color> +@end example + +The words between < and > give a type of value. The most common types +are <length>, <percentage>, <url>, <number>and <color> these are +described in the section on [[units]]. The more specialized types +(e.g. <font-family>and <border-style>) are described under the property +where they appear. + +Other words are keywords that must appear literally, without quotes. The +slash (/) and the comma (,) must also appear literally. + +Several things juxtaposed mean that all of them must occur, in the given +order. A bar (|) separates alternatives: one of them must occur. A +double bar (A || B) means that either A or B or both must occur, in any +order. Brackets ([]) are for grouping. Juxtaposition is stronger than +the double bar, and the double bar is stronger than the bar. Thus "a b | +c || d e" is equivalent to "[ a b ] | [ c || [ d e ]]". + +Every type, keyword, or bracketed group may be followed by one of the +following modifiers: + +@itemize @bullet +@item +An asterisk (*) indicates that the preceding type, word or group is +repeated zero or more times. +@item +A plus (+) indicates that the preceding type, word or group is repeated +one or more times. +@item +A question mark (?) indicates that the preceding type, word or group is +optional. +@item +A pair of numbers in curly braces (@{A,B@}) indicates that the preceding +type, word or group is repeated at least A and at most B times. +@end itemize + +Other than the value the following information is also shown. + +@multitable @columnfractions .20 .8 +@item Supported Values: @tab If this is present, it lists the parts of +the specification that Emacs-W3 currently supports. +@item Unsupported Values: @tab If this is present, it represents the +parts of the specifcation that Emacs-W3 does not support. +@item Initial: @tab The default value for the property, unless +explicitly set in a stylesheet. +@item Applies to: @tab What type of elements this property can be attached to. +@item Inherited: @tab Yes or no +@item Percentage values: @tab What a percentage value applies to when given. +@end multitable + @ifinfo @menu * Font Properties:: Selecting fonts, styles, and sizes. @@ -1216,8 +1276,8 @@ * Text Properties:: Alignment, decoration, and more! * Box Properties:: Borders, padding, and margins, oh my! * Classification:: Changing whitespace and display policies. -* Media Selection:: -* Speech Properties:: +* Media Selection:: Conditionalize stylesheets on media-type. +* Speech Properties:: Speech output controlled by stylesheets. @end menu @end ifinfo @@ -1607,7 +1667,7 @@ overlaid on top of the background color. @example - BODY @{ background-image: url(marble.gif) @} + BODY @{ background-image: url(marble.png) @} P @{ background-image: none @} @end example @@ -1671,64 +1731,751 @@ @node word-spacing, letter-spacing, Text Properties, Text Properties @subsubsection word-spacing @multitable @columnfractions .2 .8 +@item Supported Values: @tab normal +@item Unsupported Values: @tab <length> +@item Initial: @tab normal +@item Applies to: @tab all elements +@item Inherited: @tab yes +@item Percentage values: @tab N/A @end multitable +The length unit indicates an addition to the default space between +words. Values can be negative, but there may be implementation-specific +limits. The UA is free to select the exact spacing algorithm. The word +spacing may also be influenced by justification (which is a value of the +'align' property). + +@example + H1 @{ word-spacing: 0.4em @} +@end example + +Here, the word-spacing between each word in 'H1' elements would be +increased by '1em'. + +NOTE: Emacs-W3 cannot currently support this, due to limitations in +Emacs. It may be implemented in the future. + @node letter-spacing, text-decoration, word-spacing, Text Properties @subsubsection letter-spacing @multitable @columnfractions .2 .8 +@item Supported Values: normal +@item Unsupported Values: @tab <length> +@item Initial: @tab normal +@item Applies to: @tab all elements +@item Inherited: @tab yes +@item Percentage values: @tab N/A @end multitable +The length unit indicates an addition to the default space between +characters. Values can be negative, but there may be +implementation-specific limits. The UA is free to select the exact +spacing algorithm. The letter spacing may also be influenced by +justification (which is a value of the 'align' property). + +@example + BLOCKQUOTE @{ letter-spacing: 0.1em @} +@end example + +Here, the letter-spacing between each character in 'BLOCKQUOTE' elements +would be increased by '0.1em'. + +NOTE: Emacs-W3 cannot currently support this, due to limitations in +Emacs. It may be implemented in the future. + @node text-decoration, vertical-align, letter-spacing , Text Properties @subsubsection text-decoration @multitable @columnfractions .2 .8 +@item Supported Values: @tab none | underline | line-through | blink +@item Unsupported Values: @tab overline +@item Initial: @tab none +@item Applies to: @tab all elements +@item Inherited: @tab no, but see clarification below +@item Percentage values: @tab N/A @end multitable +This property describes decorations that are added to the text of an +element. If the element has no text (e.g. the 'IMG' element in HTML) or +is an empty element (e.g. '<EM></EM>'), this property has no effect. A +value of 'blink' causes the text to blink. + +The color(s) required for the text decoration should be derived from the +'color' property value. + +This property is not inherited, but elements should match their +parent. E.g., if an element is underlined, the line should span the +child elements. The color of the underlining will remain the same even +if descendant elements have different 'color' values. + +@example + A:link, A:visited, A:active @{ text-decoration: underline @} +@end example + +The example above would underline the text of all links (i.e., all 'A' +elements with a 'HREF' attribute). + +NOTE: The 'line-through' property is only supported under XEmacs +currently. A patch has been sent to the Emacs maintainers to add +support for this, but it has not made it into the main distribution +yet. + @node vertical-align, text-transform, text-decoration, Text Properties @subsubsection vertical-align -@multitable @columnfractions .2 .8 -@end multitable +This is currently unsupported in Emacs-W3. @node text-transform, text-align, vertical-align, Text Properties @subsubsection text-transform @multitable @columnfractions .2 .8 +@item Supported Values: @tab none +@item Unsupported Values: @tab capitalize | uppercase | lowercase +@item Initial: @tab none +@item Applies to: @tab all elements +@item Inherited: @tab yes +@item Percentage values: @tab N/A @end multitable +@table @b +@item 'capitalize' +Uppercases the first character of each word. +@item 'uppercase' +Uppercases all letters of the element. +@item 'lowercase' +Lowercases all letters of the element. +@item 'none' +Neutralizes inherited value. +@end table + +The actual transformation in each case is human language dependent. + +@example + H1 @{ text-transform: uppercase @} +@end example + +The example above would put 'H1' elements in uppercase text. + +NOTE: This capability was in the previous version of Emacs-W3, but has +not been reimplemented in the new display code yet. Please feel free to +send me patches. + @node text-align, text-indent, text-transform, Text Properties @subsubsection text-align @multitable @columnfractions .2 .8 +@item Value: @tab left | right | center | justify +@item Initial: @tab User specific +@item Applies to: @tab block-level elements +@item Inherited: @tab yes +@item Percentage values: @tab N/A @end multitable +This property describes how text is aligned within the element. The +actual justification algorithm used is UA and human language dependent. + +Example: +@example + DIV.center @{ text-align: center @} +@end example + +Since 'text-align' inherits, all block-level elements inside the 'DIV' +element with 'CLASS=center' will be centered. Note that alignments are +relative to the width of the element, not the canvas. + @node text-indent, line-height, text-align, Text Properties -@subsubsection -@multitable @columnfractions .2 .8 -@end multitable +@subsubsection text-indent +Not currently implemented in Emacs-W3. @node line-height, Box Properties, text-indent, Text Properties -@subsubsection -@multitable @columnfractions .2 .8 -@end multitable +@subsubsection line-height +Not currently implemented in Emacs-W3. @node Box Properties, Classification, line-height, Properties @subsection Box Properties @multitable @columnfractions .2 .8 @end multitable -@node Classification, Media Selection, Box Properties, Properties +@node Classification, display, Box Properties, Properties @subsection Classification +These properties classify elements into categories more than they set +specific visual parameters. + +The list-style properties describe how list items (i.e. elements with a +'display' value of 'list-item') are formatted. The list-style properties +can be set on any element, and it will inherit normally down the +tree. However, they will only be have effect on elements with a +'display' value of 'list-item'. In HTML this is typically the case for +the 'LI' element. + +@ifinfo +@menu +* display:: +* white-space:: +* list-style-type:: +* list-style-image:: +* list-style-position:: +* list-style:: +@end menu +@end ifinfo + +@node display, white-space, Classification, Classification +@subsubsection display +@multitable @columnfractions .2 .8 +@item Value: @tab block | inline | list-item | none +@item Extensions: @tab line +@item Initial: @tab inline +@item Applies to: @tab all elements +@item Inherited: @tab no +@item Percentage values: @tab N/A +@end multitable + +This property describes how/if an element is displayed on the canvas +(which may be on a printed page, a computer display etc.). + +An element with a 'display' value of 'block' opens whitespace suitable +for a paragraph break. Typically, elements like 'H1' and 'P' are of +type 'block'. A value of 'list-item' is similar to 'block' except that a +list-item marker is added. In HTML, 'LI' will typically have this value. + +An element with a 'display' value of 'inline' results in a new inline +box on the same line as the previous content. + +A value of 'none' turns off the display of the element, including +children elements and the surrounding box. + +@example + P @{ display: block @} + EM @{ display: inline @} + LI @{ display: list-item @} + IMG @{ display: none @} +@end example + +The last rule turns off the display of images. + +A value of 'line' results in a single line break. Emacs-W3 needs this +extension to be able to fully specify the behaviour of @sc{br} and +@sc{hr} elements within a stylesheet. + +NOTE: Emacs-W3 defaults to using 'inline' for this property, which is a +slight deviation from the specification. + +@node white-space, list-style-type, display, Classification +@subsubsection white-space +@multitable @columnfractions .2 .8 +@item Value: @tab normal | pre | nowrap +@item Initial: @tab normal +@item Applies to: @tab block-level elements +@item Inherited: @tab yes +@item Percentage values: @tab N/A +@end multitable + +This property declares how whitespace inside the element is handled: the +'normal' way (where whitespace is collapsed), as 'pre' (which behaves +like the 'PRE' element in HTML) or as 'nowrap' (where wrapping is done +only through BR elements): + +@example + PRE @{ white-space: pre @} + P @{ white-space: normal @} +@end example + +@node list-style-type, list-style-image, white-space, Classification +@subsubsection list-style-type +@multitable @columnfractions .2 .8 +@item Value: @tab disc | circle | square | decimal | lower-roman | upper-roman | lower-alpha | upper-alpha | none +@item Initial: @tab disc +@item Applies to: @tab elements with 'display' value 'list-item' +@item Inherited: @tab yes +@item Percentage values: @tab N/A +@end multitable + +This property is used to determine the appearance of the list-item +marker if 'list-style-image' is 'none' or if the image pointed to by the +URL cannot be displayed. + +Fo example: +@example + OL @{ list-style-type: decimal @} /* 1 2 3 4 5 etc. */ + OL @{ list-style-type: lower-alpha @} /* a b c d e etc. */ + OL @{ list-style-type: lower-roman @} /* i ii iii iv v etc. */ +@end example + +@node list-style-image, list-style-position, list-style-type, Classification +@subsubsection list-style-image +@multitable @columnfractions .2 .8 +@item Value: @tab <url> | none +@item Initial: @tab none +@item Applies to: @tab elements with 'display' value 'list-item' +@item Inherited: @tab yes +@item Percentage values: @tab N/A +@end multitable + +This property sets the image that will be used as the list-item +marker. When the image is available it will replace the marker set with +the 'list-style-type' marker. + +NOTE: This is currently unimplemented in Emacs-W3. + +@example + UL @{ list-style-image: url(http://png.com/ellipse.png) @} +@end example + +@node list-style-position, list-style, list-style-image, Classification +@subsubsection list-style-position +@multitable @columnfractions .2 .8 +@item Supported Values: @tab outside +@item Unsupported Values: @tab inside +@item Initial: @tab outside +@item Applies to: @tab elements with 'display' value 'list-item' +@item Inherited: @tab yes +@item Percentage values: @tab N/A +@end multitable + +The value of 'list-style-position' determines how the list-item marker +is drawn with regard to the content. For a formatting example see +section 4.1.3. + +@node list-style, Media Selection, list-style-position, Classification +@subsubsection list-style +@multitable @columnfractions .2 .8 +@item Value: <keyword> || <position> || <url> +@item Initial: @tab not defined for shorthand properties +@item Applies to: @tab elements with 'display' value 'list-item' +@item Inherited: @tab yes +@item Percentage values: @tab N/A +@end multitable + +The 'list-style' property is a shorthand notation for setting the three +properties 'list-style-type', 'list-style-image' and +'list-style-position' at the same place in the style sheet. + +@example + UL @{ list-style: upper-roman inside @} + UL UL @{ list-style: circle outside @} + LI.square @{ list-style: square @} +@end example + +Setting 'list-style' directly on 'LI' elements can have unexpected +results. Consider: + +@example + <STYLE TYPE="text/css"> + OL.alpha LI @{ list-style: lower-alpha @} + UL LI @{ list-style: disc @} + </STYLE> + <BODY> + <OL CLASS=alpha> + <LI>level 1 + <UL> + <LI>level 2 + </UL> + </OL> + </BODY> +@end example + +Since the specificity (as defined in the cascading order) is higher for +the first rule in the style sheet in the example above, it will override +the second rule on all 'LI' elements and only 'lower-alpha' list styles +will be used. It is therefore recommended to set 'list-style' only on +the list type elements: + +@example + OL.alpha @{ list-style: lower-alpha @} + UL @{ list-style: disc @} +@end example + +In the above example, inheritance will transfer the 'list-style' values +from 'OL' and 'UL' elements to 'LI' elements. + +A URL value can be combined with any other value: + +@example + UL @{ list-style: url(http://png.com/ellipse.png) disc @} +@end example + +In the example above, the 'disc' will be used when the image is +unavailable. + +@node Media Selection, Speech Properties, list-style, Properties +@subsection Media Selection +To specify that a stylesheet declaration should only apply when using a +certain media type (ie: different font families preferred when printing +versus on-screen presentation), the declarations should be wrapped in +the proposed @b{@@media} directive. + +The @@media directive takes two arguments, the media type, and a block +of style declarations. + +@example + @@media print @{ + BODY @{ font-size: 10pt @} + H1 @{ font-size: 14pt @} + @} +@end example +The '@@media' construct also allows to put include style sheet rules +for various media in the same style sheet: + +@example + @@media print @{ + BODY @{ font-size: 10pt @} + @} + @@media screen @{ + BODY @{ font-size: 12pt @} + @} +@end example + +Currently, the following media types are defined. +@table @b +@item Print +Output for paged opaque material, and for documents viewed on screen in +print preview mode. +@item Screen +A continuous presentation for computer screens. +@item Projector +Paged presentation for projected presentations. +@item Braille +For braille tactile feedback devices. +@item Speech +Aural presentation. +@item Emacs +The stylesheet will only be applied if the user is running in Emacs 19. +@item XEmacs +The stylesheet will only be applied if the user is running in XEmacs 19. +@item All +The default value, the style sheet applies to all output devices +@end table + +@node Speech Properties, volume, Media Selection, Properties +@subsection Speech Properties +Those of us who are sighted are accustomed to visual presentation of +@sc{html} documents, frequently on a bitmapped display. This is not the +only possible presentation method, however. Aural presentation, using a +combination of speech synthesis and 'audio icons', provides an +alternative presentation. This form of presentation is in current use by +the blind and print-impaired communities. + +Often such aural presentation occurs by converting the document to plain +text and feeding this to a 'screen reader' -- software or hardware that +simply reads all the characters on the screen. This results in less +effective presentation than would be the case if the document structure +were retained. + +There are other large markets for aural presentation, including in-car +and home entertainment use; aurual or mixed aural/visual presentation is +thus likely to increase in importance over the next few years. Realizing +that that the aural rendering is essentially independent of the visual +rendering: + +@itemize @bullet +@item +Allows orthogonal aural and visual views. +@item +Allows browsers to optionally implement both aural and visual views to +produce truly multimodal documents. +@end itemize + +@ifinfo +@menu +* volume:: +* pause-before:: +* pause-after:: +* pause:: +* cue-before:: +* cue-after:: +* cue:: +* play-during:: +* speed:: +* voice-family:: +* pitch:: +* pitch-range:: +* stress:: +* richness:: +* speak-punctuation:: +* speak-date:: +* speak-numeral:: +* speak-time:: +@end menu +@end ifinfo + +@node volume, pause-before, Speech Properties, Speech Properties +@subsubsection volume +@multitable @columnfractions .2 .8 +@item Value: @tab <percentage> | mute | x-soft | soft | medium | loud | x-loud +@item Initial: @tab medium +@item Applies to: @tab all elements +@item Inherited: @tab yes +@item Percentage values: @tab relative to user-specified mapping +@end multitable + +The legal range of percentage values is 0% to 100%. There is a fixed +mapping between keyword values and percentages: + +@itemize @bullet +@item +'x-soft' = '0%' +@item +'soft' = '25%' +@item +'medium' = '50%' +@item +'loud' = '75%' +@item +'x-loud' = '100%' +@end itemize + +Volume refers to the median volume of the waveform. In other words, a +highly inflected voice at a volume of 50 might peak well above +that. Note that '0%' does not mean the same as "mute". 0% represents the +minimum audible volume level and 100% corresponds to the maximum +comfortable level. The UA should allow the values corresponding to 0% +and 100% to be set by the user. Suitable values depend on the equipment +in use (speakers, headphones), the environment (in car, home theater, +library) and personal preferences. Some examples: + +@itemize @bullet +@item +A browser for in-car use has a setting for when there is lots of +background noise . 0% would map to a fairly high level and 100% to a +quite high level. The overall values are likely to be human adjustable +for comfort, for example with a physical volume control: what this +proposal does is adjust the dynamic range. +@item +Another speech browser is being used in the home, late at night, (don't +annoy the neighbors) or in a shared study room. 0% is set to very quiet +and 100% to a fairly quiet level, too. As with the first example, there +is a low slope; the dynamic range is reduced. The actual volumes are low +here, wheras they were high in the first example. +@item +In a quiet and isolated house, an expensive hifi home theatre setup. 0% +is set fairly low and 100% to quite high; there is wide dynamic range. +@end itemize + +The same authors stylesheet could be used in all cases, simply by +mapping the 0 and 100 points suitably at the client side. + +@node pause-before, pause-after, volume, Speech Properties +@subsubsection pause-before +@multitable @columnfractions .2 .8 +@item Value: @tab <time> | <percentage> +@item Initial: @tab UA specific +@item Applies to: @tab all elements +@item Inherited: @tab no +@item Percentage values: @tab speed +@end multitable + +This property specifies the pause before elements. It may be given in an +absolute units (seconds, milliseconds) or as a relative value in which +case it is relative to the reciprocal of the 'speed' property: if speed +is 120 words per minute (ie a word takes half a second -- 500 +milliseconds) then a pause-before of 100% means a pause of 500 ms and a +pause-before of 20% means 100ms. + +Using relative units gives more robust stylesheets in the face of large +changes in speed. + +@node pause-after, pause, pause-before, Speech Properties +@subsubsection pause-after +@multitable @columnfractions .2 .8 +@item Value: @tab <time> | <percentage> +@item Applies to: @tab all elements +@item Inherited: @tab no +@item Percentage values: @tab speed +@end multitable + +This property specifies the pause after elements. Values are specified +the same way as 'pause-before'. + +@node pause, cue-before, pause-after, Speech Properties +@subsubsection pause +@multitable @columnfractions .2 .8 +@item Value: @tab [<time> | <percentage> ]@{1,2@}; +@item Applies to: @tab all elements +@item Inherited: @tab no +@item Percentage values: @tab speed +@end multitable + +The 'pause' property is a shorthand for setting 'pause-before' and +'pause-after'. The first value is pause-before and the second is +pause-after. If only one value is given, it applies to both properties. + +Examples: + +@example + H1 @{ pause: 20ms @} /* pause-before: 20ms; pause-after: 20ms */ + H2 @{ pause: 30ms 40ms @} /* pause-before: 30ms; pause-after: 40ms */ + H3 @{ pause-after: 10ms @} /* pause-before: ?; pause-after: 10ms */ +@end example + +@node cue-before, cue-after, pause, Speech Properties +@subsubsection cue-before +@multitable @columnfractions .2 .8 +@item Value: @tab <url> | none +@item Initial: @tab none +@item Applies to: @tab all elements +@item Inherited: @tab no +@end multitable +Auditory icons are another way to distinguish semantic elements. Sounds +may be played before, and/or after the element to delimit it. The same +sound can be used both before and after, using the cue property. + +Examples: + +@example + A @{ cue-before: url(bell.aiff); cue-after: url(dong.wav) @} + H1 @{ cue-before: url(pop.au); cue-after: url(pop.au) @} + H1 @{ cue: url(pop.au) @} /* same as previous */ +@end example + +@node cue-after, cue, cue-before, Speech Properties +@subsubsection cue-after +@xref{cue-before} + +@node cue, play-during, cue-after, Speech Properties +@subsubsection cue +@xref{cue-before} + +@node play-during, speed, cue, Speech Properties +@subsubsection cue-during +@multitable @columnfractions .2 .8 +@item Value: @tab <url> | mix | none +@item Initial: @tab mix +@item Applies to: @tab all elements +@item Inherited: @tab no +@end multitable +Similar to the cue-before and cue-after properties, this indicates sound +to be played during an element as a background (ie the sound is mixed in +with the speech). + +Examples: + +@example + BLOCKQUOTE.sad @{ cue-during: url(violins.aiff) @} +@end example + +@node speed, voice-family, play-during, Speech Properties +@subsubsection speed +@multitable @columnfractions .2 .8 +@item Value: @tab <words-per-minute> | x-slow | slow | medium | fast | x-fast | faster | slower +@item Initial: @tab medium +@item Applies to: @tab all elements +@item Inherited: @tab yes +@end multitable + +Specifies the speaking rate. Note that both absolute and relative +keyword values are allowed (compare with @ref{font-weight}). + +@node voice-family, pitch, speed, Speech Properties +@subsubsection voice-family +@multitable @columnfractions .2 .8 +@item Value: @tab [[<specific-voice> | <generic-voice>],]* [<specific-voice> | <generic-voice>] +@item Initial: @tab device-specific +@item Applies to: @tab all elements +@item Inherited: @tab yes +@end multitable + +The value is a prioritized list of voice family names. Generic families +are male, female, and child. + +Examples of specific voice families are: comedian, paul, lisa + +Examples + +@example + H1 @{ voice-family: announcer, male @} + P.part.romeo @{ voice-family: romeo, male @} + P.part.juliet @{ voice-family: juliet, female @} +@end example + +@node pitch, pitch-range, voice-family, Speech Properties +@subsubsection pitch @multitable @columnfractions .2 .8 @end multitable -@node Media Selection, Speech Properties, Classification, Properties -@subsection Media Selection +@node pitch-range, stress, pitch, Speech Properties +@subsubsection pitch-range @multitable @columnfractions .2 .8 @end multitable -@node Speech Properties, Units, Media Selection, Properties -@subsection Speech Properties +@node stress, richness, pitch-range, Speech Properties +@subsubsection stress +@multitable @columnfractions .2 .8 +@item Value: @tab <percentage> +@item Initial: @tab medium +@item Applies to: @tab all elements +@item Inherited: @tab yes +@end multitable + +Specifies the level of stress (assertiveness or emphasis) of the +speaking voice. English is a stressed language, and different parts of a +sentence are assigned primary, secondary or tertiary stress. The value +of property 'stress' controls the amount of inflection that results from +these stress markers. + +Increasing the value of this property results in the speech being more +strongly inflected. It is in a sense dual to property 'pitch-range' and +is provided to allow developers to exploit higher-end auditory displays. + +@node richness, speak-punctuation, stress, Speech Properties +@subsubsection richness +@multitable @columnfractions .2 .8 +@item Value: @tab <percentage> +@item Initial: @tab medium (50%) +@item Applies to: @tab all elements +@item Inherited: @tab yes +@end multitable + +Specifies the richness (brightness) of the speaking voice. Different +speech devices may require the setting of one or more device-specific +parameters to achieve this effect. + +The effect of increasing richness is to produce a voice that carries -- +reducing richness produces a soft, mellifluous voice. + +@node speak-punctuation, speak-date, richness, Speech Properties +@subsubsection speak-punctuation @multitable @columnfractions .2 .8 +@item Value: @tab code | none +@item Initial: @tab none +@item Applies to: @tab all elements +@item Inherited: @tab yes @end multitable -@node Units, Length Units, Speech Properties, Stylesheets +'code' indicates that punctuation such as semicolons, braces, and so on +are to be spoken literally. The default value of 'none' means that +punctuation is not spoken but instead is rendered naturally as various +pauses. + +@node speak-date, speak-numeral, speak-punctuation, Speech Properties +@subsubsection speak-date +@multitable @columnfractions .2 .8 +@item Value: @tab myd | dmy | ymd | none +@item Initial: @tab none +@item Applies to: @tab all elements +@item Inherited: @tab no +@end multitable + +This is a hint that the element contains a date and also how that date +should be spoken. month-day-year is common in the USA, while +day-month-year is common in Europe and year-month-day is also used. + +This should really be an HTML tag not a stylesheet property, since it +gives semantic information about the content. + +@node speak-numeral, speak-time, speak-date, Speech Properties +@subsubsection speak-numeral +@multitable @columnfractions .2 .8 +@item Value: @tab digits | continous +@item Initial: @tab none +@item Applies to: @tab all elements +@item Inherited: @tab yes +@end multitable + +@node speak-time, Units, speak-numeral, Speech Properties +@subsubsection speak-time +@multitable @columnfractions .2 .8 +@item Value: @tab 24 | 12 | none +@item Initial: @tab none +@item Applies to: @tab all elements +@item Inherited: @tab yes +@end multitable + +@node Units, Length Units, speak-time, Stylesheets @section Units @ifinfo @@ -1756,22 +2503,44 @@ @node Angle Units, Time Units, URLs, Units @subsection Angle Units +These are the legal angle units: +@itemize @bullet +@item +deg: degrees +@item +grad +@item +rad: radians +@end itemize @node Time Units, Supported URLs, Angle Units, Units @subsection Time Units +These are the legal time units: + +@itemize @bullet +@item +ms: milliseconds +@item +s: seconds +@end itemize @node Supported URLs, MIME Support, Time Units, Top @chapter Supported URLs ::WORK:: List supported URL types, specific RFCs, etc. +@ifinfo +@menu +@end menu +@end ifinfo + @node MIME Support, Adding MIME types based on file extensions, Supported URLs, Top @chapter MIME Support @sc{mime} is an emerging standard for multimedia mail. It offers a very flexible typing mechanism. The type of a file or message is specified in two parts, separated by a '/'. The first part is the general category of the data (text, application, image, etc.). The second part -is the specific type of data (postscript, gif, jpeg, etc.). So +is the specific type of data (postscript, png, jpeg, etc.). So @samp{text/html} specifies an @sc{html} document, whereas @samp{image/x-xwindowdump} specifies an image of an Xwindow taken with the @file{xwd} program. @@ -1780,15 +2549,15 @@ This typing allows much more flexibility in naming files. @sc{http}/1.0 servers can now send back content-type headers in response to a request, and not have the client second-guess it based on file extensions. @sc{html} -files can now be named @file{something.gif} (not a great idea, but +files can now be named @file{something.png} (not a great idea, but possible). @ifinfo @menu * Adding MIME types based on file extensions:: How to map file extensions onto MIME - types (e.g., @samp{.gif -> - image/gif)}. + types (e.g., @samp{.png -> + image/png)}. * Specifying Viewers:: How to specify external and internal viewers for files that Emacs-W3 cannot handle natively. @end menu @@ -1857,7 +2626,7 @@ changes that make the document look unrecognizable). Files may be passed to external programs or Emacs Lisp functions to be viewed. -Not all files can be viewed accurately from within an Emacs session (GIF +Not all files can be viewed accurately from within an Emacs session (PNG files for example, or audio files). For this reason, the user can specify file "viewers" based on MIME content-types. This is done with a standard mailcap file. @xref{Mailcap Files} @@ -1865,7 +2634,7 @@ @findex mm-add-mailcap-entry As an alternative, the function @code{mm-add-mailcap-entry} can also be used from an appropriate hook.@xref{Hooks} This functions takes three -arguments, the major type ("@i{image}"), the minor type ("@i{gif}"), and +arguments, the major type ("@i{image}"), the minor type ("@i{png}"), and an assoc list of information about the viewer. Please see the @sc{url} documentation for more specific information on what this assoc list should look like.
--- a/man/widget.texi Mon Aug 13 09:13:58 2007 +0200 +++ b/man/widget.texi Mon Aug 13 09:15:11 2007 +0200 @@ -1,6 +1,6 @@ \input texinfo.tex -@c $Id: widget.texi,v 1.2 1997/02/15 22:21:57 steve Exp $ +@c $Id: widget.texi,v 1.3 1997/02/24 01:14:40 steve Exp $ @c %**start of header @setfilename widget @@ -15,7 +15,7 @@ @comment node-name, next, previous, up @top The Emacs Widget Library -Version: 1.40 +Version: 1.44 @menu * Introduction::
--- a/man/xemacs-faq.texi Mon Aug 13 09:13:58 2007 +0200 +++ b/man/xemacs-faq.texi Mon Aug 13 09:15:11 2007 +0200 @@ -481,11 +481,11 @@ @section What is the status of XEmacs v20? XEmacs v20 is the version of XEmacs that includes MULE (Asian-language) -support. It's currently in late beta and the tentative release date for -20.0 is for mid February. When compiled without MULE support 20.0 is -currently very similar to 19.15 (except for some changes to the -byte-code format, some new primitive types including @code{char}, -@code{char-table}, and @code{range-table}) and equally stable. +support. XEmacs 20.0 was released in February 1997. When compiled +without MULE support 20.0 is currently very similar to 19.15 (except for +some changes to the byte-code format, some new primitive types including +@code{char}, @code{char-table}, and @code{range-table}) and equally +stable. @node Q1.3.2, Q1.3.3, Q1.3.1, Introduction @section What is the status of Asian-language support, aka MULE? @@ -4860,10 +4860,13 @@ @section What is new in 19.15? The biggest changes in 19.15 include integration of TM (a MIME package -for VM and Gnus), beautifying the outlook, and bugfixing. - -XEmacs 20.0 is now very close (currently a separate branch of XEmacs -that includes full Asian-language aka MULE support). This work is being +for VM and Gnus), EFS (the next generation of ange-ftp) and AUC TeX (the +Emacs subsystem that includes a major mode for editing TeX and LaTeX, +and a lot of other stuff). Many bugs from 19.14 have been fixed for +this release. + +XEmacs 20.0 (which includes full Asian-language support aka MULE) has +been released, but is still considered unstable. This work is being supported by Sun Microsystems. @node Q6.0.3, , Q6.0.1, Current Events @@ -4884,7 +4887,7 @@ form for the truly interested. XEmacs 19.15 is the end of the road for version 19 XEmacs. The next -release after 19.15 will be XEmacs 20.0. +release after 19.15 will be XEmacs 20.1. @item As of December 1996, Steve Baur <steve@@altair.xemacs.org> has become
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nt/Emacs.ad.h Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,83 @@ +(String) "Emacs.modeline*attributeForeground: Black", +(String) "Emacs.modeline*attributeBackground: Gray75", +(String) "Emacs.text-cursor*attributeBackground: Red3", +(String) "*menubar*Foreground: Gray30", +(String) "*menubar*Background: Gray75", +(String) "*menubar*buttonForeground: Blue", +(String) "*XlwMenu*selectColor: ForestGreen", +(String) "*XmToggleButton*selectColor: ForestGreen", +(String) "*popup*Foreground: Black", +(String) "*popup*Background: Gray75", +(String) "*dialog*Foreground: Black", +(String) "*dialog*Background: #A5C0C1", +(String) "*dialog*XmTextField*Background: WhiteSmoke", +(String) "*dialog*XmText*Background: WhiteSmoke", +(String) "*dialog*XmList*Background: WhiteSmoke", +(String) "*dialog*Command*Background: WhiteSmoke", +(String) "*XlwScrollBar*Foreground: Gray30", +(String) "*XlwScrollBar*Background: Gray75", +(String) "*XmScrollBar*Foreground: Gray30", +(String) "*XmScrollBar*Background: Gray75", +(String) "*topToolBarShadowColor: Gray90", +(String) "*bottomToolBarShadowColor: Gray40", +(String) "*backgroundToolBarColor: Gray75", +(String) "*toolBarShadowThickness: 2", +(String) "*menubar*Font: -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-*", +(String) "*popup*Font: -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-*", +(String) "*XmDialogShell*FontList: -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-*", +(String) "*XmTextField*FontList: -*-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-*", +(String) "*XmText*FontList: -*-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-*", +(String) "*XmList*FontList: -*-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-*", +(String) "*Dialog*Font: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-*", +(String) "*dialog*button1.accelerators:#override\ +<KeyPress>Return: ArmAndActivate()\\n\ +<KeyPress>KP_Enter: ArmAndActivate()\\n\ +Ctrl<KeyPress>m: ArmAndActivate()\\n", +(String) "*XmTextField*translations: #override\\n\ + !<Key>osfBackSpace: delete-previous-character()\\n\ + !<Key>osfDelete: delete-previous-character()\\n\ + !Ctrl<Key>h: delete-previous-character()\\n\ + !Ctrl<Key>d: delete-next-character()\\n\ + !Meta<Key>osfDelete: delete-previous-word()\\n\ + !Meta<Key>osfBackSpace: delete-previous-word()\\n\ + !Meta<Key>d: delete-next-word()\\n\ + !Ctrl<Key>k: delete-to-end-of-line()\\n\ + !Ctrl<Key>g: process-cancel()\\n\ + !Ctrl<Key>b: backward-character()\\n\ + !<Key>osfLeft: backward-character()\\n\ + !Ctrl<Key>f: forward-character()\\n\ + !<Key>osfRight: forward-character()\\n\ + !Meta<Key>b: backward-word()\\n\ + !Meta<Key>osfLeft: backward-word()\\n\ + !Meta<Key>f: forward-word()\\n\ + !Meta<Key>osfRight: forward-word()\\n\ + !Ctrl<Key>e: end-of-line()\\n\ + !Ctrl<Key>a: beginning-of-line()\\n\ + !Ctrl<Key>w: cut-clipboard()\\n\ + !Meta<Key>w: copy-clipboard()\\n\ + <Btn2Up>: copy-primary()\\n", +(String) "*dialog*XmPushButton*translations:#override\\n\ + <Btn1Down>: Arm()\\n\ + <Btn1Down>,<Btn1Up>: Activate()\ + Disarm()\\n\ + <Btn1Down>(2+): MultiArm()\\n\ + <Btn1Up>(2+): MultiActivate()\\n\ + <Btn1Up>: Activate()\ + Disarm()\\n\ + <Key>osfSelect: ArmAndActivate()\\n\ + <Key>osfActivate: ArmAndActivate()\\n\ + <Key>osfHelp: Help()\\n\ + ~Shift ~Meta ~Alt <Key>Return: ArmAndActivate()\\n\ + <EnterWindow>: Enter()\\n\ + <LeaveWindow>: Leave()\\n", +(String) "*ximStyles: XIMPreeditPosition|XIMStatusArea\ + XIMPreeditPosition|XIMStatusNothing\ + XIMPreeditPosition|XIMStatusNone\ + XIMPreeditNothing|XIMStatusArea\ + XIMPreeditNothing|XIMStatusNothing\ + XIMPreeditNothing|XIMStatusNone\ + XIMPreeditNone|XIMStatusArea\ + XIMPreeditNone|XIMStatusNothing\ + XIMPreeditNone|XIMStatusNone", +(String) "*EmacsFrame.ximForeground: black", +(String) "*EmacsFrame.ximBackground: white",
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nt/README Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,33 @@ + Building and Installing Xemacs + on Windows NT + +You need a compiler package to build and install Emacs on NT or Win95. + +This is an extremely early release. Any help I can provide I will do so. + +1. You need to extract the nt subdirectory from the nt.tar file. +2. You need to compile the lcc c preprocessor in the nt/cpp directory. +3. Get and compile MIT X11R6.1. Well I use 6.1, later versions will probably + work as well. +4. Edit the xemacs.mak Makefile and ensure variables point to the correct place. +5. Create the obj subdirectory. +6. copy the files from nt/src into src/. +7. patch the original source files with the src.diffs file. +8. Run nmake using xemacs.mak +9. Manually run the resulting temacs executable to create xemacs. + + +Problems: +- Haven't got rid of some symbol problems which may be causing problems. +- Still seems to use fork, which fails without /force option on link. I am + trying to work out where it should be removed. +- Executable crashes when running it. + +Any problems/questions, mail me: + +David Hobley +david_hobley@optusvision.com.au -- work email. + +I am in the process of changing ISP's at the moment for my home account, +so your best bet for a fastish response is my work account. +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nt/README.src Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,2 @@ +This directory contains new files required to compile xemacs. Copy them into +the src and src/s and src/m directories.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nt/ad2c.sed Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,22 @@ +/^!/d +/^$/d +s/\\/\\\\/g +s/\\$//g +s/"/\\"/g +s/^/(String) "/ +: test +/\\$/b slash +s/$/",/ +p +d +: slash +n +/^!/d +/^$/d +s/"/\\"/g +s/\\\\/\\/g +s/\\n/\\\\n/g +s/\\t/\\\\t/g +s/\\f/\\\\f/g +s/\\b/\\\\b/g +b test
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nt/config.h Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,664 @@ +/* XEmacs site configuration template file. -*- C -*- + Copyright (C) 1986, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Synched up with: FSF 19.30 (more or less). */ + +/* No code in XEmacs #includes config.h twice, but some of the code + intended to work with other packages as well (like gmalloc.c) + think they can include it as many times as they like. */ +#ifndef _CONFIG_H_ +#define _CONFIG_H_ + +/* #### This will be removed in 19.15. */ +#define LOSING_BYTECODE + +#define NTHEAP_PROBE_BASE 1 + +/* These are all defined in the top-level Makefile by configure. + They're here only for reference. */ + +/* Define LISP_FLOAT_TYPE if you want XEmacs to support floating-point + numbers. */ +#undef LISP_FLOAT_TYPE + +/* Define GNU_MALLOC if you want to use the *new* GNU memory allocator. */ +#define GNU_MALLOC + +/* Define USE_SYSTEM_MALLOC if you forcing the use of it. */ +#undef USE_SYSTEM_MALLOC + +/* Define HAVE_TTY if you want TTY support compiled in. */ +#undef HAVE_TTY + +/* Define HAVE_X_WINDOWS if you want to use the X window system. */ +#define HAVE_X_WINDOWS + +/* Define HAVE_NEXTSTEP if you want to use the NeXTstep window system. */ +#undef HAVE_NEXTSTEP + +/* Define HAVE_WINDOW_SYSTEM if any windowing system is available. */ +#if defined (HAVE_X_WINDOWS) || defined (HAVE_NEXTSTEP) +#define HAVE_WINDOW_SYSTEM +#endif + +/* Define HAVE_UNIXOID_EVENT_LOOP if we use select() to wait for events. */ +#if defined (HAVE_X_WINDOWS) || defined (HAVE_TTY) +#define HAVE_UNIXOID_EVENT_LOOP +#endif + +/* Define this if you're using XFree386. */ +#undef HAVE_XFREE386 + +#undef THIS_IS_X11R4 +#undef THIS_IS_X11R5 +#define THIS_IS_X11R6 + +/* Define USER_FULL_NAME to return a string + that is the user's full name. + It can assume that the variable `pw' + points to the password file entry for this user. + + At some sites, the pw_gecos field contains + the user's full name. If neither this nor any other + field contains the right thing, use pw_name, + giving the user's login name, since that is better than nothing. */ +#if 0 +#define USER_FULL_NAME pw->pw_gecos +#endif +#define USER_FULL_NAME unknown + +/* Define AMPERSAND_FULL_NAME if you use the convention + that & in the full name stands for the login id. */ +#undef AMPERSAND_FULL_NAME + +/* Some things figured out by the configure script, grouped as they are in + configure.in. */ +#undef HAVE_MACH_MACH_H +#undef HAVE_SYS_STROPTS_H +#undef HAVE_SYS_TIMEB_H +#undef HAVE_UNISTD_H +#undef HAVE_UTIME_H +#undef HAVE_SYS_WAIT_H +#undef HAVE_LIBGEN_H +#undef HAVE_LINUX_VERSION_H +#undef WORDS_BIGENDIAN +#undef TIME_WITH_SYS_TIME + +#define HAVE_SYS_TIME_H +#define HAVE_LOCALE_H +#define HAVE_X11_LOCALE_H +#define STDC_HEADERS + +#define HAVE_LONG_FILE_NAMES + +#ifdef HAVE_LONG_FILE_NAMES +#define CLASH_DETECTION +#endif + +#undef HAVE_LIBDNET +#undef HAVE_LIBRESOLV + +/* Define if `sys_siglist' is declared by <signal.h>. */ +#undef SYS_SIGLIST_DECLARED + +/* Define if `struct utimbuf' is declared by <utime.h>. */ +#undef HAVE_STRUCT_UTIMBUF + +/* Define if `struct timeval' is declared by <sys/time.h>. */ +#define HAVE_TIMEVAL + + +#undef TM_IN_SYS_TIME +#undef HAVE_TM_ZONE +#undef HAVE_TZNAME + +/* Define if netdb.h declares h_errno. */ +#undef HAVE_H_ERRNO + +/* Define if localtime caches TZ */ +#undef LOCALTIME_CACHE + +/* Define if gettimeofday can't accept two arguments */ +#ifdef HAVE_X_WINDOWS +#define GETTIMEOFDAY_ONE_ARGUMENT +#else +#undef GETTIMEOFDAY_ONE_ARGUMENT +#endif + +/* Define in keyword `inline' exists. */ +#undef HAVE_INLINE + +#undef HAVE_ALLOCA_H +#undef HAVE_VFORK_H +#undef vfork + +#undef HAVE_MMAP +#undef HAVE_STRCOLL + +#undef SIZEOF_SHORT +#undef SIZEOF_INT +#undef SIZEOF_LONG + +#undef HAVE_ACOSH +#undef HAVE_ASINH +#undef HAVE_ATANH + +#if defined (HAVE_ACOSH) && defined (HAVE_ASINH) && defined (HAVE_ATANH) +#define HAVE_INVERSE_HYPERBOLIC +#endif + +#undef HAVE_CBRT +#define HAVE_CLOSEDIR +#undef HAVE_DUP2 +#undef HAVE_EACCESS +#undef HAVE_FMOD +#undef HAVE_FPATHCONF +#undef HAVE_FREXP +#undef HAVE_FTIME +#undef HAVE_GETHOSTNAME +#undef HAVE_GETPAGESIZE +#define HAVE_GETTIMEOFDAY +#define HAVE_GETWD +#undef HAVE_LOGB +#undef HAVE_LRAND48 +#undef HAVE_MATHERR +#undef HAVE_MKDIR +#undef HAVE_MKTIME +#undef HAVE_PERROR +#undef HAVE_POLL +#undef HAVE_RANDOM +#undef HAVE_REALPATH +#undef HAVE_RENAME +#undef HAVE_RES_INIT +#undef HAVE_RINT +#undef HAVE_RMDIR +#define HAVE_SELECT +#undef HAVE_SETITIMER +#undef HAVE_SETPGID +#undef HAVE_SETSID +#undef HAVE_SIGBLOCK +#undef HAVE_SIGHOLD +#undef HAVE_SIGPROCMASK +#undef HAVE_SIGSETJMP +#undef HAVE_STRCASECMP +#define HAVE_STRERROR +#undef HAVE_TZSET +#undef HAVE_UTIMES +#undef HAVE_WAITPID + +#define HAVE_SOCKETS +#undef HAVE_SOCKADDR_SUN_LEN +#undef HAVE_SYSVIPC + +#undef SYSV_SYSTEM_DIR +#undef NONSYSTEM_DIR_LIBRARY + +#undef HAVE_TERMIOS +#undef HAVE_TERMIO + +#undef NLIST_STRUCT + +#undef UNEXEC_SRC +#undef AIX_SMT_EXP + +/* Define HAVE_SOCKS if you have the `socks' library and want XEmacs to + use it. */ +#undef HAVE_SOCKS + +/* Define HAVE_TERM if you run the `term' program (e.g. under Linux) and + want XEmacs to use it. */ +#undef HAVE_TERM + +/* Define HAVE_XPM if you have the `xpm' library and want XEmacs to use it. */ +#undef HAVE_XPM + +/* Define HAVE_XFACE if you have the `compface' library and want to use it. + This will permit X-face pixmaps in mail and news messages to display + quickly. */ +#undef HAVE_XFACE + +/* Define HAVE_GIF if you want XEmacs to support converting GIF + (Graphics Interchange Format) images. */ +#undef HAVE_GIF + +/* Define HAVE_JPEG if you have the JPEG library and want XEmacs to use it. + This is for converting JPEG images. */ +#undef HAVE_JPEG + +/* Define HAVE_PNG if you have the PNG library and want XEmacs to use it. + This is for converting PNG images. */ +#undef HAVE_PNG + +/* Define HAVE_PNG_GNUZ if you want to use -lgz instead of -lz for PNG. */ +#undef HAVE_PNG_GNUZ + +/* Define HAVE_TIFF if you have the TIFF library and want XEmacs to use it. + This is for converting TIFF images. */ +#undef HAVE_TIFF + +/* Define HAVE_XMU if you have the Xmu library. This should always be + the case except on losing HPUX systems. */ +#define HAVE_XMU + +/* Define HAVE_DBM if you want to use the DBM libraries */ +#undef HAVE_DBM + +/* Define HAVE_GNU_DBM if you want to use the GNU DBM libraries; + if you define this, you should also define HAVE_DBM */ +#undef HAVE_GNU_DBM + +/* Define HAVE_BERKELEY_DB if you want to use the BerkDB libraries */ +#undef HAVE_BERKELEY_DB + +/* Define HAVE_LIBGDBM if you have -lgdbm (separated from HAVE_DBM + stuff because FreeBSD has the DBM routines in libc) */ +#undef HAVE_LIBGDBM + +/* Define HAVE_LIBDBM if you have -ldbm */ +#undef HAVE_LIBDBM + +/* Define HAVE_LIBDB if you have -ldb */ +#undef HAVE_LIBDB + +#if defined (HAVE_DBM) || defined (HAVE_BERKELEY_DB) +# define HAVE_DATABASE +#endif + +/* Define HAVE_XAUTH if the Xauth library is present. This will add + some extra functionality to gnuserv. */ +#undef HAVE_XAUTH + +/* Define HAVE_XLOCALE_H if X11/Xlocale.h is present. */ +#define HAVE_XLOCALE_H + +/* Define HAVE_NCURSES if -lncurses is present. */ +#undef HAVE_NCURSES + +/* Define HAVE_NCURSES_CURSES_H if ncurses/curses.h is present. */ +#undef HAVE_NCURSES_CURSES_H + +/* Define HAVE_NCURSES_TERM_H if ncurses/term.h is present. */ +#undef HAVE_NCURSES_TERM_H + +/* Define EPOCH to include extra functionality that was present in Epoch. + This code has received only limited testing. */ +#undef EPOCH + +#define LOWTAGS + +/* Define USE_ASSERTIONS if you want the abort() to be changed to assert() + If the assertion fails, assert_failed() will be called. This is + recommended for general use because it gives more info about the crash + than just the abort() message. Too many people "Can't find the corefile" + or have limited core dumps out of existence. */ +#define USE_ASSERTIONS + +/* Define one or more of the following if you want lots of extra checks + (e.g. structure validation) compiled in. These should be turned + on during the beta-test cycle. */ + +/* Check the entire extent structure of a buffer each time an extent + change is done, and do other extent-related checks. */ +#define ERROR_CHECK_EXTENTS +/* Make sure that all X... macros are dereferencing the correct type, + and that all XSET... macros (as much as possible) are setting the + correct type of structure. Highly recommended for all + development work. */ +#define ERROR_CHECK_TYPECHECK +/* Make sure valid buffer positions are passed to BUF_* macros. */ +#define ERROR_CHECK_BUFPOS +/* Attempt to catch bugs related to garbage collection (e.g. + insufficient GCPRO'ing). */ +#define ERROR_CHECK_GC +/* Attempt to catch freeing of a non-malloc()ed block, heap corruption, + etc. */ +#define ERROR_CHECK_MALLOC + +/* Define DEBUG_XEMACS if you want extra debugging code compiled in. + This is mainly intended for use by developers. */ +#define DEBUG_XEMACS 0 + +/* Define MEMORY_USAGE_STATS if you want extra code compiled in to + determine where XEmacs's memory is going. */ +#undef MEMORY_USAGE_STATS + +/* Define QUANTIFY if using Quantify from Pure Software. This adds + some additional calls to control data collection. This is only + intended for use by the developers. */ +#undef QUANTIFY + +/* Define EXTERNAL_WIDGET to compile support for using the editor as a + widget in another program. */ +#undef EXTERNAL_WIDGET + +/* There are some special-case defines for gcc and lcc. */ +#undef USE_GCC +#undef USE_LCC + +/* Allow the user to override the default value of PURESIZE at configure + time. This must come before we include the sys files in order for + it to be able to override any changes in them. */ +#undef PURESIZE + + +/* Define this if you want to use the Common Desktop Environment +*/ +#undef HAVE_CDE + +/* Mocklisp Support. */ +#undef MOCKLISP_SUPPORT + +/* enable special GNU Make features in the Makefiles. */ +#undef USE_GNU_MAKE + +/* Undocumented debugging option: Don't automatically rebuild the DOC + file. This saves a lot of time when you're repeatedly + compiling-running-crashing. */ +#undef NO_DOC_FILE + + /* To eliminate use of `const' in the XEmacs sources, + do `#define CONST_IS_LOSING' */ +#define CONST_IS_LOSING + +# undef CONST +# ifdef CONST_IS_LOSING +# define CONST +# else +# define CONST const +# endif /* CONST */ + +/* If not defined, use unions instead of ints. A few systems (DEC Alpha) + seem to require this, probably because something with the int + definitions isn't right with 64-bit systems. + + (It's NO_UNION_TYPE instead of USE_UNION_TYPE for historical reasons.) +*/ +#undef NO_UNION_TYPE + +/* The configuration script defines opsysfile to be the name of the + s/...h file that describes the system type you are using. The file + is chosen based on the configuration name you give. + + See the file ../etc/MACHINES for a list of systems and the + configuration names to use for them. + + See s/template.h for documentation on writing s/...h files. */ +#include "s/windowsnt.h" + +/* The configuration script defines machfile to be the name of the + m/...h file that describes the machine you are using. The file is + chosen based on the configuration name you give. + + See the file ../etc/MACHINES for a list of machines and the + configuration names to use for them. + + See m/template.h for documentation on writing m/...h files. */ +#include "m/windowsnt.h" + +#if defined (USE_SYSTEM_MALLOC) && !defined (SYSTEM_MALLOC) +#define SYSTEM_MALLOC +#endif + +/* The configuration name. This is used as the install directory name + for the lib-src programs. */ +#undef EMACS_CONFIGURATION + +/* Load in the conversion definitions if this system + needs them and the source file being compiled has not + said to inhibit this. There should be no need for you + to alter these lines. */ + +#ifdef SHORTNAMES +#ifndef NO_SHORTNAMES +#include "../shortnames/remap.h" +#endif /* not NO_SHORTNAMES */ +#endif /* SHORTNAMES */ + +/* Define REL_ALLOC if you want to use the relocating allocator for + buffer space. */ +#undef REL_ALLOC + +/* Define LD_SWITCH_SITE to contain any special flags your loader may need. */ +#undef LD_SWITCH_SITE + +/* Define C_SWITCH_SITE to contain any special flags your compiler needs. */ +#undef C_SWITCH_SITE + +/* Define LD_SWITCH_X_SITE to contain any special flags your loader + may need to deal with X Windows. For instance, if you've defined + HAVE_X_WINDOWS above and your X libraries aren't in a place that + your loader can find on its own, you might want to add "-L/..." or + something similar. */ +#undef LD_SWITCH_X_SITE + +/* Define LD_SWITCH_X_SITE_AUX with an -R option + in case it's needed (for Solaris, for example). */ +#undef LD_SWITCH_X_SITE_AUX + +/* Define C_SWITCH_X_SITE to contain any special flags your compiler + may need to deal with X Windows. For instance, if you've defined + HAVE_X_WINDOWS above and your X include files aren't in a place + that your compiler can find on its own, you might want to add + "-I/..." or something similar. */ +#undef C_SWITCH_X_SITE + +/* Define the return type of signal handlers if the s-xxx file + did not already do so. */ +#define RETSIGTYPE void + +/* SIGTYPE is the macro we actually use. */ +#ifndef SIGTYPE +#define SIGTYPE RETSIGTYPE +#define SIGRETURN return +#endif + +/* Define DYNODUMP if it is necessary to properly dump on this system. + Currently this is only Solaris. */ +#undef DYNODUMP + +/* Define NEED_XILDOFF if the -xildoff flag must be passed to cc to + avoid invoking the incremental linker ild which is incompatible + with dynodump. This is needed for recent Sunsoft compilers. */ +#undef NEED_XILDOFF + +/* Define ENERGIZE to compile with support for the Energize Programming System. + If you do this, don't forget to define ENERGIZE in lwlib/Imakefile as well. + You will need to set your C_SWITCH_SITE and LD_SWITCH_SITE to point at the + Energize connection library (libconn.a) and associated header files. + */ +#undef ENERGIZE +#undef ENERGIZE_2 +#undef ENERGIZE_3 + +/* Define SUNPRO to compiled in support for Sun Sparcworks. */ +#undef SUNPRO + +/* Sun SparcStations, SGI machines, and HP9000s700s have support for playing + different sound files as beeps. If you are on a SparcStation but do not + have the sound option installed for some reason, then undefine + HAVE_NATIVE_SOUND. (It's usually found in /usr/demo/SOUND/ on SunOS 4 + and Solaris systems; on Solaris, you may need to install the "SUNWaudmo" + package.) + */ +#undef HAVE_NATIVE_SOUND + +/* If you wish to compile with support for the Network Audio System + system define HAVE_NAS_SOUND. + NAS_NO_ERROR_JUMP means that the NAS libraries don't inlcude some + error handling changes. + */ +#undef HAVE_NAS_SOUND +#undef NAS_NO_ERROR_JUMP + +/* Compile in support for SunPro usage-tracking code. */ +#undef USAGE_TRACKING + +/* Define TOOLTALK if your site supports the ToolTalk library. */ +#undef TOOLTALK + +#undef LWLIB_USES_MOTIF +#define LWLIB_MENUBARS_LUCID +#undef LWLIB_MENUBARS_MOTIF +#define LWLIB_SCROLLBARS_LUCID +#undef LWLIB_SCROLLBARS_MOTIF +#undef LWLIB_SCROLLBARS_ATHENA +#undef LWLIB_DIALOGS_MOTIF +#define LWLIB_DIALOGS_ATHENA + +/* Other things that can be disabled by configure. */ +#define HAVE_MENUBARS +#define HAVE_SCROLLBARS +#define HAVE_DIALOGS +#undef HAVE_TOOLBARS + + +#if defined (HAVE_MENUBARS) || defined (HAVE_DIALOGS) +#define HAVE_POPUPS +#endif + +/* If you are using SunOS 4.1.1 and X11r5, then you need this patch. + There is a stupid bug in the SunOS libc.a: two functions which X11r5 + uses, mbstowcs() and wcstombs(), are unusable when programs are + statically linked (as XEmacs must be) because the static version of + libc.a contains the *dynamic* versions of these functions. These + functions don't seem to be called when XEmacs is running, so it's + enough to define stubs for them. + + This appears to be fixed in SunOS 4.1.2. + + Also, SunOS 4.1.1 contains buggy versions of strcmp and strcpy that + sometimes reference memory past the end of the string, which can segv. + I don't know whether this is has been fixed as of 4.1.2 or 4.1.3. + */ +#if defined (sparc) && !defined (USG) +#define OBJECTS_SYSTEM sunOS-fix.o strcmp.o strcpy.o +#endif + +/* If you turn this flag on, it forces encapsulation in all +circumstances; this can be used to make sure things compile OK +on various systems. */ +#undef DEBUG_ENCAPSULATION +#define DONT_ENCAPSULATE + +/* basic system calls */ + +#if defined (INTERRUPTIBLE_IO) || defined (DEBUG_ENCAPSULATION) +# define ENCAPSULATE_READ +# define ENCAPSULATE_WRITE +#endif +#if defined (INTERRUPTIBLE_OPEN) || defined (DEBUG_ENCAPSULATION) +# define ENCAPSULATE_OPEN +#endif +#if defined (INTERRUPTIBLE_CLOSE) || defined (DEBUG_ENCAPSULATION) +# define ENCAPSULATE_CLOSE +#endif + +/* stdio calls */ + +#if defined (INTERRUPTIBLE_IO) || defined (DEBUG_ENCAPSULATION) +# define ENCAPSULATE_FREAD +# define ENCAPSULATE_FWRITE +#endif +#if defined (INTERRUPTIBLE_OPEN) || defined (DEBUG_ENCAPSULATION) +# define ENCAPSULATE_FOPEN +#endif +#if defined (INTERRUPTIBLE_CLOSE) || defined (DEBUG_ENCAPSULATION) +# define ENCAPSULATE_FCLOSE +#endif + +/* directory calls */ + +#if defined (DEBUG_ENCAPSULATION) +# define ENCAPSULATE_CHDIR +# define ENCAPSULATE_MKDIR +# define ENCAPSULATE_OPENDIR +# define ENCAPSULATE_READDIR +# define ENCAPSULATE_RMDIR +#endif + +/* file-information calls */ + +#if defined (DEBUG_ENCAPSULATION) +# define ENCAPSULATE_ACCESS +# define ENCAPSULATE_LSTAT +# define ENCAPSULATE_READLINK +# define ENCAPSULATE_STAT +#endif + +/* file-manipulation calls */ + +#if defined (DEBUG_ENCAPSULATION) +# define ENCAPSULATE_CHMOD +# define ENCAPSULATE_CREAT +# define ENCAPSULATE_LINK +# define ENCAPSULATE_RENAME +# define ENCAPSULATE_SYMLINK +# define ENCAPSULATE_UNLINK +#endif + +#if (defined (MSDOS) && defined (FEPCTRL)) || (defined (WIN32) && defined (USE_IME)) +#define HAVE_FEP +#endif + +#if defined (HAVE_SOCKS) && !defined (DO_NOT_SOCKSIFY) +#define accept Raccept +#define bind Rbind +#define connect Rconnect +#define getsockname Rgetsockname +#define listen Rlisten +#endif /* HAVE_SOCKS && !DO_NOT_SOCKSIFY */ + +#ifndef SHORTBITS +#define SHORTBITS (8 * SIZEOF_SHORT) +#endif +#ifndef INTBITS +#define INTBITS (8 * SIZEOF_INT) +#endif +#ifndef LONGBITS +#define LONGBITS (8 * SIZEOF_LONG) +#endif + +#ifdef HAVE_INLINE +# if defined (__GNUC__) +# if defined (DONT_EXTERN_INLINE_FUNCTIONS) +# define INLINE inline +# else +# define INLINE extern inline +# endif +# else +# define INLINE static inline +# endif +#else +# define INLINE static +#endif + +/* We want to avoid saving the signal mask if possible, because + that necessitates a system call. */ +#ifdef HAVE_SIGSETJMP +# define SETJMP(x) sigsetjmp (x, 0) +# define LONGJMP(x, y) siglongjmp (x, y) +# define JMP_BUF sigjmp_buf +#else +# define SETJMP(x) setjmp (x) +# define LONGJMP(x, y) longjmp (x, y) +# define JMP_BUF jmp_buf +#endif + +#endif /* _CONFIG_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nt/paths.h Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,49 @@ +/* Hey Emacs, this is -*- C -*- code! */ + +/* Synched up with: Not synched with FSF. */ + +/* Think twice before editing this file. Generated automatically by configure. + + The file startup.el guesses at reasonable values for load-path, exec-path, + and lock-directory. This means that if you move emacs and its associated + sub-tree to a different place in the filesystem, or to a different machine, + you won't have to do anything for it to work. + + If you define the paths in this file then they will take precedence over + any value generated by the heuristic in startup.el. The hardcoded paths + will be checked to see if they are valid, in which case they will be used. + Otherwise the editor will attempt to make its normal guess. + + See the NEWS file for a description of the heuristic used to locate the lisp + and exec directories at startup time. If you are looking at this file + because you are having trouble, then you would be much better off arranging + for those heuristics to succeed than defining the paths in this file. + + ** Let me say that again. If you're editing this file, you're making + ** a mistake. Re-read the section on installation in ../etc/NEWS. + + If it defines anything, this file should define some subset of the following: + + PATH_PREFIX The default value of `prefix-directory'. This is the + default root for everything. + + PATH_LOADSEARCH The default value of `load-path'. + + PATH_EXEC The default value of `exec-directory' and `exec-path'. + (exec-path also contains the value of whatever is in + the PATH environment variable.) + + PATH_DATA The default value of `data-directory'. This + is where architecture-independent files are + searched for. + + PATH_LOCK The name of the directory that contains lock files + with which we record what files are being modified in + Emacs. This directory should be writable by everyone. + If this is specified, the string must end with a slash! + + PATH_SUPERLOCK The name of the file !!!SuperLock!!! in the lock + directory. You probably should let this default... + + PATH_INFO The default value of `Info-directory-list'. + This is where info files are searched for. */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nt/runemacs.c Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,130 @@ +/* + Simple program to start Emacs with its console window hidden. + + This program is provided purely for convenience, since most users will + use Emacs in windowing (GUI) mode, and will not want to have an extra + console window lying around. */ + +/* + You may want to define this if you want to be able to install updated + emacs binaries even when other users are using the current version. + The problem with some file servers (notably Novell) is that an open + file cannot be overwritten, deleted, or even renamed. So if someone + is running emacs.exe already, you cannot install a newer version. + By defining CHOOSE_NEWEST_EXE, you can name your new emacs.exe + something else which matches "emacs*.exe", and runemacs will + automatically select the newest emacs executeable in the bin directory. + (So you'll probably be able to delete the old version some hours/days + later). +*/ + +/* #define CHOOSE_NEWEST_EXE */ + +#define WIN32 + +#include <windows.h> +#include <string.h> +#include <malloc.h> + +int WINAPI +WinMain (HINSTANCE hSelf, HINSTANCE hPrev, LPSTR cmdline, int nShow) +{ + STARTUPINFO start; + SECURITY_ATTRIBUTES sec_attrs; + SECURITY_DESCRIPTOR sec_desc; + PROCESS_INFORMATION child; + int wait_for_child = FALSE; + DWORD ret_code = 0; + char *new_cmdline; + char *p; + char modname[MAX_PATH]; + + if (!GetModuleFileName (NULL, modname, MAX_PATH)) + goto error; + if ((p = strrchr (modname, '\\')) == NULL) + goto error; + *p = 0; + + new_cmdline = alloca (MAX_PATH + strlen (cmdline) + 1); + strcpy (new_cmdline, modname); + +#ifdef CHOOSE_NEWEST_EXE + { + /* Silly hack to allow new versions to be installed on + server even when current version is in use. */ + + char * best_name = alloca (MAX_PATH + 1); + FILETIME best_time = {0,0}; + WIN32_FIND_DATA wfd; + HANDLE fh; + p = new_cmdline + strlen (new_cmdline); + strcpy (p, "\\emacs*.exe "); + fh = FindFirstFile (new_cmdline, &wfd); + if (fh == INVALID_HANDLE_VALUE) + goto error; + do + { + if (wfd.ftLastWriteTime.dwHighDateTime > best_time.dwHighDateTime + || (wfd.ftLastWriteTime.dwHighDateTime == best_time.dwHighDateTime + && wfd.ftLastWriteTime.dwLowDateTime > best_time.dwLowDateTime)) + { + best_time = wfd.ftLastWriteTime; + strcpy (best_name, wfd.cFileName); + } + } + while (FindNextFile (fh, &wfd)); + FindClose (fh); + *p++ = '\\'; + strcpy (p, best_name); + strcat (p, " "); + } +#else + strcat (new_cmdline, "\\emacs.exe "); +#endif + + /* Append original arguments if any; first look for -wait as first + argument, and apply that ourselves. */ + if (strncmp (cmdline, "-wait", 5) == 0) + { + wait_for_child = TRUE; + cmdline += 5; + } + strcat (new_cmdline, cmdline); + + /* Set emacs_dir variable if runemacs was in "%emacs_dir%\bin". */ + if ((p = strrchr (modname, '\\')) && stricmp (p, "\\bin") == 0) + { + *p = 0; + for (p = modname; *p; p++) + if (*p == '\\') *p = '/'; + SetEnvironmentVariable ("emacs_dir", modname); + } + + memset (&start, 0, sizeof (start)); + start.cb = sizeof (start); + start.dwFlags = STARTF_USESHOWWINDOW; + start.wShowWindow = SW_HIDE; + + sec_attrs.nLength = sizeof (sec_attrs); + sec_attrs.lpSecurityDescriptor = NULL; + sec_attrs.bInheritHandle = FALSE; + + if (CreateProcess (NULL, new_cmdline, &sec_attrs, NULL, TRUE, 0, + NULL, NULL, &start, &child)) + { + if (wait_for_child) + { + WaitForSingleObject (child.hProcess, INFINITE); + GetExitCodeProcess (child.hProcess, &ret_code); + } + CloseHandle (child.hThread); + CloseHandle (child.hProcess); + } + else + goto error; + return (int) ret_code; + +error: + MessageBox (NULL, "Could not start Emacs.", "Error", MB_ICONSTOP); + return 1; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nt/src.m.windowsnt.h Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,132 @@ +/* Machine description file for Windows NT. + + Copyright (C) 1993, 1994 Free Software Foundation, Inc. + +This file is part of GNU Emacs. + +GNU Emacs is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Emacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Synched up with: FSF 19.31. */ + +/* The following line tells the configuration script what sort of + operating system this machine is likely to run. + USUAL-OPSYS="<name of system .h file here, without the s- or .h>" */ + +/* Define BIG_ENDIAN iff lowest-numbered byte in a word + is the most significant byte. */ + +/* #define BIG_ENDIAN */ + +/* Define NO_ARG_ARRAY if you cannot take the address of the first of a + * group of arguments and treat it as an array of the arguments. */ + +#define NO_ARG_ARRAY + +/* Define WORD_MACHINE if addresses and such have + * to be corrected before they can be used as byte counts. */ + +#define WORD_MACHINE + +/* Now define a symbol for the cpu type, if your compiler + does not define it automatically: + Ones defined so far include vax, m68000, ns16000, pyramid, + orion, tahoe, APOLLO and many others */ + +/* Use type int rather than a union, to represent Lisp_Object */ +/* This is desirable for most machines. */ + +#define NO_UNION_TYPE + +/* Define EXPLICIT_SIGN_EXTEND if XINT must explicitly sign-extend + the 24-bit bit field into an int. In other words, if bit fields + are always unsigned. + + If you use NO_UNION_TYPE, this flag does not matter. */ + +#define EXPLICIT_SIGN_EXTEND + +/* Data type of load average, as read out of kmem. */ + +#define LOAD_AVE_TYPE long + +/* Convert that into an integer that is 100 for a load average of 1.0 */ + +#define LOAD_AVE_CVT(x) (int) (((double) (x)) * 100.0 / FSCALE) + +/* Define CANNOT_DUMP on machines where unexec does not work. + Then the function dump-emacs will not be defined + and temacs will do (load "loadup") automatically unless told otherwise. */ + + +#if 0 +#define CANNOT_DUMP 1 +#define CANNOT_UNEXEC 1 +#endif + +/* Start and end of text and data. */ +#define DATA_END get_data_end () +#define DATA_START get_data_start () + +/* Define VIRT_ADDR_VARIES if the virtual addresses of + pure and impure space as loaded can vary, and even their + relative order cannot be relied on. + + Otherwise Emacs assumes that text space precedes data space, + numerically. */ + +/* Text does precede data space, but this is never a safe assumption. */ +#define VIRT_ADDR_VARIES + +/* Define C_ALLOCA if this machine does not support a true alloca + and the one written in C should be used instead. + Define HAVE_ALLOCA to say that the system provides a properly + working alloca function and it should be used. + Define neither one if an assembler-language alloca + in the file alloca.s should be used. */ + +/* #define C_ALLOCA */ +#include <malloc.h> +#define HAVE_ALLOCA + +/* Define NO_REMAP if memory segmentation makes it not work well + to change the boundary between the text section and data section + when Emacs is dumped. If you define this, the preloaded Lisp + code will not be sharable; but that's better than failing completely. */ + +/* #define NO_REMAP */ + +/* Some really obscure 4.2-based systems (like Sequent DYNIX) + * do not support asynchronous I/O (using SIGIO) on sockets, + * even though it works fine on tty's. If you have one of + * these systems, define the following, and then use it in + * config.h (or elsewhere) to decide when (not) to use SIGIO. + * + * You'd think this would go in an operating-system description file, + * but since it only occurs on some, but not all, BSD systems, the + * reasonable place to select for it is in the machine description + * file. + */ + +/* #define NO_SOCK_SIGIO */ + +/* After adding support for a new system, modify the large case + statement in the `configure' script to recognize reasonable + configuration names, and add a description of the system to + `etc/MACHINES'. + + If you've just fixed a problem in an existing configuration file, + you should also check `etc/MACHINES' to make sure its descriptions + of known problems in that configuration should be updated. */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nt/src.s.windowsnt.h Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,315 @@ +/* System description file for Windows NT. + Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. + +This file is part of GNU Emacs. + +GNU Emacs is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Synched up with: FSF 19.31. */ + +/* + * Define symbols to identify the version of Unix this is. + * Define all the symbols that apply correctly. + */ + +/* #define UNIPLUS */ +/* #define USG5 */ +/* #define USG */ +/* #define HPUX */ +/* #define UMAX */ +/* #define BSD4_1 */ +/* #define BSD4_2 */ +/* #define BSD4_3 */ +/* #define BSD */ +/* #define VMS */ +#ifndef WINDOWSNT +#define WINDOWSNT +#endif +#ifndef DOS_NT +#define DOS_NT /* MSDOS or WINDOWSNT */ +#endif + +/* If you are compiling with a non-C calling convention but need to + declare vararg routines differently, put it here */ +#define _VARARGS_ __cdecl + +/* If you are providing a function to something that will call the + function back (like a signal handler and signal, or main) its calling + convention must be whatever standard the libraries expect */ +#define _CALLBACK_ __cdecl + +/* SYSTEM_TYPE should indicate the kind of system you are using. + It sets the Lisp variable system-type. */ + +#define SYSTEM_TYPE "windows-nt" + +#define NO_MATHERR + +#define SIZEOF_LONG 4 +#define SIZEOF_INT 4 +#define SIZEOF_SHORT 4 + +/* NOMULTIPLEJOBS should be defined if your system's shell + does not have "job control" (the ability to stop a program, + run some other program, then continue the first one). */ + +/* #define NOMULTIPLEJOBS */ + +/* Letter to use in finding device name of first pty, + if system supports pty's. 'a' means it is /dev/ptya0 */ + +#define FIRST_PTY_LETTER 'a' + +/* + * Define HAVE_TIMEVAL if the system supports the BSD style clock values. + * Look in <sys/time.h> for a timeval structure. + */ + +#define HAVE_TIMEVAL + +/* + * Define HAVE_SELECT if the system supports the `select' system call. + */ + +/* #define HAVE_SELECT */ + +/* + * Define HAVE_PTYS if the system supports pty devices. + */ + +/* #define HAVE_PTYS */ + +/* If your system uses COFF (Common Object File Format) then define the + preprocessor symbol "COFF". */ + +#define COFF + +/* NT supports Winsock which is close enough (with some hacks) */ + +#define HAVE_SOCKETS + +/* define MAIL_USE_FLOCK if the mailer uses flock + to interlock access to /usr/spool/mail/$USER. + The alternative is that a lock file named + /usr/spool/mail/$USER.lock. */ + +/* #define MAIL_USE_FLOCK */ +#define MAIL_USE_POP +#define MAIL_USE_SYSTEM_LOCK + +/* If the character used to separate elements of the executable path + is not ':', #define this to be the appropriate character constant. */ +#define SEPCHAR ';' + +/* ============================================================ */ + +/* Here, add any special hacks needed + to make Emacs work on this system. For example, + you might define certain system call names that don't + exist on your system, or that do different things on + your system and must be used only through an encapsulation + (Which you should place, by convention, in sysdep.c). */ + +#if 0 +/* Define this to be the separator between path elements */ +#define DIRECTORY_SEP XINT (Vdirectory_sep_char) +#endif + +/* Define this to be the separator between devices and paths */ +#define DEVICE_SEP ':' + +/* We'll support either convention on NT. */ +#define IS_DIRECTORY_SEP(_c_) ((_c_) == '/' || (_c_) == '\\') +#define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_) || IS_DEVICE_SEP (_c_)) + +/* The null device on Windows NT. */ +#define NULL_DEVICE "NUL:" +#define EXEC_SUFFIXES ".exe:.com:.bat:.cmd:" + +#ifndef MAXPATHLEN +#define MAXPATHLEN _MAX_PATH +#endif + +#define LISP_FLOAT_TYPE + +#define HAVE_SYS_TIMEB_H +#undef HAVE_SYS_TIME_H +#undef HAVE_UNISTD_H +#undef STDC_HEADERS +#undef TIME_WITH_SYS_TIME + +#define HAVE_GETTIMEOFDAY +#define HAVE_GETHOSTNAME +#define HAVE_DUP2 +#define HAVE_RENAME +#define HAVE_CLOSEDIR + +#define HAVE_TZNAME + +#define HAVE_LONG_FILE_NAMES + +#define HAVE_MKDIR +#define HAVE_RMDIR +#define HAVE_RANDOM +#define HAVE_BCOPY +#define HAVE_BCMP +#define HAVE_LOGB +#define HAVE_FREXP +#define HAVE_FMOD +#define HAVE_FTIME +#define HAVE_MKTIME + +#define HAVE_MOUSE +#define HAVE_H_ERRNO + +#ifdef HAVE_NTGUI +#define HAVE_WINDOW_SYSTEM +#define HAVE_FACES +#endif + +#define MODE_LINE_BINARY_TEXT(_b_) (NILP ((_b_)->buffer_file_type) ? "T" : "B") + +/* get some redefinitions in place */ + +#if 0 +/* IO calls that are emulated or shadowed */ +#define access sys_access +#define chdir sys_chdir +#define chmod sys_chmod +#define close sys_close +#define creat sys_creat +#define ctime sys_ctime +#define dup sys_dup +#define dup2 sys_dup2 +#define fopen sys_fopen +#define link sys_link +#define mkdir sys_mkdir +#define mktemp sys_mktemp +#define open sys_open +#define read sys_read +#define rename sys_rename +#define rmdir sys_rmdir +#define select sys_select +#define unlink sys_unlink +#define write sys_write +#endif + +#if 0 +/* this is hacky, but is necessary to avoid warnings about macro + redefinitions using the SDK compilers */ +#ifndef __STDC__ +#define __STDC__ 1 +#define MUST_UNDEF__STDC__ +#endif +#include <direct.h> +#include <io.h> +#include <stdio.h> +#ifdef MUST_UNDEF__STDC__ +#undef __STDC__ +#undef MUST_UNDEF__STDC__ +#endif +#endif + + +/* IO calls that are emulated or shadowed */ +#define pipe sys_pipe +#define sleep sys_sleep + +/* subprocess calls that are emulated */ +#define spawnve sys_spawnve +#define wait sys_wait +#define kill sys_kill +#define signal sys_signal + +/* map to MSVC names */ +#define execlp _execlp +#define execvp _execvp +#define fcloseall _fcloseall +#define fdopen _fdopen +#define fgetchar _fgetchar +#define fileno _fileno +#define flushall _flushall +#define fputchar _fputchar +#define getw _getw +#define getpid _getpid +#define isatty _isatty +#define logb _logb +#define _longjmp longjmp +#define lseek _lseek +#define popen _popen +#define pclose _pclose +#define putw _putw +#define umask _umask +#define utime _utime +#define index strchr +#define rindex strrchr +#define read _read +#define write _write + +#ifdef HAVE_NTGUI +#define abort win32_abort +#endif + +/* Defines that we need that aren't in the standard signal.h */ +#define SIGHUP 1 /* Hang up */ +#define SIGQUIT 3 /* Quit process */ +#define SIGTRAP 5 /* Trace trap */ +#define SIGKILL 9 /* Die, die die */ +#define SIGPIPE 13 /* Write on pipe with no readers */ +#define SIGALRM 14 /* Alarm */ +#define SIGCHLD 18 /* Death of child */ + +/* For integration with MSDOS support. */ +#define getdisk() (_getdrive () - 1) +#define getdefdir(_drv, _buf) _getdcwd (_drv, _buf, MAXPATHLEN) + +#define EMACS_CONFIGURATION get_emacs_configuration () +#define EMACS_CONFIG_OPTIONS "NT" /* Not very meaningful yet. */ + +/* Define this so that winsock.h definitions don't get included when windows.h + is... I don't know if they do the right thing for emacs. For this to + have proper effect, config.h must always be included before windows.h. */ +#define _WINSOCKAPI_ 1 + +/* Defines size_t and alloca (). */ +#include <malloc.h> + +#include <sys/stat.h> + +/* Define for those source files that do not include enough NT + system files. */ +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else +#define NULL ((void *)0) +#endif +#endif + +/* For proper declaration of environ. */ +#include <stdlib.h> +#include <string.h> + +/* Emacs takes care of ensuring that these are defined. */ +#ifdef max +#undef max +#undef min +#endif + +/* We need a little extra space, see ../../lisp/loadup.el */ +#define SYSTEM_PURESIZE_EXTRA 15000 + +/* ============================================================ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nt/xemacs.mak Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,1000 @@ +MSDEV=F:/msdev +X11R6=F:/utils/X11R6 +XEMACS=.. +LISP=$(XEMACS)/lisp + +#------------------------------------------------------------------------------ + +# Generic variables + +INCLUDES=-I$(X11R6)/include -I$(XEMACS)/nt/inc -I$(XEMACS)/src\ + -I$(XEMACS)/lwlib -I$(MSDEV)/include +LIBRARIES= + +OUTDIR=obj + +#------------------------------------------------------------------------------ + +# LASTFILE Library + +LASTFILE=$(OUTDIR)/lastfile.lib +LASTFILE_SRC=$(XEMACS)/src +LASTFILE_FLAGS=-nologo -w -Od $(INCLUDES) -Fo$@ -c +LASTFILE_OBJS= \ + $(OUTDIR)/lastfile.obj + +$(LASTFILE): $(LASTFILE_OBJS) + link.exe -lib /nologo /out:$@ $(LASTFILE_OBJS) + +$(OUTDIR)/lastfile.obj: $(LASTFILE_SRC)/lastfile.c + $(CC) $(LASTFILE_FLAGS) $** + +#------------------------------------------------------------------------------ + +# LWLIB Library + +LWLIB=$(OUTDIR)/lwlib.lib +LWLIB_SRC=$(XEMACS)/lwlib +LWLIB_FLAGS=/nologo /w /Od /Yd /Zd $(INCLUDES) /D "WIN32" /D "_DEBUG" \ + /D "_WINDOWS" /D "MENUBARS_LUCID" /D "SCROLLBARS_LUCID" /D "DIALOGS_ATHENA" \ + /D "WINDOWSNT" /Fo$@ /c +LWLIB_OBJS= \ + $(OUTDIR)/lwlib-config.obj \ + $(OUTDIR)/lwlib-utils.obj \ + $(OUTDIR)/lwlib-Xaw.obj \ + $(OUTDIR)/lwlib-Xlw.obj \ + $(OUTDIR)/lwlib.obj \ + $(OUTDIR)/xlwmenu.obj \ + $(OUTDIR)/xlwscrollbar.obj + +$(LWLIB): $(LWLIB_OBJS) + link.exe -lib -nologo -debug -debugtype:both -out:$@ $(LWLIB_OBJS) + +$(OUTDIR)/lwlib-config.obj: $(LWLIB_SRC)/lwlib-config.c + $(CC) $(LWLIB_FLAGS) $** + +$(OUTDIR)/lwlib-utils.obj: $(LWLIB_SRC)/lwlib-utils.c + $(CC) $(LWLIB_FLAGS) $** + +$(OUTDIR)/lwlib-Xaw.obj: $(LWLIB_SRC)/lwlib-Xaw.c + $(CC) $(LWLIB_FLAGS) $** + +$(OUTDIR)/lwlib-Xlw.obj: $(LWLIB_SRC)/lwlib-Xlw.c + $(CC) $(LWLIB_FLAGS) $** + +$(OUTDIR)/lwlib.obj: $(LWLIB_SRC)/lwlib.c + $(CC) $(LWLIB_FLAGS) $** + +$(OUTDIR)/xlwmenu.obj: $(LWLIB_SRC)/xlwmenu.c + $(CC) $(LWLIB_FLAGS) $** + +$(OUTDIR)/xlwscrollbar.obj: $(LWLIB_SRC)/xlwscrollbar.c + $(CC) $(LWLIB_FLAGS) $** + +#------------------------------------------------------------------------------ + +# lib-src programs + +LIB_SRC=$(XEMACS)/lib-src +LIB_SRC_FLAGS=$(INCLUDES) -D_DEBUG -DWIN32 -D_WIN32 -DWIN32_LEAN_AND_MEAN \ + -D_NTSDK -D_M_IX86 -D_DLL -D_MT -D_X86_ -Demacs -DHAVE_CONFIG_H -D_MSC_VER=999 +LIB_SRC_LIBS= kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ + advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib \ + odbccp32.lib msvcrt.lib +LIB_SRC_LFLAGS=/nologo $(LIB_SRC_LIBS) /base:0x1000000\ + /subsystem:console /pdb:none /debugtype:both /machine:I386\ + /nodefaultlib /out:$@ /debug:full + +DOC=$(LIB_SRC)/DOC +DOC_SRCS_1=\ + $(XEMACS)/src/abbrev.c \ + $(XEMACS)/src/alloc.c \ + $(XEMACS)/src/alloca.c \ + $(XEMACS)/src/blocktype.c \ + $(XEMACS)/src/buffer.c \ + $(XEMACS)/src/bytecode.c \ + $(XEMACS)/src/callint.c \ + $(XEMACS)/src/callproc.c \ + $(XEMACS)/src/casefiddle.c \ + $(XEMACS)/src/casetab.c \ + $(XEMACS)/src/chartab.c \ + $(XEMACS)/src/cmdloop.c \ + $(XEMACS)/src/cmds.c \ + $(XEMACS)/src/console-stream.c \ + $(XEMACS)/src/console-x.c \ + $(XEMACS)/src/console.c \ + $(XEMACS)/src/data.c \ + $(XEMACS)/src/database.c \ + $(XEMACS)/src/debug.c \ + $(XEMACS)/src/device-x.c \ + $(XEMACS)/src/device.c \ + $(XEMACS)/src/dgif_lib.c \ + $(XEMACS)/src/dialog-x.c \ + $(XEMACS)/src/dialog.c \ + $(XEMACS)/src/dired.c \ + $(XEMACS)/src/doc.c \ + $(XEMACS)/src/doprnt.c \ + $(XEMACS)/src/dynarr.c \ + $(XEMACS)/src/editfns.c \ + $(XEMACS)/src/elhash.c \ + $(XEMACS)/src/emacs.c \ + $(XEMACS)/src/EmacsFrame.c \ + $(XEMACS)/src/EmacsManager.c \ + $(XEMACS)/src/EmacsShell-sub.c\ + $(XEMACS)/src/EmacsShell.c \ + $(XEMACS)/src/energize.c \ + $(XEMACS)/src/eval.c \ + $(XEMACS)/src/event-stream.c \ + $(XEMACS)/src/event-unixoid.c \ + $(XEMACS)/src/event-Xt.c \ + $(XEMACS)/src/events.c \ + $(XEMACS)/src/extents.c \ + $(XEMACS)/src/faces.c \ + $(XEMACS)/src/fileio.c \ + $(XEMACS)/src/filelock.c \ + $(XEMACS)/src/filemode.c \ + $(XEMACS)/src/floatfns.c \ + $(XEMACS)/src/fns.c \ + $(XEMACS)/src/font-lock.c \ + $(XEMACS)/src/frame-x.c \ + $(XEMACS)/src/frame.c \ + $(XEMACS)/src/free-hook.c \ + $(XEMACS)/src/general.c \ + $(XEMACS)/src/gif_err.c \ + $(XEMACS)/src/gifalloc.c \ + $(XEMACS)/src/glyphs-x.c \ + $(XEMACS)/src/glyphs.c \ + $(XEMACS)/src/gmalloc.c \ + $(XEMACS)/src/gui-x.c \ + $(XEMACS)/src/gui.c \ + $(XEMACS)/src/hash.c \ + $(XEMACS)/src/indent.c \ + $(XEMACS)/src/inline.c \ + $(XEMACS)/src/insdel.c \ + $(XEMACS)/src/intl.c \ + $(XEMACS)/src/keymap.c \ + $(XEMACS)/src/lread.c \ + $(XEMACS)/src/lstream.c \ + $(XEMACS)/src/macros.c \ + $(XEMACS)/src/marker.c \ + $(XEMACS)/src/md5.c \ + $(XEMACS)/src/menubar-x.c \ + $(XEMACS)/src/menubar.c \ + $(XEMACS)/src/minibuf.c \ + $(XEMACS)/src/mocklisp.c \ + $(XEMACS)/src/nt.c \ + $(XEMACS)/src/ntheap.c \ + $(XEMACS)/src/ntproc.c \ + $(XEMACS)/src/objects-x.c \ + $(XEMACS)/src/objects.c \ + $(XEMACS)/src/opaque.c \ + $(XEMACS)/src/print.c \ + $(XEMACS)/src/process.c \ + $(XEMACS)/src/pure.c \ + $(XEMACS)/src/rangetab.c \ + $(XEMACS)/src/realpath.c \ + $(XEMACS)/src/redisplay-output.c \ + $(XEMACS)/src/redisplay-x.c \ + $(XEMACS)/src/redisplay.c \ + $(XEMACS)/src/regex.c \ + $(XEMACS)/src/scrollbar-x.c \ + $(XEMACS)/src/scrollbar.c \ + $(XEMACS)/src/search.c \ + $(XEMACS)/src/signal.c \ + $(XEMACS)/src/sound.c \ + $(XEMACS)/src/specifier.c \ + $(XEMACS)/src/strftime.c \ + $(XEMACS)/src/symbols.c \ + $(XEMACS)/src/syntax.c \ + $(XEMACS)/src/sysdep.c \ + $(XEMACS)/src/termcap.c \ + $(XEMACS)/src/tparam.c \ + $(XEMACS)/src/undo.c \ + $(XEMACS)/src/unexnt.c \ + $(XEMACS)/src/vm-limit.c \ + $(XEMACS)/src/window.c \ + $(XEMACS)/src/xgccache.c \ + $(XEMACS)/src/xmu.c \ + $(XEMACS)/src/xselect.c +DOC_SRCS_2=\ + $(LISP)/version.el \ + $(LISP)/paths.el \ + $(LISP)/prim/loaddefs.elc \ + $(LISP)/prim/auto-autoloads.elc \ + $(LISP)/prim/loadup.el \ + $(LISP)/prim/subr.elc \ + $(LISP)/prim/cmdloop.elc \ + $(LISP)/utils/text-props.elc \ + $(LISP)/prim/gui.elc \ + $(LISP)/prim/mouse.elc \ + $(LISP)/prim/mode-motion.elc \ + $(LISP)/prim/keymap.elc \ + $(LISP)/prim/syntax.elc \ + $(LISP)/prim/minibuf.elc \ + $(LISP)/prim/faces.elc \ + $(LISP)/prim/objects.elc \ + $(LISP)/prim/process.elc \ + $(LISP)/prim/keydefs.elc \ + $(LISP)/prim/device.elc \ + $(LISP)/prim/obsolete.elc \ + $(LISP)/prim/glyphs.elc \ + $(LISP)/prim/extents.elc \ + $(LISP)/prim/backquote.elc \ + $(LISP)/prim/events.elc \ + $(LISP)/prim/console.elc \ + $(LISP)/utils/map-ynp.elc \ + $(LISP)/prim/modeline.elc \ + $(LISP)/prim/profile.elc \ + $(LISP)/modes/list-mode.elc \ + $(LISP)/utils/derived.elc \ + $(LISP)/cl/cl.elc \ + $(LISP)/cl/cl-defs.elc \ + $(LISP)/prim/undo-stack.elc \ + $(LISP)/prim/simple.elc \ + $(LISP)/prim/help.elc \ + $(LISP)/prim/files.elc \ + $(LISP)/utils/lib-complete.elc \ + $(LISP)/prim/indent.elc \ + $(LISP)/prim/frame.elc \ + $(LISP)/prim/format.elc \ + $(LISP)/prim/window.elc \ + $(LISP)/prim/startup.elc \ + $(LISP)/prim/lisp.elc \ + $(LISP)/prim/page.elc \ + $(LISP)/prim/register.elc \ + $(LISP)/iso/iso8859-1.elc \ + $(LISP)/prim/paragraphs.elc \ + $(LISP)/modes/lisp-mode.elc \ + $(LISP)/modes/text-mode.elc \ + $(LISP)/prim/fill.elc \ + $(LISP)/prim/isearch-mode.elc \ + $(LISP)/prim/misc.elc \ + $(LISP)/packages/vc-hooks.elc \ + $(LISP)/prim/replace.elc \ + $(LISP)/prim/specifier.elc \ + $(LISP)/modes/auto-show.elc \ + $(LISP)/bytecomp/bytecomp-runtime.elc \ + $(LISP)/prim/float-sup.elc \ + $(LISP)/prim/itimer.elc \ + $(LISP)/ediff/ediff-hook.elc \ + $(LISP)/packages/fontl-hooks.elc \ + $(LISP)/prim/scrollbar.elc \ + $(LISP)/prim/buffer.elc \ + $(LISP)/prim/menubar.elc \ + $(LISP)/packages/buff-menu.elc \ + $(LISP)/modes/abbrev.elc +# X11_LISP NS_LISP ENERGIZE_LISP TOOLTALK_LISP DIALOG_LISP MULE_LISP NOMULE_LISP + +MAKE_DOCFILE=$(OUTDIR)\make-docfile.exe +SUPPORT_PROGS=$(MAKE_DOCFILE) + +$(MAKE_DOCFILE): $(OUTDIR)\make-docfile.obj + link.exe $(LIB_SRC_LFLAGS) $** $(LIB_SRC_LIBS) + +$(OUTDIR)/make-docfile.obj: $(LIB_SRC)\make-docfile.c + $(CC) $(LIB_SRC_FLAGS) $** /Fo$@ + +$(DOC): $(OUTDIR)/make-docfile.exe + !$(MAKE_DOCFILE) -o $@ $(DOC_SRCS_1) + !$(MAKE_DOCFILE) -a $@ $(DOC_SRCS_2) + +#------------------------------------------------------------------------------ + +# TEMACS Executable + +TEMACS_DIR=$(XEMACS)/src +TEMACS=$(TEMACS_DIR)/temacs.exe +TEMACS_SRC=$(XEMACS)/src +TEMACS_LIBS=$(LASTFILE) $(LWLIB) Xaw.lib Xmu.lib Xt.lib SM.lib ICE.lib \ + Xext.lib X11.lib kernel32.lib user32.lib gdi32.lib \ + winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \ + uuid.lib odbc32.lib odbccp32.lib wsock32.lib msvcrt.lib +TEMACS_LFLAGS=/nologo $(LIBRARIES) /base:0x1000000\ + /stack:0x800000 /entry:_start /subsystem:console /pdb:none\ + /map:$(TEMACS_DIR)/temacs.map /debug:full /debugtype:both /machine:I386\ + /nodefaultlib /force /out:$@\ + /heap:0x00100000 + +TEMACS_CPP=$(XEMACS)/nt/cpp/cpp.exe +TEMACS_CPP_FLAGS= $(INCLUDES) -D_DEBUG -DWIN32 -D_WIN32 -DWIN32_LEAN_AND_MEAN \ + -D_NTSDK -D_M_IX86 -D_DLL -D_MT -D_X86_ -Demacs -DHAVE_CONFIG_H -D_MSC_VER=999 +TEMACS_FLAGS=-nologo -w -Od -Yd -Zd -c $(TEMACS_CPP_FLAGS) + +TEMACS_OBJS= \ + $(OUTDIR)/abbrev.obj \ + $(OUTDIR)/alloc.obj \ + $(OUTDIR)/alloca.obj \ + $(OUTDIR)/blocktype.obj \ + $(OUTDIR)/buffer.obj \ + $(OUTDIR)/bytecode.obj \ + $(OUTDIR)/callint.obj \ + $(OUTDIR)/callproc.obj \ + $(OUTDIR)/casefiddle.obj \ + $(OUTDIR)/casetab.obj \ + $(OUTDIR)/chartab.obj \ + $(OUTDIR)/cmdloop.obj \ + $(OUTDIR)/cmds.obj \ + $(OUTDIR)/console-stream.obj \ + $(OUTDIR)/console-x.obj \ + $(OUTDIR)/console.obj \ + $(OUTDIR)/data.obj \ + $(OUTDIR)/database.obj \ + $(OUTDIR)/debug.obj \ + $(OUTDIR)/device-x.obj \ + $(OUTDIR)/device.obj \ + $(OUTDIR)/dgif_lib.obj \ + $(OUTDIR)/dialog-x.obj \ + $(OUTDIR)/dialog.obj \ + $(OUTDIR)/dired.obj \ + $(OUTDIR)/doc.obj \ + $(OUTDIR)/doprnt.obj \ + $(OUTDIR)/dynarr.obj \ + $(OUTDIR)/editfns.obj \ + $(OUTDIR)/elhash.obj \ + $(OUTDIR)/emacs.obj \ + $(OUTDIR)/EmacsFrame.obj \ + $(OUTDIR)/EmacsManager.obj \ + $(OUTDIR)/TopLevelEmacsShell.obj\ + $(OUTDIR)/TransientEmacsShell.obj\ + $(OUTDIR)/EmacsShell.obj \ + $(OUTDIR)/energize.obj \ + $(OUTDIR)/eval.obj \ + $(OUTDIR)/event-stream.obj \ + $(OUTDIR)/event-unixoid.obj \ + $(OUTDIR)/event-Xt.obj \ + $(OUTDIR)/events.obj \ + $(OUTDIR)/extents.obj \ + $(OUTDIR)/faces.obj \ + $(OUTDIR)/fileio.obj \ + $(OUTDIR)/filelock.obj \ + $(OUTDIR)/filemode.obj \ + $(OUTDIR)/floatfns.obj \ + $(OUTDIR)/fns.obj \ + $(OUTDIR)/font-lock.obj \ + $(OUTDIR)/frame-x.obj \ + $(OUTDIR)/frame.obj \ + $(OUTDIR)/free-hook.obj \ + $(OUTDIR)/general.obj \ + $(OUTDIR)/gif_err.obj \ + $(OUTDIR)/gifalloc.obj \ + $(OUTDIR)/glyphs-x.obj \ + $(OUTDIR)/glyphs.obj \ + $(OUTDIR)/gmalloc.obj \ + $(OUTDIR)/gui-x.obj \ + $(OUTDIR)/gui.obj \ + $(OUTDIR)/hash.obj \ + $(OUTDIR)/indent.obj \ + $(OUTDIR)/inline.obj \ + $(OUTDIR)/insdel.obj \ + $(OUTDIR)/intl.obj \ + $(OUTDIR)/keymap.obj \ + $(OUTDIR)/lread.obj \ + $(OUTDIR)/lstream.obj \ + $(OUTDIR)/macros.obj \ + $(OUTDIR)/marker.obj \ + $(OUTDIR)/md5.obj \ + $(OUTDIR)/menubar-x.obj \ + $(OUTDIR)/menubar.obj \ + $(OUTDIR)/minibuf.obj \ + $(OUTDIR)/mocklisp.obj \ + $(OUTDIR)/nt.obj \ + $(OUTDIR)/ntheap.obj \ + $(OUTDIR)/ntproc.obj \ + $(OUTDIR)/objects-x.obj \ + $(OUTDIR)/objects.obj \ + $(OUTDIR)/opaque.obj \ + $(OUTDIR)/print.obj \ + $(OUTDIR)/process.obj \ + $(OUTDIR)/pure.obj \ + $(OUTDIR)/rangetab.obj \ + $(OUTDIR)/realpath.obj \ + $(OUTDIR)/redisplay-output.obj \ + $(OUTDIR)/redisplay-x.obj \ + $(OUTDIR)/redisplay.obj \ + $(OUTDIR)/regex.obj \ + $(OUTDIR)/scrollbar-x.obj \ + $(OUTDIR)/scrollbar.obj \ + $(OUTDIR)/search.obj \ + $(OUTDIR)/signal.obj \ + $(OUTDIR)/sound.obj \ + $(OUTDIR)/specifier.obj \ + $(OUTDIR)/strftime.obj \ + $(OUTDIR)/symbols.obj \ + $(OUTDIR)/syntax.obj \ + $(OUTDIR)/sysdep.obj \ + $(OUTDIR)/termcap.obj \ + $(OUTDIR)/tparam.obj \ + $(OUTDIR)/undo.obj \ + $(OUTDIR)/unexnt.obj \ + $(OUTDIR)/vm-limit.obj \ + $(OUTDIR)/window.obj \ + $(OUTDIR)/xgccache.obj \ + $(OUTDIR)/xmu.obj \ + $(OUTDIR)/xselect.obj + +#$(TEMACS): $(TEMACS_SRC)/Emacs.ad.h $(TEMACS_SRC)/paths.h $(TEMACS_OBJS) +# link.exe $(TEMACS_LFLAGS) $(TEMACS_OBJS) $(TEMACS_LIBS) + +$(TEMACS): $(TEMACS_SRC)/Emacs.ad.h $(TEMACS_SRC)/paths.h $(TEMACS_OBJS) + link.exe @<< + $(TEMACS_LFLAGS) $(TEMACS_OBJS) $(TEMACS_LIBS) +<< + +$(OUTDIR)/abbrev.obj: $(TEMACS_SRC)/abbrev.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/alloc.obj: $(TEMACS_SRC)/alloc.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/alloca.obj: $(TEMACS_SRC)/alloca.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/blocktype.obj: $(TEMACS_SRC)/blocktype.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/buffer.obj: $(TEMACS_SRC)/buffer.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/bytecode.obj: $(TEMACS_SRC)/bytecode.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/callint.obj: $(TEMACS_SRC)/callint.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/callproc.obj: $(TEMACS_SRC)/callproc.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/casefiddle.obj: $(TEMACS_SRC)/casefiddle.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/casetab.obj: $(TEMACS_SRC)/casetab.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/chartab.obj: $(TEMACS_SRC)/chartab.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/cmdloop.obj: $(TEMACS_SRC)/cmdloop.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/cmds.obj: $(TEMACS_SRC)/cmds.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/console-stream.obj: $(TEMACS_SRC)/console-stream.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/console-x.obj: $(TEMACS_SRC)/console-x.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/console.obj: $(TEMACS_SRC)/console.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/data.obj: $(TEMACS_SRC)/data.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/database.obj: $(TEMACS_SRC)/database.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/debug.obj: $(TEMACS_SRC)/debug.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/device-x.obj: $(TEMACS_SRC)/device-x.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/device.obj: $(TEMACS_SRC)/device.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/dgif_lib.obj: $(TEMACS_SRC)/dgif_lib.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/dialog-x.obj: $(TEMACS_SRC)/dialog-x.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/dialog.obj: $(TEMACS_SRC)/dialog.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/dired.obj: $(TEMACS_SRC)/dired.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/doc.obj: $(TEMACS_SRC)/doc.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/doprnt.obj: $(TEMACS_SRC)/doprnt.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/dynarr.obj: $(TEMACS_SRC)/dynarr.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/editfns.obj: $(TEMACS_SRC)/editfns.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/elhash.obj: $(TEMACS_SRC)/elhash.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/emacs.obj: $(TEMACS_SRC)/emacs.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/EmacsFrame.obj: $(TEMACS_SRC)/EmacsFrame.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/EmacsManager.obj: $(TEMACS_SRC)/EmacsManager.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/TopLevelEmacsShell.obj: $(TEMACS_SRC)/EmacsShell-sub.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) -DDEFINE_TOP_LEVEL_EMACS_SHELL $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/TransientEmacsShell.obj: $(TEMACS_SRC)/EmacsShell-sub.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) -DDEFINE_TRANSIENT_EMACS_SHELL $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/EmacsShell.obj: $(TEMACS_SRC)/EmacsShell.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/energize.obj: $(TEMACS_SRC)/energize.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/eval.obj: $(TEMACS_SRC)/eval.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/event-stream.obj: $(TEMACS_SRC)/event-stream.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/event-unixoid.obj: $(TEMACS_SRC)/event-unixoid.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/event-Xt.obj: $(TEMACS_SRC)/event-Xt.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/events.obj: $(TEMACS_SRC)/events.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/extents.obj: $(TEMACS_SRC)/extents.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/faces.obj: $(TEMACS_SRC)/faces.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/fileio.obj: $(TEMACS_SRC)/fileio.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/filelock.obj: $(TEMACS_SRC)/filelock.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/filemode.obj: $(TEMACS_SRC)/filemode.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/floatfns.obj: $(TEMACS_SRC)/floatfns.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/fns.obj: $(TEMACS_SRC)/fns.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/font-lock.obj: $(TEMACS_SRC)/font-lock.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/frame-x.obj: $(TEMACS_SRC)/frame-x.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/frame.obj: $(TEMACS_SRC)/frame.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/free-hook.obj: $(TEMACS_SRC)/free-hook.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/general.obj: $(TEMACS_SRC)/general.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/gif_err.obj: $(TEMACS_SRC)/gif_err.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/gifalloc.obj: $(TEMACS_SRC)/gifalloc.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/glyphs-x.obj: $(TEMACS_SRC)/glyphs-x.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/glyphs.obj: $(TEMACS_SRC)/glyphs.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/gmalloc.obj: $(TEMACS_SRC)/gmalloc.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/gui-x.obj: $(TEMACS_SRC)/gui-x.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/gui.obj: $(TEMACS_SRC)/gui.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/hash.obj: $(TEMACS_SRC)/hash.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/indent.obj: $(TEMACS_SRC)/indent.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/inline.obj: $(TEMACS_SRC)/inline.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/insdel.obj: $(TEMACS_SRC)/insdel.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/intl.obj: $(TEMACS_SRC)/intl.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/keymap.obj: $(TEMACS_SRC)/keymap.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/lread.obj: $(TEMACS_SRC)/lread.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/lstream.obj: $(TEMACS_SRC)/lstream.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/macros.obj: $(TEMACS_SRC)/macros.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/marker.obj: $(TEMACS_SRC)/marker.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/md5.obj: $(TEMACS_SRC)/md5.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/menubar-x.obj: $(TEMACS_SRC)/menubar-x.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/menubar.obj: $(TEMACS_SRC)/menubar.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/minibuf.obj: $(TEMACS_SRC)/minibuf.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/mocklisp.obj: $(TEMACS_SRC)/mocklisp.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/msdos.obj: $(TEMACS_SRC)/msdos.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/nt.obj: $(TEMACS_SRC)/nt.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/ntheap.obj: $(TEMACS_SRC)/ntheap.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/ntproc.obj: $(TEMACS_SRC)/ntproc.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/objects-x.obj: $(TEMACS_SRC)/objects-x.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/objects.obj: $(TEMACS_SRC)/objects.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/opaque.obj: $(TEMACS_SRC)/opaque.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/print.obj: $(TEMACS_SRC)/print.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/process.obj: $(TEMACS_SRC)/process.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/pure.obj: $(TEMACS_SRC)/pure.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/rangetab.obj: $(TEMACS_SRC)/rangetab.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/realpath.obj: $(TEMACS_SRC)/realpath.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/redisplay-output.obj: $(TEMACS_SRC)/redisplay-output.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/redisplay-x.obj: $(TEMACS_SRC)/redisplay-x.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/redisplay.obj: $(TEMACS_SRC)/redisplay.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/regex.obj: $(TEMACS_SRC)/regex.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/scrollbar-x.obj: $(TEMACS_SRC)/scrollbar-x.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/scrollbar.obj: $(TEMACS_SRC)/scrollbar.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/search.obj: $(TEMACS_SRC)/search.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/signal.obj: $(TEMACS_SRC)/signal.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/sound.obj: $(TEMACS_SRC)/sound.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/specifier.obj: $(TEMACS_SRC)/specifier.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/strftime.obj: $(TEMACS_SRC)/strftime.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/symbols.obj: $(TEMACS_SRC)/symbols.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/syntax.obj: $(TEMACS_SRC)/syntax.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/sysdep.obj: $(TEMACS_SRC)/sysdep.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/termcap.obj: $(TEMACS_SRC)/termcap.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/tparam.obj: $(TEMACS_SRC)/tparam.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/undo.obj: $(TEMACS_SRC)/undo.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/unexnt.obj: $(TEMACS_SRC)/unexnt.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/vm-limit.obj: $(TEMACS_SRC)/vm-limit.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/window.obj: $(TEMACS_SRC)/window.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/xgccache.obj: $(TEMACS_SRC)/xgccache.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/xmu.obj: $(TEMACS_SRC)/xmu.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(OUTDIR)/xselect.obj: $(TEMACS_SRC)/xselect.c + !"$(TEMACS_CPP) $(TEMACS_CPP_FLAGS) $** > $(OUTDIR)/foo.c" + $(CC) $(TEMACS_FLAGS) $(OUTDIR)/foo.c /Fo$@ + !"del $(OUTDIR)\\foo.c" + +$(TEMACS_SRC)/Emacs.ad.h: $(XEMACS)/etc/Emacs.ad + !"sed -f ad2c.sed < $(XEMACS)/etc/Emacs.ad > $(TEMACS_SRC)/Emacs.ad.h" + +$(TEMACS_SRC)/paths.h: $(TEMACS_SRC)/paths.h.in + !"cd $(TEMACS_SRC); cp paths.h.in paths.h" + +#------------------------------------------------------------------------------ + +# LISP bits 'n bobs + +dump-elcs: $(TEMACS) + $(LOADPATH) $(TEMACS) -batch -l ../prim/update-elc.el $(LISP) + +dump-xemacs: $(TEMACS) + $(TEMACS) -batch -l loadup.el dump + +#------------------------------------------------------------------------------ + +# use this rule to build the complete system +all: $(LASTFILE) $(LWLIB) $(TEMACS) $(SUPPORT_PROGS) $(DOC) + +# use this rule to install the system +install:
--- a/src/ChangeLog Mon Aug 13 09:13:58 2007 +0200 +++ b/src/ChangeLog Mon Aug 13 09:15:11 2007 +0200 @@ -1,3 +1,59 @@ +Sun Feb 23 16:56:17 1997 David Hobley <david@spook-le0.cia.com.au> + Initial MS Windows NT support. + * unexnt.c: New file. + + * ntproc.c: New file. + + * ntheap.h: New file. + + * ntheap.c: New file. + + * nt.h: New file. + + * nt.c: New file. + +Sun Feb 23 15:56:58 1997 Steven L Baur <steve@altair.xemacs.org> + + * floatfns.c (_GNU_SOURCE): Define if compiling with glibc 2. + + * gmalloc.c: Guard __getpagesize definition against glibc 2. + +Sat Feb 22 17:12:47 1997 Steven L Baur <steve@altair.xemacs.org> + + * Makefile.in.in (lisp): Snarf docstrings from new file + itimer-autosave.elc. + +Fri Feb 21 18:21:32 1997 Jan Vroonhof <vroonhof@math.ethz.ch> + + * event-Xt.c (emacs_Xt_handle_magic_event): Correction for frame + freezing bug. + +Wed Feb 19 12:54:32 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * buffer.c (Fbuffer_disable_undo): Default to current buffer. + +Tue Feb 18 12:37:28 1997 Steven L Baur <steve@altair.xemacs.org> + + * Makefile.in.in (lisp): Dump new file custom-xmas.elc. + +Mon Feb 17 11:29:07 1997 Steven L Baur <steve@altair.xemacs.org> + + * print.c (Ferror_message_string): New function, ported from Emacs + 19.34. + (print_error_message): Ditto. + + * extents.c (verify_extent_mapper): Experimental deletion of code + to allow deletion of read-only extents. + + * symbols.c (hash_string): Replace algorithm with one given in + Aho, Sethi & Ullman. + +Sun Feb 16 14:53:58 1997 Steven L Baur <steve@altair.xemacs.org> + + * keymap.c (lookup_keys): Wrong sense in test. + + * Makefile.in.in: Dont dump font.elc. + Sat Feb 15 02:30:51 1997 Steven L Baur <steve@altair.xemacs.org> * cmds.c: Define new symbol signal-error-on-buffer-boundary.
--- a/src/Makefile.in.in Mon Aug 13 09:13:58 2007 +0200 +++ b/src/Makefile.in.in Mon Aug 13 09:15:11 2007 +0200 @@ -632,22 +632,24 @@ #ifdef AIX4 # define LIBI18N -li18n #else -# if (defined(LINUX) && defined(HAVE_CDE)) -# define LIBI18N -lXintl -# else -# define LIBI18N -#endif /* LINUX & CDE */ +# define LIBI18N #endif /* AIX4 */ +#if (defined(LINUX) && defined(HAVE_CDE)) +# define LIBX11_INTL -lXintl +#else +# define LIBX11_INTL +#endif + #ifdef THIS_IS_X11R6 #ifdef NEED_LIBW LIBW= -lw #else LIBW= #endif -LIBX= $(LIBX11_LIBS) $(XMU_LIB) -lXt -lSM -lICE $(LIBW) -lXext -lX11 LIBX11_MACHINE LIBX11_SYSTEM LIBI18N +LIBX= $(LIBX11_LIBS) $(XMU_LIB) -lXt -lSM -lICE $(LIBW) -lXext LIBX11_INTL -lX11 LIBX11_MACHINE LIBX11_SYSTEM LIBI18N #else -LIBX= $(LIBX11_LIBS) $(XMU_LIB) -lXt -lXext -lX11 LIBX11_MACHINE LIBX11_SYSTEM LIBI18N +LIBX= $(LIBX11_LIBS) $(XMU_LIB) -lXt -lXext LIBX11_INTL -lX11 LIBX11_MACHINE LIBX11_SYSTEM LIBI18N #endif #else @@ -1267,9 +1269,10 @@ ${lispdir}prim/replace.elc ${lispdir}prim/specifier.elc \ ${lispdir}modes/auto-show.elc SUNPRO_LISP TTY_LISP \ ${lispdir}bytecomp/bytecomp-runtime.elc FLOAT_LISP EPOCH_LISP \ - ${lispdir}prim/itimer.elc ${lispdir}ediff/ediff-hook.elc \ - ${lispdir}custom/custom.elc ${lispdir}custom/widget.elc \ - ${lispdir}w3/font.elc \ + ${lispdir}prim/itimer.elc ${lispdir}prim/itimer-autosave.elc \ + ${lispdir}ediff/ediff-hook.elc \ + ${lispdir}custom/widget.elc \ + ${lispdir}custom/custom.elc ${lispdir}custom/custom-xmas.elc \ ${lispdir}packages/fontl-hooks.elc SCROLLBAR_LISP \ ${lispdir}prim/buffer.elc MENUBAR_LISP \ ${lispdir}packages/buff-menu.elc DIALOG_LISP MULE_LISP NOMULE_LISP \
--- a/src/alloc.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/alloc.c Mon Aug 13 09:15:11 2007 +0200 @@ -4060,7 +4060,9 @@ } mark_redisplay (mark_object); +#ifndef WINDOWSNT mark_profiling_info (mark_object); +#endif } /* OK, now do the after-mark stuff. This is for things that
--- a/src/buffer.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/buffer.c Mon Aug 13 09:15:11 2007 +0200 @@ -1169,11 +1169,10 @@ return Fget_buffer_create (QSscratch); } -/* XEmacs change: Make this argument required because this is a dangerous - function. */ -DEFUN ("buffer-disable-undo", Fbuffer_disable_undo, 1, 1, "", /* +DEFUN ("buffer-disable-undo", Fbuffer_disable_undo, 0, 1, "", /* Make BUFFER stop keeping undo information. Any undo records it already has are discarded. +No argument or nil as argument means do this for the current buffer. */ (buffer)) {
--- a/src/callproc.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/callproc.c Mon Aug 13 09:15:11 2007 +0200 @@ -35,12 +35,15 @@ #include "mule-coding.h" #endif -#include "sysfile.h" #include "systime.h" #include "sysproc.h" +#include "sysfile.h" /* Always include after sysproc.h */ #include "syssignal.h" /* Always include before systty.h */ #include "systty.h" +#ifdef WINDOWSNT +#define _P_NOWAIT 1 /* from process.h */ +#endif #ifdef DOS_NT /* When we are starting external processes we need to know whether they @@ -342,11 +345,7 @@ } else { -#ifdef WINDOWSNT - pipe_with_inherited_out (fd); -#else /* not WINDOWSNT */ pipe (fd); -#endif /* not WINDOWSNT */ #if 0 /* Replaced by close_process_descs */ set_exclusive_use (fd[0]); @@ -639,7 +638,11 @@ static int relocate_fd (int fd, int min); +#ifdef WINDOWSNT +int +#else void +#endif child_setup (int in, int out, int err, char **new_argv, CONST char *current_dir) {
--- a/src/device.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/device.c Mon Aug 13 09:15:11 2007 +0200 @@ -1000,10 +1000,14 @@ /* reset the flag to 0 unless another notification occurred while we were processing this one. Block SIGWINCH during this check to prevent a possible race condition. */ +#ifndef WINDOWSNT EMACS_BLOCK_SIGNAL (SIGWINCH); +#endif if (old_asynch_device_change_pending == asynch_device_change_pending) asynch_device_change_pending = 0; +#ifndef WINDOWSNT EMACS_UNBLOCK_SIGNAL (SIGWINCH); +#endif } void
--- a/src/dired.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/dired.c Mon Aug 13 09:15:11 2007 +0200 @@ -695,23 +695,10 @@ values[9] = Qt; } #else /* file gid will be egid */ -#ifdef WINDOWSNT - values[9] = Qnil; /* sorry, no group IDs on NT */ -#else /* not WINDOWSNT */ values[9] = (s.st_gid != getegid ()) ? Qt : Qnil; -#endif /* not WINDOWSNT */ #endif /* BSD4_2 or BSD4_3 */ -#ifdef WINDOWSNT - /* Fill in the inode and device values specially...see nt.c. */ - if (!get_inode_and_device_vals (filename, &values[10], &values[11])) - { - UNGCPRO; - return Qnil; - } -#else /* not WINDOWSNT */ values[10] = make_int (s.st_ino); values[11] = make_int (s.st_dev); -#endif /* not WINDOWSNT */ UNGCPRO; return Flist (countof (values), values); }
--- a/src/emacs.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/emacs.c Mon Aug 13 09:15:11 2007 +0200 @@ -599,7 +599,10 @@ if (! isatty (0)) fatal ("%s: not a tty", term); +#if 0 stderr_out ("Using %s", ttyname (0)); +#endif + stderr_out ("Using %s", term); inhibit_window_system = 1; /* -t => -nw */ } } @@ -823,7 +826,9 @@ #if !defined (NO_SUBPROCESSES) syms_of_process (); #endif +#ifndef WINDOWSNT syms_of_profile (); +#endif #if defined (HAVE_MMAP) && defined (REL_ALLOC) syms_of_ralloc (); #endif /* HAVE_MMAP && REL_ALLOC */ @@ -1146,7 +1151,9 @@ #ifndef NO_SUBPROCESSES vars_of_process (); #endif +#ifndef WINDOWSNT vars_of_profile (); +#endif #if defined (HAVE_MMAP) && defined (REL_ALLOC) vars_of_ralloc (); #endif /* HAVE_MMAP && REL_ALLOC */
--- a/src/event-Xt.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/event-Xt.c Mon Aug 13 09:15:11 2007 +0200 @@ -55,6 +55,18 @@ #include "mule-coding.h" #endif +#ifdef WINDOWSNT +/* Hmm, under unix we want X modifiers, under NT we want X modifiers if + we are running X and Windows modifiers otherwise. + gak. This is a kludge until we support multiple native GUIs! +*/ +#undef MOD_ALT +#undef MOD_CONTROL +#undef MOD_SHIFT +#endif + +#include <events-mod.h> + static void enqueue_Xt_dispatch_event (Lisp_Object event); static struct event_stream *Xt_event_stream; @@ -1319,8 +1331,19 @@ case VisibilityNotify: /* window visiblity has changed */ if (event->xvisibility.window == XtWindow (FRAME_X_SHELL_WIDGET (f))) - FRAME_X_TOTALLY_VISIBLE_P (f) = - (event->xvisibility.state == VisibilityUnobscured); +#if 0 /* This causes all kinds of strange behavior I don't like. -sb */ + { + /* Note that the fvwm pager only sends VisibilityNotify when + changing pages. Is this all we need to do ? JV */ + FRAME_VISIBLE_P (f) = + ( event->xvisibility.state != VisibilityFullyObscured); + FRAME_X_TOTALLY_VISIBLE_P (f) = + (event->xvisibility.state == VisibilityUnobscured); + } +#else + FRAME_X_TOTALLY_VISIBLE_P (f) = + (event->xvisibility.state == VisibilityUnobscured); +#endif break; case ConfigureNotify:
--- a/src/event-stream.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/event-stream.c Mon Aug 13 09:15:11 2007 +0200 @@ -56,6 +56,8 @@ #include "syssignal.h" /* SIGCHLD, etc. */ #include "systime.h" /* to set Vlast_input_time */ +#include "events-mod.h" + #ifdef MULE #include "mule-coding.h" #endif
--- a/src/events.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/events.c Mon Aug 13 09:15:11 2007 +0200 @@ -38,6 +38,18 @@ #include "redisplay.h" #include "window.h" +#ifdef WINDOWSNT +/* Hmm, under unix we want X modifiers, under NT we want X modifiers if + we are running X and Windows modifiers otherwise. + gak. This is a kludge until we support multiple native GUIs! +*/ +#undef MOD_ALT +#undef MOD_CONTROL +#undef MOD_SHIFT +#endif + +#include <events-mod.h> + /* Where old events go when they are explicitly deallocated. The event chain here is cut loose before GC, so these will be freed eventually.
--- a/src/events.h Mon Aug 13 09:13:58 2007 +0200 +++ b/src/events.h Mon Aug 13 09:15:11 2007 +0200 @@ -421,15 +421,6 @@ extern Lisp_Object Qevent_live_p; -/* The modifiers XEmacs knows about; these appear in key and button events. - */ -#define MOD_CONTROL (1<<0) -#define MOD_META (1<<1) -#define MOD_SUPER (1<<2) -#define MOD_HYPER (1<<3) -#define MOD_ALT (1<<4) -#define MOD_SHIFT (1<<5) /* not used for dual-case characters */ - /* Note: under X Windows, MOD_ALT is generated by the Alt key if there are both Alt and Meta keys. If there are no Meta keys, then Alt generates MOD_META instead.
--- a/src/extents.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/extents.c Mon Aug 13 09:15:11 2007 +0200 @@ -4413,6 +4413,7 @@ if (CONSP (closure->iro) && !NILP (Fmemq (prop, closure->iro))) return 0; +#if 0 /* Nobody seems to care for this any more -sb */ /* Allow deletion if the extent is completely contained in the region being deleted. This is important for supporting tokens which are internally @@ -4424,6 +4425,7 @@ extent_start (extent) >= closure->start && extent_end (extent) <= closure->end) return 0; +#endif while (1) Fsignal (Qbuffer_read_only, (list1 (closure->object)));
--- a/src/fileio.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/fileio.c Mon Aug 13 09:15:11 2007 +0200 @@ -2145,7 +2145,7 @@ INTP (ok_if_already_exists), 0); #ifdef WINDOWSNT - if (!MoveFile (XSTRING (filename)->data, XSTRING (newname)->data)) + if (!MoveFile (XSTRING (filename)->_data, XSTRING (newname)->_data)) #else /* not WINDOWSNT */ /* FSFmacs only calls rename() here under BSD 4.1, and calls link() and unlink() otherwise, but that's bogus. Sometimes @@ -2726,7 +2726,7 @@ if (stat ((char *) XSTRING_DATA (abspath), &st) < 0) return Qnil; #ifdef DOS_NT - if (check_executable (XSTRING (abspath)->data)) + if (check_executable (XSTRING (abspath)->_data)) st.st_mode |= S_IEXEC; #endif /* DOS_NT */ @@ -2801,7 +2801,9 @@ */ ()) { +#ifndef WINDOWSNT sync (); +#endif return Qnil; } #endif /* !VMS */ @@ -3194,6 +3196,8 @@ NUNGCPRO; } +#if 0 +/* XXXX Why the #### ? Bogus anyway. If they are there, display em! */ #ifdef DOS_NT /* Determine file type from name and remove LFs from CR-LFs if the file is deemed to be a text file. */ @@ -3209,6 +3213,7 @@ } } #endif +#endif /* Close the file/stream */ unbind_to (speccount, Qnil);
--- a/src/filelock.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/filelock.c Mon Aug 13 09:15:11 2007 +0200 @@ -260,7 +260,9 @@ if ((fd = open (lfname, mode, 0666)) >= 0) { -#ifdef USG +#if defined(WINDOWSNT) + chmod(lfname, _S_IREAD|_S_IWRITE); +#elif defined(USG) chmod (lfname, 0666); #else fchmod (fd, 0666); @@ -378,7 +380,9 @@ } if (fd >= 0) { -#ifdef USG +#if defined(WINDOWSNT) + chmod(lfname, _S_IREAD|_S_IWRITE); +#elif defined(USG) chmod ((char *) XSTRING_DATA (Vsuperlock_file), 0666); #else fchmod (fd, 0666);
--- a/src/floatfns.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/floatfns.c Mon Aug 13 09:15:11 2007 +0200 @@ -53,6 +53,10 @@ /* Need to define a differentiating symbol -- see sysfloat.h */ #define THIS_FILENAME floatfns +/* glibc chokes unless _GNU_SOURCE is defined */ +#if defined (__GLIBC__) && (__GLIBC__ >= 2) +#define _GNU_SOURCE 1 +#endif #include "sysfloat.h" #ifndef HAVE_RINT
--- a/src/glyphs-x.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/glyphs-x.c Mon Aug 13 09:15:11 2007 +0200 @@ -2521,7 +2521,7 @@ else { assert (COLOR_SPECIFIERP (value)); - value = Fspecifier_instance (value, device, Qnil, Qnil); + value = Fspecifier_instance (value, Qnil, Qnil, Qnil); } if (NILP (value)) continue;
--- a/src/gmalloc.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/gmalloc.c Mon Aug 13 09:15:11 2007 +0200 @@ -98,7 +98,7 @@ /* #### XEmacs change for Solaris */ #if defined (__cplusplus) || (defined (__STDC__) && __STDC__) || \ - (defined (__STDC__) && defined (SOLARIS2)) + (defined (__STDC__) && defined (SOLARIS2)) || defined (WINDOWSNT) #undef __P #define __P(args) args #undef __ptr_t @@ -351,7 +351,9 @@ #if defined (__GNU_LIBRARY__) || defined (_LIBC) #include <stddef.h> #include <sys/cdefs.h> +#if ! (defined (__GLIBC__) && (__GLIBC__ >= 2)) extern size_t __getpagesize __P ((void)); +#endif #else #include "getpagesize.h" #define __getpagesize() getpagesize()
--- a/src/keymap.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/keymap.c Mon Aug 13 09:15:11 2007 +0200 @@ -39,6 +39,18 @@ #include "keymap.h" #include "window.h" +#ifdef WINDOWSNT +/* Hmm, under unix we want X modifiers, under NT we want X modifiers if + we are running X and Windows modifiers otherwise. + gak. This is a kludge until we support multiple native GUIs! +*/ +#undef MOD_ALT +#undef MOD_CONTROL +#undef MOD_SHIFT +#endif + +#include <events-mod.h> + /* A keymap contains four slots: @@ -2095,7 +2107,7 @@ if (nkeys == 0) return Qnil; - if (nkeys > (countof (kkk))) + if (nkeys < (countof (kkk))) raw_keys = kkk; else raw_keys = (struct key_data *) alloca (sizeof (struct key_data) * nkeys);
--- a/src/lisp.h Mon Aug 13 09:13:58 2007 +0200 +++ b/src/lisp.h Mon Aug 13 09:15:11 2007 +0200 @@ -1423,12 +1423,11 @@ Snarf_documentation chokes */ #define DEFUN(lname, Fname, minargs, maxargs, prompt, arglist) \ - Lisp_Object Fname (DEFUN_ ## maxargs arglist) ; /* See below */ \ + Lisp_Object Fname (DEFUN_##maxargs arglist) ; /* See below */ \ static struct Lisp_Subr S##Fname = { {lrecord_subr}, \ minargs, maxargs, prompt, 0, lname, (lisp_fn_t) Fname }; \ Lisp_Object Fname (DEFUN_##maxargs arglist) - /* Heavy ANSI C preprocessor hackery to get DEFUN to declare a prototype that matches maxargs, and add the obligatory `Lisp_Object' type declaration to the formal C arguments. */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/nt.c Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,2301 @@ +/* Utility and Unix shadow routines for XEmacs on Windows NT. + Copyright (C) 1994, 1995 Free Software Foundation, Inc. + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to the Free +Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. + + + Geoff Voelker (voelker@cs.washington.edu) 7-29-94 */ + +/* Adapted for XEmacs by David Hobley <david@spook-le0.cia.com.au> */ + +#include <stdlib.h> +#include <stdio.h> +#include <io.h> +#include <errno.h> +#include <fcntl.h> +#include <ctype.h> +#include <signal.h> +#include <sys/time.h> + +/* must include CRT headers *before* config.h */ +#include "config.h" +#undef access +#undef chdir +#undef chmod +#undef creat +#undef ctime +#undef fopen +#undef link +#undef mkdir +#undef mktemp +#undef open +#undef rename +#undef rmdir +#undef unlink + +#undef close +#undef dup +#undef dup2 +#undef pipe +#undef read +#undef write +#undef closedir + +#define getwd _getwd +#include "lisp.h" +#undef getwd + +#include <pwd.h> + +#include <windows.h> + +#ifdef HAVE_SOCKETS /* TCP connection support, if kernel can do it */ +#include <sys/socket.h> +#undef socket +#undef bind +#undef connect +#undef htons +#undef ntohs +#undef inet_addr +#undef gethostname +#undef gethostbyname +#undef getservbyname +#endif + +#include "nt.h" +#include <sys/dir.h> +#include "ntheap.h" + +/* Get the current working directory. */ +char * +getwd (char *dir) +{ + if (GetCurrentDirectory (MAXPATHLEN, dir) > 0) + return dir; + return NULL; +} + +#ifndef HAVE_SOCKETS +/* Emulate gethostname. */ +int +gethostname (char *buffer, int size) +{ + /* NT only allows small host names, so the buffer is + certainly large enough. */ + return !GetComputerName (buffer, &size); +} +#endif /* HAVE_SOCKETS */ + +/* Emulate getloadavg. */ +int +getloadavg (double loadavg[], int nelem) +{ + int i; + + /* A faithful emulation is going to have to be saved for a rainy day. */ + for (i = 0; i < nelem; i++) + { + loadavg[i] = 0.0; + } + return i; +} + +/* Emulate the Unix directory procedures opendir, closedir, + and readdir. We can't use the procedures supplied in sysdep.c, + so we provide them here. */ + +struct direct dir_static; /* simulated directory contents */ +static HANDLE dir_find_handle = INVALID_HANDLE_VALUE; +static int dir_is_fat; +static char dir_pathname[MAXPATHLEN+1]; + +extern Lisp_Object Vwin32_downcase_file_names; + +DIR * +opendir (char *filename) +{ + DIR *dirp; + + /* Opening is done by FindFirstFile. However, a read is inherent to + this operation, so we defer the open until read time. */ + + if (!(dirp = (DIR *) xmalloc (sizeof (DIR)))) + return NULL; + if (dir_find_handle != INVALID_HANDLE_VALUE) + return NULL; + + dirp->dd_fd = 0; + dirp->dd_loc = 0; + dirp->dd_size = 0; + + strncpy (dir_pathname, filename, MAXPATHLEN); + dir_pathname[MAXPATHLEN] = '\0'; + dir_is_fat = is_fat_volume (filename, NULL); + + return dirp; +} + +void +closedir (DIR *dirp) +{ + /* If we have a find-handle open, close it. */ + if (dir_find_handle != INVALID_HANDLE_VALUE) + { + FindClose (dir_find_handle); + dir_find_handle = INVALID_HANDLE_VALUE; + } + xfree ((char *) dirp); +} + +struct direct * +readdir (DIR *dirp) +{ + WIN32_FIND_DATA find_data; + + /* If we aren't dir_finding, do a find-first, otherwise do a find-next. */ + if (dir_find_handle == INVALID_HANDLE_VALUE) + { + char filename[MAXNAMLEN + 3]; + int ln; + + strcpy (filename, dir_pathname); + ln = strlen (filename) - 1; + if (!IS_DIRECTORY_SEP (filename[ln])) + strcat (filename, "\\"); + strcat (filename, "*"); + + dir_find_handle = FindFirstFile (filename, &find_data); + + if (dir_find_handle == INVALID_HANDLE_VALUE) + return NULL; + } + else + { + if (!FindNextFile (dir_find_handle, &find_data)) + return NULL; + } + + /* Emacs never uses this value, so don't bother making it match + value returned by stat(). */ + dir_static.d_ino = 1; + + dir_static.d_reclen = sizeof (struct direct) - MAXNAMLEN + 3 + + dir_static.d_namlen - dir_static.d_namlen % 4; + + dir_static.d_namlen = strlen (find_data.cFileName); + strcpy (dir_static.d_name, find_data.cFileName); + if (dir_is_fat) + _strlwr (dir_static.d_name); + else if (!NILP (Vwin32_downcase_file_names)) + { + register char *p; + for (p = dir_static.d_name; *p; p++) + if (*p >= 'a' && *p <= 'z') + break; + if (!*p) + _strlwr (dir_static.d_name); + } + + return &dir_static; +} + +/* Emulate getpwuid, getpwnam and others. */ + +#define PASSWD_FIELD_SIZE 256 + +static char the_passwd_name[PASSWD_FIELD_SIZE]; +static char the_passwd_passwd[PASSWD_FIELD_SIZE]; +static char the_passwd_gecos[PASSWD_FIELD_SIZE]; +static char the_passwd_dir[PASSWD_FIELD_SIZE]; +static char the_passwd_shell[PASSWD_FIELD_SIZE]; + +static struct passwd the_passwd = +{ + the_passwd_name, + the_passwd_passwd, + 0, + 0, + 0, + the_passwd_gecos, + the_passwd_dir, + the_passwd_shell, +}; + +int +getuid () +{ + return the_passwd.pw_uid; +} + +int +geteuid () +{ + /* I could imagine arguing for checking to see whether the user is + in the Administrators group and returning a UID of 0 for that + case, but I don't know how wise that would be in the long run. */ + return getuid (); +} + +int +getgid () +{ + return the_passwd.pw_gid; +} + +int +getegid () +{ + return getgid (); +} + +struct passwd * +getpwuid (int uid) +{ + if (uid == the_passwd.pw_uid) + return &the_passwd; + return NULL; +} + +struct passwd * +getpwnam (char *name) +{ + struct passwd *pw; + + pw = getpwuid (getuid ()); + if (!pw) + return pw; + + if (stricmp (name, pw->pw_name)) + return NULL; + + return pw; +} + +void +init_user_info () +{ + /* Find the user's real name by opening the process token and + looking up the name associated with the user-sid in that token. + + Use the relative portion of the identifier authority value from + the user-sid as the user id value (same for group id using the + primary group sid from the process token). */ + + char user_sid[256], name[256], domain[256]; + DWORD length = sizeof (name), dlength = sizeof (domain), trash; + HANDLE token = NULL; + SID_NAME_USE user_type; + + if (OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &token) + && GetTokenInformation (token, TokenUser, + (PVOID) user_sid, sizeof (user_sid), &trash) + && LookupAccountSid (NULL, *((PSID *) user_sid), name, &length, + domain, &dlength, &user_type)) + { + strcpy (the_passwd.pw_name, name); + /* Determine a reasonable uid value. */ + if (stricmp ("administrator", name) == 0) + { + the_passwd.pw_uid = 0; + the_passwd.pw_gid = 0; + } + else + { + SID_IDENTIFIER_AUTHORITY * pSIA; + + pSIA = GetSidIdentifierAuthority (*((PSID *) user_sid)); + /* I believe the relative portion is the last 4 bytes (of 6) + with msb first. */ + the_passwd.pw_uid = ((pSIA->Value[2] << 24) + + (pSIA->Value[3] << 16) + + (pSIA->Value[4] << 8) + + (pSIA->Value[5] << 0)); + /* restrict to conventional uid range for normal users */ + the_passwd.pw_uid = the_passwd.pw_uid % 60001; + + /* Get group id */ + if (GetTokenInformation (token, TokenPrimaryGroup, + (PVOID) user_sid, sizeof (user_sid), &trash)) + { + SID_IDENTIFIER_AUTHORITY * pSIA; + + pSIA = GetSidIdentifierAuthority (*((PSID *) user_sid)); + the_passwd.pw_gid = ((pSIA->Value[2] << 24) + + (pSIA->Value[3] << 16) + + (pSIA->Value[4] << 8) + + (pSIA->Value[5] << 0)); + /* I don't know if this is necessary, but for safety... */ + the_passwd.pw_gid = the_passwd.pw_gid % 60001; + } + else + the_passwd.pw_gid = the_passwd.pw_uid; + } + } + /* If security calls are not supported (presumably because we + are running under Windows 95), fallback to this. */ + else if (GetUserName (name, &length)) + { + strcpy (the_passwd.pw_name, name); + if (stricmp ("administrator", name) == 0) + the_passwd.pw_uid = 0; + else + the_passwd.pw_uid = 123; + the_passwd.pw_gid = the_passwd.pw_uid; + } + else + { + strcpy (the_passwd.pw_name, "unknown"); + the_passwd.pw_uid = 123; + the_passwd.pw_gid = 123; + } + + /* Ensure HOME and SHELL are defined. */ + if (getenv ("HOME") == NULL) + putenv ("HOME=c:/"); + if (getenv ("SHELL") == NULL) + putenv ((GetVersion () & 0x80000000) ? "SHELL=command" : "SHELL=cmd"); + + /* Set dir and shell from environment variables. */ + strcpy (the_passwd.pw_dir, getenv ("HOME")); + strcpy (the_passwd.pw_shell, getenv ("SHELL")); + + if (token) + CloseHandle (token); +} + +int +random () +{ + /* rand () on NT gives us 15 random bits...hack together 30 bits. */ + return ((rand () << 15) | rand ()); +} + +void +srandom (int seed) +{ + srand (seed); +} + +/* Normalize filename by converting all path separators to + the specified separator. Also conditionally convert upper + case path name components to lower case. */ + +static void +normalize_filename (fp, path_sep) + register char *fp; + char path_sep; +{ + char sep; + char *elem; + + /* Always lower-case drive letters a-z, even if the filesystem + preserves case in filenames. + This is so filenames can be compared by string comparison + functions that are case-sensitive. Even case-preserving filesystems + do not distinguish case in drive letters. */ + if (fp[1] == ':' && *fp >= 'A' && *fp <= 'Z') + { + *fp += 'a' - 'A'; + fp += 2; + } + + if (NILP (Vwin32_downcase_file_names)) + { + while (*fp) + { + if (*fp == '/' || *fp == '\\') + *fp = path_sep; + fp++; + } + return; + } + + sep = path_sep; /* convert to this path separator */ + elem = fp; /* start of current path element */ + + do { + if (*fp >= 'a' && *fp <= 'z') + elem = 0; /* don't convert this element */ + + if (*fp == 0 || *fp == ':') + { + sep = *fp; /* restore current separator (or 0) */ + *fp = '/'; /* after conversion of this element */ + } + + if (*fp == '/' || *fp == '\\') + { + if (elem && elem != fp) + { + *fp = 0; /* temporary end of string */ + _strlwr (elem); /* while we convert to lower case */ + } + *fp = sep; /* convert (or restore) path separator */ + elem = fp + 1; /* next element starts after separator */ + sep = path_sep; + } + } while (*fp++); +} + +/* Destructively turn backslashes into slashes. */ +void +dostounix_filename (p) + register char *p; +{ + normalize_filename (p, '/'); +} + +/* Destructively turn slashes into backslashes. */ +void +unixtodos_filename (p) + register char *p; +{ + normalize_filename (p, '\\'); +} + +/* Remove all CR's that are followed by a LF. + (From msdos.c...probably should figure out a way to share it, + although this code isn't going to ever change.) */ +int +crlf_to_lf (n, buf) + register int n; + register unsigned char *buf; +{ + unsigned char *np = buf; + unsigned char *startp = buf; + unsigned char *endp = buf + n; + + if (n == 0) + return n; + while (buf < endp - 1) + { + if (*buf == 0x0d) + { + if (*(++buf) != 0x0a) + *np++ = 0x0d; + } + else + *np++ = *buf++; + } + if (buf < endp) + *np++ = *buf++; + return np - startp; +} + +/* Routines that are no-ops on NT but are defined to get Emacs to compile. */ + +int +sigsetmask (int signal_mask) +{ + return 0; +} + +int +sigblock (int sig) +{ + return 0; +} + +int +setpgrp (int pid, int gid) +{ + return 0; +} + +int +alarm (int seconds) +{ + return 0; +} + +int +unrequest_sigio (void) +{ + return 0; +} + +int +request_sigio (void) +{ + return 0; +} + +#define REG_ROOT "SOFTWARE\\GNU\\Emacs" + +LPBYTE +nt_get_resource (key, lpdwtype) + char *key; + LPDWORD lpdwtype; +{ + LPBYTE lpvalue; + HKEY hrootkey = NULL; + DWORD cbData; + BOOL ok = FALSE; + + /* Check both the current user and the local machine to see if + we have any resources. */ + + if (RegOpenKeyEx (HKEY_CURRENT_USER, REG_ROOT, 0, KEY_READ, &hrootkey) == ERROR_SUCCESS) + { + lpvalue = NULL; + + if (RegQueryValueEx (hrootkey, key, NULL, NULL, NULL, &cbData) == ERROR_SUCCESS + && (lpvalue = (LPBYTE) xmalloc (cbData)) != NULL + && RegQueryValueEx (hrootkey, key, NULL, lpdwtype, lpvalue, &cbData) == ERROR_SUCCESS) + { + return (lpvalue); + } + + if (lpvalue) xfree (lpvalue); + + RegCloseKey (hrootkey); + } + + if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, REG_ROOT, 0, KEY_READ, &hrootkey) == ERROR_SUCCESS) + { + lpvalue = NULL; + + if (RegQueryValueEx (hrootkey, key, NULL, NULL, NULL, &cbData) == ERROR_SUCCESS && + (lpvalue = (LPBYTE) xmalloc (cbData)) != NULL && + RegQueryValueEx (hrootkey, key, NULL, lpdwtype, lpvalue, &cbData) == ERROR_SUCCESS) + { + return (lpvalue); + } + + if (lpvalue) xfree (lpvalue); + + RegCloseKey (hrootkey); + } + + return (NULL); +} + +void +init_environment () +{ + /* Check for environment variables and use registry if they don't exist */ + { + int i; + LPBYTE lpval; + DWORD dwType; + + static char * env_vars[] = + { + "HOME", + "PRELOAD_WINSOCK", + "emacs_dir", + "EMACSLOADPATH", + "SHELL", + "EMACSDATA", + "EMACSPATH", + "EMACSLOCKDIR", + "INFOPATH", + "EMACSDOC", + "TERM", + }; + + for (i = 0; i < (sizeof (env_vars) / sizeof (env_vars[0])); i++) + { + if (!getenv (env_vars[i]) && + (lpval = nt_get_resource (env_vars[i], &dwType)) != NULL) + { + if (dwType == REG_EXPAND_SZ) + { + char buf1[500], buf2[500]; + + ExpandEnvironmentStrings ((LPSTR) lpval, buf1, 500); + _snprintf (buf2, 499, "%s=%s", env_vars[i], buf1); + putenv (strdup (buf2)); + } + else if (dwType == REG_SZ) + { + char buf[500]; + + _snprintf (buf, 499, "%s=%s", env_vars[i], lpval); + putenv (strdup (buf)); + } + + xfree (lpval); + } + } + } + + init_user_info (); +} + +/* We don't have scripts to automatically determine the system configuration + for Emacs before it's compiled, and we don't want to have to make the + user enter it, so we define EMACS_CONFIGURATION to invoke this runtime + routine. */ + +static char configuration_buffer[32]; + +char * +get_emacs_configuration (void) +{ + char *arch, *oem, *os; + + /* Determine the processor type. */ + switch (get_processor_type ()) + { + +#ifdef PROCESSOR_INTEL_386 + case PROCESSOR_INTEL_386: + case PROCESSOR_INTEL_486: + case PROCESSOR_INTEL_PENTIUM: + arch = "i386"; + break; +#endif + +#ifdef PROCESSOR_INTEL_860 + case PROCESSOR_INTEL_860: + arch = "i860"; + break; +#endif + +#ifdef PROCESSOR_MIPS_R2000 + case PROCESSOR_MIPS_R2000: + case PROCESSOR_MIPS_R3000: + case PROCESSOR_MIPS_R4000: + arch = "mips"; + break; +#endif + +#ifdef PROCESSOR_ALPHA_21064 + case PROCESSOR_ALPHA_21064: + arch = "alpha"; + break; +#endif + + default: + arch = "unknown"; + break; + } + + /* Let oem be "*" until we figure out how to decode the OEM field. */ + oem = "*"; + + os = (GetVersion () & 0x80000000) ? "win95" : "nt"; + + sprintf (configuration_buffer, "%s-%s-%s%d.%d", arch, oem, os, + get_nt_major_version (), get_nt_minor_version ()); + return configuration_buffer; +} + +#ifndef HAVE_X_WINDOWS +/* X11R6 on NT provides the single parameter version of this command. */ + +#include <sys/timeb.h> + +/* Emulate gettimeofday (Ulrich Leodolter, 1/11/95). */ +void +gettimeofday (struct timeval *tv, struct timezone *tz) +{ + struct _timeb tb; + _ftime (&tb); + + tv->tv_sec = tb.time; + tv->tv_usec = tb.millitm * 1000L; + if (tz) + { + tz->tz_minuteswest = tb.timezone; /* minutes west of Greenwich */ + tz->tz_dsttime = tb.dstflag; /* type of dst correction */ + } +} + +#endif /* HAVE_X_WINDOWS */ + +/* ------------------------------------------------------------------------- */ +/* IO support and wrapper functions for Win32 API. */ +/* ------------------------------------------------------------------------- */ + +/* Place a wrapper around the MSVC version of ctime. It returns NULL + on network directories, so we handle that case here. + (Ulrich Leodolter, 1/11/95). */ +char * +sys_ctime (const time_t *t) +{ + char *str = (char *) ctime (t); + return (str ? str : "Sun Jan 01 00:00:00 1970"); +} + +/* Emulate sleep...we could have done this with a define, but that + would necessitate including windows.h in the files that used it. + This is much easier. */ + +#ifndef HAVE_X_WINDOWS +void +sys_sleep (int seconds) +{ + Sleep (seconds * 1000); +} +#endif + +/* Internal MSVC data and functions for low-level descriptor munging */ +#if (_MSC_VER == 900) +extern char _osfile[]; +#endif +extern int __cdecl _set_osfhnd (int fd, long h); +extern int __cdecl _free_osfhnd (int fd); + +/* parallel array of private info on file handles */ +filedesc fd_info [ MAXDESC ]; + +static struct { + DWORD serialnum; + DWORD maxcomp; + DWORD flags; + char name[32]; + char type[32]; +} volume_info; + +/* Get information on the volume where name is held; set path pointer to + start of pathname in name (past UNC header\volume header if present). */ +int +get_volume_info (const char * name, const char ** pPath) +{ + char temp[MAX_PATH]; + char *rootname = NULL; /* default to current volume */ + + if (name == NULL) + return FALSE; + + /* find the root name of the volume if given */ + if (isalpha (name[0]) && name[1] == ':') + { + rootname = temp; + temp[0] = *name++; + temp[1] = *name++; + temp[2] = '\\'; + temp[3] = 0; + } + else if (IS_DIRECTORY_SEP (name[0]) && IS_DIRECTORY_SEP (name[1])) + { + char *str = temp; + int slashes = 4; + rootname = temp; + do + { + if (IS_DIRECTORY_SEP (*name) && --slashes == 0) + break; + *str++ = *name++; + } + while ( *name ); + + *str++ = '\\'; + *str = 0; + } + + if (pPath) + *pPath = name; + + if (GetVolumeInformation (rootname, + volume_info.name, 32, + &volume_info.serialnum, + &volume_info.maxcomp, + &volume_info.flags, + volume_info.type, 32)) + { + return TRUE; + } + return FALSE; +} + +/* Determine if volume is FAT format (ie. only supports short 8.3 + names); also set path pointer to start of pathname in name. */ +int +is_fat_volume (const char * name, const char ** pPath) +{ + if (get_volume_info (name, pPath)) + return (volume_info.maxcomp == 12); + return FALSE; +} + +/* Map filename to a legal 8.3 name if necessary. */ +const char * +map_win32_filename (const char * name, const char ** pPath) +{ + static char shortname[MAX_PATH]; + char * str = shortname; + char c; + char * path; + + if (is_fat_volume (name, &path)) /* truncate to 8.3 */ + { + register int left = 8; /* maximum number of chars in part */ + register int extn = 0; /* extension added? */ + register int dots = 2; /* maximum number of dots allowed */ + + while (name < path) + *str++ = *name++; /* skip past UNC header */ + + while ((c = *name++)) + { + switch ( c ) + { + case '\\': + case '/': + *str++ = '\\'; + extn = 0; /* reset extension flags */ + dots = 2; /* max 2 dots */ + left = 8; /* max length 8 for main part */ + break; + case ':': + *str++ = ':'; + extn = 0; /* reset extension flags */ + dots = 2; /* max 2 dots */ + left = 8; /* max length 8 for main part */ + break; + case '.': + if ( dots ) + { + /* Convert path components of the form .xxx to _xxx, + but leave . and .. as they are. This allows .emacs + to be read as _emacs, for example. */ + + if (! *name || + *name == '.' || + IS_DIRECTORY_SEP (*name)) + { + *str++ = '.'; + dots--; + } + else + { + *str++ = '_'; + left--; + dots = 0; + } + } + else if ( !extn ) + { + *str++ = '.'; + extn = 1; /* we've got an extension */ + left = 3; /* 3 chars in extension */ + } + else + { + /* any embedded dots after the first are converted to _ */ + *str++ = '_'; + } + break; + case '~': + case '#': /* don't lose these, they're important */ + if ( ! left ) + str[-1] = c; /* replace last character of part */ + /* FALLTHRU */ + default: + if ( left ) + { + *str++ = tolower (c); /* map to lower case (looks nicer) */ + left--; + dots = 0; /* started a path component */ + } + break; + } + } + *str = '\0'; + } + else + { + strcpy (shortname, name); + unixtodos_filename (shortname); + } + + if (pPath) + *pPath = shortname + (path - name); + + return shortname; +} + + +/* Shadow some MSVC runtime functions to map requests for long filenames + to reasonable short names if necessary. This was originally added to + permit running Emacs on NT 3.1 on a FAT partition, which doesn't support + long file names. */ + +int +sys_access (const char * path, int mode) +{ + return _access (map_win32_filename (path, NULL), mode); +} + +int +sys_chdir (const char * path) +{ + return _chdir (map_win32_filename (path, NULL)); +} + +int +sys_chmod (const char * path, int mode) +{ + return _chmod (map_win32_filename (path, NULL), mode); +} + +int +sys_creat (const char * path, int mode) +{ + return _creat (map_win32_filename (path, NULL), mode); +} + +FILE * +sys_fopen(const char * path, const char * mode) +{ + int fd; + int oflag; + const char * mode_save = mode; + + /* Force all file handles to be non-inheritable. This is necessary to + ensure child processes don't unwittingly inherit handles that might + prevent future file access. */ + + if (mode[0] == 'r') + oflag = O_RDONLY; + else if (mode[0] == 'w' || mode[0] == 'a') + oflag = O_WRONLY | O_CREAT | O_TRUNC; + else + return NULL; + + /* Only do simplistic option parsing. */ + while (*++mode) + if (mode[0] == '+') + { + oflag &= ~(O_RDONLY | O_WRONLY); + oflag |= O_RDWR; + } + else if (mode[0] == 'b') + { + oflag &= ~O_TEXT; + oflag |= O_BINARY; + } + else if (mode[0] == 't') + { + oflag &= ~O_BINARY; + oflag |= O_TEXT; + } + else break; + + fd = _open (map_win32_filename (path, NULL), oflag | _O_NOINHERIT, 0644); + if (fd < 0) + return NULL; + + return fdopen (fd, mode_save); +} + +int +sys_link (const char * path1, const char * path2) +{ + errno = EINVAL; + return -1; +} + +int +sys_mkdir (const char * path) +{ + return _mkdir (map_win32_filename (path, NULL)); +} + +/* Because of long name mapping issues, we need to implement this + ourselves. Also, MSVC's _mktemp returns NULL when it can't generate + a unique name, instead of setting the input template to an empty + string. + + Standard algorithm seems to be use pid or tid with a letter on the + front (in place of the 6 X's) and cycle through the letters to find a + unique name. We extend that to allow any reasonable character as the + first of the 6 X's. */ +char * +sys_mktemp (char * template) +{ + char * p; + int i; + unsigned uid = GetCurrentThreadId (); + static char first_char[] = "abcdefghijklmnopqrstuvwyz0123456789!%-_@#"; + + if (template == NULL) + return NULL; + p = template + strlen (template); + i = 5; + /* replace up to the last 5 X's with uid in decimal */ + while (--p >= template && p[0] == 'X' && --i >= 0) + { + p[0] = '0' + uid % 10; + uid /= 10; + } + + if (i < 0 && p[0] == 'X') + { + i = 0; + do + { + int save_errno = errno; + p[0] = first_char[i]; + if (sys_access (template, 0) < 0) + { + errno = save_errno; + return template; + } + } + while (++i < sizeof (first_char)); + } + + /* Template is badly formed or else we can't generate a unique name, + so return empty string */ + template[0] = 0; + return template; +} + +int +sys_open (const char * path, int oflag, int mode) +{ + /* Force all file handles to be non-inheritable. */ + return _open (map_win32_filename (path, NULL), oflag | _O_NOINHERIT, mode); +} + +int +sys_rename (const char * oldname, const char * newname) +{ + char temp[MAX_PATH]; + DWORD attr; + + /* MoveFile on Win95 doesn't correctly change the short file name + alias in a number of circumstances (it is not easy to predict when + just by looking at oldname and newname, unfortunately). In these + cases, renaming through a temporary name avoids the problem. + + A second problem on Win95 is that renaming through a temp name when + newname is uppercase fails (the final long name ends up in + lowercase, although the short alias might be uppercase) UNLESS the + long temp name is not 8.3. + + So, on Win95 we always rename through a temp name, and we make sure + the temp name has a long extension to ensure correct renaming. */ + + strcpy (temp, map_win32_filename (oldname, NULL)); + + if (GetVersion () & 0x80000000) + { + char * p; + + if (p = strrchr (temp, '\\')) + p++; + else + p = temp; + strcpy (p, "__XXXXXX"); + sys_mktemp (temp); + /* Force temp name to require a manufactured 8.3 alias - this + seems to make the second rename work properly. */ + strcat (temp, ".long"); + if (rename (map_win32_filename (oldname, NULL), temp) < 0) + return -1; + } + + /* Emulate Unix behaviour - newname is deleted if it already exists + (at least if it is a file; don't do this for directories). + However, don't do this if we are just changing the case of the file + name - we will end up deleting the file we are trying to rename! */ + newname = map_win32_filename (newname, NULL); + if (stricmp (newname, temp) != 0 + && (attr = GetFileAttributes (newname)) != -1 + && (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) + { + _chmod (newname, 0666); + _unlink (newname); + } + + return rename (temp, newname); +} + +int +sys_rmdir (const char * path) +{ + return _rmdir (map_win32_filename (path, NULL)); +} + +int +sys_unlink (const char * path) +{ + return _unlink (map_win32_filename (path, NULL)); +} + +static FILETIME utc_base_ft; +static long double utc_base; +static int init = 0; + +static time_t +convert_time (FILETIME ft) +{ + long double ret; + + if (!init) + { + /* Determine the delta between 1-Jan-1601 and 1-Jan-1970. */ + SYSTEMTIME st; + + st.wYear = 1970; + st.wMonth = 1; + st.wDay = 1; + st.wHour = 0; + st.wMinute = 0; + st.wSecond = 0; + st.wMilliseconds = 0; + + SystemTimeToFileTime (&st, &utc_base_ft); + utc_base = (long double) utc_base_ft.dwHighDateTime + * 4096 * 1024 * 1024 + utc_base_ft.dwLowDateTime; + init = 1; + } + + if (CompareFileTime (&ft, &utc_base_ft) < 0) + return 0; + + ret = (long double) ft.dwHighDateTime * 4096 * 1024 * 1024 + ft.dwLowDateTime; + ret -= utc_base; + return (time_t) (ret * 1e-7); +} + +#if 0 +/* in case we ever have need of this */ +void +convert_from_time_t (time_t time, FILETIME * pft) +{ + long double tmp; + + if (!init) + { + /* Determine the delta between 1-Jan-1601 and 1-Jan-1970. */ + SYSTEMTIME st; + + st.wYear = 1970; + st.wMonth = 1; + st.wDay = 1; + st.wHour = 0; + st.wMinute = 0; + st.wSecond = 0; + st.wMilliseconds = 0; + + SystemTimeToFileTime (&st, &utc_base_ft); + utc_base = (long double) utc_base_ft.dwHighDateTime + * 4096 * 1024 * 1024 + utc_base_ft.dwLowDateTime; + init = 1; + } + + /* time in 100ns units since 1-Jan-1601 */ + tmp = (long double) time * 1e7 + utc_base; + pft->dwHighDateTime = (DWORD) (tmp / (4096.0 * 1024 * 1024)); + pft->dwLowDateTime = (DWORD) (tmp - pft->dwHighDateTime); +} +#endif + +/* "PJW" algorithm (see the "Dragon" compiler book). */ +static unsigned +hashval (const char * str) +{ + unsigned h = 0; + unsigned g; + while (*str) + { + h = (h << 4) + *str++; + if ((g = h & 0xf0000000) != 0) + h = (h ^ (g >> 24)) & 0x0fffffff; + } + return h; +} + +/* Return the hash value of the canonical pathname, excluding the + drive/UNC header, to get a hopefully unique inode number. */ +static _ino_t +generate_inode_val (const char * name) +{ + char fullname[ MAX_PATH ]; + char * p; + unsigned hash; + + GetFullPathName (name, sizeof (fullname), fullname, &p); + get_volume_info (fullname, &p); + /* Normal Win32 filesystems are still case insensitive. */ + _strlwr (p); + hash = hashval (p); + return (_ino_t) (hash ^ (hash >> 16)); +} + +/* MSVC stat function can't cope with UNC names and has other bugs, so + replace it with our own. This also allows us to calculate consistent + inode values without hacks in the main Emacs code. */ +int +stat (const char * path, struct stat * buf) +{ + char * name; + WIN32_FIND_DATA wfd; + HANDLE fh; + int permission; + int len; + int rootdir = FALSE; + + if (path == NULL || buf == NULL) + { + errno = EFAULT; + return -1; + } + + name = (char *) map_win32_filename (path, &path); + /* must be valid filename, no wild cards */ + if (strchr (name, '*') || strchr (name, '?')) + { + errno = ENOENT; + return -1; + } + + /* Remove trailing directory separator, unless name is the root + directory of a drive or UNC volume in which case ensure there + is a trailing separator. */ + len = strlen (name); + rootdir = (path >= name + len - 1 + && (IS_DIRECTORY_SEP (*path) || *path == 0)); + name = strcpy (alloca (len + 2), name); + + if (rootdir) + { + if (!IS_DIRECTORY_SEP (name[len-1])) + strcat (name, "\\"); + if (GetDriveType (name) < 2) + { + errno = ENOENT; + return -1; + } + memset (&wfd, 0, sizeof (wfd)); + wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; + wfd.ftCreationTime = utc_base_ft; + wfd.ftLastAccessTime = utc_base_ft; + wfd.ftLastWriteTime = utc_base_ft; + strcpy (wfd.cFileName, name); + } + else + { + if (IS_DIRECTORY_SEP (name[len-1])) + name[len - 1] = 0; + fh = FindFirstFile (name, &wfd); + if (fh == INVALID_HANDLE_VALUE) + { + errno = ENOENT; + return -1; + } + FindClose (fh); + } + + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + buf->st_mode = _S_IFDIR; + buf->st_nlink = 2; /* doesn't really matter */ + } + else + { +#if 0 + /* This is more accurate in terms of gettting the correct number + of links, but is quite slow (it is noticable when Emacs is + making a list of file name completions). */ + BY_HANDLE_FILE_INFORMATION info; + + fh = CreateFile (name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + if (GetFileInformationByHandle (fh, &info)) + { + switch (GetFileType (fh)) + { + case FILE_TYPE_DISK: + buf->st_mode = _S_IFREG; + break; + case FILE_TYPE_PIPE: + buf->st_mode = _S_IFIFO; + break; + case FILE_TYPE_CHAR: + case FILE_TYPE_UNKNOWN: + default: + buf->st_mode = _S_IFCHR; + } + buf->st_nlink = info.nNumberOfLinks; + /* Could use file index, but this is not guaranteed to be + unique unless we keep a handle open all the time. */ + /* buf->st_ino = info.nFileIndexLow ^ info.nFileIndexHigh; */ + CloseHandle (fh); + } + else + { + errno = EACCES; + return -1; + } +#else + buf->st_mode = _S_IFREG; + buf->st_nlink = 1; +#endif + } + + /* consider files to belong to current user */ + buf->st_uid = the_passwd.pw_uid; + buf->st_gid = the_passwd.pw_gid; + + /* volume_info is set indirectly by map_win32_filename */ + buf->st_dev = volume_info.serialnum; + buf->st_rdev = volume_info.serialnum; + + buf->st_ino = generate_inode_val (name); + + buf->st_size = wfd.nFileSizeLow; + + /* Convert timestamps to Unix format. */ + buf->st_mtime = convert_time (wfd.ftLastWriteTime); + buf->st_atime = convert_time (wfd.ftLastAccessTime); + if (buf->st_atime == 0) buf->st_atime = buf->st_mtime; + buf->st_ctime = convert_time (wfd.ftCreationTime); + if (buf->st_ctime == 0) buf->st_ctime = buf->st_mtime; + + /* determine rwx permissions */ + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_READONLY) + permission = _S_IREAD; + else + permission = _S_IREAD | _S_IWRITE; + + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + permission |= _S_IEXEC; + else + { + char * p = strrchr (name, '.'); + if (p != NULL && + (stricmp (p, ".exe") == 0 || + stricmp (p, ".com") == 0 || + stricmp (p, ".bat") == 0 || + stricmp (p, ".cmd") == 0)) + permission |= _S_IEXEC; + } + + buf->st_mode |= permission | (permission >> 3) | (permission >> 6); + + return 0; +} + +#ifdef HAVE_SOCKETS + +/* Wrappers for winsock functions to map between our file descriptors + and winsock's handles; also set h_errno for convenience. + + To allow Emacs to run on systems which don't have winsock support + installed, we dynamically link to winsock on startup if present, and + otherwise provide the minimum necessary functionality + (eg. gethostname). */ + +/* function pointers for relevant socket functions */ +int (PASCAL *pfn_WSAStartup) (WORD wVersionRequired, LPWSADATA lpWSAData); +void (PASCAL *pfn_WSASetLastError) (int iError); +int (PASCAL *pfn_WSAGetLastError) (void); +int (PASCAL *pfn_socket) (int af, int type, int protocol); +int (PASCAL *pfn_bind) (SOCKET s, const struct sockaddr *addr, int namelen); +int (PASCAL *pfn_connect) (SOCKET s, const struct sockaddr *addr, int namelen); +int (PASCAL *pfn_ioctlsocket) (SOCKET s, long cmd, u_long *argp); +int (PASCAL *pfn_recv) (SOCKET s, char * buf, int len, int flags); +int (PASCAL *pfn_send) (SOCKET s, const char * buf, int len, int flags); +int (PASCAL *pfn_closesocket) (SOCKET s); +int (PASCAL *pfn_shutdown) (SOCKET s, int how); +int (PASCAL *pfn_WSACleanup) (void); + +u_short (PASCAL *pfn_htons) (u_short hostshort); +u_short (PASCAL *pfn_ntohs) (u_short netshort); +unsigned long (PASCAL *pfn_inet_addr) (const char * cp); +int (PASCAL *pfn_gethostname) (char * name, int namelen); +struct hostent * (PASCAL *pfn_gethostbyname) (const char * name); +struct servent * (PASCAL *pfn_getservbyname) (const char * name, const char * proto); + +/* SetHandleInformation is only needed to make sockets non-inheritable. */ +BOOL (WINAPI *pfn_SetHandleInformation) (HANDLE object, DWORD mask, DWORD flags); +#ifndef HANDLE_FLAG_INHERIT +#define HANDLE_FLAG_INHERIT 1 +#endif + +HANDLE winsock_lib; +static int winsock_inuse; + +BOOL +term_winsock (void) +{ + if (winsock_lib != NULL && winsock_inuse == 0) + { + /* Not sure what would cause WSAENETDOWN, or even if it can happen + after WSAStartup returns successfully, but it seems reasonable + to allow unloading winsock anyway in that case. */ + if (pfn_WSACleanup () == 0 || + pfn_WSAGetLastError () == WSAENETDOWN) + { + if (FreeLibrary (winsock_lib)) + winsock_lib = NULL; + return TRUE; + } + } + return FALSE; +} + +BOOL +init_winsock (int load_now) +{ + WSADATA winsockData; + + if (winsock_lib != NULL) + return TRUE; + + pfn_SetHandleInformation = NULL; + pfn_SetHandleInformation + = (void *) GetProcAddress (GetModuleHandle ("kernel32.dll"), + "SetHandleInformation"); + + winsock_lib = LoadLibrary ("wsock32.dll"); + + if (winsock_lib != NULL) + { + /* dynamically link to socket functions */ + +#define LOAD_PROC(fn) \ + if ((pfn_##fn = (void *) GetProcAddress (winsock_lib, #fn)) == NULL) \ + goto fail; + + LOAD_PROC( WSAStartup ); + LOAD_PROC( WSASetLastError ); + LOAD_PROC( WSAGetLastError ); + LOAD_PROC( socket ); + LOAD_PROC( bind ); + LOAD_PROC( connect ); + LOAD_PROC( ioctlsocket ); + LOAD_PROC( recv ); + LOAD_PROC( send ); + LOAD_PROC( closesocket ); + LOAD_PROC( shutdown ); + LOAD_PROC( htons ); + LOAD_PROC( ntohs ); + LOAD_PROC( inet_addr ); + LOAD_PROC( gethostname ); + LOAD_PROC( gethostbyname ); + LOAD_PROC( getservbyname ); + LOAD_PROC( WSACleanup ); + +#undef LOAD_PROC + + /* specify version 1.1 of winsock */ + if (pfn_WSAStartup (0x101, &winsockData) == 0) + { + if (winsockData.wVersion != 0x101) + goto fail; + + if (!load_now) + { + /* Report that winsock exists and is usable, but leave + socket functions disabled. I am assuming that calling + WSAStartup does not require any network interaction, + and in particular does not cause or require a dial-up + connection to be established. */ + + pfn_WSACleanup (); + FreeLibrary (winsock_lib); + winsock_lib = NULL; + } + winsock_inuse = 0; + return TRUE; + } + + fail: + FreeLibrary (winsock_lib); + winsock_lib = NULL; + } + + return FALSE; +} + + +int h_errno = 0; + +/* function to set h_errno for compatability; map winsock error codes to + normal system codes where they overlap (non-overlapping definitions + are already in <sys/socket.h> */ +static void set_errno () +{ + if (winsock_lib == NULL) + h_errno = EINVAL; + else + h_errno = pfn_WSAGetLastError (); + + switch (h_errno) + { + case WSAEACCES: h_errno = EACCES; break; + case WSAEBADF: h_errno = EBADF; break; + case WSAEFAULT: h_errno = EFAULT; break; + case WSAEINTR: h_errno = EINTR; break; + case WSAEINVAL: h_errno = EINVAL; break; + case WSAEMFILE: h_errno = EMFILE; break; + case WSAENAMETOOLONG: h_errno = ENAMETOOLONG; break; + case WSAENOTEMPTY: h_errno = ENOTEMPTY; break; + } + errno = h_errno; +} + +static void check_errno () +{ + if (h_errno == 0 && winsock_lib != NULL) + pfn_WSASetLastError (0); +} + +/* [andrewi 3-May-96] I've had conflicting results using both methods, + but I believe the method of keeping the socket handle separate (and + insuring it is not inheritable) is the correct one. */ + +//#define SOCK_REPLACE_HANDLE + +#ifdef SOCK_REPLACE_HANDLE +#define SOCK_HANDLE(fd) ((SOCKET) _get_osfhandle (fd)) +#else +#define SOCK_HANDLE(fd) ((SOCKET) fd_info[fd].hnd) +#endif + +int +sys_socket(int af, int type, int protocol) +{ + int fd; + long s; + child_process * cp; + + if (winsock_lib == NULL) + { + h_errno = ENETDOWN; + return INVALID_SOCKET; + } + + check_errno (); + + /* call the real socket function */ + s = (long) pfn_socket (af, type, protocol); + + if (s != INVALID_SOCKET) + { + /* Although under NT 3.5 _open_osfhandle will accept a socket + handle, if opened with SO_OPENTYPE == SO_SYNCHRONOUS_NONALERT, + that does not work under NT 3.1. However, we can get the same + effect by using a backdoor function to replace an existing + descriptor handle with the one we want. */ + + /* allocate a file descriptor (with appropriate flags) */ + fd = _open ("NUL:", _O_RDWR); + if (fd >= 0) + { +#ifdef SOCK_REPLACE_HANDLE + /* now replace handle to NUL with our socket handle */ + CloseHandle ((HANDLE) _get_osfhandle (fd)); + _free_osfhnd (fd); + _set_osfhnd (fd, s); + /* setmode (fd, _O_BINARY); */ +#else + /* Make a non-inheritable copy of the socket handle. */ + { + HANDLE parent; + HANDLE new_s = INVALID_HANDLE_VALUE; + + parent = GetCurrentProcess (); + + /* Apparently there is a bug in NT 3.51 with some service + packs, which prevents using DuplicateHandle to make a + socket handle non-inheritable (causes WSACleanup to + hang). The work-around is to use SetHandleInformation + instead if it is available and implemented. */ + if (!pfn_SetHandleInformation + || !pfn_SetHandleInformation ((HANDLE) s, + HANDLE_FLAG_INHERIT, + HANDLE_FLAG_INHERIT)) + { + DuplicateHandle (parent, + (HANDLE) s, + parent, + &new_s, + 0, + FALSE, + DUPLICATE_SAME_ACCESS); + pfn_closesocket (s); + s = (SOCKET) new_s; + } + fd_info[fd].hnd = (HANDLE) s; + } +#endif + + /* set our own internal flags */ + fd_info[fd].flags = FILE_SOCKET | FILE_BINARY | FILE_READ | FILE_WRITE; + + cp = new_child (); + if (cp) + { + cp->fd = fd; + cp->status = STATUS_READ_ACKNOWLEDGED; + + /* attach child_process to fd_info */ + if (fd_info[ fd ].cp != NULL) + { + DebPrint (("sys_socket: fd_info[%d] apparently in use!\n", fd)); + abort (); + } + + fd_info[ fd ].cp = cp; + + /* success! */ + winsock_inuse++; /* count open sockets */ + return fd; + } + + /* clean up */ + _close (fd); + } + pfn_closesocket (s); + h_errno = EMFILE; + } + set_errno (); + + return -1; +} + + +int +sys_bind (int s, const struct sockaddr * addr, int namelen) +{ + if (winsock_lib == NULL) + { + h_errno = ENOTSOCK; + return SOCKET_ERROR; + } + + check_errno (); + if (fd_info[s].flags & FILE_SOCKET) + { + int rc = pfn_bind (SOCK_HANDLE (s), addr, namelen); + if (rc == SOCKET_ERROR) + set_errno (); + return rc; + } + h_errno = ENOTSOCK; + return SOCKET_ERROR; +} + + +int +sys_connect (int s, const struct sockaddr * name, int namelen) +{ + if (winsock_lib == NULL) + { + h_errno = ENOTSOCK; + return SOCKET_ERROR; + } + + check_errno (); + if (fd_info[s].flags & FILE_SOCKET) + { + int rc = pfn_connect (SOCK_HANDLE (s), name, namelen); + if (rc == SOCKET_ERROR) + set_errno (); + return rc; + } + h_errno = ENOTSOCK; + return SOCKET_ERROR; +} + +u_short +sys_htons (u_short hostshort) +{ + return (winsock_lib != NULL) ? + pfn_htons (hostshort) : hostshort; +} + +u_short +sys_ntohs (u_short netshort) +{ + return (winsock_lib != NULL) ? + pfn_ntohs (netshort) : netshort; +} + +unsigned long +sys_inet_addr (const char * cp) +{ + return (winsock_lib != NULL) ? + pfn_inet_addr (cp) : INADDR_NONE; +} + +int +sys_gethostname (char * name, int namelen) +{ + if (winsock_lib != NULL) + return pfn_gethostname (name, namelen); + + if (namelen > MAX_COMPUTERNAME_LENGTH) + return !GetComputerName (name, &namelen); + + h_errno = EFAULT; + return SOCKET_ERROR; +} + +struct hostent * +sys_gethostbyname(const char * name) +{ + struct hostent * host; + + if (winsock_lib == NULL) + { + h_errno = ENETDOWN; + return NULL; + } + + check_errno (); + host = pfn_gethostbyname (name); + if (!host) + set_errno (); + return host; +} + +struct servent * +sys_getservbyname(const char * name, const char * proto) +{ + struct servent * serv; + + if (winsock_lib == NULL) + { + h_errno = ENETDOWN; + return NULL; + } + + check_errno (); + serv = pfn_getservbyname (name, proto); + if (!serv) + set_errno (); + return serv; +} + +#endif /* HAVE_SOCKETS */ + + +/* Shadow main io functions: we need to handle pipes and sockets more + intelligently, and implement non-blocking mode as well. */ + +int +sys_close (int fd) +{ + int rc; + + if (fd < 0 || fd >= MAXDESC) + { + errno = EBADF; + return -1; + } + + if (fd_info[fd].cp) + { + child_process * cp = fd_info[fd].cp; + + fd_info[fd].cp = NULL; + + if (CHILD_ACTIVE (cp)) + { + /* if last descriptor to active child_process then cleanup */ + int i; + for (i = 0; i < MAXDESC; i++) + { + if (i == fd) + continue; + if (fd_info[i].cp == cp) + break; + } + if (i == MAXDESC) + { +#ifdef HAVE_SOCKETS + if (fd_info[fd].flags & FILE_SOCKET) + { +#ifndef SOCK_REPLACE_HANDLE + if (winsock_lib == NULL) abort (); + + pfn_shutdown (SOCK_HANDLE (fd), 2); + rc = pfn_closesocket (SOCK_HANDLE (fd)); +#endif + winsock_inuse--; /* count open sockets */ + } +#endif + delete_child (cp); + } + } + } + + /* Note that sockets do not need special treatment here (at least on + NT and Win95 using the standard tcp/ip stacks) - it appears that + closesocket is equivalent to CloseHandle, which is to be expected + because socket handles are fully fledged kernel handles. */ + rc = _close (fd); + + if (rc == 0) + fd_info[fd].flags = 0; + + return rc; +} + +int +sys_dup (int fd) +{ + int new_fd; + + new_fd = _dup (fd); + if (new_fd >= 0) + { + /* duplicate our internal info as well */ + fd_info[new_fd] = fd_info[fd]; + } + return new_fd; +} + + +int +sys_dup2 (int src, int dst) +{ + int rc; + + if (dst < 0 || dst >= MAXDESC) + { + errno = EBADF; + return -1; + } + + /* make sure we close the destination first if it's a pipe or socket */ + if (src != dst && fd_info[dst].flags != 0) + sys_close (dst); + + rc = _dup2 (src, dst); + if (rc == 0) + { + /* duplicate our internal info as well */ + fd_info[dst] = fd_info[src]; + } + return rc; +} + +/* From callproc.c */ +extern Lisp_Object Vbinary_process_input; +extern Lisp_Object Vbinary_process_output; + +/* Unix pipe() has only one arg */ +int +sys_pipe (int * phandles) +{ + int rc; + unsigned flags; + child_process * cp; + + /* make pipe handles non-inheritable; when we spawn a child, + we replace the relevant handle with an inheritable one. */ + rc = _pipe (phandles, 0, _O_NOINHERIT); + + if (rc == 0) + { + /* set internal flags, and put read and write handles into binary + mode as necessary; if not in binary mode, set the MSVC internal + FDEV (0x40) flag to prevent _read from treating ^Z as eof (this + could otherwise allow Emacs to hang because it then waits + indefinitely for the child process to exit, when it might not be + finished). */ + flags = FILE_PIPE | FILE_READ; + if (!NILP (Vbinary_process_output)) + { + flags |= FILE_BINARY; + setmode (phandles[0], _O_BINARY); + } +#if (_MSC_VER == 900) + else + _osfile[phandles[0]] |= 0x40; +#endif + + fd_info[phandles[0]].flags = flags; + + flags = FILE_PIPE | FILE_WRITE; + if (!NILP (Vbinary_process_input)) + { + flags |= FILE_BINARY; + setmode (phandles[1], _O_BINARY); + } +#if (_MSC_VER == 900) + else + _osfile[phandles[1]] |= 0x40; +#endif + + fd_info[phandles[1]].flags = flags; + } + + return rc; +} + +/* From ntproc.c */ +extern Lisp_Object Vwin32_pipe_read_delay; + +/* Function to do blocking read of one byte, needed to implement + select. It is only allowed on sockets and pipes. */ +int +_sys_read_ahead (int fd) +{ + child_process * cp; + int rc; + + if (fd < 0 || fd >= MAXDESC) + return STATUS_READ_ERROR; + + cp = fd_info[fd].cp; + + if (cp == NULL || cp->fd != fd || cp->status != STATUS_READ_READY) + return STATUS_READ_ERROR; + + if ((fd_info[fd].flags & (FILE_PIPE | FILE_SOCKET)) == 0 + || (fd_info[fd].flags & FILE_READ) == 0) + { + DebPrint (("_sys_read_ahead: internal error: fd %d is not a pipe or socket!\n", fd)); + abort (); + } + + cp->status = STATUS_READ_IN_PROGRESS; + + if (fd_info[fd].flags & FILE_PIPE) + { + /* Use read to get CRLF translation */ + rc = _read (fd, &cp->chr, sizeof (char)); + + /* Give subprocess time to buffer some more output for us before + reporting that input is available; we need this because Win95 + connects DOS programs to pipes by making the pipe appear to be + the normal console stdout - as a result most DOS programs will + write to stdout without buffering, ie. one character at a + time. Even some Win32 programs do this - "dir" in a command + shell on NT is very slow if we don't do this. */ + if (rc > 0) + { + int wait = XINT (Vwin32_pipe_read_delay); + + if (wait > 0) + Sleep (wait); + else if (wait < 0) + while (++wait <= 0) + /* Yield remainder of our time slice, effectively giving a + temporary priority boost to the child process. */ + Sleep (0); + } + } +#ifdef HAVE_SOCKETS + else if (fd_info[fd].flags & FILE_SOCKET) + rc = pfn_recv (SOCK_HANDLE (fd), &cp->chr, sizeof (char), 0); +#endif + + if (rc == sizeof (char)) + cp->status = STATUS_READ_SUCCEEDED; + else + cp->status = STATUS_READ_FAILED; + + return cp->status; +} + +int +sys_read (int fd, char * buffer, unsigned int count) +{ + int nchars; + int extra = 0; + int to_read; + DWORD waiting; + + if (fd < 0 || fd >= MAXDESC) + { + errno = EBADF; + return -1; + } + + if (fd_info[fd].flags & (FILE_PIPE | FILE_SOCKET)) + { + child_process *cp = fd_info[fd].cp; + + if ((fd_info[fd].flags & FILE_READ) == 0) + { + errno = EBADF; + return -1; + } + + /* presence of a child_process structure means we are operating in + non-blocking mode - otherwise we just call _read directly. + Note that the child_process structure might be missing because + reap_subprocess has been called; in this case the pipe is + already broken, so calling _read on it is okay. */ + if (cp) + { + int current_status = cp->status; + + switch (current_status) + { + case STATUS_READ_FAILED: + case STATUS_READ_ERROR: + /* report normal EOF */ + return 0; + + case STATUS_READ_READY: + case STATUS_READ_IN_PROGRESS: + DebPrint (("sys_read called when read is in progress\n")); + errno = EWOULDBLOCK; + return -1; + + case STATUS_READ_SUCCEEDED: + /* consume read-ahead char */ + *buffer++ = cp->chr; + count--; + extra = 1; + cp->status = STATUS_READ_ACKNOWLEDGED; + ResetEvent (cp->char_avail); + + case STATUS_READ_ACKNOWLEDGED: + break; + + default: + DebPrint (("sys_read: bad status %d\n", current_status)); + errno = EBADF; + return -1; + } + + if (fd_info[fd].flags & FILE_PIPE) + { + PeekNamedPipe ((HANDLE) _get_osfhandle (fd), NULL, 0, NULL, &waiting, NULL); + to_read = min (waiting, (DWORD) count); + + /* Use read to get CRLF translation */ + nchars = _read (fd, buffer, to_read); + } +#ifdef HAVE_SOCKETS + else /* FILE_SOCKET */ + { + if (winsock_lib == NULL) abort (); + + /* do the equivalent of a non-blocking read */ + pfn_ioctlsocket (SOCK_HANDLE (fd), FIONREAD, &waiting); + if (waiting == 0 && extra == 0) + { + h_errno = errno = EWOULDBLOCK; + return -1; + } + + nchars = 0; + if (waiting) + { + /* always use binary mode for sockets */ + nchars = pfn_recv (SOCK_HANDLE (fd), buffer, count, 0); + if (nchars == SOCKET_ERROR) + { + DebPrint(("sys_read.recv failed with error %d on socket %ld\n", + pfn_WSAGetLastError (), SOCK_HANDLE (fd))); + if (extra == 0) + { + set_errno (); + return -1; + } + nchars = 0; + } + } + } +#endif + } + else + nchars = _read (fd, buffer, count); + } + else + nchars = _read (fd, buffer, count); + + return nchars + extra; +} + +/* For now, don't bother with a non-blocking mode */ +int +sys_write (int fd, const void * buffer, unsigned int count) +{ + int nchars; + + if (fd < 0 || fd >= MAXDESC) + { + errno = EBADF; + return -1; + } + + if (fd_info[fd].flags & (FILE_PIPE | FILE_SOCKET)) + if ((fd_info[fd].flags & FILE_WRITE) == 0) + { + errno = EBADF; + return -1; + } +#ifdef HAVE_SOCKETS + if (fd_info[fd].flags & FILE_SOCKET) + { + if (winsock_lib == NULL) abort (); + nchars = pfn_send (SOCK_HANDLE (fd), buffer, count, 0); + if (nchars == SOCKET_ERROR) + { + DebPrint(("sys_read.send failed with error %d on socket %ld\n", + pfn_WSAGetLastError (), SOCK_HANDLE (fd))); + set_errno (); + } + } + else +#endif + nchars = _write (fd, buffer, count); + + return nchars; +} + + +void +term_ntproc () +{ +#ifdef HAVE_SOCKETS + /* shutdown the socket interface if necessary */ + term_winsock (); +#endif +} + +extern BOOL dos_process_running; + +void +init_ntproc () +{ +#ifdef HAVE_SOCKETS + /* Initialise the socket interface now if available and requested by + the user by defining PRELOAD_WINSOCK; otherwise loading will be + delayed until open-network-stream is called (win32-has-winsock can + also be used to dynamically load or reload winsock). + + Conveniently, init_environment is called before us, so + PRELOAD_WINSOCK can be set in the registry. */ + + /* Always initialize this correctly. */ + winsock_lib = NULL; + + if (getenv ("PRELOAD_WINSOCK") != NULL) + init_winsock (TRUE); +#endif + + /* Initial preparation for subprocess support: replace our standard + handles with non-inheritable versions. */ + { + HANDLE parent; + HANDLE stdin_save = INVALID_HANDLE_VALUE; + HANDLE stdout_save = INVALID_HANDLE_VALUE; + HANDLE stderr_save = INVALID_HANDLE_VALUE; + + parent = GetCurrentProcess (); + + /* ignore errors when duplicating and closing; typically the + handles will be invalid when running as a gui program. */ + DuplicateHandle (parent, + GetStdHandle (STD_INPUT_HANDLE), + parent, + &stdin_save, + 0, + FALSE, + DUPLICATE_SAME_ACCESS); + + DuplicateHandle (parent, + GetStdHandle (STD_OUTPUT_HANDLE), + parent, + &stdout_save, + 0, + FALSE, + DUPLICATE_SAME_ACCESS); + + DuplicateHandle (parent, + GetStdHandle (STD_ERROR_HANDLE), + parent, + &stderr_save, + 0, + FALSE, + DUPLICATE_SAME_ACCESS); + + fclose (stdin); + fclose (stdout); + fclose (stderr); + + if (stdin_save != INVALID_HANDLE_VALUE) + _open_osfhandle ((long) stdin_save, O_TEXT); + else + _open ("nul", O_TEXT | O_NOINHERIT | O_RDONLY); + fdopen (0, "r"); + + if (stdout_save != INVALID_HANDLE_VALUE) + _open_osfhandle ((long) stdout_save, O_TEXT); + else + _open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY); + fdopen (1, "w"); + + if (stderr_save != INVALID_HANDLE_VALUE) + _open_osfhandle ((long) stderr_save, O_TEXT); + else + _open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY); + fdopen (2, "w"); + } + + /* Restrict Emacs to running only one DOS program at a time (with any + number of Win32 programs). This is to prevent the user from + running into problems with DOS programs being run in the same VDM + under both Windows 95 and Windows NT. + + Note that it is possible for Emacs to run DOS programs in separate + VDMs, but unfortunately the pipe implementation on Windows 95 then + fails to report when the DOS process exits (which is supposed to + break the pipe). Until this bug is fixed, or we can devise a + work-around, we must try to avoid letting the user start more than + one DOS program if possible. */ + + dos_process_running = FALSE; + + /* unfortunately, atexit depends on implementation of malloc */ + /* atexit (term_ntproc); */ + signal (SIGABRT, term_ntproc); +} + +#ifndef HAVE_TTY +Lisp_Object Vstdio_str; + +Lisp_Object +tty_semi_canonicalize_console_connection (Lisp_Object connection, + Error_behavior errb) +{ + return Vstdio_str; +} + +Lisp_Object +tty_canonicalize_console_connection (Lisp_Object connection, + Error_behavior errb) +{ + return Vstdio_str; +} + +Lisp_Object +tty_semi_canonicalize_device_connection (Lisp_Object connection, + Error_behavior errb) +{ + return Vstdio_str; +} + +Lisp_Object +tty_canonicalize_device_connection (Lisp_Object connection, + Error_behavior errb) +{ + return Vstdio_str; +} +#endif + +/* end of nt.c */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/nt.h Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,134 @@ +#ifndef _NT_H_ +#define _NT_H_ + +/* Support routines for the NT version of XEmacs. + Copyright (C) 1994 Free Software Foundation, Inc. + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Adapted for XEmacs by David Hobley <david@spook-le0.cia.com.au> */ + +/* #define FULL_DEBUG */ +#define EMACSDEBUG + +#ifdef EMACSDEBUG +#define DebPrint(stuff) _DebPrint stuff +#else +#define DebPrint(stuff) +#endif + +#define R_OK 4 +#define W_OK 2 +#define X_OK 1 +#define F_OK 0 + +/* File descriptor set emulation. */ + +/* MSVC runtime library has limit of 64 descriptors by default */ +#define FD_SETSIZE 64 +typedef struct { + unsigned int bits[FD_SETSIZE / 32]; +} fd_set; + +/* standard access macros */ +#define FD_SET(n, p) \ + do { \ + if ((n) < FD_SETSIZE) { \ + (p)->bits[(n)/32] |= (1 << (n)%32); \ + } \ + } while (0) +#define FD_CLR(n, p) \ + do { \ + if ((n) < FD_SETSIZE) { \ + (p)->bits[(n)/32] &= ~(1 << (n)%32); \ + } \ + } while (0) +#define FD_ISSET(n, p) ((n) < FD_SETSIZE ? ((p)->bits[(n)/32] & (1 << (n)%32)) : 0) +#define FD_ZERO(p) memset((p), 0, sizeof(fd_set)) + +#define SELECT_TYPE fd_set + +/* ------------------------------------------------------------------------- */ + +/* child_process.status values */ +enum { + STATUS_READ_ERROR = -1, + STATUS_READ_READY, + STATUS_READ_IN_PROGRESS, + STATUS_READ_FAILED, + STATUS_READ_SUCCEEDED, + STATUS_READ_ACKNOWLEDGED +}; + +/* This structure is used for both pipes and sockets; for + a socket, the process handle in pi is NULL. */ +typedef struct _child_process +{ + int fd; + int pid; + int is_dos_process; + HANDLE char_avail; + HANDLE char_consumed; + HANDLE thrd; + PROCESS_INFORMATION procinfo; + volatile int status; + char chr; +} child_process; + +#define MAXDESC FD_SETSIZE +#define MAX_CHILDREN MAXDESC/2 +#define CHILD_ACTIVE(cp) ((cp)->char_avail != NULL) + +/* parallel array of private info on file handles */ +typedef struct +{ + unsigned flags; + HANDLE hnd; + child_process * cp; +} filedesc; + +extern filedesc fd_info [ MAXDESC ]; + +/* fd_info flag definitions */ +#define FILE_READ 0x0001 +#define FILE_WRITE 0x0002 +#define FILE_BINARY 0x0010 +#define FILE_PIPE 0x0100 +#define FILE_SOCKET 0x0200 + +extern child_process * new_child (void); +extern void delete_child (child_process *cp); + +/* ------------------------------------------------------------------------- */ + + +/* Prepare our standard handles for proper inheritance by child processes. */ +extern void prepare_standard_handles (int in, int out, + int err, HANDLE handles[4]); + +/* Reset our standard handles to their original state. */ +extern void reset_standard_handles (int in, int out, + int err, HANDLE handles[4]); + +/* Return the string resource associated with KEY of type TYPE. */ +extern LPBYTE nt_get_resource (char * key, LPDWORD type); + +extern void init_ntproc (); +extern void term_ntproc (); + +#endif /* _NT_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ntheap.c Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,289 @@ +/* Heap management routines for XEmacs on Windows NT. + Copyright (C) 1994 Free Software Foundation, Inc. + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to the Free +Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. + + Geoff Voelker (voelker@cs.washington.edu) 7-29-94 */ + +/* Adapted for XEmacs by David Hobley <david@spook-le0.cia.com.au> */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> + +#include "ntheap.h" +#include "lisp.h" /* for VALMASK */ + +/* This gives us the page size and the size of the allocation unit on NT. */ +SYSTEM_INFO sysinfo_cache; +unsigned long syspage_mask = 0; + +/* These are defined to get Emacs to compile, but are not used. */ +int edata; +int etext; + +/* The major and minor versions of NT. */ +int nt_major_version; +int nt_minor_version; + +/* Cache information describing the NT system for later use. */ +void +cache_system_info (void) +{ + union + { + struct info + { + char major; + char minor; + short platform; + } info; + DWORD data; + } version; + + /* Cache the version of the operating system. */ + version.data = GetVersion (); + nt_major_version = version.info.major; + nt_minor_version = version.info.minor; + + /* Cache page size, allocation unit, processor type, etc. */ + GetSystemInfo (&sysinfo_cache); + syspage_mask = sysinfo_cache.dwPageSize - 1; +} + +/* Round ADDRESS up to be aligned with ALIGN. */ +unsigned char * +round_to_next (unsigned char *address, unsigned long align) +{ + unsigned long tmp; + + tmp = (unsigned long) address; + tmp = (tmp + align - 1) / align; + + return (unsigned char *) (tmp * align); +} + +/* Info for keeping track of our heap. */ +unsigned char *data_region_base = NULL; +unsigned char *data_region_end = NULL; +unsigned char *real_data_region_end = NULL; +unsigned long data_region_size = 0; +unsigned long reserved_heap_size = 0; + +/* The start of the data segment. */ +unsigned char * +get_data_start (void) +{ + return data_region_base; +} + +/* The end of the data segment. */ +unsigned char * +get_data_end (void) +{ + return data_region_end; +} + +static char * +allocate_heap (void) +{ + /* The base address for our GNU malloc heap is chosen in conjuction + with the link settings for temacs.exe which control the stack size, + the initial default process heap size and the executable image base + address. The link settings and the malloc heap base below must all + correspond; the relationship between these values depends on how NT + and Win95 arrange the virtual address space for a process (and on + the size of the code and data segments in temacs.exe). + + The most important thing is to make base address for the executable + image high enough to leave enough room between it and the 4MB floor + of the process address space on Win95 for the primary thread stack, + the process default heap, and other assorted odds and ends + (eg. environment strings, private system dll memory etc) that are + allocated before temacs has a chance to grab its malloc arena. The + malloc heap base can then be set several MB higher than the + executable image base, leaving enough room for the code and data + segments. + + Because some parts of Emacs can use rather a lot of stack space + (for instance, the regular expression routines can potentially + allocate several MB of stack space) we allow 8MB for the stack. + + Allowing 1MB for the default process heap, and 1MB for odds and + ends, we can base the executable at 16MB and still have a generous + safety margin. At the moment, the executable has about 810KB of + code (for x86) and about 550KB of data - on RISC platforms the code + size could be roughly double, so if we allow 4MB for the executable + we will have plenty of room for expansion. + + Thus we would like to set the malloc heap base to 20MB. However, + Win95 refuses to allocate the heap starting at this address, so we + set the base to 27MB to make it happy. Since Emacs now leaves + 28 bits available for pointers, this lets us use the remainder of + the region below the 256MB line for our malloc arena - 229MB is + still a pretty decent arena to play in! */ + + unsigned long base = 0x01B00000; /* 27MB */ + unsigned long end = 1 << VALBITS; /* 256MB */ + void *ptr = NULL; + +#if NTHEAP_PROBE_BASE /* This is never normally defined */ + /* Try various addresses looking for one the kernel will let us have. */ + while (!ptr && (base < end)) + { + reserved_heap_size = end - base; + ptr = VirtualAlloc ((void *) base, + get_reserved_heap_size (), + MEM_RESERVE, + PAGE_NOACCESS); + base += 0x00100000; /* 1MB increment */ + } +#else + reserved_heap_size = end - base; + ptr = VirtualAlloc ((void *) base, + get_reserved_heap_size (), + MEM_RESERVE, + PAGE_NOACCESS); +#endif + + return ptr; +} + + +/* Emulate Unix sbrk. */ +void * +sbrk (unsigned long increment) +{ + void *result; + long size = (long) increment; + + /* Allocate our heap if we haven't done so already. */ + if (!data_region_base) + { + data_region_base = allocate_heap (); + if (!data_region_base) + return NULL; + + /* Ensure that the addresses don't use the upper tag bits since + the Lisp type goes there. */ + if (((unsigned long) data_region_base & ~VALMASK) != 0) + { + printf ("Error: The heap was allocated in upper memory.\n"); + exit (1); + } + + data_region_end = data_region_base; + real_data_region_end = data_region_end; + data_region_size = get_reserved_heap_size (); + } + + result = data_region_end; + + /* If size is negative, shrink the heap by decommitting pages. */ + if (size < 0) + { + int new_size; + unsigned char *new_data_region_end; + + size = -size; + + /* Sanity checks. */ + if ((data_region_end - size) < data_region_base) + return NULL; + + /* We can only decommit full pages, so allow for + partial deallocation [cga]. */ + new_data_region_end = (data_region_end - size); + new_data_region_end = (unsigned char *) + ((long) (new_data_region_end + syspage_mask) & ~syspage_mask); + new_size = real_data_region_end - new_data_region_end; + real_data_region_end = new_data_region_end; + if (new_size > 0) + { + /* Decommit size bytes from the end of the heap. */ + if (!VirtualFree (real_data_region_end, new_size, MEM_DECOMMIT)) + return NULL; + } + + data_region_end -= size; + } + /* If size is positive, grow the heap by committing reserved pages. */ + else if (size > 0) + { + /* Sanity checks. */ + if ((data_region_end + size) > + (data_region_base + get_reserved_heap_size ())) + return NULL; + + /* Commit more of our heap. */ + if (VirtualAlloc (data_region_end, size, MEM_COMMIT, + PAGE_READWRITE) == NULL) + return NULL; + data_region_end += size; + + /* We really only commit full pages, so record where + the real end of committed memory is [cga]. */ + real_data_region_end = (unsigned char *) + ((long) (data_region_end + syspage_mask) & ~syspage_mask); + } + + return result; +} + +#ifndef CANNOT_DUMP + +/* Recreate the heap from the data that was dumped to the executable. + EXECUTABLE_PATH tells us where to find the executable. */ +void +recreate_heap (char *executable_path) +{ + unsigned char *tmp; + + /* First reserve the upper part of our heap. (We reserve first + because there have been problems in the past where doing the + mapping first has loaded DLLs into the VA space of our heap.) */ + tmp = VirtualAlloc ((void *) get_heap_end (), + get_reserved_heap_size () - get_committed_heap_size (), + MEM_RESERVE, + PAGE_NOACCESS); + if (!tmp) + exit (1); + + /* We read in the data for the .bss section from the executable + first and map in the heap from the executable second to prevent + any funny interactions between file I/O and file mapping. */ + read_in_bss (executable_path); + map_in_heap (executable_path); +} + +#endif /* CANNOT_DUMP */ + +/* Round the heap up to the given alignment. */ +void +round_heap (unsigned long align) +{ + unsigned long needs_to_be; + unsigned long need_to_alloc; + + needs_to_be = (unsigned long) round_to_next (get_heap_end (), align); + need_to_alloc = needs_to_be - (unsigned long) get_heap_end (); + + if (need_to_alloc) + sbrk (need_to_alloc); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ntheap.h Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,74 @@ +/* Heap management routines (including unexec) for XEmacs on Windows NT. + Copyright (C) 1994 Free Software Foundation, Inc. + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to the Free +Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. + + Geoff Voelker (voelker@cs.washington.edu) 7-29-94 */ + +/* Adapted for XEmacs by David Hobley <david@spook-le0.cia.com.au> */ + +#ifndef NTHEAP_H_ +#define NTHEAP_H_ + +#include <windows.h> + +/* + * Heap related stuff. + */ +#define get_reserved_heap_size() reserved_heap_size +#define get_committed_heap_size() (get_data_end () - get_data_start ()) +#define get_heap_start() get_data_start () +#define get_heap_end() get_data_end () +#define get_page_size() sysinfo_cache.dwPageSize +#define get_allocation_unit() sysinfo_cache.dwAllocationGranularity +#define get_processor_type() sysinfo_cache.dwProcessorType +#define get_nt_major_version() nt_major_version +#define get_nt_minor_version() nt_minor_version + +extern unsigned char *get_data_start(); +extern unsigned char *get_data_end(); +extern unsigned long data_region_size; +extern unsigned long reserved_heap_size; +extern SYSTEM_INFO sysinfo_cache; +extern BOOL need_to_recreate_heap; +extern int nt_major_version; +extern int nt_minor_version; + +/* Emulation of Unix sbrk(). */ +extern void *sbrk (unsigned long size); + +/* Recreate the heap created during dumping. */ +extern void recreate_heap (char *executable_path); + +/* Round the heap to this size. */ +extern void round_heap (unsigned long size); + +/* Load in the dumped .bss section. */ +extern void read_in_bss (char *name); + +/* Map in the dumped heap. */ +extern void map_in_heap (char *name); + +/* Cache system info, e.g., the NT page size. */ +extern void cache_system_info (void); + +/* Round ADDRESS up to be aligned with ALIGN. */ +extern unsigned char *round_to_next (unsigned char *address, + unsigned long align); + +#endif /* NTHEAP_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ntproc.c Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,1269 @@ +/* Process support for Windows NT port of XEMACS. + Copyright (C) 1992, 1995 Free Software Foundation, Inc. + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. + + Drew Bliss Oct 14, 1993 + Adapted from alarm.c by Tim Fleehart */ + +/* Adapted for XEmacs by David Hobley <david@spook-le0.cia.com.au> */ + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <io.h> +#include <fcntl.h> +#include <signal.h> + +/* must include CRT headers *before* config.h */ +#include "config.h" +#undef signal +#undef wait +#undef spawnve +#undef select +#undef kill + +#include <windows.h> + +#include "lisp.h" +#include "nt.h" +#include "systime.h" +#include "syswait.h" +#include "process.h" + +/* Control whether spawnve quotes arguments as necessary to ensure + correct parsing by child process. Because not all uses of spawnve + are careful about constructing argv arrays, we make this behaviour + conditional (off by default). */ +Lisp_Object Vwin32_quote_process_args; + +/* Time to sleep before reading from a subprocess output pipe - this + avoids the inefficiency of frequently reading small amounts of data. + This is primarily necessary for handling DOS processes on Windows 95, + but is useful for Win32 processes on both Win95 and NT as well. */ +Lisp_Object Vwin32_pipe_read_delay; + +/* Control conversion of upper case file names to lower case. + nil means no, t means yes. */ +Lisp_Object Vwin32_downcase_file_names; + +/* Keep track of whether we have already started a DOS program. */ +BOOL dos_process_running; + +#ifndef SYS_SIGLIST_DECLARED +extern char *sys_siglist[]; +#endif + +#ifdef EMACSDEBUG +void _DebPrint (const char *fmt, ...) +{ + char buf[1024]; + va_list args; + + va_start (args, fmt); + vsprintf (buf, fmt, args); + va_end (args); + OutputDebugString (buf); +} +#endif + +typedef void (_CALLBACK_ *signal_handler)(int); + +/* Signal handlers...SIG_DFL == 0 so this is initialized correctly. */ +static signal_handler sig_handlers[NSIG]; + +/* Fake signal implementation to record the SIGCHLD handler. */ +signal_handler +sys_signal (int sig, signal_handler handler) +{ + signal_handler old; + + if (sig != SIGCHLD) + { + errno = EINVAL; + return SIG_ERR; + } + old = sig_handlers[sig]; + sig_handlers[sig] = handler; + return old; +} + +/* Defined in <process.h> which conflicts with the local copy */ +#define _P_NOWAIT 1 + +/* Child process management list. */ +int child_proc_count = 0; +child_process child_procs[ MAX_CHILDREN ]; +child_process *dead_child = NULL; + +DWORD WINAPI reader_thread (void *arg); + +/* Find an unused process slot. */ +child_process * +new_child (void) +{ + child_process *cp; + DWORD id; + + for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--) + if (!CHILD_ACTIVE (cp)) + goto Initialise; + if (child_proc_count == MAX_CHILDREN) + return NULL; + cp = &child_procs[child_proc_count++]; + + Initialise: + memset (cp, 0, sizeof(*cp)); + cp->fd = -1; + cp->pid = -1; + cp->procinfo.hProcess = NULL; + cp->status = STATUS_READ_ERROR; + + /* use manual reset event so that select() will function properly */ + cp->char_avail = CreateEvent (NULL, TRUE, FALSE, NULL); + if (cp->char_avail) + { + cp->char_consumed = CreateEvent (NULL, FALSE, FALSE, NULL); + if (cp->char_consumed) + { + cp->thrd = CreateThread (NULL, 1024, reader_thread, cp, 0, &id); + if (cp->thrd) + return cp; + } + } + delete_child (cp); + return NULL; +} + +void +delete_child (child_process *cp) +{ + int i; + + /* Should not be deleting a child that is still needed. */ + for (i = 0; i < MAXDESC; i++) + if (fd_info[i].cp == cp) + abort (); + + if (!CHILD_ACTIVE (cp)) + return; + + /* reap thread if necessary */ + if (cp->thrd) + { + DWORD rc; + + if (GetExitCodeThread (cp->thrd, &rc) && rc == STILL_ACTIVE) + { + /* let the thread exit cleanly if possible */ + cp->status = STATUS_READ_ERROR; + SetEvent (cp->char_consumed); + if (WaitForSingleObject (cp->thrd, 1000) != WAIT_OBJECT_0) + { + DebPrint (("delete_child.WaitForSingleObject (thread) failed " + "with %lu for fd %ld\n", GetLastError (), cp->fd)); + TerminateThread (cp->thrd, 0); + } + } + CloseHandle (cp->thrd); + cp->thrd = NULL; + } + if (cp->char_avail) + { + CloseHandle (cp->char_avail); + cp->char_avail = NULL; + } + if (cp->char_consumed) + { + CloseHandle (cp->char_consumed); + cp->char_consumed = NULL; + } + + /* update child_proc_count (highest numbered slot in use plus one) */ + if (cp == child_procs + child_proc_count - 1) + { + for (i = child_proc_count-1; i >= 0; i--) + if (CHILD_ACTIVE (&child_procs[i])) + { + child_proc_count = i + 1; + break; + } + } + if (i < 0) + child_proc_count = 0; +} + +/* Find a child by pid. */ +static child_process * +find_child_pid (DWORD pid) +{ + child_process *cp; + + for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--) + if (CHILD_ACTIVE (cp) && pid == cp->pid) + return cp; + return NULL; +} + + +/* Thread proc for child process and socket reader threads. Each thread + is normally blocked until woken by select() to check for input by + reading one char. When the read completes, char_avail is signalled + to wake up the select emulator and the thread blocks itself again. */ +DWORD WINAPI +reader_thread (void *arg) +{ + child_process *cp; + + /* Our identity */ + cp = (child_process *)arg; + + /* We have to wait for the go-ahead before we can start */ + if (cp == NULL || + WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0) + return 1; + + for (;;) + { + int rc; + + rc = _sys_read_ahead (cp->fd); + + /* The name char_avail is a misnomer - it really just means the + read-ahead has completed, whether successfully or not. */ + if (!SetEvent (cp->char_avail)) + { + DebPrint (("reader_thread.SetEvent failed with %lu for fd %ld\n", + GetLastError (), cp->fd)); + return 1; + } + + if (rc == STATUS_READ_ERROR) + return 1; + + /* If the read died, the child has died so let the thread die */ + if (rc == STATUS_READ_FAILED) + break; + + /* Wait until our input is acknowledged before reading again */ + if (WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0) + { + DebPrint (("reader_thread.WaitForSingleObject failed with " + "%lu for fd %ld\n", GetLastError (), cp->fd)); + break; + } + } + return 0; +} + +static BOOL +create_child (char *exe, char *cmdline, char *env, + int * pPid, child_process *cp) +{ + STARTUPINFO start; + SECURITY_ATTRIBUTES sec_attrs; + SECURITY_DESCRIPTOR sec_desc; + + if (cp == NULL) abort (); + + memset (&start, 0, sizeof (start)); + start.cb = sizeof (start); + +#ifdef HAVE_NTGUI + start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; + start.wShowWindow = SW_HIDE; + + start.hStdInput = GetStdHandle (STD_INPUT_HANDLE); + start.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE); + start.hStdError = GetStdHandle (STD_ERROR_HANDLE); +#endif /* HAVE_NTGUI */ + + /* Explicitly specify no security */ + if (!InitializeSecurityDescriptor (&sec_desc, SECURITY_DESCRIPTOR_REVISION)) + goto EH_Fail; + if (!SetSecurityDescriptorDacl (&sec_desc, TRUE, NULL, FALSE)) + goto EH_Fail; + sec_attrs.nLength = sizeof (sec_attrs); + sec_attrs.lpSecurityDescriptor = &sec_desc; + sec_attrs.bInheritHandle = FALSE; + + if (!CreateProcess (exe, cmdline, &sec_attrs, NULL, TRUE, + CREATE_NEW_PROCESS_GROUP, + env, NULL, + &start, &cp->procinfo)) + goto EH_Fail; + + cp->pid = (int) cp->procinfo.dwProcessId; + + /* Hack for Windows 95, which assigns large (ie negative) pids */ + if (cp->pid < 0) + cp->pid = -cp->pid; + + /* pid must fit in a Lisp_Int */ + cp->pid = (cp->pid & VALMASK); + + + *pPid = cp->pid; + + return TRUE; + + EH_Fail: + DebPrint (("create_child.CreateProcess failed: %ld\n", GetLastError());); + return FALSE; +} + +/* create_child doesn't know what emacs' file handle will be for waiting + on output from the child, so we need to make this additional call + to register the handle with the process + This way the select emulator knows how to match file handles with + entries in child_procs. */ +void +register_child (int pid, int fd) +{ + child_process *cp; + + cp = find_child_pid (pid); + if (cp == NULL) + { + DebPrint (("register_child unable to find pid %lu\n", pid)); + return; + } + +#ifdef FULL_DEBUG + DebPrint (("register_child registered fd %d with pid %lu\n", fd, pid)); +#endif + + cp->fd = fd; + + /* thread is initially blocked until select is called; set status so + that select will release thread */ + cp->status = STATUS_READ_ACKNOWLEDGED; + + /* attach child_process to fd_info */ + if (fd_info[fd].cp != NULL) + { + DebPrint (("register_child: fd_info[%d] apparently in use!\n", fd)); + abort (); + } + + fd_info[fd].cp = cp; +} + +/* When a process dies its pipe will break so the reader thread will + signal failure to the select emulator. + The select emulator then calls this routine to clean up. + Since the thread signaled failure we can assume it is exiting. */ +static void +reap_subprocess (child_process *cp) +{ + if (cp->procinfo.hProcess) + { + /* Reap the process */ + if (WaitForSingleObject (cp->procinfo.hProcess, INFINITE) != WAIT_OBJECT_0) + DebPrint (("reap_subprocess.WaitForSingleObject (process) failed " + "with %lu for fd %ld\n", GetLastError (), cp->fd)); + CloseHandle (cp->procinfo.hProcess); + cp->procinfo.hProcess = NULL; + CloseHandle (cp->procinfo.hThread); + cp->procinfo.hThread = NULL; + + /* If this was a DOS process, indicate that it is now safe to + start a new one. */ + if (cp->is_dos_process) + dos_process_running = FALSE; + } + + /* For asynchronous children, the child_proc resources will be freed + when the last pipe read descriptor is closed; for synchronous + children, we must explicitly free the resources now because + register_child has not been called. */ + if (cp->fd == -1) + delete_child (cp); +} + +/* Wait for any of our existing child processes to die + When it does, close its handle + Return the pid and fill in the status if non-NULL. */ + +int +sys_wait (int *status) +{ + DWORD active, retval; + int nh; + int pid; + child_process *cp, *cps[MAX_CHILDREN]; + HANDLE wait_hnd[MAX_CHILDREN]; + + nh = 0; + if (dead_child != NULL) + { + /* We want to wait for a specific child */ + wait_hnd[nh] = dead_child->procinfo.hProcess; + cps[nh] = dead_child; + if (!wait_hnd[nh]) abort (); + nh++; + } + else + { + for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--) + /* some child_procs might be sockets; ignore them */ + if (CHILD_ACTIVE (cp) && cp->procinfo.hProcess) + { + wait_hnd[nh] = cp->procinfo.hProcess; + cps[nh] = cp; + if (!wait_hnd[nh]) abort (); + nh++; + } + } + + if (nh == 0) + { + /* Nothing to wait on, so fail */ + errno = ECHILD; + return -1; + } + + active = WaitForMultipleObjects (nh, wait_hnd, FALSE, INFINITE); + if (active == WAIT_FAILED) + { + errno = EBADF; + return -1; + } + else if (active == WAIT_TIMEOUT) + { + /* Should never happen */ + errno = EINVAL; + return -1; + } + else if (active >= WAIT_OBJECT_0 && + active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS) + { + active -= WAIT_OBJECT_0; + } + else if (active >= WAIT_ABANDONED_0 && + active < WAIT_ABANDONED_0+MAXIMUM_WAIT_OBJECTS) + { + active -= WAIT_ABANDONED_0; + } + + if (!GetExitCodeProcess (wait_hnd[active], &retval)) + { + DebPrint (("Wait.GetExitCodeProcess failed with %lu\n", + GetLastError ())); + retval = 1; + } + if (retval == STILL_ACTIVE) + { + /* Should never happen */ + DebPrint (("Wait.WaitForMultipleObjects returned an active process\n")); + errno = EINVAL; + return -1; + } + + /* Massage the exit code from the process to match the format expected + by the WIFSTOPPED et al macros in syswait.h. Only WIFSIGNALED and + WIFEXITED are supported; WIFSTOPPED doesn't make sense under NT. */ + + if (retval == STATUS_CONTROL_C_EXIT) + retval = SIGINT; + else + retval <<= 8; + + cp = cps[active]; + pid = cp->pid; +#ifdef FULL_DEBUG + DebPrint (("Wait signaled with process pid %d\n", cp->pid)); +#endif + + if (status) + { + *status = retval; + } + else if (synch_process_alive) + { + synch_process_alive = 0; + + /* Report the status of the synchronous process. */ + if (WIFEXITED (retval)) + synch_process_retcode = WRETCODE (retval); + else if (WIFSIGNALED (retval)) + { + int code = WTERMSIG (retval); + char *signame = 0; + + if (code < NSIG) + { + /* Suppress warning if the table has const char *. */ + signame = (char *) sys_siglist[code]; + } + if (signame == 0) + signame = "unknown"; + + synch_process_death = signame; + } + + reap_subprocess (cp); + } + + return pid; +} + +int +win32_is_dos_binary (char * filename) +{ + IMAGE_DOS_HEADER dos_header; + DWORD signature; + int fd; + int is_dos_binary = FALSE; + + fd = open (filename, O_RDONLY | O_BINARY, 0); + if (fd >= 0) + { + char * p = strrchr (filename, '.'); + + /* We can only identify DOS .com programs from the extension. */ + if (p && stricmp (p, ".com") == 0) + is_dos_binary = TRUE; + else if (p && stricmp (p, ".bat") == 0) + { + /* A DOS shell script - it appears that CreateProcess is happy + to accept this (somewhat surprisingly); presumably it looks + at COMSPEC to determine what executable to actually invoke. + Therefore, we have to do the same here as well. */ + p = getenv ("COMSPEC"); + if (p) + is_dos_binary = win32_is_dos_binary (p); + } + else + { + /* Look for DOS .exe signature - if found, we must also check + that it isn't really a 16- or 32-bit Windows exe, since + both formats start with a DOS program stub. Note that + 16-bit Windows executables use the OS/2 1.x format. */ + if (read (fd, &dos_header, sizeof (dos_header)) == sizeof (dos_header) + && dos_header.e_magic == IMAGE_DOS_SIGNATURE + && lseek (fd, dos_header.e_lfanew, SEEK_SET) != -1) + { + if (read (fd, &signature, sizeof (signature)) != sizeof (signature) + || (signature != IMAGE_NT_SIGNATURE && + LOWORD (signature) != IMAGE_OS2_SIGNATURE)) + is_dos_binary = TRUE; + } + } + close (fd); + } + + return is_dos_binary; +} + +/* We pass our process ID to our children by setting up an environment + variable in their environment. */ +char ppid_env_var_buffer[64]; + +/* When a new child process is created we need to register it in our list, + so intercept spawn requests. */ +int +sys_spawnve (int mode, char *cmdname, char **argv, char **envp) +{ + Lisp_Object program, full; + char *cmdline, *env, *parg, **targ; + int arglen; + int pid; + child_process *cp; + int is_dos_binary; + + /* We don't care about the other modes */ + if (mode != _P_NOWAIT) + { + errno = EINVAL; + return -1; + } + + /* Handle executable names without an executable suffix. */ + program = make_string (cmdname, strlen (cmdname)); + if (NILP (Ffile_executable_p (program))) + { + struct gcpro gcpro1; + + full = Qnil; + GCPRO1 (program); + locate_file (Vexec_path, program, EXEC_SUFFIXES, &full, 1); + UNGCPRO; + if (NILP (full)) + { + errno = EINVAL; + return -1; + } + cmdname = XSTRING (full)->_data; + argv[0] = cmdname; + } + + /* make sure cmdname is in DOS format */ + strcpy (cmdname = alloca (strlen (cmdname) + 1), argv[0]); + unixtodos_filename (cmdname); + argv[0] = cmdname; + + /* Check if program is a DOS executable, and if so whether we are + allowed to start it. */ + is_dos_binary = win32_is_dos_binary (cmdname); + if (is_dos_binary && dos_process_running) + { + errno = EAGAIN; + return -1; + } + + /* we have to do some conjuring here to put argv and envp into the + form CreateProcess wants... argv needs to be a space separated/null + terminated list of parameters, and envp is a null + separated/double-null terminated list of parameters. + + Additionally, zero-length args and args containing whitespace need + to be wrapped in double quotes. Args containing embedded double + quotes (as opposed to enclosing quotes, which we leave alone) are + usually illegal (most Win32 programs do not implement escaping of + double quotes - sad but true, at least for programs compiled with + MSVC), but we will escape quotes anyway for those programs that can + handle it. The Win32 gcc library from Cygnus doubles quotes to + escape them, so we will use that convention. + + Since I have no idea how large argv and envp are likely to be + we figure out list lengths on the fly and allocate them. */ + + /* do argv... */ + arglen = 0; + targ = argv; + while (*targ) + { + char * p = *targ; + int add_quotes = 0; + + if (*p == 0) + add_quotes = 1; + while (*p) + if (*p++ == '"') + { + /* allow for embedded quotes to be doubled - we won't + actually double quotes that aren't embedded though */ + arglen++; + add_quotes = 1; + } + else if (*p == ' ' || *p == '\t') + add_quotes = 1; + if (add_quotes) + arglen += 2; + arglen += strlen (*targ++) + 1; + } + cmdline = alloca (arglen); + targ = argv; + parg = cmdline; + while (*targ) + { + char * p = *targ; + int add_quotes = 0; + + if (*p == 0) + add_quotes = 1; + + if (!NILP (Vwin32_quote_process_args)) + { + /* This is conditional because it sometimes causes more + problems than it solves, since argv arrays are not always + carefully constructed. M-x grep, for instance, passes the + whole command line as one argument, so it becomes + impossible to pass a regexp which contains spaces. */ + for ( ; *p; p++) + if (*p == ' ' || *p == '\t' || *p == '"') + add_quotes = 1; + } + if (add_quotes) + { + char * first; + char * last; + + p = *targ; + first = p; + last = p + strlen (p) - 1; + *parg++ = '"'; + while (*p) + { + if (*p == '"' && p > first && p < last) + *parg++ = '"'; /* double up embedded quotes only */ + *parg++ = *p++; + } + *parg++ = '"'; + } + else + { + strcpy (parg, *targ); + parg += strlen (*targ); + } + *parg++ = ' '; + targ++; + } + *--parg = '\0'; + + /* and envp... */ + arglen = 1; + targ = envp; + while (*targ) + { + arglen += strlen (*targ++) + 1; + } + sprintf (ppid_env_var_buffer, "__PARENT_PROCESS_ID=%d", + GetCurrentProcessId ()); + arglen += strlen (ppid_env_var_buffer) + 1; + + env = alloca (arglen); + targ = envp; + parg = env; + while (*targ) + { + strcpy (parg, *targ); + parg += strlen (*targ++); + *parg++ = '\0'; + } + strcpy (parg, ppid_env_var_buffer); + parg += strlen (ppid_env_var_buffer); + *parg++ = '\0'; + *parg = '\0'; + + cp = new_child (); + if (cp == NULL) + { + errno = EAGAIN; + return -1; + } + + /* Now create the process. */ + if (!create_child (cmdname, cmdline, env, &pid, cp)) + { + delete_child (cp); + errno = ENOEXEC; + return -1; + } + + if (is_dos_binary) + { + cp->is_dos_process = TRUE; + dos_process_running = TRUE; + } + + return pid; +} + +/* Emulate the select call + Wait for available input on any of the given rfds, or timeout if + a timeout is given and no input is detected + wfds and efds are not supported and must be NULL. */ + +#if 0 +/* From ntterm.c */ +extern HANDLE keyboard_handle; +#endif +/* From process.c */ +extern int proc_buffered_char[]; + +int +sys_select (int nfds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds, + EMACS_TIME *timeout) +{ + SELECT_TYPE orfds; + DWORD timeout_ms; + int i, nh, nr; + DWORD active; + child_process *cp; + HANDLE wait_hnd[MAXDESC]; + int fdindex[MAXDESC]; /* mapping from wait handles back to descriptors */ + + /* If the descriptor sets are NULL but timeout isn't, then just Sleep. */ + if (rfds == NULL && wfds == NULL && efds == NULL && timeout != NULL) + { + Sleep (timeout->tv_sec * 1000 + timeout->tv_usec / 1000); + return 0; + } + + /* Otherwise, we only handle rfds, so fail otherwise. */ + if (rfds == NULL || wfds != NULL || efds != NULL) + { + errno = EINVAL; + return -1; + } + + orfds = *rfds; + FD_ZERO (rfds); + nr = 0; + + /* Build a list of handles to wait on. */ + nh = 0; + for (i = 0; i < nfds; i++) + if (FD_ISSET (i, &orfds)) + { + if (i == 0) + { +#if 0 + if (keyboard_handle) + { + /* Handle stdin specially */ + wait_hnd[nh] = keyboard_handle; + fdindex[nh] = i; + nh++; + } +#endif + + /* Check for any emacs-generated input in the queue since + it won't be detected in the wait */ + if (detect_input_pending ()) + { + FD_SET (i, rfds); + return 1; + } + } + else + { + /* Child process and socket input */ + cp = fd_info[i].cp; + if (cp) + { + int current_status = cp->status; + + if (current_status == STATUS_READ_ACKNOWLEDGED) + { + /* Tell reader thread which file handle to use. */ + cp->fd = i; + /* Wake up the reader thread for this process */ + cp->status = STATUS_READ_READY; + if (!SetEvent (cp->char_consumed)) + DebPrint (("nt_select.SetEvent failed with " + "%lu for fd %ld\n", GetLastError (), i)); + } + +#ifdef CHECK_INTERLOCK + /* slightly crude cross-checking of interlock between threads */ + + current_status = cp->status; + if (WaitForSingleObject (cp->char_avail, 0) == WAIT_OBJECT_0) + { + /* char_avail has been signalled, so status (which may + have changed) should indicate read has completed + but has not been acknowledged. */ + current_status = cp->status; + if (current_status != STATUS_READ_SUCCEEDED && + current_status != STATUS_READ_FAILED) + DebPrint (("char_avail set, but read not completed: status %d\n", + current_status)); + } + else + { + /* char_avail has not been signalled, so status should + indicate that read is in progress; small possibility + that read has completed but event wasn't yet signalled + when we tested it (because a context switch occurred + or if running on separate CPUs). */ + if (current_status != STATUS_READ_READY && + current_status != STATUS_READ_IN_PROGRESS && + current_status != STATUS_READ_SUCCEEDED && + current_status != STATUS_READ_FAILED) + DebPrint (("char_avail reset, but read status is bad: %d\n", + current_status)); + } +#endif + wait_hnd[nh] = cp->char_avail; + fdindex[nh] = i; + if (!wait_hnd[nh]) abort (); + nh++; +#ifdef FULL_DEBUG + DebPrint (("select waiting on child %d fd %d\n", + cp-child_procs, i)); +#endif + } + else + { + /* Unable to find something to wait on for this fd, skip */ + DebPrint (("sys_select: fd %ld is invalid! ignoring\n", i)); + abort (); + } + } + } + + /* Nothing to look for, so we didn't find anything */ + if (nh == 0) + { + if (timeout) + Sleep (timeout->tv_sec * 1000 + timeout->tv_usec / 1000); + return 0; + } + + /* + Wait for input + If a child process dies while this is waiting, its pipe will break + so the reader thread will signal an error condition, thus, the wait + will wake up + */ + timeout_ms = timeout ? (timeout->tv_sec * 1000 + timeout->tv_usec / 1000) : INFINITE; + + active = WaitForMultipleObjects (nh, wait_hnd, FALSE, timeout_ms); + + if (active == WAIT_FAILED) + { + DebPrint (("select.WaitForMultipleObjects (%d, %lu) failed with %lu\n", + nh, timeout_ms, GetLastError ())); + /* don't return EBADF - this causes wait_reading_process_input to + abort; WAIT_FAILED is returned when single-stepping under + Windows 95 after switching thread focus in debugger, and + possibly at other times. */ + errno = EINTR; + return -1; + } + else if (active == WAIT_TIMEOUT) + { + return 0; + } + else if (active >= WAIT_OBJECT_0 && + active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS) + { + active -= WAIT_OBJECT_0; + } + else if (active >= WAIT_ABANDONED_0 && + active < WAIT_ABANDONED_0+MAXIMUM_WAIT_OBJECTS) + { + active -= WAIT_ABANDONED_0; + } + + /* Loop over all handles after active (now officially documented as + being the first signalled handle in the array). We do this to + ensure fairness, so that all channels with data available will be + processed - otherwise higher numbered channels could be starved. */ + do + { + if (fdindex[active] == 0) + { + /* Keyboard input available */ + FD_SET (0, rfds); + nr++; + } + else + { + /* must be a socket or pipe */ + int current_status; + + cp = fd_info[ fdindex[active] ].cp; + + /* Read ahead should have completed, either succeeding or failing. */ + FD_SET (fdindex[active], rfds); + nr++; + current_status = cp->status; + if (current_status != STATUS_READ_SUCCEEDED) + { + if (current_status != STATUS_READ_FAILED) + DebPrint (("internal error: subprocess pipe signalled " + "at the wrong time (status %d)\n!", current_status)); + + /* The child_process entry for a socket or pipe will be + freed when the last descriptor using it is closed; for + pipes, we call the SIGCHLD handler. */ + if (fd_info[ fdindex[active] ].flags & FILE_PIPE) + { + /* The SIGCHLD handler will do a Wait so we know it won't + return until the process is dead + We force Wait to only wait for this process to avoid it + picking up other children that happen to be dead but that + we haven't noticed yet + SIG_DFL for SIGCHLD is ignore? */ + if (sig_handlers[SIGCHLD] != SIG_DFL && + sig_handlers[SIGCHLD] != SIG_IGN) + { +#ifdef FULL_DEBUG + DebPrint (("select calling SIGCHLD handler for pid %d\n", + cp->pid)); +#endif + dead_child = cp; + sig_handlers[SIGCHLD] (SIGCHLD); + dead_child = NULL; + } + + /* Clean up the child process entry in the table */ + reap_subprocess (cp); + } + } + } + + /* Test for input on remaining channels. */ + while (++active < nh) + if (WaitForSingleObject (wait_hnd[active], 0) == WAIT_OBJECT_0) + break; + } while (active < nh); + + return nr; +} + +/* Substitute for certain kill () operations */ +int +sys_kill (int pid, int sig) +{ + child_process *cp; + HANDLE proc_hand; + int need_to_free = 0; + int rc = 0; + + /* Only handle signals that will result in the process dying */ + if (sig != SIGINT && sig != SIGKILL && sig != SIGQUIT && sig != SIGHUP) + { + errno = EINVAL; + return -1; + } + + cp = find_child_pid (pid); + if (cp == NULL) + { + proc_hand = OpenProcess (PROCESS_TERMINATE, 0, pid); + if (proc_hand == NULL) + { + errno = EPERM; + return -1; + } + need_to_free = 1; + } + else + { + proc_hand = cp->procinfo.hProcess; + pid = cp->procinfo.dwProcessId; + } + + if (sig == SIGINT) + { + /* Ctrl-Break is NT equivalent of SIGINT. */ + if (!GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, pid)) + { + DebPrint (("sys_kill.GenerateConsoleCtrlEvent return %d " + "for pid %lu\n", GetLastError (), pid)); + errno = EINVAL; + rc = -1; + } + } + else + { + /* Kill the process. On Win32 this doesn't kill child processes + so it doesn't work very well for shells which is why it's not + used in every case. Also, don't try to terminate DOS processes + (on Win95), because this will hang Emacs. */ + if (!(cp && cp->is_dos_process) + && !TerminateProcess (proc_hand, 0xff)) + { + DebPrint (("sys_kill.TerminateProcess returned %d " + "for pid %lu\n", GetLastError (), pid)); + errno = EINVAL; + rc = -1; + } + } + + if (need_to_free) + CloseHandle (proc_hand); + + return rc; +} + +#if 0 +extern int report_file_error (CONST char *, Lisp_Object); +#endif +/* The following two routines are used to manipulate stdin, stdout, and + stderr of our child processes. + + Assuming that in, out, and err are *not* inheritable, we make them + stdin, stdout, and stderr of the child as follows: + + - Save the parent's current standard handles. + - Set the std handles to inheritable duplicates of the ones being passed in. + (Note that _get_osfhandle() is an io.h procedure that retrieves the + NT file handle for a crt file descriptor.) + - Spawn the child, which inherits in, out, and err as stdin, + stdout, and stderr. (see Spawnve) + - Close the std handles passed to the child. + - Reset the parent's standard handles to the saved handles. + (see reset_standard_handles) + We assume that the caller closes in, out, and err after calling us. */ + +void +prepare_standard_handles (int in, int out, int err, HANDLE handles[3]) +{ + HANDLE parent; + HANDLE newstdin, newstdout, newstderr; + + parent = GetCurrentProcess (); + + handles[0] = GetStdHandle (STD_INPUT_HANDLE); + handles[1] = GetStdHandle (STD_OUTPUT_HANDLE); + handles[2] = GetStdHandle (STD_ERROR_HANDLE); + + /* make inheritable copies of the new handles */ + if (!DuplicateHandle (parent, + (HANDLE) _get_osfhandle (in), + parent, + &newstdin, + 0, + TRUE, + DUPLICATE_SAME_ACCESS)) + report_file_error ("Duplicating input handle for child", Qnil); + + if (!DuplicateHandle (parent, + (HANDLE) _get_osfhandle (out), + parent, + &newstdout, + 0, + TRUE, + DUPLICATE_SAME_ACCESS)) + report_file_error ("Duplicating output handle for child", Qnil); + + if (!DuplicateHandle (parent, + (HANDLE) _get_osfhandle (err), + parent, + &newstderr, + 0, + TRUE, + DUPLICATE_SAME_ACCESS)) + report_file_error ("Duplicating error handle for child", Qnil); + + /* and store them as our std handles */ + if (!SetStdHandle (STD_INPUT_HANDLE, newstdin)) + report_file_error ("Changing stdin handle", Qnil); + + if (!SetStdHandle (STD_OUTPUT_HANDLE, newstdout)) + report_file_error ("Changing stdout handle", Qnil); + + if (!SetStdHandle (STD_ERROR_HANDLE, newstderr)) + report_file_error ("Changing stderr handle", Qnil); +} + +void +reset_standard_handles (int in, int out, int err, HANDLE handles[3]) +{ + /* close the duplicated handles passed to the child */ + CloseHandle (GetStdHandle (STD_INPUT_HANDLE)); + CloseHandle (GetStdHandle (STD_OUTPUT_HANDLE)); + CloseHandle (GetStdHandle (STD_ERROR_HANDLE)); + + /* now restore parent's saved std handles */ + SetStdHandle (STD_INPUT_HANDLE, handles[0]); + SetStdHandle (STD_OUTPUT_HANDLE, handles[1]); + SetStdHandle (STD_ERROR_HANDLE, handles[2]); +} + +#ifdef HAVE_SOCKETS + +/* To avoid problems with winsock implementations that work over dial-up + connections causing or requiring a connection to exist while Emacs is + running, Emacs no longer automatically loads winsock on startup if it + is present. Instead, it will be loaded when open-network-stream is + first called. + + To allow full control over when winsock is loaded, we provide these + two functions to dynamically load and unload winsock. This allows + dial-up users to only be connected when they actually need to use + socket services. */ + +/* From nt.c */ +extern HANDLE winsock_lib; +extern BOOL term_winsock (void); +extern BOOL init_winsock (int load_now); + +extern Lisp_Object Vsystem_name; + +DEFUN ("win32-has-winsock", Fwin32_has_winsock, 0, 1, "", /* +Test for presence of the Windows socket library `winsock'. +Returns non-nil if winsock support is present, nil otherwise. + +If the optional argument LOAD-NOW is non-nil, the winsock library is +also loaded immediately if not already loaded. If winsock is loaded, +the winsock local hostname is returned (since this may be different from +the value of `system-name' and should supplant it), otherwise t is +returned to indicate winsock support is present. +*/ + (load_now)) +{ + int have_winsock; + + have_winsock = init_winsock (!NILP (load_now)); + if (have_winsock) + { + if (winsock_lib != NULL) + { + /* Return new value for system-name. The best way to do this + is to call init_system_name, saving and restoring the + original value to avoid side-effects. */ + Lisp_Object orig_hostname = Vsystem_name; + Lisp_Object hostname; + + init_system_name (); + hostname = Vsystem_name; + Vsystem_name = orig_hostname; + return hostname; + } + return Qt; + } + return Qnil; +} + +DEFUN ("win32-unload-winsock", Fwin32_unload_winsock, 0, 0, "", /* +Unload the Windows socket library `winsock' if loaded. +This is provided to allow dial-up socket connections to be disconnected +when no longer needed. Returns nil without unloading winsock if any +socket connections still exist. +*/ + ()) +{ + return term_winsock () ? Qt : Qnil; +} + +#endif /* HAVE_SOCKETS */ + + +syms_of_ntproc () +{ +#ifdef HAVE_SOCKETS + DEFSUBR (Fwin32_has_winsock); + DEFSUBR (Fwin32_unload_winsock); +#endif + + DEFVAR_LISP ("win32-quote-process-args", &Vwin32_quote_process_args /* +Non-nil enables quoting of process arguments to ensure correct parsing. +Because Windows does not directly pass argv arrays to child processes, +programs have to reconstruct the argv array by parsing the command +line string. For an argument to contain a space, it must be enclosed +in double quotes or it will be parsed as multiple arguments. + +However, the argument list to call-process is not always correctly +constructed (or arguments have already been quoted), so enabling this +option may cause unexpected behavior.*/ ); + Vwin32_quote_process_args = Qnil; + + DEFVAR_INT ("win32-pipe-read-delay", &Vwin32_pipe_read_delay /* +Forced delay before reading subprocess output. +This is done to improve the buffering of subprocess output, by +avoiding the inefficiency of frequently reading small amounts of data. + +If positive, the value is the number of milliseconds to sleep before +reading the subprocess output. If negative, the magnitude is the number +of time slices to wait (effectively boosting the priority of the child +process temporarily). A value of zero disables waiting entirely.*/ ); + Vwin32_pipe_read_delay = 50; + + DEFVAR_LISP ("win32-downcase-file-names", &Vwin32_downcase_file_names /* +Non-nil means convert all-upper case file names to lower case. +This applies when performing completions and file name expansion.*/ ); + Vwin32_downcase_file_names = Qnil; +} +/* end of ntproc.c */
--- a/src/objects-x.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/objects-x.c Mon Aug 13 09:15:11 2007 +0200 @@ -653,7 +653,7 @@ if (truename) { Lisp_Object result = build_string (truename); - xfree (truename); + XFree (truename); return result; } else
--- a/src/print.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/print.c Mon Aug 13 09:15:11 2007 +0200 @@ -590,6 +590,84 @@ return obj; } +#include "emacsfns.h" +/* Synched with Emacs 19.34 */ +DEFUN ("error-message-string", Ferror_message_string, 1, 1, 0, /* +Convert an error value (ERROR-SYMBOL . DATA) to an error message. +*/ + (obj)) +{ + struct buffer *old = XBUFFER(Fcurrent_buffer()); + Lisp_Object original, printcharfun, value; + struct gcpro gcpro1; + + print_error_message (obj, Vprin1_to_string_buffer, NULL); + + set_buffer_internal (XBUFFER (Vprin1_to_string_buffer)); + value = Fbuffer_substring (Fpoint_min(Fcurrent_buffer()), + Fpoint_max(Fcurrent_buffer()), + Fcurrent_buffer()); + + GCPRO1 (value); + Ferase_buffer (Fcurrent_buffer()); + set_buffer_internal (old); + UNGCPRO; + + return value; +} + +/* Print an error message for the error DATA + onto Lisp output stream STREAM (suitable for the print functions). */ + +print_error_message (data, stream) + Lisp_Object data, stream; +{ + Lisp_Object errname, errmsg, file_error, tail; + struct gcpro gcpro1; + int i; + + errname = Fcar (data); + + if (EQ (errname, Qerror)) + { + data = Fcdr (data); + if (!CONSP (data)) data = Qnil; + errmsg = Fcar (data); + file_error = Qnil; + } + else + { + errmsg = Fget (errname, Qerror_message, Qnil); + file_error = Fmemq (Qfile_error, + Fget (errname, Qerror_conditions, Qnil)); + } + + /* Print an error message including the data items. */ + + tail = Fcdr_safe (data); + GCPRO1 (tail); + + /* For file-error, make error message by concatenating + all the data items. They are all strings. */ + if (!NILP (file_error) && !NILP (tail)) + errmsg = XCONS (tail)->car, tail = XCONS (tail)->cdr; + + if (STRINGP (errmsg)) + Fprinc (errmsg, stream); + else + write_string_1 ("Peculiar error", 14, stream); + + for (i = 0; CONSP (tail); tail = Fcdr (tail), i++) + { + write_string_1 (i ? ", " : ": ", 2, stream); + if (!NILP (file_error)) + Fprinc (Fcar (tail), stream); + else + Fprin1 (Fcar (tail), stream); + } + UNGCPRO; +} + #ifdef LISP_FLOAT_TYPE Lisp_Object Vfloat_output_format; @@ -1436,6 +1514,7 @@ DEFSUBR (Fprin1_to_string); DEFSUBR (Fprinc); DEFSUBR (Fprint); + DEFSUBR (Ferror_message_string); DEFSUBR (Fterpri); DEFSUBR (Fwrite_char); DEFSUBR (Falternate_debugging_output);
--- a/src/process.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/process.c Mon Aug 13 09:15:11 2007 +0200 @@ -673,15 +673,6 @@ *outchannel = *inchannel = sv[0]; *forkout = *forkin = sv[1]; #else /* not SKTPAIR */ -#ifdef WINDOWSNT - pipe_with_inherited_out (sv); - *inchannel = sv[0]; - *forkout = sv[1]; - - pipe_with_inherited_in (sv); - *forkin = sv[0]; - *outchannel = sv[1]; -#else /* not WINDOWSNT */ int temp; temp = pipe (sv); if (temp < 0) return -1; @@ -691,7 +682,6 @@ if (temp < 0) return -1; *outchannel = sv[1]; *forkin = sv[0]; -#endif /* not WINDOWSNT */ #endif /* not SKTPAIR */ return 0; } @@ -1007,7 +997,7 @@ signal (SIGINT, SIG_DFL); signal (SIGQUIT, SIG_DFL); -#ifndef MSDOS +#if !defined(MSDOS) && !defined(WINDOWSNT) if (pty_flag) { /* Set up the terminal characteristics of the pty. */ @@ -2206,7 +2196,9 @@ int i; struct Lisp_Process *p; +#ifdef EMACS_BLOCK_SIGNAL EMACS_BLOCK_SIGNAL (SIGCHLD); +#endif for (i = 0; i < exited_processes_index; i++) { int pid = exited_processes[i]; @@ -2287,7 +2279,9 @@ record_exited_processes (int block_sigchld) { if (block_sigchld) +#ifdef EMACS_BLOCK_SIGNAL EMACS_BLOCK_SIGNAL (SIGCHLD); +#endif while (sigchld_happened) { @@ -3023,12 +3017,7 @@ #undef handle_signal -#ifdef WINDOWSNT - /* Only works for kill-type signals */ - return make_int (win32_kill_process (XINT (pid), XINT (sigcode))); -#else return make_int (kill (XINT (pid), XINT (sigcode))); -#endif } DEFUN ("process-send-eof", Fprocess_send_eof, 0, 1, 0, /*
--- a/src/process.h Mon Aug 13 09:13:58 2007 +0200 +++ b/src/process.h Mon Aug 13 09:15:11 2007 +0200 @@ -120,7 +120,12 @@ CONST char *current_dir); #endif -void child_setup (int in, int out, int err, +#ifdef WINDOWSNT +int +#else +void +#endif +child_setup (int in, int out, int err, char **new_argv, CONST char *current_dir); Charcount read_process_output (Lisp_Object proc);
--- a/src/puresize.h Mon Aug 13 09:13:58 2007 +0200 +++ b/src/puresize.h Mon Aug 13 09:15:11 2007 +0200 @@ -32,7 +32,7 @@ things configured in. */ #if (LONGBITS == 64) -# define BASE_PURESIZE 893000 +# define BASE_PURESIZE 938000 #else # define BASE_PURESIZE 563000 #endif @@ -120,7 +120,7 @@ /* Extra amount of purespace needed for Sunpro builds. */ #ifdef SUNPRO -#define SUNPRO_PURESIZE_EXTRA 85000 +#define SUNPRO_PURESIZE_EXTRA 95000 #else # define SUNPRO_PURESIZE_EXTRA 0 #endif
--- a/src/redisplay.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/redisplay.c Mon Aug 13 09:15:11 2007 +0200 @@ -3661,7 +3661,7 @@ static Charcount add_string_to_fstring_db_runes (pos_data *data, CONST Bufbyte *str, - Charcount pos, Charcount min, Charcount max) + Charcount pos, Charcount min_pos, Charcount max_pos) { /* This function has been Mule-ized. */ Charcount end; @@ -3674,8 +3674,8 @@ end = (Dynarr_length (db->runes) + bytecount_to_charcount (str, strlen ((CONST char *) str))); - if (max != -1) - end = min (max, end); + if (max_pos != -1) + end = min (max_pos, end); while (pos < end && *cur_pos) { @@ -3693,7 +3693,7 @@ } } - while (Dynarr_length (db->runes) < min && + while (Dynarr_length (db->runes) < min_pos && (data->pixpos + data->blank_width <= data->max_pixpos)) add_blank_rune (data, NULL, 0); @@ -3704,7 +3704,7 @@ modeline extents. */ static Charcount add_glyph_to_fstring_db_runes (pos_data *data, Lisp_Object glyph, - Charcount pos, Charcount min, Charcount max) + Charcount pos, Charcount min_pos, Charcount max_pos) { /* This function has been Mule-ized. */ Charcount end; @@ -3716,8 +3716,8 @@ add_blank_rune (data, NULL, 0); end = Dynarr_length (db->runes) + 1; - if (max != -1) - end = min (max, end); + if (max_pos != -1) + end = min (max_pos, end); gb.glyph = glyph; gb.extent = Qnil; @@ -5536,12 +5536,14 @@ return 0; } +#ifndef WINDOWSNT static Lisp_Object restore_profiling_redisplay_flag (Lisp_Object val) { profiling_redisplay_flag = XINT (val); return Qnil; } +#endif /* Ensure that all windows on all frames on all devices are displaying the current contents of their respective buffers. */ @@ -5553,12 +5555,14 @@ int size_change_failed = 0; int count = specpdl_depth (); +#ifndef WINDOWSNT if (profiling_active) { record_unwind_protect (restore_profiling_redisplay_flag, make_int (profiling_redisplay_flag)); profiling_redisplay_flag = 1; } +#endif if (asynch_device_change_pending) handle_asynch_device_change ();
--- a/src/s/windowsnt.h Mon Aug 13 09:13:58 2007 +0200 +++ b/src/s/windowsnt.h Mon Aug 13 09:15:11 2007 +0200 @@ -20,28 +20,18 @@ /* Synched up with: FSF 19.31. */ -/* - * Define symbols to identify the version of Unix this is. - * Define all the symbols that apply correctly. - */ - -/* #define UNIPLUS */ -/* #define USG5 */ -/* #define USG */ -/* #define HPUX */ -/* #define UMAX */ -/* #define BSD4_1 */ -/* #define BSD4_2 */ -/* #define BSD4_3 */ -/* #define BSD */ -/* #define VMS */ #ifndef WINDOWSNT #define WINDOWSNT #endif + #ifndef DOS_NT #define DOS_NT /* MSDOS or WINDOWSNT */ #endif +typedef unsigned short mode_t; +typedef long ptrdiff_t; +typedef int pid_t; + /* If you are compiling with a non-C calling convention but need to declare vararg routines differently, put it here */ #define _VARARGS_ __cdecl @@ -55,10 +45,13 @@ It sets the Lisp variable system-type. */ #define SYSTEM_TYPE "windows-nt" -#define SYMS_SYSTEM syms_of_ntterm () #define NO_MATHERR +#define SIZEOF_LONG 4 +#define SIZEOF_INT 4 +#define SIZEOF_SHORT 4 + /* NOMULTIPLEJOBS should be defined if your system's shell does not have "job control" (the ability to stop a program, run some other program, then continue the first one). */ @@ -120,8 +113,10 @@ your system and must be used only through an encapsulation (Which you should place, by convention, in sysdep.c). */ +#if 0 /* Define this to be the separator between path elements */ #define DIRECTORY_SEP XINT (Vdirectory_sep_char) +#endif /* Define this to be the separator between devices and paths */ #define DEVICE_SEP ':' @@ -140,12 +135,6 @@ #define LISP_FLOAT_TYPE -#define HAVE_SYS_TIMEB_H -#define HAVE_SYS_TIME_H -#define HAVE_UNISTD_H -#define STDC_HEADERS -#define TIME_WITH_SYS_TIME - #define HAVE_GETTIMEOFDAY #define HAVE_GETHOSTNAME #define HAVE_DUP2 @@ -179,6 +168,7 @@ /* get some redefinitions in place */ +#if 0 /* IO calls that are emulated or shadowed */ #define access sys_access #define chdir sys_chdir @@ -190,18 +180,18 @@ #define dup2 sys_dup2 #define fopen sys_fopen #define link sys_link -#define mkdir sys_mkdir #define mktemp sys_mktemp #define open sys_open -#define pipe sys_pipe #define read sys_read #define rename sys_rename -#define rmdir sys_rmdir -#define select sys_select -#define sleep sys_sleep #define unlink sys_unlink #define write sys_write +#define mkdir sys_mkdir +#define rmdir sys_rmdir +#endif + +#if 0 /* this is hacky, but is necessary to avoid warnings about macro redefinitions using the SDK compilers */ #ifndef __STDC__ @@ -215,6 +205,15 @@ #undef __STDC__ #undef MUST_UNDEF__STDC__ #endif +#endif + + +/* IO calls that are emulated or shadowed */ +#define pipe sys_pipe + +#ifndef HAVE_X_WINDOWS +#define sleep sys_sleep +#endif /* subprocess calls that are emulated */ #define spawnve sys_spawnve @@ -222,16 +221,18 @@ #define kill sys_kill #define signal sys_signal +#define select sys_select + /* map to MSVC names */ #define execlp _execlp #define execvp _execvp #define fcloseall _fcloseall -#define fdopen _fdopen +#define fdopen _fdopen #define fgetchar _fgetchar -#define fileno _fileno +#define fileno _fileno #define flushall _flushall #define fputchar _fputchar -#define getw _getw +#define getw _getw #define getpid _getpid #define isatty _isatty #define logb _logb @@ -239,11 +240,13 @@ #define lseek _lseek #define popen _popen #define pclose _pclose -#define putw _putw -#define umask _umask -#define utime _utime +#define putw _putw +#define umask _umask +#define utime _utime #define index strchr #define rindex strrchr +#define read _read +#define write _write #ifdef HAVE_NTGUI #define abort win32_abort @@ -289,11 +292,13 @@ #include <stdlib.h> #include <string.h> +#if 0 /* Emacs takes care of ensuring that these are defined. */ #ifdef max #undef max #undef min #endif +#endif /* We need a little extra space, see ../../lisp/loadup.el */ #define SYSTEM_PURESIZE_EXTRA 15000
--- a/src/strftime.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/strftime.c Mon Aug 13 09:15:11 2007 +0200 @@ -94,9 +94,13 @@ time_t mktime (); #endif +#if defined(WINDOWSNT) +#include <time.h> +#else #if defined(HAVE_TZNAME) extern char *tzname[2]; #endif +#endif /* WINDOWSNT */ #ifdef emacs #define strftime emacs_strftime
--- a/src/symbols.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/symbols.c Mon Aug 13 09:15:11 2007 +0200 @@ -328,6 +328,7 @@ return (make_int (hash)); } +#if 0 /* Emacs 19.34 */ int hash_string (CONST Bufbyte *ptr, Bytecount len) { @@ -344,6 +345,26 @@ } return hash & 07777777777; } +#endif + +/* derived from hashpjw, Dragon Book P436. */ +int +hash_string (CONST Bufbyte *ptr, Bytecount len) +{ + CONST Bufbyte *p = ptr; + int hash = 0, g; + Bytecount count = len; + + while (count-- > 0) + { + hash = (hash << 4) + *p++; + if (g = (hash & 0xf0000000)) { + hash = hash ^ (g >> 24); + hash = hash ^ g; + } + } + return hash & 07777777777; +} void map_obarray (Lisp_Object obarray,
--- a/src/sysdep.c Mon Aug 13 09:13:58 2007 +0200 +++ b/src/sysdep.c Mon Aug 13 09:15:11 2007 +0200 @@ -61,7 +61,11 @@ #include "syswait.h" #include "sysdir.h" #include "systime.h" +#if defined(WINDOWSNT) +#include "syssignal.h" +#else #include <sys/times.h> +#endif /* ------------------------------- */ /* VMS includes */ @@ -426,6 +430,7 @@ #ifndef VMS #ifndef MSDOS +#ifndef WINDOWSNT /* Set up the terminal at the other end of a pseudo-terminal that we will be controlling an inferior through. It should not echo or do line-editing, since that is done @@ -453,6 +458,7 @@ #ifdef OLCUC s.main.c_oflag &= ~OLCUC; /* Disable upcasing on output. */ #endif + s.main.c_oflag &= ~TAB3; /* Disable tab expansion */ #if defined (CSIZE) && defined (CS8) s.main.c_cflag = (s.main.c_cflag & ~CSIZE) | CS8; /* Don't strip 8th bit */ #endif @@ -532,6 +538,7 @@ } #endif /* RTU */ } +#endif /* WINDOWSNT */ #endif /* not MSDOS */ #endif /* not VMS */ @@ -1297,6 +1304,8 @@ /* Getting and setting emacs_tty structures */ /* ------------------------------------------------------ */ +#ifdef HAVE_TTY + /* Set *TC to the parameters associated with the terminal FD. Return zero if all's well, or -1 if we ran into an error we couldn't deal with. */ @@ -1436,6 +1445,8 @@ return 0; } +#endif + /* ------------------------------------------------------ */ /* Initializing a device */ @@ -3412,7 +3423,7 @@ static int get_process_times_1 (long *user_ticks, long *system_ticks) { -#if defined (_SC_CLK_TCK) || defined (CLK_TCK) +#if defined (_SC_CLK_TCK) || defined (CLK_TCK) && !defined(WINDOWSNT) /* We have the POSIX times() function available. */ struct tms tttt; times (&tttt); @@ -3420,8 +3431,8 @@ *system_ticks = (long) tttt.tms_stime; return 1; #elif defined (CLOCKS_PER_SEC) - *user_time = (long) clock (); - *system_time = 0; + *user_ticks = (long) clock (); + *system_ticks = 0; return 1; #else return 0; @@ -3564,6 +3575,38 @@ #if !defined (SYS_SIGLIST_DECLARED) && !defined (HAVE_SYS_SIGLIST) +#ifdef WINDOWSNT +char *sys_siglist[] = + { + "bum signal!!", + "hangup", + "interrupt", + "quit", + "illegal instruction", + "trace trap", + "iot instruction", + "emt instruction", + "floating point exception", + "kill", + "bus error", + "segmentation violation", + "bad argument to system call", + "write on a pipe with no one to read it", + "alarm clock", + "software termination signal from kill", + "status signal", + "sendable stop signal not from tty", + "stop signal from tty", + "continue a stopped process", + "child status has changed", + "background read attempted from control tty", + "background write attempted from control tty", + "input record available at control tty", + "exceeded CPU time limit", + "exceeded file size limit" + }; +#endif + #ifdef USG #ifdef AIX CONST char *sys_siglist[NSIG + 1] =
--- a/src/sysfile.h Mon Aug 13 09:13:58 2007 +0200 +++ b/src/sysfile.h Mon Aug 13 09:15:11 2007 +0200 @@ -21,7 +21,11 @@ /* Synched up with: Not really in FSF. */ #include <errno.h> + +#ifndef WINDOWSNT #include <sys/errno.h> /* <errno.h> does not always imply this */ +#endif + /* Load sys/types.h if not already loaded. In some systems loading it twice is suicidal. */ #ifndef makedev @@ -49,13 +53,18 @@ #endif #ifdef WINDOWSNT -#define NOMINMAX +#include <io.h> +#endif + +#if 0 +#ifdef WINDOWSNT #include <windows.h> #include <stdlib.h> /* for proper declaration of environ */ #include <fcntl.h> #include "nt.h" #define _P_NOWAIT 1 /* from process.h */ #endif +#endif #ifdef MSDOS #include <dos.h>
--- a/src/sysproc.h Mon Aug 13 09:13:58 2007 +0200 +++ b/src/sysproc.h Mon Aug 13 09:15:11 2007 +0200 @@ -26,7 +26,9 @@ #include "systime.h" /* necessary for sys/resource.h; also gets the FD_* defines on some systems. */ +#ifndef WINDOWSNT #include <sys/resource.h> +#endif #if !defined (NO_SUBPROCESSES)
--- a/src/syssignal.h Mon Aug 13 09:13:58 2007 +0200 +++ b/src/syssignal.h Mon Aug 13 09:15:11 2007 +0200 @@ -207,7 +207,7 @@ #define EMACS_KILLPG(gid, signo) killpg (gid, signo) #else #ifdef WINDOWSNT -#define EMACS_KILLPG(gid, signo) (win32_kill_process (gid, signo)) +#define EMACS_KILLPG(gid, signo) (kill (gid, signo)) #else #define EMACS_KILLPG(gid, signo) kill (-(gid), signo) #endif
--- a/src/systime.h Mon Aug 13 09:13:58 2007 +0200 +++ b/src/systime.h Mon Aug 13 09:15:11 2007 +0200 @@ -34,6 +34,12 @@ #endif #endif +#if defined(WINDOWSNT) && defined(HAVE_X_WINDOWS) +/* Provides gettimeofday etc */ +#include <X11/Xw32defs.h> +#include <X11/Xos.h> +#endif + #ifdef HAVE_UTIME_H # include <utime.h> #endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/unexnt.c Mon Aug 13 09:15:11 2007 +0200 @@ -0,0 +1,588 @@ +/* unexec for GNU Emacs on Windows NT. + Copyright (C) 1994 Free Software Foundation, Inc. + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to the Free +Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. + + Geoff Voelker (voelker@cs.washington.edu) 8-12-94 */ + +/* Adapted for XEmacs by David Hobley <david@spook-le0.cia.com.au> */ + +#include <stdlib.h> /* _fmode */ +#include <stdio.h> +#include <fcntl.h> +#include <windows.h> + +#if 0 +extern BOOL ctrl_c_handler (unsigned long type); +#endif + +#include "ntheap.h" + +/* A convenient type for keeping all the info about a mapped file together. */ +typedef struct file_data { + char *name; + unsigned long size; + HANDLE file; + HANDLE file_mapping; + unsigned char *file_base; +} file_data; + +/* Basically, our "initialized" flag. */ +BOOL need_to_recreate_heap = FALSE; + +/* So we can find our heap in the file to recreate it. */ +unsigned long heap_index_in_executable = 0; + +void open_input_file (file_data *p_file, char *name); +void open_output_file (file_data *p_file, char *name, unsigned long size); +void close_file_data (file_data *p_file); + +void get_section_info (file_data *p_file); +void copy_executable_and_dump_data_section (file_data *, file_data *); +void dump_bss_and_heap (file_data *p_infile, file_data *p_outfile); + +/* Cached info about the .data section in the executable. */ +PUCHAR data_start_va = 0; +DWORD data_start_file = 0; +DWORD data_size = 0; + +/* Cached info about the .bss section in the executable. */ +PUCHAR bss_start = 0; +DWORD bss_size = 0; + +#ifdef HAVE_NTGUI +HINSTANCE hinst = NULL; +HINSTANCE hprevinst = NULL; +LPSTR lpCmdLine = ""; +int nCmdShow = 0; +#endif /* HAVE_NTGUI */ + +/* Startup code for running on NT. When we are running as the dumped + version, we need to bootstrap our heap and .bss section into our + address space before we can actually hand off control to the startup + code supplied by NT (primarily because that code relies upon malloc ()). */ +void +_start (void) +{ + extern void mainCRTStartup (void); + + /* Cache system info, e.g., the NT page size. */ + cache_system_info (); + + /* If we're a dumped version of emacs then we need to recreate + our heap and play tricks with our .bss section. Do this before + start up. (WARNING: Do not put any code before this section + that relies upon malloc () and runs in the dumped version. It + won't work.) */ + if (need_to_recreate_heap) + { + char executable_path[MAX_PATH]; + + if (GetModuleFileName (NULL, executable_path, MAX_PATH) == 0) + { + exit (1); + } + recreate_heap (executable_path); + need_to_recreate_heap = FALSE; + } + + /* The default behavior is to treat files as binary and patch up + text files appropriately, in accordance with the MSDOS code. */ + _fmode = O_BINARY; + +#if 0 + /* This prevents ctrl-c's in shells running while we're suspended from + having us exit. */ + SetConsoleCtrlHandler ((PHANDLER_ROUTINE) ctrl_c_handler, TRUE); +#endif + + /* Invoke the NT CRT startup routine now that our housecleaning + is finished. */ +#ifdef HAVE_NTGUI + /* determine WinMain args like crt0.c does */ + hinst = GetModuleHandle(NULL); + lpCmdLine = GetCommandLine(); + nCmdShow = SW_SHOWDEFAULT; +#endif + mainCRTStartup (); +} + +/* Dump out .data and .bss sections into a new executable. */ +void +unexec (char *new_name, char *old_name, void *start_data, void *start_bss, + void *entry_address) +{ + file_data in_file, out_file; + char out_filename[MAX_PATH], in_filename[MAX_PATH]; + unsigned long size; + char *ptr; + + /* Make sure that the input and output filenames have the + ".exe" extension...patch them up if they don't. */ + strcpy (in_filename, old_name); + ptr = in_filename + strlen (in_filename) - 4; + if (strcmp (ptr, ".exe")) + strcat (in_filename, ".exe"); + + strcpy (out_filename, new_name); + ptr = out_filename + strlen (out_filename) - 4; + if (strcmp (ptr, ".exe")) + strcat (out_filename, ".exe"); + + printf ("Dumping from %s\n", in_filename); + printf (" to %s\n", out_filename); + + /* We need to round off our heap to NT's allocation unit (64KB). */ + round_heap (get_allocation_unit ()); + + /* Open the undumped executable file. */ + open_input_file (&in_file, in_filename); + + /* Get the interesting section info, like start and size of .bss... */ + get_section_info (&in_file); + + /* The size of the dumped executable is the size of the original + executable plus the size of the heap and the size of the .bss section. */ + heap_index_in_executable = (unsigned long) + round_to_next ((unsigned char *) in_file.size, get_allocation_unit ()); + size = heap_index_in_executable + get_committed_heap_size () + bss_size; + open_output_file (&out_file, out_filename, size); + + /* Set the flag (before dumping). */ + need_to_recreate_heap = TRUE; + + copy_executable_and_dump_data_section (&in_file, &out_file); + dump_bss_and_heap (&in_file, &out_file); + + close_file_data (&in_file); + close_file_data (&out_file); +} + + +/* File handling. */ + + +void +open_input_file (file_data *p_file, char *filename) +{ + HANDLE file; + HANDLE file_mapping; + void *file_base; + unsigned long size, upper_size; + + file = CreateFile (filename, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (file == INVALID_HANDLE_VALUE) + { + printf ("Failed to open %s (%d)...bailing.\n", + filename, GetLastError ()); + exit (1); + } + + size = GetFileSize (file, &upper_size); + file_mapping = CreateFileMapping (file, NULL, PAGE_READONLY, + 0, size, NULL); + if (!file_mapping) + { + printf ("Failed to create file mapping of %s (%d)...bailing.\n", + filename, GetLastError ()); + exit (1); + } + + file_base = MapViewOfFile (file_mapping, FILE_MAP_READ, 0, 0, size); + if (file_base == 0) + { + printf ("Failed to map view of file of %s (%d)...bailing.\n", + filename, GetLastError ()); + exit (1); + } + + p_file->name = filename; + p_file->size = size; + p_file->file = file; + p_file->file_mapping = file_mapping; + p_file->file_base = file_base; +} + +void +open_output_file (file_data *p_file, char *filename, unsigned long size) +{ + HANDLE file; + HANDLE file_mapping; + void *file_base; + int i; + + file = CreateFile (filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); + if (file == INVALID_HANDLE_VALUE) + { + i = GetLastError (); + printf ("open_output_file: Failed to open %s (%d).\n", + filename, i); + exit (1); + } + + file_mapping = CreateFileMapping (file, NULL, PAGE_READWRITE, + 0, size, NULL); + if (!file_mapping) + { + i = GetLastError (); + printf ("open_output_file: Failed to create file mapping of %s (%d).\n", + filename, i); + exit (1); + } + + file_base = MapViewOfFile (file_mapping, FILE_MAP_WRITE, 0, 0, size); + if (file_base == 0) + { + i = GetLastError (); + printf ("open_output_file: Failed to map view of file of %s (%d).\n", + filename, i); + exit (1); + } + + p_file->name = filename; + p_file->size = size; + p_file->file = file; + p_file->file_mapping = file_mapping; + p_file->file_base = file_base; +} + +/* Close the system structures associated with the given file. */ +static void +close_file_data (file_data *p_file) +{ + UnmapViewOfFile (p_file->file_base); + CloseHandle (p_file->file_mapping); + CloseHandle (p_file->file); +} + + +/* Routines to manipulate NT executable file sections. */ + +static void +get_bss_info_from_map_file (file_data *p_infile, PUCHAR *p_bss_start, + DWORD *p_bss_size) +{ + int n, start, len; + char map_filename[MAX_PATH]; + char buffer[256]; + FILE *map; + + /* Overwrite the .exe extension on the executable file name with + the .map extension. */ + strcpy (map_filename, p_infile->name); + n = strlen (map_filename) - 3; + strcpy (&map_filename[n], "map"); + + map = fopen (map_filename, "r"); + if (!map) + { + printf ("Failed to open map file %s, error %d...bailing out.\n", + map_filename, GetLastError ()); + exit (-1); + } + + while (fgets (buffer, sizeof (buffer), map)) + { + if (!(strstr (buffer, ".bss") && strstr (buffer, "DATA"))) + continue; + n = sscanf (buffer, " %*d:%x %x", &start, &len); + if (n != 2) + { + printf ("Failed to scan the .bss section line:\n%s", buffer); + exit (-1); + } + break; + } + *p_bss_start = (PUCHAR) start; + *p_bss_size = (DWORD) len; +} + +static unsigned long +get_section_size (PIMAGE_SECTION_HEADER p_section) +{ + /* The section size is in different locations in the different versions. */ + switch (get_nt_minor_version ()) + { + case 10: + return p_section->SizeOfRawData; + default: + return p_section->Misc.VirtualSize; + } +} + +/* Flip through the executable and cache the info necessary for dumping. */ +static void +get_section_info (file_data *p_infile) +{ + PIMAGE_DOS_HEADER dos_header; + PIMAGE_NT_HEADERS nt_header; + PIMAGE_SECTION_HEADER section, data_section; + unsigned char *ptr; + int i; + + dos_header = (PIMAGE_DOS_HEADER) p_infile->file_base; + if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) + { + printf ("Unknown EXE header in %s...bailing.\n", p_infile->name); + exit (1); + } + nt_header = (PIMAGE_NT_HEADERS) (((unsigned long) dos_header) + + dos_header->e_lfanew); + if (nt_header == NULL) + { + printf ("Failed to find IMAGE_NT_HEADER in %s...bailing.\n", + p_infile->name); + exit (1); + } + + /* Check the NT header signature ... */ + if (nt_header->Signature != IMAGE_NT_SIGNATURE) + { + printf ("Invalid IMAGE_NT_SIGNATURE 0x%x in %s...bailing.\n", + nt_header->Signature, p_infile->name); + } + + /* Flip through the sections for .data and .bss ... */ + section = (PIMAGE_SECTION_HEADER) IMAGE_FIRST_SECTION (nt_header); + for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++) + { + if (!strcmp (section->Name, ".bss")) + { + /* The .bss section. */ + ptr = (char *) nt_header->OptionalHeader.ImageBase + + section->VirtualAddress; + bss_start = ptr; + bss_size = get_section_size (section); + } + if (!strcmp (section->Name, ".data")) + { + /* From lastfile.c */ + extern char my_edata[]; + + /* The .data section. */ + data_section = section; + ptr = (char *) nt_header->OptionalHeader.ImageBase + + section->VirtualAddress; + data_start_va = ptr; + data_start_file = section->PointerToRawData; + + /* We want to only write Emacs data back to the executable, + not any of the library data (if library data is included, + then a dumped Emacs won't run on system versions other + than the one Emacs was dumped on). */ + data_size = my_edata - data_start_va; + } + section++; + } + + if (!bss_start && !bss_size) + { + /* Starting with MSVC 4.0, the .bss section has been eliminated + and appended virtually to the end of the .data section. Our + only hint about where the .bss section starts in the address + comes from the SizeOfRawData field in the .data section + header. Unfortunately, this field is only approximate, as it + is a rounded number and is typically rounded just beyond the + start of the .bss section. To find the start and size of the + .bss section exactly, we have to peek into the map file. */ + get_bss_info_from_map_file (p_infile, &ptr, &bss_size); + bss_start = ptr + nt_header->OptionalHeader.ImageBase + + data_section->VirtualAddress; + } +} + + +/* The dump routines. */ + +static void +copy_executable_and_dump_data_section (file_data *p_infile, + file_data *p_outfile) +{ + unsigned char *data_file, *data_va; + unsigned long size, index; + + /* Get a pointer to where the raw data should go in the executable file. */ + data_file = (char *) p_outfile->file_base + data_start_file; + + /* Get a pointer to the raw data in our address space. */ + data_va = data_start_va; + + size = (DWORD) data_file - (DWORD) p_outfile->file_base; + printf ("Copying executable up to data section...\n"); + printf ("\t0x%08x Offset in input file.\n", 0); + printf ("\t0x%08x Offset in output file.\n", 0); + printf ("\t0x%08x Size in bytes.\n", size); + memcpy (p_outfile->file_base, p_infile->file_base, size); + + size = data_size; + printf ("Dumping .data section...\n"); + printf ("\t0x%08x Address in process.\n", data_va); + printf ("\t0x%08x Offset in output file.\n", + data_file - p_outfile->file_base); + printf ("\t0x%08x Size in bytes.\n", size); + memcpy (data_file, data_va, size); + + index = (DWORD) data_file + size - (DWORD) p_outfile->file_base; + size = p_infile->size - index; + printf ("Copying rest of executable...\n"); + printf ("\t0x%08x Offset in input file.\n", index); + printf ("\t0x%08x Offset in output file.\n", index); + printf ("\t0x%08x Size in bytes.\n", size); + memcpy ((char *) p_outfile->file_base + index, + (char *) p_infile->file_base + index, size); +} + +static void +dump_bss_and_heap (file_data *p_infile, file_data *p_outfile) +{ + unsigned char *heap_data, *bss_data; + unsigned long size, index; + + printf ("Dumping heap into executable...\n"); + + index = heap_index_in_executable; + size = get_committed_heap_size (); + heap_data = get_heap_start (); + + printf ("\t0x%08x Heap start in process.\n", heap_data); + printf ("\t0x%08x Heap offset in executable.\n", index); + printf ("\t0x%08x Heap size in bytes.\n", size); + + memcpy ((PUCHAR) p_outfile->file_base + index, heap_data, size); + + printf ("Dumping .bss into executable...\n"); + + index += size; + size = bss_size; + bss_data = bss_start; + + printf ("\t0x%08x BSS start in process.\n", bss_data); + printf ("\t0x%08x BSS offset in executable.\n", index); + printf ("\t0x%08x BSS size in bytes.\n", size); + memcpy ((char *) p_outfile->file_base + index, bss_data, size); +} + + +/* Reload and remap routines. */ + + +/* Load the dumped .bss section into the .bss area of our address space. */ +void +read_in_bss (char *filename) +{ + HANDLE file; + unsigned long size, index, n_read, total_read; + char buffer[512], *bss; + int i; + + file = CreateFile (filename, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (file == INVALID_HANDLE_VALUE) + { + i = GetLastError (); + exit (1); + } + + /* Seek to where the .bss section is tucked away after the heap... */ + index = heap_index_in_executable + get_committed_heap_size (); + if (SetFilePointer (file, index, NULL, FILE_BEGIN) == 0xFFFFFFFF) + { + i = GetLastError (); + exit (1); + } + + + /* Ok, read in the saved .bss section and initialize all + uninitialized variables. */ + if (!ReadFile (file, bss_start, bss_size, &n_read, NULL)) + { + i = GetLastError (); + exit (1); + } + + CloseHandle (file); +} + +/* Map the heap dumped into the executable file into our address space. */ +void +map_in_heap (char *filename) +{ + HANDLE file; + HANDLE file_mapping; + void *file_base; + unsigned long size, upper_size, n_read; + int i; + + file = CreateFile (filename, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (file == INVALID_HANDLE_VALUE) + { + i = GetLastError (); + exit (1); + } + + size = GetFileSize (file, &upper_size); + file_mapping = CreateFileMapping (file, NULL, PAGE_WRITECOPY, + 0, size, NULL); + if (!file_mapping) + { + i = GetLastError (); + exit (1); + } + + size = get_committed_heap_size (); + file_base = MapViewOfFileEx (file_mapping, FILE_MAP_COPY, 0, + heap_index_in_executable, size, + get_heap_start ()); + if (file_base != 0) + { + return; + } + + /* If we don't succeed with the mapping, then copy from the + data into the heap. */ + + CloseHandle (file_mapping); + + if (VirtualAlloc (get_heap_start (), get_committed_heap_size (), + MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE) == NULL) + { + i = GetLastError (); + exit (1); + } + + /* Seek to the location of the heap data in the executable. */ + i = heap_index_in_executable; + if (SetFilePointer (file, i, NULL, FILE_BEGIN) == 0xFFFFFFFF) + { + i = GetLastError (); + exit (1); + } + + /* Read in the data. */ + if (!ReadFile (file, get_heap_start (), + get_committed_heap_size (), &n_read, NULL)) + { + i = GetLastError (); + exit (1); + } + + CloseHandle (file); +}