From mboxrd@z Thu Jan 1 00:00:00 1970 Path: main.gmane.org!not-for-mail From: Masatake YAMATO Newsgroups: gmane.emacs.devel Subject: Using overlay in register Date: Thu, 18 Mar 2004 19:33:46 +0900 (JST) Sender: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Message-ID: <20040318.193346.21592706.jet@gyve.org> NNTP-Posting-Host: deer.gmane.org Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Trace: sea.gmane.org 1079606319 15003 80.91.224.253 (18 Mar 2004 10:38:39 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Thu, 18 Mar 2004 10:38:39 +0000 (UTC) Original-X-From: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Thu Mar 18 11:38:32 2004 Return-path: Original-Received: from quimby.gnus.org ([80.91.224.244]) by deer.gmane.org with esmtp (Exim 3.35 #1 (Debian)) id 1B3uv2-0000rz-00 for ; Thu, 18 Mar 2004 11:38:32 +0100 Original-Received: from monty-python.gnu.org ([199.232.76.173]) by quimby.gnus.org with esmtp (Exim 3.35 #1 (Debian)) id 1B3uv2-0000rP-00 for ; Thu, 18 Mar 2004 11:38:32 +0100 Original-Received: from localhost ([127.0.0.1] helo=monty-python.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.30) id 1B3ute-0007BO-5M for emacs-devel@quimby.gnus.org; Thu, 18 Mar 2004 05:37:06 -0500 Original-Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.30) id 1B3usG-0006tO-Ax for emacs-devel@gnu.org; Thu, 18 Mar 2004 05:35:40 -0500 Original-Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.30) id 1B3urj-0006d0-Lu for emacs-devel@gnu.org; Thu, 18 Mar 2004 05:35:38 -0500 Original-Received: from [210.130.136.40] (helo=r-maa.spacetown.ne.jp) by monty-python.gnu.org with esmtp (Exim 4.30) id 1B3uqa-0005qZ-CH for emacs-devel@gnu.org; Thu, 18 Mar 2004 05:33:56 -0500 Original-Received: from localhost (h219-110-076-252.catv01.itscom.jp [219.110.76.252]) by r-maa.spacetown.ne.jp (8.11.6) with ESMTP id i2IAXkZ08762 for ; Thu, 18 Mar 2004 19:33:46 +0900 (JST) Original-To: emacs-devel@gnu.org X-Mailer: Mew version 4.0.62 on Emacs 21.3.50 / Mule 5.0 (SAKAKI) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.4 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Xref: main.gmane.org gmane.emacs.devel:20571 X-Report-Spam: http://spam.gmane.org/gmane.emacs.devel:20571 How do you think using overlay instead of marker to represent a point in register.el? The advantage is strong visual feed back. During editing emacs, sometime I forget the position of a register. With overlay, we can put a face on the position. The faces let me keep the memory about the position of registers. We can also put help-echo on the overlay. BTW, (overlay-start overlay) < (overlay-end overlay) is guaranteed? Masatake YAMATO 2004-03-18 Masatake YAMATO * register.el (register): New customize group. (register-point): New face. (register-alist): Doc fix. (set-register): Delete overlay before setting new value to the register. (register-put-overlay-at-point): New function. (register-get-overlay-position): New function. (point-to-register): Use overlay instead of marker. (jump-to-register): Ditto. (describe-register-1): Ditto. (insert-register): Ditto. (register-swap-out): Ditto. Doc fix. cvs diff: warning: unrecognized response `access control disabled, clients can connect from any host' from cvs server Index: lisp/register.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/register.el,v retrieving revision 1.48 diff -u -r1.48 register.el --- lisp/register.el 16 Mar 2004 09:52:36 -0000 1.48 +++ lisp/register.el 18 Mar 2004 10:20:36 -0000 @@ -31,9 +31,20 @@ ;;; Code: +(defgroup register () + "register commands for Emacs." + :group 'editing + :prefix "register-") + +(defface register-point + '((((class color)) (:box "blue")) + (t (:underline t))) + "Face for the overlay associated with register." + :group 'register) + (defvar register-alist nil "Alist of elements (NAME . CONTENTS), one for each Emacs register. -NAME is a character (a number). CONTENTS is a string, number, marker or list. +NAME is a character (a number). CONTENTS is a string, number, overlay or list. A list of strings represents a rectangle. A list of the form (file . NAME) represents the file named NAME. A list of the form (file-query NAME POSITION) represents position POSITION @@ -50,23 +61,46 @@ (defun set-register (register value) "Set contents of Emacs register named REGISTER to VALUE. Returns VALUE. See the documentation of the variable `register-alist' for possible VALUE." + ;; If the old value is overlay, delete it first. + (let ((overlay (get-register register))) + (if (overlayp overlay) + (delete-overlay overlay))) (let ((aelt (assq register register-alist))) (if aelt (setcdr aelt value) (push (cons register value) register-alist)) value)) +(defun register-put-overlay-at-point (register) + "Put a overlay associated with REGISTER at the point." + (let ((overlay (make-overlay (point) + (1+ (point)) + (current-buffer) + t)) + (help (format "Register: %s\nType \"%s %s\" to jump here." + (single-key-description register) + (substitute-command-keys "\\[jump-to-register]") + (single-key-description register)))) + (overlay-put overlay 'face 'register-point) + (overlay-put overlay 'help-echo help) + (overlay-put overlay 'register register) + overlay)) + +(defun register-get-overlay-position (overlay) + "Get the position for OVERLAY." + (min (overlay-start overlay) (overlay-end overlay))) + (defun point-to-register (register &optional arg) "Store current location of point in register REGISTER. With prefix argument, store current frame configuration. Use \\[jump-to-register] to go to that location or restore that configuration. Argument is a character, naming the register." (interactive "cPoint to register: \nP") - ;; Turn the marker into a file-ref if the buffer is killed. + ;; Turn the overlay into a file-ref if the buffer is killed. (add-hook 'kill-buffer-hook 'register-swap-out nil t) (set-register register (if arg (list (current-frame-configuration) (point-marker)) - (point-marker)))) + (register-put-overlay-at-point register)))) (defun window-configuration-to-register (register &optional arg) "Store the window configuration of the selected frame in register REGISTER. @@ -106,11 +140,11 @@ ((and (consp val) (window-configuration-p (car val))) (set-window-configuration (car val)) (goto-char (cadr val))) - ((markerp val) - (or (marker-buffer val) + ((overlayp val) + (or (overlay-buffer val) (error "That register's buffer no longer exists")) - (switch-to-buffer (marker-buffer val)) - (goto-char val)) + (switch-to-buffer (overlay-buffer val)) + (goto-char (register-get-overlay-position val))) ((and (consp val) (eq (car val) 'file)) (find-file (cdr val))) ((and (consp val) (eq (car val) 'file-query)) @@ -123,15 +157,15 @@ (error "Register doesn't contain a buffer position or configuration"))))) (defun register-swap-out () - "Turn markers into file-query references when a buffer is killed." + "Turn overlays into file-query references when a buffer is killed." (and buffer-file-name (dolist (elem register-alist) - (and (markerp (cdr elem)) - (eq (marker-buffer (cdr elem)) (current-buffer)) + (and (overlayp (cdr elem)) + (eq (overlay-buffer (cdr elem)) (current-buffer)) (setcdr elem (list 'file-query buffer-file-name - (marker-position (cdr elem)))))))) + (overlay-start (cdr elem)))))))) (defun number-to-register (number register) "Store a number in a register. @@ -187,14 +221,14 @@ ((numberp val) (princ val)) - ((markerp val) - (let ((buf (marker-buffer val))) + ((overlayp val) + (let ((buf (overlay-buffer val))) (if (null buf) - (princ "a marker in no buffer") + (princ "a overlay in no buffer") (princ "a buffer position:\n buffer ") (princ (buffer-name buf)) (princ ", position ") - (princ (marker-position val))))) + (princ (register-get-overlay-position val))))) ((and (consp val) (window-configuration-p (car val))) (princ "a window configuration.")) @@ -264,8 +298,8 @@ (insert-for-yank val)) ((numberp val) (princ val (current-buffer))) - ((and (markerp val) (marker-position val)) - (princ (marker-position val) (current-buffer))) + ((and (overlayp val) (overlay-start val)) + (princ (register-get-overlay-position val) (current-buffer))) (t (error "Register does not contain text")))) (if (not arg) (exchange-point-and-mark)))