summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--COPYING25
-rw-r--r--ChangeLog5
-rw-r--r--INSTALL.CVS4
-rw-r--r--admin/FOR-RELEASE21
-rw-r--r--etc/COPYING25
-rw-r--r--etc/ChangeLog21
-rw-r--r--etc/NEWS115
-rw-r--r--etc/THE-GNU-PROJECT818
-rw-r--r--leim/COPYING25
-rw-r--r--leim/ChangeLog5
-rw-r--r--lib-src/COPYING25
-rw-r--r--lib-src/ChangeLog5
-rw-r--r--lisp/COPYING25
-rw-r--r--lisp/ChangeLog361
-rw-r--r--lisp/allout.el1314
-rw-r--r--lisp/bindings.el1
-rw-r--r--lisp/cus-edit.el2
-rw-r--r--lisp/cus-start.el3
-rw-r--r--lisp/dnd.el32
-rw-r--r--lisp/ediff-util.el5
-rw-r--r--lisp/ediff.el70
-rw-r--r--lisp/emulation/viper-cmd.el2
-rw-r--r--lisp/emulation/viper.el2
-rw-r--r--lisp/ezimage.el2
-rw-r--r--lisp/faces.el2
-rw-r--r--lisp/font-lock.el19
-rw-r--r--lisp/gnus/ChangeLog12
-rw-r--r--lisp/gnus/message.el6
-rw-r--r--lisp/gnus/nnslashdot.el4
-rw-r--r--lisp/help.el269
-rw-r--r--lisp/ido.el4
-rw-r--r--lisp/jit-lock.el18
-rw-r--r--lisp/menu-bar.el2
-rw-r--r--lisp/mouse-sel.el2
-rw-r--r--lisp/mouse.el57
-rw-r--r--lisp/obsolete/fast-lock.el4
-rw-r--r--lisp/play/life.el24
-rw-r--r--lisp/progmodes/compile.el2
-rw-r--r--lisp/progmodes/python.el2
-rw-r--r--lisp/saveplace.el2
-rw-r--r--lisp/select.el7
-rw-r--r--lisp/simple.el118
-rw-r--r--lisp/startup.el44
-rw-r--r--lisp/term/x-win.el8
-rw-r--r--lisp/textmodes/conf-mode.el80
-rw-r--r--lisp/textmodes/flyspell.el19
-rw-r--r--lisp/time.el2
-rw-r--r--lisp/url/ChangeLog6
-rw-r--r--lisp/url/url-methods.el5
-rw-r--r--lisp/wid-edit.el21
-rw-r--r--lispref/ChangeLog51
-rw-r--r--lispref/gpl.texi21
-rw-r--r--lispref/keymaps.texi140
-rw-r--r--lispref/text.texi23
-rw-r--r--lispref/variables.texi2
-rw-r--r--lwlib/COPYING25
-rw-r--r--lwlib/ChangeLog5
-rw-r--r--mac/COPYING25
-rw-r--r--mac/ChangeLog14
-rw-r--r--mac/INSTALL12
-rw-r--r--mac/inc/config.h6
-rw-r--r--mac/src/Emacs.r4
-rw-r--r--man/ChangeLog27
-rw-r--r--man/calc.texi6
-rw-r--r--man/emacs.texi8
-rw-r--r--man/frames.texi17
-rw-r--r--man/gnus.texi4
-rw-r--r--man/mh-e.texi8
-rw-r--r--man/org.texi2
-rw-r--r--msdos/COPYING25
-rw-r--r--msdos/ChangeLog5
-rw-r--r--nt/COPYING25
-rw-r--r--nt/ChangeLog5
-rw-r--r--src/COPYING25
-rw-r--r--src/ChangeLog182
-rw-r--r--src/Makefile.in3
-rw-r--r--src/dispnew.c5
-rw-r--r--src/emacs.c2
-rw-r--r--src/gmalloc.c64
-rw-r--r--src/gtkutil.c87
-rw-r--r--src/indent.c8
-rw-r--r--src/keyboard.c15
-rw-r--r--src/keymap.c191
-rw-r--r--src/keymap.h4
-rw-r--r--src/mac.c8
-rw-r--r--src/macmenu.c63
-rw-r--r--src/macterm.c46
-rw-r--r--src/macterm.h10
-rw-r--r--src/md5.c8
-rw-r--r--src/md5.h8
-rw-r--r--src/print.c20
-rw-r--r--src/regex.c4
-rw-r--r--src/search.c23
-rw-r--r--src/strftime.c8
-rw-r--r--src/syntax.c5
-rw-r--r--src/window.c142
-rw-r--r--src/xdisp.c11
-rw-r--r--src/xfns.c16
98 files changed, 3301 insertions, 1769 deletions
diff --git a/COPYING b/COPYING
index 3912109b5cd..d511905c164 100644
--- a/COPYING
+++ b/COPYING
@@ -1,8 +1,8 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
-
+
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
-
+
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
-
+
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
-
+
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
-
+
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
@@ -303,10 +303,9 @@ the "copyright" line and a pointer to where the full notice is found.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
diff --git a/ChangeLog b/ChangeLog
index 7d43299b90d..7faee7b1bae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-15 Jay Belanger <belanger@truman.edu>
+
+ * COPYING: Replace "Library Public License" by "Lesser Public
+ License" throughout.
+
2006-09-11 Paul Eggert <eggert@cs.ucla.edu>
* make-dist (EMACS): Exit and fail if the EMACS environment
diff --git a/INSTALL.CVS b/INSTALL.CVS
index e67ea4db0f2..2903835deb0 100644
--- a/INSTALL.CVS
+++ b/INSTALL.CVS
@@ -60,8 +60,8 @@ Write access to the CVS repository requires using SSH v2.
If you execute cvs commands inside Emacs, specifically if you use
pcl-cvs, output from CVS may be lost due to a problem in the
-interface between ssh, cvs, and libc. Corrupted checkins have
-also been rumored to have happened.
+interface between ssh, cvs, and libc. Corrupted checkins are
+also known to have happened.
To fix the problem, save the following script into a file, make it
executable, and set CVS_RSH to the file name of the script:
diff --git a/admin/FOR-RELEASE b/admin/FOR-RELEASE
index 8a98221fc60..427d2c43c5f 100644
--- a/admin/FOR-RELEASE
+++ b/admin/FOR-RELEASE
@@ -33,14 +33,6 @@ and KDE projects, to use the new Emacs icons in etc/images/icons.
These don't need to be fixed to start pretest, but we call the
attention of Windows users to fixing them.
-** Markus Gritsch's report about Emacs looping on Windoze with the following
-.emacs file, and then reduce Emacs frame width to "something quite narrow":
- (setq-default truncate-lines t)
- (custom-set-variables
- '(hscroll-margin 20)
- '(hscroll-step 1)
- )
-
** Drew Adams 12 Aug bug rpt: overlay display artifact: trace left behind
Windows only bug.
@@ -49,21 +41,18 @@ Windows only bug.
* BUGS
-** Field handling in C-n.
-
** C-g fails to interrupt accept-process-output in Gnus.
(Is that fixed?)
-** allout.el patch from Manheimer to be installed.
+** david.hansen@physik.fu-berlin.de: WoMan Bug, Sep 13.
-** regex char class matching needs a call to char-syntax.
+** Michael Cadilhac's line-move-partial is slow.
-** regex char class matching breaks if you change entries
-in the syntax table.
+** run-with-idle-timer change causes problem for Semantic.
-** Handa's Sep 6 compilation font lock bug report.
+** iampure@gmail.com's Sep 15 bug report about View Changes In File.
-** Michael Cadilhac's Sep 7 bug report about set-input-method.
+** Peter_Dyballa@Web.DE's Sep 17 bug report about i-search and non-ASCII chars
* DOCUMENTATION
diff --git a/etc/COPYING b/etc/COPYING
index 3912109b5cd..d511905c164 100644
--- a/etc/COPYING
+++ b/etc/COPYING
@@ -1,8 +1,8 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
-
+
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
-
+
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
-
+
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
-
+
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
-
+
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
@@ -303,10 +303,9 @@ the "copyright" line and a pointer to where the full notice is found.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
diff --git a/etc/ChangeLog b/etc/ChangeLog
index e236643da10..998de94422b 100644
--- a/etc/ChangeLog
+++ b/etc/ChangeLog
@@ -1,3 +1,22 @@
+2006-09-18 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
+
+ * NEWS: Rename x-use-old-gtk-file-dialog to x-gtk-use-old-file-dialog.
+
+2006-09-15 Jay Belanger <belanger@truman.edu>
+
+ * COPYING: Replace "Library Public License" by "Lesser Public
+ License" throughout.
+
+2006-09-15 Richard Stallman <rms@gnu.org>
+
+ * THE-GNU-PROJECT: Update with the latest footnotes
+ from www.gnu.org/gnu/the-gnu-project.html
+
+2006-09-15 David Kastrup <dak@gnu.org>
+
+ * NEWS: explain new behavior and arguments of `key-binding' and
+ `command-remapping'.
+
2006-09-11 Paul Eggert <eggert@cs.ucla.edu>
* NEWS: In terminal-oriented subshells, the EMACS environment
@@ -102,7 +121,7 @@
* PROBLEMS: Emacs now requires ws2_32.dll on Windows.
-2006-07-14 K,Aa(Broly L,Bu(Brentey <lorentey@elte.hu>
+2006-07-14 K,Aa(Broly L$,1 q(Brentey <lorentey@elte.hu>
* HELLO: Update Hungarian sample.
diff --git a/etc/NEWS b/etc/NEWS
index 75480af6efc..1f76311224f 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1134,7 +1134,7 @@ ESC, like they do for Gtk+, Mac and W32.
+++
*** For the Gtk+ version, you can make Emacs use the old file dialog
-by setting the variable `x-use-old-gtk-file-dialog' to t. Default is to use
+by setting the variable `x-gtk-use-old-file-dialog' to t. Default is to use
the new dialog.
** Mouse changes:
@@ -2091,6 +2091,34 @@ behavior in older versions of Emacs).
---
** Changes in Allout
+*** Some previously rough topic-header format edge cases are reconciled.
+Level 1 topics use the mode's comment format, and lines starting with the
+asterisk - for instance, the comment close of some languages (eg, c's "*/"
+or mathematica's "*)") - at the beginning of line are no longer are
+interpreted as level 1 topics in those modes.
+
+*** Many or most commonly occuring "accidental" topics are disqualified.
+Text in item bodies that looks like a low-depth topic is no longer mistaken
+for one unless its first offspring (or that of its next sibling with
+offspring) is only one level deeper.
+
+For example, pasting some text with a bunch of leading asterisks into a
+topic that's followed by a level 3 or deeper topic will not cause the
+pasted text to be mistaken for outline structure.
+
+The same constraint is applied to any level 2 or 3 topics.
+
+This settles an old issue where typed or pasted text needed to be carefully
+reviewed, and sometimes doctored, to avoid accidentally disrupting the
+outline structure. Now that should be generally unnecessary, as the most
+prone-to-occur accidents are disqualified.
+
+*** Allout now refuses to create "containment discontinuities", where a
+topic is shifted deeper than the offspring-depth of its container. On the
+other hand, allout now operates gracefully with existing containment
+discontinuities, revealing excessively contained topics rather than either
+leaving them hidden or raising an error.
+
*** Topic cryptography added, enabling easy gpg topic encryption and
decryption. Per-topic basis enables interspersing encrypted-text and
clear-text within a single file to your heart's content, using symmetric
@@ -2100,56 +2128,52 @@ pending topics on save, and more, make it easy to use encryption in
powerful ways. Encryption behavior customization is collected in the
allout-encryption customization group.
-*** `allout-view-change-hook' marked as being deprecated - use
-`allout-exposure-change-hook' instead. Both are still invoked, but
-`allout-view-change-hook' will eventually be ignored. The new
-`allout-exposure-change-hook' is called with args that were passed to
-`allout-flag-region', making it easier to use.
-
-*** Other allout functions which change the outline structure also have
-hooks, enabling cooperative allout enhancements. See
-`allout-structure-added-hook', `allout-structure-deleted-hook', and
-`allout-structure-shifted-hook'.
-
-*** Default command prefix changed to "\C-c " (control-c space), to avoid
-intruding on user's keybinding space. Customize the
+*** Navigation within an item is easier. Repeated beginning-of-line and
+end-of-line key commands (usually, ^A and ^E) cycle through the
+beginning/end-of-line and then beginning/end of topic, etc. See new
+customization vars `allout-beginning-of-line-cycles' and
+`allout-end-of-line-cycles'.
+
+*** New or revised allout-mode activity hooks enable creation of
+cooperative enhancements to allout mode without changes to the mode,
+itself.
+
+See `allout-exposure-change-hook', `allout-structure-added-hook',
+`allout-structure-deleted-hook', and `allout-structure-shifted-hook'.
+
+`allout-exposure-change-hook' replaces the existing
+`allout-view-change-hook', which is being deprecated. Both are still
+invoked, but `allout-view-change-hook' will eventually be ignored.
+`allout-exposure-change-hook' is called with explicit arguments detailing
+the specifics of each change (as are the other new hooks), making it easier
+to use than the old version.
+
+There is a new mode deactivation hook, `allout-mode-deactivate-hook', for
+coordinating with deactivation of allout-mode. Both that and the mode
+activation hook, `allout-mode-hook' are now run after the `allout-mode'
+variable is changed, rather than before.
+
+*** Default command prefix was changed to "\C-c " (control-c space), to
+avoid intruding on user's keybinding space. Customize the
`allout-command-prefix' variable to your preference.
-*** Allout now uses text overlay's `invisible' property (and others) for
-concealed text, instead of selective-display. This simplifies the code, in
-particular avoiding the need for kludges for isearch dynamic-display,
-discretionary handling of edits of concealed text, undo concerns, etc.
+*** Allout now uses text overlay's `invisible' property for concealed text,
+instead of selective-display. This simplifies the code, in particular
+avoiding the need for kludges for isearch dynamic-display, discretionary
+handling of edits of concealed text, undo concerns, etc.
-*** Some previously rough topic-header format edge cases are reconciled.
-Level 1 topics use the mode's comment format, and lines starting with the
-asterisk - for instance, the comment close of some languages (eg, c's "*/"
-or mathematica's "*)") - at the beginning of line are no longer are
-interpreted as level 1 topics in those modes. (Yay!)
+*** There are many other fixes and refinements, including:
-*** Many substantial fixes and refinements, including:
-
- - repaired regexp-quoting of custom header prefixes, so any literals
- will now work (for instance, mathematica's "(*" is now properly
- accepted).
- - repaired inhibition of inadvertent edits to concealed text.
- - refuse to create "containment discontinuities", where a
- topic is shifted deeper than the offspring-depth of its' container
+ - repaired inhibition of inadvertent edits to concealed text, without
+ inhibiting undo; we now reveal undo changes within concealed text.
- auto-fill-mode is now left inactive when allout-mode starts, if it
already was inactive. also, `allout-inhibit-auto-fill' custom
configuration variable makes it easy to disable auto fill in allout
outlines in general or on a per-buffer basis.
- - mode hook changes: new hook `allout-mode-deactivate-hook', for
- coordinating with deactivation of allout-mode. `allout-mode-hook' is
- now run after the `allout-mode' variable is changed, as is the new
- `allout-mode-deactivate-hook'.
- allout now tolerates fielded text in outlines without disruption.
- hot-spot navigation now is modularized with a new function,
- `allout-hotspot-key-handler', enabling easier articulation and
- enhancement of the functionality by allout addons.
- - topic body navigation is easier, where repeated beginning of line and
- end of line key commands cycle through the actually beginning/end of
- line and then beginning/end of topic, etc. see new customization vars
- `allout-beginning-of-line-cycles' and `allout-end-of-line-cycles'.
+ `allout-hotspot-key-handler', enabling easier use and enhancement of
+ the functionality in allout addons.
- repaired retention of topic body hanging indent upon topic depth shifts
- bulleting variation is simpler and more accommodating, both in the
default behavior and in ability to vary when creating new topics
@@ -2160,8 +2184,7 @@ interpreted as level 1 topics in those modes. (Yay!)
- included a few unit-tests for interior functionality. developers can
have them automatically run at the end of module load by customizing
the option `allout-run-unit-tests-on-load'.
- - many, many minor tweaks and fixes. many internal fixes and
- refinements of docstrings.
+ - many, many other, more minor tweaks, fixes, and refinements.
- version number incremented to 2.2
** The variable `woman-topic-at-point' was renamed
@@ -4741,6 +4764,12 @@ over minor mode keymaps.
text properties, according to their stickiness. This also means that it
works with empty overlays. The same hold for the `local-map' property.
+*** `key-binding' will now look up mouse-specific bindings. The
+keymaps consulted by `key-binding' will get adapted if the key
+sequence is started with a mouse event. Instead of letting the click
+position be determined from the key sequence itself, it is also
+possible to specify it with an optional argument explicitly.
+
*** Dense keymaps now handle inheritance correctly.
Previously a dense keymap would hide all of the simple-char key
diff --git a/etc/THE-GNU-PROJECT b/etc/THE-GNU-PROJECT
index 1df8c8bdac0..d089d76ef2d 100644
--- a/etc/THE-GNU-PROJECT
+++ b/etc/THE-GNU-PROJECT
@@ -7,163 +7,160 @@
The first software-sharing community
When I started working at the MIT Artificial Intelligence Lab in 1971,
- I became part of a software-sharing community that had existed for
- many years. Sharing of software was not limited to our particular
- community; it is as old as computers, just as sharing of recipes is as
- old as cooking. But we did it more than most.
+ I became part of a software-sharing community that had existed for many
+ years. Sharing of software was not limited to our particular community;
+ it is as old as computers, just as sharing of recipes is as old as
+ cooking. But we did it more than most.
The AI Lab used a timesharing operating system called ITS (the
Incompatible Timesharing System) that the lab's staff hackers (1) had
designed and written in assembler language for the Digital PDP-10, one
- of the large computers of the era. As a member of this community, an
- AI lab staff system hacker, my job was to improve this system.
-
- We did not call our software "free software", because that term did
- not yet exist; but that is what it was. Whenever people from another
- university or a company wanted to port and use a program, we gladly
- let them. If you saw someone using an unfamiliar and interesting
- program, you could always ask to see the source code, so that you
- could read it, change it, or cannibalize parts of it to make a new
- program.
+ of the large computers of the era. As a member of this community, an AI
+ lab staff system hacker, my job was to improve this system.
+
+ We did not call our software "free software", because that term did not
+ yet exist; but that is what it was. Whenever people from another
+ university or a company wanted to port and use a program, we gladly let
+ them. If you saw someone using an unfamiliar and interesting program,
+ you could always ask to see the source code, so that you could read it,
+ change it, or cannibalize parts of it to make a new program.
(1) The use of "hacker" to mean "security breaker" is a confusion on
- the part of the mass media. We hackers refuse to recognize that
+ the part of the mass media. We hackers refuse to recognize that
meaning, and continue using the word to mean, "Someone who loves to
program and enjoys being clever about it."
The collapse of the community
The situation changed drastically in the early 1980s when Digital
- discontinued the PDP-10 series. Its architecture, elegant and powerful
+ discontinued the PDP-10 series. Its architecture, elegant and powerful
in the 60s, could not extend naturally to the larger address spaces
- that were becoming feasible in the 80s. This meant that nearly all of
+ that were becoming feasible in the 80s. This meant that nearly all of
the programs composing ITS were obsolete.
- The AI lab hacker community had already collapsed, not long before. In
+ The AI lab hacker community had already collapsed, not long before. In
1981, the spin-off company Symbolics had hired away nearly all of the
hackers from the AI lab, and the depopulated community was unable to
- maintain itself. (The book Hackers, by Steve Levy, describes these
+ maintain itself. (The book Hackers, by Steve Levy, describes these
events, as well as giving a clear picture of this community in its
- prime.) When the AI lab bought a new PDP-10 in 1982, its
- administrators decided to use Digital's non-free timesharing system
- instead of ITS.
+ prime.) When the AI lab bought a new PDP-10 in 1982, its administrators
+ decided to use Digital's non-free timesharing system instead of ITS.
The modern computers of the era, such as the VAX or the 68020, had
their own operating systems, but none of them were free software: you
had to sign a nondisclosure agreement even to get an executable copy.
This meant that the first step in using a computer was to promise not
- to help your neighbor. A cooperating community was forbidden. The rule
- made by the owners of proprietary software was, "If you share with
- your neighbor, you are a pirate. If you want any changes, beg us to
- make them."
+ to help your neighbor. A cooperating community was forbidden. The rule
+ made by the owners of proprietary software was, "If you share with your
+ neighbor, you are a pirate. If you want any changes, beg us to make
+ them."
- The idea that the proprietary software social system--the system that
+ The idea that the proprietary-software social system--the system that
says you are not allowed to share or change software--is antisocial,
that it is unethical, that it is simply wrong, may come as a surprise
- to some readers. But what else could we say about a system based on
+ to some readers. But what else could we say about a system based on
dividing the public and keeping users helpless? Readers who find the
- idea surprising may have taken proprietary social system as given, or
- judged it on the terms suggested by proprietary software businesses.
- Software publishers have worked long and hard to convince people that
- there is only one way to look at the issue.
+ idea surprising may have taken proprietary-software social system as
+ given, or judged it on the terms suggested by proprietary software
+ businesses. Software publishers have worked long and hard to convince
+ people that there is only one way to look at the issue.
When software publishers talk about "enforcing" their "rights" or
- "stopping piracy", what they actually *say* is secondary. The real
+ "stopping piracy", what they actually *say* is secondary. The real
message of these statements is in the unstated assumptions they take
- for granted; the public is supposed to accept them uncritically. So
+ for granted; the public is supposed to accept them uncritically. So
let's examine them.
One assumption is that software companies have an unquestionable
natural right to own software and thus have power over all its users.
(If this were a natural right, then no matter how much harm it does to
- the public, we could not object.) Interestingly, the US Constitution
- and legal tradition reject this view; copyright is not a natural
- right, but an artificial government-imposed monopoly that limits the
- users' natural right to copy.
+ the public, we could not object.) Interestingly, the US Constitution
+ and legal tradition reject this view; copyright is not a natural right,
+ but an artificial government-imposed monopoly that limits the users'
+ natural right to copy.
Another unstated assumption is that the only important thing about
software is what jobs it allows you to do--that we computer users
should not care what kind of society we are allowed to have.
- A third assumption is that we would have no usable software (or, would
+ A third assumption is that we would have no usable software (or would
never have a program to do this or that particular job) if we did not
- offer a company power over the users of the program. This assumption
+ offer a company power over the users of the program. This assumption
may have seemed plausible, before the free software movement
- demonstrated that we can make plenty of useful software without
- putting chains on it.
+ demonstrated that we can make plenty of useful software without putting
+ chains on it.
- If we decline to accept these assumptions, and judge these issues
- based on ordinary common-sense morality while placing the users first,
- we arrive at very different conclusions. Computer users should be free
- to modify programs to fit their needs, and free to share software,
- because helping other people is the basis of society.
+ If we decline to accept these assumptions, and judge these issues based
+ on ordinary common-sense morality while placing the users first, we
+ arrive at very different conclusions. Computer users should be free to
+ modify programs to fit their needs, and free to share software, because
+ helping other people is the basis of society.
There is no room here for an extensive statement of the reasoning
behind this conclusion, so I refer the reader to the web page,
- <http://www.gnu.org/philosophy/why-free.html>.
+ http://www.gnu.org/philosophy/why-free.html.
A stark moral choice.
- With my community gone, to continue as before was impossible. Instead,
+ With my community gone, to continue as before was impossible. Instead,
I faced a stark moral choice.
The easy choice was to join the proprietary software world, signing
nondisclosure agreements and promising not to help my fellow hacker.
- Most likely I would also be developing software that was released
- under nondisclosure agreements, thus adding to the pressure on other
- people to betray their fellows too.
+ Most likely I would also be developing software that was released under
+ nondisclosure agreements, thus adding to the pressure on other people
+ to betray their fellows too.
I could have made money this way, and perhaps amused myself writing
- code. But I knew that at the end of my career, I would look back on
+ code. But I knew that at the end of my career, I would look back on
years of building walls to divide people, and feel I had spent my life
making the world a worse place.
- I had already experienced being on the receiving end of a
- nondisclosure agreement, when someone refused to give me and the MIT
- AI lab the source code for the control program for our printer. (The
- lack of certain features in this program made use of the printer
- extremely frustrating.) So I could not tell myself that nondisclosure
- agreements were innocent. I was very angry when he refused to share
- with us; I could not turn around and do the same thing to everyone
- else.
+ I had already experienced being on the receiving end of a nondisclosure
+ agreement, when someone refused to give me and the MIT AI lab the
+ source code for the control program for our printer. (The lack of
+ certain features in this program made use of the printer extremely
+ frustrating.) So I could not tell myself that nondisclosure agreements
+ were innocent. I was very angry when he refused to share with us; I
+ could not turn around and do the same thing to everyone else.
Another choice, straightforward but unpleasant, was to leave the
- computer field. That way my skills would not be misused, but they
- would still be wasted. I would not be culpable for dividing and
- restricting computer users, but it would happen nonetheless.
+ computer field. That way my skills would not be misused, but they would
+ still be wasted. I would not be culpable for dividing and restricting
+ computer users, but it would happen nonetheless.
So I looked for a way that a programmer could do something for the
- good. I asked myself, was there a program or programs that I could
+ good. I asked myself, was there a program or programs that I could
write, so as to make a community possible once again?
The answer was clear: what was needed first was an operating system.
- That is the crucial software for starting to use a computer. With an
+ That is the crucial software for starting to use a computer. With an
operating system, you can do many things; without one, you cannot run
- the computer at all. With a free operating system, we could again have
- a community of cooperating hackers--and invite anyone to join. And
+ the computer at all. With a free operating system, we could again have
+ a community of cooperating hackers--and invite anyone to join. And
anyone would be able to use a computer without starting out by
conspiring to deprive his or her friends.
As an operating system developer, I had the right skills for this job.
So even though I could not take success for granted, I realized that I
- was elected to do the job. I chose to make the system compatible with
+ was elected to do the job. I chose to make the system compatible with
Unix so that it would be portable, and so that Unix users could easily
- switch to it. The name GNU was chosen following a hacker tradition, as
+ switch to it. The name GNU was chosen following a hacker tradition, as
a recursive acronym for "GNU's Not Unix."
An operating system does not mean just a kernel, barely enough to run
- other programs. In the 1970s, every operating system worthy of the
- name included command processors, assemblers, compilers, interpreters,
- debuggers, text editors, mailers, and much more. ITS had them, Multics
- had them, VMS had them, and Unix had them. The GNU operating system
+ other programs. In the 1970s, every operating system worthy of the name
+ included command processors, assemblers, compilers, interpreters,
+ debuggers, text editors, mailers, and much more. ITS had them, Multics
+ had them, VMS had them, and Unix had them. The GNU operating system
would include them too.
Later I heard these words, attributed to Hillel (1):
- If I am not for myself, who will be for me?
- If I am only for myself, what am I?
- If not now, when?
+ If I am not for myself, who will be for me?
+ If I am only for myself, what am I?
+ If not now, when?
The decision to start the GNU project was based on a similar spirit.
@@ -173,47 +170,46 @@
Free as in freedom
The term "free software" is sometimes misunderstood--it has nothing to
- do with price. It is about freedom. Here, therefore, is the definition
+ do with price. It is about freedom. Here, therefore, is the definition
of free software: a program is free software, for you, a particular
user, if:
-
* You have the freedom to run the program, for any purpose.
- * You have the freedom to modify the program to suit your needs. (To
+ * You have the freedom to modify the program to suit your needs. (To
make this freedom effective in practice, you must have access to
the source code, since making changes in a program without having
the source code is exceedingly difficult.)
- * You have the freedom to redistribute copies, either gratis or for
- a fee.
+ * You have the freedom to redistribute copies, either gratis or for a
+ fee.
* You have the freedom to distribute modified versions of the
program, so that the community can benefit from your improvements.
- Since "free" refers to freedom, not to price, there is no
- contradiction between selling copies and free software. In fact, the
- freedom to sell copies is crucial: collections of free software sold
- on CD-ROMs are important for the community, and selling them is an
- important way to raise funds for free software development. Therefore,
- a program which people are not free to include on these collections is
- not free software.
+ Since "free" refers to freedom, not to price, there is no contradiction
+ between selling copies and free software. In fact, the freedom to sell
+ copies is crucial: collections of free software sold on CD-ROMs are
+ important for the community, and selling them is an important way to
+ raise funds for free software development. Therefore, a program which
+ people are not free to include on these collections is not free
+ software.
Because of the ambiguity of "free", people have long looked for
- alternatives, but no one has found a suitable alternative. The English
+ alternatives, but no one has found a suitable alternative. The English
Language has more words and nuances than any other, but it lacks a
- simple, unambiguous, word that means "free," as in
- freedom--"unfettered," being the word that comes closest in meaning.
- Such alternatives as "liberated", "freedom" and "open" have either the
+ simple, unambiguous, word that means "free", as in
+ freedom--"unfettered" being the word that comes closest in meaning.
+ Such alternatives as "liberated", "freedom", and "open" have either the
wrong meaning or some other disadvantage.
GNU software and the GNU system
- Developing a whole system is a very large project. To bring it into
+ Developing a whole system is a very large project. To bring it into
reach, I decided to adapt and use existing pieces of free software
- wherever that was possible. For example, I decided at the very
+ wherever that was possible. For example, I decided at the very
beginning to use TeX as the principal text formatter; a few years
- later, I decided to use the X Window System rather than writing
- another window system for GNU.
+ later, I decided to use the X Window System rather than writing another
+ window system for GNU.
Because of this decision, the GNU system is not the same as the
- collection of all GNU software. The GNU system includes programs that
+ collection of all GNU software. The GNU system includes programs that
are not GNU software, programs that were developed by other people and
projects for their own purposes, but which we can use because they are
free software.
@@ -222,12 +218,12 @@
In January 1984 I quit my job at MIT and began writing GNU software.
Leaving MIT was necessary so that MIT would not be able to interfere
- with distributing GNU as free software. If I had remained on the
- staff, MIT could have claimed to own the work, and could have imposed
- their own distribution terms, or even turned the work into a
- proprietary software package. I had no intention of doing a large
- amount of work only to see it become useless for its intended purpose:
- creating a new software-sharing community.
+ with distributing GNU as free software. If I had remained on the staff,
+ MIT could have claimed to own the work, and could have imposed their
+ own distribution terms, or even turned the work into a proprietary
+ software package. I had no intention of doing a large amount of work
+ only to see it become useless for its intended purpose: creating a new
+ software-sharing community.
However, Professor Winston, then the head of the MIT AI Lab, kindly
invited me to keep using the lab's facilities.
@@ -235,78 +231,78 @@
The first steps
Shortly before beginning the GNU project, I heard about the Free
- University Compiler Kit, also known as VUCK. (The Dutch word for
- "free" is written with a V.) This was a compiler designed to handle
- multiple languages, including C and Pascal, and to support multiple
- target machines. I wrote to its author asking if GNU could use it.
+ University Compiler Kit, also known as VUCK. (The Dutch word for "free"
+ is written with a V.) This was a compiler designed to handle multiple
+ languages, including C and Pascal, and to support multiple target
+ machines. I wrote to its author asking if GNU could use it.
He responded derisively, stating that the university was free but the
- compiler was not. I therefore decided that my first program for the
- GNU project would be a multi-language, multi-platform compiler.
-
- Hoping to avoid the need to write the whole compiler myself, I
- obtained the source code for the Pastel compiler, which was a
- multi-platform compiler developed at Lawrence Livermore Lab. It
- supported, and was written in, an extended version of Pascal, designed
- to be a system-programming language. I added a C front end, and began
- porting it to the Motorola 68000 computer. But I had to give that up
- when I discovered that the compiler needed many megabytes of stack
- space, and the available 68000 Unix system would only allow 64k.
+ compiler was not. I therefore decided that my first program for the GNU
+ project would be a multi-language, multi-platform compiler.
+
+ Hoping to avoid the need to write the whole compiler myself, I obtained
+ the source code for the Pastel compiler, which was a multi-platform
+ compiler developed at Lawrence Livermore Lab. It supported, and was
+ written in, an extended version of Pascal, designed to be a
+ system-programming language. I added a C front end, and began porting
+ it to the Motorola 68000 computer. But I had to give that up when I
+ discovered that the compiler needed many megabytes of stack space, and
+ the available 68000 Unix system would only allow 64k.
I then realized that the Pastel compiler functioned by parsing the
entire input file into a syntax tree, converting the whole syntax tree
into a chain of "instructions", and then generating the whole output
- file, without ever freeing any storage. At this point, I concluded I
- would have to write a new compiler from scratch. That new compiler is
+ file, without ever freeing any storage. At this point, I concluded I
+ would have to write a new compiler from scratch. That new compiler is
now known as GCC; none of the Pastel compiler is used in it, but I
- managed to adapt and use the C front end that I had written. But that
+ managed to adapt and use the C front end that I had written. But that
was some years later; first, I worked on GNU Emacs.
GNU Emacs
I began work on GNU Emacs in September 1984, and in early 1985 it was
- beginning to be usable. This enabled me to begin using Unix systems to
+ beginning to be usable. This enabled me to begin using Unix systems to
do editing; having no interest in learning to use vi or ed, I had done
my editing on other kinds of machines until then.
At this point, people began wanting to use GNU Emacs, which raised the
- question of how to distribute it. Of course, I put it on the anonymous
- ftp server on the MIT computer that I used. (This computer,
+ question of how to distribute it. Of course, I put it on the anonymous
+ ftp server on the MIT computer that I used. (This computer,
prep.ai.mit.edu, thus became the principal GNU ftp distribution site;
when it was decommissioned a few years later, we transferred the name
- to our new ftp server.) But at that time, many of the interested
- people were not on the Internet and could not get a copy by ftp. So
- the question was, what would I say to them?
-
- I could have said, "Find a friend who is on the net and who will make
- a copy for you." Or I could have done what I did with the original
- PDP-10 Emacs: tell them, "Mail me a tape and a SASE, and I will mail
- it back with Emacs on it." But I had no job, and I was looking for
- ways to make money from free software. So I announced that I would
- mail a tape to whoever wanted one, for a fee of $150. In this way, I
- started a free software distribution business, the precursor of the
- companies that today distribute entire Linux-based GNU systems.
+ to our new ftp server.) But at that time, many of the interested people
+ were not on the Internet and could not get a copy by ftp. So the
+ question was, what would I say to them?
+
+ I could have said, "Find a friend who is on the net and who will make a
+ copy for you." Or I could have done what I did with the original PDP-10
+ Emacs: tell them, "Mail me a tape and a SASE, and I will mail it back
+ with Emacs on it." But I had no job, and I was looking for ways to make
+ money from free software. So I announced that I would mail a tape to
+ whoever wanted one, for a fee of $150. In this way, I started a free
+ software distribution business, the precursor of the companies that
+ today distribute entire Linux-based GNU systems.
Is a program free for every user?
If a program is free software when it leaves the hands of its author,
this does not necessarily mean it will be free software for everyone
- who has a copy of it. For example, public domain software (software
+ who has a copy of it. For example, public domain software (software
that is not copyrighted) is free software; but anyone can make a
- proprietary modified version of it. Likewise, many free programs are
+ proprietary modified version of it. Likewise, many free programs are
copyrighted but distributed under simple permissive licenses which
allow proprietary modified versions.
The paradigmatic example of this problem is the X Window System.
Developed at MIT, and released as free software with a permissive
- license, it was soon adopted by various computer companies. They added
+ license, it was soon adopted by various computer companies. They added
X to their proprietary Unix systems, in binary form only, and covered
- by the same nondisclosure agreement. These copies of X were no more
+ by the same nondisclosure agreement. These copies of X were no more
free software than Unix was.
The developers of the X Window System did not consider this a
- problem--they expected and intended this to happen. Their goal was not
- freedom, just "success", defined as "having many users." They did not
+ problem--they expected and intended this to happen. Their goal was not
+ freedom, just "success", defined as "having many users." They did not
care whether these users had freedom, only that they should be
numerous.
@@ -314,93 +310,94 @@
counting the amount of freedom gave different answers to the question,
"Is this program free?" If you judged based on the freedom provided by
the distribution terms of the MIT release, you would say that X was
- free software. But if you measured the freedom of the average user of
- X, you would have to say it was proprietary software. Most X users
- were running the proprietary versions that came with Unix systems, not
- the free version.
+ free software. But if you measured the freedom of the average user of
+ X, you would have to say it was proprietary software. Most X users were
+ running the proprietary versions that came with Unix systems, not the
+ free version.
Copyleft and the GNU GPL
- The goal of GNU was to give users freedom, not just to be popular. So
+ The goal of GNU was to give users freedom, not just to be popular. So
we needed to use distribution terms that would prevent GNU software
- from being turned into proprietary software. The method we use is
+ from being turned into proprietary software. The method we use is
called "copyleft".(1)
- Copyleft uses copyright law, but flips it over to serve the opposite
- of its usual purpose: instead of a means of privatizing software, it
+ Copyleft uses copyright law, but flips it over to serve the opposite of
+ its usual purpose: instead of a means of privatizing software, it
becomes a means of keeping software free.
- The central idea of copyleft is that we give everyone permission to
- run the program, copy the program, modify the program, and distribute
- modified versions--but not permission to add restrictions of their
- own. Thus, the crucial freedoms that define "free software" are
- guaranteed to everyone who has a copy; they become inalienable rights.
+ The central idea of copyleft is that we give everyone permission to run
+ the program, copy the program, modify the program, and distribute
+ modified versions--but not permission to add restrictions of their own.
+ Thus, the crucial freedoms that define "free software" are guaranteed
+ to everyone who has a copy; they become inalienable rights.
- For an effective copyleft, modified versions must also be free. This
+ For an effective copyleft, modified versions must also be free. This
ensures that work based on ours becomes available to our community if
- it is published. When programmers who have jobs as programmers
+ it is published. When programmers who have jobs as programmers
volunteer to improve GNU software, it is copyleft that prevents their
employers from saying, "You can't share those changes, because we are
going to use them to make our proprietary version of the program."
The requirement that changes must be free is essential if we want to
- ensure freedom for every user of the program. The companies that
+ ensure freedom for every user of the program. The companies that
privatized the X Window System usually made some changes to port it to
- their systems and hardware. These changes were small compared with the
- great extent of X, but they were not trivial. If making changes were
- an excuse to deny the users freedom, it would be easy for anyone to
- take advantage of the excuse.
+ their systems and hardware. These changes were small compared with the
+ great extent of X, but they were not trivial. If making changes were an
+ excuse to deny the users freedom, it would be easy for anyone to take
+ advantage of the excuse.
A related issue concerns combining a free program with non-free code.
- Such a combination would inevitably be non-free; whichever freedoms
- are lacking for the non-free part would be lacking for the whole as
- well. To permit such combinations would open a hole big enough to sink
- a ship. Therefore, a crucial requirement for copyleft is to plug this
+ Such a combination would inevitably be non-free; whichever freedoms are
+ lacking for the non-free part would be lacking for the whole as well.
+ To permit such combinations would open a hole big enough to sink a
+ ship. Therefore, a crucial requirement for copyleft is to plug this
hole: anything added to or combined with a copylefted program must be
such that the larger combined version is also free and copylefted.
The specific implementation of copyleft that we use for most GNU
- software is the GNU General Public License, or GNU GPL for short. We
+ software is the GNU General Public License, or GNU GPL for short. We
have other kinds of copyleft that are used in specific circumstances.
GNU manuals are copylefted also, but use a much simpler kind of
copyleft, because the complexity of the GNU GPL is not necessary for
- manuals.
+ manuals.(2)
(1) In 1984 or 1985, Don Hopkins (a very imaginative fellow) mailed me
- a letter. On the envelope he had written several amusing sayings,
+ a letter. On the envelope he had written several amusing sayings,
including this one: "Copyleft--all rights reversed." I used the word
"copyleft" to name the distribution concept I was developing at the
time.
+ (2) We now use the GNU Free Documentation License for documentation.
+
The Free Software Foundation
- As interest in using Emacs was growing, other people became involved
- in the GNU project, and we decided that it was time to seek funding
- once again. So in 1985 we created the Free Software Foundation, a
- tax-exempt charity for free software development. The FSF also took
- over the Emacs tape distribution business; later it extended this by
- adding other free software (both GNU and non-GNU) to the tape, and by
- selling free manuals as well.
+ As interest in using Emacs was growing, other people became involved in
+ the GNU project, and we decided that it was time to seek funding once
+ again. So in 1985 we created the Free Software Foundation, a tax-exempt
+ charity for free software development. The FSF also took over the Emacs
+ tape distribution business; later it extended this by adding other free
+ software (both GNU and non-GNU) to the tape, and by selling free
+ manuals as well.
The FSF accepts donations, but most of its income has always come from
- sales--of copies of free software, and of other related services.
- Today it sells CD-ROMs of source code, CD-ROMs with binaries, nicely
- printed manuals (all with freedom to redistribute and modify), and
- Deluxe Distributions (where we build the whole collection of software
- for your choice of platform).
-
- Free Software Foundation employees have written and maintained a
- number of GNU software packages. Two notable ones are the C library
- and the shell. The GNU C library is what every program running on a
- GNU/Linux system uses to communicate with Linux. It was developed by a
- member of the Free Software Foundation staff, Roland McGrath. The
- shell used on most GNU/Linux systems is BASH, the Bourne Again
- Shell(1), which was developed by FSF employee Brian Fox.
-
- We funded development of these programs because the GNU project was
- not just about tools or a development environment. Our goal was a
- complete operating system, and these programs were needed for that
- goal.
+ sales--of copies of free software, and of other related services. Today
+ it sells CD-ROMs of source code, CD-ROMs with binaries, nicely printed
+ manuals (all with freedom to redistribute and modify), and Deluxe
+ Distributions (where we build the whole collection of software for your
+ choice of platform).
+
+ Free Software Foundation employees have written and maintained a number
+ of GNU software packages. Two notable ones are the C library and the
+ shell. The GNU C library is what every program running on a GNU/Linux
+ system uses to communicate with Linux. It was developed by a member of
+ the Free Software Foundation staff, Roland McGrath. The shell used on
+ most GNU/Linux systems is BASH, the Bourne Again Shell(1), which was
+ developed by FSF employee Brian Fox.
+
+ We funded development of these programs because the GNU project was not
+ just about tools or a development environment. Our goal was a complete
+ operating system, and these programs were needed for that goal.
(1) "Bourne again Shell" is a joke on the name ``Bourne Shell'', which
was the usual shell on Unix.
@@ -408,41 +405,41 @@
Free software support
The free software philosophy rejects a specific widespread business
- practice, but it is not against business. When businesses respect the
+ practice, but it is not against business. When businesses respect the
users' freedom, we wish them success.
Selling copies of Emacs demonstrates one kind of free software
- business. When the FSF took over that business, I needed another way
- to make a living. I found it in selling services relating to the free
- software I had developed. This included teaching, for subjects such as
+ business. When the FSF took over that business, I needed another way to
+ make a living. I found it in selling services relating to the free
+ software I had developed. This included teaching, for subjects such as
how to program GNU Emacs and how to customize GCC, and software
development, mostly porting GCC to new platforms.
Today each of these kinds of free software business is practiced by a
- number of corporations. Some distribute free software collections on
+ number of corporations. Some distribute free software collections on
CD-ROM; others sell support at levels ranging from answering user
- questions, to fixing bugs, to adding major new features. We are even
+ questions, to fixing bugs, to adding major new features. We are even
beginning to see free software companies based on launching new free
software products.
- Watch out, though--a number of companies that associate themselves
- with the term "open source" actually base their business on non-free
- software that works with free software. These are not free software
- companies, they are proprietary software companies whose products
- tempt users away from freedom. They call these "value added", which
- reflects the values they would like us to adopt: convenience above
- freedom. If we value freedom more, we should call them "freedom
- subtracted" products.
+ Watch out, though--a number of companies that associate themselves with
+ the term "open source" actually base their business on non-free
+ software that works with free software. These are not free software
+ companies, they are proprietary software companies whose products tempt
+ users away from freedom. They call these "value added", which reflects
+ the values they would like us to adopt: convenience above freedom. If
+ we value freedom more, we should call them "freedom subtracted"
+ products.
Technical goals
- The principal goal of GNU was to be free software. Even if GNU had no
+ The principal goal of GNU was to be free software. Even if GNU had no
technical advantage over Unix, it would have a social advantage,
allowing users to cooperate, and an ethical advantage, respecting the
user's freedom.
- But it was natural to apply the known standards of good practice to
- the work--for example, dynamically allocating data structures to avoid
+ But it was natural to apply the known standards of good practice to the
+ work--for example, dynamically allocating data structures to avoid
arbitrary fixed size limits, and handling all the possible 8-bit codes
wherever that made sense.
@@ -450,7 +447,7 @@
deciding not to support 16-bit machines (it was clear that 32-bit
machines would be the norm by the time the GNU system was finished),
and to make no effort to reduce memory usage unless it exceeded a
- megabyte. In programs for which handling very large files was not
+ megabyte. In programs for which handling very large files was not
crucial, we encouraged programmers to read an entire input file into
core, then scan its contents without having to worry about I/O.
@@ -460,193 +457,197 @@
Donated computers
As the GNU project's reputation grew, people began offering to donate
- machines running UNIX to the project. These were very useful, because
+ machines running UNIX to the project. These were very useful, because
the easiest way to develop components of GNU was to do it on a UNIX
- system, and replace the components of that system one by one. But they
+ system, and replace the components of that system one by one. But they
raised an ethical issue: whether it was right for us to have a copy of
UNIX at all.
UNIX was (and is) proprietary software, and the GNU project's
- philosophy said that we should not use proprietary software. But,
+ philosophy said that we should not use proprietary software. But,
applying the same reasoning that leads to the conclusion that violence
- in self defense is justified, I concluded that it was legitimate to
- use a proprietary package when that was crucial for developing free
+ in self defense is justified, I concluded that it was legitimate to use
+ a proprietary package when that was crucial for developing a free
replacement that would help others stop using the proprietary package.
- But, even if this was a justifiable evil, it was still an evil. Today
+ But, even if this was a justifiable evil, it was still an evil. Today
we no longer have any copies of Unix, because we have replaced them
- with free operating systems. If we could not replace a machine's
+ with free operating systems. If we could not replace a machine's
operating system with a free one, we replaced the machine instead.
The GNU Task List
As the GNU project proceeded, and increasing numbers of system
- components were found or developed, eventually it became useful to
- make a list of the remaining gaps. We used it to recruit developers to
- write the missing pieces. This list became known as the GNU task list.
- In addition to missing Unix components, we listed added various other
+ components were found or developed, eventually it became useful to make
+ a list of the remaining gaps. We used it to recruit developers to write
+ the missing pieces. This list became known as the GNU task list. In
+ addition to missing Unix components, we listed added various other
useful software and documentation projects that, we thought, a truly
complete system ought to have.
Today, hardly any Unix components are left in the GNU task list--those
- jobs have been done, aside from a few inessential ones. But the list
- is full of projects that some might call "applications". Any program
- that appeals to more than a narrow class of users would be a useful
- thing to add to an operating system.
+ jobs have been done, aside from a few inessential ones. But the list is
+ full of projects that some might call "applications". Any program that
+ appeals to more than a narrow class of users would be a useful thing to
+ add to an operating system.
Even games are included in the task list--and have been since the
- beginning. Unix included games, so naturally GNU should too. But
- compatibility was not an issue for games, so we did not follow the
- list of games that Unix had. Instead, we listed a spectrum of
- different kinds of games that users might like.
+ beginning. Unix included games, so naturally GNU should too. But
+ compatibility was not an issue for games, so we did not follow the list
+ of games that Unix had. Instead, we listed a spectrum of different
+ kinds of games that users might like.
The GNU Library GPL
The GNU C library uses a special kind of copyleft called the GNU
- Library General Public License, which gives permission to link
- proprietary software with the library. Why make this exception?
+ Library General Public License(1), which gives permission to link
+ proprietary software with the library. Why make this exception?
It is not a matter of principle; there is no principle that says
- proprietary software products are entitled to include our code. (Why
- contribute to a project predicated on refusing to share with us?)
- Using the LGPL for the C library, or for any library, is a matter of
+ proprietary software products are entitled to include our code. (Why
+ contribute to a project predicated on refusing to share with us?) Using
+ the LGPL for the C library, or for any library, is a matter of
strategy.
The C library does a generic job; every proprietary system or compiler
- comes with a C library. Therefore, to make our C library available
- only to free software would not have given free software any
- advantage--it would only have discouraged use of our library.
+ comes with a C library. Therefore, to make our C library available only
+ to free software would not have given free software any advantage--it
+ would only have discouraged use of our library.
One system is an exception to this: on the GNU system (and this
- includes GNU/Linux), the GNU C library is the only C library. So the
+ includes GNU/Linux), the GNU C library is the only C library. So the
distribution terms of the GNU C library determine whether it is
- possible to compile a proprietary program for the GNU system. There is
+ possible to compile a proprietary program for the GNU system. There is
no ethical reason to allow proprietary applications on the GNU system,
but strategically it seems that disallowing them would do more to
discourage use of the GNU system than to encourage development of free
applications.
- That is why using the Library GPL is a good strategy for the C
- library. For other libraries, the strategic decision needs to be
- considered on a case-by-case basis. When a library does a special job
- that can help write certain kinds of programs, then releasing it under
- the GPL, limiting it to free programs only, is a way of helping other
- free software developers, giving them an advantage against proprietary
+ That is why using the Library GPL is a good strategy for the C library.
+ For other libraries, the strategic decision needs to be considered on a
+ case-by-case basis. When a library does a special job that can help
+ write certain kinds of programs, then releasing it under the GPL,
+ limiting it to free programs only, is a way of helping other free
+ software developers, giving them an advantage against proprietary
software.
Consider GNU Readline, a library that was developed to provide
- command-line editing for BASH. Readline is released under the ordinary
- GNU GPL, not the Library GPL. This probably does reduce the amount
- Readline is used, but that is no loss for us. Meanwhile, at least one
- useful application has been made free software specifically so it
- could use Readline, and that is a real gain for the community.
+ command-line editing for BASH. Readline is released under the ordinary
+ GNU GPL, not the Library GPL. This probably does reduce the amount
+ Readline is used, but that is no loss for us. Meanwhile, at least one
+ useful application has been made free software specifically so it could
+ use Readline, and that is a real gain for the community.
Proprietary software developers have the advantages money provides;
- free software developers need to make advantages for each other. I
- hope some day we will have a large collection of GPL-covered libraries
- that have no parallel available to proprietary software, providing
- useful modules to serve as building blocks in new free software, and
- adding up to a major advantage for further free software development.
+ free software developers need to make advantages for each other. I hope
+ some day we will have a large collection of GPL-covered libraries that
+ have no parallel available to proprietary software, providing useful
+ modules to serve as building blocks in new free software, and adding up
+ to a major advantage for further free software development.
+
+ (1) This license is now called the GNU Lesser General Public License,
+ to avoid giving the idea that all libraries ought to use it.
+ See http://www.gnu.org/philosophy/why-not-lgpl.html.
Scratching an itch?
Eric Raymond says that "Every good work of software starts by
- scratching a developer's personal itch." Maybe that happens sometimes,
+ scratching a developer's personal itch." Maybe that happens sometimes,
but many essential pieces of GNU software were developed in order to
- have a complete free operating system. They come from a vision and a
+ have a complete free operating system. They come from a vision and a
plan, not from impulse.
For example, we developed the GNU C library because a Unix-like system
needs a C library, the Bourne-Again Shell (bash) because a Unix-like
system needs a shell, and GNU tar because a Unix-like system needs a
- tar program. The same is true for my own programs--the GNU C compiler,
+ tar program. The same is true for my own programs--the GNU C compiler,
GNU Emacs, GDB and GNU Make.
Some GNU programs were developed to cope with specific threats to our
- freedom. Thus, we developed gzip to replace the Compress program,
- which had been lost to the community because of the LZW patents. We
- found people to develop LessTif, and more recently started GNOME and
- Harmony, to address the problems caused by certain proprietary
- libraries (see below). We are developing the GNU Privacy Guard to
- replace popular non-free encryption software, because users should not
- have to choose between privacy and freedom.
+ freedom. Thus, we developed gzip to replace the Compress program, which
+ had been lost to the community because of the LZW patents. We found
+ people to develop LessTif, and more recently started GNOME and Harmony,
+ to address the problems caused by certain proprietary libraries (see
+ below). We are developing the GNU Privacy Guard to replace popular
+ non-free encryption software, because users should not have to choose
+ between privacy and freedom.
Of course, the people writing these programs became interested in the
work, and many features were added to them by various people for the
- sake of their own needs and interests. But that is not why the
- programs exist.
+ sake of their own needs and interests. But that is not why the programs
+ exist.
Unexpected developments
At the beginning of the GNU project, I imagined that we would develop
- the whole GNU system, then release it as a whole. That is not how it
+ the whole GNU system, then release it as a whole. That is not how it
happened.
Since each component of the GNU system was implemented on a Unix
system, each component could run on Unix systems, long before a
- complete GNU system existed. Some of these programs became popular,
- and users began extending them and porting them---to the various
+ complete GNU system existed. Some of these programs became popular, and
+ users began extending them and porting them---to the various
incompatible versions of Unix, and sometimes to other systems as well.
The process made these programs much more powerful, and attracted both
- funds and contributors to the GNU project. But it probably also
- delayed completion of a minimal working system by several years, as
- GNU developers' time was put into maintaining these ports and adding
- features to the existing components, rather than moving on to write
- one missing component after another.
+ funds and contributors to the GNU project. But it probably also delayed
+ completion of a minimal working system by several years, as GNU
+ developers' time was put into maintaining these ports and adding
+ features to the existing components, rather than moving on to write one
+ missing component after another.
The GNU Hurd
By 1990, the GNU system was almost complete; the only major missing
- component was the kernel. We had decided to implement our kernel as a
- collection of server processes running on top of Mach. Mach is a
+ component was the kernel. We had decided to implement our kernel as a
+ collection of server processes running on top of Mach. Mach is a
microkernel developed at Carnegie Mellon University and then at the
University of Utah; the GNU HURD is a collection of servers (or ``herd
- of gnus'') that run on top of Mach, and do the various jobs of the
- Unix kernel. The start of development was delayed as we waited for
- Mach to be released as free software, as had been promised.
+ of gnus'') that run on top of Mach, and do the various jobs of the Unix
+ kernel. The start of development was delayed as we waited for Mach to
+ be released as free software, as had been promised.
One reason for choosing this design was to avoid what seemed to be the
hardest part of the job: debugging a kernel program without a
- source-level debugger to do it with. This part of the job had been
- done already, in Mach, and we expected to debug the HURD servers as
- user programs, with GDB. But it took a long time to make that
- possible, and the multi-threaded servers that send messages to each
- other have turned out to be very hard to debug. Making the HURD work
- solidly has stretched on for many years.
+ source-level debugger to do it with. This part of the job had been done
+ already, in Mach, and we expected to debug the HURD servers as user
+ programs, with GDB. But it took a long time to make that possible, and
+ the multi-threaded servers that send messages to each other have turned
+ out to be very hard to debug. Making the HURD work solidly has
+ stretched on for many years.
Alix
- The GNU kernel was not originally supposed to be called the HURD. Its
+ The GNU kernel was not originally supposed to be called the HURD. Its
original name was Alix--named after the woman who was my sweetheart at
- the time. She, a Unix system administrator, had pointed out how her
+ the time. She, a Unix system administrator, had pointed out how her
name would fit a common naming pattern for Unix system versions; as a
- joke, she told her friends, "Someone should name a kernel after me." I
+ joke, she told her friends, "Someone should name a kernel after me." I
said nothing, but decided to surprise her with a kernel named Alix.
- It did not stay that way. Michael Bushnell (now Thomas), the main
- developer of the kernel, preferred the name HURD, and redefined Alix
- to refer to a certain part of the kernel--the part that would trap
- system calls and handle them by sending messages to HURD servers.
+ It did not stay that way. Michael Bushnell (now Thomas), the main
+ developer of the kernel, preferred the name HURD, and redefined Alix to
+ refer to a certain part of the kernel--the part that would trap system
+ calls and handle them by sending messages to HURD servers.
Ultimately, Alix and I broke up, and she changed her name;
independently, the HURD design was changed so that the C library would
send messages directly to servers, and this made the Alix component
disappear from the design.
- But before these things happened, a friend of hers came across the
- name Alix in the HURD source code, and mentioned the name to her. So
- the name did its job.
+ But before these things happened, a friend of hers came across the name
+ Alix in the HURD source code, and mentioned the name to her. So the
+ name did its job.
Linux and GNU/Linux
- The GNU Hurd is not ready for production use. Fortunately, another
- kernel is available. In 1991, Linus Torvalds developed a
- Unix-compatible kernel and called it Linux. Around 1992, combining
+ The GNU Hurd is not ready for production use. Fortunately, another
+ kernel is available. In 1991, Linus Torvalds developed a
+ Unix-compatible kernel and called it Linux. Around 1992, combining
Linux with the not-quite-complete GNU system resulted in a complete
- free operating system. (Combining them was a substantial job in
- itself, of course.) It is due to Linux that we can actually run a
- version of the GNU system today.
+ free operating system. (Combining them was a substantial job in itself,
+ of course.) It is due to Linux that we can actually run a version of
+ the GNU system today.
We call this system version GNU/Linux, to express its composition as a
combination of the GNU system with Linux as the kernel.
@@ -654,89 +655,86 @@
Challenges in our future
We have proved our ability to develop a broad spectrum of free
- software. This does not mean we are invincible and unstoppable.
- Several challenges make the future of free software uncertain; meeting
- them will require steadfast effort and endurance, sometimes lasting
- for years. It will require the kind of determination that people
- display when they value their freedom and will not let anyone take it
- away.
+ software. This does not mean we are invincible and unstoppable. Several
+ challenges make the future of free software uncertain; meeting them
+ will require steadfast effort and endurance, sometimes lasting for
+ years. It will require the kind of determination that people display
+ when they value their freedom and will not let anyone take it away.
The following four sections discuss these challenges.
Secret hardware
Hardware manufacturers increasingly tend to keep hardware
- specifications secret. This makes it difficult to write free drivers
- so that Linux and XFree86 can support new hardware. We have complete
- free systems today, but we will not have them tomorrow if we cannot
- support tomorrow's computers.
-
- There are two ways to cope with this problem. Programmers can do
- reverse engineering to figure out how to support the hardware. The
- rest of us can choose the hardware that is supported by free software;
- as our numbers increase, secrecy of specifications will become a
+ specifications secret. This makes it difficult to write free drivers so
+ that Linux and XFree86 can support new hardware. We have complete free
+ systems today, but we will not have them tomorrow if we cannot support
+ tomorrow's computers.
+
+ There are two ways to cope with this problem. Programmers can do
+ reverse engineering to figure out how to support the hardware. The rest
+ of us can choose the hardware that is supported by free software; as
+ our numbers increase, secrecy of specifications will become a
self-defeating policy.
Reverse engineering is a big job; will we have programmers with
sufficient determination to undertake it? Yes--if we have built up a
strong feeling that free software is a matter of principle, and
- non-free drivers are intolerable. And will large numbers of us spend
+ non-free drivers are intolerable. And will large numbers of us spend
extra money, or even a little extra time, so we can use free drivers?
Yes, if the determination to have freedom is widespread.
Non-free libraries
A non-free library that runs on free operating systems acts as a trap
- for free software developers. The library's attractive features are
- the bait; if you use the library, you fall into the trap, because your
- program cannot usefully be part of a free operating system. (Strictly
+ for free software developers. The library's attractive features are the
+ bait; if you use the library, you fall into the trap, because your
+ program cannot usefully be part of a free operating system. (Strictly
speaking, we could include your program, but it won't run with the
library missing.) Even worse, if a program that uses the proprietary
library becomes popular, it can lure other unsuspecting programmers
into the trap.
The first instance of this problem was the Motif toolkit, back in the
- 80s. Although there were as yet no free operating systems, it was
- clear what problem Motif would cause for them later on. The GNU
- Project responded in two ways: by asking individual free software
- projects to support the free X toolkit widgets as well as Motif, and
- by asking for someone to write a free replacement for Motif. The job
- took many years; LessTif, developed by the Hungry Programmers, became
- powerful enough to support most Motif applications only in 1997.
-
- Between 1996 and 1998, another non-free GUI toolkit library, called
- Qt, was used in a substantial collection of free software, the desktop
- KDE.
-
- Free GNU/Linux systems were unable to use KDE, because we could not
- use the library. However, some commercial distributors of GNU/Linux
- systems who were not strict about sticking with free software added
- KDE to their systems--producing a system with more capabilities, but
- less freedom. The KDE group was actively encouraging more programmers
- to use Qt, and millions of new "Linux users" had never been exposed to
- the idea that there was a problem in this. The situation appeared
- grim.
-
- The free software community responded to the problem in two ways:
- GNOME and Harmony.
+ 80s. Although there were as yet no free operating systems, it was clear
+ what problem Motif would cause for them later on. The GNU Project
+ responded in two ways: by asking individual free software projects to
+ support the free X toolkit widgets as well as Motif, and by asking for
+ someone to write a free replacement for Motif. The job took many years;
+ LessTif, developed by the Hungry Programmers, became powerful enough to
+ support most Motif applications only in 1997.
+
+ Between 1996 and 1998, another non-free GUI toolkit library, called Qt,
+ was used in a substantial collection of free software, the desktop KDE.
+
+ Free GNU/Linux systems were unable to use KDE, because we could not use
+ the library. However, some commercial distributors of GNU/Linux systems
+ who were not strict about sticking with free software added KDE to
+ their systems--producing a system with more capabilities, but less
+ freedom. The KDE group was actively encouraging more programmers to use
+ Qt, and millions of new "Linux users" had never been exposed to the
+ idea that there was a problem in this. The situation appeared grim.
+
+ The free software community responded to the problem in two ways: GNOME
+ and Harmony.
GNOME, the GNU Network Object Model Environment, is GNU's desktop
- project. Started in 1997 by Miguel de Icaza, and developed with the
+ project. Started in 1997 by Miguel de Icaza, and developed with the
support of Red Hat Software, GNOME set out to provide similar desktop
- facilities, but using free software exclusively. It has technical
- advantages as well, such as supporting a variety of languages, not
- just C++. But its main purpose was freedom: not to require the use of
- any non-free software.
+ facilities, but using free software exclusively. It has technical
+ advantages as well, such as supporting a variety of languages, not just
+ C++. But its main purpose was freedom: not to require the use of any
+ non-free software.
Harmony is a compatible replacement library, designed to make it
possible to run KDE software without using Qt.
In November 1998, the developers of Qt announced a change of license
- which, when carried out, should make Qt free software. There is no way
+ which, when carried out, should make Qt free software. There is no way
to be sure, but I think that this was partly due to the community's
- firm response to the problem that Qt posed when it was non-free. (The
- new license is inconvenient and inequitable, so it remains desirable
- to avoid using Qt.)
+ firm response to the problem that Qt posed when it was non-free. (The
+ new license is inconvenient and inequitable, so it remains desirable to
+ avoid using Qt.)
[Subsequent note: in September 2000, Qt was rereleased under the GNU
GPL, which essentially solved this problem.]
@@ -750,80 +748,82 @@
The worst threat we face comes from software patents, which can put
algorithms and features off limits to free software for up to twenty
- years. The LZW compression algorithm patents were applied for in 1983,
+ years. The LZW compression algorithm patents were applied for in 1983,
and we still cannot release free software to produce proper compressed
- GIFs. In 1998, a free program to produce MP3 compressed audio was
+ GIFs. In 1998, a free program to produce MP3 compressed audio was
removed from distribution under threat of a patent suit.
There are ways to cope with patents: we can search for evidence that a
patent is invalid, and we can look for alternative ways to do a job.
But each of these methods works only sometimes; when both fail, a
patent may force all free software to lack some feature that users
- want. What will we do when this happens?
+ want. What will we do when this happens?
Those of us who value free software for freedom's sake will stay with
- free software anyway. We will manage to get work done without the
- patented features. But those who value free software because they
+ free software anyway. We will manage to get work done without the
+ patented features. But those who value free software because they
expect it to be techically superior are likely to call it a failure
- when a patent holds it back. Thus, while it is useful to talk about
- the practical effectiveness of the "cathedral" model of development,
+ when a patent holds it back. Thus, while it is useful to talk about the
+ practical effectiveness of the "cathedral" model of development (1),
and the reliability and power of some free software, we must not stop
- there. We must talk about freedom and principle.
+ there. We must talk about freedom and principle.
+
+ (1) It would have been clearer to write `of the "bazaar" model', since
+ that was the alternative that was new and initially controversial.
Free documentation
The biggest deficiency in our free operating systems is not in the
software--it is the lack of good free manuals that we can include in
- our systems. Documentation is an essential part of any software
+ our systems. Documentation is an essential part of any software
package; when an important free software package does not come with a
- good free manual, that is a major gap. We have many such gaps today.
+ good free manual, that is a major gap. We have many such gaps today.
Free documentation, like free software, is a matter of freedom, not
- price. The criterion for a free manual is pretty much the same as for
+ price. The criterion for a free manual is pretty much the same as for
free software: it is a matter of giving all users certain freedoms.
Redistribution (including commercial sale) must be permitted, on-line
and on paper, so that the manual can accompany every copy of the
program.
- Permission for modification is crucial too. As a general rule, I don't
+ Permission for modification is crucial too. As a general rule, I don't
believe that it is essential for people to have permission to modify
- all sorts of articles and books. For example, I don't think you or I
+ all sorts of articles and books. For example, I don't think you or I
are obliged to give permission to modify articles like this one, which
describe our actions and our views.
But there is a particular reason why the freedom to modify is crucial
- for documentation for free software. When people exercise their right
+ for documentation for free software. When people exercise their right
to modify the software, and add or change its features, if they are
conscientious they will change the manual too--so they can provide
- accurate and usable documentation with the modified program. A manual
+ accurate and usable documentation with the modified program. A manual
which does not allow programmers to be conscientious and finish the
job, does not fill our community's needs.
- Some kinds of limits on how modifications are done pose no problem.
- For example, requirements to preserve the original author's copyright
- notice, the distribution terms, or the list of authors, are ok. It is
+ Some kinds of limits on how modifications are done pose no problem. For
+ example, requirements to preserve the original author's copyright
+ notice, the distribution terms, or the list of authors, are ok. It is
also no problem to require modified versions to include notice that
they were modified, even to have entire sections that may not be
deleted or changed, as long as these sections deal with nontechnical
- topics. These kinds of restrictions are not a problem because they
- don't stop the conscientious programmer from adapting the manual to
- fit the modified program. In other words, they don't block the free
+ topics. These kinds of restrictions are not a problem because they
+ don't stop the conscientious programmer from adapting the manual to fit
+ the modified program. In other words, they don't block the free
software community from making full use of the manual.
However, it must be possible to modify all the *technical* content of
the manual, and then distribute the result in all the usual media,
- through all the usual channels; otherwise, the restrictions do
- obstruct the community, the manual is not free, and we need another
- manual.
+ through all the usual channels; otherwise, the restrictions do obstruct
+ the community, the manual is not free, and we need another manual.
Will free software developers have the awareness and determination to
- produce a full spectrum of free manuals? Once again, our future
- depends on philosophy.
+ produce a full spectrum of free manuals? Once again, our future depends
+ on philosophy.
We must talk about freedom
Estimates today are that there are ten million users of GNU/Linux
- systems such as Debian GNU/Linux and Red Hat Linux. Free software has
+ systems such as Debian GNU/Linux and Red Hat Linux. Free software has
developed such practical advantages that users are flocking to it for
purely practical reasons.
@@ -833,15 +833,15 @@
instead of proprietary software products.
But interest in the software is growing faster than awareness of the
- philosophy it is based on, and this leads to trouble. Our ability to
+ philosophy it is based on, and this leads to trouble. Our ability to
meet the challenges and threats described above depends on the will to
- stand firm for freedom. To make sure our community has this will, we
+ stand firm for freedom. To make sure our community has this will, we
need to spread the idea to the new users as they come into the
community.
But we are failing to do so: the efforts to attract new users into our
community are far outstripping the efforts to teach them the civics of
- our community. We need to do both, and we need to keep the two efforts
+ our community. We need to do both, and we need to keep the two efforts
in balance.
"Open Source"
@@ -851,50 +851,50 @@
and say "open source software" instead.
Some who favored this term aimed to avoid the confusion of "free" with
- "gratis"--a valid goal. Others, however, aimed to set aside the spirit
+ "gratis"--a valid goal. Others, however, aimed to set aside the spirit
of principle that had motivated the free software movement and the GNU
project, and to appeal instead to executives and business users, many
of whom hold an ideology that places profit above freedom, above
- community, above principle. Thus, the rhetoric of "open source"
- focuses on the potential to make high quality, powerful software, but
- shuns the ideas of freedom, community, and principle.
+ community, above principle. Thus, the rhetoric of "open source" focuses
+ on the potential to make high quality, powerful software, but shuns the
+ ideas of freedom, community, and principle.
- The "Linux" magazines are a clear example of this--they are filled
- with advertisements for proprietary software that works with
- GNU/Linux. When the next Motif or Qt appears, will these magazines
- warn programmers to stay away from it, or will they run ads for it?
+ The "Linux" magazines are a clear example of this--they are filled with
+ advertisements for proprietary software that works with GNU/Linux. When
+ the next Motif or Qt appears, will these magazines warn programmers to
+ stay away from it, or will they run ads for it?
The support of business can contribute to the community in many ways;
- all else being equal, it is useful. But winning their support by
+ all else being equal, it is useful. But winning their support by
speaking even less about freedom and principle can be disastrous; it
- makes the previous imbalance between outreach and civics education
- even worse.
+ makes the previous imbalance between outreach and civics education even
+ worse.
"Free software" and "open source" describe the same category of
software, more or less, but say different things about the software,
- and about values. The GNU Project continues to use the term "free
+ and about values. The GNU Project continues to use the term "free
software", to express the idea that freedom, not just technology, is
important.
Try!
Yoda's philosophy ("There is no `try'") sounds neat, but it doesn't
- work for me. I have done most of my work while anxious about whether I
+ work for me. I have done most of my work while anxious about whether I
could do the job, and unsure that it would be enough to achieve the
- goal if I did. But I tried anyway, because there was no one but me
- between the enemy and my city. Surprising myself, I have sometimes
+ goal if I did. But I tried anyway, because there was no one but me
+ between the enemy and my city. Surprising myself, I have sometimes
succeeded.
- Sometimes I failed; some of my cities have fallen. Then I found
- another threatened city, and got ready for another battle. Over time,
- I've learned to look for threats and put myself between them and my
- city, calling on other hackers to come and join me.
+ Sometimes I failed; some of my cities have fallen. Then I found another
+ threatened city, and got ready for another battle. Over time, I've
+ learned to look for threats and put myself between them and my city,
+ calling on other hackers to come and join me.
- Nowadays, often I'm not the only one. It is a relief and a joy when I
+ Nowadays, often I'm not the only one. It is a relief and a joy when I
see a regiment of hackers digging in to hold the line, and I realize,
- this city may survive--for now. But the dangers are greater each year,
- and now Microsoft has explicitly targeted our community. We can't take
- the future of freedom for granted. Don't take it for granted! If you
+ this city may survive--for now. But the dangers are greater each year,
+ and now Microsoft has explicitly targeted our community. We can't take
+ the future of freedom for granted. Don't take it for granted! If you
want to keep your freedom, you must be prepared to defend it.
Copyright (C) 1998 Richard Stallman
diff --git a/leim/COPYING b/leim/COPYING
index 3912109b5cd..d511905c164 100644
--- a/leim/COPYING
+++ b/leim/COPYING
@@ -1,8 +1,8 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
-
+
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
-
+
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
-
+
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
-
+
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
-
+
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
@@ -303,10 +303,9 @@ the "copyright" line and a pointer to where the full notice is found.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
diff --git a/leim/ChangeLog b/leim/ChangeLog
index 677b107b95e..86227586f7e 100644
--- a/leim/ChangeLog
+++ b/leim/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-15 Jay Belanger <belanger@truman.edu>
+
+ * COPYING: Replace "Library Public License" by "Lesser Public
+ License" throughout.
+
2006-09-06 Micha,Ak(Bl Cadilhac <michael.cadilhac@lrde.org>
* quail/uni-input.el (ucs-input-method): Don't make the action of
diff --git a/lib-src/COPYING b/lib-src/COPYING
index 3912109b5cd..d511905c164 100644
--- a/lib-src/COPYING
+++ b/lib-src/COPYING
@@ -1,8 +1,8 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
-
+
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
-
+
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
-
+
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
-
+
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
-
+
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
@@ -303,10 +303,9 @@ the "copyright" line and a pointer to where the full notice is found.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog
index 3328f010846..c6ca6132d0f 100644
--- a/lib-src/ChangeLog
+++ b/lib-src/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-15 Jay Belanger <belanger@truman.edu>
+
+ * COPYING: Replace "Library Public License" by "Lesser Public
+ License" throughout.
+
2006-08-09 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* etags.c (readline): expect sscanf returns >= 1.
diff --git a/lisp/COPYING b/lisp/COPYING
index 3912109b5cd..d511905c164 100644
--- a/lisp/COPYING
+++ b/lisp/COPYING
@@ -1,8 +1,8 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
-
+
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
-
+
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
-
+
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
-
+
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
-
+
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
@@ -303,10 +303,9 @@ the "copyright" line and a pointer to where the full notice is found.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index bddec33941c..42ef944476b 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,17 +1,374 @@
+2006-09-20 David Kastrup <dak@gnu.org>
+
+ * mouse.el (mouse-posn-property): Improve doc string.
+ (mouse-on-link-p): Change buffers for function calls on links.
+
+ * menu-bar.el (clipboard-yank): bomb out in interactive use if
+ buffer is read-only.
+
+2006-09-18 Ken Manheimer <ken.manheimer@gmail.com>
+
+ * allout.el (allout-unprotected): Let inhibit-read-only only when
+ buffer-read-only isn't set.
+ (allout-annotate-hidden): Enable topic annotation during copies even
+ when the buffer is read-only, eg for topic copies. Ensure that the loop
+ advances, even when the span extends beyond the deletion region.
+ (allout-toggle-subtree-encryption): Use allout-structure-added-hook
+ rather than allout-exposure-changed-hook, as a stronger assertion.
+ (allout-keybindings-list): Add bindings for
+ allout-copy-line-as-kill and allout-copy-topic-as-kill.
+ (allout-copy-line-as-kill, allout-copy-topic-as-kill): copy
+ wrappers for allout-kill-line and allout-kill-topic.
+ (allout-listify-exposed): Position correctly to accumulate lines.
+
+2006-09-19 Chong Yidong <cyd@stupidchicken.com>
+
+ * simple.el (line-move-1): Escape field boundaries occurring
+ exactly at point. Update goal column if constrained to a field.
+ (line-move-finish): Escape field boundaries occurring exactly at
+ point.
+
+2006-09-19 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * mouse.el (mouse-on-link-p): Tentatively fix last change.
+ (mouse-drag-vertical-line): Remove unused var `wconfig'.
+
+2006-09-19 Kim F. Storm <storm@cua.dk>
+
+ * help.el (describe-key-briefly, describe-key): Simplify printing
+ of descriptions by using format and %S. Fix "is undefined"
+ messages to say "at that spot" for mouse events.
+
+ * simple.el (line-move-partial): Optimize. Try window-line-height
+ before posn-at-point to get vpos of current line.
+
+2006-09-18 Michael Kifer <kifer@cs.stonybrook.edu>
+
+ * viper.el: Bump up version/date of update to reflect the substantial
+ changes done in August 2006.
+
+ * viper-cmd (viper-next-line-at-bol): Make sure button-at, push-button
+ are defined.
+
+ * ediff-util.el (ediff-add-to-history): New function.
+
+ * ediff.el: Use ediff-add-to-history instead of add-to-history.
+
+2006-09-18 Wolfgang Jenkner <wjenkner@inode.at> (tiny change)
+
+ * textmodes/conf-mode.el (conf-space-mode): Doc fix.
+ Delete duplicate make-local-variable form.
+ (conf-space-keywords): Add autoload cookie.
+ Fix typo (`keywords', not `keyword').
+
+2006-09-18 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
+
+ * cus-start.el (all): Rename x-gtk-show-chooser-help-text to
+ x-gtk-file-dialog-help-text. Rename x-use-old-gtk-file-dialog
+ to x-gtk-use-old-file-dialog
+
+2006-09-18 Richard Stallman <rms@gnu.org>
+
+ * wid-edit.el (widget-button-click): Handle non-mouse-motion events
+ that might come in during mouse tracking.
+
+2006-09-18 Kim F. Storm <storm@cua.dk>
+
+ * simple.el (line-move-partial): Rework 2006-09-15 change to use
+ new window-line-height function. Further optimize by not calling
+ pos-visible-in-window-p for window-end when window-line-height
+ returns useful information.
+
+2006-09-16 Richard Stallman <rms@gnu.org>
+
+ * textmodes/conf-mode.el (conf-mode-map): Use conf-space-keywords cmd.
+ (conf-space-mode): Don't handle prefix arg.
+ Delete conf-space-keywords-override code.
+ Use add-hook.
+ (conf-space-keywords): New command.
+ (conf-space-mode-internal): Be careful with imenu-generic-expression.
+ Delete conf-space-keywords-override code.
+ (conf-space-keywords-alist): Doc fix.
+ (conf-space-font-lock-keywords): Doc fix.
+ (conf-space-keywords-override): Var deleted.
+
+2006-09-16 Chong Yidong <cyd@stupidchicken.com>
+
+ * startup.el (fancy-splash-screens): Don't switch to the scratch
+ buffer; it may not be the next buffer.
+
+2006-09-16 Romain Francoise <romain@orebokech.com>
+
+ * saveplace.el (load-save-place-alist-from-file): Use expanded name
+ in both messages.
+
+2006-09-16 Slawomir Nowaczyk <slawomir.nowaczyk.847@student.lu.se>
+
+ * progmodes/python.el (python-preoutput-filter):
+ Fix arg order to string-match.
+
+2006-09-16 Richard Stallman <rms@gnu.org>
+
+ * obsolete/fast-lock.el (fast-lock-cache-data): Provide 2nd arg to
+ font-lock-compile-keywords.
+
+ * font-lock.el (font-lock-compile-keywords): Rename optional arg
+ to SYNTACTIC-KEYWORDS and reverse the sense. All callers changed.
+
+2006-09-16 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
+
+ * cus-start.el (all): Add x-gtk-show-chooser-help-text.
+
+ * select.el (xselect-convert-to-string): If UTF8_STRING is requested
+ and the data doesn't look like UTF8, send STRING instead.
+
+2006-09-16 Agustin Martin <agustin.martin@hispalinux.es>
+
+ * textmodes/flyspell.el (flyspell-check-region-doublons):
+ New function to detect duplicated words.
+ (flyspell-large-region): Use it.
+
+2006-09-16 Chong Yidong <cyd@stupidchicken.com>
+
+ * simple.el (line-move-to-column): Revert 2006-08-03 change.
+
+2006-09-16 Eli Zaretskii <eliz@gnu.org>
+
+ * help.el (describe-prefix-bindings): Use let, not let*.
+
+2006-09-16 Ken Manheimer <ken.manheimer@gmail.com>
+
+ * allout.el (allout-regexp, allout-line-boundary-regexp)
+ (allout-bob-regexp): Correct grouping and boundaries to fix
+ backwards traversal.
+ (allout-depth-specific-regexp, allout-depth-one-regexp):
+ New versions that exploit \\{M\\} regexp syntax, to avoid geometric or
+ worse time in allout-ascend.
+ (allout-doublecheck-at-and-shallower): Identify depth threshold
+ below which topics are checked for and disqualified by containment
+ discontinuities.
+ (allout-hotspot-key-handler): Correctly handle multiple-key
+ strokes. Remove some unused variables.
+ (allout-mode-leaders): Clarify that mode-specific comment-start
+ will be used.
+ (set-allout-regexp): Correctly regexp-quote allout regexps to
+ properly accept alternative header-leads and primary bullets with
+ regexp-specific characters (eg, C "/*", mathematica "(*").
+ Include new regular expressions among those configured.
+ (allout-infer-header-lead-and-primary-bullet):
+ Rename allout-infer-header-lead.
+ (allout-recent-depth): Manifest as a variable as well as a function.
+ (allout-prefix-data): Simplify into an inline instead of a macro,
+ assuming current match data rather than being explicitly passed
+ it. Establish allout-recent-depth value as well as
+ allout-recent-prefix-beginning and allout-recent-prefix-end.
+ (allout-aberrant-container-p): True when an item's immediate
+ offspring discontinuously contained. Useful for disqualifying
+ unintended topic prefixes, likely at low depths.
+ (allout-goto-prefix-doublechecked): Elaborate version of
+ allout-goto-prefix which disqualifies aberrant pseudo-items.
+ (allout-pre-next-prefix): Layer on top of lower-level routines, to
+ get disqualification of aberrant containers.
+ (allout-end-of-prefix, allout-end-of-subtree): Disqualify aberrant
+ containers.
+ (allout-beginning-of-current-entry): Position at start of buffer
+ when in container (depth 0) entry.
+ (nullify-allout-prefix-data): Invalidate allout-recent-* prefix data.
+ (allout-current-bullet): Strip text properties.
+ (allout-get-prefix-bullet): Use right match groups.
+ (allout-beginning-of-line, allout-next-heading):
+ Disqualify aberrant containers.
+ (allout-previous-heading): Disqualify aberrant containers, and
+ change to regular (rather than inline) function, to allow
+ self-recursion.
+ (allout-get-invisibility-overlay): Increment so progress is made
+ when the first overlay is not the sought one.
+ (allout-end-of-prefix): Disqualify aberrant containers.
+ (allout-end-of-line): Cycle something like allout-beginning-of-line.
+ (allout-mode): Make allout-old-style-prefixes (ie, enabling use with
+ outline.el outlines) functional again. Change the primary bullet
+ along with the header-lead - level 1 new-style bullets now work.
+ Engage allout-before-change-handler in mainline emacs, not just
+ xemacs, to do undo handling.
+ (allout-before-change-handler): Expose undo changes occurring in
+ hidden regions. Use allout-get-invisibility-overlay instead of
+ reimplementing it inline.
+ (allout-chart-subtree): Use start rather than end of prefix in
+ charts. Use allout-recent-depth variable.
+ (allout-chart-siblings): Disqualify aberrant topics.
+ (allout-beginning-of-current-entry): Position correctly.
+ (allout-ascend): Use new allout-depth-specific-regexp and
+ allout-depth-one-regexp for linear instead of O(N^2) or worse
+ behavior.
+ (allout-ascend-to-depth): Depend on allout-ascend, rather than
+ reimplementing an algorithm.
+ (allout-up-current-level): Depend on allout-ascend, rather than
+ reimplementing an algorithm. Return to start-point if we fail.
+ (allout-descend-to-depth): Use allout-recent-depth variable
+ instead of function.
+ (allout-next-sibling): On traversal of numerous intervening
+ topics, resort to economical allout-next-sibling-leap.
+ (allout-next-sibling-leap): Specialized version of
+ allout-next-sibling that uses allout-ascend cleverly, to depend on
+ a regexp search to leap large numbers of contained topics, rather
+ than arbitrarily many one-by-one traversals.
+ (allout-next-visible-heading): Disqualify aberrant topics.
+ (allout-previous-visible-heading): Position consistently when
+ interactive.
+ (allout-forward-current-level): Base on allout-previous-sibling
+ rather than (differently) reimplmenting the algorithm. Remove some
+ unused variables.
+ (allout-solicit-alternate-bullet): Present default choice stripped
+ of text properties.
+ (allout-rebullet-heading): Use bullet stripped of text properties.
+ Register changes using allout-exposure-change-hook.
+ Disregard aberrant topics.
+ (allout-shift-in): With universal-argument, make topic a peer of
+ it's former offspring. Simplify the code by separating out
+ allout-shift-out functionality.
+ (allout-shift-out): With universal-argument, make offspring peers
+ of their former container, and its siblings. Implement the
+ functionality here, rather than inappropriately muddling the
+ implementation of allout-shift-in.
+ (allout-rebullet-topic): Respect additional argument for new
+ parent-child separation function.
+ (allout-yank-processing): Use allout-ascend directly.
+ (allout-show-entry): Disqualify aberrant topics.
+ (allout-show-children): Handle discontinuous children gracefully,
+ extending the depth being revealed to expose them and posting a
+ message indicating the situation.
+ (allout-show-to-offshoot): Remove obsolete and incorrect comment.
+ Leave cursor in correct position.
+ (allout-hide-current-subtree): Use allout-ascend directly.
+ Disqualify aberrant topics.
+ (allout-kill-line, allout-kill-topic): Preserve exposure layout in
+ a way that the yanks can restore it, as used to happen.
+ (allout-yank-processing): Restore exposure layout as recorded by
+ allout-kill-*, as used to happen.
+ (allout-annotate-hidden, allout-hide-by-annotation): New routines
+ for preseving and restoring exposure layout across kills.
+ (allout-toggle-subtree-encryption): Run allout-exposure-change-hook.
+ (allout-encrypt-string): Strip text properties.
+ Rearranged order and outline-headings for some of the
+ miscellaneous functions.
+ (allout-resolve-xref): No need to quote the error name in the
+ condition-case handler section.
+ (allout-flatten): Classic recursive (and recursively intensive,
+ without tail-recursion) list-flattener, needed by allout-shift-out
+ when confronted with discontinuous children.
+
+2006-09-16 Jason Rumney <jasonr@gnu.org>
+
+ * dnd.el (dnd-open-remote-file-function): Use dnd-open-local-file
+ on ms-windows.
+ (dnd-open-unc-file): Remove.
+ (dnd-open-local-file): Mention in doc string that it also handles
+ remote files if the system natively supports unc file-names.
+
+2006-09-15 Kim F. Storm <storm@cua.dk>
+
+ * help.el (describe-key): Handle C-h k in *Help* buffer; collect
+ all necessary information about the event before erasing *Help*.
+
+ * simple.el (line-move-partial): Use window-line-visiblity to
+ quickly check whether last line is partially visible, and only do
+ the hard (and slow) part in that case.
+
+2006-09-15 Jay Belanger <belanger@truman.edu>
+
+ * COPYING: Replace "Library Public License" by "Lesser Public
+ License" throughout.
+
+2006-09-15 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
+
+ * term/x-win.el (x-menu-bar-open): New function for F10.
+
+2006-09-15 Chong Yidong <cyd@stupidchicken.com>
+
+ * progmodes/compile.el (compilation-error-regexp-alist-alist):
+ Disallow filenames containing " -" to avoid confusion with libtool
+ compilation messages. Suggested by Stefan Monnier.
+
+2006-09-15 David Kastrup <dak@gnu.org>
+
+ * mouse-sel.el (mouse-sel-follow-link-p): Use event position
+ instead of buffer position for `mouse-on-link-p'.
+
+ * mouse.el (mouse-posn-property): New function looking up the
+ properties at a click position in overlays and text properties in
+ either buffer or strings.
+ (mouse-on-link-p): Use `mouse-posn-property' to streamline lookup
+ of both `follow-link' as well as `mouse-face' properties.
+ (mouse-drag-track): Check `mouse-on-link-p' on event position, not
+ buffer position.
+
+ * help.el (describe-key-briefly): When reading a down-event on
+ mode lines or scroll bar, swallow the following up event, too.
+ Use the new mouse sensitity of `key-binding' for lookup.
+ (describe-key): The same here.
+
+2006-09-15 Juanma Barranquero <lekktu@gmail.com>
+
+ * play/life.el (life-patterns): Add a few more interesting patterns.
+ (life-setup): Force `show-trailing-whitespace' to nil.
+
+2006-09-14 Richard Stallman <rms@gnu.org>
+
+ * startup.el (fancy-splash-text): Change text to improve alignment.
+ (fancy-splash-screens): Don't set non-standard tab width.
+ Bind cursor-type temporarily, and make it easy to patch to
+ preserve the splash buffer.
+ (normal-splash-screen, fancy-splash-tail): Spell out "Meta-x".
+ (fancy-splash-screens): Display echo-area message explicitly.
+ Don't set fancy-splash-help-echo.
+
+ * simple.el (line-number-mode): Group mode-line instead of
+ editing-basics.
+ (column-number-mode, size-indication-mode): Likewise.
+
+ * faces.el (mode-line-faces): Group mode-line instead of modeline.
+
+ * time.el (display-time): Group mode-line instead of modeline.
+
+ * cus-edit.el (mode-line): Rename from modeline. All uses changed.
+
+2006-09-14 Chong Yidong <cyd@stupidchicken.com>
+
+ * startup.el (fancy-splash-text): Move editing instructions to
+ fancy-splash-head.
+ (fancy-splash-head): Issue editing instructions.
+ (fancy-splash-screens): Fixup whitespace.
+
+2006-09-14 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * bindings.el (mode-line-buffer-identification-keymap):
+ Remove duplicate line.
+
+2006-09-14 Micha,Ak(Bl Cadilhac <michael.cadilhac@lrde.org>
+
+ * ido.el (ido-ignore-item-p): Allow any kind of functions in
+ ignore lists.
+
+2006-09-14 Kim F. Storm <storm@cua.dk>
+
+ * jit-lock.el (jit-lock-fontify-again): New function.
+ (jit-lock-fontify-now): Use it instead of lambda form.
+
2006-09-13 Agustin Martin <agustin.martin@hispalinux.es>
* textmodes/flyspell.el (flyspell-word, flyspell-correct-word)
(flyspell-auto-correct-word): Make ispell-filter local to these
functions. Check that ispell-filter has new stuff before calling
ispell-parse-output.
-
+
2006-09-13 Kim F. Storm <storm@cua.dk>
* simple.el (line-move-partial): Optimize.
2006-09-13 Richard Stallman <rms@gnu.org>
- * thingatpt.el (thing-at-point-bounds-of-url-at-point): Delete spurious backquote.
+ * thingatpt.el (thing-at-point-bounds-of-url-at-point):
+ Delete spurious backquote.
2006-09-07 Ryan Yeske <rcyeske@gmail.com>
diff --git a/lisp/allout.el b/lisp/allout.el
index 379f664d092..2d7a4777df3 100644
--- a/lisp/allout.el
+++ b/lisp/allout.el
@@ -698,9 +698,11 @@ unless optional third, non-nil element is present.")
("*" allout-rebullet-current-heading)
("#" allout-number-siblings)
("\C-k" allout-kill-line t)
+ ("\M-k" allout-copy-line-as-kill t)
("\C-y" allout-yank t)
("\M-y" allout-yank-pop t)
("\C-k" allout-kill-topic)
+ ("\M-k" allout-copy-topic-as-kill)
; Miscellaneous commands:
;([?\C-\ ] allout-mark-topic)
("@" allout-resolve-xref)
@@ -847,18 +849,37 @@ and `allout-distinctive-bullets-string'.")
(defvar allout-bullets-string-len 0
"Length of current buffers' `allout-plain-bullets-string'.")
(make-variable-buffer-local 'allout-bullets-string-len)
+;;;_ = allout-depth-specific-regexp
+(defvar allout-depth-specific-regexp ""
+ "*Regular expression to match a heading line prefix for a particular depth.
+
+This expression is used to search for depth-specific topic
+headers at depth 2 and greater. Use `allout-depth-one-regexp'
+for to seek topics at depth one.
+
+This var is set according to the user configuration vars by
+`set-allout-regexp'. It is prepared with format strings for two
+decimal numbers, which should each be one less than the depth of the
+topic prefix to be matched.")
+(make-variable-buffer-local 'allout-depth-specific-regexp)
+;;;_ = allout-depth-one-regexp
+(defvar allout-depth-one-regexp ""
+ "*Regular expression to match a heading line prefix for depth one.
+
+This var is set according to the user configuration vars by
+`set-allout-regexp'. It is prepared with format strings for two
+decimal numbers, which should each be one less than the depth of the
+topic prefix to be matched.")
+(make-variable-buffer-local 'allout-depth-one-regexp)
;;;_ = allout-line-boundary-regexp
(defvar allout-line-boundary-regexp ()
"`allout-regexp' with outline style beginning-of-line anchor.
-This is properly set when `allout-regexp' is produced by
-`set-allout-regexp', so that (match-beginning 2) and (match-end
-2) delimit the prefix.")
+This is properly set by `set-allout-regexp'.")
(make-variable-buffer-local 'allout-line-boundary-regexp)
;;;_ = allout-bob-regexp
(defvar allout-bob-regexp ()
- "Like `allout-line-boundary-regexp', for headers at beginning of buffer.
-\(match-beginning 2) and \(match-end 2) delimit the prefix.")
+ "Like `allout-line-boundary-regexp', for headers at beginning of buffer.")
(make-variable-buffer-local 'allout-bob-regexp)
;;;_ = allout-header-subtraction
(defvar allout-header-subtraction (1- (length allout-header-prefix))
@@ -869,7 +890,14 @@ This is properly set when `allout-regexp' is produced by
"Length of `allout-plain-bullets-string', updated by `set-allout-regexp'.")
(make-variable-buffer-local 'allout-plain-bullets-string-len)
+;;;_ = allout-doublecheck-at-and-shallower
+(defconst allout-doublecheck-at-and-shallower 3
+ "Verify apparent topics of this depth and shallower as being non-aberrant.
+Verified with `allout-aberrant-container-p'. This check's usefulness is
+limited to shallow prospects, because the determination of aberrance
+depends on the mistaken item being followed by a legitimate item of
+excessively greater depth.")
;;;_ X allout-reset-header-lead (header-lead)
(defun allout-reset-header-lead (header-lead)
"*Reset the leading string used to identify topic headers."
@@ -961,7 +989,9 @@ file is programming code."
"Generate proper topic-header regexp form for outline functions.
Works with respect to `allout-plain-bullets-string' and
-`allout-distinctive-bullets-string'."
+`allout-distinctive-bullets-string'.
+
+Also refresh various data structures that hinge on the regexp."
(interactive)
;; Derive allout-bullets-string from user configured components:
@@ -996,19 +1026,84 @@ Works with respect to `allout-plain-bullets-string' and
;; Derive next for repeated use in allout-pending-bullet:
(setq allout-plain-bullets-string-len (length allout-plain-bullets-string))
(setq allout-header-subtraction (1- (length allout-header-prefix)))
- ;; Produce the new allout-regexp:
- (setq allout-regexp (concat "\\("
- (regexp-quote allout-header-prefix)
- "[ \t]*["
- allout-bullets-string
- "]\\)\\|"
- (regexp-quote allout-primary-bullet)
- "+\\|\^l"))
- (setq allout-line-boundary-regexp
- (concat "\\(\n\\)\\(" allout-regexp "\\)"))
- (setq allout-bob-regexp
- (concat "\\(\\`\\)\\(" allout-regexp "\\)"))
- )
+
+ (let (new-part old-part)
+ (setq new-part (concat "\\("
+ (regexp-quote allout-header-prefix)
+ "[ \t]*"
+ ;; already regexp-quoted in a custom way:
+ "[" allout-bullets-string "]"
+ "\\)")
+ old-part (concat "\\("
+ (regexp-quote allout-primary-bullet)
+ "\\|"
+ (regexp-quote allout-header-prefix)
+ "\\)"
+ "+"
+ " ?[^" allout-primary-bullet "]")
+ allout-regexp (concat new-part
+ "\\|"
+ old-part
+ "\\|\^l")
+
+ allout-line-boundary-regexp (concat "\n" new-part
+ "\\|"
+ "\n" old-part)
+
+ allout-bob-regexp (concat "\\`" new-part
+ "\\|"
+ "\\`" old-part))
+
+ (setq allout-depth-specific-regexp
+ (concat "\\(^\\|\\`\\)"
+ "\\("
+
+ ;; new-style spacers-then-bullet string:
+ "\\("
+ (allout-format-quote (regexp-quote allout-header-prefix))
+ " \\{%s\\}"
+ "[" (allout-format-quote allout-bullets-string) "]"
+ "\\)"
+
+ ;; old-style all-bullets string, if primary not multi-char:
+ (if (< 0 allout-header-subtraction)
+ ""
+ (concat "\\|\\("
+ (allout-format-quote
+ (regexp-quote allout-primary-bullet))
+ (allout-format-quote
+ (regexp-quote allout-primary-bullet))
+ (allout-format-quote
+ (regexp-quote allout-primary-bullet))
+ "\\{%s\\}"
+ ;; disqualify greater depths:
+ "[^"
+ (allout-format-quote allout-primary-bullet)
+ "]\\)"
+ ))
+ "\\)"
+ ))
+ (setq allout-depth-one-regexp
+ (concat "\\(^\\|\\`\\)"
+ "\\("
+
+ "\\("
+ (regexp-quote allout-header-prefix)
+ ;; disqualify any bullet char following any amount of
+ ;; intervening whitespace:
+ " *"
+ (concat "[^ " allout-bullets-string "]")
+ "\\)"
+ (if (< 0 allout-header-subtraction)
+ ;; Need not support anything like the old
+ ;; bullet style if the prefix is multi-char.
+ ""
+ (concat "\\|"
+ (regexp-quote allout-primary-bullet)
+ ;; disqualify deeper primary-bullet sequences:
+ "[^" allout-primary-bullet "]"))
+ "\\)"
+ ))))
;;;_ : Key bindings
;;;_ = allout-mode-map
(defvar allout-mode-map nil "Keybindings for (allout) outline minor mode.")
@@ -1142,7 +1237,7 @@ The settings are stored on `allout-mode-prior-settings'."
(if (not (symbolp name))
(error "Pair's name, %S, must be a symbol, not %s"
name (type-of name)))
- (setq prior-value (condition-case err
+ (setq prior-value (condition-case nil
(symbol-value name)
(void-variable nil)))
(when (not (assoc name allout-mode-prior-settings))
@@ -1186,7 +1281,7 @@ their settings before allout-mode was started."
;;;_ > allout-unprotected (expr)
(defmacro allout-unprotected (expr)
"Enable internal outline operations to alter invisible text."
- `(let ((inhibit-read-only t)
+ `(let ((inhibit-read-only (if (not buffer-read-only) t))
(inhibit-field-text-motion t))
,expr))
;;;_ = allout-mode-hook
@@ -1600,7 +1695,9 @@ The bindings are dictated by the `allout-keybindings-list' and
Topic-oriented Killing and Yanking:
----------------------------------
\\[allout-kill-topic] allout-kill-topic Kill current topic, including offspring.
-\\[allout-kill-line] allout-kill-line Like kill-line, but reconciles numbering, etc.
+\\[allout-copy-topic-as-kill] allout-copy-topic-as-kill Copy current topic, including offspring.
+\\[allout-kill-line] allout-kill-line kill-line, attending to outline structure.
+\\[allout-copy-line-as-kill] allout-copy-line-as-kill Copy line but don't delete it.
\\[allout-yank] allout-yank Yank, adjusting depth of yanked topic to
depth of heading if yanking into bare topic
heading (ie, prefix sans text).
@@ -1792,8 +1889,7 @@ OPEN: A topic that is not closed, though its offspring or body may be."
(remove-from-invisibility-spec '(allout . t))
(remove-hook 'pre-command-hook 'allout-pre-command-business t)
(remove-hook 'post-command-hook 'allout-post-command-business t)
- (when (featurep 'xemacs)
- (remove-hook 'before-change-functions 'allout-before-change-handler t))
+ (remove-hook 'before-change-functions 'allout-before-change-handler t)
(remove-hook 'isearch-mode-end-hook 'allout-isearch-end-handler t)
(remove-hook write-file-hook-var-name 'allout-write-file-hook-handler t)
(remove-hook 'auto-save-hook 'allout-auto-save-hook-handler t)
@@ -1813,7 +1909,7 @@ OPEN: A topic that is not closed, though its offspring or body may be."
(allout-overlay-preparations) ; Doesn't hurt to redo this.
- (allout-infer-header-lead)
+ (allout-infer-header-lead-and-primary-bullet)
(allout-infer-body-reindent)
(set-allout-regexp)
@@ -1854,9 +1950,8 @@ OPEN: A topic that is not closed, though its offspring or body may be."
(allout-add-resumptions '(line-move-ignore-invisible t))
(add-hook 'pre-command-hook 'allout-pre-command-business nil t)
(add-hook 'post-command-hook 'allout-post-command-business nil t)
- (when (featurep 'xemacs)
- (add-hook 'before-change-functions 'allout-before-change-handler
- nil t))
+ (add-hook 'before-change-functions 'allout-before-change-handler
+ nil t)
(add-hook 'isearch-mode-end-hook 'allout-isearch-end-handler nil t)
(add-hook write-file-hook-var-name 'allout-write-file-hook-handler
nil t)
@@ -1996,18 +2091,20 @@ internal functions use this feature cohesively bunch changes."
(defun allout-before-change-handler (beg end)
"Protect against changes to invisible text.
-See allout-overlay-interior-modification-handler for details.
+See allout-overlay-interior-modification-handler for details."
+
+ (if (and (allout-mode-p) undo-in-progress (allout-hidden-p))
+ (allout-show-to-offshoot))
-This before-change handler is used only where modification-hooks
-overlay property is not supported."
;; allout-overlay-interior-modification-handler on an overlay handles
;; this in other emacs, via `allout-exposure-category's 'modification-hooks.
(when (and (featurep 'xemacs) (allout-mode-p))
;; process all of the pending overlays:
- (dolist (overlay (overlays-in beg end))
- (if (eq (overlay-get ol 'invisible) 'allout)
- (allout-overlay-interior-modification-handler
- overlay nil beg end nil)))))
+ (save-excursion
+ (got-char beg)
+ (let ((overlay (allout-get-invisibility-overlay)))
+ (allout-overlay-interior-modification-handler
+ overlay nil beg end nil)))))
;;;_ > allout-isearch-end-handler (&optional overlay)
(defun allout-isearch-end-handler (&optional overlay)
"Reconcile allout outline exposure on arriving in hidden text after isearch.
@@ -2035,19 +2132,35 @@ function can also be used as an `isearch-mode-end-hook'."
(defvar allout-recent-prefix-end 0
"Buffer point of the end of the last topic prefix encountered.")
(make-variable-buffer-local 'allout-recent-prefix-end)
+;;;_ = allout-recent-depth
+(defvar allout-recent-depth 0
+ "Depth of the last topic prefix encountered.")
+(make-variable-buffer-local 'allout-recent-depth)
;;;_ = allout-recent-end-of-subtree
(defvar allout-recent-end-of-subtree 0
"Buffer point last returned by `allout-end-of-current-subtree'.")
(make-variable-buffer-local 'allout-recent-end-of-subtree)
-;;;_ > allout-prefix-data (beg end)
-(defmacro allout-prefix-data (beg end)
- "Register allout-prefix state data - BEGINNING and END of prefix.
+;;;_ > allout-prefix-data ()
+(defsubst allout-prefix-data ()
+ "Register allout-prefix state data.
For reference by `allout-recent' funcs. Returns BEGINNING."
- `(setq allout-recent-prefix-end ,end
- allout-recent-prefix-beginning ,beg))
+ (setq allout-recent-prefix-end (or (match-end 1) (match-end 2))
+ allout-recent-prefix-beginning (or (match-beginning 1)
+ (match-beginning 2))
+ allout-recent-depth (max 1 (- allout-recent-prefix-end
+ allout-recent-prefix-beginning
+ allout-header-subtraction)))
+ allout-recent-prefix-beginning)
+;;;_ > nullify-allout-prefix-data ()
+(defsubst nullify-allout-prefix-data ()
+ "Mark allout prefix data as being uninformative."
+ (setq allout-recent-prefix-end (point)
+ allout-recent-prefix-beginning (point)
+ allout-recent-depth 0)
+ allout-recent-prefix-beginning)
;;;_ > allout-recent-depth ()
-(defmacro allout-recent-depth ()
+(defsubst allout-recent-depth ()
"Return depth of last heading encountered by an outline maneuvering function.
All outline functions which directly do string matches to assess
@@ -2055,19 +2168,17 @@ headings set the variables `allout-recent-prefix-beginning' and
`allout-recent-prefix-end' if successful. This function uses those settings
to return the current depth."
- '(max 1 (- allout-recent-prefix-end
- allout-recent-prefix-beginning
- allout-header-subtraction)))
+ allout-recent-depth)
;;;_ > allout-recent-prefix ()
-(defmacro allout-recent-prefix ()
+(defsubst allout-recent-prefix ()
"Like `allout-recent-depth', but returns text of last encountered prefix.
All outline functions which directly do string matches to assess
headings set the variables `allout-recent-prefix-beginning' and
`allout-recent-prefix-end' if successful. This function uses those settings
-to return the current depth."
- '(buffer-substring allout-recent-prefix-beginning
- allout-recent-prefix-end))
+to return the current prefix."
+ (buffer-substring-no-properties allout-recent-prefix-beginning
+ allout-recent-prefix-end))
;;;_ > allout-recent-bullet ()
(defmacro allout-recent-bullet ()
"Like allout-recent-prefix, but returns bullet of last encountered prefix.
@@ -2076,8 +2187,8 @@ All outline functions which directly do string matches to assess
headings set the variables `allout-recent-prefix-beginning' and
`allout-recent-prefix-end' if successful. This function uses those settings
to return the current depth of the most recently matched topic."
- '(buffer-substring (1- allout-recent-prefix-end)
- allout-recent-prefix-end))
+ '(buffer-substring-no-properties (1- allout-recent-prefix-end)
+ allout-recent-prefix-end))
;;;_ #4 Navigation
@@ -2091,7 +2202,8 @@ Actually, returns prefix beginning point."
(save-excursion
(allout-beginning-of-current-line)
(and (looking-at allout-regexp)
- (allout-prefix-data (match-beginning 0) (match-end 0)))))
+ (not (allout-aberrant-container-p))
+ (allout-prefix-data))))
;;;_ > allout-on-heading-p ()
(defalias 'allout-on-heading-p 'allout-on-current-heading-p)
;;;_ > allout-e-o-prefix-p ()
@@ -2101,6 +2213,51 @@ Actually, returns prefix beginning point."
(beginning-of-line))
(looking-at allout-regexp))
(= (point)(save-excursion (allout-end-of-prefix)(point)))))
+;;;_ > allout-aberrant-container-p ()
+(defun allout-aberrant-container-p ()
+ "True if topic, or next sibling with children, contains them discontinuously.
+
+Discontinuous means an immediate offspring that is nested more
+than one level deeper than the topic.
+
+If topic has no offspring, then the next sibling with offspring will
+determine whether or not this one is determined to be aberrant.
+
+If true, then the allout-recent-* settings are calibrated on the
+offspring that qaulifies it as aberrant, ie with depth that
+exceeds the topic by more than one."
+
+ ;; This is most clearly understood when considering standard-prefix-leader
+ ;; low-level topics, which can all too easily match text not intended as
+ ;; headers. For example, any line with a leading '.' or '*' and lacking a
+ ;; following bullet qualifies without this protection. (A sequence of
+ ;; them can occur naturally, eg a typical textual bullet list.) We
+ ;; disqualify such low-level sequences when they are followed by a
+ ;; discontinuously contained child, inferring that the sequences are not
+ ;; actually connected with their prospective context.
+
+ (let ((depth (allout-depth))
+ (start-point (point))
+ done aberrant)
+ (save-excursion
+ (while (and (not done)
+ (re-search-forward allout-line-boundary-regexp nil 0))
+ (allout-prefix-data)
+ (goto-char allout-recent-prefix-beginning)
+ (cond
+ ;; sibling - continue:
+ ((eq allout-recent-depth depth))
+ ;; first offspring is excessive - aberrant:
+ ((> allout-recent-depth (1+ depth))
+ (setq done t aberrant t))
+ ;; next non-sibling is lower-depth - not aberrant:
+ (t (setq done t)))))
+ (if aberrant
+ aberrant
+ (goto-char start-point)
+ ;; recalibrate allout-recent-*
+ (allout-depth)
+ nil)))
;;;_ : Location attributes
;;;_ > allout-depth ()
(defun allout-depth ()
@@ -2113,10 +2270,10 @@ Like `allout-current-depth', but respects hidden as well as visible topics."
(let ((start-point (point)))
(if (and (allout-goto-prefix)
(not (< start-point (point))))
- (allout-recent-depth)
+ allout-recent-depth
(progn
- ;; Oops, no prefix, zero prefix data:
- (allout-prefix-data (point)(point))
+ ;; Oops, no prefix, nullify it:
+ (nullify-allout-prefix-data)
;; ... and return 0:
0)))))
;;;_ > allout-current-depth ()
@@ -2149,10 +2306,10 @@ Return zero if point is not within any topic."
(condition-case nil
(save-excursion
(allout-back-to-current-heading)
- (buffer-substring (- allout-recent-prefix-end 1)
- allout-recent-prefix-end))
+ (buffer-substring-no-properties (- allout-recent-prefix-end 1)
+ allout-recent-prefix-end))
;; Quick and dirty provision, ostensibly for missing bullet:
- ('args-out-of-range nil))
+ (args-out-of-range nil))
)
;;;_ > allout-get-prefix-bullet (prefix)
(defun allout-get-prefix-bullet (prefix)
@@ -2160,7 +2317,7 @@ Return zero if point is not within any topic."
;; Doesn't make sense if we're old-style prefixes, but this just
;; oughtn't be called then, so forget about it...
(if (string-match allout-regexp prefix)
- (substring prefix (1- (match-end 0)) (match-end 0))))
+ (substring prefix (1- (match-end 2)) (match-end 2))))
;;;_ > allout-sibling-index (&optional depth)
(defun allout-sibling-index (&optional depth)
"Item number of this prospective topic among its siblings.
@@ -2174,10 +2331,10 @@ If less than this depth, ascend to that depth and count..."
(cond ((and depth (<= depth 0) 0))
((or (not depth) (= depth (allout-depth)))
(let ((index 1))
- (while (allout-previous-sibling (allout-recent-depth) nil)
+ (while (allout-previous-sibling allout-recent-depth nil)
(setq index (1+ index)))
index))
- ((< depth (allout-recent-depth))
+ ((< depth allout-recent-depth)
(allout-ascend-to-depth depth)
(allout-sibling-index))
(0))))
@@ -2229,11 +2386,17 @@ Outermost is first."
(if (or (not allout-beginning-of-line-cycles)
(not (equal last-command this-command)))
(move-beginning-of-line 1)
- (let ((beginning-of-body (save-excursion
- (allout-beginning-of-current-entry)
- (point))))
+ (allout-depth)
+ (let ((beginning-of-body
+ (save-excursion
+ (while (and (<= allout-recent-depth
+ allout-doublecheck-at-and-shallower)
+ (allout-aberrant-container-p)
+ (allout-previous-visible-heading 1)))
+ (allout-beginning-of-current-entry)
+ (point))))
(cond ((= (current-column) 0)
- (allout-beginning-of-current-entry))
+ (goto-char beginning-of-body))
((< (point) beginning-of-body)
(allout-beginning-of-current-line))
((= (point) beginning-of-body)
@@ -2241,7 +2404,7 @@ Outermost is first."
(t (allout-beginning-of-current-line)
(if (< (point) beginning-of-body)
;; we were on the headline after its start:
- (allout-beginning-of-current-entry)))))))
+ (goto-char beginning-of-body)))))))
;;;_ > allout-end-of-line ()
(defun allout-end-of-line ()
"End-of-line with `allout-end-of-line-cycles' behavior, if set."
@@ -2261,6 +2424,7 @@ Outermost is first."
(allout-hidden-p)))
(allout-back-to-current-heading)
(allout-show-current-entry)
+ (allout-show-children)
(allout-end-of-entry))
((>= (point) end-of-entry)
(allout-back-to-current-heading)
@@ -2270,40 +2434,49 @@ Outermost is first."
(defsubst allout-next-heading ()
"Move to the heading for the topic \(possibly invisible) after this one.
-Returns the location of the heading, or nil if none found."
+Returns the location of the heading, or nil if none found.
- (if (and (bobp) (not (eobp)) (looking-at allout-regexp))
+We skip anomolous low-level topics, a la `allout-aberrant-container-p'."
+ (if (looking-at allout-regexp)
(forward-char 1))
- (if (re-search-forward allout-line-boundary-regexp nil 0)
- (allout-prefix-data ; Got valid location state - set vars:
- (goto-char (or (match-beginning 2)
- allout-recent-prefix-beginning))
- (or (match-end 2) allout-recent-prefix-end))))
+ (when (re-search-forward allout-line-boundary-regexp nil 0)
+ (allout-prefix-data)
+ (and (<= allout-recent-depth allout-doublecheck-at-and-shallower)
+ ;; this will set allout-recent-* on the first non-aberrant topic,
+ ;; whether it's the current one or one that disqualifies it:
+ (allout-aberrant-container-p))
+ (goto-char allout-recent-prefix-beginning)))
;;;_ > allout-this-or-next-heading
(defun allout-this-or-next-heading ()
"Position cursor on current or next heading."
;; A throwaway non-macro that is defined after allout-next-heading
;; and usable by allout-mode.
- (if (not (allout-goto-prefix)) (allout-next-heading)))
+ (if (not (allout-goto-prefix-doublechecked)) (allout-next-heading)))
;;;_ > allout-previous-heading ()
-(defmacro allout-previous-heading ()
+(defun allout-previous-heading ()
"Move to the prior \(possibly invisible) heading line.
-Return the location of the beginning of the heading, or nil if not found."
-
- '(if (bobp)
- nil
- (allout-goto-prefix)
- (if
- ;; searches are unbounded and return nil if failed:
- (or (re-search-backward allout-line-boundary-regexp nil 0)
- (looking-at allout-bob-regexp))
- (progn ; Got valid location state - set vars:
- (allout-prefix-data
- (goto-char (or (match-beginning 2)
- allout-recent-prefix-beginning))
- (or (match-end 2) allout-recent-prefix-end))))))
+Return the location of the beginning of the heading, or nil if not found.
+
+We skip anomolous low-level topics, a la `allout-aberrant-container-p'."
+
+ (if (bobp)
+ nil
+ ;; allout-goto-prefix-doublechecked calls us, so we can't use it here.
+ (let ((start-point (point)))
+ (allout-goto-prefix)
+ (when (or (re-search-backward allout-line-boundary-regexp nil 0)
+ (looking-at allout-bob-regexp))
+ (goto-char (allout-prefix-data))
+ (if (and (<= allout-recent-depth allout-doublecheck-at-and-shallower)
+ (allout-aberrant-container-p))
+ (or (allout-previous-heading)
+ (and (goto-char start-point)
+ ;; recalibrate allout-recent-*:
+ (allout-depth)
+ nil))
+ (point))))))
;;;_ > allout-get-invisibility-overlay ()
(defun allout-get-invisibility-overlay ()
"Return the overlay at point that dictates allout invisibility."
@@ -2311,7 +2484,8 @@ Return the location of the beginning of the heading, or nil if not found."
got)
(while (and overlays (not got))
(if (equal (overlay-get (car overlays) 'invisible) 'allout)
- (setq got (car overlays))))
+ (setq got (car overlays))
+ (pop overlays)))
got))
;;;_ > allout-back-to-visible-text ()
(defun allout-back-to-visible-text ()
@@ -2324,11 +2498,8 @@ Return the location of the beginning of the heading, or nil if not found."
;;;_ " These routines either produce or assess charts, which are
;;; nested lists of the locations of topics within a subtree.
;;;
-;;; Use of charts enables efficient navigation of subtrees, by
-;;; requiring only a single regexp-search based traversal, to scope
-;;; out the subtopic locations. The chart then serves as the basis
-;;; for assessment or adjustment of the subtree, without redundant
-;;; traversal of the structure.
+;;; Charts enable efficient subtree navigation by providing a reusable basis
+;;; for elaborate, compound assessment and adjustment of a subtree.
;;;_ > allout-chart-subtree (&optional levels visible orig-depth prev-depth)
(defun allout-chart-subtree (&optional levels visible orig-depth prev-depth)
@@ -2348,12 +2519,12 @@ Charts are used to capture outline structure, so that outline-altering
routines need assess the structure only once, and then use the chart
for their elaborate manipulations.
-Topics are entered in the chart so the last one is at the car.
-The entry for each topic consists of an integer indicating the point
-at the beginning of the topic. Charts for offspring consists of a
-list containing, recursively, the charts for the respective subtopics.
-The chart for a topics' offspring precedes the entry for the topic
-itself.
+The chart entries for the topics are in reverse order, so the
+last topic is listed first. The entry for each topic consists of
+an integer indicating the point at the beginning of the topic
+prefix. Charts for offspring consists of a list containing,
+recursively, the charts for the respective subtopics. The chart
+for a topics' offspring precedes the entry for the topic itself.
The other function parameters are for internal recursion, and should
not be specified by external callers. ORIG-DEPTH is depth of topic at
@@ -2380,17 +2551,17 @@ starting point, and PREV-DEPTH is depth of prior topic."
(while (and (not (eobp))
; Still within original topic?
- (< orig-depth (setq curr-depth (allout-recent-depth)))
+ (< orig-depth (setq curr-depth allout-recent-depth))
(cond ((= prev-depth curr-depth)
;; Register this one and move on:
- (setq chart (cons (point) chart))
+ (setq chart (cons allout-recent-prefix-beginning chart))
(if (and levels (<= levels 1))
;; At depth limit - skip sublevels:
(or (allout-next-sibling curr-depth)
;; or no more siblings - proceed to
;; next heading at lesser depth:
(while (and (<= curr-depth
- (allout-recent-depth))
+ allout-recent-depth)
(if visible
(allout-next-visible-heading 1)
(allout-next-heading)))))
@@ -2437,11 +2608,11 @@ starting point, and PREV-DEPTH is depth of prior topic."
Effectively a top-level chart of siblings. See `allout-chart-subtree'
for an explanation of charts."
(save-excursion
- (if (allout-goto-prefix)
- (let ((chart (list (point))))
- (while (allout-next-sibling)
- (setq chart (cons (point) chart)))
- (if chart (setq chart (nreverse chart)))))))
+ (when (allout-goto-prefix-doublechecked)
+ (let ((chart (list (point))))
+ (while (allout-next-sibling)
+ (setq chart (cons (point) chart)))
+ (if chart (setq chart (nreverse chart)))))))
;;;_ > allout-chart-to-reveal (chart depth)
(defun allout-chart-to-reveal (chart depth)
@@ -2514,15 +2685,25 @@ Returns the point at the beginning of the prefix, or nil if none."
(search-backward "\n" nil 1))
(forward-char 1)
(if (looking-at allout-regexp)
- (setq done (allout-prefix-data (match-beginning 0)
- (match-end 0)))
+ (setq done (allout-prefix-data))
(forward-char -1)))
(if (bobp)
(cond ((looking-at allout-regexp)
- (allout-prefix-data (match-beginning 0)(match-end 0)))
+ (allout-prefix-data))
((allout-next-heading))
(done))
done)))
+;;;_ > allout-goto-prefix-doublechecked ()
+(defun allout-goto-prefix-doublechecked ()
+ "Put point at beginning of immediately containing outline topic.
+
+Like `allout-goto-prefix', but shallow topics \(according to `allout-doublecheck-at-and-shallower') are checked and disqualified for child containment discontinuity, according to `allout-aberrant-container-p'."
+ (allout-goto-prefix)
+ (if (and (<= allout-recent-depth allout-doublecheck-at-and-shallower)
+ (allout-aberrant-container-p))
+ (allout-previous-heading)
+ (point)))
+
;;;_ > allout-end-of-prefix ()
(defun allout-end-of-prefix (&optional ignore-decorations)
"Position cursor at beginning of header text.
@@ -2530,24 +2711,22 @@ Returns the point at the beginning of the prefix, or nil if none."
If optional IGNORE-DECORATIONS is non-nil, put just after bullet,
otherwise skip white space between bullet and ensuing text."
- (if (not (allout-goto-prefix))
+ (if (not (allout-goto-prefix-doublechecked))
nil
- (let ((match-data (match-data)))
- (goto-char (match-end 0))
- (if ignore-decorations
- t
- (while (looking-at "[0-9]") (forward-char 1))
- (if (and (not (eolp)) (looking-at "\\s-")) (forward-char 1)))
- (store-match-data match-data))
+ (goto-char allout-recent-prefix-end)
+ (if ignore-decorations
+ t
+ (while (looking-at "[0-9]") (forward-char 1))
+ (if (and (not (eolp)) (looking-at "\\s-")) (forward-char 1)))
;; Reestablish where we are:
(allout-current-depth)))
;;;_ > allout-current-bullet-pos ()
(defun allout-current-bullet-pos ()
"Return position of current \(visible) topic's bullet."
- (if (not (allout-current-depth))
+ (if (not (allout-current-depth))
nil
- (1- (match-end 0))))
+ (1- allout-recent-prefix-end)))
;;;_ > allout-back-to-current-heading ()
(defun allout-back-to-current-heading ()
"Move to heading line of current topic, or beginning if already on the line.
@@ -2562,11 +2741,9 @@ in which case we return nil."
(progn (while (allout-hidden-p)
(allout-beginning-of-current-line)
(if (not (looking-at allout-regexp))
- (re-search-backward (concat
- "^\\(" allout-regexp "\\)")
+ (re-search-backward allout-regexp
nil 'move)))
- (allout-prefix-data (match-beginning 1)
- (match-end 1)))))
+ (allout-prefix-data))))
(if (interactive-p)
(allout-end-of-prefix)
(point))))
@@ -2578,9 +2755,8 @@ in which case we return nil."
Returns that character position."
- (if (re-search-forward allout-line-boundary-regexp nil 'move)
- (prog1 (goto-char (match-beginning 0))
- (allout-prefix-data (match-beginning 2)(match-end 2)))))
+ (if (allout-next-heading)
+ (goto-char (1- allout-recent-prefix-beginning))))
;;;_ > allout-end-of-subtree (&optional current include-trailing-blank)
(defun allout-end-of-subtree (&optional current include-trailing-blank)
"Put point at the end of the last leaf in the containing topic.
@@ -2596,11 +2772,11 @@ Returns the value of point."
(interactive "P")
(if current
(allout-back-to-current-heading)
- (allout-goto-prefix))
- (let ((level (allout-recent-depth)))
+ (allout-goto-prefix-doublechecked))
+ (let ((level allout-recent-depth))
(allout-next-heading)
(while (and (not (eobp))
- (> (allout-recent-depth) level))
+ (> allout-recent-depth level))
(allout-next-heading))
(if (eobp)
(allout-end-of-entry)
@@ -2629,6 +2805,9 @@ If already there, move cursor to bullet for hot-spot operation.
(interactive)
(let ((start-point (point)))
(move-beginning-of-line 1)
+ (if (< 0 (allout-current-depth))
+ (goto-char allout-recent-prefix-end)
+ (goto-char (point-min)))
(allout-end-of-prefix)
(if (and (interactive-p)
(= (point) start-point))
@@ -2676,23 +2855,18 @@ collapsed."
(defun allout-ascend-to-depth (depth)
"Ascend to depth DEPTH, returning depth if successful, nil if not."
(if (and (> depth 0)(<= depth (allout-depth)))
- (let ((last-good (point)))
- (while (and (< depth (allout-depth))
- (setq last-good (point))
- (allout-beginning-of-level)
- (allout-previous-heading)))
- (if (= (allout-recent-depth) depth)
- (progn (goto-char allout-recent-prefix-beginning)
- depth)
- (goto-char last-good)
- nil))
- (if (interactive-p) (allout-end-of-prefix))))
+ (let (last-ascended)
+ (while (and (< depth allout-recent-depth)
+ (setq last-ascended (allout-ascend))))
+ (goto-char allout-recent-prefix-beginning)
+ (if (interactive-p) (allout-end-of-prefix))
+ (and last-ascended allout-recent-depth))))
;;;_ > allout-ascend ()
(defun allout-ascend ()
"Ascend one level, returning t if successful, nil if not."
(prog1
(if (allout-beginning-of-level)
- (allout-previous-heading))
+ (allout-previous-heading))
(if (interactive-p) (allout-end-of-prefix))))
;;;_ > allout-descend-to-depth (depth)
(defun allout-descend-to-depth (depth)
@@ -2703,47 +2877,24 @@ Returning depth if successful, nil if not."
(start-depth (allout-depth)))
(while
(and (> (allout-depth) 0)
- (not (= depth (allout-recent-depth))) ; ... not there yet
+ (not (= depth allout-recent-depth)) ; ... not there yet
(allout-next-heading) ; ... go further
- (< start-depth (allout-recent-depth)))) ; ... still in topic
+ (< start-depth allout-recent-depth))) ; ... still in topic
(if (and (> (allout-depth) 0)
- (= (allout-recent-depth) depth))
+ (= allout-recent-depth depth))
depth
(goto-char start-point)
nil))
)
-;;;_ > allout-up-current-level (arg &optional dont-complain)
-(defun allout-up-current-level (arg &optional dont-complain)
- "Move out ARG levels from current visible topic.
-
-Positions on heading line of containing topic. Error if unable to
-ascend that far, or nil if unable to ascend but optional arg
-DONT-COMPLAIN is non-nil."
+;;;_ > allout-up-current-level (arg)
+(defun allout-up-current-level (arg)
+ "Move out ARG levels from current visible topic."
(interactive "p")
- (allout-back-to-current-heading)
- (let ((present-level (allout-recent-depth))
- (last-good (point))
- failed)
- ;; Loop for iterating arg:
- (while (and (> (allout-recent-depth) 1)
- (> arg 0)
- (not (bobp))
- (not failed))
- (setq last-good (point))
- ;; Loop for going back over current or greater depth:
- (while (and (not (< (allout-recent-depth) present-level))
- (or (allout-previous-visible-heading 1)
- (not (setq failed present-level)))))
- (setq present-level (allout-current-depth))
- (setq arg (- arg 1)))
- (if (or failed
- (> arg 0))
- (progn (goto-char last-good)
- (if (interactive-p) (allout-end-of-prefix))
- (if (not dont-complain)
- (error "Can't ascend past outermost level")
- (if (interactive-p) (allout-end-of-prefix))
- nil))
+ (let ((start-point (point)))
+ (allout-back-to-current-heading)
+ (if (not (allout-ascend))
+ (progn (goto-char start-point)
+ (error "Can't ascend past outermost level"))
(if (interactive-p) (allout-end-of-prefix))
allout-recent-prefix-beginning)))
@@ -2756,24 +2907,101 @@ Traverse at optional DEPTH, or current depth if none specified.
Go backward if optional arg BACKWARD is non-nil.
-Return depth if successful, nil otherwise."
+Return the start point of the new topic if successful, nil otherwise."
- (if (and backward (bobp))
+ (if (if backward (bobp) (eobp))
nil
- (let ((start-depth (or depth (allout-depth)))
+ (let ((target-depth (or depth (allout-depth)))
(start-point (point))
+ (count 0)
+ leaping
last-depth)
- (while (and (not (if backward (bobp) (eobp)))
- (if backward (allout-previous-heading)
- (allout-next-heading))
- (> (setq last-depth (allout-recent-depth)) start-depth)))
- (if (and (not (eobp))
- (and (> (or last-depth (allout-depth)) 0)
- (= (allout-recent-depth) start-depth)))
- allout-recent-prefix-beginning
- (goto-char start-point)
- (if depth (allout-depth) start-depth)
- nil))))
+ (while (and
+ ;; done too few single steps to resort to the leap routine:
+ (not leaping)
+ ;; not at limit:
+ (not (if backward (bobp) (eobp)))
+ ;; still traversable:
+ (if backward (allout-previous-heading) (allout-next-heading))
+ ;; we're below the target depth
+ (> (setq last-depth allout-recent-depth) target-depth))
+ (setq count (1+ count))
+ (if (> count 7) ; lists are commonly 7 +- 2, right?-)
+ (setq leaping t)))
+ (cond (leaping
+ (or (allout-next-sibling-leap target-depth backward)
+ (progn
+ (goto-char start-point)
+ (if depth (allout-depth) target-depth)
+ nil)))
+ ((and (not (eobp))
+ (and (> (or last-depth (allout-depth)) 0)
+ (= allout-recent-depth target-depth)))
+ allout-recent-prefix-beginning)
+ (t
+ (goto-char start-point)
+ (if depth (allout-depth) target-depth)
+ nil)))))
+;;;_ > allout-next-sibling-leap (&optional depth backward)
+(defun allout-next-sibling-leap (&optional depth backward)
+ "Like `allout-next-sibling', but by direct search for topic at depth.
+
+Traverse at optional DEPTH, or current depth if none specified.
+
+Go backward if optional arg BACKWARD is non-nil.
+
+Return the start point of the new topic if successful, nil otherwise.
+
+Costs more than regular `allout-next-sibling' for short traversals:
+
+ - we have to check the prior \(next, if travelling backwards)
+ item to confirm connectivity with the prior topic, and
+ - if confirmed, we have to reestablish the allout-recent-* settings with
+ some extra navigation
+ - if confirmation fails, we have to do more work to recover
+
+It is an increasingly big win when there are many intervening
+offspring before the next sibling, however, so
+`allout-next-sibling' resorts to this if it finds itself in that
+situation."
+
+ (if (if backward (bobp) (eobp))
+ nil
+ (let* ((start-point (point))
+ (target-depth (or depth (allout-depth)))
+ (search-whitespace-regexp nil)
+ (depth-biased (- target-depth 2))
+ (expression (if (<= target-depth 1)
+ allout-depth-one-regexp
+ (format allout-depth-specific-regexp
+ depth-biased depth-biased)))
+ found
+ done)
+ (while (not done)
+ (setq found (if backward
+ (re-search-backward expression nil 'to-limit)
+ (forward-char 1)
+ (re-search-forward expression nil 'to-limit)))
+ (if (and found (allout-aberrant-container-p))
+ (setq found nil))
+ (setq done (or found (if backward (bobp) (eobp)))))
+ (if (not found)
+ (progn (goto-char start-point)
+ nil)
+ ;; rationale: if any intervening items were at a lower depth, we
+ ;; would now be on the first offspring at the target depth - ie,
+ ;; the preceeding item (per the search direction) must be at a
+ ;; lesser depth. that's all we need to check.
+ (if backward (allout-next-heading) (allout-previous-heading))
+ (if (< allout-recent-depth target-depth)
+ ;; return to start and reestablish allout-recent-*:
+ (progn
+ (goto-char start-point)
+ (allout-depth)
+ nil)
+ (goto-char found)
+ ;; locate cursor and set allout-recent-*:
+ (allout-goto-prefix))))))
;;;_ > allout-previous-sibling (&optional depth backward)
(defun allout-previous-sibling (&optional depth backward)
"Like `allout-forward-current-level' backwards, respecting invisible topics.
@@ -2807,7 +3035,7 @@ Presumes point is at the start of a topic prefix."
(let ((depth (allout-depth)))
(while (allout-previous-sibling depth nil))
- (prog1 (allout-recent-depth)
+ (prog1 allout-recent-depth
(if (interactive-p) (allout-end-of-prefix)))))
;;;_ > allout-next-visible-heading (arg)
(defun allout-next-visible-heading (arg)
@@ -2821,21 +3049,36 @@ Move to buffer limit in indicated direction if headings are exhausted."
(step (if backward -1 1))
prev got)
- (while (> arg 0) ; limit condition
- (while (and (not (if backward (bobp)(eobp))) ; boundary condition
- ;; Move, skipping over all those concealed lines:
- (prog1 (condition-case nil (or (line-move step) t)
- (error nil))
- (allout-beginning-of-current-line))
- (not (setq got (looking-at allout-regexp)))))
+ (while (> arg 0)
+ (while (and
+ ;; Boundary condition:
+ (not (if backward (bobp)(eobp)))
+ ;; Move, skipping over all concealed lines in one fell swoop:
+ (prog1 (condition-case nil (or (line-move step) t)
+ (error nil))
+ (allout-beginning-of-current-line))
+ ;; Deal with apparent header line:
+ (if (not (looking-at allout-regexp))
+ ;; not a header line, keep looking:
+ t
+ (allout-prefix-data)
+ (if (and (<= allout-recent-depth
+ allout-doublecheck-at-and-shallower)
+ (allout-aberrant-container-p))
+ ;; skip this aberrant prospective header line:
+ t
+ ;; this prospective headerline qualifies - register:
+ (setq got allout-recent-prefix-beginning)
+ ;; and break the loop:
+ nil))))
;; Register this got, it may be the last:
(if got (setq prev got))
(setq arg (1- arg)))
(cond (got ; Last move was to a prefix:
- (allout-prefix-data (match-beginning 0) (match-end 0))
- (allout-end-of-prefix))
+ (allout-end-of-prefix))
(prev ; Last move wasn't, but prev was:
- (allout-prefix-data (match-beginning 0) (match-end 0)))
+ (goto-char prev)
+ (allout-end-of-prefix))
((not backward) (end-of-line) nil))))
;;;_ > allout-previous-visible-heading (arg)
(defun allout-previous-visible-heading (arg)
@@ -2845,7 +3088,8 @@ With argument, repeats or can move forward if negative.
A heading line is one that starts with a `*' (or that `allout-regexp'
matches)."
(interactive "p")
- (allout-next-visible-heading (- arg)))
+ (prog1 (allout-next-visible-heading (- arg))
+ (if (interactive-p) (allout-end-of-prefix))))
;;;_ > allout-forward-current-level (arg)
(defun allout-forward-current-level (arg)
"Position point at the next heading of the same level.
@@ -2856,38 +3100,25 @@ Returns resulting position, else nil if none found."
(interactive "p")
(let ((start-depth (allout-current-depth))
(start-arg arg)
- (backward (> 0 arg))
- last-depth
- (last-good (point))
- at-boundary)
+ (backward (> 0 arg)))
(if (= 0 start-depth)
(error "No siblings, not in a topic..."))
(if backward (setq arg (* -1 arg)))
- (while (not (or (zerop arg)
- at-boundary))
- (while (and (not (if backward (bobp) (eobp)))
- (if backward (allout-previous-visible-heading 1)
- (allout-next-visible-heading 1))
- (> (setq last-depth (allout-recent-depth)) start-depth)))
- (if (and last-depth (= last-depth start-depth)
- (not (if backward (bobp) (eobp))))
- (setq last-good (point)
- arg (1- arg))
- (setq at-boundary t)))
- (if (and (not (eobp))
- (= arg 0)
- (and (> (or last-depth (allout-depth)) 0)
- (= (allout-recent-depth) start-depth)))
- allout-recent-prefix-beginning
- (goto-char last-good)
- (if (not (interactive-p))
- nil
- (allout-end-of-prefix)
- (error "Hit %s level %d topic, traversed %d of %d requested"
- (if backward "first" "last")
- (allout-recent-depth)
- (- (abs start-arg) arg)
- (abs start-arg))))))
+ (allout-back-to-current-heading)
+ (while (and (not (zerop arg))
+ (if backward
+ (allout-previous-sibling)
+ (allout-next-sibling)))
+ (setq arg (1- arg)))
+ (if (not (interactive-p))
+ nil
+ (allout-end-of-prefix)
+ (if (not (zerop arg))
+ (error "Hit %s level %d topic, traversed %d of %d requested"
+ (if backward "first" "last")
+ allout-recent-depth
+ (- (abs start-arg) arg)
+ (abs start-arg))))))
;;;_ > allout-backward-current-level (arg)
(defun allout-backward-current-level (arg)
"Inverse of `allout-forward-current-level'."
@@ -2977,34 +3208,41 @@ this-command accordingly.
Returns the qualifying command, if any, else nil."
(interactive)
- (let* ((key-num (cond ((numberp last-command-char) last-command-char)
+ (let* ((key-string (if (numberp last-command-char)
+ (char-to-string last-command-char)))
+ (key-num (cond ((numberp last-command-char) last-command-char)
;; for XEmacs character type:
((and (fboundp 'characterp)
(apply 'characterp (list last-command-char)))
(apply 'char-to-int (list last-command-char)))
(t 0)))
- mapped-binding
- (on-bullet (eq (point) (allout-current-bullet-pos))))
+ mapped-binding)
(if (zerop key-num)
nil
- (if (and (<= 33 key-num)
- (setq mapped-binding
+ (if (and
+ ;; exclude control chars and escape:
+ (<= 33 key-num)
+ (setq mapped-binding
+ (or (and (assoc key-string allout-keybindings-list)
+ ;; translate literal membership on list:
+ (cadr (assoc key-string allout-keybindings-list)))
+ ;; translate as a keybinding:
(key-binding (concat allout-command-prefix
(char-to-string
- (if (and (<= 97 key-num) ; "a"
+ (if (and (<= 97 key-num) ; "a"
(>= 122 key-num)) ; "z"
(- key-num 96) key-num)))
- t)))
- ;; Qualified with the allout prefix - do hot-spot operation.
+ t))))
+ ;; Qualified as an allout command - do hot-spot operation.
(setq allout-post-goto-bullet t)
;; accept-defaults nil, or else we'll get allout-item-icon-key-handler.
(setq mapped-binding (key-binding (char-to-string key-num))))
(while (keymapp mapped-binding)
(setq mapped-binding
- (lookup-key mapped-binding (read-key-sequence-vector nil t))))
+ (lookup-key mapped-binding (vector (read-char)))))
(if mapped-binding
(setq this-command mapped-binding)))))
@@ -3036,7 +3274,7 @@ Offer one suitable for current depth DEPTH as default."
(setq choice (solicit-char-in-string
(format "Select bullet: %s ('%s' default): "
sans-escapes
- default-bullet)
+ (substring-no-properties default-bullet))
sans-escapes
t)))
(message "")
@@ -3275,7 +3513,7 @@ Nuances:
(allout-ascend-to-depth depth))
((>= relative-depth 1) nil)
(t (allout-back-to-current-heading)))
- (setq ref-depth (allout-recent-depth))
+ (setq ref-depth allout-recent-depth)
(setq ref-bullet
(if (> allout-recent-prefix-end 1)
(allout-recent-bullet)
@@ -3363,7 +3601,7 @@ Nuances:
(setq dbl-space t))
(if (save-excursion
(allout-next-heading)
- (when (> (allout-recent-depth) ref-depth)
+ (when (> allout-recent-depth ref-depth)
;; This is an offspring.
(forward-line -1)
(looking-at "^\\s-*$")))
@@ -3388,7 +3626,13 @@ Nuances:
(if (and dbl-space (not (> relative-depth 0)))
(newline 1))
(if (and (not (eobp))
- (not (bolp)))
+ (or (not (bolp))
+ (and (not (bobp))
+ ;; bolp doesnt detect concealed
+ ;; trailing newlines, compensate:
+ (save-excursion
+ (forward-char -1)
+ (allout-hidden-p)))))
(forward-char 1))))
))
(setq start (point))
@@ -3507,23 +3751,28 @@ Note that refill of indented paragraphs is not done."
(interactive "p")
(let ((initial-col (current-column))
(on-bullet (eq (point)(allout-current-bullet-pos)))
+ from to
(backwards (if (< arg 0)
(setq arg (* arg -1)))))
(while (> arg 0)
(save-excursion (allout-back-to-current-heading)
(allout-end-of-prefix)
+ (setq from allout-recent-prefix-beginning
+ to allout-recent-prefix-end)
(allout-rebullet-heading t ;;; solicit
nil ;;; depth
nil ;;; number-control
nil ;;; index
- t)) ;;; do-successors
+ t) ;;; do-successors
+ (run-hook-with-args 'allout-exposure-change-hook
+ from to t))
(setq arg (1- arg))
(if (<= arg 0)
nil
(setq initial-col nil) ; Override positioning back to init col
(if (not backwards)
(allout-next-visible-heading 1)
- (allout-goto-prefix)
+ (allout-goto-prefix-doublechecked)
(allout-next-visible-heading -1))))
(message "Done.")
(cond (on-bullet (goto-char (allout-current-bullet-pos)))
@@ -3573,7 +3822,7 @@ this function."
(new-depth (or new-depth current-depth))
(mb allout-recent-prefix-beginning)
(me allout-recent-prefix-end)
- (current-bullet (buffer-substring (- me 1) me))
+ (current-bullet (buffer-substring-no-properties (- me 1) me))
(new-prefix (allout-make-topic-prefix current-bullet
nil
new-depth
@@ -3627,11 +3876,17 @@ this function."
) ; let* ((current-depth (allout-depth))...)
) ; defun
;;;_ > allout-rebullet-topic (arg)
-(defun allout-rebullet-topic (arg)
+(defun allout-rebullet-topic (arg &optional sans-offspring)
"Rebullet the visible topic containing point and all contained subtopics.
Descends into invisible as well as visible topics, however.
+When optional sans-offspring is non-nil, subtopics are not
+shifted. \(Shifting a topic outwards without shifting its
+offspring is disallowed, since this would create a \"containment
+discontinuity\", where the depth difference between a topic and
+its immediate offspring is greater than one.)
+
With repeat count, shift topic depth by that amount."
(interactive "P")
(let ((start-col (current-column)))
@@ -3642,17 +3897,18 @@ With repeat count, shift topic depth by that amount."
;; Fill the user in, in case we're shifting a big topic:
(if (not (zerop arg)) (message "Shifting..."))
(allout-back-to-current-heading)
- (if (<= (+ (allout-recent-depth) arg) 0)
+ (if (<= (+ allout-recent-depth arg) 0)
(error "Attempt to shift topic below level 1"))
- (allout-rebullet-topic-grunt arg)
+ (allout-rebullet-topic-grunt arg nil nil nil nil sans-offspring)
(if (not (zerop arg)) (message "Shifting... done.")))
(move-to-column (max 0 (+ start-col arg)))))
-;;;_ > allout-rebullet-topic-grunt (&optional relative-depth ...)
+;;;_ > allout-rebullet-topic-grunt (&optional relative-depth ...)
(defun allout-rebullet-topic-grunt (&optional relative-depth
starting-depth
starting-point
index
- do-successors)
+ do-successors
+ sans-offspring)
"Like `allout-rebullet-topic', but on nearest containing topic
\(visible or not).
@@ -3663,8 +3919,23 @@ All arguments are optional.
First arg RELATIVE-DEPTH means to shift the depth of the entire
topic that amount.
-The rest of the args are for internal recursive use by the function
-itself. The are STARTING-DEPTH, STARTING-POINT, and INDEX."
+Several subsequent args are for internal recursive use by the function
+itself: STARTING-DEPTH, STARTING-POINT, and INDEX.
+
+Finally, if optional SANS-OFFSPRING is non-nil then the offspring
+are not shifted. \(Shifting a topic outwards without shifting
+its offspring is disallowed, since this would create a
+\"containment discontinuity\", where the depth difference between
+a topic and its immediate offspring is greater than one..)"
+
+ ;; XXX the recursion here is peculiar, and in general the routine may
+ ;; need simplification with refactoring.
+
+ (if (and sans-offspring
+ relative-depth
+ (< relative-depth 0))
+ (error (concat "Attempt to shift topic outwards without offspring,"
+ " would cause containment discontinuity.")))
(let* ((relative-depth (or relative-depth 0))
(new-depth (allout-depth))
@@ -3676,44 +3947,57 @@ itself. The are STARTING-DEPTH, STARTING-POINT, and INDEX."
(and (or (zerop relative-depth)
(not on-starting-call))
(allout-sibling-index))))
+ (starting-index index)
(moving-outwards (< 0 relative-depth))
- (starting-point (or starting-point (point))))
+ (starting-point (or starting-point (point)))
+ (local-point (point)))
;; Sanity check for excessive promotion done only on starting call:
(and on-starting-call
moving-outwards
(> 0 (+ starting-depth relative-depth))
- (error "Attempt to shift topic out beyond level 1")) ;;; ====>
+ (error "Attempt to shift topic out beyond level 1"))
(cond ((= starting-depth new-depth)
- ;; We're at depth to work on this one:
- (allout-rebullet-heading nil ;;; solicit
- (+ starting-depth ;;; starting-depth
- relative-depth)
- nil ;;; number
- index ;;; index
- ;; Every contained topic will get hit,
- ;; and we have to get to outside ones
- ;; deliberately:
- nil) ;;; do-successors
- ;; ... and work on subsequent ones which are at greater depth:
- (setq index 0)
- (allout-next-heading)
- (while (and (not (eobp))
- (< starting-depth (allout-recent-depth)))
- (setq index (1+ index))
- (allout-rebullet-topic-grunt relative-depth ;;; relative-depth
- (1+ starting-depth);;;starting-depth
- starting-point ;;; starting-point
- index))) ;;; index
+ ;; We're at depth to work on this one.
+
+ ;; When shifting out we work on the children before working on
+ ;; the parent to avoid interim `allout-aberrant-container-p'
+ ;; aberrancy, and vice-versa when shifting in:
+ (if (>= relative-depth 0)
+ (allout-rebullet-heading nil
+ (+ starting-depth relative-depth)
+ nil ;;; number
+ index
+ nil)) ;;; do-successors
+ (when (not sans-offspring)
+ ;; ... and work on subsequent ones which are at greater depth:
+ (setq index 0)
+ (allout-next-heading)
+ (while (and (not (eobp))
+ (< starting-depth (allout-depth)))
+ (setq index (1+ index))
+ (allout-rebullet-topic-grunt relative-depth
+ (1+ starting-depth)
+ starting-point
+ index)))
+ (when (< relative-depth 0)
+ (save-excursion
+ (goto-char local-point)
+ (allout-rebullet-heading nil ;;; solicit
+ (+ starting-depth relative-depth)
+ nil ;;; number
+ starting-index
+ nil)))) ;;; do-successors
((< starting-depth new-depth)
;; Rare case - subtopic more than one level deeper than parent.
;; Treat this one at an even deeper level:
- (allout-rebullet-topic-grunt relative-depth ;;; relative-depth
- new-depth ;;; starting-depth
- starting-point ;;; starting-point
- index))) ;;; index
+ (allout-rebullet-topic-grunt relative-depth
+ new-depth
+ starting-point
+ index
+ sans-offspring)))
(if on-starting-call
(progn
@@ -3721,8 +4005,8 @@ itself. The are STARTING-DEPTH, STARTING-POINT, and INDEX."
;; if topic has changed depth
(if (or do-successors
(and (not (zerop relative-depth))
- (or (= (allout-recent-depth) starting-depth)
- (= (allout-recent-depth) (+ starting-depth
+ (or (= allout-recent-depth starting-depth)
+ (= allout-recent-depth (+ starting-depth
relative-depth)))))
(allout-rebullet-heading nil nil nil nil t))
;; Now rectify numbering of new siblings of the adjusted topic,
@@ -3747,24 +4031,24 @@ Returns final depth."
was-eobp)
(while (and (not (eobp))
(allout-depth)
- (>= (allout-recent-depth) depth)
+ (>= allout-recent-depth depth)
(>= ascender depth))
; Skip over all topics at
; lesser depths, which can not
; have been disturbed:
(while (and (not (setq was-eobp (eobp)))
- (> (allout-recent-depth) ascender))
+ (> allout-recent-depth ascender))
(allout-next-heading))
; Prime ascender for ascension:
- (setq ascender (1- (allout-recent-depth)))
- (if (>= (allout-recent-depth) depth)
+ (setq ascender (1- allout-recent-depth))
+ (if (>= allout-recent-depth depth)
(allout-rebullet-heading nil ;;; solicit
nil ;;; depth
nil ;;; number-control
nil ;;; index
t)) ;;; do-successors
(if was-eobp (goto-char (point-max)))))
- (allout-recent-depth))
+ allout-recent-depth)
;;;_ > allout-number-siblings (&optional denumber)
(defun allout-number-siblings (&optional denumber)
"Assign numbered topic prefix to this topic and its siblings.
@@ -3780,7 +4064,7 @@ rebulleting each topic at this level."
(save-excursion
(allout-back-to-current-heading)
(allout-beginning-of-level)
- (let ((depth (allout-recent-depth))
+ (let ((depth allout-recent-depth)
(index (if (not denumber) 1))
(use-bullet (equal '(16) denumber))
(more t))
@@ -3794,55 +4078,84 @@ rebulleting each topic at this level."
(setq more (allout-next-sibling depth nil))))))
;;;_ > allout-shift-in (arg)
(defun allout-shift-in (arg)
- "Increase depth of current heading and any topics collapsed within it.
+ "Increase depth of current heading and any items collapsed within it.
+
+With a negative argument, the item is shifted out using
+`allout-shift-out', instead.
+
+With an argument greater than one, shift-in the item but not its
+offspring, making the item into a sibling of its former children,
+and a child of sibling that formerly preceeded it.
+
+You are not allowed to shift the first offspring of a topic
+inwards, because that would yield a \"containment
+discontinuity\", where the depth difference between a topic and
+its immediate offspring is greater than one. The first topic in
+the file can be adjusted to any positive depth, however."
-We disallow shifts that would result in the topic having a depth more than
-one level greater than the immediately previous topic, to avoid containment
-discontinuity. The first topic in the file can be adjusted to any positive
-depth, however."
(interactive "p")
- (if (> arg 0)
- ;; refuse to create a containment discontinuity:
- (save-excursion
- (allout-back-to-current-heading)
- (if (not (bobp))
- (let* ((current-depth (allout-recent-depth))
- (start-point (point))
- (predecessor-depth (progn
- (forward-char -1)
- (allout-goto-prefix)
- (if (< (point) start-point)
- (allout-recent-depth)
- 0))))
- (if (and (> predecessor-depth 0)
- (> (+ current-depth arg)
- (1+ predecessor-depth)))
- (error (concat "Disallowed shift deeper than"
- " containing topic's children.")))))))
- (let ((where (point))
- has-successor)
- (if (and (< arg 0)
- (allout-current-topic-collapsed-p)
- (save-excursion (allout-next-sibling)))
- (setq has-successor t))
- (allout-rebullet-topic arg)
- (when (< arg 0)
- (save-excursion
- (if (allout-ascend)
- (allout-show-children)))
- (if has-successor
- (allout-show-children)))
- (run-hook-with-args 'allout-structure-shifted-hook arg where)))
+ (if (< arg 0)
+ (allout-shift-out (* arg -1))
+ ;; refuse to create a containment discontinuity:
+ (save-excursion
+ (allout-back-to-current-heading)
+ (if (not (bobp))
+ (let* ((current-depth allout-recent-depth)
+ (start-point (point))
+ (predecessor-depth (progn
+ (forward-char -1)
+ (allout-goto-prefix-doublechecked)
+ (if (< (point) start-point)
+ allout-recent-depth
+ 0))))
+ (if (and (> predecessor-depth 0)
+ (> (1+ current-depth)
+ (1+ predecessor-depth)))
+ (error (concat "Disallowed shift deeper than"
+ " containing topic's children."))))))
+ (let ((where (point)))
+ (allout-rebullet-topic 1 (and (> arg 1) 'sans-offspring))
+ (run-hook-with-args 'allout-structure-shifted-hook arg where))))
;;;_ > allout-shift-out (arg)
(defun allout-shift-out (arg)
"Decrease depth of current heading and any topics collapsed within it.
+This will make the item a sibling of its former container.
+
+With a negative argument, the item is shifted in using
+`allout-shift-in', instead.
+
+With an argument greater than one, shift-out the item's offspring
+but not the item itself, making the former children siblings of
+the item.
-We disallow shifts that would result in the topic having a depth more than
-one level greater than the immediately previous topic, to avoid containment
-discontinuity. The first topic in the file can be adjusted to any positive
-depth, however."
+With an argument greater than 1, the item's offspring are shifted
+out without shifting the item. This will make the immediate
+subtopics into siblings of the item."
(interactive "p")
- (allout-shift-in (* arg -1)))
+ (if (< arg 0)
+ (allout-shift-in (* arg -1))
+ ;; Get proper exposure in this area:
+ (save-excursion (if (allout-ascend)
+ (allout-show-children)))
+ ;; Show collapsed children if there's a successor which will become
+ ;; their sibling:
+ (if (and (allout-current-topic-collapsed-p)
+ (save-excursion (allout-next-sibling)))
+ (allout-show-children))
+ (let ((where (and (allout-depth) allout-recent-prefix-beginning)))
+ (save-excursion
+ (if (> arg 1)
+ ;; Shift the offspring but not the topic:
+ (let ((children-chart (allout-chart-subtree 1)))
+ (if (listp (car children-chart))
+ ;; whoops:
+ (setq children-chart (allout-flatten children-chart)))
+ (save-excursion
+ (dolist (child-point children-chart)
+ (goto-char child-point)
+ (allout-shift-out 1))))
+ (allout-rebullet-topic (* arg -1))))
+ (run-hook-with-args 'allout-structure-shifted-hook (* arg -1) where))))
;;;_ : Surgery (kill-ring) functions with special provisions for outlines:
;;;_ > allout-kill-line (&optional arg)
(defun allout-kill-line (&optional arg)
@@ -3857,27 +4170,32 @@ depth, however."
(kill-line arg)
;; Ah, have to watch out for adjustments:
(let* ((beg (point))
+ end
(beg-hidden (allout-hidden-p))
(end-hidden (save-excursion (allout-end-of-current-line)
+ (setq end (point))
(allout-hidden-p)))
- (depth (allout-depth))
- (collapsed (allout-current-topic-collapsed-p)))
+ (depth (allout-depth)))
- (if collapsed
- (put-text-property beg (1+ beg) 'allout-was-collapsed t)
- (remove-text-properties beg (1+ beg) '(allout-was-collapsed t)))
+ (allout-annotate-hidden beg end)
(if (and (not beg-hidden) (not end-hidden))
(allout-unprotected (kill-line arg))
(kill-line arg))
- ; Provide some feedback:
- (sit-for 0)
(if allout-numbered-bullet
(save-excursion ; Renumber subsequent topics if needed:
(if (not (looking-at allout-regexp))
(allout-next-heading))
(allout-renumber-to-depth depth)))
(run-hook-with-args 'allout-structure-deleted-hook depth (point)))))
+;;;_ > allout-copy-line-as-kill ()
+(defun allout-copy-line-as-kill ()
+ "Like allout-kill-topic, but save to kill ring instead of deleting."
+ (interactive)
+ (let ((buffer-read-only t))
+ (condition-case nil
+ (allout-kill-line)
+ (buffer-read-only nil))))
;;;_ > allout-kill-topic ()
(defun allout-kill-topic ()
"Kill topic together with subtopics.
@@ -3889,20 +4207,13 @@ Trailing whitespace is killed with a topic if that whitespace:
- would not be added to whitespace already separating the topic from the
previous one.
-Completely collapsed topics are marked as such, for re-collapse
-when yank with allout-yank into an outline as a heading."
-
- ;; Some finagling is done to make complex topic kills appear faster
- ;; than they actually are. A redisplay is performed immediately
- ;; after the region is deleted, though the renumbering process
- ;; has yet to be performed. This means that there may appear to be
- ;; a lag *after* a kill has been performed.
+Topic exposure is marked with text-properties, to be used by
+allout-yank-processing for exposure recovery."
(interactive)
(let* ((inhibit-field-text-motion t)
- (collapsed (allout-current-topic-collapsed-p))
(beg (prog1 (allout-back-to-current-heading) (beginning-of-line)))
- (depth (allout-recent-depth)))
+ (depth allout-recent-depth))
(allout-end-of-current-subtree)
(if (and (/= (current-column) 0) (not (eobp)))
(forward-char 1))
@@ -3910,21 +4221,99 @@ when yank with allout-yank into an outline as a heading."
(if (and (looking-at "\n")
(or (save-excursion
(or (not (allout-next-heading))
- (= depth (allout-recent-depth))))
+ (= depth allout-recent-depth)))
(and (> (- beg (point-min)) 3)
(string= (buffer-substring (- beg 2) beg) "\n\n"))))
(forward-char 1)))
- (if collapsed
- (allout-unprotected
- (put-text-property beg (1+ beg) 'allout-was-collapsed t))
- (allout-unprotected
- (remove-text-properties beg (1+ beg) '(allout-was-collapsed t))))
+ (allout-annotate-hidden beg (point))
+
(allout-unprotected (kill-region beg (point)))
- (sit-for 0)
(save-excursion
(allout-renumber-to-depth depth))
(run-hook-with-args 'allout-structure-deleted-hook depth (point))))
+;;;_ > allout-copy-topic-as-kill ()
+(defun allout-copy-topic-as-kill ()
+ "Like allout-kill-topic, but save to kill ring instead of deleting."
+ (interactive)
+ (let ((buffer-read-only t))
+ (condition-case nil
+ (allout-kill-topic)
+ (buffer-read-only (message "Topic copied...")))))
+;;;_ > allout-annotate-hidden (begin end)
+(defun allout-annotate-hidden (begin end)
+ "Qualify text with properties to indicate exposure status."
+
+ (let ((was-modified (buffer-modified-p))
+ (buffer-read-only nil))
+ (allout-unprotected
+ (remove-text-properties begin end '(allout-was-hidden t)))
+ (save-excursion
+ (goto-char begin)
+ (let (done next prev overlay)
+ (while (not done)
+ ;; at or advance to start of next hidden region:
+ (if (not (allout-hidden-p))
+ (setq next
+ (max (1+ (point))
+ (next-single-char-property-change (point)
+ 'invisible
+ nil end))))
+ (if (or (not next) (eq prev next))
+ ;; still not at start of hidden area - must not be any left.
+ (setq done t)
+ (goto-char next)
+ (setq prev next)
+ (if (not (allout-hidden-p))
+ ;; still not at start of hidden area.
+ (setq done t)
+ (setq overlay (allout-get-invisibility-overlay))
+ (setq next (overlay-end overlay)
+ prev next)
+ ;; advance to end of this hidden area:
+ (when next
+ (goto-char next)
+ (allout-unprotected
+ (put-text-property (overlay-start overlay) next
+ 'allout-was-hidden t))))))))
+ (set-buffer-modified-p was-modified)))
+;;;_ > allout-hide-by-annotation (begin end)
+(defun allout-hide-by-annotation (begin end)
+ "Translate text properties indicating exposure status into actual exposure."
+ (save-excursion
+ (goto-char begin)
+ (let ((was-modified (buffer-modified-p))
+ done next prev)
+ (while (not done)
+ ;; at or advance to start of next annotation:
+ (if (not (get-text-property (point) 'allout-was-hidden))
+ (setq next (next-single-char-property-change (point)
+ 'allout-was-hidden
+ nil end)))
+ (if (or (not next) (eq prev next))
+ ;; no more or not advancing - must not be any left.
+ (setq done t)
+ (goto-char next)
+ (setq prev next)
+ (if (not (get-text-property (point) 'allout-was-hidden))
+ ;; still not at start of annotation.
+ (setq done t)
+ ;; advance to just after end of this annotation:
+ (setq next (next-single-char-property-change (point)
+ 'allout-was-hidden
+ nil end))
+ (overlay-put (make-overlay prev next)
+ 'category 'allout-exposure-category)
+ (allout-unprotected
+ (remove-text-properties prev next '(allout-was-hidden t)))
+ (setq prev next)
+ (if next (goto-char next)))))
+ (set-buffer-modified-p was-modified))))
+;;;_ > allout-remove-exposure-annotation (begin end)
+(defun allout-remove-exposure-annotation (begin end)
+ "Remove text properties indicating exposure status."
+ (remove-text-properties begin end '(allout-was-hidden t)))
+
;;;_ > allout-yank-processing ()
(defun allout-yank-processing (&optional arg)
@@ -3955,12 +4344,10 @@ however, are left exactly like normal, non-allout-specific yanks."
(let* ((subj-beg (point))
(into-bol (bolp))
(subj-end (allout-mark-marker t))
- (was-collapsed (get-text-property subj-beg 'allout-was-collapsed))
;; 'resituate' if yanking an entire topic into topic header:
(resituate (and (allout-e-o-prefix-p)
- (looking-at (concat "\\(" allout-regexp "\\)"))
- (allout-prefix-data (match-beginning 1)
- (match-end 1))))
+ (looking-at allout-regexp)
+ (allout-prefix-data)))
;; `rectify-numbering' if resituating (where several topics may
;; be resituating) or yanking a topic into a topic slot (bol):
(rectify-numbering (or resituate
@@ -3968,7 +4355,7 @@ however, are left exactly like normal, non-allout-specific yanks."
(if resituate
; The yanked stuff is a topic:
(let* ((prefix-len (- (match-end 1) subj-beg))
- (subj-depth (allout-recent-depth))
+ (subj-depth allout-recent-depth)
(prefix-bullet (allout-recent-bullet))
(adjust-to-depth
;; Nil if adjustment unnecessary, otherwise depth to which
@@ -3982,15 +4369,13 @@ however, are left exactly like normal, non-allout-specific yanks."
(beginning-of-line)
(not (= (point) subj-beg)))
(looking-at allout-regexp)
- (allout-prefix-data (match-beginning 0)
- (match-end 0)))
- (allout-recent-depth))))
+ (allout-prefix-data))
+ allout-recent-depth)))
(more t))
(setq rectify-numbering allout-numbered-bullet)
(if adjust-to-depth
; Do the adjustment:
(progn
- (message "... yanking") (sit-for 0)
(save-restriction
(narrow-to-region subj-beg subj-end)
; Trim off excessive blank
@@ -4006,7 +4391,7 @@ however, are left exactly like normal, non-allout-specific yanks."
(while more
(allout-back-to-current-heading)
; go as high as we can in each bunch:
- (while (allout-ascend-to-depth (1- (allout-depth))))
+ (while (allout-ascend))
(save-excursion
(allout-rebullet-topic-grunt (- adjust-to-depth
subj-depth))
@@ -4015,7 +4400,6 @@ however, are left exactly like normal, non-allout-specific yanks."
(progn (widen)
(forward-char -1)
(narrow-to-region subj-beg (point))))))
- (message "")
;; Preserve new bullet if it's a distinctive one, otherwise
;; use old one:
(if (string-match (regexp-quote prefix-bullet)
@@ -4042,19 +4426,19 @@ however, are left exactly like normal, non-allout-specific yanks."
(progn
(save-excursion
; Give some preliminary feedback:
- (message "... reconciling numbers") (sit-for 0)
+ (message "... reconciling numbers")
; ... and renumber, in case necessary:
(goto-char subj-beg)
- (if (allout-goto-prefix)
+ (if (allout-goto-prefix-doublechecked)
(allout-rebullet-heading nil ;;; solicit
(allout-depth) ;;; depth
nil ;;; number-control
nil ;;; index
t))
(message ""))))
- (when (and (or into-bol resituate) was-collapsed)
- (remove-text-properties subj-beg (1+ subj-beg) '(allout-was-collapsed))
- (allout-hide-current-subtree))
+ (if (or into-bol resituate)
+ (allout-hide-by-annotation (point) (allout-mark-marker t))
+ (allout-remove-exposure-annotation (allout-mark-marker t) (point)))
(if (not resituate)
(exchange-point-and-mark))
(run-hook-with-args 'allout-structure-added-hook subj-beg subj-end))))
@@ -4139,7 +4523,7 @@ by pops to non-distinctive yanks. Bug..."
(error "%s not found and can't be created" file-name)))
(condition-case failure
(find-file-other-window file-name)
- ('error failure))
+ (error failure))
(error "%s not found" file-name))
)
)
@@ -4198,7 +4582,7 @@ the exposure."
(interactive)
(save-excursion
(let (beg end)
- (allout-goto-prefix)
+ (allout-goto-prefix-doublechecked)
(setq beg (if (allout-hidden-p) (1- (point)) (point)))
(setq end (allout-pre-next-prefix))
(allout-flag-region beg end nil)
@@ -4235,8 +4619,27 @@ point of non-opened subtree?)"
(save-excursion
(allout-beginning-of-current-line)
(save-restriction
- (let* ((chart (allout-chart-subtree (or level 1)))
- (to-reveal (allout-chart-to-reveal chart (or level 1))))
+ (let* (depth
+ (chart (allout-chart-subtree (or level 1)))
+ (to-reveal (or (allout-chart-to-reveal chart (or level 1))
+ ;; interactive, show discontinuous children:
+ (and chart
+ (interactive-p)
+ (save-excursion
+ (allout-back-to-current-heading)
+ (setq depth (allout-current-depth))
+ (and (allout-next-heading)
+ (> allout-recent-depth
+ (1+ depth))))
+ (message
+ "Discontinuous offspring; use `%s %s'%s."
+ (substitute-command-keys
+ "\\[universal-argument]")
+ (substitute-command-keys
+ "\\[allout-shift-out]")
+ " to elevate them.")
+ (allout-chart-to-reveal
+ chart (- allout-recent-depth depth))))))
(goto-char start-point)
(when (and strict (allout-hidden-p))
;; Concealed root would already have been taken care of,
@@ -4267,14 +4670,12 @@ Useful for coherently exposing to a random point in a hidden region."
(save-excursion
(let ((inhibit-field-text-motion t)
(orig-pt (point))
- (orig-pref (allout-goto-prefix))
+ (orig-pref (allout-goto-prefix-doublechecked))
(last-at (point))
bag-it)
(while (or bag-it (allout-hidden-p))
(while (allout-hidden-p)
- ;; XXX We would use `(move-beginning-of-line 1)', but it gets
- ;; stuck on hidden newlines at column 80, as of GNU Emacs 22.0.50.
- (beginning-of-line)
+ (move-beginning-of-line 1)
(if (allout-hidden-p) (forward-char -1)))
(if (= last-at (setq last-at (point)))
;; Oops, we're not making any progress! Show the current
@@ -4286,9 +4687,9 @@ Useful for coherently exposing to a random point in a hidden region."
(beep)
(message "%s: %s"
"allout-show-to-offshoot: "
- "Aberrant nesting encountered.")))
- (allout-show-children)
- (goto-char orig-pref))
+ "Aberrant nesting encountered."))
+ (allout-show-children)
+ (goto-char orig-pref)))
(goto-char orig-pt)))
(if (allout-hidden-p)
(allout-show-entry)))
@@ -4368,10 +4769,10 @@ siblings, even if the target topic is already closed."
(current-exposed (not (allout-current-topic-collapsed-p t))))
(cond (current-exposed (allout-flag-current-subtree t))
(just-close nil)
- ((allout-up-current-level 1 t) (allout-hide-current-subtree))
+ ((allout-ascend) (allout-hide-current-subtree))
(t (goto-char 0)
(message sibs-msg)
- (allout-goto-prefix)
+ (allout-goto-prefix-doublechecked)
(allout-expose-topic '(0 :))
(message (concat sibs-msg " Done."))))
(goto-char from)))
@@ -4636,7 +5037,7 @@ Examples:
level, and expose children of subsequent topics at current
level *except* for the last, which should be opened completely."
(list 'save-excursion
- '(if (not (or (allout-goto-prefix)
+ '(if (not (or (allout-goto-prefix-doublechecked)
(allout-next-heading)))
(error "allout-new-exposure: Can't find any outline topics"))
(list 'allout-expose-topic (list 'quote spec))))
@@ -4758,20 +5159,20 @@ header and body. The elements of that list are:
(goto-char start)
(beginning-of-line)
;; Goto initial topic, and register preceeding stuff, if any:
- (if (> (allout-goto-prefix) start)
+ (if (> (allout-goto-prefix-doublechecked) start)
;; First topic follows beginning point - register preliminary stuff:
(setq result (list (list 0 "" nil
(buffer-substring start (1- (point)))))))
(while (and (not done)
(not (eobp)) ; Loop until we've covered the region.
(not (> (point) end)))
- (setq depth (allout-recent-depth) ; Current topics depth,
+ (setq depth allout-recent-depth ; Current topics depth,
bullet (allout-recent-bullet) ; ... bullet,
prefix (allout-recent-prefix)
beg (progn (allout-end-of-prefix t) (point))) ; and beginning.
(setq done ; The boundary for the current topic:
(not (allout-next-visible-heading 1)))
- (setq new-depth (allout-recent-depth))
+ (setq new-depth allout-recent-depth)
(setq gone-out out
out (< new-depth depth))
(beginning-of-line)
@@ -4788,7 +5189,8 @@ header and body. The elements of that list are:
(allout-back-to-visible-text)))
strings))
(when (< (point) next) ; Resume from after hid text, if any.
- (line-move 1))
+ (line-move 1)
+ (beginning-of-line))
(setq beg (point)))
;; Accumulate list for this topic:
(setq strings (nreverse strings))
@@ -5040,10 +5442,10 @@ environment. Leaves point at the end of the line."
;;"\\\\\\|\\{\\|\\}\\|\\_\\|\\$\\|\\\"\\|\\&\\|\\^\\|\\-\\|\\*\\|#"
end ; bounded by end-of-line
1) ; no matches, move to end & return nil
- (goto-char (match-beginning 0))
+ (goto-char (match-beginning 2))
(insert "\\")
(setq end (1+ end))
- (goto-char (1+ (match-end 0)))))))
+ (goto-char (1+ (match-end 2)))))))
;;;_ > allout-insert-latex-header (buffer)
(defun allout-insert-latex-header (buffer)
"Insert initial LaTeX commands at point in BUFFER."
@@ -5089,7 +5491,7 @@ environment. Leaves point at the end of the line."
(allout-latex-verb-quote (if allout-title
(condition-case nil
(eval allout-title)
- ('error "<unnamed buffer>"))
+ (error "<unnamed buffer>"))
"Unnamed Outline"))
"}\n"
"\\end{center}\n\n"))
@@ -5228,7 +5630,7 @@ auto-encryption specifics.
default to symmetric encryption - you must manually \(re)encrypt key-pair
encrypted topics if you want them to continue to use the key-pair cipher.
-Level-1 topics, with prefix consisting solely of an `*' asterisk, cannot be
+Level-one topics, with prefix consisting solely of an `*' asterisk, cannot be
encrypted. If you want to encrypt the contents of a top-level topic, use
\\[allout-shift-in] to increase its depth.
@@ -5291,12 +5693,13 @@ See `allout-toggle-current-subtree-encryption' for more details."
(save-excursion
(allout-end-of-prefix t)
- (if (= (allout-recent-depth) 1)
+ (if (= allout-recent-depth 1)
(error (concat "Cannot encrypt or decrypt level 1 topics -"
" shift it in to make it encryptable")))
(let* ((allout-buffer (current-buffer))
;; Asses location:
+ (bullet-pos allout-recent-prefix-beginning)
(after-bullet-pos (point))
(was-encrypted
(progn (if (= (point-max) after-bullet-pos)
@@ -5362,12 +5765,9 @@ See `allout-toggle-current-subtree-encryption' for more details."
(delete-char 1))
;; Add the is-encrypted bullet qualifier:
(goto-char after-bullet-pos)
- (insert "*"))
- )
- )
- )
- )
- )
+ (insert "*"))))
+ (run-hook-with-args 'allout-structure-added-hook
+ bullet-pos subtree-end))))
;;;_ > allout-encrypt-string (text decrypt allout-buffer key-type for-key
;;; fetch-pass &optional retried verifying
;;; passphrase)
@@ -5512,7 +5912,8 @@ Returns the resulting string, or nil if the transformation fails."
(error "decryption failed")))))
(setq result-text
- (buffer-substring 1 (- (point-max) (if decrypt 0 1))))
+ (buffer-substring-no-properties
+ 1 (- (point-max) (if decrypt 0 1))))
)
;; validate result - non-empty
@@ -5924,17 +6325,8 @@ save. See `allout-encrypt-unencrypted-on-saves' for more info."
)
;;;_ #9 miscellaneous
-;;;_ > allout-mark-topic ()
-(defun allout-mark-topic ()
- "Put the region around topic currently containing point."
- (interactive)
- (let ((inhibit-field-text-motion t))
- (beginning-of-line))
- (allout-goto-prefix)
- (push-mark (point))
- (allout-end-of-current-subtree)
- (exchange-point-and-mark))
-;;;_ > outlineify-sticky ()
+;;;_ : Mode:
+;;;_ > outlineify-sticky ()
;; outlinify-sticky is correct spelling; provide this alias for sticklers:
;;;###autoload
(defalias 'outlinify-sticky 'outlineify-sticky)
@@ -5958,7 +6350,7 @@ setup for auto-startup."
"`allout-mode' docstring: `^Hm'."))
(allout-adjust-file-variable
"allout-layout" (or allout-layout '(-1 : 0))))))
-;;;_ > allout-file-vars-section-data ()
+;;;_ > allout-file-vars-section-data ()
(defun allout-file-vars-section-data ()
"Return data identifying the file-vars section, or nil if none.
@@ -5986,7 +6378,7 @@ Returns list `(beginning-point prefix-string suffix-string)'."
)
)
)
-;;;_ > allout-adjust-file-variable (varname value)
+;;;_ > allout-adjust-file-variable (varname value)
(defun allout-adjust-file-variable (varname value)
"Adjust the setting of an emacs file variable named VARNAME to VALUE.
@@ -6050,7 +6442,38 @@ enable-local-variables must be true for any of this to happen."
)
)
)
-;;;_ > solicit-char-in-string (prompt string &optional do-defaulting)
+;;;_ > allout-get-configvar-values (varname)
+(defun allout-get-configvar-values (configvar-name)
+ "Return a list of values of the symbols in list bound to CONFIGVAR-NAME.
+
+The user is prompted for removal of symbols that are unbound, and they
+otherwise are ignored.
+
+CONFIGVAR-NAME should be the name of the configuration variable,
+not its value."
+
+ (let ((configvar-value (symbol-value configvar-name))
+ got)
+ (dolist (sym configvar-value)
+ (if (not (boundp sym))
+ (if (yes-or-no-p (format "%s entry `%s' is unbound - remove it? "
+ configvar-name sym))
+ (delq sym (symbol-value configvar-name)))
+ (push (symbol-value sym) got)))
+ (reverse got)))
+;;;_ : Topics:
+;;;_ > allout-mark-topic ()
+(defun allout-mark-topic ()
+ "Put the region around topic currently containing point."
+ (interactive)
+ (let ((inhibit-field-text-motion t))
+ (beginning-of-line))
+ (allout-goto-prefix-doublechecked)
+ (push-mark (point))
+ (allout-end-of-current-subtree)
+ (exchange-point-and-mark))
+;;;_ : UI:
+;;;_ > solicit-char-in-string (prompt string &optional do-defaulting)
(defun solicit-char-in-string (prompt string &optional do-defaulting)
"Solicit (with first arg PROMPT) choice of a character from string STRING.
@@ -6083,7 +6506,8 @@ Optional arg DO-DEFAULTING indicates to accept empty input (CR)."
;; got something out of loop - return it:
got)
)
-;;;_ > regexp-sans-escapes (string)
+;;;_ : Strings:
+;;;_ > regexp-sans-escapes (string)
(defun regexp-sans-escapes (regexp &optional successive-backslashes)
"Return a copy of REGEXP with all character escapes stripped out.
@@ -6106,7 +6530,7 @@ Optional arg SUCCESSIVE-BACKSLASHES is used internally for recursion."
(regexp-sans-escapes (substring regexp 1)))
;; Exclude first char, but maintain count:
(regexp-sans-escapes (substring regexp 1) successive-backslashes))))
-;;;_ > count-trailing-whitespace-region (beg end)
+;;;_ > count-trailing-whitespace-region (beg end)
(defun count-trailing-whitespace-region (beg end)
"Return number of trailing whitespace chars between BEG and END.
@@ -6117,29 +6541,25 @@ If BEG is bigger than END we return 0."
(goto-char beg)
(let ((count 0))
(while (re-search-forward "[ ][ ]*$" end t)
- (goto-char (1+ (match-beginning 0)))
+ (goto-char (1+ (match-beginning 2)))
(setq count (1+ count)))
count))))
-;;;_ > allout-get-configvar-values (varname)
-(defun allout-get-configvar-values (configvar-name)
- "Return a list of values of the symbols in list bound to CONFIGVAR-NAME.
-
-The user is prompted for removal of symbols that are unbound, and they
-otherwise are ignored.
-
-CONFIGVAR-NAME should be the name of the configuration variable,
-not its value."
-
- (let ((configvar-value (symbol-value configvar-name))
- got)
- (dolist (sym configvar-value)
- (if (not (boundp sym))
- (if (yes-or-no-p (format "%s entry `%s' is unbound - remove it? "
- configvar-name sym))
- (delq sym (symbol-value configvar-name)))
- (push (symbol-value sym) got)))
- (reverse got)))
-;;;_ > allout-mark-marker to accommodate divergent emacsen:
+;;;_ > allout-format-quote (string)
+(defun allout-format-quote (string)
+ "Return a copy of string with all \"%\" characters doubled."
+ (apply 'concat
+ (mapcar (lambda (char) (if (= char ?%) "%%" (char-to-string char)))
+ string)))
+;;;_ : lists
+;;;_ > allout-flatten (list)
+(defun allout-flatten (list)
+ "Return a list of all atoms in list."
+ ;; classic.
+ (cond ((null list) nil)
+ ((atom (car list)) (cons (car list) (allout-flatten (cdr list))))
+ (t (append (allout-flatten (car list)) (allout-flatten (cdr list))))))
+;;;_ : Compatability:
+;;;_ > allout-mark-marker to accommodate divergent emacsen:
(defun allout-mark-marker (&optional force buffer)
"Accommodate the different signature for `mark-marker' across Emacsen.
@@ -6148,7 +6568,7 @@ so pass them along when appropriate."
(if (featurep 'xemacs)
(apply 'mark-marker force buffer)
(mark-marker)))
-;;;_ > subst-char-in-string if necessary
+;;;_ > subst-char-in-string if necessary
(if (not (fboundp 'subst-char-in-string))
(defun subst-char-in-string (fromchar tochar string &optional inplace)
"Replace FROMCHAR with TOCHAR in STRING each time it occurs.
@@ -6160,10 +6580,10 @@ Unless optional argument INPLACE is non-nil, return a new string."
(if (eq (aref newstr i) fromchar)
(aset newstr i tochar)))
newstr)))
-;;;_ > wholenump if necessary
+;;;_ > wholenump if necessary
(if (not (fboundp 'wholenump))
(defalias 'wholenump 'natnump))
-;;;_ > remove-overlays if necessary
+;;;_ > remove-overlays if necessary
(if (not (fboundp 'remove-overlays))
(defun remove-overlays (&optional beg end name val)
"Clear BEG and END of overlays whose property NAME has value VAL.
@@ -6190,7 +6610,7 @@ BEG and END default respectively to the beginning and end of buffer."
(move-overlay o end (overlay-end o))
(delete-overlay o)))))))
)
-;;;_ > copy-overlay if necessary - xemacs ~ 21.4
+;;;_ > copy-overlay if necessary - xemacs ~ 21.4
(if (not (fboundp 'copy-overlay))
(defun copy-overlay (o)
"Return a copy of overlay O."
@@ -6202,7 +6622,7 @@ BEG and END default respectively to the beginning and end of buffer."
(while props
(overlay-put o1 (pop props) (pop props)))
o1)))
-;;;_ > add-to-invisibility-spec if necessary - xemacs ~ 21.4
+;;;_ > add-to-invisibility-spec if necessary - xemacs ~ 21.4
(if (not (fboundp 'add-to-invisibility-spec))
(defun add-to-invisibility-spec (element)
"Add ELEMENT to `buffer-invisibility-spec'.
@@ -6212,14 +6632,14 @@ that can be added."
(setq buffer-invisibility-spec (list t)))
(setq buffer-invisibility-spec
(cons element buffer-invisibility-spec))))
-;;;_ > remove-from-invisibility-spec if necessary - xemacs ~ 21.4
+;;;_ > remove-from-invisibility-spec if necessary - xemacs ~ 21.4
(if (not (fboundp 'remove-from-invisibility-spec))
(defun remove-from-invisibility-spec (element)
"Remove ELEMENT from `buffer-invisibility-spec'."
(if (consp buffer-invisibility-spec)
(setq buffer-invisibility-spec (delete element
buffer-invisibility-spec)))))
-;;;_ > move-beginning-of-line if necessary - older emacs, xemacs
+;;;_ > move-beginning-of-line if necessary - older emacs, xemacs
(if (not (fboundp 'move-beginning-of-line))
(defun move-beginning-of-line (arg)
"Move point to beginning of current line as displayed.
@@ -6243,7 +6663,7 @@ To ignore intangibility, bind `inhibit-point-motion-hooks' to t."
(skip-chars-backward "^\n"))
(vertical-motion 0))
)
-;;;_ > move-end-of-line if necessary - older emacs, xemacs
+;;;_ > move-end-of-line if necessary - older emacs, xemacs
(if (not (fboundp 'move-end-of-line))
(defun move-end-of-line (arg)
"Move point to end of current line as displayed.
@@ -6283,7 +6703,7 @@ To ignore intangibility, bind `inhibit-point-motion-hooks' to t."
(setq arg 1)
(setq done t)))))))
)
-;;;_ > line-move-invisible-p if necessary
+;;;_ > line-move-invisible-p if necessary
(if (not (fboundp 'line-move-invisible-p))
(defun line-move-invisible-p (pos)
"Return non-nil if the character after POS is currently invisible."
diff --git a/lisp/bindings.el b/lisp/bindings.el
index 2a2e0f7a94e..29e703ce392 100644
--- a/lisp/bindings.el
+++ b/lisp/bindings.el
@@ -346,7 +346,6 @@ Keymap to display on minor modes.")
(define-key map [mode-line mouse-1] 'mode-line-previous-buffer)
(define-key map [header-line down-mouse-1] 'ignore)
(define-key map [header-line mouse-1] 'mode-line-previous-buffer)
- (define-key map [header-line down-mouse-3] 'ignore)
(define-key map [mode-line mouse-3] 'mode-line-next-buffer)
(define-key map [header-line down-mouse-3] 'ignore)
(define-key map [header-line mouse-3] 'mode-line-next-buffer)
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index c3625947b7b..70552c604b7 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -389,7 +389,7 @@
:link '(custom-manual "(emacs)Undo")
:group 'editing)
-(defgroup modeline nil
+(defgroup mode-line nil
"Content of the modeline."
:group 'environment)
diff --git a/lisp/cus-start.el b/lisp/cus-start.el
index 859d3f51a72..9610800ee0b 100644
--- a/lisp/cus-start.el
+++ b/lisp/cus-start.el
@@ -374,8 +374,9 @@ since it could result in memory overflow and make Emacs crash."
;; xfns.c
(x-bitmap-file-path installation
(repeat (directory :format "%v")))
- (x-use-old-gtk-file-dialog menu boolean "22.1")
+ (x-gtk-use-old-file-dialog menu boolean "22.1")
(x-gtk-show-hidden-files menu boolean "22.1")
+ (x-gtk-file-dialog-help-text menu boolean "22.1")
(x-gtk-whole-detached-tool-bar x boolean "22.1")
;; xterm.c
(x-use-underline-position-properties display boolean "22.1")
diff --git a/lisp/dnd.el b/lisp/dnd.el
index f1e1c6b1b9e..f8cdf9a1239 100644
--- a/lisp/dnd.el
+++ b/lisp/dnd.el
@@ -61,16 +61,16 @@ if some action was made, or nil if the URL is ignored."
(defcustom dnd-open-remote-file-function
(if (eq system-type 'windows-nt)
- 'dnd-open-unc-file
+ 'dnd-open-local-file
'dnd-open-remote-url)
"The function to call when opening a file on a remote machine.
The function will be called with two arguments; URI and ACTION. See
`dnd-open-file' for details.
If nil, then dragging remote files into Emacs will result in an error.
-Predefined functions are `dnd-open-unc-file' and `dnd-open-remote-url'.
-`dnd-open-unc-file' attempts to open the file using its UNC name and is the
-default on MS-Windows. `dnd-open-remote-url' uses `url-handler-mode' and
-is the default except for MS-Windows."
+Predefined functions are `dnd-open-local-file' and `dnd-open-remote-url'.
+`dnd-open-local-file' attempts to open a remote file using its UNC name and
+is the default on MS-Windows. `dnd-open-remote-url' uses `url-handler-mode'
+and is the default except for MS-Windows."
:version "22.1"
:type 'function
:group 'dnd)
@@ -163,7 +163,11 @@ Return nil if URI is not a local file."
The file is opened in the current window, or a new window if
`dnd-open-file-other-window' is set. URI is the url for the file,
and must have the format file:file-name or file:///file-name.
-The last / in file:/// is part of the file name. ACTION is ignored."
+The last / in file:/// is part of the file name. If the system
+natively supports unc file names, then remote urls of the form
+file://server-name/file-name will also be handled by this function.
+An alternative for systems that do not support unc file names is
+`dnd-open-remote-url'. ACTION is ignored."
(let* ((f (dnd-get-local-file-name uri t)))
(if (and f (file-readable-p f))
@@ -174,22 +178,6 @@ The last / in file:/// is part of the file name. ACTION is ignored."
'private)
(error "Can not read %s" uri))))
-(defun dnd-open-unc-file (uri action)
- "Open a remote file using its unc path.
-The file is opened in the current window, or a new window if
-`dnd-open-file-other-window' is set. URI is the url for the file,
-and must have the format file://hostname/file-name. ACTION is ignored.
-//hostname/file-name is the unc path."
- (let ((unc-file (if (string-match "^file:" uri)
- (substring uri 5))))
- (if (and unc-file (file-readable-p unc-file))
- (progn
- (if dnd-open-file-other-window
- (find-file-other-window unc-file)
- (find-file unc-file))
- 'private)
- (error "Invalid file url"))))
-
(defun dnd-open-remote-url (uri action)
"Open a remote file with `find-file' and `url-handler-mode'.
Turns `url-handler-mode' on if not on before. The file is opened in the
diff --git a/lisp/ediff-util.el b/lisp/ediff-util.el
index dff3c6bee61..015e6bfff3e 100644
--- a/lisp/ediff-util.el
+++ b/lisp/ediff-util.el
@@ -4281,6 +4281,11 @@ Mail anyway? (y or n) ")
(setq lis1 (cdr lis1)))
(cdr result)))
+(defun ediff-add-to-history (history-var newelt)
+ (if (fboundp 'add-to-history)
+ (add-to-history history-var newelt)
+ (set history-var (cons newelt (symbol-value history-var)))))
+
(if (fboundp 'copy-sequence)
(defalias 'ediff-copy-list 'copy-sequence)
(defun ediff-copy-list (list)
diff --git a/lisp/ediff.el b/lisp/ediff.el
index 3e0be86b18b..6b37d4c1847 100644
--- a/lisp/ediff.el
+++ b/lisp/ediff.el
@@ -7,8 +7,8 @@
;; Created: February 2, 1994
;; Keywords: comparing, merging, patching, tools, unix
-(defconst ediff-version "2.81" "The current version of Ediff")
-(defconst ediff-date "February 18, 2006" "Date of last update")
+(defconst ediff-version "2.81.1" "The current version of Ediff")
+(defconst ediff-date "September 18, 2006" "Date of last update")
;; This file is part of GNU Emacs.
@@ -210,11 +210,12 @@
ediff-last-dir-B
(file-name-directory f)))
(progn
- (add-to-history 'file-name-history
- (ediff-abbreviate-file-name
- (expand-file-name
- (file-name-nondirectory f)
- dir-B)))
+ (ediff-add-to-history
+ 'file-name-history
+ (ediff-abbreviate-file-name
+ (expand-file-name
+ (file-name-nondirectory f)
+ dir-B)))
(ediff-get-default-file-name f 1)))
)))
(ediff-files-internal file-A
@@ -245,22 +246,24 @@
ediff-last-dir-B
(file-name-directory f)))
(progn
- (add-to-history 'file-name-history
- (ediff-abbreviate-file-name
- (expand-file-name
- (file-name-nondirectory f)
- dir-B)))
+ (ediff-add-to-history
+ 'file-name-history
+ (ediff-abbreviate-file-name
+ (expand-file-name
+ (file-name-nondirectory f)
+ dir-B)))
(ediff-get-default-file-name f 1))))
(ediff-read-file-name "File C to compare"
(setq dir-C (if ediff-use-last-dir
ediff-last-dir-C
(file-name-directory ff)))
(progn
- (add-to-history 'file-name-history
- (ediff-abbreviate-file-name
- (expand-file-name
- (file-name-nondirectory ff)
- dir-C)))
+ (ediff-add-to-history
+ 'file-name-history
+ (ediff-abbreviate-file-name
+ (expand-file-name
+ (file-name-nondirectory ff)
+ dir-C)))
(ediff-get-default-file-name ff 2)))
)))
(ediff-files-internal file-A
@@ -1103,11 +1106,12 @@ lines. For small regions, use `ediff-regions-wordwise'."
ediff-last-dir-B
(file-name-directory f)))
(progn
- (add-to-history 'file-name-history
- (ediff-abbreviate-file-name
- (expand-file-name
- (file-name-nondirectory f)
- dir-B)))
+ (ediff-add-to-history
+ 'file-name-history
+ (ediff-abbreviate-file-name
+ (expand-file-name
+ (file-name-nondirectory f)
+ dir-B)))
(ediff-get-default-file-name f 1)))
)))
(setq startup-hooks (cons 'ediff-merge-on-startup startup-hooks))
@@ -1146,11 +1150,12 @@ lines. For small regions, use `ediff-regions-wordwise'."
ediff-last-dir-B
(file-name-directory f)))
(progn
- (add-to-history 'file-name-history
- (ediff-abbreviate-file-name
- (expand-file-name
- (file-name-nondirectory f)
- dir-B)))
+ (ediff-add-to-history
+ 'file-name-history
+ (ediff-abbreviate-file-name
+ (expand-file-name
+ (file-name-nondirectory f)
+ dir-B)))
(ediff-get-default-file-name f 1))))
(ediff-read-file-name "Ancestor file"
(setq dir-ancestor
@@ -1158,11 +1163,12 @@ lines. For small regions, use `ediff-regions-wordwise'."
ediff-last-dir-ancestor
(file-name-directory ff)))
(progn
- (add-to-history 'file-name-history
- (ediff-abbreviate-file-name
- (expand-file-name
- (file-name-nondirectory ff)
- dir-ancestor)))
+ (ediff-add-to-history
+ 'file-name-history
+ (ediff-abbreviate-file-name
+ (expand-file-name
+ (file-name-nondirectory ff)
+ dir-ancestor)))
(ediff-get-default-file-name ff 2)))
)))
(setq startup-hooks (cons 'ediff-merge-on-startup startup-hooks))
diff --git a/lisp/emulation/viper-cmd.el b/lisp/emulation/viper-cmd.el
index 1685b829f64..61d99e6c78d 100644
--- a/lisp/emulation/viper-cmd.el
+++ b/lisp/emulation/viper-cmd.el
@@ -3098,7 +3098,7 @@ If point is on a widget or a button, simulate clicking on that widget/button."
(and (consp widget)
(get (widget-type widget) 'widget-type))))
(widget-button-press (point))
- (if (button-at (point))
+ (if (and (fboundp 'button-at) (fboundp 'push-button) (button-at (point)))
(push-button)
;; not a widget or a button
(viper-leave-region-active)
diff --git a/lisp/emulation/viper.el b/lisp/emulation/viper.el
index 0ba7bdd041a..ea70ad609ad 100644
--- a/lisp/emulation/viper.el
+++ b/lisp/emulation/viper.el
@@ -9,7 +9,7 @@
;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
;; Keywords: emulations
-(defconst viper-version "3.12 of February 18, 2006"
+(defconst viper-version "3.13 of September 18, 2006"
"The current version of Viper")
;; This file is part of GNU Emacs.
diff --git a/lisp/ezimage.el b/lisp/ezimage.el
index 84ad10ad599..ed8fb497aff 100644
--- a/lisp/ezimage.el
+++ b/lisp/ezimage.el
@@ -27,7 +27,7 @@
;;
;; A few routines for placing an image over text that will work for any
;; Emacs implementation without error. When images are not supported, then
-;; they are justnot displayed.
+;; they are just not displayed.
;;
;; The idea is that gui buffers (trees, buttons, etc) will have text
;; representations of the GUI elements. These routines will replace the text
diff --git a/lisp/faces.el b/lisp/faces.el
index f2d3e0ddb44..fd2788c240c 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -2080,7 +2080,7 @@ created."
(defgroup mode-line-faces nil
"Faces used in the mode line."
- :group 'modeline
+ :group 'mode-line
:group 'faces
:version "22.1")
diff --git a/lisp/font-lock.el b/lisp/font-lock.el
index 4a7c7f600ac..60a4b3c00b1 100644
--- a/lisp/font-lock.el
+++ b/lisp/font-lock.el
@@ -718,7 +718,7 @@ see the variables `c-font-lock-extra-types', `c++-font-lock-extra-types',
;; If the keywords were compiled before, compile them again.
(if was-compiled
(setq font-lock-keywords
- (font-lock-compile-keywords font-lock-keywords t)))))))
+ (font-lock-compile-keywords font-lock-keywords)))))))
(defun font-lock-update-removed-keyword-alist (mode keywords how)
"Update `font-lock-removed-keywords-alist' when adding new KEYWORDS to MODE."
@@ -825,7 +825,7 @@ happens, so the major mode can be corrected."
;; If the keywords were compiled before, compile them again.
(if was-compiled
(setq font-lock-keywords
- (font-lock-compile-keywords font-lock-keywords t)))))))
+ (font-lock-compile-keywords font-lock-keywords)))))))
;;; Font Lock Support mode.
@@ -1414,7 +1414,8 @@ START should be at the beginning of a line."
;; If `font-lock-syntactic-keywords' is not compiled, compile it.
(unless (eq (car font-lock-syntactic-keywords) t)
(setq font-lock-syntactic-keywords (font-lock-compile-keywords
- font-lock-syntactic-keywords)))
+ font-lock-syntactic-keywords
+ t)))
;; Get down to business.
(let ((case-fold-search font-lock-keywords-case-fold-search)
(keywords (cddr font-lock-syntactic-keywords))
@@ -1570,7 +1571,7 @@ START should be at the beginning of a line.
LOUDLY, if non-nil, allows progress-meter bar."
(unless (eq (car font-lock-keywords) t)
(setq font-lock-keywords
- (font-lock-compile-keywords font-lock-keywords t)))
+ (font-lock-compile-keywords font-lock-keywords)))
(let ((case-fold-search font-lock-keywords-case-fold-search)
(keywords (cddr font-lock-keywords))
(bufname (buffer-name)) (count 0)
@@ -1626,12 +1627,12 @@ LOUDLY, if non-nil, allows progress-meter bar."
;; Various functions.
-(defun font-lock-compile-keywords (keywords &optional regexp)
+(defun font-lock-compile-keywords (keywords &optional syntactic-keywords)
"Compile KEYWORDS into the form (t KEYWORDS COMPILED...)
Here each COMPILED is of the form (MATCHER HIGHLIGHT ...) as shown in the
`font-lock-keywords' doc string.
-If REGEXP is non-nil, it means these keywords are used for
-`font-lock-keywords' rather than for `font-lock-syntactic-keywords'."
+If SYNTACTIC-KEYWORDS is non-nil, it means these keywords are used for
+`font-lock-syntactic-keywords' rather than for `font-lock-keywords'."
(if (not font-lock-set-defaults)
;; This should never happen. But some external packages sometimes
;; call font-lock in unexpected and incorrect ways. It's important to
@@ -1644,7 +1645,7 @@ If REGEXP is non-nil, it means these keywords are used for
(setq keywords
(cons t (cons keywords
(mapcar 'font-lock-compile-keyword keywords))))
- (if (and regexp
+ (if (and (not syntactic-keywords)
(eq (or syntax-begin-function
font-lock-beginning-of-syntax-function)
'beginning-of-defun)
@@ -1774,7 +1775,7 @@ Sets various variables using `font-lock-defaults' (or, if nil, using
;; Now compile the keywords.
(unless (eq (car font-lock-keywords) t)
(setq font-lock-keywords
- (font-lock-compile-keywords font-lock-keywords t))))))
+ (font-lock-compile-keywords font-lock-keywords))))))
;;; Colour etc. support.
diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog
index fa2c3ac086a..dbd88f32180 100644
--- a/lisp/gnus/ChangeLog
+++ b/lisp/gnus/ChangeLog
@@ -1,3 +1,15 @@
+2006-09-19 Andreas Seltenreich <uwi7@rz.uni-karlsruhe.de>
+
+ * nnslashdot.el (nnslashdot-request-article): Update end-of-article
+ regexp. Articles containing quotation were cut prematurely.
+
+2006-09-16 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * message.el (message-cite-original-without-signature): Use nobody by
+ default for the value of From header.
+ (message-cite-original): Ditto.
+ (message-reply): Ditto.
+
2006-09-09 Reiner Steib <Reiner.Steib@gmx.de>
* pop3.el (pop3-leave-mail-on-server): Mention problem of duplicate
diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el
index f8d3a32a515..36a969fdefd 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -3280,7 +3280,7 @@ prefix, and don't delete any headers."
(message-narrow-to-head-1)
(vector 0
(or (message-fetch-field "subject") "none")
- (message-fetch-field "from")
+ (or (message-fetch-field "from") "nobody")
(message-fetch-field "date")
(message-fetch-field "message-id" t)
(message-fetch-field "references")
@@ -3329,7 +3329,7 @@ prefix, and don't delete any headers."
(message-narrow-to-head-1)
(vector 0
(or (message-fetch-field "subject") "none")
- (message-fetch-field "from")
+ (or (message-fetch-field "from") "nobody")
(message-fetch-field "date")
(message-fetch-field "message-id" t)
(message-fetch-field "references")
@@ -5843,7 +5843,7 @@ want to get rid of this query permanently.")))
(setq message-id (message-fetch-field "message-id" t)
references (message-fetch-field "references")
date (message-fetch-field "date")
- from (message-fetch-field "from")
+ from (or (message-fetch-field "from") "nobody")
subject (or (message-fetch-field "subject") "none"))
(when gnus-list-identifiers
(setq subject (message-strip-list-identifiers subject)))
diff --git a/lisp/gnus/nnslashdot.el b/lisp/gnus/nnslashdot.el
index 66ce4d54472..37ecaf0f32b 100644
--- a/lisp/gnus/nnslashdot.el
+++ b/lisp/gnus/nnslashdot.el
@@ -258,7 +258,9 @@
(setq contents
(buffer-substring
(search-forward "<div class=\"commentBody\">")
- (search-forward "</div>")))))))
+ (progn
+ (search-forward "<div class=\"commentSub\">")
+ (match-beginning 0))))))))
(search-failed (nnslashdot-lose why)))
(when contents
diff --git a/lisp/help.el b/lisp/help.el
index d5682512b2d..fafe6e57ed0 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -309,7 +309,7 @@ If that doesn't give a function, return nil."
The prefix described consists of all but the last event
of the key sequence that ran this command."
(interactive)
- (let* ((key (this-command-keys)))
+ (let ((key (this-command-keys)))
(describe-bindings
(if (stringp key)
(substring key 0 (1- (length key)))
@@ -567,11 +567,16 @@ temporarily enables it to allow getting help on disabled items and buttons."
(menu-bar-update-yank-menu "(any string)" nil))
(setq key (read-key-sequence "Describe key (or click or menu item): "))
;; If KEY is a down-event, read and discard the
- ;; corresponding up-event.
- (if (and (vectorp key)
- (eventp (elt key 0))
- (memq 'down (event-modifiers (elt key 0))))
- (read-event))
+ ;; corresponding up-event. Note that there are also
+ ;; down-events on scroll bars and mode lines: the actual
+ ;; event then is in the second element of the vector.
+ (and (vectorp key)
+ (or (and (eventp (aref key 0))
+ (memq 'down (event-modifiers (aref key 0))))
+ (and (> (length key) 1)
+ (eventp (aref key 1))
+ (memq 'down (event-modifiers (aref key 1)))))
+ (read-event))
(list
key
(if current-prefix-arg (prefix-numeric-value current-prefix-arg))
@@ -582,45 +587,33 @@ temporarily enables it to allow getting help on disabled items and buttons."
(fset 'yank-menu (cons 'keymap yank-menu))))))
(if (numberp untranslated)
(setq untranslated (this-single-command-raw-keys)))
- (save-excursion
- (let ((modifiers (event-modifiers (aref key 0)))
- (standard-output (if insert (current-buffer) t))
- window position)
- ;; For a mouse button event, go to the button it applies to
- ;; to get the right key bindings. And go to the right place
- ;; in case the keymap depends on where you clicked.
- (if (or (memq 'click modifiers) (memq 'down modifiers)
- (memq 'drag modifiers))
- (setq window (posn-window (event-start (aref key 0)))
- position (posn-point (event-start (aref key 0)))))
- (if (windowp window)
- (progn
- (set-buffer (window-buffer window))
- (goto-char position)))
- ;; Ok, now look up the key and name the command.
- (let ((defn (key-binding key t))
- key-desc)
- ;; Handle the case where we faked an entry in "Select and Paste" menu.
- (if (and (eq defn nil)
- (stringp (aref key (1- (length key))))
- (eq (key-binding (substring key 0 -1)) 'yank-menu))
- (setq defn 'menu-bar-select-yank))
- ;; Don't bother user with strings from (e.g.) the select-paste menu.
- (if (stringp (aref key (1- (length key))))
- (aset key (1- (length key)) "(any string)"))
- (if (and (> (length untranslated) 0)
- (stringp (aref untranslated (1- (length untranslated)))))
- (aset untranslated (1- (length untranslated))
- "(any string)"))
- ;; Now describe the key, perhaps as changed.
- (setq key-desc (help-key-description key untranslated))
- (if (or (null defn) (integerp defn) (equal defn 'undefined))
- (princ (format "%s is undefined" key-desc))
- (princ (format (if (windowp window)
- "%s at that spot runs the command %s"
- "%s runs the command %s")
- key-desc
- (if (symbolp defn) defn (prin1-to-string defn)))))))))
+ (let* ((event (if (and (symbolp (aref key 0))
+ (> (length key) 1)
+ (consp (aref key 1)))
+ (aref key 1)
+ (aref key 0)))
+ (modifiers (event-modifiers event))
+ (standard-output (if insert (current-buffer) t))
+ (mouse-msg (if (or (memq 'click modifiers) (memq 'down modifiers)
+ (memq 'drag modifiers)) " at that spot" ""))
+ (defn (key-binding key t))
+ key-desc)
+ ;; Handle the case where we faked an entry in "Select and Paste" menu.
+ (if (and (eq defn nil)
+ (stringp (aref key (1- (length key))))
+ (eq (key-binding (substring key 0 -1)) 'yank-menu))
+ (setq defn 'menu-bar-select-yank))
+ ;; Don't bother user with strings from (e.g.) the select-paste menu.
+ (if (stringp (aref key (1- (length key))))
+ (aset key (1- (length key)) "(any string)"))
+ (if (and (> (length untranslated) 0)
+ (stringp (aref untranslated (1- (length untranslated)))))
+ (aset untranslated (1- (length untranslated)) "(any string)"))
+ ;; Now describe the key, perhaps as changed.
+ (setq key-desc (help-key-description key untranslated))
+ (if (or (null defn) (integerp defn) (equal defn 'undefined))
+ (princ (format "%s%s is undefined" key-desc mouse-msg))
+ (princ (format "%s%s runs the command %S" key-desc mouse-msg defn)))))
(defun describe-key (&optional key untranslated up-event)
"Display documentation of the function invoked by KEY.
@@ -652,105 +645,107 @@ temporarily enables it to allow getting help on disabled items and buttons."
(prefix-numeric-value current-prefix-arg)
;; If KEY is a down-event, read the corresponding up-event
;; and use it as the third argument.
- (if (and (vectorp key)
- (eventp (elt key 0))
- (memq 'down (event-modifiers (elt key 0))))
- (read-event))))
+ (and (vectorp key)
+ (or (and (eventp (aref key 0))
+ (memq 'down (event-modifiers (aref key 0))))
+ (and (> (length key) 1)
+ (eventp (aref key 1))
+ (memq 'down (event-modifiers (aref key 1)))))
+ (read-event))))
;; Put yank-menu back as it was, if we changed it.
(when saved-yank-menu
(setq yank-menu (copy-sequence saved-yank-menu))
(fset 'yank-menu (cons 'keymap yank-menu))))))
(if (numberp untranslated)
(setq untranslated (this-single-command-raw-keys)))
- (save-excursion
- (let ((modifiers (event-modifiers (aref key 0)))
- window position)
- ;; For a mouse button event, go to the button it applies to
- ;; to get the right key bindings. And go to the right place
- ;; in case the keymap depends on where you clicked.
- (if (or (memq 'click modifiers) (memq 'down modifiers)
- (memq 'drag modifiers))
- (setq window (posn-window (event-start (aref key 0)))
- position (posn-point (event-start (aref key 0)))))
- (when (windowp window)
- (set-buffer (window-buffer window))
- (goto-char position))
- (let ((defn (key-binding key t)))
- ;; Handle the case where we faked an entry in "Select and Paste" menu.
- (if (and (eq defn nil)
- (stringp (aref key (1- (length key))))
- (eq (key-binding (substring key 0 -1)) 'yank-menu))
- (setq defn 'menu-bar-select-yank))
- (if (or (null defn) (integerp defn) (equal defn 'undefined))
- (message "%s is undefined" (help-key-description key untranslated))
- (help-setup-xref (list #'describe-function defn) (interactive-p))
- ;; Don't bother user with strings from (e.g.) the select-paste menu.
- (if (stringp (aref key (1- (length key))))
- (aset key (1- (length key)) "(any string)"))
- (if (and untranslated
- (stringp (aref untranslated (1- (length untranslated)))))
- (aset untranslated (1- (length untranslated))
- "(any string)"))
- (with-output-to-temp-buffer (help-buffer)
- (princ (help-key-description key untranslated))
- (if (windowp window)
- (princ " at that spot"))
- (princ " runs the command ")
- (prin1 defn)
- (princ "\n which is ")
- (describe-function-1 defn)
- (when up-event
- (let ((type (event-basic-type up-event))
- (hdr "\n\n-------------- up event ---------------\n\n")
- defn sequence
- mouse-1-tricky mouse-1-remapped)
- (setq sequence (vector up-event))
- (when (and (eq type 'mouse-1)
- (windowp window)
+ (let* ((event (aref key (if (and (symbolp (aref key 0))
+ (> (length key) 1)
+ (consp (aref key 1)))
+ 1
+ 0)))
+ (modifiers (event-modifiers event))
+ (mouse-msg (if (or (memq 'click modifiers) (memq 'down modifiers)
+ (memq 'drag modifiers)) " at that spot" ""))
+ (defn (key-binding key t))
+ defn-up defn-up-tricky ev-type
+ mouse-1-remapped mouse-1-tricky)
+
+ ;; Handle the case where we faked an entry in "Select and Paste" menu.
+ (when (and (eq defn nil)
+ (stringp (aref key (1- (length key))))
+ (eq (key-binding (substring key 0 -1)) 'yank-menu))
+ (setq defn 'menu-bar-select-yank))
+ (if (or (null defn) (integerp defn) (equal defn 'undefined))
+ (message "%s%s is undefined"
+ (help-key-description key untranslated) mouse-msg)
+ (help-setup-xref (list #'describe-function defn) (interactive-p))
+ ;; Don't bother user with strings from (e.g.) the select-paste menu.
+ (when (stringp (aref key (1- (length key))))
+ (aset key (1- (length key)) "(any string)"))
+ (when (and untranslated
+ (stringp (aref untranslated (1- (length untranslated)))))
+ (aset untranslated (1- (length untranslated))
+ "(any string)"))
+ ;; Need to do this before erasing *Help* buffer in case event
+ ;; is a mouse click in an existing *Help* buffer.
+ (when up-event
+ (setq ev-type (event-basic-type up-event))
+ (let ((sequence (vector up-event)))
+ (when (and (eq ev-type 'mouse-1)
+ mouse-1-click-follows-link
+ (not (eq mouse-1-click-follows-link 'double))
+ (setq mouse-1-remapped
+ (mouse-on-link-p (event-start up-event))))
+ (setq mouse-1-tricky (and (integerp mouse-1-click-follows-link)
+ (> mouse-1-click-follows-link 0)))
+ (cond ((stringp mouse-1-remapped)
+ (setq sequence mouse-1-remapped))
+ ((vectorp mouse-1-remapped)
+ (setcar up-event (elt mouse-1-remapped 0)))
+ (t (setcar up-event 'mouse-2))))
+ (setq defn-up (key-binding sequence nil nil (event-start up-event)))
+ (when mouse-1-tricky
+ (setq sequence (vector up-event))
+ (aset sequence 0 'mouse-1)
+ (setq defn-up-tricky (key-binding sequence nil nil (event-start up-event))))))
+ (with-output-to-temp-buffer (help-buffer)
+ (princ (help-key-description key untranslated))
+ (princ (format "\
+%s runs the command %S
+ which is "
+ mouse-msg defn))
+ (describe-function-1 defn)
+ (when up-event
+ (unless (or (null defn-up)
+ (integerp defn-up)
+ (equal defn-up 'undefined))
+ (princ (format "
+
+----------------- up-event %s----------------
+
+<%S>%s%s runs the command %S
+ which is "
+ (if mouse-1-tricky "(short click) " "")
+ ev-type mouse-msg
+ (if mouse-1-remapped
+ " is remapped to <mouse-2>\nwhich" "")
+ defn-up))
+ (describe-function-1 defn-up))
+ (unless (or (null defn-up-tricky)
+ (integerp defn-up-tricky)
+ (eq defn-up-tricky 'undefined))
+ (princ (format "
+
+----------------- up-event (long click) ----------------
+
+Pressing <%S>%s for longer than %d milli-seconds
+runs the command %S
+ which is "
+ ev-type mouse-msg
mouse-1-click-follows-link
- (not (eq mouse-1-click-follows-link 'double))
- (setq mouse-1-remapped
- (with-current-buffer (window-buffer window)
- (mouse-on-link-p (posn-point
- (event-start up-event))))))
- (setq mouse-1-tricky (and (integerp mouse-1-click-follows-link)
- (> mouse-1-click-follows-link 0)))
- (cond ((stringp mouse-1-remapped)
- (setq sequence mouse-1-remapped))
- ((vectorp mouse-1-remapped)
- (setcar up-event (elt mouse-1-remapped 0)))
- (t (setcar up-event 'mouse-2))))
- (setq defn (key-binding sequence))
- (unless (or (null defn) (integerp defn) (equal defn 'undefined))
- (princ (if mouse-1-tricky
- "\n\n----------------- up-event (short click) ----------------\n\n"
- hdr))
- (setq hdr nil)
- (princ (symbol-name type))
- (if (windowp window)
- (princ " at that spot"))
- (if mouse-1-remapped
- (princ " is remapped to <mouse-2>\n which" ))
- (princ " runs the command ")
- (prin1 defn)
- (princ "\n which is ")
- (describe-function-1 defn))
- (when mouse-1-tricky
- (setcar up-event 'mouse-1)
- (setq defn (key-binding (vector up-event)))
- (unless (or (null defn) (integerp defn) (eq defn 'undefined))
- (princ (or hdr
- "\n\n----------------- up-event (long click) ----------------\n\n"))
- (princ "Pressing mouse-1")
- (if (windowp window)
- (princ " at that spot"))
- (princ (format " for longer than %d milli-seconds\n"
- mouse-1-click-follows-link))
- (princ " runs the command ")
- (prin1 defn)
- (princ "\n which is ")
- (describe-function-1 defn)))))
- (print-help-return-message)))))))
+ defn-up-tricky))
+ (describe-function-1 defn-up-tricky)))
+ (print-help-return-message)))))
(defun describe-mode (&optional buffer)
"Display documentation of current major mode and minor modes.
diff --git a/lisp/ido.el b/lisp/ido.el
index e3baa71396b..432347717f5 100644
--- a/lisp/ido.el
+++ b/lisp/ido.el
@@ -3618,7 +3618,7 @@ for first matching file."
((stringp nextstr)
(and (>= flen (setq slen (length nextstr)))
(string-equal (substring name (- flen slen)) nextstr)))
- ((fboundp nextstr) (funcall nextstr name))
+ ((functionp nextstr) (funcall nextstr name))
(t nil))
(setq ignorep t
ext-list nil
@@ -3628,7 +3628,7 @@ for first matching file."
(setq nextstr (car re-list))
(if (cond
((stringp nextstr) (string-match nextstr name))
- ((fboundp nextstr) (funcall nextstr name))
+ ((functionp nextstr) (funcall nextstr name))
(t nil))
(setq ignorep t
re-list nil)
diff --git a/lisp/jit-lock.el b/lisp/jit-lock.el
index 89959ad8525..4cbc7da4511 100644
--- a/lisp/jit-lock.el
+++ b/lisp/jit-lock.el
@@ -397,19 +397,19 @@ Defaults to the whole buffer. END can be out of bounds."
;; eagerly extend the refontified region with
;; jit-lock-after-change-extend-region-functions.
(when (< start orig-start)
- (lexical-let ((start start)
- (orig-start orig-start)
- (buf (current-buffer)))
- (run-with-timer
- 0 nil (lambda ()
- (with-current-buffer buf
- (with-buffer-prepared-for-jit-lock
- (put-text-property start orig-start
- 'fontified t)))))))
+ (run-with-timer 0 nil 'jit-lock-fontify-again
+ (current-buffer) start orig-start))
;; Find the start of the next chunk, if any.
(setq start (text-property-any next end 'fontified nil))))))))
+(defun jit-lock-fontify-again (buf start end)
+ "Fontify in buffer BUF from START to END."
+ (with-current-buffer buf
+ (with-buffer-prepared-for-jit-lock
+ (put-text-property start end 'fontified t))))
+
+
;;; Stealth fontification.
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el
index cc1351b9032..9a89aa42401 100644
--- a/lisp/menu-bar.el
+++ b/lisp/menu-bar.el
@@ -510,7 +510,7 @@ A large number or nil slows down menu responsiveness."
(defun clipboard-yank ()
"Insert the clipboard contents, or the last stretch of killed text."
- (interactive)
+ (interactive "*")
(let ((x-select-enable-clipboard t))
(yank)))
diff --git a/lisp/mouse-sel.el b/lisp/mouse-sel.el
index a64dabaec81..a327b589f54 100644
--- a/lisp/mouse-sel.el
+++ b/lisp/mouse-sel.el
@@ -702,7 +702,7 @@ Sel mode does not support using a `double' value to follow links
using double-clicks."
(and initial final mouse-1-click-follows-link
(eq (car initial) 'down-mouse-1)
- (mouse-on-link-p (posn-point (event-start initial)))
+ (mouse-on-link-p (event-start initial))
(= (posn-point (event-start initial))
(posn-point (event-end final)))
(= (event-click-count initial) 1)
diff --git a/lisp/mouse.el b/lisp/mouse.el
index 4e11b1d4c96..18b16c6460d 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -556,7 +556,7 @@ resized by dragging their header-line."
(echo-keystrokes 0)
(start-event-frame (window-frame (car (car (cdr start-event)))))
(start-event-window (car (car (cdr start-event))))
- event mouse x left right edges wconfig growth
+ event mouse x left right edges growth
(which-side
(or (cdr (assq 'vertical-scroll-bars (frame-parameters start-event-frame)))
'right)))
@@ -775,6 +775,24 @@ If the click is in the echo area, display the `*Messages*' buffer."
(mouse-drag-track start-event t))))
+(defun mouse-posn-property (pos property)
+ "Look for a property at click position.
+POS may be either a buffer position or a click position like
+those returned from `start-event'. If the click position is on
+a string, the text property PROPERTY is examined.
+If this is nil or the click is not on a string, then
+the corresponding buffer position is searched for PROPERTY.
+If PROPERTY is encountered in one of those places,
+its value is returned."
+ (if (consp pos)
+ (let ((w (posn-window pos)) (pt (posn-point pos))
+ (str (posn-string pos)))
+ (or (and str
+ (get-text-property (cdr str) property (car str)))
+ (and pt
+ (get-char-property pt property w))))
+ (get-char-property pos property)))
+
(defun mouse-on-link-p (pos)
"Return non-nil if POS is on a link in the current buffer.
POS must be a buffer position in the current buffer or a mouse
@@ -814,24 +832,23 @@ click is the local or global binding of that event.
- Otherwise, the mouse-1 event is translated into a mouse-2 event
at the same position."
- (let ((w (and (consp pos) (posn-window pos))))
- (if (consp pos)
- (setq pos (and (or mouse-1-click-in-non-selected-windows
- (eq (selected-window) w))
- (posn-point pos))))
- (when pos
- (with-current-buffer (window-buffer w)
- (let ((action
- (or (get-char-property pos 'follow-link)
- (save-excursion
- (goto-char pos)
- (key-binding [follow-link] nil t)))))
- (cond
- ((eq action 'mouse-face)
- (and (get-char-property pos 'mouse-face) t))
- ((functionp action)
- (funcall action pos))
- (t action)))))))
+ (let ((action
+ (and (or (not (consp pos))
+ mouse-1-click-in-non-selected-windows
+ (eq (selected-window) (posn-window pos)))
+ (or (mouse-posn-property pos 'follow-link)
+ (key-binding [follow-link] nil t pos)))))
+ (cond
+ ((eq action 'mouse-face)
+ (and (mouse-posn-property pos 'mouse-face) t))
+ ((functionp action)
+ ;; FIXME: This seems questionable if the click is not in a buffer.
+ ;; Should we instead decide that `action' takes a `posn'?
+ (if (consp pos)
+ (with-current-buffer (window-buffer (posn-window pos))
+ (funcall action (posn-point pos)))
+ (funcall action pos)))
+ (t action))))
(defun mouse-fixup-help-message (msg)
"Fix help message MSG for `mouse-1-click-follows-link'."
@@ -904,7 +921,7 @@ should only be used by mouse-drag-region."
;; Use start-point before the intangibility
;; treatment, in case we click on a link inside an
;; intangible text.
- (mouse-on-link-p start-point)))
+ (mouse-on-link-p start-posn)))
(click-count (1- (event-click-count start-event)))
(remap-double-click (and on-link
(eq mouse-1-click-follows-link 'double)
diff --git a/lisp/obsolete/fast-lock.el b/lisp/obsolete/fast-lock.el
index 60c7988a66b..de4b494826a 100644
--- a/lisp/obsolete/fast-lock.el
+++ b/lisp/obsolete/fast-lock.el
@@ -623,9 +623,9 @@ See `fast-lock-cache-directory'."
;; Compile all keywords in case some are and some aren't.
(when font-lock-syntactic-keywords
(setq font-lock-syntactic-keywords (font-lock-compile-keywords
- font-lock-syntactic-keywords)))
+ font-lock-syntactic-keywords t)))
(when syntactic-keywords
- (setq syntactic-keywords (font-lock-compile-keywords syntactic-keywords)))
+ (setq syntactic-keywords (font-lock-compile-keywords syntactic-keywords t)))
(setq font-lock-keywords (font-lock-compile-keywords font-lock-keywords)
keywords (font-lock-compile-keywords keywords))
;; Use the Font Lock cache SYNTACTIC-PROPERTIES and FACE-PROPERTIES if we're
diff --git a/lisp/play/life.el b/lisp/play/life.el
index a034c387400..ddbbcd70c70 100644
--- a/lisp/play/life.el
+++ b/lisp/play/life.el
@@ -56,7 +56,28 @@
" @@ " " @@ " " @@ "
" @@")
("@@@@@@@@@" "@ @ @" "@ @@@@@ @" "@ @ @ @" "@@@ @@@"
- "@ @ @ @" "@ @@@@@ @" "@ @ @" "@@@@@@@@@")]
+ "@ @ @ @" "@ @@@@@ @" "@ @ @" "@@@@@@@@@")
+ (" @ "
+ " @ @ "
+ " @@ @@ @@"
+ " @ @ @@ @@"
+ "@@ @ @ @@ "
+ "@@ @ @ @@ @ @ "
+ " @ @ @ "
+ " @ @ "
+ " @@ ")
+ (" @ "
+ " @ @@"
+ " @ @ "
+ " @ "
+ " @ "
+ "@ @ ")
+ ("@@@ @"
+ "@ "
+ " @@"
+ " @@ @"
+ "@ @ @")
+ ("@@@@@@@@ @@@@@ @@@ @@@@@@@ @@@@@")]
"Vector of rectangles containing some Life startup patterns.")
;; Macros are used macros for manifest constants instead of variables
@@ -128,6 +149,7 @@ generations (this defaults to 1)."
mode-name "Life"
major-mode 'life-mode
truncate-lines t
+ show-trailing-whitespace nil
life-current-generation 0
life-generation-string "0"
mode-line-buffer-identification '("Life: generation "
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index f4dd0fb5597..e6a6a8ed9c5 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -229,7 +229,7 @@ of[ \t]+\"?\\([a-zA-Z]?:?[^\":\n]+\\)\"?:" 3 2 nil (1))
;; the last line tries to rule out message where the info after the
;; line number starts with "SS". --Stef
"^\\(?:[[:alpha:]][-[:alnum:].]+: ?\\)?\
-\\([0-9]*[^0-9\n].*?\\): ?\
+\\([0-9]*[^0-9\n]\\(?:[^\n ]\\| [^-\n]\\)*?\\): ?\
\\([0-9]+\\)\\(?:\\([.:]\\)\\([0-9]+\\)\\)?\
\\(?:-\\([0-9]+\\)?\\(?:\\3\\([0-9]+\\)\\)?\\)?:\
\\(?: *\\(\\(?:Future\\|Runtime\\)?[Ww]arning\\|W:\\)\\|\
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 712d75afff9..0387c05134e 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -1289,7 +1289,7 @@ Don't save anything for STR matching `inferior-python-filter-regexp'."
;; Maybe we could be more selective here.
(if (zerop (length res))
(not (bolp))
- (string-match res ".\\'"))))
+ (string-match ".\\'" res))))
;; The need for this seems to be system-dependent:
;; What is this all about, exactly? --Stef
;; (if (and (eq ?. (aref s 0)))
diff --git a/lisp/saveplace.el b/lisp/saveplace.el
index a2bc18e9de1..cfaf87852d4 100644
--- a/lisp/saveplace.el
+++ b/lisp/saveplace.el
@@ -238,7 +238,7 @@ may have changed\) back to `save-place-alist'."
;; load it if it exists:
(if (file-readable-p file)
(save-excursion
- (message "Loading places from %s..." save-place-file)
+ (message "Loading places from %s..." file)
;; don't want to use find-file because we have been
;; adding hooks to it.
(set-buffer (get-buffer-create " *Saved Places*"))
diff --git a/lisp/select.el b/lisp/select.el
index 01d1af6edf1..cbdeaf12fe3 100644
--- a/lisp/select.el
+++ b/lisp/select.el
@@ -223,8 +223,11 @@ Cut buffers are considered obsolete; you should use selections instead."
(setq str (encode-coding-string str coding))))
((eq type 'UTF8_STRING)
- (setq str (encode-coding-string str 'utf-8)))
-
+ (let ((charsets (find-charset-string str)))
+ (if (or (memq 'eight-bit-control charsets)
+ (memq 'eight-bit-graphic charsets))
+ (setq type 'STRING)
+ (setq str (encode-coding-string str 'utf-8)))))
(t
(error "Unknow selection type: %S" type))
)))
diff --git a/lisp/simple.el b/lisp/simple.el
index 09d1676edb9..a289f87f4d9 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -3487,43 +3487,53 @@ Outline mode sets this."
(set-window-vscroll nil (- vs (frame-char-height)) t)))
;; Move forward (down).
- (let* ((evis (or (pos-visible-in-window-p (window-end nil t) nil t)
- (pos-visible-in-window-p (1- (window-end nil t)) nil t)))
- (rbot (nth 3 evis))
- (vpos (nth 5 evis))
+ (let* ((lh (window-line-height -1))
+ (vpos (nth 1 lh))
+ (ypos (nth 2 lh))
+ (rbot (nth 3 lh))
ppos py vs)
- (cond
- ;; Last window line should be visible - fail if not.
- ((null evis)
- nil)
- ;; If last line of window is fully visible, move forward.
- ((null rbot)
- nil)
- ;; If cursor is not in the bottom scroll margin, move forward.
- ((< (setq ppos (posn-at-point)
- py (cdr (or (posn-actual-col-row ppos)
- (posn-col-row ppos))))
- (min (- (window-text-height) scroll-margin 1) (1- vpos)))
- nil)
- ;; When already vscrolled, we vscroll some more if we can,
- ;; or clear vscroll and move forward at end of tall image.
- ((> (setq vs (window-vscroll nil t)) 0)
- (when (> rbot 0)
- (set-window-vscroll nil (+ vs (min rbot (frame-char-height))) t)))
- ;; If cursor just entered the bottom scroll margin, move forward,
- ;; but also vscroll one line so redisplay wont recenter.
- ((= py (min (- (window-text-height) scroll-margin 1)
- (1- vpos)))
- (set-window-vscroll nil (frame-char-height) t)
- (line-move-1 arg noerror to-end)
- t)
- ;; If there are lines above the last line, scroll-up one line.
- ((> vpos 0)
- (scroll-up 1)
- t)
- ;; Finally, start vscroll.
- (t
- (set-window-vscroll nil (frame-char-height) t))))))
+ (when (or (null lh)
+ (>= rbot (frame-char-height))
+ (<= ypos (- (frame-char-height))))
+ (unless lh
+ (let* ((wend (window-end nil t))
+ (evis (or (pos-visible-in-window-p wend nil t)
+ (pos-visible-in-window-p (1- wend) nil t))))
+ (setq rbot (nth 3 evis)
+ vpos (nth 5 evis))))
+ (cond
+ ;; If last line of window is fully visible, move forward.
+ ((or (null rbot) (= rbot 0))
+ nil)
+ ;; If cursor is not in the bottom scroll margin, move forward.
+ ((and (> vpos 0)
+ (< (setq py
+ (or (nth 1 (window-line-height))
+ (let ((ppos (posn-at-point)))
+ (cdr (or (posn-actual-col-row ppos)
+ (posn-col-row ppos))))))
+ (min (- (window-text-height) scroll-margin 1) (1- vpos))))
+ nil)
+ ;; When already vscrolled, we vscroll some more if we can,
+ ;; or clear vscroll and move forward at end of tall image.
+ ((> (setq vs (window-vscroll nil t)) 0)
+ (when (> rbot 0)
+ (set-window-vscroll nil (+ vs (min rbot (frame-char-height))) t)))
+ ;; If cursor just entered the bottom scroll margin, move forward,
+ ;; but also vscroll one line so redisplay wont recenter.
+ ((and (> vpos 0)
+ (= py (min (- (window-text-height) scroll-margin 1)
+ (1- vpos))))
+ (set-window-vscroll nil (frame-char-height) t)
+ (line-move-1 arg noerror to-end)
+ t)
+ ;; If there are lines above the last line, scroll-up one line.
+ ((> vpos 0)
+ (scroll-up 1)
+ t)
+ ;; Finally, start vscroll.
+ (t
+ (set-window-vscroll nil (frame-char-height) t)))))))
;; This is like line-move-1 except that it also performs
@@ -3551,7 +3561,7 @@ Outline mode sets this."
;; for intermediate positions.
(let ((inhibit-point-motion-hooks t)
(opoint (point))
- (forward (> arg 0)))
+ (orig-arg arg))
(unwind-protect
(progn
(if (not (memq last-command '(next-line previous-line)))
@@ -3584,14 +3594,27 @@ Outline mode sets this."
'end-of-buffer)
nil)))
;; Move by arg lines, but ignore invisible ones.
- (let (done)
+ (let (done line-end)
(while (and (> arg 0) (not done))
;; If the following character is currently invisible,
;; skip all characters with that same `invisible' property value.
(while (and (not (eobp)) (line-move-invisible-p (point)))
(goto-char (next-char-property-change (point))))
- ;; Now move a line.
- (end-of-line)
+ ;; Move a line.
+ ;; We don't use `end-of-line', since we want to escape
+ ;; from field boundaries ocurring exactly at point.
+ (let ((inhibit-field-text-motion t))
+ (setq line-end (line-end-position)))
+ (goto-char (constrain-to-field line-end (point) t t))
+ ;; When moving a single line, update the goal-column
+ ;; if we couldn't move to the end of line due to a
+ ;; field boundary. Otherwise we'll get stuck at the
+ ;; original position during the column motion in
+ ;; line-move-finish.
+ (and (/= line-end (point))
+ (= orig-arg 1)
+ (setq temporary-goal-column
+ (max temporary-goal-column (current-column))))
;; If there's no invisibility here, move over the newline.
(cond
((eobp)
@@ -3649,7 +3672,7 @@ Outline mode sets this."
(beginning-of-line))
(t
(line-move-finish (or goal-column temporary-goal-column)
- opoint forward))))))
+ opoint (> orig-arg 0)))))))
(defun line-move-finish (column opoint forward)
(let ((repeat t))
@@ -3711,7 +3734,7 @@ Outline mode sets this."
(goto-char opoint)
(let ((inhibit-point-motion-hooks nil))
(goto-char
- (constrain-to-field new opoint nil t
+ (constrain-to-field new opoint t t
'inhibit-line-move-field-capture)))
;; If all this moved us to a different line,
@@ -3727,10 +3750,7 @@ because what we really need is for `move-to-column'
and `current-column' to be able to ignore invisible text."
(if (zerop col)
(beginning-of-line)
- (let ((opoint (point)))
- (move-to-column col)
- ;; move-to-column doesn't respect field boundaries.
- (goto-char (constrain-to-field (point) opoint))))
+ (move-to-column col))
(when (and line-move-ignore-invisible
(not (bolp)) (line-move-invisible-p (1- (point))))
@@ -4366,21 +4386,21 @@ in the mode line.
Line numbers do not appear for very large buffers and buffers
with very long lines; see variables `line-number-display-limit'
and `line-number-display-limit-width'."
- :init-value t :global t :group 'editing-basics)
+ :init-value t :global t :group 'mode-line)
(define-minor-mode column-number-mode
"Toggle Column Number mode.
With arg, turn Column Number mode on iff arg is positive.
When Column Number mode is enabled, the column number appears
in the mode line."
- :global t :group 'editing-basics)
+ :global t :group 'mode-line)
(define-minor-mode size-indication-mode
"Toggle Size Indication mode.
With arg, turn Size Indication mode on iff arg is positive. When
Size Indication mode is enabled, the size of the accessible part
of the buffer appears in the mode line."
- :global t :group 'editing-basics)
+ :global t :group 'mode-line)
(defgroup paren-blinking nil
"Blinking matching of parens and expressions."
diff --git a/lisp/startup.el b/lisp/startup.el
index ac2a859820e..2b9dd02ab9b 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -1114,10 +1114,7 @@ regardless of the value of this variable."
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defvar fancy-splash-text
- '((:face variable-pitch
- "You can do basic editing with the menu bar and scroll bar \
-using the mouse.\n\n"
- :face (variable-pitch :weight bold)
+ '((:face (variable-pitch :weight bold)
"Important Help menu items:\n"
:face variable-pitch
(lambda ()
@@ -1141,8 +1138,8 @@ using the mouse.\n\n"
"\n")))
:face variable-pitch "\
Emacs FAQ\tFrequently asked questions and answers
-Read the Emacs Manual\tView the Emacs manual using Info
-\(Non)Warranty\tGNU Emacs comes with "
+View Emacs Manual\tView the Emacs manual using Info
+Absence of Warranty\tGNU Emacs comes with "
:face (variable-pitch :slant oblique)
"ABSOLUTELY NO WARRANTY\n"
:face variable-pitch
@@ -1150,18 +1147,16 @@ Read the Emacs Manual\tView the Emacs manual using Info
Copying Conditions\tConditions for redistributing and changing Emacs
Getting New Versions\tHow to obtain the latest version of Emacs
More Manuals / Ordering Manuals Buying printed manuals from the FSF\n")
- (:face variable-pitch
- "You can do basic editing with the menu bar and scroll bar \
-using the mouse.\n\n"
- :face (variable-pitch :weight bold)
- "Useful File menu items:\n"
- :face variable-pitch "\
-Exit Emacs\t(Or type Control-x followed by Control-c)
+ (:face (variable-pitch :weight bold)
+ "Useful File menu items:\n"
+ :face variable-pitch "\
+Exit Emacs\t\t(Or type Control-x followed by Control-c)
Recover Crashed Session\tRecover files you were editing before a crash
+
"
))
"A list of texts to show in the middle part of splash screens.
@@ -1269,6 +1264,10 @@ where FACE is a valid face specification, as it can be used with
"GNU Emacs is one component of the GNU/Linux operating system."
"GNU Emacs is one component of the GNU operating system."))
(insert "\n")
+ (fancy-splash-insert
+ :face 'variable-pitch
+ "You can do basic editing with the menu bar and scroll bar \
+using the mouse.\n\n")
(if fancy-splash-outer-buffer
(fancy-splash-insert
:face 'variable-pitch
@@ -1305,7 +1304,7 @@ where FACE is a valid face specification, as it can be used with
t)
(fancy-splash-insert :face '(variable-pitch :foreground "red")
"\n\nIf an Emacs session crashed recently, "
- "type M-x recover-session RET\nto recover"
+ "type Meta-x recover-session RET\nto recover"
" the files you were editing."))))
(defun fancy-splash-screens-1 (buffer)
@@ -1350,7 +1349,6 @@ mouse."
(defun fancy-splash-screens (&optional hide-on-input)
"Display fancy splash screens when Emacs starts."
- (setq fancy-splash-help-echo (startup-echo-area-message))
(if hide-on-input
(let ((old-hourglass display-hourglass)
(fancy-splash-outer-buffer (current-buffer))
@@ -1362,18 +1360,17 @@ mouse."
(save-selected-window
(select-frame frame)
(switch-to-buffer "GNU Emacs")
- (setq tab-width 20)
(setq splash-buffer (current-buffer))
(catch 'stop-splashing
(unwind-protect
- (let ((map (make-sparse-keymap)))
+ (let ((map (make-sparse-keymap))
+ (cursor-type nil))
(use-local-map map)
(define-key map [switch-frame] 'ignore)
(define-key map [t] 'fancy-splash-default-action)
(define-key map [mouse-movement] 'ignore)
(define-key map [mode-line t] 'ignore)
- (setq cursor-type nil
- display-hourglass nil
+ (setq display-hourglass nil
minor-mode-map-alist nil
emulation-mode-map-alists nil
buffer-undo-list t
@@ -1384,6 +1381,7 @@ mouse."
timer (run-with-timer 0 fancy-splash-delay
#'fancy-splash-screens-1
splash-buffer))
+ (message "%s" (startup-echo-area-message))
(recursive-edit))
(cancel-timer timer)
(setq display-hourglass old-hourglass
@@ -1404,7 +1402,11 @@ Warning Warning!!! Pure space overflow !!!Warning Warning
(let (fancy-splash-outer-buffer)
(fancy-splash-head)
(dolist (text fancy-splash-text)
- (apply #'fancy-splash-insert text))
+ (apply #'fancy-splash-insert text)
+ (insert "\n"))
+ (skip-chars-backward "\n")
+ (delete-region (point) (point-max))
+ (insert "\n")
(fancy-splash-tail)
(set-buffer-modified-p nil)
(setq buffer-read-only t)
@@ -1581,7 +1583,7 @@ Type \\[describe-distribution] for information on getting the latest version."))
auto-save-list-file-prefix)))
t)
(insert "\n\nIf an Emacs session crashed recently, "
- "type M-x recover-session RET\nto recover"
+ "type Meta-x recover-session RET\nto recover"
" the files you were editing."))
;; Display the input that we set up in the buffer.
diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el
index 9229ec549e6..a379784aed1 100644
--- a/lisp/term/x-win.el
+++ b/lisp/term/x-win.el
@@ -2501,8 +2501,14 @@ order until succeed.")
(define-key special-event-map [drag-n-drop] 'x-dnd-handle-drag-n-drop-event)
;; Let F10 do menu bar navigation.
+(defun x-menu-bar-open (&optional frame)
+ "Open the menu bar if `menu-bar-mode' is on. otherwise call `tmm-menubar'."
+ (interactive "i")
+ (if menu-bar-mode (menu-bar-open frame)
+ (tmm-menubar)))
+
(and (fboundp 'menu-bar-open)
- (global-set-key [f10] 'menu-bar-open))
+ (global-set-key [f10] 'x-menu-bar-open))
;; arch-tag: f1501302-db8b-4d95-88e3-116697d89f78
;;; x-win.el ends here
diff --git a/lisp/textmodes/conf-mode.el b/lisp/textmodes/conf-mode.el
index a3471f16480..f7a725242ed 100644
--- a/lisp/textmodes/conf-mode.el
+++ b/lisp/textmodes/conf-mode.el
@@ -75,8 +75,8 @@ not align (only setting space according to `conf-assignment-space')."
(define-key map "\C-c\C-u" 'conf-unix-mode)
(define-key map "\C-c\C-w" 'conf-windows-mode)
(define-key map "\C-c\C-j" 'conf-javaprop-mode)
- (define-key map "\C-c\C-s" 'conf-space-mode)
- (define-key map "\C-c " 'conf-space-mode)
+ (define-key map "\C-c\C-s" 'conf-space-keywords)
+ (define-key map "\C-c " 'conf-space-keywords)
(define-key map "\C-c\C-c" 'conf-colon-mode)
(define-key map "\C-c:" 'conf-colon-mode)
(define-key map "\C-c\C-x" 'conf-xdefaults-mode)
@@ -168,7 +168,7 @@ not align (only setting space according to `conf-assignment-space')."
("/resmgr\\.conf" . "class\\|add\\|allow\\|deny")
("/dictionary\\.lst\\'" . "DICT\\|HYPH\\|THES")
("/tuxracer/options" . "set"))
- "File name based settings for `conf-space-keywords'.")
+ "File-name-based settings for the variable `conf-space-keywords'.")
(defvar conf-space-keywords nil
"Regexps for functions that may come before a space assignment.
@@ -188,7 +188,7 @@ This variable is best set in the file local variables, or through
'(1 'font-lock-keyword-face)
'(2 'font-lock-variable-name-face))
'("^[ \t]*\\([^\000- ]+\\)" 1 'font-lock-variable-name-face)))
- "Keywords to hilight in Conf Space mode.")
+ "Keywords to highlight in Conf Space mode.")
(defvar conf-colon-font-lock-keywords
`(;; [section] (do this first because it may look like a parameter)
@@ -442,17 +442,15 @@ x.2.y.1.z.2.zz ="
(setq imenu-generic-expression
'(("Parameters" "^[ \t]*\\(.+?\\)[=: \t]" 1))))
-(defvar conf-space-keywords-override nil
- "Value to be put in `conf-space-keywords' after `conf-space-mode'.")
-
;;;###autoload
(define-derived-mode conf-space-mode conf-unix-mode "Conf[Space]"
"Conf Mode starter for space separated conf files.
\"Assignments\" are with ` '. Keywords before the parameters are
-recognized according to `conf-space-keywords'. Interactively
-with a prefix ARG of `0' no keywords will be recognized. With
-any other prefix arg you will be prompted for a regexp to match
-the keywords.
+recognized according to the variable `conf-space-keywords-alist'.
+Alternatively, you can specify a value for the file local variable
+`conf-space-keywords'.
+Use the function `conf-space-keywords' if you want to specify keywords
+in an interactive fashion instead.
For details see `conf-mode'. Example:
@@ -471,35 +469,32 @@ add /dev/mixer desktop"
(make-local-variable 'conf-assignment-sign)
(setq conf-assignment-sign nil)
(make-local-variable 'conf-space-keywords)
- (make-local-variable 'conf-space-keywords-override)
- (setq conf-space-keywords-override nil)
- (cond (current-prefix-arg
- ;; By setting conf-space-keywords-override
- ;; we arrange for conf-space-mode-internal
- ;; to override any value of conf-space-keywords
- ;; specified in a local variables list.
- (setq conf-space-keywords-override
- (if (> (prefix-numeric-value current-prefix-arg) 0)
- (read-string "Regexp to match keywords: "))))
- ;; If this is already set, don't replace it with the default.
- (conf-space-keywords)
- (buffer-file-name
- ;; By setting conf-space-keywords directly,
- ;; we let a value in the local variables list take precedence.
- (make-local-variable 'conf-space-keywords)
+ (cond (buffer-file-name
+ ;; We set conf-space-keywords directly, but a value which is
+ ;; in the local variables list or interactively specified
+ ;; (see the function conf-space-keywords) takes precedence.
(setq conf-space-keywords
(assoc-default buffer-file-name conf-space-keywords-alist
'string-match))))
(conf-space-mode-internal)
;; In case the local variables list specifies conf-space-keywords,
;; recompute other things from that afterward.
- (push 'conf-space-mode-internal
- hack-local-variables-hook))
+ (add-hook 'hack-local-variables-hook 'conf-space-mode-internal nil t))
+
+;;;###autoload
+(defun conf-space-keywords (keywords)
+ "Enter Conf Space mode using regexp KEYWORDS to match the keywords.
+See `conf-space-mode'."
+ (interactive "sConf Space keyword regexp: ")
+ (delay-mode-hooks
+ (conf-space-mode))
+ (if (string-equal keywords "")
+ (setq keywords nil))
+ (setq conf-space-keywords keywords)
+ (conf-space-mode-internal)
+ (run-mode-hooks))
(defun conf-space-mode-internal ()
- (when conf-space-keywords-override
- (setq conf-space-keywords
- conf-space-keywords-override))
(make-local-variable 'conf-assignment-regexp)
(setq conf-assignment-regexp
(if conf-space-keywords
@@ -511,14 +506,21 @@ add /dev/mixer desktop"
(boundp 'font-lock-keywords)) ;see `normal-mode'
(font-lock-add-keywords nil nil)
(font-lock-mode 1))
+ ;; Copy so that we don't destroy shared structure.
+ (setq imenu-generic-expression (copy-sequence imenu-generic-expression))
+ ;; Get rid of any existing Parameters element.
+ (setq imenu-generic-expression
+ (delq (assoc "Parameters" imenu-generic-expression)
+ imenu-generic-expression))
+ ;; Add a new one based on conf-space-keywords.
(setq imenu-generic-expression
- `(,@(cdr imenu-generic-expression)
- ("Parameters"
- ,(if conf-space-keywords
- (concat "^[ \t]*\\(?:" conf-space-keywords
- "\\)[ \t]+\\([^ \t\n]+\\)\\(?:[ \t]\\|$\\)")
- "^[ \t]*\\([^ \t\n[]+\\)\\(?:[ \t]\\|$\\)")
- 1))))
+ (cons `("Parameters"
+ ,(if conf-space-keywords
+ (concat "^[ \t]*\\(?:" conf-space-keywords
+ "\\)[ \t]+\\([^ \t\n]+\\)\\(?:[ \t]\\|$\\)")
+ "^[ \t]*\\([^ \t\n[]+\\)\\(?:[ \t]\\|$\\)")
+ 1)
+ imenu-generic-expression)))
;;;###autoload
(define-derived-mode conf-colon-mode conf-unix-mode "Conf[Colon]"
diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el
index 34b6297a800..ebee4691e8c 100644
--- a/lisp/textmodes/flyspell.el
+++ b/lisp/textmodes/flyspell.el
@@ -1460,6 +1460,22 @@ The buffer to mark them in is `flyspell-large-region-buffer'."
(while (re-search-forward regexp nil t)
(delete-region (match-beginning 0) (match-end 0)))))))))
+;;* ---------------------------------------------------------------
+;;* flyspell-check-region-doublons
+;;* ---------------------------------------------------------------
+(defun flyspell-check-region-doublons (beg end)
+ "Check for adjacent duplicated words (doublons) in the given region."
+ (save-excursion
+ (goto-char beg)
+ (flyspell-word) ; Make sure current word is checked
+ (backward-word 1)
+ (while (and (< (point) end)
+ (re-search-forward "\\b\\([^ \n\t]+\\)[ \n\t]+\\1\\b"
+ end 'move))
+ (flyspell-word)
+ (backward-word 1))
+ (flyspell-word)))
+
;;*---------------------------------------------------------------------*/
;;* flyspell-large-region ... */
;;*---------------------------------------------------------------------*/
@@ -1504,7 +1520,8 @@ The buffer to mark them in is `flyspell-large-region-buffer'."
(progn
(flyspell-process-localwords buffer)
(with-current-buffer curbuf
- (flyspell-delete-region-overlays beg end))
+ (flyspell-delete-region-overlays beg end)
+ (flyspell-check-region-doublons beg end))
(flyspell-external-point-words))
(error "Can't check region...")))))
diff --git a/lisp/time.el b/lisp/time.el
index 115681c1b58..74812bf9f94 100644
--- a/lisp/time.el
+++ b/lisp/time.el
@@ -31,7 +31,7 @@
(defgroup display-time nil
"Display time and load in mode line of Emacs."
- :group 'modeline
+ :group 'mode-line
:group 'mail)
diff --git a/lisp/url/ChangeLog b/lisp/url/ChangeLog
index ad3912de67f..fdd735193c9 100644
--- a/lisp/url/ChangeLog
+++ b/lisp/url/ChangeLog
@@ -1,3 +1,9 @@
+2006-09-18 Michael Olson <mwolson@gnu.org>
+
+ * url-methods.el (url-scheme-register-proxy): Handle case where
+ getenv returns an empty string for http_proxy. This prevents an
+ error when calling `format' later on.
+
2006-08-31 Diane Murray <disumu@x3y2z1.net>
* url-parse.el (url-recreate-url-attributes): New function, code
diff --git a/lisp/url/url-methods.el b/lisp/url/url-methods.el
index 6854d62af03..55166ee46f4 100644
--- a/lisp/url/url-methods.el
+++ b/lisp/url/url-methods.el
@@ -75,6 +75,11 @@
(cur-proxy (assoc scheme url-proxy-services))
(urlobj nil))
+ ;; If env-proxy is an empty string, treat it as if it were nil
+ (when (and (stringp env-proxy)
+ (string= env-proxy ""))
+ (setq env-proxy nil))
+
;; Store any proxying information - this will not overwrite an old
;; entry, so that people can still set this information in their
;; .emacs file
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index 30828c8d93e..ba7a9b4a0a1 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -959,15 +959,18 @@ Recommended as a parent keymap for modes using widgets.")
(push event unread-command-events)
(setq event oevent)
(throw 'button-press-cancelled t))
- (setq pos (widget-event-point event))
- (if (and pos
- (eq (get-char-property pos 'button)
- button))
- (when face
- (overlay-put overlay 'face pressed-face)
- (overlay-put overlay 'mouse-face pressed-face))
- (overlay-put overlay 'face face)
- (overlay-put overlay 'mouse-face mouse-face)))))
+ (unless (or (integerp event)
+ (memq (car event) '(switch-frame select-window))
+ (eq (car event) 'scroll-bar-movement))
+ (setq pos (widget-event-point event))
+ (if (and pos
+ (eq (get-char-property pos 'button)
+ button))
+ (when face
+ (overlay-put overlay 'face pressed-face)
+ (overlay-put overlay 'mouse-face pressed-face))
+ (overlay-put overlay 'face face)
+ (overlay-put overlay 'mouse-face mouse-face))))))
;; When mouse is released over the button, run
;; its action function.
diff --git a/lispref/ChangeLog b/lispref/ChangeLog
index d3639fcac62..d79ff074ba1 100644
--- a/lispref/ChangeLog
+++ b/lispref/ChangeLog
@@ -1,3 +1,52 @@
+2006-09-19 David Kastrup <dak@gnu.org>
+
+ * keymaps.texi (Searching Keymaps): Small clarification.
+
+2006-09-18 Richard Stallman <rms@gnu.org>
+
+ * keymaps.texi (Creating Keymaps): Explain that keymap prompt strings
+ cause keyboard menus.
+ (Menu Keymaps): Likewise.
+ (Defining Menus, Keyboard Menus): Clarify.
+
+ * text.texi (Fields): Clarify explanation of constrain-to-field.
+
+2006-09-16 Eli Zaretskii <eliz@gnu.org>
+
+ * variables.texi (Tips for Defining): Fix a typo.
+
+2006-09-15 Richard Stallman <rms@gnu.org>
+
+ * keymaps.texi (Remapping Commands, Searching Keymaps)
+ (Active Keymaps): Clean up previous change.
+
+2006-09-15 Jay Belanger <belanger@truman.edu>
+
+ * gpl.texi: Replace "Library Public License" by "Lesser Public
+ License" throughout.
+
+2006-09-15 David Kastrup <dak@gnu.org>
+
+ * keymaps.texi (Active Keymaps): Adapt description to use
+ `get-char-property' instead `get-text-property'. Explain how
+ mouse events change this. Explain the new optional argument of
+ `key-binding' and its mouse-dependent lookup.
+ (Searching Keymaps): Adapt description similarly.
+ (Remapping Commands): Explain the new optional argument of
+ `command-remapping'.
+
+2006-09-14 Richard Stallman <rms@gnu.org>
+
+ * keymaps.texi (Searching Keymaps): Clarification.
+ (Active Keymaps): Refer to Searching Keymaps instead of duplication.
+
+2006-09-13 Richard Stallman <rms@gnu.org>
+
+ * objects.texi (Character Type): Node split.
+ Add xref to Describing Characters.
+ (Basic Char Syntax, General Escape Syntax)
+ (Ctl-Char Syntax, Meta-Char Syntax): New subnodes.
+
2006-09-11 Richard Stallman <rms@gnu.org>
* display.texi (Display Table Format): Wording clarification.
@@ -4859,7 +4908,7 @@
(info): Add target.
(installall): Target removed.
-2001-10-31 Pavel Jan,Bm(Bk <Pavel@Janik.cz>
+2001-10-31 Pavel Jan,Am(Bk <Pavel@Janik.cz>
* tips.texi (Coding Conventions): Fix typo.
diff --git a/lispref/gpl.texi b/lispref/gpl.texi
index ac5c9938381..eacce6f213f 100644
--- a/lispref/gpl.texi
+++ b/lispref/gpl.texi
@@ -23,7 +23,7 @@ software---to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -75,13 +75,13 @@ modification follow.
@item
This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The ``Program,'' below,
+under the terms of this General Public License. The ``Program'', below,
refers to any such program or work, and a ``work based on the Program''
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
-the term ``modification.'') Each licensee is addressed as ``you.''
+the term ``modification''.) Each licensee is addressed as ``you''.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
@@ -274,7 +274,7 @@ address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and ``any
-later version,'' you have the option of following the terms and conditions
+later version'', you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
@@ -339,8 +339,8 @@ convey the exclusion of warranty; and each file should have at least
the ``copyright'' line and a pointer to where the full notice is found.
@smallexample
-@var{one line to give the program's name and an idea of what it does.}
-Copyright (C) @var{year} @var{name of author}
+@var{one line to give the program's name and a brief idea of what it does.}
+Copyright (C) @var{yyyy} @var{name of author}
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@@ -364,11 +364,10 @@ If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
@smallexample
-Gnomovision version 69, Copyright (C) @var{year} @var{name of author}
-Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
-type `show w'. This is free software, and you are welcome
-to redistribute it under certain conditions; type `show c'
-for details.
+Gnomovision version 69, Copyright (C) @var{yyyy} @var{name of author}
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type `show c' for details.
@end smallexample
The hypothetical commands @samp{show w} and @samp{show c} should show
diff --git a/lispref/keymaps.texi b/lispref/keymaps.texi
index c626b46e544..a3bd320a676 100644
--- a/lispref/keymaps.texi
+++ b/lispref/keymaps.texi
@@ -295,9 +295,13 @@ does not bind any events.
@end group
@end example
-If you specify @var{prompt}, that becomes the overall prompt string for
-the keymap. The prompt string should be provided for menu keymaps
-(@pxref{Defining Menus}).
+If you specify @var{prompt}, that becomes the overall prompt string
+for the keymap. You should specify this only for menu keymaps
+(@pxref{Defining Menus}). A keymap with an overall prompt string will
+always present a mouse menu or a keyboard menu if it is active for
+looking up the next input event. Don't specify an overall prompt string
+for the main map of a major or minor mode, because that would cause
+the command loop to present a keyboard menu every time.
@end defun
@defun make-keymap &optional prompt
@@ -569,35 +573,19 @@ string for the keymap. The prompt string should be given for menu keymaps
of them are @dfn{active}, meaning that they participate in the
interpretation of user input. All the active keymaps are used
together to determine what command to execute when a key is entered.
-Emacs searches these keymaps one by one, in a standard order, until it
-finds a binding in one of the keymaps.
Normally the active keymaps are the @code{keymap} property keymap,
the keymaps of any enabled minor modes, the current buffer's local
-keymap, and the global keymap, in that order. Therefore, Emacs
-searches for each input key sequence in all these keymaps. Here is a
-pseudo-Lisp description of how this process works:
-
-@lisp
-(or (if overriding-terminal-local-map
- (@var{find-in} overriding-terminal-local-map)
- (if overriding-local-map
- (@var{find-in} overriding-local-map)
- (or (@var{find-in} (get-text-property (point) 'keymap))
- (@var{find-in-any} emulation-mode-map-alists)
- (@var{find-in-any} minor-mode-overriding-map-alist)
- (@var{find-in-any} minor-mode-map-alist)
- (if (get-text-property (point) 'local-map)
- (@var{find-in} (get-text-property (point) 'local-map))
- (@var{find-in} (current-local-map))))))
- (@var{find-in} (current-global-map)))
-@end lisp
+keymap, and the global keymap, in that order. Emacs searches for each
+input key sequence in all these keymaps. @xref{Searching Keymaps},
+for more details of this procedure.
-@noindent
-Here, the pseudo-function @var{find-in} means to look up the key
-sequence in a single map, and @var{find-in-any} means to search the
-appropriate keymaps from an alist. (Searching a single keymap for a
-binding is called @dfn{key lookup}; see @ref{Key Lookup}.)
+ When the key sequence starts with a mouse event (optionally preceded
+by a symbolic prefix), the active keymaps are determined based on the
+position in that event. If the event happened on a string embedded
+with a @code{display}, @code{before-string}, or @code{after-string}
+property (@pxref{Special Properties}), the non-@code{nil} map
+properties of the string override those of the buffer.
The @dfn{global keymap} holds the bindings of keys that are defined
regardless of the current buffer, such as @kbd{C-f}. The variable
@@ -655,25 +643,28 @@ Normally it ignores @code{overriding-local-map} and
non-@code{nil} then it pays attention to them.
@end defun
-@defun key-binding key &optional accept-defaults no-remap
+@defun key-binding key &optional accept-defaults no-remap position
This function returns the binding for @var{key} according to the
current active keymaps. The result is @code{nil} if @var{key} is
undefined in the keymaps.
-@c Emacs 19 feature
The argument @var{accept-defaults} controls checking for default
bindings, as in @code{lookup-key} (above).
-When @var{key} is a vector containing an input event, such as a mouse
-click, @code{key-binding} first looks for the binding in the keymaps
-that would be active at the position where the click was done.
-
When commands are remapped (@pxref{Remapping Commands}),
@code{key-binding} normally processes command remappings so as to
returns the remapped command that will actually be executed. However,
if @var{no-remap} is non-@code{nil}, @code{key-binding} ignores
remappings and returns the binding directly specified for @var{key}.
+If @var{key} starts with a mouse event (perhaps following a prefix
+event), the maps to be consulted are determined based on the event's
+position. Otherwise, they are determined based on the value of point.
+However, you can override either of them by specifying @var{position}.
+If @var{position} is non-@code{nil}, it should be either a buffer
+position or an event position like the value of @code{event-start}.
+Then the maps consulted are determined based on @var{position}.
+
An error is signaled if @var{key} is not a string or a vector.
@example
@@ -687,21 +678,22 @@ An error is signaled if @var{key} is not a string or a vector.
@node Searching Keymaps
@section Searching the Active Keymaps
- After translation of event subsequences (@pxref{Translation Keymaps})
-Emacs looks for them in the active keymaps. Here is a pseudo-Lisp
-description of the order in which the active keymaps are searched:
+ After translation of event subsequences (@pxref{Translation
+Keymaps}) Emacs looks for them in the active keymaps. Here is a
+pseudo-Lisp description of the order and conditions for searching
+them:
@lisp
(or (if overriding-terminal-local-map
(@var{find-in} overriding-terminal-local-map)
(if overriding-local-map
(@var{find-in} overriding-local-map)
- (or (@var{find-in} (get-text-property (point) 'keymap))
+ (or (@var{find-in} (get-char-property (point) 'keymap))
(@var{find-in-any} emulation-mode-map-alists)
(@var{find-in-any} minor-mode-overriding-map-alist)
(@var{find-in-any} minor-mode-map-alist)
(if (get-text-property (point) 'local-map)
- (@var{find-in} (get-text-property (point) 'local-map))
+ (@var{find-in} (get-char-property (point) 'local-map))
(@var{find-in} (current-local-map))))))
(@var{find-in} (current-global-map)))
@end lisp
@@ -709,6 +701,12 @@ description of the order in which the active keymaps are searched:
@noindent
The @var{find-in} and @var{find-in-any} are pseudo functions that
search in one keymap and in an alist of keymaps, respectively.
+(Searching a single keymap for a binding is called @dfn{key lookup};
+see @ref{Key Lookup}.) If the key sequence starts with a mouse event,
+or a symbolic prefix event followed by a mouse event, that event's
+position is used instead of point and the current buffer. Mouse
+events on an embedded string use non-@code{nil} text properties from
+that string instead of the buffer.
@enumerate
@item
@@ -1470,11 +1468,13 @@ does not have the effect of remapping @code{kill-line} into
if an ordinary binding specifies @code{my-kill-line}, this keymap will
remap it to @code{my-other-kill-line}.
-@defun command-remapping command
+@defun command-remapping command &optional position
This function returns the remapping for @var{command} (a symbol),
given the current active keymaps. If @var{command} is not remapped
(which is the usual situation), or not a symbol, the function returns
-@code{nil}.
+@code{nil}. @code{position} can optionally specify a buffer position
+or an event position to determine the keymaps to use, as in
+@code{key-binding}.
@end defun
@node Translation Keymaps
@@ -1904,15 +1904,16 @@ instead of the current buffer's.
@section Menu Keymaps
@cindex menu keymaps
-@c Emacs 19 feature
-A keymap can define a menu as well as bindings for keyboard keys and
-mouse button. Menus are usually actuated with the mouse, but they can
-work with the keyboard also.
+A keymap can operate as a menu as well as defining bindings for
+keyboard keys and mouse buttons. Menus are usually actuated with the
+mouse, but they can function with the keyboard also. If a menu keymap
+is active for the next input event, that activates the keyboard menu
+feature.
@menu
* Defining Menus:: How to make a keymap that defines a menu.
* Mouse Menus:: How users actuate the menu with the mouse.
-* Keyboard Menus:: How they actuate it with the keyboard.
+* Keyboard Menus:: How users actuate the menu with the keyboard.
* Menu Example:: Making a simple menu.
* Menu Bar:: How to customize the menu bar.
* Tool Bar:: A tool bar is a row of images.
@@ -1925,20 +1926,21 @@ work with the keyboard also.
@cindex menu prompt string
@cindex prompt string (of menu)
-A keymap is suitable for menu use if it has an @dfn{overall prompt
-string}, which is a string that appears as an element of the keymap.
+A keymap acts as a menu if it has an @dfn{overall prompt string},
+which is a string that appears as an element of the keymap.
(@xref{Format of Keymaps}.) The string should describe the purpose of
the menu's commands. Emacs displays the overall prompt string as the
menu title in some cases, depending on the toolkit (if any) used for
displaying menus.@footnote{It is required for menus which do not use a
-toolkit, e.g.@: under MS-DOS.} Keyboard menus also display the overall
-prompt string.
+toolkit, e.g.@: under MS-DOS.} Keyboard menus also display the
+overall prompt string.
-The easiest way to construct a keymap with a prompt string is to specify
-the string as an argument when you call @code{make-keymap},
+The easiest way to construct a keymap with a prompt string is to
+specify the string as an argument when you call @code{make-keymap},
@code{make-sparse-keymap} (@pxref{Creating Keymaps}), or
-@code{define-prefix-command} (@pxref{Definition of define-prefix-command}).
-
+@code{define-prefix-command} (@pxref{Definition of
+define-prefix-command}). If you do not want the keymap to operate as
+a menu, don't specify a prompt string for it.
@defun keymap-prompt keymap
This function returns the overall prompt string of @var{keymap},
@@ -2296,21 +2298,23 @@ separate panes or separate submenus.
@node Keyboard Menus
@subsection Menus and the Keyboard
-When a prefix key ending with a keyboard event (a character or function
-key) has a definition that is a menu keymap, the user can use the
-keyboard to choose a menu item.
+ When a prefix key ending with a keyboard event (a character or
+function key) has a definition that is a menu keymap, the keymap
+operates as a keyboard menu; the user specifies the next event by
+choosing a menu item with the keyboard.
-Emacs displays the menu's overall prompt string followed by the
-alternatives (the item strings of the bindings) in the echo area. If
-the bindings don't all fit at once, the user can type @key{SPC} to see
-the next line of alternatives. Successive uses of @key{SPC} eventually
-get to the end of the menu and then cycle around to the beginning. (The
-variable @code{menu-prompt-more-char} specifies which character is used
-for this; @key{SPC} is the default.)
+ Emacs displays the keyboard menu with the map's overall prompt
+string, followed by the alternatives (the item strings of the map's
+bindings), in the echo area. If the bindings don't all fit at once,
+the user can type @key{SPC} to see the next line of alternatives.
+Successive uses of @key{SPC} eventually get to the end of the menu and
+then cycle around to the beginning. (The variable
+@code{menu-prompt-more-char} specifies which character is used for
+this; @key{SPC} is the default.)
-When the user has found the desired alternative from the menu, he or she
-should type the corresponding character---the one whose binding is that
-alternative.
+ When the user has found the desired alternative from the menu, he or
+she should type the corresponding character---the one whose binding is
+that alternative.
@ignore
In a menu intended for keyboard use, each menu item must clearly
@@ -2321,7 +2325,7 @@ the time you read this manual, keyboard menus may explicitly name the
key for each alternative.
@end ignore
-This way of using menus in an Emacs-like editor was inspired by the
+ This way of using menus in an Emacs-like editor was inspired by the
Hierarkey system.
@defvar menu-prompt-more-char
diff --git a/lispref/text.texi b/lispref/text.texi
index 4d2f278bee8..8d513b7f6bd 100644
--- a/lispref/text.texi
+++ b/lispref/text.texi
@@ -3783,20 +3783,25 @@ This function ``constrains'' @var{new-pos} to the field that
closest to @var{new-pos} that is in the same field as @var{old-pos}.
If @var{new-pos} is @code{nil}, then @code{constrain-to-field} uses
-the value of point instead, and moves point to the resulting position.
+the value of point instead, and moves point to the resulting position
+as well as returning it.
If @var{old-pos} is at the boundary of two fields, then the acceptable
-positions for @var{new-pos} depend on the value of the optional argument
-@var{escape-from-edge}. If @var{escape-from-edge} is @code{nil}, then
-@var{new-pos} is constrained to the field that has the same @code{field}
-property (either a text-property or an overlay property) that new
-characters inserted at @var{old-pos} would get. (This depends on the
+final positions depend on the argument @var{escape-from-edge}. If
+@var{escape-from-edge} is @code{nil}, then @var{new-pos} must be in
+the field whose @code{field} property equals what new characters
+inserted at @var{old-pos} would inherit. (This depends on the
stickiness of the @code{field} property for the characters before and
after @var{old-pos}.) If @var{escape-from-edge} is non-@code{nil},
-@var{new-pos} is constrained to the union of the two adjacent fields.
+@var{new-pos} can be anywhere in the two adjacent fields.
Additionally, if two fields are separated by another field with the
-special value @code{boundary}, then any point within this special field
-is also considered to be ``on the boundary.''
+special value @code{boundary}, then any point within this special
+field is also considered to be ``on the boundary.''
+
+Commands like @kbd{C-a} with no argumemt, that normally move backward
+to a specific kind of location and stay there once there, probably
+should specify @code{nil} for @var{escape-from-edge}. Other motion
+commands that check fields should probably pass @code{t}.
If the optional argument @var{only-in-line} is non-@code{nil}, and
constraining @var{new-pos} in the usual way would move it to a different
diff --git a/lispref/variables.texi b/lispref/variables.texi
index 5c54701cdd4..a2fe4df4da1 100644
--- a/lispref/variables.texi
+++ b/lispref/variables.texi
@@ -626,7 +626,7 @@ The value is a program name.
@item @dots{}-command
The value is a whole shell command.
-@item @samp{}-switches
+@item @dots{}-switches
The value specifies options for a command.
@end table
diff --git a/lwlib/COPYING b/lwlib/COPYING
index 3912109b5cd..d511905c164 100644
--- a/lwlib/COPYING
+++ b/lwlib/COPYING
@@ -1,8 +1,8 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
-
+
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
-
+
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
-
+
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
-
+
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
-
+
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
@@ -303,10 +303,9 @@ the "copyright" line and a pointer to where the full notice is found.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
diff --git a/lwlib/ChangeLog b/lwlib/ChangeLog
index 0a8480b7724..11be821772b 100644
--- a/lwlib/ChangeLog
+++ b/lwlib/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-15 Jay Belanger <belanger@truman.edu>
+
+ * COPYING: Replace "Library Public License" by "Lesser Public
+ License" throughout.
+
2006-05-23 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* xlwmenu.c: Include xterm.h if emacs instead of declaring functions
diff --git a/mac/COPYING b/mac/COPYING
index 3912109b5cd..d511905c164 100644
--- a/mac/COPYING
+++ b/mac/COPYING
@@ -1,8 +1,8 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
-
+
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
-
+
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
-
+
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
-
+
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
-
+
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
@@ -303,10 +303,9 @@ the "copyright" line and a pointer to where the full notice is found.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
diff --git a/mac/ChangeLog b/mac/ChangeLog
index e99b092e8be..914874c6cc1 100644
--- a/mac/ChangeLog
+++ b/mac/ChangeLog
@@ -1,3 +1,17 @@
+2006-09-19 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
+
+ * INSTALL: Remove descriptions about experimental flags.
+
+ * inc/config.h: Sync with src/config.in.
+
+ * src/Emacs.r (M_APPLE): New define.
+ (MENU): Use it.
+
+2006-09-15 Jay Belanger <belanger@truman.edu>
+
+ * COPYING: Replace "Library Public License" by "Lesser Public
+ License" throughout.
+
2006-07-20 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
* makefile.MPW (dired.c.x, editfns.c.x, fileio.c.x): Depend on
diff --git a/mac/INSTALL b/mac/INSTALL
index cf82003e5c4..3e27f8e66f6 100644
--- a/mac/INSTALL
+++ b/mac/INSTALL
@@ -213,16 +213,4 @@ architectures. In addition, Rosetta doesn't appear to work correctly
with PowerPC builds of Emacs; you will have to recompile for Intel.
Therefore, builds of Emacs are architecture specific.
-There are some compile-time flags that enable experimental features.
-Please use them at your own risk after reading the corresponding
-threads in the emacs-devel@gnu.org archive.
-
- SELECT_USE_CFSOCKET (on Mac OS X): Avoid polling in sys_select (in
- src/mac.c).
- http://lists.gnu.org/archive/html/emacs-devel/2004-12/msg00789.html
-
- USE_ATSUI (on Mac OS 9/Carbon): Enable ATSUI (Apple Type Services
- for Unicode Imaging) support.
- http://lists.gnu.org/archive/html/emacs-devel/2005-10/msg00005.html
-
Enjoy!
diff --git a/mac/inc/config.h b/mac/inc/config.h
index 200e4005ff0..e3401207f8d 100644
--- a/mac/inc/config.h
+++ b/mac/inc/config.h
@@ -98,6 +98,9 @@ Boston, MA 02110-1301, USA. */
#define HAVE_ALLOCA_H 1
#endif
+/* Define to 1 if ALSA is available. */
+/* #undef HAVE_ALSA */
+
/* Define to 1 if you have the `bcmp' function. */
/* #define HAVE_BCMP */
@@ -963,6 +966,9 @@ Boston, MA 02110-1301, USA. */
#ifdef HAVE_SOUNDCARD_H
#define HAVE_SOUND 1
#endif
+#ifdef HAVE_ALSA
+#define HAVE_SOUND 1
+#endif
#endif /* __FreeBSD__ || __NetBSD__ || __linux__ */
/* If using GNU, then support inline function declarations. */
diff --git a/mac/src/Emacs.r b/mac/src/Emacs.r
index 138afca2ead..081580d101c 100644
--- a/mac/src/Emacs.r
+++ b/mac/src/Emacs.r
@@ -63,8 +63,10 @@ resource 'STR ' (128) { /*help message for emacs icon*/
};
#endif
+#define M_APPLE 234 /* Menu ID for Apple Menu. */
+
resource 'MENU' (128, preload) {
- 128,
+ M_APPLE,
textMenuProc,
0x7FFFFFFD,
enabled,
diff --git a/man/ChangeLog b/man/ChangeLog
index 4030db500f5..56a9b542616 100644
--- a/man/ChangeLog
+++ b/man/ChangeLog
@@ -1,3 +1,28 @@
+2006-09-19 Richard Stallman <rms@gnu.org>
+
+ * frames.texi (Dialog Boxes): Clean up wording: avoid passive,
+ stick to present tense.
+
+2006-09-18 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
+
+ * frames.texi (Dialog Boxes): Rename x-use-old-gtk-file-dialog
+ to x-gtk-use-old-file-dialog.
+ (Dialog Boxes): Document x-gtk-file-dialog-help-text.
+
+2006-09-15 Jay Belanger <belanger@truman.edu>
+
+ * calc.texi, emacs.texi, mh-e.texi (GNU GENERAL PUBLIC LICENSE):
+ Change "Library Public License" to "Lesser Public License"
+ throughout. Use "yyyy" to represent year.
+
+2006-09-15 Carsten Dominik <dominik@science.uva.nl>
+
+ * org.texi (Setting tags): Typo fix.
+
+2006-09-14 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (Oort Gnus): Add @xref for `mm-fill-flowed'.
+
2006-09-12 Reiner Steib <Reiner.Steib@gmx.de>
* files.texi (Visiting): Add index entry "open file".
@@ -20,6 +45,8 @@
* gnus.texi (Mail Source Specifiers): Mention problem of duplicate
mails with pop3-leave-mail-on-server. Fix wording.
+ (Limiting): Improve gnus-summary-limit-to-articles.
+ (X-Face): Fix typo.
2006-09-11 Simon Josefsson <jas@extundo.com>
diff --git a/man/calc.texi b/man/calc.texi
index 2ef11a74b14..6f3082fb776 100644
--- a/man/calc.texi
+++ b/man/calc.texi
@@ -203,7 +203,7 @@ software---to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -543,7 +543,7 @@ If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
@smallexample
-Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author}
+Gnomovision version 69, Copyright (C) @var{yyyy} @var{name of author}
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
@@ -570,7 +570,7 @@ Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
@node Getting Started, Tutorial, Copying, Top
diff --git a/man/emacs.texi b/man/emacs.texi
index 503ec74bffd..7e84c869d1f 100644
--- a/man/emacs.texi
+++ b/man/emacs.texi
@@ -1196,7 +1196,7 @@ software---to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -1513,7 +1513,7 @@ the ``copyright'' line and a pointer to where the full notice is found.
@smallexample
@var{one line to give the program's name and an idea of what it does.}
-Copyright (C) 19@var{yy} @var{name of author}
+Copyright (C) @var{yyyy} @var{name of author}
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@@ -1536,7 +1536,7 @@ If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
@smallexample
-Gnomovision version 69, Copyright (C) 20@var{yy} @var{name of author}
+Gnomovision version 69, Copyright (C) @var{yyyy} @var{name of author}
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
type `show w'. This is free software, and you are welcome
to redistribute it under certain conditions; type `show c'
@@ -1568,7 +1568,7 @@ Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
@include doclicense.texi
diff --git a/man/frames.texi b/man/frames.texi
index 29ece2d0dc2..eda8148a63d 100644
--- a/man/frames.texi
+++ b/man/frames.texi
@@ -945,11 +945,18 @@ of hidden files (files starting with a dot) in that dialog. The
variable @code{x-gtk-show-hidden-files} controls whether to show
hidden files by default.
-@vindex x-use-old-gtk-file-dialog
- For Gtk+ version 2.4 and 2.6, you can make Emacs use the old file dialog
-by setting the variable @code{x-use-old-gtk-file-dialog} to a non-@code{nil}
-value. If Emacs is built with a Gtk+ version that has only one file dialog,
-the setting of this variable has no effect.
+@vindex x-gtk-use-old-file-dialog
+ For Gtk+ versions 2.4 through 2.10, you can select the old file
+dialog (@code{gtk-file-selector}) by setting the variable
+@code{x-gtk-use-old-file-dialog} to a non-@code{nil} value. If it is
+@code{nil}, Emacs uses @code{gtk-file-chooser}. If Emacs is built
+with a Gtk+ version that has only one file dialog, this variable has
+no effect.
+
+@vindex x-gtk-file-dialog-help-text
+ Emacs adds help text to the Gtk+ file chooser dialog. The variable
+@code{x-gtk-file-dialog-help-text} specifies the text to add; if it is
+@code{nil}, that disables the added text.
@node Tooltips
@section Tooltips
diff --git a/man/gnus.texi b/man/gnus.texi
index dec0ec8e08b..0e8e9572349 100644
--- a/man/gnus.texi
+++ b/man/gnus.texi
@@ -26538,7 +26538,9 @@ versions.
@item
The option @code{mm-fill-flowed} can be used to disable treatment of
``format=flowed'' messages. Also, flowed text is disabled when sending
-inline PGP signed messages. (New in Gnus 5.10.7)
+inline PGP signed messages. @xref{Flowed text, , Flowed text,
+emacs-mime, The Emacs MIME Manual}. (New in Gnus 5.10.7)
+@c This entry is also present in the node "No Gnus".
@item
Gnus supports the generation of RFC 2298 Disposition Notification requests.
diff --git a/man/mh-e.texi b/man/mh-e.texi
index 4c59305774b..dcc84e16acd 100644
--- a/man/mh-e.texi
+++ b/man/mh-e.texi
@@ -9288,7 +9288,7 @@ software---to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -9605,7 +9605,7 @@ the ``copyright'' line and a pointer to where the full notice is found.
@smallexample
@var{one line to give the program's name and an idea of what it does.}
-Copyright (C) 19@var{yy} @var{name of author}
+Copyright (C) @var{yyyy} @var{name of author}
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@@ -9628,7 +9628,7 @@ If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
@smallexample
-Gnomovision version 69, Copyright (C) 20@var{yy} @var{name of author}
+Gnomovision version 69, Copyright (C) @var{yyyy} @var{name of author}
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
type `show w'. This is free software, and you are welcome
to redistribute it under certain conditions; type `show c'
@@ -9660,7 +9660,7 @@ Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
@node Key Index, Command Index, GPL, Top
diff --git a/man/org.texi b/man/org.texi
index 7897ba32867..0c3460b4178 100644
--- a/man/org.texi
+++ b/man/org.texi
@@ -2766,7 +2766,7 @@ groups are allowed.}
@end example
@noindent you indicate that at most one of @samp{@@WORK}, @samp{@@HOME},
-and @samp{@@SAILBOAT} should be selected.
+and @samp{@@TENNISCLUB} should be selected.
@noindent Don't forget to press @kbd{C-c C-c} with the cursor in one of
these lines to activate any changes.
diff --git a/msdos/COPYING b/msdos/COPYING
index 3912109b5cd..d511905c164 100644
--- a/msdos/COPYING
+++ b/msdos/COPYING
@@ -1,8 +1,8 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
-
+
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
-
+
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
-
+
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
-
+
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
-
+
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
@@ -303,10 +303,9 @@ the "copyright" line and a pointer to where the full notice is found.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
diff --git a/msdos/ChangeLog b/msdos/ChangeLog
index 988f073cb53..ded66094592 100644
--- a/msdos/ChangeLog
+++ b/msdos/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-15 Jay Belanger <belanger@truman.edu>
+
+ * COPYING: Replace "Library Public License" by "Lesser Public
+ License" throughout.
+
2005-09-10 Sven Joachim <svenjoac@gmx.de> (tiny change)
* sed3v2.inp (GETOPT_H, GETOPTOBJS): Define to use getopt.h,
diff --git a/nt/COPYING b/nt/COPYING
index 3912109b5cd..d511905c164 100644
--- a/nt/COPYING
+++ b/nt/COPYING
@@ -1,8 +1,8 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
-
+
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
-
+
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
-
+
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
-
+
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
-
+
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
@@ -303,10 +303,9 @@ the "copyright" line and a pointer to where the full notice is found.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
diff --git a/nt/ChangeLog b/nt/ChangeLog
index 41b19bdadf1..1b79cdd57c7 100644
--- a/nt/ChangeLog
+++ b/nt/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-15 Jay Belanger <belanger@truman.edu>
+
+ * COPYING: Replace "Library Public License" by "Lesser Public
+ License" throughout.
+
2006-07-27 Jason Rumney <jasonr@gnu.org>
* INSTALL: Add notes about Cygwin make to impatient section.
diff --git a/src/COPYING b/src/COPYING
index 3912109b5cd..d511905c164 100644
--- a/src/COPYING
+++ b/src/COPYING
@@ -1,8 +1,8 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
+the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
-
+
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
-
+
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
-
+
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
-
+
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
-
+
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
@@ -303,10 +303,9 @@ the "copyright" line and a pointer to where the full notice is found.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
+library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
diff --git a/src/ChangeLog b/src/ChangeLog
index 51c496b773b..4b22c5d5dc0 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,157 @@
+2006-09-19 Chong Yidong <cyd@stupidchicken.com>
+
+ * search.c (struct regexp_cache): New entry syntax_table.
+ (compile_pattern_1): Set it.
+ (syms_of_search): Initialize it.
+ (compile_pattern): Require the syntax_table entry of the cache
+ element to match the current syntax table entry.
+
+2006-09-19 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * window.c (Fwindow_end): Fix recent change.
+
+2006-09-19 Kim F. Storm <storm@cua.dk>
+
+ * window.c (Fset_window_hscroll, Fpos_visible_in_window_p):
+ Doc fix. Use "off-screen" instead of "invisible".
+ (Fwindow_line_height): Make line numbers 0-based. Make line arg
+ optional; if nil, use current cursor row. Handle text terminals
+ properly. Return nil if non-interactive or pseudo-window.
+
+2006-09-19 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * keymap.c: Include alloca.h if available.
+ (Fkey_binding): Only use AREF after checking it's a vector.
+ Remove unused var `window'.
+
+2006-09-19 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
+
+ * emacs.c (shut_down_emacs) [!subprocesses]: Don't set
+ inhibit_sentinels.
+
+ * mac.c [!MAC_OSX] (select): Fix argument name.
+
+ * macmenu.c (enum mac_menu_kind, min_menu_id): New enumerator and
+ menu ID for Apple menu.
+ (menubar_selection_callback): Remove function.
+ (find_and_call_menu_selection): New function from xmenu.c.
+ (x_activate_menubar): Use it.
+ (set_frame_menubar): Don't use f->output_data.mac->menubar_active.
+
+ * macterm.c (menubar_selection_callback): Remove extern.
+ (M_APPLE): Change to 234.
+ (do_apple_menu) [!TARGET_API_MAC_CARBON]: Make non-static.
+ (do_menu_choice): Remove function.
+
+ * macterm.h (struct mac_output): Remove member menubar_active.
+ (do_menu_choice): Remove extern.
+ (do_apple_menu) [!TARGET_API_MAC_CARBON]: Add extern.
+
+2006-09-18 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
+
+ * xfns.c (syms_of_xfns): Rename x_gtk_show_chooser_help_text to
+ x_gtk_file_dialog_help_text.
+
+ * gtkutil.c (xg_uses_old_file_dialog): Rename x-use-old-gtk-file-dialog
+ to x-gtk-use-old-file-dialog.
+ (xg_get_file_with_chooser): Rename x_gtk_show_chooser_help_text to
+ x_gtk_file_dialog_help_text.
+
+ * xfns.c (syms_of_xfns): Ditto.
+
+2006-09-18 Kim F. Storm <storm@cua.dk>
+
+ * window.c (Fwindow_line_visibility): Remove.
+ (Fwindow_line_height): New defun replacing it.
+ (syms_of_window): Defsubr it.
+
+2006-09-18 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
+
+ * mac.c (SELECT_USE_CFSOCKET) [MAC_OSX]: Set default to 1.
+ [MAC_OSX] (sys_select) [SELECT_USE_CFSOCKET]: Fix pointer type.
+
+2006-09-17 Jay Belanger <belanger@truman.edu>
+
+ * gmalloc.c:
+ * md5.c:
+ * md5.h:
+ * strftime.c: Replace "GNU Library General Public License" by "GNU
+ General Public License" throughout.
+
+2006-09-17 Kim F. Storm <storm@cua.dk>
+
+ * dispnew.c (update_text_area): Undo 2000-07-18 change.
+ Always redrawing whole row if line has mouse-face in it causes
+ excessive flickering of the mode line.
+
+2006-09-17 Chong Yidong <cyd@stupidchicken.com>
+
+ * search.c (clear_regexp_cache): New function.
+
+ * syntax.c (Fmodify_syntax_entry): Clear regexp cache.
+
+2006-09-16 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
+
+ * gtkutil.c (xg_get_file_with_chooser):
+ Check x-gtk-show-chooser-help-text before adding the help text.
+
+ * xfns.c (syms_of_xfns): New variable: x-gtk-show-chooser-help-text.
+
+ * gtkutil.c (get_utf8_string): Try harder to convert to UTF8. Gtk+
+ will simply crash if we fail.
+
+2006-09-16 Richard Stallman <rms@gnu.org>
+
+ * regex.c (re_compile_pattern): Set gl_state.current_syntax_table.
+
+2006-09-15 Kim F. Storm <storm@cua.dk>
+
+ * window.c (Fwindow_line_visibility): New defun for line-move-partial.
+ (syms_of_window): Defsubr it.
+ (Fwindow_end): Use window's buffer rather than current buffer.
+
+2006-09-15 Jay Belanger <belanger@truman.edu>
+
+ * COPYING: Replace "Library Public License" by "Lesser Public
+ License" throughout.
+
+2006-09-15 David Kastrup <dak@gnu.org>
+
+ * Makefile.in (keymap.o): Add "keymap.h" and "window.h"
+ dependencies.
+
+ * keymap.c: include "window.h".
+ (Fcommand_remapping): New optional POSITION argument.
+ (Fkey_binding): New optional POSITION argument. Completely rework
+ handling of mouse clicks to get the same order of keymaps as
+ `read-key-sequence' and heed POSITION. Also temporarily switch
+ buffers to location of mouse click and back.
+
+ * keyboard.c (command_loop_1): Adjust call of `Fcommand_remapping'
+ for additional argument.
+ (parse_menu_item): Adjust call of `Fkey_binding' for additional
+ argument.
+ (read_key_sequence): If there are both `local-map' and `keymap'
+ text properties at some buffer position, heed both.
+
+ * keymap.h: Declare additional optional arguments of
+ `Fcommand_remapping' and `Fkey_binding'.
+
+2006-09-15 Juanma Barranquero <lekktu@gmail.com>
+
+ * indent.c (Fcurrent_column, Findent_to): Fix typos in docstring.
+
+2006-09-14 Andreas Schwab <schwab@suse.de>
+
+ * print.c: Whitespace fixup.
+
+2006-09-14 Kim F. Storm <storm@cua.dk>
+
+ * xdisp.c (produce_image_glyph): Automatically crop wide images at
+ right window edge so we can draw the cursor on the same row to
+ avoid confusing redisplay by placing the cursor outside the visible
+ window area.
+
2006-09-13 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
* xterm.c (x_initialize): Don't install Xt event timer here.
@@ -67,12 +221,12 @@
* mac.c [MAC_OSX] (sys_select): Check argument `nfds' more rigidly.
Make variable `ofds' static. Remove variable `maxfd'.
- * macfns.c (Fx_file_dialog): Remove unused variable `f'. Call
- check_mac.
+ * macfns.c (Fx_file_dialog): Remove unused variable `f'.
+ Call check_mac.
* macmenu.c (Vmenu_updating_frame, syms_of_macmenu):
- * w32menu.c (Vmenu_updating_frame, syms_of_w32menu): Apply
- 2006-09-08 change for xmenu.c.
+ * w32menu.c (Vmenu_updating_frame, syms_of_w32menu):
+ Apply 2006-09-08 change for xmenu.c.
* xfns.c (Fx_file_dialog): Call check_x.
@@ -332,11 +486,11 @@
* mac.c (create_apple_event_from_event_ref, select)
(Fmac_get_file_creator, Fmac_get_file_type, Fmac_set_file_creator)
(Fmac_set_file_type, cfstring_create_normalized)
- (mac_get_system_locale, select_and_poll_event, sys_select): Use
- OSStatus instead of OSErr.
+ (mac_get_system_locale, select_and_poll_event, sys_select):
+ Use OSStatus instead of OSErr.
- * macfns.c [TARGET_API_MAC_CARBON] (mac_update_proxy_icon): Don't
- use FRAME_FILE_NAME. Use (FS)UpdateAlias.
+ * macfns.c [TARGET_API_MAC_CARBON] (mac_update_proxy_icon):
+ Don't use FRAME_FILE_NAME. Use (FS)UpdateAlias.
(Fx_create_frame): Apply 2006-07-03 for xfns.c.
* macselect.c (get_scrap_from_symbol, clear_scrap, put_scrap_string)
@@ -505,7 +659,6 @@
* xterm.c (x_term_init): Initialize dpyinfo->x_dnd_atoms*
-
2006-08-10 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* keyboard.c: Define in_sighandler.
@@ -699,7 +852,7 @@
(FletX, Flet, grow_specpdl): Use signal_error.
(Feval, Ffuncall, funcall_lambda): Use xsignal1, xsignal2.
- * alloc.c (buffer_memory_full, memory_full): Use xsignal. Remove loop.
+ * alloc.c (buffer_memory_full, memory_full): Use xsignal. Remove loop.
(list1): New function.
* lisp.h (list1): Add EXFUN.
@@ -10251,7 +10404,6 @@
* xterm.c (xim_destroy_callback): Ditto.
-
2004-10-20 B. Anyos <banyos@freemail.hu> (tiny change)
* w32term.c (x_draw_glyph_string): Use overline_color for overlines.
@@ -18741,6 +18893,14 @@
* Makefile.in (fns.o): Depend on coding.h.
+2003-01-06 Dave Love <fx@gnu.org>
+
+ * fns.c: Include coding.h. Use POINTER_TYPE*, not void*.
+ (Vlocale_coding_system): Declare.
+ (Qcodeset, Qdays, Qmonths, Qpaper): New.
+ (Flanginfo): New.
+ (syms_of_fns): Initialize new stuff.
+
2003-01-07 Markus Rost <rost@math.ohio-state.edu>
* minibuf.c (Fread_variable): Doc fix.
diff --git a/src/Makefile.in b/src/Makefile.in
index 3bb6cece33d..b7569b9de2a 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1171,7 +1171,8 @@ keyboard.o: keyboard.c termchar.h termhooks.h termopts.h buffer.h character.h \
systty.h systime.h dispextern.h syntax.h $(INTERVAL_SRC) blockinput.h \
atimer.h xterm.h puresize.h msdos.h keymap.h w32term.h macterm.h $(config_h)
keymap.o: keymap.c buffer.h commands.h keyboard.h termhooks.h blockinput.h \
- atimer.h systime.h puresize.h character.h intervals.h $(config_h)
+ atimer.h systime.h puresize.h character.h intervals.h keymap.h window.h \
+ $(config_h)
lastfile.o: lastfile.c $(config_h)
macros.o: macros.c window.h buffer.h commands.h macros.h keyboard.h \
dispextern.h $(config_h)
diff --git a/src/dispnew.c b/src/dispnew.c
index 4880ef7779f..de8f2c1ad38 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -4392,7 +4392,12 @@ update_text_area (w, vpos)
|| desired_row->phys_height != current_row->phys_height
|| desired_row->visible_height != current_row->visible_height
|| current_row->overlapped_p
+#if 0
+ /* This causes excessive flickering when mouse is moved across
+ the mode line. Luckily everything seems to work just fine
+ without doing this. KFS 2006-09-17. */
|| current_row->mouse_face_p
+#endif
|| current_row->x != desired_row->x)
{
rif->cursor_to (vpos, 0, desired_row->y, desired_row->x);
diff --git a/src/emacs.c b/src/emacs.c
index 74cef49926f..4d678696334 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -2156,7 +2156,9 @@ shut_down_emacs (sig, no_x, stuff)
stuff_buffered_input (stuff);
+#ifdef subprocesses
inhibit_sentinels = 1;
+#endif
kill_buffer_processes (Qnil);
Fdo_auto_save (Qt, Qnil);
diff --git a/src/gmalloc.c b/src/gmalloc.c
index 71df287a6b6..646fbbc4e4c 100644
--- a/src/gmalloc.c
+++ b/src/gmalloc.c
@@ -10,17 +10,17 @@
Written May 1989 by Mike Haertel.
This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
+modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; see the file COPYING.LIB. If
+You should have received a copy of the GNU General Public
+License along with this library; see the file COPYING. If
not, write to the Free Software Foundation, Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301, USA.
@@ -329,17 +329,17 @@ extern __ptr_t r_re_alloc PP ((__ptr_t *__handleptr, __malloc_size_t __size));
Written May 1989 by Mike Haertel.
This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
+modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; see the file COPYING.LIB. If
+You should have received a copy of the GNU General Public
+License along with this library; see the file COPYING. If
not, write to the Free Software Foundation, Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301, USA.
@@ -932,17 +932,17 @@ _realloc (ptr, size)
Written May 1989 by Mike Haertel.
This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
+modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; see the file COPYING.LIB. If
+You should have received a copy of the GNU General Public
+License along with this library; see the file COPYING. If
not, write to the Free Software Foundation, Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1251,17 +1251,17 @@ cfree (ptr)
Written May 1989 by Mike Haertel.
This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
+modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; see the file COPYING.LIB. If
+You should have received a copy of the GNU General Public
+License along with this library; see the file COPYING. If
not, write to the Free Software Foundation, Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1496,17 +1496,17 @@ realloc (ptr, size)
/* Copyright (C) 1991, 1992, 1994 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
+modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; see the file COPYING.LIB. If
+You should have received a copy of the GNU General Public
+License along with this library; see the file COPYING. If
not, write to the Free Software Foundation, Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1593,17 +1593,17 @@ __default_morecore (increment)
/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
+modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; see the file COPYING.LIB. If
+You should have received a copy of the GNU General Public
+License along with this library; see the file COPYING. If
not, write to the Free Software Foundation, Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301, USA. */
@@ -1693,17 +1693,17 @@ memalign (alignment, size)
Copyright (C) 1991, 92, 93, 94, 96 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
+modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; see the file COPYING.LIB. If
+You should have received a copy of the GNU General Public
+License along with this library; see the file COPYING. If
not, write to the Free Software Foundation, Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1760,17 +1760,17 @@ valloc (size)
Written May 1989 by Mike Haertel.
This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
+modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; see the file COPYING.LIB. If
+You should have received a copy of the GNU General Public
+License along with this library; see the file COPYING. If
not, write to the Free Software Foundation, Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/src/gtkutil.c b/src/gtkutil.c
index cf6caafa942..cdc87044c81 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -507,10 +507,66 @@ get_utf8_string (str)
{
char *utf8_str = str;
+ if (!str) return NULL;
+
/* If not UTF-8, try current locale. */
- if (str && !g_utf8_validate (str, -1, NULL))
+ if (!g_utf8_validate (str, -1, NULL))
utf8_str = g_locale_to_utf8 (str, -1, 0, 0, 0);
+ if (!utf8_str)
+ {
+ /* Probably some control characters in str. Escape them. */
+ size_t nr_bad = 0;
+ gsize bytes_read;
+ gsize bytes_written;
+ unsigned char *p = (unsigned char *)str;
+ char *cp, *up;
+ GError *error = NULL;
+
+ while (! (cp = g_locale_to_utf8 (p, -1, &bytes_read,
+ &bytes_written, &error))
+ && error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE)
+ {
+ ++nr_bad;
+ p += bytes_written+1;
+ g_error_free (error);
+ error = NULL;
+ }
+
+ if (error)
+ {
+ g_error_free (error);
+ error = NULL;
+ }
+ if (cp) g_free (cp);
+
+ up = utf8_str = xmalloc (strlen (str) + nr_bad * 4 + 1);
+ p = str;
+
+ while (! (cp = g_locale_to_utf8 (p, -1, &bytes_read,
+ &bytes_written, &error))
+ && error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE)
+ {
+ strncpy (up, p, bytes_written);
+ sprintf (up + bytes_written, "\\%03o", p[bytes_written]);
+ up[bytes_written+4] = '\0';
+ up += bytes_written+4;
+ p += bytes_written+1;
+ g_error_free (error);
+ error = NULL;
+ }
+
+ if (cp)
+ {
+ strcat (utf8_str, cp);
+ g_free (cp);
+ }
+ if (error)
+ {
+ g_error_free (error);
+ error = NULL;
+ }
+ }
return utf8_str;
}
@@ -1156,8 +1212,8 @@ int
xg_uses_old_file_dialog ()
{
#ifdef HAVE_GTK_FILE_BOTH
- extern int x_use_old_gtk_file_dialog;
- return x_use_old_gtk_file_dialog;
+ extern int x_gtk_use_old_file_dialog;
+ return x_gtk_use_old_file_dialog;
#else /* ! HAVE_GTK_FILE_BOTH */
#ifdef HAVE_GTK_FILE_SELECTION_NEW
@@ -1294,6 +1350,8 @@ xg_get_file_with_chooser (f, prompt, default_filename,
GTK_FILE_CHOOSER_ACTION_OPEN :
GTK_FILE_CHOOSER_ACTION_SAVE);
extern int x_gtk_show_hidden_files;
+ extern int x_gtk_file_dialog_help_text;
+
if (only_dir_p)
action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
@@ -1321,17 +1379,22 @@ xg_get_file_with_chooser (f, prompt, default_filename,
g_signal_connect (G_OBJECT (filewin), "notify",
G_CALLBACK (xg_toggle_notify_cb), wtoggle);
- message[0] = '\0';
- if (action != GTK_FILE_CHOOSER_ACTION_SAVE)
- strcat (message, "\nType C-l to display a file name text entry box.\n");
- strcat (message, "\nIf you don't like this file selector, use the "
- "corresponding\nkey binding or customize "
- "use-file-dialog to turn it off.");
+ if (x_gtk_file_dialog_help_text)
+ {
+ message[0] = '\0';
+ if (action != GTK_FILE_CHOOSER_ACTION_SAVE)
+ strcat (message, "\nType C-l to display a file name text entry box.\n");
+ strcat (message, "\nIf you don't like this file selector, use the "
+ "corresponding\nkey binding or customize "
+ "use-file-dialog to turn it off.");
- wmessage = gtk_label_new (message);
- gtk_widget_show (wmessage);
+ wmessage = gtk_label_new (message);
+ gtk_widget_show (wmessage);
+ }
+
gtk_box_pack_start (GTK_BOX (wbox), wtoggle, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (wbox), wmessage, FALSE, FALSE, 0);
+ if (x_gtk_file_dialog_help_text)
+ gtk_box_pack_start (GTK_BOX (wbox), wmessage, FALSE, FALSE, 0);
gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (filewin), wbox);
if (default_filename)
diff --git a/src/indent.c b/src/indent.c
index 2461c156e3c..8ea3ea66c1d 100644
--- a/src/indent.c
+++ b/src/indent.c
@@ -335,8 +335,8 @@ DEFUN ("current-column", Fcurrent_column, Scurrent_column, 0, 0, 0,
doc: /* Return the horizontal position of point. Beginning of line is column 0.
This is calculated by adding together the widths of all the displayed
representations of the character between the start of the previous line
-and point. (eg control characters will have a width of 2 or 4, tabs
-will have a variable width)
+and point (eg. control characters will have a width of 2 or 4, tabs
+will have a variable width).
Ignores finite width of frame, which means that this function may return
values greater than (frame-width).
Whether the line is visible (if `selective-display' is t) has no effect;
@@ -734,8 +734,8 @@ string_display_width (string, beg, end)
DEFUN ("indent-to", Findent_to, Sindent_to, 1, 2, "NIndent to column: ",
doc: /* Indent from point with tabs and spaces until COLUMN is reached.
-Optional second argument MININUM says always do at least MININUM spaces
-even if that goes past COLUMN; by default, MININUM is zero. */)
+Optional second argument MINIMUM says always do at least MINIMUM spaces
+even if that goes past COLUMN; by default, MINIMUM is zero. */)
(column, minimum)
Lisp_Object column, minimum;
{
diff --git a/src/keyboard.c b/src/keyboard.c
index 6a1d6e608d2..786b3d9b556 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -1674,7 +1674,7 @@ command_loop_1 ()
if (SYMBOLP (cmd))
{
Lisp_Object cmd1;
- if (cmd1 = Fcommand_remapping (cmd), !NILP (cmd1))
+ if (cmd1 = Fcommand_remapping (cmd, Qnil), !NILP (cmd1))
cmd = cmd1;
}
@@ -7517,7 +7517,7 @@ parse_menu_item (item, notreal, inmenubar)
Lisp_Object prefix;
if (!NILP (tem))
- tem = Fkey_binding (tem, Qnil, Qnil);
+ tem = Fkey_binding (tem, Qnil, Qnil, Qnil);
prefix = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
if (CONSP (prefix))
@@ -9134,16 +9134,19 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
if (!EQ (map_here, orig_local_map))
{
orig_local_map = map_here;
- keybuf[t] = key;
- mock_input = t + 1;
-
- goto replay_sequence;
+ ++localized_local_map;
}
+
map_here = get_local_map (XINT (pos),
current_buffer, Qkeymap);
if (!EQ (map_here, orig_keymap))
{
orig_keymap = map_here;
+ ++localized_local_map;
+ }
+
+ if (localized_local_map > 1)
+ {
keybuf[t] = key;
mock_input = t + 1;
diff --git a/src/keymap.c b/src/keymap.c
index 99d49c000e9..9720708ecf9 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -23,6 +23,9 @@ Boston, MA 02110-1301, USA. */
#include <config.h>
#include <stdio.h>
+#if HAVE_ALLOCA_H
+# include <alloca.h>
+#endif
#include "lisp.h"
#include "commands.h"
#include "buffer.h"
@@ -34,6 +37,7 @@ Boston, MA 02110-1301, USA. */
#include "puresize.h"
#include "intervals.h"
#include "keymap.h"
+#include "window.h"
/* The number of elements in keymap vectors. */
#define DENSE_TABLE_SIZE (0200)
@@ -1249,17 +1253,23 @@ binding KEY to DEF is added at the front of KEYMAP. */)
/* This function may GC (it calls Fkey_binding). */
-DEFUN ("command-remapping", Fcommand_remapping, Scommand_remapping, 1, 1, 0,
+DEFUN ("command-remapping", Fcommand_remapping, Scommand_remapping, 1, 2, 0,
doc: /* Return the remapping for command COMMAND in current keymaps.
-Returns nil if COMMAND is not remapped (or not a symbol). */)
- (command)
- Lisp_Object command;
+Returns nil if COMMAND is not remapped (or not a symbol).
+
+If the optional argument POSITION is non-nil, it specifies a mouse
+position as returned by `event-start' and `event-end', and the
+remapping occurs in the keymaps associated with it. It can also be a
+number or marker, in which case the keymap properties at the specified
+buffer position instead of point are used. */)
+ (command, position)
+ Lisp_Object command, position;
{
if (!SYMBOLP (command))
return Qnil;
ASET (command_remapping_vector, 1, command);
- return Fkey_binding (command_remapping_vector, Qnil, Qt);
+ return Fkey_binding (command_remapping_vector, Qnil, Qt, position);
}
/* Value is number if KEY is too long; nil if valid but has no definition. */
@@ -1585,7 +1595,7 @@ OLP if non-nil indicates that we should obey `overriding-local-map' and
/* GC is possible in this function if it autoloads a keymap. */
-DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 3, 0,
+DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 4, 0,
doc: /* Return the binding for command KEY in current keymaps.
KEY is a string or vector, a sequence of keystrokes.
The binding is probably a symbol with a function definition.
@@ -1599,55 +1609,83 @@ recognize the default bindings, just as `read-key-sequence' does.
Like the normal command loop, `key-binding' will remap the command
resulting from looking up KEY by looking up the command in the
current keymaps. However, if the optional third argument NO-REMAP
-is non-nil, `key-binding' returns the unmapped command. */)
- (key, accept_default, no_remap)
- Lisp_Object key, accept_default, no_remap;
+is non-nil, `key-binding' returns the unmapped command.
+
+If KEY is a key sequence initiated with the mouse, the used keymaps
+will depend on the clicked mouse position with regard to the buffer
+and possible local keymaps on strings.
+
+If the optional argument POSITION is non-nil, it specifies a mouse
+position as returned by `event-start' and `event-end', and the lookup
+occurs in the keymaps associated with it instead of KEY. It can also
+be a number or marker, in which case the keymap properties at the
+specified buffer position instead of point are used.
+ */)
+ (key, accept_default, no_remap, position)
+ Lisp_Object key, accept_default, no_remap, position;
{
Lisp_Object *maps, value;
int nmaps, i;
- struct gcpro gcpro1;
+ struct gcpro gcpro1, gcpro2;
+ int count = SPECPDL_INDEX ();
- GCPRO1 (key);
+ GCPRO2 (key, position);
-#ifdef HAVE_MOUSE
- if (VECTORP (key) && ASIZE (key) > 0)
+ if (NILP (position) && VECTORP (key))
{
- Lisp_Object ev, pos;
- if ((ev = AREF (key, 0), CONSP (ev))
- && SYMBOLP (XCAR (ev))
- && CONSP (XCDR (ev))
- && (pos = XCAR (XCDR (ev)), CONSP (pos))
- && XINT (Flength (pos)) == 10
- && INTEGERP (XCAR (XCDR (pos))))
- {
- Lisp_Object map, object;
+ Lisp_Object event
+ /* mouse events may have a symbolic prefix indicating the
+ scrollbar or mode line */
+ = AREF (key, SYMBOLP (AREF (key, 0)) && ASIZE (key) > 1 ? 1 : 0);
- object = Fnth (make_number(4), pos);
+ /* We are not interested in locations without event data */
- if (CONSP (object))
- map = Fget_char_property (XCDR (object), Qkeymap, XCAR (object));
- else
- map = Fget_char_property (XCAR (XCDR (pos)), Qkeymap,
- Fwindow_buffer (XCAR (pos)));
+ if (EVENT_HAS_PARAMETERS (event)) {
+ Lisp_Object kind;
- if (!NILP (Fkeymapp (map)))
- {
- value = Flookup_key (map, key, accept_default);
- if (! NILP (value) && !INTEGERP (value))
- goto done;
- }
- }
+ kind = EVENT_HEAD_KIND (EVENT_HEAD (event));
+ if (EQ (kind, Qmouse_click))
+ position = EVENT_START (event);
+ }
}
-#endif /* HAVE_MOUSE */
- if (!NILP (current_kboard->Voverriding_terminal_local_map))
+ /* Key sequences beginning with mouse clicks
+ are read using the keymaps of the buffer clicked on, not
+ the current buffer. So we may have to switch the buffer
+ here. */
+
+ if (CONSP (position))
+ {
+ Lisp_Object window;
+
+ window = POSN_WINDOW (position);
+
+ if (WINDOWP (window)
+ && BUFFERP (XWINDOW (window)->buffer)
+ && XBUFFER (XWINDOW (window)->buffer) != current_buffer)
+ {
+ /* Arrange to go back to the original buffer once we're done
+ processing the key sequence. We don't use
+ save_excursion_{save,restore} here, in analogy to
+ `read-key-sequence' to avoid saving point. Maybe this
+ would not be a problem here, but it is easier to keep
+ things the same.
+ */
+
+ record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
+
+ set_buffer_internal (XBUFFER (XWINDOW (window)->buffer));
+ }
+ }
+
+ if (! NILP (current_kboard->Voverriding_terminal_local_map))
{
value = Flookup_key (current_kboard->Voverriding_terminal_local_map,
key, accept_default);
if (! NILP (value) && !INTEGERP (value))
goto done;
}
- else if (!NILP (Voverriding_local_map))
+ else if (! NILP (Voverriding_local_map))
{
value = Flookup_key (Voverriding_local_map, key, accept_default);
if (! NILP (value) && !INTEGERP (value))
@@ -1655,12 +1693,70 @@ is non-nil, `key-binding' returns the unmapped command. */)
}
else
{
- Lisp_Object local;
+ Lisp_Object keymap, local_map;
+ EMACS_INT pt;
- local = get_local_map (PT, current_buffer, Qkeymap);
- if (! NILP (local))
+ pt = INTEGERP (position) ? XINT (position)
+ : MARKERP (position) ? marker_position (position)
+ : PT;
+
+ local_map = get_local_map (pt, current_buffer, Qlocal_map);
+ keymap = get_local_map (pt, current_buffer, Qkeymap);
+
+ if (CONSP (position))
{
- value = Flookup_key (local, key, accept_default);
+ Lisp_Object string;
+
+ /* For a mouse click, get the local text-property keymap
+ of the place clicked on, rather than point. */
+
+ if (POSN_INBUFFER_P (position))
+ {
+ Lisp_Object pos;
+
+ pos = POSN_BUFFER_POSN (position);
+ if (INTEGERP (pos)
+ && XINT (pos) >= BEG && XINT (pos) <= Z)
+ {
+ local_map = get_local_map (XINT (pos),
+ current_buffer, Qlocal_map);
+
+ keymap = get_local_map (XINT (pos),
+ current_buffer, Qkeymap);
+ }
+ }
+
+ /* If on a mode line string with a local keymap,
+ or for a click on a string, i.e. overlay string or a
+ string displayed via the `display' property,
+ consider `local-map' and `keymap' properties of
+ that string. */
+
+ if (string = POSN_STRING (position),
+ (CONSP (string) && STRINGP (XCAR (string))))
+ {
+ Lisp_Object pos, map;
+
+ pos = XCDR (string);
+ string = XCAR (string);
+ if (XINT (pos) >= 0
+ && XINT (pos) < SCHARS (string))
+ {
+ map = Fget_text_property (pos, Qlocal_map, string);
+ if (!NILP (map))
+ local_map = map;
+
+ map = Fget_text_property (pos, Qkeymap, string);
+ if (!NILP (map))
+ keymap = map;
+ }
+ }
+
+ }
+
+ if (! NILP (keymap))
+ {
+ value = Flookup_key (keymap, key, accept_default);
if (! NILP (value) && !INTEGERP (value))
goto done;
}
@@ -1677,10 +1773,9 @@ is non-nil, `key-binding' returns the unmapped command. */)
goto done;
}
- local = get_local_map (PT, current_buffer, Qlocal_map);
- if (! NILP (local))
+ if (! NILP (local_map))
{
- value = Flookup_key (local, key, accept_default);
+ value = Flookup_key (local_map, key, accept_default);
if (! NILP (value) && !INTEGERP (value))
goto done;
}
@@ -1689,6 +1784,8 @@ is non-nil, `key-binding' returns the unmapped command. */)
value = Flookup_key (current_global_map, key, accept_default);
done:
+ unbind_to (count, Qnil);
+
UNGCPRO;
if (NILP (value) || INTEGERP (value))
return Qnil;
@@ -1699,7 +1796,7 @@ is non-nil, `key-binding' returns the unmapped command. */)
if (NILP (no_remap) && SYMBOLP (value))
{
Lisp_Object value1;
- if (value1 = Fcommand_remapping (value), !NILP (value1))
+ if (value1 = Fcommand_remapping (value, position), !NILP (value1))
value = value1;
}
@@ -2449,7 +2546,7 @@ where_is_internal (definition, keymaps, firstonly, noindirect, no_remap)
if (NILP (no_remap) && SYMBOLP (definition))
{
Lisp_Object tem;
- if (tem = Fcommand_remapping (definition), !NILP (tem))
+ if (tem = Fcommand_remapping (definition, Qnil), !NILP (tem))
return Qnil;
}
diff --git a/src/keymap.h b/src/keymap.h
index cbd14cf9ba4..b11f630a1fb 100644
--- a/src/keymap.h
+++ b/src/keymap.h
@@ -29,8 +29,8 @@ EXFUN (Fmake_sparse_keymap, 1);
EXFUN (Fkeymap_prompt, 1);
EXFUN (Fdefine_key, 3);
EXFUN (Flookup_key, 3);
-EXFUN (Fcommand_remapping, 1);
-EXFUN (Fkey_binding, 3);
+EXFUN (Fcommand_remapping, 2);
+EXFUN (Fkey_binding, 4);
EXFUN (Fkey_description, 2);
EXFUN (Fsingle_key_description, 2);
EXFUN (Fwhere_is_internal, 5);
diff --git a/src/mac.c b/src/mac.c
index 51b821dcd95..be6953a0d55 100644
--- a/src/mac.c
+++ b/src/mac.c
@@ -2416,7 +2416,7 @@ sys_fopen (const char *name, const char *mode)
extern Boolean mac_wait_next_event P_ ((EventRecord *, UInt32, Boolean));
int
-select (n, rfds, wfds, efds, timeout)
+select (nfds, rfds, wfds, efds, timeout)
int nfds;
SELECT_TYPE *rfds, *wfds, *efds;
EMACS_TIME *timeout;
@@ -4975,6 +4975,10 @@ extern int noninteractive;
executing `select' with a short timeout
(SELECT_POLLING_PERIOD_USEC microseconds). */
+#ifndef SELECT_USE_CFSOCKET
+#define SELECT_USE_CFSOCKET 1
+#endif
+
#define SELECT_POLLING_PERIOD_USEC 100000
#if SELECT_USE_CFSOCKET
#define SELECT_TIMEOUT_THRESHOLD_RUNLOOP 0.2
@@ -5115,7 +5119,7 @@ sys_select (nfds, rfds, wfds, efds, timeout)
int minfd, fd;
CFRunLoopRef runloop =
(CFRunLoopRef) GetCFRunLoopFromEventLoop (GetCurrentEventLoop ());
- static CFSocketContext context = {0, &ofds, NULL, NULL, NULL};
+ static CFSocketContext context = {0, ofds, NULL, NULL, NULL};
static CFMutableDictionaryRef sources;
if (sources == NULL)
diff --git a/src/macmenu.c b/src/macmenu.c
index 72ab9f90667..1a1525eafb7 100644
--- a/src/macmenu.c
+++ b/src/macmenu.c
@@ -64,7 +64,8 @@ Boston, MA 02110-1301, USA. */
enum mac_menu_kind { /* Menu ID range */
MAC_MENU_APPLE, /* 0 (Reserved by Apple) */
- MAC_MENU_MENU_BAR, /* 1 .. 234 */
+ MAC_MENU_MENU_BAR, /* 1 .. 233 */
+ MAC_MENU_M_APPLE, /* 234 (== M_APPLE) */
MAC_MENU_POPUP, /* 235 */
MAC_MENU_DRIVER, /* 236 .. 255 (Reserved) */
MAC_MENU_MENU_BAR_SUB, /* 256 .. 16383 */
@@ -72,7 +73,7 @@ enum mac_menu_kind { /* Menu ID range */
MAC_MENU_END /* 32768 */
};
-static const int min_menu_id[] = {0, 1, 235, 236, 256, 16384, 32768};
+static const int min_menu_id[] = {0, 1, 234, 235, 236, 256, 16384, 32768};
#define DIALOG_WINDOW_RESOURCE 130
@@ -196,6 +197,8 @@ static void single_keymap_panes P_ ((Lisp_Object, Lisp_Object, Lisp_Object,
static void list_of_panes P_ ((Lisp_Object));
static void list_of_items P_ ((Lisp_Object));
+static void find_and_call_menu_selection P_ ((FRAME_PTR, int, Lisp_Object,
+ void *));
static int fill_menu P_ ((MenuHandle, widget_value *, enum mac_menu_kind, int));
static void fill_menubar P_ ((widget_value *, int));
static void dispose_menus P_ ((enum mac_menu_kind, int));
@@ -1015,39 +1018,63 @@ x_activate_menubar (f)
FRAME_PTR f;
{
SInt32 menu_choice;
+ SInt16 menu_id, menu_item;
extern Point saved_menu_event_location;
set_frame_menubar (f, 0, 1);
BLOCK_INPUT;
menu_choice = MenuSelect (saved_menu_event_location);
- do_menu_choice (menu_choice);
+ menu_id = HiWord (menu_choice);
+ menu_item = LoWord (menu_choice);
+
+#if !TARGET_API_MAC_CARBON
+ if (menu_id == min_menu_id[MAC_MENU_M_APPLE])
+ do_apple_menu (menu_item);
+ else
+#endif
+ if (menu_id)
+ {
+ MenuHandle menu = GetMenuHandle (menu_id);
+
+ if (menu)
+ {
+ UInt32 refcon;
+
+ GetMenuItemRefCon (menu, menu_item, &refcon);
+ find_and_call_menu_selection (f, f->menu_bar_items_used,
+ f->menu_bar_vector, (void *) refcon);
+ }
+ }
+
+ HiliteMenu (0);
UNBLOCK_INPUT;
}
-/* This callback is called from the menu bar pulldown menu
- when the user makes a selection.
- Figure out what the user chose
- and put the appropriate events into the keyboard buffer. */
+/* Find the menu selection and store it in the keyboard buffer.
+ F is the frame the menu is on.
+ MENU_BAR_ITEMS_USED is the length of VECTOR.
+ VECTOR is an array of menu events for the whole menu. */
-void
-menubar_selection_callback (FRAME_PTR f, int client_data)
+static void
+find_and_call_menu_selection (f, menu_bar_items_used, vector, client_data)
+ FRAME_PTR f;
+ int menu_bar_items_used;
+ Lisp_Object vector;
+ void *client_data;
{
Lisp_Object prefix, entry;
- Lisp_Object vector;
Lisp_Object *subprefix_stack;
int submenu_depth = 0;
int i;
- if (!f)
- return;
entry = Qnil;
- subprefix_stack = (Lisp_Object *) alloca (f->menu_bar_items_used * sizeof (Lisp_Object));
- vector = f->menu_bar_vector;
+ subprefix_stack = (Lisp_Object *) alloca (menu_bar_items_used * sizeof (Lisp_Object));
prefix = Qnil;
i = 0;
- while (i < f->menu_bar_items_used)
+
+ while (i < menu_bar_items_used)
{
if (EQ (XVECTOR (vector)->contents[i], Qnil))
{
@@ -1105,13 +1132,11 @@ menubar_selection_callback (FRAME_PTR f, int client_data)
buf.arg = entry;
kbd_buffer_store_event (&buf);
- f->output_data.mac->menubar_active = 0;
return;
}
i += MENU_ITEMS_ITEM_LENGTH;
}
}
- f->output_data.mac->menubar_active = 0;
}
/* Allocate a widget_value, blocking input. */
@@ -1508,10 +1533,6 @@ set_frame_menubar (f, first_time, deep_p)
int *submenu_start, *submenu_end;
int *submenu_top_level_items, *submenu_n_panes;
- /* We must not change the menubar when actually in use. */
- if (f->output_data.mac->menubar_active)
- return;
-
XSETFRAME (Vmenu_updating_frame, f);
if (! menubar_widget)
diff --git a/src/macterm.c b/src/macterm.c
index 7e8d13fb9f9..03b96ac7f25 100644
--- a/src/macterm.c
+++ b/src/macterm.c
@@ -263,9 +263,6 @@ static int is_emacs_window P_ ((WindowPtr));
static XCharStruct *mac_per_char_metric P_ ((XFontStruct *, XChar2b *, int));
static void XSetFont P_ ((Display *, GC, XFontStruct *));
-/* Defined in macmenu.h. */
-extern void menubar_selection_callback (FRAME_PTR, int);
-
#define GC_FORE_COLOR(gc) (&(gc)->fore_color)
#define GC_BACK_COLOR(gc) (&(gc)->back_color)
#define GC_FONT(gc) ((gc)->xgcv.font)
@@ -8513,7 +8510,7 @@ mac_set_font_info_for_selection (f, face_id, c)
#endif
#endif /* ! TARGET_API_MAC_CARBON */
-#define M_APPLE 128
+#define M_APPLE 234
#define I_ABOUT 1
#define WINDOW_RESOURCE 128
@@ -9103,10 +9100,10 @@ mac_tsm_suspend ()
}
#endif
-static void
+#if !TARGET_API_MAC_CARBON
+void
do_apple_menu (SInt16 menu_item)
{
-#if !TARGET_API_MAC_CARBON
Str255 item_name;
SInt16 da_driver_refnum;
@@ -9117,43 +9114,8 @@ do_apple_menu (SInt16 menu_item)
GetMenuItemText (GetMenuHandle (M_APPLE), menu_item, item_name);
da_driver_refnum = OpenDeskAcc (item_name);
}
-#endif /* !TARGET_API_MAC_CARBON */
-}
-
-void
-do_menu_choice (SInt32 menu_choice)
-{
- SInt16 menu_id, menu_item;
-
- menu_id = HiWord (menu_choice);
- menu_item = LoWord (menu_choice);
-
- switch (menu_id)
- {
- case 0:
- break;
-
- case M_APPLE:
- do_apple_menu (menu_item);
- break;
-
- default:
- {
- struct frame *f = mac_focus_frame (&one_mac_display_info);
- MenuHandle menu = GetMenuHandle (menu_id);
- if (menu)
- {
- UInt32 refcon;
-
- GetMenuItemRefCon (menu, menu_item, &refcon);
- menubar_selection_callback (f, refcon);
- }
- }
- }
-
- HiliteMenu (0);
}
-
+#endif /* !TARGET_API_MAC_CARBON */
/* Handle drags in size box. Based on code contributed by Ben
Mesander and IM - Window Manager A. */
diff --git a/src/macterm.h b/src/macterm.h
index 945dbf3af57..edd89163e13 100644
--- a/src/macterm.h
+++ b/src/macterm.h
@@ -226,7 +226,8 @@ struct x_output
};
/* The collection of data describing a window on the Mac. */
-struct mac_output {
+struct mac_output
+{
/* Placeholder for things accessed through output_data.x. Must
appear first. */
struct x_output x_compatible;
@@ -316,9 +317,6 @@ struct mac_output {
/* Nonzero means tried already to make this frame visible. */
char asked_for_visible;
- /* Nonzero means menubar is currently active. */
- char menubar_active;
-
/* Relief GCs, colors etc. */
struct relief
{
@@ -629,8 +627,10 @@ extern OSStatus mac_show_hide_font_panel P_ ((void));
extern OSStatus mac_set_font_info_for_selection P_ ((struct frame *, int, int));
extern OSStatus install_window_handler P_ ((WindowPtr));
extern void remove_window_handler P_ ((WindowPtr));
-extern void do_menu_choice P_ ((SInt32));
extern OSStatus mac_post_mouse_moved_event P_ ((void));
+#if !TARGET_API_MAC_CARBON
+extern void do_apple_menu P_ ((SInt16));
+#endif
#if USE_CG_DRAWING
extern void mac_prepare_for_quickdraw P_ ((struct frame *));
#endif
diff --git a/src/md5.c b/src/md5.c
index d3c25b04d3e..0daf2c3ef7c 100644
--- a/src/md5.c
+++ b/src/md5.c
@@ -5,17 +5,17 @@
This file is part of the GNU Emacs.
The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
+ modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
+ General Public License for more details.
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; see the file COPYING. If not,
write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
diff --git a/src/md5.h b/src/md5.h
index 09bf02ff753..202b2749504 100644
--- a/src/md5.h
+++ b/src/md5.h
@@ -5,17 +5,17 @@
This file is part of GNU Emacs.
The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
+ modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
+ General Public License for more details.
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; see the file COPYING. If not,
write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
diff --git a/src/print.c b/src/print.c
index 1cc85270bc6..f6b64e32e30 100644
--- a/src/print.c
+++ b/src/print.c
@@ -217,7 +217,7 @@ int print_output_debug_flag = 1;
if (MARKERP (printcharfun)) \
{ \
EMACS_INT marker_pos; \
- if (!(XMARKER (printcharfun)->buffer)) \
+ if (! XMARKER (printcharfun)->buffer) \
error ("Marker does not point anywhere"); \
if (XMARKER (printcharfun)->buffer != current_buffer) \
set_buffer_internal (XMARKER (printcharfun)->buffer); \
@@ -290,7 +290,7 @@ int print_output_debug_flag = 1;
SET_PT_BOTH (old_point + (old_point >= start_point \
? PT - start_point : 0), \
old_point_byte + (old_point_byte >= start_point_byte \
- ? PT_BYTE - start_point_byte : 0)); \
+ ? PT_BYTE - start_point_byte : 0)); \
if (old != current_buffer) \
set_buffer_internal (old);
@@ -956,7 +956,7 @@ debug_output_compilation_hack (x)
print_output_debug_flag = x;
}
-#if defined(GNU_LINUX)
+#if defined (GNU_LINUX)
/* This functionality is not vitally important in general, so we rely on
non-portable ability to use stderr as lvalue. */
@@ -976,7 +976,7 @@ append to existing target file. */)
Lisp_Object file, append;
{
if (initial_stderr_stream != NULL)
- fclose(stderr);
+ fclose (stderr);
stderr = initial_stderr_stream;
initial_stderr_stream = NULL;
@@ -984,7 +984,7 @@ append to existing target file. */)
{
file = Fexpand_file_name (file, Qnil);
initial_stderr_stream = stderr;
- stderr = fopen(SDATA (file), NILP (append) ? "w" : "a");
+ stderr = fopen (SDATA (file), NILP (append) ? "w" : "a");
if (stderr == NULL)
{
stderr = initial_stderr_stream;
@@ -2150,7 +2150,7 @@ print_object (obj, printcharfun, escapeflag)
/* Do you think this is necessary? */
if (XMARKER (obj)->insertion_type != 0)
strout ("(moves after insertion) ", -1, -1, printcharfun, 0);
- if (!(XMARKER (obj)->buffer))
+ if (! XMARKER (obj)->buffer)
strout ("in no buffer", -1, -1, printcharfun, 0);
else
{
@@ -2164,7 +2164,7 @@ print_object (obj, printcharfun, escapeflag)
case Lisp_Misc_Overlay:
strout ("#<overlay ", -1, -1, printcharfun, 0);
- if (!(XMARKER (OVERLAY_START (obj))->buffer))
+ if (! XMARKER (OVERLAY_START (obj))->buffer)
strout ("in no buffer", -1, -1, printcharfun, 0);
else
{
@@ -2211,8 +2211,8 @@ print_object (obj, printcharfun, escapeflag)
case Lisp_Misc_Kboard_Objfwd:
strout ("#<kboard_objfwd to ", -1, -1, printcharfun, 0);
- print_object (*(Lisp_Object *)((char *) current_kboard
- + XKBOARD_OBJFWD (obj)->offset),
+ print_object (*(Lisp_Object *) ((char *) current_kboard
+ + XKBOARD_OBJFWD (obj)->offset),
printcharfun, escapeflag);
PRINTCHAR ('>');
break;
@@ -2300,7 +2300,7 @@ print_interval (interval, printcharfun)
print_object (make_number (interval->position), printcharfun, 1);
PRINTCHAR (' ');
print_object (make_number (interval->position + LENGTH (interval)),
- printcharfun, 1);
+ printcharfun, 1);
PRINTCHAR (' ');
print_object (interval->plist, printcharfun, 1);
}
diff --git a/src/regex.c b/src/regex.c
index 48baacd81e2..09776848220 100644
--- a/src/regex.c
+++ b/src/regex.c
@@ -6332,6 +6332,10 @@ re_compile_pattern (pattern, length, bufp)
{
reg_errcode_t ret;
+#ifdef emacs
+ gl_state.current_syntax_table = current_buffer->syntax_table;
+#endif
+
/* GNU code is written to assume at least RE_NREGS registers will be set
(and at least one extra will be -1). */
bufp->regs_allocated = REGS_UNALLOCATED;
diff --git a/src/search.c b/src/search.c
index ce9fa958910..72ce7e79559 100644
--- a/src/search.c
+++ b/src/search.c
@@ -42,6 +42,9 @@ struct regexp_cache
{
struct regexp_cache *next;
Lisp_Object regexp, whitespace_regexp;
+ /* Syntax table for which the regexp applies. We need this because
+ of character classes. */
+ Lisp_Object syntax_table;
struct re_pattern_buffer buf;
char fastmap[0400];
/* Nonzero means regexp was compiled to do full POSIX backtracking. */
@@ -134,6 +137,7 @@ compile_pattern_1 (cp, pattern, translate, regp, posix, multibyte)
cp->buf.multibyte = STRING_MULTIBYTE (pattern);
cp->buf.target_multibyte = multibyte;
cp->whitespace_regexp = Vsearch_spaces_regexp;
+ cp->syntax_table = current_buffer->syntax_table;
/* Doing BLOCK_INPUT here has the effect that
the debugger won't run if an error occurs.
Why is BLOCK_INPUT needed here? */
@@ -173,6 +177,19 @@ shrink_regexp_cache ()
}
}
+/* Clear the regexp cache.
+ There is no danger of memory leak here because re_compile_pattern
+ automagically manages the memory in each re_pattern_buffer struct,
+ based on its `allocated' and `buffer' values. */
+void
+clear_regexp_cache ()
+{
+ int i;
+
+ for (i = 0; i < REGEXP_CACHE_SIZE; ++i)
+ searchbufs[i].regexp = Qnil;
+}
+
/* Compile a regexp if necessary, but first check to see if there's one in
the cache.
PATTERN is the pattern to compile.
@@ -209,6 +226,10 @@ compile_pattern (pattern, regp, translate, posix, multibyte)
&& EQ (cp->buf.translate, (! NILP (translate) ? translate : make_number (0)))
&& cp->posix == posix
&& cp->buf.target_multibyte == multibyte
+ /* TODO: Strictly speaking, we only need to match syntax
+ tables when a character class like [[:space:]] occurs in
+ the pattern. -- cyd*/
+ && EQ (cp->syntax_table, current_buffer->syntax_table)
&& !NILP (Fequal (cp->whitespace_regexp, Vsearch_spaces_regexp)))
break;
@@ -3077,8 +3098,10 @@ syms_of_search ()
searchbufs[i].buf.fastmap = searchbufs[i].fastmap;
searchbufs[i].regexp = Qnil;
searchbufs[i].whitespace_regexp = Qnil;
+ searchbufs[i].syntax_table = Qnil;
staticpro (&searchbufs[i].regexp);
staticpro (&searchbufs[i].whitespace_regexp);
+ staticpro (&searchbufs[i].syntax_table);
searchbufs[i].next = (i == REGEXP_CACHE_SIZE-1 ? 0 : &searchbufs[i+1]);
}
searchbuf_head = &searchbufs[0];
diff --git a/src/strftime.c b/src/strftime.c
index f46b40f232a..123763d8845 100644
--- a/src/strftime.c
+++ b/src/strftime.c
@@ -7,17 +7,17 @@
This file is part of the GNU Emacs.
This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License
+ modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
+ General Public License for more details.
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; see the file COPYING. If not,
write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
diff --git a/src/syntax.c b/src/syntax.c
index b0b4bdc0032..a58fc70a113 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -1029,6 +1029,11 @@ usage: (modify-syntax-entry CHAR NEWENTRY &optional SYNTAX-TABLE) */)
SET_RAW_SYNTAX_ENTRY_RANGE (syntax_table, c, newentry);
else
SET_RAW_SYNTAX_ENTRY (syntax_table, XINT (c), newentry);
+
+ /* We clear the regexp cache, since character classes can now have
+ different values from those in the compiled regexps.*/
+ clear_regexp_cache ();
+
return Qnil;
}
diff --git a/src/window.c b/src/window.c
index 4208323eab3..2a3d29a8da8 100644
--- a/src/window.c
+++ b/src/window.c
@@ -340,8 +340,8 @@ return value is a list of 2 or 6 elements (X Y [RTOP RBOT ROWH VPOS]),
where X and Y are the pixel coordinates relative to the top left corner
of the window. The remaining elements are omitted if the character after
POS is fully visible; otherwise, RTOP and RBOT are the number of pixels
-invisible at the top and bottom of the row, ROWH is the height of the display
-row, and VPOS is the row number (0-based) containing POS. */)
+off-screen at the top and bottom of the row, ROWH is the height of the
+display row, and VPOS is the row number (0-based) containing POS. */)
(pos, window, partially)
Lisp_Object pos, window, partially;
{
@@ -390,6 +390,117 @@ row, and VPOS is the row number (0-based) containing POS. */)
return in_window;
}
+DEFUN ("window-line-height", Fwindow_line_height,
+ Swindow_line_height, 0, 2, 0,
+ doc: /* Return height in pixels of text line LINE in window WINDOW.
+If WINDOW is nil or omitted, use selected window.
+
+Return height of current line if LINE is omitted or nil. Return height of
+header or mode line if LINE is `header-line' and `mode-line'.
+Otherwise, LINE is a text line number starting from 0. A negative number
+counts from the end of the window.
+
+Value is a list (HEIGHT VPOS YPOS OFFBOT), where HEIGHT is the height
+in pixels of the visible part of the line, VPOS and YPOS are the
+vertical position in lines and pixels of the row, relative to the top
+of the first text line, and OFFBOT is the number of off-screen pixels at
+the bottom of the text row. If there are off-screen pixels at the top
+of the (first) text row, YPOS is negative.
+
+Return nil if window display is not up-to-date. In that case, use
+`pos-visible-in-window-p' to obtain the information. */)
+ (line, window)
+ Lisp_Object line, window;
+{
+ register struct window *w;
+ register struct buffer *b;
+ struct glyph_row *row, *end_row;
+ int max_y, crop, i, n;
+
+ w = decode_window (window);
+
+ if (noninteractive
+ || w->pseudo_window_p)
+ return Qnil;
+
+ CHECK_BUFFER (w->buffer);
+ b = XBUFFER (w->buffer);
+
+ /* Fail if current matrix is not up-to-date. */
+ if (NILP (w->window_end_valid)
+ || current_buffer->clip_changed
+ || current_buffer->prevent_redisplay_optimizations_p
+ || XFASTINT (w->last_modified) < BUF_MODIFF (b)
+ || XFASTINT (w->last_overlay_modified) < BUF_OVERLAY_MODIFF (b))
+ return Qnil;
+
+ if (NILP (line))
+ {
+ i = w->cursor.vpos;
+ if (i < 0 || i >= w->current_matrix->nrows
+ || (row = MATRIX_ROW (w->current_matrix, i), !row->enabled_p))
+ return Qnil;
+ max_y = window_text_bottom_y (w);
+ goto found_row;
+ }
+
+ if (EQ (line, Qheader_line))
+ {
+ if (!WINDOW_WANTS_HEADER_LINE_P (w))
+ return Qnil;
+ row = MATRIX_HEADER_LINE_ROW (w->current_matrix);
+ if (!row->enabled_p)
+ return Qnil;
+ return list4 (make_number (row->height),
+ make_number (0), make_number (0),
+ make_number (0));
+ }
+
+ if (EQ (line, Qmode_line))
+ {
+ row = MATRIX_MODE_LINE_ROW (w->current_matrix);
+ if (!row->enabled_p)
+ return Qnil;
+ return list4 (make_number (row->height),
+ make_number (0), /* not accurate */
+ make_number (WINDOW_HEADER_LINE_HEIGHT (w)
+ + window_text_bottom_y (w)),
+ make_number (0));
+ }
+
+ CHECK_NUMBER (line);
+ n = XINT (line);
+
+ row = MATRIX_FIRST_TEXT_ROW (w->current_matrix);
+ end_row = MATRIX_BOTTOM_TEXT_ROW (w->current_matrix, w);
+ max_y = window_text_bottom_y (w);
+ i = 0;
+
+ while ((n < 0 || i < n)
+ && row <= end_row && row->enabled_p
+ && row->y + row->height < max_y)
+ row++, i++;
+
+ if (row > end_row || !row->enabled_p)
+ return Qnil;
+
+ if (++n < 0)
+ {
+ if (-n > i)
+ return Qnil;
+ row += n;
+ i += n;
+ }
+
+ found_row:
+ crop = max (0, (row->y + row->height) - max_y);
+ return list4 (make_number (row->height + min (0, row->y) - crop),
+ make_number (i),
+ make_number (row->y),
+ make_number (crop));
+}
+
+
static struct window *
decode_window (window)
@@ -454,7 +565,7 @@ DEFUN ("set-window-hscroll", Fset_window_hscroll, Sset_window_hscroll, 2, 2, 0,
Return NCOL. NCOL should be zero or positive.
Note that if `automatic-hscrolling' is non-nil, you cannot scroll the
-window so that the location of point becomes invisible. */)
+window so that the location of point moves off-screen. */)
(window, ncol)
Lisp_Object window, ncol;
{
@@ -1051,9 +1162,11 @@ if it isn't already recorded. */)
Lisp_Object value;
struct window *w = decode_window (window);
Lisp_Object buf;
+ struct buffer *b;
buf = w->buffer;
CHECK_BUFFER (buf);
+ b = XBUFFER (buf);
#if 0 /* This change broke some things. We should make it later. */
/* If we don't know the end position, return nil.
@@ -1066,12 +1179,20 @@ if it isn't already recorded. */)
if (! NILP (update)
&& ! (! NILP (w->window_end_valid)
- && XFASTINT (w->last_modified) >= MODIFF)
+ && XFASTINT (w->last_modified) >= BUF_MODIFF (b))
&& !noninteractive)
{
struct text_pos startp;
struct it it;
- struct buffer *old_buffer = NULL, *b = XBUFFER (buf);
+ struct buffer *old_buffer = NULL;
+
+ /* Cannot use Fvertical_motion because that function doesn't
+ cope with variable-height lines. */
+ if (b != current_buffer)
+ {
+ old_buffer = current_buffer;
+ set_buffer_internal (b);
+ }
/* In case W->start is out of the range, use something
reasonable. This situation occurred when loading a file with
@@ -1085,14 +1206,6 @@ if it isn't already recorded. */)
else
SET_TEXT_POS_FROM_MARKER (startp, w->start);
- /* Cannot use Fvertical_motion because that function doesn't
- cope with variable-height lines. */
- if (b != current_buffer)
- {
- old_buffer = current_buffer;
- set_buffer_internal (b);
- }
-
start_display (&it, w, startp);
move_it_vertically (&it, window_box_height (w));
if (it.current_y < it.last_visible_y)
@@ -1103,7 +1216,7 @@ if it isn't already recorded. */)
set_buffer_internal (old_buffer);
}
else
- XSETINT (value, BUF_Z (XBUFFER (buf)) - XFASTINT (w->window_end_pos));
+ XSETINT (value, BUF_Z (b) - XFASTINT (w->window_end_pos));
return value;
}
@@ -7365,6 +7478,7 @@ The selected frame is the one whose configuration has changed. */);
defsubr (&Swindowp);
defsubr (&Swindow_live_p);
defsubr (&Spos_visible_in_window_p);
+ defsubr (&Swindow_line_height);
defsubr (&Swindow_buffer);
defsubr (&Swindow_height);
defsubr (&Swindow_width);
diff --git a/src/xdisp.c b/src/xdisp.c
index cf241a4159a..9ab61c09c2a 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -20047,7 +20047,7 @@ produce_image_glyph (it)
{
struct image *img;
struct face *face;
- int glyph_ascent;
+ int glyph_ascent, crop;
struct glyph_slice slice;
xassert (it->what == IT_IMAGE);
@@ -20155,6 +20155,15 @@ produce_image_glyph (it)
take_vertical_position_into_account (it);
+ /* Automatically crop wide image glyphs at right edge so we can
+ draw the cursor on same display row. */
+ if ((crop = it->pixel_width - (it->last_visible_x - it->current_x), crop > 0)
+ && (it->hpos == 0 || it->pixel_width > it->last_visible_x / 4))
+ {
+ it->pixel_width -= crop;
+ slice.width -= crop;
+ }
+
if (it->glyph_row)
{
struct glyph *glyph;
diff --git a/src/xfns.c b/src/xfns.c
index 8e35c30c5e6..c60035e41c2 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -157,12 +157,16 @@ int display_hourglass_p;
/* Non-zero means prompt with the old GTK file selection dialog. */
-int x_use_old_gtk_file_dialog;
+int x_gtk_use_old_file_dialog;
/* If non-zero, by default show hidden files in the GTK file chooser. */
int x_gtk_show_hidden_files;
+/* If non-zero, don't show additional help text in the GTK file chooser. */
+
+int x_gtk_file_dialog_help_text;
+
/* If non-zero, don't collapse to tool bar when it is detached. */
int x_gtk_whole_detached_tool_bar;
@@ -5886,12 +5890,12 @@ Chinese, Japanese, and Korean. */);
Vx_pixel_size_width_font_regexp = Qnil;
/* This is not ifdef:ed, so other builds than GTK can customize it. */
- DEFVAR_BOOL ("x-use-old-gtk-file-dialog", &x_use_old_gtk_file_dialog,
+ DEFVAR_BOOL ("x-gtk-use-old-file-dialog", &x_gtk_use_old_file_dialog,
doc: /* *Non-nil means prompt with the old GTK file selection dialog.
If nil or if the file selection dialog is not available, the new GTK file
chooser is used instead. To turn off all file dialogs set the
variable `use-file-dialog'. */);
- x_use_old_gtk_file_dialog = 0;
+ x_gtk_use_old_file_dialog = 0;
DEFVAR_BOOL ("x-gtk-show-hidden-files", &x_gtk_show_hidden_files,
doc: /* *If non-nil, the GTK file chooser will by default show hidden files.
@@ -5899,6 +5903,12 @@ Note that this is just the default, there is a toggle button on the file
chooser to show or not show hidden files on a case by case basis. */);
x_gtk_show_hidden_files = 0;
+ DEFVAR_BOOL ("x-gtk-file-dialog-help-text", &x_gtk_file_dialog_help_text,
+ doc: /* *If non-nil, the GTK file chooser will by show additional help text.
+If more space for files in the file chooser dialog is wanted, set this to nil
+to turn the additional text off. */);
+ x_gtk_file_dialog_help_text = 1;
+
DEFVAR_BOOL ("x-gtk-whole-detached-tool-bar", &x_gtk_whole_detached_tool_bar,
doc: /* *If non-nil, a detached tool bar is shown in full.
The default is to just show an arrow and pressing on that arrow shows