Mercurial > hg > xemacs-beta
diff lisp/utils/atomic-extents.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 0293115a14e9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/utils/atomic-extents.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,109 @@ +;;; atomic-extents.el --- treat regions of text as a single object + +;; Copyright (C) 1993 Free Software Foundation, Inc. +;; Created: 21-Dec-93, Chuck Thompson <cthomp@cs.uiuc.edu> +;; Keywords: extensions +;; Changed: 08-Aug-94, Heiko Muenkel <muenkel@tnt.uni-hannover.de> + +;; This file is part of XEmacs. + +;; XEmacs 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. + +;; XEmacs 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 XEmacs; see the file COPYING. If not, write to the Free +;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Point is not allowed to fall inside of an atomic extent. This has +;;; the effect of making all text covered by an atomic extent be +;;; treated as a single object. Normally point will be adjusted to an +;;; end of an atomic extent in the direction of motion. If point +;;; appears inside of an atomic extent (via goto-char for example), +;;; point will be adjusted to the side closest to the entry point. + +;;; Synched up with: Not in FSF. + +;;; To make an extent atomic use the command: +;;; (set-extent-property #<extent obj> 'atomic t) + +;;; Known bug: the atomic property is not detected when sweeping +;;; regions with the mouse until after the mouse button is released. +;;; The release point will then be treated as if it had been reached +;;; using 'goto-char. + +;;; atomic-extent-goto-char-p is defined in editfns.c + +(provide 'atomic-extents) + +(defvar atomic-extent-old-point nil + "The value of point when pre-command-hook is called. +Used to determine the direction of motion.") + +(defun atomic-extent-pre-hook () + (setq atomic-extent-old-point (point)) + (setq atomic-extent-goto-char-p nil)) + +(defun atomic-extent-post-hook () + (let ((extent (extent-at (point) nil 'atomic))) + (if extent + (let ((begin (extent-start-position extent)) + (end (extent-end-position extent)) + (pos (point)) + (region-set (and (point) (mark)))) + (if (eq this-command + 'x-set-point-and-insert-selection) + (delete-region (region-beginning) (region-end))) + (if (/= pos begin) + (if atomic-extent-goto-char-p + (progn + (if (> (- pos begin) (- end pos)) + (goto-char end) + (goto-char begin))) + (if (> pos atomic-extent-old-point) + (goto-char end) + (goto-char begin)))) + (if (and region-set (/= pos begin)) + (progn + (run-hooks 'zmacs-update-region-hook) + (x-store-cutbuffer (buffer-substring (region-beginning) + (region-end))) + ))))) + (if (mark) + (progn + (exchange-point-and-mark t) + (let ((extent (extent-at (point) nil 'atomic))) + (if extent + (let ((begin (extent-start-position extent)) + (end (extent-end-position extent)) + (pos (point)) + (region-set (and (point) (mark)))) + (if (/= pos begin) + (if atomic-extent-goto-char-p + (progn + (if (> (- pos begin) (- end pos)) + (goto-char end) + (goto-char begin))) + (if (> pos atomic-extent-old-point) + (goto-char end) + (goto-char begin)))) + (if (and region-set (/= pos begin)) + (progn + (run-hooks 'zmacs-update-region-hook) + (x-store-cutbuffer (buffer-substring (region-beginning) + (region-end))) + (message "%d, %d" (region-beginning) (region-end)) + ))))) + (exchange-point-and-mark t))) + ) + +(add-hook 'pre-command-hook 'atomic-extent-pre-hook) +(add-hook 'post-command-hook 'atomic-extent-post-hook) + +;;; atomic-extents.el ends here