From 856cd948d1a5a016ad36721246a049d33451902f Mon Sep 17 00:00:00 2001 From: Oscar Fuentes Date: Sun, 14 Feb 2016 16:14:33 +0100 Subject: [PATCH 01/15] Grep alias `all' shall not match parent directory * lisp/progmodes/grep.el (grep-files-aliases): Don't match parent directory for `all'. Fixes bug#22577 --- lisp/progmodes/grep.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/progmodes/grep.el b/lisp/progmodes/grep.el index 7e6f157f5fe..f04a7226d18 100644 --- a/lisp/progmodes/grep.el +++ b/lisp/progmodes/grep.el @@ -189,7 +189,7 @@ Customize or call the function `grep-apply-setting'." :group 'grep) (defcustom grep-files-aliases - '(("all" . "* .*") + '(("all" . "* .[!.]* ..?*") ;; Don't match `..'. See bug#22577 ("el" . "*.el") ("ch" . "*.[ch]") ("c" . "*.c") From 8badf953da5e629bc67db113719b72412270dabd Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 14 Feb 2016 19:46:29 +0200 Subject: [PATCH 02/15] Make 'mmap_realloc' on MS-Windows more reliable * src/w32heap.c (mmap_alloc): If reserving memory succeeds, but committing fails, return NULL. Don't call GetLastError twice for the same API error. (mmap_realloc): Zero out MEMORY_BASIC_INFORMATION structures before calling VirtualQuery, to avoid using garbled values if the call fails. If committing more pages from the same block fails, fall back on mmap_alloc + CopyMemory. Enhance debugging printouts if the call to VirtualAlloc to commit more pages fails. (Bug#22526) --- src/w32heap.c | 51 +++++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/w32heap.c b/src/w32heap.c index 00da86a9598..69706a3a57d 100644 --- a/src/w32heap.c +++ b/src/w32heap.c @@ -652,15 +652,19 @@ mmap_alloc (void **var, size_t nbytes) { /* Now, commit pages for NBYTES. */ *var = VirtualAlloc (p, nbytes, MEM_COMMIT, PAGE_READWRITE); + if (*var == NULL) + p = *var; } if (!p) { - if (GetLastError () == ERROR_NOT_ENOUGH_MEMORY) + DWORD e = GetLastError (); + + if (e == ERROR_NOT_ENOUGH_MEMORY) errno = ENOMEM; else { - DebPrint (("mmap_alloc: error %ld\n", GetLastError ())); + DebPrint (("mmap_alloc: error %ld\n", e)); errno = EINVAL; } } @@ -683,6 +687,7 @@ void * mmap_realloc (void **var, size_t nbytes) { MEMORY_BASIC_INFORMATION memInfo, m2; + void *old_ptr; if (*var == NULL) return mmap_alloc (var, nbytes); @@ -694,12 +699,14 @@ mmap_realloc (void **var, size_t nbytes) return mmap_alloc (var, nbytes); } + memset (&memInfo, 0, sizeof (memInfo)); if (VirtualQuery (*var, &memInfo, sizeof (memInfo)) == 0) DebPrint (("mmap_realloc: VirtualQuery error = %ld\n", GetLastError ())); /* We need to enlarge the block. */ if (memInfo.RegionSize < nbytes) { + memset (&m2, 0, sizeof (m2)); if (VirtualQuery (*var + memInfo.RegionSize, &m2, sizeof(m2)) == 0) DebPrint (("mmap_realloc: VirtualQuery error = %ld\n", GetLastError ())); @@ -715,31 +722,31 @@ mmap_realloc (void **var, size_t nbytes) MEM_COMMIT, PAGE_READWRITE); if (!p /* && GetLastError() != ERROR_NOT_ENOUGH_MEMORY */) { - DebPrint (("realloc enlarge: VirtualAlloc error %ld\n", + DebPrint (("realloc enlarge: VirtualAlloc (%p + %I64x, %I64x) error %ld\n", + *var, (uint64_t)memInfo.RegionSize, + (uint64_t)(nbytes - memInfo.RegionSize), GetLastError ())); - errno = ENOMEM; + DebPrint (("next region: %p %p %I64x %x\n", m2.BaseAddress, + m2.AllocationBase, m2.RegionSize, m2.AllocationProtect)); } + else + return *var; + } + /* Else we must actually enlarge the block by allocating a new + one and copying previous contents from the old to the new one. */ + old_ptr = *var; + + if (mmap_alloc (var, nbytes)) + { + CopyMemory (*var, old_ptr, memInfo.RegionSize); + mmap_free (&old_ptr); return *var; } else { - /* Else we must actually enlarge the block by allocating a - new one and copying previous contents from the old to the - new one. */ - void *old_ptr = *var; - - if (mmap_alloc (var, nbytes)) - { - CopyMemory (*var, old_ptr, memInfo.RegionSize); - mmap_free (&old_ptr); - return *var; - } - else - { - /* We failed to enlarge the buffer. */ - *var = old_ptr; - return NULL; - } + /* We failed to reallocate the buffer. */ + *var = old_ptr; + return NULL; } } @@ -751,7 +758,7 @@ mmap_realloc (void **var, size_t nbytes) { /* Let's give some memory back to the system and release some pages. */ - void *old_ptr = *var; + old_ptr = *var; if (mmap_alloc (var, nbytes)) { From f7af26c5edcc3a5145a67e0b0e956286f913a7a3 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 14 Feb 2016 20:14:32 +0200 Subject: [PATCH 03/15] Fix a typo in edt.texi * doc/misc/edt.texi: Fix a typo in an email address. Reported by "Herbert J. Skuhra" . --- doc/misc/edt.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/misc/edt.texi b/doc/misc/edt.texi index 2361313f262..cb22b82e262 100644 --- a/doc/misc/edt.texi +++ b/doc/misc/edt.texi @@ -30,7 +30,7 @@ modify this GNU manual.'' @titlepage @title EDT Emulation User's Manual @author Kevin Gallagher -@author @email{kevin.gal@verizon.net} +@author @email{kevin.gal@@verizon.net} @page @vskip 0pt plus 1filll @insertcopying From c1313b5f270bb20901423815c23f72e926f7bf38 Mon Sep 17 00:00:00 2001 From: Thomas Plass Date: Sun, 14 Feb 2016 19:56:46 +0100 Subject: [PATCH 04/15] Replace colon in file name (not legal on Windows) * lisp/doc-view.el (doc-view--current-cache-dir): Replace colon in file name (not legal on Windows). [tiny change] --- lisp/doc-view.el | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lisp/doc-view.el b/lisp/doc-view.el index 06cf8dcef3a..bc5c1d254b9 100644 --- a/lisp/doc-view.el +++ b/lisp/doc-view.el @@ -140,6 +140,7 @@ (require 'dired) (require 'image-mode) (require 'jka-compr) +(require 'subr-x) ;;;; Customization Options @@ -695,14 +696,18 @@ It's a subdirectory of `doc-view-cache-directory'." (setq doc-view--current-cache-dir (file-name-as-directory (expand-file-name - (concat (subst-char-in-string ?% ?_ ;; bug#13679 - (file-name-nondirectory doc-view--buffer-file-name)) - "-" - (let ((file doc-view--buffer-file-name)) - (with-temp-buffer - (set-buffer-multibyte nil) - (insert-file-contents-literally file) - (md5 (current-buffer))))) + (concat (thread-last (file-name-nondirectory doc-view--buffer-file-name) + ;; bug#13679 + (subst-char-in-string ?% ?_) + ;; arc-mode concats archive name and file name + ;; with colon which is illegal on Windows. + (subst-char-in-string ?: ?_)) + "-" + (let ((file doc-view--buffer-file-name)) + (with-temp-buffer + (set-buffer-multibyte nil) + (insert-file-contents-literally file) + (md5 (current-buffer))))) doc-view-cache-directory))))) ;;;###autoload From 84829495b5746417f5eaf9be693fb35f0509697a Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 14 Feb 2016 21:20:48 +0200 Subject: [PATCH 05/15] Fix point movement under 'scroll-conservatively' * src/xdisp.c (redisplay_window): Correct a typo in computing the effective number of text lines in a window. (Bug#22637) --- src/xdisp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xdisp.c b/src/xdisp.c index 840699d00fb..fed58799eaa 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -16920,7 +16920,7 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) if (scroll_conservatively > SCROLL_LIMIT) { int window_total_lines - = WINDOW_TOTAL_LINES (w) * FRAME_LINE_HEIGHT (f) * frame_line_height; + = WINDOW_TOTAL_LINES (w) * FRAME_LINE_HEIGHT (f) / frame_line_height; int margin = scroll_margin > 0 ? min (scroll_margin, window_total_lines / 4) From 1834ac7d24c60ecabb4fc2469d350a03db1798ab Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 14 Feb 2016 11:19:39 -0800 Subject: [PATCH 06/15] Port to x86 GCC 4.3.1 and earlier This tries to port to x86 FreeBSD 9, where Emacs dumps core (Bug#22065). * src/lisp.h (USE_STACK_LISP_OBJECTS): Default to false for GCC 4.3.1 and earlier. --- src/lisp.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lisp.h b/src/lisp.h index af73c4b15ce..8eb18e11870 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -4522,6 +4522,11 @@ extern void *record_xmalloc (size_t) ATTRIBUTE_ALLOC_SIZE ((1)); This feature is experimental and requires careful debugging. Build with CPPFLAGS='-DUSE_STACK_LISP_OBJECTS=0' to disable it. */ +#if (!defined USE_STACK_LISP_OBJECTS && defined __GNUC__ \ + && !(4 < __GNUC__ + (3 < __GNUC_MINOR__ + (2 <= __GNUC_PATCHLEVEL__)))) + /* Work around GCC bugs 36584 and 35271, which were fixed in GCC 4.3.2. */ +# define USE_STACK_LISP_OBJECTS false +#endif #ifndef USE_STACK_LISP_OBJECTS # define USE_STACK_LISP_OBJECTS true #endif From f3aaca3552ba961d13cd1ee935c1c6b075f2398a Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 14 Feb 2016 11:42:36 -0800 Subject: [PATCH 07/15] Port USE_STACK_LISP_OBJECTS fix to Clang * src/lisp.h (USE_STACK_LISP_OBJECTS): Default to false for Clang. Recent versions of Clang claim to be GCC 4.2.1 but do not have the GCC bug. --- src/lisp.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lisp.h b/src/lisp.h index 8eb18e11870..8eab38bc6f9 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -4522,7 +4522,8 @@ extern void *record_xmalloc (size_t) ATTRIBUTE_ALLOC_SIZE ((1)); This feature is experimental and requires careful debugging. Build with CPPFLAGS='-DUSE_STACK_LISP_OBJECTS=0' to disable it. */ -#if (!defined USE_STACK_LISP_OBJECTS && defined __GNUC__ \ +#if (!defined USE_STACK_LISP_OBJECTS \ + && defined __GNUC__ && !defined __clang__ \ && !(4 < __GNUC__ + (3 < __GNUC_MINOR__ + (2 <= __GNUC_PATCHLEVEL__)))) /* Work around GCC bugs 36584 and 35271, which were fixed in GCC 4.3.2. */ # define USE_STACK_LISP_OBJECTS false From f8bf1b35bf55ae1bb7703f86d3b526887f064b19 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 14 Feb 2016 19:24:38 -0800 Subject: [PATCH 08/15] CONTRIBUTE cleanups and updates * CONTRIBUTE: Mention URLs and info nodes more consistently, avoiding possibly-confusing punctuation adjacent to a URL, and giving full shell commands for 'info'. Start with a brief but complete how-to, for people who want to get started right away. Then briefly discuss how to join the development process in the typical order. Omit needless words. Update some of the now-obsolete file names, info node names, and quoting styles. Better document emacs-NN branches and how they are merged. * admin/notes/git-workflow: Change emacs-24 to emacs-25, and trunk to master. This file still needs work. --- CONTRIBUTE | 213 ++++++++++++++++++++------------------- admin/notes/git-workflow | 36 ++++--- 2 files changed, 126 insertions(+), 123 deletions(-) diff --git a/CONTRIBUTE b/CONTRIBUTE index 74d340af13b..5102b4fe4f1 100644 --- a/CONTRIBUTE +++ b/CONTRIBUTE @@ -1,48 +1,51 @@ -This file contains information on Emacs developer processes. +* How developers contribute to GNU Emacs -For information on contributing to Emacs as a non-developer, see -(info "(emacs)Contributing") or +Here is how software developers can contribute to Emacs. (Non-developers: see http://www.gnu.org/software/emacs/manual/html_node/emacs/Contributing.html +or run the shell command 'info "(emacs)Contributing"'.) -* Information for Emacs Developers. +** The Emacs repository -An "Emacs Developer" is someone who contributes a lot of code or -documentation to the Emacs repository. Generally, they have write -access to the Emacs git repository on Savannah -https://savannah.gnu.org/git/?group=emacs. +Emacs development uses Git on Savannah for its main repository. +Briefly, the following shell commands build and run Emacs from scratch: -** Write access to the Emacs repository. + git config --global user.name 'Your Name' + git config --global user.email 'your.name@example.com' + git config --global transfer.fsckObjects true + git clone git://git.sv.gnu.org/emacs.git + cd emacs + ./autogen.sh + ./configure + make + src/emacs -Once you become a frequent contributor to Emacs, we can consider -giving you write access to the version-control repository. Request -access on the emacs-devel@gnu.org mailing list. Also, be sure to -subscribe to the emacs-devel@gnu.org mailing list and include the -"emacs-announce" topic, so that you get the announcements about -feature freeze and other important events. +For more details, see +http://www.emacswiki.org/emacs/GitQuickStartForEmacsDevs and +http://www.emacswiki.org/emacs/GitForEmacsDevs or see the file +admin/notes/git-workflow. -** Using the Emacs repository +** Getting involved with development -Emacs uses Git for the source code repository. +You can subscribe to the emacs-devel@gnu.org mailing list, paying +attention to postings with subject lines containing "emacs-announce", +as these discuss important events like feature freezes. See +http://lists.gnu.org/mailman/listinfo/emacs-devel for mailing list +instructions and archives. You can develop and commit changes in your +own copy of the repository, and discuss proposed changes on the +mailing list. Frequent contributors to Emacs can request write access +there. -See http://www.emacswiki.org/emacs/GitQuickStartForEmacsDevs to get -started, and http://www.emacswiki.org/emacs/GitForEmacsDevs for more -advanced information. +** Committing changes by others -Alternately, see admin/notes/git-workflow. - -If committing changes written by someone else, make the commit in -their name, not yours. Git distinguishes between the author -and the committer; use the --author option on the commit command to -specify the actual author; the committer defaults to you. +If committing changes written by someone else, commit in their name, +not yours. You can use 'git commit --author="AUTHOR"' to specify a +change's author. ** Commit messages -Emacs development no longer stores descriptions of new changes in -ChangeLog files. Instead, a single ChangeLog file is generated from -the commit messages when a release is prepared. So changes you commit -should not touch any of the ChangeLog files in the repository, but -instead should contain the log entries in the commit message. Here is -an example of a commit message (indented): +Ordinarily, a change you commit should contain a log entry in its +commit message and should not touch the repository's ChangeLog files. +Here is an example commit message (indented): Deactivate shifted region @@ -53,12 +56,13 @@ an example of a commit message (indented): * src/frame.c (Fhandle_switch_frame, Fselected_frame): Deactivate the mark. -Below are some rules and recommendations for formatting commit -messages: +Occasionally, commit messages are collected and prepended to a +ChangeLog file, where they can be corrected. It saves time to get +them right the first time, so here are guidelines for formatting them: - Start with a single unindented summary line explaining the change; do not end this line with a period. If that line starts with a - semi-colon and a space "; ", the log message will be ignored when + semicolon and a space "; ", the commit message will be ignored when generating the ChangeLog file. Use this for minor commits that do not need separate ChangeLog entries, such as changes in etc/NEWS. @@ -104,19 +108,19 @@ messages: the rationale for a change; that can be done in the commit message between the summary line and the file entries. -- Emacs generally follows the GNU coding standards when it comes to - ChangeLogs: - http://www.gnu.org/prep/standards/html_node/Change-Logs.html or - "(info (standards)Change Logs"). One exception is that we still - sometimes quote `like-this' (as the standards used to recommend) - rather than 'like-this' (as they do now), because `...' is so widely - used elsewhere in Emacs. +- Emacs generally follows the GNU coding standards for ChangeLogs: see + http://www.gnu.org/prep/standards/html_node/Change-Logs.html + or run 'info "(standards)Change Logs"'. One exception is that + commits still sometimes quote `like-this' (as the standards used to + recommend) rather than 'like-this' or ‘like this’ (as they do now), + as `...' is so widely used elsewhere in Emacs. -- Some of the rules in the GNU coding standards section 5.2 - "Commenting Your Work" also apply to ChangeLog entries: they must be - in English, and be complete sentences starting with a capital and - ending with a period (except the summary line should not end in a - period). +- Some commenting rules in the GNU coding standards also apply + to ChangeLog entries: they must be in English, and be complete + sentences starting with a capital and ending with a period (except + the summary line should not end in a period). See + http://www.gnu.org/prep/standards/html_node/Comments.html + or run 'info "(standards)Comments"'. They are preserved indefinitely, and have a reasonable chance of being read in the future, so it's better that they have good @@ -145,15 +149,15 @@ messages: will suffice. - There is no need to mention files such as NEWS and MAINTAINERS, or - to indicate regeneration of files such as 'configure', in the + to indicate regeneration of files such as 'lib/gnulib.mk', in the ChangeLog entry. "There is no need" means you don't have to, but you can if you want to. ** Generating ChangeLog entries -- You can use various Emacs functions to ease the process of writing - ChangeLog entries; see (info "(emacs)Change Log Commands") or - http://www.gnu.org/software/emacs/manual/html_node/emacs/Change-Log-Commands.html. +- You can use Emacs functions to write ChangeLog entries; see + http://www.gnu.org/software/emacs/manual/html_node/emacs/Change-Log-Commands.html + or run 'info "(emacs)Change Log Commands"'. - If you use Emacs VC, one way to format ChangeLog entries is to create a top-level ChangeLog file manually, and update it with 'C-x 4 a' as @@ -171,32 +175,33 @@ messages: ** Branches -Development normally takes places on the trunk. -Sometimes specialized features are developed on separate branches -before possibly being merged to the trunk. - -Development is discussed on the emacs-devel mailing list. - -The trunk branch is named "master" in git; release branches are named -"emacs-nn" where "nn" is the major version. +Future development normally takes place on the master branch. +Sometimes specialized features are developed on other branches before +possibly being merged to the master. Release branches are named +"emacs-NN" where NN is the major version number, and are mainly +intended for more-conservative changes such as bug fixes. Typically, +collective development is active on the master branch and possibly on +the current release branch. Periodically, the current release branch +is merged into the master, using the gitmerge function described in +admin/notes-git-workflow. If you are fixing a bug that exists in the current release, be sure to commit it to the release branch; it will be merged to the master -branch later. +branch later by the gitmerge function. -However, if you know that the change will be difficult to merge to -master (eg because the code on master has changed a lot), you can +However, if you know that the change will be difficult to merge to the +master (e.g., because the code on master has changed a lot), you can apply the change to both master and branch yourself. It could also happen that a change is cherry-picked from master to the release branch, and so doesn't need to be merged back. In these cases, -indicate in the release branch commit log that there is no need to -merge the commit to master; start the commit message with "Backport:". -gitmerge.el will then exclude that commit from the merge to trunk. +say in the release branch commit message that there is no need to merge +the commit to master, by starting the commit message with "Backport:". +The gitmerge function excludes these commits from the merge to the master. Some changes should not be merged to master at all, for whatever reasons. These should be marked by including something like "Do not merge to master" or anything that matches gitmerge-skip-regexp (see -gitmerge.el) in the log message. +admin/gitmerge.el) in the commit message. ** Other process information @@ -206,10 +211,11 @@ Discussion about Emacs development takes place on emacs-devel@gnu.org. Bug reports and fixes, feature requests and implementations should be sent to bug-gnu-emacs@gnu.org, the bug/feature list. This is coupled -to the tracker at http://debbugs.gnu.org . +to the http://debbugs.gnu.org tracker. -You can subscribe to the mailing lists, or see the list archives, -by following links from http://savannah.gnu.org/mail/?group=emacs . +The Savannah info page http://savannah.gnu.org/mail/?group=emacs +describes how to subscribe to the mailing lists, or see the list +archives. To email a patch you can use a shell command like 'git format-patch -1' to create a file, and then attach the file to your email. This nicely @@ -219,16 +225,15 @@ such patch without additional remarks, you can use a command like ** Issue tracker (a.k.a. "bug tracker") -The Emacs issue tracker is at http://debbugs.gnu.org/. The form -presented by that page allows to view bug reports and search the -database for bugs matching several criteria. Messages posted to the -bug-gnu-emacs@gnu.org mailing list, mentioned above, are recorded by -the tracker with the corresponding bugs/issues. +The Emacs issue tracker at http://debbugs.gnu.org lets you view bug +reports and search the database for bugs matching several criteria. +Messages posted to the bug-gnu-emacs@gnu.org mailing list, mentioned +above, are recorded by the tracker with the corresponding bugs/issues. GNU ELPA has a 'debbugs' package that allows accessing the tracker database from Emacs. -** Document your changes. +** Documenting your changes Any change that matters to end-users should have an entry in etc/NEWS. @@ -239,21 +244,21 @@ know it does not, mark the NEWS entry with "---". If you know that *all* the necessary documentation updates have been made, mark the entry with "+++". Otherwise do not mark it. -Please see (info "(elisp)Documentation Tips") or -https://www.gnu.org/software/emacs/manual/html_node/elisp/Documentation-Tips.html -for more specific tips on Emacs's doc style. Use 'checkdoc' to check -for documentation errors before submitting a patch. +For more specific tips on Emacs's doc style, see +http://www.gnu.org/software/emacs/manual/html_node/elisp/Documentation-Tips.html +Use 'checkdoc' to check for documentation errors before submitting a patch. -** Test your changes. +** Testing your changes Please test your changes before committing them or sending them to the list. If possible, add a new test along with any bug fix or new functionality you commit (of course, some changes cannot be easily tested). -Emacs uses ERT, Emacs Lisp Regression Testing, for testing. See (info -"(ert)") or https://www.gnu.org/software/emacs/manual/html_node/ert/ -for more information on writing and running tests. +Emacs uses ERT, Emacs Lisp Regression Testing, for testing. See +http://www.gnu.org/software/emacs/manual/html_node/ert/ +or run 'info "(ert)"' for for more information on writing and running +tests. If your test lasts longer than some few seconds, mark it in its 'ert-deftest' definition with ":tags '(:expensive-test)". @@ -264,27 +269,26 @@ top-level directory. Most tests are in the directory " to run the tests for .el(c). See "test/README" for more information. -** Understanding Emacs Internals. +** Understanding Emacs internals -The best way to understand Emacs Internals is to read the code, -but the nodes "Tips" and "GNU Emacs Internals" in the Appendix -of the Emacs Lisp Reference Manual may also help. Some source files, -such as xdisp.c, have large commentaries describing the design and -implementation in more detail. +The best way to understand Emacs internals is to read the code. Some +source files, such as xdisp.c, have extensive comments describing the +design and implementation. The following resources may also help: + +http://www.gnu.org/software/emacs/manual/html_node/elisp/Tips.html +http://www.gnu.org/software/emacs/manual/html_node/elisp/GNU-Emacs-Internals.html + +or run 'info "(elisp)Tips"' or 'info "(elisp)GNU Emacs Internals"'. The file etc/DEBUG describes how to debug Emacs bugs. *** Non-ASCII characters in Emacs files -If you introduce non-ASCII characters into Emacs source files, it is a -good idea to add a 'coding' cookie to the file to state its encoding. -Please use the UTF-8 encoding unless it cannot do the job for some -good reason. As of Emacs 24.4, it is no longer necessary to have -explicit 'coding' cookies in *.el files if they are encoded in UTF-8, -but other files need them even if encoded in UTF-8. However, if -an *.el file is intended for use with older Emacs versions (e.g. if -it's also distributed via ELPA), having an explicit encoding -specification is still a good idea. +If you introduce non-ASCII characters into Emacs source files, use the +UTF-8 encoding unless it cannot do the job for some good reason. +Although it is generally a good idea to add 'coding:' cookies to +non-ASCII source files, cookies are not needed in UTF-8-encoded *.el +files intended for use only with Emacs version 24.5 and later. *** Useful files in the admin/ directory @@ -306,15 +310,15 @@ changed heuristic to deduce that a file was renamed. So if you are planning to make extensive changes to a file after renaming it (or moving it to another directory), you should: -- create a feature branch +- Create a feature branch. -- commit the rename without any changes +- Commit the rename without any changes. -- make other changes +- Make other changes. -- merge the feature branch to trunk, _not_ squashing the commits into - one. The commit message on this merge should summarize the renames - and all the changes. +- Merge the feature branch to the master branch, instead of squashing + the commits into one. The commit message on this merge should + summarize the renames and all the changes. @@ -336,4 +340,5 @@ along with GNU Emacs. If not, see . Local variables: mode: outline paragraph-separate: "[ ]*$" +coding: utf-8 end: diff --git a/admin/notes/git-workflow b/admin/notes/git-workflow index b6168c31bd5..2e4bbac70fe 100644 --- a/admin/notes/git-workflow +++ b/admin/notes/git-workflow @@ -19,17 +19,15 @@ Initial setup ============= Then we want to clone the repository. We normally want to have both -the current trunk and the emacs-24 branch. +the current master and the emacs-25 branch. mkdir ~/emacs cd ~/emacs -git clone @git.sv.gnu.org:/srv/git/emacs.git -mv emacs trunk -(cd trunk; git config push.default current) -./trunk/admin/git-new-workdir trunk emacs-24 -cd emacs-24 -git checkout emacs-24 -git config push.default current +git clone @git.sv.gnu.org:/srv/git/emacs.git master +(cd master; git config push.default current) +./master/admin/git-new-workdir master emacs-25 +cd emacs-25 +git checkout emacs-25 You now have both branches conveniently accessible, and you can do "git pull" in them once in a while to keep updated. @@ -59,13 +57,13 @@ you commit your change locally and then send a patch file as a bug report as described in ../../CONTRIBUTE. -Backporting to emacs-24 +Backporting to emacs-25 ======================= -If you have applied a fix to the trunk, but then decide that it should -be applied to the emacs-24 branch, too, then +If you have applied a fix to the master, but then decide that it should +be applied to the emacs-25 branch, too, then -cd ~/emacs/trunk +cd ~/emacs/master git log and find the commit you're looking for. Then find the commit ID, @@ -73,7 +71,7 @@ which will look like commit 958b768a6534ae6e77a8547a56fc31b46b63710b -cd ~/emacs/emacs-24 +cd ~/emacs/emacs-25 git cherry-pick -xe 958b768a6534ae6e77a8547a56fc31b46b63710b and add "Backport:" to the commit string. Then @@ -81,17 +79,17 @@ and add "Backport:" to the commit string. Then git push -Merging emacs-24 to trunk/master -================================ +Merging emacs-25 to the master +============================== It is recommended to use the file gitmerge.el in the admin directory -for merging 'emacs-24' into 'master'. It will take care of many +for merging 'emacs-25' into 'master'. It will take care of many things which would otherwise have to be done manually, like ignoring commits that should not land in master, fixing up ChangeLogs and automatically dealing with certain types of conflicts. If you really want to, you can do the merge manually, but then you're on your own. If you still choose to do that, make absolutely sure that you *always* -use the 'merge' command to transport commits from 'emacs-24' to +use the 'merge' command to transport commits from 'emacs-25' to 'master'. *Never* use 'cherry-pick'! If you don't know why, then you shouldn't manually do the merge in the first place; just use gitmerge.el instead. @@ -104,11 +102,11 @@ up-to-date by doing a pull. Then start Emacs with emacs -l admin/gitmerge.el -f gitmerge You'll be asked for the branch to merge, which will default to -'origin/emacs-24', which you should accept. Merging a local tracking +'origin/emacs-25', which you should accept. Merging a local tracking branch is discouraged, since it might not be up-to-date, or worse, contain commits from you which are not yet pushed upstream. -You will now see the list of commits from 'emacs-24' which are not yet +You will now see the list of commits from 'emacs-25' which are not yet merged to 'master'. You might also see commits that are already marked for "skipping", which means that they will be merged with a different merge strategy ('ours'), which will effectively ignore the From cf79616133778ff6a0ec4a7745f0f8f9fb5bd8ee Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 14 Feb 2016 19:44:38 -0800 Subject: [PATCH 09/15] ; Spelling fixes --- ChangeLog.2 | 6 +++--- lisp/ChangeLog.13 | 2 +- lisp/ChangeLog.17 | 2 +- lisp/doc-view.el | 4 ++-- lisp/gnus/ChangeLog.3 | 6 +++--- src/emacs.c | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ChangeLog.2 b/ChangeLog.2 index f6d67e24eaf..e441fd184dd 100644 --- a/ChangeLog.2 +++ b/ChangeLog.2 @@ -1594,7 +1594,7 @@ that as the same name can be used for different locations in different SES sheets ; 2) use `local-variable-if-set-p' rather than `boundp' and `local-variable-p' to check if cell name is already in use in this - sheet or needs initialisation. + sheet or needs initialization. (ses-relocate-all): Cell value relocation : 1) like for name relocation use the `ses-cell' property rather than comparing actual name to corresponding standard name. 2) Correct bug introduced in @@ -9622,7 +9622,7 @@ (unexec): Don't search for bss style sections by name. Instead, use the last PT_LOAD header address range covered by p_memsz but not p_filesz and match any SHT_NOBITS section in that - address range. Simplify initialisation of section header vars. + address range. Simplify initialization of section header vars. Don't assume that section headers are above bss segment. Move copying of bss area out of section loop. Align .data2 section to 1, since it now covers the entire bss area. For SHT_NOBITS @@ -9680,7 +9680,7 @@ Separate out some of the more mechanical changes so following patches are smaller. - * src/unexelf.c (unexec): Rearrange initialisation of program + * src/unexelf.c (unexec): Rearrange initialization of program header vars. Use pointer vars in loops rather than indexing section header array via macros. Simplify _OBJC_ sym code and reloc handling code. diff --git a/lisp/ChangeLog.13 b/lisp/ChangeLog.13 index 041e8c0c86b..d792889b3b7 100644 --- a/lisp/ChangeLog.13 +++ b/lisp/ChangeLog.13 @@ -7656,7 +7656,7 @@ 2007-11-07 Glenn Morris * emulation/tpu-mapper.el (tpu-map-key): Use unless rather than cond. - Remove superfluous concats. Move final set-buffer to + Remove superfluous concatenations. Move final set-buffer to non-emacs-specific code. 2007-11-07 Rob Riepel diff --git a/lisp/ChangeLog.17 b/lisp/ChangeLog.17 index 1785a336732..ee03661ece0 100644 --- a/lisp/ChangeLog.17 +++ b/lisp/ChangeLog.17 @@ -1758,7 +1758,7 @@ * net/shr.el (shr-insert): Make sure the space inserted has the right font (for width). - (shr-fill-line): Preserve background colours when indenting/folding. + (shr-fill-line): Preserve background colors when indenting/folding. (shr-ensure-paragraph): Don't insert a new paragraph as the first item in a
  • . diff --git a/lisp/doc-view.el b/lisp/doc-view.el index bc5c1d254b9..4cf4ce264f7 100644 --- a/lisp/doc-view.el +++ b/lisp/doc-view.el @@ -699,8 +699,8 @@ It's a subdirectory of `doc-view-cache-directory'." (concat (thread-last (file-name-nondirectory doc-view--buffer-file-name) ;; bug#13679 (subst-char-in-string ?% ?_) - ;; arc-mode concats archive name and file name - ;; with colon which is illegal on Windows. + ;; arc-mode concatenates archive name and file name + ;; with colon, which is illegal on MS-Windows. (subst-char-in-string ?: ?_)) "-" (let ((file doc-view--buffer-file-name)) diff --git a/lisp/gnus/ChangeLog.3 b/lisp/gnus/ChangeLog.3 index 5e7e95b0466..e6cbe0458b4 100644 --- a/lisp/gnus/ChangeLog.3 +++ b/lisp/gnus/ChangeLog.3 @@ -1732,7 +1732,7 @@ * eww.el (eww-convert-widgets): Put `help-echo' on input fields so that we can navigate to them. - * shr.el (shr-colorize-region): Put the colours over the entire region. + * shr.el (shr-colorize-region): Put the colors over the entire region. (shr-inhibit-decoration): New variable. (shr-add-font): Use it to inhibit text property decorations while doing preliminary table renderings. This speeds up typical Wikipedia page @@ -1824,7 +1824,7 @@ * shr.el (shr-expand-url): Respect // URLs. * eww.el (eww-tag-body): Override the shr body rendering so that we can - put a background colour onto the entire buffer. + put a background color onto the entire buffer. (eww-render): When being redirected, use the redirect URL as the new base URL. @@ -3514,7 +3514,7 @@ * mm-archive.el (mm-archive-decoders): Add support for tar. - * gnus.el (gnus-logo-color-alist): Change the colours for Ma Gnus. + * gnus.el (gnus-logo-color-alist): Change the colors for Ma Gnus. * nnmail.el (nnmail-extra-headers): Add Cc to the default. diff --git a/src/emacs.c b/src/emacs.c index ab5d777aa2e..9bf996a0da3 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -1311,8 +1311,8 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem #endif #ifdef HAVE_NS - /* Initialise the locale from user defaults. */ - ns_init_locale(); + /* Initialize the locale from user defaults. */ + ns_init_locale (); #endif /* Initialize and GC-protect Vinitial_environment and From 903603f8cd06c289ae84bf3f0bc8ac43609b6644 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 15 Feb 2016 13:09:46 +0200 Subject: [PATCH 10/15] Fix wording in a doc-view.el comment * lisp/doc-view.el (doc-view--current-cache-dir): Don't use "illegal" for something that is not against the law. --- lisp/doc-view.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lisp/doc-view.el b/lisp/doc-view.el index 4cf4ce264f7..af7f1996cc5 100644 --- a/lisp/doc-view.el +++ b/lisp/doc-view.el @@ -696,11 +696,12 @@ It's a subdirectory of `doc-view-cache-directory'." (setq doc-view--current-cache-dir (file-name-as-directory (expand-file-name - (concat (thread-last (file-name-nondirectory doc-view--buffer-file-name) + (concat (thread-last + (file-name-nondirectory doc-view--buffer-file-name) ;; bug#13679 (subst-char-in-string ?% ?_) ;; arc-mode concatenates archive name and file name - ;; with colon, which is illegal on MS-Windows. + ;; with colon, which isn't allowed on MS-Windows. (subst-char-in-string ?: ?_)) "-" (let ((file doc-view--buffer-file-name)) From d9ea795035f28f700f1456b377013a24a1ea5e6f Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 15 Feb 2016 14:03:57 +0200 Subject: [PATCH 11/15] Fix regression with 'recent-keys' and keyboard macros * src/keyboard.c (record_char): Don't record in 'recent_keys' events that come from executing keyboard macros. (Bug#22674) --- src/keyboard.c | 50 +++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index 546c0128328..4edb5aa0f32 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -3220,33 +3220,37 @@ record_char (Lisp_Object c) else store_kbd_macro_char (c); - if (!recorded) + /* recent_keys should not include events from keyboard macros. */ + if (NILP (Vexecuting_kbd_macro)) { - total_keys += total_keys < NUM_RECENT_KEYS; - ASET (recent_keys, recent_keys_index, c); - if (++recent_keys_index >= NUM_RECENT_KEYS) - recent_keys_index = 0; - } - else if (recorded < 0) - { - /* We need to remove one or two events from recent_keys. - To do this, we simply put nil at those events and move the - recent_keys_index backwards over those events. Usually, - users will never see those nil events, as they will be - overwritten by the command keys entered to see recent_keys - (e.g. C-h l). */ - - while (recorded++ < 0 && total_keys > 0) + if (!recorded) { - if (total_keys < NUM_RECENT_KEYS) - total_keys--; - if (--recent_keys_index < 0) - recent_keys_index = NUM_RECENT_KEYS - 1; - ASET (recent_keys, recent_keys_index, Qnil); + total_keys += total_keys < NUM_RECENT_KEYS; + ASET (recent_keys, recent_keys_index, c); + if (++recent_keys_index >= NUM_RECENT_KEYS) + recent_keys_index = 0; } - } + else if (recorded < 0) + { + /* We need to remove one or two events from recent_keys. + To do this, we simply put nil at those events and move the + recent_keys_index backwards over those events. Usually, + users will never see those nil events, as they will be + overwritten by the command keys entered to see recent_keys + (e.g. C-h l). */ - num_nonmacro_input_events++; + while (recorded++ < 0 && total_keys > 0) + { + if (total_keys < NUM_RECENT_KEYS) + total_keys--; + if (--recent_keys_index < 0) + recent_keys_index = NUM_RECENT_KEYS - 1; + ASET (recent_keys, recent_keys_index, Qnil); + } + } + + num_nonmacro_input_events++; + } /* Write c to the dribble file. If c is a lispy event, write the event's symbol to the dribble file, in . Bleaugh. From 652e5b49d92d77fe057cf73bcb41f7170182bc8d Mon Sep 17 00:00:00 2001 From: Alan Mackenzie Date: Mon, 15 Feb 2016 12:45:42 +0000 Subject: [PATCH 12/15] Allow arithmetic operators inside C++ template constructs. Fixes debbugs #22486. * lisp/progmodes/cc-langs.el (c-multichar->-op-not->>-regexp): New language variable. (c-<>-notable-chars-re): New language variable. * lisp/progmodes/cc-engine.el (c-forward-<>-arglist-recur): User c-<>-notable-chars-re in place of the former fixed string in searching for places to stop and examine. Use c-multichar->-op-not->>-regexp to check that a found ">" is not part of a multichar operator in place of the former c->-op-without->-cont-regexp. Add code to skip forwards over a balanced parenthesized expression. From 44b16f60fd80afe574964390d896635971cb5504 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 15 Feb 2016 16:03:54 +0200 Subject: [PATCH 13/15] Avoid crashes in semi-malformed 'condition-case' * src/eval.c (internal_lisp_condition_case): Treat a handler '(nil)' as if it were '(nil nil)'. (Bug#22675) --- src/eval.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/eval.c b/src/eval.c index 6c912bc4762..26104a58277 100644 --- a/src/eval.c +++ b/src/eval.c @@ -1245,7 +1245,7 @@ internal_lisp_condition_case (volatile Lisp_Object var, Lisp_Object bodyform, for (i = 0; i < clausenb; i++) { Lisp_Object clause = clauses[i]; - Lisp_Object condition = XCAR (clause); + Lisp_Object condition = CONSP (clause) ? XCAR (clause) : Qnil; if (!CONSP (condition)) condition = Fcons (condition, Qnil); struct handler *c = push_handler (condition, CONDITION_CASE); From 02b037b85ce32fdcf454f5b12d72f09bcb217891 Mon Sep 17 00:00:00 2001 From: Alan Mackenzie Date: Mon, 15 Feb 2016 12:45:42 +0000 Subject: [PATCH 14/15] Allow arithmetic operators inside C++ template constructs. Fixes debbugs #22486. This corrects the previous patch with this message which was empty. * lisp/progmodes/cc-langs.el (c-multichar->-op-not->>-regexp): New language variable. (c-<>-notable-chars-re): New language variable. * lisp/progmodes/cc-engine.el (c-forward-<>-arglist-recur): User c-<>-notable-chars-re in place of the former fixed string in searching for places to stop and examine. Use c-multichar->-op-not->>-regexp to check that a found ">" is not part of a multichar operator in place of the former c->-op-without->-cont-regexp. Add code to skip forwards over a balanced parenthesized expression. --- lisp/progmodes/cc-engine.el | 14 ++++++++++++-- lisp/progmodes/cc-langs.el | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index a4a1604e6f4..d4dcb1ca0e8 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -6056,7 +6056,10 @@ comment at the start of cc-engine.el for more info." ;; Stop on ',', '|', '&', '+' and '-' to catch ;; common binary operators that could be between ;; two comparison expressions "ad". - "[<;{},|+&-]\\|[>)]" + ;; 2016-02-11: C++11 templates can now contain arithmetic + ;; expressions, so template detection in C++ is now less + ;; robust than it was. + c-<>-notable-chars-re nil t t)) (cond @@ -6064,7 +6067,9 @@ comment at the start of cc-engine.el for more info." ;; Either an operator starting with '>' or the end of ;; the angle bracket arglist. - (if (looking-at c->-op-without->-cont-regexp) + (if (save-excursion + (c-backward-token-2) + (looking-at c-multichar->-op-not->>-regexp)) (progn (goto-char (match-end 0)) t) ; Continue the loop. @@ -6134,6 +6139,11 @@ comment at the start of cc-engine.el for more info." ))) t) ; carry on looping. + ((and + (eq (char-before) ?\() + (c-go-up-list-forward) + (eq (char-before) ?\)))) + ((and (not c-restricted-<>-arglists) (or (and (eq (char-before) ?&) (not (eq (char-after) ?&))) diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el index 8a1d43c627c..dd1bccf3d96 100644 --- a/lisp/progmodes/cc-langs.el +++ b/lisp/progmodes/cc-langs.el @@ -228,6 +228,12 @@ the evaluated constant value at compile time." ;; with the group symbol for each group and should return non-nil ;; if that group is to be included. ;; + ;; OP-FILTER selects the operators. It is either t to select all + ;; operators, a string to select all operators for which `string-match' + ;; matches the operator with the string, or a function which will be + ;; called with the operator and should return non-nil when the operator + ;; is to be selected. + ;; ;; If XLATE is given, it's a function which is called for each ;; matching operator and its return value is collected instead. ;; If it returns a list, the elements are spliced directly into @@ -1245,7 +1251,6 @@ operators." t "\\`<." (lambda (op) (substring op 1))))) - (c-lang-defvar c-<-op-cont-regexp (c-lang-const c-<-op-cont-regexp)) (c-lang-defconst c->-op-cont-tokens @@ -1264,7 +1269,6 @@ operators." ;; Regexp matching the second and subsequent characters of all ;; multicharacter tokens that begin with ">". t (c-make-keywords-re nil (c-lang-const c->-op-cont-tokens))) - (c-lang-defvar c->-op-cont-regexp (c-lang-const c->-op-cont-regexp)) (c-lang-defconst c->-op-without->-cont-regexp @@ -1279,10 +1283,19 @@ operators." "\\`>>" (lambda (op) (substring op 1))) :test 'string-equal))) - (c-lang-defvar c->-op-without->-cont-regexp (c-lang-const c->-op-without->-cont-regexp)) +(c-lang-defconst c-multichar->-op-not->>-regexp + ;; Regexp matching multichar tokens containing ">", except ">>" + t (c-make-keywords-re nil + (delete ">>" + (c-filter-ops (c-lang-const c-all-op-syntax-tokens) + t + "\\(.>\\|>.\\)")))) +(c-lang-defvar c-multichar->-op-not->>-regexp + (c-lang-const c-multichar->-op-not->>-regexp)) + (c-lang-defconst c-stmt-delim-chars ;; The characters that should be considered to bound statements. To ;; optimize `c-crosses-statement-barrier-p' somewhat, it's assumed to @@ -3087,6 +3100,20 @@ expression is considered to be a type." ; generics is not yet coded in CC Mode. (c-lang-defvar c-recognize-<>-arglists (c-lang-const c-recognize-<>-arglists)) +(c-lang-defconst c-<>-notable-chars-re + "A regexp matching any single character notable inside a <...> construct. +This must include \"<\" and \">\", and should include \",\", and +any character which cannot be valid inside such a construct. +This is used in `c-forward-<>-arglist-recur' to try to detect +sequences of tokens which cannot be a template/generic construct. +When \"(\" is present, that defun will attempt to parse a +parenthesized expression inside the template. When \")\" is +present it will treat an unbalanced closing paren as a sign of +the invalidity of the putative template construct." + t "[<;{},|+&->)]" + c++ "[<;{},>()]") +(c-lang-defvar c-<>-notable-chars-re (c-lang-const c-<>-notable-chars-re)) + (c-lang-defconst c-enums-contain-decls "Non-nil means that an enum structure can contain declarations." t nil From d4b93e11a519cf71beca69654fda158d01a26c3b Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 15 Feb 2016 21:46:17 +0200 Subject: [PATCH 15/15] Minor fixes in global-auto-composition-mode * lisp/emacs-lisp/easy-mmode.el (easy-mmode-pretty-mode-name): Produce prettier names of globalized minor modes. * lisp/composite.el (global-auto-composition-mode): Make it a globalized mode. (Bug#22682) --- lisp/composite.el | 1 + lisp/emacs-lisp/easy-mmode.el | 1 + 2 files changed, 2 insertions(+) diff --git a/lisp/composite.el b/lisp/composite.el index 205f5ed3712..94b14dfc94a 100644 --- a/lisp/composite.el +++ b/lisp/composite.el @@ -838,6 +838,7 @@ omitted or nil. For more information on Auto Composition mode, see `auto-composition-mode' ." + :global t :variable (default-value 'auto-composition-mode)) (defalias 'toggle-auto-composition 'auto-composition-mode) diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el index f29f64f0562..6a4d835b63c 100644 --- a/lisp/emacs-lisp/easy-mmode.el +++ b/lisp/emacs-lisp/easy-mmode.el @@ -68,6 +68,7 @@ replacing its case-insensitive matches with the literal string in LIGHTER." "toggle-\\|-mode\\'" "" (symbol-name mode)))) " mode"))) + (setq name (replace-regexp-in-string "\\`Global-" "Global " name)) (if (not (stringp lighter)) name ;; Strip leading and trailing whitespace from LIGHTER. (setq lighter (replace-regexp-in-string "\\`\\s-+\\|\\s-+\\'" ""