Mercurial > emacs
view lisp/compare-w.el @ 1310:8db103d11270
* keyboard.c (echo_char, read_char): Apply EVENT_HEAD without first
testing for EVENT_HAS_PARAMETERS; EVENT_HEAD works properly on
all sorts of events now.
(read_key_sequence): Use the new accessors to decide in which window
an event occurred.
* keyboard.c (Qevent_unmodified): Replaced by...
(Qevent_symbol_elements): New property.
(syms_of_keyboard): initialize and staticpro the latter, not the
former.
* keyboard.c (readable_events): This doesn't need to scan and
discard mouse release events anymore; it just uses
EVENT_QUEUES_EMPTY.
(kbd_buffer_get_event): No need to skip past mouse release events.
* keyboard.c (button_down_location): New variable, which
stores the location at which each button was pressed, so we
can build a complete drag event when the button is released.
(make_lispy_event): When a button is pressed, record its
location in button_down_location, and turn it into a `down'
event. When a button is released, compare its release
location with its press location, and decide whether to call
it a `click' or `drag' event.
Change mouse movement events to be arranged like click events.
(format_modifiers): Note that the click modifier has no
written representation.
(modifier_names, modifer_symbols): New variables, used to
create the Qevent_symbol_elements property.
(modify_event_symbol): Change the format of the modified
symbol cache; there are too many modifier bits now to use a
vector indexed by a modifier mask. Use an assoc-list instead.
Document the format of the cache.
Put the Qevent_symbol_elements property on each new symbol,
instead of a Qevent_unmodified property.
(symbols_of_keyboard): Put Qevent_symbol_elements properties on
the symbols specified in head_table, not Qevent_unmodifed properties.
Initialize and staticpro modifier_symbols, and staticpro the
window elements of button_down_location.
author | Jim Blandy <jimb@redhat.com> |
---|---|
date | Fri, 02 Oct 1992 23:55:39 +0000 |
parents | 213978acbc1e |
children | eea183a35396 |
line wrap: on
line source
;;; compare-w.el --- compare text between windows for Emacs. ;; Copyright (C) 1986, 1989 Free Software Foundation, Inc. ;; Maintainer: FSF ;; This file is part of GNU Emacs. ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ;;; Code: (defvar compare-windows-whitespace " \t\n" "*String of characters considered whitespace for \\[compare-windows]. Changes in whitespace are optionally ignored. The value of `compare-windows-whitespace' may instead be a function; this function is called in each buffer, with point at the current scanning point. The function's job is to categorize any whitespace around (including before) point; it should also advance past any whitespace. The function is passed one argument, the point where `compare-windows' was originally called; it should not consider any text before that point. If the function returns the same value for both buffers, then the whitespace is considered to match, and is skipped.") (defvar compare-ignore-case nil "*Non-nil means \\[compare-windows] ignores case differences.") ;;;###autoload (defun compare-windows (ignore-whitespace) "Compare text in current window with text in next window. Compares the text starting at point in each window, moving over text in each one as far as they match. A prefix arg means ignore changes in whitespace. The variable `compare-windows-whitespace' controls how whitespace is skipped. If `compare-ignore-case' is non-nil, changes in case are also ignored." (interactive "P") (let* (p1 p2 maxp1 maxp2 b1 b2 w2 success size (opoint1 (point)) opoint2 (skip-whitespace (if ignore-whitespace compare-windows-whitespace)) (skip-whitespace-regexp (concat "[" skip-whitespace "]+"))) (setq p1 (point) b1 (current-buffer)) (setq w2 (next-window (selected-window))) (if (eq w2 (selected-window)) (error "No other window")) (setq p2 (window-point w2) b2 (window-buffer w2)) (setq opoint2 p2) (setq maxp1 (point-max)) (save-excursion (set-buffer b2) (setq maxp2 (point-max))) (setq success t) (while success (setq success nil) ;; if interrupted, show how far we've gotten (goto-char p1) (set-window-point w2 p2) ;; If both buffers have whitespace next to point, ;; optionally skip over it. (and skip-whitespace (save-excursion (let (p1a p2a w1 w2 result1 result2) (if (stringp skip-whitespace) (progn (if (not (eobp)) (skip-chars-backward skip-whitespace opoint1)) (and (looking-at skip-whitespace-regexp) (setq p1a (match-end 0) result1 t))) (setq result1 (funcall skip-whitespace opoint1)) (setq p1a (point))) (set-buffer b2) (goto-char p2) (if (stringp skip-whitespace) (progn (if (not (eobp)) (skip-chars-backward skip-whitespace opoint2)) (and (looking-at skip-whitespace-regexp) (setq p2a (match-end 0) result2 t))) (setq result2 (funcall skip-whitespace opoint2)) (setq p2a (point))) (and result1 result2 (eq result1 result2) (setq p1 p1a p2 p2a))))) ;; Try advancing comparing 1000 chars at a time. ;; When that fails, go 500 chars at a time, and so on. (let ((size 1000) success-1) (while (> size 0) (setq success-1 t) (while success-1 (setq size (min size (- maxp1 p1) (- maxp2 p2))) (save-excursion (set-buffer b2) (setq s2 (buffer-substring p2 (+ size p2)))) (setq success-1 (and (> size 0) (if compare-ignore-case (let ((case-fold-search t)) (save-excursion (search-forward s2 (+ p1 size) t))) (equal (buffer-substring p1 (+ size p1)) s2)))) (if success-1 (setq p1 (+ p1 size) p2 (+ p2 size) success t))) (setq size (/ size 2))))) (goto-char p1) (set-window-point w2 p2) (if (= (point) opoint1) (ding)))) (provide 'compare-w) ;;; compare-w.el ends here