Mercurial > emacs
changeset 106928:ab59a02f9f9a
Merge from mainline.
author | Katsumi Yamaoka <yamaoka@jpl.org> |
---|---|
date | Mon, 11 Jan 2010 22:07:25 +0000 |
parents | 6d51d2e8c691 (current diff) 2fb043738725 (diff) |
children | 66202b6a2be3 |
files | |
diffstat | 41 files changed, 1778 insertions(+), 457 deletions(-) [+] |
line wrap: on
line diff
--- a/doc/emacs/ChangeLog Fri Jan 08 02:43:41 2010 +0000 +++ b/doc/emacs/ChangeLog Mon Jan 11 22:07:25 2010 +0000 @@ -1,3 +1,8 @@ +2010-01-11 Glenn Morris <rgm@gnu.org> + + * display.texi (Highlight Interactively): `t' does not mean highlight + all patterns. (Bug#5335) + 2009-12-29 Chong Yidong <cyd@stupidchicken.com> * misc.texi (Shell): Document async-shell-command.
--- a/doc/emacs/display.texi Fri Jan 08 02:43:41 2010 +0000 +++ b/doc/emacs/display.texi Mon Jan 11 22:07:25 2010 +0000 @@ -1,6 +1,8 @@ @c This is part of the Emacs manual. @c Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 2000, 2001, -@c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +@c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +@c Free Software Foundation, Inc. + @c See file emacs.texi for copying conditions. @node Display, Search, Registers, Top @chapter Controlling the Display @@ -775,15 +777,14 @@ @vindex hi-lock-file-patterns-policy The variable @code{hi-lock-file-patterns-policy} controls whether Hi -Lock mode should automatically extract and highlight patterns found in -a file when it is visited. Its value can be @code{nil} (never -highlight), @code{t} (highlight the patterns), @code{ask} (query the -user), or a function. If it is a function, -@code{hi-lock-find-patterns} calls it with the patterns as argument; -if the function returns non-@code{nil}, the patterns are used. The -default is @code{nil}. Note that patterns are always highlighted if -you call @code{hi-lock-find-patterns} directly, regardless of the -value of this variable. +Lock mode should automatically extract and highlight patterns found in a +file when it is visited. Its value can be @code{nil} (never highlight), +@code{ask} (query the user), or a function. If it is a function, +@code{hi-lock-find-patterns} calls it with the patterns as argument; if +the function returns non-@code{nil}, the patterns are used. The default +is @code{ask}. Note that patterns are always highlighted if you call +@code{hi-lock-find-patterns} directly, regardless of the value of this +variable. @vindex hi-lock-exclude-modes Also, @code{hi-lock-find-patterns} does nothing if the current major
--- a/doc/man/ChangeLog Fri Jan 08 02:43:41 2010 +0000 +++ b/doc/man/ChangeLog Mon Jan 11 22:07:25 2010 +0000 @@ -1,3 +1,8 @@ +2010-01-09 Chong Yidong <cyd@stupidchicken.com> + + * emacs.1: Copyedits. Update options -Q, -mm and --daemon. Remove + deprecated --unibyte option. + 2009-06-21 Chong Yidong <cyd@stupidchicken.com> * Branch for 23.1.
--- a/doc/man/emacs.1 Fri Jan 08 02:43:41 2010 +0000 +++ b/doc/man/emacs.1 Mon Jan 11 22:07:25 2010 +0000 @@ -22,20 +22,15 @@ written by the author of the original (PDP-10) .IR Emacs , Richard Stallman. -.br +The user functionality of GNU Emacs encompasses everything other +editors do, and it is easily extensible since its editing commands are +written in Lisp. +.PP The primary documentation of GNU Emacs is in the GNU Emacs Manual, which you can read using Info, either from Emacs or as a standalone program. Please look there for complete and up-to-date documentation. -This man page is updated only when someone volunteers to do so; the -Emacs maintainers' priority goal is to minimize the amount of time -this man page takes away from other more useful projects. -.br -The user functionality of GNU Emacs encompasses -everything other -.I Emacs -editors do, and it is easily extensible since its -editing commands are written in Lisp. +This man page is updated only when someone volunteers to do so. .PP .I Emacs has an extensive interactive help facility, @@ -43,18 +38,12 @@ .I Emacs windows and buffers. CTRL-h or F1 enters the Help facility. -Help Tutorial (CTRL-h t) starts an interactive tutorial which can +Help Tutorial (CTRL-h t) starts an interactive tutorial to quickly teach beginners the fundamentals of -.I Emacs -in a few minutes. -Help Apropos (CTRL-h a) helps you -find a command given its functionality, Help Character (CTRL-h c) -describes a given character's effect, and Help Function (CTRL-h f) -describes a given Lisp function specified by name. -.PP -.IR Emacs 's -Undo can undo several steps of modification to your buffers, so it is -easy to recover from editing mistakes. +.I Emacs. +Help Apropos (CTRL-h a) helps you find a command given its +functionality, Help Key (CTRL-h k) describes a given key sequence, and +Help Function (CTRL-h f) describes a given Lisp function. .PP .IR "GNU Emacs" 's many special packages handle mail reading (RMail) and sending (Mail), @@ -63,16 +52,6 @@ .I Emacs windows (Shell), running a Lisp read-eval-print loop (Lisp-Interaction-Mode), automated psychotherapy (Doctor), and much more. -.PP -There is an extensive reference manual, but -users of other Emacses -should have little trouble adapting even -without a copy. -Users new to -.I Emacs -will be able -to use basic features fairly rapidly by studying the tutorial and -using the self-documentation features. . .SS Emacs Options The following options are of general interest: @@ -109,11 +88,9 @@ .B \-\-no\-desktop Do not load a saved desktop. .TP -.BR \-nl ", " \-\-no\-shared\-memory -Do not use shared memory. -.TP .BR \-Q ", " \-\-quick -Equivalent to "\-q \-\-no\-site\-file \-\-no\-splash". +Similar to "\-q \-\-no\-site\-file \-\-no\-splash". Also, avoid +processing X resources. .TP .B \-\-no\-splash Do not display a splash screen during start-up. @@ -136,11 +113,11 @@ as the terminal instead of using stdin/stdout. This must be the first argument specified in the command line. .TP -.BR \-\-multibyte ", " \-\-no-unibyte -Enable multibyte mode (enabled by default). -.TP -.BR \-\-unibyte ", " \-\-no-multibyte -Enable unibyte mode. +.B \-\-daemon +Start Emacs as a daemon, enabling the Emacs server and disconnecting +from the terminal. You can then use the emacsclient command to +connect to the server (see +.BR emacsclient (1)). .TP .B \-\-version Display @@ -151,7 +128,7 @@ Display this help and exit. .RE .PP -The following options are lisp-oriented +The following options are Lisp-oriented (these options are processed in the order encountered): .RS .TP 8 @@ -176,7 +153,6 @@ .B \-\-batch Edit in batch mode. The editor will send messages to stderr. -This option must be the first in the argument list. You must use \-l and \-f options to specify files to execute and functions to call. .TP @@ -309,6 +285,9 @@ .BR \-fw ", " \-\-fullwidth Make the first frame as wide as the screen. .TP +.BR \-mm ", " \-\-maximized +Maximize the first frame, like "\-fw \-fh". +.TP .BI \-fg " color\fR,\fP " \-\-foreground\-color " color" On color displays, set the color of the text. @@ -349,7 +328,7 @@ .BR \-nw ", " \-\-no\-window\-system Tell .I Emacs -not to use its special interface to X. +not to create a graphical frame. If you use this switch when invoking .I Emacs from an @@ -547,54 +526,6 @@ .I depth is the number of color planes. .RE -.PP -If you try to set color values while using a black and white display, -the window's characteristics will default as follows: -the foreground color will be set to black, -the background color will be set to white, -the border color will be set to grey, -and the text and mouse cursors will be set to black. -. -.SS Using the Mouse -.PP -The following lists some of the mouse button bindings for the -.I Emacs -window under X11. -. -.RS -.TS -l l -- - -l l. -MOUSE BUTTON FUNCTION -left Set point. -middle Paste text. -right Cut text into X cut buffer. -SHIFT-middle Cut text into X cut buffer. -SHIFT-right Paste text. -CTRL-middle Cut text into X cut buffer and kill it. -CTRL-right T{ -Select this window, then split it into two windows. -Same as typing CTRL\-x 2. -T} -.\" START DELETING HERE IF YOU'RE NOT USING X MENUS -CTRL-SHIFT-left T{ -X buffer menu \(em hold the buttons and keys -down, wait for menu to appear, select buffer, and release. -Move mouse out of menu and release to cancel. -T} -CTRL-SHIFT-middle T{ -X help menu \(em pop up index card menu for Emacs help. -T} -.\" STOP DELETING HERE IF YOU'RE NOT USING X MENUS -CTRL-SHIFT-right T{ -Select window with mouse, and delete all other windows. -Same as typing CTRL\-x 1. -T} -.\" STOP DELETING HERE IF YOU'RE NOT USING X -.TE -.RE -. . .SH MANUALS You can order printed copies of the GNU Emacs Manual from the Free @@ -705,15 +636,17 @@ .SH AUTHORS .I Emacs was written by Richard Stallman and the Free Software Foundation. -Joachim Martillo and Robert Krawitz added the X features. +For detailed credits and acknowledgements, see the GNU Emacs manual. +. . . .SH COPYING Copyright .if t \(co .if n (C) -1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, +2009, 2010 +Free Software Foundation, Inc. .PP Permission is granted to make and distribute verbatim copies of this document provided the copyright notice and this permission notice are
--- a/lib-src/ChangeLog Fri Jan 08 02:43:41 2010 +0000 +++ b/lib-src/ChangeLog Mon Jan 11 22:07:25 2010 +0000 @@ -1,3 +1,9 @@ +2010-01-11 Glenn Morris <rgm@gnu.org> + + * ebrowse.c (version): + * etags.c (print_version): + * rcs2log (Copyright): Set copyright year to 2010. + 2009-12-09 David Robinow <drobinow@gmail.com> (tiny change) * makefile.w32-in: Use parenthesis for macros for nmake
--- a/lib-src/ebrowse.c Fri Jan 08 02:43:41 2010 +0000 +++ b/lib-src/ebrowse.c Mon Jan 11 22:07:25 2010 +0000 @@ -1,7 +1,7 @@ /* ebrowse.c --- parsing files for the ebrowse C++ browser Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 + 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -3680,7 +3680,7 @@ version () { /* Makes it easier to update automatically. */ - char emacs_copyright[] = "Copyright (C) 2009 Free Software Foundation, Inc."; + char emacs_copyright[] = "Copyright (C) 2010 Free Software Foundation, Inc."; printf ("ebrowse %s\n", VERSION); puts (emacs_copyright);
--- a/lib-src/etags.c Fri Jan 08 02:43:41 2010 +0000 +++ b/lib-src/etags.c Mon Jan 11 22:07:25 2010 +0000 @@ -29,7 +29,7 @@ Copyright (C) 1984, 1987, 1988, 1989, 1993, 1994, 1995, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 + 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is not considered part of GNU Emacs. @@ -898,7 +898,7 @@ print_version () { /* Makes it easier to update automatically. */ - char emacs_copyright[] = "Copyright (C) 2009 Free Software Foundation, Inc."; + char emacs_copyright[] = "Copyright (C) 2010 Free Software Foundation, Inc."; printf ("%s (%s %s)\n", (CTAGS) ? "ctags" : "etags", EMACS_NAME, VERSION); puts (emacs_copyright);
--- a/lib-src/rcs2log Fri Jan 08 02:43:41 2010 +0000 +++ b/lib-src/rcs2log Mon Jan 11 22:07:25 2010 +0000 @@ -3,7 +3,7 @@ # RCS to ChangeLog generator # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2001, 2002, 2003, -# 2004, 2005, 2006, 2007, 2008, 2009 +# 2004, 2005, 2006, 2007, 2008, 2009, 2010 # Free Software Foundation, Inc. # Author: Paul Eggert <eggert@twinsun.com> @@ -22,7 +22,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. -Copyright='Copyright (C) 2009 Free Software Foundation, Inc. +Copyright='Copyright (C) 2010 Free Software Foundation, Inc. This program comes with NO WARRANTY, to the extent permitted by law. You may redistribute copies of this program under the terms of the GNU General Public License.
--- a/lisp/ChangeLog Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/ChangeLog Mon Jan 11 22:07:25 2010 +0000 @@ -1,7 +1,96 @@ +2010-01-11 Sam Steingold <sds@gnu.org> + + * imenu.el (imenu-default-create-index-function): Detect infinite + loops caused by imenu-prev-index-position-function. + +2010-01-11 Juanma Barranquero <lekktu@gmail.com> + + * htmlfontify.el (htmlfontify-load-rgb-file) + (htmlfontify-unload-rgb-file, hfy-fallback-colour-values) + (htmlfontify-manual, htmlfontify, hfy-page-header, hfy-page-footer) + (hfy-src-doc-link-style, hfy-src-doc-link-unstyle, hfy-link-extn) + (hfy-link-style-fun, hfy-index-file, hfy-instance-file) + (hfy-html-quote-regex, hfy-init-kludge-hook, hfy-post-html-hooks) + (hfy-default-face-def, hfy-etag-regex, hfy-html-quote-map) + (hfy-etags-cmd-alist-default, hfy-etags-bin, hfy-ignored-properties) + (hfy-which-etags, hfy-etags-cmd, hfy-istext-command, hfy-display-class) + (hfy-optimisations, hfy-tags-cache, hfy-tags-sortl, hfy-tags-rmap) + (hfy-style-assoc, hfy-sheet-assoc, hfy-facemap-assoc, hfy-interq) + (hfy-colour-vals, hfy-default-header, hfy-link-style-string) + (hfy-triplet, hfy-slant, hfy-weight, hfy-combined-face-spec) + (hfy-face-attr-for-class, hfy-face-to-style-i, hfy-size-to-int) + (hfy-flatten-style, hfy-face-to-style, hfy-face-or-def-to-name) + (hfy-face-to-css, hfy-p-to-face, hfy-p-to-face-lennart, hfy-face-at) + (hfy-fontified-p, hfy-merge-adjacent-spans, hfy-buffer) + (hfy-html-enkludge-buffer, hfy-html-quote, hfy-html-dekludge-buffer) + (hfy-force-fontification, htmlfontify-buffer, hfy-dirname) + (hfy-make-directory, hfy-text-p, hfy-mark-tag-names, hfy-relstub) + (hfy-href-stub, hfy-href, hfy-mark-tag-hrefs, hfy-prepare-index-i) + (hfy-prepare-index, hfy-prepare-tag-map, hfy-subtract-maps) + (htmlfontify-run-etags): Fix typos in docstrings and remove superfluous + backslash-quoting from parentheses, etc. + +2010-01-11 Chong Yidong <cyd@stupidchicken.com> + + * progmodes/js.el: Autoload javascript-mode alias. + +2010-01-11 Juanma Barranquero <lekktu@gmail.com> + + * ffap.el (ffap-shell-prompt-regexp, ffap-all-subdirs, ffap-url-p) + (ffap-alist, ffap-tex-path, ffap-url-at-point, ffap-gopher-regexp) + (ffap-gopher-at-point, ffap-file-at-point, ffap-read-file-or-url) + (ffap-read-url-internal, ffap-menu, ffap-at-mouse): + Fix typos in docstrings. + (ffap-url-regexp): Doc fix. + (ffap-at-mouse): Fix typo in message. + +2010-01-11 Glenn Morris <rgm@gnu.org> + + * version.el (emacs-copyright): Set copyright year to 2010. + +2010-01-10 Stefan Monnier <monnier@iro.umontreal.ca> + + * format.el (format-annotate-function): Only set + write-region-post-annotation-function after running to-fn so as not to + affect nested write-region calls (bug#5273). + +2010-01-10 Chong Yidong <cyd@stupidchicken.com> + + * cedet/semantic.el (semantic-new-buffer-setup-functions): + Add python parser. + + * Makefile.in (ELCFILES): Add wisent/python-wy.el and + wisent/python.el. + +2010-01-10 Richard Kim <emacs18@gmail.com> + + * cedet/semantic/wisent/python-wy.el: + * cedet/semantic/wisent/python.el: New files. + +2010-01-09 Chong Yidong <cyd@stupidchicken.com> + + * man.el (Man-goto-section): Signal error if the section is not + found (Bug#5317). + +2010-01-09 Juanma Barranquero <lekktu@gmail.com> + + * vc-bzr.el (vc-bzr-working-revision): On Windows and MS-DOS, accept + URLs with a leading triple slash in the file: scheme. (Bug#5345) + +2010-01-09 Chong Yidong <cyd@stupidchicken.com> + + * progmodes/compile.el: Don't treat compile-command as safe if + compilation-read-command might be nil (Bug#4218). + +2010-01-09 Jan Djärv <jan.h.d@swipnet.se> + + * startup.el (command-line-1): Use orig-argi to check for ignored X and + NS options. + 2010-01-08 Kenichi Handa <handa@m17n.org> - * international/fontset.el (build-default-fontset-data): Exclude - characters in scripts kana, hangul, han, or cjk-misc. + * international/fontset.el (build-default-fontset-data): + Exclude characters in scripts kana, hangul, han, or cjk-misc. 2010-01-07 Juanma Barranquero <lekktu@gmail.com> @@ -21,8 +110,8 @@ 2010-01-05 Tom Tromey <tromey@redhat.com> - * progmodes/python.el (python-font-lock-keywords): Handle - qualified decorators (Bug#881). + * progmodes/python.el (python-font-lock-keywords): + Handle qualified decorators (Bug#881). 2010-01-05 Dan Nicolaescu <dann@ics.uci.edu> @@ -31,8 +120,7 @@ 2010-01-05 Kenichi Handa <handa@m17n.org> - * language/indian.el (malayalam-composable-pattern): Fix ZWNJ and - ZWJ. + * language/indian.el (malayalam-composable-pattern): Fix ZWNJ and ZWJ. 2010-01-05 Dan Nicolaescu <dann@ics.uci.edu> @@ -57,8 +145,8 @@ 2010-01-02 Daniel Elliott <danelliottster@gmail.com> (tiny change) * progmodes/octave-mod.el (octave-end-keywords) - (octave-block-begin-or-end-regexp, octave-block-match-alist): Add - "end" keyword (Bug#3061). + (octave-block-begin-or-end-regexp, octave-block-match-alist): + Add "end" keyword (Bug#3061). (octave-end-as-array-index-p): New function. (calculate-octave-indent): Use it. @@ -88,18 +176,18 @@ 2010-01-02 Karl Fogel <kfogel@red-bean.com> - * bookmark.el (bookmark-bmenu-select, bookmark-bmenu-1-window, + * bookmark.el (bookmark-bmenu-select, bookmark-bmenu-1-window) (bookmark-bmenu-2-window, bookmark-bmenu-this-window) (bookmark-bmenu-other-window, bookmark-bmenu-switch-other-window) (bookmark-bmenu-show-annotation, bookmark-bmenu-edit-annotation) (bookmark-bmenu-rename, bookmark-bmenu-locate) - (bookmark-bmenu-relocate, bookmark-bmenu-goto-bookmark): Remove - unnecessary calls to `bookmark-bmenu-ensure-position'. + (bookmark-bmenu-relocate, bookmark-bmenu-goto-bookmark): + Remove unnecessary calls to `bookmark-bmenu-ensure-position'. 2010-01-02 Eli Zaretskii <eliz@gnu.org> - * emacs-lisp/easy-mmode.el (define-globalized-minor-mode): Make - the lines in the generated doc string shorter. (Bug#4668) + * emacs-lisp/easy-mmode.el (define-globalized-minor-mode): + Make the lines in the generated doc string shorter. (Bug#4668) 2010-01-02 Ryan Yeske <rcyeske@gmail.com> @@ -107,10 +195,10 @@ 2010-01-02 Eli Zaretskii <eliz@gnu.org> - * Makefile.in (bzr-update): Renamed from cvs-update. + * Makefile.in (bzr-update): Rename from cvs-update. (cvs-update): New target for backward compatibility. - * makefile.w32-in (bzr-update): Renamed from cvs-update. + * makefile.w32-in (bzr-update): Rename from cvs-update. (cvs-update): New target for backward compatibility. 2010-01-02 Karl Fogel <kfogel@red-bean.com> @@ -9732,7 +9820,7 @@ ;; coding: utf-8 ;; End: - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009, 2010 Free Software Foundation, Inc. This file is part of GNU Emacs.
--- a/lisp/Makefile.in Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/Makefile.in Mon Jan 11 22:07:25 2010 +0000 @@ -419,6 +419,8 @@ $(lisp)/cedet/semantic/wisent/javascript.elc \ $(lisp)/cedet/semantic/wisent/javat-wy.elc \ $(lisp)/cedet/semantic/wisent/js-wy.elc \ + $(lisp)/cedet/semantic/wisent/python-wy.elc \ + $(lisp)/cedet/semantic/wisent/python.elc \ $(lisp)/cedet/semantic/wisent/wisent.elc \ $(lisp)/cedet/srecode.elc \ $(lisp)/cedet/srecode/args.elc \
--- a/lisp/cedet/semantic.el Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/cedet/semantic.el Mon Jan 11 22:07:25 2010 +0000 @@ -266,12 +266,13 @@ :type 'hook) (defcustom semantic-new-buffer-setup-functions - '((js-mode . wisent-javascript-setup-parser) - (java-mode . wisent-java-default-setup) - (scheme-mode . semantic-default-scheme-setup) - (c-mode . semantic-default-c-setup) + '((c-mode . semantic-default-c-setup) (c++-mode . semantic-default-c-setup) (html-mode . semantic-default-html-setup) + (java-mode . wisent-java-default-setup) + (js-mode . wisent-javascript-setup-parser) + (python-mode . wisent-python-default-setup) + (scheme-mode . semantic-default-scheme-setup) (srecode-template-mode . srecode-template-setup-parser) (makefile-automake-mode . semantic-default-make-setup) (makefile-gmake-mode . semantic-default-make-setup)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/cedet/semantic/wisent/python-wy.el Mon Jan 11 22:07:25 2010 +0000 @@ -0,0 +1,749 @@ +;;; semantic/wisent/python-wy.el --- Generated parser support file + +;; Copyright (C) 2002, 2003, 2004, 2007, 2010 +;; Free Software Foundation, Inc. + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: +;; +;; This file was generated from the grammar file +;; semantic/wisent/wisent-python.wy in the CEDET repository. + +;;; Code: + +(require 'semantic/lex) + +;;; Prologue +;; + +;;; Declarations +;; +(defconst wisent-python-wy--keyword-table + (semantic-lex-make-keyword-table + '(("and" . AND) + ("assert" . ASSERT) + ("break" . BREAK) + ("class" . CLASS) + ("continue" . CONTINUE) + ("def" . DEF) + ("del" . DEL) + ("elif" . ELIF) + ("else" . ELSE) + ("except" . EXCEPT) + ("exec" . EXEC) + ("finally" . FINALLY) + ("for" . FOR) + ("from" . FROM) + ("global" . GLOBAL) + ("if" . IF) + ("import" . IMPORT) + ("in" . IN) + ("is" . IS) + ("lambda" . LAMBDA) + ("not" . NOT) + ("or" . OR) + ("pass" . PASS) + ("print" . PRINT) + ("raise" . RAISE) + ("return" . RETURN) + ("try" . TRY) + ("while" . WHILE) + ("yield" . YIELD)) + '(("yield" summary "Create a generator function") + ("while" summary "Start a 'while' loop") + ("try" summary "Start of statements protected by exception handlers") + ("return" summary "Return from a function") + ("raise" summary "Raise an exception") + ("print" summary "Print each argument to standard output") + ("pass" summary "Statement that does nothing") + ("or" summary "Binary logical 'or' operator") + ("not" summary "Unary boolean negation operator") + ("is" summary "Binary operator that tests for object equality") + ("in" summary "Part of 'for' statement ") + ("import" summary "Load specified modules") + ("if" summary "Start 'if' conditional statement") + ("global" summary "Declare one or more symbols as global symbols") + ("from" summary "Modify behavior of 'import' statement") + ("for" summary "Start a 'for' loop") + ("finally" summary "Specify code to be executed after 'try' statements whether or not an exception occured") + ("exec" summary "Dynamically execute python code") + ("except" summary "Specify exception handlers along with 'try' keyword") + ("else" summary "Start the 'else' clause following an 'if' statement") + ("elif" summary "Shorthand for 'else if' following an 'if' statement") + ("del" summary "Delete specified objects, i.e., undo what assignment did") + ("def" summary "Define a new function") + ("continue" summary "Skip to the next interation of enclosing for or whilte loop") + ("class" summary "Define a new class") + ("break" summary "Terminate 'for' or 'while loop") + ("assert" summary "Raise AssertionError exception if <expr> is false") + ("and" summary "Logical AND binary operator ... "))) + "Table of language keywords.") + +(defconst wisent-python-wy--token-table + (semantic-lex-make-type-table + '(("symbol" + (NAME)) + ("number" + (NUMBER_LITERAL)) + ("string" + (STRING_LITERAL)) + ("punctuation" + (BACKQUOTE . "`") + (ASSIGN . "=") + (COMMA . ",") + (SEMICOLON . ";") + (COLON . ":") + (BAR . "|") + (TILDE . "~") + (PERIOD . ".") + (MINUS . "-") + (PLUS . "+") + (MOD . "%") + (DIV . "/") + (MULT . "*") + (AMP . "&") + (GT . ">") + (LT . "<") + (HAT . "^") + (NE . "!=") + (LTGT . "<>") + (HATEQ . "^=") + (OREQ . "|=") + (AMPEQ . "&=") + (MODEQ . "%=") + (DIVEQ . "/=") + (MULTEQ . "*=") + (MINUSEQ . "-=") + (PLUSEQ . "+=") + (LE . "<=") + (GE . ">=") + (EQ . "==") + (EXPONENT . "**") + (GTGT . ">>") + (LTLT . "<<") + (DIVDIV . "//") + (DIVDIVEQ . "//=") + (EXPEQ . "**=") + (GTGTEQ . ">>=") + (LTLTEQ . "<<=")) + ("close-paren" + (RBRACK . "]") + (RBRACE . "}") + (RPAREN . ")")) + ("open-paren" + (LBRACK . "[") + (LBRACE . "{") + (LPAREN . "(")) + ("block" + (BRACK_BLOCK . "(LBRACK RBRACK)") + (BRACE_BLOCK . "(LBRACE RBRACE)") + (PAREN_BLOCK . "(LPAREN RPAREN)")) + ("indentation" + (INDENT_BLOCK . "(INDENT DEDENT)") + (DEDENT . "[^:INDENT:]") + (INDENT . "^\\s-+")) + ("newline" + (NEWLINE . "\n")) + ("charquote" + (BACKSLASH . "\\"))) + '(("keyword" :declared t) + ("symbol" :declared t) + ("number" :declared t) + ("punctuation" :declared t) + ("block" :declared t))) + "Table of lexical tokens.") + +(defconst wisent-python-wy--parse-table + (progn + (eval-when-compile + (require 'semantic/wisent/comp)) + (wisent-compile-grammar + '((BACKSLASH NEWLINE INDENT DEDENT INDENT_BLOCK PAREN_BLOCK BRACE_BLOCK BRACK_BLOCK LPAREN RPAREN LBRACE RBRACE LBRACK RBRACK LTLTEQ GTGTEQ EXPEQ DIVDIVEQ DIVDIV LTLT GTGT EXPONENT EQ GE LE PLUSEQ MINUSEQ MULTEQ DIVEQ MODEQ AMPEQ OREQ HATEQ LTGT NE HAT LT GT AMP MULT DIV MOD PLUS MINUS PERIOD TILDE BAR COLON SEMICOLON COMMA ASSIGN BACKQUOTE STRING_LITERAL NUMBER_LITERAL NAME AND ASSERT BREAK CLASS CONTINUE DEF DEL ELIF ELSE EXCEPT EXEC FINALLY FOR FROM GLOBAL IF IMPORT IN IS LAMBDA NOT OR PASS PRINT RAISE RETURN TRY WHILE YIELD) + nil + (goal + ((NEWLINE)) + ((simple_stmt)) + ((compound_stmt))) + (simple_stmt + ((small_stmt_list semicolon_opt NEWLINE))) + (small_stmt_list + ((small_stmt)) + ((small_stmt_list SEMICOLON small_stmt))) + (small_stmt + ((expr_stmt)) + ((print_stmt)) + ((del_stmt)) + ((pass_stmt)) + ((flow_stmt)) + ((import_stmt)) + ((global_stmt)) + ((exec_stmt)) + ((assert_stmt))) + (print_stmt + ((PRINT print_stmt_trailer) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (print_stmt_trailer + ((test_list_opt) + nil) + ((GTGT test trailing_test_list_with_opt_comma_opt) + nil)) + (trailing_test_list_with_opt_comma_opt + (nil) + ((trailing_test_list comma_opt) + nil)) + (trailing_test_list + ((COMMA test) + nil) + ((trailing_test_list COMMA test) + nil)) + (expr_stmt + ((testlist expr_stmt_trailer) + (if + (and $2 + (stringp $1) + (string-match "^\\(\\sw\\|\\s_\\)+$" $1)) + (wisent-raw-tag + (semantic-tag-new-variable $1 nil nil)) + (wisent-raw-tag + (semantic-tag-new-code $1 nil))))) + (expr_stmt_trailer + ((augassign testlist)) + ((eq_testlist_zom))) + (eq_testlist_zom + (nil) + ((eq_testlist_zom ASSIGN testlist) + (identity $3))) + (augassign + ((PLUSEQ)) + ((MINUSEQ)) + ((MULTEQ)) + ((DIVEQ)) + ((MODEQ)) + ((AMPEQ)) + ((OREQ)) + ((HATEQ)) + ((LTLTEQ)) + ((GTGTEQ)) + ((EXPEQ)) + ((DIVDIVEQ))) + (del_stmt + ((DEL exprlist) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (exprlist + ((expr_list comma_opt) + nil)) + (expr_list + ((expr) + nil) + ((expr_list COMMA expr) + nil)) + (pass_stmt + ((PASS) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (flow_stmt + ((break_stmt)) + ((continue_stmt)) + ((return_stmt)) + ((raise_stmt)) + ((yield_stmt))) + (break_stmt + ((BREAK) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (continue_stmt + ((CONTINUE) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (return_stmt + ((RETURN testlist_opt) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (testlist_opt + (nil) + ((testlist) + nil)) + (yield_stmt + ((YIELD testlist) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (raise_stmt + ((RAISE zero_one_two_or_three_tests) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (zero_one_two_or_three_tests + (nil) + ((test zero_one_or_two_tests) + nil)) + (zero_one_or_two_tests + (nil) + ((COMMA test zero_or_one_comma_test) + nil)) + (zero_or_one_comma_test + (nil) + ((COMMA test) + nil)) + (import_stmt + ((IMPORT dotted_as_name_list) + (wisent-raw-tag + (semantic-tag-new-include $2 nil))) + ((FROM dotted_name IMPORT star_or_import_as_name_list) + (wisent-raw-tag + (semantic-tag-new-include $2 nil)))) + (dotted_as_name_list + ((dotted_as_name)) + ((dotted_as_name_list COMMA dotted_as_name))) + (star_or_import_as_name_list + ((MULT) + nil) + ((import_as_name_list) + nil)) + (import_as_name_list + ((import_as_name) + nil) + ((import_as_name_list COMMA import_as_name) + nil)) + (import_as_name + ((NAME name_name_opt) + nil)) + (dotted_as_name + ((dotted_name name_name_opt))) + (name_name_opt + (nil) + ((NAME NAME) + nil)) + (dotted_name + ((NAME)) + ((dotted_name PERIOD NAME) + (format "%s.%s" $1 $3))) + (global_stmt + ((GLOBAL comma_sep_name_list) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (comma_sep_name_list + ((NAME)) + ((comma_sep_name_list COMMA NAME))) + (exec_stmt + ((EXEC expr exec_trailer) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (exec_trailer + (nil) + ((IN test comma_test_opt) + nil)) + (comma_test_opt + (nil) + ((COMMA test) + nil)) + (assert_stmt + ((ASSERT test comma_test_opt) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (compound_stmt + ((if_stmt)) + ((while_stmt)) + ((for_stmt)) + ((try_stmt)) + ((funcdef)) + ((class_declaration))) + (if_stmt + ((IF test COLON suite elif_suite_pair_list else_suite_pair_opt) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (elif_suite_pair_list + (nil) + ((elif_suite_pair_list ELIF test COLON suite) + nil)) + (else_suite_pair_opt + (nil) + ((ELSE COLON suite) + nil)) + (suite + ((simple_stmt) + (list $1)) + ((NEWLINE indented_block) + (progn $2))) + (indented_block + ((INDENT_BLOCK) + (semantic-parse-region + (car $region1) + (cdr $region1) + 'indented_block_body 1))) + (indented_block_body + ((INDENT) + nil) + ((DEDENT) + nil) + ((simple_stmt)) + ((compound_stmt))) + (while_stmt + ((WHILE test COLON suite else_suite_pair_opt) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (for_stmt + ((FOR exprlist IN testlist COLON suite else_suite_pair_opt) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (try_stmt + ((TRY COLON suite except_clause_suite_pair_list else_suite_pair_opt) + (wisent-raw-tag + (semantic-tag-new-code $1 nil))) + ((TRY COLON suite FINALLY COLON suite) + (wisent-raw-tag + (semantic-tag-new-code $1 nil)))) + (except_clause_suite_pair_list + ((except_clause COLON suite) + nil) + ((except_clause_suite_pair_list except_clause COLON suite) + nil)) + (except_clause + ((EXCEPT zero_one_or_two_test) + nil)) + (zero_one_or_two_test + (nil) + ((test zero_or_one_comma_test) + nil)) + (funcdef + ((DEF NAME function_parameter_list COLON suite) + (wisent-raw-tag + (semantic-tag-new-function $2 nil $3)))) + (function_parameter_list + ((PAREN_BLOCK) + (let + ((wisent-python-EXPANDING-block t)) + (semantic-parse-region + (car $region1) + (cdr $region1) + 'function_parameters 1)))) + (function_parameters + ((LPAREN) + nil) + ((RPAREN) + nil) + ((function_parameter COMMA)) + ((function_parameter RPAREN))) + (function_parameter + ((fpdef_opt_test)) + ((MULT NAME) + (wisent-raw-tag + (semantic-tag-new-variable $2 nil nil))) + ((EXPONENT NAME) + (wisent-raw-tag + (semantic-tag-new-variable $2 nil nil)))) + (class_declaration + ((CLASS NAME paren_class_list_opt COLON suite) + (wisent-raw-tag + (semantic-tag-new-type $2 $1 $5 + (cons $3 nil))))) + (paren_class_list_opt + (nil) + ((paren_class_list))) + (paren_class_list + ((PAREN_BLOCK) + (let + ((wisent-python-EXPANDING-block t)) + (mapcar 'semantic-tag-name + (semantic-parse-region + (car $region1) + (cdr $region1) + 'paren_classes 1))))) + (paren_classes + ((LPAREN) + nil) + ((RPAREN) + nil) + ((paren_class COMMA) + (wisent-raw-tag + (semantic-tag-new-variable $1 nil nil))) + ((paren_class RPAREN) + (wisent-raw-tag + (semantic-tag-new-variable $1 nil nil)))) + (paren_class + ((dotted_name))) + (test + ((test_test)) + ((lambdef))) + (test_test + ((and_test)) + ((test_test OR and_test) + nil)) + (and_test + ((not_test)) + ((and_test AND not_test) + nil)) + (not_test + ((NOT not_test) + nil) + ((comparison))) + (comparison + ((expr)) + ((comparison comp_op expr) + nil)) + (comp_op + ((LT)) + ((GT)) + ((EQ)) + ((GE)) + ((LE)) + ((LTGT)) + ((NE)) + ((IN)) + ((NOT IN)) + ((IS)) + ((IS NOT))) + (expr + ((xor_expr)) + ((expr BAR xor_expr) + nil)) + (xor_expr + ((and_expr)) + ((xor_expr HAT and_expr) + nil)) + (and_expr + ((shift_expr)) + ((and_expr AMP shift_expr) + nil)) + (shift_expr + ((arith_expr)) + ((shift_expr shift_expr_operators arith_expr) + nil)) + (shift_expr_operators + ((LTLT)) + ((GTGT))) + (arith_expr + ((term)) + ((arith_expr plus_or_minus term) + nil)) + (plus_or_minus + ((PLUS)) + ((MINUS))) + (term + ((factor)) + ((term term_operator factor) + nil)) + (term_operator + ((MULT)) + ((DIV)) + ((MOD)) + ((DIVDIV))) + (factor + ((prefix_operators factor) + nil) + ((power))) + (prefix_operators + ((PLUS)) + ((MINUS)) + ((TILDE))) + (power + ((atom trailer_zom exponent_zom) + (concat $1 + (if $2 + (concat " " $2 " ") + "") + (if $3 + (concat " " $3) + "")))) + (trailer_zom + (nil) + ((trailer_zom trailer) + nil)) + (exponent_zom + (nil) + ((exponent_zom EXPONENT factor) + nil)) + (trailer + ((PAREN_BLOCK) + nil) + ((BRACK_BLOCK) + nil) + ((PERIOD NAME) + nil)) + (atom + ((PAREN_BLOCK) + nil) + ((BRACK_BLOCK) + nil) + ((BRACE_BLOCK) + nil) + ((BACKQUOTE testlist BACKQUOTE) + nil) + ((NAME)) + ((NUMBER_LITERAL)) + ((one_or_more_string))) + (test_list_opt + (nil) + ((testlist) + nil)) + (testlist + ((comma_sep_test_list comma_opt))) + (comma_sep_test_list + ((test)) + ((comma_sep_test_list COMMA test) + (format "%s, %s" $1 $3))) + (one_or_more_string + ((STRING_LITERAL)) + ((one_or_more_string STRING_LITERAL) + (concat $1 $2))) + (lambdef + ((LAMBDA varargslist_opt COLON test) + (format "%s %s" $1 + (or $2 "")))) + (varargslist_opt + (nil) + ((varargslist))) + (varargslist + ((fpdef_opt_test_list_comma_zom rest_args) + (nconc $2 $1)) + ((fpdef_opt_test_list comma_opt))) + (rest_args + ((MULT NAME multmult_name_opt) + nil) + ((EXPONENT NAME) + nil)) + (multmult_name_opt + (nil) + ((COMMA EXPONENT NAME) + (wisent-raw-tag + (semantic-tag-new-variable $3 nil nil)))) + (fpdef_opt_test_list_comma_zom + (nil) + ((fpdef_opt_test_list_comma_zom fpdef_opt_test COMMA) + (nconc $2 $1))) + (fpdef_opt_test_list + ((fpdef_opt_test)) + ((fpdef_opt_test_list COMMA fpdef_opt_test) + (nconc $3 $1))) + (fpdef_opt_test + ((fpdef eq_test_opt))) + (fpdef + ((NAME) + (wisent-raw-tag + (semantic-tag-new-variable $1 nil nil)))) + (fplist + ((fpdef_list comma_opt))) + (fpdef_list + ((fpdef)) + ((fpdef_list COMMA fpdef))) + (eq_test_opt + (nil) + ((ASSIGN test) + nil)) + (comma_opt + (nil) + ((COMMA))) + (semicolon_opt + (nil) + ((SEMICOLON)))) + '(goal function_parameter paren_class indented_block function_parameters paren_classes indented_block_body))) + "Parser table.") + +(defun wisent-python-wy--install-parser () + "Setup the Semantic Parser." + (semantic-install-function-overrides + '((parse-stream . wisent-parse-stream))) + (setq semantic-parser-name "LALR" + semantic--parse-table wisent-python-wy--parse-table + semantic-debug-parser-source "wisent-python.wy" + semantic-flex-keywords-obarray wisent-python-wy--keyword-table + semantic-lex-types-obarray wisent-python-wy--token-table) + ;; Collect unmatched syntax lexical tokens + (semantic-make-local-hook 'wisent-discarding-token-functions) + (add-hook 'wisent-discarding-token-functions + 'wisent-collect-unmatched-syntax nil t)) + + +;;; Analyzers + +(define-lex-keyword-type-analyzer wisent-python-wy--<keyword>-keyword-analyzer + "keyword analyzer for <keyword> tokens." + "\\(\\sw\\|\\s_\\)+") + +(define-lex-block-type-analyzer wisent-python-wy--<block>-block-analyzer + "block analyzer for <block> tokens." + "\\s(\\|\\s)" + '((("(" LPAREN PAREN_BLOCK) + ("{" LBRACE BRACE_BLOCK) + ("[" LBRACK BRACK_BLOCK)) + (")" RPAREN) + ("}" RBRACE) + ("]" RBRACK)) + ) + +(define-lex-regex-type-analyzer wisent-python-wy--<symbol>-regexp-analyzer + "regexp analyzer for <symbol> tokens." + "\\(\\sw\\|\\s_\\)+" + nil + 'NAME) + +(define-lex-regex-type-analyzer wisent-python-wy--<number>-regexp-analyzer + "regexp analyzer for <number> tokens." + semantic-lex-number-expression + nil + 'NUMBER_LITERAL) + +(define-lex-string-type-analyzer wisent-python-wy--<punctuation>-string-analyzer + "string analyzer for <punctuation> tokens." + "\\(\\s.\\|\\s$\\|\\s'\\)+" + '((BACKQUOTE . "`") + (ASSIGN . "=") + (COMMA . ",") + (SEMICOLON . ";") + (COLON . ":") + (BAR . "|") + (TILDE . "~") + (PERIOD . ".") + (MINUS . "-") + (PLUS . "+") + (MOD . "%") + (DIV . "/") + (MULT . "*") + (AMP . "&") + (GT . ">") + (LT . "<") + (HAT . "^") + (NE . "!=") + (LTGT . "<>") + (HATEQ . "^=") + (OREQ . "|=") + (AMPEQ . "&=") + (MODEQ . "%=") + (DIVEQ . "/=") + (MULTEQ . "*=") + (MINUSEQ . "-=") + (PLUSEQ . "+=") + (LE . "<=") + (GE . ">=") + (EQ . "==") + (EXPONENT . "**") + (GTGT . ">>") + (LTLT . "<<") + (DIVDIV . "//") + (DIVDIVEQ . "//=") + (EXPEQ . "**=") + (GTGTEQ . ">>=") + (LTLTEQ . "<<=")) + 'punctuation) + + +;;; Epilogue +;; + +(provide 'semantic/wisent/python-wy) + +;;; semantic/wisent/python-wy.el ends here
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/cedet/semantic/wisent/python.el Mon Jan 11 22:07:25 2010 +0000 @@ -0,0 +1,344 @@ +;;; wisent-python.el --- Semantic support for Python + +;; Copyright (C) 2002, 2004, 2006, 2007, 2008, 2009, 2010 +;; Free Software Foundation, Inc. + +;; Author: Richard Kim <emacs18@gmail.com> +;; Maintainer: Richard Kim <emacs18@gmail.com> +;; Created: June 2002 +;; Keywords: syntax + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: +;; +;; Parser support for Python. + +;;; Code: + +(require 'semantic/wisent) +(require 'semantic/wisent/python-wy) +(require 'semantic/dep) +(require 'semantic/ctxt) + + +;;; Lexical analysis +;; + +;; Python strings are delimited by either single quotes or double +;; quotes, e.g., "I'm a string" and 'I too am s string'. +;; In addition a string can have either a 'r' and/or 'u' prefix. +;; The 'r' prefix means raw, i.e., normal backslash substitutions are +;; to be suppressed. For example, r"01\n34" is a string with six +;; characters 0, 1, \, n, 3 and 4. The 'u' prefix means the following +;; string is a unicode. +(defconst wisent-python-string-re + (concat (regexp-opt '("r" "u" "ur" "R" "U" "UR" "Ur" "uR") t) + "?['\"]") + "Regexp matching beginning of a python string.") + +(defvar wisent-python-EXPANDING-block nil + "Non-nil when expanding a paren block for Python lexical analyzer.") + +(defun wisent-python-implicit-line-joining-p () + "Return non-nil if implicit line joining is active. +That is, if inside an expressions in parentheses, square brackets or +curly braces." + wisent-python-EXPANDING-block) + +(defsubst wisent-python-forward-string () + "Move point at the end of the python string at point." + (when (looking-at wisent-python-string-re) + ;; skip the prefix + (and (match-end 1) (goto-char (match-end 1))) + ;; skip the quoted part + (cond + ((looking-at "\"\"\"[^\"]") + (search-forward "\"\"\"" nil nil 2)) + ((looking-at "'''[^']") + (search-forward "'''" nil nil 2)) + ((forward-sexp 1))))) + +(defun wisent-python-forward-line () + "Move point to the beginning of the next logical line. +Usually this is simply the next physical line unless strings, +implicit/explicit line continuation, blank lines, or comment lines are +encountered. This function skips over such items so that the point is +at the beginning of the next logical line. If the current logical +line ends at the end of the buffer, leave the point there." + (while (not (eolp)) + (when (= (point) + (progn + (cond + ;; Skip over python strings. + ((looking-at wisent-python-string-re) + (wisent-python-forward-string)) + ;; At a comment start just goto end of line. + ((looking-at "\\s<") + (end-of-line)) + ;; Skip over generic lists and strings. + ((looking-at "\\(\\s(\\|\\s\"\\)") + (forward-sexp 1)) + ;; At the explicit line continuation character + ;; (backslash) move to next line. + ((looking-at "\\s\\") + (forward-line 1)) + ;; Skip over white space, word, symbol, punctuation, + ;; and paired delimiter (backquote) characters. + ((skip-syntax-forward "-w_.$)"))) + (point))) + (error "python-forward-line endless loop detected"))) + ;; The point is at eol, skip blank and comment lines. + (forward-comment (point-max)) + ;; Goto the beginning of the next line. + (or (eobp) (beginning-of-line))) + +(defun wisent-python-forward-line-skip-indented () + "Move point to the next logical line, skipping indented lines. +That is the next line whose indentation is less than or equal to the +identation of the current line." + (let ((indent (current-indentation))) + (while (progn (wisent-python-forward-line) + (and (not (eobp)) + (> (current-indentation) indent)))))) + +(defun wisent-python-end-of-block () + "Move point to the end of the current block." + (let ((indent (current-indentation))) + (while (and (not (eobp)) (>= (current-indentation) indent)) + (wisent-python-forward-line-skip-indented)) + ;; Don't include final comments in current block bounds + (forward-comment (- (point-max))) + (or (bolp) (forward-line 1)) + )) + +;; Indentation stack, what the Python (2.3) language spec. says: +;; +;; The indentation levels of consecutive lines are used to generate +;; INDENT and DEDENT tokens, using a stack, as follows. +;; +;; Before the first line of the file is read, a single zero is pushed +;; on the stack; this will never be popped off again. The numbers +;; pushed on the stack will always be strictly increasing from bottom +;; to top. At the beginning of each logical line, the line's +;; indentation level is compared to the top of the stack. If it is +;; equal, nothing happens. If it is larger, it is pushed on the stack, +;; and one INDENT token is generated. If it is smaller, it must be one +;; of the numbers occurring on the stack; all numbers on the stack +;; that are larger are popped off, and for each number popped off a +;; DEDENT token is generated. At the end of the file, a DEDENT token +;; is generated for each number remaining on the stack that is larger +;; than zero. +(defvar wisent-python-indent-stack) + +(define-lex-analyzer wisent-python-lex-beginning-of-line + "Detect and create python indentation tokens at beginning of line." + (and + (bolp) (not (wisent-python-implicit-line-joining-p)) + (let ((last-indent (car wisent-python-indent-stack)) + (last-pos (point)) + (curr-indent (current-indentation))) + (skip-syntax-forward "-") + (cond + ;; Skip comments and blank lines. No change in indentation. + ((or (eolp) (looking-at semantic-lex-comment-regex)) + (forward-comment (point-max)) + (or (eobp) (beginning-of-line)) + (setq semantic-lex-end-point (point)) + ;; Loop lexer to handle the next line. + t) + ;; No change in indentation. + ((= curr-indent last-indent) + (setq semantic-lex-end-point (point)) + ;; Try next analyzers. + nil) + ;; Indentation increased + ((> curr-indent last-indent) + (if (or (not semantic-lex-maximum-depth) + (< semantic-lex-current-depth semantic-lex-maximum-depth)) + (progn + ;; Return an INDENT lexical token + (setq semantic-lex-current-depth (1+ semantic-lex-current-depth)) + (push curr-indent wisent-python-indent-stack) + (semantic-lex-push-token + (semantic-lex-token 'INDENT last-pos (point)))) + ;; Add an INDENT_BLOCK token + (semantic-lex-push-token + (semantic-lex-token + 'INDENT_BLOCK + (progn (beginning-of-line) (point)) + (semantic-lex-unterminated-syntax-protection 'INDENT_BLOCK + (wisent-python-end-of-block) + (point))))) + ;; Loop lexer to handle tokens in current line. + t) + ;; Indentation decreased + (t + ;; Pop items from indentation stack + (while (< curr-indent last-indent) + (pop wisent-python-indent-stack) + (setq semantic-lex-current-depth (1- semantic-lex-current-depth) + last-indent (car wisent-python-indent-stack)) + (semantic-lex-push-token + (semantic-lex-token 'DEDENT last-pos (point)))) + ;; If pos did not change, then we must return nil so that + ;; other lexical analyzers can be run. + (/= last-pos (point)))))) + ;; All the work was done in the above analyzer matching condition. + ) + +(define-lex-regex-analyzer wisent-python-lex-end-of-line + "Detect and create python newline tokens. +Just skip the newline character if the following line is an implicit +continuation of current line." + "\\(\n\\|\\s>\\)" + (if (wisent-python-implicit-line-joining-p) + (setq semantic-lex-end-point (match-end 0)) + (semantic-lex-push-token + (semantic-lex-token 'NEWLINE (point) (match-end 0))))) + +(define-lex-regex-analyzer wisent-python-lex-string + "Detect and create python string tokens." + wisent-python-string-re + (semantic-lex-push-token + (semantic-lex-token + 'STRING_LITERAL + (point) + (semantic-lex-unterminated-syntax-protection 'STRING_LITERAL + (wisent-python-forward-string) + (point))))) + +(define-lex-regex-analyzer wisent-python-lex-ignore-backslash + "Detect and skip over backslash (explicit line joining) tokens. +A backslash must be the last token of a physical line, it is illegal +elsewhere on a line outside a string literal." + "\\s\\\\s-*$" + ;; Skip over the detected backslash and go to the first + ;; non-whitespace character in the next physical line. + (forward-line) + (skip-syntax-forward "-") + (setq semantic-lex-end-point (point))) + +(define-lex wisent-python-lexer + "Lexical Analyzer for Python code." + ;; Must analyze beginning of line first to handle indentation. + wisent-python-lex-beginning-of-line + wisent-python-lex-end-of-line + ;; Must analyze string before symbol to handle string prefix. + wisent-python-lex-string + ;; Analyzers auto-generated from grammar. + wisent-python-wy--<number>-regexp-analyzer + wisent-python-wy--<keyword>-keyword-analyzer + wisent-python-wy--<symbol>-regexp-analyzer + wisent-python-wy--<block>-block-analyzer + wisent-python-wy--<punctuation>-string-analyzer + ;; Ignored things. + wisent-python-lex-ignore-backslash + semantic-lex-ignore-whitespace + semantic-lex-ignore-comments + ;; Signal error on unhandled syntax. + semantic-lex-default-action) + +;;; Overridden Semantic API. +;; +(define-mode-local-override semantic-lex python-mode + (start end &optional depth length) + "Lexically analyze python code in current buffer. +See the function `semantic-lex' for the meaning of the START, END, +DEPTH and LENGTH arguments. +This function calls `wisent-python-lexer' to actually perform the +lexical analysis, then emits the necessary python DEDENT tokens from +what remains in the `wisent-python-indent-stack'." + (let* ((wisent-python-indent-stack (list 0)) + (stream (wisent-python-lexer start end depth length)) + (semantic-lex-token-stream nil)) + ;; Emit DEDENT tokens if something remains in the INDENT stack. + (while (> (pop wisent-python-indent-stack) 0) + (semantic-lex-push-token (semantic-lex-token 'DEDENT end end))) + (nconc stream (nreverse semantic-lex-token-stream)))) + +(define-mode-local-override semantic-get-local-variables python-mode () + "Get the local variables based on point's context. +To be implemented for python! For now just return nil." + nil) + +(defcustom-mode-local-semantic-dependency-system-include-path + python-mode semantic-python-dependency-system-include-path + nil + "The system include path used by Python langauge.") + +;;; Enable Semantic in `python-mode'. +;; + +;;;###autoload +(defun wisent-python-default-setup () + "Setup buffer for parse." + (wisent-python-wy--install-parser) + (set (make-local-variable 'parse-sexp-ignore-comments) t) + (setq + ;; Character used to separation a parent/child relationship + semantic-type-relation-separator-character '(".") + semantic-command-separation-character ";" + ;; The following is no more necessary as semantic-lex is overriden + ;; in python-mode. + ;; semantic-lex-analyzer 'wisent-python-lexer + + ;; Semantic to take over from the one provided by python. + ;; The python one, if it uses the senator advice, will hang + ;; Emacs unrecoverably. + imenu-create-index-function 'semantic-create-imenu-index + + ;; I need a python guru to update this list: + semantic-symbol->name-assoc-list-for-type-parts '((variable . "Variables") + (function . "Methods")) + semantic-symbol->name-assoc-list '((type . "Classes") + (variable . "Variables") + (function . "Functions") + (include . "Imports") + (package . "Package") + (code . "Code"))) + ) + +;;;###autoload +(add-hook 'python-mode-hook 'wisent-python-default-setup) + +;; Make sure the newer python modes pull in the same python +;; mode overrides. +(define-child-mode python-2-mode python-mode "Python 2 mode") +(define-child-mode python-3-mode python-mode "Python 3 mode") + + +;;; Test +;; +(defun wisent-python-lex-buffer () + "Run `wisent-python-lexer' on current buffer." + (interactive) + (semantic-lex-init) + (let ((token-stream (semantic-lex (point-min) (point-max) 0))) + (with-current-buffer (get-buffer-create "*wisent-python-lexer*") + (erase-buffer) + (pp token-stream (current-buffer)) + (goto-char (point-min)) + (pop-to-buffer (current-buffer))))) + +(provide 'semantic/wisent/python) + +;; Local variables: +;; generated-autoload-file: "../loaddefs.el" +;; generated-autoload-load-name: "semantic/wisent/python" +;; End: + +;;; semantic/wisent/python.el ends here
--- a/lisp/ffap.el Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/ffap.el Mon Jan 11 22:07:25 2010 +0000 @@ -130,7 +130,7 @@ ;; after them. The common root shell prompt (#) is not listed since it ;; also doubles up as a valid URL character. "[$%><]*" - "Paths matching this regexp are stripped off the shell prompt + "Paths matching this regexp are stripped off the shell prompt. If nil, ffap doesn't do shell prompt stripping." :type '(choice (const :tag "Disable" nil) (const :tag "Standard" "[$%><]*") @@ -184,7 +184,7 @@ "\\(ftp\\|https?\\|telnet\\|gopher\\|www\\|wais\\)://" ; needs host "\\)." ; require one more character ) - "Regexp matching URL's. nil to disable URL features in ffap.") + "Regexp matching URLs. Use nil to disable URL features in ffap.") (defcustom ffap-foo-at-bar-prefix "mailto" "Presumed URL prefix type of strings like \"<foo.9z@bar>\". @@ -600,7 +600,7 @@ ret))) (defsubst ffap-url-p (string) - "If STRING looks like an url, return it (maybe improved), else nil." + "If STRING looks like an URL, return it (maybe improved), else nil." (let ((case-fold-search t)) (and ffap-url-regexp (string-match ffap-url-regexp string) ;; I lied, no improvement: @@ -681,7 +681,7 @@ (nreverse ret))) (defun ffap-all-subdirs (dir &optional depth) - "Return list all subdirectories under DIR, starting with itself. + "Return list of all subdirectories under DIR, starting with itself. Directories beginning with \".\" are ignored, and directory symlinks are listed but never searched (to avoid loops). Optional DEPTH limits search depth." @@ -794,12 +794,12 @@ (dired-mode . ffap-dired) ; maybe in a subdirectory ) "Alist of \(KEY . FUNCTION\) pairs parsed by `ffap-file-at-point'. -If string NAME at point (maybe \"\") is not a file or url, these pairs +If string NAME at point (maybe \"\") is not a file or URL, these pairs specify actions to try creating such a string. A pair matches if either KEY is a symbol, and it equals `major-mode', or - KEY is a string, it should matches NAME as a regexp. + KEY is a string, it should match NAME as a regexp. On a match, \(FUNCTION NAME\) is called and should return a file, an -url, or nil. If nil, search the alist for further matches.") +URL, or nil. If nil, search the alist for further matches.") (put 'ffap-alist 'risky-local-variable t) @@ -864,7 +864,7 @@ (defvar ffap-tex-path t ; delayed initialization - "Path where `ffap-tex-mode' looks for tex files. + "Path where `ffap-tex-mode' looks for TeX files. If t, `ffap-tex-init' will initialize this when needed.") (defun ffap-tex-init () @@ -1057,7 +1057,7 @@ (declare-function w3-view-this-url "ext:w3" (&optional no-show)) (defun ffap-url-at-point () - "Return url from around point if it exists, or nil." + "Return URL from around point if it exists, or nil." ;; Could use w3's url-get-url-at-point instead. Both handle "URL:", ;; ignore non-relative links, trim punctuation. The other will ;; actually look back if point is in whitespace, but I would rather @@ -1097,11 +1097,11 @@ (defvar ffap-gopher-regexp "^.*\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *\\(.*\\) *$" - "Regexp Matching a line in a gopher bookmark (maybe indented). + "Regexp matching a line in a gopher bookmark (maybe indented). The two subexpressions are the KEY and VALUE.") (defun ffap-gopher-at-point () - "If point is inside a gopher bookmark block, return its url." + "If point is inside a gopher bookmark block, return its URL." ;; `gopher-parse-bookmark' from gopher.el is not so robust (save-excursion (beginning-of-line) @@ -1144,7 +1144,7 @@ "Return filename from around point if it exists, or nil. Existence test is skipped for names that look remote. If the filename is not obvious, it also tries `ffap-alist', -which may actually result in an url rather than a filename." +which may actually result in an URL rather than a filename." ;; Note: this function does not need to look for url's, just ;; filenames. On the other hand, it is responsible for converting ;; a pseudo-url "site.com://dir" to an ftp file name @@ -1260,7 +1260,7 @@ ;; contents before attempting to complete filenames. (defun ffap-read-file-or-url (prompt guess) - "Read file or url from minibuffer, with PROMPT and initial GUESS." + "Read file or URL from minibuffer, with PROMPT and initial GUESS." (or guess (setq guess default-directory)) (let (dir) ;; Tricky: guess may have or be a local directory, like "w3/w3.elc" @@ -1302,7 +1302,7 @@ guess)) (defun ffap-read-url-internal (string pred action) - "Complete url's from history, treating given string as valid." + "Complete URLs from history, treating given string as valid." (let ((hist (ffap-symbol-value 'url-global-history-hash-table))) (cond ((not action) @@ -1475,7 +1475,7 @@ ;;;###autoload (defun ffap-menu (&optional rescan) - "Put up a menu of files and urls mentioned in this buffer. + "Put up a menu of files and URLs mentioned in this buffer. Then set mark, jump to choice, and try to fetch it. The menu is cached in `ffap-menu-alist', and rebuilt by `ffap-menu-rescan'. The optional RESCAN argument \(a prefix, interactively\) forces @@ -1601,7 +1601,7 @@ ;;;###autoload (defun ffap-at-mouse (e) - "Find file or url guessed from text around mouse click. + "Find file or URL guessed from text around mouse click. Interactively, calls `ffap-at-mouse-fallback' if no guess is found. Return value: * if a guess string is found, return it (after finding it) @@ -1629,7 +1629,7 @@ ((called-interactively-p 'interactive) (if ffap-at-mouse-fallback (call-interactively ffap-at-mouse-fallback) - (message "No file or url found at mouse click.") + (message "No file or URL found at mouse click.") nil)) ; no fallback, return nil ;; failure: return nil )))
--- a/lisp/format.el Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/format.el Mon Jan 11 22:07:25 2010 +0000 @@ -222,9 +222,6 @@ (multibyte enable-multibyte-characters) (coding-system buffer-file-coding-system)) (with-current-buffer copy-buf - (set (make-local-variable - 'write-region-post-annotation-function) - 'kill-buffer) (setq selective-display sel-disp) (set-buffer-multibyte multibyte) (setq buffer-file-coding-system coding-system)) @@ -232,6 +229,15 @@ (set-buffer copy-buf) (format-insert-annotations write-region-annotations-so-far from) (format-encode-run-method to-fn (point-min) (point-max) orig-buf) + (when (buffer-live-p copy-buf) + (with-current-buffer copy-buf + ;; Set write-region-post-annotation-function to + ;; delete the buffer once the write is done, but do + ;; it after running to-fn so it doesn't affect + ;; write-region calls in to-fn. + (set (make-local-variable + 'write-region-post-annotation-function) + 'kill-buffer))) nil) ;; Otherwise just call function, it will return annotations. (funcall to-fn from to orig-buf)))))
--- a/lisp/gnus/ChangeLog Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/gnus/ChangeLog Mon Jan 11 22:07:25 2010 +0000 @@ -1,3 +1,8 @@ +2010-01-08 Jason Rumney <jasonr@gnu.org> + + * sieve-manage.el (sieve-manage-parse-capability-1): Loosely match OK + response. + 2010-01-06 Katsumi Yamaoka <yamaoka@jpl.org> * gnus-art.el (gnus-article-describe-bindings): Work for prefix keys.
--- a/lisp/gnus/sieve-manage.el Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/gnus/sieve-manage.el Mon Jan 11 22:07:25 2010 +0000 @@ -636,7 +636,7 @@ sieve-manage-capability)) (push (list str) sieve-manage-capability)) (forward-line))) - (when (re-search-forward (concat "^OK" sieve-manage-server-eol) nil t) + (when (re-search-forward (concat "^OK.*" sieve-manage-server-eol) nil t) (setq sieve-manage-state 'nonauth))) (defalias 'sieve-manage-parse-greeting-1 'sieve-manage-parse-capability-1)
--- a/lisp/htmlfontify.el Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/htmlfontify.el Mon Jan 11 22:07:25 2010 +0000 @@ -107,19 +107,19 @@ (autoload 'htmlfontify-load-rgb-file "hfy-cmap" - "Load an rgb.txt file for colour name -> rgb translation purposes." + "Load an rgb.txt file for color name -> rgb translation purposes." 'interactive) (autoload 'htmlfontify-unload-rgb-file "hfy-cmap" - "Unload the current colour name -> rgb translation map." + "Unload the current color name -> rgb translation map." 'interactive) (autoload 'hfy-fallback-colour-values "hfy-cmap" - "Use a fallback method for obtaining the rgb values for a colour." + "Use a fallback method for obtaining the rgb values for a color." 'interactive) ) @@ -131,8 +131,8 @@ "The generator meta tag for this version of htmlfontify.") (defconst htmlfontify-manual "Htmlfontify Manual" - "Copy and convert buffers and files to html, adding hyperlinks between files -\(driven by etags\) if requested. + "Copy and convert buffers and files to HTML, adding hyperlinks between files +\(driven by etags) if requested. \nInteractive functions: `htmlfontify-buffer' `htmlfontify-run-etags' @@ -144,50 +144,50 @@ prepare the etags map for a directory: M-x htmlfontify-run-etags copy a directory, fontifying as you go: M-x htmlfontify-copy-and-link-dir\n The following might be useful when running non-windowed or in batch mode: -\(note that they shouldn't be necessary - we have a built in map\)\n +\(note that they shouldn't be necessary - we have a built in map)\n load an X11 style rgb.txt file: M-x htmlfontify-load-rgb-file unload the current rgb.txt file: M-x htmlfontify-unload-rgb-file\n And here's a programmatic example:\n -\(defun rtfm-build-page-header \(file style\) - \(format \"#define TEMPLATE red+black.html +\(defun rtfm-build-page-header (file style) + (format \"#define TEMPLATE red+black.html #define DEBUG 1 #include <build/menu-dirlist|>\\n html-css-url := /css/red+black.css -title := rtfm.etla.org \( %s / src/%s \) +title := rtfm.etla.org ( %s / src/%s ) bodytag := head <=STYLESHEET;\\n %s STYLESHEET main-title := rtfm / %s / src/%s\\n -main-content <=MAIN_CONTENT;\\n\" rtfm-section file style rtfm-section file\)\) +main-content <=MAIN_CONTENT;\\n\" rtfm-section file style rtfm-section file)) -\(defun rtfm-build-page-footer \(file\) \"\\nMAIN_CONTENT\\n\"\) +\(defun rtfm-build-page-footer (file) \"\\nMAIN_CONTENT\\n\") -\(defun rtfm-build-source-docs \(section srcdir destdir\) - \(interactive - \"s section[eg- emacs / p4-blame]:\\nD source-dir: \\nD output-dir: \"\) - \(require 'htmlfontify\) - \(hfy-load-tags-cache srcdir\) - \(let \(\(hfy-page-header 'rtfm-build-page-header\) - \(hfy-page-footer 'rtfm-build-page-footer\) - \(rtfm-section section\) - \(hfy-index-file \"index\"\)\) - \(htmlfontify-run-etags srcdir\) - \(htmlfontify-copy-and-link-dir srcdir destdir \".src\" \".html\"\)\)\)") +\(defun rtfm-build-source-docs (section srcdir destdir) + (interactive + \"s section[eg- emacs / p4-blame]:\\nD source-dir: \\nD output-dir: \") + (require 'htmlfontify) + (hfy-load-tags-cache srcdir) + (let ((hfy-page-header 'rtfm-build-page-header) + (hfy-page-footer 'rtfm-build-page-footer) + (rtfm-section section) + (hfy-index-file \"index\")) + (htmlfontify-run-etags srcdir) + (htmlfontify-copy-and-link-dir srcdir destdir \".src\" \".html\")))") (defgroup htmlfontify nil - "Copy and convert buffers and files to html, adding hyperlinks between -files \(driven by etags\) if requested.\n -See: `htmlfontify-manual'" + "Copy and convert buffers and files to HTML, adding hyperlinks between +files (driven by etags) if requested.\n +See also `htmlfontify-manual'." :group 'applications :prefix "hfy-") (defcustom hfy-page-header 'hfy-default-header - "Function called with two arguments \(the filename relative to the top -level source directory being etag\'d and fontified), and a string containing + "Function called with two arguments (the filename relative to the top +level source directory being etag'd and fontified), and a string containing the <style>...</style> text to embed in the document- the string returned will be used as the header for the htmlfontified version of the source file.\n -See also: `hfy-page-footer'" +See also `hfy-page-footer'." :group 'htmlfontify ;; FIXME: Why place such a :tag everywhere? Isn't it imposing your ;; own Custom preference on your users? --Stef @@ -204,7 +204,7 @@ (defcustom hfy-page-footer 'hfy-default-footer "As `hfy-page-header', but generates the output footer -\(and takes only 1 argument, the filename\)." +\(and takes only one argument, the filename)." :group 'htmlfontify :tag "page-footer" :type '(function)) @@ -216,29 +216,29 @@ :type '(string)) (defcustom hfy-src-doc-link-style "text-decoration: underline;" - "String to add to the \'<style> a\' variant of an htmlfontify css class." + "String to add to the '<style> a' variant of an htmlfontify CSS class." :group 'htmlfontify :tag "src-doc-link-style" :type '(string)) (defcustom hfy-src-doc-link-unstyle " text-decoration: none;" - "Regex to remove from the <style> a variant of an htmlfontify css class." + "Regex to remove from the <style> a variant of an htmlfontify CSS class." :group 'htmlfontify :tag "src-doc-link-unstyle" :type '(string)) (defcustom hfy-link-extn nil - "File extension used for href links - Useful where the htmlfontify -output files are going to be processed again, with a resulting change -in file extension. If nil, then any code using this should fall back -to `hfy-extn'." + "File extension used for href links. +Useful where the htmlfontify output files are going to be processed +again, with a resulting change in file extension. If nil, then any +code using this should fall back to `hfy-extn'." :group 'htmlfontify :tag "link-extension" :type '(choice string (const nil))) (defcustom hfy-link-style-fun 'hfy-link-style-string "Set this to a function, which will be called with one argument -\(a \"{ foo: bar; ...}\" css style-string\) - it should return a copy of +\(a \"{ foo: bar; ...}\" CSS style-string) - it should return a copy of its argument, altered so as to make any changes you want made for text which is a hyperlink, in addition to being in the class to which that style would normally be applied." @@ -246,23 +246,23 @@ :tag "link-style-function" :type '(function)) -(defcustom hfy-index-file "hfy-index" - "Name \(sans extension\) of the tag definition index file produced during +(defcustom hfy-index-file "hfy-index" + "Name (sans extension) of the tag definition index file produced during fontification-and-hyperlinking." :group 'htmlfontify :tag "index-file" :type '(string)) -(defcustom hfy-instance-file "hfy-instance" - "Name \(sans extension\) of the tag usage index file produced during +(defcustom hfy-instance-file "hfy-instance" + "Name (sans extension) of the tag usage index file produced during fontification-and-hyperlinking." :group 'htmlfontify :tag "instance-file" :type '(string)) (defcustom hfy-html-quote-regex "\\(<\\|\"\\|&\\|>\\)" - "Regex to match \(with a single back-reference per match\) strings in HTML -which should be quoted with `hfy-html-quote' \(and `hfy-html-quote-map'\) + "Regex to match (with a single back-reference per match) strings in HTML +which should be quoted with `hfy-html-quote' (and `hfy-html-quote-map') to make them safe." :group 'htmlfontify :tag "html-quote-regex" @@ -271,28 +271,28 @@ (define-obsolete-variable-alias 'hfy-init-kludge-hooks 'hfy-init-kludge-hook "23.2") (defcustom hfy-init-kludge-hook '(hfy-kludge-cperl-mode) - "List of functions to call when starting htmlfontify-buffer to do any -kludging necessary to get highlighting modes to bahave as you want, even + "List of functions to call when starting `htmlfontify-buffer' to do any +kludging necessary to get highlighting modes to behave as you want, even when not running under a window system." :group 'htmlfontify :tag "init-kludge-hooks" :type '(hook)) (defcustom hfy-post-html-hooks nil - "List of functions to call after creating and filling the html buffer. -These functions will be called with the html buffer as the current buffer" + "List of functions to call after creating and filling the HTML buffer. +These functions will be called with the html buffer as the current buffer." :group 'htmlfontify :tag "post-html-hooks" :options '(set-auto-mode) :type '(hook)) (defcustom hfy-default-face-def nil - "Fallback `defface' specification for the face \'default, used when -`hfy-display-class' has been set \(the normal htmlfontify way of extracting -potentially non-current face information doesn\'t necessarily work for -\'default\).\n -Example: I customise this to:\n -\(\(t :background \"black\" :foreground \"white\" :family \"misc-fixed\"\)\)" + "Fallback `defface' specification for the face 'default, used when +`hfy-display-class' has been set (the normal htmlfontify way of extracting +potentially non-current face information doesn't necessarily work for +'default).\n +Example: I customize this to:\n +\((t :background \"black\" :foreground \"white\" :family \"misc-fixed\"))" :group 'htmlfontify :tag "default-face-definition" :type '(alist)) @@ -306,7 +306,7 @@ in order, to:\n 1 - The tag 2 - The line - 3 - The char \(point\) at which the tag occurs." + 3 - The char (point) at which the tag occurs." :group 'htmlfontify :tag "etag-regex" :type '(regexp)) @@ -315,7 +315,7 @@ ("<" "<" ) ("&" "&" ) (">" ">" )) - "Alist of char -> entity mappings used to make the text html-safe." + "Alist of char -> entity mappings used to make the text HTML-safe." :group 'htmlfontify :tag "html-quote-map" :type '(alist :key-type (string))) @@ -358,13 +358,13 @@ (defcustom hfy-etags-cmd-alist hfy-etags-cmd-alist-default "Alist of possible shell commands that will generate etags output that -`htmlfontify' can use. \'%s\' will be replaced by `hfy-etags-bin'." +`htmlfontify' can use. '%s' will be replaced by `hfy-etags-bin'." :group 'htmlfontify :tag "etags-cmd-alist" :type '(alist :key-type (string) :value-type (string)) )) (defcustom hfy-etags-bin "etags" - "Location of etags binary (we begin by assuming it\'s in your path).\n + "Location of etags binary (we begin by assuming it's in your path).\n Note that if etags is not in your path, you will need to alter the shell commands in `hfy-etags-cmd-alist'." :group 'htmlfontify @@ -377,20 +377,20 @@ :tag "shell-file-name" :type '(file)) -(defcustom hfy-ignored-properties '(read-only +(defcustom hfy-ignored-properties '(read-only intangible modification-hooks insert-in-front-hooks insert-behind-hooks point-entered point-left) - "Properties to omit when copying a fontified buffer for html transformation." + "Properties to omit when copying a fontified buffer for HTML transformation." :group 'htmlfontify :tag "ignored-properties" :type '(repeat symbol)) (defun hfy-which-etags () - "Return a string indicating which flavour of etags we are using." + "Return a string indicating which flavour of etags we are using." (let ((v (shell-command-to-string (concat hfy-etags-bin " --version")))) (cond ((string-match "exube" v) "exuberant ctags") ((string-match "GNU E" v) "emacs etags" )) )) @@ -400,8 +400,8 @@ "The etags equivalent command to run in a source directory to generate a tags file for the whole source tree from there on down. The command should emit the etags output on stdout.\n -Two canned commands are provided - they drive Emacs\' etags and -exuberant-ctags\' etags respectively." +Two canned commands are provided - they drive Emacs' etags and +exuberant-ctags' etags respectively." :group 'htmlfontify :tag "etags-command" :type (eval-and-compile @@ -412,8 +412,8 @@ (defcustom hfy-istext-command "file %s | sed -e 's@^[^:]*:[ \t]*@@'" "Command to run with the name of a file, to see whether it is a text file -or not. The command should emit a string containing the word \'text\' if -the file is a text file, and a string not containing \'text\' otherwise." +or not. The command should emit a string containing the word 'text' if +the file is a text file, and a string not containing 'text' otherwise." :group 'htmlfontify :tag "istext-command" :type '(string)) @@ -427,27 +427,27 @@ (defcustom hfy-display-class nil "Display class to use to determine which display class to use when -calculating a face\'s attributes. This is useful when, for example, you +calculating a face's attributes. This is useful when, for example, you are running Emacs on a tty or in batch mode, and want htmlfontify to have access to the face spec you would use if you were connected to an X display.\n Some valid class specification elements are:\n - \'\(class color\) - \'\(class grayscale\) - \'\(background dark\) - \'\(background light\) - \'\(type x-toolkit\) - \'\(type tty\) - \'\(type motif\) - \'\(type lucid\) + '(class color) + '(class grayscale) + '(background dark) + '(background light) + '(type x-toolkit) + '(type tty) + '(type motif) + '(type lucid) Multiple values for a tag may be combined, to indicate that any one or more of these values in the specification key constitutes a match, eg:\n -\'\(\(class color grayscale\) \(type tty\)\) would match any of:\n - \'\(\(class color\)\) - \'\(\(class grayscale\)\) - \'\(\(class color grayscale\)\)\) - \'\(\(class color foo\)\) - \'\(\(type tty\)\) - \'\(\(type tty\) \(class color\)\)\n +'((class color grayscale) (type tty)) would match any of:\n + '((class color)) + '((class grayscale)) + '((class color grayscale)) + '((class color foo)) + '((type tty)) + '((type tty) (class color))\n and so on." :type '(alist :key-type (symbol) :value-type (symbol)) :group 'htmlfontify @@ -464,7 +464,7 @@ (const :tag "Bright" light ))) )) (defcustom hfy-optimisations (list 'keep-overlays) - "Optimisations to turn on: So far, the following have been implemented:\n + "Optimizations to turn on: So far, the following have been implemented:\n merge-adjacent-tags: If two (or more) span tags are adjacent, identical and separated by nothing more than whitespace, they will be merged into one span. @@ -472,15 +472,15 @@ zap-string-links : Suppress hyperlinking of tags found in strings. div-wrapper : Add <div class=\"default\"> </div> tags around the output. - keep-overlays : More of a bell \(or possibly whistle\) than an - optimisation - If on, preserve overlay highlighting - \(cf ediff or goo-font-lock\) as well as basic faces\n + keep-overlays : More of a bell (or possibly whistle) than an + optimization - If on, preserve overlay highlighting + (cf ediff or goo-font-lock) as well as basic faces.\n And the following are planned but not yet available:\n kill-context-leak : Suppress hyperlinking between files highlighted by different modes.\n -Note: like compiler optimisations, these optimise the _output_ of the code, +Note: like compiler optimizations, these optimize the _output_ of the code, not the processing of the source itself, and are therefore likely to slow -htmlfontify down, at least a little. Except for skip-refontification, +htmlfontify down, at least a little. Except for skip-refontification, which can never slow you down, but may result in incomplete fontification." :type '(set (const :tag "merge-adjacent-tags" merge-adjacent-tags ) (const :tag "zap-comment-links" zap-comment-links ) @@ -490,86 +490,86 @@ (const :tag "div-wrapper" div-wrapper ) (const :tag "keep-overlays" keep-overlays )) :group 'htmlfontify - :tag "optimisations") + :tag "optimizations") -(defvar hfy-tags-cache nil +(defvar hfy-tags-cache nil "Alist of the form:\n -\(\(\"/src/dir/0\" . tag-hash0\) \(\"/src/dir/1\" tag-hash1\) ...\)\n -Each tag hash entry then contains entries of the form:\n +\((\"/src/dir/0\" . tag-hash0) (\"/src/dir/1\" tag-hash1) ...)\n +Each tag hash entry then contains entries of the form:\n \"tag_string\" => ((\"file/name.ext\" line char) ... )\n -ie an alist mapping \(relative\) file paths to line and character offsets.\n -See `hfy-load-tags-cache'.") +ie an alist mapping (relative) file paths to line and character offsets.\n +See also `hfy-load-tags-cache'.") -(defvar hfy-tags-sortl nil - "Alist of the form \(\(\"/src/dir\" . (tag0 tag1 tag2)\) ... \)\n -Where the tags are stored in descending order of length.\n -See `hfy-load-tags-cache'.") +(defvar hfy-tags-sortl nil + "Alist of the form ((\"/src/dir\" . (tag0 tag1 tag2)) ... )\n +where the tags are stored in descending order of length.\n +See also `hfy-load-tags-cache'.") -(defvar hfy-tags-rmap nil - "Alist of the form \(\(\"/src/dir\" . tag-rmap-hash\)\)\n -Where tag-rmap-hash has entries of the form: +(defvar hfy-tags-rmap nil + "Alist of the form ((\"/src/dir\" . tag-rmap-hash))\n +where tag-rmap-hash has entries of the form: \"tag_string\" => ( \"file/name.ext\" line char ) Unlike `hfy-tags-cache' these are the locations of occurrences of tagged items, not the locations of their definitions.") (defvar hfy-style-assoc 'please-ignore-this-line "An assoc representing/describing an Emacs face. -Properties may be repeated, In which case later properties should be -treated as if they were inherited from a \'parent\' font. +Properties may be repeated, in which case later properties should be +treated as if they were inherited from a 'parent' font. \(For some properties, only the first encountered value is of any importance, for others the values might be cumulative, and for others they might be -cumulative in a complex way).\n +cumulative in a complex way.)\n Some examples:\n -\(hfy-face-to-style 'default\) => - \(\(\"background\" . \"rgb\(0, 0, 0\)\"\) - \(\"color\" . \"rgb\(255, 255, 255\)\"\) - \(\"font-style\" . \"normal\"\) - \(\"font-weight\" . \"500\"\) - \(\"font-stretch\" . \"normal\"\) - \(\"font-family\" . \"misc-fixed\"\) - \(\"font-size\" . \"13pt\"\) - \(\"text-decoration\" . \"none\"\)\)\n -\(hfy-face-to-style 'Info-title-3-face\) => - \(\(\"font-weight\" . \"700\"\) - \(\"font-family\" . \"helv\"\) - \(\"font-size\" . \"120%\"\) - \(\"text-decoration\" . \"none\"\)\)\n") +\(hfy-face-to-style 'default) => + ((\"background\" . \"rgb(0, 0, 0)\") + (\"color\" . \"rgb(255, 255, 255)\") + (\"font-style\" . \"normal\") + (\"font-weight\" . \"500\") + (\"font-stretch\" . \"normal\") + (\"font-family\" . \"misc-fixed\") + (\"font-size\" . \"13pt\") + (\"text-decoration\" . \"none\"))\n +\(hfy-face-to-style 'Info-title-3-face) => + ((\"font-weight\" . \"700\") + (\"font-family\" . \"helv\") + (\"font-size\" . \"120%\") + (\"text-decoration\" . \"none\"))\n") (defvar hfy-sheet-assoc 'please-ignore-this-line - "An assoc with elements of the form (face-name style-name . stlye-string):\n -'\(\(default \"default\" . \"{background: black;color: white}\"\) - \(font-lock-string-face \"string\" . \"{color: rgb\(64,224,208\)}\"\)\)" ) + "An assoc with elements of the form (face-name style-name . style-string):\n +'((default \"default\" . \"{background: black; color: white}\") + (font-lock-string-face \"string\" . \"{color: rgb(64,224,208)}\"))" ) (defvar hfy-facemap-assoc 'please-ignore-this-line - "An assoc of \(point . FACE-SYMBOL\) or \(point . DEFFACE-LIST\) + "An assoc of (point . FACE-SYMBOL) or (point . DEFFACE-LIST) and (point . 'end) elements, in descending order of point value -\(ie from the file's end to its beginning\).\n -The map is in reverse order because inserting a <style> tag \(or any other -string) at POINT invalidates the map for all entries with a greater value of -point. By traversing the map from greatest to least POINT, we still invalidate -the map as we go, but only those points we have already dealt with \( and -therefore no longer care about \) will be invalid at any time.\n -'\(\(64820 . end\) - \(64744 . font-lock-comment-face\) - \(64736 . end\) - \(64722 . font-lock-string-face\) - \(64630 . end\) - \(64623 . font-lock-string-face\) - \(64449 . end\) - \(64446 . font-lock-keyword-face\) - \(64406 . end\) - \(64395 . font-lock-constant-face\) - \(64393 . end\) - \(64386 . font-lock-keyword-face\) - \(64379 . end\) +\(ie from the file's end to its beginning).\n +The map is in reverse order because inserting a <style> tag (or any other +string) at `point' invalidates the map for all entries with a greater value of +point. By traversing the map from greatest to least point, we still invalidate +the map as we go, but only those points we have already dealt with (and +therefore no longer care about) will be invalid at any time.\n +'((64820 . end) + (64744 . font-lock-comment-face) + (64736 . end) + (64722 . font-lock-string-face) + (64630 . end) + (64623 . font-lock-string-face) + (64449 . end) + (64446 . font-lock-keyword-face) + (64406 . end) + (64395 . font-lock-constant-face) + (64393 . end) + (64386 . font-lock-keyword-face) + (64379 . end) ;; big similar section elided. You get the idea. - \(4285 . font-lock-constant-face\) - \(4285 . end\) - \(4221 . font-lock-comment-face\) - \(4221 . end\) - \(4197 . font-lock-constant-face\) - \(4197 . end\) - \(1 . font-lock-comment-face\)\)") + (4285 . font-lock-constant-face) + (4285 . end) + (4221 . font-lock-comment-face) + (4221 . end) + (4197 . font-lock-constant-face) + (4197 . end) + (1 . font-lock-comment-face))") (defvar hfy-tmpfont-stack nil "An alist of derived fonts resulting from overlays.") @@ -583,7 +583,7 @@ "\\(" hfy-hex-regex hfy-hex-regex "\\)")) (defun hfy-interq (set-a set-b) - "Return the intersection \(using `eq'\) of 2 lists SET-A and SET-B." + "Return the intersection (using `eq') of two lists SET-A and SET-B." (let ((sa set-a) (interq nil) (elt nil)) (while sa (setq elt (car sa) @@ -591,8 +591,8 @@ (if (memq elt set-b) (setq interq (cons elt interq)))) interq)) (defun hfy-colour-vals (colour) - "Where COLOUR is a colour name or #XXXXXX style triplet, return a -list of 3 (16 bit) rgb values for said colour.\n + "Where COLOUR is a color name or #XXXXXX style triplet, return a +list of three (16 bit) rgb values for said color.\n If a window system is unavailable, calls `hfy-fallback-colour-values'." (if (string-match hfy-triplet-regex colour) (mapcar @@ -653,7 +653,7 @@ // whether the current row is odd or even var even = false; - // if arguments are provided to specify the colours + // if arguments are provided to specify the colors // of the even & odd rows, then use the them; // otherwise use the following defaults: var evenColor = arguments[1] ? arguments[1] : \"#fff\"; @@ -739,7 +739,7 @@ "\n </body>\n</html>\n") (defun hfy-link-style-string (style-string) - "Replace the end of a css style declaration STYLE-STRING with the contents + "Replace the end of a CSS style declaration STYLE-STRING with the contents of the variable `hfy-src-doc-link-style', removing text matching the regex `hfy-src-doc-link-unstyle' first, if necessary." ;;(message "hfy-colour-vals");;DBUG @@ -755,11 +755,11 @@ ;; utility functions - cast emacs style specification values into their ;; css2 equivalents: (defun hfy-triplet (colour) - "Takes a COLOUR name \(string\) and return a CSS rgb(R, G, B) triplet string. + "Takes a COLOUR name (string) and return a CSS rgb(R, G, B) triplet string. Uses the definition of \"white\" to map the numbers to the 0-255 range, so -if you\'ve redefined white, \(esp if you've redefined it to have a triplet -member lower than that of the colour you are processing, strange things -may happen\)." +if you've redefined white, (esp. if you've redefined it to have a triplet +member lower than that of the color you are processing) strange things +may happen." ;;(message "hfy-colour-vals");;DBUG (let ((white (mapcar (lambda (I) (float (1+ I))) (hfy-colour-vals "white"))) (rgb16 (mapcar (lambda (I) (float (1+ I))) (hfy-colour-vals colour)))) @@ -782,7 +782,7 @@ :type 'float :group 'htmlfontify) -(defun hfy-size (height) +(defun hfy-size (height) "Derive a CSS font-size specifier from an Emacs font :height attribute HEIGHT. Does not cope with the case where height is a function to be applied to the height of the underlying font." @@ -794,8 +794,8 @@ ((integerp height) (cons "font-size" (format "%dpt" (/ (* hfy-font-zoom height) 10 )))) )) ) -(defun hfy-slant (slant) - "Derive a font-style css specifier from the Emacs :slant attribute SLANT: +(defun hfy-slant (slant) + "Derive a font-style CSS specifier from the Emacs :slant attribute SLANT: CSS does not define the reverse-* styles, so just maps those to the regular specifiers." (list (cons "font-style" @@ -806,7 +806,7 @@ "normal")))) (defun hfy-weight (weight) - "Derive a font-weight css specifier from an Emacs weight spec symbol WEIGHT." + "Derive a font-weight CSS specifier from an Emacs weight spec symbol WEIGHT." (list (cons "font-weight" (cdr (assq weight '((ultra-bold . "900") (extra-bold . "800") (bold . "700") @@ -816,7 +816,7 @@ (light . "300") (extra-light . "200") (ultra-light . "100"))))))) - + (defun hfy-box-to-border-assoc (spec) (if spec (let ((tag (car spec)) @@ -866,7 +866,7 @@ (defun hfy-combined-face-spec (face) "Return a `defface' style alist of possible specifications for FACE. -Entries resulting from customisation \(`custom-set-faces'\) will take +Entries resulting from customization (`custom-set-faces') will take precedence." (let ((spec nil)) (setq spec (append (or (get face 'saved-face) (list)) @@ -876,19 +876,19 @@ (defun hfy-face-attr-for-class (face &optional class) "Return the face attributes for FACE. -If CLASS is set, it must be a `defface' alist key \[see below\], +If CLASS is set, it must be a `defface' alist key [see below], in which case the first face specification returned by `hfy-combined-face-spec' -which *doesn\'t* clash with CLASS is returned.\n +which *doesn't* clash with CLASS is returned.\n \(A specification with a class of t is considered to match any class you -specify - this matches Emacs\' behaviour when deciding on which face attributes -to use, to the best of my understanding\).\n +specify - this matches Emacs' behavior when deciding on which face attributes +to use, to the best of my understanding).\n If CLASS is nil, then you just get get whatever `face-attr-construct' returns, ie the current specification in effect for FACE.\n -*NOTE* This function forces any face that is not \'default and which has -no :inherit property to inherit from \'default \( this is because \'default +*NOTE*: This function forces any face that is not 'default and which has +no :inherit property to inherit from 'default (this is because 'default is magical in that Emacs' fonts behave as if they inherit implicitly from -\'default, but no such behaviour exists in HTML/CSS \).\n -See `hfy-display-class' for details of valid values for CLASS." +'default, but no such behavior exists in HTML/CSS).\n +See also `hfy-display-class' for details of valid values for CLASS." (let ((face-spec (if class (let ((face-props (hfy-combined-face-spec face)) @@ -975,9 +975,9 @@ ;; :height 98 :width normal :family "outline-courier new") (defun hfy-face-to-style-i (fn) "The guts of `hfy-face-to-style': FN should be a `defface' font spec, -as returned by `face-attr-construct' or `hfy-face-attr-for-class'. Note -that this function does not get font-sizes right if they are based on -inherited modifiers \(via the :inherit\) attribute, and any other +as returned by `face-attr-construct' or `hfy-face-attr-for-class'. +Note that this function does not get font-sizes right if they are based +on inherited modifiers (via the :inherit) attribute, and any other modifiers that are cumulative if they appear multiple times need to be merged by the user - `hfy-flatten-style' should do this." ;;(message "hfy-face-to-style-i");;DBUG @@ -1026,8 +1026,8 @@ (nconc this that parent))) ) (defun hfy-size-to-int (spec) - "Convert SPEC, a css font-size specifier, back to an Emacs :height attribute -value. Used while merging multiple font-size attributes." + "Convert SPEC, a CSS font-size specifier, to an Emacs :height attribute value. +Used while merging multiple font-size attributes." ;;(message "hfy-size-to-int");;DBUG (list (if (string-match "\\([0-9]+\\)\\(%\\|pt\\)" spec) @@ -1044,7 +1044,7 @@ "Take STYLE (see `hfy-face-to-style-i', `hfy-face-to-style') and merge any multiple attributes appropriately. Currently only font-size is merged down to a single occurrence - others may need special handling, but I -haven\'t encountered them yet. Returns a `hfy-style-assoc'." +haven't encountered them yet. Returns a `hfy-style-assoc'." ;;(message "(hfy-flatten-style %S)" style) ;;DBUG (let ((n 0) (m (list 1)) @@ -1062,9 +1062,9 @@ (defun hfy-face-to-style (fn) "Take FN, a font or `defface' style font specification, -\(as returned by `face-attr-construct' or `hfy-face-attr-for-class'\) +\(as returned by `face-attr-construct' or `hfy-face-attr-for-class') and return a `hfy-style-assoc'.\n -See also: `hfy-face-to-style-i', `hfy-flatten-style'." +See also `hfy-face-to-style-i', `hfy-flatten-style'." ;;(message "hfy-face-to-style");;DBUG (let ((face-def (if (facep fn) (hfy-face-attr-for-class fn hfy-display-class) fn)) @@ -1086,7 +1086,7 @@ ;; also handle ephemeral fonts created by overlays, which don't actually ;; have names: (defun hfy-face-or-def-to-name (fn) - "Render a font symbol or `defface' font spec FN into a name \(string\)." + "Render a font symbol or `defface' font spec FN into a name (string)." ;;(message "generating name for %s" fn) (if (not (listp fn)) (format "%s" fn) @@ -1119,9 +1119,9 @@ ;; construct an assoc of (stripped-name . "{ css-stuff-here }") pairs ;; from a face: (defun hfy-face-to-css (fn) - "Take FN, a font or `defface' specification \(cf `face-attr-construct'\) + "Take FN, a font or `defface' specification (cf `face-attr-construct') and return a CSS style specification.\n -See also: `hfy-face-to-style'" +See also `hfy-face-to-style'." ;;(message "hfy-face-to-css");;DBUG (let ((css-list nil) (css-text nil) @@ -1140,7 +1140,7 @@ ;; extract a face from a list of char properties, if there is one: (defun hfy-p-to-face (props) - "Given PROPS, a list of text-properties, return the value of the face + "Given PROPS, a list of text properties, return the value of the face property, or nil." (if props (if (string= (car props) "face") @@ -1152,7 +1152,7 @@ nil)) (defun hfy-p-to-face-lennart (props) - "Given PROPS, a list of text-properties, return the value of the face + "Given PROPS, a list of text properties, return the value of the face property, or nil." (when props (let ((face (plist-get props 'face)) @@ -1230,8 +1230,8 @@ ;; -- v (defun hfy-face-at (p) "Find face in effect at point P. -If overlays are to be considered \(see `hfy-optimisations'\) then this may -return a defface style list of face properties instead of a face symbol." +If overlays are to be considered (see `hfy-optimisations') then this may +return a `defface' style list of face properties instead of a face symbol." ;;(message "hfy-face-at");;DBUG ;; Fix-me: clean up, remove face-name etc ;; not sure why we'd want to remove face-name? -- v @@ -1385,7 +1385,7 @@ (push (cons 'default (hfy-face-to-css 'default)) style))) (defun hfy-fontified-p () - "`font-lock' doesn't like to say it\'s been fontified when in batch + "`font-lock' doesn't like to say it's been fontified when in batch mode, but we want to know if we should fontify or raw copy, so in batch mode we check for non-default face properties. Otherwise we test variable `font-lock-mode' and variable `font-lock-fontified' for truth." @@ -1412,7 +1412,7 @@ this function merges adjacent style blocks which are of the same value and are separated by nothing more interesting than whitespace.\n <span class=\"foo\">narf</span> <span class=\"foo\">brain</span>\n -\(as interpreted from FACE-MAP\) would become:\n +\(as interpreted from FACE-MAP) would become:\n <span class=\"foo\">narf brain</span>\n Returns a modified copy of FACE-MAP." (let ((tmp-map face-map) @@ -1485,8 +1485,8 @@ (if (hfy-opt 'merge-adjacent-tags) (hfy-merge-adjacent-spans map) map))) (defun hfy-buffer () - "Generate a buffer to hold the html output. -The filename of this buffer is derived from the source \(current\) buffer\'s + "Generate a buffer to hold the HTML output. +The filename of this buffer is derived from the source (current) buffer's variable `buffer-file-name', if it is set, plus `hfy-extn'. Otherwise a plausible filename is constructed from `default-directory', `buffer-name' and `hfy-extn'." @@ -1536,7 +1536,7 @@ ;; tag all the dangerous characters we want to escape ;; (ie any "<> chars we _didn't_ put there explicitly for css markup) (defun hfy-html-enkludge-buffer () - "Mark dangerous [\"\<\>] characters with the \'hfy-quoteme property.\n + "Mark dangerous [\"<>] characters with the `hfy-quoteme' property.\n See also `hfy-html-dekludge-buffer'." ;;(message "hfy-html-enkludge-buffer");;DBUG (save-excursion @@ -1546,7 +1546,7 @@ ;; dangerous char -> &entity; (defun hfy-html-quote (char-string) - "Map CHAR-STRING to an html safe string (entity) if need be." + "Map CHAR-STRING to an HTML safe string (entity) if need be." ;;(message "hfy-html-quote");;DBUG (or (cadr (assoc char-string hfy-html-quote-map)) char-string) ) @@ -1556,8 +1556,8 @@ ;; enter any other text before we do this, we'd have to track another ;; map of offsets, which would be tedious... (defun hfy-html-dekludge-buffer () - "Transform all dangerous characters marked with the \'hfy-quoteme property -using `hfy-html-quote'\n + "Transform all dangerous characters marked with the `hfy-quoteme' property +using `hfy-html-quote'.\n See also `hfy-html-enkludge-buffer'." ;;(message "hfy-html-dekludge-buffer");;DBUG (save-excursion @@ -1774,7 +1774,7 @@ html-buffer)) (defun hfy-force-fontification () - "Try to force font-locking even when it is optimised away." + "Try to force font-locking even when it is optimized away." (run-hooks 'hfy-init-kludge-hook) (eval-and-compile (require 'font-lock)) (if (boundp 'font-lock-cache-position) @@ -1793,19 +1793,19 @@ (defun htmlfontify-buffer (&optional srcdir file) "Create a new buffer, named for the current buffer + a .html extension, -containing an inline css-stylesheet and formatted css-markup html +containing an inline CSS-stylesheet and formatted CSS-markup HTML that reproduces the look of the current Emacs buffer as closely as possible. -Dangerous characters in the existing buffer are turned into html -entities, so you should even be able to do html-within-html +Dangerous characters in the existing buffer are turned into HTML +entities, so you should even be able to do HTML-within-HTML fontified display. You should, however, note that random control or eight-bit characters such as ^L (\x0c) or ¤ (\xa4) won't get mapped yet. If the SRCDIR and FILE arguments are set, lookup etags derived -entries in the `hfy-tags-cache' and add html anchors and +entries in the `hfy-tags-cache' and add HTML anchors and hyperlinks as appropriate." (interactive) ;; pick up the file name in case we didn't receive it @@ -1836,22 +1836,22 @@ ;; fed pretty carefully, so it should be Ok: (defun hfy-dirname (file) "Return everything preceding the last \"/\" from a relative filename FILE, -on the assumption that this will produce a relative directory name. Hardly -bombproof, but good enough in the context in which it is being used." +on the assumption that this will produce a relative directory name. +Hardly bombproof, but good enough in the context in which it is being used." ;;(message "hfy-dirname");;DBUG (let ((f (directory-file-name file))) (and (string-match "^\\(.*\\)/" f) (match-string 1 f)))) ;; create a directory, cf mkdir -p (defun hfy-make-directory (dir) - "Approx equivalent of mkdir -p DIR." + "Approx. equivalent of mkdir -p DIR." ;;(message "hfy-make-directory");;DBUG (if (file-exists-p dir) (if (file-directory-p dir) t) (make-directory dir t))) (defun hfy-text-p (srcdir file) - "Is SRCDIR/FILE text? Uses `hfy-istext-command' to determine this." + "Is SRCDIR/FILE text? Uses `hfy-istext-command' to determine this." (let* ((cmd (format hfy-istext-command (expand-file-name file srcdir))) (rsp (shell-command-to-string cmd))) (if (string-match "text" rsp) t nil))) @@ -1903,7 +1903,7 @@ ;; mark the tags native to this file for anchors (defun hfy-mark-tag-names (srcdir file) - "Mark tags in FILE (lookup SRCDIR in `hfy-tags-cache') with the \'hfy-anchor + "Mark tags in FILE (lookup SRCDIR in `hfy-tags-cache') with the `hfy-anchor' property, with a value of \"tag.line-number\"." ;;(message "(hfy-mark-tag-names %s %s)" srcdir file);;DBUG (let ((cache-entry (assoc srcdir hfy-tags-cache)) @@ -1925,7 +1925,7 @@ (defun hfy-relstub (file &optional start) "Return a \"../\" stub of the appropriate length for the current source -tree depth \(as determined from FILE \(a filename\)\). +tree depth, as determined from FILE (a filename). START is the offset at which to start looking for the / character in FILE." ;;(message "hfy-relstub");;DBUG (let ((c "")) @@ -1933,8 +1933,8 @@ (setq start (1+ start)) (setq c (concat c "../"))) c)) (defun hfy-href-stub (this-file def-files tag) - "Return an href stub for a tag href i THIS-FILE: -If DEF-FILES \(list of files containing definitions for the tag in question\) + "Return an href stub for a tag href in THIS-FILE. +If DEF-FILES (list of files containing definitions for the tag in question) contains only one entry, the href should link straight to that file. Otherwise, the link should be to the index file.\n We are not yet concerned with the file extensions/tag line number and so on at @@ -1942,7 +1942,7 @@ If `hfy-split-index' is set, and the href wil be to an index file rather than a source file, append a .X to `hfy-index-file', where X is the uppercased first character of TAG.\n -See also: `hfy-relstub', `hfy-index-file'`'." +See also `hfy-relstub', `hfy-index-file'." ;;(message "hfy-href-stub");;DBUG ;; FIXME: Why not use something like ;; (file-relative-name (if ...) (file-name-directory this-file)) ? --Stef @@ -1957,7 +1957,7 @@ THIS-FILE `hfy-link-extn' `hfy-extn' DEF-FILES TAG and TAG-MAP\n THIS-FILE is the current source file DEF-FILES is a list of file containing possible link endpoints for TAG -TAG is the TAG in question +TAG is the tag in question TAG-MAP is the entry in `hfy-tags-cache'." ;;(message "hfy-href");;DBUG (concat @@ -1975,8 +1975,8 @@ ;; mark all tags for hyperlinking, except the tags at ;; their own points of definition, iyswim: (defun hfy-mark-tag-hrefs (srcdir file) - "Mark href start points with the \'hfy-link prop \(value: href string\)\n -Mark href end points with the \'hfy-endl prop \(value t\)\n + "Mark href start points with the `hfy-link' prop (value: href string).\n +Mark href end points with the `hfy-endl' prop (value t).\n Avoid overlapping links, and mark links in descending length of tag name in order to prevent subtags from usurping supertags, \(eg \"term\" for \"terminal\"). @@ -2134,7 +2134,7 @@ `hfy-tags-cache' must already have an entry for SRCDIR for this to work. `hfy-page-header', `hfy-page-footer', `hfy-link-extn' and `hfy-extn' all play a part here.\n -If STUB is set, prepare an \(appropriately named\) index buffer +If STUB is set, prepare an (appropriately named) index buffer specifically for entries beginning with STUB.\n If MAP is set, use that instead of `hfy-tags-cache'. FILENAME is the name of the file being indexed. @@ -2184,7 +2184,7 @@ index-buf) )) (defun hfy-prepare-index (srcdir dstdir) - "Return a list of index buffer\(s\), as determined by `hfy-split-index'. + "Return a list of index buffer(s), as determined by `hfy-split-index'. SRCDIR and DSTDIR are the source and output directories respectively." (if (not hfy-split-index) (list (hfy-prepare-index-i srcdir dstdir hfy-index-file nil)) @@ -2207,12 +2207,11 @@ index-list)) ))) cache-hash) ) index-list))) (defun hfy-prepare-tag-map (srcdir dstdir) - "Prepare the counterpart\(s\) to the index buffer\(s\) - a list of buffers -with the same structure, but listing \( and linking to \) instances of tags -\( as opposed to their definitions \).\n + "Prepare the counterpart(s) to the index buffer(s) - a list of buffers +with the same structure, but listing (and linking to) instances of tags +\(as opposed to their definitions).\n SRCDIR and DSTDIR are the source and output directories respectively. -See: `hfy-prepare-index' - `hfy-split-index'." +See also `hfy-prepare-index', `hfy-split-index'." (if (not hfy-split-index) (list (hfy-prepare-index-i srcdir dstdir @@ -2242,7 +2241,7 @@ (defun hfy-subtract-maps (srcdir) "Internal function - strips definitions of tags from the instance map. SRCDIR is the directory being \"published\". -See: `hfy-tags-cache' and `hfy-tags-rmap'" +See also `hfy-tags-cache', `hfy-tags-rmap'." (let ((new-list nil) (old-list nil) (def-list nil) @@ -2262,7 +2261,7 @@ (defun htmlfontify-run-etags (srcdir) "Load the etags cache for SRCDIR. -See `hfy-load-tags-cache'." +See also `hfy-load-tags-cache'." (interactive "D source directory: ") (setq srcdir (directory-file-name srcdir)) (hfy-load-tags-cache srcdir))
--- a/lisp/imenu.el Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/imenu.el Mon Jan 11 22:07:25 2010 +0000 @@ -596,7 +596,7 @@ ;;; Find all markers in alist and makes ;;; them point nowhere. ;;; The top-level call uses nil as the argument; -;;; non-nil arguments are in recursivecalls. +;;; non-nil arguments are in recursive calls. (defvar imenu--cleanup-seen) (defun imenu--cleanup (&optional alist) @@ -684,12 +684,15 @@ ;; in these major modes. But save that change for later. (cond ((and imenu-prev-index-position-function imenu-extract-index-name-function) - (let ((index-alist '()) + (let ((index-alist '()) (pos (point)) prev-pos name) (goto-char (point-max)) (imenu-progress-message prev-pos 0 t) ;; Search for the function (while (funcall imenu-prev-index-position-function) + (when (= pos (point)) + (error "Infinite loop at %s:%d: imenu-prev-index-position-function does not move point" (buffer-name) pos)) + (setq pos (point)) (imenu-progress-message prev-pos nil t) (save-excursion (setq name (funcall imenu-extract-index-name-function)))
--- a/lisp/man.el Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/man.el Mon Jan 11 22:07:25 2010 +0000 @@ -1500,7 +1500,9 @@ (string= chosen "")) default chosen))) - (Man-find-section (aheadsym Man-sections-alist))) + (unless (Man-find-section (aheadsym Man-sections-alist)) + (error "Section not found"))) + (defun Man-goto-see-also-section () "Move point to the \"SEE ALSO\" section.
--- a/lisp/progmodes/compile.el Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/progmodes/compile.el Mon Jan 11 22:07:25 2010 +0000 @@ -567,7 +567,12 @@ (defcustom compilation-read-command t "Non-nil means \\[compile] reads the compilation command to use. -Otherwise, \\[compile] just uses the value of `compile-command'." +Otherwise, \\[compile] just uses the value of `compile-command'. + +Note that changing this to nil may be a security risk, because a +file might define a malicious `compile-command' as a file local +variable, and you might not notice. Therefore, `compile-command' +is considered unsafe if this variable is nil." :type 'boolean :group 'compilation) @@ -603,7 +608,7 @@ (file-name-sans-extension buffer-file-name))))))" :type 'string :group 'compilation) -;;;###autoload(put 'compile-command 'safe-local-variable 'stringp) +;;;###autoload(put 'compile-command 'safe-local-variable (lambda (a) (and (stringp a) (or (not (boundp 'compilation-read-command)) compilation-read-command)))) ;;;###autoload (defcustom compilation-disable-input nil
--- a/lisp/progmodes/js.el Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/progmodes/js.el Mon Jan 11 22:07:25 2010 +0000 @@ -3320,6 +3320,7 @@ (let (font-lock-keywords) ; leaves syntactic keywords intact (font-lock-fontify-buffer))) +;;;###autoload (defalias 'javascript-mode 'js-mode) (eval-after-load 'folding
--- a/lisp/startup.el Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/startup.el Mon Jan 11 22:07:25 2010 +0000 @@ -2184,12 +2184,12 @@ (setq cl1-line (string-to-number (match-string 1 argi)) cl1-column (string-to-number (match-string 2 argi)))) - ((setq cl1-tem (assoc argi command-line-x-option-alist)) + ((setq cl1-tem (assoc orig-argi command-line-x-option-alist)) ;; Ignore X-windows options and their args if not using X. (setq command-line-args-left (nthcdr (nth 1 cl1-tem) command-line-args-left))) - ((setq cl1-tem (assoc argi command-line-ns-option-alist)) + ((setq cl1-tem (assoc orig-argi command-line-ns-option-alist)) ;; Ignore NS-windows options and their args if not using NS. (setq command-line-args-left (nthcdr (nth 1 cl1-tem) command-line-args-left)))
--- a/lisp/vc-bzr.el Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/vc-bzr.el Mon Jan 11 22:07:25 2010 +0000 @@ -361,6 +361,11 @@ ;; look there for the version information. (when (re-search-forward "file://\\(.+\\)" nil t) (let ((l-c-parent-dir (match-string 1))) + (when (and (memq system-type '(ms-dos windows-nt)) + (string-match-p "^/[[:alpha:]]:" l-c-parent-dir)) + ;;; On Windows, file:// URLs often have three slashes, + ;;; so we must remove the remaining one (bug#5345) + (setq l-c-parent-dir (substring l-c-parent-dir 1))) (setq branch-format-file (expand-file-name vc-bzr-admin-branch-format-file l-c-parent-dir))
--- a/lisp/version.el Fri Jan 08 02:43:41 2010 +0000 +++ b/lisp/version.el Mon Jan 11 22:07:25 2010 +0000 @@ -1,7 +1,7 @@ ;;; version.el --- record version number of Emacs -*- no-byte-compile: t -*- ;; Copyright (C) 1985, 1992, 1994, 1995, 1999, 2000, 2001, 2002, 2003, -;; 2004, 2005, 2006, 2007, 2008, 2009 +;; 2004, 2005, 2006, 2007, 2008, 2009, 2010 ;; Free Software Foundation, Inc. ;; Maintainer: FSF @@ -29,7 +29,7 @@ ;;; Code: -(defconst emacs-copyright "Copyright (C) 2009 Free Software Foundation, Inc." "\ +(defconst emacs-copyright "Copyright (C) 2010 Free Software Foundation, Inc." "\ Short copyright string for this version of Emacs.") (defconst emacs-version "23.1.91" "\
--- a/nextstep/ChangeLog Fri Jan 08 02:43:41 2010 +0000 +++ b/nextstep/ChangeLog Mon Jan 11 22:07:25 2010 +0000 @@ -1,3 +1,10 @@ +2010-01-11 Glenn Morris <rgm@gnu.org> + + * Cocoa/Emacs.base/Contents/Info.plist: + * Cocoa/Emacs.base/Contents/Resources/English.lproj/InfoPlist.strings: + * GNUstep/Emacs.base/Resources/Info-gnustep.plist: + Set copyright year to 2010. + 2009-09-23 Adrian Robert <Adrian.B.Robert@gmail.com> * README: Note GNUstep support is now Startup 0.23 or later.
--- a/nextstep/Cocoa/Emacs.base/Contents/Info.plist Fri Jan 08 02:43:41 2010 +0000 +++ b/nextstep/Cocoa/Emacs.base/Contents/Info.plist Mon Jan 11 22:07:25 2010 +0000 @@ -553,7 +553,7 @@ <key>CFBundleExecutable</key> <string>Emacs</string> <key>CFBundleGetInfoString</key> - <string>Emacs 23.1.91 Copyright (C) 2009 Free Software Foundation, Inc.</string> + <string>Emacs 23.1.91 Copyright (C) 2010 Free Software Foundation, Inc.</string> <key>CFBundleIconFile</key> <string>Emacs.icns</string> <key>CFBundleIdentifier</key>
--- a/nextstep/Cocoa/Emacs.base/Contents/Resources/English.lproj/InfoPlist.strings Fri Jan 08 02:43:41 2010 +0000 +++ b/nextstep/Cocoa/Emacs.base/Contents/Resources/English.lproj/InfoPlist.strings Mon Jan 11 22:07:25 2010 +0000 @@ -3,4 +3,4 @@ CFBundleName = "Emacs"; CFBundleShortVersionString = "Version 23.1.91"; CFBundleGetInfoString = "Emacs version 23.1.91, NS Windowing"; -NSHumanReadableCopyright = "Copyright (C) 2009 Free Software Foundation, Inc."; +NSHumanReadableCopyright = "Copyright (C) 2010 Free Software Foundation, Inc.";
--- a/nextstep/GNUstep/Emacs.base/Resources/Info-gnustep.plist Fri Jan 08 02:43:41 2010 +0000 +++ b/nextstep/GNUstep/Emacs.base/Resources/Info-gnustep.plist Mon Jan 11 22:07:25 2010 +0000 @@ -11,7 +11,7 @@ "Carl Edman (NeXTStep)", "..see http://emacs-app.sf.net/authorship.html" ); - Copyright = "Copyright (C) 2009 Free Software Foundation, Inc."; + Copyright = "Copyright (C) 2010 Free Software Foundation, Inc."; CopyrightDescription = "Released under the GNU General Public License Version 3 or later"; FullVersionID = "Emacs 23.1.91, NS Windowing"; NSExecutable = Emacs;
--- a/src/ChangeLog Fri Jan 08 02:43:41 2010 +0000 +++ b/src/ChangeLog Mon Jan 11 22:07:25 2010 +0000 @@ -1,3 +1,66 @@ +2010-01-11 Chong Yidong <cyd@stupidchicken.com> + + * nsterm.m (syms_of_nsterm): Initialize Qcontrol etc. before + initializing the Lisp variables that depend on them. + +2010-01-11 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * xfns.c (x_set_menu_bar_lines) [!USE_X_TOOLKIT && !USE_GTK]: + Clear areas that will not be updated after change of menu bar lines. + Clear the menu bar window's current matrix when the window gets empty. + +2010-01-09 Chong Yidong <cyd@stupidchicken.com> + + * intervals.h, textprop.c (extend_property_ranges): Return value + and args changed. Discard properties that begin at or after the + new end (Bug#5306). + + * editfns.c (Fformat): Caller changed. + + * nsterm.m (ns_set_default_prefs): Delete function. + (syms_of_nsterm): Initialize ns_command_modifier, + ns_control_modifier, ns_function_modifier, ns_antialias_text, and + ns_antialias_threshold here, not in ns_term_init (Bug#4113). + + * xdisp.c (pos_visible_p): Check for invisible text at the correct + position (Bug#4040). + +2010-01-09 Eli Zaretskii <eliz@gnu.org> + + * editfns.c (Ffloat_time): Doc fix. + +2010-01-09 Jan Djärv <jan.h.d@swipnet.se> + + * xfns.c (Fx_create_frame): Don't create frame larger than display + by default bug#3643. + +2010-01-09 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * frame.h (FRAME_TOP_MARGIN_HEIGHT): New macro. + (FRAME_LINE_TO_PIXEL_Y, FRAME_PIXEL_Y_TO_LINE): Take account of pseudo + windows above internal border. + + * window.h (WINDOW_MENU_BAR_P, WINDOW_TOOL_BAR_P): New macros. + (WINDOW_TOP_EDGE_Y, WINDOW_BOTTOM_EDGE_Y): Take account of pseudo + windows above internal border. + + * xdisp.c (get_glyph_string_clip_rects, init_glyph_string): Don't treat + tool bar windows specially. + + * xfns.c (x_set_tool_bar_lines): Take account of menu bar height. + + * xterm.c (x_after_update_window_line): Don't treat tool bar windows + specially. + (XTflash): Take account of menu bar height. + + * w32term.c (x_after_update_window_line): Don't treat tool bar windows + specially. + +2010-01-08 Jan Djärv <jan.h.d@swipnet.se> + + * dispnew.c (change_frame_size_1): newwidth == FRAME_COLS (f) must + also be true before we can return early (bug #5339). + 2010-01-06 David Reitter <david.reitter@gmail.com> * nsfns.m (ns_get_screen): Rewrite, returning NULL for non-NS. @@ -33,6 +96,7 @@ (xg_frame_resized, xg_frame_set_char_size): Call xg_clear_under_internal_border. (xg_update_scrollbar_pos): Clear under old scroll bar position. + 2010-01-05 Chong Yidong <cyd@stupidchicken.com> * keyboard.c (read_key_sequence): Catch keyboard switch after
--- a/src/dispnew.c Fri Jan 08 02:43:41 2010 +0000 +++ b/src/dispnew.c Mon Jan 11 22:07:25 2010 +0000 @@ -6340,8 +6340,11 @@ check_frame_size (f, &newheight, &newwidth); /* If we're not changing the frame size, quit now. */ + /* Frame width may be unchanged but the text portion may change, for example, + fullscreen and remove/add scroll bar. */ if (newheight == FRAME_LINES (f) - && new_frame_total_cols == FRAME_TOTAL_COLS (f)) + && newwidth == FRAME_COLS (f) // text portion unchanged + && new_frame_total_cols == FRAME_TOTAL_COLS (f)) // frame width unchanged return; BLOCK_INPUT;
--- a/src/editfns.c Fri Jan 08 02:43:41 2010 +0000 +++ b/src/editfns.c Mon Jan 11 22:07:25 2010 +0000 @@ -1574,7 +1574,8 @@ have the form (HIGH . LOW), but this is considered obsolete. WARNING: Since the result is floating point, it may not be exact. -Do not use this function if precise time stamps are required. */) +If precise time stamps are required, use either `current-time', +or (if you need time as a string) `format-time-string'. */) (specified_time) Lisp_Object specified_time; { @@ -4176,8 +4177,8 @@ len = make_number (SCHARS (args[n])); new_len = make_number (info[n].end - info[n].start); props = text_property_list (args[n], make_number (0), len, Qnil); - extend_property_ranges (props, len, new_len); - /* If successive arguments have properites, be sure that + props = extend_property_ranges (props, new_len); + /* If successive arguments have properties, be sure that the value of `composition' property be the copy. */ if (n > 1 && info[n - 1].end) make_composition_value_copy (props);
--- a/src/frame.h Fri Jan 08 02:43:41 2010 +0000 +++ b/src/frame.h Mon Jan 11 22:07:25 2010 +0000 @@ -590,6 +590,11 @@ #define FRAME_TOP_MARGIN(F) \ (FRAME_MENU_BAR_LINES (F) + FRAME_TOOL_BAR_LINES (F)) +/* Pixel height of the top margin above. */ + +#define FRAME_TOP_MARGIN_HEIGHT(f) \ + (FRAME_TOP_MARGIN (f) * FRAME_LINE_HEIGHT (f)) + /* Nonzero if this frame should display a menu bar in a way that does not use any text lines. */ #if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \ @@ -975,7 +980,7 @@ at ROW/COL. */ #define FRAME_LINE_TO_PIXEL_Y(f, row) \ - (FRAME_INTERNAL_BORDER_WIDTH (f) \ + ((row < FRAME_TOP_MARGIN (f) ? 0 : FRAME_INTERNAL_BORDER_WIDTH (f)) \ + (row) * FRAME_LINE_HEIGHT (f)) #define FRAME_COL_TO_PIXEL_X(f, col) \ @@ -1000,7 +1005,13 @@ the pixel on FRAME at Y/X. */ #define FRAME_PIXEL_Y_TO_LINE(f, y) \ - (((y) - FRAME_INTERNAL_BORDER_WIDTH (f)) \ + (((y) < FRAME_TOP_MARGIN_HEIGHT (f) \ + ? (y) \ + : ((y) < FRAME_TOP_MARGIN_HEIGHT (f) + FRAME_INTERNAL_BORDER_WIDTH (f) \ + ? (y) - (FRAME_TOP_MARGIN_HEIGHT (f) + FRAME_INTERNAL_BORDER_WIDTH (f) \ + /* Arrange for the division to round down. */ \ + + FRAME_LINE_HEIGHT (f) - 1) \ + : (y) - FRAME_INTERNAL_BORDER_WIDTH (f))) \ / FRAME_LINE_HEIGHT (f)) #define FRAME_PIXEL_X_TO_COL(f, x) \
--- a/src/intervals.h Fri Jan 08 02:43:41 2010 +0000 +++ b/src/intervals.h Mon Jan 11 22:07:25 2010 +0000 @@ -335,7 +335,7 @@ Lisp_Object text_property_list P_ ((Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object)); int add_text_properties_from_list P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); -void extend_property_ranges P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); +Lisp_Object extend_property_ranges P_ ((Lisp_Object, Lisp_Object)); Lisp_Object get_char_property_and_overlay P_ ((Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object*)); extern int text_property_stickiness P_ ((Lisp_Object prop, Lisp_Object pos,
--- a/src/nsterm.m Fri Jan 08 02:43:41 2010 +0000 +++ b/src/nsterm.m Mon Jan 11 22:07:25 2010 +0000 @@ -3479,22 +3479,6 @@ static void -ns_set_default_prefs () -/* -------------------------------------------------------------------------- - Initialize preference variables to defaults - -------------------------------------------------------------------------- */ -{ - ns_alternate_modifier = Qmeta; - ns_command_modifier = Qsuper; - ns_control_modifier = Qcontrol; - ns_function_modifier = Qnone; - ns_antialias_text = Qt; - ns_antialias_threshold = 10.0; /* not exposed to lisp side */ - ns_confirm_quit = Qnil; -} - - -static void ns_default (const char *parameter, Lisp_Object *result, Lisp_Object yesval, Lisp_Object noval, BOOL is_float, BOOL is_modstring) @@ -3756,8 +3740,6 @@ UNBLOCK_INPUT; - /* Read various user defaults. */ - ns_set_default_prefs (); if (!inhibit_x_resources) { ns_default ("GSFontAntiAlias", &ns_antialias_text, @@ -6159,6 +6141,22 @@ syms_of_nsterm () { NSTRACE (syms_of_nsterm); + + ns_antialias_threshold = 10.0; + + /* from 23+ we need to tell emacs what modifiers there are.. */ + DEFSYM (Qmodifier_value, "modifier-value"); + DEFSYM (Qalt, "alt"); + DEFSYM (Qhyper, "hyper"); + DEFSYM (Qmeta, "meta"); + DEFSYM (Qsuper, "super"); + DEFSYM (Qcontrol, "control"); + Fput (Qalt, Qmodifier_value, make_number (alt_modifier)); + Fput (Qhyper, Qmodifier_value, make_number (hyper_modifier)); + Fput (Qmeta, Qmodifier_value, make_number (meta_modifier)); + Fput (Qsuper, Qmodifier_value, make_number (super_modifier)); + Fput (Qcontrol, Qmodifier_value, make_number (ctrl_modifier)); + DEFVAR_LISP ("ns-input-file", &ns_input_file, "The file specified in the last NS event."); ns_input_file =Qnil; @@ -6200,26 +6198,32 @@ Set to control, meta, alt, super, or hyper means it is taken to be that key.\n\ Set to none means that the alternate / option key is not interpreted by Emacs\n\ at all, allowing it to be used at a lower level for accented character entry."); + ns_alternate_modifier = Qmeta; DEFVAR_LISP ("ns-command-modifier", &ns_command_modifier, "This variable describes the behavior of the command key.\n\ Set to control, meta, alt, super, or hyper means it is taken to be that key."); + ns_command_modifier = Qsuper; DEFVAR_LISP ("ns-control-modifier", &ns_control_modifier, "This variable describes the behavior of the control key.\n\ Set to control, meta, alt, super, or hyper means it is taken to be that key."); + ns_control_modifier = Qcontrol; DEFVAR_LISP ("ns-function-modifier", &ns_function_modifier, "This variable describes the behavior of the function key (on laptops).\n\ Set to control, meta, alt, super, or hyper means it is taken to be that key.\n\ Set to none means that the function key is not interpreted by Emacs at all,\n\ allowing it to be used at a lower level for accented character entry."); + ns_function_modifier = Qnone; DEFVAR_LISP ("ns-antialias-text", &ns_antialias_text, "Non-nil (the default) means to render text antialiased. Only has an effect on OS X Panther and above."); + ns_antialias_text = Qt; DEFVAR_LISP ("ns-confirm-quit", &ns_confirm_quit, "Whether to confirm application quit using dialog."); + ns_confirm_quit = Qnil; staticpro (&ns_display_name_list); ns_display_name_list = Qnil; @@ -6227,19 +6231,6 @@ staticpro (&last_mouse_motion_frame); last_mouse_motion_frame = Qnil; - /* from 23+ we need to tell emacs what modifiers there are.. */ - Qmodifier_value = intern ("modifier-value"); - Qalt = intern ("alt"); - Fput (Qalt, Qmodifier_value, make_number (alt_modifier)); - Qhyper = intern ("hyper"); - Fput (Qhyper, Qmodifier_value, make_number (hyper_modifier)); - Qmeta = intern ("meta"); - Fput (Qmeta, Qmodifier_value, make_number (meta_modifier)); - Qsuper = intern ("super"); - Fput (Qsuper, Qmodifier_value, make_number (super_modifier)); - Qcontrol = intern ("control"); - Fput (Qcontrol, Qmodifier_value, make_number (ctrl_modifier)); - /* TODO: move to common code */ DEFVAR_LISP ("x-toolkit-scroll-bars", &Vx_toolkit_scroll_bars, doc: /* If not nil, Emacs uses toolkit scroll bars. */);
--- a/src/textprop.c Fri Jan 08 02:43:41 2010 +0000 +++ b/src/textprop.c Mon Jan 11 22:07:25 2010 +0000 @@ -2028,24 +2028,41 @@ -/* Modify end-points of ranges in LIST destructively. LIST is a list - as returned from text_property_list. Change end-points equal to - OLD_END to NEW_END. */ +/* Modify end-points of ranges in LIST destructively, and return the + new list. LIST is a list as returned from text_property_list. + Discard properties that begin at or after NEW_END, and limit + end-points to NEW_END. */ -void -extend_property_ranges (list, old_end, new_end) - Lisp_Object list, old_end, new_end; +Lisp_Object +extend_property_ranges (list, new_end) + Lisp_Object list, new_end; { - for (; CONSP (list); list = XCDR (list)) + Lisp_Object prev = Qnil, head = list; + int max = XINT (new_end); + + for (; CONSP (list); prev = list, list = XCDR (list)) { - Lisp_Object item, end; + Lisp_Object item, beg, end; item = XCAR (list); + beg = XCAR (item); end = XCAR (XCDR (item)); - if (EQ (end, old_end)) + if (XINT (beg) >= max) + { + /* The start-point is past the end of the new string. + Discard this property. */ + if (EQ (head, list)) + head = XCDR (list); + else + XSETCDR (prev, XCDR (list)); + } + else if (XINT (end) > max) + /* The end-point is past the end of the new string. */ XSETCAR (XCDR (item), new_end); } + + return head; }
--- a/src/w32term.c Fri Jan 08 02:43:41 2010 +0000 +++ b/src/w32term.c Mon Jan 11 22:07:25 2010 +0000 @@ -734,11 +734,6 @@ { int y = WINDOW_TO_FRAME_PIXEL_Y (w, max (0, desired_row->y)); - /* Internal border is drawn below the tool bar. */ - if (WINDOWP (f->tool_bar_window) - && w == XWINDOW (f->tool_bar_window)) - y -= width; - BLOCK_INPUT; { HDC hdc = get_frame_dc (f);
--- a/src/window.h Fri Jan 08 02:43:41 2010 +0000 +++ b/src/window.h Mon Jan 11 22:07:25 2010 +0000 @@ -400,18 +400,32 @@ (FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \ + WINDOW_RIGHT_EDGE_COL (W) * WINDOW_FRAME_COLUMN_WIDTH (W)) +/* 1 if W is a menu bar window. */ + +#define WINDOW_MENU_BAR_P(W) \ + (WINDOWP (WINDOW_XFRAME (W)->menu_bar_window) \ + && (W) == XWINDOW (WINDOW_XFRAME (W)->menu_bar_window)) + +/* 1 if W is a tool bar window. */ + +#define WINDOW_TOOL_BAR_P(W) \ + (WINDOWP (WINDOW_XFRAME (W)->tool_bar_window) \ + && (W) == XWINDOW (WINDOW_XFRAME (W)->tool_bar_window)) + /* Return the frame y-position at which window W starts. This includes a header line, if any. */ #define WINDOW_TOP_EDGE_Y(W) \ - (FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \ + (((WINDOW_MENU_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \ + ? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \ + WINDOW_TOP_EDGE_LINE (W) * WINDOW_FRAME_LINE_HEIGHT (W)) /* Return the frame y-position before which window W ends. This includes a mode line, if any. */ #define WINDOW_BOTTOM_EDGE_Y(W) \ - (FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \ + (((WINDOW_MENU_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \ + ? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \ + WINDOW_BOTTOM_EDGE_LINE (W) * WINDOW_FRAME_LINE_HEIGHT (W))
--- a/src/xdisp.c Fri Jan 08 02:43:41 2010 +0000 +++ b/src/xdisp.c Mon Jan 11 22:07:25 2010 +0000 @@ -1363,7 +1363,7 @@ int top_x = it.current_x; int top_y = it.current_y; enum it_method it_method = it.method; - /* Calling line_bottom_y may change it.method. */ + /* Calling line_bottom_y may change it.method, it.position, etc. */ int bottom_y = (last_height = 0, line_bottom_y (&it)); int window_top_y = WINDOW_HEADER_LINE_HEIGHT (w); @@ -1378,7 +1378,7 @@ Lisp_Object window, prop; XSETWINDOW (window, w); - prop = Fget_char_property (make_number (it.position.charpos), + prop = Fget_char_property (make_number (charpos), Qinvisible, window); /* If charpos coincides with invisible text covered with an @@ -1981,12 +1981,6 @@ r.y = WINDOW_HEADER_LINE_HEIGHT (s->w); else r.y = max (0, s->row->y); - - /* If drawing a tool-bar window, draw it over the internal border - at the top of the window. */ - if (WINDOWP (s->f->tool_bar_window) - && s->w == XWINDOW (s->f->tool_bar_window)) - r.y -= FRAME_INTERNAL_BORDER_WIDTH (s->f); } r.y = WINDOW_TO_FRAME_PIXEL_Y (s->w, r.y); @@ -19424,12 +19418,6 @@ s->first_glyph = row->glyphs[area] + start; s->height = row->height; s->y = WINDOW_TO_FRAME_PIXEL_Y (w, row->y); - - /* Display the internal border below the tool-bar window. */ - if (WINDOWP (s->f->tool_bar_window) - && s->w == XWINDOW (s->f->tool_bar_window)) - s->y -= FRAME_INTERNAL_BORDER_WIDTH (s->f); - s->ybase = s->y + row->ascent; }
--- a/src/xfns.c Fri Jan 08 02:43:41 2010 +0000 +++ b/src/xfns.c Mon Jan 11 22:07:25 2010 +0000 @@ -1317,7 +1317,43 @@ #else /* not USE_X_TOOLKIT && not USE_GTK */ FRAME_MENU_BAR_LINES (f) = nlines; change_window_heights (f->root_window, nlines - olines); -#endif /* not USE_X_TOOLKIT */ + + /* If the menu bar height gets changed, the internal border below + the top margin has to be cleared. Also, if the menu bar gets + larger, the area for the added lines has to be cleared except for + the first menu bar line that is to be drawn later. */ + if (nlines != olines) + { + int height = FRAME_INTERNAL_BORDER_WIDTH (f); + int width = FRAME_PIXEL_WIDTH (f); + int y; + + /* height can be zero here. */ + if (height > 0 && width > 0) + { + y = FRAME_TOP_MARGIN_HEIGHT (f); + + BLOCK_INPUT; + x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), + 0, y, width, height, False); + UNBLOCK_INPUT; + } + + if (nlines > 1 && nlines > olines) + { + y = (olines == 0 ? 1 : olines) * FRAME_LINE_HEIGHT (f); + height = nlines * FRAME_LINE_HEIGHT (f) - y; + + BLOCK_INPUT; + x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), + 0, y, width, height, False); + UNBLOCK_INPUT; + } + + if (nlines == 0 && WINDOWP (f->menu_bar_window)) + clear_glyph_matrix (XWINDOW (f->menu_bar_window)->current_matrix); + } +#endif /* not USE_X_TOOLKIT && not USE_GTK */ adjust_glyphs (f); } @@ -1403,7 +1439,7 @@ { int height = FRAME_INTERNAL_BORDER_WIDTH (f); int width = FRAME_PIXEL_WIDTH (f); - int y = nlines * FRAME_LINE_HEIGHT (f); + int y = (FRAME_MENU_BAR_LINES (f) + nlines) * FRAME_LINE_HEIGHT (f); /* height can be zero here. */ if (height > 0 && width > 0) @@ -3396,6 +3432,45 @@ /* Compute the size of the X window. */ window_prompting = x_figure_window_size (f, parms, 1); + /* Don't make height higher than display height unless the user asked + for it. */ + height = FRAME_LINES (f); + tem = x_get_arg (dpyinfo, parms, Qheight, 0, 0, RES_TYPE_NUMBER); + if (EQ (tem, Qunbound)) + { + int ph = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, FRAME_LINES (f)); + int dph = DisplayHeight (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f)); + if (ph > dph) + { + height = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, dph) - + FRAME_TOOL_BAR_LINES (f) - FRAME_MENU_BAR_LINES (f); + if (FRAME_EXTERNAL_TOOL_BAR (f)) + height -= 2; /* We can't know how big it will be. */ + if (FRAME_EXTERNAL_MENU_BAR (f)) + height -= 2; /* We can't know how big it will be. */ + } + } + + /* Don't make width wider than display width unless the user asked + for it. */ + width = FRAME_COLS (f); + tem = x_get_arg (dpyinfo, parms, Qwidth, 0, 0, RES_TYPE_NUMBER); + if (EQ (tem, Qunbound)) + { + int pw = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, FRAME_COLS (f)); + int dpw = DisplayWidth (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f)); + if (pw > dpw) + width = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, dpw); + } + + if (height != FRAME_LINES (f) || width != FRAME_COLS (f)) + { + check_frame_size (f, &height, &width); + FRAME_LINES (f) = height; + SET_FRAME_COLS (f, width); + } + + tem = x_get_arg (dpyinfo, parms, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN); f->no_split = minibuffer_only || EQ (tem, Qt);
--- a/src/xterm.c Fri Jan 08 02:43:41 2010 +0000 +++ b/src/xterm.c Mon Jan 11 22:07:25 2010 +0000 @@ -753,11 +753,6 @@ { int y = WINDOW_TO_FRAME_PIXEL_Y (w, max (0, desired_row->y)); - /* Internal border is drawn below the tool bar. */ - if (WINDOWP (f->tool_bar_window) - && w == XWINDOW (f->tool_bar_window)) - y -= width; - BLOCK_INPUT; x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), 0, y, width, height, False); @@ -3062,7 +3057,7 @@ XFillRectangle (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), gc, flash_left, (FRAME_INTERNAL_BORDER_WIDTH (f) - + FRAME_TOOL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f)), + + FRAME_TOP_MARGIN_HEIGHT (f)), width, flash_height); XFillRectangle (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), gc, flash_left, @@ -3116,7 +3111,7 @@ XFillRectangle (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), gc, flash_left, (FRAME_INTERNAL_BORDER_WIDTH (f) - + FRAME_TOOL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f)), + + FRAME_TOP_MARGIN_HEIGHT (f)), width, flash_height); XFillRectangle (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), gc, flash_left,