Revision: miles@gnu.org--gnu-2004/emacs--unicode--0--patch-79

Merge from emacs--cvs-trunk--0

Patches applied:

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-735
 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-747
   Update from CVS
This commit is contained in:
Miles Bader 2004-12-25 02:00:25 +00:00
commit 6a89b7e95a
76 changed files with 2287 additions and 1411 deletions

View file

@ -57,7 +57,7 @@ Trying 192.87.102.36...
Connected to ftp.nluug.nl.
Ange-ftp chokes on the `No route to host' message and doesn't look any
further.
further.
I think in the near future we will see more of this problem, so it might be
time to make anfe-ftp more intelligent.
@ -112,6 +112,28 @@ we come to mark the http buffers as dead.
* REDISPLAY RELATED BUGS
** Strange text scrolling with Emacs + GTK
> I could reproduce the problem with the latest CVS.
>
> % emacs -Q
> M-x info RET
> M->
> C-l
> C-x ( C-u - 1 C-v C-x )
> C-x e e e e ...
>
> I see the problem around "CC mode" and "Forms".
It is not specific for the first line of a buffer.
Rather it happens for lines which are indented but the
indentation is controlled by a display property and
the newline is part of that display property -- in
that case, the indentation is not recognized for the
first display line.
** Avoid unbreakable loops in redisplay.
Redisplay may loop if there is an error in some display property, e.g.

543
configure vendored

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,11 @@
2004-12-21 Richard M. Stallman <rms@gnu.org>
* DISTRIB: Don't say "freeware".
2004-12-15 Nick Roberts <nickrob@snap.net.nz>
* DEBUG: Change printing example to break on a procedure name.
2004-12-11 Dan Nicolaescu <dann@ics.uci.edu>
* e/eterm.ti: Add rs1.

View file

@ -107,36 +107,32 @@ objects which you can examine in turn with the x... commands.
Even with a live process, these x... commands are useful for
examining the fields in a buffer, window, process, frame or marker.
Here's an example using concepts explained in the node "Value History"
of the GDB manual to print the variable frame from this line in
xmenu.c:
buf.frame_or_window = frame;
First, use these commands:
of the GDB manual to print values associated with the variable
called frame. First, use these commands:
cd src
gdb emacs
b xmenu.c:1296
b set_frame_buffer_list
r -q
Then type C-x 5 2 to create a new frame, and it hits the breakpoint:
Then when Emacs it hits the breakpoint:
(gdb) p frame
$1 = 1077872640
$1 = 139854428
(gdb) xtype
Lisp_Vectorlike
PVEC_FRAME
(gdb) xframe
$2 = (struct frame *) 0x3f0800
$2 = (struct frame *) 0x8560258
(gdb) p *$
$3 = {
size = 536871989,
next = 0x366240,
name = 809661752,
size = 1073742931,
next = 0x85dfe58,
name = 140615219,
[...]
}
(gdb) p $3->name
$4 = 809661752
$4 = 140615219
Now we can use `pr' to print the name of the frame:

View file

@ -83,7 +83,7 @@ product and divide it by five, that is a good amount.
If you like GNU Emacs, please express your satisfaction with a
donation: send me or the Foundation what you feel Emacs has been worth
to you. If you are glad that I developed GNU Emacs and distribute it
as freeware, rather than following the obstructive and antisocial
as free software, rather than following the obstructive and antisocial
practices typical of software developers, reward me. If you would
like the Foundation to develop more free software, contribute.

View file

@ -173,27 +173,45 @@ types any more. Add -DUSE_LISP_UNION_TYPE if you want union types.
* Changes in Emacs 21.4
** You can now follow links by clicking Mouse-1 on the link.
Traditionally, Emacs uses a Mouse-1 click to set point and a Mouse-2
click to follow a link, whereas most other applications use a Mouse-1
click for both purposes, depending on whether you click outside or
inside a link. With release 21.4, the behaviour of a Mouse-1 click
has been changed to match this context-sentitive dual behaviour.
Depending on the current mode, a Mouse-2 click in Emacs may do much
more than just follow a link, so the new Mouse-1 behaviour is only
activated for modes which explicitly mark a clickable text as a "link"
(see the new function `mouse-on-link-p' for details). The lisp
packages that are included in release 21.4 have been adapted to do
this, but external packages may not yet support this. However, there
is no risk in using such packages, as the worst thing that could
happen is that you get the original Mouse-1 behaviour when you click
on a link, which typically means that you set point where you click.
If you want to get the original Mouse-1 action also inside a link, you
just need to press the Mouse-1 button a little longer than a normal
click (i.e. press and hold the Mouse-1 button for half a second before
you release it).
Dragging the Mouse-1 inside a link still performs the original
drag-mouse-1 action, typically copy the text.
You can customize the new Mouse-1 behaviour via the new user option
`mouse-1-click-follows-link'.
+++
** When the undo information of the current command gets really large
(beyond the value of `undo-outer-limit'), Emacs asks you whether to
discard it or keep it.
** line-move-ignore-invisible now defaults to t.
** In Outline mode, hide-body no longer hides lines at the top
of the file that precede the first header line.
+++
** `set-auto-mode' now gives the interpreter magic line (if present)
precedence over the file name. Likewise an <?xml or <!DOCTYPE declaration
will give the buffer XML or SGML mode, based on the new var
`magic-mode-alist'.
+++
** New function `looking-back' checks whether a regular expression matches
the text before point. Specifying the LIMIT argument bounds how far
back the match can start; this is a way to keep it from taking too long.
+++
** New functions `make-progress-reporter', `progress-reporter-update',
`progress-reporter-force-update' and `progress-reporter-done' provide
a simple and efficient way of printing progress messages to the user.
+++
** In Enriched mode, `set-left-margin' and `set-right-margin' are now
by default bound to `C-c [' and `C-c ]' instead of the former `C-c C-l'
@ -1160,9 +1178,11 @@ All regular expression replacement commands now allow `\?' in the
replacement string to specify a position where the replacement string
can be edited for each replacement.
** query-replace uses isearch highlighting with lazy highlighting
when the user option `query-replace-highlight' is set to `isearch'.
If it is t, it uses old query-replace highlighting method.
** query-replace uses isearch lazy highlighting when the new user option
`query-replace-lazy-highlight' is non-nil.
** The current match in query-replace is highlighted in new face
`query-replace' which by default inherits from isearch face.
+++
** Emacs normally highlights mouse sensitive text whenever the mouse
@ -1497,9 +1517,8 @@ previous mark, i.e. C-u C-SPC C-SPC C-SPC ... cycles through the
mark ring. Use C-u C-u C-SPC to set the mark immediately after a jump.
** Movement commands `beginning-of-buffer', `end-of-buffer',
`beginning-of-defun', `end-of-defun' do not set the mark if the new
option `inhibit-mark-movement' is non-nil, or if the mark is already
active in Transient Mark mode.
`beginning-of-defun', `end-of-defun' do not set the mark if the mark
is already active in Transient Mark mode.
+++
** In the *Occur* buffer, `o' switches to it in another window, and
@ -2446,11 +2465,33 @@ configuration files.
* Lisp Changes in Emacs 21.4
** Lisp code can now test if a given buffer position is inside a
clickable link with the new function `mouse-on-link-p'. This is the
function used by the new `mouse-1-click-follows-link' functionality.
+++
** (while-no-input BODY...) runs BODY, but only so long as no input
arrives. If the user types or clicks anything, BODY stops as if a
quit had occurred. while-no-input returns the value of BODY, if BODY
finishes. It returns nil if BODY was aborted.
+++
** `set-auto-mode' now gives the interpreter magic line (if present)
precedence over the file name. Likewise an <?xml or <!DOCTYPE declaration
will give the buffer XML or SGML mode, based on the new var
`magic-mode-alist'.
+++
** New function `looking-back' checks whether a regular expression matches
the text before point. Specifying the LIMIT argument bounds how far
back the match can start; this is a way to keep it from taking too long.
+++
** New functions `make-progress-reporter', `progress-reporter-update',
`progress-reporter-force-update' and `progress-reporter-done' provide
a simple and efficient way for a command to present progress messages
for the user.
---
** To manipulate the File menu using easy-menu, you must specify the
proper name "file". In previous Emacs versions, you had to specify

View file

@ -1,3 +1,8 @@
2004-12-15 Andreas Schwab <schwab@suse.de>
* etags.c (main): Fix typo in conversion of LONG_OPTIONS from
preprocessing to compile time constant.
2004-11-17 Kim F. Storm <storm@cua.dk>
* etags.c: Undo last change.

View file

@ -1,5 +1,5 @@
/* Tags file maker to go with GNU Emacs -*- coding: latin-1 -*-
Copyright (C) 1984, 1987-1989, 1993-1995, 1998-2001, 2002
Copyright (C) 1984, 1987-1989, 1993-1995, 1998-2001, 2002, 2004
Free Software Foundation, Inc. and Ken Arnold
This file is not considered part of GNU Emacs.
@ -1183,7 +1183,7 @@ main (argc, argv)
#ifdef ETAGS_REGEXPS
optstring = "-r:Rc:";
#endif /* ETAGS_REGEXPS */
if (LONG_OPTIONS)
if (!LONG_OPTIONS)
optstring += 1;
optstring = concat (optstring,
"Cf:Il:o:SVhH",

View file

@ -1,3 +1,280 @@
2004-12-24 Thien-Thi Nguyen <ttn@gnu.org>
* progmodes/hideshow.el: Require `cl' when compiling.
Remove XEmacs and Emacs 19 compatibility.
Use `dolist' and `add-to-list' for load-time actions.
(hs-discard-overlays): Use `dolist'.
(hs-show-block): Likewise.
2004-12-23 Dan Nicolaescu <dann@ics.uci.edu>
* faces.el (mode-line, mode-line-inactive): Use min-colors.
2004-12-23 Thien-Thi Nguyen <ttn@gnu.org>
* progmodes/hideshow.el (hs-inside-comment-p): Fix omission bug:
When extending backwards, move outside the current comment first.
2004-12-22 Kenichi Handa <handa@m17n.org>
* international/quail.el (quail-start-translation): Fix prompt
string for the case if input-method-use-echo-area being non-nil.
(quail-start-conversion): Likewise.
(quail-show-guidance): Don't show guidance if
input-method-use-echo-area is non-nil.
2004-12-21 Richard M. Stallman <rms@gnu.org>
* textmodes/ispell.el (ispell-help): Bind resize-mini-windows.
2004-12-21 Markus Rost <rost@ias.edu>
* calendar/diary-lib.el (mark-diary-entries): Set
mark-diary-entries-in-calendar only after checking for diary-file.
2004-12-21 Richard M. Stallman <rms@gnu.org>
* faces.el (escape-glyph): Use blue against light foreground.
* simple.el (undo-outer-limit-truncate): New function.
(undo-outer-limit-function): Use undo-outer-limit-truncate.
2004-12-21 Eli Barzilay <eli@barzilay.org>
* calculator.el: (calculator-radix-grouping-mode)
(calculator-radix-grouping-digits)
(calculator-radix-grouping-separator):
New defcustoms for the new radix grouping mode functionality.
(calculator-mode-hook): Now used in electric mode too.
(calculator-mode-map): Some new keys.
(calculator-message): New function. Some new calls.
(calculator-string-to-number): New function,
(calculator-curnum-value): Use it.
(calculator-rotate-displayer, calculator-rotate-displayer-back)
(calculator-displayer-prev, calculator-displayer-next):
Change digit group size when in radix mode.
(calculator-number-to-string): Renamed from calculator-num-to-string.
Now deals with digit grouping in radix mode.
2004-12-20 Glenn Morris <gmorris@ast.cam.ac.uk>
* calendar/calendar.el (view-other-diary-entries): Add autoload.
* calendar/diary-lib.el (view-other-diary-entries): Use
current-prefix-arg in interactive spec.
2004-12-19 Jay Belanger <belanger@truman.edu>
* calc/calc-aent.el (calcAlg-blank-matching-open):
Temporarily adjust the syntax of both delimiters of half-open
intervals.
2004-12-19 Kim F. Storm <storm@cua.dk>
* mouse.el (mouse-1-click-follows-link): Doc fix.
2004-12-18 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
* term/mac-win.el (encoding-vector, mac-font-encoder-list)
(ccl-encode-mac-centraleurroman-font): Use centraleurroman
instead of centraleuropean as the name
2004-12-17 Michael Albinus <michael.albinus@gmx.de>
Sync with Tramp 2.0.46.
* net/tramp.el (tramp-maybe-send-perl-script): Change order of
parameters wrt Tramp convention.
(tramp-handle-file-attributes-with-perl)
(tramp-handle-directory-files-and-attributes): Apply it.
(tramp-do-copy-or-rename-file-out-of-band): Check for existence of
`copy-program'. Reported by Zack Weinberg
<zack@codesourcery.com>.
(top): Set `edebug-form-spec' property directly rather than
calling `def-edebug-spec'.
* net/tramp-smb.el (tramp-smb-advice-PC-do-completion): Make the
advice less fragile. Surround temporary redefinition of
`substitute-in-file-name' with `unwind-protect'. Suggested by
Matt Hodges <MPHodges@member.fsf.org>.
2004-12-17 Juri Linkov <juri@jurta.org>
* replace.el (occur-accumulate-lines, occur-engine):
Make forcing deferred font-lock fontification jit-specific.
2004-12-17 Kim F. Storm <storm@cua.dk>
* mouse.el (mouse-1-click-follows-link): New defcustom.
(mouse-on-link-p): New function.
(mouse-drag-region-1): Implement mouse-1-click-follows-link
functionality. Map a mouse-1 click event into a mouse-2 (or
other) event when position is inside a link.
* tooltip.el (tooltip-show-help-function): Replace "mouse-2"
prefix in tooltip text with "mouse-1" when this is a link
recognized by mouse-1-click-follows-link functionality.
* help.el (describe-key): Report effective and original binding
for mouse-1 when clicked on a link.
(describe-mode): Add follow-link property to "minor-mode" button.
* help-fns.el (describe-variable): Add follow-link property to
"below" button.
* help-mode.el (help-xref): Add follow-link property.
* apropos.el (apropos-symbol, apropos-function, apropos-macro)
(apropos-command, apropos-variable, apropos-face, apropos-group)
(apropos-widget, apropos-plist): Add follow-link property.
* pcvs-defs.el (cvs-mode-map): Map follow-link to a function which
checks if position is in a filename, rather than some other
clickable item. Function looks for cvs-filename-face at position.
* wid-edit.el (widget-specify-field, widget-specify-button):
Map a :follow-link keyword into a follow-link property.
(link): Add :follow-link keyword, map to RET binding.
* dired.el (dired-mode-map): Map follow-link to mouse-face.
* progmodes/compile.el (compilation-minor-mode-map)
(compilation-button-map, compilation-mode-map): Likewise.
2004-12-17 Thien-Thi Nguyen <ttn@gnu.org>
* play/zone.el (zone): Init `line-spacing' from orig buffer.
(zone-replace-char): Take `count' and `del-count'
instead of `direction'. Update callers. When `del-count' is
non-nil, delete that many characters, otherwise `count' characters
backwards. Insert the newly-replaced string `count' times.
(zone-fret): Handle chars w/ width greater than one.
(zone-fall-through-ws): No longer take window width `ww'.
Update callers. Add handling for `char-width' greater than one.
(zone-pgm-drip): Update var holding window-end position every cycle.
2004-12-17 Andre Spiegel <spiegel@gnu.org>
* vc.el (vc-default-update-changelog): Use insert-file-contents,
rather than insert-file.
2004-12-16 Jay Belanger <belanger@truman.edu>
* calc/calc-comb.el (var-RandSeed): Don't initially bind it.
(math-init-random-base, math-random-digit): Check to see if
var-RandSeed is bound.
(math-random-last): Declare it.
(math-random-digit): Don't make math-random-last local.
2004-12-16 Thien-Thi Nguyen <ttn@gnu.org>
* play/zone.el (zone): Fix omission bug: Use a self-disabling
one-shot thunk for uniform (error, quit, normal) recovery.
Reported by John Paul Wallington.
(zone-pgm-random-life): Fix bug:
Recognize empty initial field by lack of "@" chars.
2004-12-16 Juri Linkov <juri@jurta.org>
* help.el (function-called-at-point):
* help-fns.el (variable-at-point): As a last resort try striping
non-word prefixes and suffixes.
* descr-text.el (describe-property-list): Don't treat syntax-table
specially. Use describe-text-sexp which inserts [show] button
for large objects and handles printing errors. Sort properties
by names in alphabetical order instead of by value sizes.
Add `mouse-face' to list of properties for `describe-face' widget.
(describe-char): Mask out face-id from 19 bits of character.
Print face-id separately.
* replace.el (occur-accumulate-lines, occur-engine):
Fontify unfontified matching lines in the source buffer
before copying them.
(occur-engine): Don't put mouse-face on context lines.
(occur-next-error): Set point to line beginning/end
before searching for prev/next property to skip multiple
matches on a line (not supported by occur engine).
Remove redundant prefix-numeric-value.
2004-12-15 Juri Linkov <juri@jurta.org>
* replace.el (match): New face.
(list-matching-lines-face): Change default from `bold' to `match'.
* progmodes/grep.el (grep-match-face): New defvar.
(grep-mode-font-lock-keywords): Use grep-match-face instead of
compilation-column-face to highlight grep matches.
* apropos.el (apropos-match-face): Change default from
`secondary-selection' to `match'.
* info-look.el (info-lookup-highlight-face): Change default from
`highlight' to `match'.
2004-12-15 Daniel Pfeiffer <occitan@esperanto.org>
* progmodes/executable.el (executable-interpret): Eliminate
obsolete compile-internal, and switch to comint for interaction.
2004-12-15 J.D. Smith <jdsmith@as.arizona.edu>
* progmodes/idlwave.el (idlwave-skip-multi-commands): Don't match
`&&' when skipping multiple statements on a line.
2004-12-15 Thien-Thi Nguyen <ttn@gnu.org>
* play/zone.el (zone): Set `truncate-lines'.
Also, init `tab-width' with value from original buffer.
(zone-shift-up): Rewrite for speed.
(zone-shift-down, zone-shift-left, zone-shift-right): Likewise.
(zone-pgm-jitter): Remove redundant entries from ops vector.
(zone-exploding-remove): Reduce iteration count.
(zone-cpos): Convert to defsubst.
(zone-replace-char): New defsubst.
(zone-park/sit-for): Likewise.
(zone-fret): Take window-start arg.
Update callers. Use `zone-park/sit-for'.
(zone-fill-out-screen): Rewrite.
(zone-fall-through-ws): Likewise. Update callers.
(zone-pgm-drip): Use `zone-replace-char'.
Move var inits before while-loop. Use `zone-park/sit-for'.
(zone-pgm-random-life): Handle empty initial field.
Use `zone-replace-char' and `zone-park/sit-for'.
2004-12-15 Juri Linkov <juri@jurta.org>
* isearch.el (isearch-update): Test isearch-lazy-highlight
before calling isearch-lazy-highlight-new-loop.
(isearch-lazy-highlight-new-loop):
Don't test isearch-lazy-highlight.
* replace.el (perform-replace): Add isearch-case-fold-search.
Use delimited-flag for isearch-regexp.
Reset isearch-lazy-highlight-last-string to force lazy
highlighting when called from isearch mode.
(query-replace-highlight): Revert defcustom type to boolean.
(query-replace-lazy-highlight): New defcustom.
(query-replace): New face.
(perform-replace, replace-highlight, replace-dehighlight):
Test query-replace-lazy-highlight instead of special value
`isearch' of query-replace-highlight.
(replace-dehighlight): Don't call isearch-dehighlight.
(replace-highlight): Don't call isearch-highlight.
Use face `query-replace' unconditionally.
2004-12-14 Kim F. Storm <storm@cua.dk>
* simple.el (inhibit-mark-movement): Remove defvar.
(beginning-of-buffer, end-of-buffer): Don't use it.
* emacs-lisp/lisp.el (beginning-of-defun, end-of-defun): Don't
use inhibit-mark-movement.
* emulation/cua-base.el (cua--preserve-mark-commands): Remove.
(cua--undo-push-mark): Remove.
(cua--pre-command-handler, cua--post-command-handler): Don't
fiddle with inhibit-mark-movement.
2004-12-14 Juri Linkov <juri@jurta.org>
* buff-menu.el (list-buffers-noselect): Collect internal info

View file

@ -96,7 +96,7 @@ turns off mouse highlighting."
:group 'apropos
:type 'face)
(defcustom apropos-match-face 'secondary-selection
(defcustom apropos-match-face 'match
"*Face for matching text in Apropos documentation/value, or nil for none.
This applies when you look for matches in the documentation or variable value
for the regexp; the part that matches gets displayed in this font."
@ -163,6 +163,7 @@ term, and the rest of the words are alternative terms.")
(define-button-type 'apropos-symbol
'face apropos-symbol-face
'help-echo "mouse-2, RET: Display more help on this symbol"
'follow-link t
'action #'apropos-symbol-button-display-help
'skip t)
@ -174,19 +175,24 @@ term, and the rest of the words are alternative terms.")
(define-button-type 'apropos-function
'apropos-label "Function"
'help-echo "mouse-2, RET: Display more help on this function"
'follow-link t
'action (lambda (button)
(describe-function (button-get button 'apropos-symbol)))
'help-echo "mouse-2, RET: Display more help on this function")
(describe-function (button-get button 'apropos-symbol))))
(define-button-type 'apropos-macro
'apropos-label "Macro"
'help-echo "mouse-2, RET: Display more help on this macro"
'follow-link t
'action (lambda (button)
(describe-function (button-get button 'apropos-symbol)))
'help-echo "mouse-2, RET: Display more help on this macro")
(describe-function (button-get button 'apropos-symbol))))
(define-button-type 'apropos-command
'apropos-label "Command"
'help-echo "mouse-2, RET: Display more help on this command"
'follow-link t
'action (lambda (button)
(describe-function (button-get button 'apropos-symbol)))
'help-echo "mouse-2, RET: Display more help on this command")
(describe-function (button-get button 'apropos-symbol))))
;; We used to use `customize-variable-other-window' instead for a
;; customizable variable, but that is slow. It is better to show an
@ -196,18 +202,21 @@ term, and the rest of the words are alternative terms.")
(define-button-type 'apropos-variable
'apropos-label "Variable"
'help-echo "mouse-2, RET: Display more help on this variable"
'follow-link t
'action (lambda (button)
(describe-variable (button-get button 'apropos-symbol))))
(define-button-type 'apropos-face
'apropos-label "Face"
'help-echo "mouse-2, RET: Display more help on this face"
'follow-link t
'action (lambda (button)
(describe-face (button-get button 'apropos-symbol))))
(define-button-type 'apropos-group
'apropos-label "Group"
'help-echo "mouse-2, RET: Display more help on this group"
'follow-link t
'action (lambda (button)
(customize-group-other-window
(button-get button 'apropos-symbol))))
@ -215,12 +224,14 @@ term, and the rest of the words are alternative terms.")
(define-button-type 'apropos-widget
'apropos-label "Widget"
'help-echo "mouse-2, RET: Display more help on this widget"
'follow-link t
'action (lambda (button)
(widget-browse-other-window (button-get button 'apropos-symbol))))
(define-button-type 'apropos-plist
'apropos-label "Plist"
'help-echo "mouse-2, RET: Display more help on this plist"
'follow-link t
'action (lambda (button)
(apropos-describe-plist (button-get button 'apropos-symbol))))

View file

@ -410,32 +410,40 @@ T means abort and give an error message.")
(exit-minibuffer))))
(defun calcAlg-blink-matching-open ()
(let ((oldpos (point))
(blinkpos nil))
(let ((rightpt (point))
(leftpt nil)
(rightchar (preceding-char))
leftchar
rightsyntax
leftsyntax)
(save-excursion
(condition-case ()
(setq blinkpos (scan-sexps oldpos -1))
(error nil)))
(if (and blinkpos
(> oldpos (1+ (point-min)))
(or (and (= (char-after (1- oldpos)) ?\))
(= (char-after blinkpos) ?\[))
(and (= (char-after (1- oldpos)) ?\])
(= (char-after blinkpos) ?\()))
(save-excursion
(goto-char blinkpos)
(looking-at ".+\\(\\.\\.\\|\\\\dots\\|\\\\ldots\\)")))
(let ((saved (aref (syntax-table) (char-after blinkpos))))
(unwind-protect
(progn
(aset (syntax-table) (char-after blinkpos)
(+ (logand saved 255)
(lsh (char-after (1- oldpos)) 8)))
(blink-matching-open))
(aset (syntax-table) (char-after blinkpos) saved)))
(setq leftpt (scan-sexps rightpt -1)
leftchar (char-after leftpt))
(error nil)))
(if (and leftpt
(or (and (= rightchar ?\))
(= leftchar ?\[))
(and (= rightchar ?\])
(= leftchar ?\()))
(save-excursion
(goto-char leftpt)
(looking-at ".+\\(\\.\\.\\|\\\\dots\\|\\\\ldots\\)")))
(let ((leftsaved (aref (syntax-table) leftchar))
(rightsaved (aref (syntax-table) rightchar)))
(unwind-protect
(progn
(cond ((= leftchar ?\[)
(aset (syntax-table) leftchar (cons 4 ?\)))
(aset (syntax-table) rightchar (cons 5 ?\[)))
(t
(aset (syntax-table) leftchar (cons 4 ?\]))
(aset (syntax-table) rightchar (cons 5 ?\())))
(blink-matching-open))
(aset (syntax-table) leftchar leftsaved)
(aset (syntax-table) rightchar rightsaved)))
(blink-matching-open))))
(defun calc-alg-digit-entry ()
(calc-alg-entry
(cond ((eq last-command-char ?e)

View file

@ -540,12 +540,12 @@
;;; Produce a random 10-bit integer, with (random) if no seed provided,
;;; or else with Numerical Recipes algorithm ran3 / Knuth 3.2.2-A.
(defvar var-RandSeed nil)
(defvar var-RandSeed)
(defvar math-random-cache nil)
(defvar math-gaussian-cache nil)
(defun math-init-random-base ()
(if var-RandSeed
(if (and (boundp 'var-RandSeed) var-RandSeed)
(if (eq (car-safe var-RandSeed) 'vec)
nil
(if (Math-integerp var-RandSeed)
@ -599,9 +599,10 @@
;;; Produce a random digit in the range 0..999.
;;; Avoid various pitfalls that may lurk in the built-in (random) function!
;;; Shuffling algorithm from Numerical Recipes, section 7.1.
(defvar math-random-last)
(defun math-random-digit ()
(let (i math-random-last)
(or (eq var-RandSeed math-last-RandSeed)
(let (i)
(or (and (boundp 'var-RandSeed) (eq var-RandSeed math-last-RandSeed))
(math-init-random-base))
(or math-random-cache
(progn

View file

@ -4,6 +4,7 @@
;; Author: Eli Barzilay <eli@barzilay.org>
;; Keywords: tools, convenience
;; Time-stamp: <2002-07-13 01:14:35 eli>
;; This file is part of GNU Emacs.
@ -100,6 +101,20 @@ at runtime."
:type 'integer
:group 'calculator)
(defcustom calculator-radix-grouping-mode t
"*Use digit grouping in radix output mode.
If this is set, chunks of `calculator-radix-grouping-digits' characters
will be separated by `calculator-radix-grouping-separator' when in radix
output mode is active (determined by `calculator-output-radix').")
(defcustom calculator-radix-grouping-digits 4
"*The number of digits used for grouping display in radix modes.
See `calculator-radix-grouping-mode'.")
(defcustom calculator-radix-grouping-separator "'"
"*The separator used in radix grouping display.
See `calculator-radix-grouping-mode'.")
(defcustom calculator-remove-zeros t
"*Non-nil value means delete all redundant zero decimal digits.
If this value is not t, and not nil, redundant zeros are removed except
@ -163,7 +178,11 @@ Otherwise show as a negative number."
:group 'calculator)
(defcustom calculator-mode-hook nil
"*List of hook functions for `calculator-mode' to run."
"*List of hook functions for `calculator-mode' to run.
Note: if `calculator-electric-mode' is on, then this hook will get
activated in the minibuffer - in that case it should not do much more
than local key settings and other effects that will change things
outside the scope of calculator related code."
:type 'hook
:group 'calculator)
@ -387,7 +406,7 @@ Used for repeating operations in calculator-repR/L.")
"oD" "oH" "oX" "oO" "oB")
(calculator-rotate-displayer "'")
(calculator-rotate-displayer-back "\"")
(calculator-displayer-pref "{")
(calculator-displayer-prev "{")
(calculator-displayer-next "}")
(calculator-saved-up [up] [?\C-p])
(calculator-saved-down [down] [?\C-n])
@ -399,10 +418,10 @@ Used for repeating operations in calculator-repR/L.")
(calculator-save-and-quit [(control return)]
[(control kp-enter)])
(calculator-paste [insert] [(shift insert)]
[mouse-2])
[paste] [mouse-2] [?\C-y])
(calculator-clear [delete] [?\C-?] [?\C-d])
(calculator-help [?h] [??] [f1] [help])
(calculator-copy [(control insert)])
(calculator-copy [(control insert)] [copy])
(calculator-backspace [backspace])
)))
(while p
@ -536,7 +555,7 @@ Used for repeating operations in calculator-repR/L.")
,@(mapcar (lambda (x) (nth 1 x)) radix-selectors)
"---"
,@(mapcar (lambda (x) (nth 2 x)) radix-selectors)))
("Decimal Dislpay"
("Decimal Display"
,@(mapcar (lambda (d)
(vector (cadr d)
;; Note: inserts actual object here
@ -611,10 +630,11 @@ The prompt indicates the current modes:
* \"=?\": (? is B/O/H) the display radix (when input is decimal);
* \"??\": (? is D/B/O/H) 1st char for input radix, 2nd for display.
Also, the quote character can be used to switch display modes for
decimal numbers (double-quote rotates back), and the two brace
characters (\"{\" and \"}\" change display parameters that these
displayers use (if they handle such).
Also, the quote key can be used to switch display modes for decimal
numbers (double-quote rotates back), and the two brace characters
\(\"{\" and \"}\" change display parameters that these displayers use (if
they handle such). If output is using any radix mode, then these keys
toggle digit grouping mode and the chunk size.
Values can be saved for future reference in either a list of saved
values, or in registers.
@ -683,6 +703,7 @@ See the documentation for `calculator-mode' for more information."
(setq calculator-saved-global-map (current-global-map))
(use-local-map nil)
(use-global-map calculator-mode-map)
(run-hooks 'calculator-mode-hook)
(unwind-protect
(catch 'calculator-done
(Electric-command-loop
@ -717,6 +738,12 @@ See the documentation for `calculator-mode' for more information."
(if (and calculator-restart-other-mode calculator-electric-mode)
(calculator)))
(defun calculator-message (string &rest arguments)
"Same as `message', but special handle of electric mode."
(apply 'message string arguments)
(if calculator-electric-mode
(progn (sit-for 1) (message nil))))
;;;---------------------------------------------------------------------
;;; Operators
@ -818,82 +845,116 @@ The string is set not to exceed the screen width."
(concat calculator-prompt
(substring prompt (+ trim (length calculator-prompt)))))))
(defun calculator-curnum-value ()
"Get the numeric value of the displayed number string as a float."
(defun calculator-string-to-number (str)
"Convert the given STR to a number, according to the value of
`calculator-input-radix'."
(if calculator-input-radix
(let ((radix
(cdr (assq calculator-input-radix
'((bin . 2) (oct . 8) (hex . 16)))))
(i -1) (value 0))
;; assume valid input (upcased & characters in range)
(while (< (setq i (1+ i)) (length calculator-curnum))
(setq value
(+ (let ((ch (aref calculator-curnum i)))
(- ch (if (<= ch ?9) ?0 (- ?A 10))))
(* radix value))))
(i -1) (value 0) (new-value 0))
;; assume mostly valid input (e.g., characters in range)
(while (< (setq i (1+ i)) (length str))
(setq new-value
(let* ((ch (upcase (aref str i)))
(n (cond ((< ch ?0) nil)
((<= ch ?9) (- ch ?0))
((< ch ?A) nil)
((<= ch ?Z) (- ch (- ?A 10)))
(t nil))))
(if (and n (<= 0 n) (< n radix))
(+ n (* radix value))
(progn
(calculator-message
"Warning: Ignoring bad input character `%c'." ch)
(sit-for 1)
value))))
(if (if (< new-value 0) (> value 0) (< value 0))
(calculator-message "Warning: Overflow in input."))
(setq value new-value))
value)
(car
(read-from-string
(cond
((equal "." calculator-curnum)
"0.0")
((string-match "[eE][+-]?$" calculator-curnum)
(concat calculator-curnum "0"))
((string-match "\\.[0-9]\\|[eE]" calculator-curnum)
calculator-curnum)
((string-match "\\." calculator-curnum)
;; do this because Emacs reads "23." as an integer
(concat calculator-curnum "0"))
((stringp calculator-curnum)
(concat calculator-curnum ".0"))
(t "0.0"))))))
(car (read-from-string
(cond ((equal "." str) "0.0")
((string-match "[eE][+-]?$" str) (concat str "0"))
((string-match "\\.[0-9]\\|[eE]" str) str)
((string-match "\\." str)
;; do this because Emacs reads "23." as an integer
(concat str "0"))
((stringp str) (concat str ".0"))
(t "0.0"))))))
(defun calculator-curnum-value ()
"Get the numeric value of the displayed number string as a float."
(calculator-string-to-number calculator-curnum))
(defun calculator-rotate-displayer (&optional new-disp)
"Switch to the next displayer on the `calculator-displayers' list.
Can be called with an optional argument NEW-DISP to force rotation to
that argument."
that argument.
If radix output mode is active, toggle digit grouping."
(interactive)
(setq calculator-displayers
(if (and new-disp (memq new-disp calculator-displayers))
(let ((tmp nil))
(while (not (eq (car calculator-displayers) new-disp))
(setq tmp (cons (car calculator-displayers) tmp))
(setq calculator-displayers (cdr calculator-displayers)))
(setq calculator-displayers
(nconc calculator-displayers (nreverse tmp))))
(nconc (cdr calculator-displayers)
(list (car calculator-displayers)))))
(message "Using %s." (cadr (car calculator-displayers)))
(if calculator-electric-mode
(progn (sit-for 1) (message nil)))
(cond
(calculator-output-radix
(setq calculator-radix-grouping-mode
(not calculator-radix-grouping-mode))
(calculator-message
"Digit grouping mode %s."
(if calculator-radix-grouping-mode "ON" "OFF")))
(t
(setq calculator-displayers
(if (and new-disp (memq new-disp calculator-displayers))
(let ((tmp nil))
(while (not (eq (car calculator-displayers) new-disp))
(setq tmp (cons (car calculator-displayers) tmp))
(setq calculator-displayers
(cdr calculator-displayers)))
(setq calculator-displayers
(nconc calculator-displayers (nreverse tmp))))
(nconc (cdr calculator-displayers)
(list (car calculator-displayers)))))
(calculator-message
"Using %s." (cadr (car calculator-displayers)))))
(calculator-enter))
(defun calculator-rotate-displayer-back ()
"Like `calculator-rotate-displayer', but rotates modes back."
"Like `calculator-rotate-displayer', but rotates modes back.
If radix output mode is active, toggle digit grouping."
(interactive)
(calculator-rotate-displayer (car (last calculator-displayers))))
(defun calculator-displayer-prev ()
"Send the current displayer function a 'left argument.
This is used to modify display arguments (if the current displayer
function supports this)."
function supports this).
If radix output mode is active, increase the grouping size."
(interactive)
(and (car calculator-displayers)
(let ((disp (caar calculator-displayers)))
(cond ((symbolp disp) (funcall disp 'left))
((and (consp disp) (eq 'std (car disp)))
(calculator-standard-displayer 'left (cadr disp)))))))
(if calculator-output-radix
(progn (setq calculator-radix-grouping-digits
(1+ calculator-radix-grouping-digits))
(calculator-enter))
(and (car calculator-displayers)
(let ((disp (caar calculator-displayers)))
(cond
((symbolp disp) (funcall disp 'left))
((and (consp disp) (eq 'std (car disp)))
(calculator-standard-displayer 'left (cadr disp))))))))
(defun calculator-displayer-next ()
"Send the current displayer function a 'right argument.
This is used to modify display arguments (if the current displayer
function supports this)."
function supports this).
If radix output mode is active, decrease the grouping size."
(interactive)
(and (car calculator-displayers)
(let ((disp (caar calculator-displayers)))
(cond ((symbolp disp) (funcall disp 'right))
((and (consp disp) (eq 'std (car disp)))
(calculator-standard-displayer 'right (cadr disp)))))))
(if calculator-output-radix
(progn (setq calculator-radix-grouping-digits
(max 2 (1- calculator-radix-grouping-digits)))
(calculator-enter))
(and (car calculator-displayers)
(let ((disp (caar calculator-displayers)))
(cond
((symbolp disp) (funcall disp 'right))
((and (consp disp) (eq 'std (car disp)))
(calculator-standard-displayer 'right (cadr disp))))))))
(defun calculator-remove-zeros (numstr)
"Get a number string NUMSTR and remove unnecessary zeroes.
@ -995,7 +1056,7 @@ the 'left or 'right when one of the standard modes is used."
(calculator-remove-zeros str))
"e" (number-to-string exp))))))
(defun calculator-num-to-string (num)
(defun calculator-number-to-string (num)
"Convert NUM to a displayable string."
(cond
((and (numberp num) calculator-output-radix)
@ -1015,6 +1076,14 @@ the 'left or 'right when one of the standard modes is used."
(?6 . "110") (?7 . "111")))))))
(string-match "^0*\\(.+\\)" s)
(setq str (match-string 1 s))))
(if calculator-radix-grouping-mode
(let ((d (/ (length str) calculator-radix-grouping-digits))
(r (% (length str) calculator-radix-grouping-digits)))
(while (>= (setq d (1- d)) (if (zerop r) 1 0))
(let ((i (+ r (* d calculator-radix-grouping-digits))))
(setq str (concat (substring str 0 i)
calculator-radix-grouping-separator
(substring str i)))))))
(upcase
(if (and (not calculator-2s-complement) (< num 0))
(concat "-" str)
@ -1051,7 +1120,7 @@ If optional argument FORCE is non-nil, don't use the cached string."
;; customizable display for a single value
(caar calculator-displayers)
calculator-displayer)))
(mapconcat 'calculator-num-to-string
(mapconcat 'calculator-number-to-string
(reverse calculator-stack)
" "))
" "
@ -1319,9 +1388,8 @@ Optional string argument KEYS will force using it as the keys entered."
(if (not (and op (= -1 (calculator-op-arity op))))
;;(error "Binary operator without a first operand")
(progn
(message "Binary operator without a first operand")
(if calculator-electric-mode
(progn (sit-for 1) (message nil)))
(calculator-message
"Binary operator without a first operand")
(throw 'op-error nil)))))
(calculator-reduce-stack
(cond ((eq (nth 1 op) '\() 10)
@ -1334,9 +1402,7 @@ Optional string argument KEYS will force using it as the keys entered."
(not (numberp (car calculator-stack)))))
;;(error "Unterminated expression")
(progn
(message "Unterminated expression")
(if calculator-electric-mode
(progn (sit-for 1) (message nil)))
(calculator-message "Unterminated expression")
(throw 'op-error nil)))
(setq calculator-stack (cons op calculator-stack))
(calculator-reduce-stack (calculator-op-prec op))
@ -1540,7 +1606,7 @@ Optional string argument KEYS will force using it as the keys entered."
(setcdr as val)
(setq calculator-registers
(cons (cons reg val) calculator-registers)))
(message (format "[%c] := %S" reg val))))
(calculator-message "[%c] := %S" reg val)))
(defun calculator-put-value (val)
"Paste VAL as if entered.
@ -1552,24 +1618,26 @@ Used by `calculator-paste' and `get-register'."
(progn
(calculator-clear-fragile)
(setq calculator-curnum (let ((calculator-displayer "%S"))
(calculator-num-to-string val)))
(calculator-number-to-string val)))
(calculator-update-display))))
(defun calculator-paste ()
"Paste a value from the `kill-ring'."
(interactive)
(calculator-put-value
(let ((str (current-kill 0)))
(and calculator-paste-decimals
(let ((str (replace-regexp-in-string
"^ *\\(.+[^ ]\\) *$" "\\1" (current-kill 0))))
(and (not calculator-input-radix)
calculator-paste-decimals
(string-match "\\([0-9]+\\)\\(\\.[0-9]+\\)?\\(e[0-9]+\\)?"
str)
(or (match-string 1 str)
(match-string 2 str)
(match-string 3 str))
(setq str (concat (match-string 1 str)
(setq str (concat (or (match-string 1 str) "0")
(or (match-string 2 str) ".0")
(match-string 3 str))))
(condition-case nil (car (read-from-string str))
(or (match-string 3 str) ""))))
(condition-case nil (calculator-string-to-number str)
(error nil)))))
(defun calculator-get-register (reg)
@ -1678,7 +1746,7 @@ To use this, apply a binary operator (evaluate it), then call this."
(while (> x 0)
(setq r (* r (truncate x)))
(setq x (1- x)))
r))
(+ 0.0 r)))
(defun calculator-truncate (n)
"Truncate N, return 0 in case of overflow."

View file

@ -1660,6 +1660,13 @@ the date indicated by the cursor position in the displayed three-month
calendar."
t)
(autoload 'view-other-diary-entries "diary-lib"
"Prepare and display buffer of diary entries from an alternative diary file.
Searches for entries that match ARG days, starting with the date indicated
by the cursor position in the displayed three-month calendar.
D-FILE specifies the file to use as the diary file."
t)
(autoload 'calendar-sunrise-sunset "solar"
"Local time of sunrise and sunset for date under cursor."
t)

View file

@ -80,7 +80,7 @@ Searches for entries that match ARG days, starting with the date indicated
by the cursor position in the displayed three-month calendar.
D-FILE specifies the file to use as the diary file."
(interactive
(list (if arg (prefix-numeric-value arg) 1)
(list (prefix-numeric-value current-prefix-arg)
(read-file-name "Enter diary file name: " default-directory nil t)))
(let ((diary-file d-file))
(view-diary-entries arg)))
@ -841,11 +841,11 @@ Each entry in the diary file visible in the calendar window is marked.
After the entries are marked, the hooks `nongregorian-diary-marking-hook' and
`mark-diary-entries-hook' are run."
(interactive)
(setq mark-diary-entries-in-calendar t)
(let ((marking-diary-entries t)
file-glob-attrs marks)
(save-excursion
(set-buffer (find-file-noselect (diary-check-diary-file) t))
(setq mark-diary-entries-in-calendar t)
(message "Marking diary entries...")
(setq file-glob-attrs (nth 1 (diary-pull-attrs nil '())))
(let ((d diary-date-forms)

View file

@ -104,24 +104,11 @@ The `category', `face' and `font-lock-face' properties are made
into widget buttons that call `describe-text-category' or
`describe-face' when pushed."
;; Sort the properties by the size of their value.
(dolist (elt (sort (let ((ret nil)
(key nil)
(val nil)
(len nil))
(dolist (elt (sort (let (ret)
(while properties
(setq key (pop properties)
val (pop properties)
len 0)
(unless (or (memq key '(category face font-lock-face
syntax-table))
(widgetp val))
(setq val (pp-to-string val)
len (length val)))
(push (list key val len) ret))
(push (list (pop properties) (pop properties)) ret))
ret)
(lambda (a b)
(< (nth 2 a)
(nth 2 b)))))
(lambda (a b) (string< (nth 0 a) (nth 0 b)))))
(let ((key (nth 0 elt))
(value (nth 1 elt)))
(widget-insert (propertize (format " %-20s " key)
@ -131,23 +118,15 @@ into widget buttons that call `describe-text-category' or
:notify `(lambda (&rest ignore)
(describe-text-category ',value))
(format "%S" value)))
((memq key '(face font-lock-face))
((memq key '(face font-lock-face mouse-face))
(widget-create 'link
:notify `(lambda (&rest ignore)
(describe-face ',value))
(format "%S" value)))
((eq key 'syntax-table)
(widget-create 'push-button
:tag "show"
:action (lambda (widget &optional event)
(with-output-to-temp-buffer
"*Pp Eval Output*"
(pp (widget-get widget :value))))
value))
((widgetp value)
(describe-text-widget value))
(t
(widget-insert value))))
(describe-text-sexp value))))
(widget-insert "\n")))
;;; Describe-Text Commands.
@ -544,10 +523,17 @@ as well as widgets, buttons, overlays, and text properties."
(dotimes (i (length disp-vector))
(setq char (aref disp-vector i))
(aset disp-vector i
(cons char (describe-char-display pos char))))
(cons char (describe-char-display
pos (logand char #x7ffff)))))
(format "by display table entry [%s] (see below)"
(mapconcat #'(lambda (x) (format "?%c" (car x)))
disp-vector " ")))
(mapconcat
#'(lambda (x)
(if (> (car x) #x7ffff)
(format "?%c<face-id=%s>"
(logand (car x) #x7ffff)
(lsh (car x) -19))
(format "?%c" (car x))))
disp-vector " ")))
(composition
(let ((from (car composition))
(to (nth 1 composition))
@ -618,7 +604,7 @@ as well as widgets, buttons, overlays, and text properties."
(progn
(insert "these fonts (glyph codes):\n")
(dotimes (i (length disp-vector))
(insert (car (aref disp-vector i)) ?:
(insert (logand (car (aref disp-vector i)) #x7ffff) ?:
(propertize " " 'display '(space :align-to 5))
(if (cdr (aref disp-vector i))
(format "%s (0x%02X)" (cadr (aref disp-vector i))

View file

@ -1104,6 +1104,7 @@ Do so according to the former subdir alist OLD-SUBDIR-ALIST."
(let ((map (make-keymap)))
(suppress-keymap map)
(define-key map [mouse-2] 'dired-mouse-find-file-other-window)
(define-key map [follow-link] 'mouse-face)
;; Commands to mark or flag certain categories of files
(define-key map "#" 'dired-flag-auto-save-files)
(define-key map "." 'dired-clean-directory)

View file

@ -2178,7 +2178,7 @@ list that represents a doc string reference.
(let ((old-load-list current-load-list)
(args (mapcar 'eval (cdr form))))
(apply 'require args)
;; Detech (require 'cl) in a way that works even if cl is already loaded.
;; Detect (require 'cl) in a way that works even if cl is already loaded.
(if (member (car args) '("cl" cl))
(setq byte-compile-warnings
(remq 'cl-functions byte-compile-warnings))))

View file

@ -192,8 +192,7 @@ open-parenthesis, and point ends up at the beginning of the line.
If variable `beginning-of-defun-function' is non-nil, its value
is called as a function to find the defun's beginning."
(interactive "p")
(or inhibit-mark-movement
(not (eq this-command 'beginning-of-defun))
(or (not (eq this-command 'beginning-of-defun))
(eq last-command 'beginning-of-defun)
(and transient-mark-mode mark-active)
(push-mark))
@ -245,8 +244,7 @@ matches the open-parenthesis that starts a defun; see function
If variable `end-of-defun-function' is non-nil, its value
is called as a function to find the defun's end."
(interactive "p")
(or inhibit-mark-movement
(not (eq this-command 'end-of-defun))
(or (not (eq this-command 'end-of-defun))
(eq last-command 'end-of-defun)
(and transient-mark-mode mark-active)
(push-mark))

View file

@ -1003,14 +1003,6 @@ Extra commands should be added to `cua-movement-commands'")
(defvar cua-movement-commands nil
"User may add additional movement commands to this list.")
(defvar cua--preserve-mark-commands
'(end-of-buffer beginning-of-buffer)
"List of movement commands that move the mark.
CUA will preserve the previous mark position if a mark is already
active before one of these commands is executed.")
(defvar cua--undo-push-mark nil)
;;; Scrolling commands which does not signal errors at top/bottom
;;; of buffer at first key-press (instead moves to top/bottom
;;; of buffer).
@ -1100,11 +1092,7 @@ If ARG is the atom `-', scroll upward by nearly full screen."
(aref (if window-system
(this-single-command-raw-keys)
(this-single-command-keys)) 0)))
(if mark-active
(if (and (memq this-command cua--preserve-mark-commands)
(not inhibit-mark-movement))
(setq cua--undo-push-mark t
inhibit-mark-movement t))
(unless mark-active
(push-mark-command nil t))
(setq cua--last-region-shifted t)
(setq cua--explicit-region-start nil))
@ -1151,9 +1139,6 @@ If ARG is the atom `-', scroll upward by nearly full screen."
(defun cua--post-command-handler ()
(condition-case nil
(progn
(when cua--undo-push-mark
(setq cua--undo-push-mark nil
inhibit-mark-movement nil))
(when cua--global-mark-active
(cua--global-mark-post-command))
(when (fboundp 'cua--rectangle-post-command)

View file

@ -1784,7 +1784,7 @@ created."
(defface mode-line
'((((type x w32 mac) (class color))
'((((class color) (min-colors 88))
:box (:line-width -1 :style released-button)
:background "grey75" :foreground "black")
(t
@ -1797,11 +1797,11 @@ created."
(defface mode-line-inactive
'((default
:inherit mode-line)
(((type x w32 mac) (background light) (class color))
(((class color) (min-colors 88) (background light))
:weight light
:box (:line-width -1 :color "grey75" :style nil)
:foreground "grey20" :background "grey90")
(((type x w32 mac) (background dark) (class color))
(((class color) (min-colors 88) (background dark) )
:weight light
:box (:line-width -1 :color "grey40" :style nil)
:foreground "grey80" :background "grey30"))
@ -2032,8 +2032,8 @@ Note: Other faces cannot inherit from the cursor face."
(defface escape-glyph '((((background dark)) :foreground "cyan")
(((type pc)) :foreground "magenta")
(t :foreground "dark blue"))
"Face for displaying \\ and ^ in multichar glyphs."
(t :foreground "blue"))
"Face for characters displayed as ^-sequences or \-sequences."
:group 'basic-faces)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View file

@ -1,3 +1,9 @@
2004-12-17 Kim F. Storm <storm@cua.dk>
* gnus-group.el (gnus-group-mode-map): Map follow-link to mouse-face.
* gnus-sum.el (gnus-summary-mode-map): Likewise.
2004-12-08 Stefan Monnier <monnier@iro.umontreal.ca>
* gnus-art.el (gnus-narrow-to-page): Don't hardcode point-min.
@ -905,7 +911,7 @@
* gnus-delay.el (gnus-delay-default-hour): Add :version.
* gnus-cite.el (gnus-cite-blank-line-after-header)
(gnus-article-boring-faces):
(gnus-article-boring-faces):
* gnus-art.el (gnus-buttonized-mime-types)
(gnus-inhibit-mime-unbuttonizing)

View file

@ -591,6 +591,7 @@ simple manner.")
"\M-e" gnus-group-edit-group-method
"^" gnus-group-enter-server-mode
gnus-mouse-2 gnus-mouse-pick-group
[follow-link] mouse-face
"<" beginning-of-buffer
">" end-of-buffer
"\C-c\C-b" gnus-bug

View file

@ -1703,6 +1703,7 @@ increase the score of each group you read."
"Q" gnus-summary-exit-no-update
"\C-c\C-i" gnus-info-find-node
gnus-mouse-2 gnus-mouse-pick-article
[follow-link] mouse-face
"m" gnus-summary-mail-other-window
"a" gnus-summary-post-news
"i" gnus-summary-news-other-window
@ -5096,7 +5097,7 @@ If SELECT-ARTICLES, only select those articles from GROUP."
(when gnus-agent
(gnus-agent-possibly-alter-active group (gnus-active group) info)
(setq gnus-summary-use-undownloaded-faces
(gnus-agent-find-parameter
group
@ -7044,7 +7045,7 @@ If optional argument UNREAD is non-nil, only unread article is selected."
(gnus-summary-goto-subject article t)))
(gnus-summary-limit (append articles gnus-newsgroup-limit))
(gnus-summary-position-point))
(defun gnus-summary-goto-subject (article &optional force silent)
"Go the subject line of ARTICLE.
If FORCE, also allow jumping to articles not currently shown."
@ -9140,7 +9141,7 @@ ACTION can be either `move' (the default), `crosspost' or `copy'."
;;;!!!Why is this necessary?
(set-buffer gnus-summary-buffer)
(gnus-summary-goto-subject article)
(when (eq action 'move)
(gnus-summary-mark-article article gnus-canceled-mark))))

View file

@ -478,8 +478,13 @@ Return 0 if there is no such symbol."
(and (symbolp obj) (boundp obj) obj))))
(error nil))
(let* ((str (find-tag-default))
(obj (if str (intern str))))
(and (symbolp obj) (boundp obj) obj))
(sym (if str (intern-soft str))))
(if (and sym (boundp sym))
sym
(save-match-data
(when (and str (string-match "\\`\\W*\\(.*?\\)\\W*\\'" str))
(setq sym (intern-soft (match-string 1 str)))
(and (boundp sym) sym)))))
0))
;;;###autoload
@ -564,6 +569,7 @@ it is displayed along with the global value."
(insert " value is shown ")
(insert-button "below"
'action help-button-cache
'follow-link t
'help-echo "mouse-2, RET: show value")
(insert ".\n\n")))
;; Add a note for variables that have been make-var-buffer-local.

View file

@ -68,6 +68,7 @@ The format is (FUNCTION ARGS...).")
;; Button types used by help
(define-button-type 'help-xref
'follow-link t
'action #'help-button-action)
(defun help-button-action (button)

View file

@ -267,8 +267,13 @@ If that doesn't give a function, return nil."
(and (symbolp obj) (fboundp obj) obj))))
(error nil))))
(let* ((str (find-tag-default))
(obj (if str (intern str))))
(and (symbolp obj) (fboundp obj) obj))))
(sym (if str (intern-soft str))))
(if (and sym (fboundp sym))
sym
(save-match-data
(when (and str (string-match "\\`\\W*\\(.*?\\)\\W*\\'" str))
(setq sym (intern-soft (match-string 1 str)))
(and (fboundp sym) sym)))))))
;;; `User' help functions
@ -609,17 +614,58 @@ the last key hit are used."
(princ "\n which is ")
(describe-function-1 defn)
(when up-event
(let ((defn (or (string-key-binding up-event) (key-binding up-event))))
(let ((ev (aref up-event 0))
(descr (key-description up-event))
(hdr "\n\n-------------- up event ---------------\n\n")
defn
mouse-1-tricky mouse-1-remapped)
(when (and (consp ev)
(eq (car ev) 'mouse-1)
(windowp window)
mouse-1-click-follows-link
(not (eq mouse-1-click-follows-link 'double))
(with-current-buffer (window-buffer window)
(mouse-on-link-p (posn-point (event-start ev)))))
(setq mouse-1-tricky (integerp mouse-1-click-follows-link)
mouse-1-remapped (or (not mouse-1-tricky)
(> mouse-1-click-follows-link 0)))
(if mouse-1-remapped
(setcar ev 'mouse-2)))
(setq defn (or (string-key-binding up-event) (key-binding up-event)))
(unless (or (null defn) (integerp defn) (equal defn 'undefined))
(princ "\n\n-------------- up event ---------------\n\n")
(princ (key-description up-event))
(princ (if mouse-1-tricky
"\n\n----------------- up-event (short click) ----------------\n\n"
hdr))
(setq hdr nil)
(princ descr)
(if (windowp window)
(princ " at that spot"))
(if mouse-1-remapped
(princ " is remapped to <mouse-2>\n which" ))
(princ " runs the command ")
(prin1 defn)
(princ "\n which is ")
(describe-function-1 defn))))
(print-help-return-message)))))))
(describe-function-1 defn))
(when mouse-1-tricky
(setcar ev
(if (> mouse-1-click-follows-link 0) 'mouse-1 'mouse-2))
(setq defn (or (string-key-binding up-event) (key-binding up-event)))
(unless (or (null defn) (integerp defn) (equal defn 'undefined))
(princ (or hdr
"\n\n----------------- up-event (long click) ----------------\n\n"))
(princ "Pressing ")
(princ descr)
(if (windowp window)
(princ " at that spot"))
(princ (format " for longer than %d milli-seconds\n"
(abs mouse-1-click-follows-link)))
(if (not mouse-1-remapped)
(princ " remaps it to <mouse-2> which" ))
(princ " runs the command ")
(prin1 defn)
(princ "\n which is ")
(describe-function-1 defn))))
(print-help-return-message))))))))
(defun describe-mode (&optional buffer)
@ -692,6 +738,7 @@ whose documentation describes the minor mode."
(princ " ")
(insert-button pretty-minor-mode
'action (car help-button-cache)
'follow-link t
'help-echo "mouse-2, RET: show full information")
(princ (format " minor mode (%s):\n"
(if indicator

View file

@ -47,7 +47,7 @@ Automatically becomes buffer local when set in any fashion.")
"Non-nil means pop up the Info buffer in another window."
:group 'info-lookup :type 'boolean)
(defcustom info-lookup-highlight-face 'highlight
(defcustom info-lookup-highlight-face 'match
"Face for highlighting looked up help items.
Setting this variable to nil disables highlighting."
:group 'info-lookup :type 'face)

View file

@ -1359,11 +1359,12 @@ Return the input string."
(while quail-translating
(set-buffer-modified-p modified-p)
(quail-show-guidance)
(let* ((keyseq (read-key-sequence
(and input-method-use-echo-area
(concat input-method-previous-message
quail-current-str))
nil nil t))
(let* ((prompt (if input-method-use-echo-area
(format "%s%s %s"
(or input-method-previous-message "")
quail-current-str
quail-guidance-str)))
(keyseq (read-key-sequence prompt nil nil t))
(cmd (lookup-key (quail-translation-keymap) keyseq)))
(if (if key
(and (commandp cmd) (not (eq cmd 'quail-other-command)))
@ -1424,12 +1425,13 @@ Return the input string."
quail-translating t)
(quail-setup-overlays nil)))
(quail-show-guidance)
(let* ((keyseq (read-key-sequence
(and input-method-use-echo-area
(concat input-method-previous-message
quail-conversion-str
quail-current-str))
nil nil t))
(let* ((prompt (if input-method-use-echo-area
(format "%s%s%s %s"
(or input-method-previous-message "")
quail-conversion-str
quail-current-str
quail-guidance-str)))
(keyseq (read-key-sequence prompt nil nil t))
(cmd (lookup-key (quail-conversion-keymap) keyseq)))
(if (if key (commandp cmd) (eq cmd 'quail-self-insert-command))
(progn
@ -1938,10 +1940,10 @@ minibuffer and the selected frame has no other windows)."
;; Then, show the guidance.
(when (and (quail-require-guidance-buf)
(not input-method-use-echo-area)
(null unread-command-events)
(null unread-post-input-method-events))
(if (or (eq (selected-window) (minibuffer-window))
input-method-use-echo-area)
(if (eq (selected-window) (minibuffer-window))
(if (eq (minibuffer-window) (frame-root-window))
;; Use another frame. It is sure that we are using some
;; window system.

View file

@ -649,7 +649,7 @@ is treated as a regexp. See \\[isearch-forward] for more info."
(setq ;; quit-flag nil not for isearch-mode
isearch-adjusted nil
isearch-yank-flag nil)
(isearch-lazy-highlight-new-loop)
(if isearch-lazy-highlight (isearch-lazy-highlight-new-loop))
;; We must prevent the point moving to the end of composition when a
;; part of the composition has just been searched.
(setq disable-point-adjustment t))
@ -2329,8 +2329,7 @@ is nil. This function is called when exiting an incremental search if
"Cleanup any previous `isearch-lazy-highlight' loop and begin a new one.
This happens when `isearch-update' is invoked (which can cause the
search string to change or the window to scroll)."
(when (and isearch-lazy-highlight
(null executing-kbd-macro)
(when (and (null executing-kbd-macro)
(sit-for 0) ;make sure (window-start) is credible
(or (not (equal isearch-string
isearch-lazy-highlight-last-string))

View file

@ -49,6 +49,39 @@
:version "21.4"
:group 'mouse)
(defcustom mouse-1-click-follows-link 350
"Non-nil means that clicking Mouse-1 on a link follows the link.
With the default setting, an ordinary Mouse-1 click on a link
performs the same action as Mouse-2 on that link, while a longer
Mouse-1 click \(hold down the Mouse-1 button for more than 350
milliseconds) performs the original Mouse-1 binding \(which
typically sets point where you click the mouse).
If value is an integer, the time elapsed between pressing and
releasing the mouse button determines whether to follow the link
or perform the normal Mouse-1 action (typically set point).
The absolute numeric value specifices the maximum duration of a
\"short click\" in milliseconds. A positive value means that a
short click follows the link, and a longer click performs the
normal action. A negative value gives the opposite behaviour.
If value is `double', a double click follows the link.
Otherwise, a single Mouse-1 click unconditionally follows the link.
Note that dragging the mouse never follows the link.
This feature only works in modes that specifically identify
clickable text as links, so it may not work with some external
packages. See `mouse-on-link-p' for details."
:version "21.4"
:type '(choice (const :tag "Disabled" nil)
(const :tag "Double click" double)
(number :tag "Single click time limit" :value 350)
(other :tag "Single click" t))
:group 'mouse)
;; Provide a mode-specific menu on a mouse button.
@ -733,6 +766,51 @@ If the click is in the echo area, display the `*Messages*' buffer."
(run-hooks 'mouse-leave-buffer-hook)
(mouse-drag-region-1 start-event))))
(defun mouse-on-link-p (pos)
"Return non-nil if POS is on a link in the current buffer.
A clickable link is identified by one of the following methods:
1) If the character at POS has a non-nil `follow-link' text or
overlay property, the value of that property is returned.
2) If there is a local key-binding or a keybinding at position
POS for the `follow-link' event, the binding of that event
determines whether POS is inside a link:
- If the binding is `mouse-face', POS is inside a link if there
is a non-nil `mouse-face' property at POS. Return t in this case.
- If the binding is a function, FUNC, POS is inside a link if
the call \(FUNC POS) returns non-nil. Return the return value
from that call.
- Otherwise, return the binding of the `follow-link' binding.
The return value is interpreted as follows:
- If it is a string, the mouse-1 event is translated into the
first character of the string, i.e. the action of the mouse-1
click is the local or global binding of that character.
- If it is a vector, the mouse-1 event is translated into the
first element of that vector, i.e. the action of the mouse-1
click is the local or global binding of that event.
- Otherwise, the mouse-1 event is translated into a mouse-2 event
at the same position."
(or (get-char-property pos 'follow-link)
(save-excursion
(goto-char pos)
(let ((b (key-binding [follow-link] nil t)))
(cond
((eq b 'mouse-face)
(and (get-char-property pos 'mouse-face) t))
((functionp b)
(funcall b pos))
(t b))))))
(defun mouse-drag-region-1 (start-event)
(mouse-minibuffer-check start-event)
(let* ((echo-keystrokes 0)
@ -749,6 +827,7 @@ If the click is in the echo area, display the `*Messages*' buffer."
(nth 3 bounds)
;; Don't count the mode line.
(1- (nth 3 bounds))))
on-link remap-double-click
(click-count (1- (event-click-count start-event))))
(setq mouse-selection-click-count click-count)
(setq mouse-selection-click-count-buffer (current-buffer))
@ -758,6 +837,13 @@ If the click is in the echo area, display the `*Messages*' buffer."
(if (< (point) start-point)
(goto-char start-point))
(setq start-point (point))
(setq on-link (and mouse-1-click-follows-link
(mouse-on-link-p start-point)))
(setq remap-double-click (and on-link
(eq mouse-1-click-follows-link 'double)
(= click-count 1)))
(if remap-double-click ;; Don't expand mouse overlay in links
(setq click-count 0))
(let ((range (mouse-start-end start-point start-point click-count)))
(move-overlay mouse-drag-overlay (car range) (nth 1 range)
(window-buffer start-window))
@ -880,6 +966,28 @@ If the click is in the echo area, display the `*Messages*' buffer."
(or end-point
(= (window-start start-window)
start-window-start)))
(if (and on-link
(not end-point)
(consp event)
(or remap-double-click
(and
(not (eq mouse-1-click-follows-link 'double))
(= click-count 0)
(= (event-click-count event) 1)
(not (input-pending-p))
(or (not (integerp mouse-1-click-follows-link))
(let ((t0 (posn-timestamp (event-start start-event)))
(t1 (posn-timestamp (event-end event))))
(and (integerp t0) (integerp t1)
(if (> mouse-1-click-follows-link 0)
(<= (- t1 t0) mouse-1-click-follows-link)
(< (- t0 t1) mouse-1-click-follows-link)))))
(or (not double-click-time)
(sit-for 0 (if (integerp double-click-time)
double-click-time 500) t)))))
(if (or (vectorp on-link) (stringp on-link))
(setq event (aref on-link 0))
(setcar event 'mouse-2)))
(setq unread-command-events
(cons event unread-command-events)))))
(delete-overlay mouse-drag-overlay)))))

View file

@ -1105,9 +1105,11 @@ Return the difference in the format of a time value."
;; Do `PC-do-completion' without substitution
(let* (save)
(fset 'save (symbol-function 'substitute-in-file-name))
(fset 'substitute-in-file-name (symbol-function 'identity))
ad-do-it
(fset 'substitute-in-file-name (symbol-function 'save)))
(unwind-protect
(progn
(fset 'substitute-in-file-name (symbol-function 'identity))
ad-do-it)
(fset 'substitute-in-file-name (symbol-function 'save))))
;; Expand "$"
(let* ((beg (or (and (functionp 'minibuffer-prompt-end) ; Emacs 21

View file

@ -34,7 +34,7 @@
;;
;; Notes:
;; -----
;;
;;
;; This package only works for Emacs 20 and higher, and for XEmacs 21
;; and higher. (XEmacs 20 is missing the `with-timeout' macro. Emacs
;; 19 is reported to have other problems. For XEmacs 21, you need the
@ -205,7 +205,7 @@ file name, the backup directory is prepended with Tramp file name prefix
gives the same backup policy for Tramp files on their hosts like the
policy for local files."
:type '(repeat
:type '(repeat
(list (regexp :tag "File regexp")
(string :tag "Backup Dir")
(set :inline t
@ -506,7 +506,7 @@ This variable defaults to the value of `tramp-encoding-shell'."
(tramp-copy-args nil)
(tramp-copy-keep-date-arg "-p")
(tramp-password-end-of-line "xy")) ;see docstring for "xy"
("fcp"
("fcp"
(tramp-connection-function tramp-open-connection-rsh)
(tramp-login-program "fsh")
(tramp-copy-program "fcp")
@ -633,7 +633,7 @@ variable `tramp-methods'."
("rsh" tramp-multi-connect-rlogin "rsh %h -l %u%n")
("remsh" tramp-multi-connect-rlogin "remsh %h -l %u%n")
("ssh" tramp-multi-connect-rlogin "ssh %h -l %u%n")
("ssht" tramp-multi-connect-rlogin "ssh %h -e none -t -t -l %u%n")
("ssht" tramp-multi-connect-rlogin "ssh %h -e none -t -t -l %u%n")
("su" tramp-multi-connect-su "su - %u%n")
("sudo" tramp-multi-connect-su "sudo -u %u -s -p Password:%n"))
"*List of connection functions for multi-hop methods.
@ -777,7 +777,7 @@ the info pages.")
"sudo" tramp-completion-function-alist-su)
(tramp-set-completion-function
"multi" nil)
(tramp-set-completion-function
(tramp-set-completion-function
"scpx" tramp-completion-function-alist-ssh)
(tramp-set-completion-function
"sshx" tramp-completion-function-alist-ssh)
@ -1536,9 +1536,9 @@ cat /tmp/tramp.$$
rm -f /tmp/tramp.$$
}"
"Shell function to implement `uudecode' to standard output.
Many systems support `uudecode -o /dev/stdout' for this or
`uudecode -o -' or `uudecode -p', but some systems don't, and for
them we have this shell function.")
Many systems support `uudecode -o /dev/stdout' or `uudecode -o -'
for this or `uudecode -p', but some systems don't, and for them
we have this shell function.")
;; Perl script to implement `file-attributes' in a Lisp `read'able
;; output. If you are hacking on this, note that you get *no* output
@ -1960,10 +1960,9 @@ If VAR is nil, then we bind `v' to the structure and `multi-method',
(put 'with-parsed-tramp-file-name 'lisp-indent-function 2)
;; To be activated for debugging containing this macro
;; It works only when VAR is nil. Otherwise, it can be deactivated by
;; (def-edebug-spec with-parsed-tramp-file-name 0)
;; (put 'with-parsed-tramp-file-name 'edebug-form-spec 0)
;; I'm too stupid to write a precise SPEC for it.
(if (functionp 'def-edebug-spec)
(def-edebug-spec with-parsed-tramp-file-name t))
(put 'with-parsed-tramp-file-name 'edebug-form-spec t)
(defmacro tramp-let-maybe (variable value &rest body)
"Let-bind VARIABLE to VALUE in BODY, but only if VARIABLE is not obsolete.
@ -2056,7 +2055,7 @@ target of the symlink differ."
(setq filename (tramp-file-name-localname
(tramp-dissect-file-name
(expand-file-name filename)))))
;; Right, they are on the same host, regardless of user, method, etc.
;; We now make the link on the remote machine. This will occur as the user
;; that FILENAME belongs to.
@ -2065,7 +2064,7 @@ target of the symlink differ."
l-multi-method l-method l-user l-host
(format "cd %s && %s -sf %s %s"
cwd ln
filename
filename
l-localname)
t)))))
@ -2347,9 +2346,9 @@ target of the symlink differ."
"file attributes with perl: %s"
(tramp-make-tramp-file-name
multi-method method user host localname))
(tramp-maybe-send-perl-script tramp-perl-file-attributes
"tramp_file_attributes"
multi-method method user host)
(tramp-maybe-send-perl-script multi-method method user host
tramp-perl-file-attributes
"tramp_file_attributes")
(tramp-send-command multi-method method user host
(format "tramp_file_attributes %s %s"
(tramp-shell-quote-argument localname) id-format))
@ -2394,7 +2393,12 @@ target of the symlink differ."
;; This function makes the same assumption as
;; `tramp-handle-set-visited-file-modtime'.
(defun tramp-handle-verify-visited-file-modtime (buf)
"Like `verify-visited-file-modtime' for tramp files."
"Like `verify-visited-file-modtime' for tramp files.
At the time `verify-visited-file-modtime' calls this function, we
already know that the buffer is visiting a file and that
`visited-file-modtime' does not return 0. Do not call this
function directly, unless those two cases are already taken care
of."
(with-current-buffer buf
;; There is no file visiting the buffer, or the buffer has no
;; recorded last modification time.
@ -2406,7 +2410,7 @@ target of the symlink differ."
(let* ((attr (file-attributes f))
(modtime (nth 5 attr))
(mt (visited-file-modtime)))
(cond
;; file exists, and has a known modtime.
((and attr (not (equal modtime '(0 0))))
@ -2689,9 +2693,9 @@ if the remote host can't provide the modtime."
(save-excursion
(setq directory (tramp-handle-expand-file-name directory))
(with-parsed-tramp-file-name directory nil
(tramp-maybe-send-perl-script tramp-perl-directory-files-and-attributes
"tramp_directory_files_and_attributes"
multi-method method user host)
(tramp-maybe-send-perl-script multi-method method user host
tramp-perl-directory-files-and-attributes
"tramp_directory_files_and_attributes")
(tramp-send-command multi-method method user host
(format "tramp_directory_files_and_attributes %s %s"
(tramp-shell-quote-argument localname)
@ -2753,7 +2757,7 @@ if the remote host can't provide the modtime."
(push (buffer-substring (point)
(tramp-line-end-position))
result))
(tramp-send-command multi-method method user host "cd")
(tramp-wait-for-output)
@ -3096,6 +3100,12 @@ be a local filename. The method used must be an out-of-band method."
;; Use an asynchronous process. By this, password can be handled.
(save-excursion
;; Check for program.
(when (and (fboundp 'executable-find)
(not (executable-find copy-program)))
(error "Cannot find copy program: %s" copy-program))
(set-buffer trampbuf)
(setq tramp-current-multi-method multi-method
tramp-current-method method
@ -3170,15 +3180,15 @@ This is like `dired-recursive-delete-directory' for tramp files."
'file-error
(list "Removing old file name" "no such directory" filename)))
;; Which is better, -r or -R? (-r works for me <daniel@danann.net>)
(tramp-send-command multi-method method user host
(tramp-send-command multi-method method user host
(format "rm -r %s" (tramp-shell-quote-argument localname)))
;; Wait for the remote system to return to us...
;; This might take a while, allow it plenty of time.
(tramp-wait-for-output 120)
;; Make sure that it worked...
(and (file-exists-p filename)
(error "Failed to recusively delete %s" filename))))
(error "Failed to recursively delete %s" filename))))
(defun tramp-handle-dired-call-process (program discard &rest arguments)
"Like `dired-call-process' for tramp files."
(with-parsed-tramp-file-name default-directory nil
@ -3200,7 +3210,7 @@ This is like `dired-recursive-delete-directory' for tramp files."
(tramp-send-command-and-check multi-method method user host nil)
(tramp-send-command multi-method method user host "cd")
(tramp-wait-for-output)))))
(defun tramp-handle-dired-compress-file (file &rest ok-flag)
"Like `dired-compress-file' for tramp files."
;; OK-FLAG is valid for XEmacs only, but not implemented.
@ -3568,7 +3578,7 @@ This will break if COMMAND prints a newline, followed by the value of
(when (and (numberp buffer) (zerop buffer))
(error "Implementation does not handle immediate return"))
(when (consp buffer) (error "Implementation does not handle error files"))
(shell-command
(shell-command
(mapconcat 'tramp-shell-quote-argument
(cons program args)
" ")
@ -4250,7 +4260,7 @@ necessary anymore."
;; `tramp-completion-file-name-regexp-unified' aren't different.
;; If nil, `tramp-completion-run-real-handler' is called (i.e. forwarding to
;; `tramp-file-name-handler'). Otherwise, it takes `tramp-run-real-handler'.
;; Using `last-input-event' is a little bit risky, because completing a file
;; Using `last-input-event' is a little bit risky, because completing a file
;; might require loading other files, like "~/.netrc", and for them it
;; shouldn't be decided based on that variable. On the other hand, those files
;; shouldn't have partial tramp file name syntax. Maybe another variable should
@ -4354,7 +4364,7 @@ necessary anymore."
(funcall (nth 0 x) (nth 1 x)))))
(tramp-get-completion-function m))
(setq result (append result
(setq result (append result
(mapcar
(lambda (x)
(tramp-get-completion-user-host
@ -4395,7 +4405,7 @@ necessary anymore."
;; [nil nil "x" nil nil]
;; [nil "x" nil nil nil]
;; "/x:" "/x:y" "/x:y:"
;; "/x:" "/x:y" "/x:y:"
;; [nil nil nil "x" ""] [nil nil nil "x" "y"] [nil "x" nil "y" ""]
;; "/[x/" "/[x/y"
;; [nil "x" nil "" nil] [nil "x" nil "y" nil]
@ -4769,7 +4779,7 @@ User may be nil."
;;; Internal Functions:
(defun tramp-maybe-send-perl-script (script name multi-method method user host)
(defun tramp-maybe-send-perl-script (multi-method method user host script name)
"Define in remote shell function NAME implemented as perl SCRIPT.
Only send the definition if it has not already been done.
Function may have 0-3 parameters."
@ -4864,7 +4874,7 @@ TIME is an Emacs internal time value as returned by `current-time'."
"touch" nil (current-buffer) nil "-t" touch-time file))
(pop-to-buffer (current-buffer))
(error "tramp-touch: touch failed"))))))
(defun tramp-buffer-name (multi-method method user host)
"A name for the connection buffer for USER at HOST using METHOD."
(if multi-method
@ -5022,7 +5032,7 @@ file exists and nonzero exit status otherwise."
(file-exists-p existing)
(not (file-exists-p nonexisting))))
(error "Couldn't find command to check if file exists."))))
;; CCC test ksh or bash found for tilde expansion?
(defun tramp-find-shell (multi-method method user host)
@ -5121,9 +5131,9 @@ Returns nil if none was found, else the command is returned."
(tramp-check-ls-commands multi-method method user host "gnuls" tramp-remote-path)
(tramp-check-ls-commands multi-method method user host "gls" tramp-remote-path)))
;; ------------------------------------------------------------
;; -- Functions for establishing connection --
;; ------------------------------------------------------------
;; ------------------------------------------------------------
;; -- Functions for establishing connection --
;; ------------------------------------------------------------
;; The following functions are actions to be taken when seeing certain
;; prompts from the remote host. See the variable
@ -5364,7 +5374,7 @@ Maybe the different regular expressions need to be tuned.
(when multi-method
(error "Cannot multi-connect using telnet connection method"))
(tramp-pre-connection multi-method method user host)
(tramp-message 7 "Opening connection for %s@%s using %s..."
(tramp-message 7 "Opening connection for %s@%s using %s..."
(or user (user-login-name)) host method)
(let ((process-environment (copy-sequence process-environment)))
(setenv "TERM" tramp-terminal-type)
@ -5398,7 +5408,7 @@ Maybe the different regular expressions need to be tuned.
p multi-method method user host)
(tramp-post-connection multi-method method user host)))))
(defun tramp-open-connection-rsh (multi-method method user host)
"Open a connection using an rsh METHOD.
This starts the command `rsh HOST -l USER'[*], then waits for a remote
@ -5423,7 +5433,7 @@ arguments, and xx will be used as the host name to connect to.
(error "Cannot multi-connect using rsh connection method"))
(tramp-pre-connection multi-method method user host)
(if (and user (not (string= user "")))
(tramp-message 7 "Opening connection for %s@%s using %s..."
(tramp-message 7 "Opening connection for %s@%s using %s..."
user host method)
(tramp-message 7 "Opening connection at %s using %s..." host method))
(let ((process-environment (copy-sequence process-environment))
@ -5452,9 +5462,9 @@ arguments, and xx will be used as the host name to connect to.
(> emacs-major-version 20))
tramp-dos-coding-system))
(p (if (and user (not (string= user "")))
(apply #'start-process bufnam buf login-program
(apply #'start-process bufnam buf login-program
real-host "-l" user login-args)
(apply #'start-process bufnam buf login-program
(apply #'start-process bufnam buf login-program
real-host login-args)))
(found nil))
(tramp-set-process-query-on-exit-flag p nil)
@ -5524,10 +5534,10 @@ prompt than you do, so it is not at all unlikely that the variable
tramp-actions-before-shell)
(tramp-open-connection-setup-interactive-shell
p multi-method method user host)
(tramp-post-connection multi-method method
(tramp-post-connection multi-method method
user host)))))
;; HHH: Not Changed. Multi method. It is not clear to me how this can
;; HHH: Not Changed. Multi method. It is not clear to me how this can
;; handle not giving a user name in the "file name".
;;
;; This is more difficult than for the single-hop method. In the
@ -5597,7 +5607,7 @@ log in as u2 to h2."
(tramp-post-connection multi-method method user host)))))
;; HHH: Changed. Multi method. Don't know how to handle this in the case
;; of no user name provided. Hack to make it work as it did before:
;; of no user name provided. Hack to make it work as it did before:
;; changed `user' to `(or user (user-login-name))' in the places where
;; the value is actually used.
(defun tramp-multi-connect-telnet (p method user host command)
@ -5619,8 +5629,8 @@ If USER is nil, uses the return value of (user-login-name) instead."
(tramp-process-multi-actions p method user host
tramp-multi-actions)))
;; HHH: Changed. Multi method. Don't know how to handle this in the case
;; of no user name provided. Hack to make it work as it did before:
;; HHH: Changed. Multi method. Don't know how to handle this in the case
;; of no user name provided. Hack to make it work as it did before:
;; changed `user' to `(or user (user-login-name))' in the places where
;; the value is actually used.
(defun tramp-multi-connect-rlogin (p method user host command)
@ -5645,8 +5655,8 @@ If USER is nil, uses the return value of (user-login-name) instead."
(tramp-process-multi-actions p method user host
tramp-multi-actions)))
;; HHH: Changed. Multi method. Don't know how to handle this in the case
;; of no user name provided. Hack to make it work as it did before:
;; HHH: Changed. Multi method. Don't know how to handle this in the case
;; of no user name provided. Hack to make it work as it did before:
;; changed `user' to `(or user (user-login-name))' in the places where
;; the value is actually used.
(defun tramp-multi-connect-su (p method user host command)
@ -6276,7 +6286,7 @@ Sends COMMAND, then waits 30 seconds for shell prompt."
(tramp-barf-if-no-shell-prompt
nil 30
"Couldn't `%s', see buffer `%s'" command (buffer-name)))
(defun tramp-wait-for-output (&optional timeout)
"Wait for output from remote rsh command."
(let ((proc (get-buffer-process (current-buffer)))
@ -6609,9 +6619,9 @@ Not actually used. Use `(format \"%o\" i)' instead?"
""))
;; ------------------------------------------------------------
;; -- TRAMP file names --
;; ------------------------------------------------------------
;; ------------------------------------------------------------
;; -- TRAMP file names --
;; ------------------------------------------------------------
;; Conversion functions between external representation and
;; internal data structure. Convenience functions for internal
;; data structure.
@ -6622,7 +6632,7 @@ Not actually used. Use `(format \"%o\" i)' instead?"
"Return t iff NAME is a tramp file."
(save-match-data
(string-match tramp-file-name-regexp name)))
;; HHH: Changed. Used to assign the return value of (user-login-name)
;; to the `user' part of the structure if a user name was not
;; provided, now it assigns nil.
@ -6675,7 +6685,7 @@ This is MULTI-METHOD, if non-nil. Otherwise, it is METHOD, if non-nil.
If both MULTI-METHOD and METHOD are nil, do a lookup in
`tramp-default-method-alist'."
(or multi-method method (tramp-find-default-method user host)))
;; HHH: Not Changed. Multi method. Will probably not handle the case where
;; a user name is not provided in the "file name" very well.
(defun tramp-dissect-multi-file-name (name)
@ -6847,7 +6857,7 @@ as default."
(if entry
(second entry)
(symbol-value param))))
;; Auto saving to a special directory.
@ -7039,9 +7049,9 @@ exiting if process is running."
process flag)))
;; ------------------------------------------------------------
;; -- Kludges section --
;; ------------------------------------------------------------
;; ------------------------------------------------------------
;; -- Kludges section --
;; ------------------------------------------------------------
;; Currently (as of Emacs 20.5), the function `shell-quote-argument'
;; does not deal well with newline characters. Newline is replaced by
@ -7304,7 +7314,7 @@ report.
;; strange when doing zerop, we should kill the process and start
;; again. (Greg Stark)
;; * Add caching for filename completion. (Greg Stark)
;; Of course, this has issues with usability (stale cache bites)
;; Of course, this has issues with usability (stale cache bites)
;; -- <daniel@danann.net>
;; * Provide a local cache of old versions of remote files for the rsync
;; transfer method to use. (Greg Stark)

View file

@ -30,7 +30,7 @@
;; are auto-frobbed from configure.ac, so you should edit that file and run
;; "autoconf && ./configure" to change them.
(defconst tramp-version "2.0.45"
(defconst tramp-version "2.0.46"
"This version of Tramp.")
(defconst tramp-bug-report-address "tramp-devel@mail.freesoftware.fsf.org"

View file

@ -380,6 +380,8 @@ This variable is buffer local and only used in the *cvs* buffer.")
("+" . cvs-mode-tree)
;; mouse bindings
([mouse-2] . cvs-mode-find-file)
([follow-link] . (lambda (pos)
(if (eq (get-char-property pos 'face) 'cvs-filename-face) t)))
([(down-mouse-3)] . cvs-menu)
;; dired-like bindings
("\C-o" . cvs-mode-display-file)

View file

@ -33,10 +33,11 @@
;; `zone-programs'. See `zone-call' for higher-ordered zoning.
;; WARNING: Not appropriate for Emacs sessions over modems or
;; computers as slow as mine.
;; computers as slow as mine.
;; THANKS: Christopher Mayer, Scott Flinchbaugh, Rachel Kalmar,
;; Max Froumentin.
;; THANKS: Christopher Mayer, Scott Flinchbaugh,
;; Rachel Kalmar, Max Froumentin, Juri Linkov,
;; Luigi Panzeri, John Paul Wallington.
;;; Code:
@ -140,19 +141,28 @@ If the element is a function or a list of a function and a number,
(window-start)))))
(put 'zone 'orig-buffer (current-buffer))
(put 'zone 'modeline-hidden-level 0)
(set-buffer outbuf)
(switch-to-buffer outbuf)
(setq mode-name "Zone")
(erase-buffer)
(setq buffer-undo-list t
truncate-lines t
tab-width (zone-orig tab-width)
line-spacing (zone-orig line-spacing))
(insert text)
(switch-to-buffer outbuf)
(setq buffer-undo-list t)
(untabify (point-min) (point-max))
(set-window-start (selected-window) (point-min))
(set-window-point (selected-window) wp)
(sit-for 0 500)
(let ((pgm (elt zone-programs (random (length zone-programs))))
(ct (and f (frame-parameter f 'cursor-type))))
(when ct (modify-frame-parameters f '((cursor-type . (bar . 0)))))
(ct (and f (frame-parameter f 'cursor-type)))
(restore (list '(kill-buffer outbuf))))
(when ct
(modify-frame-parameters f '((cursor-type . (bar . 0))))
(setq restore (cons '(modify-frame-parameters
f (list (cons 'cursor-type ct)))
restore)))
;; Make `restore' a self-disabling one-shot thunk.
(setq restore `(lambda () ,@restore (setq restore nil)))
(condition-case nil
(progn
(message "Zoning... (%s)" pgm)
@ -166,14 +176,17 @@ If the element is a function or a list of a function and a number,
(zone-call pgm)
(message "Zoning...sorry"))
(error
(funcall restore)
(while (not (input-pending-p))
(message (format "We were zoning when we wrote %s..." pgm))
(sit-for 3)
(message "...here's hoping we didn't hose your buffer!")
(sit-for 3)))
(quit (ding) (message "Zoning...sorry")))
(when ct (modify-frame-parameters f (list (cons 'cursor-type ct)))))
(kill-buffer outbuf)))
(quit
(funcall restore)
(ding)
(message "Zoning...sorry")))
(when restore (funcall restore)))))
;;;; Zone when idle, or not.
@ -195,13 +208,11 @@ If the element is a function or a list of a function and a number,
(message "I won't zone out any more"))
;;;; zone-pgm-jitter
;;;; jittering
(defun zone-shift-up ()
(let* ((b (point))
(e (progn
(end-of-line)
(if (looking-at "\n") (1+ (point)) (point))))
(e (progn (forward-line 1) (point)))
(s (buffer-substring b e)))
(delete-region b e)
(goto-char (point-max))
@ -209,48 +220,40 @@ If the element is a function or a list of a function and a number,
(defun zone-shift-down ()
(goto-char (point-max))
(forward-line -1)
(beginning-of-line)
(let* ((b (point))
(e (progn
(end-of-line)
(if (looking-at "\n") (1+ (point)) (point))))
(e (progn (forward-line -1) (point)))
(s (buffer-substring b e)))
(delete-region b e)
(goto-char (point-min))
(insert s)))
(defun zone-shift-left ()
(while (not (eobp))
(or (eolp)
(let ((c (following-char)))
(delete-char 1)
(end-of-line)
(insert c)))
(forward-line 1)))
(let (s)
(while (not (eobp))
(unless (eolp)
(setq s (buffer-substring (point) (1+ (point))))
(delete-char 1)
(end-of-line)
(insert s))
(forward-char 1))))
(defun zone-shift-right ()
(while (not (eobp))
(end-of-line)
(or (bolp)
(let ((c (preceding-char)))
(delete-backward-char 1)
(beginning-of-line)
(insert c)))
(forward-line 1)))
(goto-char (point-max))
(end-of-line)
(let (s)
(while (not (bobp))
(unless (bolp)
(setq s (buffer-substring (1- (point)) (point)))
(delete-char -1)
(beginning-of-line)
(insert s))
(end-of-line 0))))
(defun zone-pgm-jitter ()
(let ((ops [
zone-shift-left
zone-shift-left
zone-shift-left
zone-shift-left
zone-shift-right
zone-shift-down
zone-shift-down
zone-shift-down
zone-shift-down
zone-shift-down
zone-shift-up
]))
(goto-char (point-min))
@ -260,7 +263,7 @@ If the element is a function or a list of a function and a number,
(sit-for 0 10))))
;;;; zone-pgm-whack-chars
;;;; whacking chars
(defun zone-pgm-whack-chars ()
(let ((tbl (copy-sequence (get 'zone-pgm-whack-chars 'wc-tbl))))
@ -280,7 +283,7 @@ If the element is a function or a list of a function and a number,
(setq i (1+ i)))
tbl))
;;;; zone-pgm-dissolve
;;;; dissolving
(defun zone-remove-text ()
(let ((working t))
@ -305,11 +308,11 @@ If the element is a function or a list of a function and a number,
(zone-pgm-jitter))
;;;; zone-pgm-explode
;;;; exploding
(defun zone-exploding-remove ()
(let ((i 0))
(while (< i 20)
(while (< i 5)
(save-excursion
(goto-char (point-min))
(while (not (eobp))
@ -328,7 +331,7 @@ If the element is a function or a list of a function and a number,
(zone-pgm-jitter))
;;;; zone-pgm-putz-with-case
;;;; putzing w/ case
;; Faster than `zone-pgm-putz-with-case', but not as good: all
;; instances of the same letter have the same case, which produces a
@ -377,7 +380,7 @@ If the element is a function or a list of a function and a number,
(sit-for 0 2)))
;;;; zone-pgm-rotate
;;;; rotating
(defun zone-line-specs ()
(let (ret)
@ -439,66 +442,84 @@ If the element is a function or a list of a function and a number,
(zone-pgm-rotate (lambda () (1- (- (random 3))))))
;;;; zone-pgm-drip
;;;; dripping
(defun zone-cpos (pos)
(defsubst zone-cpos (pos)
(buffer-substring pos (1+ pos)))
(defun zone-fret (pos)
(defsubst zone-replace-char (count del-count char-as-string new-value)
(delete-char (or del-count (- count)))
(aset char-as-string 0 new-value)
(dotimes (i count) (insert char-as-string)))
(defsubst zone-park/sit-for (pos seconds)
(let ((p (point)))
(goto-char pos)
(prog1 (sit-for seconds)
(goto-char p))))
(defun zone-fret (wbeg pos)
(let* ((case-fold-search nil)
(c-string (zone-cpos pos))
(cw-ceil (ceiling (char-width (aref c-string 0))))
(hmm (cond
((string-match "[a-z]" c-string) (upcase c-string))
((string-match "[A-Z]" c-string) (downcase c-string))
(t " "))))
(t (propertize " " 'display `(space :width ,cw-ceil))))))
(do ((i 0 (1+ i))
(wait 0.5 (* wait 0.8)))
((= i 20))
(goto-char pos)
(delete-char 1)
(insert (if (= 0 (% i 2)) hmm c-string))
(sit-for wait))
(zone-park/sit-for wbeg wait))
(delete-char -1) (insert c-string)))
(defun zone-fill-out-screen (width height)
(save-excursion
(goto-char (point-min))
(let ((start (window-start))
(line (make-string width 32)))
(goto-char start)
;; fill out rectangular ws block
(while (not (eobp))
(end-of-line)
(let ((cc (current-column)))
(if (< cc width)
(insert (make-string (- width cc) 32))
(delete-char (- width cc))))
(unless (eobp)
(forward-char 1)))
(while (progn (end-of-line)
(let ((cc (current-column)))
(if (< cc width)
(insert (substring line cc))
(delete-char (- width cc)))
(cond ((eobp) (insert "\n") nil)
(t (forward-char 1) t)))))
;; pad ws past bottom of screen
(let ((nl (- height (count-lines (point-min) (point)))))
(when (> nl 0)
(let ((line (concat (make-string (1- width) ? ) "\n")))
(do ((i 0 (1+ i)))
((= i nl))
(insert line)))))))
(setq line (concat line "\n"))
(do ((i 0 (1+ i)))
((= i nl))
(insert line))))
(goto-char start)
(recenter 0)
(sit-for 0)))
(defun zone-fall-through-ws (c col wend)
(let ((fall-p nil) ; todo: move outward
(wait 0.15)
(o (point)) ; for terminals w/o cursor hiding
(p (point)))
(while (progn
(forward-line 1)
(move-to-column col)
(looking-at " "))
(setq fall-p t)
(delete-char 1)
(insert (if (< (point) wend) c " "))
(save-excursion
(goto-char p)
(delete-char 1)
(insert " ")
(goto-char o)
(sit-for (setq wait (* wait 0.8))))
(setq p (1- (point))))
(defun zone-fall-through-ws (c wbeg wend)
(let* ((cw-ceil (ceiling (char-width (aref c 0))))
(spaces (make-string cw-ceil 32))
(col (current-column))
(wait 0.15)
newpos fall-p)
(while (when (save-excursion
(next-line 1)
(and (= col (current-column))
(setq newpos (point))
(string= spaces (buffer-substring-no-properties
newpos (+ newpos cw-ceil)))
(setq newpos (+ newpos (1- cw-ceil)))))
(setq fall-p t)
(delete-char 1)
(insert spaces)
(goto-char newpos)
(when (< (point) wend)
(delete-char cw-ceil)
(insert c)
(forward-char -1)
(zone-park/sit-for wbeg (setq wait (* wait 0.8))))))
fall-p))
(defun zone-pgm-drip (&optional fret-p pancake-p)
@ -506,41 +527,35 @@ If the element is a function or a list of a function and a number,
(wh (window-height))
(mc 0) ; miss count
(total (* ww wh))
(fall-p nil))
(fall-p nil)
wbeg wend c)
(zone-fill-out-screen ww wh)
(setq wbeg (window-start)
wend (window-end))
(catch 'done
(while (not (input-pending-p))
(let ((wbeg (window-start))
(wend (window-end)))
(setq mc 0)
;; select non-ws character, but don't miss too much
(goto-char (+ wbeg (random (- wend wbeg))))
(while (looking-at "[ \n\f]")
(if (= total (setq mc (1+ mc)))
(throw 'done 'sel)
(goto-char (+ wbeg (random (- wend wbeg))))))
;; character animation sequence
(let ((p (point)))
(when fret-p (zone-fret p))
(goto-char p)
(setq fall-p (zone-fall-through-ws
(zone-cpos p) (current-column) wend))))
(setq mc 0 wend (window-end))
;; select non-ws character, but don't miss too much
(goto-char (+ wbeg (random (- wend wbeg))))
(while (looking-at "[ \n\f]")
(if (= total (setq mc (1+ mc)))
(throw 'done 'sel)
(goto-char (+ wbeg (random (- wend wbeg))))))
;; character animation sequence
(let ((p (point)))
(when fret-p (zone-fret wbeg p))
(goto-char p)
(setq c (zone-cpos p)
fall-p (zone-fall-through-ws c wbeg wend)))
;; assuming current-column has not changed...
(when (and pancake-p
fall-p
(< (count-lines (point-min) (point))
wh))
(previous-line 1)
(forward-char 1)
(sit-for 0.137)
(delete-char -1)
(insert "@")
(sit-for 0.137)
(delete-char -1)
(insert "*")
(sit-for 0.137)
(delete-char -1)
(insert "_"))))))
(let ((cw (ceiling (char-width (aref c 0)))))
(zone-replace-char cw 1 c ?@) (zone-park/sit-for wbeg 0.137)
(zone-replace-char cw nil c ?*) (zone-park/sit-for wbeg 0.137)
(zone-replace-char cw nil c ?_)))))))
(defun zone-pgm-drip-fretfully ()
(zone-pgm-drip t))
@ -552,7 +567,7 @@ If the element is a function or a list of a function and a number,
(zone-pgm-drip t t))
;;;; zone-pgm-paragraph-spaz
;;;; paragraph spazzing (for textish modes)
(defun zone-pgm-paragraph-spaz ()
(if (memq (zone-orig major-mode)
@ -633,30 +648,29 @@ If nil, `zone-pgm-random-life' chooses a value from 0-3 (inclusive).")
(rtc (- (frame-width) 11))
(min (window-start))
(max (1- (window-end)))
c col)
s c col)
(delete-region max (point-max))
(while (progn (goto-char (+ min (random max)))
(and (sit-for 0.005)
(while (and (progn (goto-char min) (sit-for 0.05))
(progn (goto-char (+ min (random max)))
(or (progn (skip-chars-forward " @\n" max)
(not (= max (point))))
(unless (or (= 0 (skip-chars-backward " @\n" min))
(= min (point)))
(forward-char -1)
t))))
(setq c (char-after))
(unless (or (not c) (= ?\n c))
(forward-char 1)
(insert-and-inherit ; keep colors
(cond ((or (> top (point))
(< bot (point))
(or (> 11 (setq col (current-column)))
(< rtc col)))
32)
((and (<= ?a c) (>= ?z c)) (+ c (- ?A ?a)))
((and (<= ?A c) (>= ?Z c)) ?*)
(t ?@)))
(forward-char -1)
(delete-char -1)))
(unless (or (eolp) (eobp))
(setq s (zone-cpos (point))
c (aref s 0))
(zone-replace-char
(char-width c)
1 s (cond ((or (> top (point))
(< bot (point))
(or (> 11 (setq col (current-column)))
(< rtc col)))
32)
((and (<= ?a c) (>= ?z c)) (+ c (- ?A ?a)))
((and (<= ?A c) (>= ?Z c)) ?*)
(t ?@)))))
(sit-for 3)
(setq col nil)
(goto-char bot)
@ -666,8 +680,13 @@ If nil, `zone-pgm-random-life' chooses a value from 0-3 (inclusive).")
(setq col (cons (buffer-substring (point) c) col))
(end-of-line 0)
(forward-char -10))
(let ((life-patterns (vector (cons (make-string (length (car col)) 32)
col))))
(let ((life-patterns (vector
(if (and col (search-forward "@" max t))
(cons (make-string (length (car col)) 32) col)
(list (mapconcat 'identity
(make-list (/ (- rtc 11) 15)
(make-string 5 ?@))
(make-string 10 32)))))))
(life (or zone-pgm-random-life-wait (random 4)))
(kill-buffer nil))))

View file

@ -1044,6 +1044,7 @@ exited abnormally with code %d\n"
(defvar compilation-minor-mode-map
(let ((map (make-sparse-keymap)))
(define-key map [mouse-2] 'compile-goto-error)
(define-key map [follow-link] 'mouse-face)
(define-key map "\C-c\C-c" 'compile-goto-error)
(define-key map "\C-m" 'compile-goto-error)
(define-key map "\C-c\C-k" 'kill-compilation)
@ -1073,6 +1074,7 @@ exited abnormally with code %d\n"
(defvar compilation-button-map
(let ((map (make-sparse-keymap)))
(define-key map [mouse-2] 'compile-goto-error)
(define-key map [follow-link] 'mouse-face)
(define-key map "\C-m" 'compile-goto-error)
map)
"Keymap for compilation-message buttons.")
@ -1084,6 +1086,7 @@ exited abnormally with code %d\n"
;; because that introduces a menu bar item we don't want.
;; That confuses C-down-mouse-3.
(define-key map [mouse-2] 'compile-goto-error)
(define-key map [follow-link] 'mouse-face)
(define-key map "\C-c\C-c" 'compile-goto-error)
(define-key map "\C-m" 'compile-goto-error)
(define-key map "\C-c\C-k" 'kill-compilation)

View file

@ -199,20 +199,20 @@ non-executable files."
(file-modes buffer-file-name)))))))
;;;###autoload
(defun executable-interpret (command)
"Run script with user-specified args, and collect output in a buffer.
While script runs asynchronously, you can use the \\[next-error] command
to find the next error."
While script runs asynchronously, you can use the \\[next-error]
command to find the next error. The buffer is also in `comint-mode' and
`compilation-shell-minor-mode', so that you can answer any prompts."
(interactive (list (read-string "Run script: "
(or executable-command
buffer-file-name))))
(require 'compile)
(save-some-buffers (not compilation-ask-about-save))
(make-local-variable 'executable-command)
(compile-internal (setq executable-command command)
"No more errors." "Interpretation"
;; Give it a simpler regexp to match.
nil executable-error-regexp-alist))
(set (make-local-variable 'executable-command) command)
(let ((compilation-error-regexp-alist executable-error-regexp-alist))
(compilation-start command t (lambda (x) "*interpretation*"))))

View file

@ -275,6 +275,9 @@ Notice that using \\[next-error] or \\[compile-goto-error] modifies
(defvar grep-error-face compilation-error-face
"Face name to use for grep error messages.")
(defvar grep-match-face 'match
"Face name to use for grep matches.")
(defvar grep-mode-font-lock-keywords
'(;; Command output lines.
("^\\([A-Za-z_0-9/\.+-]+\\)[ \t]*:" 1 font-lock-function-name-face)
@ -291,7 +294,7 @@ Notice that using \\[next-error] or \\[compile-goto-error] modifies
(2 compilation-line-face))
;; Highlight grep matches and delete markers
("\\(\033\\[01;41m\\)\\(.*?\\)\\(\033\\[00m\\)"
(2 compilation-column-face)
(2 grep-match-face)
((lambda (p))
(progn
;; Delete markers with `replace-match' because it updates

View file

@ -5,7 +5,7 @@
;; Author: Thien-Thi Nguyen <ttn@gnu.org>
;; Dan Nicolaescu <dann@ics.uci.edu>
;; Keywords: C C++ java lisp tools editing comments blocks hiding outlines
;; Maintainer-Version: 5.31
;; Maintainer-Version: 5.39.2.8
;; Time-of-Day-Author-Most-Likely-to-be-Recalcitrant: early morning
;; This file is part of GNU Emacs.
@ -58,7 +58,7 @@
;;
;; (load-library "hideshow")
;; (add-hook 'X-mode-hook ; other modes similarly
;; '(lambda () (hs-minor-mode 1)))
;; (lambda () (hs-minor-mode 1)))
;;
;; where X = {emacs-lisp,c,c++,perl,...}. You can also manually toggle
;; hideshow minor mode by typing `M-x hs-minor-mode'. After hideshow is
@ -133,10 +133,7 @@
;; variable `hs-special-modes-alist'. Packages that use hideshow should
;; do something like:
;;
;; (let ((my-mode-hs-info '(my-mode "{{" "}}" ...)))
;; (if (not (member my-mode-hs-info hs-special-modes-alist))
;; (setq hs-special-modes-alist
;; (cons my-mode-hs-info hs-special-modes-alist))))
;; (add-to-list 'hs-special-modes-alist '(my-mode "{{" "}}" ...))
;;
;; If you have an entry that works particularly well, consider
;; submitting it for inclusion in hideshow.el. See docstring for
@ -180,9 +177,9 @@
;; In the case of `vc-diff', here is a less invasive workaround:
;;
;; (add-hook 'vc-before-checkin-hook
;; '(lambda ()
;; (goto-char (point-min))
;; (hs-show-block)))
;; (lambda ()
;; (goto-char (point-min))
;; (hs-show-block)))
;;
;; Unfortunately, these workarounds do not restore hideshow state.
;; If someone figures out a better way, please let me know.
@ -223,6 +220,7 @@
;;; Code:
(require 'easymenu)
(eval-when-compile (require 'cl))
;;---------------------------------------------------------------------------
;; user-configurable variables
@ -265,8 +263,7 @@ This has effect iff `search-invisible' is set to `open'."
'((c-mode "{" "}" "/[*/]" nil hs-c-like-adjust-block-beginning)
(c++-mode "{" "}" "/[*/]" nil hs-c-like-adjust-block-beginning)
(bibtex-mode ("^@\\S(*\\(\\s(\\)" 1))
(java-mode "{" "}" "/[*/]" nil hs-c-like-adjust-block-beginning)
)
(java-mode "{" "}" "/[*/]" nil hs-c-like-adjust-block-beginning))
"*Alist for initializing the hideshow variables for different modes.
Each element has the form
(MODE START END COMMENT-START FORWARD-SEXP-FUNC ADJUST-BEG-FUNC).
@ -378,28 +375,6 @@ Note that `mode-line-format' is buffer-local.")
;;---------------------------------------------------------------------------
;; system dependency
; ;; xemacs compatibility
; (when (string-match "xemacs\\|lucid" emacs-version)
; ;; use pre-packaged compatiblity layer
; (require 'overlay))
;
; ;; xemacs and emacs-19 compatibility
; (when (or (not (fboundp 'add-to-invisibility-spec))
; (not (fboundp 'remove-from-invisibility-spec)))
; ;; `buffer-invisibility-spec' mutators snarfed from Emacs 20.3 lisp/subr.el
; (defun add-to-invisibility-spec (arg)
; (cond
; ((or (null buffer-invisibility-spec) (eq buffer-invisibility-spec t))
; (setq buffer-invisibility-spec (list arg)))
; (t
; (setq buffer-invisibility-spec
; (cons arg buffer-invisibility-spec)))))
; (defun remove-from-invisibility-spec (arg)
; (when buffer-invisibility-spec
; (setq buffer-invisibility-spec
; (delete arg buffer-invisibility-spec)))))
;; hs-match-data
(defalias 'hs-match-data 'match-data)
;;---------------------------------------------------------------------------
@ -409,12 +384,9 @@ Note that `mode-line-format' is buffer-local.")
"Delete hideshow overlays in region defined by FROM and TO."
(when (< to from)
(setq from (prog1 to (setq to from))))
(let ((ovs (overlays-in from to)))
(while ovs
(let ((ov (car ovs)))
(when (overlay-get ov 'hs)
(delete-overlay ov)))
(setq ovs (cdr ovs)))))
(dolist (ov (overlays-in from to))
(when (overlay-get ov 'hs)
(delete-overlay ov))))
(defun hs-isearch-show (ov)
"Delete overlay OV, and set `hs-headline' to nil.
@ -433,16 +405,16 @@ OV is shown.
This function is meant to be used as the `isearch-open-invisible-temporary'
property of an overlay."
(setq hs-headline
(if hide-p
nil
(or hs-headline
(let ((start (overlay-start ov)))
(buffer-substring
(save-excursion (goto-char start)
(beginning-of-line)
(skip-chars-forward " \t")
(point))
start)))))
(if hide-p
nil
(or hs-headline
(let ((start (overlay-start ov)))
(buffer-substring
(save-excursion (goto-char start)
(beginning-of-line)
(skip-chars-forward " \t")
(point))
start)))))
(force-mode-line-update)
(overlay-put ov 'invisible (and hide-p 'hs)))
@ -464,10 +436,10 @@ on what kind of block is to be hidden."
;; deprecated backward compatibility -- `block'<=>`code'
(and (eq 'block hs-isearch-open)
(eq 'code flag)))
(overlay-put overlay 'isearch-open-invisible 'hs-isearch-show)
(overlay-put overlay
'isearch-open-invisible-temporary
'hs-isearch-show-temporary))
(overlay-put overlay 'isearch-open-invisible 'hs-isearch-show)
(overlay-put overlay
'isearch-open-invisible-temporary
'hs-isearch-show-temporary))
overlay))))
(defun hs-forward-sexp (match-data arg)
@ -523,10 +495,10 @@ and then further adjusted to be at the end of the line."
(defun hs-safety-is-job-n ()
"Warn if `buffer-invisibility-spec' does not contain symbol `hs'."
(unless (and (listp buffer-invisibility-spec)
(assq 'hs buffer-invisibility-spec))
(message "Warning: `buffer-invisibility-spec' does not contain hs!!")
(sit-for 2)))
(unless (and (listp buffer-invisibility-spec)
(assq 'hs buffer-invisibility-spec))
(message "Warning: `buffer-invisibility-spec' does not contain hs!!")
(sit-for 2)))
(defun hs-inside-comment-p ()
"Return non-nil if point is inside a comment, otherwise nil.
@ -543,10 +515,15 @@ as cdr."
(let ((q (point)))
(when (or (looking-at hs-c-start-regexp)
(re-search-backward hs-c-start-regexp (point-min) t))
;; first get to the beginning of this comment...
(while (and (not (bobp))
(= (point) (progn (forward-comment -1) (point))))
(forward-char -1))
;; ...then extend backwards
(forward-comment (- (buffer-size)))
(skip-chars-forward " \t\n\f")
(let ((p (point))
(not-hidable nil))
(hidable t))
(beginning-of-line)
(unless (looking-at (concat "[ \t]*" hs-c-start-regexp))
;; we are in this situation: (example)
@ -565,19 +542,19 @@ as cdr."
(while (and (< (point) q)
(> (point) p)
(not (looking-at hs-c-start-regexp)))
(setq p (point));; use this to avoid an infinite cycle
(setq p (point)) ;; use this to avoid an infinite cycle
(forward-comment 1)
(skip-chars-forward " \t\n\f"))
(when (or (not (looking-at hs-c-start-regexp))
(> (point) q))
;; we cannot hide this comment block
(setq not-hidable t)))
(setq hidable nil)))
;; goto the end of the comment
(forward-comment (buffer-size))
(skip-chars-backward " \t\n\f")
(end-of-line)
(when (>= (point) q)
(list (if not-hidable nil p) (point))))))))
(list (and hidable p) (point))))))))
(defun hs-grok-mode-type ()
"Set up hideshow variables for new buffers.
@ -645,7 +622,7 @@ Return point, or nil if original point was not in a block."
(hs-hide-level-recursive (1- arg) minp maxp)
(goto-char (match-beginning hs-block-start-mdata-select))
(hs-hide-block-at-point t)))
(hs-safety-is-job-n)
(hs-safety-is-job-n)
(goto-char maxp))
(defmacro hs-life-goes-on (&rest body)
@ -675,8 +652,8 @@ and `case-fold-search' are both t."
(let ((overlays (overlays-at (point)))
(found nil))
(while (and (not found) (overlayp (car overlays)))
(setq found (overlay-get (car overlays) 'hs)
overlays (cdr overlays)))
(setq found (overlay-get (car overlays) 'hs)
overlays (cdr overlays)))
found)))
(defun hs-c-like-adjust-block-beginning (initial)
@ -724,7 +701,7 @@ If `hs-hide-comments-when-hiding-all' is non-nil, also hide the comments."
(funcall hs-hide-all-non-comment-function)
(hs-hide-block-at-point t)))
;; found a comment, probably
(let ((c-reg (hs-inside-comment-p))) ; blech!
(let ((c-reg (hs-inside-comment-p))) ; blech!
(when (and c-reg (car c-reg))
(if (> (count-lines (car c-reg) (nth 1 c-reg)) 1)
(hs-hide-block-at-point t c-reg)
@ -772,18 +749,15 @@ See documentation for functions `hs-hide-block' and `run-hooks'."
(or
;; first see if we have something at the end of the line
(catch 'eol-begins-hidden-region-p
(let ((here (point))
(ovs (save-excursion (end-of-line) (overlays-at (point)))))
(while ovs
(let ((ov (car ovs)))
(when (overlay-get ov 'hs)
(goto-char
(cond (end (overlay-end ov))
((eq 'comment (overlay-get ov 'hs)) here)
(t (+ (overlay-start ov) (overlay-get ov 'hs-ofs)))))
(delete-overlay ov)
(throw 'eol-begins-hidden-region-p t)))
(setq ovs (cdr ovs)))
(let ((here (point)))
(dolist (ov (save-excursion (end-of-line) (overlays-at (point))))
(when (overlay-get ov 'hs)
(goto-char
(cond (end (overlay-end ov))
((eq 'comment (overlay-get ov 'hs)) here)
(t (+ (overlay-start ov) (overlay-get ov 'hs-ofs)))))
(delete-overlay ov)
(throw 'eol-begins-hidden-region-p t)))
nil))
;; not immediately obvious, look for a suitable block
(let ((c-reg (hs-inside-comment-p))
@ -870,9 +844,9 @@ Key bindings:
(interactive "P")
(setq hs-headline nil
hs-minor-mode (if (null arg)
(not hs-minor-mode)
(> (prefix-numeric-value arg) 0)))
hs-minor-mode (if (null arg)
(not hs-minor-mode)
(> (prefix-numeric-value arg) 0)))
(if hs-minor-mode
(progn
(hs-grok-mode-type)
@ -912,27 +886,19 @@ Key bindings:
)))))
;; some housekeeping
(or (assq 'hs-minor-mode minor-mode-map-alist)
(setq minor-mode-map-alist
(cons (cons 'hs-minor-mode hs-minor-mode-map)
minor-mode-map-alist)))
(or (assq 'hs-minor-mode minor-mode-alist)
(setq minor-mode-alist (append minor-mode-alist
(list '(hs-minor-mode " hs")))))
(add-to-list 'minor-mode-map-alist (cons 'hs-minor-mode hs-minor-mode-map))
(add-to-list 'minor-mode-alist '(hs-minor-mode " hs") t)
;; make some variables permanently buffer-local
(let ((vars '(hs-minor-mode
hs-c-start-regexp
hs-block-start-regexp
hs-block-start-mdata-select
hs-block-end-regexp
hs-forward-sexp-func
hs-adjust-block-beginning)))
(while vars
(let ((var (car vars)))
(make-variable-buffer-local var)
(put var 'permanent-local t))
(setq vars (cdr vars))))
(dolist (var '(hs-minor-mode
hs-c-start-regexp
hs-block-start-regexp
hs-block-start-mdata-select
hs-block-end-regexp
hs-forward-sexp-func
hs-adjust-block-beginning))
(make-variable-buffer-local var)
(put var 'permanent-local t))
;;---------------------------------------------------------------------------
;; that's it

View file

@ -2571,7 +2571,9 @@ If not in a statement just moves to end of line. Returns position."
(let ((save-point (point)))
(when (re-search-forward ".*&" lim t)
(goto-char (match-end 0))
(if (idlwave-quoted) (goto-char save-point)))
(if (idlwave-quoted)
(goto-char save-point)
(if (eq (char-after (- (point) 2)) ?&) (goto-char save-point))))
(point)))
(defun idlwave-skip-label-or-case ()

View file

@ -735,16 +735,17 @@ Alternatively, click \\[occur-mode-mouse-goto] on an item to go to it.
Compatibility function for \\[next-error] invocations."
(interactive "p")
;; we need to run occur-find-match from within the Occur buffer
(with-current-buffer
(with-current-buffer
(if (next-error-buffer-p (current-buffer))
(current-buffer)
(next-error-find-buffer nil nil (lambda() (eq major-mode 'occur-mode))))
(when reset
(goto-char (point-min)))
(goto-char (cond (reset (point-min))
((< argp 0) (line-beginning-position))
((line-end-position))))
(occur-find-match
(abs (prefix-numeric-value argp))
(if (> 0 (prefix-numeric-value argp))
(abs argp)
(if (> 0 argp)
#'previous-single-property-change
#'next-single-property-change)
"No more matches")
@ -752,6 +753,20 @@ Compatibility function for \\[next-error] invocations."
(set-window-point (get-buffer-window (current-buffer)) (point))
(occur-mode-goto-occurrence)))
(defface match
'((((class color) (min-colors 88) (background light))
:background "Tan")
(((class color) (min-colors 88) (background dark))
:background "RoyalBlue4")
(((class color) (min-colors 8))
:background "blue" :foreground "white")
(((type tty) (class mono))
:inverse-video t)
(t :background "gray"))
"Face used to highlight matches permanently."
:group 'matching
:version "21.4")
(defcustom list-matching-lines-default-context-lines 0
"*Default number of context lines included around `list-matching-lines' matches.
A negative number means to include that many lines before the match.
@ -761,7 +776,7 @@ A positive number means to include that many lines both before and after."
(defalias 'list-matching-lines 'occur)
(defcustom list-matching-lines-face 'bold
(defcustom list-matching-lines-face 'match
"*Face used by \\[list-matching-lines] to show the text that matches.
If the value is nil, don't highlight the matching portions specially."
:type 'face
@ -776,18 +791,22 @@ If the value is nil, don't highlight the buffer names specially."
(defun occur-accumulate-lines (count &optional keep-props)
(save-excursion
(let ((forwardp (> count 0))
(result nil))
result beg end)
(while (not (or (zerop count)
(if forwardp
(eobp)
(bobp))))
(setq count (+ count (if forwardp -1 1)))
(setq beg (line-beginning-position)
end (line-end-position))
(if (and keep-props (boundp 'jit-lock-mode) jit-lock-mode
(text-property-not-all beg end 'fontified t))
(jit-lock-fontify-now beg end))
(push
(funcall (if keep-props
#'buffer-substring
#'buffer-substring-no-properties)
(line-beginning-position)
(line-end-position))
beg end)
result)
(forward-line (if forwardp 1 -1)))
(nreverse result))))
@ -982,14 +1001,17 @@ See also `multi-occur'."
(when (setq endpt (re-search-forward regexp nil t))
(setq matches (1+ matches)) ;; increment match count
(setq matchbeg (match-beginning 0))
(setq begpt (save-excursion
(goto-char matchbeg)
(line-beginning-position)))
(setq lines (+ lines (1- (count-lines origpt endpt))))
(save-excursion
(goto-char matchbeg)
(setq begpt (line-beginning-position)
endpt (line-end-position)))
(setq marker (make-marker))
(set-marker marker matchbeg)
(setq curstring (buffer-substring begpt
(line-end-position)))
(if (and keep-props (boundp 'jit-lock-mode) jit-lock-mode
(text-property-not-all begpt endpt 'fontified t))
(jit-lock-fontify-now begpt endpt))
(setq curstring (buffer-substring begpt endpt))
;; Depropertize the string, and maybe
;; highlight the matches
(let ((len (length curstring))
@ -998,17 +1020,15 @@ See also `multi-occur'."
(set-text-properties 0 len nil curstring))
(while (and (< start len)
(string-match regexp curstring start))
(add-text-properties (match-beginning 0)
(match-end 0)
(append
`(occur-match t)
(when match-face
;; Use `face' rather than
;; `font-lock-face' here
;; so as to override faces
;; copied from the buffer.
`(face ,match-face)))
curstring)
(add-text-properties
(match-beginning 0) (match-end 0)
(append
`(occur-match t)
(when match-face
;; Use `face' rather than `font-lock-face' here
;; so as to override faces copied from the buffer.
`(face ,match-face)))
curstring)
(setq start (match-end 0))))
;; Generate the string to insert for this match
(let* ((out-line
@ -1019,7 +1039,10 @@ See also `multi-occur'."
(when prefix-face
`(font-lock-face prefix-face))
'(occur-prefix t)))
curstring
;; We don't put `mouse-face' on the newline,
;; because that loses. And don't put it
;; on context lines to reduce flicker.
(propertize curstring 'mouse-face 'highlight)
"\n"))
(data
(if (= nlines 0)
@ -1043,10 +1066,7 @@ See also `multi-occur'."
(insert "-------\n"))
(add-text-properties
beg end
`(occur-target ,marker help-echo "mouse-2: go to this occurrence"))
;; We don't put `mouse-face' on the newline,
;; because that loses.
(add-text-properties beg (1- end) '(mouse-face highlight)))))
`(occur-target ,marker help-echo "mouse-2: go to this occurrence")))))
(goto-char endpt))
(if endpt
(progn
@ -1283,6 +1303,7 @@ make, or the user didn't cancel the call."
(isearch-string isearch-string)
(isearch-regexp isearch-regexp)
(isearch-case-fold-search isearch-case-fold-search)
(message
(if query-flag
(substitute-command-keys
@ -1315,9 +1336,11 @@ make, or the user didn't cancel the call."
(if regexp-flag from-string
(regexp-quote from-string))
"\\b")))
(if (eq query-replace-highlight 'isearch)
(setq isearch-string search-string
isearch-regexp regexp-flag))
(when query-replace-lazy-highlight
(setq isearch-string search-string
isearch-regexp (or delimited-flag regexp-flag)
isearch-case-fold-search case-fold-search
isearch-lazy-highlight-last-string nil))
(push-mark)
(undo-boundary)
@ -1535,13 +1558,15 @@ make, or the user didn't cancel the call."
(append (listify-key-sequence key)
unread-command-events))
(setq done t)))
(when (eq query-replace-highlight 'isearch)
;; Force isearch rehighlighting
(if (not (memq def '(skip backup)))
(setq isearch-lazy-highlight-last-string nil))
;; Restore isearch data in case of isearching during edit
(when query-replace-lazy-highlight
;; Restore isearch data for lazy highlighting
;; in case of isearching during recursive edit
(setq isearch-string search-string
isearch-regexp regexp-flag)))
isearch-regexp (or delimited-flag regexp-flag)
isearch-case-fold-search case-fold-search)
;; Force lazy rehighlighting only after replacements
(if (not (memq def '(skip backup)))
(setq isearch-lazy-highlight-last-string nil))))
;; Record previous position for ^ when we move on.
;; Change markers to numbers in the match data
;; since lots of markers slow down editing.
@ -1576,38 +1601,45 @@ make, or the user didn't cancel the call."
(if (= replace-count 1) "" "s")))
(and keep-going stack)))
(defcustom query-replace-highlight
(if (and search-highlight isearch-lazy-highlight) 'isearch t)
"*Non-nil means to highlight words during query replacement.
If `isearch', use isearch highlighting for query replacement."
:type '(choice (const :tag "Highlight" t)
(const :tag "No highlighting" nil)
(const :tag "Isearch highlighting" 'isearch))
(defcustom query-replace-highlight t
"*Non-nil means to highlight matches during query replacement."
:type 'boolean
:group 'matching)
(defcustom query-replace-lazy-highlight t
"*Controls the lazy-highlighting during query replacements.
When non-nil, all text in the buffer matching the current match
is highlighted lazily using isearch lazy highlighting (see
`isearch-lazy-highlight-initial-delay' and
`isearch-lazy-highlight-interval')."
:type 'boolean
:group 'matching
:version "21.4")
(defface query-replace
'((t (:inherit isearch)))
"Face for highlighting query replacement matches."
:group 'matching
:version "21.4")
(defvar replace-overlay nil)
(defun replace-dehighlight ()
(cond ((eq query-replace-highlight 'isearch)
(isearch-dehighlight t)
(isearch-lazy-highlight-cleanup isearch-lazy-highlight-cleanup)
(setq isearch-lazy-highlight-last-string nil))
(query-replace-highlight
(when replace-overlay
(delete-overlay replace-overlay)
(setq replace-overlay nil)))))
(defun replace-highlight (beg end)
(if query-replace-highlight
(if replace-overlay
(move-overlay replace-overlay beg end (current-buffer))
(setq replace-overlay (make-overlay beg end))
(overlay-put replace-overlay 'priority 1) ;higher than lazy overlays
(overlay-put replace-overlay 'face 'query-replace)))
(if query-replace-lazy-highlight
(isearch-lazy-highlight-new-loop)))
(defun replace-highlight (start end)
(cond ((eq query-replace-highlight 'isearch)
(isearch-highlight start end)
(isearch-lazy-highlight-new-loop))
(query-replace-highlight
(if replace-overlay
(move-overlay replace-overlay start end (current-buffer))
(setq replace-overlay (make-overlay start end))
(overlay-put replace-overlay 'face
(if (facep 'query-replace)
'query-replace 'region))))))
(defun replace-dehighlight ()
(when replace-overlay
(delete-overlay replace-overlay))
(when query-replace-lazy-highlight
(isearch-lazy-highlight-cleanup isearch-lazy-highlight-cleanup)
(setq isearch-lazy-highlight-last-string nil)))
;; arch-tag: 16b4cd61-fd40-497b-b86f-b667c4cf88e4
;;; replace.el ends here

View file

@ -645,10 +645,6 @@ If BACKWARD-ONLY is non-nil, only delete spaces before point."
(skip-chars-forward " \t")
(constrain-to-field nil orig-pos t)))))
(defvar inhibit-mark-movement nil
"If non-nil, movement commands, such as \\[beginning-of-buffer], \
do not set the mark.")
(defun beginning-of-buffer (&optional arg)
"Move point to the beginning of the buffer; leave mark at previous position.
With \\[universal-argument] prefix, do not set mark at previous position.
@ -660,8 +656,7 @@ of the accessible part of the buffer.
Don't use this command in Lisp programs!
\(goto-char (point-min)) is faster and avoids clobbering the mark."
(interactive "P")
(or inhibit-mark-movement
(consp arg)
(or (consp arg)
(and transient-mark-mode mark-active)
(push-mark))
(let ((size (- (point-max) (point-min))))
@ -686,8 +681,7 @@ of the accessible part of the buffer.
Don't use this command in Lisp programs!
\(goto-char (point-max)) is faster and avoids clobbering the mark."
(interactive "P")
(or inhibit-mark-movement
(consp arg)
(or (consp arg)
(and transient-mark-mode mark-active)
(push-mark))
(let ((size (- (point-max) (point-min))))
@ -1490,6 +1484,17 @@ is not *inside* the region START...END."
(t
'(0 . 0)))
'(0 . 0)))
;; When the first undo batch in an undo list is longer than undo-outer-limit,
;; this function gets called to ask the user what to do.
;; Garbage collection is inhibited around the call,
;; so it had better not do a lot of consing.
(setq undo-outer-limit-function 'undo-outer-limit-truncate)
(defun undo-outer-limit-truncate (size)
(if (yes-or-no-p (format "Buffer %s undo info is %d bytes long; discard it? "
(buffer-name) size))
(progn (setq buffer-undo-list nil) t)
nil))
(defvar shell-command-history nil
"History list for some commands that read shell commands.")

View file

@ -1975,7 +1975,7 @@ SPC: Accept word this time.
(sit-for 5)
(kill-buffer "*Ispell Help*"))
(unwind-protect
(progn
(let ((resize-mini-windows 'grow-only))
(select-window (minibuffer-window))
(erase-buffer)
(message nil)

View file

@ -1,6 +1,7 @@
;;; tooltip.el --- show tooltip windows
;; Copyright (C) 1997, 1999, 2000, 2001, 2004 Free Software Foundation, Inc.
;; Copyright (C) 1997, 1999, 2000, 2001, 2002, 2003, 2004
;; Free Software Foundation, Inc.
;; Author: Gerd Moellmann <gerd@acm.org>
;; Keywords: help c mouse tools
@ -476,7 +477,25 @@ This function must return nil if it doesn't handle EVENT."
(defun tooltip-show-help-function (msg)
"Function installed as `show-help-function'.
MSG is either a help string to display, or nil to cancel the display."
(let ((previous-help tooltip-help-message))
(let ((previous-help tooltip-help-message)
mp pos)
(if (and mouse-1-click-follows-link
(stringp msg)
(save-match-data
(string-match "^mouse-2" msg))
(setq mp (mouse-pixel-position))
(consp (setq pos (cdr mp)))
(setq pos (posn-at-x-y (car pos) (cdr pos) (car mp)))
(windowp (posn-window pos)))
(with-current-buffer (window-buffer (posn-window pos))
(if (mouse-on-link-p (posn-point pos))
(setq msg (concat
(cond
((eq mouse-1-click-follows-link 'double) "double-")
((and (integerp mouse-1-click-follows-link)
(< mouse-1-click-follows-link 0)) "Long ")
(t ""))
"mouse-1" (substring msg 7))))))
(setq tooltip-help-message msg)
(cond ((null msg)
;; Cancel display. This also cancels a delayed tip, if

View file

@ -2836,7 +2836,7 @@ Uses `rcs2log' which only works for RCS and CVS."
(pop-to-buffer
(set-buffer (get-buffer-create "*vc*")))
(erase-buffer)
(insert-file tempfile)
(insert-file-contents tempfile)
"failed"))
(setq default-directory (file-name-directory changelog))
(delete-file tempfile)))))

View file

@ -327,6 +327,7 @@ new value.")
(let ((keymap (widget-get widget :keymap))
(face (or (widget-get widget :value-face) 'widget-field-face))
(help-echo (widget-get widget :help-echo))
(follow-link (widget-get widget :follow-link))
(rear-sticky
(or (not widget-field-add-space) (widget-get widget :size))))
(if (functionp help-echo)
@ -345,6 +346,7 @@ new value.")
;; works in the field when, say, Custom uses `suppress-keymap'.
(overlay-put overlay 'local-map keymap)
(overlay-put overlay 'face face)
(overlay-put overlay 'follow-link follow-link)
(overlay-put overlay 'help-echo help-echo))
(setq to (1- to))
(setq rear-sticky t))
@ -354,6 +356,7 @@ new value.")
(overlay-put overlay 'field widget)
(overlay-put overlay 'local-map keymap)
(overlay-put overlay 'face face)
(overlay-put overlay 'follow-link follow-link)
(overlay-put overlay 'help-echo help-echo)))
(widget-specify-secret widget))
@ -378,6 +381,7 @@ new value.")
(defun widget-specify-button (widget from to)
"Specify button for WIDGET between FROM and TO."
(let ((overlay (make-overlay from to nil t nil))
(follow-link (widget-get widget :follow-link))
(help-echo (widget-get widget :help-echo)))
(widget-put widget :button-overlay overlay)
(if (functionp help-echo)
@ -389,6 +393,7 @@ new value.")
(unless (widget-get widget :suppress-face)
(overlay-put overlay 'face (widget-apply widget :button-face-get)))
(overlay-put overlay 'pointer 'hand)
(overlay-put overlay 'follow-link follow-link)
(overlay-put overlay 'help-echo help-echo)))
(defun widget-mouse-help (window overlay point)
@ -1705,6 +1710,7 @@ If END is omitted, it defaults to the length of LIST."
"An embedded link."
:button-prefix 'widget-link-prefix
:button-suffix 'widget-link-suffix
:follow-link "\C-m"
:help-echo "Follow the link."
:format "%[%t%]")

View file

@ -1,3 +1,7 @@
2004-12-21 Richard M. Stallman <rms@gnu.org>
* commands.texi (Event Input Misc): Add while-no-input.
2004-12-11 Richard M. Stallman <rms@gnu.org>
* display.texi (Line Height): Rewrite text for clarity.

View file

@ -2388,6 +2388,18 @@ The alias @code{last-input-char} exists for compatibility with
Emacs version 18.
@end defvar
@defmac while-no-input body...
This construct runs the @var{body} forms and returns the value
of the last one---but only if no input arrives. If any input
arrives during the execution of the @var{body} forms, it aborts
them (working much like a quit), and the @code{while-no-input}
form returns @code{nil}.
If a part of @var{body} binds @code{inhibit-quit} to non-@code{nil},
arrival of input during those parts won't cause an abort until
the end of that part.
@end defmac
@defun discard-input
@cindex flush input
@cindex discard input

View file

@ -1,3 +1,40 @@
2004-12-20 Jay Belanger <belanger@truman.edu>
* calc.texi (Types Tutorial): Emphasized that you can't divide by
zero.
2004-12-17 Luc Teirlinck <teirllm@auburn.edu>
* cc-mode.texi (Text Filling and Line Breaking): Put period after
@xref.
(Font Locking): Avoid @strong{Note:}.
2004-12-17 Michael Albinus <michael.albinus@gmx.de>
Sync with Tramp 2.0.46.
* tramp.texi (bottom): Add arch-tag. It was lost, somehow.
2004-12-16 Luc Teirlinck <teirllm@auburn.edu>
* url.texi: Correct typos.
(Retrieving URLs): @var{nil}->@code{nil}.
(HTTP language/coding, mailto): Replace "GNU Emacs Manual" with
the standard "The GNU Emacs Manual" in fifth argument of @xref's.
(Dealing with HTTP documents): @inforef->@xref.
2004-12-15 Juri Linkov <juri@jurta.org>
* mark.texi (Transient Mark, Mark Ring): M-< and other
movement commands don't set mark in Transient Mark mode
if mark is active.
2004-12-15 Jay Belanger <belanger@truman.edu>
* calc.texi: Consistently capitalized all mode names.
(Answers to Exercises): Mention that an answer can be a fraction
when in Fraction mode.
2004-12-13 Jay Belanger <belanger@truman.edu>
* calc.texi: Fix some TeX definitions.

File diff suppressed because it is too large Load diff

View file

@ -1420,7 +1420,7 @@ then as the comment prefix. It defaults to @samp{*
@code{c-block-comment-prefix} typically gets overriden by the default
style @code{gnu}, which sets it to blank. You can see the line
splitting effect described here by setting a different style,
e.g. @code{k&r} @xref{Choosing a Style}}, which makes a comment
e.g. @code{k&r} @xref{Choosing a Style}.}, which makes a comment
@example
/* Got O(n^2) here, which is a Bad Thing. */
@ -1643,7 +1643,7 @@ trailing backslashes.
@cindex font locking
@comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@strong{Note:} The font locking in AWK mode is currently not integrated
@strong{Please note:} The font locking in AWK mode is currently not integrated
with the rest of @ccmode{}, so this section does not apply there.
@xref{AWK Mode Font Locking}, instead.

View file

@ -191,7 +191,9 @@ You can activate the new region by executing @kbd{C-x C-x}
(@code{exchange-point-and-mark}).
@item
@kbd{C-s} when the mark is active does not alter the mark.
Commands that normally set the mark before moving long distances (like
@kbd{M-<} and @kbd{C-s}) do not alter the mark in Transient Mark mode
when the mark is active.
@item
Some commands operate on the region if a region is active. For
@ -384,9 +386,10 @@ the same buffer.
Many commands that can move long distances, such as @kbd{M-<}
(@code{beginning-of-buffer}), start by setting the mark and saving the
old mark on the mark ring. This is to make it easier for you to move
back later. Searches set the mark if they move point. You can tell
when a command sets the mark because it displays @samp{Mark set} in the
echo area.
back later. Searches set the mark if they move point. However, in
Transient Mark mode, these commands do not set the mark when the mark
is already active. You can tell when a command sets the mark because
it displays @samp{Mark set} in the echo area.
If you want to move back to the same place over and over, the mark
ring may not be convenient enough. If so, you can record the position

View file

@ -4,7 +4,7 @@
@c In the Tramp CVS, the version number is auto-frobbed from
@c configure.ac, so you should edit that file and run
@c "autoconf && ./configure" to change the version number.
@set trampver 2.0.45
@set trampver 2.0.46
@c Other flags from configuration
@set prefix /usr/local

View file

@ -27,7 +27,7 @@ Copyright (C) 1993, 1994, 1995, 1996 William M. Perry
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1 or
any later version published by the Free Software Foundation; with the
Invariant Sections being
Invariant Sections being
``GNU GENERAL PUBLIC LICENSE''. A copy of the
license is included in the section entitled ``GNU Free Documentation
License.''
@ -74,9 +74,9 @@ License.''
* General Facilities:: URLs can be cached, accessed via a gateway
and tracked in a history list.
* Customization:: Variables you can alter.
* Function Index::
* Variable Index::
* Concept Index::
* Function Index::
* Variable Index::
* Concept Index::
@end menu
@node Getting Started
@ -115,7 +115,7 @@ The meaning of
the @var{path} component depends on the service.
@menu
* Configuration::
* Configuration::
* Parsed URLs:: URLs are parsed into vector structures.
@end menu
@ -204,7 +204,7 @@ Recreates a URL string from the parsed @var{url}.
@defun url-retrieve-synchronously url
Retrieve @var{url} synchronously and return a buffer containing the
data. @var{url} is either a string or a parsed URL structure. Return
@var{nil} if there are no data associated with it (the case for dired,
@code{nil} if there are no data associated with it (the case for dired,
info, or mailto URLs that need no further processing).
@end defun
@ -214,7 +214,7 @@ Retrieve @var{url} asynchronously and call @var{callback} with args
has been completely retrieved, with the current buffer containing the
object and any MIME headers associated with it. @var{url} is either a
string or a parsed URL structure. Returns the buffer @var{url} will
load into, or @var{nil} if the process has already completed.
load into, or @code{nil} if the process has already completed.
@end defun
@node Supported URL Types
@ -222,7 +222,7 @@ load into, or @var{nil} if the process has already completed.
@menu
* http/https:: Hypertext Transfer Protocol.
* file/ftp:: Local files and FTP archives.
* file/ftp:: Local files and FTP archives.
* info:: Emacs `Info' pages.
* mailto:: Sending email.
* news/nntp/snews:: Usenet news.
@ -235,7 +235,7 @@ load into, or @var{nil} if the process has already completed.
@c * netrek::
@c * prospero::
* cid:: Content-ID.
* about::
* about::
* ldap:: Lightweight Directory Access Protocol
* imap:: IMAP mailboxes.
* man:: Unix man pages.
@ -273,10 +273,10 @@ otherwise the user will be asked on each request.
@menu
* Cookies::
* HTTP language/coding::
* HTTP URL Options::
* Dealing with HTTP documents::
* Cookies::
* HTTP language/coding::
* HTTP URL Options::
* Dealing with HTTP documents::
@end menu
@node Cookies
@ -330,7 +330,7 @@ preferred character set encodings, e.g.@: Latin-9 or Big5, and these
can be weighted. In Emacs 21 this list is generated automatically
from the list of defined coding systems which have associated MIME
types. These are sorted by coding priority. @xref{Recognize Coding,
, Recognizing Coding Systems, emacs, GNU Emacs Manual}.
, Recognizing Coding Systems, emacs, The GNU Emacs Manual}.
@end defopt
@defopt url-mime-language-string
@ -384,9 +384,9 @@ Currently this is just the raw header contents.
HTTP URLs are retrieved into a buffer containing the HTTP headers
followed by the body. Since the headers are quasi-MIME, they may be
processed using the MIME library. @inforef{Top, The MIME library,
emacs-mime}. The URL package provides a function to do this in
general:
processed using the MIME library. @xref{Top,, Emacs MIME,
emacs-mime, The Emacs MIME Manual}. The URL package provides a
function to do this in general:
@defun url-decode-text-part handle &optional coding
This function decodes charset-encoded text in the current buffer. In
@ -414,8 +414,8 @@ file://@var{user}:@var{password}@@@var{host}:@var{port}/@var{file}
@end example
These schemes are defined in RFC 1808.
@samp{ftp:} and @samp{file:} are synonomous in this library. They
allow reading arbitary files from hosts. Either @samp{ange-ftp}
@samp{ftp:} and @samp{file:} are synonymous in this library. They
allow reading arbitrary files from hosts. Either @samp{ange-ftp}
(Emacs) or @samp{efs} (XEmacs) is used to retrieve them from remote
hosts. Local files are accessed directly.
@ -451,13 +451,13 @@ Info URLs are not officially defined. They invoke
@cindex email
A mailto URL will send an email message to the address in the
URL, for example @samp{mailto:foo@@bar.com} would compose a
message to @samp{foo@@bar.com}.
message to @samp{foo@@bar.com}.
@defopt url-mail-command
@vindex mail-user-agent
The function called whenever url needs to send mail. This should
normally be left to default from @var{mail-user-agent}. @xref{Mail
Methods, , Mail-Composition Methods, emacs, GNU Emacs Manual}.
Methods, , Mail-Composition Methods, emacs, The GNU Emacs Manual}.
@end defopt
An @samp{X-Url-From} header field containing the URL of the document
@ -468,7 +468,7 @@ The form of a mailto URL is
@example
@samp{mailto:@var{mailbox}[?@var{header}=@var{contents}[&@var{header}=@var{contents}]]}
@end example
@noindent where an arbitary number of @var{header}s can be added. If the
@noindent where an arbitrary number of @var{header}s can be added. If the
@var{header} is @samp{body}, then @var{contents} is put in the body
otherwise a @var{header} header field is created with @var{contents}
as its contents. Note that the URL library does not consider any
@ -493,11 +493,11 @@ fields may be included in news URLs though they are properly only
allowed for nntp an snews.
@table @samp
@item news:@var{newsgroup}
@item news:@var{newsgroup}
Retrieves a list of messages in @var{newsgroup};
@item news:@var{message-id}
Retrieves the message with the given @var{message-id};
@item news:*
@item news:*
Retrieves a list of all available newsgroups;
@item nntp://@var{host}:@var{port}/@var{newsgroup}
@itemx nntp://@var{host}:@var{port}/@var{message-id}
@ -510,7 +510,7 @@ Similar to the @samp{news} versions.
@samp{snews} is the same as @samp{nntp} except that the default port
is :563.
@cindex SSL
(It is tunnelled through SSL.)
(It is tunneled through SSL.)
An @samp{nntp} URL is the same as a news URL, except that the URL may
specify an article by its number.
@ -550,9 +550,9 @@ Well-known ports are used if the URL does not specify a port.
@cindex IRC
@cindex Internet Relay Chat
@cindex ZEN IRC
@c Fixme: reference (was http://www.w3.org/Addressing/draft-mirashi-url-irc-01.txt)
@c Fixme: reference (was http://www.w3.org/Addressing/draft-mirashi-url-irc-01.txt)
@dfn{Internet Relay Chat} (IRC) is handled by handing off the @sc{irc}
session to a function named in @code{url-irc-function}.
session to a function named in @code{url-irc-function}.
@defopt url-irc-function
A function to actually open an IRC connection.
@ -582,7 +582,7 @@ including parameters. It defaults to
@samp{text/plain;charset=US-ASCII}. The @samp{text/plain} can be
omitted but the charset parameter supplied. If @samp{;base64} is
present, the @var{data} are base64-encoded.
@node nfs
@section nfs
@cindex NFS
@ -658,11 +658,11 @@ the Lisp @code{man} function.
@chapter Defining New URLs
@menu
* Naming conventions::
* Required functions::
* Optional functions::
* Asynchronous fetching::
* Supporting file-name-handlers::
* Naming conventions::
* Required functions::
* Optional functions::
* Asynchronous fetching::
* Supporting file-name-handlers::
@end menu
@node Naming conventions
@ -684,10 +684,10 @@ the Lisp @code{man} function.
@chapter General Facilities
@menu
* Disk Caching::
* Proxies::
* Gateways in general::
* History::
* Disk Caching::
* Proxies::
* Gateways in general::
* History::
@end menu
@node Disk Caching
@ -761,7 +761,7 @@ more likely to conflict with other files.
@end smallexample
@end defun
@c Fixme: never actually used currently?
@c Fixme: never actually used currently?
@c @defopt url-standalone-mode
@c @cindex Relying on cache
@c @cindex Cache only mode
@ -783,7 +783,7 @@ more likely to conflict with other files.
@node Proxies
@section Proxies and Gatewaying
@c fixme: check/document url-ns stuff
@c fixme: check/document url-ns stuff
@cindex proxy servers
@cindex proxies
@cindex environment variables
@ -815,7 +815,7 @@ NO_PROXY="*.aventail.com,home.com,.seanet.com"
@noindent says to contact all machines in the @samp{aventail.com} and
@samp{seanet.com} domains directly, as well as the machine named
@samp{home.com}. If @code{NO_PROXY} isn't defined, @code{no_PROXY}
and @code{no_proxy} are also tried, in that order.
and @code{no_proxy} are also tried, in that order.
Proxies may also be specified directly in Lisp.
@ -940,7 +940,7 @@ This specifies the default server, it takes the form
where @var{version} can be either 4 or 5.
@end defopt
@defvar socks-password
If this is @code{nil} then you will be asked for the passward,
If this is @code{nil} then you will be asked for the password,
otherwise it will be used as the password for authenticating you to
the @sc{socks} server.
@end defvar
@ -980,9 +980,9 @@ This the @samp{nslookup} program. It is @code{"nslookup"} by default.
@end defopt
@menu
* Suppressing network connexions::
* Suppressing network connexions::
@end menu
@c * Broken hostname resolution::
@c * Broken hostname resolution::
@node Suppressing network connexions
@subsection Suppressing Network Connexions
@ -1010,7 +1010,7 @@ opened by the URL library.
@c @cindex resolver, hostname
@c Some C libraries do not include the hostname resolver routines in
@c their static libraries. If Emacs was linked statically, and was not
@c linked with the resolver libraries, it wil not be able to get to any
@c linked with the resolver libraries, it will not be able to get to any
@c machines off the local network. This is characterized by being able
@c to reach someplace with a raw ip number, but not its hostname
@c (@url{http://129.79.254.191/} works, but
@ -1052,8 +1052,8 @@ The history `list' is actually a hash table,
strings. The times are in the format returned by @code{current-time}.
@defun url-history-update-url url time
This function updates the hsitory table with an entry for @var{url}
accessed at the gievn @var{time}.
This function updates the history table with an entry for @var{url}
accessed at the given @var{time}.
@end defun
@defopt url-history-track
@ -1144,7 +1144,7 @@ function taking a single argument (the prompt) and returning @code{t}
only if an affirmative answer is given.
@end defopt
@defopt url-gateway-method
@c fixme: describe gatewaying
@c fixme: describe gatewaying
A symbol specifying the type of gateway support to use fro connexions
from the local machine. The supported methods are:

View file

@ -1,3 +1,118 @@
2004-12-23 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* keyboard.c (input_available_signal): Call SIGNAL_THREAD_CHECK
before touching input_available_clear_time, to avoid accessing it
from multiple threads.
2004-12-23 Jason Rumney <jasonr@gnu.org>
* image.c (__WIN32__) [HAVE_NTGUI]: Define for correct behaviour
of JPEG library.
2004-12-22 Richard M. Stallman <rms@gnu.org>
* emacs.c (main): If batch mode, set Vundo_outer_limit to nil.
* lisp.h (Vundo_outer_limit): Fix decl.
* undo.c (Vundo_outer_limit): Replaces undo_outer_limit.
Uses changed.
(syms_of_undo): Initialize appropriately.
(truncate_undo_list): If it's nil, there's no limit.
2004-12-22 Kenichi Handa <handa@m17n.org>
* xselect.c (Fx_get_cut_buffer_internal): Return a unibyte string.
2004-12-21 Richard M. Stallman <rms@gnu.org>
* eval.c (unwind_to_catch): Clear immediate_quit.
* xdisp.c (get_next_display_element): Display codes 8a0 and 8ad
specially as `\ ' and `\-'.
* keyboard.c (kbd_buffer_store_event_hold):
In the code for while-no-input, handle immediate_quit.
* alloc.c (Fgarbage_collect): Update call to truncate_undo_list.
Call that at the very start.
(undo_limit, undo_strong_limit, undo_outer_limit): Moved to undo.c.
(syms_of_alloc): Don't define undo-limit,
undo-strong-limit and undo-outer-limit here.
* undo.c (truncate_undo_list): Return void.
Take just one argument, the buffer.
Make it current, and inhibit recursive GC.
Access and update the undo list directly; return void.
Refer to the undo...limit variables directly.
Test undo_outer_limit only after counting the whole current command.
When it's exceeded, call the function in undo-outer-limit-function.
(undo_limit, undo_strong_limit, undo_outer_limit): From alloc.c.
(Vundo_outer_limit_function): New variable.
(syms_of_undo): Define undo-limit, undo-strong-limit
and undo-outer-limit here, and undo-outer-limit-function.
Doc fixes.
* lisp.h (truncate_undo_list): Update decl.
2004-12-21 Piet van Oostrum <piet@cs.uu.nl>
* fileio.c (Fread_file_name): Delete duplicates in
file-name-history when history_delete_duplicates is true.
2004-12-20 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
* macterm.c (mac_do_list_fonts): Fix memory leak
2004-12-20 Richard M. Stallman <rms@gnu.org>
* regex.c (re_match_2_internal) <symend, wordend>:
Fix calls to UPDATE_SYNTAX_TABLE_FORWARD.
2004-12-18 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
* macterm.c (endif, x_font_name_to_mac_font_name): Use
maccentraleurroman instead of maccentraleuropean
(mac_c_string_match, mac_do_list_fonts): Speed up font search by
quickly finding a specific font without needing regexps.
2004-12-15 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* syssignal.h: Declare main_thread.
(SIGNAL_THREAD_CHECK): New macro.
* keyboard.c (input_available_signal): Move thread checking code
to macro SIGNAL_THREAD_CHECK and call that macro.
(interrupt_signal): Call SIGNAL_THREAD_CHECK.
* alloc.c (uninterrupt_malloc): Move main_thread to emacs.c.
* emacs.c: Define main_thread.
(main): Initialize main_thread.
(handle_USR1_signal, handle_USR2_signal, fatal_error_signal)
(memory_warning_signal): Call SIGNAL_THREAD_CHECK.
* floatfns.c (float_error): Call SIGNAL_THREAD_CHECK.
* dispnew.c (window_change_signal): Call SIGNAL_THREAD_CHECK.
* sysdep.c (select_alarm): Call SIGNAL_THREAD_CHECK.
* process.c (send_process_trap, sigchld_handler): Call
SIGNAL_THREAD_CHECK.
* data.c (arith_error): Call SIGNAL_THREAD_CHECK.
* atimer.c (alarm_signal_handler): Call SIGNAL_THREAD_CHECK.
* xterm.c (xg_scroll_callback): Update XG_LAST_SB_DATA before
returning when xg_ignore_gtk_scrollbar is true.
2004-12-14 Kim F. Storm <storm@cua.dk>
* keyboard.c (read_char): Save and restore echo_string when
handling input method.
2004-12-13 Richard M. Stallman <rms@gnu.org>
* eval.c (syms_of_eval) <quit-flag>: Doc fix.
@ -143,6 +258,7 @@
* eval.c (Fcalled_interactively_p): Don't check INTERACTIVE.
(interactive_p): Skip Scalled_interactively_p frames
like Sinteractive_p frames.
(unwind_to_catch): Clear handling_signal.
* data.c (Fmake_variable_buffer_local): Doc fix.
(Fmake_local_variable): Doc fix.

View file

@ -99,7 +99,7 @@ extern __malloc_size_t __malloc_extra_blocks;
If Emacs sets malloc hooks (! SYSTEM_MALLOC) and the emacs_blocked_*
functions below are called from malloc, there is a chance that one
of these threads preempts the Emacs main thread and the hook variables
end up in a inconsistent state. So we have a mutex to prevent that (note
end up in an inconsistent state. So we have a mutex to prevent that (note
that the backend handles concurrent access to malloc within its own threads
but Emacs code running in the main thread is not included in that control).
@ -109,7 +109,6 @@ extern __malloc_size_t __malloc_extra_blocks;
To prevent that, we only call BLOCK/UNBLOCK from the main thread. */
static pthread_mutex_t alloc_mutex;
pthread_t main_thread;
#define BLOCK_INPUT_ALLOC \
do \
@ -201,12 +200,6 @@ extern
#endif /* VIRT_ADDR_VARIES */
int malloc_sbrk_unused;
/* Two limits controlling how much undo information to keep. */
EMACS_INT undo_limit;
EMACS_INT undo_strong_limit;
EMACS_INT undo_outer_limit;
/* Number of live and free conses etc. */
static int total_conses, total_markers, total_symbols, total_vector_size;
@ -1310,8 +1303,6 @@ uninterrupt_malloc ()
pthread_mutexattr_init (&attr);
pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init (&alloc_mutex, &attr);
main_thread = pthread_self ();
#endif /* HAVE_GTK_AND_PTHREAD */
if (__free_hook != emacs_blocked_free)
@ -4604,13 +4595,48 @@ returns nil, because real GC can't be done. */)
if (abort_on_gc)
abort ();
EMACS_GET_TIME (t1);
/* Can't GC if pure storage overflowed because we can't determine
if something is a pure object or not. */
if (pure_bytes_used_before_overflow)
return Qnil;
/* Don't keep undo information around forever.
Do this early on, so it is no problem if the user quits. */
{
register struct buffer *nextb = all_buffers;
while (nextb)
{
/* If a buffer's undo list is Qt, that means that undo is
turned off in that buffer. Calling truncate_undo_list on
Qt tends to return NULL, which effectively turns undo back on.
So don't call truncate_undo_list if undo_list is Qt. */
if (! EQ (nextb->undo_list, Qt))
truncate_undo_list (nextb);
/* Shrink buffer gaps, but skip indirect and dead buffers. */
if (nextb->base_buffer == 0 && !NILP (nextb->name))
{
/* If a buffer's gap size is more than 10% of the buffer
size, or larger than 2000 bytes, then shrink it
accordingly. Keep a minimum size of 20 bytes. */
int size = min (2000, max (20, (nextb->text->z_byte / 10)));
if (nextb->text->gap_size > size)
{
struct buffer *save_current = current_buffer;
current_buffer = nextb;
make_gap (-(nextb->text->gap_size - size));
current_buffer = save_current;
}
}
nextb = nextb->next;
}
}
EMACS_GET_TIME (t1);
/* In case user calls debug_print during GC,
don't let that cause a recursive GC. */
consing_since_gc = 0;
@ -4649,42 +4675,6 @@ returns nil, because real GC can't be done. */)
shrink_regexp_cache ();
/* Don't keep undo information around forever. */
{
register struct buffer *nextb = all_buffers;
while (nextb)
{
/* If a buffer's undo list is Qt, that means that undo is
turned off in that buffer. Calling truncate_undo_list on
Qt tends to return NULL, which effectively turns undo back on.
So don't call truncate_undo_list if undo_list is Qt. */
if (! EQ (nextb->undo_list, Qt))
nextb->undo_list
= truncate_undo_list (nextb->undo_list, undo_limit,
undo_strong_limit, undo_outer_limit);
/* Shrink buffer gaps, but skip indirect and dead buffers. */
if (nextb->base_buffer == 0 && !NILP (nextb->name))
{
/* If a buffer's gap size is more than 10% of the buffer
size, or larger than 2000 bytes, then shrink it
accordingly. Keep a minimum size of 20 bytes. */
int size = min (2000, max (20, (nextb->text->z_byte / 10)));
if (nextb->text->gap_size > size)
{
struct buffer *save_current = current_buffer;
current_buffer = nextb;
make_gap (-(nextb->text->gap_size - size));
current_buffer = save_current;
}
}
nextb = nextb->next;
}
}
gc_in_progress = 1;
/* clear_marks (); */
@ -5959,29 +5949,6 @@ prevent garbage collection during a part of the program. */);
doc: /* Non-nil means loading Lisp code in order to dump an executable.
This means that certain objects should be allocated in shared (pure) space. */);
DEFVAR_INT ("undo-limit", &undo_limit,
doc: /* Keep no more undo information once it exceeds this size.
This limit is applied when garbage collection happens.
The size is counted as the number of bytes occupied,
which includes both saved text and other data. */);
undo_limit = 20000;
DEFVAR_INT ("undo-strong-limit", &undo_strong_limit,
doc: /* Don't keep more than this much size of undo information.
A previous command which pushes the undo list past this size
is entirely forgotten when GC happens.
The size is counted as the number of bytes occupied,
which includes both saved text and other data. */);
undo_strong_limit = 30000;
DEFVAR_INT ("undo-outer-limit", &undo_outer_limit,
doc: /* Don't keep more than this much size of undo information.
If the current command has produced more than this much undo information,
GC discards it. This is a last-ditch limit to prevent memory overflow.
The size is counted as the number of bytes occupied,
which includes both saved text and other data. */);
undo_outer_limit = 300000;
DEFVAR_BOOL ("garbage-collection-messages", &garbage_collection_messages,
doc: /* Non-nil means display messages at start and end of garbage collection. */);
garbage_collection_messages = 0;

View file

@ -364,6 +364,8 @@ alarm_signal_handler (signo)
{
EMACS_TIME now;
SIGNAL_THREAD_CHECK (signo);
EMACS_GET_TIME (now);
pending_atimers = 0;

View file

@ -3262,6 +3262,7 @@ arith_error (signo)
sigsetmask (SIGEMPTYMASK);
#endif /* not BSD4_1 */
SIGNAL_THREAD_CHECK (signo);
Fsignal (Qarith_error, Qnil);
}

View file

@ -5980,6 +5980,9 @@ window_change_signal (signalnum) /* If we don't have an argument, */
#endif
int old_errno = errno;
signal (SIGWINCH, window_change_signal);
SIGNAL_THREAD_CHECK (signalnum);
get_frame_size (&width, &height);
/* The frame size change obviously applies to a termcap-controlled
@ -6002,7 +6005,6 @@ window_change_signal (signalnum) /* If we don't have an argument, */
}
}
signal (SIGWINCH, window_change_signal);
errno = old_errno;
}
#endif /* SIGWINCH */

View file

@ -342,6 +342,14 @@ int fatal_error_in_progress;
void (*fatal_error_signal_hook) P_ ((void));
#ifdef HAVE_GTK_AND_PTHREAD
/* When compiled with GTK and running under Gnome, multiple threads meay be
created. Keep track of our main thread to make sure signals are delivered
to it (see syssignal.h). */
pthread_t main_thread;
#endif
#ifdef SIGUSR1
SIGTYPE
@ -350,6 +358,7 @@ handle_USR1_signal (sig)
{
struct input_event buf;
SIGNAL_THREAD_CHECK (sig);
bzero (&buf, sizeof buf);
buf.kind = USER_SIGNAL_EVENT;
buf.frame_or_window = selected_frame;
@ -365,6 +374,7 @@ handle_USR2_signal (sig)
{
struct input_event buf;
SIGNAL_THREAD_CHECK (sig);
bzero (&buf, sizeof buf);
buf.kind = USER_SIGNAL_EVENT;
buf.code = 1;
@ -379,6 +389,7 @@ SIGTYPE
fatal_error_signal (sig)
int sig;
{
SIGNAL_THREAD_CHECK (sig);
fatal_error_code = sig;
signal (sig, SIG_DFL);
@ -418,6 +429,7 @@ memory_warning_signal (sig)
int sig;
{
signal (sig, memory_warning_signal);
SIGNAL_THREAD_CHECK (sig);
malloc_warning ("Operating system warns that virtual memory is running low.\n");
@ -1029,6 +1041,10 @@ main (argc, argv
# endif /* not SYNC_INPUT */
#endif /* not SYSTEM_MALLOC */
#ifdef HAVE_GTK_AND_PTHREAD
main_thread = pthread_self ();
#endif /* HAVE_GTK_AND_PTHREAD */
#if defined (MSDOS) || defined (WINDOWSNT)
/* We do all file input/output as binary files. When we need to translate
newlines, we do that manually. */
@ -1117,7 +1133,10 @@ main (argc, argv
/* Handle the -batch switch, which means don't do interactive display. */
noninteractive = 0;
if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
noninteractive = 1;
{
noninteractive = 1;
Vundo_outer_limit = Qnil;
}
if (argmatch (argv, argc, "-script", "--script", 3, &junk, &skip_args))
{
noninteractive = 1; /* Set batch mode. */

View file

@ -1178,6 +1178,7 @@ unwind_to_catch (catch, value)
set_poll_suppress_count (catch->poll_suppress_count);
interrupt_input_blocked = catch->interrupt_input_blocked;
handling_signal = 0;
immediate_quit = 0;
do
{

View file

@ -228,6 +228,8 @@ extern int minibuf_level;
extern int minibuffer_auto_raise;
extern int history_delete_duplicates;
/* These variables describe handlers that have "already" had a chance
to handle the current operation.
@ -6299,7 +6301,13 @@ and `read-file-name-function'. */)
if (replace_in_history)
/* Replace what Fcompleting_read added to the history
with what we will actually return. */
XSETCAR (Fsymbol_value (Qfile_name_history), double_dollars (val));
{
Lisp_Object val1 = double_dollars (val);
tem = Fsymbol_value (Qfile_name_history);
if (history_delete_duplicates)
XSETCDR (tem, Fdelete (val1, XCDR(tem)));
XSETCAR (tem, val1);
}
else if (add_to_history)
{
/* Add the value to the history--but not if it matches
@ -6307,8 +6315,10 @@ and `read-file-name-function'. */)
Lisp_Object val1 = double_dollars (val);
tem = Fsymbol_value (Qfile_name_history);
if (! CONSP (tem) || NILP (Fequal (XCAR (tem), val1)))
Fset (Qfile_name_history,
Fcons (val1, tem));
{
if (history_delete_duplicates) tem = Fdelete (val1, tem);
Fset (Qfile_name_history, Fcons (val1, tem));
}
}
return val;

View file

@ -981,6 +981,7 @@ float_error (signo)
signal (SIGILL, float_error);
#endif /* BSD_SYSTEM */
SIGNAL_THREAD_CHECK (signo);
in_float = 0;
Fsignal (Qarith_error, Fcons (float_error_arg, Qnil));

View file

@ -6269,6 +6269,12 @@ jpeg_image_p (object)
#undef HAVE_STDLIB_H
#endif /* HAVE_STLIB_H */
#if defined (HAVE_NTGUI) && !defined (__WIN32__)
/* jpeglib.h will define boolean differently depending on __WIN32__,
so make sure it is defined. */
#define __WIN32__ 1
#endif
#include <jpeglib.h>
#include <jerror.h>
#include <setjmp.h>

View file

@ -3043,6 +3043,7 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu)
/* Save the echo status. */
int saved_immediate_echo = current_kboard->immediate_echo;
struct kboard *saved_ok_to_echo = ok_to_echo_at_next_pause;
Lisp_Object saved_echo_string = current_kboard->echo_string;
int saved_echo_after_prompt = current_kboard->echo_after_prompt;
#if 0
@ -3097,6 +3098,7 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu)
cancel_echoing ();
ok_to_echo_at_next_pause = saved_ok_to_echo;
current_kboard->echo_string = saved_echo_string;
current_kboard->echo_after_prompt = saved_echo_after_prompt;
if (saved_immediate_echo)
echo_now ();
@ -3579,6 +3581,9 @@ event_to_kboard (event)
}
#endif
Lisp_Object Vthrow_on_input;
/* Store an event obtained at interrupt level into kbd_buffer, fifo */
void
@ -3704,6 +3709,24 @@ kbd_buffer_store_event_hold (event, hold_quit)
*kbd_store_ptr = *event;
++kbd_store_ptr;
}
/* If we're inside while-no-input, and this event qualifies
as input, set quit-flag to cause an interrupt. */
if (!NILP (Vthrow_on_input)
&& event->kind != FOCUS_IN_EVENT
&& event->kind != HELP_EVENT
&& event->kind != DEICONIFY_EVENT)
{
Vquit_flag = Vthrow_on_input;
/* If we're inside a function that wants immediate quits,
do it now. */
if (immediate_quit && NILP (Vinhibit_quit))
{
immediate_quit = 0;
sigfree ();
QUIT;
}
}
}
@ -6817,30 +6840,16 @@ input_available_signal (signo)
sigisheld (SIGIO);
#endif
if (input_available_clear_time)
EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
#ifdef SYNC_INPUT
interrupt_input_pending = 1;
#else
SIGNAL_THREAD_CHECK (signo);
#endif
if (input_available_clear_time)
EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
# if !defined (SYSTEM_MALLOC) && defined (HAVE_GTK_AND_PTHREAD)
extern pthread_t main_thread;
if (pthread_self () != main_thread)
{
/* POSIX says any thread can receive the signal. On GNU/Linux that is
not true, but for other systems (FreeBSD at least) it is. So direct
the signal to the correct thread and block it from this thread. */
sigset_t new_mask;
sigemptyset (&new_mask);
sigaddset (&new_mask, SIGIO);
pthread_sigmask (SIG_BLOCK, &new_mask, 0);
pthread_kill (main_thread, SIGIO);
return;
}
# endif /* HAVE_GTK_AND_PTHREAD */
#ifndef SYNC_INPUT
handle_async_input ();
#endif
@ -10255,6 +10264,7 @@ interrupt_signal (signalnum) /* If we don't have an argument, */
}
#endif /* USG */
SIGNAL_THREAD_CHECK (signalnum);
cancel_echoing ();
if (!NILP (Vquit_flag)
@ -11375,6 +11385,12 @@ Used during Emacs' startup. */);
doc: /* *How long to display an echo-area message when the minibuffer is active.
If the value is not a number, such messages don't time out. */);
Vminibuffer_message_timeout = make_number (2);
DEFVAR_LISP ("throw-on-input", &Vthrow_on_input,
doc: /* If non-nil, any keyboard input throws to this symbol.
The value of that variable is passed to `quit-flag' and later causes a
peculiar kind of quitting. */);
Vthrow_on_input = Qnil;
}
void

View file

@ -3090,7 +3090,7 @@ extern void syms_of_macros P_ ((void));
/* defined in undo.c */
extern Lisp_Object Qinhibit_read_only;
EXFUN (Fundo_boundary, 0);
extern Lisp_Object truncate_undo_list P_ ((Lisp_Object, int, int, int));
extern void truncate_undo_list P_ ((struct buffer *));
extern void record_marker_adjustment P_ ((Lisp_Object, int));
extern void record_insert P_ ((int, int));
extern void record_delete P_ ((int, Lisp_Object));
@ -3099,6 +3099,7 @@ extern void record_change P_ ((int, int));
extern void record_property_change P_ ((int, int, Lisp_Object, Lisp_Object,
Lisp_Object));
extern void syms_of_undo P_ ((void));
extern Lisp_Object Vundo_outer_limit;
/* defined in textprop.c */
extern Lisp_Object Qfont, Qmouse_face;

View file

@ -5997,7 +5997,7 @@ mac_to_x_fontname (name, size, style, scriptcode, encoding_base)
strcpy(cs, "mac-cyrillic");
break;
case kTextEncodingMacCentralEurRoman:
strcpy(cs, "mac-centraleuropean");
strcpy(cs, "mac-centraleurroman");
break;
case kTextEncodingMacSymbol:
case kTextEncodingMacDingbats:
@ -6055,7 +6055,7 @@ x_font_name_to_mac_font_name (char *xf, char *mf)
coding_system = Qeuc_kr;
else if (strcmp (cs, "mac-roman") == 0
|| strcmp (cs, "mac-cyrillic") == 0
|| strcmp (cs, "mac-centraleuropean") == 0
|| strcmp (cs, "mac-centraleurroman") == 0
|| strcmp (cs, "adobe-fontspecific") == 0)
strcpy (mf, family);
else
@ -6299,6 +6299,28 @@ static int xlfd_scalable_fields[] =
-1
};
static Lisp_Object
mac_c_string_match (regexp, string, nonspecial, exact)
Lisp_Object regexp;
const char *string, *nonspecial;
int exact;
{
if (exact)
{
if (strcmp (string, nonspecial) == 0)
return build_string (string);
}
else if (strstr (string, nonspecial))
{
Lisp_Object str = build_string (string);
if (fast_string_match (regexp, str) >= 0)
return str;
}
return Qnil;
}
static Lisp_Object
mac_do_list_fonts (pattern, maxnames)
char *pattern;
@ -6310,6 +6332,8 @@ mac_do_list_fonts (pattern, maxnames)
char scaled[256];
char *ptr;
int scl_val[XLFD_SCL_LAST], *field, *val;
char *longest_start, *cur_start, *nonspecial;
int longest_len, cur_len, exact;
for (i = 0; i < XLFD_SCL_LAST; i++)
scl_val[i] = -1;
@ -6367,34 +6391,66 @@ mac_do_list_fonts (pattern, maxnames)
ptr = regex;
*ptr++ = '^';
/* Turn pattern into a regexp and do a regexp match. */
longest_start = cur_start = ptr;
longest_len = cur_len = 0;
exact = 1;
/* Turn pattern into a regexp and do a regexp match. Also find the
longest substring containing no special characters. */
for (; *pattern; pattern++)
{
if (*pattern == '?')
*ptr++ = '.';
else if (*pattern == '*')
{
*ptr++ = '.';
*ptr++ = '*';
}
if (*pattern == '?' || *pattern == '*')
{
if (cur_len > longest_len)
{
longest_start = cur_start;
longest_len = cur_len;
}
cur_len = 0;
exact = 0;
if (*pattern == '?')
*ptr++ = '.';
else /* if (*pattern == '*') */
{
*ptr++ = '.';
*ptr++ = '*';
}
}
else
*ptr++ = tolower (*pattern);
{
if (cur_len == 0)
cur_start = ptr;
cur_len++;
*ptr++ = tolower (*pattern);
}
}
if (cur_len > longest_len)
{
longest_start = cur_start;
longest_len = cur_len;
}
*ptr = '$';
*(ptr + 1) = '\0';
nonspecial = xmalloc (longest_len + 1);
strncpy (nonspecial, longest_start, longest_len);
nonspecial[longest_len] = '\0';
pattern_regex = build_string (regex);
for (i = 0; i < font_name_count; i++)
{
fontname = build_string (font_name_table[i]);
if (fast_string_match (pattern_regex, fontname) >= 0)
fontname = mac_c_string_match (pattern_regex, font_name_table[i],
nonspecial, exact);
if (!NILP (fontname))
{
font_list = Fcons (fontname, font_list);
n_fonts++;
if (maxnames > 0 && n_fonts >= maxnames)
break;
if (exact || maxnames > 0 && ++n_fonts >= maxnames)
break;
}
else if (scl_val[XLFD_SCL_PIXEL_SIZE] > 0
&& (ptr = strstr (font_name_table[i], "-0-0-75-75-m-0-")))
@ -6408,17 +6464,19 @@ mac_do_list_fonts (pattern, maxnames)
scl_val[XLFD_SCL_POINT_SIZE],
scl_val[XLFD_SCL_AVGWIDTH],
ptr + sizeof ("-0-0-75-75-m-0-") - 1);
fontname = build_string (scaled);
if (fast_string_match (pattern_regex, fontname) >= 0)
fontname = mac_c_string_match (pattern_regex, scaled,
nonspecial, exact);
if (!NILP (fontname))
{
font_list = Fcons (fontname, font_list);
n_fonts++;
if (maxnames > 0 && n_fonts >= maxnames)
if (exact || maxnames > 0 && ++n_fonts >= maxnames)
break;
}
}
}
xfree (nonspecial);
return font_list;
}

View file

@ -5109,6 +5109,7 @@ Lisp_Object process_sent_to;
SIGTYPE
send_process_trap ()
{
SIGNAL_THREAD_CHECK (SIGPIPE);
#ifdef BSD4_1
sigrelse (SIGPIPE);
sigrelse (SIGALRM);
@ -6144,6 +6145,8 @@ sigchld_handler (signo)
register struct Lisp_Process *p;
extern EMACS_TIME *input_available_clear_time;
SIGNAL_THREAD_CHECK (signo);
#ifdef BSD4_1
extern int sigheld;
sigheld |= sigbit (SIGCHLD);

View file

@ -6096,7 +6096,7 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
PREFETCH_NOLIMIT ();
c2 = RE_STRING_CHAR (d, dend - d);
#ifdef emacs
UPDATE_SYNTAX_TABLE_FORWARD (charpos);
UPDATE_SYNTAX_TABLE_FORWARD (charpos + 1);
#endif
s2 = SYNTAX (c2);

View file

@ -2472,6 +2472,7 @@ select_alarm ()
#else /* not BSD4_1 */
signal (SIGALRM, SIG_IGN);
#endif /* not BSD4_1 */
SIGNAL_THREAD_CHECK (SIGALRM);
if (read_alarm_should_throw)
longjmp (read_alarm_throw, 1);
}

View file

@ -20,6 +20,11 @@ Boston, MA 02111-1307, USA. */
extern void init_signals P_ ((void));
#ifdef HAVE_GTK_AND_PTHREAD
#include <pthread.h>
extern pthread_t main_thread;
#endif
#ifdef POSIX_SIGNALS
/* Don't #include <signal.h>. That header should always be #included
@ -198,5 +203,27 @@ extern SIGMASKTYPE sigprocmask_set;
char *strsignal ();
#endif
#ifdef HAVE_GTK_AND_PTHREAD
#define SIGNAL_THREAD_CHECK(signo) \
do { \
if (pthread_self () != main_thread) \
{ \
/* POSIX says any thread can receive the signal. On GNU/Linux \
that is not true, but for other systems (FreeBSD at least) \
it is. So direct the signal to the correct thread and block \
it from this thread. */ \
sigset_t new_mask; \
\
sigemptyset (&new_mask); \
sigaddset (&new_mask, signo); \
pthread_sigmask (SIG_BLOCK, &new_mask, 0); \
pthread_kill (main_thread, signo); \
return; \
} \
} while (0)
#else /* not HAVE_GTK_AND_PTHREAD */
#define SIGNAL_THREAD_CHECK(signo)
#endif /* not HAVE_GTK_AND_PTHREAD */
/* arch-tag: 4580e86a-340d-4574-9e11-a742b6e1a152
(do not change this comment) */

View file

@ -24,6 +24,17 @@ Boston, MA 02111-1307, USA. */
#include "buffer.h"
#include "commands.h"
/* Limits controlling how much undo information to keep. */
EMACS_INT undo_limit;
EMACS_INT undo_strong_limit;
Lisp_Object Vundo_outer_limit;
/* Function to call when undo_outer_limit is exceeded. */
Lisp_Object Vundo_outer_limit_function;
/* Last buffer for which undo information was recorded. */
Lisp_Object last_undo_buffer;
@ -291,31 +302,35 @@ but another undo command will undo to the previous boundary. */)
}
/* At garbage collection time, make an undo list shorter at the end,
returning the truncated list.
MINSIZE, MAXSIZE and LIMITSIZE are the limits on size allowed,
as described below.
In practice, these are the values of undo-limit,
undo-strong-limit, and undo-outer-limit. */
returning the truncated list. How this is done depends on the
variables undo-limit, undo-strong-limit and undo-outer-limit.
In some cases this works by calling undo-outer-limit-function. */
Lisp_Object
truncate_undo_list (list, minsize, maxsize, limitsize)
Lisp_Object list;
int minsize, maxsize, limitsize;
void
truncate_undo_list (b)
struct buffer *b;
{
Lisp_Object list;
Lisp_Object prev, next, last_boundary;
int size_so_far = 0;
/* Make sure that calling undo-outer-limit-function
won't cause another GC. */
int count = inhibit_garbage_collection ();
/* Make the buffer current to get its local values of variables such
as undo_limit. Also so that Vundo_outer_limit_function can
tell which buffer to operate on. */
record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ());
set_buffer_internal (b);
list = b->undo_list;
prev = Qnil;
next = list;
last_boundary = Qnil;
/* Always preserve at least the most recent undo record
unless it is really horribly big.
If the first element is an undo boundary, skip past it.
Skip, skip, skip the undo, skip, skip, skip the undo,
Skip, skip, skip the undo, skip to the undo bound'ry.
(Get it? "Skip to my Loo?") */
/* If the first element is an undo boundary, skip past it. */
if (CONSP (next) && NILP (XCAR (next)))
{
/* Add in the space occupied by this element and its chain link. */
@ -326,6 +341,12 @@ truncate_undo_list (list, minsize, maxsize, limitsize)
next = XCDR (next);
}
/* Always preserve at least the most recent undo record
unless it is really horribly big.
Skip, skip, skip the undo, skip, skip, skip the undo,
Skip, skip, skip the undo, skip to the undo bound'ry. */
while (CONSP (next) && ! NILP (XCAR (next)))
{
Lisp_Object elt;
@ -341,35 +362,53 @@ truncate_undo_list (list, minsize, maxsize, limitsize)
+ SCHARS (XCAR (elt)));
}
/* If we reach LIMITSIZE before the first boundary,
we're heading for memory full, so truncate the list to nothing. */
if (size_so_far > limitsize)
return Qnil;
/* Advance to next element. */
prev = next;
next = XCDR (next);
}
/* If by the first boundary we have already passed undo_outer_limit,
we're heading for memory full, so offer to clear out the list. */
if (INTEGERP (Vundo_outer_limit)
&& size_so_far > XINT (Vundo_outer_limit)
&& !NILP (Vundo_outer_limit_function))
{
Lisp_Object temp = last_undo_buffer;
/* Normally the function this calls is undo-outer-limit-truncate. */
if (! NILP (call1 (Vundo_outer_limit_function,
make_number (size_so_far))))
{
/* The function is responsible for making
any desired changes in buffer-undo-list. */
unbind_to (count, Qnil);
return;
}
/* That function probably used the minibuffer, and if so, that
changed last_undo_buffer. Change it back so that we don't
force next change to make an undo boundary here. */
last_undo_buffer = temp;
}
if (CONSP (next))
last_boundary = prev;
/* Keep more if it fits. */
/* Keep additional undo data, if it fits in the limits. */
while (CONSP (next))
{
Lisp_Object elt;
elt = XCAR (next);
/* When we get to a boundary, decide whether to truncate
either before or after it. The lower threshold, MINSIZE,
either before or after it. The lower threshold, undo_limit,
tells us to truncate after it. If its size pushes past
the higher threshold MAXSIZE as well, we truncate before it. */
the higher threshold undo_strong_limit, we truncate before it. */
if (NILP (elt))
{
if (size_so_far > maxsize)
if (size_so_far > undo_strong_limit)
break;
last_boundary = prev;
if (size_so_far > minsize)
if (size_so_far > undo_limit)
break;
}
@ -390,16 +429,15 @@ truncate_undo_list (list, minsize, maxsize, limitsize)
/* If we scanned the whole list, it is short enough; don't change it. */
if (NILP (next))
return list;
;
/* Truncate at the boundary where we decided to truncate. */
if (!NILP (last_boundary))
{
XSETCDR (last_boundary, Qnil);
return list;
}
else if (!NILP (last_boundary))
XSETCDR (last_boundary, Qnil);
/* There's nothing we decided to keep, so clear it out. */
else
return Qnil;
b->undo_list = Qnil;
unbind_to (count, Qnil);
}
DEFUN ("primitive-undo", Fprimitive_undo, Sprimitive_undo, 2, 2, 0,
@ -563,6 +601,54 @@ syms_of_undo ()
defsubr (&Sprimitive_undo);
defsubr (&Sundo_boundary);
DEFVAR_INT ("undo-limit", &undo_limit,
doc: /* Keep no more undo information once it exceeds this size.
This limit is applied when garbage collection happens.
When a previous command increases the total undo list size past this
value, the earlier commands that came before it are forgotten.
The size is counted as the number of bytes occupied,
which includes both saved text and other data. */);
undo_limit = 20000;
DEFVAR_INT ("undo-strong-limit", &undo_strong_limit,
doc: /* Don't keep more than this much size of undo information.
This limit is applied when garbage collection happens.
When a previous command increases the total undo list size past this
value, that command and the earlier commands that came before it are forgotten.
However, the most recent buffer-modifying command's undo info
is never discarded for this reason.
The size is counted as the number of bytes occupied,
which includes both saved text and other data. */);
undo_strong_limit = 30000;
DEFVAR_LISP ("undo-outer-limit", &Vundo_outer_limit,
doc: /* Outer limit on size of undo information for one command.
At garbage collection time, if the current command has produced
more than this much undo information, it asks you whether to delete
the information. This is a last-ditch limit to prevent memory overflow.
The size is counted as the number of bytes occupied,
which includes both saved text and other data.
In fact, this calls the function which is the value of
`undo-outer-limit-function' with one argument, the size.
The text above describes the behavior of the function
that variable usually specifies. */);
Vundo_outer_limit = make_number (300000);
DEFVAR_LISP ("undo-outer-limit-function", &Vundo_outer_limit_function,
doc: /* Function to call when an undo list exceeds `undo-outer-limit'.
This function is called with one argument, the current undo list size
for the most recent command (since the last undo boundary).
If the function returns t, that means truncation has been fully handled.
If it returns nil, the other forms of truncation are done.
Garbage collection is inhibited around the call to this function,
so it must make sure not to do a lot of consing. */);
Vundo_outer_limit_function = Qnil;
}
/* arch-tag: d546ee01-4aed-4ffb-bb8b-eefaae50d38a

View file

@ -5050,6 +5050,21 @@ get_next_display_element (it)
XSETINT (it->ctl_chars[1], g);
ctl_len = 2;
}
else if (it->c == 0x8a0 || it->c == 0x8ad)
{
/* Set IT->ctl_chars[0] to the glyph for `\\'. */
if (it->dp
&& INTEGERP (DISP_ESCAPE_GLYPH (it->dp))
&& GLYPH_CHAR_VALID_P (XINT (DISP_ESCAPE_GLYPH (it->dp))))
g = XINT (DISP_ESCAPE_GLYPH (it->dp));
else
g = FAST_MAKE_GLYPH ('\\', face_id);
XSETINT (it->ctl_chars[0], g);
g = FAST_MAKE_GLYPH (it->c == 0x8ad ? '-' : ' ', face_id);
XSETINT (it->ctl_chars[1], g);
ctl_len = 2;
}
else
{
unsigned char str[MAX_MULTIBYTE_LENGTH];

View file

@ -2324,7 +2324,7 @@ DEFUN ("x-get-cut-buffer-internal", Fx_get_cut_buffer_internal,
Fcons (x_atom_to_symbol (display, type),
Fcons (make_number (format), Qnil))));
ret = (bytes ? make_string ((char *) data, bytes) : Qnil);
ret = (bytes ? make_unibyte_string ((char *) data, bytes) : Qnil);
/* Use xfree, not XFree, because x_get_window_property
calls xmalloc itself. */
xfree (data);

View file

@ -4289,8 +4289,6 @@ xg_scroll_callback (widget, data)
int part = -1, whole = 0, portion = 0;
GtkAdjustment *adj = GTK_ADJUSTMENT (gtk_range_get_adjustment (widget));
if (xg_ignore_gtk_scrollbar) return;
position = gtk_adjustment_get_value (adj);
p = g_object_get_data (G_OBJECT (widget), XG_LAST_SB_DATA);
@ -4304,6 +4302,8 @@ xg_scroll_callback (widget, data)
previous = *p;
*p = position;
if (xg_ignore_gtk_scrollbar) return;
diff = (int) (position - previous);
if (diff == (int) adj->step_increment)
@ -4335,7 +4335,7 @@ xg_scroll_callback (widget, data)
}
if (part >= 0)
{
{
window_being_scrolled = bar->window;
last_scroll_bar_part = part;
x_send_scroll_bar_event (bar->window, part, portion, whole);