#!/bin/sh #### Patch script - GNU Emacs - version 19.20 to 19.21 #### This file contains patches to turn version 19.20 of GNU Emacs into #### 19.21. To apply them, cd to the top of the Emacs source tree, and #### then type 'sh '. #### After you apply the patches, you should run Emacs (an earlier 19 will do) #### and type M-x byte-recompile-directory RET lisp RET #### to recompile the changed Emacs Lisp files. #### Then you can build the new Emacs version. #### We don't include patches for Info files since you can #### regenerate them from the Texinfo files that we do include. #### To update the changed info files, do #### (cd man; makeinfo emacs.texi) ### Patchmaker's checklist: ### - update version numbers in comments and version.el tweak ### - diff -u ls -R listings, and decide on rm's and mv's. ### - apply rm's and mv's, and then do a diff -cprP --exclude=\*.elc ### to generate the body. ### - insert the body just before the line saying `end-of-emacs-patch-kit'. if [ -d lisp ] ; then true else if [ -d emacs-19.20/lisp ] ; then cd emacs-19.20 else (echo "$0: In order to apply this patch, the current directory" echo "must be the top of the Emacs distribution tree.") >&2 exit 1 fi fi ### We can't patch version.el, because it contains some random dump ### number. So we'll be a little more relaxed about this edit. sed < lisp/version.el > $$ \ -e 's/defconst emacs-version "[^"]*"/defconst emacs-version "19.21.0"/' mv lisp/version.el lisp/version.el~ mv $$ lisp/version.el ### Put moves and renames here. (rm lisp/forms.README) patch -p1 << \end-of-emacs-patch-kit diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/ChangeLog emacs-19.21/ChangeLog *** emacs-19.20/ChangeLog Thu Nov 11 19:35:49 1993 --- emacs-19.21/ChangeLog Tue Nov 16 04:20:00 1993 *************** *** 1,5 **** --- 1,23 ---- + Tue Nov 16 00:56:51 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Version 19.21 released. + + * Makefile.in (mkdir): Ignore error from chmod. + + Mon Nov 15 05:11:55 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * make-dist: Don't put lisp/forms.README in the distribution. + + Sat Nov 13 04:37:15 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * configure.in (creating src/Makefile): Before running cpp, + discard all lines that start with `# Generated' or /**/#. + Thu Nov 11 09:52:37 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) * Version 19.20 released. + + * make-dist: Use build-ins.in, not build-install.in. + Don't bother updating TAGS since it's not included. * build-ins.in: Renamed from build-install.in. diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/Makefile.in emacs-19.21/Makefile.in *** emacs-19.20/Makefile.in Sun Oct 3 15:54:56 1993 --- emacs-19.21/Makefile.in Tue Nov 16 00:56:49 1993 *************** *** 307,311 **** ${bindir} ${datadir} ${libdir} \ `echo ${locallisppath} | sed 's/:/ /'` ! chmod 777 ${COPYDESTS} ${lockdir} ### Delete all the installed files that the `install' target would --- 307,311 ---- ${bindir} ${datadir} ${libdir} \ `echo ${locallisppath} | sed 's/:/ /'` ! -chmod 777 ${COPYDESTS} ${lockdir} ### Delete all the installed files that the `install' target would diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/PROBLEMS emacs-19.21/PROBLEMS *** emacs-19.20/PROBLEMS Fri Sep 24 14:32:29 1993 --- emacs-19.21/PROBLEMS Tue Nov 16 07:13:06 1993 *************** *** 2,5 **** --- 2,18 ---- in compiling, installing and running GNU Emacs. + * You configure Emacs to use a directory such as /usr/local/sun3.lib/emacs + and the directory name gets mangled in the process of building Emacs. + + This is because building Emacs involves passing a makefile through the + C preprocessor. The directory names that you specified go through + that process, and if they happen to use any predefined macro names, + those macro names get substituted. For example, if you are on a Sun + 3, the name `sun3' is a predefined macro. + + This is an Emacs bug, and will be fixed; but it was too risky to fix + for 19.21. For now, you must use different names for those + directories (perhaps via symbolic links). + * You "lose characters" after typing Compose Character key. diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/README emacs-19.21/README *** emacs-19.20/README Thu Nov 11 19:34:47 1993 --- emacs-19.21/README Tue Nov 16 07:10:49 1993 *************** *** 1,3 **** ! This directory tree holds version 19.0 of GNU Emacs, the extensible, customizable, self-documenting real-time display editor. --- 1,3 ---- ! This directory tree holds version 19.21 of GNU Emacs, the extensible, customizable, self-documenting real-time display editor. diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/configure emacs-19.21/configure *** emacs-19.20/configure Wed Nov 10 21:19:15 1993 --- emacs-19.21/configure Tue Nov 16 07:13:08 1993 *************** *** 2658,2665 **** fi topsrcdir=${srcdir} makefile_command='echo "creating src/Makefile"; topsrcdir='"${topsrcdir}"'; ( cd ./src; ! cp Makefile.in junk.c; eval `echo ${CPP} -I. -I${topsrcdir}/src ${CPPFLAGS} junk.c \>junk.cpp`; < junk.cpp '\ --- 2658,2669 ---- fi topsrcdir=${srcdir} + # We discard all lines in Makefile.in that start with `# Generated' or /**/# + # because some cpps get confused by them. + # Really we should preserve them somehow into Makefile, + # but that is beyond my level of shell programming. makefile_command='echo "creating src/Makefile"; topsrcdir='"${topsrcdir}"'; ( cd ./src; ! sed -e '\''s/^# Generated.*//'\'' -e '\''s%/\*\*/#.*%%'\'' < Makefile.in > junk.c; eval `echo ${CPP} -I. -I${topsrcdir}/src ${CPPFLAGS} junk.c \>junk.cpp`; < junk.cpp '\ diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/configure.in emacs-19.21/configure.in *** emacs-19.20/configure.in Wed Nov 10 15:20:30 1993 --- emacs-19.21/configure.in Tue Nov 16 07:13:09 1993 *************** *** 1408,1415 **** fi topsrcdir=${srcdir} makefile_command='echo "creating src/Makefile"; topsrcdir='"${topsrcdir}"'; ( cd ./src; ! cp Makefile.in junk.c; eval `echo ${CPP} -I. -I${topsrcdir}/src ${CPPFLAGS} junk.c \>junk.cpp`; < junk.cpp '\ --- 1408,1419 ---- fi topsrcdir=${srcdir} + # We discard all lines in Makefile.in that start with `# Generated' or /**/# + # because some cpps get confused by them. + # Really we should preserve them somehow into Makefile, + # but that is beyond my level of shell programming. makefile_command='echo "creating src/Makefile"; topsrcdir='"${topsrcdir}"'; ( cd ./src; ! sed -e '\''s/^# Generated.*//'\'' -e '\''s%/\*\*/#.*%%'\'' < Makefile.in > junk.c; eval `echo ${CPP} -I. -I${topsrcdir}/src ${CPPFLAGS} junk.c \>junk.cpp`; < junk.cpp '\ diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/etc/ChangeLog emacs-19.21/etc/ChangeLog *** emacs-19.20/etc/ChangeLog Thu Nov 11 12:55:47 1993 --- emacs-19.21/etc/ChangeLog Tue Nov 16 06:14:29 1993 *************** *** 1,2 **** --- 1,6 ---- + Tue Nov 16 06:14:24 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Version 19.21 released. + Thu Nov 11 12:55:39 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/etc/GNU emacs-19.21/etc/GNU *** emacs-19.20/etc/GNU Wed Jun 9 06:55:34 1993 --- emacs-19.21/etc/GNU Tue Nov 16 07:27:27 1993 *************** *** 1,475 **** - The GNU Manifesto - Copyright (C) 1985 Richard M. Stallman ! (Copying permission notice at the end.) What's GNU? Gnu's Not Unix! ! GNU, which stands for Gnu's Not Unix, is the name for the complete Unix-compatible software system which I am writing so that I can give it ! away free to everyone who can use it. Several other volunteers are helping ! me. Contributions of time, money, programs and equipment are greatly ! needed. ! ! So far we have an Emacs text editor with Lisp for writing editor commands, ! a source level debugger, a yacc-compatible parser generator, a linker, and ! around 35 utilities. A shell (command interpreter) is nearly completed. A ! new portable optimizing C compiler has compiled itself and may be released ! this year. An initial kernel exists but many more features are needed to ! emulate Unix. When the kernel and compiler are finished, it will be ! possible to distribute a GNU system suitable for program development. We ! will use @TeX{} as our text formatter, but an nroff is being worked on. We ! will use the free, portable X window system as well. After this we will ! add a portable Common Lisp, an Empire game, a spreadsheet, and hundreds of ! other things, plus on-line documentation. We hope to supply, eventually, everything useful that normally comes with a Unix system, and more. ! GNU will be able to run Unix programs, but will not be identical to Unix. ! We will make all improvements that are convenient, based on our experience ! with other operating systems. In particular, we plan to have longer ! filenames, file version numbers, a crashproof file system, filename ! completion perhaps, terminal-independent display support, and perhaps ! eventually a Lisp-based window system through which several Lisp programs ! and ordinary Unix programs can share a screen. Both C and Lisp will be ! available as system programming languages. We will try to support UUCP, ! MIT Chaosnet, and Internet protocols for communication. ! ! GNU is aimed initially at machines in the 68000/16000 class with virtual ! memory, because they are the easiest machines to make it run on. The extra ! effort to make it run on smaller machines will be left to someone who wants ! to use it on them. ! ! To avoid horrible confusion, please pronounce the `G' in the word `GNU' ! when it is the name of this project. ! ! ! Who Am I? ! ! I am Richard Stallman, inventor of the original much-imitated EMACS editor, ! formerly at the Artificial Intelligence Lab at MIT. I have worked ! extensively on compilers, editors, debuggers, command interpreters, the ! Incompatible Timesharing System and the Lisp Machine operating system. I ! pioneered terminal-independent display support in ITS. Since then I have ! implemented one crashproof file system and two window systems for Lisp ! machines, and designed a third window system now being implemented; this ! one will be ported to many systems including use in GNU. [Historical note: ! The window system project was not completed; GNU now plans to use the ! X window system.] Why I Must Write GNU ! ! I consider that the golden rule requires that if I like a program I must ! share it with other people who like it. Software sellers want to divide ! the users and conquer them, making each user agree not to share with ! others. I refuse to break solidarity with other users in this way. I ! cannot in good conscience sign a nondisclosure agreement or a software ! license agreement. For years I worked within the Artificial Intelligence ! Lab to resist such tendencies and other inhospitalities, but eventually ! they had gone too far: I could not remain in an institution where such ! things are done for me against my will. ! ! So that I can continue to use computers without dishonor, I have decided to ! put together a sufficient body of free software so that I will be able to ! get along without any software that is not free. I have resigned from the ! AI lab to deny MIT any legal excuse to prevent me from giving GNU away. Why GNU Will Be Compatible with Unix ! Unix is not my ideal system, but it is not too bad. The essential features ! of Unix seem to be good ones, and I think I can fill in what Unix lacks ! without spoiling them. And a system compatible with Unix would be ! convenient for many other people to adopt. - How GNU Will Be Available ! ! GNU is not in the public domain. Everyone will be permitted to modify and ! redistribute GNU, but no distributor will be allowed to restrict its ! further redistribution. That is to say, proprietary modifications will not ! be allowed. I want to make sure that all versions of GNU remain free. Why Many Other Programmers Want to Help ! I have found many other programmers who are excited about GNU and want to ! help. ! Many programmers are unhappy about the commercialization of system ! software. It may enable them to make more money, but it requires them to ! feel in conflict with other programmers in general rather than feel as ! comrades. The fundamental act of friendship among programmers is the ! sharing of programs; marketing arrangements now typically used essentially ! forbid programmers to treat others as friends. The purchaser of software ! must choose between friendship and obeying the law. Naturally, many decide ! that friendship is more important. But those who believe in law often do ! not feel at ease with either choice. They become cynical and think that ! programming is just a way of making money. ! ! By working on and using GNU rather than proprietary programs, we can be ! hospitable to everyone and obey the law. In addition, GNU serves as an ! example to inspire and a banner to rally others to join us in sharing. ! This can give us a feeling of harmony which is impossible if we use ! software that is not free. For about half the programmers I talk to, this ! is an important happiness that money cannot replace. - How You Can Contribute ! ! I am asking computer manufacturers for donations of machines and money. ! I'm asking individuals for donations of programs and work. ! One consequence you can expect if you donate machines is that GNU will run ! on them at an early date. The machines should be complete, ready to use ! systems, approved for use in a residential area, and not in need of ! sophisticated cooling or power. ! ! I have found very many programmers eager to contribute part-time work for ! GNU. For most projects, such part-time distributed work would be very hard ! to coordinate; the independently-written parts would not work together. ! But for the particular task of replacing Unix, this problem is absent. A ! complete Unix system contains hundreds of utility programs, each of which ! is documented separately. Most interface specifications are fixed by Unix ! compatibility. If each contributor can write a compatible replacement for ! a single Unix utility, and make it work properly in place of the original ! on a Unix system, then these utilities will work right when put together. ! Even allowing for Murphy to create a few unexpected problems, assembling ! these components will be a feasible task. (The kernel will require closer ! communication and will be worked on by a small, tight group.) ! ! If I get donations of money, I may be able to hire a few people full or ! part time. The salary won't be high by programmers' standards, but I'm ! looking for people for whom building community spirit is as important as ! making money. I view this as a way of enabling dedicated people to devote ! their full energies to working on GNU by sparing them the need to make a ! living in another way. Why All Computer Users Will Benefit ! Once GNU is written, everyone will be able to obtain good system software ! free, just like air. ! This means much more than just saving everyone the price of a Unix license. ! It means that much wasteful duplication of system programming effort will ! be avoided. This effort can go instead into advancing the state of the ! art. ! ! Complete system sources will be available to everyone. As a result, a user ! who needs changes in the system will always be free to make them himself, ! or hire any available programmer or company to make them for him. Users ! will no longer be at the mercy of one programmer or company which owns the ! sources and is in sole position to make changes. ! ! Schools will be able to provide a much more educational environment by ! encouraging all students to study and improve the system code. Harvard's ! computer lab used to have the policy that no program could be installed on ! the system if its sources were not on public display, and upheld it by ! actually refusing to install certain programs. I was very much inspired by ! this. ! ! Finally, the overhead of considering who owns the system software and what ! one is or is not entitled to do with it will be lifted. ! ! Arrangements to make people pay for using a program, including licensing of ! copies, always incur a tremendous cost to society through the cumbersome ! mechanisms necessary to figure out how much (that is, which programs) a ! person must pay for. And only a police state can force everyone to obey ! them. Consider a space station where air must be manufactured at great ! cost: charging each breather per liter of air may be fair, but wearing the ! metered gas mask all day and all night is intolerable even if everyone can ! afford to pay the air bill. And the TV cameras everywhere to see if you ! ever take the mask off are outrageous. It's better to support the air ! plant with a head tax and chuck the masks. ! Copying all or parts of a program is as natural to a programmer as breathing, and as productive. It ought to be as free. - Some Easily Rebutted Objections to GNU's Goals ! "Nobody will use it if it is free, because that means ! they can't rely on any support." ! "You have to charge for the program ! to pay for providing the support." ! ! If people would rather pay for GNU plus service than get GNU free without ! service, a company to provide just service to people who have obtained GNU ! free ought to be profitable. ! ! We must distinguish between support in the form of real programming work ! and mere handholding. The former is something one cannot rely on from a ! software vendor. If your problem is not shared by enough people, the ! vendor will tell you to get lost. ! ! If your business needs to be able to rely on support, the only way is to ! have all the necessary sources and tools. Then you can hire any available ! person to fix your problem; you are not at the mercy of any individual. ! With Unix, the price of sources puts this out of consideration for most ! businesses. With GNU this will be easy. It is still possible for there to ! be no available competent person, but this problem cannot be blamed on ! distribution arrangements. GNU does not eliminate all the world's problems, ! only some of them. ! ! Meanwhile, the users who know nothing about computers need handholding: ! doing things for them which they could easily do themselves but don't know ! how. ! ! Such services could be provided by companies that sell just hand-holding ! and repair service. If it is true that users would rather spend money and ! get a product with service, they will also be willing to buy the service ! having got the product free. The service companies will compete in quality ! and price; users will not be tied to any particular one. Meanwhile, those ! of us who don't need the service should be able to use the program without ! paying for the service. ! ! "You cannot reach many people without advertising, ! and you must charge for the program to support that." ! "It's no use advertising a program people can get free." ! ! There are various forms of free or very cheap publicity that can be used to ! inform numbers of computer users about something like GNU. But it may be ! true that one can reach more microcomputer users with advertising. If this ! is really so, a business which advertises the service of copying and ! mailing GNU for a fee ought to be successful enough to pay for its ! advertising and more. This way, only the users who benefit from the ! advertising pay for it. ! ! On the other hand, if many people get GNU from their friends, and such ! companies don't succeed, this will show that advertising was not really ! necessary to spread GNU. Why is it that free market advocates don't want ! to let the free market decide this? ! ! "My company needs a proprietary operating system ! to get a competitive edge." ! ! GNU will remove operating system software from the realm of competition. ! You will not be able to get an edge in this area, but neither will your ! competitors be able to get an edge over you. You and they will compete in ! other areas, while benefiting mutually in this one. If your business is ! selling an operating system, you will not like GNU, but that's tough on ! you. If your business is something else, GNU can save you from being ! pushed into the expensive business of selling operating systems. ! ! I would like to see GNU development supported by gifts from many ! manufacturers and users, reducing the cost to each. ! ! "Don't programmers deserve a reward for their creativity?" ! ! If anything deserves a reward, it is social contribution. Creativity can ! be a social contribution, but only in so far as society is free to use the ! results. If programmers deserve to be rewarded for creating innovative ! programs, by the same token they deserve to be punished if they restrict ! the use of these programs. ! ! "Shouldn't a programmer be able to ask for a reward for his creativity?" ! ! There is nothing wrong with wanting pay for work, or seeking to maximize ! one's income, as long as one does not use means that are destructive. But ! the means customary in the field of software today are based on ! destruction. ! ! Extracting money from users of a program by restricting their use of it is ! destructive because the restrictions reduce the amount and the ways that ! the program can be used. This reduces the amount of wealth that humanity ! derives from the program. When there is a deliberate choice to restrict, ! the harmful consequences are deliberate destruction. ! ! The reason a good citizen does not use such destructive means to become ! wealthier is that, if everyone did so, we would all become poorer from the ! mutual destructiveness. This is Kantian ethics; or, the Golden Rule. ! Since I do not like the consequences that result if everyone hoards ! information, I am required to consider it wrong for one to do so. ! Specifically, the desire to be rewarded for one's creativity does not ! justify depriving the world in general of all or part of that creativity. ! ! "Won't programmers starve?" ! ! I could answer that nobody is forced to be a programmer. Most of us cannot ! manage to get any money for standing on the street and making faces. But ! we are not, as a result, condemned to spend our lives standing on the ! street making faces, and starving. We do something else. ! ! But that is the wrong answer because it accepts the questioner's implicit ! assumption: that without ownership of software, programmers cannot possibly ! be paid a cent. Supposedly it is all or nothing. ! The real reason programmers will not starve is that it will still be possible for them to get paid for programming; just not paid as much as now. ! Restricting copying is not the only basis for business in software. It is ! the most common basis because it brings in the most money. If it were ! prohibited, or rejected by the customer, software business would move to ! other bases of organization which are now used less often. There are ! always numerous ways to organize any kind of business. ! ! Probably programming will not be as lucrative on the new basis as it is ! now. But that is not an argument against the change. It is not considered ! an injustice that sales clerks make the salaries that they now do. If ! programmers made the same, that would not be an injustice either. (In ! practice they would still make considerably more than that.) ! ! "Don't people have a right to control how their creativity is used?" ! ! "Control over the use of one's ideas" really constitutes control over other ! people's lives; and it is usually used to make their lives more difficult. ! ! People who have studied the issue of intellectual property rights carefully ! (such as lawyers) say that there is no intrinsic right to intellectual ! property. The kinds of supposed intellectual property rights that the ! government recognizes were created by specific acts of legislation for ! specific purposes. ! ! For example, the patent system was established to encourage inventors to ! disclose the details of their inventions. Its purpose was to help society ! rather than to help inventors. At the time, the life span of 17 years for ! a patent was short compared with the rate of advance of the state of the ! art. Since patents are an issue only among manufacturers, for whom the ! cost and effort of a license agreement are small compared with setting up ! production, the patents often do not do much harm. They do not obstruct ! most individuals who use patented products. ! The idea of copyright did not exist in ancient times, when authors frequently copied other authors at length in works of non-fiction. This ! practice was useful, and is the only way many authors' works have survived ! even in part. The copyright system was created expressly for the purpose ! of encouraging authorship. In the domain for which it was invented--books, ! which could be copied economically only on a printing press--it did little ! harm, and did not obstruct most of the individuals who read the books. ! ! All intellectual property rights are just licenses granted by society ! because it was thought, rightly or wrongly, that society as a whole would ! benefit by granting them. But in any particular situation, we have to ask: ! are we really better off granting such license? What kind of act are we ! licensing a person to do? ! ! The case of programs today is very different from that of books a hundred ! years ago. The fact that the easiest way to copy a program is from one ! neighbor to another, the fact that a program has both source code and ! object code which are distinct, and the fact that a program is used rather ! than read and enjoyed, combine to create a situation in which a person who ! enforces a copyright is harming society as a whole both materially and ! spiritually; in which a person should not do so regardless of whether the ! law enables him to. ! ! "Competition makes things get done better." ! ! The paradigm of competition is a race: by rewarding the winner, we ! encourage everyone to run faster. When capitalism really works this way, ! it does a good job; but its defenders are wrong in assuming it always works ! this way. If the runners forget why the reward is offered and become ! intent on winning, no matter how, they may find other strategies--such as, ! attacking other runners. If the runners get into a fist fight, they will ! all finish late. ! ! Proprietary and secret software is the moral equivalent of runners in a ! fist fight. Sad to say, the only referee we've got does not seem to ! object to fights; he just regulates them ("For every ten yards you run, you ! are allowed one kick."). He really ought to break them up, and penalize ! runners for even trying to fight. ! ! "Won't everyone stop programming without a monetary incentive?" ! ! Actually, many people will program with absolutely no monetary incentive. ! Programming has an irresistible fascination for some people, usually the ! people who are best at it. There is no shortage of professional musicians ! who keep at it even though they have no hope of making a living that way. ! ! But really this question, though commonly asked, is not appropriate to the ! situation. Pay for programmers will not disappear, only become less. So ! the right question is, will anyone program with a reduced monetary ! incentive? My experience shows that they will. ! ! For more than ten years, many of the world's best programmers worked at the ! Artificial Intelligence Lab for far less money than they could have had ! anywhere else. They got many kinds of non-monetary rewards: fame and ! appreciation, for example. And creativity is also fun, a reward in itself. ! ! Then most of them left when offered a chance to do the same interesting ! work for a lot of money. ! ! What the facts show is that people will program for reasons other than ! riches; but if given a chance to make a lot of money as well, they will ! come to expect and demand it. Low-paying organizations do poorly in ! competition with high-paying ones, but they do not have to do badly if the ! high-paying ones are banned. ! "We need the programmers desperately. If they demand that we ! stop helping our neighbors, we have to obey." ! You're never so desperate that you have to obey this sort of demand. Remember: millions for defense, but not a cent for tribute! ! "Programmers need to make a living somehow." ! In the short run, this is true. However, there are plenty of ways that ! programmers could make a living without selling the right to use a program. ! This way is customary now because it brings programmers and businessmen the ! most money, not because it is the only way to make a living. It is easy to ! find other ways if you want to find them. Here are a number of examples. ! A manufacturer introducing a new computer will pay for the porting of operating systems onto the new hardware. ! The sale of teaching, hand-holding and maintenance services could also ! employ programmers. ! People with new ideas could distribute programs as freeware, asking for ! donations from satisfied users, or selling hand-holding services. I have ! met people who are already working this way successfully. ! ! Users with related needs can form users' groups, and pay dues. A group ! would contract with programming companies to write programs that the ! group's members would like to use. ! ! All sorts of development can be funded with a Software Tax: ! ! Suppose everyone who buys a computer has to pay x percent of ! the price as a software tax. The government gives this to ! an agency like the NSF to spend on software development. ! ! But if the computer buyer makes a donation to software development ! himself, he can take a credit against the tax. He can donate to ! the project of his own choosing--often, chosen because he hopes to ! use the results when it is done. He can take a credit for any amount ! of donation up to the total tax he had to pay. ! ! The total tax rate could be decided by a vote of the payers of ! the tax, weighted according to the amount they will be taxed on. ! ! The consequences: ! * the computer-using community supports software development. ! * this community decides what level of support is needed. ! * users who care which projects their share is spent on ! can choose this for themselves. ! ! In the long run, making programs free is a step toward the post-scarcity ! world, where nobody will have to work very hard just to make a living. ! People will be free to devote themselves to activities that are fun, ! such as programming, after spending the necessary ten hours a week ! on required tasks such as legislation, family counseling, robot ! repair and asteroid prospecting. There will be no need to be able ! to make a living from programming. ! We have already greatly reduced the amount of work that the whole society must do for its actual productivity, but only a little of this has translated itself into leisure for workers because much nonproductive activity is required to accompany productive activity. ! The main causes of this are bureaucracy and isometric struggles ! against competition. Free software will greatly reduce these ! drains in the area of software production. We must do this, ! in order for technical gains in productivity to translate into ! less work for us. ! ! Copyright (C) 1985 Richard M. Stallman ! Permission is granted to anyone to make or distribute verbatim copies ! of this document as received, in any medium, provided that the ! copyright notice and permission notice are preserved, ! and that the distributor grants the recipient permission ! for further redistribution as permitted by this notice. ! ! Modified versions may not be made. --- 1,532 ---- Copyright (C) 1985 Richard M. Stallman ! ! Permission is granted to anyone to make or distribute verbatim copies ! of this document, in any medium, provided that the copyright notice and ! permission notice are preserved, and that the distributor grants the ! recipient permission for further redistribution as permitted by this ! notice. ! ! Modified versions may not be made. ! ! The GNU Manifesto ! ***************** + The GNU Manifesto which appears below was written by Richard + Stallman at the beginning of the GNU project, to ask for + participation and support. For the first few years, it was + updated in minor ways to account for developments, but now it + seems best to leave it unchanged as most people have seen it. + + Since that time, we have learned about certain common + misunderstandings that different wording could help avoid. + Footnotes help clarify these points. + + For up-to-date information about the available GNU software, + please see the latest issue of the GNU's Bulletin. The list is + much too long to include here. + What's GNU? Gnu's Not Unix! + ============================ ! GNU, which stands for Gnu's Not Unix, is the name for the complete Unix-compatible software system which I am writing so that I can give it ! away free to everyone who can use it.(1) Several other volunteers are ! helping me. Contributions of time, money, programs and equipment are ! greatly needed. ! ! So far we have an Emacs text editor with Lisp for writing editor ! commands, a source level debugger, a yacc-compatible parser generator, ! a linker, and around 35 utilities. A shell (command interpreter) is ! nearly completed. A new portable optimizing C compiler has compiled ! itself and may be released this year. An initial kernel exists but ! many more features are needed to emulate Unix. When the kernel and ! compiler are finished, it will be possible to distribute a GNU system ! suitable for program development. We will use TeX as our text ! formatter, but an nroff is being worked on. We will use the free, ! portable X window system as well. After this we will add a portable ! Common Lisp, an Empire game, a spreadsheet, and hundreds of other ! things, plus on-line documentation. We hope to supply, eventually, everything useful that normally comes with a Unix system, and more. ! GNU will be able to run Unix programs, but will not be identical to ! Unix. We will make all improvements that are convenient, based on our ! experience with other operating systems. In particular, we plan to ! have longer file names, file version numbers, a crashproof file system, ! file name completion perhaps, terminal-independent display support, and ! perhaps eventually a Lisp-based window system through which several ! Lisp programs and ordinary Unix programs can share a screen. Both C ! and Lisp will be available as system programming languages. We will ! try to support UUCP, MIT Chaosnet, and Internet protocols for ! communication. ! ! GNU is aimed initially at machines in the 68000/16000 class with ! virtual memory, because they are the easiest machines to make it run ! on. The extra effort to make it run on smaller machines will be left ! to someone who wants to use it on them. + To avoid horrible confusion, please pronounce the `G' in the word + `GNU' when it is the name of this project. Why I Must Write GNU ! ==================== + I consider that the golden rule requires that if I like a program I + must share it with other people who like it. Software sellers want to + divide the users and conquer them, making each user agree not to share + with others. I refuse to break solidarity with other users in this + way. I cannot in good conscience sign a nondisclosure agreement or a + software license agreement. For years I worked within the Artificial + Intelligence Lab to resist such tendencies and other inhospitalities, + but eventually they had gone too far: I could not remain in an + institution where such things are done for me against my will. + + So that I can continue to use computers without dishonor, I have + decided to put together a sufficient body of free software so that I + will be able to get along without any software that is not free. I + have resigned from the AI lab to deny MIT any legal excuse to prevent + me from giving GNU away. Why GNU Will Be Compatible with Unix + ==================================== ! Unix is not my ideal system, but it is not too bad. The essential ! features of Unix seem to be good ones, and I think I can fill in what ! Unix lacks without spoiling them. And a system compatible with Unix ! would be convenient for many other people to adopt. How GNU Will Be Available ! ========================= + GNU is not in the public domain. Everyone will be permitted to + modify and redistribute GNU, but no distributor will be allowed to + restrict its further redistribution. That is to say, proprietary + modifications will not be allowed. I want to make sure that all + versions of GNU remain free. Why Many Other Programmers Want to Help + ======================================= ! I have found many other programmers who are excited about GNU and ! want to help. ! Many programmers are unhappy about the commercialization of system ! software. It may enable them to make more money, but it requires them ! to feel in conflict with other programmers in general rather than feel ! as comrades. The fundamental act of friendship among programmers is the ! sharing of programs; marketing arrangements now typically used ! essentially forbid programmers to treat others as friends. The ! purchaser of software must choose between friendship and obeying the ! law. Naturally, many decide that friendship is more important. But ! those who believe in law often do not feel at ease with either choice. ! They become cynical and think that programming is just a way of making ! money. ! ! By working on and using GNU rather than proprietary programs, we can ! be hospitable to everyone and obey the law. In addition, GNU serves as ! an example to inspire and a banner to rally others to join us in ! sharing. This can give us a feeling of harmony which is impossible if ! we use software that is not free. For about half the programmers I ! talk to, this is an important happiness that money cannot replace. How You Can Contribute ! ====================== ! I am asking computer manufacturers for donations of machines and ! money. I'm asking individuals for donations of programs and work. + One consequence you can expect if you donate machines is that GNU + will run on them at an early date. The machines should be complete, + ready to use systems, approved for use in a residential area, and not + in need of sophisticated cooling or power. + + I have found very many programmers eager to contribute part-time + work for GNU. For most projects, such part-time distributed work would + be very hard to coordinate; the independently-written parts would not + work together. But for the particular task of replacing Unix, this + problem is absent. A complete Unix system contains hundreds of utility + programs, each of which is documented separately. Most interface + specifications are fixed by Unix compatibility. If each contributor + can write a compatible replacement for a single Unix utility, and make + it work properly in place of the original on a Unix system, then these + utilities will work right when put together. Even allowing for Murphy + to create a few unexpected problems, assembling these components will + be a feasible task. (The kernel will require closer communication and + will be worked on by a small, tight group.) + + If I get donations of money, I may be able to hire a few people full + or part time. The salary won't be high by programmers' standards, but + I'm looking for people for whom building community spirit is as + important as making money. I view this as a way of enabling dedicated + people to devote their full energies to working on GNU by sparing them + the need to make a living in another way. Why All Computer Users Will Benefit + =================================== ! Once GNU is written, everyone will be able to obtain good system ! software free, just like air.(2) ! This means much more than just saving everyone the price of a Unix ! license. It means that much wasteful duplication of system programming ! effort will be avoided. This effort can go instead into advancing the ! state of the art. ! ! Complete system sources will be available to everyone. As a result, ! a user who needs changes in the system will always be free to make them ! himself, or hire any available programmer or company to make them for ! him. Users will no longer be at the mercy of one programmer or company ! which owns the sources and is in sole position to make changes. ! ! Schools will be able to provide a much more educational environment ! by encouraging all students to study and improve the system code. ! Harvard's computer lab used to have the policy that no program could be ! installed on the system if its sources were not on public display, and ! upheld it by actually refusing to install certain programs. I was very ! much inspired by this. ! ! Finally, the overhead of considering who owns the system software ! and what one is or is not entitled to do with it will be lifted. ! ! Arrangements to make people pay for using a program, including ! licensing of copies, always incur a tremendous cost to society through ! the cumbersome mechanisms necessary to figure out how much (that is, ! which programs) a person must pay for. And only a police state can ! force everyone to obey them. Consider a space station where air must ! be manufactured at great cost: charging each breather per liter of air ! may be fair, but wearing the metered gas mask all day and all night is ! intolerable even if everyone can afford to pay the air bill. And the ! TV cameras everywhere to see if you ever take the mask off are ! outrageous. It's better to support the air plant with a head tax and ! chuck the masks. ! Copying all or parts of a program is as natural to a programmer as breathing, and as productive. It ought to be as free. Some Easily Rebutted Objections to GNU's Goals + ============================================== + + "Nobody will use it if it is free, because that means they can't + rely on any support." + + "You have to charge for the program to pay for providing the + support." ! If people would rather pay for GNU plus service than get GNU free ! without service, a company to provide just service to people who have ! obtained GNU free ought to be profitable.(3) ! ! We must distinguish between support in the form of real programming ! work and mere handholding. The former is something one cannot rely on ! from a software vendor. If your problem is not shared by enough ! people, the vendor will tell you to get lost. ! ! If your business needs to be able to rely on support, the only way ! is to have all the necessary sources and tools. Then you can hire any ! available person to fix your problem; you are not at the mercy of any ! individual. With Unix, the price of sources puts this out of ! consideration for most businesses. With GNU this will be easy. It is ! still possible for there to be no available competent person, but this ! problem cannot be blamed on distribution arrangements. GNU does not ! eliminate all the world's problems, only some of them. ! ! Meanwhile, the users who know nothing about computers need ! handholding: doing things for them which they could easily do ! themselves but don't know how. ! ! Such services could be provided by companies that sell just ! hand-holding and repair service. If it is true that users would rather ! spend money and get a product with service, they will also be willing ! to buy the service having got the product free. The service companies ! will compete in quality and price; users will not be tied to any ! particular one. Meanwhile, those of us who don't need the service ! should be able to use the program without paying for the service. ! ! "You cannot reach many people without advertising, and you must ! charge for the program to support that." ! ! "It's no use advertising a program people can get free." ! ! There are various forms of free or very cheap publicity that can be ! used to inform numbers of computer users about something like GNU. But ! it may be true that one can reach more microcomputer users with ! advertising. If this is really so, a business which advertises the ! service of copying and mailing GNU for a fee ought to be successful ! enough to pay for its advertising and more. This way, only the users ! who benefit from the advertising pay for it. ! ! On the other hand, if many people get GNU from their friends, and ! such companies don't succeed, this will show that advertising was not ! really necessary to spread GNU. Why is it that free market advocates ! don't want to let the free market decide this?(4) ! ! "My company needs a proprietary operating system to get a ! competitive edge." ! ! GNU will remove operating system software from the realm of ! competition. You will not be able to get an edge in this area, but ! neither will your competitors be able to get an edge over you. You and ! they will compete in other areas, while benefiting mutually in this ! one. If your business is selling an operating system, you will not ! like GNU, but that's tough on you. If your business is something else, ! GNU can save you from being pushed into the expensive business of ! selling operating systems. ! ! I would like to see GNU development supported by gifts from many ! manufacturers and users, reducing the cost to each.(5) ! ! "Don't programmers deserve a reward for their creativity?" ! ! If anything deserves a reward, it is social contribution. ! Creativity can be a social contribution, but only in so far as society ! is free to use the results. If programmers deserve to be rewarded for ! creating innovative programs, by the same token they deserve to be ! punished if they restrict the use of these programs. ! ! "Shouldn't a programmer be able to ask for a reward for his ! creativity?" ! ! There is nothing wrong with wanting pay for work, or seeking to ! maximize one's income, as long as one does not use means that are ! destructive. But the means customary in the field of software today ! are based on destruction. ! ! Extracting money from users of a program by restricting their use of ! it is destructive because the restrictions reduce the amount and the ! ways that the program can be used. This reduces the amount of wealth ! that humanity derives from the program. When there is a deliberate ! choice to restrict, the harmful consequences are deliberate destruction. ! ! The reason a good citizen does not use such destructive means to ! become wealthier is that, if everyone did so, we would all become ! poorer from the mutual destructiveness. This is Kantian ethics; or, ! the Golden Rule. Since I do not like the consequences that result if ! everyone hoards information, I am required to consider it wrong for one ! to do so. Specifically, the desire to be rewarded for one's creativity ! does not justify depriving the world in general of all or part of that ! creativity. ! ! "Won't programmers starve?" ! ! I could answer that nobody is forced to be a programmer. Most of us ! cannot manage to get any money for standing on the street and making ! faces. But we are not, as a result, condemned to spend our lives ! standing on the street making faces, and starving. We do something ! else. ! ! But that is the wrong answer because it accepts the questioner's ! implicit assumption: that without ownership of software, programmers ! cannot possibly be paid a cent. Supposedly it is all or nothing. ! The real reason programmers will not starve is that it will still be possible for them to get paid for programming; just not paid as much as now. ! Restricting copying is not the only basis for business in software. ! It is the most common basis because it brings in the most money. If it ! were prohibited, or rejected by the customer, software business would ! move to other bases of organization which are now used less often. ! There are always numerous ways to organize any kind of business. ! ! Probably programming will not be as lucrative on the new basis as it ! is now. But that is not an argument against the change. It is not ! considered an injustice that sales clerks make the salaries that they ! now do. If programmers made the same, that would not be an injustice ! either. (In practice they would still make considerably more than ! that.) ! ! "Don't people have a right to control how their creativity is ! used?" ! ! "Control over the use of one's ideas" really constitutes control over ! other people's lives; and it is usually used to make their lives more ! difficult. ! ! People who have studied the issue of intellectual property rights ! carefully (such as lawyers) say that there is no intrinsic right to ! intellectual property. The kinds of supposed intellectual property ! rights that the government recognizes were created by specific acts of ! legislation for specific purposes. ! ! For example, the patent system was established to encourage ! inventors to disclose the details of their inventions. Its purpose was ! to help society rather than to help inventors. At the time, the life ! span of 17 years for a patent was short compared with the rate of ! advance of the state of the art. Since patents are an issue only among ! manufacturers, for whom the cost and effort of a license agreement are ! small compared with setting up production, the patents often do not do ! much harm. They do not obstruct most individuals who use patented ! products. ! The idea of copyright did not exist in ancient times, when authors frequently copied other authors at length in works of non-fiction. This ! practice was useful, and is the only way many authors' works have ! survived even in part. The copyright system was created expressly for ! the purpose of encouraging authorship. In the domain for which it was ! invented--books, which could be copied economically only on a printing ! press--it did little harm, and did not obstruct most of the individuals ! who read the books. ! ! All intellectual property rights are just licenses granted by society ! because it was thought, rightly or wrongly, that society as a whole ! would benefit by granting them. But in any particular situation, we ! have to ask: are we really better off granting such license? What kind ! of act are we licensing a person to do? ! ! The case of programs today is very different from that of books a ! hundred years ago. The fact that the easiest way to copy a program is ! from one neighbor to another, the fact that a program has both source ! code and object code which are distinct, and the fact that a program is ! used rather than read and enjoyed, combine to create a situation in ! which a person who enforces a copyright is harming society as a whole ! both materially and spiritually; in which a person should not do so ! regardless of whether the law enables him to. ! ! "Competition makes things get done better." ! ! The paradigm of competition is a race: by rewarding the winner, we ! encourage everyone to run faster. When capitalism really works this ! way, it does a good job; but its defenders are wrong in assuming it ! always works this way. If the runners forget why the reward is offered ! and become intent on winning, no matter how, they may find other ! strategies--such as, attacking other runners. If the runners get into ! a fist fight, they will all finish late. ! ! Proprietary and secret software is the moral equivalent of runners ! in a fist fight. Sad to say, the only referee we've got does not seem ! to object to fights; he just regulates them ("For every ten yards you ! run, you can fire one shot"). He really ought to break them up, and ! penalize runners for even trying to fight. ! ! "Won't everyone stop programming without a monetary incentive?" ! ! Actually, many people will program with absolutely no monetary ! incentive. Programming has an irresistible fascination for some ! people, usually the people who are best at it. There is no shortage of ! professional musicians who keep at it even though they have no hope of ! making a living that way. ! ! But really this question, though commonly asked, is not appropriate ! to the situation. Pay for programmers will not disappear, only become ! less. So the right question is, will anyone program with a reduced ! monetary incentive? My experience shows that they will. ! ! For more than ten years, many of the world's best programmers worked ! at the Artificial Intelligence Lab for far less money than they could ! have had anywhere else. They got many kinds of non-monetary rewards: ! fame and appreciation, for example. And creativity is also fun, a ! reward in itself. ! ! Then most of them left when offered a chance to do the same ! interesting work for a lot of money. ! ! What the facts show is that people will program for reasons other ! than riches; but if given a chance to make a lot of money as well, they ! will come to expect and demand it. Low-paying organizations do poorly ! in competition with high-paying ones, but they do not have to do badly ! if the high-paying ones are banned. ! "We need the programmers desperately. If they demand that we stop ! helping our neighbors, we have to obey." ! You're never so desperate that you have to obey this sort of demand. Remember: millions for defense, but not a cent for tribute! ! "Programmers need to make a living somehow." ! In the short run, this is true. However, there are plenty of ways ! that programmers could make a living without selling the right to use a ! program. This way is customary now because it brings programmers and ! businessmen the most money, not because it is the only way to make a ! living. It is easy to find other ways if you want to find them. Here ! are a number of examples. ! A manufacturer introducing a new computer will pay for the porting of operating systems onto the new hardware. ! The sale of teaching, hand-holding and maintenance services could ! also employ programmers. ! People with new ideas could distribute programs as freeware, asking ! for donations from satisfied users, or selling hand-holding services. ! I have met people who are already working this way successfully. ! Users with related needs can form users' groups, and pay dues. A ! group would contract with programming companies to write programs that ! the group's members would like to use. ! ! All sorts of development can be funded with a Software Tax: ! ! Suppose everyone who buys a computer has to pay x percent of the ! price as a software tax. The government gives this to an agency ! like the NSF to spend on software development. ! ! But if the computer buyer makes a donation to software development ! himself, he can take a credit against the tax. He can donate to ! the project of his own choosing--often, chosen because he hopes to ! use the results when it is done. He can take a credit for any ! amount of donation up to the total tax he had to pay. ! ! The total tax rate could be decided by a vote of the payers of the ! tax, weighted according to the amount they will be taxed on. ! ! The consequences: ! ! * The computer-using community supports software development. ! ! * This community decides what level of support is needed. ! ! * Users who care which projects their share is spent on can ! choose this for themselves. ! ! In the long run, making programs free is a step toward the ! post-scarcity world, where nobody will have to work very hard just to ! make a living. People will be free to devote themselves to activities ! that are fun, such as programming, after spending the necessary ten ! hours a week on required tasks such as legislation, family counseling, ! robot repair and asteroid prospecting. There will be no need to be ! able to make a living from programming. ! ! We have already greatly reduced the amount of work that the whole society must do for its actual productivity, but only a little of this has translated itself into leisure for workers because much nonproductive activity is required to accompany productive activity. ! The main causes of this are bureaucracy and isometric struggles against ! competition. Free software will greatly reduce these drains in the ! area of software production. We must do this, in order for technical ! gains in productivity to translate into less work for us. ! ! ---------- Footnotes ---------- ! ! (1) The wording here was careless. The intention was that nobody ! would have to pay for *permission* to use the GNU system. But the ! words don't make this clear, and people often interpret them as saying ! that copies of GNU should always be distributed at little or no charge. ! That was never the intent; later on, the manifesto mentions the ! possibility of companies providing the service of distribution for a ! profit. Subsequently I have learned to distinguish carefully between ! "free" in the sense of freedom and "free" in the sense of price. Free ! software is software that users have the freedom to distribute and ! change. Some users may obtain copies at no charge, while others pay to ! obtain copies--and if the funds help support improving the software, so ! much the better. The important thing is that everyone who has a copy ! has the freedom to cooperate with others in using it. ! ! (2) This is another place I failed to distinguish carefully between ! the two different meanings of "free". The statement as it stands is ! not false--you can get copies of GNU software at no charge, from your ! friends or over the net. But it does suggest the wrong idea. ! ! (3) Several such companies now exist. ! ! (4) The Free Software Foundation raises most of its funds from a ! distribution service, although it is a charity rather than a company. ! If *no one* chooses to obtain copies by ordering the from the FSF, it ! will be unable to do its work. But this does not mean that proprietary ! restrictions are justified to force every user to pay. If a small ! fraction of all the users order copies from the FSF, that is sufficient ! to keep the FSF afloat. So we ask users to choose to support us in ! this way. Have you done your part? ! (5) A group of computer companies recently pooled funds to support ! maintenance of the GNU C Compiler. diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/etc/NEWS emacs-19.21/etc/NEWS *** emacs-19.20/etc/NEWS Wed Nov 10 15:23:37 1993 --- emacs-19.21/etc/NEWS Tue Nov 16 01:35:11 1993 *************** *** 7,10 **** --- 7,16 ---- see the file LNEWS. + User editing changes in version 19.21. + + * ISO Accents mode supports four additional characters: + A-with-ring (entered as /A), AE ligature (entered as /E), + and their lower-case equivalents. + User editing changes in version 19.20. (See following page for Lisp programming changes.) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/etc/copying.paper emacs-19.21/etc/copying.paper *** emacs-19.20/etc/copying.paper --- emacs-19.21/etc/copying.paper Tue Nov 16 07:28:26 1993 *************** *** 0 **** --- 1,819 ---- + (For more information about the GNU project and free software, + look at the files `GNU', `COPYING', and `DISTRIB', in the same + directory as this file.) + + + Why Software Should Be Free + + by Richard Stallman + + (Version of April 24, 1992) + + Copyright (C) 1991, 1992, Free Software Foundation, Inc. + Verbatim copying and redistribution is permitted + without royalty; alteration is not permitted. + + Introduction + ************ + + The existence of software inevitably raises the question of how + decisions about its use should be made. For example, suppose one + individual who has a copy of a program meets another who would like a + copy. It is possible for them to copy the program; who should decide + whether this is done? The individuals involved? Or another party, + called the "owner"? + + Software developers typically consider these questions on the + assumption that the criterion for the answer is to maximize developers' + profits. The political power of business has led to the government + adoption of both this criterion and the answer proposed by the + developers: that the program has an owner, typically a corporation + associated with its development. + + I would like to consider the same question using a different + criterion: the prosperity and freedom of the public in general. + + This answer cannot be decided by current law--the law should conform + to ethics, not the other way around. Nor does current practice decide + this question, although it may suggest possible answers. The only way + to judge is to see who is helped and who is hurt by recognizing owners + of software, why, and how much. In other words, we should perform a + cost-benefit analysis on behalf of society as a whole, taking account of + individual freedom as well as production of material goods. + + In this essay, I will describe the effects of having owners, and show + that the results are detrimental. My conclusion is that programmers + have the duty to encourage others to share, redistribute, study and + improve the software we write: in other words, to write "free" + software.(1) + + How Owners Justify Their Power + ****************************** + + Those who benefit from the current system where programs are property + offer two arguments in support of their claims to own programs: the + emotional argument and the economic argument. + + The emotional argument goes like this: "I put my sweat, my heart, my + soul into this program. It comes from *me*, it's *mine*!" + + This argument does not require serious refutation. The feeling of + attachment is one that programmers can cultivate when it suits them; it + is not inevitable. Consider, for example, how willingly the same + programmers usually sign over all rights to a large corporation for a + salary; the emotional attachment mysteriously vanishes. By contrast, + consider the great artists and artisans of medieval times, who didn't + even sign their names to their work. To them, the name of the artist + was not important. What mattered was that the work was done--and the + purpose it would serve. This view prevailed for hundreds of years. + + The economic argument goes like this: "I want to get rich (usually + described inaccurately as `making a living'), and if you don't allow me + to get rich by programming, then I won't program. Everyone else is like + me, so nobody will ever program. And then you'll be stuck with no + programs at all!" This threat is usually veiled as friendly advice + from the wise. + + I'll explain later why this threat is a bluff. First I want to + address an implicit assumption that is more visible in another + formulation of the argument. + + This formulation starts by comparing the social utility of a + proprietary program with that of no program, and then concludes that + proprietary software development is, on the whole, beneficial, and + should be encouraged. The fallacy here is in comparing only two + outcomes--proprietary software vs. no software--and assuming there are + no other possibilities. + + Given a system of intellectual property, software development is + usually linked with the existence of an owner who controls the + software's use. As long as this linkage exists, we are often faced + with the choice of proprietary software or none. However, this linkage + is not inherent or inevitable; it is a consequence of the specific + social/legal policy decision that we are questioning: the decision to + have owners. To formulate the choice as between proprietary software + vs. no software is begging the question. + + The Argument against Having Owners + ********************************** + + The question at hand is, "Should development of software be linked + with having owners to restrict the use of it?" + + In order to decide this, we have to judge the effect on society of + each of those two activities *independently*: the effect of developing + the software (regardless of its terms of distribution), and the effect + of restricting its use (assuming the software has been developed). If + one of these activities is helpful and the other is harmful, we would be + better off dropping the linkage and doing only the helpful one. + + To put it another way, if restricting the distribution of a program + already developed is harmful to society overall, then an ethical + software developer will reject the option of doing so. + + To determine the effect of restricting sharing, we need to compare + the value to society of a restricted (i.e., proprietary) program with + that of the same program, available to everyone. This means comparing + two possible worlds. + + This analysis also addresses the simple counterargument sometimes + made that "the benefit to the neighbor of giving him or her a copy of a + program is cancelled by the harm done to the owner." This + counterargument assumes that the harm and the benefit are equal in + magnitude. The analysis involves comparing these magnitudes, and shows + that the benefit is much greater. + + To elucidate this argument, let's apply it in another area: road + construction. + + It would be possible to fund the construction of all roads with + tolls. This would entail having toll booths at all street corners. + Such a system would provide a great incentive to improve roads. It + would also have the virtue of causing the users of any given road to + pay for that road. However, a toll booth is an artificial obstruction + to smooth driving--artificial, because it is not a consequence of how + roads or cars work. + + Comparing free roads and toll roads by their usefulness, we find that + (all else being equal) roads without toll booths are cheaper to + construct, cheaper to run, safer, and more efficient to use.(2) In a + poor country, tolls may make the roads unavailable to many citizens. + The roads without toll booths thus offer more benefit to society at + less cost; they are preferable for society. Therefore, society should + choose to fund roads in another way, not by means of toll booths. Use + of roads, once built, should be free. + + When the advocates of toll booths propose them as *merely* a way of + raising funds, they distort the choice that is available. Toll booths + do raise funds, but they do something else as well: in effect, they + degrade the road. The toll road is not as good as the free road; giving + us more or technically superior roads may not be an improvement if this + means substituting toll roads for free roads. + + Of course, the construction of a free road does cost money, which the + public must somehow pay. However, this does not imply the inevitability + of toll booths. We who must in either case pay will get more value for + our money by buying a free road. + + I am not saying that a toll road is worse than no road at all. That + would be true if the toll were so great that hardly anyone used the + road--but this is an unlikely policy for a toll collector. However, as + long as the toll booths cause significant waste and inconvenience, it is + better to raise the funds in a less obstructive fashion. + + To apply the same argument to software development, I will now show + that having "toll booths" for useful software programs costs society + dearly: it makes the programs more expensive to construct, more + expensive to distribute, and less satisfying and efficient to use. It + will follow that program construction should be encouraged in some other + way. Then I will go on to explain other methods of encouraging and (to + the extent actually necessary) funding software development. + + The Harm Done by Obstructing Software + ===================================== + + Consider for a moment that a program has been developed, and any + necessary payments for its development have been made; now society must + choose either to make it proprietary or allow free sharing and use. + Assume that the existence of the program and its availability is a + desirable thing.(3) + + Restrictions on the distribution and modification of the program + cannot facilitate its use. They can only interfere. So the effect can + only be negative. But how much? And what kind? + + Three different levels of material harm come from such obstruction: + + * Fewer people use the program. + + * None of the users can adapt or fix the program. + + * Other developers cannot learn from the program, or base new work + on it. + + Each level of material harm has a concomitant form of psychosocial + harm. This refers to the effect that people's decisions have on their + subsequent feelings, attitudes and predispositions. These changes in + people's ways of thinking will then have a further effect on their + relationships with their fellow citizens, and can have material + consequences. + + The three levels of material harm waste part of the value that the + program could contribute, but they cannot reduce it to zero. If they + waste nearly all the value of the program, then writing the program + harms society by at most the effort that went into writing the program. + Arguably a program that is profitable to sell must provide some net + direct material benefit. + + However, taking account of the concomitant psychosocial harm, there + is no limit to the harm that proprietary software development can do. + + Obstructing Use of Programs + =========================== + + The first level of harm impedes the simple use of a program. A copy + of a program has nearly zero marginal cost (and you can pay this cost by + doing the work yourself), so in a free market, it would have nearly zero + price. A license fee is a significant disincentive to use the program. + If a widely-useful program is proprietary, far fewer people will use it. + + It is easy to show that the total contribution of a program to + society is reduced by assigning an owner to it. Each potential user of + the program, faced with the need to pay to use it, may choose to pay, + or may forego use of the program. When a user chooses to pay, this is a + zero-sum transfer of wealth between two parties. But each time someone + chooses to forego use of the program, this harms that person without + benefitting anyone. The sum of negative numbers and zeros must be + negative. + + But this does not reduce the amount of work it takes to *develop* + the program. As a result, the efficiency of the whole process, in + delivered user satisfaction per hour of work, is reduced. + + This reflects a crucial difference between copies of programs and + cars, chairs, or sandwiches. There is no copying machine for material + objects outside of science fiction. But programs are easy to copy; + anyone can produce as many copies as are wanted, with very little + effort. This isn't true for material objects because matter is + conserved: each new copy has to be built from raw materials in the same + way that the first copy was built. + + With material objects, a disincentive to use them makes sense, + because fewer objects bought means less raw materials and work needed + to make them. It's true that there is usually also a startup cost, a + development cost, which is spread over the production run. But as long + as the marginal cost of production is significant, adding a share of the + development cost does not make a qualitative difference. And it does + not require restrictions on the freedom of ordinary users. + + However, imposing a price on something that would otherwise be free + is a qualitative change. A centrally-imposed fee for software + distribution becomes a powerful disincentive. + + What's more, central production as now practiced is inefficient even + as a means of delivering copies of software. This system involves + enclosing physical disks or tapes in superfluous packaging, shipping + large numbers of them around the world, and storing them for sale. This + cost is presented as an expense of doing business; in truth, it is part + of the waste caused by having owners. + + Damaging Social Cohesion + ======================== + + Suppose that both you and your neighbor would find it useful to run a + certain program. In ethical concern for your neighbor, you should feel + that proper handling of the situation will enable both of you to use it. + A proposal to permit only one of you to use the program, while + restraining the other, is divisive; neither you nor your neighbor should + find it acceptable. + + Signing a typical software license agreement means betraying your + neighbor: "I promise to deprive my neighbor of this program so that I + can have a copy for myself." People who make such choices feel + internal psychological pressure to justify them, by downgrading the + importance of helping one's neighbors--thus public spirit suffers. + This is psychosocial harm associated with the material harm of + discouraging use of the program. + + Many users unconsciously recognize the wrong of refusing to share, so + they decide to ignore the licenses and laws, and share programs anyway. + But they often feel guilty about doing so. They know that they must + break the laws in order to be good neighbors, but they still consider + the laws authoritative, and they conclude that being a good neighbor + (which they are) is naughty or shameful. That is also a kind of + psychosocial harm, but one can escape it by deciding that these licenses + and laws have no moral force. + + Programmers also suffer psychosocial harm knowing that many users + will not be allowed to use their work. This leads to an attitude of + cynicism or denial. A programmer may describe enthusiastically the + work that he finds technically exciting; then when asked, "Will I be + permitted to use it?", his face falls, and he admits the answer is no. + To avoid feeling discouraged, he either ignores this fact most of the + time or adopts a cynical stance designed to minimize the importance of + it. + + Since the age of Reagan, the greatest scarcity in the United States + is not technical innovation, but rather the willingness to work together + for the public good. It makes no sense to encourage the former at the + expense of the latter. + + Obstructing Custom Adaptation of Programs + ========================================= + + The second level of material harm is the inability to adapt programs. + The ease of modification of software is one of its great advantages over + older technology. But most commercially available software isn't + available for modification, even after you buy it. It's available for + you to take it or leave it, as a black box--that is all. + + A program that you can run consists of a series of numbers whose + meaning is obscure. No one, not even a good programmer, can easily + change the numbers to make the program do something different. + + Programmers normally work with the "source code" for a program, which + is written in a programming language such as Fortran or C. It uses + names to designate the data being used and the parts of the program, and + it represents operations with symbols such as `+' for addition and `-' + for subtraction. It is designed to help programmers read and change + programs. Here is an example; a program to calculate the distance + between two points in a plane: + + float + distance (p0, p1) + struct point p0, p1; + { + float xdist = p1.x - p0.x; + float ydist = p1.y - p0.y; + return sqrt (xdist * xdist + ydist * ydist); + } + + Here is the same program in executable form, on the computer I + normally use: + + 1314258944 -232267772 -231844864 1634862 + 1411907592 -231844736 2159150 1420296208 + -234880989 -234879837 -234879966 -232295424 + 1644167167 -3214848 1090581031 1962942495 + 572518958 -803143692 1314803317 + + Source code is useful (at least potentially) to every user of a + program. But most users are not allowed to have copies of the source + code. Usually the source code for a proprietary program is kept secret + by the owner, lest anybody else learn something from it. Users receive + only the files of incomprehensible numbers that the computer will + execute. This means that only the program's owner can change the + program. + + A friend once told me of working as a programmer in a bank for about + six months, writing a program similar to something that was commercially + available. She believed that if she could have gotten source code for + that commercially available program, it could easily have been adapted + to their needs. The bank was willing to pay for this, but was not + permitted to--the source code was a secret. So she had to do six + months of make-work, work that counts in the GNP but was actually waste. + + The MIT Artificial Intelligence lab (AI lab) received a graphics + printer as a gift from Xerox around 1977. It was run by free software + to which we added many convenient features. For example, the software + would notify a user immediately on completion of a print job. Whenever + the printer had trouble, such as a paper jam or running out of paper, + the software would immediately notify all users who had print jobs + queued. These features facilitated smooth operation. + + Later Xerox gave the AI lab a newer, faster printer, one of the first + laser printers. It was driven by proprietary software that ran in a + separate dedicated computer, so we couldn't add any of our favorite + features. We could arrange to send a notification when a print job was + sent to the dedicated computer, but not when the job was actually + printed (and the delay was usually considerable). There was no way to + find out when the job was actually printed; you could only guess. And + no one was informed when there was a paper jam, so the printer often + went for an hour without being fixed. + + The system programmers at the AI lab were capable of fixing such + problems, probably as capable as the original authors of the program. + Xerox was uninterested in fixing them, and chose to prevent us, so we + were forced to accept the problems. They were never fixed. + + Most good programmers have experienced this frustration. The bank + could afford to solve the problem by writing a new program from + scratch, but a typical user, no matter how skilled, can only give up. + + Giving up causes psychosocial harm--to the spirit of self-reliance. + It is demoralizing to live in a house that you cannot rearrange to suit + your needs. It leads to resignation and discouragement, which can + spread to affect other aspects of one's life. People who feel this way + are unhappy and do not do good work. + + Imagine what it would be like if recipes were hoarded in the same + fashion as software. You might say, "How do I change this recipe to + take out the salt?", and the great chef would respond, "How dare you + insult my recipe, the child of my brain and my palate, by trying to + tamper with it? You don't have the judgment to change my recipe and + make it work right!" + + "But my doctor says I'm not supposed to eat salt! What can I do? + Will you take out the salt for me?" + + "I would be glad to do that; my fee is only $50,000." Since the + owner has a monopoly on changes, the fee tends to be large. "However, + right now I don't have time. I am busy with a commission to design a + new recipe for ship's biscuit for the Navy Department. I might get + around to you in about two years." + + Obstructing Software Development + ================================ + + The third level of material harm affects software development. + Software development used to be an evolutionary process, where a person + would take an existing program and rewrite parts of it for one new + feature, and then another person would rewrite parts to add another + feature; in some cases, this continued over a period of twenty years. + Meanwhile, parts of the program would be "cannibalized" to form the + beginnings of other programs. + + The existence of owners prevents this kind of evolution, making it + necessary to start from scratch when developing a program. It also + prevents new practitioners from studying existing programs to learn + useful techniques or even how large programs can be structured. + + Owners also obstruct education. I have met bright students in + computer science who have never seen the source code of a large + program. They may be good at writing small programs, but they can't + begin to learn the different skills of writing large ones if they can't + see how others have done it. + + In any intellectual field, one can reach greater heights by standing + on the shoulders of others. But that is no longer generally allowed in + the software field--you can only stand on the shoulders of the other + people *in your own company*. + + The associated psychosocial harm affects the spirit of scientific + cooperation, which used to be so strong that scientists would cooperate + even when their countries were at war. In this spirit, Japanese + oceanographers abandoning their lab on an island in the Pacific + carefully preserved their work for the invading U.S. Marines, and left a + note asking them to take good care of it. + + Conflict for profit has destroyed what international conflict spared. + Nowadays scientists in many fields don't publish enough in their papers + to enable others to replicate the experiment. They publish only enough + to let readers marvel at how much they were able to do. This is + certainly true in computer science, where the source code for the + programs reported on is usually secret. + + It Does Not Matter How Sharing Is Restricted + ============================================ + + I have been discussing the effects of preventing people from copying, + changing and building on a program. I have not specified how this + obstruction is carried out, because that doesn't affect the conclusion. + Whether it is done by copy protection, or copyright, or licenses, or + encryption, or ROM cards, or hardware serial numbers, if it *succeeds* + in preventing use, it does harm. + + Users do consider some of these methods more obnoxious than others. + I suggest that the methods most hated are those that accomplish their + objective. + + Software Should be Free + ======================= + + I have shown how ownership of a program--the power to restrict + changing or copying it--is obstructive. Its negative effects are + widespread and important. It follows that society shouldn't have + owners for programs. + + Another way to understand this is that what society needs is free + software, and proprietary software is a poor substitute. Encouraging + the substitute is not a rational way to get what we need. + + Vaclav Havel has advised us to "Work for something because it is + good, not just because it stands a chance to succeed." A business + making proprietary software stands a chance of success in its own narrow + terms, but it is not what is good for society. + + Why People Will Develop Software + ******************************** + + If we eliminate intellectual property as a means of encouraging + people to develop software, at first less software will be developed, + but that software will be more useful. It is not clear whether the + overall delivered user satisfaction will be less; but if it is, or if + we wish to increase it anyway, there are other ways to encourage + development, just as there are ways besides toll booths to raise money + for streets. Before I talk about how that can be done, first I want to + question how much artificial encouragement is truly necessary. + + Programming is Fun + ================== + + There are some lines of work that few will enter except for money; + road construction, for example. There are other fields of study and + art in which there is little chance to become rich, which people enter + for their fascination or their perceived value to society. Examples + include mathematical logic, classical music, and archaeology; and + political organizing among working people. People compete, more sadly + than bitterly, for the few funded positions available, none of which is + funded very well. They may even pay for the chance to work in the + field, if they can afford to. + + Such a field can transform itself overnight if it begins to offer the + possibility of getting rich. When one worker gets rich, others demand + the same opportunity. Soon all may demand large sums of money for doing + what they used to do for pleasure. When another couple of years go by, + everyone connected with the field will deride the idea that work would + be done in the field without large financial returns. They will advise + social planners to ensure that these returns are possible, prescribing + special privileges, powers and monopolies as necessary to do so. + + This change happened in the field of computer programming in the past + decade. Fifteen years ago, there were articles on "computer + addiction": users were "onlining" and had hundred-dollar-a-week habits. + It was generally understood that people frequently loved programming + enough to break up their marriages. Today, it is generally understood + that no one would program except for a high rate of pay. People have + forgotten what they knew fifteen years ago. + + When it is true at a given time that most people will work in a + certain field only for high pay, it need not remain true. The dynamic + of change can run in reverse, if society provides an impetus. If we + take away the possibility of great wealth, then after a while, when the + people have readjusted their attitudes, they will once again be eager + to work in the field for the joy of accomplishment. + + The question, "How can we pay programmers?", becomes an easier + question when we realize that it's not a matter of paying them a + fortune. A mere living is easier to raise. + + Funding Free Software + ===================== + + Institutions that pay programmers do not have to be software houses. + Many other institutions already exist which can do this. + + Hardware manufacturers find it essential to support software + development even if they cannot control the use of the software. In + 1970, much of their software was free because they did not consider + restricting it. Today, their increasing willingness to join + consortiums shows their realization that owning the software is not + what is really important for them. + + Universities conduct many programming projects. Today, they often + sell the results, but in the 1970s, they did not. Is there any doubt + that universities would develop free software if they were not allowed + to sell software? These projects could be supported by the same + government contracts and grants which now support proprietary software + development. + + It is common today for university researchers to get grants to + develop a system, develop it nearly to the point of completion and call + that "finished", and then start companies where they really finish the + project and make it usable. Sometimes they declare the unfinished + version "free"; if they are thoroughly corrupt, they instead get an + exclusive license from the university. This is not a secret; it is + openly admitted by everyone concerned. Yet if the researchers were not + exposed to the temptation to do these things, they would still do their + research. + + Programmers writing free software can make their living by selling + services related to the software. I have been hired to port the GNU C + compiler to new hardware, and to make user-interface extensions to GNU + Emacs. (I offer these improvements to the public once they are done.) + I also teach classes for which I am paid. + + I am not alone in working this way; there is now a successful, + growing corporation which does no other kind of work. Several other + companies also provide commercial support for the free software of the + GNU system. This is the beginning of the independent software support + industry-an industry that could become quite large if free software + becomes prevalent. It provides users with an option generally + unavailable for proprietary software, except to the very wealthy. + + New institutions such as the Free Software Foundation can also fund + programmers. Most of the foundation's funds come from users buying + tapes through the mail. The software on the tapes is free, which means + that every user has the freedom to copy it and change it, but many + nonetheless pay to get copies. (Recall that "free software" refers to + freedom, not to price.) Some users order tapes who already have a copy, + as a way of making a contribution they feel we deserve. The Foundation + also receives sizable donations from computer manufacturers. + + The Free Software Foundation is a charity, and its income is spent on + hiring as many programmers as possible. If it had been set up as a + business, distributing the same free software to the public for the same + fee, it would now provide a very good living for its founder. + + Because the Foundation is a charity, programmers often work for the + Foundation for half of what they could make elsewhere. They do this + because we are free of bureaucracy, and because they feel satisfaction + in knowing that their work will not be obstructed from use. Most of + all, they do it because programming is fun. In addition, volunteers + have written many useful programs for us. (Recently even technical + writers have begun to volunteer.) + + This confirms that programming is among the most fascinating of all + fields, along with music and art. We don't have to fear that no one + will want to program. + + What Do Users Owe to Developers? + ================================ + + There is a good reason for users of software to feel a moral + obligation to contribute to its support. Developers of free software + are contributing to the users' activities, and it is both fair and in + the long term interest of the users to give them funds to continue. + + However, this does not apply to proprietary software developers, + since obstructionism deserves a punishment rather than a reward. + + We thus have a paradox: the developer of useful software is entitled + to the support of the users, but any attempt to turn this moral + obligation into a requirement destroys the basis for the obligation. A + developer can either deserve a reward or demand it, but not both. + + I believe that an ethical developer faced with this paradox must act + so as to deserve the reward, but should also entreat the users for + voluntary donations. Eventually the users will learn to support + developers without coercion, just as they have learned to support public + radio and television stations. + + What Is Software Productivity? + ****************************** + + If software were free, there would still be programmers, but perhaps + fewer of them. Would this be bad for society? + + Not necessarily. Today the advanced nations have fewer farmers than + in 1900, but we do not think this is bad for society, because the few + deliver more food to the consumers than the many used to do. We call + this improved productivity. Free software would require far fewer + programmers to satisfy the demand, because of increased software + productivity at all levels: + + * Wider use of each program that is developed. + + * The ability to adapt existing programs for customization instead + of starting from scratch. + + * Better education of programmers. + + * The elimination of duplicate development effort. + + Those who object to cooperation because it would result in the + employment of fewer programmers, are actually objecting to increased + productivity. Yet these people usually accept the widely-held belief + that the software industry needs increased productivity. How is this? + + "Software productivity" can mean two different things: the overall + productivity of all software development, or the productivity of + individual projects. Overall productivity is what society would like to + improve, and the most straightforward way to do this is to eliminate the + artificial obstacles to cooperation which reduce it. But researchers + who study the field of "software productivity" focus only on the + second, limited, sense of the term, where improvement requires difficult + technological advances. + + Is Competition Inevitable? + ************************** + + Is it inevitable that people will try to compete, to surpass their + rivals in society? Perhaps it is. But competition itself is not + harmful; the harmful thing is *combat*. + + There are many ways to compete. Competition can consist of trying to + achieve ever more, to outdo what others have done. For example, in the + old days, there was competition among programming wizards--competition + for who could make the computer do the most amazing thing, or for who + could make the shortest or fastest program for a given task. This kind + of competition can benefit everyone, *as long as* the spirit of good + sportsmanship is maintained. + + Constructive competition is enough competition to motivate people to + great efforts. A number of people are competing to be the first to have + visited all the countries on Earth; some even spend fortunes trying to + do this. But they do not bribe ship captains to strand their rivals on + desert islands. They are content to let the best person win. + + Competition becomes combat when the competitors begin trying to + impede each other instead of advancing themselves--when "Let the best + person win" gives way to "Let me win, best or not." Proprietary + software is harmful, not because it is a form of competition, but + because it is a form of combat among the citizens of our society. + + Competition in business is not necessarily combat. For example, when + two grocery stores compete, their entire effort is to improve their own + operations, not to sabotage the rival. But this does not demonstrate a + special commitment to business ethics; rather, there is little scope for + combat in this line of business short of physical violence. Not all + areas of business share this characteristic. Withholding information + that could help everyone advance is a form of combat. + + Business ideology does not prepare people to resist the temptation to + combat the competition. Some forms of combat have been made banned with + anti-trust laws, truth in advertising laws, and so on, but rather than + generalizing this to a principled rejection of combat in general, + executives invent other forms of combat which are not specifically + prohibited. Society's resources are squandered on the economic + equivalent of factional civil war. + + "Why Don't You Move to Russia?" + ******************************* + + In the United States, any advocate of other than the most extreme + form of laissez-faire selfishness has often heard this accusation. For + example, it is leveled against the supporters of a national health care + system, such as is found in all the other industrialized nations of the + free world. It is leveled against the advocates of public support for + the arts, also universal in advanced nations. The idea that citizens + have any obligation to the public good is identified in America with + Communism. But how similar are these ideas? + + Communism as was practiced in the Soviet Union was a system of + central control where all activity was regimented, supposedly for the + common good, but actually for the sake of the members of the Communist + party. And where copying equipment was closely guarded to prevent + illegal copying. + + The American system of intellectual property exercises central + control over distribution of a program, and guards copying equipment + with automatic copying protection schemes to prevent illegal copying. + + By contrast, I am working to build a system where people are free to + decide their own actions; in particular, free to help their neighbors, + and free to alter and improve the tools which they use in their daily + lives. A system based on voluntary cooperation, and decentralization. + + Thus, if we are to judge views by their resemblance to Russian + Communism, it is the software owners who are the Communists. + + The Question of Premises + ************************ + + I make the assumption in this paper that a user of software is no + less important than an author, or even an author's employer. In other + words, their interests and needs have equal weight, when we decide + which course of action is best. + + This premise is not universally accepted. Many maintain that an + author's employer is fundamentally more important than anyone else. + They say, for example, that the purpose of having owners of software is + to give the author's employer the advantage he deserves--regardless of + how this may affect the public. + + It is no use trying to prove or disprove these premises. Proof + requires shared premises. So most of what I have to say is addressed + only to those who share the premises I use, or at least are interested + in what their consequences are. For those who believe that the owners + are more important than everyone else, this paper is simply irrelevant. + + But why would a large number of Americans accept a premise which + elevates certain people in importance above everyone else? Partly + because of the belief that this premise is part of the legal traditions + of American society. Some people feel that doubting the premise means + challenging the basis of society. + + It is important for these people to know that this premise is not + part of our legal tradition. It never has been. + + Thus, the Constitution says that the purpose of copyright is to + "promote the progress of science and the useful arts." The Supreme + Court has elaborated on this, stating in `Fox Film vs. Doyal' that "The + sole interest of the United States and the primary object in conferring + the [copyright] monopoly lie in the general benefits derived by the + public from the labors of authors." + + We are not required to agree with the Constitution or the Supreme + Court. (At one time, they both condoned slavery.) So their positions + do not disprove the owner supremacy premise. But I hope that the + awareness that this is a radical right-wing assumption rather than a + traditionally recognized one will weaken its appeal. + + Conclusion + ********** + + We like to think that our society encourages helping your neighbor; + but each time we reward someone for obstructionism, or admire them for + the wealth they have gained in this way, we are sending the opposite + message. + + Software hoarding is one form of our general willingness to disregard + the welfare of society for personal gain. We can trace this disregard + from Ronald Reagan to Jim Bakker, from Ivan Boesky to Exxon, from + failing banks to failing schools. We can measure it with the size of + the homeless population and the prison population. The antisocial + spirit feeds on itself, because the more we see that other people will + not help us, the more it seems futile to help them. Thus society decays + into a jungle. + + If we don't want to live in a jungle, we must change our attitudes. + We must start sending the message that a good citizen is one who + cooperates when appropriate, not one who is successful at taking from + others. I hope that the free software movement will contribute to + this: at least in one area, we will replace the jungle with a more + efficient system which encourages and runs on voluntary cooperation. + + ---------- Footnotes ---------- + + (1) The word "free" in "free software" refers to freedom, not to + price; the price paid for a copy of a free program may be zero, or + small, or (rarely) quite large. + + (2) The issues of pollution and traffic congestion do not alter + this conclusion. If we wish to make driving more expensive to + discourage driving in general, it is disadvantageous to do this using + toll booths, which contribute to both pollution and congestion. A tax + on gasoline is much better. Likewise, a desire to enhance safety by + limiting maximum speed is not relevant; a free access road enhances the + average speed by avoiding stops and delays, for any given speed limit. + + (3) One might regard a particular computer program as a harmful + thing that should not be available at all, like the Lotus Marketplace + database of personal information, which was withdrawn from sale due to + public disapproval. Most of what I say does not apply to this case, + but it makes little sense to argue for having an owner on the grounds + that the owner will make the program less available. The owner will + not make it *completely* unavailable, as one would wish in the case of + a program whose use is considered destructive. + diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lib-src/ChangeLog emacs-19.21/lib-src/ChangeLog *** emacs-19.20/lib-src/ChangeLog Thu Nov 11 10:32:08 1993 --- emacs-19.21/lib-src/ChangeLog Tue Nov 16 04:22:34 1993 *************** *** 1,2 **** --- 1,16 ---- + Tue Nov 16 03:23:28 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Version 19.21 released. + + * Makefile.in (install): Don't change mode or group when installing. + + * etags.c (FUNCST, TYPEDST, STRUCTST, DEFINEST): Delete excess commas. + + Fri Nov 12 01:24:44 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * make-docfile.c (read_c_string): For "", concatenate the two strings. + + * movemail.c (main): Fix error message text. + Thu Nov 11 10:08:43 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lib-src/Makefile.in emacs-19.21/lib-src/Makefile.in *** emacs-19.20/lib-src/Makefile.in Mon Oct 4 00:31:27 1993 --- emacs-19.21/lib-src/Makefile.in Tue Nov 16 04:22:10 1993 *************** *** 148,157 **** chmod 755 ${bindir}/$${file}.n ; \ done - @echo - @echo "Changing the owner and group of utility programs to \`bin'." - @echo "(You may ignore errors here if you don't care about this.)" -for file in ${INSTALLABLES} ${INSTALLABLE_SCRIPTS} ; do \ - chgrp bin ${bindir}/$${file}.n ; \ - chown bin ${bindir}/$${file}.n ; \ rm -f ${bindir}/$${file} ; \ mv ${bindir}/$${file}.n ${bindir}/$${file} ; \ --- 148,152 ---- diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lib-src/etags.c emacs-19.21/lib-src/etags.c *** emacs-19.20/lib-src/etags.c Mon Nov 8 14:17:50 1993 --- emacs-19.21/lib-src/etags.c Tue Nov 16 03:23:14 1993 *************** *** 1335,1339 **** finlist, /* in parameter list */ flistseen, /* after parameter list */ ! fignore, /* before open brace */ } FUNCST; FUNCST funcdef; --- 1335,1339 ---- finlist, /* in parameter list */ flistseen, /* after parameter list */ ! fignore /* before open brace */ } FUNCST; FUNCST funcdef; *************** *** 1348,1352 **** ttypedseen, /* typedef keyword seen */ tinbody, /* inside typedef body */ ! tend, /* just before typedef tag */ } TYPEDST; TYPEDST typdef; --- 1348,1352 ---- ttypedseen, /* typedef keyword seen */ tinbody, /* inside typedef body */ ! tend /* just before typedef tag */ } TYPEDST; TYPEDST typdef; *************** *** 1365,1369 **** stagseen, /* struct-like tag seen */ scolonseen, /* colon seen after struct-like tag */ ! sinbody, /* in struct body: recognize member func defs*/ } STRUCTST; STRUCTST structdef; --- 1365,1369 ---- stagseen, /* struct-like tag seen */ scolonseen, /* colon seen after struct-like tag */ ! sinbody /* in struct body: recognize member func defs*/ } STRUCTST; STRUCTST structdef; *************** *** 1383,1387 **** dsharpseen, /* '#' seen as first char on line */ ddefineseen, /* '#' and 'define' seen */ ! dignorerest, /* ignore rest of line */ } DEFINEST; DEFINEST definedef; --- 1383,1387 ---- dsharpseen, /* '#' seen as first char on line */ ddefineseen, /* '#' and 'define' seen */ ! dignorerest /* ignore rest of line */ } DEFINEST; DEFINEST definedef; diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lib-src/make-docfile.c emacs-19.21/lib-src/make-docfile.c *** emacs-19.20/lib-src/make-docfile.c Wed Jun 9 06:56:24 1993 --- emacs-19.21/lib-src/make-docfile.c Tue Nov 16 07:26:30 1993 *************** *** 128,135 **** if (c != '"') break; ! if (printflag > 0) ! putc (c, outfile); ! else if (printflag < 0) ! *p++ = c; c = getc (infile); } --- 128,132 ---- if (c != '"') break; ! /* If we had a "", concatenate the two strings. */ c = getc (infile); } diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lib-src/movemail.c emacs-19.21/lib-src/movemail.c *** emacs-19.20/lib-src/movemail.c Sun Sep 12 04:45:17 1993 --- emacs-19.21/lib-src/movemail.c Tue Nov 16 07:26:34 1993 *************** *** 201,205 **** desc = open (tempname, O_WRONLY | O_CREAT, 0666); if (desc < 0) ! pfatal_with_name ("lock file--see source file etc/movemail.c"); close (desc); --- 201,205 ---- desc = open (tempname, O_WRONLY | O_CREAT, 0666); if (desc < 0) ! pfatal_with_name ("lock file--see source file lib-src/movemail.c"); close (desc); diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/ChangeLog emacs-19.21/lisp/ChangeLog *** emacs-19.20/lisp/ChangeLog Thu Nov 11 10:01:28 1993 --- emacs-19.21/lisp/ChangeLog Tue Nov 16 05:47:19 1993 *************** *** 1,2 **** --- 1,124 ---- + Tue Nov 16 01:14:29 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Version 19.21 released. + + * gnus.el (gnus-summary-save-in-mail): Don't use rmail-output. + Instead, use either gnus-output-to-rmail or gnus-output-to-file. + Expand filename before use. + * rmailout.el (rmail-file-p): Add autoload cookie. + + * comint.el (comint-send-input): Run comint-output-filter-functions + only if process is using comint-output-filter as its filter. + + * subr.el (remove-hook): Doc fix. + + * rmail.el (rmail-set-attribute): Do nothing if MSGNUM is 0. + + * nntp.el (nntp-encode-text): Insert a CR before the newline. + + * info.el (Info-mode): Doc fix. + + * loaddefs.el: Delete duplicate etags.el autoloads. + + * add-log.el (change-log-default-name, add-log-current-defun-function) + (add-log-full-name, add-log-mailing-address): Delete autoload cookies. + + Mon Nov 15 21:37:37 1993 Per Bothner (bothner@cygnus.com) + + * iso-acc.el (iso-accents-list): Added /A for A-with-ring + and /E for AE-ligature, with lowercase versions. These + letters are used (with O-with-slash) in Norwegian and Danish. + + Mon Nov 15 00:17:12 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * appt.el (appt-display-interval): New variable. + (appt-check): Obey that variable. + + * sun.el (sun-raw-prefix): Make this just a variable, + not a function name. + + * startup.el (command-line-1): Display a message in the echo area. + + * comint.el (comint-read-input-ring, comint-write-input-ring): + Treat "" like nil in comint-input-ring-file-name. + + Mon Nov 15 13:21:51 1993 Robert J. Chassell (bob@grackle.stockbridge.ma.us) + + * page.el Add `provide'. + (narrow-to-page): Enable page-delimiter to span lines. + + * page-ext.el: Revise documentation. Add `provide'. + (pages-directory-for-adding-addresses-narrowing-p): + New user option for adding addresses. Default to narrowing. + (pages-directory-for-addresses): Intall user settable options. + (add-new-page): Insert new page in specified location. + (original-page-delimiter): Set default value to "^^L". + + Mon Nov 15 04:13:48 1993 Eric S. Raymond (eric@mole.gnu.ai.mit.edu) + + * vc.el: vc-static-header-alist shouldn't have been declared const. + + Sun Nov 14 00:49:35 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * rmailout.el (rmail-output): New argument FROM-GNUS. + * gnus.el (gnus-summary-save-in-mail): Pass new args to rmail-output. + + * solar.el (solar-equinoxes-solstices): Add autoload. + + * calendar.el (solar-holidays): Change top-level progn to an if. + + * mouse.el (mouse-save-then-kill-delete-region): Take args BEG and END. + Update the undo list properly. + (mouse-save-then-kill): Pass those args. + When we kill, clear mouse-save-then-kill-posn + and mouse-selection-click-count. + (mouse-secondary-save-then-kill): Likewise. + Delete the overlay after deleting the selection text. + (mouse-selection-click-count): Initialize to 0. + (mouse-save-then-kill-delete-region): Handle buffers with no undo list. + Handle empty regions. Handle end < beg. + + * rmailsum.el (rmail-summary-forward): Accept prefix arg + and pass it to rmail-forward. + + Sat Nov 13 01:58:53 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * compare-w.el (compare-windows-skip-whitespace): Swap the two + and's within the or. + + * help.el (describe-project): New function, on C-h C-p. + (help-for-help): Add C-p. Refer to help-command, not + help-for-help, in the \\[...]. + + * paths.el (rmail-spool-directory): Check for irix, + not silicon-graphic-unix. + * dired.el (dired-chown-program): Likewise. + * lpr.el (lpr-command): Likewise. + + * xscheme.el: Add a provide call. + + * dired.el (dired-make-relative): Expand DIR if starts with ~. + + Fri Nov 12 23:48:06 1993 Paul Eggert (eggert@twinsun.com) + + * cal-dst.el (calendar-absolute-from-time): Undo Sep 14 patch. + Fix comments instead, since they didn't match the code. + + Fri Nov 12 17:16:24 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * comint.el (comint-match-partial-filename): Consider +@: part of + filenames; don't consider parens as part of them. + + * fill.el (fill-individual-paragraphs): Fix skipping headers + of yanked message. + + * rmailsum.el (rmail-summary-edit-map): Inherit text-mode-map properly. + + Fri Nov 12 03:52:03 1993 Paul Eggert (eggert@twinsun.com) + + * vc.el (vc-rename-file): Don't overwrite an existing file. + Fix test for unsaved files. + Calculate name of new master file properly. + Thu Nov 11 02:16:55 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) *************** *** 51,54 **** --- 173,177 ---- * subr.el (remove-hook): New function, analogous to add-hook. This is now the recommended way to remove a hook that you have added. + * lucid.el (remove-hook): Function deleted. Tue Nov 9 02:11:05 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/add-log.el emacs-19.21/lisp/add-log.el *** emacs-19.20/lisp/add-log.el Sun Sep 19 10:16:39 1993 --- emacs-19.21/lisp/add-log.el Tue Nov 16 01:14:57 1993 *************** *** 27,35 **** ;;; Code: - ;;;###autoload (defvar change-log-default-name nil "*Name of a change log file for \\[add-change-log-entry].") - ;;;###autoload (defvar add-log-current-defun-function nil "\ --- 27,33 ---- *************** *** 38,47 **** instead) with no arguments. It returns a string or nil if it cannot guess.") ! ;;;###autoload (defvar add-log-full-name (user-full-name) "*Full name of user, for inclusion in ChangeLog daily headers. This defaults to the value returned by the `user-full-name' function.") ! ;;;###autoload (defvar add-log-mailing-address (concat (user-login-name) "@" (system-name)) "*Electronic mail address of user, for inclusion in ChangeLog daily headers. --- 36,47 ---- instead) with no arguments. It returns a string or nil if it cannot guess.") ! ;; This MUST not be autoloaded, since user-login-name ! ;; cannot be known at Emacs dump time. (defvar add-log-full-name (user-full-name) "*Full name of user, for inclusion in ChangeLog daily headers. This defaults to the value returned by the `user-full-name' function.") ! ;; This MUST not be autoloaded, since user-login-name ! ;; cannot be known at Emacs dump time. (defvar add-log-mailing-address (concat (user-login-name) "@" (system-name)) "*Electronic mail address of user, for inclusion in ChangeLog daily headers. diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/appt.el emacs-19.21/lisp/appt.el *** emacs-19.20/lisp/appt.el Mon Sep 21 06:35:50 1992 --- emacs-19.21/lisp/appt.el Mon Nov 15 22:29:05 1993 *************** *** 152,155 **** --- 152,158 ---- "11:59pm in minutes - number of minutes in a day minus 1.") + (defvar appt-display-interval 1 + "*Number of minutes to wait between checking the appointment list.") + (defun appt-check () "Check for an appointment and update the mode line. *************** *** 169,194 **** appt-issue-message ! If T, the diary buffer is checked for appointments. appt-message-warning-time ! Variable used to determine if appointment message ! should be displayed. appt-audible ! Variable used to determine if appointment is audible. ! Default is t. appt-visible ! Variable used to determine if appointment message should be ! displayed in the mini-buffer. Default is t. appt-msg-window ! Variable used to determine if appointment message ! should temporarily appear in another window. Mutually exclusive ! to appt-visible. appt-display-duration ! The number of seconds an appointment message ! is displayed in another window. This function is run from the loadst process for display time. --- 172,201 ---- appt-issue-message ! If T, the diary buffer is checked for appointments. appt-message-warning-time ! Variable used to determine if appointment message ! should be displayed. appt-audible ! Variable used to determine if appointment is audible. ! Default is t. appt-visible ! Variable used to determine if appointment message should be ! displayed in the mini-buffer. Default is t. appt-msg-window ! Variable used to determine if appointment message ! should temporarily appear in another window. Mutually exclusive ! to appt-visible. appt-display-duration ! The number of seconds an appointment message ! is displayed in another window. ! ! appt-display-interval ! The number of minutes to wait between checking the appointments ! list. This function is run from the loadst process for display time. *************** *** 196,301 **** ! (let ((min-to-app -1) ! (new-time "")) ! (save-excursion ! ! ;; Get the current time and convert it to minutes ! ;; from midnight. ie. 12:01am = 1, midnight = 0. ! ! (let* ((cur-hour(string-to-int ! (substring (current-time-string) 11 13))) ! (cur-min (string-to-int ! (substring (current-time-string) 14 16))) ! (cur-comp-time (+ (* cur-hour 60) cur-min))) ! ! ;; If the time is 12:01am, we should update our ! ;; appointments to todays list. ! ! (if (= cur-comp-time 1) ! (if (and view-diary-entries-initially appt-display-diary) ! (diary) ! (let ((diary-display-hook 'appt-make-list)) ! (diary)))) ! ! ;; If there are entries in the list, and the ! ;; user wants a message issued ! ;; get the first time off of the list ! ;; and calculate the number of minutes until ! ;; the appointment. ! ! (if (and appt-issue-message appt-time-msg-list) ! (let ((appt-comp-time (car (car (car appt-time-msg-list))))) ! (setq min-to-app (- appt-comp-time cur-comp-time)) ! ! (while (and appt-time-msg-list ! (< appt-comp-time cur-comp-time)) ! (setq appt-time-msg-list (cdr appt-time-msg-list)) ! (if appt-time-msg-list ! (setq appt-comp-time ! (car (car (car appt-time-msg-list)))))) ! ! ;; If we have an appointment between midnight and ! ;; 'appt-message-warning-time' minutes after midnight, ! ;; we must begin to issue a message before midnight. ! ;; Midnight is considered 0 minutes and 11:59pm is ! ;; 1439 minutes. Therefore we must recalculate the minutes ! ;; to appointment variable. It is equal to the number of ! ;; minutes before midnight plus the number of ! ;; minutes after midnight our appointment is. ! ! (if (and (< appt-comp-time appt-message-warning-time) ! (> (+ cur-comp-time appt-message-warning-time) ! max-time)) ! (setq min-to-app (+ (- (1+ max-time) cur-comp-time)) ! appt-comp-time)) ! ! ;; issue warning if the appointment time is ! ;; within appt-message-warning time ! ! (if (and (<= min-to-app appt-message-warning-time) ! (>= min-to-app 0)) ! (progn ! (if appt-msg-window ! (progn ! (string-match ! "[0-9]?[0-9]:[0-9][0-9]\\(am\\|pm\\)?" ! display-time-string) ! ! (setq new-time (substring display-time-string ! (match-beginning 0) ! (match-end 0))) ! (appt-disp-window min-to-app new-time ! (car (cdr (car appt-time-msg-list))))) ! ;;; else ! ! (if appt-visible ! (message "%s" ! (car (cdr (car appt-time-msg-list))))) ! ! (if appt-audible ! (beep 1))) ! ! (if appt-display-mode-line ! (progn ! (string-match ! "[0-9]?[0-9]:[0-9][0-9]\\(am\\|pm\\)?" ! display-time-string) ! ! (setq new-time (substring display-time-string ! (match-beginning 0) ! (match-end 0))) ! (setq display-time-string ! (concat "App't in " ! min-to-app " min. " new-time " ")) ! ! ;; force mode line updates - from time.el ! ! (save-excursion (set-buffer (other-buffer))) ! (set-buffer-modified-p (buffer-modified-p)) ! (sit-for 0))) ! ! (if (= min-to-app 0) ! (setq appt-time-msg-list ! (cdr appt-time-msg-list))))))))))) --- 203,311 ---- ! (if (or (= appt-display-interval 1) ! ;; This is true every appt-display-interval minutes. ! (= 0 (mod (/ (nth 1 (current-time)) 60) appt-display-interval))) ! (let ((min-to-app -1) ! (new-time "")) ! (save-excursion ! ! ;; Get the current time and convert it to minutes ! ;; from midnight. ie. 12:01am = 1, midnight = 0. ! ! (let* ((cur-hour(string-to-int ! (substring (current-time-string) 11 13))) ! (cur-min (string-to-int ! (substring (current-time-string) 14 16))) ! (cur-comp-time (+ (* cur-hour 60) cur-min))) ! ! ;; If the time is 12:01am, we should update our ! ;; appointments to todays list. ! ! (if (= cur-comp-time 1) ! (if (and view-diary-entries-initially appt-display-diary) ! (diary) ! (let ((diary-display-hook 'appt-make-list)) ! (diary)))) ! ! ;; If there are entries in the list, and the ! ;; user wants a message issued ! ;; get the first time off of the list ! ;; and calculate the number of minutes until ! ;; the appointment. ! ! (if (and appt-issue-message appt-time-msg-list) ! (let ((appt-comp-time (car (car (car appt-time-msg-list))))) ! (setq min-to-app (- appt-comp-time cur-comp-time)) ! ! (while (and appt-time-msg-list ! (< appt-comp-time cur-comp-time)) ! (setq appt-time-msg-list (cdr appt-time-msg-list)) ! (if appt-time-msg-list ! (setq appt-comp-time ! (car (car (car appt-time-msg-list)))))) ! ! ;; If we have an appointment between midnight and ! ;; 'appt-message-warning-time' minutes after midnight, ! ;; we must begin to issue a message before midnight. ! ;; Midnight is considered 0 minutes and 11:59pm is ! ;; 1439 minutes. Therefore we must recalculate the minutes ! ;; to appointment variable. It is equal to the number of ! ;; minutes before midnight plus the number of ! ;; minutes after midnight our appointment is. ! ! (if (and (< appt-comp-time appt-message-warning-time) ! (> (+ cur-comp-time appt-message-warning-time) ! max-time)) ! (setq min-to-app (+ (- (1+ max-time) cur-comp-time)) ! appt-comp-time)) ! ! ;; issue warning if the appointment time is ! ;; within appt-message-warning time ! ! (if (and (<= min-to-app appt-message-warning-time) ! (>= min-to-app 0)) ! (progn ! (if appt-msg-window ! (progn ! (string-match ! "[0-9]?[0-9]:[0-9][0-9]\\(am\\|pm\\)?" ! display-time-string) ! ! (setq new-time (substring display-time-string ! (match-beginning 0) ! (match-end 0))) ! (appt-disp-window min-to-app new-time ! (car (cdr (car appt-time-msg-list))))) ! ;;; else ! ! (if appt-visible ! (message "%s" ! (car (cdr (car appt-time-msg-list))))) ! ! (if appt-audible ! (beep 1))) ! ! (if appt-display-mode-line ! (progn ! (string-match ! "[0-9]?[0-9]:[0-9][0-9]\\(am\\|pm\\)?" ! display-time-string) ! ! (setq new-time (substring display-time-string ! (match-beginning 0) ! (match-end 0))) ! (setq display-time-string ! (concat "App't in " ! min-to-app " min. " new-time " ")) ! ! ;; force mode line updates - from time.el ! ! (save-excursion (set-buffer (other-buffer))) ! (set-buffer-modified-p (buffer-modified-p)) ! (sit-for 0))) ! ! (if (= min-to-app 0) ! (setq appt-time-msg-list ! (cdr appt-time-msg-list)))))))))))) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/cal-dst.el emacs-19.21/lisp/cal-dst.el *** emacs-19.20/lisp/cal-dst.el Sat Sep 18 22:33:22 1993 --- emacs-19.21/lisp/cal-dst.el Tue Nov 16 07:14:11 1993 *************** *** 64,69 **** ;; floor((2^16 h +l) / (60*60*24)) (* 512 (floor h 675)) (floor u 675)) ! ;; (2^16 h +l) % (60*60*24) ! (+ (* (% u 675) 128) (% l 128))))) (defun calendar-time-from-absolute (abs-date s) --- 64,69 ---- ;; floor((2^16 h +l) / (60*60*24)) (* 512 (floor h 675)) (floor u 675)) ! ;; (2^16 h +l) mod (60*60*24) ! (+ (* (mod u 675) 128) (mod l 128))))) (defun calendar-time-from-absolute (abs-date s) *************** *** 78,84 **** ;; Overflow is a terrible thing! (cons ! ;; (60*60*24*a + s) / 2^16 (+ a (* 163 (floor a 512)) (floor u 512)) ! ;; (60*60*24*a + s) % 2^16 (+ (* 128 (mod u 512)) (mod s 128))))) --- 78,84 ---- ;; Overflow is a terrible thing! (cons ! ;; floor((60*60*24*a + s) / 2^16) (+ a (* 163 (floor a 512)) (floor u 512)) ! ;; (60*60*24*a + s) mod 2^16 (+ (* 128 (mod u 512)) (mod s 128))))) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/calendar.el emacs-19.21/lisp/calendar.el *** emacs-19.20/lisp/calendar.el Wed Oct 20 01:44:18 1993 --- emacs-19.21/lisp/calendar.el Tue Nov 16 07:14:15 1993 *************** *** 750,757 **** '((if (fboundp 'atan) (solar-equinoxes-solstices)) ! (progn ! (require 'cal-dst) (funcall ! 'holiday-sexp calendar-daylight-savings-starts '(format "Daylight Savings Time Begins %s" --- 750,758 ---- '((if (fboundp 'atan) (solar-equinoxes-solstices)) ! (if (progn ! (require 'cal-dst) ! t) (funcall ! 'holiday-sexp calendar-daylight-savings-starts '(format "Daylight Savings Time Begins %s" diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/comint.el emacs-19.21/lisp/comint.el *** emacs-19.20/lisp/comint.el Thu Nov 11 05:05:46 1993 --- emacs-19.21/lisp/comint.el Tue Nov 16 04:27:13 1993 *************** *** 612,616 **** most recent command last. See also `comint-input-ignoredups' and `comint-write-input-ring'." ! (cond ((null comint-input-ring-file-name) nil) ((not (file-readable-p comint-input-ring-file-name)) --- 612,617 ---- most recent command last. See also `comint-input-ignoredups' and `comint-write-input-ring'." ! (cond ((or (null comint-input-ring-file-name) ! (equal comint-input-ring-file-name "")) nil) ((not (file-readable-p comint-input-ring-file-name)) *************** *** 651,654 **** --- 652,656 ---- See also `comint-read-input-ring'." (cond ((or (null comint-input-ring-file-name) + (equal comint-input-ring-file-name "") (null comint-input-ring) (ring-empty-p comint-input-ring)) nil) *************** *** 1101,1108 **** ;; A kludge to prevent the delay between insert and process output ;; affecting the display. A case for a comint-send-input-hook? ! (let ((functions comint-output-filter-functions)) ! (while functions ! (funcall (car functions) (concat input "\n")) ! (setq functions (cdr functions)))))))) ;; The purpose of using this filter for comint processes --- 1103,1111 ---- ;; A kludge to prevent the delay between insert and process output ;; affecting the display. A case for a comint-send-input-hook? ! (if (eq (process-filter proc) 'comint-output-filter) ! (let ((functions comint-output-filter-functions)) ! (while functions ! (funcall (car functions) (concat input "\n")) ! (setq functions (cdr functions))))))))) ;; The purpose of using this filter for comint processes *************** *** 1742,1750 **** Environment variables are substituted." (save-excursion ! (if (re-search-backward "[^~/A-Za-z0-9_.$#,={}()-]" nil 'move) (forward-char 1)) ;; Anchor the search forwards. ! (if (not (looking-at "[~/A-Za-z0-9_.$#,={}()-]")) (error "")) ! (re-search-forward "[~/A-Za-z0-9_.$#,={}()-]+") (substitute-in-file-name (buffer-substring (match-beginning 0) (match-end 0))))) --- 1745,1753 ---- Environment variables are substituted." (save-excursion ! (if (re-search-backward "[^~/A-Za-z0-9+@:_.$#,={}-]" nil 'move) (forward-char 1)) ;; Anchor the search forwards. ! (if (not (looking-at "[~/A-Za-z0-9+@:_.$#,={}-]")) (error "")) ! (re-search-forward "[~/A-Za-z0-9+@:_.$#,={}-]+") (substitute-in-file-name (buffer-substring (match-beginning 0) (match-end 0))))) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/compare-w.el emacs-19.21/lisp/compare-w.el *** emacs-19.20/lisp/compare-w.el Sun Nov 7 17:19:08 1993 --- emacs-19.21/lisp/compare-w.el Tue Nov 16 07:14:26 1993 *************** *** 142,154 **** (beg (point)) (opoint (point))) ! (while (or (and (/= (point) start) ! ;; Consider at least the char before point, ! ;; unless it is also before START. ! (= (point) opoint)) ! (and (looking-at compare-windows-whitespace) (<= end (match-end 0)) ;; This match goes past END, so advance END. (progn (setq end (match-end 0)) ! (> (point) start)))) ;; keep going back until whitespace ;; doesn't extend to or past end --- 142,154 ---- (beg (point)) (opoint (point))) ! (while (or (and (looking-at compare-windows-whitespace) (<= end (match-end 0)) ;; This match goes past END, so advance END. (progn (setq end (match-end 0)) ! (> (point) start))) ! (and (/= (point) start) ! ;; Consider at least the char before point, ! ;; unless it is also before START. ! (= (point) opoint))) ;; keep going back until whitespace ;; doesn't extend to or past end diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/dired.el emacs-19.21/lisp/dired.el *** emacs-19.20/lisp/dired.el Mon Oct 25 02:13:14 1993 --- emacs-19.21/lisp/dired.el Tue Nov 16 07:14:43 1993 *************** *** 47,51 **** ;;;###autoload (defvar dired-chown-program ! (if (memq system-type '(hpux dgux usg-unix-v silicon-graphics-unix)) "chown" "/etc/chown") "Name of chown command (usually `chown' or `/etc/chown').") --- 47,51 ---- ;;;###autoload (defvar dired-chown-program ! (if (memq system-type '(hpux dgux usg-unix-v irix)) "chown" "/etc/chown") "Name of chown command (usually `chown' or `/etc/chown').") *************** *** 1101,1104 **** --- 1101,1108 ---- ;; Emacs Lisp code. (or dir (setq dir default-directory)) + ;; This case comes into play if default-directory is set to + ;; use ~. + (if (and (> (length dir) 0) (= (aref dir 0) ?~)) + (setq dir (expand-file-name dir))) (if (string-match (concat "^" (regexp-quote dir)) file) (substring file (match-end 0)) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/fill.el emacs-19.21/lisp/fill.el *** emacs-19.20/lisp/fill.el Sat Jul 31 15:26:57 1993 --- emacs-19.21/lisp/fill.el Tue Nov 16 07:15:03 1993 *************** *** 328,332 **** (if mailp (while (or (looking-at "[ \t]*[^ \t\n]*:") (looking-at "[ \t]*$")) ! (search-forward "\n\n" nil 'move))) (narrow-to-region (point) max) ;; Loop over paragraphs. --- 328,334 ---- (if mailp (while (or (looking-at "[ \t]*[^ \t\n]*:") (looking-at "[ \t]*$")) ! (if (looking-at "[ \t]*[^ \t\n]*:") ! (search-forward "\n\n" nil 'move) ! (forward-line 1)))) (narrow-to-region (point) max) ;; Loop over paragraphs. Only in emacs-19.20/lisp: forms.README diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/gnus.el emacs-19.21/lisp/gnus.el *** emacs-19.20/lisp/gnus.el Tue Aug 10 00:19:08 1993 --- emacs-19.21/lisp/gnus.el Tue Nov 16 05:47:45 1993 *************** *** 3,7 **** ;; Author: Masanobu UMEDA ! ;; Version: $Header: /home/gd/gnu/emacs/19.0/lisp/RCS/gnus.el,v 1.27 1993/08/10 04:14:17 eggert Exp $ ;; Keywords: news --- 3,7 ---- ;; Author: Masanobu UMEDA ! ;; Version: $Header: /home/fsf/rms/e19/lisp/RCS/gnus.el,v 1.29 1993/11/16 10:47:27 rms Exp $ ;; Keywords: news *************** *** 3825,3830 **** (file-name-directory default-name) default-name))) (gnus-make-directory (file-name-directory filename)) ! (rmail-output filename) ;; Remember the directory name to save articles. (setq gnus-newsgroup-last-mail filename) --- 3825,3836 ---- (file-name-directory default-name) default-name))) + (setq filename + (expand-file-name filename + (and default-name + (file-name-directory default-name)))) (gnus-make-directory (file-name-directory filename)) ! (if (and (file-readable-p filename) (rmail-file-p filename)) ! (gnus-output-to-rmail filename) ! (gnus-output-to-file filename)) ;; Remember the directory name to save articles. (setq gnus-newsgroup-last-mail filename) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/help.el emacs-19.21/lisp/help.el *** emacs-19.20/lisp/help.el Fri Aug 6 16:22:43 1993 --- emacs-19.21/lisp/help.el Tue Nov 16 07:15:25 1993 *************** *** 45,48 **** --- 45,49 ---- (define-key help-map "\C-d" 'describe-distribution) (define-key help-map "\C-w" 'describe-no-warranty) + (define-key help-map "\C-p" 'describe-project) (define-key help-map "a" 'command-apropos) *************** *** 202,205 **** --- 203,213 ---- (goto-char (point-min))) + (defun describe-project () + "Display info on the GNU project." + (interactive) + (find-file-read-only + (expand-file-name "GNU" data-directory)) + (goto-char (point-min))) + (defun describe-no-warranty () "Display info on all the kinds of warranty Emacs does NOT have." *************** *** 246,251 **** (make-help-screen help-for-help ! "a b c f C-f i k C-k l m n p s t v w C-c C-d C-n C-w. Type \\[help-for-help] again for more help: " ! "You have typed \\[help-for-help], the help character. Type a Help option: a command-apropos. Give a substring, and see a list of commands --- 254,259 ---- (make-help-screen help-for-help ! "a b c f C-f i k C-k l m n p s t v w C-c C-d C-n C-w. Type \\[help-command] again for more help: " ! "You have typed \\[help-command], the help character. Type a Help option: a command-apropos. Give a substring, and see a list of commands *************** *** 277,280 **** --- 285,289 ---- C-d print Emacs ordering information. C-n print news of recent Emacs changes. + C-p print information about the GNU project. C-w print information on absence of warranty for GNU Emacs." help-map) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/info.el emacs-19.21/lisp/info.el *** emacs-19.20/lisp/info.el Wed Nov 10 15:45:17 1993 --- emacs-19.21/lisp/info.el Tue Nov 16 01:52:02 1993 *************** *** 1293,1299 **** Moving within a node: ! \\[scroll-up] Normally, scroll forward a full screen. If the end of the buffer is already visible, try to go to the next menu entry, or up if there is none. ! \\[scroll-down] Normally, scroll backward. If the beginning of the buffer is already visible, try to go to the previous menu entry, or up if there is none. \\[beginning-of-buffer] Go to beginning of node. --- 1293,1299 ---- Moving within a node: ! \\[Info-scroll-up] Normally, scroll forward a full screen. If the end of the buffer is already visible, try to go to the next menu entry, or up if there is none. ! \\[Info-scroll-down] Normally, scroll backward. If the beginning of the buffer is already visible, try to go to the previous menu entry, or up if there is none. \\[beginning-of-buffer] Go to beginning of node. diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/iso-acc.el emacs-19.21/lisp/iso-acc.el *** emacs-19.20/lisp/iso-acc.el Sun Nov 7 16:23:09 1993 --- emacs-19.21/lisp/iso-acc.el Tue Nov 16 01:33:35 1993 *************** *** 3,7 **** ;; Author: Johan Vromans ! ;; Version: 1.7 ;; Maintainer: FSF ;; Keywords: i18n --- 3,7 ---- ;; Author: Johan Vromans ! ;; Version: 1.7 (modified) ;; Maintainer: FSF ;; Keywords: i18n *************** *** 40,43 **** --- 40,44 ---- ;; ~ (tilde) -> tilde over the character ;; / (slash) -> slash through the character. + ;; Also: /A is A-with-ring and /E is AE ligature. ;; ;; The action taken depends on the key that follows the pseudo accent. *************** *** 124,128 **** --- 125,133 ---- ((?\~ ?>) ?\273) ((?\~ ?<) ?\253) + ((?\/ ?A) ?\305) ;; A-with-ring (Norwegian and Danish) + ((?\/ ?E) ?\306) ;; AE-ligature (Norwegian and Danish) ((?\/ ?O) ?\330) + ((?\/ ?a) ?\345) ;; a-with-ring (Norwegian and Danish) + ((?\/ ?e) ?\346) ;; ae-ligature (Norwegian and Danish) ((?\/ ?o) ?\370) ) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/loaddefs.el emacs-19.21/lisp/loaddefs.el *** emacs-19.20/lisp/loaddefs.el Tue Nov 9 18:57:23 1993 --- emacs-19.21/lisp/loaddefs.el Tue Nov 16 08:26:38 1993 *************** *** 436,450 **** ;;; (point-min) (point-max)) ! ;;;### (autoloads (change-log-mode add-change-log-entry-other-window add-change-log-entry find-change-log prompt-for-change-log-name) "add-log" "add-log.el" (11354 48317)) ;;; Generated autoloads from add-log.el - (defvar change-log-default-name nil "\ - *Name of a change log file for \\[add-change-log-entry].") - - (defvar add-log-current-defun-function nil "\ - *If non-nil, function to guess name of current function from surrounding text. - \\[add-change-log-entry] calls this function (if nil, `add-log-current-defun' - instead) with no arguments. It returns a string or nil if it cannot guess.") - (autoload (quote prompt-for-change-log-name) "add-log" "\ Prompt for a change log name." nil nil) --- 436,442 ---- ;;; (point-min) (point-max)) ! ;;;### (autoloads (change-log-mode add-change-log-entry-other-window add-change-log-entry find-change-log prompt-for-change-log-name) "add-log" "add-log.el" (11496 28641)) ;;; Generated autoloads from add-log.el (autoload (quote prompt-for-change-log-name) "add-log" "\ Prompt for a change log name." nil nil) *************** *** 1204,1210 **** ;;;*** ! ;;;### (autoloads (list-yahrzeit-dates calendar) "calendar" "calendar.el" (11367 14240)) ;;; Generated autoloads from calendar.el (defvar view-diary-entries-initially nil "\ *If t, the diary entries for the current date will be displayed on entry. --- 1196,1206 ---- ;;;*** ! ;;;### (autoloads (list-yahrzeit-dates calendar) "calendar" "calendar.el" (11494 46605)) ;;; Generated autoloads from calendar.el + (defvar calendar-week-start-day 0 "\ + *The day of the week on which a week in the calendar begins. + 0 means Sunday (default), 1 means Monday, and so on.") + (defvar view-diary-entries-initially nil "\ *If t, the diary entries for the current date will be displayed on entry. *************** *** 1453,1461 **** (defvar european-calendar-display-form (quote ((if dayname (concat dayname ", ")) day " " monthname " " year)) "\ *Pseudo-pattern governing the way a date appears in the European style. ! See the documentation of calendar-date-display-forms for an explanation.") (defvar american-calendar-display-form (quote ((if dayname (concat dayname ", ")) monthname " " day ", " year)) "\ *Pseudo-pattern governing the way a date appears in the American style. ! See the documentation of calendar-date-display-forms for an explanation.") (defvar print-diary-entries-hook (quote lpr-buffer) "\ --- 1449,1457 ---- (defvar european-calendar-display-form (quote ((if dayname (concat dayname ", ")) day " " monthname " " year)) "\ *Pseudo-pattern governing the way a date appears in the European style. ! See the documentation of calendar-date-display-form for an explanation.") (defvar american-calendar-display-form (quote ((if dayname (concat dayname ", ")) monthname " " day ", " year)) "\ *Pseudo-pattern governing the way a date appears in the American style. ! See the documentation of calendar-date-display-form for an explanation.") (defvar print-diary-entries-hook (quote lpr-buffer) "\ *************** *** 1590,1594 **** See the documentation for `calendar-holidays' for details.") ! (defvar solar-holidays (quote ((if (fboundp (quote atan)) (solar-equinoxes-solstices)) (progn (require (quote cal-dst)) (funcall (quote holiday-sexp) calendar-daylight-savings-starts (quote (format "Daylight Savings Time Begins %s" (if (fboundp (quote atan)) (solar-time-string (/ calendar-daylight-savings-switchover-time (float 60)) date (quote standard)) ""))))) (funcall (quote holiday-sexp) calendar-daylight-savings-ends (quote (format "Daylight Savings Time Ends %s" (if (fboundp (quote atan)) (solar-time-string (/ (- calendar-daylight-savings-switchover-time calendar-daylight-time-offset) (float 60)) date (quote daylight)) "")))))) "\ *Sun-related holidays. See the documentation for `calendar-holidays' for details.") --- 1586,1590 ---- See the documentation for `calendar-holidays' for details.") ! (defvar solar-holidays (quote ((if (fboundp (quote atan)) (solar-equinoxes-solstices)) (if (progn (require (quote cal-dst)) t) (funcall (quote holiday-sexp) calendar-daylight-savings-starts (quote (format "Daylight Savings Time Begins %s" (if (fboundp (quote atan)) (solar-time-string (/ calendar-daylight-savings-starts-time (float 60)) date (quote standard)) ""))))) (funcall (quote holiday-sexp) calendar-daylight-savings-ends (quote (format "Daylight Savings Time Ends %s" (if (fboundp (quote atan)) (solar-time-string (/ (- calendar-daylight-savings-ends-time calendar-daylight-time-offset) (float 60)) date (quote daylight)) "")))))) "\ *Sun-related holidays. See the documentation for `calendar-holidays' for details.") *************** *** 2195,2199 **** may contain even `F', `b', `i' and `s'.") ! (defvar dired-chown-program (if (memq system-type (quote (hpux dgux usg-unix-v silicon-graphics-unix))) "chown" "/etc/chown") "\ Name of chown command (usually `chown' or `/etc/chown').") --- 2191,2195 ---- may contain even `F', `b', `i' and `s'.") ! (defvar dired-chown-program (if (memq system-type (quote (hpux dgux usg-unix-v irix))) "chown" "/etc/chown") "\ Name of chown command (usually `chown' or `/etc/chown').") *************** *** 2485,2667 **** ;;;*** - - (defvar tags-file-name nil "\ - *File name of tags table. - To switch to a new tags table, setting this variable is sufficient. - If you set this variable, do not also set `tags-table-list'. - Use the `etags' program to make a tags table file.") - (put 'tags-file-name 'variable-interactive "fVisit tags table: ") - - (defvar tags-table-list nil "\ - *List of file names of tags tables to search. - An element that is a directory means the file \"TAGS\" in that directory. - To switch to a new list of tags tables, setting this variable is sufficient. - If you set this variable, do not also set `tags-file-name'. - Use the `etags' program to make a tags table file.") - - (defvar find-tag-hook nil "\ - *Hook to be run by \\[find-tag] after finding a tag. See `run-hooks'. - The value in the buffer in which \\[find-tag] is done is used, - not the value in the buffer \\[find-tag] goes to.") - - (defvar find-tag-default-function nil "\ - *A function of no arguments used by \\[find-tag] to pick a default tag. - If nil, and the symbol that is the value of `major-mode' - has a `find-tag-default-function' property (see `put'), that is used. - Otherwise, `find-tag-default' is used.") - - (defvar default-tags-table-function nil "\ - *If non-nil, a function of no arguments to choose a default tags file - for a particular buffer.") - - (autoload (quote visit-tags-table) "etags" "\ - Tell tags commands to use tags table file FILE. - FILE should be the name of a file created with the `etags' program. - A directory name is ok too; it means file TAGS in that directory. - - Normally \\[visit-tags-table] sets the global value of `tags-file-name'. - With a prefix arg, set the buffer-local value instead. - When you find a tag with \\[find-tag], the buffer it finds the tag - in is given a local value of this variable which is the name of the tags - file the tag was in." t nil) - - (autoload (quote tags-table-files) "etags" "\ - Return a list of files in the current tags table. - Assumes the tags table is the current buffer. - File names returned are absolute." nil nil) - - (autoload (quote find-tag-noselect) "etags" "\ - Find tag (in current tags table) whose name contains TAGNAME. - Returns the buffer containing the tag's definition and moves its point there, - but does not select the buffer. - The default for TAGNAME is the expression in the buffer near point. - - If second arg NEXT-P is t (interactively, with prefix arg), search for - another tag that matches the last tagname or regexp used. When there are - multiple matches for a tag, more exact matches are found first. If NEXT-P - is the atom `-' (interactively, with prefix arg that is a negative number - or just \\[negative-argument]), pop back to the previous tag gone to. - - If third arg REGEXP-P is non-nil, treat TAGNAME as a regexp. - - See documentation of variable `tags-file-name'." t nil) - - (autoload (quote find-tag) "etags" "\ - Find tag (in current tags table) whose name contains TAGNAME. - Select the buffer containing the tag's definition, and move point there. - The default for TAGNAME is the expression in the buffer around or before point. - - If second arg NEXT-P is t (interactively, with prefix arg), search for - another tag that matches the last tagname or regexp used. When there are - multiple matches for a tag, more exact matches are found first. If NEXT-P - is the atom `-' (interactively, with prefix arg that is a negative number - or just \\[negative-argument]), pop back to the previous tag gone to. - - See documentation of variable `tags-file-name'." t nil) - (define-key esc-map "." 'find-tag) - - (autoload (quote find-tag-other-window) "etags" "\ - Find tag (in current tags table) whose name contains TAGNAME. - Select the buffer containing the tag's definition in another window, and - move point there. The default for TAGNAME is the expression in the buffer - around or before point. - - If second arg NEXT-P is t (interactively, with prefix arg), search for - another tag that matches the last tagname or regexp used. When there are - multiple matches for a tag, more exact matches are found first. If NEXT-P - is negative (interactively, with prefix arg that is a negative number or - just \\[negative-argument]), pop back to the previous tag gone to. - - See documentation of variable `tags-file-name'." t nil) - (define-key ctl-x-4-map "." 'find-tag-other-window) - - (autoload (quote find-tag-other-frame) "etags" "\ - Find tag (in current tags table) whose name contains TAGNAME. - Select the buffer containing the tag's definition in another frame, and - move point there. The default for TAGNAME is the expression in the buffer - around or before point. - - If second arg NEXT-P is t (interactively, with prefix arg), search for - another tag that matches the last tagname or regexp used. When there are - multiple matches for a tag, more exact matches are found first. If NEXT-P - is negative (interactively, with prefix arg that is a negative number or - just \\[negative-argument]), pop back to the previous tag gone to. - - See documentation of variable `tags-file-name'." t nil) - (define-key ctl-x-5-map "." 'find-tag-other-frame) - - (autoload (quote find-tag-regexp) "etags" "\ - Find tag (in current tags table) whose name matches REGEXP. - Select the buffer containing the tag's definition and move point there. - - If second arg NEXT-P is t (interactively, with prefix arg), search for - another tag that matches the last tagname or regexp used. When there are - multiple matches for a tag, more exact matches are found first. If NEXT-P - is negative (interactively, with prefix arg that is a negative number or - just \\[negative-argument]), pop back to the previous tag gone to. - - If third arg OTHER-WINDOW is non-nil, select the buffer in another window. - - See documentation of variable `tags-file-name'." t nil) - - (autoload (quote next-file) "etags" "\ - Select next file among files in current tags table. - Non-nil first argument (prefix arg, if interactive) - initializes to the beginning of the list of files in the tags table. - - Non-nil second argument NOVISIT means use a temporary buffer - to save time and avoid uninteresting warnings. - - Value is nil if the file was already visited; - if the file was newly read in, the value is the filename." t nil) - - (autoload (quote tags-loop-continue) "etags" "\ - Continue last \\[tags-search] or \\[tags-query-replace] command. - Used noninteractively with non-nil argument to begin such a command. - Two variables control the processing we do on each file: - the value of `tags-loop-scan' is a form to be executed on each file - to see if it is interesting (it returns non-nil if so) - and `tags-loop-operate' is a form to execute to operate on an interesting file - If the latter returns non-nil, we exit; otherwise we scan the next file." t nil) - (define-key esc-map "," 'tags-loop-continue) - - (autoload (quote tags-search) "etags" "\ - Search through all files listed in tags table for match for REGEXP. - Stops when a match is found. - To continue searching for next match, use command \\[tags-loop-continue]. - - See documentation of variable `tags-file-name'." t nil) - - (autoload (quote tags-query-replace) "etags" "\ - Query-replace-regexp FROM with TO through all files listed in tags table. - Third arg DELIMITED (prefix arg) means replace only word-delimited matches. - If you exit (\\[keyboard-quit] or ESC), you can resume the query-replace - with the command \\[tags-loop-continue]. - - See documentation of variable `tags-file-name'." t nil) - - (autoload (quote list-tags) "etags" "\ - Display list of tags in file FILE. - FILE should not contain a directory specification - unless it has one in the tags table." t nil) - - (autoload (quote tags-apropos) "etags" "\ - Display list of all tags in tags table REGEXP matches." t nil) - - (autoload (quote select-tags-table) "etags" "\ - Select a tags table file from a menu of those you have already used. - The list of tags tables to select from is stored in `tags-table-file-list'; - see the doc of that variable if you want to add names to the list." t nil) - - (autoload (quote complete-tag) "etags" "\ - Perform tags completion on the text around point. - Completes to the set of names listed in the current tags table. - The string to complete is chosen in the same way as the default - for \\[find-tag] (which see)." t nil) - (define-key esc-map "\t" 'complete-tag) - - ;;;*** ! ;;;### (autoloads (complete-tag select-tags-table tags-apropos list-tags tags-query-replace tags-search tags-loop-continue next-file find-tag-regexp find-tag-other-frame find-tag-other-window find-tag find-tag-noselect tags-table-files visit-tags-table) "etags" "etags.el" (11394 10144)) ;;; Generated autoloads from etags.el --- 2481,2486 ---- ;;;*** ! ;;;### (autoloads (complete-tag select-tags-table tags-apropos list-tags tags-query-replace tags-search tags-loop-continue next-file find-tag-regexp find-tag-other-frame find-tag-other-window find-tag find-tag-noselect tags-table-files visit-tags-table) "etags" "etags.el" (11487 17108)) ;;; Generated autoloads from etags.el *************** *** 2826,2831 **** (autoload (quote list-tags) "etags" "\ Display list of tags in file FILE. ! FILE should not contain a directory specification ! unless it has one in the tags table." t nil) (autoload (quote tags-apropos) "etags" "\ --- 2645,2649 ---- (autoload (quote list-tags) "etags" "\ Display list of tags in file FILE. ! FILE should not contain a directory specification." t nil) (autoload (quote tags-apropos) "etags" "\ *************** *** 3515,3519 **** *List of strings to pass as extra switch args to lpr when it is invoked.") ! (defvar lpr-command (if (memq system-type (quote (usg-unix-v dgux-unix hpux silicon-graphics-unix))) "lp" "lpr") "\ *Shell command for printing a file") --- 3333,3337 ---- *List of strings to pass as extra switch args to lpr when it is invoked.") ! (defvar lpr-command (if (memq system-type (quote (usg-unix-v dgux-unix hpux irix))) "lp" "lpr") "\ *Shell command for printing a file") *************** *** 4364,4367 **** --- 4182,4192 ---- ;;;*** + ;;;### (autoloads (rmail-file-p) "rmailout" "rmailout.el" (11496 44723)) + ;;; Generated autoloads from rmailout.el + + (autoload (quote rmail-file-p) "rmailout" nil nil nil) + + ;;;*** + ;;;### (autoloads (rot13-other-window) "rot13" "rot13.el" (11295 37709)) ;;; Generated autoloads from rot13.el *************** *** 4596,4600 **** ;;;*** ! ;;;### (autoloads (sunrise-sunset) "solar" "solar.el" (11367 8281)) ;;; Generated autoloads from solar.el --- 4421,4425 ---- ;;;*** ! ;;;### (autoloads (solar-equinoxes-solstices sunrise-sunset) "solar" "solar.el" (11494 46887)) ;;; Generated autoloads from solar.el *************** *** 4642,4645 **** --- 4467,4474 ---- This function is suitable for execution in a .emacs file." t nil) + (autoload (quote solar-equinoxes-solstices) "solar" "\ + Date and time of equinoxes and solstices, if visible in the calendar window. + Requires floating point." nil nil) + ;;;*** *************** *** 5476,5480 **** ;;;*** ! ;;;### (autoloads (vc-update-change-log vc-cancel-version vc-revert-buffer vc-print-log vc-retrieve-snapshot vc-create-snapshot vc-directory vc-insert-headers vc-diff vc-register vc-next-action) "vc" "vc.el" (11367 8291)) ;;; Generated autoloads from vc.el --- 5305,5309 ---- ;;;*** ! ;;;### (autoloads (vc-update-change-log vc-cancel-version vc-revert-buffer vc-print-log vc-retrieve-snapshot vc-create-snapshot vc-directory vc-insert-headers vc-version-other-window vc-diff vc-register vc-next-action) "vc" "vc.el" (11495 462)) ;;; Generated autoloads from vc.el *************** *** 5515,5518 **** --- 5344,5352 ---- With a prefix argument, it reads the file name to use and two version designators specifying which versions to compare." t nil) + + (autoload (quote vc-version-other-window) "vc" "\ + Visit version REV of the current buffer in another window. + If the current buffer is named `F', the version is named `F.~REV~'. + If `F.~REV~' already exists, it is used instead of being re-created." t nil) (autoload (quote vc-insert-headers) "vc" "\ diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/lpr.el emacs-19.21/lisp/lpr.el *** emacs-19.20/lisp/lpr.el Sat Aug 14 05:52:55 1993 --- emacs-19.21/lisp/lpr.el Tue Nov 16 07:15:53 1993 *************** *** 36,40 **** ;;;###autoload (defvar lpr-command ! (if (memq system-type '(usg-unix-v dgux-unix hpux silicon-graphics-unix)) "lp" "lpr") "*Shell command for printing a file") --- 36,40 ---- ;;;###autoload (defvar lpr-command ! (if (memq system-type '(usg-unix-v dgux-unix hpux irix)) "lp" "lpr") "*Shell command for printing a file") diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/mouse.el emacs-19.21/lisp/mouse.el *** emacs-19.20/lisp/mouse.el Tue Nov 2 19:48:04 1993 --- emacs-19.21/lisp/mouse.el Tue Nov 16 07:16:19 1993 *************** *** 163,167 **** (overlay-put mouse-drag-overlay 'face 'region) ! (defvar mouse-selection-click-count nil) (defun mouse-drag-region (start-event) --- 163,167 ---- (overlay-put mouse-drag-overlay 'face 'region) ! (defvar mouse-selection-click-count 0) (defun mouse-drag-region (start-event) *************** *** 195,199 **** (or (mouse-movement-p event) (eq (car-safe event) 'switch-frame))) - (if (eq (car-safe event) 'switch-frame) nil --- 195,198 ---- *************** *** 379,400 **** (defvar mouse-save-then-kill-posn nil) ! (defun mouse-save-then-kill-delete-region () ! ;; Delete just one char, so in case buffer is being modified ! ;; for the first time, the undo list records that fact. ! (delete-region (point) ! (+ (point) (if (> (mark) (point)) 1 -1))) ! ;; Now delete the rest of the specified region, ! ;; but don't record it. ! (let ((buffer-undo-list t)) ! (delete-region (point) (mark))) ! (if (not (eq buffer-undo-list t)) ! (let ((tail buffer-undo-list)) ! ;; Search back in buffer-undo-list for the string ! ;; that came from the first delete-region. ! (while (and tail (not (stringp (car (car tail))))) ! (setq tail (cdr tail))) ! ;; Replace it with an entry for the entire deleted text. ! (and tail ! (setcar tail (cons (car kill-ring) (point))))))) (defun mouse-save-then-kill (click) --- 378,406 ---- (defvar mouse-save-then-kill-posn nil) ! (defun mouse-save-then-kill-delete-region (beg end) ! (if (or (= beg end) (eq buffer-undo-list t)) ! ;; If we have no undo list in this buffer, ! ;; just delete. ! (delete-region beg end) ! ;; Delete, but make the undo-list entry share with the kill ring. ! ;; First, delete just one char, so in case buffer is being modified ! ;; for the first time, the undo list records that fact. ! (delete-region beg ! (+ beg (if (> end beg) 1 -1))) ! (let ((buffer-undo-list buffer-undo-list)) ! ;; Undo that deletion--but don't change the undo list! ! (primitive-undo 1 buffer-undo-list) ! ;; Now delete the rest of the specified region, ! ;; but don't record it. ! (setq buffer-undo-list t) ! (delete-region beg end)) ! (let ((tail buffer-undo-list)) ! ;; Search back in buffer-undo-list for the string ! ;; that came from deleting one character. ! (while (and tail (not (stringp (car (car tail))))) ! (setq tail (cdr tail))) ! ;; Replace it with an entry for the entire deleted text. ! (and tail ! (setcar tail (cons (car kill-ring) (min beg end))))))) (defun mouse-save-then-kill (click) *************** *** 440,444 **** ;; If we click this button again without moving it, ;; that time kill. ! (mouse-save-then-kill-delete-region)) (if (and (eq last-command 'mouse-save-then-kill) mouse-save-then-kill-posn --- 446,452 ---- ;; If we click this button again without moving it, ;; that time kill. ! (mouse-save-then-kill-delete-region (point) (mark)) ! (setq mouse-selection-click-count 0) ! (setq mouse-save-then-kill-posn nil)) (if (and (eq last-command 'mouse-save-then-kill) mouse-save-then-kill-posn *************** *** 447,452 **** ;; If this is the second time we've called ;; mouse-save-then-kill, delete the text from the buffer. ! (mouse-save-then-kill-delete-region) ! (if (or (eq last-command 'mouse-save-then-kill) (and mark-active transient-mark-mode) (and (eq last-command 'mouse-drag-region) --- 455,464 ---- ;; If this is the second time we've called ;; mouse-save-then-kill, delete the text from the buffer. ! (progn ! (mouse-save-then-kill-delete-region (point) (mark)) ! ;; After we kill, another click counts as "the first time". ! (setq mouse-save-then-kill-posn nil)) ! (if (or (and (eq last-command 'mouse-save-then-kill) ! mouse-save-then-kill-posn) (and mark-active transient-mark-mode) (and (eq last-command 'mouse-drag-region) *************** *** 542,550 **** (set-buffer (window-buffer start-window)) (setq mouse-selection-click-count click-count) - ;; Cancel any preexisting secondary selection. (or mouse-secondary-overlay (setq mouse-secondary-overlay (make-overlay (point) (point)))) (if (> click-count 0) (let ((range (mouse-start-end start-point start-point click-count))) (set-marker mouse-secondary-start nil) --- 554,564 ---- (set-buffer (window-buffer start-window)) (setq mouse-selection-click-count click-count) (or mouse-secondary-overlay (setq mouse-secondary-overlay (make-overlay (point) (point)))) + (overlay-put mouse-secondary-overlay 'face 'secondary-selection) (if (> click-count 0) + ;; Double or triple press: make an initial selection + ;; of one word or line. (let ((range (mouse-start-end start-point start-point click-count))) (set-marker mouse-secondary-start nil) *************** *** 553,556 **** --- 567,571 ---- (move-overlay mouse-secondary-overlay (car range) (nth 1 range) (window-buffer start-window))) + ;; Single-press: cancel any preexisting secondary selection. (or mouse-secondary-start (setq mouse-secondary-start (make-marker))) *************** *** 678,683 **** ;; that time kill. (progn ! (delete-overlay mouse-secondary-overlay) ! (mouse-save-then-kill-delete-region))) (if (and (eq last-command 'mouse-secondary-save-then-kill) mouse-save-then-kill-posn --- 693,702 ---- ;; that time kill. (progn ! (mouse-save-then-kill-delete-region ! (overlay-start mouse-secondary-overlay) ! (overlay-end mouse-secondary-overlay)) ! (setq mouse-save-then-kill-posn nil) ! (setq mouse-selection-click-count 0) ! (delete-overlay mouse-secondary-overlay))) (if (and (eq last-command 'mouse-secondary-save-then-kill) mouse-save-then-kill-posn *************** *** 687,692 **** ;; mouse-secondary-save-then-kill, delete the text from the buffer. (progn ! (delete-overlay mouse-secondary-overlay) ! (mouse-save-then-kill-delete-region)) (if (overlay-start mouse-secondary-overlay) ;; We have a selection, so adjust it. --- 706,714 ---- ;; mouse-secondary-save-then-kill, delete the text from the buffer. (progn ! (mouse-save-then-kill-delete-region ! (overlay-start mouse-secondary-overlay) ! (overlay-end mouse-secondary-overlay)) ! (setq mouse-save-then-kill-posn nil) ! (delete-overlay mouse-secondary-overlay)) (if (overlay-start mouse-secondary-overlay) ;; We have a selection, so adjust it. diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/nntp.el emacs-19.21/lisp/nntp.el *** emacs-19.20/lisp/nntp.el Wed Jun 9 07:26:37 1993 --- emacs-19.21/lisp/nntp.el Tue Nov 16 01:53:25 1993 *************** *** 520,524 **** ;; Insert `.' at end of buffer (end of text mark). (goto-char (point-max)) ! (insert ".\n") )) --- 520,524 ---- ;; Insert `.' at end of buffer (end of text mark). (goto-char (point-max)) ! (insert ".\r\n") )) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/page-ext.el emacs-19.21/lisp/page-ext.el *** emacs-19.20/lisp/page-ext.el Wed Jun 9 07:26:42 1993 --- emacs-19.21/lisp/page-ext.el Tue Nov 16 07:16:26 1993 *************** *** 1,8 **** ! ;;; page-ext.el --- page handling commands ! ;;; Copyright (C) 1990 Free Software Foundation ! ;; Author: Robert J. Chassell ;; This file is part of GNU Emacs. --- 1,11 ---- ! ;;; page-ext.el --- extended page handling commands ! ;; You may use these commands to handle an address list or other ! ;; small data base. ! ;; Copyright (C) 1990, 1991, 1993 Free Software Foundation + ;; Maintainer: Robert J. Chassell + ;; This file is part of GNU Emacs. *************** *** 21,142 **** ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - ;;; Commentary: - - ;;; You may use these commands to handle an address list or other - ;;; small data base. - - ;;; Change Log: - - ;;; Change Log ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;;; - ;;; Version 0.043 - ;;; 24 May 1990 - When the cursor is at the end of the pages directory - ;;; buffer (which is empty), a `C-c C-c' (pages-directory-goto) - ;;; command now takes you to the end of the buffer. - ;;; - ;;; Version 0.042 - ;;; 16 May 1990 - Since people often handle address and other files - ;;; differently, variable `pages-directory-for-addresses-narrowing-p' - ;;; now specifies whether `pages-directory-goto' should narrow - ;;; addresses buffer to entry to which it goes. - ;;; `pages-directory-buffer-narrowing-p' continues to control - ;;; narrowing of pages buffer. - ;;; - ;;; `add-new-page' documentation string now explains - ;;; that the value of the inserted page-delimiter is a `^L'. - ;;; - ;;; `pages-directory-previous-regexp' definition reworded. - ;;; - ;;; Removed unneeded defvar for `pages-directory-buffer'. - ;;; - ;;; Version 0.041 - ;;; 14 May 1990 - `pages-last-search' bound to nil initially. - ;;; Remove unnecessary lines from `search-pages' definition. - ;;; - ;;; Version 0.04 - ;;; 18 Mar 1990 - `pages-directory' creates a directory for only the - ;;; accessible portion of the buffer; it does not automatically widen - ;;; the buffer. - ;;; - ;;; However, `pages-directory-for-addresses' does widen the addresses' - ;;; buffer before constructing the addresses' directory. - ;;; - ;;; Version 0.032 - ;;; 20 Feb 1990 - `pages-directory-for-addresses' no longer copies - ;;; first line of addresses directory to kill-ring - ;;; - ;;; Remove `(kill-all-local-variables)' line from - ;;; `pages-directory-address-mode' so Emacs will not be told to forget - ;;; the name of the file containing the addresses! - ;;; - ;;; Version 0.031 - ;;; 15 Feb 1990 - `pages-directory-goto' no longer erroneously selects - ;;; the entry on the following line when the cursor is at the end of - ;;; the line, but selects the entry on which the cursor rests. - ;;; - ;;; `pages-directory-address-mode' now sets local variables and enables - ;;; `describe-mode' to describe Addresses Directory mode. - ;;; - ;;; `pages-directory-for-addresses' now sets the buffer-modified flag - ;;; for the Addresses Directory to nil. - ;;; - ;;; The documentation string for both `pages-directory-mode' and - ;;; `pages-directory-address-mode' now provide a lookup for the - ;;; `pages-directory-goto' keybinding. - ;;; - ;;; Version 0.03 - ;;; 10 Feb 1990 - Incorporated a specialized extension of the - ;;; `pages-directory' command called `pages-directory-for-addresses' - ;;; and bound it to ctl-x-ctl-p-map "d" for integration with other - ;;; page functions. This function finds a file, creates a directory - ;;; for it using the `pages-directory' command, and displays the - ;;; directory. It is primarily for lists of addresses and the like. - ;;; - ;;; The difference between this and the `pages-directory' command is - ;;; that the `pages-directory-for-addresses' command presumes a - ;;; default addresses file (although you may optionally specify a file - ;;; name) and it switches you to the directory for the file, but the - ;;; `pages-directory' command creates a directory for the current - ;;; buffer, and pops to the directory in another window. - ;;; - ;;; `pages-directory' now places the cursor over the header line of - ;;; the page in which point was located in the pages buffer. - ;;; - ;;; New `set-page-delimiter' command sets the buffer local value of - ;;; the page-delimiter variable. With prefix arg, resets function to - ;;; original value. (Quicker to use than `edit-options'.) - ;;; - ;;; Version 0.02 - ;;; 9 Feb 1990 - `pages-directory' now displays the - ;;; first line that contains a non-blank character that follows the - ;;; `page-delimiter'; this may be the rest of the line that contains - ;;; the `page-delimiter' or a line following. (In most instances, the - ;;; line containing a non-blank character is a line of text.) - ;;; Modification includes changes to `pages-copy-header-and-position'. - ;;; - ;;; Each directory created by `pages-directory' now possesses a name - ;;; derived on the name of the pages buffer. Consequently, you may - ;;; create several different directories, one for each pages buffer. - ;;; - ;;; `sort-pages-in-region' no longers requires the text to start on - ;;; the line immediately following the line containing the - ;;; page-delimiter. - ;;; - ;;; `pages-directory-goto' no longer narrows to the page - ;;; automatically. Instead, if you wish it to narrow to the page, set - ;;; variable pages-directory-buffer-narrowing-p to a non-nil value. - ;;; Default is nil; this is an experiment to see whether it is useful - ;;; to see the surrounding context. - ;;; - ;;; Version 0.011 - ;;; 2 Feb 1990 - `add-new-page': removed extraneous space. - ;;; - ;;; Version 0.01 - ;;; 28 Jan 1990 - Initial definitions. - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - ;;; Code: ! ;;;; Summary ; The current page commands are: --- 24,29 ---- ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! ;;; Summary ; The current page commands are: *************** *** 165,173 **** ; pages-directory C-x C-p C-d ; pages-directory-for-addresses C-x C-p d ! ; goto-page C-c C-c ! ;;;; Using the page commands ! ; ; The page commands are helpful in several different contexts. For ; example, programmers often divide source files into sections using the --- 52,60 ---- ; pages-directory C-x C-p C-d ; pages-directory-for-addresses C-x C-p d ! ; pages-directory-goto C-c C-c ! ;;; Using the page commands ! ; The page commands are helpful in several different contexts. For ; example, programmers often divide source files into sections using the *************** *** 181,186 **** ; page-delimiter to its original value. ! ;;;; Handling an address list or small data base ; You may use the page commands to handle an address list or other --- 68,90 ---- ; page-delimiter to its original value. + ; You may set several user options: + ; + ; The `pages-directory-buffer-narrowing-p' variable causes the + ; `pages-directory-goto' command to narrow to the destination page. + ; + ; The `pages-directory-for-adding-page-narrowing-p' variable, causes the + ; `add-new-page' command to narrow to the new entry. + ; + ; The `pages-directory-for-adding-new-page-before-current-page-p' variable + ; causes the `add-new-page' command to insert a new page before current + ; page. + ; + ; These variables are true by default. + ; + ; Additional, addresses-related user options are described in the next page + ; of this file. + ! ;;; Handling an address list or small data base ; You may use the page commands to handle an address list or other *************** *** 224,228 **** ; ; Congressional committee concerned with permitting or preventing ! ; monopolistic restrictions on the use of software technology ; ; --- 128,132 ---- ; ; Congressional committee concerned with permitting or preventing ! ; monopolistic restrictions on the use of software technology. ; ; *************** *** 261,273 **** ; In the directory, you may position the cursor over a heading line ! ; and type `C-c C-c' to go to the entry to which it refers in the ! ; pages buffer. ! ; When used in conjunction with the `pages-directory-for-addresses' ! ; command, the `C-c C-c' (pages-directory-goto) command narrows to the ! ; entry to which it goes. But, when used in conjunction with the ! ; `pages-directory' command, the `C-c C-c' (pages-directory-goto) ! ; command does not narrow to the entry, but widens the buffer so you ! ; can see the context surrounding the entry. ; If you wish, you may create several different directories, --- 165,174 ---- ; In the directory, you may position the cursor over a heading line ! ; and type `C-c C-c' (pages-directory-goto) to go to the entry to ! ; which it refers in the pages buffer. ! ; You can type `C-c C-p C-a' (add-new-page) to add a new entry in the ! ; pages buffer or address file. This is the same command you use to ! ; add a new entry when you are in the pages buffer or address file. ; If you wish, you may create several different directories, *************** *** 283,291 **** ; file name. ;; `pages-directory' in detail ! ; Call the `pages-directory' from the buffer for which you want a ! ; directory created; it creates a directory for the buffer and pops ! ; you to the directory. ; The `pages-directory' command has several options: --- 184,213 ---- ; file name. + ; You may customize the addresses commands: + + ; The `pages-addresses-file-name' variable determines the name of + ; the addresses file; by default it is "~/addresses". + + ; The `pages-directory-for-addresses-goto-narrowing-p' variable + ; determines whether `pages-directory-goto' narrows the addresses + ; buffer to the entry, which it does by default. + + ; The `pages-directory-for-addresses-buffer-keep-windows-p' variable + ; determines whether `pages-directory-for-addresses' deletes other + ; windows to show as many lines as possible on the screen or works + ; in the usual Emacs manner and keeps other windows. Default is to + ; keep other windows. + + ; The `pages-directory-for-adding-addresses-narrowing-p' variable + ; determines whether `pages-directory-for-addresses' narrows the + ; addresses buffer to a new entry when you are adding that entry. + ; Default is to narrow to new entry, which means you see a blank + ; screen before you write the new entry. + ;; `pages-directory' in detail ! ; Call the `pages-directory' command from the buffer for which you ! ; want a directory created; it creates a directory for the buffer and ! ; pops you to the directory. ; The `pages-directory' command has several options: *************** *** 306,311 **** ; command lists the lengths of pages whose contents match a regexp. ! ;;;; Key bindings for page handling functions (global-unset-key "\C-x\C-p") --- 228,263 ---- ; command lists the lengths of pages whose contents match a regexp. + ;;; Code: + + + ;;; Customarily customizable variable definitions + + (defvar pages-directory-buffer-narrowing-p t + "*If non-nil, `pages-directory-goto' narrows pages buffer to entry.") + + (defvar pages-directory-for-adding-page-narrowing-p t + "*If non-nil, `add-new-page' narrows page buffer to new entry.") + + (defvar pages-directory-for-adding-new-page-before-current-page-p t + "*If non-nil, `add-new-page' inserts new page before current page.") + + + ;;; Addresses related variables + + (defvar pages-addresses-file-name "~/addresses" + "*Standard name for file of addresses. Entries separated by page-delimiter. + Used by `pages-directory-for-addresses' function.") + + (defvar pages-directory-for-addresses-goto-narrowing-p t + "*If non-nil, `pages-directory-goto' narrows addresses buffer to entry.") + + (defvar pages-directory-for-addresses-buffer-keep-windows-p t + "*If nil, `pages-directory-for-addresses' deletes other windows.") + + (defvar pages-directory-for-adding-addresses-narrowing-p t + "*If non-nil, `add-new-page' narrows addresses buffer to new entry.") + ! ;;; Key bindings for page handling functions (global-unset-key "\C-x\C-p") *************** *** 328,332 **** ! ;;;; Page movement function definitions (defun next-page (&optional count) --- 280,284 ---- ! ;;; Page movement function definitions (defun next-page (&optional count) *************** *** 362,376 **** ! ;;;; Adding and searching pages (defun add-new-page (header-line) ! "Insert new page at point; prompt for header line. ! Page begins with a `^L' as the page-delimiter. Point is left in the body of page." (interactive "sHeader line: ") (widen) ! (insert (format "\n \n%s\n\n" header-line)) ! ;; don't renarrow; stay unnarrowed to see context ! (forward-line -1)) (defvar pages-last-search nil --- 314,369 ---- ! ;;; Adding and searching pages (defun add-new-page (header-line) ! "Insert new page. Prompt for header line. ! ! If point is in the pages directory buffer, insert the new page in the ! buffer associated with the directory. ! ! Insert the new page just before current page if ! pages-directory-for-adding-new-page-before-current-page-p variable ! is non-nil. Else insert at exact location of point. ! ! Narrow to new page if ! pages-directory-for-adding-page-narrowing-p variable ! is non-nil. ! ! Page begins with a `^L' as the default page-delimiter. ! Use \\[set-page-delimiter] to change the page-delimiter. Point is left in the body of page." (interactive "sHeader line: ") (widen) ! ;; If in pages directory buffer ! (if (eq major-mode 'pages-directory-mode) ! (progn ! ;; Add new page before or after current page? ! (if pages-directory-for-adding-new-page-before-current-page-p ! (pages-directory-goto) ! (pages-directory-goto) ! (forward-page) ! (or (eobp) (forward-line -1))))) ! (widen) ! ;; Move point before current delimiter if desired. ! (and pages-directory-for-adding-new-page-before-current-page-p ! (if (re-search-backward page-delimiter nil t) ! (goto-char (match-beginning 0)) ! ;; If going to beginning of file, insert a page-delimiter ! ;; before current first page. ! (goto-char (point-min)) ! (insert ! (format "%s\n" ! ;; Remove leading `^' from page-delimiter string ! (if (eq '^ (car (read-from-string page-delimiter))) ! (substring page-delimiter 1)))) ! (goto-char (point-min)))) ! ;; Insert page delimiter at beginning of line. ! (if (not (looking-at "^.")) (forward-line 1)) ! (insert (format "%s\n%s\n\n\n" ! (if (eq '^ (car (read-from-string page-delimiter))) ! (substring page-delimiter 1)) ! header-line)) ! (forward-line -1) ! (and pages-directory-for-adding-page-narrowing-p (narrow-to-page))) (defvar pages-last-search nil *************** *** 391,395 **** ! ;;;; Sorting pages (autoload 'sort-subr "sort" "Primary function for sorting." t nil) --- 384,388 ---- ! ;;; Sorting pages (autoload 'sort-subr "sort" "Primary function for sorting." t nil) *************** *** 442,450 **** ! ;;;; Pages directory ancillary definitions - (defvar pages-directory-buffer-narrowing-p nil - "*If non-nil, `pages-directory-goto' narrows pages buffer to entry.") - (defvar pages-directory-previous-regexp nil "Value of previous regexp used by `pages-directory'. --- 435,440 ---- ! ;;; Pages directory ancillary definitions (defvar pages-directory-previous-regexp nil "Value of previous regexp used by `pages-directory'. *************** *** 468,472 **** (setq pages-directory-map (make-sparse-keymap)) (define-key pages-directory-map "\C-c\C-c" ! 'pages-directory-goto)) (defun set-page-delimiter (regexp reset-p) --- 458,466 ---- (setq pages-directory-map (make-sparse-keymap)) (define-key pages-directory-map "\C-c\C-c" ! 'pages-directory-goto) ! (define-key pages-directory-map "\C-c\C-p\C-a" 'add-new-page)) ! ! (defvar original-page-delimiter "^ " ! "Default page delimiter.") (defun set-page-delimiter (regexp reset-p) *************** *** 480,484 **** (interactive (if current-prefix-arg ! (list original-page-delimiter nil) (list (read-string "Set page-delimiter to regexp: " page-delimiter) nil))) --- 474,478 ---- (interactive (if current-prefix-arg ! (list original-page-delimiter "^ ") (list (read-string "Set page-delimiter to regexp: " page-delimiter) nil))) *************** *** 494,498 **** ! ;;;; Pages directory main definitions (defun pages-directory --- 488,492 ---- ! ;;; Pages directory main definitions (defun pages-directory *************** *** 552,556 **** (buffer-name))) ! (let ((buffer (current-buffer)) (pages-directory-buffer (concat pages-directory-prefix " " (buffer-name) " ")) --- 546,550 ---- (buffer-name))) ! (let ((target-buffer (current-buffer)) (pages-directory-buffer (concat pages-directory-prefix " " (buffer-name) " ")) *************** *** 568,572 **** (insert "==== Pages Directory: use `C-c C-c' to go to page under cursor. ====" ?\n) ! (setq pages-buffer buffer) (setq pages-pos-list nil)) --- 562,566 ---- (insert "==== Pages Directory: use `C-c C-c' to go to page under cursor. ====" ?\n) ! (setq pages-buffer target-buffer) (setq pages-pos-list nil)) *************** *** 618,622 **** (if (interactive-p) (message "%d matching lines in: %s" ! (length pages-pos-list) (buffer-name buffer)))) (pop-to-buffer pages-directory-buffer) (sit-for 0) ; otherwise forward-line fails if N > window height. --- 612,616 ---- (if (interactive-p) (message "%d matching lines in: %s" ! (length pages-pos-list) (buffer-name target-buffer)))) (pop-to-buffer pages-directory-buffer) (sit-for 0) ; otherwise forward-line fails if N > window height. *************** *** 657,661 **** (setq pages-pos-list (cons position pages-pos-list)) ;; insert page header ! (insert-buffer-substring buffer start end)) (if count-lines-p --- 651,655 ---- (setq pages-pos-list (cons position pages-pos-list)) ;; insert page header ! (insert-buffer-substring target-buffer start end)) (if count-lines-p *************** *** 698,702 **** (end-of-directory-p (eobp)) (narrowing-p pages-directory-buffer-narrowing-p)) ! (pop-to-buffer pages-buffer) (widen) (if end-of-directory-p --- 692,696 ---- (end-of-directory-p (eobp)) (narrowing-p pages-directory-buffer-narrowing-p)) ! (pop-to-buffer pages-buffer) (widen) (if end-of-directory-p *************** *** 706,718 **** ! ;;;; The `pages-directory-for-addresses' function and ancillary code ! ! (defvar pages-addresses-file-name "~/addresses" ! "*Standard name for file of addresses. Entries separated by `page-delimiter'. ! Used by `pages-directory-for-addresses' function.") - (defvar pages-directory-for-addresses-narrowing-p t - "*If non-nil, `pages-directory-goto' narrows addresses buffer to entry.") - (defun pages-directory-for-addresses (&optional filename) "Find addresses file and display its directory. --- 700,705 ---- ! ;;; The `pages-directory-for-addresses' function and ancillary code (defun pages-directory-for-addresses (&optional filename) "Find addresses file and display its directory. *************** *** 722,727 **** Move point to one of the lines in the displayed directory, ! then use C-c C-c to go to the same line in the addresses buffer." (interactive (list (if current-prefix-arg --- 709,722 ---- Move point to one of the lines in the displayed directory, ! then use \\[pages-directory-goto] to go to the same line ! in the addresses buffer. ! ! If pages-directory-for-addresses-goto-narrowing-p is non-nil, ! `pages-directory-goto' narrows addresses buffer to entry. + If pages-directory-for-addresses-buffer-keep-windows-p is nil, + this command deletes other windows when it displays the addresses + directory." + (interactive (list (if current-prefix-arg *************** *** 740,746 **** (pages-directory t nil nil) (pages-directory-address-mode) ! (setq pages-directory-buffer-narrowing-p ! pages-directory-for-addresses-narrowing-p) ! (delete-other-windows) (save-excursion (goto-char (point-min)) --- 735,742 ---- (pages-directory t nil nil) (pages-directory-address-mode) ! (setq pages-directory-buffer-narrowing-p ! pages-directory-for-addresses-goto-narrowing-p) ! (or pages-directory-for-addresses-buffer-keep-windows-p ! (delete-other-windows)) (save-excursion (goto-char (point-min)) *************** *** 755,759 **** "Mode for handling the Addresses Directory buffer. ! Move point to one of the lines in this buffer, then use C-c C-c to go to the same line in the pages buffer." --- 751,756 ---- "Mode for handling the Addresses Directory buffer. ! Move point to one of the lines in this buffer, ! then use \\[pages-directory-goto] to go to the same line in the pages buffer." *************** *** 765,768 **** (make-local-variable 'pages-directory-buffer-narrowing-p)) ! ;;; page-ext.el ends here --- 762,769 ---- (make-local-variable 'pages-directory-buffer-narrowing-p)) ! ! ;;; Place `provide' at end of file. ! (provide 'page-ext) ! ! ;;;;;;;;;;;;;;;; end of page-ext.el ;;;;;;;;;;;;;;;; diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/page.el emacs-19.21/lisp/page.el *** emacs-19.20/lisp/page.el Sun May 16 11:41:09 1993 --- emacs-19.21/lisp/page.el Tue Nov 16 07:16:27 1993 *************** *** 88,93 **** ;; If we stopped after a page delimiter, put end of restriction ;; at the beginning of that line. ! (if (save-excursion (beginning-of-line) ! (looking-at page-delimiter)) (beginning-of-line)) (narrow-to-region (point) --- 88,94 ---- ;; If we stopped after a page delimiter, put end of restriction ;; at the beginning of that line. ! (if (save-excursion ! (goto-char (match-beginning 0)) ; was (beginning-of-line) ! (looking-at page-delimiter)) (beginning-of-line)) (narrow-to-region (point) *************** *** 137,140 **** --- 138,144 ---- count (1+ (count-lines (point) opoint))))))) + + ;;; Place `provide' at end of file. + (provide 'page) ;;; page.el ends here diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/paths.el emacs-19.21/lisp/paths.el *** emacs-19.20/lisp/paths.el Fri Sep 10 01:05:01 1993 --- emacs-19.21/lisp/paths.el Tue Nov 16 07:16:31 1993 *************** *** 102,106 **** (defconst rmail-spool-directory (cond ((memq system-type '(dgux-unix hpux usg-unix-v unisoft-unix rtu ! irix silicon-graphics-unix)) "/usr/mail/") ((eq system-type 'netbsd) --- 102,106 ---- (defconst rmail-spool-directory (cond ((memq system-type '(dgux-unix hpux usg-unix-v unisoft-unix rtu ! irix)) "/usr/mail/") ((eq system-type 'netbsd) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/rmail.el emacs-19.21/lisp/rmail.el *** emacs-19.20/lisp/rmail.el Wed Nov 10 15:50:25 1993 --- emacs-19.21/lisp/rmail.el Tue Nov 16 03:42:33 1993 *************** *** 1110,1137 **** (buffer-read-only nil)) (or msgnum (setq msgnum rmail-current-message)) ! (unwind-protect ! (save-excursion ! (widen) ! (goto-char (+ 3 (rmail-msgbeg msgnum))) ! (let ((curstate ! (not ! (null (search-backward (concat ", " attr ",") ! (prog1 (point) (end-of-line)) t))))) ! (or (eq curstate (not (not state))) ! (if curstate ! (delete-region (point) (1- (match-end 0))) ! (beginning-of-line) ! (forward-char 2) ! (insert " " attr ",")))) ! (if (string= attr "deleted") ! (rmail-set-message-deleted-p msgnum state))) ! ;; Note: we don't use save-restriction because that does not work right ! ;; if changes are made outside the saved restriction ! ;; before that restriction is restored. ! (narrow-to-region omin omax) ! (set-marker omin nil) ! (set-marker omax nil) ! (if (= msgnum rmail-current-message) ! (rmail-display-labels))))) ;; Return t if the attributes/keywords line of msg number MSG --- 1110,1138 ---- (buffer-read-only nil)) (or msgnum (setq msgnum rmail-current-message)) ! (if (> msgnum 0) ! (unwind-protect ! (save-excursion ! (widen) ! (goto-char (+ 3 (rmail-msgbeg msgnum))) ! (let ((curstate ! (not ! (null (search-backward (concat ", " attr ",") ! (prog1 (point) (end-of-line)) t))))) ! (or (eq curstate (not (not state))) ! (if curstate ! (delete-region (point) (1- (match-end 0))) ! (beginning-of-line) ! (forward-char 2) ! (insert " " attr ",")))) ! (if (string= attr "deleted") ! (rmail-set-message-deleted-p msgnum state))) ! ;; Note: we don't use save-restriction because that does not work right ! ;; if changes are made outside the saved restriction ! ;; before that restriction is restored. ! (narrow-to-region omin omax) ! (set-marker omin nil) ! (set-marker omax nil) ! (if (= msgnum rmail-current-message) ! (rmail-display-labels)))))) ;; Return t if the attributes/keywords line of msg number MSG diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/rmailout.el emacs-19.21/lisp/rmailout.el *** emacs-19.20/lisp/rmailout.el Wed Oct 13 20:10:52 1993 --- emacs-19.21/lisp/rmailout.el Tue Nov 16 05:42:59 1993 *************** *** 139,142 **** --- 139,143 ---- ;; Returns t if file FILE is an Rmail file. + ;;;###autoload (defun rmail-file-p (file) (let ((buf (generate-new-buffer " *rmail-file-p*"))) *************** *** 150,154 **** ;;; There are functions elsewhere in Emacs that use this function; check ;;; them out before you change the calling method. ! (defun rmail-output (file-name &optional count noattribute) "Append this message to Unix mail file named FILE-NAME. A prefix argument N says to output N consecutive messages --- 151,155 ---- ;;; There are functions elsewhere in Emacs that use this function; check ;;; them out before you change the calling method. ! (defun rmail-output (file-name &optional count noattribute from-gnus) "Append this message to Unix mail file named FILE-NAME. A prefix argument N says to output N consecutive messages *************** *** 161,165 **** The optional third argument NOATTRIBUTE, if non-nil, says not ! to set the `filed' attribute, and not to display a message." (interactive (list (setq rmail-last-file --- 162,168 ---- The optional third argument NOATTRIBUTE, if non-nil, says not ! to set the `filed' attribute, and not to display a message. ! ! The optional fourth argument FROM-GNUS is set when called from GNUS." (interactive (list (setq rmail-last-file *************** *** 186,207 **** (tembuf (get-buffer-create " rmail-output")) (original-headers-p ! (save-excursion ! (save-restriction ! (narrow-to-region (rmail-msgbeg rmail-current-message) (point-max)) ! (goto-char (point-min)) ! (forward-line 1) ! (= (following-char) ?0)))) header-beginning mail-from) (while (> count 0) ! (setq mail-from ! (save-excursion ! (save-restriction ! (widen) ! (goto-char (rmail-msgbeg rmail-current-message)) ! (setq header-beginning (point)) ! (search-forward "\n*** EOOH ***\n") ! (narrow-to-region header-beginning (point)) ! (mail-fetch-field "Mail-From")))) (save-excursion (set-buffer tembuf) --- 189,212 ---- (tembuf (get-buffer-create " rmail-output")) (original-headers-p ! (and (not from-gnus) ! (save-excursion ! (save-restriction ! (narrow-to-region (rmail-msgbeg rmail-current-message) (point-max)) ! (goto-char (point-min)) ! (forward-line 1) ! (= (following-char) ?0))))) header-beginning mail-from) (while (> count 0) ! (or from-gnus ! (setq mail-from ! (save-excursion ! (save-restriction ! (widen) ! (goto-char (rmail-msgbeg rmail-current-message)) ! (setq header-beginning (point)) ! (search-forward "\n*** EOOH ***\n") ! (narrow-to-region header-beginning (point)) ! (mail-fetch-field "Mail-From"))))) (save-excursion (set-buffer tembuf) *************** *** 230,249 **** (rmail-set-attribute "filed" t))) (setq count (1- count)) ! (let ((next-message-p ! (if rmail-delete-after-output ! (rmail-delete-forward) ! (if (> count 0) ! (rmail-next-undeleted-message 1)))) ! (num-appended (- orig-count count))) ! (if (and next-message-p original-headers-p) ! (rmail-toggle-header)) ! (if (and (> count 0) (not next-message-p)) ! (progn ! (error ! (save-excursion ! (set-buffer rmailbuf) ! (format "Only %d message%s appended" num-appended ! (if (= num-appended 1) "" "s")))) ! (setq count 0))))) (kill-buffer tembuf)))) --- 235,255 ---- (rmail-set-attribute "filed" t))) (setq count (1- count)) ! (or from-gnus ! (let ((next-message-p ! (if rmail-delete-after-output ! (rmail-delete-forward) ! (if (> count 0) ! (rmail-next-undeleted-message 1)))) ! (num-appended (- orig-count count))) ! (if (and next-message-p original-headers-p) ! (rmail-toggle-header)) ! (if (and (> count 0) (not next-message-p)) ! (progn ! (error ! (save-excursion ! (set-buffer rmailbuf) ! (format "Only %d message%s appended" num-appended ! (if (= num-appended 1) "" "s")))) ! (setq count 0)))))) (kill-buffer tembuf)))) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/rmailsum.el emacs-19.21/lisp/rmailsum.el *** emacs-19.20/lisp/rmailsum.el Tue Jun 22 01:47:57 1993 --- emacs-19.21/lisp/rmailsum.el Tue Nov 16 07:16:51 1993 *************** *** 828,832 **** nil (setq rmail-summary-edit-map ! (nconc (make-sparse-keymap) (cdr text-mode-map))) (define-key rmail-summary-edit-map "\C-c\C-c" 'rmail-cease-edit) (define-key rmail-summary-edit-map "\C-c\C-]" 'rmail-abort-edit)) --- 828,832 ---- nil (setq rmail-summary-edit-map ! (nconc (make-sparse-keymap) text-mode-map)) (define-key rmail-summary-edit-map "\C-c\C-c" 'rmail-cease-edit) (define-key rmail-summary-edit-map "\C-c\C-]" 'rmail-abort-edit)) *************** *** 995,1004 **** (mail-send-and-exit t)) ! (defun rmail-summary-forward () ! "Forward the current message to another user." ! (interactive) (save-excursion (set-buffer rmail-buffer) ! (rmail-forward) (use-local-map (copy-keymap (current-local-map))) (define-key (current-local-map) --- 995,1006 ---- (mail-send-and-exit t)) ! (defun rmail-summary-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") (save-excursion (set-buffer rmail-buffer) ! (rmail-forward resend) (use-local-map (copy-keymap (current-local-map))) (define-key (current-local-map) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/solar.el emacs-19.21/lisp/solar.el *** emacs-19.20/lisp/solar.el Wed Oct 20 01:46:16 1993 --- emacs-19.21/lisp/solar.el Tue Nov 16 07:17:05 1993 *************** *** 479,482 **** --- 479,483 ---- (solar-time-string light date)))))) + ;;;###autoload (defun solar-equinoxes-solstices () "Date and time of equinoxes and solstices, if visible in the calendar window. diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/startup.el emacs-19.21/lisp/startup.el *** emacs-19.20/lisp/startup.el Tue Sep 7 04:35:20 1993 --- emacs-19.21/lisp/startup.el Tue Nov 16 07:17:09 1993 *************** *** 305,308 **** --- 305,313 ---- (defun command-line-1 (command-line-args-left) + (or noninteractive (input-pending-p) + (message (if (eq (key-binding "\C-h\C-p") 'describe-project) + "For information about the GNU Project and its goals, type C-h C-p." + (substitute-command-keys + "For information about the GNU Project and its goals, type \\[describe-project].")))) (if (null command-line-args-left) (cond ((and (not inhibit-startup-message) (not noninteractive) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/subr.el emacs-19.21/lisp/subr.el *** emacs-19.20/lisp/subr.el Wed Nov 10 15:30:14 1993 --- emacs-19.21/lisp/subr.el Tue Nov 16 03:44:11 1993 *************** *** 498,502 **** HOOK should be a symbol, and FUNCTION may be any valid function. If FUNCTION isn't the value of HOOK, or, if FUNCTION doesn't appear in the ! list of hooks to run in HOOK, then nothing is done. See add-hook." (if (or (not (boundp hook)) ;unbound symbol, or (null (symbol-value hook)) ;value is nil, or --- 498,502 ---- HOOK should be a symbol, and FUNCTION may be any valid function. If FUNCTION isn't the value of HOOK, or, if FUNCTION doesn't appear in the ! list of hooks to run in HOOK, then nothing is done. See `add-hook'." (if (or (not (boundp hook)) ;unbound symbol, or (null (symbol-value hook)) ;value is nil, or diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/term/sun.el emacs-19.21/lisp/term/sun.el *** emacs-19.20/lisp/term/sun.el Sat May 29 23:42:05 1993 --- emacs-19.21/lisp/term/sun.el Tue Nov 16 07:13:20 1993 *************** *** 99,104 **** "*If non-nil, rebind ESC [ as prefix for Sun function keys.") ! (define-prefix-command 'sun-raw-prefix) ! (define-key function-key-map "\e[" 'sun-raw-prefix) (define-key sun-raw-prefix "210z" [r3]) --- 99,104 ---- "*If non-nil, rebind ESC [ as prefix for Sun function keys.") ! (defvar sun-raw-prefix (make-sparse-keymap)) ! (define-key function-key-map "\e[" sun-raw-prefix) (define-key sun-raw-prefix "210z" [r3]) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/vc.el emacs-19.21/lisp/vc.el *** emacs-19.20/lisp/vc.el Thu Oct 14 14:23:29 1993 --- emacs-19.21/lisp/vc.el Tue Nov 16 07:17:43 1993 *************** *** 105,109 **** '((SCCS "\%W\%") (RCS "\$Id\$")) "*Header keywords to be inserted when `vc-insert-headers' is executed.") ! (defconst vc-static-header-alist '(("\\.c$" . "\n#ifndef lint\nstatic char vcid[] = \"\%s\";\n#endif /* lint */\n")) --- 105,109 ---- '((SCCS "\%W\%") (RCS "\$Id\$")) "*Header keywords to be inserted when `vc-insert-headers' is executed.") ! (defvar vc-static-header-alist '(("\\.c$" . "\n#ifndef lint\nstatic char vcid[] = \"\%s\";\n#endif /* lint */\n")) *************** *** 1138,1154 **** (interactive "fVC rename file: \nFRename to: ") (let ((oldbuf (get-file-buffer old))) ! (if (buffer-modified-p oldbuf) (error "Please save files before moving them")) (if (get-file-buffer new) (error "Already editing new file name")) (let ((oldmaster (vc-name old))) (if oldmaster ! (if (vc-locking-user old) ! (error "Please check in files before moving them")) ! (if (or (file-symlink-p oldmaster) ! ;; This had FILE, I changed it to OLD. -- rms. ! (file-symlink-p (vc-backend-subdirectory-name old))) ! (error "This is not a safe thing to do in the presence of symbolic links")) ! (rename-file oldmaster (vc-name new))) (if (or (not oldmaster) (file-exists-p old)) (rename-file old new))) --- 1138,1173 ---- (interactive "fVC rename file: \nFRename to: ") (let ((oldbuf (get-file-buffer old))) ! (if (and oldbuf (buffer-modified-p oldbuf)) (error "Please save files before moving them")) (if (get-file-buffer new) (error "Already editing new file name")) + (if (file-exists-p new) + (error "New file already exists")) (let ((oldmaster (vc-name old))) (if oldmaster ! (progn ! (if (vc-locking-user old) ! (error "Please check in files before moving them")) ! (if (or (file-symlink-p oldmaster) ! ;; This had FILE, I changed it to OLD. -- rms. ! (file-symlink-p (vc-backend-subdirectory-name old))) ! (error "This is not a safe thing to do in the presence of symbolic links")) ! (rename-file ! oldmaster ! (let ((backend (vc-backend-deduce old)) ! (newdir (or (file-name-directory new) "")) ! (newbase (file-name-nondirectory new))) ! (catch 'found ! (mapcar ! (function ! (lambda (s) ! (if (eq backend (cdr s)) ! (let* ((newmaster (format (car s) newdir newbase)) ! (newmasterdir (file-name-directory newmaster))) ! (if (or (not newmasterdir) ! (file-directory-p newmasterdir)) ! (throw 'found newmaster)))))) ! vc-master-templates) ! (error "New file lacks a version control directory")))))) (if (or (not oldmaster) (file-exists-p old)) (rename-file old new))) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/xscheme.el emacs-19.21/lisp/xscheme.el *** emacs-19.20/lisp/xscheme.el Thu Mar 25 00:26:47 1993 --- emacs-19.21/lisp/xscheme.el Tue Nov 16 07:17:57 1993 *************** *** 879,881 **** --- 879,883 ---- (set-syntax-table old-syntax-table))))) + (provide 'xscheme) + ;;; xscheme.el ends here diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/make-dist emacs-19.21/make-dist *** emacs-19.20/make-dist Thu Nov 11 19:32:53 1993 --- emacs-19.21/make-dist Mon Nov 15 17:56:58 1993 *************** *** 157,161 **** ln [a-zA-Z]*.el ../${tempdir}/lisp ln [a-zA-Z]*.elc ../${tempdir}/lisp ! ln [a-zA-Z]*.dat forms.README ../${tempdir}/lisp ## simula.el doesn't keep abbreviations in simula.defns any more. ## ln [a-zA-Z]*.defns ../${tempdir}/lisp --- 157,161 ---- ln [a-zA-Z]*.el ../${tempdir}/lisp ln [a-zA-Z]*.elc ../${tempdir}/lisp ! ln [a-zA-Z]*.dat ../${tempdir}/lisp ## simula.el doesn't keep abbreviations in simula.defns any more. ## ln [a-zA-Z]*.defns ../${tempdir}/lisp diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/ChangeLog emacs-19.21/man/ChangeLog *** emacs-19.20/man/ChangeLog Mon Oct 25 01:58:39 1993 --- emacs-19.21/man/ChangeLog Tue Nov 16 06:15:08 1993 *************** *** 1,2 **** --- 1,19 ---- + Tue Nov 16 06:14:59 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Version 19.21 released. + + Mon Nov 15 20:53:59 1993 Paul Eggert (eggert@twinsun.com) + + * man/Makefile (../info/cl.info): Renamed from ../info/cl. + + Mon Nov 15 03:22:33 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Makefile (../etc/GNU): New target. + (EMACSSOURCES): Add gnu1.texi. + + Sun Nov 14 21:33:08 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Makefile (realclean): Don't delete the Info files. + Mon Oct 25 01:27:07 1993 Brian Fox (bfox@albert.gnu.ai.mit.edu) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/Makefile emacs-19.21/man/Makefile *** emacs-19.20/man/Makefile Mon Oct 25 01:46:47 1993 --- emacs-19.21/man/Makefile Tue Nov 16 00:41:01 1993 *************** *** 49,52 **** --- 49,53 ---- anti.texi \ gnu.texi \ + gnu1.texi \ glossary.texi *************** *** 71,75 **** emacs.dvi: ${EMACSSOURCES} ! ../info/cl: cl.texi $(MAKEINFO) cl.texi cl.dvi: cl.texi --- 72,76 ---- emacs.dvi: ${EMACSSOURCES} ! ../info/cl.info: cl.texi $(MAKEINFO) cl.texi cl.dvi: cl.texi *************** *** 91,94 **** --- 92,98 ---- gnus.dvi: gnus.texi + ../etc/GNU: gnu1.texi gnu.texi + makeinfo --no-headers -o ../etc/GNU gnu1.texi + mostlyclean: rm -f *.log *.cp *.fn *.ky *.pg *.vr *.o core *************** *** 102,104 **** realclean: distclean rm -f *.aux *.cps *.fns *.kys *.pgs *.vrs ! for file in $(INFO_TARGETS); do rm -f $${file}*; done --- 106,109 ---- realclean: distclean rm -f *.aux *.cps *.fns *.kys *.pgs *.vrs ! # Don't delete these, because they are outside the current directory. ! # for file in $(INFO_TARGETS); do rm -f $${file}*; done diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/display.texi emacs-19.21/man/display.texi *** emacs-19.20/man/display.texi Sun Nov 7 16:22:00 1993 --- emacs-19.21/man/display.texi Tue Nov 16 07:29:50 1993 *************** *** 252,258 **** Some of those characters have a corresponding ``dead key'' accent ! character in the ISO character set; to enter that character, type the corresponding ASCII character twice. For example, @kbd{''} enters the ! ISO character acute-accent (character code 0264). In addition to the accented letters, you can use these special --- 252,258 ---- Some of those characters have a corresponding ``dead key'' accent ! character in the ISO Latin-1 character set; to enter that character, type the corresponding ASCII character twice. For example, @kbd{''} enters the ! Latin-1 character acute-accent (character code 0264). In addition to the accented letters, you can use these special diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/emacs.texi emacs-19.21/man/emacs.texi *** emacs-19.20/man/emacs.texi Thu Nov 11 12:57:29 1993 --- emacs-19.21/man/emacs.texi Tue Nov 16 07:29:51 1993 *************** *** 65,69 **** @center @titlefont{GNU Emacs Manual} @sp 4 ! @center Ninth Edition, Emacs version 19.20 @sp 1 @center for Unix Users --- 65,69 ---- @center @titlefont{GNU Emacs Manual} @sp 4 ! @center Ninth Edition, Emacs version 19.21 @sp 1 @center for Unix Users *************** *** 118,122 **** display editor. This Info file describes how to edit with Emacs and some of how to customize it, but not how to extend it. It ! corresponds to GNU Emacs version 19.20. @end ifinfo --- 118,122 ---- display editor. This Info file describes how to edit with Emacs and some of how to customize it, but not how to extend it. It ! corresponds to GNU Emacs version 19.21. @end ifinfo diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/files.texi emacs-19.21/man/files.texi *** emacs-19.20/man/files.texi Mon Sep 27 00:35:13 1993 --- emacs-19.21/man/files.texi Tue Nov 16 07:29:53 1993 *************** *** 1296,1304 **** augmented Dired buffer, operates on all the marked files (or the file on the current line). If it operates on more than one file, it handles ! each file according to its current state; thus, it may check in one file ! and check in another (which is already checked out). If it has to check ! in any files, it reads a single log entry, then uses that text for all ! the files being checked in. This can be convenient for registering or ! checking in several files at once, as part of the same change. @node Renaming and VC --- 1296,1305 ---- augmented Dired buffer, operates on all the marked files (or the file on the current line). If it operates on more than one file, it handles ! each file according to its current state; thus, it may check out one ! file and check in another (because it is already checked out). If it ! has to check in any files, it reads a single log entry, then uses that ! text for all the files being checked in. This can be convenient for ! registering or checking in several files at once, as part of the same ! change. @node Renaming and VC Only in emacs-19.20/man: forms.cps Only in emacs-19.20/man: forms.fns diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/gnu.texi emacs-19.21/man/gnu.texi *** emacs-19.20/man/gnu.texi Wed Jun 9 07:29:09 1993 --- emacs-19.21/man/gnu.texi Tue Nov 16 07:29:58 1993 *************** *** 2,7 **** --- 2,23 ---- @c Copyright (C) 1985, 1986, 1987, 1993 Free Software Foundation, Inc. @c See file emacs.texi for copying conditions. + @ifclear justgnu @node Manifesto,, Antinews, Top @unnumbered The GNU Manifesto + @end ifclear + @ifset justgnu + Copyright (C) 1985 Richard M. Stallman + + Permission is granted to anyone to make or distribute verbatim copies + of this document, in any medium, provided that the + copyright notice and permission notice are preserved, + and that the distributor grants the recipient permission + for further redistribution as permitted by this notice. + + Modified versions may not be made. + + @node Top + @top The GNU Manifesto + @end ifset @quotation diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/gnu1.texi emacs-19.21/man/gnu1.texi *** emacs-19.20/man/gnu1.texi --- emacs-19.21/man/gnu1.texi Tue Nov 16 07:29:59 1993 *************** *** 0 **** --- 1,4 ---- + @setfilename ../etc/GNU1 + @set justgnu + @include gnu.texi + @bye diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/info-stnd.texi emacs-19.21/man/info-stnd.texi *** emacs-19.20/man/info-stnd.texi Mon Oct 25 01:36:48 1993 --- emacs-19.21/man/info-stnd.texi Tue Nov 16 07:30:04 1993 *************** *** 1210,1216 **** @item ISO-Latin ! @cindex ISO Latin characters @vindex ISO-Latin ! When set to @code{On}, Info accepts and displays ISO Latin characters. By default, Info assumes an ASCII character set. @code{ISO-Latin} tells Info that it is running in an environment where the European standard --- 1210,1216 ---- @item ISO-Latin ! @cindex ISO Latin-1 characters @vindex ISO-Latin ! When set to @code{On}, Info accepts and displays ISO Latin-1 characters. By default, Info assumes an ASCII character set. @code{ISO-Latin} tells Info that it is running in an environment where the European standard diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/programs.texi emacs-19.21/man/programs.texi *** emacs-19.20/man/programs.texi Fri Aug 13 14:50:15 1993 --- emacs-19.21/man/programs.texi Tue Nov 16 07:30:15 1993 *************** *** 1042,1046 **** @findex change-log-mode The change log file is visited in Change Log mode. Each bunch of ! grouped item counts as one paragraph, and each entry is considered a page. This facilitates editing the entries. @key{LFD} and auto-fill indent each new line like the previous line; this is --- 1042,1046 ---- @findex change-log-mode The change log file is visited in Change Log mode. Each bunch of ! grouped items counts as one paragraph, and each entry is considered a page. This facilitates editing the entries. @key{LFD} and auto-fill indent each new line like the previous line; this is diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/search.texi emacs-19.21/man/search.texi *** emacs-19.20/man/search.texi Mon Nov 8 08:45:37 1993 --- emacs-19.21/man/search.texi Tue Nov 16 01:25:40 1993 *************** *** 876,884 **** @item M-x flush-lines @key{RET} @var{regexp} @key{RET} ! Delete each line that follows point and does not contain a match for @var{regexp}. @item M-x keep-lines @key{RET} @var{regexp} @key{RET} ! Delete each line that follows point and contains a match for @var{regexp}. @end table --- 876,884 ---- @item M-x flush-lines @key{RET} @var{regexp} @key{RET} ! Delete each line that follows point and contains a match for @var{regexp}. @item M-x keep-lines @key{RET} @var{regexp} @key{RET} ! Delete each line that follows point and does not contain a match for @var{regexp}. @end table diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/oldXMenu/ChangeLog emacs-19.21/oldXMenu/ChangeLog *** emacs-19.20/oldXMenu/ChangeLog Thu Nov 11 10:31:16 1993 --- emacs-19.21/oldXMenu/ChangeLog Tue Nov 16 06:14:42 1993 *************** *** 1,2 **** --- 1,11 ---- + Tue Nov 16 06:14:38 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Version 19.21 released. + + Sat Nov 13 03:50:01 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Makefile.in (libXMenu11.a): Tell make not to worry if ranlib fails. + Tell user too, in case make doesn't pay attention. + Thu Nov 11 10:30:55 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/oldXMenu/Makefile.in emacs-19.21/oldXMenu/Makefile.in *** emacs-19.20/oldXMenu/Makefile.in Mon Oct 25 02:25:10 1993 --- emacs-19.21/oldXMenu/Makefile.in Tue Nov 16 07:27:15 1993 *************** *** 62,66 **** $(RM) $@ $(AR) $@ $(OBJS) $(EXTRA) ! -$(RANLIB) $@ #If running ranlib fails, probably there is none. #That's ok. So don't stop the build. --- 62,68 ---- $(RM) $@ $(AR) $@ $(OBJS) $(EXTRA) ! @echo Do not be alarmed if the following ranlib command ! @echo fails due to the absence of a ranlib program on your system. ! -$(RANLIB) $@ || true #If running ranlib fails, probably there is none. #That's ok. So don't stop the build. diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/ChangeLog emacs-19.21/src/ChangeLog *** emacs-19.20/src/ChangeLog Thu Nov 11 09:30:34 1993 --- emacs-19.21/src/ChangeLog Tue Nov 16 12:21:42 1993 *************** *** 1,2 **** --- 1,81 ---- + Tue Nov 16 00:34:22 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Version 19.21 released. + + * doprnt.c (doprnt): Cast the value alloca returns. + + * gmalloc.c [HPUX8]: Include unistd.h earlier on. + + * s/sunos4shr.h (GNU_MALLOC, REL_ALLOC): Don't define if + already defined. + + * s/hpux8.h (LD_SWITCH_SYSTEM) [hp9000s700]: Add -L/lib/pa1.1. + + * Makefile.in.in (extraclean): Prevent wildcard from starting comment. + (distclean): Do delete Makefile and Makefile.in. + + Sun Nov 14 18:00:30 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * systty.h [BSD_TERMIOS]: Under NL0, NL1..., ECHO, NOFLSH, TOSTOP, + FLUSHO and PENDIN. + * s/sunos4-1-3.h (BSD_TERMIOS): Defined. + + * regex.c (re_set_registers): Use `regoff_t *' when casting 0. + + * Makefile.in.in: Delete spurious CFLAGS=-g. + + * s/sco4.h (HAVE_GETTIMEOFDAY): Don't define if already defined. + + * keyboard.c (read_avail_input): Make cbuf 1 char shorter. + + Sun Nov 14 00:14:37 1993 Paul Reilly (pmr@legacy.pajato.com) + + * s/dgux.h (INTERRUPT_INPUT): Undefined. + (BROKEN_FIONREAD): Defined to work around a problem in DGUX + whereby emacs will stop on a background write when invoked from a + job control shell for the first time in a session. + (FIRST_PTY_LETTER): Undefined. + (PTY_ITERATION, PTY_NAME_SPRINTF, PTY_TTY_NAME_SPRINTF): Defined + to use all the available PTYs in a COFF environment. + (LINKER): Removed "-nostdlib" from to be compatible with a prior + mod removing "/lib/crt0.o" from the LIBS_SYSTEM define. + (LIBS_SYSTEM): Delete /lib/crt0.o. + + Sun Nov 14 01:29:44 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * xterm.c (XTread_socket): Increase length of copy_buffer to 81. + + * lread.c (read1): If token has a \, don't treat it as a number. + + Sat Nov 13 01:18:56 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * process.c (IN_ADDR, NUMERIC_ADDR_ERROR): New macros (two versions). + (Fopen_network_stream): Use them. + + * doprnt.c: Include config.h. + + * keyboard.c (read_avail_input) [no FIONREAD]: On DGUX, as on USG, + read input with O_NDELAY. + + * s/dgux.h (SYSTEM_MALLOC): Turned off. + (NO_TERMIO): Defined. + (BROKEN_FASYNC): Turned off. + + * buffer.c (Foverlay_put): Don't call redisplay_region + if overlay has no buffer. + + Fri Nov 12 15:38:15 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * process.c (get_process): Add `static' to definition. + + * xterm.c (XTmouse_position): Delete test inserted Nov 10. + + * fileio.c (syms_of_fileio): Fix missing \n\'s. + + * keyboard.c (Fread_key_sequence): Split the doc string with "". + + * textprop.c (Fprevious_single_property_change): Fix missing \n\. + (Fnext_single_property_change): Likewise. + Wed Nov 10 21:32:40 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/Makefile.in.in emacs-19.21/src/Makefile.in.in *** emacs-19.20/src/Makefile.in.in Wed Nov 10 15:12:18 1993 --- emacs-19.21/src/Makefile.in.in Tue Nov 16 03:38:33 1993 *************** *** 226,230 **** -DHAVE_CONFIG_H is needed for some other files to take advantage of the information in `config.h'. */ ! CFLAGS=-g /* C_SWITCH_X_SITE must come before C_SWITCH_X_MACHINE and C_SWITCH_X_SYSTEM since it may have -I options that should override those two. */ --- 226,230 ---- -DHAVE_CONFIG_H is needed for some other files to take advantage of the information in `config.h'. */ ! /* C_SWITCH_X_SITE must come before C_SWITCH_X_MACHINE and C_SWITCH_X_SYSTEM since it may have -I options that should override those two. */ *************** *** 773,777 **** /**/# Do not use it on development directories! distclean: clean ! rm -f paths.h config.h ../etc/DOC-* realclean: distclean rm -f TAGS --- 773,777 ---- /**/# Do not use it on development directories! distclean: clean ! rm -f paths.h config.h Makefile Makefile.in ../etc/DOC-* realclean: distclean rm -f TAGS *************** *** 779,783 **** -rm -f emacs emacs-* ../etc/DOC* extraclean: distclean ! -rm -f *~ \#* m/*~ s/*~ /* The rule for the [sm] files has to be written a little funny to --- 779,783 ---- -rm -f emacs emacs-* ../etc/DOC* extraclean: distclean ! -rm -f *~ \#* m/?*~ s/?*~ /* The rule for the [sm] files has to be written a little funny to diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/buffer.c emacs-19.21/src/buffer.c *** emacs-19.20/src/buffer.c Tue Nov 9 16:33:42 1993 --- emacs-19.21/src/buffer.c Tue Nov 16 02:09:15 1993 *************** *** 1866,1872 **** CHECK_OVERLAY (overlay, 0); ! redisplay_region (XMARKER (OVERLAY_START (overlay))->buffer, ! marker_position (OVERLAY_START (overlay)), ! marker_position (OVERLAY_END (overlay))); plist = Fcdr_safe (XCONS (overlay)->cdr); --- 1866,1874 ---- CHECK_OVERLAY (overlay, 0); ! tail = Fmarker_buffer (OVERLAY_START (overlay)); ! if (! NILP (tail)) ! redisplay_region (XMARKER (OVERLAY_START (overlay))->buffer, ! marker_position (OVERLAY_START (overlay)), ! marker_position (OVERLAY_END (overlay))); plist = Fcdr_safe (XCONS (overlay)->cdr); diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/doprnt.c emacs-19.21/src/doprnt.c *** emacs-19.20/src/doprnt.c Sat Sep 18 22:55:09 1993 --- emacs-19.21/src/doprnt.c Tue Nov 16 11:20:59 1993 *************** *** 21,24 **** --- 21,25 ---- + #include #include #include *************** *** 69,73 **** fmtcpy = fixed_buffer; else ! fmtcpy = alloca (format_end - format + 1); bufsize--; --- 70,74 ---- fmtcpy = fixed_buffer; else ! fmtcpy = (char *) alloca (format_end - format + 1); bufsize--; diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/fileio.c emacs-19.21/src/fileio.c *** emacs-19.20/src/fileio.c Wed Nov 10 02:29:43 1993 --- emacs-19.21/src/fileio.c Tue Nov 16 07:24:20 1993 *************** *** 3607,3624 **** DEFVAR_LISP ("after-insert-file-functions", &Vafter_insert_file_functions, ! "A list of functions to be called at the end of `insert-file-contents'. ! Each is passed one argument, the number of bytes inserted. It should return ! the new byte count, and leave point the same. If `insert-file-contents' is ! intercepted by a handler from `file-name-handler-alist', that handler is responsible for calling the after-insert-file-functions if appropriate."); Vafter_insert_file_functions = Qnil; DEFVAR_LISP ("write-region-annotate-functions", &Vwrite_region_annotate_functions, ! "A list of functions to be called at the start of `write-region'. ! Each is passed two arguments, START and END as for `write-region'. It should ! return a list of pairs (POSITION . STRING) of strings to be effectively ! inserted at the specified positions of the file being written (1 means to ! insert before the first byte written). The POSITIONs must be sorted into ! increasing order. If there are several functions in the list, the several lists are merged destructively."); Vwrite_region_annotate_functions = Qnil; --- 3607,3624 ---- DEFVAR_LISP ("after-insert-file-functions", &Vafter_insert_file_functions, ! "A list of functions to be called at the end of `insert-file-contents'.\n\ ! Each is passed one argument, the number of bytes inserted. It should return\n\ ! the new byte count, and leave point the same. If `insert-file-contents' is\n\ ! intercepted by a handler from `file-name-handler-alist', that handler is\n\ responsible for calling the after-insert-file-functions if appropriate."); Vafter_insert_file_functions = Qnil; DEFVAR_LISP ("write-region-annotate-functions", &Vwrite_region_annotate_functions, ! "A list of functions to be called at the start of `write-region'.\n\ ! Each is passed two arguments, START and END as for `write-region'. It should\n\ ! return a list of pairs (POSITION . STRING) of strings to be effectively\n\ ! inserted at the specified positions of the file being written (1 means to\n\ ! insert before the first byte written). The POSITIONs must be sorted into\n\ ! increasing order. If there are several functions in the list, the several\n\ lists are merged destructively."); Vwrite_region_annotate_functions = Qnil; diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/gmalloc.c emacs-19.21/src/gmalloc.c *** emacs-19.20/src/gmalloc.c Thu Nov 11 18:39:36 1993 --- emacs-19.21/src/gmalloc.c Tue Nov 16 03:09:25 1993 *************** *** 1155,1158 **** --- 1155,1162 ---- systems with potentially hostile include files. */ extern __ptr_t __sbrk __P ((int increment)); + #else + #ifdef HPUX8 + #include + #endif #endif diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/keyboard.c emacs-19.21/src/keyboard.c *** emacs-19.20/src/keyboard.c Sun Oct 24 18:16:29 1993 --- emacs-19.21/src/keyboard.c Mon Nov 15 07:28:14 1993 *************** *** 3028,3032 **** else { ! unsigned char cbuf[KBD_BUFFER_SIZE]; #ifdef FIONREAD --- 3028,3035 ---- else { ! /* Using KBD_BUFFER_SIZE - 1 here avoids reading more than ! the kbd_buffer can really hold. That may prevent loss ! of characters on some systems when input is stuffed at us. */ ! unsigned char cbuf[KBD_BUFFER_SIZE - 1]; #ifdef FIONREAD *************** *** 3045,3049 **** nread = sizeof cbuf; #else /* no FIONREAD */ ! #ifdef USG /* Read some input if available, but don't wait. */ nread = sizeof cbuf; --- 3048,3052 ---- nread = sizeof cbuf; #else /* no FIONREAD */ ! #if defined(USG) || defined(DGUX) /* Read some input if available, but don't wait. */ nread = sizeof cbuf; *************** *** 4445,4449 **** using the keymaps of the buffer of the window clicked in, not the buffer\n\ of the selected window as normal.\n\ ! \n\ `read-key-sequence' drops unbound button-down events, since you normally\n\ only care about the click or drag events which follow them. If a drag\n\ --- 4448,4452 ---- using the keymaps of the buffer of the window clicked in, not the buffer\n\ of the selected window as normal.\n\ ! ""\n\ `read-key-sequence' drops unbound button-down events, since you normally\n\ only care about the click or drag events which follow them. If a drag\n\ diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/lread.c emacs-19.21/src/lread.c *** emacs-19.20/src/lread.c Sat Sep 11 21:26:06 1993 --- emacs-19.21/src/lread.c Tue Nov 16 07:24:32 1993 *************** *** 1190,1193 **** --- 1190,1194 ---- { register char *p = read_buffer; + int quoted = 0; { *************** *** 1213,1217 **** } if (c == '\\') ! c = READCHAR; *p++ = c; c = READCHAR; --- 1214,1221 ---- } if (c == '\\') ! { ! c = READCHAR; ! quoted = 1; ! } *p++ = c; c = READCHAR; *************** *** 1230,1262 **** } ! /* Is it an integer? */ ! { ! register char *p1; ! register Lisp_Object val; ! p1 = read_buffer; ! if (*p1 == '+' || *p1 == '-') p1++; ! if (p1 != p) ! { ! while (p1 != p && (c = *p1) >= '0' && c <= '9') p1++; #ifdef LISP_FLOAT_TYPE ! /* Integers can have trailing decimal points. */ ! if (p1 > read_buffer && p1 < p && *p1 == '.') p1++; #endif ! if (p1 == p) ! /* It is an integer. */ ! { #ifdef LISP_FLOAT_TYPE ! if (p1[-1] == '.') ! p1[-1] = '\0'; #endif ! XSET (val, Lisp_Int, atoi (read_buffer)); ! return val; ! } ! } #ifdef LISP_FLOAT_TYPE ! if (isfloat_string (read_buffer)) ! return make_float (atof (read_buffer)); #endif ! } return intern (read_buffer); --- 1234,1267 ---- } ! if (!quoted) ! { ! register char *p1; ! register Lisp_Object val; ! p1 = read_buffer; ! if (*p1 == '+' || *p1 == '-') p1++; ! /* Is it an integer? */ ! if (p1 != p) ! { ! while (p1 != p && (c = *p1) >= '0' && c <= '9') p1++; #ifdef LISP_FLOAT_TYPE ! /* Integers can have trailing decimal points. */ ! if (p1 > read_buffer && p1 < p && *p1 == '.') p1++; #endif ! if (p1 == p) ! /* It is an integer. */ ! { #ifdef LISP_FLOAT_TYPE ! if (p1[-1] == '.') ! p1[-1] = '\0'; #endif ! XSET (val, Lisp_Int, atoi (read_buffer)); ! return val; ! } ! } #ifdef LISP_FLOAT_TYPE ! if (isfloat_string (read_buffer)) ! return make_float (atof (read_buffer)); #endif ! } return intern (read_buffer); diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/process.c emacs-19.21/src/process.c *** emacs-19.20/src/process.c Thu Nov 4 17:09:57 1993 --- emacs-19.21/src/process.c Tue Nov 16 07:24:39 1993 *************** *** 52,55 **** --- 52,64 ---- #endif + /* DGUX inet_addr returns a 'struct in_addr'. */ + #ifdef DGUX + #define IN_ADDR struct in_addr + #define NUMERIC_ADDR_ERROR (numeric_addr.s_addr == -1) + #else + #define IN_ADDR unsigned long + #define NUMERIC_ADDR_ERROR (numeric_addr == -1) + #endif + #if defined(BSD) || defined(STRIDE) #include *************** *** 510,514 **** current buffer. */ ! Lisp_Object get_process (name) register Lisp_Object name; --- 519,523 ---- current buffer. */ ! static Lisp_Object get_process (name) register Lisp_Object name; *************** *** 1381,1385 **** struct hostent *host_info_ptr, host_info; char *(addr_list[2]); ! unsigned long numeric_addr; int s, outch, inch; char errstring[80]; --- 1390,1394 ---- struct hostent *host_info_ptr, host_info; char *(addr_list[2]); ! IN_ADDR numeric_addr; int s, outch, inch; char errstring[80]; *************** *** 1408,1412 **** { numeric_addr = inet_addr ((char *) XSTRING (host)->data); ! if (numeric_addr == -1) error ("Unknown host \"%s\"", XSTRING (host)->data); --- 1417,1421 ---- { numeric_addr = inet_addr ((char *) XSTRING (host)->data); ! if (NUMERIC_ADDR_ERROR) error ("Unknown host \"%s\"", XSTRING (host)->data); diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/regex.c emacs-19.21/src/regex.c *** emacs-19.20/src/regex.c Fri Sep 10 00:32:19 1993 --- emacs-19.21/src/regex.c Tue Nov 16 07:24:42 1993 *************** *** 3002,3006 **** bufp->regs_allocated = REGS_UNALLOCATED; regs->num_regs = 0; ! regs->start = regs->end = (regoff_t) 0; } } --- 3002,3006 ---- bufp->regs_allocated = REGS_UNALLOCATED; regs->num_regs = 0; ! regs->start = regs->end = (regoff_t *) 0; } } diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/s/dgux.h emacs-19.21/src/s/dgux.h *** emacs-19.20/src/s/dgux.h Sun Aug 8 02:51:00 1993 --- emacs-19.21/src/s/dgux.h Tue Nov 16 07:23:19 1993 *************** *** 64,75 **** to read the input and send it to the true Emacs process through a pipe. - */ ! #define INTERRUPT_INPUT ! /* 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 'p' /* --- 64,79 ---- to read the input and send it to the true Emacs process through a pipe. ! NOTE: On DGUX, there is a problem using INTERRUPT_INPUT: When invoked ! under X11 using a job control shell (csh, ksh) in the background, ! emacs will stop on tty output. I suspect this is a kernel problem and ! have reported it and a sample program to DGC. Meanwhile, a workaround ! is to define BROKEN_FIONREAD and not use INTERRUPT_INPUT. ! -pmr@rock.concert.net ! */ ! #define BROKEN_FIONREAD ! /* #define INTERRUPT_INPUT */ /* *************** *** 90,94 **** --- 94,100 ---- * terminal. */ + #define HAVE_SETSID + /* * Define HAVE_SOCKETS if the system supports sockets. *************** *** 101,105 **** --- 107,113 ---- * domain sockets. */ + #define HAVE_UNIX_DOMAIN + /* * Define HAVE_PTYS if the system supports pty devices. *************** *** 108,111 **** --- 116,123 ---- #define HAVE_PTYS + /* (Assume) we do have vfork. */ + + #define HAVE_VFORK + /* * Define NONSYSTEM_DIR_LIBRARY to make Emacs emulate *************** *** 229,236 **** /* * Define HAVE_TERMIOS since this is POSIX, ! * for terminal control. */ #define HAVE_TERMIOS /* --- 241,249 ---- /* * Define HAVE_TERMIOS since this is POSIX, ! * for terminal control. Prevent redundant inclusion of termio.h. */ #define HAVE_TERMIOS + #define NO_TERMIO /* *************** *** 245,250 **** */ /* pmr@rock.concert.net says Emacs fails without this. We don't know why. */ ! #define SYSTEM_MALLOC /* MAKING_MAKEFILE must be defined in "ymakefile" before including config.h */ --- 258,264 ---- */ + /* pmr now says the GNU malloc works. */ /* pmr@rock.concert.net says Emacs fails without this. We don't know why. */ ! /* #define SYSTEM_MALLOC */ /* MAKING_MAKEFILE must be defined in "ymakefile" before including config.h */ *************** *** 285,291 **** #define LD_SWITCH_SYSTEM - /* Cannot depend on /lib/crt0.o because make does not understand an elink(1) */ #define START_FILES pre-crt0.o ! #define LIBS_SYSTEM -ldgc /lib/crt0.o #define LIB_GCC /usr/lib/gcc/libgcc.a --- 299,304 ---- #define LD_SWITCH_SYSTEM #define START_FILES pre-crt0.o ! #define LIBS_SYSTEM -ldgc #define LIB_GCC /usr/lib/gcc/libgcc.a *************** *** 299,313 **** /* definitions for xmakefile production */ #ifdef COFF ! #define C_COMPILER \ TARGET_BINARY_INTERFACE=m88kdguxcoff gcc -traditional #define LINKER \ ! TARGET_BINARY_INTERFACE=m88kdguxcoff gcc -nostdlib #define MAKE_COMMAND \ TARGET_BINARY_INTERFACE=m88kdguxcoff make ! #define C_DEBUG_SWITCH #else /* not COFF */ --- 312,345 ---- /* definitions for xmakefile production */ #ifdef COFF ! ! /* Define the following to use all of the available pty's. */ ! ! #define PTY_ITERATION \ ! for (c = 'p'; c < 't'; c++) \ ! for (i = 0; (((c == 'p') && (i < 64)) || ((c != 'p') && (i < 16))); i++) ! ! #define PTY_NAME_SPRINTF \ ! if (c == 'p') \ ! sprintf (pty_name, "/dev/pty%c%d", c, i); \ ! else \ ! sprintf (pty_name, "/dev/pty%c%x", c, i); ! ! #define PTY_TTY_NAME_SPRINTF \ ! if (c == 'p') \ ! sprintf (pty_name, "/dev/tty%c%d", c, i); \ ! else \ ! sprintf (pty_name, "/dev/tty%c%x", c, i); ! #define C_COMPILER \ TARGET_BINARY_INTERFACE=m88kdguxcoff gcc -traditional #define LINKER \ ! TARGET_BINARY_INTERFACE=m88kdguxcoff gcc #define MAKE_COMMAND \ TARGET_BINARY_INTERFACE=m88kdguxcoff make ! #define C_DEBUG_SWITCH -g ! #else /* not COFF */ *************** *** 316,320 **** #define LINKER \ ! TARGET_BINARY_INTERFACE=m88kdguxelf gcc -nostdlib #define MAKE_COMMAND \ --- 348,352 ---- #define LINKER \ ! TARGET_BINARY_INTERFACE=m88kdguxelf gcc #define MAKE_COMMAND \ *************** *** 323,338 **** #define C_DEBUG_SWITCH -g -V2 -mversion-03.00 -mstandard #endif /* COFF */ - /* Define switches affecting x/ymakefile */ - #define C_OPTIMIZE_SWITCH - - /* Paul M Reilly writes: - On some systems (DGUX comes to mind real fast) FASYNC causes - background writes to the terminal to stop all processes in the - process group when invoked under the csh (and probably any shell - with job control). This stops Emacs dead in its tracks when coming - up under X11. */ - #define BROKEN_FASYNC ! /* (Assume) we do have vfork. */ ! #define HAVE_VFORK --- 355,361 ---- #define C_DEBUG_SWITCH -g -V2 -mversion-03.00 -mstandard #endif /* COFF */ ! /* Extra stuff which probably should be someplace else but is here out ! of expediency. */ ! #define LIB_X11_LIB -lX11 diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/s/hpux8.h emacs-19.21/src/s/hpux8.h *** emacs-19.20/src/s/hpux8.h Wed Aug 11 19:14:11 1993 --- emacs-19.21/src/s/hpux8.h Tue Nov 16 01:07:52 1993 *************** *** 24,28 **** --- 24,32 ---- #define ORDINARY_LINK #else + #if defined(hp9000s700) || defined(__hp9000s700) + #define LD_SWITCH_SYSTEM -a archive -L/lib/pa1.1 + #else #define LD_SWITCH_SYSTEM -a archive + #endif #endif diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/s/sco4.h emacs-19.21/src/s/sco4.h *** emacs-19.20/src/s/sco4.h Fri Oct 8 11:23:42 1993 --- emacs-19.21/src/s/sco4.h Mon Nov 15 07:27:46 1993 *************** *** 78,82 **** --- 78,87 ---- /* SCO has gettimeofday in socket library */ + /* Autoconf should determine this, but for now, + play safe to avoid error rather than deleting this + and risking the wrong result. */ + #ifndef HAVE_GETTIMEOFDAY #define HAVE_GETTIMEOFDAY + #endif #endif diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/s/sunos4-1-3.h emacs-19.21/src/s/sunos4-1-3.h *** emacs-19.20/src/s/sunos4-1-3.h Mon Nov 1 23:59:22 1993 --- emacs-19.21/src/s/sunos4-1-3.h Tue Nov 16 07:23:37 1993 *************** *** 11,12 **** --- 11,14 ---- the problem of spurious ^M in subprocess output. */ #define HAVE_TERMIOS + /* This enables some #undefs in systty.h. */ + #define BSD_TERMIOS diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/s/sunos4shr.h emacs-19.21/src/s/sunos4shr.h *** emacs-19.20/src/s/sunos4shr.h Wed Jul 21 17:31:09 1993 --- emacs-19.21/src/s/sunos4shr.h Tue Nov 16 01:20:47 1993 *************** *** 1,2 **** --- 1,6 ---- + /* This file permits building Emacs with a shared libc on Sunos 4. + To make this work, you must completely replace your C shared library + using one of the SunOS 4.1.x jumbo replacement patches from Sun. */ + #include "sunos4-1.h" *************** *** 25,30 **** --- 29,38 ---- #undef SYSTEM_MALLOC + #ifndef GNU_MALLOC #define GNU_MALLOC + #endif + #ifndef REL_ALLOC #define REL_ALLOC + #endif /* khera@cs.duke.edu says this is needed. */ diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/systty.h emacs-19.21/src/systty.h *** emacs-19.20/src/systty.h Wed Nov 10 14:58:45 1993 --- emacs-19.21/src/systty.h Tue Nov 16 07:25:51 1993 *************** *** 21,24 **** --- 21,48 ---- #define HAVE_TCATTR #endif + + /* If we defined these before and we are about to redefine them, + prevent alarming warnings. */ + #ifdef BSD_TERMIOS + #undef NL0 + #undef NL1 + #undef CR0 + #undef CR1 + #undef CR2 + #undef CR3 + #undef TAB0 + #undef TAB1 + #undef TAB2 + #undef XTABS + #undef BS0 + #undef BS1 + #undef FF0 + #undef FF1 + #undef ECHO + #undef NOFLSH + #undef TOSTOP + #undef FLUSHO + #undef PENDIN + #endif /* Include the proper files. */ diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/textprop.c emacs-19.21/src/textprop.c *** emacs-19.20/src/textprop.c Tue Sep 28 05:51:36 1993 --- emacs-19.21/src/textprop.c Tue Nov 16 07:24:51 1993 *************** *** 588,592 **** a change in the PROP property, then returns the position of the change.\n\ The optional third argument OBJECT is the string or buffer to scan.\n\ ! The property values are compared with `eq'. Return nil if the property is constant all the way to the end of OBJECT.\n\ If the value is non-nil, it is a position greater than POS, never equal.") --- 588,592 ---- a change in the PROP property, then returns the position of the change.\n\ The optional third argument OBJECT is the string or buffer to scan.\n\ ! The property values are compared with `eq'.\n\ Return nil if the property is constant all the way to the end of OBJECT.\n\ If the value is non-nil, it is a position greater than POS, never equal.") *************** *** 652,656 **** a change in the PROP property, then returns the position of the change.\n\ The optional third argument OBJECT is the string or buffer to scan.\n\ ! The property values are compared with `eq'. Return nil if the property is constant all the way to the start of OBJECT.\n\ If the value is non-nil, it is a position less than POS, never equal.") --- 652,656 ---- a change in the PROP property, then returns the position of the change.\n\ The optional third argument OBJECT is the string or buffer to scan.\n\ ! The property values are compared with `eq'.\n\ Return nil if the property is constant all the way to the start of OBJECT.\n\ If the value is non-nil, it is a position less than POS, never equal.") diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/xterm.c emacs-19.21/src/xterm.c *** emacs-19.20/src/xterm.c Wed Nov 10 21:30:58 1993 --- emacs-19.21/src/xterm.c Tue Nov 16 07:25:20 1993 *************** *** 1785,1792 **** FRAME_PTR f1; - /* If this isn't an X-window frame, quit now. */ - if (!FRAME_X_P (*f)) - return; - BLOCK_INPUT; --- 1785,1788 ---- *************** *** 2941,2945 **** { KeySym keysym, orig_keysym; ! unsigned char copy_buffer[80]; int modifiers; --- 2937,2943 ---- { KeySym keysym, orig_keysym; ! /* al%imercury@uunet.uu.net says that making this 81 instead of ! 80 fixed a bug whereby meta chars made his Emacs hang. */ ! unsigned char copy_buffer[81]; int modifiers; end-of-emacs-patch-kit