# HG changeset patch # User Kenichi Handa # Date 1263268890 -32400 # Node ID b9e9be0fb18cdea32da9385cb6cd2b0623f8b44f # Parent 89ca5bbe8e711b1fdbb3f874242ffa6ac2ea1b61# Parent 2fb0437387259a052a7f808f3ce44b14959eb421 merge trunk diff -r 89ca5bbe8e71 -r b9e9be0fb18c doc/emacs/ChangeLog --- a/doc/emacs/ChangeLog Fri Jan 08 12:43:09 2010 +0100 +++ b/doc/emacs/ChangeLog Tue Jan 12 13:01:30 2010 +0900 @@ -1,3 +1,8 @@ +2010-01-11 Glenn Morris + + * display.texi (Highlight Interactively): `t' does not mean highlight + all patterns. (Bug#5335) + 2009-12-29 Chong Yidong * misc.texi (Shell): Document async-shell-command. diff -r 89ca5bbe8e71 -r b9e9be0fb18c doc/emacs/display.texi --- a/doc/emacs/display.texi Fri Jan 08 12:43:09 2010 +0100 +++ b/doc/emacs/display.texi Tue Jan 12 13:01:30 2010 +0900 @@ -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 diff -r 89ca5bbe8e71 -r b9e9be0fb18c doc/man/ChangeLog --- a/doc/man/ChangeLog Fri Jan 08 12:43:09 2010 +0100 +++ b/doc/man/ChangeLog Tue Jan 12 13:01:30 2010 +0900 @@ -1,3 +1,8 @@ +2010-01-09 Chong Yidong + + * emacs.1: Copyedits. Update options -Q, -mm and --daemon. Remove + deprecated --unibyte option. + 2009-06-21 Chong Yidong * Branch for 23.1. diff -r 89ca5bbe8e71 -r b9e9be0fb18c doc/man/emacs.1 --- a/doc/man/emacs.1 Fri Jan 08 12:43:09 2010 +0100 +++ b/doc/man/emacs.1 Tue Jan 12 13:01:30 2010 +0900 @@ -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 diff -r 89ca5bbe8e71 -r b9e9be0fb18c lib-src/ChangeLog --- a/lib-src/ChangeLog Fri Jan 08 12:43:09 2010 +0100 +++ b/lib-src/ChangeLog Tue Jan 12 13:01:30 2010 +0900 @@ -1,3 +1,9 @@ +2010-01-11 Glenn Morris + + * ebrowse.c (version): + * etags.c (print_version): + * rcs2log (Copyright): Set copyright year to 2010. + 2009-12-09 David Robinow (tiny change) * makefile.w32-in: Use parenthesis for macros for nmake diff -r 89ca5bbe8e71 -r b9e9be0fb18c lib-src/ebrowse.c --- a/lib-src/ebrowse.c Fri Jan 08 12:43:09 2010 +0100 +++ b/lib-src/ebrowse.c Tue Jan 12 13:01:30 2010 +0900 @@ -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); diff -r 89ca5bbe8e71 -r b9e9be0fb18c lib-src/etags.c --- a/lib-src/etags.c Fri Jan 08 12:43:09 2010 +0100 +++ b/lib-src/etags.c Tue Jan 12 13:01:30 2010 +0900 @@ -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); diff -r 89ca5bbe8e71 -r b9e9be0fb18c lib-src/rcs2log --- a/lib-src/rcs2log Fri Jan 08 12:43:09 2010 +0100 +++ b/lib-src/rcs2log Tue Jan 12 13:01:30 2010 +0900 @@ -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 @@ -22,7 +22,7 @@ # along with this program. If not, see . -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. diff -r 89ca5bbe8e71 -r b9e9be0fb18c lisp/ChangeLog --- a/lisp/ChangeLog Fri Jan 08 12:43:09 2010 +0100 +++ b/lisp/ChangeLog Tue Jan 12 13:01:30 2010 +0900 @@ -1,7 +1,96 @@ +2010-01-11 Sam Steingold + + * imenu.el (imenu-default-create-index-function): Detect infinite + loops caused by imenu-prev-index-position-function. + +2010-01-11 Juanma Barranquero + + * 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 + + * progmodes/js.el: Autoload javascript-mode alias. + +2010-01-11 Juanma Barranquero + + * 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 + + * version.el (emacs-copyright): Set copyright year to 2010. + +2010-01-10 Stefan Monnier + + * 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 + + * 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 + + * cedet/semantic/wisent/python-wy.el: + * cedet/semantic/wisent/python.el: New files. + +2010-01-09 Chong Yidong + + * man.el (Man-goto-section): Signal error if the section is not + found (Bug#5317). + +2010-01-09 Juanma Barranquero + + * 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 + + * 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 + + * startup.el (command-line-1): Use orig-argi to check for ignored X and + NS options. + 2010-01-08 Kenichi Handa - * 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 @@ -21,8 +110,8 @@ 2010-01-05 Tom Tromey - * 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 @@ -31,8 +120,7 @@ 2010-01-05 Kenichi Handa - * 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 @@ -57,8 +145,8 @@ 2010-01-02 Daniel Elliott (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 - * 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 - * 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 @@ -107,10 +195,10 @@ 2010-01-02 Eli Zaretskii - * 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 @@ -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. diff -r 89ca5bbe8e71 -r b9e9be0fb18c lisp/Makefile.in --- a/lisp/Makefile.in Fri Jan 08 12:43:09 2010 +0100 +++ b/lisp/Makefile.in Tue Jan 12 13:01:30 2010 +0900 @@ -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 \ diff -r 89ca5bbe8e71 -r b9e9be0fb18c lisp/cedet/semantic.el --- a/lisp/cedet/semantic.el Fri Jan 08 12:43:09 2010 +0100 +++ b/lisp/cedet/semantic.el Tue Jan 12 13:01:30 2010 +0900 @@ -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) diff -r 89ca5bbe8e71 -r b9e9be0fb18c lisp/cedet/semantic/wisent/python-wy.el --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/cedet/semantic/wisent/python-wy.el Tue Jan 12 13:01:30 2010 +0900 @@ -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 . + +;;; 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 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-analyzer + "keyword analyzer for tokens." + "\\(\\sw\\|\\s_\\)+") + +(define-lex-block-type-analyzer wisent-python-wy---block-analyzer + "block analyzer for tokens." + "\\s(\\|\\s)" + '((("(" LPAREN PAREN_BLOCK) + ("{" LBRACE BRACE_BLOCK) + ("[" LBRACK BRACK_BLOCK)) + (")" RPAREN) + ("}" RBRACE) + ("]" RBRACK)) + ) + +(define-lex-regex-type-analyzer wisent-python-wy---regexp-analyzer + "regexp analyzer for tokens." + "\\(\\sw\\|\\s_\\)+" + nil + 'NAME) + +(define-lex-regex-type-analyzer wisent-python-wy---regexp-analyzer + "regexp analyzer for tokens." + semantic-lex-number-expression + nil + 'NUMBER_LITERAL) + +(define-lex-string-type-analyzer wisent-python-wy---string-analyzer + "string analyzer for 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 diff -r 89ca5bbe8e71 -r b9e9be0fb18c lisp/cedet/semantic/wisent/python.el --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/cedet/semantic/wisent/python.el Tue Jan 12 13:01:30 2010 +0900 @@ -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 +;; Maintainer: Richard Kim +;; 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 . + +;;; 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---regexp-analyzer + wisent-python-wy---keyword-analyzer + wisent-python-wy---regexp-analyzer + wisent-python-wy---block-analyzer + wisent-python-wy---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 diff -r 89ca5bbe8e71 -r b9e9be0fb18c lisp/ffap.el --- a/lisp/ffap.el Fri Jan 08 12:43:09 2010 +0100 +++ b/lisp/ffap.el Tue Jan 12 13:01:30 2010 +0900 @@ -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 \"\". @@ -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 ))) diff -r 89ca5bbe8e71 -r b9e9be0fb18c lisp/format.el --- a/lisp/format.el Fri Jan 08 12:43:09 2010 +0100 +++ b/lisp/format.el Tue Jan 12 13:01:30 2010 +0900 @@ -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))))) diff -r 89ca5bbe8e71 -r b9e9be0fb18c lisp/gnus/ChangeLog --- a/lisp/gnus/ChangeLog Fri Jan 08 12:43:09 2010 +0100 +++ b/lisp/gnus/ChangeLog Tue Jan 12 13:01:30 2010 +0900 @@ -1,3 +1,8 @@ +2010-01-08 Jason Rumney + + * sieve-manage.el (sieve-manage-parse-capability-1): Loosely match OK + response. + 2010-01-06 Katsumi Yamaoka * gnus-art.el (gnus-article-describe-bindings): Work for prefix keys. diff -r 89ca5bbe8e71 -r b9e9be0fb18c lisp/gnus/sieve-manage.el --- a/lisp/gnus/sieve-manage.el Fri Jan 08 12:43:09 2010 +0100 +++ b/lisp/gnus/sieve-manage.el Tue Jan 12 13:01:30 2010 +0900 @@ -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) diff -r 89ca5bbe8e71 -r b9e9be0fb18c lisp/htmlfontify.el --- a/lisp/htmlfontify.el Fri Jan 08 12:43:09 2010 +0100 +++ b/lisp/htmlfontify.el Tue Jan 12 13:01:30 2010 +0900 @@ -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 \\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 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 \'